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:
parent
ce8d8388d6
commit
d92509a6e7
@ -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>
|
||||
{
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()));
|
||||
}
|
||||
};
|
||||
|
@ -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()));
|
||||
}
|
||||
};
|
||||
|
@ -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()));
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user