summaryrefslogtreecommitdiffstats
path: root/src/Blocks/BlockTrapdoor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/BlockTrapdoor.h')
-rw-r--r--src/Blocks/BlockTrapdoor.h34
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");
}