diff options
author | Tiger Wang <ziwei.tiger@outlook.com> | 2020-08-20 21:04:28 +0200 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@outlook.com> | 2020-08-21 01:50:09 +0200 |
commit | d8c8d0124da12587bbaf52992f7a8d2e0b010544 (patch) | |
tree | 305983c82fdb55ec7f9bc37cda1b54304f4a0ecf /src/Simulator/IncrementalRedstoneSimulator/ObserverHandler.h | |
parent | cChunk's deleted copy constructor needs const (diff) | |
download | cuberite-d8c8d0124da12587bbaf52992f7a8d2e0b010544.tar cuberite-d8c8d0124da12587bbaf52992f7a8d2e0b010544.tar.gz cuberite-d8c8d0124da12587bbaf52992f7a8d2e0b010544.tar.bz2 cuberite-d8c8d0124da12587bbaf52992f7a8d2e0b010544.tar.lz cuberite-d8c8d0124da12587bbaf52992f7a8d2e0b010544.tar.xz cuberite-d8c8d0124da12587bbaf52992f7a8d2e0b010544.tar.zst cuberite-d8c8d0124da12587bbaf52992f7a8d2e0b010544.zip |
Diffstat (limited to '')
-rw-r--r-- | src/Simulator/IncrementalRedstoneSimulator/ObserverHandler.h | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/Simulator/IncrementalRedstoneSimulator/ObserverHandler.h b/src/Simulator/IncrementalRedstoneSimulator/ObserverHandler.h index 926b3ab51..071e16844 100644 --- a/src/Simulator/IncrementalRedstoneSimulator/ObserverHandler.h +++ b/src/Simulator/IncrementalRedstoneSimulator/ObserverHandler.h @@ -23,21 +23,36 @@ namespace ObserverHandler return false; } - // Cache the last seen block type and meta in the power data for this position - auto Observed = PoweringData(BlockType, BlockMeta); - auto Previous = a_Data.ExchangeUpdateOncePowerData(a_Position, Observed); + auto & ObserverCache = a_Data.ObserverCache; + const auto FindResult = ObserverCache.find(a_Position); + const auto Observed = std::make_pair(BlockType, BlockMeta); + + if (FindResult == ObserverCache.end()) + { + // Cache the last seen block for this position: + ObserverCache.emplace(a_Position, Observed); + + // Definitely should signal update: + return true; + } + + // The block this observer previously saw. + const auto Previous = FindResult->second; + + // Update the last seen block: + FindResult->second = Observed; // Determine if to signal an update based on the block previously observed changed - return (Previous.PoweringBlock != Observed.PoweringBlock) || (Previous.PowerLevel != Observed.PowerLevel); + return Previous != Observed; } - inline unsigned char GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked) + inline PowerLevel GetPowerDeliveredToPosition(const cChunk & a_Chunk, Vector3i a_Position, BLOCKTYPE a_BlockType, Vector3i a_QueryPosition, BLOCKTYPE a_QueryBlockType, bool IsLinked) { const auto Meta = a_Chunk.GetMeta(a_Position); return (IsOn(Meta) && (a_QueryPosition == (a_Position + cBlockObserverHandler::GetSignalOutputOffset(Meta)))) ? 15 : 0; } - inline void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, PoweringData a_PoweringData) + inline void Update(cChunk & a_Chunk, cChunk & CurrentlyTicking, Vector3i a_Position, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta, const PowerLevel Power) { // LOGD("Evaluating Lenny the observer (%i %i %i)", a_Position.x, a_Position.y, a_Position.z); |