--- a/net/minecraft/world/item/ServerItemCooldowns.java +++ b/net/minecraft/world/item/ServerItemCooldowns.java @@ -11,6 +_,50 @@ this.player = player; } + // Paper start - Add PlayerItemCooldownEvent + private int getCurrentCooldown(final ResourceLocation groupId) { + final net.minecraft.world.item.ItemCooldowns.CooldownInstance cooldownInstance = this.cooldowns.get(groupId); + if (cooldownInstance == null) { + return 0; + } + return Math.max(0, cooldownInstance.endTime() - this.tickCount); + } + + @Override + public void addCooldown(ItemStack item, int duration) { + final ResourceLocation cooldownGroup = this.getCooldownGroup(item); + final io.papermc.paper.event.player.PlayerItemCooldownEvent event = new io.papermc.paper.event.player.PlayerItemCooldownEvent( + this.player.getBukkitEntity(), + org.bukkit.craftbukkit.inventory.CraftItemType.minecraftToBukkit(item.getItem()), + org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(cooldownGroup), + duration + ); + if (event.callEvent()) { + this.addCooldown(cooldownGroup, event.getCooldown(), false); + } else { + this.player.connection.send(new ClientboundCooldownPacket(cooldownGroup, this.getCurrentCooldown(cooldownGroup))); + } + } + + @Override + public void addCooldown(ResourceLocation groupId, int duration, boolean callEvent) { + if (callEvent) { + final io.papermc.paper.event.player.PlayerItemGroupCooldownEvent event = new io.papermc.paper.event.player.PlayerItemGroupCooldownEvent( + this.player.getBukkitEntity(), + org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(groupId), + duration + ); + if (!event.callEvent()) { + this.player.connection.send(new ClientboundCooldownPacket(groupId, this.getCurrentCooldown(groupId))); + return; + } + + duration = event.getCooldown(); + } + super.addCooldown(groupId, duration, false); + } + // Paper end - Add PlayerItemCooldownEvent + @Override protected void onCooldownStarted(ResourceLocation group, int cooldown) { super.onCooldownStarted(group, cooldown);