#include "stdafx.h" #include "net.minecraft.world.level.levelgen.structure.h" #include "StructureFeatureIO.h" unordered_map StructureFeatureIO::startIdClassMap; unordered_map StructureFeatureIO::startClassIdMap; unordered_map StructureFeatureIO::pieceIdClassMap; unordered_map StructureFeatureIO::pieceClassIdMap; void StructureFeatureIO::setStartId(EStructureStart clas, structureStartCreateFn createFn, const wstring &id) { startIdClassMap[id] = createFn; startClassIdMap[clas] = id; } void StructureFeatureIO::setPieceId(EStructurePiece clas, structurePieceCreateFn createFn, const wstring &id) { pieceIdClassMap[id] = createFn; pieceClassIdMap[clas] = id; } void StructureFeatureIO::staticCtor() { setStartId(eStructureStart_MineShaftStart, MineShaftStart::Create, L"Mineshaft"); setStartId(eStructureStart_VillageStart, VillageFeature::VillageStart::Create, L"Village"); setStartId(eStructureStart_NetherBridgeStart, NetherBridgeFeature::NetherBridgeStart::Create, L"Fortress"); setStartId(eStructureStart_StrongholdStart, StrongholdFeature::StrongholdStart::Create, L"Stronghold"); setStartId(eStructureStart_ScatteredFeatureStart, RandomScatteredLargeFeature::ScatteredFeatureStart::Create, L"Temple"); MineShaftPieces::loadStatic(); VillagePieces::loadStatic(); NetherBridgePieces::loadStatic(); StrongholdPieces::loadStatic(); ScatteredFeaturePieces::loadStatic(); } wstring StructureFeatureIO::getEncodeId(StructureStart *start) { auto it = startClassIdMap.find(start->GetType()); if(it != startClassIdMap.end()) { return it->second; } else { return L""; } } wstring StructureFeatureIO::getEncodeId(StructurePiece *piece) { auto it = pieceClassIdMap.find(piece->GetType()); if(it != pieceClassIdMap.end()) { return it->second; } else { return L""; } } StructureStart *StructureFeatureIO::loadStaticStart(ByteArrayTag *tag, Level *level) { StructureStart *start = nullptr; ByteArrayInputStream bais(tag->data); DataInputStream dis(&bais); int version = dis.readInt(); wstring structureId = dis.readUTF(); auto it = startIdClassMap.find( structureId ); if(it != startIdClassMap.end()) { start = (it->second)(); } if (start != nullptr) { if (!version && !start->isValid()) { start->clearDirty(); start = nullptr; app.DebugPrintf("Skipping Structure with id %ls as it was a broken data version\n", it->first.c_str()); } else { start->load(level, &dis); } } else { app.DebugPrintf( "Skipping Structure with id %ls", it->first.c_str() ); } return start; } StructurePiece *StructureFeatureIO::loadStaticPiece(DataInputStream *dis, Level *level) { StructurePiece *piece = nullptr; auto it = pieceIdClassMap.find(dis->readUTF() ); if(it != pieceIdClassMap.end()) { piece = (it->second)(); } if (piece != nullptr) { piece->load(level, dis); } else { app.DebugPrintf( "Skipping Piece with id %ls", it->first.c_str() ); } return piece; }