Refactored Redstone simulator not to depend on TNTEntity or DropSpenserENtity Directly
This commit is contained in:
parent
d2d0ffee21
commit
06942871dd
@ -11,7 +11,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "BlockEntityWithItems.h"
|
||||
|
||||
#include "RedstonePoweredEntity.h"
|
||||
|
||||
|
||||
|
||||
@ -30,7 +30,8 @@ class cServer;
|
||||
|
||||
// tolua_begin
|
||||
class cDropSpenserEntity :
|
||||
public cBlockEntityWithItems
|
||||
public cBlockEntityWithItems,
|
||||
public cRedstonePoweredEntity
|
||||
{
|
||||
typedef cBlockEntityWithItems super;
|
||||
|
||||
@ -65,7 +66,7 @@ public:
|
||||
void Activate(void);
|
||||
|
||||
/// 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;
|
||||
|
||||
// tolua_end
|
||||
|
||||
|
9
src/BlockEntities/RedstonePoweredEntity.h
Normal file
9
src/BlockEntities/RedstonePoweredEntity.h
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
|
||||
// Interface class representing a blockEntity that responds to redstone
|
||||
class cRedstonePoweredEntity
|
||||
{
|
||||
public:
|
||||
/// 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;
|
||||
};
|
@ -2127,6 +2127,40 @@ bool cChunk::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBloc
|
||||
|
||||
|
||||
|
||||
bool cChunk::DoWithRedstonePoweredEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cRedstonePoweredCallback & a_Callback)
|
||||
{
|
||||
// The blockentity list is locked by the parent chunkmap's CS
|
||||
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(), itr2 = itr; itr != m_BlockEntities.end(); itr = itr2)
|
||||
{
|
||||
++itr2;
|
||||
if (((*itr)->GetPosX() != a_BlockX) || ((*itr)->GetPosY() != a_BlockY) || ((*itr)->GetPosZ() != a_BlockZ))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
switch ((*itr)->GetBlockType())
|
||||
{
|
||||
case E_BLOCK_DROPPER:
|
||||
case E_BLOCK_DISPENSER:
|
||||
break;
|
||||
default:
|
||||
// There is a block entity here, but of different type. No other block entity can be here, so we can safely bail out
|
||||
return false;
|
||||
}
|
||||
|
||||
if (a_Callback.Item((cRedstonePoweredEntity *)*itr))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} // for itr - m_BlockEntitites[]
|
||||
|
||||
// Not found:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool cChunk::DoWithBeaconAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBeaconCallback & a_Callback)
|
||||
{
|
||||
// The blockentity list is locked by the parent chunkmap's CS
|
||||
|
@ -43,6 +43,7 @@ class cBlockArea;
|
||||
class cFluidSimulatorData;
|
||||
class cMobCensus;
|
||||
class cMobSpawner;
|
||||
class cRedstonePoweredEntity;
|
||||
|
||||
typedef std::list<cClientHandle *> cClientHandleList;
|
||||
typedef cItemCallback<cEntity> cEntityCallback;
|
||||
@ -54,6 +55,7 @@ typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
||||
typedef cItemCallback<cCommandBlockEntity> cCommandBlockCallback;
|
||||
typedef cItemCallback<cMobHeadEntity> cMobHeadCallback;
|
||||
typedef cItemCallback<cFlowerPotEntity> cFlowerPotCallback;
|
||||
typedef cItemCallback<cRedstonePoweredEntity> cRedstonePoweredCallback;
|
||||
|
||||
|
||||
|
||||
@ -237,7 +239,9 @@ public:
|
||||
|
||||
/** Calls the callback for the block entity at the specified coords; returns false if there's no block entity at those coords, true if found */
|
||||
bool DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback & a_Callback); // Lua-acessible
|
||||
|
||||
|
||||
/** Calls the callback for the redstone powered entity at the specified coords; returns false if there's no redstone powered entity at those coords, true if found */
|
||||
bool DoWithRedstonePoweredEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cRedstonePoweredCallback & a_Callback);
|
||||
/** Calls the callback for the beacon at the specified coords; returns false if there's no beacon at those coords, true if found */
|
||||
bool DoWithBeaconAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBeaconCallback & a_Callback); // Lua-acessible
|
||||
|
||||
|
@ -3,11 +3,10 @@
|
||||
|
||||
#include "IncrementalRedstoneSimulator.h"
|
||||
#include "BoundingBox.h"
|
||||
#include "../BlockEntities/DropSpenserEntity.h"
|
||||
#include "../BlockEntities/RedstonePoweredEntity.h"
|
||||
#include "../BlockEntities/NoteEntity.h"
|
||||
#include "../BlockEntities/ChestEntity.h"
|
||||
#include "../BlockEntities/CommandBlockEntity.h"
|
||||
#include "../Entities/TNTEntity.h"
|
||||
#include "../Entities/Pickup.h"
|
||||
#include "../Blocks/BlockTorch.h"
|
||||
#include "../Blocks/BlockDoor.h"
|
||||
@ -842,13 +841,13 @@ void cIncrementalRedstoneSimulator::HandlePiston(int a_RelBlockX, int a_RelBlock
|
||||
void cIncrementalRedstoneSimulator::HandleDropSpenser(int a_RelBlockX, int a_RelBlockY, int a_RelBlockZ)
|
||||
{
|
||||
class cSetPowerToDropSpenser :
|
||||
public cDropSpenserCallback
|
||||
public cRedstonePoweredCallback
|
||||
{
|
||||
bool m_IsPowered;
|
||||
public:
|
||||
cSetPowerToDropSpenser(bool a_IsPowered) : m_IsPowered(a_IsPowered) {}
|
||||
|
||||
virtual bool Item(cDropSpenserEntity * a_DropSpenser) override
|
||||
virtual bool Item(cRedstonePoweredEntity * a_DropSpenser) override
|
||||
{
|
||||
a_DropSpenser->SetRedstonePower(m_IsPowered);
|
||||
return false;
|
||||
@ -857,7 +856,7 @@ void cIncrementalRedstoneSimulator::HandleDropSpenser(int a_RelBlockX, int a_Rel
|
||||
|
||||
int BlockX = (m_Chunk->GetPosX() * cChunkDef::Width) + a_RelBlockX;
|
||||
int BlockZ = (m_Chunk->GetPosZ() * cChunkDef::Width) + a_RelBlockZ;
|
||||
m_Chunk->DoWithDropSpenserAt(BlockX, a_RelBlockY, BlockZ, DrSpSP);
|
||||
m_Chunk->DoWithRedstonePoweredEntityAt(BlockX, a_RelBlockY, BlockZ, DrSpSP);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user