the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
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}