|
@@ -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())
|
|
|
{
|