diff options
Diffstat (limited to 'src/Simulator/IncrementalRedstoneSimulator/PistonHandler.h')
-rw-r--r-- | src/Simulator/IncrementalRedstoneSimulator/PistonHandler.h | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/src/Simulator/IncrementalRedstoneSimulator/PistonHandler.h b/src/Simulator/IncrementalRedstoneSimulator/PistonHandler.h index 0929951d5..b3860a778 100644 --- a/src/Simulator/IncrementalRedstoneSimulator/PistonHandler.h +++ b/src/Simulator/IncrementalRedstoneSimulator/PistonHandler.h @@ -8,16 +8,13 @@ -class cPistonHandler: - public cRedstoneHandler +class cPistonHandler final: public cRedstoneHandler { - using Super = cRedstoneHandler; - public: - virtual unsigned char GetPowerDeliveredToPosition(cWorld & a_World, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType) const override + virtual unsigned char GetPowerDeliveredToPosition(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType) const override { - UNUSED(a_World); + UNUSED(a_Chunk); UNUSED(a_Position); UNUSED(a_BlockType); UNUSED(a_Meta); @@ -26,52 +23,45 @@ public: return 0; } - virtual unsigned char GetPowerLevel(cWorld & a_World, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const override - { - UNUSED(a_World); - UNUSED(a_Position); - UNUSED(a_BlockType); - UNUSED(a_Meta); - return 0; - } - - virtual cVector3iArray Update(cWorld & a_World, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, PoweringData a_PoweringData) const override + virtual void Update(cChunk & a_Chunk, cChunk &, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, PoweringData a_PoweringData) const override { // LOGD("Evaluating pisty the piston (%d %d %d)", a_Position.x, a_Position.y, a_Position.z); - bool ShouldBeExtended = (a_PoweringData.PowerLevel != 0); + const bool ShouldBeExtended = a_PoweringData.PowerLevel != 0; if (ShouldBeExtended == cBlockPistonHandler::IsExtended(a_Meta)) { - return {}; + return; } + a_Position = cChunkDef::RelativeToAbsolute(a_Position, a_Chunk.GetPos()); + if (ShouldBeExtended) { - cBlockPistonHandler::ExtendPiston(a_Position, a_World); + cBlockPistonHandler::ExtendPiston(a_Position, *a_Chunk.GetWorld()); } else { - cBlockPistonHandler::RetractPiston(a_Position, a_World); + cBlockPistonHandler::RetractPiston(a_Position, *a_Chunk.GetWorld()); } // It is necessary to delay after a signal to prevent an infinite loop (#3168) - // However, that is present as a side effect of the implementation of piston animation in Blocks\BlockPiston.cpp - - return {}; + // However, this delay is already present: as a side effect of the implementation of piston animation in Blocks\BlockPiston.cpp } - virtual cVector3iArray GetValidSourcePositions(cWorld & a_World, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta) const override + virtual void ForValidSourcePositions(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, SourceCallback Callback) const override { - UNUSED(a_World); + UNUSED(a_Chunk); UNUSED(a_BlockType); - auto PositionsOffset = GetRelativeAdjacents(); - auto Face = cBlockPistonHandler::MetaDataToDirection(a_Meta); - int OffsetX = 0, OffsetY = 0, OffsetZ = 0; + const auto Face = cBlockPistonHandler::MetaDataToDirection(a_Meta); + const auto FrontOffset = AddFaceDirection(Vector3i(), Face); - AddFaceDirection(OffsetX, OffsetY, OffsetZ, Face); - PositionsOffset.erase(std::remove(PositionsOffset.begin(), PositionsOffset.end(), Vector3i(OffsetX, OffsetY, OffsetZ)), PositionsOffset.end()); - - return GetAdjustedRelatives(a_Position, PositionsOffset); + for (const auto Offset : RelativeAdjacents) + { + if (Offset != FrontOffset) + { + Callback(a_Position + Offset); + } + } } }; |