From 176664810b43a839d92418b2558359e61b700935 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Fri, 7 Feb 2014 22:13:55 +0100 Subject: [PATCH] Implemented an easy way of adding new redstone simulators. Also added a "noop" redstone simulator that does the same as the fluid version. --- src/Simulator/NoopRedstoneSimulator.h | 40 +++++++++++++++++++++++++++ src/Simulator/RedstoneManager.cpp | 19 +++++++++++++ src/Simulator/RedstoneManager.h | 17 ++++++++++++ src/Simulator/RedstoneSimulator.h | 6 ++-- src/World.cpp | 40 +++++++++++++++++++++++++-- src/World.h | 9 ++++-- 6 files changed, 122 insertions(+), 9 deletions(-) create mode 100644 src/Simulator/NoopRedstoneSimulator.h create mode 100644 src/Simulator/RedstoneManager.cpp create mode 100644 src/Simulator/RedstoneManager.h diff --git a/src/Simulator/NoopRedstoneSimulator.h b/src/Simulator/NoopRedstoneSimulator.h new file mode 100644 index 000000000..4dd473c64 --- /dev/null +++ b/src/Simulator/NoopRedstoneSimulator.h @@ -0,0 +1,40 @@ + +#pragma once + +#include "RedstoneManager.h" + + + + + +class cRedstoneNoopSimulator : + public cRedstoneManager +{ + typedef cRedstoneManager super; +public: + + cRedstoneNoopSimulator(cWorld & a_World) : + super(a_World) + { + } + + //~cRedstoneNoopSimulator(); + + virtual void Simulate(float a_Dt) override { UNUSED(a_Dt);} // not used + virtual void SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override + { + UNUSED(a_Dt); + UNUSED(a_ChunkX); + UNUSED(a_ChunkZ); + UNUSED(a_Chunk); + } + virtual bool IsAllowedBlock( BLOCKTYPE a_BlockType ) override { return false; } + virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override + { + UNUSED(a_BlockX); + UNUSED(a_BlockY); + UNUSED(a_BlockZ); + UNUSED(a_Chunk); + } + +} ; \ No newline at end of file diff --git a/src/Simulator/RedstoneManager.cpp b/src/Simulator/RedstoneManager.cpp new file mode 100644 index 000000000..58fb8fa4c --- /dev/null +++ b/src/Simulator/RedstoneManager.cpp @@ -0,0 +1,19 @@ + +#include "Globals.h" + +#include "RedstoneManager.h" +#include "../World.h" + + + + + +cRedstoneManager::cRedstoneManager(cWorld & a_World) : + super(a_World) +{ +} + + + + + diff --git a/src/Simulator/RedstoneManager.h b/src/Simulator/RedstoneManager.h new file mode 100644 index 000000000..846b7d8ab --- /dev/null +++ b/src/Simulator/RedstoneManager.h @@ -0,0 +1,17 @@ + +#pragma once + +#include "Simulator.h" + + + + +class cRedstoneManager : + public cSimulator +{ + typedef cSimulator super; + +public: + cRedstoneManager(cWorld & a_World); + +} ; \ No newline at end of file diff --git a/src/Simulator/RedstoneSimulator.h b/src/Simulator/RedstoneSimulator.h index c505b2a0f..c5ab1b9bb 100644 --- a/src/Simulator/RedstoneSimulator.h +++ b/src/Simulator/RedstoneSimulator.h @@ -1,7 +1,7 @@ #pragma once -#include "Simulator.h" +#include "RedstoneManager.h" /// Per-chunk data for the simulator, specified individual chunks to simulate; 'Data' is not used typedef cCoordWithBlockAndBoolVector cRedstoneSimulatorChunkData; @@ -11,9 +11,9 @@ typedef cCoordWithBlockAndBoolVector cRedstoneSimulatorChunkData; class cRedstoneSimulator : - public cSimulator + public cRedstoneManager { - typedef cSimulator super; + typedef cRedstoneManager super; public: cRedstoneSimulator(cWorld & a_World); diff --git a/src/World.cpp b/src/World.cpp index 5e08fd599..1343d5ad6 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -29,6 +29,7 @@ #include "Simulator/FluidSimulator.h" #include "Simulator/FireSimulator.h" #include "Simulator/NoopFluidSimulator.h" +#include "Simulator/NoopRedstoneSimulator.h" #include "Simulator/SandSimulator.h" #include "Simulator/RedstoneSimulator.h" #include "Simulator/VaporizeFluidSimulator.h" @@ -596,12 +597,11 @@ void cWorld::Start(void) m_LavaSimulator = InitializeFluidSimulator(IniFile, "Lava", E_BLOCK_LAVA, E_BLOCK_STATIONARY_LAVA); m_SandSimulator = new cSandSimulator(*this, IniFile); m_FireSimulator = new cFireSimulator(*this, IniFile); - m_RedstoneSimulator = new cRedstoneSimulator(*this); + m_RedstoneSimulator = InitializeRedstoneSimulator(IniFile); - // Water and Lava simulators get registered in InitializeFluidSimulator() + // Water, Lava and Redstone simulators get registered in InitializeFluidSimulator() m_SimulatorManager->RegisterSimulator(m_SandSimulator, 1); m_SimulatorManager->RegisterSimulator(m_FireSimulator, 1); - m_SimulatorManager->RegisterSimulator(m_RedstoneSimulator, 1); m_Lighting.Start(this); m_Storage.Start(this, m_StorageSchema, m_StorageCompressionFactor ); @@ -2871,6 +2871,40 @@ void cWorld::TabCompleteUserName(const AString & a_Text, AStringVector & a_Resul +cRedstoneManager * cWorld::InitializeRedstoneSimulator(cIniFile & a_IniFile) +{ + AString SimulatorName = a_IniFile.GetValueSet("Physics", "RedstoneSimulator", ""); + + if (SimulatorName.empty()) + { + LOGWARNING("[Physics] RedstoneSimulator not present or empty in %s, using the default of \"Floody\".", GetIniFileName().c_str()); + SimulatorName = "redstone"; + } + + cRedstoneManager * res = NULL; + + if ( + (NoCaseCompare(SimulatorName, "redstone") == 0) + ) + { + res = new cRedstoneSimulator(*this); + } + else if ( + (NoCaseCompare(SimulatorName, "noop") == 0) + ) + { + res = new cRedstoneNoopSimulator(*this); + } + + m_SimulatorManager->RegisterSimulator(res, 1); + + return res; +} + + + + + cFluidSimulator * cWorld::InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock) { AString SimulatorNameKey; diff --git a/src/World.h b/src/World.h index 8cf860ff5..bc4e411cc 100644 --- a/src/World.h +++ b/src/World.h @@ -33,7 +33,7 @@ class cFireSimulator; class cFluidSimulator; class cSandSimulator; -class cRedstoneSimulator; +class cRedstoneManager; class cItem; class cPlayer; class cClientHandle; @@ -432,7 +432,7 @@ public: inline cFluidSimulator * GetWaterSimulator(void) { return m_WaterSimulator; } inline cFluidSimulator * GetLavaSimulator (void) { return m_LavaSimulator; } - inline cRedstoneSimulator * GetRedstoneSimulator(void) { return m_RedstoneSimulator; } + inline cRedstoneManager * GetRedstoneSimulator(void) { return m_RedstoneSimulator; } /** Calls the callback for each block entity in the specified chunk; returns true if all block entities processed, false if the callback aborted by returning true */ bool ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback & a_Callback); // Exported in ManualBindings.cpp @@ -759,7 +759,7 @@ private: cFluidSimulator * m_WaterSimulator; cFluidSimulator * m_LavaSimulator; cFireSimulator * m_FireSimulator; - cRedstoneSimulator * m_RedstoneSimulator; + cRedstoneManager * m_RedstoneSimulator; cCriticalSection m_CSPlayers; cPlayerList m_Players; @@ -858,6 +858,9 @@ private: /** Creates a new fluid simulator, loads its settings from the inifile (a_FluidName section) */ cFluidSimulator * InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock); + + /** Creates a new redstone simulator.*/ + cRedstoneManager * InitializeRedstoneSimulator(cIniFile & a_IniFile); }; // tolua_export