From 2a0d1a059e556afaeb7f5b72205b26447e23286f Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 11 Dec 2010 18:11:03 +0200 Subject: commit before some radicallish changes to water behavior --- src/server.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) (limited to 'src/server.cpp') diff --git a/src/server.cpp b/src/server.cpp index f8248acb4..8bcfe5216 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "jmutexautolock.h" #include "main.h" #include "constants.h" +#include "voxel.h" void * ServerThread::Thread() { @@ -990,6 +991,76 @@ void Server::AsyncRunStep() /* Do background stuff */ + + /* + Flow water + */ + { + static float counter = 0.0; + counter += dtime; + if(counter >= 1.0) + { + + counter = 0.0; + + core::map modified_blocks; + + { + + JMutexAutoLock lock(m_env_mutex); + + MapVoxelManipulator v(&m_env.getMap()); + + /*try{ + v.flowWater(m_flow_active_nodes, 0, false, 20); + //v.flowWater(p_under, 0, true, 100); + } + catch(ProcessingLimitException &e) + { + dstream<<"Processing limit reached"< lighting_modified_blocks; + map.updateLighting(modified_blocks, lighting_modified_blocks); + + // Add blocks modified by lighting to modified_blocks + for(core::map::Iterator + i = lighting_modified_blocks.getIterator(); + i.atEnd() == false; i++) + { + MapBlock *block = i.getNode()->getValue(); + modified_blocks.insert(block->getPos(), block); + } + } + + /* + Set the modified blocks unsent for all the clients + */ + + JMutexAutoLock lock2(m_con_mutex); + + for(core::map::Iterator + i = m_clients.getIterator(); + i.atEnd() == false; i++) + { + RemoteClient *client = i.getNode()->getValue(); + + if(modified_blocks.size() > 0) + { + // Remove block from sent history + client->SetBlocksNotSent(modified_blocks); + } + } + + } + } // Periodically print some info { @@ -1458,6 +1529,31 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) (this takes some time so it is done after the quick stuff) */ m_env.getMap().removeNodeAndUpdate(p_under, modified_blocks); + + /* + Update water + */ + + // Update water pressure around modification + // This also adds it to m_flow_active_nodes if appropriate + + MapVoxelManipulator v(&m_env.getMap()); + + VoxelArea area(p_under-v3s16(1,1,1), p_under+v3s16(1,1,1)); + + try + { + v.updateAreaWaterPressure(area, m_flow_active_nodes); + } + catch(ProcessingLimitException &e) + { + dstream<<"Processing limit reached"<