1
0

Re-implement up/down placement metadata (#5219)

+ Use player position when placing blocks which can face up or down, seems to better correspond to Vanilla behaviour.
* Fixes #4651
This commit is contained in:
Tiger Wang 2021-05-14 10:42:08 +01:00 committed by GitHub
parent ce8d8388d6
commit d92509a6e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 36 additions and 26 deletions

View File

@ -4,17 +4,21 @@
#pragma once
#include "BlockEntity.h"
#include "Mixins.h"
#include "ChunkInterface.h"
#include "Entities/Player.h"
#include "Mixins.h"
class cEntity;
class cPlayer;
class cWorldInterface;
class cBlockBedHandler final :
public cYawRotator<cBlockEntityHandler, 0x03, 0x02, 0x03, 0x00, 0x01>
{

View File

@ -12,9 +12,9 @@
class cBlockDropSpenserHandler final :
public cPitchYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>
public cDisplacementYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>
{
using Super = cPitchYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>;
using Super = cDisplacementYawRotator<cClearMetaOnDrop<cBlockEntityHandler>, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>;
public:

View File

@ -6,9 +6,9 @@
class cBlockObserverHandler final :
public cClearMetaOnDrop<cPitchYawRotator<cBlockHandler>>
public cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler>>
{
using Super = cClearMetaOnDrop<cPitchYawRotator<cBlockHandler>>;
using Super = cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler>>;
public:

View File

@ -16,9 +16,9 @@ class cWorld;
class cBlockPistonHandler final :
public cClearMetaOnDrop<cPitchYawRotator<cBlockHandler, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>>
public cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>>
{
using Super = cClearMetaOnDrop<cPitchYawRotator<cBlockHandler, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>>;
using Super = cClearMetaOnDrop<cDisplacementYawRotator<cBlockHandler, 0x07, 0x03, 0x04, 0x02, 0x05, 0x01, 0x00>>;
public:

View File

@ -10,7 +10,6 @@ class cBlockLadder: public cMetaRotator<cClearMetaOnDrop, ...>
#pragma once
#include "../Item.h"
#include "../Entities/Player.h"
@ -169,7 +168,7 @@ public:
/** Converts the rotation value as returned by cPlayer::GetYaw() to the appropriate metadata
value for a block placed by a player facing that way */
value for a block placed by a player facing that way. */
static NIBBLETYPE YawToMetaData(double a_Rotation)
{
if ((a_Rotation >= -135) && (a_Rotation < -45))
@ -199,8 +198,8 @@ protected:
/** Mixin for blocks whose meta on placement depends on the pitch and yaw of the player placing the block. BitMask
selects the direction bits from the block's meta values. */
/** Mixin for blocks whose meta on placement depends on the relative position of the player to the block in
addition to the yaw of the player placing the block. BitMask selects the direction bits from the block's meta values. */
template <
class Base,
NIBBLETYPE BitMask = 0x07,
@ -211,7 +210,7 @@ template <
NIBBLETYPE Up = 0x00,
NIBBLETYPE Down = 0x01
>
class cPitchYawRotator:
class cDisplacementYawRotator:
public cYawRotator<Base, BitMask, North, East, South, West>
{
using Super = cYawRotator<Base, BitMask, North, East, South, West>;
@ -221,17 +220,24 @@ public:
using Super::Super;
/** Converts the rotation and pitch values as returned by cPlayer::GetYaw() and cPlayer::GetPitch()
respectively to the appropriate metadata value for a block placed by a player facing that way */
static NIBBLETYPE PitchYawToMetaData(double a_Rotation, double a_Pitch)
/** Converts the placement position, eye position as returned by cPlayer::GetEyePosition(), and
rotation value as returned by cPlayer::GetYaw() to the appropriate metadata value for a block placed by a player facing that way. */
static NIBBLETYPE DisplacementYawToMetaData(const Vector3d a_PlacePosition, const Vector3d a_EyePosition, const double a_Rotation)
{
if (a_Pitch >= 50)
if (
const auto Displacement = a_EyePosition - a_PlacePosition.addedXZ(0.5, 0.5);
(std::abs(Displacement.x) < 2) && (std::abs(Displacement.z) < 2)
)
{
return Up;
}
else if (a_Pitch <= -50)
{
return Down;
if (Displacement.y > 2)
{
return Up;
}
if (Displacement.y < 0)
{
return Down;
}
}
return Super::YawToMetaData(a_Rotation);
@ -239,7 +245,7 @@ public:
protected:
~cPitchYawRotator() = default;
~cDisplacementYawRotator() = default;
virtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) const override

View File

@ -21,6 +21,6 @@ private:
virtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) override
{
return a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockDropSpenserHandler::PitchYawToMetaData(a_Player.GetYaw(), a_Player.GetPitch()));
return a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockDropSpenserHandler::DisplacementYawToMetaData(a_PlacePosition, a_Player.GetEyePosition(), a_Player.GetYaw()));
}
};

View File

@ -21,6 +21,6 @@ private:
virtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) override
{
return a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_OBSERVER, cBlockObserverHandler::PitchYawToMetaData(a_Player.GetYaw(), a_Player.GetPitch()));
return a_Player.PlaceBlock(a_PlacePosition, E_BLOCK_OBSERVER, cBlockObserverHandler::DisplacementYawToMetaData(a_PlacePosition, a_Player.GetEyePosition(), a_Player.GetYaw()));
}
};

View File

@ -21,6 +21,6 @@ private:
virtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) override
{
return a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockPistonHandler::PitchYawToMetaData(a_Player.GetYaw(), a_Player.GetPitch()));
return a_Player.PlaceBlock(a_PlacePosition, static_cast<BLOCKTYPE>(a_HeldItem.m_ItemType), cBlockPistonHandler::DisplacementYawToMetaData(a_PlacePosition, a_Player.GetEyePosition(), a_Player.GetYaw()));
}
};