From 225c2fa9f6bc2ebffcc9160090482e6833a220ce Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Wed, 29 Jul 2020 01:18:59 +0100 Subject: Always use relative coordinates in AddBlock + Pass block, use relatives * Fixes everything immediately converting abs back to rel and getting block, when these data were already available --- src/BlockEntities/ChestEntity.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/BlockEntities/ChestEntity.cpp') diff --git a/src/BlockEntities/ChestEntity.cpp b/src/BlockEntities/ChestEntity.cpp index d9648df18..cb26f4d08 100644 --- a/src/BlockEntities/ChestEntity.cpp +++ b/src/BlockEntities/ChestEntity.cpp @@ -216,3 +216,42 @@ bool cChestEntity::IsBlocked() + +void cChestEntity::OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum) +{ + ASSERT(a_Grid == &m_Contents); + + if (m_World == nullptr) + { + return; + } + + // Have cBlockEntityWithItems update redstone and try to broadcast our window: + Super::OnSlotChanged(a_Grid, a_SlotNum); + + cWindow * Window = GetWindow(); + if ((Window == nullptr) && (m_Neighbour != nullptr)) + { + // Window was null, Super will have failed. + // Neighbour might own the window: + Window = m_Neighbour->GetWindow(); + } + + if (Window != nullptr) + { + Window->BroadcastWholeWindow(); + } + + m_World->MarkChunkDirty(GetChunkX(), GetChunkZ()); + m_World->DoWithChunkAt(m_Pos, [&](cChunk & a_Chunk) + { + auto & Simulator = *m_World->GetRedstoneSimulator(); + + // Notify comparators: + m_World->WakeUpSimulators(m_Pos + Vector3i(1, 0, 0)); + m_World->WakeUpSimulators(m_Pos + Vector3i(-1, 0, 0)); + m_World->WakeUpSimulators(m_Pos + Vector3i(0, 0, 1)); + m_World->WakeUpSimulators(m_Pos + Vector3i(0, 0, -1)); + return true; + }); +} -- cgit v1.2.3