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/Blocks/BlockSnow.h | 61 ++++++++++---------------------------------------- 1 file changed, 12 insertions(+), 49 deletions(-) (limited to 'src/Blocks/BlockSnow.h') diff --git a/src/Blocks/BlockSnow.h b/src/Blocks/BlockSnow.h index 299ec9f62..f3fa87a1b 100644 --- a/src/Blocks/BlockSnow.h +++ b/src/Blocks/BlockSnow.h @@ -20,58 +20,21 @@ private: enum { - FullBlockMeta = 7 // Meta value of a full-height snow block + FullBlockMeta = 7 // Meta value of a full-height snow block. }; - virtual bool GetPlacementBlockTypeMeta( - cChunkInterface & a_ChunkInterface, - cPlayer & a_Player, - const Vector3i a_PlacedBlockPos, - eBlockFace a_ClickedBlockFace, - const Vector3i a_CursorPos, - BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta - ) const override - { - a_BlockType = m_BlockType; - - // Check if incrementing existing snow height: - BLOCKTYPE BlockBeforePlacement; - NIBBLETYPE MetaBeforePlacement; - a_ChunkInterface.GetBlockTypeMeta(a_PlacedBlockPos, BlockBeforePlacement, MetaBeforePlacement); - if ((BlockBeforePlacement == E_BLOCK_SNOW) && (MetaBeforePlacement < FullBlockMeta)) - { - // Only increment if: - // - A snow block was already there (not first time placement) AND - // - Height is smaller than the maximum possible - a_BlockMeta = MetaBeforePlacement + 1; - return true; - } - - // First time placement, check placement is valid - a_BlockMeta = 0; - BLOCKTYPE BlockBelow; - NIBBLETYPE MetaBelow; - return ( - (a_PlacedBlockPos.y > 0) && - a_ChunkInterface.GetBlockTypeMeta(a_PlacedBlockPos.addedY(-1), BlockBelow, MetaBelow) && - CanBeOn(BlockBelow, MetaBelow) - ); - } - - - - - virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) const override + virtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override { - if ((a_Player.GetEquippedItem().m_ItemType == E_BLOCK_SNOW) && (a_Meta < FullBlockMeta)) + if (a_Meta == 0) { - return true; // If a player is holding a (thin) snow block and it's size can be increased, return collision ignored + return true; // If at normal snowfall height (lowest), we ignore collision. } - if (a_Meta == 0) + // Special case if a player is holding a (thin) snow block and its size can be increased: + if ((a_HeldItem.m_ItemType == E_BLOCK_SNOW) && (a_Meta < FullBlockMeta)) { - return true; // If at normal snowfall height (lowest), we ignore collision + return !a_ClickedDirectly || (a_ClickedBlockFace == BLOCK_FACE_YP); // If clicked an adjacent block, or clicked YP directly, we ignore collision. } return false; @@ -83,7 +46,7 @@ private: virtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override { - // No drop unless dug up with a shovel + // No drop unless dug up with a shovel: if ((a_Tool == nullptr) || !ItemCategory::IsShovel(a_Tool->m_ItemType)) { return {}; @@ -104,13 +67,13 @@ private: - virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, const Vector3i a_RelPos, const cChunk & a_Chunk) const override + virtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override { - if (a_RelPos.y <= 0) + if (a_Position.y <= 0) { return false; } - auto BelowPos = a_RelPos.addedY(-1); + auto BelowPos = a_Position.addedY(-1); auto BlockBelow = a_Chunk.GetBlock(BelowPos); auto MetaBelow = a_Chunk.GetMeta(BelowPos); return CanBeOn(BlockBelow, MetaBelow); @@ -141,7 +104,7 @@ private: /** Returns true if snow can be placed on top of a block with the given type and meta. */ static bool CanBeOn(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) { - // If block below is snowable, or it is a thin slow block and is a full thin snow block, say yay + // If block below is snowable, or it is a thin snow block and is a full thin snow block, say yay: return ( cBlockInfo::IsSnowable(a_BlockType) || ( -- cgit v1.2.3