4jcraft/Minecraft.World/WorldGen/StructureFeatureIO.cpp
2026-03-21 17:45:10 -05:00

101 lines
3.3 KiB
C++

#include "../Platform/stdafx.h"
#include "../Headers/net.minecraft.world.level.levelgen.structure.h"
#include "StructureFeatureIO.h"
std::unordered_map<std::wstring, structureStartCreateFn>
StructureFeatureIO::startIdClassMap;
std::unordered_map<unsigned int, std::wstring>
StructureFeatureIO::startClassIdMap;
std::unordered_map<std::wstring, structurePieceCreateFn>
StructureFeatureIO::pieceIdClassMap;
std::unordered_map<unsigned int, std::wstring>
StructureFeatureIO::pieceClassIdMap;
void StructureFeatureIO::setStartId(EStructureStart clas,
structureStartCreateFn createFn,
const std::wstring& id) {
startIdClassMap[id] = createFn;
startClassIdMap[clas] = id;
}
void StructureFeatureIO::setPieceId(EStructurePiece clas,
structurePieceCreateFn createFn,
const std::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();
}
std::wstring StructureFeatureIO::getEncodeId(StructureStart* start) {
AUTO_VAR(it, startClassIdMap.find(start->GetType()));
if (it != startClassIdMap.end()) {
return it->second;
} else {
return L"";
}
}
std::wstring StructureFeatureIO::getEncodeId(StructurePiece* piece) {
AUTO_VAR(it, pieceClassIdMap.find(piece->GetType()));
if (it != pieceClassIdMap.end()) {
return it->second;
} else {
return L"";
}
}
StructureStart* StructureFeatureIO::loadStaticStart(CompoundTag* tag,
Level* level) {
StructureStart* start = NULL;
AUTO_VAR(it, startIdClassMap.find(tag->getString(L"id")));
if (it != startIdClassMap.end()) {
start = (it->second)();
}
if (start != NULL) {
start->load(level, tag);
} else {
app.DebugPrintf("Skipping Structure with id %ls",
tag->getString(L"id").c_str());
}
return start;
}
StructurePiece* StructureFeatureIO::loadStaticPiece(CompoundTag* tag,
Level* level) {
StructurePiece* piece = NULL;
AUTO_VAR(it, pieceIdClassMap.find(tag->getString(L"id")));
if (it != pieceIdClassMap.end()) {
piece = (it->second)();
}
if (piece != NULL) {
piece->load(level, tag);
} else {
app.DebugPrintf("Skipping Piece with id %ls",
tag->getString(L"id").c_str());
}
return piece;
}