1
0

Preparation for multiple fluid simulators.

Moved all simulators into a subfolder.
Replaced cWaterSimulator and cLavaSimulator with a generic cFluidSimulator.
Moved original fluid simulation into cClassicFluidSimulator.
Fluid simulator parameters (MaxHeight, Falloff) are read from the world.ini file (can have nether-like lava with lower falloff)

git-svn-id: http://mc-server.googlecode.com/svn/trunk@956 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com
2012-10-13 09:53:28 +00:00
parent 7bca7f3cb9
commit f7da7c2536
28 changed files with 356 additions and 884 deletions

View File

@@ -12,12 +12,14 @@
#include "Root.h"
#include "../iniFile/iniFile.h"
#include "ChunkMap.h"
#include "SimulatorManager.h"
#include "WaterSimulator.h"
#include "LavaSimulator.h"
#include "FireSimulator.h"
#include "SandSimulator.h"
#include "RedstoneSimulator.h"
// Simulators:
#include "Simulator/SimulatorManager.h"
#include "Simulator/ClassicFluidSimulator.h"
#include "Simulator/FluidSimulator.h"
#include "Simulator/FireSimulator.h"
#include "Simulator/SandSimulator.h"
#include "Simulator/RedstoneSimulator.h"
// Mobs:
#include "Mobs/Chicken.h"
@@ -288,11 +290,11 @@ cWorld::cWorld( const AString & a_WorldName )
m_BlockTickQueue.reserve(1000);
m_BlockTickQueueCopy.reserve(1000);
//Simulators:
m_WaterSimulator = new cWaterSimulator( this );
m_LavaSimulator = new cLavaSimulator( this );
m_SandSimulator = new cSandSimulator(this);
m_FireSimulator = new cFireSimulator(this);
// Simulators:
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();
@@ -2153,3 +2155,44 @@ bool cWorld::IsBlockDirectlyWatered(int a_BlockX, int a_BlockY, int a_BlockZ)
cFluidSimulator * cWorld::InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock)
{
AString SimulatorNameKey;
Printf(SimulatorNameKey, "%sSimulator", a_FluidName);
AString SimulatorSectionName;
Printf(SimulatorSectionName, "%sSimulator", a_FluidName);
AString SimulatorName = a_IniFile.GetValue("Physics", SimulatorNameKey, "");
if (SimulatorName.empty())
{
LOGWARNING("%s [Physics]:%s not present or empty, using the default of \"Classic\".", GetIniFileName().c_str(), SimulatorNameKey.c_str());
SimulatorName = "Classic";
}
cFluidSimulator * res = NULL;
/*
// TODO: other fluid simulators
if (NoCaseCompare(SimulatorName, "floody") == 0)
{
// TODO: Floody simulator params
res = new cFloodyFluidSimulator(this, a_SimulateBlock, a_StationaryBlock);
}
else
*/
{
if (NoCaseCompare(SimulatorName, "classic") != 0)
{
// The simulator name doesn't match anything we have, issue a warning:
LOGWARNING("%s [Physics]:%s specifies an unknown simulator, using the default \"Classic\".", GetIniFileName().c_str(), SimulatorNameKey.c_str());
}
int DefaultFalloff = (strcmp(a_FluidName, "Water") == 0) ? 1 : 2;
int DefaultMaxHeight = (strcmp(a_FluidName, "Water") == 0) ? 7 : 6;
int Falloff = a_IniFile.GetValueI(SimulatorSectionName, "Falloff", DefaultFalloff);
int MaxHeight = a_IniFile.GetValueI(SimulatorSectionName, "MaxHeight", DefaultMaxHeight);
res = new cClassicFluidSimulator(this, a_SimulateBlock, a_StationaryBlock, MaxHeight, Falloff);
}
return res;
}