MultiblockStructureManager.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "MultiblockStructureManager.h"
  2. #include <Datei.h>
  3. #include <Logging.h>
  4. #include "Block.h"
  5. #include "Game.h"
  6. MultiblockStructureManager::MultiblockStructureManager(int dimensionId)
  7. : dimensionId(dimensionId)
  8. {
  9. Framework::Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
  10. + Framework::Text(dimensionId) + "/structures";
  11. Framework::Datei folder(path);
  12. Framework::RCArray<Framework::Text>* files = folder.getDateiListe();
  13. if (files)
  14. {
  15. Framework::Logging::info() << "Loading Multiblock Position Cache";
  16. Framework::ConsoleProgressBar* progressBar
  17. = new Framework::ConsoleProgressBar();
  18. Game::consoleHandler->addContent(
  19. progressBar, Framework::ConsoleContentPosition::Top);
  20. progressBar->setMaxProgress(files->getEintragAnzahl());
  21. progressBar->triggerUpdate();
  22. char addr[12];
  23. for (Framework::Text* name : *files)
  24. {
  25. Framework::Datei d(Framework::Text(folder.zPfad()->getText()) + "/"
  26. + name->getText());
  27. if (d.open(Framework::Datei::Style::lesen))
  28. {
  29. d.lese(addr, 4);
  30. d.lese(addr + 4, 4);
  31. d.lese(addr + 8, 4);
  32. __int64 id;
  33. d.lese((char*)&id, 8);
  34. idCache.set(addr, 12, id);
  35. d.close();
  36. }
  37. progressBar->setProgress(progressBar->getProgress() + 1);
  38. progressBar->triggerUpdate();
  39. }
  40. files->release();
  41. Game::consoleHandler->removeContent(progressBar);
  42. }
  43. }
  44. MultiblockStructure* MultiblockStructureManager::loadStructure(__int64 id) const
  45. {
  46. Framework::Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
  47. + Framework::Text(dimensionId) + "/structures/";
  48. path.appendHex(id);
  49. path += ".str";
  50. Framework::Datei d(path);
  51. Framework::Vec3<int> uPos;
  52. if (d.open(Framework::Datei::Style::lesen))
  53. {
  54. d.lese((char*)&uPos.x, 4);
  55. d.lese((char*)&uPos.y, 4);
  56. d.lese((char*)&uPos.z, 4);
  57. __int64 strId;
  58. d.lese((char*)&strId, 8);
  59. int type;
  60. d.lese((char*)&type, 4);
  61. MultiblockStructure* str
  62. = Game::INSTANCE->zMultiblockStructureType(type)->loadStructure(
  63. dimensionId, strId, uPos, &d);
  64. d.close();
  65. return str;
  66. }
  67. return 0;
  68. }
  69. __int64 MultiblockStructureManager::getStructureId(
  70. Framework::Vec3<int> pos) const
  71. {
  72. char addr[12];
  73. *(int*)addr = pos.x;
  74. *(int*)(addr + 4) = pos.y;
  75. *(int*)(addr + 8) = pos.z;
  76. idCache.get(addr, 12);
  77. return 0;
  78. }
  79. void MultiblockStructureManager::saveStructure(
  80. MultiblockStructure* zStructure) const
  81. {
  82. Framework::Datei d;
  83. Framework::Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
  84. + Framework::Text(dimensionId) + "/structures/";
  85. path.appendHex(zStructure->getStructureId());
  86. path += ".str";
  87. d.setDatei(path);
  88. d.erstellen();
  89. d.open(Framework::Datei::Style::schreiben);
  90. auto uPos = zStructure->getUniquePosition();
  91. d.schreibe((char*)&uPos.x, 4);
  92. d.schreibe((char*)&uPos.y, 4);
  93. d.schreibe((char*)&uPos.z, 4);
  94. __int64 strId = zStructure->getStructureId();
  95. d.schreibe((char*)&strId, 8);
  96. int typeId = zStructure->getStructureTypeId();
  97. d.schreibe((char*)&typeId, 4);
  98. Game::INSTANCE->zMultiblockStructureType(zStructure->getStructureTypeId())
  99. ->saveStructure(zStructure, &d);
  100. d.close();
  101. }