Skip to content

Commit a40947c

Browse files
Expose picked item in PlayerPickItemEvent (#14132)
1 parent 02ef1cf commit a40947c

6 files changed

Lines changed: 31 additions & 16 deletions

File tree

paper-api/src/main/java/io/papermc/paper/event/player/PlayerPickBlockEvent.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.bukkit.block.Block;
44
import org.bukkit.entity.Player;
5+
import org.bukkit.inventory.ItemStack;
56
import org.jetbrains.annotations.ApiStatus;
67
import org.jspecify.annotations.NullMarked;
78

@@ -17,8 +18,8 @@ public class PlayerPickBlockEvent extends PlayerPickItemEvent {
1718
private final Block block;
1819

1920
@ApiStatus.Internal
20-
public PlayerPickBlockEvent(final Player player, final Block block, final boolean includeData, final int targetSlot, final int sourceSlot) {
21-
super(player, includeData, targetSlot, sourceSlot);
21+
public PlayerPickBlockEvent(final Player player, final Block block, final ItemStack item, final boolean includeData, final int targetSlot, final int sourceSlot) {
22+
super(player, item, includeData, targetSlot, sourceSlot);
2223
this.block = block;
2324
}
2425

paper-api/src/main/java/io/papermc/paper/event/player/PlayerPickEntityEvent.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.bukkit.entity.Entity;
44
import org.bukkit.entity.Player;
5+
import org.bukkit.inventory.ItemStack;
56
import org.jetbrains.annotations.ApiStatus;
67
import org.jspecify.annotations.NullMarked;
78

@@ -17,8 +18,8 @@ public class PlayerPickEntityEvent extends PlayerPickItemEvent {
1718
private final Entity entity;
1819

1920
@ApiStatus.Internal
20-
public PlayerPickEntityEvent(final Player player, final Entity entity, final boolean includeData, final int targetSlot, final int sourceSlot) {
21-
super(player, includeData, targetSlot, sourceSlot);
21+
public PlayerPickEntityEvent(final Player player, final Entity entity, final ItemStack item, final boolean includeData, final int targetSlot, final int sourceSlot) {
22+
super(player, item, includeData, targetSlot, sourceSlot);
2223
this.entity = entity;
2324
}
2425

paper-api/src/main/java/io/papermc/paper/event/player/PlayerPickItemEvent.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.bukkit.event.Cancellable;
66
import org.bukkit.event.HandlerList;
77
import org.bukkit.event.player.PlayerEvent;
8+
import org.bukkit.inventory.ItemStack;
89
import org.jetbrains.annotations.ApiStatus;
910
import org.jetbrains.annotations.Range;
1011
import org.jspecify.annotations.NullMarked;
@@ -24,6 +25,7 @@ public abstract class PlayerPickItemEvent extends PlayerEvent implements Cancell
2425

2526
private static final HandlerList HANDLER_LIST = new HandlerList();
2627

28+
private final ItemStack item;
2729
private final boolean includeData;
2830

2931
private int targetSlot;
@@ -32,13 +34,23 @@ public abstract class PlayerPickItemEvent extends PlayerEvent implements Cancell
3234
private boolean cancelled;
3335

3436
@ApiStatus.Internal
35-
protected PlayerPickItemEvent(final Player player, final boolean includeData, final int targetSlot, final int sourceSlot) {
37+
protected PlayerPickItemEvent(final Player player, final ItemStack item, final boolean includeData, final int targetSlot, final int sourceSlot) {
3638
super(player);
39+
this.item = item;
3740
this.includeData = includeData;
3841
this.targetSlot = targetSlot;
3942
this.sourceSlot = sourceSlot;
4043
}
4144

45+
/**
46+
* Returns the item that is being picked.
47+
*
48+
* @return picked item
49+
*/
50+
public ItemStack getItem() {
51+
return this.item.clone();
52+
}
53+
4254
/**
4355
* Checks whether the player wants block/entity data included.
4456
*

paper-server/patches/features/0028-Optimise-collision-checking-in-player-move-packet-ha.patch

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Subject: [PATCH] Optimise collision checking in player move packet handling
66
Move collision logic to just the hasNewCollision call instead of getCubes + hasNewCollision
77

88
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
9-
index 92ce1962e9df66dbda6a3c0e25f6accdafbc4dc7..c6e5e45b1e97bbbfdae6804c313d499aaf3e6e50 100644
9+
index 4d16b090ceae18e5608250d878f97c418dbfe7fd..a4c25fe41eb45e07447f7ce9d1fb705347d42d0c 100644
1010
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
1111
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
1212
@@ -636,6 +636,7 @@ public class ServerGamePacketListenerImpl
@@ -72,7 +72,7 @@ index 92ce1962e9df66dbda6a3c0e25f6accdafbc4dc7..c6e5e45b1e97bbbfdae6804c313d499a
7272
}
7373

7474
@Override
75-
@@ -1544,7 +1578,7 @@ public class ServerGamePacketListenerImpl
75+
@@ -1545,7 +1579,7 @@ public class ServerGamePacketListenerImpl
7676
}
7777
}
7878

@@ -81,15 +81,15 @@ index 92ce1962e9df66dbda6a3c0e25f6accdafbc4dc7..c6e5e45b1e97bbbfdae6804c313d499a
8181
xDist = targetX - this.lastGoodX; // Paper - diff on change, used for checking large move vectors above
8282
yDist = targetY - this.lastGoodY; // Paper - diff on change, used for checking large move vectors above
8383
zDist = targetZ - this.lastGoodZ; // Paper - diff on change, used for checking large move vectors above
84-
@@ -1570,6 +1604,7 @@ public class ServerGamePacketListenerImpl
84+
@@ -1571,6 +1605,7 @@ public class ServerGamePacketListenerImpl
8585
boolean playerStandsOnSomething = this.player.verticalCollisionBelow;
8686
this.player.move(MoverType.PLAYER, new Vec3(xDist, yDist, zDist));
8787
this.player.onGround = packet.isOnGround(); // CraftBukkit - SPIGOT-5810, SPIGOT-5835, SPIGOT-6828: reset by this.player.move
8888
+ final boolean didCollide = targetX != this.player.getX() || targetY != this.player.getY() || targetZ != this.player.getZ(); // Paper - needed here as the difference in Y can be reset - also note: this is only a guess at whether collisions took place, floating point errors can make this true when it shouldn't be...
8989
// Paper start - prevent position desync
9090
if (this.awaitingPositionFromClient != null) {
9191
return; // ... thanks Mojang for letting move calls teleport across dimensions.
92-
@@ -1603,7 +1638,17 @@ public class ServerGamePacketListenerImpl
92+
@@ -1604,7 +1639,17 @@ public class ServerGamePacketListenerImpl
9393
}
9494

9595
// Paper start - Add fail move event
@@ -108,7 +108,7 @@ index 92ce1962e9df66dbda6a3c0e25f6accdafbc4dc7..c6e5e45b1e97bbbfdae6804c313d499a
108108
if (!allowMovement) {
109109
io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.CLIPPED_INTO_BLOCK,
110110
targetX, targetY, targetZ, targetYRot, targetXRot, false);
111-
@@ -1730,7 +1775,7 @@ public class ServerGamePacketListenerImpl
111+
@@ -1731,7 +1776,7 @@ public class ServerGamePacketListenerImpl
112112

113113
private boolean updateAwaitingTeleport() {
114114
if (this.awaitingPositionFromClient != null) {
@@ -117,7 +117,7 @@ index 92ce1962e9df66dbda6a3c0e25f6accdafbc4dc7..c6e5e45b1e97bbbfdae6804c313d499a
117117
this.awaitingTeleportTime = this.tickCount;
118118
this.teleport(
119119
this.awaitingPositionFromClient.x,
120-
@@ -1749,6 +1794,34 @@ public class ServerGamePacketListenerImpl
120+
@@ -1750,6 +1795,34 @@ public class ServerGamePacketListenerImpl
121121
}
122122
}
123123

paper-server/patches/features/0032-DataConverter-Moonrise-co-fixes.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ index 3b28b39ebf252d8de46f7d0ce27037cdb041f1b5..0b6d7f99edde802cb464baa5a4b2b4a4
5858
return savedChunks;
5959
}
6060
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
61-
index a61fb7d1c65b8b940d66f02e64c131b20a3ee610..b4434d534677403c68f1ff657c42736333e2e15e 100644
61+
index a4c25fe41eb45e07447f7ce9d1fb705347d42d0c..c2aba28916da7f8b0bc8a325cddaa9bb7ecfb251 100644
6262
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
6363
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
64-
@@ -1798,9 +1798,14 @@ public class ServerGamePacketListenerImpl
64+
@@ -1799,9 +1799,14 @@ public class ServerGamePacketListenerImpl
6565
private boolean hasNewCollision(final ServerLevel level, final Entity entity, final AABB oldBox, final AABB newBox) {
6666
final List<AABB> collisionsBB = new java.util.ArrayList<>();
6767
final List<VoxelShape> collisionsVoxel = new java.util.ArrayList<>();

paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@
537537
}
538538

539539
if (packet.includeData() && this.player.canUseGameMasterBlocks() && entity instanceof Avatar avatar) {
540-
@@ -746,22 +_,35 @@
540+
@@ -746,22 +_,36 @@
541541
}
542542
}
543543

@@ -547,12 +547,13 @@
547547
Inventory inventory = this.player.getInventory();
548548
int slotWithExistingItem = inventory.findSlotMatchingItem(itemStack);
549549
+ // Paper start - Add PlayerPickItemEvent
550+
+ final org.bukkit.inventory.ItemStack bukkitItem = itemStack.asBukkitCopy();
550551
+ final int sourceSlot = slotWithExistingItem;
551552
+ final int targetSlot = Inventory.isHotbarSlot(sourceSlot) ? sourceSlot : inventory.getSuitableHotbarSlot();
552553
+ final org.bukkit.entity.Player bukkitPlayer = this.player.getBukkitEntity();
553554
+ final io.papermc.paper.event.player.PlayerPickItemEvent event = entity != null
554-
+ ? new io.papermc.paper.event.player.PlayerPickEntityEvent(bukkitPlayer, entity.getBukkitEntity(), includeData, targetSlot, sourceSlot)
555-
+ : new io.papermc.paper.event.player.PlayerPickBlockEvent(bukkitPlayer, org.bukkit.craftbukkit.block.CraftBlock.at(this.player.level(), blockPos), includeData, targetSlot, sourceSlot);
555+
+ ? new io.papermc.paper.event.player.PlayerPickEntityEvent(bukkitPlayer, entity.getBukkitEntity(), bukkitItem, includeData, targetSlot, sourceSlot)
556+
+ : new io.papermc.paper.event.player.PlayerPickBlockEvent(bukkitPlayer, org.bukkit.craftbukkit.block.CraftBlock.at(this.player.level(), blockPos), bukkitItem, includeData, targetSlot, sourceSlot);
556557
+ if (!event.callEvent()) {
557558
+ return;
558559
+ }

0 commit comments

Comments
 (0)