- v3s16(0,0,-1), // front
- v3s16(1,0,0), // right
- v3s16(-1,0,0), // left
- v3s16(0,-1,0), // bottom
- };
-
- // Load neighboring nodes
- emerge(VoxelArea(p - v3s16(1,1,1), p + v3s16(1,1,1)), 1);
-
- s32 i;
- for(i=0; i<6; i++)
- {
- v3s16 p2 = p + dirs[i];
- u8 f = m_flags[m_area.index(p2)];
- // Ignore inexistent or checked nodes
- if(f & (VOXELFLAG_INEXISTENT | VOXELFLAG_CHECKED2))
- continue;
- MapNode &n = m_data[m_area.index(p2)];
- // Ignore non-liquid nodes
- if(content_liquid(n.d) == false)
- continue;
-
- int pr;
-
- // If at ocean surface
- if(n.pressure == 1 && n.d == CONTENT_OCEAN)
- //if(n.pressure == 1) // Causes glitches but is fast
- {
- pr = 1;
- }
- // Otherwise recurse more
- else
- {
- pr = getWaterPressure(p2, highest_y, recur_count);
- if(pr == -1)
- continue;
- }
-
- // If block is at top, pressure here is one higher
- if(i == 0)
- {
- if(pr < 255)
- pr++;
- }
- // If block is at bottom, pressure here is one lower
- else if(i == 5)
- {
- if(pr > 1)
- pr--;
- }
-
- // Node is on the pressure route
- m_flags[m_area.index(p)] |= VOXELFLAG_CHECKED4;
-
- // Got pressure
- return pr;
- }
-
- // Nothing useful found
- return -1;
-}
-
-void VoxelManipulator::spreadWaterPressure(v3s16 p, int pr,
- VoxelArea request_area,
- core::map<v3s16, u8> &active_nodes,
- int recur_count)
-{
- //if(recur_count > 10000)
- /*throw ProcessingLimitException
- ("spreadWaterPressure recur_count limit reached");*/
- if(recur_count > 10)
- return;
- recur_count++;
-
- /*dstream<<"spreadWaterPressure: p=("
- <<p.X<<","<<p.Y<<","<<p.Z<<")"
- <<", oldpr="<<(int)m_data[m_area.index(p)].pressure
- <<", pr="<<pr
- <<", recur_count="<<recur_count
- <<", request_area=";
- request_area.print(dstream);
- dstream<<std::endl;*/
-
- m_flags[m_area.index(p)] |= VOXELFLAG_CHECKED3;
- m_data[m_area.index(p)].pressure = pr;
-
- v3s16 dirs[6] = {