From a62b2b1be2103d7de2fd66c7304b7473e369be3c Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Wed, 5 May 2021 14:25:10 +0100 Subject: Move item placement into item handlers (#5184) * Move item placement into item handlers + Add appropriate CanBeAt checks in cPlayer::PlaceBlocks, into which all placement handlers call. * Partly addresses #5157 * Fixes #4878 * Fixes #2919 * Fixes #4629 * Fixes #4239 * Fixes #4849 Co-authored-by: changyong guo Co-authored-by: Xotheus Co-authored-by: Krist Pregracke * Review fixes * Update APIDesc.lua * Rename Co-authored-by: changyong guo Co-authored-by: Xotheus Co-authored-by: Krist Pregracke --- src/Items/ItemHandler.h | 54 +++++++++---------------------------------------- 1 file changed, 10 insertions(+), 44 deletions(-) (limited to 'src/Items/ItemHandler.h') diff --git a/src/Items/ItemHandler.h b/src/Items/ItemHandler.h index 74de4eaa5..415f7f24f 100644 --- a/src/Items/ItemHandler.h +++ b/src/Items/ItemHandler.h @@ -9,6 +9,7 @@ // fwd: +class cChunk; class cWorld; class cPlayer; class cBlockPluginInterface; @@ -36,55 +37,14 @@ public: /** Force virtual destructor */ virtual ~cItemHandler() {} - /** Called when the player tries to place the item (right mouse button, IsPlaceable() == true). a_ClickedBlockPos is the (neighbor) block that has been clicked to place this item. a_ClickedBlockFace is the face of the neighbor that has been clicked to place this item. a_CursorPos is the position of the player's cursor within a_ClickedBlockFace. The default handler uses GetBlocksToPlace() and places the returned blocks. Override if the item needs advanced processing, such as spawning a mob based on the blocks being placed. - If the block placement is refused inside this call, it will automatically revert the client-side changes. - Returns true if the placement succeeded, false if the placement was aborted for any reason. */ - virtual bool OnPlayerPlace( - cWorld & a_World, - cPlayer & a_Player, - const cItem & a_EquippedItem, - const Vector3i a_ClickedBlockPos, - eBlockFace a_ClickedBlockFace, - const Vector3i a_CursorPos - ); - - - /** Called from OnPlayerPlace() to determine the blocks that the current placement operation should set. - a_PlacedBlockPos points to the location where the new block should be set. - a_ClickedBlockFace is the block face of the neighbor that was clicked to place this block. - a_CursorPos is the position of the mouse cursor within the clicked (neighbor's) block face. - The blocks in a_BlocksToPlace will be sent through cPlayer::PlaceBlocks() after returning from this function. - The default handler uses GetPlacementBlockTypeMeta() and provides that as the single block at the specified coords. - Returns true if the placement succeeded, false if the placement was aborted for any reason. - If aborted, the server then sends all original blocks in the coords provided in a_BlocksToSet to the client. */ - virtual bool GetBlocksToPlace( - cWorld & a_World, - cPlayer & a_Player, - const cItem & a_EquippedItem, - const Vector3i a_PlacedBlockPos, - eBlockFace a_ClickedBlockFace, - const Vector3i a_CursorPos, - sSetBlockVector & a_BlocksToPlace - ); - - - /** Called when the player right-clicks with this item and IsPlaceable() == true, and OnPlayerPlace() is not overridden. - This function should provide the block type and meta for the placed block, or refuse the placement. - Returns true to allow placement, false to refuse. */ - virtual bool GetPlacementBlockTypeMeta( - cWorld * a_World, cPlayer * a_Player, - const Vector3i a_PlacedBlockPos, - eBlockFace a_ClickedBlockFace, - const Vector3i a_CursorPos, - BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta - ); - + If the block placement is refused inside this call, it will automatically revert the client-side changes. */ + void OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, Vector3i a_ClickedBlockPosition, eBlockFace a_ClickedBlockFace, Vector3i a_CursorPosition); /** Called when the player tries to use the item (right mouse button). Descendants can return false to abort the usage (default behavior). */ @@ -97,7 +57,6 @@ public: eBlockFace a_ClickedBlockFace ); - /** Called when the client sends the SHOOT status in the lclk packet (releasing the bow). */ virtual void OnItemShoot(cPlayer *, const Vector3i a_BlockPos, eBlockFace a_BlockFace) { @@ -181,9 +140,16 @@ public: static void Deinit(); protected: + int m_ItemType; static cItemHandler * CreateItemHandler(int m_ItemType); + /** Performs the actual placement of this placeable item. + The descendant handler should call a_Player.PlaceBlock(s) supplying correct values for the newly placed block. + The default handler uses the stored block type and meta copied from the lowest 4 bits of the player's equipped item's damage value. + Handlers return what a_Player.PlaceBlock(s) returns, indicating whether the placement was successful. */ + virtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, Vector3i a_PlacePosition, eBlockFace a_ClickedBlockFace, Vector3i a_CursorPosition); + static cItemHandler * m_ItemHandler[E_ITEM_LAST + 1]; static bool m_HandlerInitialized; // used to detect if the itemhandlers are initialized }; -- cgit v1.2.3