summaryrefslogtreecommitdiffstats
path: root/src/Simulator/VanillaFluidSimulator.cpp
diff options
context:
space:
mode:
authorTycho <work.tycho+git@gmail.com>2014-05-03 15:07:56 +0200
committerTycho <work.tycho+git@gmail.com>2014-05-03 15:07:56 +0200
commitec407dd27dc35b5903fdddf2bad307784842d679 (patch)
tree69c699b9242fcccf4b7ee865b0c6a9842329c0d4 /src/Simulator/VanillaFluidSimulator.cpp
parentcCHunkBuffer that compiles with TestGlobals.h (diff)
parentSeperate instructions for OSX and Linux (diff)
downloadcuberite-ec407dd27dc35b5903fdddf2bad307784842d679.tar
cuberite-ec407dd27dc35b5903fdddf2bad307784842d679.tar.gz
cuberite-ec407dd27dc35b5903fdddf2bad307784842d679.tar.bz2
cuberite-ec407dd27dc35b5903fdddf2bad307784842d679.tar.lz
cuberite-ec407dd27dc35b5903fdddf2bad307784842d679.tar.xz
cuberite-ec407dd27dc35b5903fdddf2bad307784842d679.tar.zst
cuberite-ec407dd27dc35b5903fdddf2bad307784842d679.zip
Diffstat (limited to 'src/Simulator/VanillaFluidSimulator.cpp')
-rw-r--r--src/Simulator/VanillaFluidSimulator.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/Simulator/VanillaFluidSimulator.cpp b/src/Simulator/VanillaFluidSimulator.cpp
index 78aff9d68..28d75214c 100644
--- a/src/Simulator/VanillaFluidSimulator.cpp
+++ b/src/Simulator/VanillaFluidSimulator.cpp
@@ -35,14 +35,16 @@ cVanillaFluidSimulator::cVanillaFluidSimulator(
-void cVanillaFluidSimulator::Spread(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta)
+void cVanillaFluidSimulator::SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta)
{
+ // Calculate the distance to the nearest "hole" in each direction:
int Cost[4];
Cost[0] = CalculateFlowCost(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, X_PLUS);
Cost[1] = CalculateFlowCost(a_Chunk, a_RelX - 1, a_RelY, a_RelZ, X_MINUS);
Cost[2] = CalculateFlowCost(a_Chunk, a_RelX, a_RelY, a_RelZ + 1, Z_PLUS);
Cost[3] = CalculateFlowCost(a_Chunk, a_RelX, a_RelY, a_RelZ - 1, Z_MINUS);
+ // Find the minimum distance:
int MinCost = InfiniteCost;
for (unsigned int i = 0; i < ARRAYCOUNT(Cost); ++i)
{
@@ -52,6 +54,7 @@ void cVanillaFluidSimulator::Spread(cChunk * a_Chunk, int a_RelX, int a_RelY, in
}
}
+ // Spread in all directions where the distance matches the minimum:
if (Cost[0] == MinCost)
{
SpreadToNeighbor(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, a_NewMeta);
@@ -86,7 +89,10 @@ int cVanillaFluidSimulator::CalculateFlowCost(cChunk * a_Chunk, int a_RelX, int
{
return Cost;
}
- if (!IsPassableForFluid(BlockType) && !IsBlockLiquid(BlockType))
+ if (
+ !IsPassableForFluid(BlockType) || // The block cannot be passed by the liquid ...
+ (IsAllowedBlock(BlockType) && (BlockMeta == 0)) // ... or if it is liquid, it is a source block
+ )
{
return Cost;
}
@@ -96,7 +102,10 @@ int cVanillaFluidSimulator::CalculateFlowCost(cChunk * a_Chunk, int a_RelX, int
{
return Cost;
}
- if (IsPassableForFluid(BlockType) || IsBlockLiquid(BlockType))
+ if (
+ IsPassableForFluid(BlockType) || // The block can be passed by the liquid ...
+ (IsBlockLiquid(BlockType) && (BlockMeta != 0)) // ... or it is a liquid and not a source block
+ )
{
// Path found, exit
return a_Iteration;