summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-10-15 22:16:43 +0200
committermadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-10-15 22:16:43 +0200
commitf9dab57d8b4b98ec0f624212452c48769c8441d1 (patch)
treed62abda0578d60686466c04c15416646c2e6c643
parentFloody fluid sim: reads params from world.ini; water and lava react together into cobblestone / stone / obsidian (diff)
downloadcuberite-f9dab57d8b4b98ec0f624212452c48769c8441d1.tar
cuberite-f9dab57d8b4b98ec0f624212452c48769c8441d1.tar.gz
cuberite-f9dab57d8b4b98ec0f624212452c48769c8441d1.tar.bz2
cuberite-f9dab57d8b4b98ec0f624212452c48769c8441d1.tar.lz
cuberite-f9dab57d8b4b98ec0f624212452c48769c8441d1.tar.xz
cuberite-f9dab57d8b4b98ec0f624212452c48769c8441d1.tar.zst
cuberite-f9dab57d8b4b98ec0f624212452c48769c8441d1.zip
-rw-r--r--source/Chunk.cpp2
-rw-r--r--source/Simulator/DelayedFluidSimulator.cpp15
-rw-r--r--source/Simulator/DelayedFluidSimulator.h8
-rw-r--r--source/World.cpp9
4 files changed, 22 insertions, 12 deletions
diff --git a/source/Chunk.cpp b/source/Chunk.cpp
index fa9cb91d3..daeb24750 100644
--- a/source/Chunk.cpp
+++ b/source/Chunk.cpp
@@ -955,7 +955,7 @@ void cChunk::CheckNeighbors(int a_RelX, int a_RelY, int a_RelZ)
{
int BlockX = m_PosX * cChunkDef::Width + a_RelX;
int BlockZ = m_PosZ * cChunkDef::Width + a_RelZ;
- if (a_RelX < cChunkDef::Width)
+ if (a_RelX < cChunkDef::Width - 1)
{
m_ToTickBlocks.push_back(MakeIndexNoCheck(a_RelX + 1, a_RelY, a_RelZ));
}
diff --git a/source/Simulator/DelayedFluidSimulator.cpp b/source/Simulator/DelayedFluidSimulator.cpp
index 3ace286ed..317452c57 100644
--- a/source/Simulator/DelayedFluidSimulator.cpp
+++ b/source/Simulator/DelayedFluidSimulator.cpp
@@ -17,7 +17,7 @@ cDelayedFluidSimulator::cDelayedFluidSimulator(cWorld * a_World, BLOCKTYPE a_Flu
super(a_World, a_Fluid, a_StationaryFluid),
m_TickDelay(a_TickDelay),
m_Slots(NULL),
- m_CurrentSlotNum(a_TickDelay - 1)
+ m_CurrentSlotNum(0)
{
m_Slots = new CoordsArray[a_TickDelay];
}
@@ -70,21 +70,22 @@ void cDelayedFluidSimulator::AddBlock(int a_BlockX, int a_BlockY, int 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)
+ int SlotNum = m_CurrentSlotNum + 1;
+ if (SlotNum >= m_TickDelay)
{
- m_CurrentSlotNum = 0;
+ SlotNum = 0;
}
+ CoordsArray & Blocks = m_Slots[SlotNum];
+
// 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();
+
+ m_CurrentSlotNum = SlotNum;
}
diff --git a/source/Simulator/DelayedFluidSimulator.h b/source/Simulator/DelayedFluidSimulator.h
index b9c180580..51fe2a514 100644
--- a/source/Simulator/DelayedFluidSimulator.h
+++ b/source/Simulator/DelayedFluidSimulator.h
@@ -34,7 +34,13 @@ protected:
int m_TickDelay; // Count of the m_Slots array
CoordsArray * m_Slots; // Slots, one for each delay tick
int m_CurrentSlotNum; // Index into m_Slots[] where to insert new blocks
-
+
+ /*
+ Slots:
+ | 0 | 1 | ... | m_CurrentSlotNum | m_CurrentSlotNum + 1 | ... | m_TickDelay - 1 |
+ adding blocks here ^ | ^ simulating here
+ */
+
/// Called from Simulate() to simulate each block in one slot of blocks. Descendants override this method to provide custom simulation.
virtual void SimulateBlock(int a_BlockX, int a_BlockY, int a_BlockZ) = 0;
} ;
diff --git a/source/World.cpp b/source/World.cpp
index a8ec8b75d..9b8f3eccb 100644
--- a/source/World.cpp
+++ b/source/World.cpp
@@ -287,15 +287,14 @@ cWorld::cWorld( const AString & a_WorldName )
m_BlockTickQueueCopy.reserve(1000);
// Simulators:
+ m_SimulatorManager = new cSimulatorManager();
m_WaterSimulator = InitializeFluidSimulator(IniFile, "Water", E_BLOCK_WATER, E_BLOCK_STATIONARY_WATER);
m_LavaSimulator = InitializeFluidSimulator(IniFile, "Lava", E_BLOCK_LAVA, E_BLOCK_STATIONARY_LAVA);
m_SandSimulator = new cSandSimulator(this);
m_FireSimulator = new cFireSimulator(this);
m_RedstoneSimulator = new cRedstoneSimulator(this);
- m_SimulatorManager = new cSimulatorManager();
- m_SimulatorManager->RegisterSimulator(m_WaterSimulator, 6);
- m_SimulatorManager->RegisterSimulator(m_LavaSimulator, 12);
+ // Water and Lava simulators get registered in InitializeFluidSimulator()
m_SimulatorManager->RegisterSimulator(m_SandSimulator, 1);
m_SimulatorManager->RegisterSimulator(m_FireSimulator, 10);
m_SimulatorManager->RegisterSimulator(m_RedstoneSimulator, 1);
@@ -2172,6 +2171,7 @@ cFluidSimulator * cWorld::InitializeFluidSimulator(cIniFile & a_IniFile, const c
cFluidSimulator * res = NULL;
bool IsWater = (strcmp(a_FluidName, "Water") == 0); // Used for defaults
+ int Rate = 1;
if (NoCaseCompare(SimulatorName, "floody") == 0)
{
int DefaultFalloff = IsWater ? 1 : 2;
@@ -2192,8 +2192,11 @@ cFluidSimulator * cWorld::InitializeFluidSimulator(cIniFile & a_IniFile, const c
int Falloff = a_IniFile.GetValueSetI(SimulatorSectionName, "Falloff", DefaultFalloff);
int MaxHeight = a_IniFile.GetValueSetI(SimulatorSectionName, "MaxHeight", DefaultMaxHeight);
res = new cClassicFluidSimulator(this, a_SimulateBlock, a_StationaryBlock, MaxHeight, Falloff);
+ Rate = IsWater ? 6 : 12;
}
+ m_SimulatorManager->RegisterSimulator(res, Rate);
+
return res;
}