From 9b97d63f8f939dbc431cc2dcd9eddf959f86603a Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 30 Apr 2021 14:23:46 +0100 Subject: Chest, weather, crash, and miscellaneous fixes (#5215) * Alpha-sort cChestEntity * Chests: use SendUpdateBlockEntity * Pathfinder: fix out of range Y * 1.13: correct weather packet ID * Chests: fix neighbour scanner + Add OnAddToWorld and overload to scan neighbours there, instead of in the constructor/OnUse. This fixes hoppers accessing newly loaded double chests and seeing a null m_Neighbour, thus thinking its a single chest. * Fix typo in cross coords computation. * Simplify hopper logic. * Block entities: ASSERT that type is correct If you match the block type first before calling DoWithBlockEntity, the corresponding block entity must either be empty or correspond to the block type. * Chunk: fix some forgotten PendingSendBE cleanup + Add cleanup in SetAllData, WriteBlockArea - Remove RemoveBlockEntity (used once), HasBlockEntity (not used) * Replace MakeIndex with MakeIndexNoCheck * Remove extraneous MarkDirty in hopper & chests --- src/BlockEntities/ChestEntity.h | 46 ++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 21 deletions(-) (limited to 'src/BlockEntities/ChestEntity.h') diff --git a/src/BlockEntities/ChestEntity.h b/src/BlockEntities/ChestEntity.h index 02b182481..ee3c59b8b 100644 --- a/src/BlockEntities/ChestEntity.h +++ b/src/BlockEntities/ChestEntity.h @@ -34,32 +34,20 @@ public: // tolua_end - /** Constructor used for normal operation */ cChestEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World); - // cBlockEntity overrides: - virtual void CopyFrom(const cBlockEntity & a_Src) override; - virtual void OnRemoveFromWorld() override; - virtual void SendTo(cClientHandle & a_Client) override; - virtual bool UsedBy(cPlayer * a_Player) override; + /** Gets the number of players who currently have this chest open */ + int GetNumberOfPlayers(void) const { return m_NumActivePlayers; } - /** Search horizontally adjacent blocks for neighbouring chests of the same type and links them together. */ - void ScanNeighbours(); + /** Returns the associated primary chest. */ + cChestEntity & GetPrimaryChest(); - /** Returns the value of m_Neighbour. */ - cChestEntity * GetNeighbour(); + /** Returns the associated secondary chest, if any. */ + cChestEntity * GetSecondaryChest(); - /** Opens a new chest window where this is the primary chest and any neighbour is the secondary. */ - void OpenNewWindow(); - - /** Forces any players to close the owned window. */ - void DestroyWindow(); - - /** Returns true if the chest should not be accessible by players. */ - bool IsBlocked(); - - /** Gets the number of players who currently have this chest open */ - int GetNumberOfPlayers(void) const { return m_NumActivePlayers; } + /** Search the given horizontally adjacent relative position for a neighbouring chest of the same type. + If found, links them together with ourselves and returns true. */ + bool ScanNeighbour(cChunk & a_Chunk, Vector3i a_Position); /** Sets the number of players who currently have this chest open */ void SetNumberOfPlayers(int a_NumActivePlayers) { m_NumActivePlayers = a_NumActivePlayers; } @@ -72,6 +60,22 @@ private: /** Neighbouring chest that links to form a double chest */ cChestEntity * m_Neighbour; + /** Forces any players to close the owned window. */ + void DestroyWindow(); + + /** Returns true if the chest should not be accessible by players. */ + bool IsBlocked(); + + /** Opens a new chest window where this is the primary chest and any neighbour is the secondary. */ + void OpenNewWindow(); + + // cBlockEntity overrides: + virtual void CopyFrom(const cBlockEntity & a_Src) override; + virtual void OnAddToWorld(cWorld & a_World, cChunk & a_Chunk) override; + virtual void OnRemoveFromWorld() override; + virtual void SendTo(cClientHandle & a_Client) override; + virtual bool UsedBy(cPlayer * a_Player) override; + /** cItemGrid::cListener overrides: */ virtual void OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum) override; } ; // tolua_export -- cgit v1.2.3