diff options
author | madmaxoft <github@xoft.cz> | 2014-05-02 22:07:30 +0200 |
---|---|---|
committer | madmaxoft <github@xoft.cz> | 2014-05-02 22:07:30 +0200 |
commit | 58224863c0e3c61f28e2f345e53ee632043de9c4 (patch) | |
tree | 70805db1e9b6041351ee2d764f8ea34b3b31c7be /src/Simulator/VanillaFluidSimulator.cpp | |
parent | Fixed a buffer overflow in cChunk:SetLight(). (diff) | |
download | cuberite-58224863c0e3c61f28e2f345e53ee632043de9c4.tar cuberite-58224863c0e3c61f28e2f345e53ee632043de9c4.tar.gz cuberite-58224863c0e3c61f28e2f345e53ee632043de9c4.tar.bz2 cuberite-58224863c0e3c61f28e2f345e53ee632043de9c4.tar.lz cuberite-58224863c0e3c61f28e2f345e53ee632043de9c4.tar.xz cuberite-58224863c0e3c61f28e2f345e53ee632043de9c4.tar.zst cuberite-58224863c0e3c61f28e2f345e53ee632043de9c4.zip |
Diffstat (limited to 'src/Simulator/VanillaFluidSimulator.cpp')
-rw-r--r-- | src/Simulator/VanillaFluidSimulator.cpp | 15 |
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; |