diff options
author | Tiger Wang <ziwei.tiger@outlook.com> | 2022-01-02 13:19:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-02 13:19:13 +0100 |
commit | 178d1d2bda75e26a9964d2afa2d7fa1210e7f2ea (patch) | |
tree | a3c5a1accd053b5191250b71aa9188f3e34b88f1 /src/Items | |
parent | Handlers: update item and block handlers (#5371) (diff) | |
download | cuberite-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.cpp | 35 | ||||
-rw-r--r-- | src/Items/ItemHandler.h | 10 |
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). */ |