summaryrefslogtreecommitdiffstats
path: root/source/cRedstoneSimulator.h
diff options
context:
space:
mode:
authorfaketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-03-06 22:06:51 +0100
committerfaketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6>2012-03-06 22:06:51 +0100
commit01577bed9d9840f48766a16095ab2b1fce8c02ff (patch)
tree4f89f1b0c2fff25b5426f439b726b2b9c704e510 /source/cRedstoneSimulator.h
parentWorld storage names are now case-INsensitive (diff)
downloadcuberite-01577bed9d9840f48766a16095ab2b1fce8c02ff.tar
cuberite-01577bed9d9840f48766a16095ab2b1fce8c02ff.tar.gz
cuberite-01577bed9d9840f48766a16095ab2b1fce8c02ff.tar.bz2
cuberite-01577bed9d9840f48766a16095ab2b1fce8c02ff.tar.lz
cuberite-01577bed9d9840f48766a16095ab2b1fce8c02ff.tar.xz
cuberite-01577bed9d9840f48766a16095ab2b1fce8c02ff.tar.zst
cuberite-01577bed9d9840f48766a16095ab2b1fce8c02ff.zip
Diffstat (limited to 'source/cRedstoneSimulator.h')
-rw-r--r--source/cRedstoneSimulator.h42
1 files changed, 41 insertions, 1 deletions
diff --git a/source/cRedstoneSimulator.h b/source/cRedstoneSimulator.h
index 853816f3b..927902f5a 100644
--- a/source/cRedstoneSimulator.h
+++ b/source/cRedstoneSimulator.h
@@ -26,17 +26,56 @@ public:
eRedstoneDirection GetDirection( int a_X, int a_Y, int a_Z );
eRedstoneDirection GetDirection( const Vector3i & a_Pos ) { return GetDirection( a_Pos.x, a_Pos.y, a_Pos.z ); }
private:
+ struct sRepeaterChange
+ {
+ Vector3i Position;
+ int Ticks;
+ bool bPowerOn;
+ bool bPowerOffNextTime;
+ };
+
typedef std::deque <Vector3i> BlockList;
+ typedef std::deque< sRepeaterChange > RepeaterList;
+ RepeaterList m_SetRepeaters;
+ void SetRepeater( const Vector3i & a_Position, int a_Ticks, bool a_bPowerOn )
+ {
+ for( RepeaterList::iterator itr = m_SetRepeaters.begin(); itr != m_SetRepeaters.end(); ++itr )
+ {
+ sRepeaterChange & Change = *itr;
+ if( Change.Position.Equals( a_Position ) )
+ {
+ if( Change.bPowerOn && a_bPowerOn == false )
+ {
+ Change.bPowerOffNextTime = true;
+ }
+ if( a_bPowerOn == true )
+ {
+ Change.bPowerOffNextTime = false;
+ }
+ Change.bPowerOn |= a_bPowerOn;
+ return;
+ }
+ }
+
+ sRepeaterChange RC;
+ RC.Position = a_Position;
+ RC.Ticks = a_Ticks;
+ RC.bPowerOn = a_bPowerOn;
+ RC.bPowerOffNextTime = false;
+ m_SetRepeaters.push_back( RC );
+ }
+
virtual void AddBlock(int a_X, int a_Y, int a_Z) {}
void HandleChange( const Vector3i & a_BlockPos );
BlockList RemoveCurrent( const Vector3i & a_BlockPos );
bool PowerBlock( const Vector3i & a_BlockPos, const Vector3i & a_FromBlock, char a_Power );
- int UnPowerBlock( const Vector3i & a_BlockPos );
+ int UnPowerBlock( const Vector3i & a_BlockPos, const Vector3i & a_FromBlock );
bool IsPowered( const Vector3i & a_BlockPos, bool a_bOnlyByWire = false );
+ bool IsPowering( const Vector3i & a_PowerPos, const Vector3i & a_BlockPos, eRedstoneDirection a_WireDirection, bool a_bOnlyByWire );
BlockList m_Blocks;
BlockList m_BlocksBuffer;
@@ -44,6 +83,7 @@ private:
BlockList m_RefreshPistons;
BlockList m_RefreshTorchesAround;
+
void RefreshTorchesAround( const Vector3i & a_BlockPos );
cCriticalSection m_CS;