#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::File folder(path); Framework::RCArray* files = folder.getFileList(); 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->getEntryCount()); progressBar->triggerUpdate(); char addr[12]; for (Framework::Text* name : *files) { Framework::File d(Framework::Text(folder.zPfad()->getText()) + "/" + name->getText()); if (d.open(Framework::File::Style::read)) { d.read(addr, 4); d.read(addr + 4, 4); d.read(addr + 8, 4); __int64 id; d.read((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::File d(path); Framework::Vec3 uPos; if (d.open(Framework::File::Style::read)) { d.read((char*)&uPos.x, 4); d.read((char*)&uPos.y, 4); d.read((char*)&uPos.z, 4); __int64 strId; d.read((char*)&strId, 8); int type; d.read((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::File d; Framework::Text path = Game::INSTANCE->getWorldDirectory() + "/dim/" + Framework::Text(dimensionId) + "/structures/"; path.appendHex(zStructure->getStructureId()); path += ".str"; d.setFile(path); d.create(); d.open(Framework::File::Style::write); auto uPos = zStructure->getUniquePosition(); d.write((char*)&uPos.x, 4); d.write((char*)&uPos.y, 4); d.write((char*)&uPos.z, 4); __int64 strId = zStructure->getStructureId(); d.write((char*)&strId, 8); int typeId = zStructure->getStructureTypeId(); d.write((char*)&typeId, 4); Game::INSTANCE->zMultiblockStructureType(zStructure->getStructureTypeId()) ->saveStructure(zStructure, &d); d.close(); }