summaryrefslogtreecommitdiffstats
path: root/src/Items
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2022-01-02 13:19:13 +0100
committerGitHub <noreply@github.com>2022-01-02 13:19:13 +0100
commit178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea (patch)
treea3c5a1accd053b5191250b71aa9188f3e34b88f1 /src/Items
parentHandlers: update item and block handlers (#5371) (diff)
downloadcuberite-178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea.tar
cuberite-178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea.tar.gz
cuberite-178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea.tar.bz2
cuberite-178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea.tar.lz
cuberite-178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea.tar.xz
cuberite-178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea.tar.zst
cuberite-178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea.zip
Diffstat (limited to '')
-rw-r--r--src/Items/ItemHandler.cpp35
-rw-r--r--src/Items/ItemHandler.h10
2 files changed, 13 insertions, 32 deletions
diff --git a/src/Items/ItemHandler.cpp b/src/Items/ItemHandler.cpp
index fa518da20..95ee28bff 100644
--- a/src/Items/ItemHandler.cpp
+++ b/src/Items/ItemHandler.cpp
@@ -1042,30 +1042,15 @@ const cItemHandler & cItemHandler::For(int a_ItemType)
-void cItemHandler::OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_ClickedBlockPosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const
+void cItemHandler::OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_ClickedPosition, const BLOCKTYPE a_ClickedBlockType, const NIBBLETYPE a_ClickedBlockMeta, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) const
{
- if (a_ClickedBlockFace == BLOCK_FACE_NONE)
- {
- // Clicked in the air, no placement possible
- return;
- }
-
- if (!cChunkDef::IsValidHeight(a_ClickedBlockPosition.y))
- {
- // The clicked block is outside the world, ignore this call altogether (GH #128):
- return;
- }
-
const auto & World = *a_Player.GetWorld();
- BLOCKTYPE ClickedBlockType;
- NIBBLETYPE ClickedBlockMeta;
- World.GetBlockTypeMeta(a_ClickedBlockPosition, ClickedBlockType, ClickedBlockMeta);
// Check if the block ignores build collision (water, grass etc.):
- if (cBlockHandler::For(ClickedBlockType).DoesIgnoreBuildCollision(World, a_HeldItem, a_ClickedBlockPosition, ClickedBlockMeta, a_ClickedBlockFace, true))
+ if (cBlockHandler::For(a_ClickedBlockType).DoesIgnoreBuildCollision(World, a_HeldItem, a_ClickedPosition, a_ClickedBlockMeta, a_ClickedBlockFace, true))
{
// Try to place the block at the clicked position:
- if (!CommitPlacement(a_Player, a_HeldItem, a_ClickedBlockPosition, a_ClickedBlockFace, a_CursorPosition))
+ if (!CommitPlacement(a_Player, a_HeldItem, a_ClickedPosition, a_ClickedBlockFace, a_CursorPosition))
{
// The placement failed, the blocks have already been re-sent, re-send inventory:
a_Player.GetInventory().SendEquippedSlot();
@@ -1074,21 +1059,19 @@ void cItemHandler::OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, c
}
else
{
- const auto PlacedPosition = AddFaceDirection(a_ClickedBlockPosition, a_ClickedBlockFace);
+ BLOCKTYPE PlaceBlock;
+ NIBBLETYPE PlaceMeta;
+ const auto PlacePosition = AddFaceDirection(a_ClickedPosition, a_ClickedBlockFace);
- if (!cChunkDef::IsValidHeight(PlacedPosition.y))
+ if (!cChunkDef::IsValidHeight(PlacePosition.y) || !World.GetBlockTypeMeta(PlacePosition, PlaceBlock, PlaceMeta))
{
// The block is being placed outside the world, ignore this packet altogether (GH #128):
return;
}
- NIBBLETYPE PlaceMeta;
- BLOCKTYPE PlaceBlock;
- World.GetBlockTypeMeta(PlacedPosition, PlaceBlock, PlaceMeta);
-
// Clicked on side of block, make sure that placement won't be cancelled if there is a slab able to be double slabbed.
// No need to do combinability (dblslab) checks, client will do that here.
- if (!cBlockHandler::For(PlaceBlock).DoesIgnoreBuildCollision(World, a_HeldItem, PlacedPosition, PlaceMeta, a_ClickedBlockFace, false))
+ if (!cBlockHandler::For(PlaceBlock).DoesIgnoreBuildCollision(World, a_HeldItem, PlacePosition, PlaceMeta, a_ClickedBlockFace, false))
{
// Tried to place a block into another?
// Happens when you place a block aiming at side of block with a torch on it or stem beside it.
@@ -1098,7 +1081,7 @@ void cItemHandler::OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, c
}
// Try to place the block:
- if (!CommitPlacement(a_Player, a_HeldItem, PlacedPosition, a_ClickedBlockFace, a_CursorPosition))
+ if (!CommitPlacement(a_Player, a_HeldItem, PlacePosition, a_ClickedBlockFace, a_CursorPosition))
{
// The placement failed, the blocks have already been re-sent, re-send inventory:
a_Player.GetInventory().SendEquippedSlot();
diff --git a/src/Items/ItemHandler.h b/src/Items/ItemHandler.h
index da573df9a..8b8c8d2d3 100644
--- a/src/Items/ItemHandler.h
+++ b/src/Items/ItemHandler.h
@@ -40,13 +40,11 @@ public:
/** Called when the player tries to place the item (right mouse button, IsPlaceable() == true).
- a_ClickedBlockPos is the (neighbor) block that has been clicked to place this item.
- a_ClickedBlockFace is the face of the neighbor that has been clicked to place this item.
- a_CursorPos is the position of the player's cursor within a_ClickedBlockFace.
- The default handler uses GetBlocksToPlace() and places the returned blocks.
- Override if the item needs advanced processing, such as spawning a mob based on the blocks being placed.
+ a_ClickedPosition is the block that has been clicked to place this item.
+ a_ClickedBlockFace is the face has been clicked to place this item.
+ a_CursorPosition is the position of the player's cursor within a_ClickedBlockFace.
If the block placement is refused inside this call, it will automatically revert the client-side changes. */
- void OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, Vector3i a_ClickedBlockPosition, eBlockFace a_ClickedBlockFace, Vector3i a_CursorPosition) const;
+ void OnPlayerPlace(cPlayer & a_Player, const cItem & a_HeldItem, Vector3i a_ClickedPosition, BLOCKTYPE a_ClickedBlockType, NIBBLETYPE a_ClickedBlockMeta, eBlockFace a_ClickedBlockFace, Vector3i a_CursorPosition) const;
/** Called when the player tries to use the item (right mouse button).
Descendants can return false to abort the usage (default behavior). */