Kaynağa Gözat

fix multiblock structures were not saved when dimension was saved

Kolja Strohm 1 yıl önce
ebeveyn
işleme
056e1acaf5

+ 30 - 21
FactoryCraft/Dimension.cpp

@@ -304,6 +304,30 @@ void Dimension::getAddrOfWorld(Punkt wPos, char* addr) const
     getAddrOf(wPos, addr);
 }
 
+void Dimension::saveStructure(MultiblockStructure* zStructure) const
+{
+    Datei d;
+    Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
+              + Text(dimensionId) + "/structures/";
+    path.appendHex(zStructure->getStructureId());
+    path += ".str";
+    d.setDatei(path);
+    d.erstellen();
+    d.open(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);
+    int typeId = zStructure->getStructureTypeId();
+    d.schreibe((char*)&typeId, 4);
+    __int64 strId = zStructure->getStructureId();
+    d.schreibe((char*)&strId, 8);
+    StaticRegistry<MultiblockStructureType>::INSTANCE
+        .zElement(zStructure->getStructureTypeId())
+        ->saveStructure(zStructure, &d);
+    d.close();
+}
+
 Chunk* Dimension::zChunk(Punkt wPos) const
 {
     char addr[8];
@@ -552,6 +576,10 @@ void Dimension::save(Text worldDir) const
         }
         file->close();
     }
+    for (MultiblockStructure* structure : structures)
+    {
+        saveStructure(structure);
+    }
 }
 
 int Dimension::getDimensionId() const
@@ -628,26 +656,7 @@ void Dimension::removeOldChunks()
         }
         else if (i->isFullyUnloaded())
         {
-            Datei d;
-            Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
-                      + Text(dimensionId) + "/structures/";
-            path.appendHex(i->getStructureId());
-            path += ".str";
-            d.setDatei(path);
-            d.erstellen();
-            d.open(Datei::Style::schreiben);
-            auto uPos = i->getUniquePosition();
-            d.schreibe((char*)&uPos.x, 4);
-            d.schreibe((char*)&uPos.y, 4);
-            d.schreibe((char*)&uPos.z, 4);
-            int typeId = i->getStructureTypeId();
-            d.schreibe((char*)&typeId, 4);
-            __int64 strId = i->getStructureId();
-            d.schreibe((char*)&strId, 8);
-            StaticRegistry<MultiblockStructureType>::INSTANCE
-                .zElement(i->getStructureTypeId())
-                ->saveStructure(i.val(), &d);
-            d.close();
+            saveStructure(i);
             i.remove();
             continue;
         }
@@ -724,7 +733,7 @@ void Dimension::updateLightAtChunkBorders(Punkt chunkCenter)
     if (lightUpdateQueue.getEintragAnzahl() > 300000)
     {
         std::cout
-            << "warning: light calculation queue is over 300000 blocks long";
+            << "warning: light calculation queue is over 300000 blocks long\n";
     }
     for (int i = WORLD_HEIGHT - 1; i >= 0; i--)
     {

+ 1 - 0
FactoryCraft/Dimension.h

@@ -41,6 +41,7 @@ private:
 
     void getAddrOf(Framework::Punkt cPos, char* addr) const;
     void getAddrOfWorld(Framework::Punkt wPos, char* addr) const;
+    void saveStructure(MultiblockStructure* zStructure) const;
 
 public:
     Dimension(int id);

+ 34 - 21
enc_temp_folder/2f64842f8d60b6c0f0414517e54e7942/Dimension.cpp → enc_temp_folder/d5635fc3ae2892ff9df5aec8c871e899/Dimension.cpp

@@ -304,6 +304,30 @@ void Dimension::getAddrOfWorld(Punkt wPos, char* addr) const
     getAddrOf(wPos, addr);
 }
 
+void Dimension::saveStructure(MultiblockStructure* zStructure) const
+{
+    Datei d;
+    Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
+              + Text(dimensionId) + "/structures/";
+    path.appendHex(zStructure->getStructureId());
+    path += ".str";
+    d.setDatei(path);
+    d.erstellen();
+    d.open(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);
+    int typeId = zStructure->getStructureTypeId();
+    d.schreibe((char*)&typeId, 4);
+    __int64 strId = zStructure->getStructureId();
+    d.schreibe((char*)&strId, 8);
+    StaticRegistry<MultiblockStructureType>::INSTANCE
+        .zElement(zStructure->getStructureTypeId())
+        ->saveStructure(zStructure, &d);
+    d.close();
+}
+
 Chunk* Dimension::zChunk(Punkt wPos) const
 {
     char addr[8];
@@ -552,6 +576,10 @@ void Dimension::save(Text worldDir) const
         }
         file->close();
     }
+    for (MultiblockStructure* structure : structures)
+    {
+        saveStructure(structure);
+    }
 }
 
 int Dimension::getDimensionId() const
@@ -622,30 +650,15 @@ void Dimension::removeOldChunks()
     while (i)
     {
         if (i->isEmpty())
+        {
             i.remove();
+            continue;
+        }
         else if (i->isFullyUnloaded())
         {
-            Datei d;
-            Text path = Game::INSTANCE->getWorldDirectory() + "/dim/"
-                      + Text(dimensionId) + "/structures/";
-            path.appendHex(i->getStructureId());
-            path += ".str";
-            d.setDatei(path);
-            d.erstellen();
-            d.open(Datei::Style::schreiben);
-            auto uPos = i->getUniquePosition();
-            d.schreibe((char*)&uPos.x, 4);
-            d.schreibe((char*)&uPos.y, 4);
-            d.schreibe((char*)&uPos.z, 4);
-            int typeId = i->getStructureTypeId();
-            d.schreibe((char*)&typeId, 4);
-            __int64 strId = i->getStructureId();
-            d.schreibe((char*)&strId, 8);
-            StaticRegistry<MultiblockStructureType>::INSTANCE
-                .zElement(i->getStructureTypeId())
-                ->saveStructure(i.val(), &d);
-            d.close();
+            saveStructure(i);
             i.remove();
+            continue;
         }
         i++;
     }
@@ -855,7 +868,7 @@ MultiblockStructure* Dimension::zStructureById(__int64 id)
         return str;
     }
     std::cout << "WARNING: did not find Structure information file '" << path
-              << "'.";
+              << "'.\n";
     structurCs.unlock();
     return 0;
 }