From 5b7de82a79e3f18affcffd686484a681d187942a Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Sun, 14 Oct 2012 17:06:21 +0000 Subject: Initial Floody fluid simulator. Can spread, cannot dry. git-svn-id: http://mc-server.googlecode.com/svn/trunk@963 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/Simulator/DelayedFluidSimulator.cpp | 92 ++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 source/Simulator/DelayedFluidSimulator.cpp (limited to 'source/Simulator/DelayedFluidSimulator.cpp') diff --git a/source/Simulator/DelayedFluidSimulator.cpp b/source/Simulator/DelayedFluidSimulator.cpp new file mode 100644 index 000000000..3ace286ed --- /dev/null +++ b/source/Simulator/DelayedFluidSimulator.cpp @@ -0,0 +1,92 @@ + +// DelayedFluidSimulator.cpp + +// Interfaces to the cDelayedFluidSimulator class representing a fluid simulator that has a configurable delay +// before simulating a block. Each tick it takes a consecutive delay "slot" and simulates only blocks in that slot. + +#include "Globals.h" + +#include "DelayedFluidSimulator.h" +#include "../World.h" + + + + + +cDelayedFluidSimulator::cDelayedFluidSimulator(cWorld * a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid, int a_TickDelay) : + super(a_World, a_Fluid, a_StationaryFluid), + m_TickDelay(a_TickDelay), + m_Slots(NULL), + m_CurrentSlotNum(a_TickDelay - 1) +{ + m_Slots = new CoordsArray[a_TickDelay]; +} + + + + + +cDelayedFluidSimulator::~cDelayedFluidSimulator() +{ + delete[] m_Slots; + m_Slots = NULL; +} + + + + + +void cDelayedFluidSimulator::AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ) +{ + if ((a_BlockY < 0) || (a_BlockY >= cChunkDef::Height)) + { + // Not inside the world (may happen when rclk with a full bucket - the client sends Y = -1) + return; + } + + BLOCKTYPE BlockType = m_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ); + if (BlockType != m_FluidBlock) + { + return; + } + + CoordsArray & Blocks = m_Slots[m_CurrentSlotNum]; + + // Check for duplicates: + for (CoordsArray::iterator itr = Blocks.begin(), end = Blocks.end(); itr != end; ++itr) + { + if ((itr->x == a_BlockX) && (itr->y == a_BlockY) && (itr->z == a_BlockZ)) + { + return; + } + } + + Blocks.push_back(Vector3i(a_BlockX, a_BlockY, a_BlockZ)); +} + + + + + +void cDelayedFluidSimulator::Simulate(float a_Dt) +{ + CoordsArray & Blocks = m_Slots[m_CurrentSlotNum]; + + // First move to the next slot, so that simulated blocks can write another batch of scheduled blocks: + m_CurrentSlotNum += 1; + if (m_CurrentSlotNum >= m_TickDelay) + { + m_CurrentSlotNum = 0; + } + + // Simulate the blocks in the scheduled slot: + for (CoordsArray::iterator itr = Blocks.begin(), end = Blocks.end(); itr != end; ++itr) + { + SimulateBlock(itr->x, itr->y, itr->z); + } + Blocks.clear(); +} + + + + -- cgit v1.2.3