From 0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef Mon Sep 17 00:00:00 2001 From: theophriene <60849082+theophriene@users.noreply.github.com> Date: Mon, 21 Sep 2020 14:41:31 +0000 Subject: Trapdoor crash fix (#4890) * [WIP] Trapdoor crash fix * Fixed code style * Updated commentary in the code * Updated commentary in the code again * Fix copy-past error * Fix another copy-past error! * Fixed orientation & clipping * Remove redundant clause * Some code cleanup * Fixed compilation error * Moved logic into helper function, slightly reorganised the caller * Fixed comments * Fixed comments, what an idiot * Added to CONTRIBUTORS * Fixed bitwise error * Use cYawRotator * Reduce indent Co-authored-by: Elias Thomson Co-authored-by: Tiger Wang --- src/Blocks/BlockTrapdoor.h | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/Blocks/BlockTrapdoor.h b/src/Blocks/BlockTrapdoor.h index dce246dea..2392fc2d3 100644 --- a/src/Blocks/BlockTrapdoor.h +++ b/src/Blocks/BlockTrapdoor.h @@ -9,9 +9,9 @@ class cBlockTrapdoorHandler : - public cClearMetaOnDrop> + public cClearMetaOnDrop> { - using Super = cClearMetaOnDrop>; + using Super = cClearMetaOnDrop>; public: @@ -80,13 +80,38 @@ private: BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta ) const override { + if (a_ClickedBlockFace == BLOCK_FACE_YP) + { + // Trapdoor is placed on top of a block. + // Engage yaw rotation to determine hinge direction: + return Super::GetPlacementBlockTypeMeta(a_ChunkInterface, a_Player, a_PlacedBlockPos, a_ClickedBlockFace, a_CursorPos, a_BlockType, a_BlockMeta); + } + else if (a_ClickedBlockFace == BLOCK_FACE_YM) + { + // Trapdoor is placed on bottom of a block. + // Engage yaw rotation to determine hinge direction: + if (!Super::GetPlacementBlockTypeMeta(a_ChunkInterface, a_Player, a_PlacedBlockPos, a_ClickedBlockFace, a_CursorPos, a_BlockType, a_BlockMeta)) + { + return false; + } + + // Toggle 'Move up half-block' bit on: + a_BlockMeta |= 0x8; + + return true; + } + + // Placement on block sides; hinge direction is determined by which side was clicked: a_BlockType = m_BlockType; a_BlockMeta = BlockFaceToMetaData(a_ClickedBlockFace); if (a_CursorPos.y > 7) { + // Trapdoor is placed on a higher half of a vertical block. + // Toggle 'Move up half-block' bit on: a_BlockMeta |= 0x8; } + return true; } @@ -102,15 +127,12 @@ private: case BLOCK_FACE_ZM: return 0x0; case BLOCK_FACE_XP: return 0x3; case BLOCK_FACE_XM: return 0x2; - case BLOCK_FACE_NONE: - case BLOCK_FACE_YM: - case BLOCK_FACE_YP: + default: { ASSERT(!"Unhandled block face!"); return 0; } } - UNREACHABLE("Unsupported block face"); } -- cgit v1.2.3