123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #include "MultiblockStructureManager.h"
- #include <Datei.h>
- #include <Logging.h>
- #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<Framework::Text>* 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<int> 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<int> 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();
- }
|