diff options
Diffstat (limited to 'src/Blocks/BlockTrapdoor.h')
-rw-r--r-- | src/Blocks/BlockTrapdoor.h | 34 |
1 files changed, 28 insertions, 6 deletions
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<cMetaRotator<cBlockHandler, 0x03, 0x01, 0x02, 0x00, 0x03, false>> + public cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x01, 0x02, 0x00, 0x03, false>> { - using Super = cClearMetaOnDrop<cMetaRotator<cBlockHandler, 0x03, 0x01, 0x02, 0x00, 0x03, false>>; + using Super = cClearMetaOnDrop<cYawRotator<cBlockHandler, 0x03, 0x01, 0x02, 0x00, 0x03, false>>; 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"); } |