mirror of
https://github.com/minetest/minetest.git
synced 2024-12-23 14:42:24 +01:00
removed accidental double flowWater
This commit is contained in:
parent
2a0d1a059e
commit
db49f37692
177
src/voxel.cpp
177
src/voxel.cpp
@ -725,183 +725,6 @@ bool VoxelManipulator::flowWater(v3s16 removed_pos,
|
|||||||
flowWater(p, active_nodes, recursion_depth,
|
flowWater(p, active_nodes, recursion_depth,
|
||||||
debugprint, counter, counterlimit);
|
debugprint, counter, counterlimit);
|
||||||
|
|
||||||
find_again:
|
|
||||||
// Try flowing water to empty positions around removed_pos.
|
|
||||||
// They are checked in reverse order compared to the previous loop.
|
|
||||||
for(s32 i=5; i>=0; i--)
|
|
||||||
{
|
|
||||||
//v3s16 p = removed_pos + dirs[i];
|
|
||||||
p = removed_pos + v3s16(s1*dirs[i].X, dirs[i].Y, s2*dirs[i].Z);
|
|
||||||
|
|
||||||
u8 f = m_flags[m_area.index(p)];
|
|
||||||
// Water can't move to inexistent nodes
|
|
||||||
if(f & VOXELFLAG_INEXISTENT)
|
|
||||||
continue;
|
|
||||||
MapNode &n = m_data[m_area.index(p)];
|
|
||||||
// Water can only move to air
|
|
||||||
if(n.d != MATERIAL_AIR)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Flow water to node
|
|
||||||
bool moved =
|
|
||||||
flowWater(p, active_nodes, recursion_depth,
|
|
||||||
debugprint, counter, counterlimit);
|
|
||||||
|
|
||||||
if(moved)
|
|
||||||
{
|
|
||||||
// Search again from all neighbors
|
|
||||||
goto find_again;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(counter != NULL)
|
|
||||||
{
|
|
||||||
(*counter)++;
|
|
||||||
if((*counter) % 10 == 0)
|
|
||||||
dstream<<"flowWater(): moved "<<(*counter)<<" nodes"
|
|
||||||
<<std::endl;
|
|
||||||
|
|
||||||
if(counterlimit != -1 && (*counter) > counterlimit)
|
|
||||||
{
|
|
||||||
dstream<<"Counter limit reached; returning"<<std::endl;
|
|
||||||
throw ProcessingLimitException("flowWater counterlimit reached");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
bool VoxelManipulator::flowWater(v3s16 removed_pos,
|
|
||||||
core::map<v3s16, u8> &active_nodes,
|
|
||||||
int recursion_depth, bool debugprint,
|
|
||||||
int *counter, int counterlimit)
|
|
||||||
{
|
|
||||||
v3s16 dirs[6] = {
|
|
||||||
v3s16(0,1,0), // top
|
|
||||||
v3s16(-1,0,0), // left
|
|
||||||
v3s16(1,0,0), // right
|
|
||||||
v3s16(0,0,-1), // front
|
|
||||||
v3s16(0,0,1), // back
|
|
||||||
v3s16(0,-1,0), // bottom
|
|
||||||
};
|
|
||||||
|
|
||||||
recursion_depth++;
|
|
||||||
|
|
||||||
v3s16 p;
|
|
||||||
|
|
||||||
// Randomize horizontal order
|
|
||||||
static s32 cs = 0;
|
|
||||||
if(cs < 3)
|
|
||||||
cs++;
|
|
||||||
else
|
|
||||||
cs = 0;
|
|
||||||
s16 s1 = (cs & 1) ? 1 : -1;
|
|
||||||
s16 s2 = (cs & 2) ? 1 : -1;
|
|
||||||
//dstream<<"s1="<<s1<<", s2="<<s2<<std::endl;
|
|
||||||
|
|
||||||
{
|
|
||||||
TimeTaker timer1("flowWater pre", g_device, &flowwater_pre_time);
|
|
||||||
|
|
||||||
// Load neighboring nodes
|
|
||||||
emerge(VoxelArea(removed_pos - v3s16(1,1,1), removed_pos + v3s16(1,1,1)));
|
|
||||||
|
|
||||||
// Ignore incorrect removed_pos
|
|
||||||
{
|
|
||||||
u8 f = m_flags[m_area.index(removed_pos)];
|
|
||||||
// Ignore inexistent or checked node
|
|
||||||
if(f & (VOXELFLAG_INEXISTENT | VOXELFLAG_CHECKED))
|
|
||||||
return false;
|
|
||||||
MapNode &n = m_data[m_area.index(removed_pos)];
|
|
||||||
// Water can move only to air
|
|
||||||
if(n.d != MATERIAL_AIR)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 i;
|
|
||||||
for(i=0; i<6; i++)
|
|
||||||
{
|
|
||||||
p = removed_pos + v3s16(s1*dirs[i].X, dirs[i].Y, s2*dirs[i].Z);
|
|
||||||
|
|
||||||
u8 f = m_flags[m_area.index(p)];
|
|
||||||
// Inexistent or checked nodes can't move
|
|
||||||
if(f & (VOXELFLAG_INEXISTENT | VOXELFLAG_CHECKED))
|
|
||||||
continue;
|
|
||||||
MapNode &n = m_data[m_area.index(p)];
|
|
||||||
// Only liquid nodes can move
|
|
||||||
if(material_liquid(n.d) == false)
|
|
||||||
continue;
|
|
||||||
// If block is at top, select it always
|
|
||||||
if(i == 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// If block is at bottom, select it if it has enough pressure
|
|
||||||
if(i == 5)
|
|
||||||
{
|
|
||||||
if(n.pressure >= 3)
|
|
||||||
break;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Else block is at some side. Select it if it has enough pressure
|
|
||||||
if(n.pressure >= 2)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is nothing to move, return
|
|
||||||
if(i==6)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Switch nodes at p and removed_pos
|
|
||||||
u8 m = m_data[m_area.index(p)].d;
|
|
||||||
u8 f = m_flags[m_area.index(p)];
|
|
||||||
m_data[m_area.index(p)].d = m_data[m_area.index(removed_pos)].d;
|
|
||||||
m_flags[m_area.index(p)] = m_flags[m_area.index(removed_pos)];
|
|
||||||
m_data[m_area.index(removed_pos)].d = m;
|
|
||||||
m_flags[m_area.index(removed_pos)] = f;
|
|
||||||
|
|
||||||
// Mark removed_pos checked
|
|
||||||
m_flags[m_area.index(removed_pos)] |= VOXELFLAG_CHECKED;
|
|
||||||
// If block was dropped from surface, increase pressure
|
|
||||||
if(i == 0 && m_data[m_area.index(removed_pos)].pressure == 1)
|
|
||||||
{
|
|
||||||
m_data[m_area.index(removed_pos)].pressure = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if(debugprint)
|
|
||||||
{
|
|
||||||
dstream<<"VoxelManipulator::flowWater(): Moved bubble:"<<std::endl;
|
|
||||||
print(dstream, VOXELPRINT_WATERPRESSURE);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Update pressure
|
|
||||||
VoxelArea a;
|
|
||||||
a.addPoint(p - v3s16(1,1,1));
|
|
||||||
a.addPoint(p + v3s16(1,1,1));
|
|
||||||
a.addPoint(removed_pos - v3s16(1,1,1));
|
|
||||||
a.addPoint(removed_pos + v3s16(1,1,1));
|
|
||||||
updateAreaWaterPressure(a, active_nodes);
|
|
||||||
|
|
||||||
/*if(debugprint)
|
|
||||||
{
|
|
||||||
dstream<<"VoxelManipulator::flowWater(): Pressure updated:"<<std::endl;
|
|
||||||
print(dstream, VOXELPRINT_WATERPRESSURE);
|
|
||||||
//std::cin.get();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if(debugprint)
|
|
||||||
{
|
|
||||||
dstream<<"VoxelManipulator::flowWater(): step done:"<<std::endl;
|
|
||||||
print(dstream, VOXELPRINT_WATERPRESSURE);
|
|
||||||
//std::cin.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
}//timer1
|
|
||||||
|
|
||||||
// Flow water to the newly created empty position
|
|
||||||
flowWater(p, active_nodes, recursion_depth,
|
|
||||||
debugprint, counter, counterlimit);
|
|
||||||
|
|
||||||
find_again:
|
find_again:
|
||||||
// Try flowing water to empty positions around removed_pos.
|
// Try flowing water to empty positions around removed_pos.
|
||||||
// They are checked in reverse order compared to the previous loop.
|
// They are checked in reverse order compared to the previous loop.
|
||||||
|
Loading…
Reference in New Issue
Block a user