Skip to content

Commit

Permalink
Add PlayerPickItemEvent (#5590)
Browse files Browse the repository at this point in the history
  • Loading branch information
RodneyMKay authored Aug 22, 2023
1 parent 27d39ca commit 0c7385b
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 0 deletions.
103 changes: 103 additions & 0 deletions patches/api/0434-Add-PlayerPickItemEvent.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: RodneyMKay <[email protected]>
Date: Wed, 8 Sep 2021 22:15:43 +0200
Subject: [PATCH] Add PlayerPickItemEvent


diff --git a/src/main/java/io/papermc/paper/event/player/PlayerPickItemEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerPickItemEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..f3011d00c9d62ebf4c0d10a04c05c0497fd8e5a3
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/player/PlayerPickItemEvent.java
@@ -0,0 +1,91 @@
+package io.papermc.paper.event.player;
+
+import org.apache.commons.lang3.Validate;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Range;
+
+/**
+ * Event that is fired when a player uses the pick item functionality (middle-clicking a block to get the appropriate
+ * item). However, note that this event will only trigger if an item has to be moved from the inventory to the hotbar.
+ * After the handling of this event, the contents of the source and the target slot will be swapped and the currently
+ * selected hotbar slot of the player will be set to the target slot.
+ * <p>
+ * Note: This event will not be fired for players in creative mode.
+ */
+public class PlayerPickItemEvent extends PlayerEvent implements Cancellable {
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+ private int targetSlot;
+ private int sourceSlot;
+ private boolean cancelled;
+
+ public PlayerPickItemEvent(@NotNull Player player, int targetSlot, int sourceSlot) {
+ super(player);
+ this.targetSlot = targetSlot;
+ this.sourceSlot = sourceSlot;
+ }
+
+ /**
+ * Returns the slot the item that is being picked goes into.
+ *
+ * @return hotbar slot (0-8 inclusive)
+ */
+ @Range(from = 0, to = 8)
+ public int getTargetSlot() {
+ return this.targetSlot;
+ }
+
+ /**
+ * Changes the slot the item that is being picked goes into.
+ *
+ * @param targetSlot hotbar slot (0-8 inclusive)
+ */
+ public void setTargetSlot(@Range(from = 0, to = 8) int targetSlot) {
+ Validate.isTrue(targetSlot >= 0 && targetSlot <= 8, "Target slot must be in range 0 - 8 (inclusive)");
+ this.targetSlot = targetSlot;
+ }
+
+ /**
+ * Returns the slot in which the item that will be put into the players hotbar is located.
+ *
+ * @return player inventory slot (0-35 inclusive)
+ */
+ @Range(from = 0, to = 35)
+ public int getSourceSlot() {
+ return this.sourceSlot;
+ }
+
+ /**
+ * Change the source slot from which the item that will be put in the players hotbar will be taken.
+ *
+ * @param sourceSlot player inventory slot (0-35 inclusive)
+ */
+ public void setSourceSlot(@Range(from = 0, to = 35) int sourceSlot) {
+ Validate.isTrue(sourceSlot >= 0 && sourceSlot <= 35, "Source slot must be in range of the players inventorys slot ids");
+ this.sourceSlot = sourceSlot;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return this.cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
45 changes: 45 additions & 0 deletions patches/server/1020-Add-PlayerPickItemEvent.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: RodneyMKay <[email protected]>
Date: Wed, 8 Sep 2021 21:34:01 +0200
Subject: [PATCH] Add PlayerPickItemEvent


diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index e8923befdee3514be5346c6e6c8e7236e7e6e668..3c0651fa5a5db880202c9a3805a6455269c5f16d 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -1057,7 +1057,14 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
this.disconnect("Invalid hotbar selection (Hacking?)", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause
return;
}
- this.player.getInventory().pickSlot(packet.getSlot()); // Paper - Diff above if changed
+ Player bukkitPlayer = this.player.getBukkitEntity();
+ int targetSlot = this.player.getInventory().getSuitableHotbarSlot();
+ int sourceSlot = packet.getSlot();
+
+ io.papermc.paper.event.player.PlayerPickItemEvent event = new io.papermc.paper.event.player.PlayerPickItemEvent(bukkitPlayer, targetSlot, sourceSlot);
+ if (!event.callEvent()) return;
+
+ this.player.getInventory().pickSlot(event.getSourceSlot(), event.getTargetSlot());
// Paper end
this.player.connection.send(new ClientboundContainerSetSlotPacket(-2, 0, this.player.getInventory().selected, this.player.getInventory().getItem(this.player.getInventory().selected)));
this.player.connection.send(new ClientboundContainerSetSlotPacket(-2, 0, packet.getSlot(), this.player.getInventory().getItem(packet.getSlot())));
diff --git a/src/main/java/net/minecraft/world/entity/player/Inventory.java b/src/main/java/net/minecraft/world/entity/player/Inventory.java
index 395cecc385e4126a7534ac9aeb15cf323efab03e..96d664c28738d6090f7067761c2978dd1aa0fd0e 100644
--- a/src/main/java/net/minecraft/world/entity/player/Inventory.java
+++ b/src/main/java/net/minecraft/world/entity/player/Inventory.java
@@ -174,7 +174,13 @@ public class Inventory implements Container, Nameable {
}

public void pickSlot(int slot) {
- this.selected = this.getSuitableHotbarSlot();
+ // Paper start - Add PlayerPickItemEvent
+ pickSlot(slot, this.getSuitableHotbarSlot());
+ }
+
+ public void pickSlot(int slot, int targetSlot) {
+ this.selected = targetSlot;
+ // Paper end
ItemStack itemstack = (ItemStack) this.items.get(this.selected);

this.items.set(this.selected, (ItemStack) this.items.get(slot));

0 comments on commit 0c7385b

Please sign in to comment.