From 40eba5244ddd7045a9c3539c5f46c9921301ed90 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Sat, 8 Aug 2020 18:22:16 +0100 Subject: Remove the redstone solid block handler - Remove cSolidBlockHandler * Functionality now integrated into simulator dispatcher * Fix door double open/close issues, arisen due to the top/bottom halves getting different power + Small migration to block states for redstone wire --- .../IncrementalRedstoneSimulator/RedstoneHandler.h | 67 +++++++--------------- 1 file changed, 21 insertions(+), 46 deletions(-) (limited to 'src/Simulator/IncrementalRedstoneSimulator/RedstoneHandler.h') diff --git a/src/Simulator/IncrementalRedstoneSimulator/RedstoneHandler.h b/src/Simulator/IncrementalRedstoneSimulator/RedstoneHandler.h index 79c410265..9b131ece2 100644 --- a/src/Simulator/IncrementalRedstoneSimulator/RedstoneHandler.h +++ b/src/Simulator/IncrementalRedstoneSimulator/RedstoneHandler.h @@ -2,6 +2,7 @@ #pragma once #include "../../Chunk.h" +#include "ForEachSourceCallback.h" #include "RedstoneSimulatorChunkData.h" @@ -15,71 +16,55 @@ public: cRedstoneHandler() = default; DISALLOW_COPY_AND_ASSIGN(cRedstoneHandler); - using SourceCallback = cFunctionRef; + using SourceCallback = ForEachSourceCallback &; - virtual unsigned char GetPowerDeliveredToPosition(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType) const = 0; + virtual unsigned char GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked) const = 0; virtual void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, PoweringData a_PoweringData) const = 0; - virtual void ForValidSourcePositions(cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, SourceCallback Callback) const = 0; + virtual void ForValidSourcePositions(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, SourceCallback Callback) const = 0; // Force a virtual destructor virtual ~cRedstoneHandler() {} protected: - template - static Container StaticAppend(const Container & a_Lhs, const Container & a_Rhs) - { - Container ToReturn = a_Lhs; - std::copy(a_Rhs.begin(), a_Rhs.end(), std::back_inserter(ToReturn)); - return ToReturn; - } - - inline static Vector3i OffsetYP{ 0, 1, 0 }; - - inline static Vector3i OffsetYM{ 0, -1, 0 }; - - static cVector3iArray GetAdjustedRelatives(Vector3i a_Position, cVector3iArray a_Relatives) - { - for (auto & Entry : a_Relatives) - { - Entry += a_Position; - } - return a_Relatives; - } - - inline static cIncrementalRedstoneSimulatorChunkData & DataForChunk(cChunk & a_Chunk) + inline static auto & DataForChunk(const cChunk & a_Chunk) { return *static_cast(a_Chunk.GetRedstoneSimulatorData()); } template - static void UpdateAdjustedRelative(cChunk & From, cChunk & To, const Vector3i Position) + static void UpdateAdjustedRelative(const cChunk & From, const cChunk & To, const Vector3i Position, const Vector3i Offset) { - DataForChunk(To).WakeUp(cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(From, To, Position)); + DataForChunk(To).WakeUp(cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(From, To, Position + Offset)); + + for (const auto LinkedOffset : cSimulator::GetLinkedOffsets(Offset)) + { + DataForChunk(To).WakeUp(cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(From, To, Position + LinkedOffset)); + } } - template - static void UpdateAdjustedRelatives(cChunk & From, cChunk & To, const Vector3i Position, const ArrayType & Relative, const ArrayTypes &... Relatives) + template + static void UpdateAdjustedRelatives(const cChunk & From, const cChunk & To, const Vector3i Position, const ArrayType & Relative) { for (const auto Offset : Relative) { - DataForChunk(To).GetActiveBlocks().push(cIncrementalRedstoneSimulatorChunkData::RebaseRelativePosition(From, To, Position + Offset)); + UpdateAdjustedRelative(From, To, Position, Offset); } - - UpdateAdjustedRelatives(From, To, Position, Relatives...); } - template - static void InvokeForAdjustedRelatives(SourceCallback Callback, const Vector3i Position, const ArrayType & Relative, const ArrayTypes &... Relatives) + template + static void InvokeForAdjustedRelatives(SourceCallback Callback, const Vector3i Position, const ArrayType & Relative) { for (const auto Offset : Relative) { Callback(Position + Offset); } - - InvokeForAdjustedRelatives(Callback, Position, Relatives...); } + inline static Vector3i OffsetYP{ 0, 1, 0 }; + + inline static Vector3i OffsetYM{ 0, -1, 0 }; + inline static std::array RelativeAdjacents { { @@ -101,14 +86,4 @@ protected: { 0, 0, -1 }, } }; - -private: - - static void UpdateAdjustedRelatives(cChunk &, cChunk &, const Vector3i) - { - } - - static void InvokeForAdjustedRelatives(SourceCallback, const Vector3i) - { - } }; -- cgit v1.2.3