diff options
Diffstat (limited to 'Minecraft.World/StructureStart.cpp')
| -rw-r--r-- | Minecraft.World/StructureStart.cpp | 121 |
1 files changed, 95 insertions, 26 deletions
diff --git a/Minecraft.World/StructureStart.cpp b/Minecraft.World/StructureStart.cpp index 22a4312c..9e5ba0a8 100644 --- a/Minecraft.World/StructureStart.cpp +++ b/Minecraft.World/StructureStart.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "StructureStart.h" #include "StructurePiece.h" #include "BoundingBox.h" @@ -7,9 +8,17 @@ StructureStart::StructureStart() { + chunkX = chunkZ = 0; boundingBox = NULL; // 4J added initialiser } +StructureStart::StructureStart(int x, int z) +{ + this->chunkX = x; + this->chunkZ = z; + boundingBox = NULL; +} + StructureStart::~StructureStart() { for(AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) @@ -37,8 +46,8 @@ void StructureStart::postProcess(Level *level, Random *random, BoundingBox *chun { if( (*it)->getBoundingBox()->intersects(chunkBB) && !(*it)->postProcess(level, random, chunkBB)) { - // this piece can't be placed, so remove it to avoid future - // attempts + // this piece can't be placed, so remove it to avoid future + // attempts it = pieces.erase(it); } else @@ -50,7 +59,7 @@ void StructureStart::postProcess(Level *level, Random *random, BoundingBox *chun void StructureStart::calculateBoundingBox() { - boundingBox = BoundingBox::getUnknownBox(); + boundingBox = BoundingBox::getUnknownBox(); for( AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) { @@ -59,53 +68,113 @@ void StructureStart::calculateBoundingBox() } } +CompoundTag *StructureStart::createTag(int chunkX, int chunkZ) +{ + CompoundTag *tag = new CompoundTag(); + + tag->putString(L"id", StructureFeatureIO::getEncodeId(this)); + tag->putInt(L"ChunkX", chunkX); + tag->putInt(L"ChunkZ", chunkZ); + tag->put(L"BB", boundingBox->createTag(L"BB")); + + ListTag<CompoundTag> *childrenTags = new ListTag<CompoundTag>(L"Children"); + for(AUTO_VAR(it, pieces.begin()); it != pieces.end(); ++it) + { + StructurePiece *piece = *it; + childrenTags->add(piece->createTag()); + } + tag->put(L"Children", childrenTags); + + addAdditonalSaveData(tag); + + return tag; +} + +void StructureStart::addAdditonalSaveData(CompoundTag *tag) +{ + +} + +void StructureStart::load(Level *level, CompoundTag *tag) +{ + chunkX = tag->getInt(L"ChunkX"); + chunkZ = tag->getInt(L"ChunkZ"); + if (tag->contains(L"BB")) + { + boundingBox = new BoundingBox(tag->getIntArray(L"BB")); + } + + ListTag<CompoundTag> *children = (ListTag<CompoundTag> *) tag->getList(L"Children"); + for (int i = 0; i < children->size(); i++) + { + pieces.push_back(StructureFeatureIO::loadStaticPiece(children->get(i), level)); + } + + readAdditonalSaveData(tag); +} + +void StructureStart::readAdditonalSaveData(CompoundTag *tag) +{ + +} + void StructureStart::moveBelowSeaLevel(Level *level, Random *random, int offset) { const int MAX_Y = level->seaLevel - offset; - // set lowest possible position (at bedrock) - int y1Pos = boundingBox->getYSpan() + 1; - // move up randomly within the available span - if (y1Pos < MAX_Y) + // set lowest possible position (at bedrock) + int y1Pos = boundingBox->getYSpan() + 1; + // move up randomly within the available span + if (y1Pos < MAX_Y) { - y1Pos += random->nextInt(MAX_Y - y1Pos); - } + y1Pos += random->nextInt(MAX_Y - y1Pos); + } - // move all bounding boxes - int dy = y1Pos - boundingBox->y1; - boundingBox->move(0, dy, 0); + // move all bounding boxes + int dy = y1Pos - boundingBox->y1; + boundingBox->move(0, dy, 0); for( AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) { StructurePiece *piece = *it; - piece->getBoundingBox()->move(0, dy, 0); - } + piece->getBoundingBox()->move(0, dy, 0); + } } void StructureStart::moveInsideHeights(Level *level, Random *random, int lowestAllowed, int highestAllowed) { - int heightSpan = highestAllowed - lowestAllowed + 1 - boundingBox->getYSpan(); - int y0Pos = 1; + int heightSpan = highestAllowed - lowestAllowed + 1 - boundingBox->getYSpan(); + int y0Pos = 1; - if (heightSpan > 1) + if (heightSpan > 1) { - y0Pos = lowestAllowed + random->nextInt(heightSpan); - } + y0Pos = lowestAllowed + random->nextInt(heightSpan); + } else { - y0Pos = lowestAllowed; - } + y0Pos = lowestAllowed; + } - // move all bounding boxes - int dy = y0Pos - boundingBox->y0; - boundingBox->move(0, dy, 0); + // move all bounding boxes + int dy = y0Pos - boundingBox->y0; + boundingBox->move(0, dy, 0); for( AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) { StructurePiece *piece = *it; - piece->getBoundingBox()->move(0, dy, 0); - } + piece->getBoundingBox()->move(0, dy, 0); + } } bool StructureStart::isValid() { return true; +} + +int StructureStart::getChunkX() +{ + return chunkX; +} + +int StructureStart::getChunkZ() +{ + return chunkZ; }
\ No newline at end of file |
