Possibly decoupled IncrementalRedstoneSimulator from the rest of the server
THis wil hopefully allow for unit testing
This commit is contained in:
parent
c8b41e9b2b
commit
0b044e1c83
@ -10,7 +10,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "BlockEntity.h"
|
#include "BlockEntity.h"
|
||||||
|
#include "RedstonePoweredEntity.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -27,7 +27,8 @@ namespace Json
|
|||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
class cCommandBlockEntity :
|
class cCommandBlockEntity :
|
||||||
public cBlockEntity
|
public cBlockEntity,
|
||||||
|
public cRedstonePoweredEntity
|
||||||
{
|
{
|
||||||
typedef cBlockEntity super;
|
typedef cBlockEntity super;
|
||||||
|
|
||||||
@ -52,7 +53,7 @@ public:
|
|||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate
|
/// Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate
|
||||||
void SetRedstonePower(bool a_IsPowered);
|
virtual void SetRedstonePower(bool a_IsPowered) override;
|
||||||
|
|
||||||
/// Sets the command block to execute a command in the next tick
|
/// Sets the command block to execute a command in the next tick
|
||||||
void Activate(void);
|
void Activate(void);
|
||||||
|
@ -6,7 +6,7 @@ class cRedstonePoweredEntity
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual ~cRedstonePoweredEntity() {};
|
virtual ~cRedstonePoweredEntity() {}
|
||||||
|
|
||||||
/// Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate
|
/// Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate
|
||||||
virtual void SetRedstonePower(bool a_IsPowered) = 0;
|
virtual void SetRedstonePower(bool a_IsPowered) = 0;
|
||||||
|
54
src/Blocks/GetHandlerCompileTimeTemplate.h
Normal file
54
src/Blocks/GetHandlerCompileTimeTemplate.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class cBlockTorchHandler;
|
||||||
|
class cBlockLeverHandler;
|
||||||
|
class cBlockButtonHandler;
|
||||||
|
class cBlockTripwireHookHandler;
|
||||||
|
class cBlockDoorHandler;
|
||||||
|
class cBlockPistonHandler;
|
||||||
|
|
||||||
|
template<BLOCKTYPE T>
|
||||||
|
class GetHandlerCompileTime;
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class GetHandlerCompileTime<E_BLOCK_TORCH>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef cBlockTorchHandler type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class GetHandlerCompileTime<E_BLOCK_LEVER>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef cBlockLeverHandler type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class GetHandlerCompileTime<E_BLOCK_STONE_BUTTON>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef cBlockButtonHandler type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class GetHandlerCompileTime<E_BLOCK_TRIPWIRE_HOOK>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef cBlockTripwireHookHandler type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class GetHandlerCompileTime<E_BLOCK_WOODEN_DOOR>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef cBlockDoorHandler type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class GetHandlerCompileTime<E_BLOCK_PISTON>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef cBlockPistonHandler type;
|
||||||
|
};
|
@ -1366,9 +1366,9 @@ void cChunk::CreateBlockEntities(void)
|
|||||||
|
|
||||||
void cChunk::WakeUpSimulators(void)
|
void cChunk::WakeUpSimulators(void)
|
||||||
{
|
{
|
||||||
cSimulator * WaterSimulator = m_World->GetWaterSimulator();
|
cSimulator<cChunk, cWorld> * WaterSimulator = m_World->GetWaterSimulator();
|
||||||
cSimulator * LavaSimulator = m_World->GetLavaSimulator();
|
cSimulator<cChunk, cWorld> * LavaSimulator = m_World->GetLavaSimulator();
|
||||||
cSimulator * RedstoneSimulator = m_World->GetRedstoneSimulator();
|
cSimulator<cChunk, cWorld> * RedstoneSimulator = m_World->GetRedstoneSimulator();
|
||||||
int BaseX = m_PosX * cChunkDef::Width;
|
int BaseX = m_PosX * cChunkDef::Width;
|
||||||
int BaseZ = m_PosZ * cChunkDef::Width;
|
int BaseZ = m_PosZ * cChunkDef::Width;
|
||||||
for (int x = 0; x < Width; x++)
|
for (int x = 0; x < Width; x++)
|
||||||
|
18
src/Chunk.h
18
src/Chunk.h
@ -9,6 +9,8 @@
|
|||||||
#include "Simulator/SandSimulator.h"
|
#include "Simulator/SandSimulator.h"
|
||||||
#include "Simulator/IncrementalRedstoneSimulator.h"
|
#include "Simulator/IncrementalRedstoneSimulator.h"
|
||||||
|
|
||||||
|
#include "Blocks/GetHandlerCompileTimeTemplate.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -416,10 +418,10 @@ public:
|
|||||||
|
|
||||||
cRedstoneSimulatorChunkData * GetRedstoneSimulatorData(void) { return &m_RedstoneSimulatorData; }
|
cRedstoneSimulatorChunkData * GetRedstoneSimulatorData(void) { return &m_RedstoneSimulatorData; }
|
||||||
cRedstoneSimulatorChunkData * GetRedstoneSimulatorQueuedData(void) { return &m_RedstoneSimulatorQueuedData; }
|
cRedstoneSimulatorChunkData * GetRedstoneSimulatorQueuedData(void) { return &m_RedstoneSimulatorQueuedData; }
|
||||||
cIncrementalRedstoneSimulator::PoweredBlocksList * GetRedstoneSimulatorPoweredBlocksList(void) { return &m_RedstoneSimulatorPoweredBlocksList; }
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::PoweredBlocksList * GetRedstoneSimulatorPoweredBlocksList(void) { return &m_RedstoneSimulatorPoweredBlocksList; }
|
||||||
cIncrementalRedstoneSimulator::LinkedBlocksList * GetRedstoneSimulatorLinkedBlocksList(void) { return &m_RedstoneSimulatorLinkedBlocksList; }
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::LinkedBlocksList * GetRedstoneSimulatorLinkedBlocksList(void) { return &m_RedstoneSimulatorLinkedBlocksList; }
|
||||||
cIncrementalRedstoneSimulator::SimulatedPlayerToggleableList * GetRedstoneSimulatorSimulatedPlayerToggleableList(void) { return &m_RedstoneSimulatorSimulatedPlayerToggleableList; }
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::SimulatedPlayerToggleableList * GetRedstoneSimulatorSimulatedPlayerToggleableList(void) { return &m_RedstoneSimulatorSimulatedPlayerToggleableList; }
|
||||||
cIncrementalRedstoneSimulator::RepeatersDelayList * GetRedstoneSimulatorRepeatersDelayList(void) { return &m_RedstoneSimulatorRepeatersDelayList; }
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::RepeatersDelayList * GetRedstoneSimulatorRepeatersDelayList(void) { return &m_RedstoneSimulatorRepeatersDelayList; }
|
||||||
bool IsRedstoneDirty(void) const { return m_IsRedstoneDirty; }
|
bool IsRedstoneDirty(void) const { return m_IsRedstoneDirty; }
|
||||||
void SetIsRedstoneDirty(bool a_Flag) { m_IsRedstoneDirty = a_Flag; }
|
void SetIsRedstoneDirty(bool a_Flag) { m_IsRedstoneDirty = a_Flag; }
|
||||||
|
|
||||||
@ -506,10 +508,10 @@ private:
|
|||||||
|
|
||||||
cRedstoneSimulatorChunkData m_RedstoneSimulatorData;
|
cRedstoneSimulatorChunkData m_RedstoneSimulatorData;
|
||||||
cRedstoneSimulatorChunkData m_RedstoneSimulatorQueuedData;
|
cRedstoneSimulatorChunkData m_RedstoneSimulatorQueuedData;
|
||||||
cIncrementalRedstoneSimulator::PoweredBlocksList m_RedstoneSimulatorPoweredBlocksList;
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::PoweredBlocksList m_RedstoneSimulatorPoweredBlocksList;
|
||||||
cIncrementalRedstoneSimulator::LinkedBlocksList m_RedstoneSimulatorLinkedBlocksList;
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::LinkedBlocksList m_RedstoneSimulatorLinkedBlocksList;
|
||||||
cIncrementalRedstoneSimulator::SimulatedPlayerToggleableList m_RedstoneSimulatorSimulatedPlayerToggleableList;
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::SimulatedPlayerToggleableList m_RedstoneSimulatorSimulatedPlayerToggleableList;
|
||||||
cIncrementalRedstoneSimulator::RepeatersDelayList m_RedstoneSimulatorRepeatersDelayList;
|
cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>::RepeatersDelayList m_RedstoneSimulatorRepeatersDelayList;
|
||||||
|
|
||||||
/** Indicates if simulate-once blocks should be updated by the redstone simulator */
|
/** Indicates if simulate-once blocks should be updated by the redstone simulator */
|
||||||
bool m_IsRedstoneDirty;
|
bool m_IsRedstoneDirty;
|
||||||
|
@ -10,7 +10,6 @@ SET (SRCS
|
|||||||
FloodyFluidSimulator.cpp
|
FloodyFluidSimulator.cpp
|
||||||
FluidSimulator.cpp
|
FluidSimulator.cpp
|
||||||
IncrementalRedstoneSimulator.cpp
|
IncrementalRedstoneSimulator.cpp
|
||||||
RedstoneSimulator.cpp
|
|
||||||
SandSimulator.cpp
|
SandSimulator.cpp
|
||||||
Simulator.cpp
|
Simulator.cpp
|
||||||
SimulatorManager.cpp
|
SimulatorManager.cpp
|
||||||
|
@ -16,7 +16,7 @@ it progresses to the next step (blockmeta++). This value is updated if a neighbo
|
|||||||
The simulator reads its parameters from the ini file given to the constructor.
|
The simulator reads its parameters from the ini file given to the constructor.
|
||||||
*/
|
*/
|
||||||
class cFireSimulator :
|
class cFireSimulator :
|
||||||
public cSimulator
|
public cSimulator<cChunk, cWorld>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cFireSimulator(cWorld & a_World, cIniFile & a_IniFile);
|
cFireSimulator(cWorld & a_World, cIniFile & a_IniFile);
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
#include "Simulator.h"
|
#include "Simulator.h"
|
||||||
|
|
||||||
|
|
||||||
|
class cChunk;
|
||||||
|
class cWorld;
|
||||||
|
|
||||||
|
|
||||||
enum Direction
|
enum Direction
|
||||||
@ -36,9 +37,9 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
class cFluidSimulator :
|
class cFluidSimulator :
|
||||||
public cSimulator
|
public cSimulator<cChunk, cWorld>
|
||||||
{
|
{
|
||||||
typedef cSimulator super;
|
typedef cSimulator<cChunk, cWorld> super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid);
|
cFluidSimulator(cWorld & a_World, BLOCKTYPE a_Fluid, BLOCKTYPE a_StationaryFluid);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -6,23 +6,25 @@
|
|||||||
/// Per-chunk data for the simulator, specified individual chunks to simulate
|
/// Per-chunk data for the simulator, specified individual chunks to simulate
|
||||||
typedef cCoordWithBlockAndBoolVector cRedstoneSimulatorChunkData;
|
typedef cCoordWithBlockAndBoolVector cRedstoneSimulatorChunkData;
|
||||||
|
|
||||||
|
class cRedstonePoweredEntity;
|
||||||
|
|
||||||
|
typedef cItemCallback<cRedstonePoweredEntity> cRedstonePoweredCallback;
|
||||||
|
|
||||||
|
|
||||||
|
template<class ChunkType, class WorldType, template <BLOCKTYPE block> class GetHandlerCompileTime, class ChestType>
|
||||||
|
|
||||||
class cIncrementalRedstoneSimulator :
|
class cIncrementalRedstoneSimulator :
|
||||||
public cRedstoneSimulator
|
public cRedstoneSimulator<ChunkType, WorldType>
|
||||||
{
|
{
|
||||||
typedef cRedstoneSimulator super;
|
typedef cRedstoneSimulator<ChunkType, WorldType> super;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
cIncrementalRedstoneSimulator(cWorld & a_World);
|
cIncrementalRedstoneSimulator(WorldType & a_World);
|
||||||
~cIncrementalRedstoneSimulator();
|
~cIncrementalRedstoneSimulator();
|
||||||
|
|
||||||
virtual void Simulate(float a_Dt) override { UNUSED(a_Dt);} // not used
|
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;
|
virtual void SimulateChunk(float a_Dt, int a_ChunkX, int a_ChunkZ, ChunkType * a_Chunk) override;
|
||||||
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) override { return IsRedstone(a_BlockType); }
|
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) override { return IsRedstone(a_BlockType); }
|
||||||
virtual void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override;
|
virtual void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, ChunkType * a_Chunk) override;
|
||||||
|
|
||||||
enum eRedstoneDirection
|
enum eRedstoneDirection
|
||||||
{
|
{
|
||||||
@ -82,9 +84,9 @@ private:
|
|||||||
SimulatedPlayerToggleableList * m_SimulatedPlayerToggleableBlocks;
|
SimulatedPlayerToggleableList * m_SimulatedPlayerToggleableBlocks;
|
||||||
RepeatersDelayList * m_RepeatersDelayList;
|
RepeatersDelayList * m_RepeatersDelayList;
|
||||||
|
|
||||||
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override { RedstoneAddBlock(a_BlockX, a_BlockY, a_BlockZ, a_Chunk); }
|
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, ChunkType * a_Chunk) override { RedstoneAddBlock(a_BlockX, a_BlockY, a_BlockZ, a_Chunk); }
|
||||||
void RedstoneAddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk, cChunk * a_OtherChunk = NULL);
|
void RedstoneAddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, ChunkType * a_Chunk, ChunkType * a_OtherChunk = NULL);
|
||||||
cChunk * m_Chunk;
|
ChunkType * m_Chunk;
|
||||||
|
|
||||||
// We want a_MyState for devices needing a full FastSetBlock (as opposed to meta) because with our simulation model, we cannot keep setting the block if it is already set correctly
|
// We want a_MyState for devices needing a full FastSetBlock (as opposed to meta) because with our simulation model, we cannot keep setting the block if it is already set correctly
|
||||||
// In addition to being non-performant, it would stop the player from actually breaking said device
|
// In addition to being non-performant, it would stop the player from actually breaking said device
|
||||||
@ -159,12 +161,12 @@ private:
|
|||||||
/** Removes a block from the Powered and LinkedPowered lists
|
/** Removes a block from the Powered and LinkedPowered lists
|
||||||
Used for variable sources such as tripwire hooks, daylight sensors, and trapped chests
|
Used for variable sources such as tripwire hooks, daylight sensors, and trapped chests
|
||||||
*/
|
*/
|
||||||
void SetSourceUnpowered(int a_RelSourceX, int a_RelSourceY, int a_RelSourceZ, cChunk * a_Chunk, bool a_IsFirstCall = true);
|
void SetSourceUnpowered(int a_RelSourceX, int a_RelSourceY, int a_RelSourceZ, ChunkType * a_Chunk, bool a_IsFirstCall = true);
|
||||||
|
|
||||||
/** Returns if a coordinate is powered or linked powered */
|
/** Returns if a coordinate is powered or linked powered */
|
||||||
bool AreCoordsPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ) { return AreCoordsDirectlyPowered(a_RelBlockX, a_RelBlockY, a_RelBlockZ, m_Chunk) || AreCoordsLinkedPowered(a_RelBlockX, a_RelBlockY, a_RelBlockZ); }
|
bool AreCoordsPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ) { return AreCoordsDirectlyPowered(a_RelBlockX, a_RelBlockY, a_RelBlockZ, m_Chunk) || AreCoordsLinkedPowered(a_RelBlockX, a_RelBlockY, a_RelBlockZ); }
|
||||||
/** Returns if a coordinate is in the directly powered blocks list */
|
/** Returns if a coordinate is in the directly powered blocks list */
|
||||||
bool AreCoordsDirectlyPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, cChunk * a_Chunk);
|
bool AreCoordsDirectlyPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ, ChunkType * a_Chunk);
|
||||||
/** Returns if a coordinate is in the indirectly powered blocks list */
|
/** Returns if a coordinate is in the indirectly powered blocks list */
|
||||||
bool AreCoordsLinkedPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
bool AreCoordsLinkedPowered(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ);
|
||||||
/** Returns if a coordinate was marked as simulated (for blocks toggleable by players) */
|
/** Returns if a coordinate was marked as simulated (for blocks toggleable by players) */
|
||||||
@ -312,5 +314,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SELF_TEST
|
||||||
|
#include "IncrementalRedstoneSimulator.inc"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
2208
src/Simulator/IncrementalRedstoneSimulator.inc
Normal file
2208
src/Simulator/IncrementalRedstoneSimulator.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -8,9 +8,9 @@
|
|||||||
|
|
||||||
|
|
||||||
class cRedstoneNoopSimulator :
|
class cRedstoneNoopSimulator :
|
||||||
public cRedstoneSimulator
|
public cRedstoneSimulator<cChunk, cWorld>
|
||||||
{
|
{
|
||||||
typedef cRedstoneSimulator super;
|
typedef cRedstoneSimulator<cChunk, cWorld> super;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
cRedstoneNoopSimulator(cWorld & a_World) :
|
cRedstoneNoopSimulator(cWorld & a_World) :
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
|
|
||||||
#include "Globals.h"
|
|
||||||
|
|
||||||
#include "RedstoneSimulator.h"
|
|
||||||
#include "../World.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cRedstoneSimulator::cRedstoneSimulator(cWorld & a_World) :
|
|
||||||
super(a_World)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -5,13 +5,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class ChunkType, class WorldType>
|
||||||
class cRedstoneSimulator :
|
class cRedstoneSimulator :
|
||||||
public cSimulator
|
public cSimulator<ChunkType, WorldType>
|
||||||
{
|
{
|
||||||
typedef cSimulator super;
|
typedef cSimulator<ChunkType, WorldType> super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cRedstoneSimulator(cWorld & a_World);
|
cRedstoneSimulator(WorldType & a_World) :
|
||||||
|
super(a_World)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
} ;
|
} ;
|
||||||
|
@ -3,13 +3,15 @@
|
|||||||
|
|
||||||
#include "Simulator.h"
|
#include "Simulator.h"
|
||||||
|
|
||||||
|
/// Per-chunk data for the simulator, specified individual chunks to simulate; Data is not used
|
||||||
|
typedef cCoordWithIntList cSandSimulatorChunkData;
|
||||||
|
|
||||||
|
#include "Chunk.h"
|
||||||
|
|
||||||
|
|
||||||
/// Despite the class name, this simulator takes care of all blocks that fall when suspended in the air.
|
/// Despite the class name, this simulator takes care of all blocks that fall when suspended in the air.
|
||||||
class cSandSimulator :
|
class cSandSimulator :
|
||||||
public cSimulator
|
public cSimulator<cChunk, cWorld>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cSandSimulator(cWorld & a_World, cIniFile & a_IniFile);
|
cSandSimulator(cWorld & a_World, cIniFile & a_IniFile);
|
||||||
@ -55,8 +57,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Per-chunk data for the simulator, specified individual chunks to simulate; Data is not used
|
|
||||||
typedef cCoordWithIntList cSandSimulatorChunkData;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,50 +1,8 @@
|
|||||||
|
|
||||||
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
#include "Globals.h"
|
||||||
|
|
||||||
#include "Simulator.h"
|
|
||||||
#include "../World.h"
|
|
||||||
#include "../BlockID.h"
|
|
||||||
#include "../Defines.h"
|
|
||||||
#include "../Chunk.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cSimulator::cSimulator(cWorld & a_World)
|
|
||||||
: m_World(a_World)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cSimulator::~cSimulator()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cSimulator::WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk)
|
|
||||||
{
|
|
||||||
AddBlock(a_BlockX, a_BlockY, a_BlockZ, a_Chunk);
|
|
||||||
AddBlock(a_BlockX - 1, a_BlockY, a_BlockZ, a_Chunk->GetNeighborChunk(a_BlockX - 1, a_BlockZ));
|
|
||||||
AddBlock(a_BlockX + 1, a_BlockY, a_BlockZ, a_Chunk->GetNeighborChunk(a_BlockX + 1, a_BlockZ));
|
|
||||||
AddBlock(a_BlockX, a_BlockY, a_BlockZ - 1, a_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ - 1));
|
|
||||||
AddBlock(a_BlockX, a_BlockY, a_BlockZ + 1, a_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ + 1));
|
|
||||||
if (a_BlockY > 0)
|
|
||||||
{
|
|
||||||
AddBlock(a_BlockX, a_BlockY - 1, a_BlockZ, a_Chunk);
|
|
||||||
}
|
|
||||||
if (a_BlockY < cChunkDef::Height - 1)
|
|
||||||
{
|
|
||||||
AddBlock(a_BlockX, a_BlockY + 1, a_BlockZ, a_Chunk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "Simulator.inc"
|
||||||
|
|
||||||
|
#pragma clang diagnostic ignored "-Wweak-template-vtables"
|
||||||
|
template class cSimulator<cChunk, cWorld>;
|
||||||
|
|
||||||
|
@ -8,17 +8,12 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cWorld;
|
|
||||||
class cChunk;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class ChunkType, class WorldType>
|
||||||
class cSimulator
|
class cSimulator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cSimulator(cWorld & a_World);
|
cSimulator(WorldType & a_World);
|
||||||
virtual ~cSimulator();
|
virtual ~cSimulator();
|
||||||
|
|
||||||
/// Called in each tick, a_Dt is the time passed since the last tick, in msec
|
/// Called in each tick, a_Dt is the time passed since the last tick, in msec
|
||||||
@ -26,7 +21,7 @@ public:
|
|||||||
|
|
||||||
/// Called in each tick for each chunk, a_Dt is the time passed since the last tick, in msec; direct access to chunk data available
|
/// Called in each tick for each chunk, a_Dt is the time passed since the last tick, in msec; direct access to chunk data available
|
||||||
virtual void SimulateChunk(float a_Dt, int a_ChunkX,
|
virtual void SimulateChunk(float a_Dt, int a_ChunkX,
|
||||||
int a_ChunkZ, cChunk * a_Chunk)
|
int a_ChunkZ, ChunkType * a_Chunk)
|
||||||
{
|
{
|
||||||
UNUSED(a_Dt);
|
UNUSED(a_Dt);
|
||||||
UNUSED(a_ChunkX);
|
UNUSED(a_ChunkX);
|
||||||
@ -35,7 +30,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Called when a block changes
|
/// Called when a block changes
|
||||||
virtual void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk);
|
virtual void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, ChunkType * a_Chunk);
|
||||||
|
|
||||||
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) = 0;
|
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) = 0;
|
||||||
|
|
||||||
@ -43,9 +38,9 @@ protected:
|
|||||||
friend class cChunk; // Calls AddBlock() in its WakeUpSimulators() function, to speed things up
|
friend class cChunk; // Calls AddBlock() in its WakeUpSimulators() function, to speed things up
|
||||||
|
|
||||||
/// Called to simulate a new block
|
/// Called to simulate a new block
|
||||||
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) = 0;
|
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, ChunkType * a_Chunk) = 0;
|
||||||
|
|
||||||
cWorld & m_World;
|
WorldType & m_World;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
49
src/Simulator/Simulator.inc
Normal file
49
src/Simulator/Simulator.inc
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#include "Simulator.h"
|
||||||
|
#include "../World.h"
|
||||||
|
#include "../BlockID.h"
|
||||||
|
#include "../Defines.h"
|
||||||
|
#include "../Chunk.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class ChunkType, class WorldType>
|
||||||
|
cSimulator<ChunkType, WorldType>::cSimulator(WorldType & a_World)
|
||||||
|
: m_World(a_World)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class ChunkType, class WorldType>
|
||||||
|
cSimulator<ChunkType, WorldType>::~cSimulator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class ChunkType, class WorldType>
|
||||||
|
void cSimulator<ChunkType, WorldType>::WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, ChunkType * a_Chunk)
|
||||||
|
{
|
||||||
|
AddBlock(a_BlockX, a_BlockY, a_BlockZ, a_Chunk);
|
||||||
|
AddBlock(a_BlockX - 1, a_BlockY, a_BlockZ, a_Chunk->GetNeighborChunk(a_BlockX - 1, a_BlockZ));
|
||||||
|
AddBlock(a_BlockX + 1, a_BlockY, a_BlockZ, a_Chunk->GetNeighborChunk(a_BlockX + 1, a_BlockZ));
|
||||||
|
AddBlock(a_BlockX, a_BlockY, a_BlockZ - 1, a_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ - 1));
|
||||||
|
AddBlock(a_BlockX, a_BlockY, a_BlockZ + 1, a_Chunk->GetNeighborChunk(a_BlockX, a_BlockZ + 1));
|
||||||
|
if (a_BlockY > 0)
|
||||||
|
{
|
||||||
|
AddBlock(a_BlockX, a_BlockY - 1, a_BlockZ, a_Chunk);
|
||||||
|
}
|
||||||
|
if (a_BlockY < cChunkDef::Height - 1)
|
||||||
|
{
|
||||||
|
AddBlock(a_BlockX, a_BlockY + 1, a_BlockZ, a_Chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -70,7 +70,7 @@ void cSimulatorManager::WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cSimulatorManager::RegisterSimulator(cSimulator * a_Simulator, int a_Rate)
|
void cSimulatorManager::RegisterSimulator(cSimulator<cChunk, cWorld> * a_Simulator, int a_Rate)
|
||||||
{
|
{
|
||||||
m_Simulators.push_back(std::make_pair(a_Simulator, a_Rate));
|
m_Simulators.push_back(std::make_pair(a_Simulator, a_Rate));
|
||||||
}
|
}
|
||||||
|
@ -37,10 +37,10 @@ public:
|
|||||||
|
|
||||||
void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk);
|
void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk);
|
||||||
|
|
||||||
void RegisterSimulator(cSimulator * a_Simulator, int a_Rate); // Takes ownership of the simulator object!
|
void RegisterSimulator(cSimulator<cChunk, cWorld> * a_Simulator, int a_Rate); // Takes ownership of the simulator object!
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef std::vector <std::pair<cSimulator *, int> > cSimulators;
|
typedef std::vector <std::pair<cSimulator<cChunk, cWorld> *, int> > cSimulators;
|
||||||
|
|
||||||
cWorld & m_World;
|
cWorld & m_World;
|
||||||
cSimulators m_Simulators;
|
cSimulators m_Simulators;
|
||||||
|
@ -3258,7 +3258,7 @@ void cWorld::SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicke
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cRedstoneSimulator * cWorld::InitializeRedstoneSimulator(cIniFile & a_IniFile)
|
cRedstoneSimulator<cChunk, cWorld> * cWorld::InitializeRedstoneSimulator(cIniFile & a_IniFile)
|
||||||
{
|
{
|
||||||
AString SimulatorName = a_IniFile.GetValueSet("Physics", "RedstoneSimulator", "Incremental");
|
AString SimulatorName = a_IniFile.GetValueSet("Physics", "RedstoneSimulator", "Incremental");
|
||||||
|
|
||||||
@ -3268,11 +3268,11 @@ cRedstoneSimulator * cWorld::InitializeRedstoneSimulator(cIniFile & a_IniFile)
|
|||||||
SimulatorName = "Incremental";
|
SimulatorName = "Incremental";
|
||||||
}
|
}
|
||||||
|
|
||||||
cRedstoneSimulator * res = NULL;
|
cRedstoneSimulator<cChunk, cWorld> * res = NULL;
|
||||||
|
|
||||||
if (NoCaseCompare(SimulatorName, "Incremental") == 0)
|
if (NoCaseCompare(SimulatorName, "Incremental") == 0)
|
||||||
{
|
{
|
||||||
res = new cIncrementalRedstoneSimulator(*this);
|
res = new cIncrementalRedstoneSimulator<cChunk, cWorld, GetHandlerCompileTime, cChestEntity>(*this);
|
||||||
}
|
}
|
||||||
else if (NoCaseCompare(SimulatorName, "noop") == 0)
|
else if (NoCaseCompare(SimulatorName, "noop") == 0)
|
||||||
{
|
{
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
class cFireSimulator;
|
class cFireSimulator;
|
||||||
class cFluidSimulator;
|
class cFluidSimulator;
|
||||||
class cSandSimulator;
|
class cSandSimulator;
|
||||||
|
template <class ChunkType, class WorldType>
|
||||||
class cRedstoneSimulator;
|
class cRedstoneSimulator;
|
||||||
class cItem;
|
class cItem;
|
||||||
class cPlayer;
|
class cPlayer;
|
||||||
@ -502,7 +503,7 @@ public:
|
|||||||
|
|
||||||
inline cFluidSimulator * GetWaterSimulator(void) { return m_WaterSimulator; }
|
inline cFluidSimulator * GetWaterSimulator(void) { return m_WaterSimulator; }
|
||||||
inline cFluidSimulator * GetLavaSimulator (void) { return m_LavaSimulator; }
|
inline cFluidSimulator * GetLavaSimulator (void) { return m_LavaSimulator; }
|
||||||
inline cRedstoneSimulator * GetRedstoneSimulator(void) { return m_RedstoneSimulator; }
|
inline cRedstoneSimulator<cChunk, cWorld> * 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 */
|
/** 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
|
bool ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback & a_Callback); // Exported in ManualBindings.cpp
|
||||||
@ -910,7 +911,7 @@ private:
|
|||||||
cFluidSimulator * m_WaterSimulator;
|
cFluidSimulator * m_WaterSimulator;
|
||||||
cFluidSimulator * m_LavaSimulator;
|
cFluidSimulator * m_LavaSimulator;
|
||||||
cFireSimulator * m_FireSimulator;
|
cFireSimulator * m_FireSimulator;
|
||||||
cRedstoneSimulator * m_RedstoneSimulator;
|
cRedstoneSimulator<cChunk, cWorld> * m_RedstoneSimulator;
|
||||||
|
|
||||||
cCriticalSection m_CSPlayers;
|
cCriticalSection m_CSPlayers;
|
||||||
cPlayerList m_Players;
|
cPlayerList m_Players;
|
||||||
@ -1051,7 +1052,7 @@ private:
|
|||||||
cFluidSimulator * InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock);
|
cFluidSimulator * InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock);
|
||||||
|
|
||||||
/** Creates a new redstone simulator.*/
|
/** Creates a new redstone simulator.*/
|
||||||
cRedstoneSimulator * InitializeRedstoneSimulator(cIniFile & a_IniFile);
|
cRedstoneSimulator<cChunk, cWorld> * InitializeRedstoneSimulator(cIniFile & a_IniFile);
|
||||||
|
|
||||||
/** Adds the players queued in the m_PlayersToAdd queue into the m_Players list.
|
/** Adds the players queued in the m_PlayersToAdd queue into the m_Players list.
|
||||||
Assumes it is called from the Tick thread. */
|
Assumes it is called from the Tick thread. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user