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 <fiv.pids@gmail.com> Co-authored-by: Tiger Wang <ziwei.tiger@outlook.com>
This commit is contained in:
parent
8de71fc9d6
commit
0a1bf06c6f
@ -65,6 +65,7 @@ sweetgiorni
|
||||
Sxw1212
|
||||
Taugeshtu
|
||||
tigerw (Tiger Wang)
|
||||
theophriene
|
||||
tonibm19
|
||||
TooAngel
|
||||
UltraCoderRU
|
||||
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user