Forráskód Böngészése

stop sidewards fluid flow if it can flow downwards

Kolja Strohm 9 hónapja
szülő
commit
7bd4411648
1 módosított fájl, 39 hozzáadás és 25 törlés
  1. 39 25
      FactoryCraft/FluidBlock.cpp

+ 39 - 25
FactoryCraft/FluidBlock.cpp

@@ -78,6 +78,17 @@ void FluidBlock::broadcastFlow()
 
 void FluidBlock::doFlow()
 {
+    bool doesFlowSidewards = 1;
+    if ((zNeighbours[getDirectionIndex(Direction::BOTTOM)]
+                && zNeighbours[getDirectionIndex(Direction::BOTTOM)]
+                           ->zBlockType()
+                       == zBlockType()
+            || neighbourTypes[getDirectionIndex(Direction::BOTTOM)]
+                   == BlockTypeEnum::AIR)
+        && distanceToSource)
+    {
+        doesFlowSidewards = 0;
+    }
     bool changed = false;
     for (int i = 0; i < 6; i++)
     {
@@ -85,33 +96,36 @@ void FluidBlock::doFlow()
         if (dir & Direction::TOP) continue;
         if (neighbourTypes[i] == BlockTypeEnum::AIR)
         {
-            Game::INSTANCE->doLater([this, dir, i]() {
-                if (neighbourTypes[i] == BlockTypeEnum::AIR)
-                {
-                    Block* belowBlock = zBlockType()->createBlockAt(
-                        getPos() + getDirection(dir), getDimensionId(), 0);
-                    FluidBlock* fluidBlock
-                        = dynamic_cast<FluidBlock*>(belowBlock);
-                    if (fluidBlock)
-                    {
-                        fluidBlock->distanceToSource
-                            = dir & Direction::BOTTOM
-                                ? 1
-                                : distanceToSource + 1;
-                        fluidBlock->flowOptions = (char)dir;
-                        Game::INSTANCE->zDimension(getDimensionId())
-                            ->placeBlock(
-                                getPos() + getDirection(dir), belowBlock);
-                    }
-                    else
+            if (dir & Direction::BOTTOM || doesFlowSidewards)
+            {
+                Game::INSTANCE->doLater([this, dir, i]() {
+                    if (neighbourTypes[i] == BlockTypeEnum::AIR)
                     {
-                        std::cout
-                            << "ERROR: created flow fuild block is not an "
-                                "instance of FluidBlock\n";
-                        belowBlock->release();
+                        Block* belowBlock = zBlockType()->createBlockAt(
+                            getPos() + getDirection(dir), getDimensionId(), 0);
+                        FluidBlock* fluidBlock
+                            = dynamic_cast<FluidBlock*>(belowBlock);
+                        if (fluidBlock)
+                        {
+                            fluidBlock->distanceToSource
+                                = dir & Direction::BOTTOM
+                                    ? 1
+                                    : distanceToSource + 1;
+                            fluidBlock->flowOptions = (char)dir;
+                            Game::INSTANCE->zDimension(getDimensionId())
+                                ->placeBlock(
+                                    getPos() + getDirection(dir), belowBlock);
+                        }
+                        else
+                        {
+                            std::cout
+                                << "ERROR: created flow fuild block is not an "
+                                   "instance of FluidBlock\n";
+                            belowBlock->release();
+                        }
                     }
-                }
-            });
+                });
+            }
         }
         else if (zNeighbours[i] && zNeighbours[i]->zBlockType() == zBlockType())
         {