the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 169 lines 4.1 kB view raw
1#include "stdafx.h" 2#include "net.minecraft.world.entity.ai.village.h" 3#include "net.minecraft.world.entity.h" 4#include "net.minecraft.world.entity.monster.h" 5#include "net.minecraft.world.level.h" 6#include "VillageSiege.h" 7 8VillageSiege::VillageSiege(Level *level) 9{ 10 hasSetupSiege = false; 11 siegeState = SIEGE_NOT_INITED; 12 siegeCount = 0; 13 nextSpawnTime = 0; 14 village = weak_ptr<Village>(); 15 spawnX = spawnY = spawnZ = 0; 16 17 this->level = level; 18} 19 20void VillageSiege::tick() 21{ 22 bool debug = false; 23 if (debug) 24 { 25 if (siegeState == SIEGE_DONE) 26 { 27 siegeCount = 100; 28 return; 29 } 30 // return; 31 } 32 else 33 { 34 if (level->isDay()) 35 { 36 siegeState = SIEGE_CAN_ACTIVATE; 37 return; 38 } 39 40 if (siegeState == SIEGE_DONE) return; 41 42 if (siegeState == SIEGE_CAN_ACTIVATE) 43 { 44 float timeOfDay = level->getTimeOfDay(0); 45 if (timeOfDay < 0.50 || timeOfDay > 0.501) return; 46 siegeState = level->random->nextInt(10) == 0 ? SIEGE_TONIGHT : SIEGE_DONE; 47 hasSetupSiege = false; 48 if (siegeState == SIEGE_DONE) return; 49 } 50 } 51 52 if (!hasSetupSiege) 53 { 54 if (tryToSetupSiege()) hasSetupSiege = true; 55 else return; 56 } 57 58 // Siege! 59 if (nextSpawnTime > 0) 60 { 61 --nextSpawnTime; 62 return; 63 } 64 65 nextSpawnTime = 2; // 50 + level.random.nextInt(100); 66 if (siegeCount > 0) 67 { 68 trySpawn(); 69 --siegeCount; 70 } 71 else 72 { 73 siegeState = SIEGE_DONE; 74 } 75 76} 77 78bool VillageSiege::tryToSetupSiege() 79{ 80 vector<shared_ptr<Player> > *players = &level->players; 81 //for (Player player : players) 82 for(AUTO_VAR(it, players->begin()); it != players->end(); ++it) 83 { 84 shared_ptr<Player> player = *it; 85 shared_ptr<Village> _village = level->villages->getClosestVillage((int) player->x, (int) player->y, (int) player->z, 1); 86 village = _village; 87 88 if (_village == NULL) continue; 89 if (_village->getDoorCount() < 10) continue; 90 if (_village->getStableAge() < 20) continue; 91 if (_village->getPopulationSize() < 20) continue; 92 93 // setup siege origin 94 Pos *center = _village->getCenter(); 95 float radius = _village->getRadius(); 96 97 bool overlaps = false; 98 for (int i = 0; i < 10; ++i) 99 { 100 spawnX = center->x + (int) (Mth::cos(level->random->nextFloat() * PI * 2.f) * radius * 0.9); 101 spawnY = center->y; 102 spawnZ = center->z + (int) (Mth::sin(level->random->nextFloat() * PI * 2.f) * radius * 0.9); 103 overlaps = false; 104 vector<shared_ptr<Village> > *villages = level->villages->getVillages(); 105 //for (Village v : level.villages.getVillages()) 106 for(AUTO_VAR(itV, villages->begin()); itV != villages->end(); ++itV) 107 { 108 shared_ptr<Village>v = *itV; 109 if (v == _village) continue; 110 if (v->isInside(spawnX, spawnY, spawnZ)) 111 { 112 overlaps = true; 113 break; 114 } 115 } 116 if (!overlaps) break; 117 } 118 if (overlaps) return false; 119 120 Vec3 *spawnPos = findRandomSpawnPos(spawnX, spawnY, spawnZ); 121 if (spawnPos == NULL) continue; 122 123 nextSpawnTime = 0; 124 siegeCount = 20; 125 return true; 126 } 127 return false; 128} 129 130bool VillageSiege::trySpawn() 131{ 132 Vec3 *spawnPos = findRandomSpawnPos(spawnX, spawnY, spawnZ); 133 if (spawnPos == NULL) return false; 134 shared_ptr<Zombie> mob; 135 //try 136 { 137 mob = shared_ptr<Zombie>( new Zombie(level) ); 138 mob->finalizeMobSpawn(NULL); 139 mob->setVillager(false); 140 } 141 //catch (Exception e) { 142 // e.printStackTrace(); 143 // return false; 144 //} 145 mob->moveTo(spawnPos->x, spawnPos->y, spawnPos->z, level->random->nextFloat() * 360, 0); 146 level->addEntity(mob); 147 shared_ptr<Village> _village = village.lock(); 148 if( _village == NULL ) return false; 149 150 Pos *center = _village->getCenter(); 151 mob->restrictTo(center->x, center->y, center->z, _village->getRadius()); 152 return true; 153} 154 155Vec3 *VillageSiege::findRandomSpawnPos(int x, int y, int z) 156{ 157 shared_ptr<Village> _village = village.lock(); 158 if( _village == NULL ) return NULL; 159 160 for (int i = 0; i < 10; ++i) 161 { 162 int xx = x + level->random->nextInt(16) - 8; 163 int yy = y + level->random->nextInt(6) - 3; 164 int zz = z + level->random->nextInt(16) - 8; 165 if (!_village->isInside(xx, yy, zz)) continue; 166 if (MobSpawner::isSpawnPositionOk(MobCategory::monster, level, xx, yy, zz)) return Vec3::newTemp(xx, yy, zz); 167 } 168 return NULL; 169}