From 24f6e17ded185e26b9e05ac7f2ced91898b94623 Mon Sep 17 00:00:00 2001
From: The456 <The456gamer@the456gamer.dev>
Date: Wed, 23 Aug 2023 01:41:30 +0100
Subject: [PATCH] Expose Hand during BlockCanBuildEvent (#9636)

---
 ...xpose-hand-during-BlockCanBuildEvent.patch | 54 +++++++++++++++++++
 ...xpose-hand-during-BlockCanBuildEvent.patch | 32 +++++++++++
 2 files changed, 86 insertions(+)
 create mode 100644 patches/api/Expose-hand-during-BlockCanBuildEvent.patch
 create mode 100644 patches/server/Expose-hand-during-BlockCanBuildEvent.patch

diff --git a/patches/api/Expose-hand-during-BlockCanBuildEvent.patch b/patches/api/Expose-hand-during-BlockCanBuildEvent.patch
new file mode 100644
index 0000000000..59ed5baf82
--- /dev/null
+++ b/patches/api/Expose-hand-during-BlockCanBuildEvent.patch
@@ -0,0 +1,54 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: The456gamer <the456gamer@the456gamer.dev>
+Date: Mon, 21 Aug 2023 14:13:43 +0100
+Subject: [PATCH] Expose hand during BlockCanBuildEvent
+
+
+diff --git a/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java b/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java
++++ b/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java
+@@ -0,0 +0,0 @@ public class BlockCanBuildEvent extends BlockEvent {
+ 
+     protected BlockData blockData;
+     private final Player player;
++    private final org.bukkit.inventory.EquipmentSlot hand; // Paper - expose hand
+ 
+     @Deprecated
+     public BlockCanBuildEvent(@NotNull final Block block, @NotNull final BlockData type, final boolean canBuild) {
+-        this(block, null, type, canBuild);
++        this(block, null, type, canBuild, org.bukkit.inventory.EquipmentSlot.HAND); // Paper - expose hand
+     }
+ 
+     /**
+@@ -0,0 +0,0 @@ public class BlockCanBuildEvent extends BlockEvent {
+      * @param type the id of the block to place
+      * @param canBuild whether we can build
+      */
++    @java.lang.Deprecated // Paper
++    @io.papermc.paper.annotation.DoNotUse // Paper
+     public BlockCanBuildEvent(@NotNull final Block block, @Nullable final Player player, @NotNull final BlockData type, final boolean canBuild) {
++        this(block, player, type, canBuild, org.bukkit.inventory.EquipmentSlot.HAND); // Paper start - expose hand
++    }
++    @org.jetbrains.annotations.ApiStatus.Internal
++    public BlockCanBuildEvent(@NotNull final Block block, @Nullable final Player player, @NotNull final BlockData type, final boolean canBuild, @NotNull final org.bukkit.inventory.EquipmentSlot hand) { // Paper end - expose hand
+         super(block);
+         this.player = player;
+         this.buildable = canBuild;
+         this.blockData = type;
++        this.hand = hand; // Paper
++    }
++    // Paper start
++    /**
++     * Gets the hand the player will use to place the block
++     *
++     * @return the EquipmentSlot representing the players hand.
++     */
++    @NotNull
++    public org.bukkit.inventory.EquipmentSlot getHand() {
++        return hand;
+     }
++    // Paper end
+ 
+     /**
+      * Gets whether or not the block can be built here.
diff --git a/patches/server/Expose-hand-during-BlockCanBuildEvent.patch b/patches/server/Expose-hand-during-BlockCanBuildEvent.patch
new file mode 100644
index 0000000000..1692342128
--- /dev/null
+++ b/patches/server/Expose-hand-during-BlockCanBuildEvent.patch
@@ -0,0 +1,32 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: The456gamer <the456gamer@the456gamer.dev>
+Date: Mon, 21 Aug 2023 14:13:42 +0100
+Subject: [PATCH] Expose hand during BlockCanBuildEvent
+
+
+diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/item/BlockItem.java
++++ b/src/main/java/net/minecraft/world/item/BlockItem.java
+@@ -0,0 +0,0 @@ public class BlockItem extends Item {
+         boolean defaultReturn = (!this.mustSurvive() || state.canSurvive(context.getLevel(), context.getClickedPos())) && world.checkEntityCollision(state, entityhuman, voxelshapecollision, context.getClickedPos(), true); // Paper
+         org.bukkit.entity.Player player = (context.getPlayer() instanceof ServerPlayer) ? (org.bukkit.entity.Player) context.getPlayer().getBukkitEntity() : null;
+ 
+-        BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(context.getLevel(), context.getClickedPos()), player, CraftBlockData.fromData(state), defaultReturn);
++        BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(context.getLevel(), context.getClickedPos()), player, CraftBlockData.fromData(state), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - expose hand
+         context.getLevel().getCraftServer().getPluginManager().callEvent(event);
+ 
+         return event.isBuildable();
+diff --git a/src/main/java/net/minecraft/world/item/StandingAndWallBlockItem.java b/src/main/java/net/minecraft/world/item/StandingAndWallBlockItem.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/item/StandingAndWallBlockItem.java
++++ b/src/main/java/net/minecraft/world/item/StandingAndWallBlockItem.java
+@@ -0,0 +0,0 @@ public class StandingAndWallBlockItem extends BlockItem {
+             boolean defaultReturn = world.isUnobstructed(iblockdata1, blockposition, CollisionContext.empty());
+             org.bukkit.entity.Player player = (context.getPlayer() instanceof ServerPlayer) ? (org.bukkit.entity.Player) context.getPlayer().getBukkitEntity() : null;
+ 
+-            BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(world, blockposition), player, CraftBlockData.fromData(iblockdata1), defaultReturn);
++            BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(world, blockposition), player, CraftBlockData.fromData(iblockdata1), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - expose hand
+             context.getLevel().getCraftServer().getPluginManager().callEvent(event);
+ 
+             return (event.isBuildable()) ? iblockdata1 : null;