parent
8ff7cf9262
commit
58224863c0
@ -119,7 +119,7 @@ void cFloodyFluidSimulator::SimulateBlock(cChunk * a_Chunk, int a_RelX, int a_Re
|
|||||||
if (SpreadFurther && (NewMeta < 8))
|
if (SpreadFurther && (NewMeta < 8))
|
||||||
{
|
{
|
||||||
// Spread to the neighbors:
|
// Spread to the neighbors:
|
||||||
Spread(a_Chunk, a_RelX, a_RelY, a_RelZ, NewMeta);
|
SpreadXZ(a_Chunk, a_RelX, a_RelY, a_RelZ, NewMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark as processed:
|
// Mark as processed:
|
||||||
@ -130,7 +130,7 @@ void cFloodyFluidSimulator::SimulateBlock(cChunk * a_Chunk, int a_RelX, int a_Re
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cFloodyFluidSimulator::Spread(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta)
|
void cFloodyFluidSimulator::SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta)
|
||||||
{
|
{
|
||||||
SpreadToNeighbor(a_Chunk, a_RelX - 1, a_RelY, a_RelZ, a_NewMeta);
|
SpreadToNeighbor(a_Chunk, a_RelX - 1, a_RelY, a_RelZ, a_NewMeta);
|
||||||
SpreadToNeighbor(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, a_NewMeta);
|
SpreadToNeighbor(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, a_NewMeta);
|
||||||
|
@ -48,16 +48,13 @@ protected:
|
|||||||
bool CheckNeighborsForSource(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
bool CheckNeighborsForSource(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
/** Checks if the specified block should harden (Water/Lava interaction) and if so, converts it to a suitable block.
|
/** Checks if the specified block should harden (Water/Lava interaction) and if so, converts it to a suitable block.
|
||||||
*
|
Returns whether the block was changed or not. */
|
||||||
* Returns whether the block was changed or not.
|
|
||||||
*/
|
|
||||||
bool HardenBlock(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta);
|
bool HardenBlock(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta);
|
||||||
|
|
||||||
/** Spread water to neighbors.
|
/** Spread fluid to XZ neighbors.
|
||||||
*
|
The coords are of the block currently being processed; a_NewMeta is the new meta for the new fluid block.
|
||||||
* May be overridden to provide more sophisticated algorithms.
|
Descendants may overridde to provide more sophisticated algorithms. */
|
||||||
*/
|
virtual void SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta);
|
||||||
virtual void Spread(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta);
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -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];
|
int Cost[4];
|
||||||
Cost[0] = CalculateFlowCost(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, X_PLUS);
|
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[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[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);
|
Cost[3] = CalculateFlowCost(a_Chunk, a_RelX, a_RelY, a_RelZ - 1, Z_MINUS);
|
||||||
|
|
||||||
|
// Find the minimum distance:
|
||||||
int MinCost = InfiniteCost;
|
int MinCost = InfiniteCost;
|
||||||
for (unsigned int i = 0; i < ARRAYCOUNT(Cost); ++i)
|
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)
|
if (Cost[0] == MinCost)
|
||||||
{
|
{
|
||||||
SpreadToNeighbor(a_Chunk, a_RelX + 1, a_RelY, a_RelZ, a_NewMeta);
|
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;
|
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;
|
return Cost;
|
||||||
}
|
}
|
||||||
@ -96,7 +102,10 @@ int cVanillaFluidSimulator::CalculateFlowCost(cChunk * a_Chunk, int a_RelX, int
|
|||||||
{
|
{
|
||||||
return Cost;
|
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
|
// Path found, exit
|
||||||
return a_Iteration;
|
return a_Iteration;
|
||||||
|
@ -30,7 +30,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// cFloodyFluidSimulator overrides:
|
// cFloodyFluidSimulator overrides:
|
||||||
virtual void Spread(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta) override;
|
virtual void SpreadXZ(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_NewMeta) override;
|
||||||
|
|
||||||
/** Recursively calculates the minimum number of blocks needed to descend a level. */
|
/** Recursively calculates the minimum number of blocks needed to descend a level. */
|
||||||
int CalculateFlowCost(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, Direction a_Dir, unsigned a_Iteration = 0);
|
int CalculateFlowCost(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, Direction a_Dir, unsigned a_Iteration = 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user