Просмотр исходного кода

fix crash when opening recipies and deadlock during entity ticks

Kolja Strohm 7 часов назад
Родитель
Сommit
1e5d4fe206

+ 0 - 5
FactoryCraft/BlockComponent.cpp

@@ -4,11 +4,6 @@ BlockComponent::BlockComponent()
     : Framework::ReferenceCounter()
 {}
 
-bool BlockComponent::isLightSource() const
-{
-    return 0;
-}
-
 int BlockComponent::getLightColor() const
 {
     return 0;

+ 0 - 1
FactoryCraft/BlockComponent.h

@@ -23,6 +23,5 @@ public:
     virtual Framework::XML::Element* getTooltipUIML() const = 0;
     virtual void loadComponent(Framework::StreamReader* zReader) = 0;
     virtual void saveComponent(Framework::StreamWriter* zWriter) const = 0;
-    virtual bool isLightSource() const;
     virtual int getLightColor() const;
 };

+ 28 - 29
FactoryCraft/Dimension.cpp

@@ -5,10 +5,10 @@
 
 #include "ChunkMap.h"
 #include "Constants.h"
-#include "File.h"
 #include "DimensionMap.h"
 #include "Entity.h"
 #include "EntityType.h"
+#include "File.h"
 #include "Game.h"
 #include "NoBlock.h"
 #include "Player.h"
@@ -337,40 +337,39 @@ void Dimension::entityTickLoop()
         zm.measureEnd();
         double seconds = zm.getSekunden();
         zm.measureStart();
-        entityCs.lock();
-        chunkCs.lock();
-        auto iterator = entities->begin();
-        auto end = entities->end();
-        while (iterator != end)
         {
-            if (!iterator->isRemoved())
-            {
-                iterator->prepareTick(this, seconds);
-                iterator++;
-            }
-            else
+            Framework::CriticalLock lock({&entityCs, &chunkCs});
+            auto iterator = entities->begin();
+            auto end = entities->end();
+            while (iterator != end)
             {
-                auto chunk = zChunk(
-                    Game::getChunkCenter((int)iterator->getPosition().x,
-                        (int)iterator->getPosition().y));
-                if (chunk)
+                if (!iterator->isRemoved())
                 {
-                    chunk->onEntityLeaves(iterator, 0);
+                    iterator->prepareTick(this, seconds);
+                    iterator++;
+                }
+                else
+                {
+                    auto chunk = zChunk(
+                        Game::getChunkCenter((int)iterator->getPosition().x,
+                            (int)iterator->getPosition().y));
+                    if (chunk)
+                    {
+                        chunk->onEntityLeaves(iterator, 0);
+                    }
+                    iterator.remove();
                 }
-                iterator.remove();
             }
-        }
-        int index = 0;
-        for (auto entity : *entities)
-        {
-            if (!entity->isRemoved())
+            int index = 0;
+            for (auto entity : *entities)
             {
-                entity->tick(this, seconds);
+                if (!entity->isRemoved())
+                {
+                    entity->tick(this, seconds);
+                }
+                index++;
             }
-            index++;
-        }
-        chunkCs.unlock();
-        entityCs.unlock();
+        } // end of LOCK entityCs, chunkCs
         ausgleich += 1.0 / 30 - seconds;
         if (ausgleich > 0) Sleep((int)(ausgleich * 1000));
     }
@@ -607,7 +606,7 @@ void Dimension::save(Text worldDir) const
 {
     File d;
     d.setFile(Game::INSTANCE->getWorldDirectory() + "/dim/" + Text(dimensionId)
-               + "/meta.dim");
+              + "/meta.dim");
     d.create();
     d.open(File::Style::write);
     d.write((char*)&nextStructureId, 8);

+ 2 - 5
FactoryCraft/FireBasedProcessingBlockComponent.cpp

@@ -114,6 +114,8 @@ bool FireBasedProcessingBlockComponent::consumeFuel()
                 fuelStack->release();
                 fireStartingStack->release();
                 changed = 1;
+                Game::INSTANCE->updateLightningWithoutWait(
+                    zBlock->getDimensionId(), zBlock->getPos());
             }
         }
     }
@@ -432,11 +434,6 @@ void FireBasedProcessingBlockComponent::saveComponent(
     zWriter->write((char*)&index, 4);
 }
 
-bool FireBasedProcessingBlockComponent::isLightSource() const
-{
-    return 1;
-}
-
 int FireBasedProcessingBlockComponent::getLightColor() const
 {
     return burning ? burnLight : 0;

+ 0 - 1
FactoryCraft/FireBasedProcessingBlockComponent.h

@@ -54,7 +54,6 @@ public:
     virtual int getStorageDimensionId() const override;
     virtual void loadComponent(Framework::StreamReader* zReader) override;
     virtual void saveComponent(Framework::StreamWriter* zWriter) const override;
-    virtual bool isLightSource() const override;
     virtual int getLightColor() const override;
 
     friend class FireBasedProcessingBlockComponentFactory;

+ 1 - 0
FactoryCraft/ItemFilter.cpp

@@ -423,6 +423,7 @@ UIMLItemFilterBuilder* TypeItemFilter::getUIML() const
 {
     return UIMLBuilder::createItemAttributeFilter()
         ->requireAttributeEquals("Type", Framework::Text() += type->getId())
+        ->itemTypeIcon(type->getId())
         ->build();
 }
 

+ 6 - 1
FactoryCraft/UIMLBuilder.h

@@ -1309,6 +1309,11 @@ public:
         return this;
     }
 
+    UIMLItemAttributeFilterBuilder* itemTypeIcon(int itemTypeId){
+        result->setAttribute("itemIcon", itemTypeId);
+        return this;
+    }
+
     UIMLItemFilterBuilder* build()
     {
         UIMLItemFilterBuilder* builder = new UIMLItemFilterBuilder(result);
@@ -1416,7 +1421,7 @@ public:
 
     UIMLRecipieIngredientBuilder* setFilter(UIMLItemFilterBuilder* filter)
     {
-        Framework::XML::Element* filterElement = filter->build();
+        Framework::XML::Element* filterElement = new Framework::XML::Element();
         filterElement->setName("logic");
         filterElement->addChild(filter->build());
         result->addChild(filterElement);

+ 1 - 0
Windows Version/data/blocks/blockTypes.json

@@ -1191,6 +1191,7 @@
       }
     ],
     "lightSource": true,
+    "transparent": true,
     "interactions": [
       {
         "type": "OpenDialogInteractionConfig",