From bbf5bec817c6c9824155c15d34806db152d5ed43 Mon Sep 17 00:00:00 2001 From: peterbell10 Date: Fri, 7 Jul 2017 15:37:53 +0100 Subject: BigFlower fixes (#3826) * BigFlowers fixes * Correct upper part meta * Documented parameters to DoesIgnoreBuildCollision --- src/Blocks/BlockBigFlower.h | 31 ++++++++++++++++++++++++++++--- src/Blocks/BlockDeadBush.h | 2 +- src/Blocks/BlockFire.h | 2 +- src/Blocks/BlockFluid.h | 2 +- src/Blocks/BlockHandler.cpp | 2 +- src/Blocks/BlockHandler.h | 13 ++++--------- src/Blocks/BlockSnow.h | 4 ++-- src/Blocks/BlockTallGrass.h | 2 +- src/Blocks/BlockVine.h | 2 +- 9 files changed, 40 insertions(+), 20 deletions(-) (limited to 'src/Blocks') diff --git a/src/Blocks/BlockBigFlower.h b/src/Blocks/BlockBigFlower.h index 3b3065f87..96139d656 100644 --- a/src/Blocks/BlockBigFlower.h +++ b/src/Blocks/BlockBigFlower.h @@ -18,19 +18,39 @@ public: { } - virtual bool DoesIgnoreBuildCollision(cPlayer * a_Player, NIBBLETYPE a_Meta) override + virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) override { - return (((a_Meta & E_META_BIG_FLOWER_DOUBLE_TALL_GRASS) != 0) || (a_Meta & E_META_BIG_FLOWER_LARGE_FERN) != 0); + if (IsMetaTopPart(a_Meta)) + { + BLOCKTYPE BottomType; + if ( + (a_Pos.y < 1) || + !a_ChunkInterface.GetBlockTypeMeta(a_Pos.x, a_Pos.y - 1, a_Pos.z, BottomType, a_Meta) || + (BottomType != E_BLOCK_BIG_FLOWER) + ) + { + // Can't find the flower meta so assume grass + return true; + } + } + + NIBBLETYPE FlowerMeta = a_Meta & 0x07; + return ( + (FlowerMeta == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS) || + (FlowerMeta == E_META_BIG_FLOWER_LARGE_FERN) + ); } virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_CanDrop) override { NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta(a_BlockX, a_BlockY, a_BlockZ); int AlternateY = a_BlockY; + int BottomY = a_BlockY; if (Meta & 0x8) { --AlternateY; + --BottomY; } else { @@ -39,13 +59,18 @@ public: // also destroy the other block if it has a valid height and is a big flower if (cChunkDef::IsValidHeight(AlternateY) && a_ChunkInterface.GetBlock(a_BlockX, AlternateY, a_BlockZ) == E_BLOCK_BIG_FLOWER) { - super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, a_BlockY, a_BlockZ, a_CanDrop); + super::DropBlock(a_ChunkInterface, a_WorldInterface, a_BlockPluginInterface, a_Digger, a_BlockX, BottomY, a_BlockZ, a_CanDrop); a_ChunkInterface.FastSetBlock(a_BlockX, AlternateY, a_BlockZ, E_BLOCK_AIR, 0); } } virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override { + if (IsMetaTopPart(a_BlockMeta)) + { + return; // No way to tell flower type + } + NIBBLETYPE Meta = a_BlockMeta & 0x7; if (Meta == E_META_BIG_FLOWER_DOUBLE_TALL_GRASS) { diff --git a/src/Blocks/BlockDeadBush.h b/src/Blocks/BlockDeadBush.h index f9ce9a9ff..799d3a2f2 100644 --- a/src/Blocks/BlockDeadBush.h +++ b/src/Blocks/BlockDeadBush.h @@ -17,7 +17,7 @@ public: { } - virtual bool DoesIgnoreBuildCollision(void) override + virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) override { return true; } diff --git a/src/Blocks/BlockFire.h b/src/Blocks/BlockFire.h index 346167a26..f16347558 100644 --- a/src/Blocks/BlockFire.h +++ b/src/Blocks/BlockFire.h @@ -232,7 +232,7 @@ public: return (FoundFrameZP && FoundFrameZM); } - virtual bool DoesIgnoreBuildCollision(cPlayer * a_Player, NIBBLETYPE a_Meta) override + virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) override { return true; } diff --git a/src/Blocks/BlockFluid.h b/src/Blocks/BlockFluid.h index 0a8b34145..c33427739 100644 --- a/src/Blocks/BlockFluid.h +++ b/src/Blocks/BlockFluid.h @@ -24,7 +24,7 @@ public: // No pickups } - virtual bool DoesIgnoreBuildCollision(void) override + virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) override { return true; } diff --git a/src/Blocks/BlockHandler.cpp b/src/Blocks/BlockHandler.cpp index 41e3561d1..40cc6b492 100644 --- a/src/Blocks/BlockHandler.cpp +++ b/src/Blocks/BlockHandler.cpp @@ -582,7 +582,7 @@ bool cBlockHandler::IsClickedThrough(void) -bool cBlockHandler::DoesIgnoreBuildCollision(void) +bool cBlockHandler::DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) { return (m_BlockType == E_BLOCK_AIR); } diff --git a/src/Blocks/BlockHandler.h b/src/Blocks/BlockHandler.h index 625def7d8..302fdbc4b 100644 --- a/src/Blocks/BlockHandler.h +++ b/src/Blocks/BlockHandler.h @@ -114,16 +114,11 @@ public: /** Checks if the player can build "inside" this block. For example blocks placed "on" snow will be placed at the same position. So: Snow ignores Build collision + @param a_Pos Position of the block + @param a_Player Player trying to build on the block + @param a_Meta Meta value of the block currently at a_Pos */ - virtual bool DoesIgnoreBuildCollision(void); - - /** Similar to DoesIgnoreBuildCollision(void), but is used for cases where block's meta or - player's item-in-hand is needed to determine collision (thin snow) */ - virtual bool DoesIgnoreBuildCollision(cPlayer *, NIBBLETYPE a_Meta) - { - UNUSED(a_Meta); - return DoesIgnoreBuildCollision(); - } + virtual bool DoesIgnoreBuildCollision(cChunkInterface & ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta); /** Returns if this block drops if it gets destroyed by an unsuitable situation. Default: true */ diff --git a/src/Blocks/BlockSnow.h b/src/Blocks/BlockSnow.h index d11c444b9..a502d82e4 100644 --- a/src/Blocks/BlockSnow.h +++ b/src/Blocks/BlockSnow.h @@ -41,9 +41,9 @@ public: return true; } - virtual bool DoesIgnoreBuildCollision(cPlayer * a_Player, NIBBLETYPE a_Meta) override + virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) override { - if ((a_Player->GetEquippedItem().m_ItemType == E_BLOCK_SNOW) && (a_Meta < 7)) + if ((a_Player.GetEquippedItem().m_ItemType == E_BLOCK_SNOW) && (a_Meta < 7)) { return true; // If a player is holding a (thin) snow block and it's size can be increased, return collision ignored } diff --git a/src/Blocks/BlockTallGrass.h b/src/Blocks/BlockTallGrass.h index fb65bca65..8920bd7c9 100644 --- a/src/Blocks/BlockTallGrass.h +++ b/src/Blocks/BlockTallGrass.h @@ -18,7 +18,7 @@ public: { } - virtual bool DoesIgnoreBuildCollision(void) override + virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) override { return true; } diff --git a/src/Blocks/BlockVine.h b/src/Blocks/BlockVine.h index 755161b12..a015c8ab3 100644 --- a/src/Blocks/BlockVine.h +++ b/src/Blocks/BlockVine.h @@ -163,7 +163,7 @@ public: } } - virtual bool DoesIgnoreBuildCollision(void) override + virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) override { return true; } -- cgit v1.2.3