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.item.h"
3#include "net.minecraft.world.level.h"
4#include "net.minecraft.world.level.tile.h"
5#include "net.minecraft.world.level.tile.entity.h"
6#include "net.minecraft.world.level.levelgen.h"
7#include "net.minecraft.world.level.storage.h"
8#include "net.minecraft.world.level.levelgen.structure.h"
9#include "WeighedTreasure.h"
10#include "NetherBridgePieces.h"
11#include "Direction.h"
12
13void NetherBridgePieces::loadStatic()
14{
15 StructureFeatureIO::setPieceId( eStructurePiece_BridgeCrossing, BridgeCrossing::Create, L"NeBCr");
16 StructureFeatureIO::setPieceId( eStructurePiece_BridgeEndFiller, BridgeEndFiller::Create, L"NeBEF");
17 StructureFeatureIO::setPieceId( eStructurePiece_BridgeStraight, BridgeStraight::Create, L"NeBS");
18 StructureFeatureIO::setPieceId( eStructurePiece_CastleCorridorStairsPiece, CastleCorridorStairsPiece::Create, L"NeCCS");
19 StructureFeatureIO::setPieceId( eStructurePiece_CastleCorridorTBalconyPiece, CastleCorridorTBalconyPiece::Create, L"NeCTB");
20 StructureFeatureIO::setPieceId( eStructurePiece_CastleEntrance, CastleEntrance::Create, L"NeCE");
21 StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorCrossingPiece, CastleSmallCorridorCrossingPiece::Create, L"NeSCSC");
22 StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorLeftTurnPiece, CastleSmallCorridorLeftTurnPiece::Create, L"NeSCLT");
23 StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorPiece, CastleSmallCorridorPiece::Create, L"NeSC");
24 StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorRightTurnPiece, CastleSmallCorridorRightTurnPiece::Create, L"NeSCRT");
25 StructureFeatureIO::setPieceId( eStructurePiece_CastleStalkRoom, CastleStalkRoom::Create, L"NeCSR");
26 StructureFeatureIO::setPieceId( eStructurePiece_MonsterThrone, MonsterThrone::Create, L"NeMT");
27 StructureFeatureIO::setPieceId( eStructurePiece_RoomCrossing, RoomCrossing::Create, L"NeRC");
28 StructureFeatureIO::setPieceId( eStructurePiece_StairsRoom, StairsRoom::Create, L"NeSR");
29 StructureFeatureIO::setPieceId( eStructurePiece_NetherBridgeStartPiece, StartPiece::Create, L"NeStart");
30}
31
32NetherBridgePieces::PieceWeight::PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount, bool allowInRow) : weight(weight)
33{
34 this->placeCount = 0;
35 this->pieceClass = pieceClass;
36 this->maxPlaceCount = maxPlaceCount;
37 this->allowInRow = allowInRow;
38}
39
40NetherBridgePieces::PieceWeight::PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount) : weight(weight)
41{
42 this->placeCount = 0;
43 this->pieceClass = pieceClass;
44 this->maxPlaceCount = maxPlaceCount;
45 this->allowInRow = false;
46}
47
48bool NetherBridgePieces::PieceWeight::doPlace(int depth)
49{
50 return maxPlaceCount == 0 || placeCount < maxPlaceCount;
51}
52
53bool NetherBridgePieces::PieceWeight::isValid()
54{
55 return maxPlaceCount == 0 || placeCount < maxPlaceCount;
56}
57
58NetherBridgePieces::PieceWeight *NetherBridgePieces::bridgePieceWeights[NetherBridgePieces::BRIDGE_PIECEWEIGHTS_COUNT] =
59{
60 new PieceWeight(EPieceClass_BridgeStraight, 30, 0, true),
61 new PieceWeight(EPieceClass_BridgeCrossing, 10, 4),
62 new PieceWeight(EPieceClass_MonsterThrone, 15, 2), // 4J Stu - Increased weight to ensure that we have these (was 5), required for Blazes and therefore required for brewing
63 new PieceWeight(EPieceClass_CastleEntrance, 15, 1), // 4J Stu - Increased weight to ensure that we have these (was 5), required for CastleStalkRoom, and therefore required for brewing
64 new PieceWeight(EPieceClass_RoomCrossing, 10, 4),
65 new PieceWeight(EPieceClass_StairsRoom, 10, 3),
66};
67
68NetherBridgePieces::PieceWeight *NetherBridgePieces::castlePieceWeights[NetherBridgePieces::CASTLE_PIECEWEIGHTS_COUNT] =
69{
70 new PieceWeight(EPieceClass_CastleStalkRoom, 30, 2), // 4J Stu - Increased weight to ensure that we have these (was 5), required for Nether Wart, and therefore required for brewing
71 new PieceWeight(EPieceClass_CastleSmallCorridorPiece, 25, 0, true),
72 new PieceWeight(EPieceClass_CastleSmallCorridorCrossingPiece, 15, 5),
73 new PieceWeight(EPieceClass_CastleSmallCorridorRightTurnPiece, 5, 10),
74 new PieceWeight(EPieceClass_CastleSmallCorridorLeftTurnPiece, 5, 10),
75 new PieceWeight(EPieceClass_CastleCorridorStairsPiece, 10, 3, true),
76 new PieceWeight(EPieceClass_CastleCorridorTBalconyPiece, 7, 2),
77};
78
79NetherBridgePieces::NetherBridgePiece *NetherBridgePieces::findAndCreateBridgePieceFactory(NetherBridgePieces::PieceWeight *piece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth)
80{
81 EPieceClass pieceClass = piece->pieceClass;
82 NetherBridgePiece *structurePiece = NULL;
83
84 if (pieceClass == EPieceClass_BridgeStraight)
85 {
86 structurePiece = BridgeStraight::createPiece(pieces, random, footX, footY, footZ, direction, depth);
87 }
88 else if (pieceClass == EPieceClass_BridgeCrossing)
89 {
90 structurePiece = BridgeCrossing::createPiece(pieces, random, footX, footY, footZ, direction, depth);
91 }
92 else if (pieceClass == EPieceClass_RoomCrossing)
93 {
94 structurePiece = RoomCrossing::createPiece(pieces, random, footX, footY, footZ, direction, depth);
95 }
96 else if (pieceClass == EPieceClass_StairsRoom)
97 {
98 structurePiece = StairsRoom::createPiece(pieces, random, footX, footY, footZ, direction, depth);
99 }
100 else if (pieceClass == EPieceClass_MonsterThrone)
101 {
102 structurePiece = MonsterThrone::createPiece(pieces, random, footX, footY, footZ, direction, depth);
103 }
104 else if (pieceClass == EPieceClass_CastleEntrance)
105 {
106 structurePiece = CastleEntrance::createPiece(pieces, random, footX, footY, footZ, direction, depth);
107 }
108 else if (pieceClass == EPieceClass_CastleSmallCorridorPiece)
109 {
110 structurePiece = CastleSmallCorridorPiece::createPiece(pieces, random, footX, footY, footZ, direction, depth);
111 }
112 else if (pieceClass == EPieceClass_CastleSmallCorridorRightTurnPiece)
113 {
114 structurePiece = CastleSmallCorridorRightTurnPiece::createPiece(pieces, random, footX, footY, footZ, direction, depth);
115 }
116 else if (pieceClass == EPieceClass_CastleSmallCorridorLeftTurnPiece)
117 {
118 structurePiece = CastleSmallCorridorLeftTurnPiece::createPiece(pieces, random, footX, footY, footZ, direction, depth);
119 }
120 else if (pieceClass == EPieceClass_CastleCorridorStairsPiece)
121 {
122 structurePiece = CastleCorridorStairsPiece::createPiece(pieces, random, footX, footY, footZ, direction, depth);
123 }
124 else if (pieceClass == EPieceClass_CastleCorridorTBalconyPiece)
125 {
126 structurePiece = CastleCorridorTBalconyPiece::createPiece(pieces, random, footX, footY, footZ, direction, depth);
127 }
128 else if (pieceClass == EPieceClass_CastleSmallCorridorCrossingPiece)
129 {
130 structurePiece = CastleSmallCorridorCrossingPiece::createPiece(pieces, random, footX, footY, footZ, direction, depth);
131 }
132 else if (pieceClass == EPieceClass_CastleStalkRoom)
133 {
134 structurePiece = CastleStalkRoom::createPiece(pieces, random, footX, footY, footZ, direction, depth);
135 }
136 return structurePiece;
137}
138
139WeighedTreasure *NetherBridgePieces::NetherBridgePiece::fortressTreasureItems[FORTRESS_TREASURE_ITEMS_COUNT] = {
140 new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 5),
141 new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 5),
142 new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 15),
143 new WeighedTreasure(Item::sword_gold_Id, 0, 1, 1, 5),
144 new WeighedTreasure(Item::chestplate_gold_Id, 0, 1, 1, 5),
145 new WeighedTreasure(Item::flintAndSteel_Id, 0, 1, 1, 5),
146 new WeighedTreasure(Item::netherwart_seeds_Id, 0, 3, 7, 5),
147 new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 10),
148 new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 8),
149 new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 5),
150 new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 3),
151};
152
153NetherBridgePieces::NetherBridgePiece::NetherBridgePiece()
154{
155 // for reflection
156}
157
158NetherBridgePieces::NetherBridgePiece::NetherBridgePiece(int genDepth) : StructurePiece(genDepth)
159{
160}
161
162void NetherBridgePieces::NetherBridgePiece::readAdditonalSaveData(CompoundTag *tag)
163{
164}
165
166void NetherBridgePieces::NetherBridgePiece::addAdditonalSaveData(CompoundTag *tag)
167{
168}
169
170int NetherBridgePieces::NetherBridgePiece::updatePieceWeight(list<PieceWeight *> *currentPieces)
171{
172 bool hasAnyPieces = false;
173 int totalWeight = 0;
174 for( AUTO_VAR(it, currentPieces->begin()); it != currentPieces->end(); it++ )
175 {
176 PieceWeight *piece = *it;
177
178 if (piece->maxPlaceCount > 0 && piece->placeCount < piece->maxPlaceCount)
179 {
180 hasAnyPieces = true;
181 }
182 totalWeight += piece->weight;
183 }
184 return (hasAnyPieces ? totalWeight : -1);
185}
186
187NetherBridgePieces::NetherBridgePiece *NetherBridgePieces::NetherBridgePiece::generatePiece(StartPiece *startPiece, list<NetherBridgePieces::PieceWeight *> *currentPieces, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth)
188{
189 int totalWeight = updatePieceWeight(currentPieces);
190 boolean doStuff = totalWeight > 0 && depth <= MAX_DEPTH;
191
192 int numAttempts = 0;
193 while (numAttempts < 5 && doStuff)
194 {
195 numAttempts++;
196
197 int weightSelection = random->nextInt(totalWeight);
198 for( AUTO_VAR(it, currentPieces->begin()); it != currentPieces->end(); it++ )
199 {
200 PieceWeight *piece = *it;
201 weightSelection -= piece->weight;
202 if (weightSelection < 0)
203 {
204 if (!piece->doPlace(depth) || (piece == startPiece->previousPiece && !piece->allowInRow))
205 {
206 break;
207 }
208
209 NetherBridgePiece *structurePiece = findAndCreateBridgePieceFactory(piece, pieces, random, footX, footY, footZ, direction, depth);
210 if (structurePiece != NULL)
211 {
212 piece->placeCount++;
213 startPiece->previousPiece = piece;
214
215 if (!piece->isValid())
216 {
217 currentPieces->remove(piece);
218 }
219 return structurePiece;
220 }
221 }
222 }
223 }
224 {
225 return BridgeEndFiller::createPiece(pieces, random, footX, footY, footZ, direction, depth);
226 }
227
228}
229
230StructurePiece *NetherBridgePieces::NetherBridgePiece::generateAndAddPiece(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth, bool isCastle)
231{
232 if (abs(footX - startPiece->getBoundingBox()->x0) > 7 * 16 || abs(footZ - startPiece->getBoundingBox()->z0) > 7 * 16)
233 {
234 return BridgeEndFiller::createPiece(pieces, random, footX, footY, footZ, direction, depth);
235 }
236 list<PieceWeight *> *availablePieces = &startPiece->availableBridgePieces;
237 if (isCastle)
238 {
239 availablePieces = &startPiece->availableCastlePieces;
240 }
241 StructurePiece *newPiece = generatePiece(startPiece, availablePieces, pieces, random, footX, footY, footZ, direction, depth + 1);
242 if (newPiece != NULL)
243 {
244 pieces->push_back(newPiece);
245 startPiece->pendingChildren.push_back(newPiece);
246 }
247 return newPiece;
248}
249
250StructurePiece *NetherBridgePieces::NetherBridgePiece::generateChildForward(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int xOff, int yOff, bool isCastle)
251{
252 switch (orientation)
253 {
254 case Direction::NORTH:
255 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + xOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, orientation, getGenDepth(), isCastle);
256 case Direction::SOUTH:
257 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + xOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, orientation, getGenDepth(), isCastle);
258 case Direction::WEST:
259 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + xOff, orientation, getGenDepth(), isCastle);
260 case Direction::EAST:
261 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + xOff, orientation, getGenDepth(), isCastle);
262 }
263 return NULL;
264}
265
266StructurePiece *NetherBridgePieces::NetherBridgePiece::generateChildLeft(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int yOff, int zOff, bool isCastle)
267{
268 switch (orientation)
269 {
270 case Direction::NORTH:
271 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::WEST, getGenDepth(), isCastle);
272 case Direction::SOUTH:
273 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::WEST, getGenDepth(), isCastle);
274 case Direction::WEST:
275 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, Direction::NORTH, getGenDepth(), isCastle);
276 case Direction::EAST:
277 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, Direction::NORTH, getGenDepth(), isCastle);
278 }
279 return NULL;
280}
281
282StructurePiece *NetherBridgePieces::NetherBridgePiece::generateChildRight(StartPiece *startPiece, list<StructurePiece *> *pieces, Random *random, int yOff, int zOff, bool isCastle)
283{
284 switch (orientation)
285 {
286 case Direction::NORTH:
287 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::EAST, getGenDepth(), isCastle);
288 case Direction::SOUTH:
289 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::EAST, getGenDepth(), isCastle);
290 case Direction::WEST:
291 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth(), isCastle);
292 case Direction::EAST:
293 return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth(), isCastle);
294 }
295 return NULL;
296}
297
298bool NetherBridgePieces::NetherBridgePiece::isOkBox(BoundingBox *box, StartPiece *startPiece)
299{
300 bool bIsOk = false;
301
302 if(box != NULL)
303 {
304 if( box->y0 > LOWEST_Y_POSITION ) bIsOk = true;
305 int xzSize = (startPiece->m_level->getLevelData()->getXZSize() / startPiece->m_level->getLevelData()->getHellScale()); //HellRandomLevelSource::XZSIZE;
306 int blockMin = -( (xzSize << 4) / 2) + 1;
307 int blockMax = ( (xzSize << 4) / 2 ) - 1;
308
309 if(box->x0 <= blockMin) bIsOk = false;
310 if(box->z0 <= blockMin) bIsOk = false;
311 if(box->x1 >= blockMax) bIsOk = false;
312 if(box->z1 >= blockMax) bIsOk = false;
313 }
314
315 return bIsOk;
316}
317
318void NetherBridgePieces::NetherBridgePiece::generateLightPost(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z, int xOff, int zOff)
319{
320 int worldX = getWorldX(x, z);
321 int worldY = getWorldY(y);
322 int worldZ = getWorldZ(x, z);
323
324 if (!chunkBB->isInside(worldX, worldY, worldZ))
325 {
326 return;
327 }
328
329 if (level->isEmptyTile(worldX, worldY, worldZ) && level->isEmptyTile(worldX, worldY + 1, worldZ) && level->isEmptyTile(worldX, worldY + 2, worldZ)
330 && level->isEmptyTile(worldX, worldY + 3, worldZ))
331 {
332 level->setTileAndData(worldX, worldY, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS);
333 level->setTileAndData(worldX, worldY + 1, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS);
334 level->setTileAndData(worldX, worldY + 2, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS);
335 level->setTileAndData(worldX, worldY + 3, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS);
336 placeBlock(level, Tile::netherFence_Id, 0, x + xOff, y + 3, z + zOff, chunkBB);
337 placeBlock(level, Tile::glowstone_Id, 0, x + xOff, y + 2, z + zOff, chunkBB);
338 }
339}
340
341void NetherBridgePieces::NetherBridgePiece::generateLightPostFacingRight(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z)
342{
343 generateLightPost(level, random, chunkBB, x, y, z, 1, 0);
344}
345
346void NetherBridgePieces::NetherBridgePiece::generateLightPostFacingLeft(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z)
347{
348 generateLightPost(level, random, chunkBB, x, y, z, -1, 0);
349}
350
351void NetherBridgePieces::NetherBridgePiece::generateLightPostFacingUp(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z)
352{
353 generateLightPost(level, random, chunkBB, x, y, z, 0, 1);
354}
355
356void NetherBridgePieces::NetherBridgePiece::generateLightPostFacingDown(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z)
357{
358 generateLightPost(level, random, chunkBB, x, y, z, 0, -1);
359}
360
361NetherBridgePieces::BridgeStraight::BridgeStraight()
362{
363 // for reflection
364}
365
366NetherBridgePieces::BridgeStraight::BridgeStraight(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
367{
368 orientation = direction;
369 boundingBox = stairsBox;
370}
371
372void NetherBridgePieces::BridgeStraight::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
373{
374 generateChildForward((StartPiece *) startPiece, pieces, random, 1, 3, false);
375}
376
377NetherBridgePieces::BridgeStraight *NetherBridgePieces::BridgeStraight::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
378{
379 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -3, 0, width, height, depth, direction);
380
381 StartPiece *startPiece = NULL;
382 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
383
384 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
385 {
386 delete box;
387 return NULL;
388 }
389
390 return new BridgeStraight(genDepth, random, box, direction);
391}
392
393bool NetherBridgePieces::BridgeStraight::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
394{
395 // floor
396 generateBox(level, chunkBB, 0, 3, 0, width - 1, 4, depth - 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
397 // room air
398 generateBox(level, chunkBB, 1, 5, 0, 3, 7, depth - 1, 0, 0, false);
399
400 // hand rails
401 generateBox(level, chunkBB, 0, 5, 0, 0, 5, depth - 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
402 generateBox(level, chunkBB, 4, 5, 0, 4, 5, depth - 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
403
404 // supports
405 generateBox(level, chunkBB, 0, 2, 0, 4, 2, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
406 generateBox(level, chunkBB, 0, 2, 13, 4, 2, 18, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
407 generateBox(level, chunkBB, 0, 0, 0, 4, 1, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
408 generateBox(level, chunkBB, 0, 0, 15, 4, 1, 18, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
409
410 for (int x = 0; x <= 4; x++)
411 {
412 for (int z = 0; z <= 2; z++)
413 {
414 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
415 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, 18 - z, chunkBB);
416 }
417 }
418
419 generateBox(level, chunkBB, 0, 1, 1, 0, 4, 1, Tile::netherFence_Id, Tile::netherFence_Id, false);
420 generateBox(level, chunkBB, 0, 3, 4, 0, 4, 4, Tile::netherFence_Id, Tile::netherFence_Id, false);
421 generateBox(level, chunkBB, 0, 3, 14, 0, 4, 14, Tile::netherFence_Id, Tile::netherFence_Id, false);
422 generateBox(level, chunkBB, 0, 1, 17, 0, 4, 17, Tile::netherFence_Id, Tile::netherFence_Id, false);
423 generateBox(level, chunkBB, 4, 1, 1, 4, 4, 1, Tile::netherFence_Id, Tile::netherFence_Id, false);
424 generateBox(level, chunkBB, 4, 3, 4, 4, 4, 4, Tile::netherFence_Id, Tile::netherFence_Id, false);
425 generateBox(level, chunkBB, 4, 3, 14, 4, 4, 14, Tile::netherFence_Id, Tile::netherFence_Id, false);
426 generateBox(level, chunkBB, 4, 1, 17, 4, 4, 17, Tile::netherFence_Id, Tile::netherFence_Id, false);
427
428 return true;
429}
430
431NetherBridgePieces::BridgeEndFiller::BridgeEndFiller()
432{
433 // for reflection
434}
435
436NetherBridgePieces::BridgeEndFiller::BridgeEndFiller(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
437{
438 orientation = direction;
439 boundingBox = stairsBox;
440 selfSeed = random->nextInt();
441}
442
443NetherBridgePieces::BridgeEndFiller *NetherBridgePieces::BridgeEndFiller::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
444{
445 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -3, 0, width, height, depth, direction);
446
447 StartPiece *startPiece = NULL;
448 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
449
450 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
451 {
452 delete box;
453 return NULL;
454 }
455
456 return new BridgeEndFiller(genDepth, random, box, direction);
457}
458
459bool NetherBridgePieces::BridgeEndFiller::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
460{
461 Random *selfRandom = new Random(selfSeed);
462
463 // floor
464 for (int x = 0; x <= 4; x++)
465 {
466 for (int y = 3; y <= 4; y++)
467 {
468 int z = selfRandom->nextInt(8);
469 generateBox(level, chunkBB, x, y, 0, x, y, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
470 }
471 }
472
473 // hand rails
474 {
475 int z = selfRandom->nextInt(8);
476 generateBox(level, chunkBB, 0, 5, 0, 0, 5, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
477 }
478 {
479 int z = selfRandom->nextInt(8);
480 generateBox(level, chunkBB, 4, 5, 0, 4, 5, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
481 }
482
483 // supports
484 for (int x = 0; x <= 4; x++)
485 {
486 int z = selfRandom->nextInt(5);
487 generateBox(level, chunkBB, x, 2, 0, x, 2, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
488 }
489 for (int x = 0; x <= 4; x++)
490 {
491 for (int y = 0; y <= 1; y++)
492 {
493 int z = selfRandom->nextInt(3);
494 generateBox(level, chunkBB, x, y, 0, x, y, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
495 }
496 }
497
498 delete selfRandom;
499
500 return true;
501}
502
503void NetherBridgePieces::BridgeEndFiller::readAdditonalSaveData(CompoundTag *tag)
504{
505 NetherBridgePiece::readAdditonalSaveData(tag);
506
507 selfSeed = tag->getInt(L"Seed");
508}
509
510void NetherBridgePieces::BridgeEndFiller::addAdditonalSaveData(CompoundTag *tag)
511{
512 NetherBridgePiece::addAdditonalSaveData(tag);
513
514 tag->putInt(L"Seed", selfSeed);
515}
516
517NetherBridgePieces::BridgeCrossing::BridgeCrossing()
518{
519 // for reflection
520}
521
522NetherBridgePieces::BridgeCrossing::BridgeCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
523{
524 orientation = direction;
525 boundingBox = stairsBox;
526}
527
528NetherBridgePieces::BridgeCrossing::BridgeCrossing(Random *random, int west, int north) : NetherBridgePiece(0)
529{
530 orientation = random->nextInt(4);
531
532 switch (orientation)
533 {
534 case Direction::NORTH:
535 case Direction::SOUTH:
536 boundingBox = new BoundingBox(west, 64, north, west + width - 1, 64 + height - 1, north + depth - 1);
537 break;
538 default:
539 boundingBox = new BoundingBox(west, 64, north, west + depth - 1, 64 + height - 1, north + width - 1);
540 break;
541 }
542}
543
544void NetherBridgePieces::BridgeCrossing::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
545{
546 generateChildForward((StartPiece *) startPiece, pieces, random, 8, 3, false);
547 generateChildLeft((StartPiece *) startPiece, pieces, random, 3, 8, false);
548 generateChildRight((StartPiece *) startPiece, pieces, random, 3, 8, false);
549}
550
551NetherBridgePieces::BridgeCrossing *NetherBridgePieces::BridgeCrossing::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
552{
553 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -8, -3, 0, width, height, depth, direction);
554
555 StartPiece *startPiece = NULL;
556 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
557
558 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
559 {
560 delete box;
561 return NULL;
562 }
563
564 return new BridgeCrossing(genDepth, random, box, direction);
565}
566
567bool NetherBridgePieces::BridgeCrossing::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
568{
569 // floor
570 generateBox(level, chunkBB, 7, 3, 0, 11, 4, 18, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
571 generateBox(level, chunkBB, 0, 3, 7, 18, 4, 11, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
572 // room air
573 generateBox(level, chunkBB, 8, 5, 0, 10, 7, 18, 0, 0, false);
574 generateBox(level, chunkBB, 0, 5, 8, 18, 7, 10, 0, 0, false);
575 // hand rails
576 generateBox(level, chunkBB, 7, 5, 0, 7, 5, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
577 generateBox(level, chunkBB, 7, 5, 11, 7, 5, 18, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
578 generateBox(level, chunkBB, 11, 5, 0, 11, 5, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
579 generateBox(level, chunkBB, 11, 5, 11, 11, 5, 18, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
580 generateBox(level, chunkBB, 0, 5, 7, 7, 5, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
581 generateBox(level, chunkBB, 11, 5, 7, 18, 5, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
582 generateBox(level, chunkBB, 0, 5, 11, 7, 5, 11, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
583 generateBox(level, chunkBB, 11, 5, 11, 18, 5, 11, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
584
585 // supports
586 generateBox(level, chunkBB, 7, 2, 0, 11, 2, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
587 generateBox(level, chunkBB, 7, 2, 13, 11, 2, 18, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
588 generateBox(level, chunkBB, 7, 0, 0, 11, 1, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
589 generateBox(level, chunkBB, 7, 0, 15, 11, 1, 18, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
590 for (int x = 7; x <= 11; x++)
591 {
592 for (int z = 0; z <= 2; z++)
593 {
594 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
595 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, 18 - z, chunkBB);
596 }
597 }
598
599 generateBox(level, chunkBB, 0, 2, 7, 5, 2, 11, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
600 generateBox(level, chunkBB, 13, 2, 7, 18, 2, 11, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
601 generateBox(level, chunkBB, 0, 0, 7, 3, 1, 11, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
602 generateBox(level, chunkBB, 15, 0, 7, 18, 1, 11, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
603 for (int x = 0; x <= 2; x++)
604 {
605 for (int z = 7; z <= 11; z++)
606 {
607 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
608 fillColumnDown(level, Tile::netherBrick_Id, 0, 18 - x, -1, z, chunkBB);
609 }
610 }
611
612 return true;
613}
614
615NetherBridgePieces::StartPiece::StartPiece()
616{
617 // for reflection
618 previousPiece = NULL;
619}
620
621NetherBridgePieces::StartPiece::StartPiece(Random *random, int west, int north, Level *level) : BridgeCrossing(random, west, north)
622{
623 previousPiece = NULL;
624 m_level = level;
625
626 for( int i = 0; i < BRIDGE_PIECEWEIGHTS_COUNT; i++ )
627 {
628 PieceWeight *piece = bridgePieceWeights[i];
629 piece->placeCount = 0;
630 availableBridgePieces.push_back(piece);
631 }
632
633 for( int i = 0; i < CASTLE_PIECEWEIGHTS_COUNT; i++ )
634 {
635 PieceWeight *piece = castlePieceWeights[i];
636
637 piece->placeCount = 0;
638 availableCastlePieces.push_back(piece);
639 }
640}
641
642void NetherBridgePieces::StartPiece::readAdditonalSaveData(CompoundTag *tag)
643{
644 BridgeCrossing::readAdditonalSaveData(tag);
645}
646
647void NetherBridgePieces::StartPiece::addAdditonalSaveData(CompoundTag *tag)
648{
649 BridgeCrossing::addAdditonalSaveData(tag);
650}
651
652NetherBridgePieces::RoomCrossing::RoomCrossing()
653{
654 // for reflection
655}
656
657NetherBridgePieces::RoomCrossing::RoomCrossing(int genDepth, Random *random, BoundingBox *box, int direction) : NetherBridgePiece(genDepth)
658{
659 orientation = direction;
660 boundingBox = box;
661}
662
663void NetherBridgePieces::RoomCrossing::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
664{
665 generateChildForward((StartPiece *) startPiece, pieces, random, 2, 0, false);
666 generateChildLeft((StartPiece *) startPiece, pieces, random, 0, 2, false);
667 generateChildRight((StartPiece *) startPiece, pieces, random, 0, 2, false);
668}
669
670NetherBridgePieces::RoomCrossing *NetherBridgePieces::RoomCrossing::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
671{
672 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -2, 0, 0, width, height, depth, direction);
673
674 StartPiece *startPiece = NULL;
675 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
676
677 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
678 {
679 delete box;
680 return NULL;
681 }
682
683 return new RoomCrossing(genDepth, random, box, direction);
684}
685
686bool NetherBridgePieces::RoomCrossing::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
687{
688 // floor
689 generateBox(level, chunkBB, 0, 0, 0, width - 1, 1, depth - 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
690 // room air
691 generateBox(level, chunkBB, 0, 2, 0, 6, 7, 6, 0, 0, false);
692
693 // walls
694 generateBox(level, chunkBB, 0, 2, 0, 1, 6, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
695 generateBox(level, chunkBB, 0, 2, 6, 1, 6, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
696 generateBox(level, chunkBB, 5, 2, 0, 6, 6, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
697 generateBox(level, chunkBB, 5, 2, 6, 6, 6, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
698 generateBox(level, chunkBB, 0, 2, 0, 0, 6, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
699 generateBox(level, chunkBB, 0, 2, 5, 0, 6, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
700 generateBox(level, chunkBB, 6, 2, 0, 6, 6, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
701 generateBox(level, chunkBB, 6, 2, 5, 6, 6, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
702
703 // entries
704 generateBox(level, chunkBB, 2, 6, 0, 4, 6, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
705 generateBox(level, chunkBB, 2, 5, 0, 4, 5, 0, Tile::netherFence_Id, Tile::netherFence_Id, false);
706 generateBox(level, chunkBB, 2, 6, 6, 4, 6, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
707 generateBox(level, chunkBB, 2, 5, 6, 4, 5, 6, Tile::netherFence_Id, Tile::netherFence_Id, false);
708 generateBox(level, chunkBB, 0, 6, 2, 0, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
709 generateBox(level, chunkBB, 0, 5, 2, 0, 5, 4, Tile::netherFence_Id, Tile::netherFence_Id, false);
710 generateBox(level, chunkBB, 6, 6, 2, 6, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
711 generateBox(level, chunkBB, 6, 5, 2, 6, 5, 4, Tile::netherFence_Id, Tile::netherFence_Id, false);
712
713 for (int x = 0; x <= 6; x++)
714 {
715 for (int z = 0; z <= 6; z++)
716 {
717 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
718 }
719 }
720
721 return true;
722}
723
724NetherBridgePieces::StairsRoom::StairsRoom()
725{
726 // for reflection
727}
728
729NetherBridgePieces::StairsRoom::StairsRoom(int genDepth, Random *random, BoundingBox *box, int direction) : NetherBridgePiece(genDepth)
730{
731 orientation = direction;
732 boundingBox = box;
733}
734
735void NetherBridgePieces::StairsRoom::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
736{
737 generateChildRight((StartPiece *) startPiece, pieces, random, 6, 2, false);
738}
739
740NetherBridgePieces::StairsRoom *NetherBridgePieces::StairsRoom::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
741{
742 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -2, 0, 0, width, height, depth, direction);
743
744 StartPiece *startPiece = NULL;
745 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
746
747 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
748 {
749 delete box;
750 return NULL;
751 }
752
753 return new StairsRoom(genDepth, random, box, direction);
754}
755
756bool NetherBridgePieces::StairsRoom::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
757{
758 // floor
759 generateBox(level, chunkBB, 0, 0, 0, width - 1, 1, depth - 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
760 // room air
761 generateBox(level, chunkBB, 0, 2, 0, 6, 10, 6, 0, 0, false);
762
763 // walls
764 generateBox(level, chunkBB, 0, 2, 0, 1, 8, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
765 generateBox(level, chunkBB, 5, 2, 0, 6, 8, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
766 generateBox(level, chunkBB, 0, 2, 1, 0, 8, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
767 generateBox(level, chunkBB, 6, 2, 1, 6, 8, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
768 generateBox(level, chunkBB, 1, 2, 6, 5, 8, 6, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
769
770 // wall decorations
771 generateBox(level, chunkBB, 0, 3, 2, 0, 5, 4, Tile::netherFence_Id, Tile::netherFence_Id, false);
772 generateBox(level, chunkBB, 6, 3, 2, 6, 5, 2, Tile::netherFence_Id, Tile::netherFence_Id, false);
773 generateBox(level, chunkBB, 6, 3, 4, 6, 5, 4, Tile::netherFence_Id, Tile::netherFence_Id, false);
774
775 // stair
776 placeBlock(level, Tile::netherBrick_Id, 0, 5, 2, 5, chunkBB);
777 generateBox(level, chunkBB, 4, 2, 5, 4, 3, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
778 generateBox(level, chunkBB, 3, 2, 5, 3, 4, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
779 generateBox(level, chunkBB, 2, 2, 5, 2, 5, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
780 generateBox(level, chunkBB, 1, 2, 5, 1, 6, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
781
782 // top floor
783 generateBox(level, chunkBB, 1, 7, 1, 5, 7, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
784 generateBox(level, chunkBB, 6, 8, 2, 6, 8, 4, 0, 0, false);
785
786 // entries
787 generateBox(level, chunkBB, 2, 6, 0, 4, 8, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
788 generateBox(level, chunkBB, 2, 5, 0, 4, 5, 0, Tile::netherFence_Id, Tile::netherFence_Id, false);
789
790 for (int x = 0; x <= 6; x++)
791 {
792 for (int z = 0; z <= 6; z++)
793 {
794 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
795 }
796 }
797
798 return true;
799
800}
801
802NetherBridgePieces::MonsterThrone::MonsterThrone()
803{
804 // for reflection
805}
806
807NetherBridgePieces::MonsterThrone::MonsterThrone(int genDepth, Random *random, BoundingBox *box, int direction) : NetherBridgePiece(genDepth)
808{
809 orientation = direction;
810 boundingBox = box;
811 hasPlacedMobSpawner = false;
812}
813
814NetherBridgePieces::MonsterThrone *NetherBridgePieces::MonsterThrone::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
815{
816 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -2, 0, 0, width, height, depth, direction);
817
818 StartPiece *startPiece = NULL;
819 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
820
821 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
822 {
823 delete box;
824 return NULL;
825 }
826
827 return new MonsterThrone(genDepth, random, box, direction);
828}
829
830void NetherBridgePieces::MonsterThrone::readAdditonalSaveData(CompoundTag *tag)
831{
832 NetherBridgePiece::readAdditonalSaveData(tag);
833
834 hasPlacedMobSpawner = tag->getBoolean(L"Mob");
835}
836
837void NetherBridgePieces::MonsterThrone::addAdditonalSaveData(CompoundTag *tag)
838{
839 NetherBridgePiece::addAdditonalSaveData(tag);
840
841 tag->putBoolean(L"Mob", hasPlacedMobSpawner);
842}
843
844bool NetherBridgePieces::MonsterThrone::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
845{
846 generateBox(level, chunkBB, 0, 2, 0, 6, 7, 7, 0, 0, false);
847
848 // floors
849 generateBox(level, chunkBB, 1, 0, 0, 5, 1, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
850 generateBox(level, chunkBB, 1, 2, 1, 5, 2, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
851 generateBox(level, chunkBB, 1, 3, 2, 5, 3, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
852 generateBox(level, chunkBB, 1, 4, 3, 5, 4, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
853
854 // rails
855 generateBox(level, chunkBB, 1, 2, 0, 1, 4, 2, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
856 generateBox(level, chunkBB, 5, 2, 0, 5, 4, 2, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
857 generateBox(level, chunkBB, 1, 5, 2, 1, 5, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
858 generateBox(level, chunkBB, 5, 5, 2, 5, 5, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
859 generateBox(level, chunkBB, 0, 5, 3, 0, 5, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
860 generateBox(level, chunkBB, 6, 5, 3, 6, 5, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
861 generateBox(level, chunkBB, 1, 5, 8, 5, 5, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
862
863 placeBlock(level, Tile::netherFence_Id, 0, 1, 6, 3, chunkBB);
864 placeBlock(level, Tile::netherFence_Id, 0, 5, 6, 3, chunkBB);
865 generateBox(level, chunkBB, 0, 6, 3, 0, 6, 8, Tile::netherFence_Id, Tile::netherFence_Id, false);
866 generateBox(level, chunkBB, 6, 6, 3, 6, 6, 8, Tile::netherFence_Id, Tile::netherFence_Id, false);
867 generateBox(level, chunkBB, 1, 6, 8, 5, 7, 8, Tile::netherFence_Id, Tile::netherFence_Id, false);
868 generateBox(level, chunkBB, 2, 8, 8, 4, 8, 8, Tile::netherFence_Id, Tile::netherFence_Id, false);
869
870
871 if (!hasPlacedMobSpawner)
872 {
873 int y = getWorldY(5), x = getWorldX(3, 5), z = getWorldZ(3, 5);
874 if (chunkBB->isInside(x, y, z))
875 {
876 hasPlacedMobSpawner = true;
877 level->setTileAndData(x, y, z, Tile::mobSpawner_Id, 0, Tile::UPDATE_CLIENTS);
878 shared_ptr<MobSpawnerTileEntity> entity = dynamic_pointer_cast<MobSpawnerTileEntity>( level->getTileEntity(x, y, z) );
879 if (entity != NULL) entity->getSpawner()->setEntityId(L"Blaze");
880 }
881 }
882
883 for (int x = 0; x <= 6; x++)
884 {
885 for (int z = 0; z <= 6; z++)
886 {
887 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
888 }
889 }
890
891 return true;
892}
893
894NetherBridgePieces::CastleEntrance::CastleEntrance()
895{
896 // for reflection
897}
898
899NetherBridgePieces::CastleEntrance::CastleEntrance(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
900{
901 orientation = direction;
902 boundingBox = stairsBox;
903}
904
905void NetherBridgePieces::CastleEntrance::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
906{
907 generateChildForward((StartPiece *) startPiece, pieces, random, 5, 3, true);
908}
909
910NetherBridgePieces::CastleEntrance *NetherBridgePieces::CastleEntrance::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
911{
912 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -5, -3, 0, width, height, depth, direction);
913
914 StartPiece *startPiece = NULL;
915 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
916
917 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
918 {
919 delete box;
920 return NULL;
921 }
922
923 return new CastleEntrance(genDepth, random, box, direction);
924}
925
926bool NetherBridgePieces::CastleEntrance::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
927{
928 // floor
929 generateBox(level, chunkBB, 0, 3, 0, 12, 4, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
930 // room air
931 generateBox(level, chunkBB, 0, 5, 0, 12, 13, 12, 0, 0, false);
932
933 // walls
934 generateBox(level, chunkBB, 0, 5, 0, 1, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
935 generateBox(level, chunkBB, 11, 5, 0, 12, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
936 generateBox(level, chunkBB, 2, 5, 11, 4, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
937 generateBox(level, chunkBB, 8, 5, 11, 10, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
938 generateBox(level, chunkBB, 5, 9, 11, 7, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
939 generateBox(level, chunkBB, 2, 5, 0, 4, 12, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
940 generateBox(level, chunkBB, 8, 5, 0, 10, 12, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
941 generateBox(level, chunkBB, 5, 9, 0, 7, 12, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
942
943 // roof
944 generateBox(level, chunkBB, 2, 11, 2, 10, 12, 10, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
945
946 // entrance decoration
947 generateBox(level, chunkBB, 5, 8, 0, 7, 8, 0, Tile::netherFence_Id, Tile::netherFence_Id, false);
948
949 // wall decorations
950 for (int i = 1; i <= 11; i += 2)
951 {
952 generateBox(level, chunkBB, i, 10, 0, i, 11, 0, Tile::netherFence_Id, Tile::netherFence_Id, false);
953 generateBox(level, chunkBB, i, 10, 12, i, 11, 12, Tile::netherFence_Id, Tile::netherFence_Id, false);
954 generateBox(level, chunkBB, 0, 10, i, 0, 11, i, Tile::netherFence_Id, Tile::netherFence_Id, false);
955 generateBox(level, chunkBB, 12, 10, i, 12, 11, i, Tile::netherFence_Id, Tile::netherFence_Id, false);
956 placeBlock(level, Tile::netherBrick_Id, 0, i, 13, 0, chunkBB);
957 placeBlock(level, Tile::netherBrick_Id, 0, i, 13, 12, chunkBB);
958 placeBlock(level, Tile::netherBrick_Id, 0, 0, 13, i, chunkBB);
959 placeBlock(level, Tile::netherBrick_Id, 0, 12, 13, i, chunkBB);
960 placeBlock(level, Tile::netherFence_Id, 0, i + 1, 13, 0, chunkBB);
961 placeBlock(level, Tile::netherFence_Id, 0, i + 1, 13, 12, chunkBB);
962 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, i + 1, chunkBB);
963 placeBlock(level, Tile::netherFence_Id, 0, 12, 13, i + 1, chunkBB);
964 }
965 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, 0, chunkBB);
966 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, 12, chunkBB);
967 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, 0, chunkBB);
968 placeBlock(level, Tile::netherFence_Id, 0, 12, 13, 0, chunkBB);
969
970 // inside decorations
971 for (int z = 3; z <= 9; z += 2)
972 {
973 generateBox(level, chunkBB, 1, 7, z, 1, 8, z, Tile::netherFence_Id, Tile::netherFence_Id, false);
974 generateBox(level, chunkBB, 11, 7, z, 11, 8, z, Tile::netherFence_Id, Tile::netherFence_Id, false);
975 }
976
977 // supports
978 generateBox(level, chunkBB, 4, 2, 0, 8, 2, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
979 generateBox(level, chunkBB, 0, 2, 4, 12, 2, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
980
981 generateBox(level, chunkBB, 4, 0, 0, 8, 1, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
982 generateBox(level, chunkBB, 4, 0, 9, 8, 1, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
983 generateBox(level, chunkBB, 0, 0, 4, 3, 1, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
984 generateBox(level, chunkBB, 9, 0, 4, 12, 1, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
985
986 for (int x = 4; x <= 8; x++)
987 {
988 for (int z = 0; z <= 2; z++)
989 {
990 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
991 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, 12 - z, chunkBB);
992 }
993 }
994 for (int x = 0; x <= 2; x++)
995 {
996 for (int z = 4; z <= 8; z++)
997 {
998 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
999 fillColumnDown(level, Tile::netherBrick_Id, 0, 12 - x, -1, z, chunkBB);
1000 }
1001 }
1002
1003 // lava well
1004 generateBox(level, chunkBB, 5, 5, 5, 7, 5, 7, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1005 generateBox(level, chunkBB, 6, 1, 6, 6, 4, 6, 0, 0, false);
1006 placeBlock(level, Tile::netherBrick_Id, 0, 6, 0, 6, chunkBB);
1007 placeBlock(level, Tile::lava_Id, 0, 6, 5, 6, chunkBB);
1008 // tick lava well
1009 int x = getWorldX(6, 6);
1010 int y = getWorldY(5);
1011 int z = getWorldZ(6, 6);
1012 if (chunkBB->isInside(x, y, z))
1013 {
1014 level->setInstaTick(true);
1015 Tile::tiles[Tile::lava_Id]->tick(level, x, y, z, random);
1016 level->setInstaTick(false);
1017 }
1018
1019
1020 return true;
1021}
1022
1023NetherBridgePieces::CastleStalkRoom::CastleStalkRoom()
1024{
1025 // for reflection
1026}
1027
1028NetherBridgePieces::CastleStalkRoom::CastleStalkRoom(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
1029{
1030 orientation = direction;
1031 boundingBox = stairsBox;
1032}
1033
1034void NetherBridgePieces::CastleStalkRoom::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
1035{
1036 generateChildForward((StartPiece *) startPiece, pieces, random, 5, 3, true);
1037 generateChildForward((StartPiece *) startPiece, pieces, random, 5, 11, true);
1038}
1039
1040NetherBridgePieces::CastleStalkRoom *NetherBridgePieces::CastleStalkRoom::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
1041{
1042 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -5, -3, 0, width, height, depth, direction);
1043
1044 StartPiece *startPiece = NULL;
1045 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
1046
1047 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
1048 {
1049 delete box;
1050 return NULL;
1051 }
1052
1053 return new CastleStalkRoom(genDepth, random, box, direction);
1054}
1055
1056bool NetherBridgePieces::CastleStalkRoom::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
1057{
1058 // floor
1059 generateBox(level, chunkBB, 0, 3, 0, 12, 4, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1060 // room air
1061 generateBox(level, chunkBB, 0, 5, 0, 12, 13, 12, 0, 0, false);
1062
1063 // walls
1064 generateBox(level, chunkBB, 0, 5, 0, 1, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1065 generateBox(level, chunkBB, 11, 5, 0, 12, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1066 generateBox(level, chunkBB, 2, 5, 11, 4, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1067 generateBox(level, chunkBB, 8, 5, 11, 10, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1068 generateBox(level, chunkBB, 5, 9, 11, 7, 12, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1069 generateBox(level, chunkBB, 2, 5, 0, 4, 12, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1070 generateBox(level, chunkBB, 8, 5, 0, 10, 12, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1071 generateBox(level, chunkBB, 5, 9, 0, 7, 12, 1, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1072
1073 // roof
1074 generateBox(level, chunkBB, 2, 11, 2, 10, 12, 10, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1075
1076 // wall decorations
1077 for (int i = 1; i <= 11; i += 2)
1078 {
1079 generateBox(level, chunkBB, i, 10, 0, i, 11, 0, Tile::netherFence_Id, Tile::netherFence_Id, false);
1080 generateBox(level, chunkBB, i, 10, 12, i, 11, 12, Tile::netherFence_Id, Tile::netherFence_Id, false);
1081 generateBox(level, chunkBB, 0, 10, i, 0, 11, i, Tile::netherFence_Id, Tile::netherFence_Id, false);
1082 generateBox(level, chunkBB, 12, 10, i, 12, 11, i, Tile::netherFence_Id, Tile::netherFence_Id, false);
1083 placeBlock(level, Tile::netherBrick_Id, 0, i, 13, 0, chunkBB);
1084 placeBlock(level, Tile::netherBrick_Id, 0, i, 13, 12, chunkBB);
1085 placeBlock(level, Tile::netherBrick_Id, 0, 0, 13, i, chunkBB);
1086 placeBlock(level, Tile::netherBrick_Id, 0, 12, 13, i, chunkBB);
1087 placeBlock(level, Tile::netherFence_Id, 0, i + 1, 13, 0, chunkBB);
1088 placeBlock(level, Tile::netherFence_Id, 0, i + 1, 13, 12, chunkBB);
1089 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, i + 1, chunkBB);
1090 placeBlock(level, Tile::netherFence_Id, 0, 12, 13, i + 1, chunkBB);
1091 }
1092 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, 0, chunkBB);
1093 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, 12, chunkBB);
1094 placeBlock(level, Tile::netherFence_Id, 0, 0, 13, 0, chunkBB);
1095 placeBlock(level, Tile::netherFence_Id, 0, 12, 13, 0, chunkBB);
1096
1097 // inside decorations
1098 for (int z = 3; z <= 9; z += 2)
1099 {
1100 generateBox(level, chunkBB, 1, 7, z, 1, 8, z, Tile::netherFence_Id, Tile::netherFence_Id, false);
1101 generateBox(level, chunkBB, 11, 7, z, 11, 8, z, Tile::netherFence_Id, Tile::netherFence_Id, false);
1102 }
1103
1104 // inside stair
1105 int stairOrientation = getOrientationData(Tile::stairs_netherBricks_Id, 3);
1106 for (int i = 0; i <= 6; i++)
1107 {
1108 int z = i + 4;
1109 for (int x = 5; x <= 7; x++)
1110 {
1111 placeBlock(level, Tile::stairs_netherBricks_Id, stairOrientation, x, 5 + i, z, chunkBB);
1112 }
1113 if (z >= 5 && z <= 8)
1114 {
1115 generateBox(level, chunkBB, 5, 5, z, 7, i + 4, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1116 }
1117 else if (z >= 9 && z <= 10)
1118 {
1119 generateBox(level, chunkBB, 5, 8, z, 7, i + 4, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1120 }
1121 if (i >= 1)
1122 {
1123 generateBox(level, chunkBB, 5, 6 + i, z, 7, 9 + i, z, 0, 0, false);
1124 }
1125 }
1126 for (int x = 5; x <= 7; x++)
1127 {
1128 placeBlock(level, Tile::stairs_netherBricks_Id, stairOrientation, x, 12, 11, chunkBB);
1129 }
1130 generateBox(level, chunkBB, 5, 6, 7, 5, 7, 7, Tile::netherFence_Id, Tile::netherFence_Id, false);
1131 generateBox(level, chunkBB, 7, 6, 7, 7, 7, 7, Tile::netherFence_Id, Tile::netherFence_Id, false);
1132 generateBox(level, chunkBB, 5, 13, 12, 7, 13, 12, 0, 0, false);
1133
1134 // farmland catwalks
1135 generateBox(level, chunkBB, 2, 5, 2, 3, 5, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1136 generateBox(level, chunkBB, 2, 5, 9, 3, 5, 10, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1137 generateBox(level, chunkBB, 2, 5, 4, 2, 5, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1138 generateBox(level, chunkBB, 9, 5, 2, 10, 5, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1139 generateBox(level, chunkBB, 9, 5, 9, 10, 5, 10, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1140 generateBox(level, chunkBB, 10, 5, 4, 10, 5, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1141 int eastOrientation = getOrientationData(Tile::stairs_netherBricks_Id, 0);
1142 int westOrientation = getOrientationData(Tile::stairs_netherBricks_Id, 1);
1143 placeBlock(level, Tile::stairs_netherBricks_Id, westOrientation, 4, 5, 2, chunkBB);
1144 placeBlock(level, Tile::stairs_netherBricks_Id, westOrientation, 4, 5, 3, chunkBB);
1145 placeBlock(level, Tile::stairs_netherBricks_Id, westOrientation, 4, 5, 9, chunkBB);
1146 placeBlock(level, Tile::stairs_netherBricks_Id, westOrientation, 4, 5, 10, chunkBB);
1147 placeBlock(level, Tile::stairs_netherBricks_Id, eastOrientation, 8, 5, 2, chunkBB);
1148 placeBlock(level, Tile::stairs_netherBricks_Id, eastOrientation, 8, 5, 3, chunkBB);
1149 placeBlock(level, Tile::stairs_netherBricks_Id, eastOrientation, 8, 5, 9, chunkBB);
1150 placeBlock(level, Tile::stairs_netherBricks_Id, eastOrientation, 8, 5, 10, chunkBB);
1151
1152 // farmlands
1153 generateBox(level, chunkBB, 3, 4, 4, 4, 4, 8, Tile::soulsand_Id, Tile::soulsand_Id, false);
1154 generateBox(level, chunkBB, 8, 4, 4, 9, 4, 8, Tile::soulsand_Id, Tile::soulsand_Id, false);
1155 generateBox(level, chunkBB, 3, 5, 4, 4, 5, 8, Tile::netherStalk_Id, Tile::netherStalk_Id, false);
1156 generateBox(level, chunkBB, 8, 5, 4, 9, 5, 8, Tile::netherStalk_Id, Tile::netherStalk_Id, false);
1157
1158 // supports
1159 generateBox(level, chunkBB, 4, 2, 0, 8, 2, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1160 generateBox(level, chunkBB, 0, 2, 4, 12, 2, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1161
1162 generateBox(level, chunkBB, 4, 0, 0, 8, 1, 3, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1163 generateBox(level, chunkBB, 4, 0, 9, 8, 1, 12, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1164 generateBox(level, chunkBB, 0, 0, 4, 3, 1, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1165 generateBox(level, chunkBB, 9, 0, 4, 12, 1, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1166
1167 for (int x = 4; x <= 8; x++)
1168 {
1169 for (int z = 0; z <= 2; z++)
1170 {
1171 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1172 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, 12 - z, chunkBB);
1173 }
1174 }
1175 for (int x = 0; x <= 2; x++)
1176 {
1177 for (int z = 4; z <= 8; z++)
1178 {
1179 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1180 fillColumnDown(level, Tile::netherBrick_Id, 0, 12 - x, -1, z, chunkBB);
1181 }
1182 }
1183
1184 return true;
1185
1186}
1187
1188NetherBridgePieces::CastleSmallCorridorPiece::CastleSmallCorridorPiece()
1189{
1190 // for reflection
1191}
1192
1193NetherBridgePieces::CastleSmallCorridorPiece::CastleSmallCorridorPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
1194{
1195 orientation = direction;
1196 boundingBox = stairsBox;
1197}
1198
1199
1200void NetherBridgePieces::CastleSmallCorridorPiece::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
1201{
1202 generateChildForward((StartPiece *) startPiece, pieces, random, 1, 0, true);
1203}
1204
1205NetherBridgePieces::CastleSmallCorridorPiece *NetherBridgePieces::CastleSmallCorridorPiece::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
1206{
1207
1208 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction);
1209
1210 StartPiece *startPiece = NULL;
1211 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
1212
1213 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
1214 {
1215 delete box;
1216 return NULL;
1217 }
1218
1219 return new CastleSmallCorridorPiece(genDepth, random, box, direction);
1220}
1221
1222bool NetherBridgePieces::CastleSmallCorridorPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
1223{
1224 // floor
1225 generateBox(level, chunkBB, 0, 0, 0, 4, 1, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1226 // room air
1227 generateBox(level, chunkBB, 0, 2, 0, 4, 5, 4, 0, 0, false);
1228
1229 // walls
1230 generateBox(level, chunkBB, 0, 2, 0, 0, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1231 generateBox(level, chunkBB, 4, 2, 0, 4, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1232 generateBox(level, chunkBB, 0, 3, 1, 0, 4, 1, Tile::netherFence_Id, Tile::netherFence_Id, false);
1233 generateBox(level, chunkBB, 0, 3, 3, 0, 4, 3, Tile::netherFence_Id, Tile::netherFence_Id, false);
1234 generateBox(level, chunkBB, 4, 3, 1, 4, 4, 1, Tile::netherFence_Id, Tile::netherFence_Id, false);
1235 generateBox(level, chunkBB, 4, 3, 3, 4, 4, 3, Tile::netherFence_Id, Tile::netherFence_Id, false);
1236
1237 // roof
1238 generateBox(level, chunkBB, 0, 6, 0, 4, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1239
1240 // supports
1241 for (int x = 0; x <= 4; x++)
1242 {
1243 for (int z = 0; z <= 4; z++)
1244 {
1245 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1246 }
1247 }
1248
1249 return true;
1250}
1251
1252NetherBridgePieces::CastleSmallCorridorCrossingPiece::CastleSmallCorridorCrossingPiece()
1253{
1254 // for reflection
1255}
1256
1257NetherBridgePieces::CastleSmallCorridorCrossingPiece::CastleSmallCorridorCrossingPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
1258{
1259 orientation = direction;
1260 boundingBox = stairsBox;
1261}
1262
1263void NetherBridgePieces::CastleSmallCorridorCrossingPiece::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
1264{
1265 generateChildForward((StartPiece *) startPiece, pieces, random, 1, 0, true);
1266 generateChildLeft((StartPiece *) startPiece, pieces, random, 0, 1, true);
1267 generateChildRight((StartPiece *) startPiece, pieces, random, 0, 1, true);
1268}
1269
1270NetherBridgePieces::CastleSmallCorridorCrossingPiece *NetherBridgePieces::CastleSmallCorridorCrossingPiece::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
1271{
1272 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction);
1273
1274 StartPiece *startPiece = NULL;
1275 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
1276
1277 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
1278 {
1279 delete box;
1280 return NULL;
1281 }
1282
1283 return new CastleSmallCorridorCrossingPiece(genDepth, random, box, direction);
1284}
1285
1286bool NetherBridgePieces::CastleSmallCorridorCrossingPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
1287{
1288 // floor
1289 generateBox(level, chunkBB, 0, 0, 0, 4, 1, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1290 // room air
1291 generateBox(level, chunkBB, 0, 2, 0, 4, 5, 4, 0, 0, false);
1292
1293 // walls
1294 generateBox(level, chunkBB, 0, 2, 0, 0, 5, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1295 generateBox(level, chunkBB, 4, 2, 0, 4, 5, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1296 generateBox(level, chunkBB, 0, 2, 4, 0, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1297 generateBox(level, chunkBB, 4, 2, 4, 4, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1298
1299 // roof
1300 generateBox(level, chunkBB, 0, 6, 0, 4, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1301
1302 // supports
1303 for (int x = 0; x <= 4; x++)
1304 {
1305 for (int z = 0; z <= 4; z++)
1306 {
1307 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1308 }
1309 }
1310
1311 return true;
1312}
1313
1314NetherBridgePieces::CastleSmallCorridorRightTurnPiece::CastleSmallCorridorRightTurnPiece()
1315{
1316 // for reflection
1317 isNeedingChest = false;
1318}
1319
1320NetherBridgePieces::CastleSmallCorridorRightTurnPiece::CastleSmallCorridorRightTurnPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
1321{
1322 orientation = direction;
1323 boundingBox = stairsBox;
1324 isNeedingChest = random->nextInt(3) == 0;
1325}
1326
1327void NetherBridgePieces::CastleSmallCorridorRightTurnPiece::readAdditonalSaveData(CompoundTag *tag)
1328{
1329 NetherBridgePiece::readAdditonalSaveData(tag);
1330
1331 isNeedingChest = tag->getBoolean(L"Chest");
1332}
1333
1334void NetherBridgePieces::CastleSmallCorridorRightTurnPiece::addAdditonalSaveData(CompoundTag *tag)
1335{
1336 NetherBridgePiece::addAdditonalSaveData(tag);
1337
1338 tag->putBoolean(L"Chest", isNeedingChest);
1339}
1340
1341void NetherBridgePieces::CastleSmallCorridorRightTurnPiece::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
1342{
1343 generateChildRight((StartPiece *) startPiece, pieces, random, 0, 1, true);
1344}
1345
1346NetherBridgePieces::CastleSmallCorridorRightTurnPiece *NetherBridgePieces::CastleSmallCorridorRightTurnPiece::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
1347{
1348 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction);
1349
1350 StartPiece *startPiece = NULL;
1351 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
1352
1353 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
1354 {
1355 delete box;
1356 return NULL;
1357 }
1358
1359 return new CastleSmallCorridorRightTurnPiece(genDepth, random, box, direction);
1360}
1361
1362bool NetherBridgePieces::CastleSmallCorridorRightTurnPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
1363{
1364 // floor
1365 generateBox(level, chunkBB, 0, 0, 0, 4, 1, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1366 // room air
1367 generateBox(level, chunkBB, 0, 2, 0, 4, 5, 4, 0, 0, false);
1368
1369 // walls
1370 generateBox(level, chunkBB, 0, 2, 0, 0, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1371 generateBox(level, chunkBB, 0, 3, 1, 0, 4, 1, Tile::netherFence_Id, Tile::netherFence_Id, false);
1372 generateBox(level, chunkBB, 0, 3, 3, 0, 4, 3, Tile::netherFence_Id, Tile::netherFence_Id, false);
1373
1374 generateBox(level, chunkBB, 4, 2, 0, 4, 5, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1375
1376 generateBox(level, chunkBB, 1, 2, 4, 4, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1377 generateBox(level, chunkBB, 1, 3, 4, 1, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false);
1378 generateBox(level, chunkBB, 3, 3, 4, 3, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false);
1379
1380 if (isNeedingChest)
1381 {
1382 int y = getWorldY(2);
1383 int x = getWorldX(1, 3), z = getWorldZ(1, 3);
1384 if (chunkBB->isInside(x, y, z))
1385 {
1386 isNeedingChest = false;
1387 createChest(level, chunkBB, random, 1, 2, 3, WeighedTreasureArray(fortressTreasureItems,FORTRESS_TREASURE_ITEMS_COUNT), 2 + random->nextInt(4));
1388 }
1389 }
1390
1391 // roof
1392 generateBox(level, chunkBB, 0, 6, 0, 4, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1393
1394 // supports
1395 for (int x = 0; x <= 4; x++)
1396 {
1397 for (int z = 0; z <= 4; z++)
1398 {
1399 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1400 }
1401 }
1402
1403 return true;
1404}
1405
1406NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::CastleSmallCorridorLeftTurnPiece()
1407{
1408 isNeedingChest = false;
1409 // for reflection
1410}
1411
1412NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::CastleSmallCorridorLeftTurnPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
1413{
1414 orientation = direction;
1415 boundingBox = stairsBox;
1416 isNeedingChest = random->nextInt(3) == 0;
1417}
1418
1419void NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::readAdditonalSaveData(CompoundTag *tag)
1420{
1421 NetherBridgePiece::readAdditonalSaveData(tag);
1422
1423 isNeedingChest = tag->getBoolean(L"Chest");
1424}
1425
1426void NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::addAdditonalSaveData(CompoundTag *tag)
1427{
1428 NetherBridgePiece::addAdditonalSaveData(tag);
1429
1430 tag->putBoolean(L"Chest", isNeedingChest);
1431}
1432
1433void NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
1434{
1435 generateChildLeft((StartPiece *) startPiece, pieces, random, 0, 1, true);
1436}
1437
1438NetherBridgePieces::CastleSmallCorridorLeftTurnPiece *NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
1439{
1440 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction);
1441
1442 StartPiece *startPiece = NULL;
1443 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
1444
1445 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
1446 {
1447 delete box;
1448 return NULL;
1449 }
1450
1451 return new CastleSmallCorridorLeftTurnPiece(genDepth, random, box, direction);
1452}
1453
1454bool NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
1455{
1456 // floor
1457 generateBox(level, chunkBB, 0, 0, 0, 4, 1, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1458 // room air
1459 generateBox(level, chunkBB, 0, 2, 0, 4, 5, 4, 0, 0, false);
1460
1461 // walls
1462 generateBox(level, chunkBB, 4, 2, 0, 4, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1463 generateBox(level, chunkBB, 4, 3, 1, 4, 4, 1, Tile::netherFence_Id, Tile::netherFence_Id, false);
1464 generateBox(level, chunkBB, 4, 3, 3, 4, 4, 3, Tile::netherFence_Id, Tile::netherFence_Id, false);
1465
1466 generateBox(level, chunkBB, 0, 2, 0, 0, 5, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1467
1468 generateBox(level, chunkBB, 0, 2, 4, 3, 5, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1469 generateBox(level, chunkBB, 1, 3, 4, 1, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false);
1470 generateBox(level, chunkBB, 3, 3, 4, 3, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false);
1471
1472 if (isNeedingChest)
1473 {
1474 int y = getWorldY(2);
1475 int x = getWorldX(3, 3), z = getWorldZ(3, 3);
1476 if (chunkBB->isInside(x, y, z))
1477 {
1478 isNeedingChest = false;
1479 createChest(level, chunkBB, random, 3, 2, 3, WeighedTreasureArray(fortressTreasureItems,FORTRESS_TREASURE_ITEMS_COUNT), 2 + random->nextInt(4));
1480 }
1481 }
1482
1483 // roof
1484 generateBox(level, chunkBB, 0, 6, 0, 4, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1485
1486 // supports
1487 for (int x = 0; x <= 4; x++)
1488 {
1489 for (int z = 0; z <= 4; z++)
1490 {
1491 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1492 }
1493 }
1494
1495 return true;
1496}
1497
1498NetherBridgePieces::CastleCorridorStairsPiece::CastleCorridorStairsPiece()
1499{
1500 // for reflection
1501}
1502
1503NetherBridgePieces::CastleCorridorStairsPiece::CastleCorridorStairsPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
1504{
1505 orientation = direction;
1506 boundingBox = stairsBox;
1507}
1508
1509void NetherBridgePieces::CastleCorridorStairsPiece::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
1510{
1511 generateChildForward((StartPiece *) startPiece, pieces, random, 1, 0, true);
1512}
1513
1514NetherBridgePieces::CastleCorridorStairsPiece *NetherBridgePieces::CastleCorridorStairsPiece::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
1515{
1516 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -7, 0, width, height, depth, direction);
1517
1518 StartPiece *startPiece = NULL;
1519 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
1520
1521 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
1522 {
1523 delete box;
1524 return NULL;
1525 }
1526
1527 return new CastleCorridorStairsPiece(genDepth, random, box, direction);
1528}
1529
1530bool NetherBridgePieces::CastleCorridorStairsPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
1531{
1532 // generate stairs
1533 int stairsData = getOrientationData(Tile::stairs_netherBricks_Id, 2);
1534 for (int step = 0; step <= 9; step++)
1535 {
1536 int floor = max(1, 7 - step);
1537 int roof = min(max(floor + 5, 14 - step), 13);
1538 int z = step;
1539
1540 // floor
1541 generateBox(level, chunkBB, 0, 0, z, 4, floor, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1542 // room air
1543 generateBox(level, chunkBB, 1, floor + 1, z, 3, roof - 1, z, 0, 0, false);
1544 if (step <= 6)
1545 {
1546 placeBlock(level, Tile::stairs_netherBricks_Id, stairsData, 1, floor + 1, z, chunkBB);
1547 placeBlock(level, Tile::stairs_netherBricks_Id, stairsData, 2, floor + 1, z, chunkBB);
1548 placeBlock(level, Tile::stairs_netherBricks_Id, stairsData, 3, floor + 1, z, chunkBB);
1549 }
1550 // roof
1551 generateBox(level, chunkBB, 0, roof, z, 4, roof, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1552 // walls
1553 generateBox(level, chunkBB, 0, floor + 1, z, 0, roof - 1, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1554 generateBox(level, chunkBB, 4, floor + 1, z, 4, roof - 1, z, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1555 if ((step & 1) == 0)
1556 {
1557 generateBox(level, chunkBB, 0, floor + 2, z, 0, floor + 3, z, Tile::netherFence_Id, Tile::netherFence_Id, false);
1558 generateBox(level, chunkBB, 4, floor + 2, z, 4, floor + 3, z, Tile::netherFence_Id, Tile::netherFence_Id, false);
1559 }
1560
1561 // supports
1562 for (int x = 0; x <= 4; x++)
1563 {
1564 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1565 }
1566 }
1567
1568
1569 return true;
1570}
1571
1572NetherBridgePieces::CastleCorridorTBalconyPiece::CastleCorridorTBalconyPiece()
1573{
1574 // for reflection
1575}
1576
1577NetherBridgePieces::CastleCorridorTBalconyPiece::CastleCorridorTBalconyPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth)
1578{
1579 orientation = direction;
1580 boundingBox = stairsBox;
1581}
1582
1583void NetherBridgePieces::CastleCorridorTBalconyPiece::addChildren(StructurePiece *startPiece, list<StructurePiece *> *pieces, Random *random)
1584{
1585 int zOff = 1;
1586 // compensate for weird negative-facing behaviour
1587 if (orientation == Direction::WEST || orientation == Direction::NORTH)
1588 {
1589 zOff = 5;
1590 }
1591
1592 generateChildLeft((StartPiece *) startPiece, pieces, random, 0, zOff, random->nextInt(8) > 0);
1593 generateChildRight((StartPiece *) startPiece, pieces, random, 0, zOff, random->nextInt(8) > 0);
1594}
1595
1596NetherBridgePieces::CastleCorridorTBalconyPiece *NetherBridgePieces::CastleCorridorTBalconyPiece::createPiece(list<StructurePiece *> *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth)
1597{
1598 BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -3, 0, 0, width, height, depth, direction);
1599
1600 StartPiece *startPiece = NULL;
1601 if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front());
1602
1603 if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL)
1604 {
1605 delete box;
1606 return NULL;
1607 }
1608
1609 return new CastleCorridorTBalconyPiece(genDepth, random, box, direction);
1610}
1611
1612bool NetherBridgePieces::CastleCorridorTBalconyPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB)
1613{
1614 // floor
1615 generateBox(level, chunkBB, 0, 0, 0, 8, 1, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1616 // room air
1617 generateBox(level, chunkBB, 0, 2, 0, 8, 5, 8, 0, 0, false);
1618 // corridor roof
1619 generateBox(level, chunkBB, 0, 6, 0, 8, 6, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1620
1621 // inside walls
1622 generateBox(level, chunkBB, 0, 2, 0, 2, 5, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1623 generateBox(level, chunkBB, 6, 2, 0, 8, 5, 0, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1624 generateBox(level, chunkBB, 1, 3, 0, 1, 4, 0, Tile::netherFence_Id, Tile::netherFence_Id, false);
1625 generateBox(level, chunkBB, 7, 3, 0, 7, 4, 0, Tile::netherFence_Id, Tile::netherFence_Id, false);
1626
1627 // balcony floor
1628 generateBox(level, chunkBB, 0, 2, 4, 8, 2, 8, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1629 generateBox(level, chunkBB, 1, 1, 4, 2, 2, 4, 0, 0, false);
1630 generateBox(level, chunkBB, 6, 1, 4, 7, 2, 4, 0, 0, false);
1631
1632 // hand rails
1633 generateBox(level, chunkBB, 0, 3, 8, 8, 3, 8, Tile::netherFence_Id, Tile::netherFence_Id, false);
1634 generateBox(level, chunkBB, 0, 3, 6, 0, 3, 7, Tile::netherFence_Id, Tile::netherFence_Id, false);
1635 generateBox(level, chunkBB, 8, 3, 6, 8, 3, 7, Tile::netherFence_Id, Tile::netherFence_Id, false);
1636
1637 // balcony walls
1638 generateBox(level, chunkBB, 0, 3, 4, 0, 5, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1639 generateBox(level, chunkBB, 8, 3, 4, 8, 5, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1640 generateBox(level, chunkBB, 1, 3, 5, 2, 5, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1641 generateBox(level, chunkBB, 6, 3, 5, 7, 5, 5, Tile::netherBrick_Id, Tile::netherBrick_Id, false);
1642 generateBox(level, chunkBB, 1, 4, 5, 1, 5, 5, Tile::netherFence_Id, Tile::netherFence_Id, false);
1643 generateBox(level, chunkBB, 7, 4, 5, 7, 5, 5, Tile::netherFence_Id, Tile::netherFence_Id, false);
1644
1645 // supports
1646 for (int z = 0; z <= 5; z++)
1647 {
1648 for (int x = 0; x <= 8; x++)
1649 {
1650 fillColumnDown(level, Tile::netherBrick_Id, 0, x, -1, z, chunkBB);
1651 }
1652 }
1653
1654 return true;
1655}
1656
1657