From 36be4a89f8bedca7a7b369289562cf71041a3db6 Mon Sep 17 00:00:00 2001 From: peterbell10 Date: Sat, 3 Jun 2017 20:17:53 +0100 Subject: Fixed double chests (#3741) Normal and trapped chests next to each other don't open a double chest window. Slot changes in the secondary chest are broadcast. Placing a chest in +x of another updates the original chest's metadata. --- src/BlockEntities/ChestEntity.cpp | 15 +++++++++++---- src/BlockEntities/ChestEntity.h | 16 +++++++++++++--- src/Items/ItemChest.h | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/BlockEntities/ChestEntity.cpp b/src/BlockEntities/ChestEntity.cpp index 3fcf1b386..a47593108 100644 --- a/src/BlockEntities/ChestEntity.cpp +++ b/src/BlockEntities/ChestEntity.cpp @@ -127,21 +127,28 @@ void cChestEntity::ScanNeighbours() { public: cChestEntity * m_Neighbour; + BLOCKTYPE m_ChestType; - cFindNeighbour() : - m_Neighbour(nullptr) + cFindNeighbour(BLOCKTYPE a_ChestType) : + m_Neighbour(nullptr), + m_ChestType(a_ChestType) { } virtual bool Item(cChestEntity * a_Chest) override { + if (a_Chest->GetBlockType() != m_ChestType) + { + // Neighboring block is not the same type of chest + return true; + } m_Neighbour = a_Chest; return false; } }; - // Scan horizontally adjacent blocks for any neighbouring chest: - cFindNeighbour FindNeighbour; + // Scan horizontally adjacent blocks for any neighbouring chest of the same type: + cFindNeighbour FindNeighbour(m_BlockType); if ( m_World->DoWithChestAt(m_PosX - 1, m_PosY, m_PosZ, FindNeighbour) || m_World->DoWithChestAt(m_PosX + 1, m_PosY, m_PosZ, FindNeighbour) || diff --git a/src/BlockEntities/ChestEntity.h b/src/BlockEntities/ChestEntity.h index dfd5ca0d0..96d904248 100644 --- a/src/BlockEntities/ChestEntity.h +++ b/src/BlockEntities/ChestEntity.h @@ -39,7 +39,7 @@ public: virtual void SendTo(cClientHandle & a_Client) override; virtual bool UsedBy(cPlayer * a_Player) override; - /** Search horizontally adjacent blocks for neighbouring chests and links them together. */ + /** Search horizontally adjacent blocks for neighbouring chests of the same type and links them together. */ void ScanNeighbours(); /** Opens a new chest window where this is the primary chest and any neighbour is the secondary. */ @@ -72,9 +72,19 @@ private: ASSERT(a_Grid == &m_Contents); if (m_World != nullptr) { - if (GetWindow() != nullptr) + cWindow * Window = GetWindow(); + if ( + (Window == nullptr) && + (m_Neighbour != nullptr) + ) { - GetWindow()->BroadcastWholeWindow(); + // Neighbour might own the window + Window = m_Neighbour->GetWindow(); + } + + if (Window != nullptr) + { + Window->BroadcastWholeWindow(); } m_World->MarkChunkDirty(GetChunkX(), GetChunkZ()); diff --git a/src/Items/ItemChest.h b/src/Items/ItemChest.h index a714e5c96..d8cde2ae2 100644 --- a/src/Items/ItemChest.h +++ b/src/Items/ItemChest.h @@ -154,7 +154,7 @@ public: } // Adjust the existing chest, if any: - if (NeighborIdx > 0) + if (NeighborIdx != -1) { a_World.FastSetBlock(a_BlockX + CrossCoords[NeighborIdx].x, a_BlockY, a_BlockZ + CrossCoords[NeighborIdx].z, ChestBlockType, Meta); } -- cgit v1.2.3