diff options
author | theophriene <60849082+theophriene@users.noreply.github.com> | 2020-09-21 16:41:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-21 16:41:31 +0200 |
commit | 0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef (patch) | |
tree | 35ff28e15a23947692492b29d5627ece3c278eb5 /src/Blocks | |
parent | Synchronously save chunks on server shutdown (#4900) (diff) | |
download | cuberite-0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef.tar cuberite-0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef.tar.gz cuberite-0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef.tar.bz2 cuberite-0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef.tar.lz cuberite-0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef.tar.xz cuberite-0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef.tar.zst cuberite-0a1bf06c6f3c9f40fcb65d771a5d81ab268c5cef.zip |
Diffstat (limited to 'src/Blocks')
-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"); } |