#include "MultiblockStructureManager.h" #include #include #include "Block.h" #include "Game.h" MultiblockStructureManager::MultiblockStructureManager(int dimensionId) : dimensionId(dimensionId) { Framework::Text path = Game::INSTANCE->getWorldDirectory() + "/dim/" + Framework::Text(dimensionId) + "/structures"; Framework::Datei folder(path); Framework::RCArray* files = folder.getDateiListe(); if (files) { Framework::Logging::info() << "Loading Multiblock Position Cache"; Framework::ConsoleProgressBar* progressBar = new Framework::ConsoleProgressBar(); Game::consoleHandler->addContent( progressBar, Framework::ConsoleContentPosition::Top); progressBar->setMaxProgress(files->getEintragAnzahl()); progressBar->triggerUpdate(); char addr[12]; for (Framework::Text* name : *files) { Framework::Datei d(Framework::Text(folder.zPfad()->getText()) + "/" + name->getText()); if (d.open(Framework::Datei::Style::lesen)) { d.lese(addr, 4); d.lese(addr + 4, 4); d.lese(addr + 8, 4); __int64 id; d.lese((char*)&id, 8); idCache.set(addr, 12, id); d.close(); } progressBar->setProgress(progressBar->getProgress() + 1); progressBar->triggerUpdate(); } files->release(); Game::consoleHandler->removeContent(progressBar); } } MultiblockStructure* MultiblockStructureManager::loadStructure(__int64 id) const { Framework::Text path = Game::INSTANCE->getWorldDirectory() + "/dim/" + Framework::Text(dimensionId) + "/structures/"; path.appendHex(id); path += ".str"; Framework::Datei d(path); Framework::Vec3 uPos; if (d.open(Framework::Datei::Style::lesen)) { d.lese((char*)&uPos.x, 4); d.lese((char*)&uPos.y, 4); d.lese((char*)&uPos.z, 4); __int64 strId; d.lese((char*)&strId, 8); int type; d.lese((char*)&type, 4); MultiblockStructure* str = Game::INSTANCE->zMultiblockStructureType(type)->loadStructure( dimensionId, strId, uPos, &d); d.close(); return str; } return 0; } __int64 MultiblockStructureManager::getStructureId( Framework::Vec3 pos) const { char addr[12]; *(int*)addr = pos.x; *(int*)(addr + 4) = pos.y; *(int*)(addr + 8) = pos.z; idCache.get(addr, 12); return 0; } void MultiblockStructureManager::saveStructure( MultiblockStructure* zStructure) const { Framework::Datei d; Framework::Text path = Game::INSTANCE->getWorldDirectory() + "/dim/" + Framework::Text(dimensionId) + "/structures/"; path.appendHex(zStructure->getStructureId()); path += ".str"; d.setDatei(path); d.erstellen(); d.open(Framework::Datei::Style::schreiben); auto uPos = zStructure->getUniquePosition(); d.schreibe((char*)&uPos.x, 4); d.schreibe((char*)&uPos.y, 4); d.schreibe((char*)&uPos.z, 4); __int64 strId = zStructure->getStructureId(); d.schreibe((char*)&strId, 8); int typeId = zStructure->getStructureTypeId(); d.schreibe((char*)&typeId, 4); Game::INSTANCE->zMultiblockStructureType(zStructure->getStructureTypeId()) ->saveStructure(zStructure, &d); d.close(); }