diff --git a/patches/api/0501-Added-PlayerUseBowWithoutProjectileEvent.patch b/patches/api/0501-Added-PlayerUseBowWithoutProjectileEvent.patch new file mode 100644 index 000000000000..2ded72c7dcf4 --- /dev/null +++ b/patches/api/0501-Added-PlayerUseBowWithoutProjectileEvent.patch @@ -0,0 +1,77 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Chaosdave34 +Date: Tue, 26 Nov 2024 17:10:15 +0100 +Subject: [PATCH] Added PlayerUseBowWithoutProjectileEvent + + +diff --git a/src/main/java/io/papermc/paper/event/player/PlayerUseBowWithoutProjectileEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerUseBowWithoutProjectileEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..59e432878c2619d559eac2855fffe3b73c1f05c0 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/event/player/PlayerUseBowWithoutProjectileEvent.java +@@ -0,0 +1,65 @@ ++package io.papermc.paper.event.player; ++ ++import org.bukkit.entity.Player; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.player.PlayerEvent; ++import org.bukkit.inventory.ItemStack; ++import org.jetbrains.annotations.ApiStatus; ++import org.jspecify.annotations.NullMarked; ++ ++/** ++ * Called when a player tries to draw a bow or load a crossbow without having a suitable projectile in their inventory ++ */ ++@NullMarked ++public class PlayerUseBowWithoutProjectileEvent extends PlayerEvent { ++ ++ private static final HandlerList HANDLER_LIST = new HandlerList(); ++ ++ private final ItemStack item; ++ private ItemStack projectile; ++ ++ @ApiStatus.Internal ++ public PlayerUseBowWithoutProjectileEvent(final Player player, final ItemStack item) { ++ super(player); ++ this.item = item; ++ this.projectile = ItemStack.empty(); ++ } ++ ++ /** ++ * Gets the item which the player tries to use ++ * ++ * @return the item ++ */ ++ public ItemStack getItem() { ++ return item.clone(); ++ } ++ ++ /** ++ * Gets the projectile that should be used ++ * ++ * @return the projectile ++ */ ++ public ItemStack getProjectile() { ++ return projectile.clone(); ++ } ++ ++ /** ++ * Sets the projectile that should be used ++ *

++ * Note: setting this to {@link ItemStack#empty()} will prevent the player from using the bow/crossbow ++ * ++ * @param projectile the projectile ++ */ ++ public void setProjectile(ItemStack projectile) { ++ this.projectile = projectile.clone(); ++ } ++ ++ @Override ++ public HandlerList getHandlers() { ++ return HANDLER_LIST; ++ } ++ ++ public static HandlerList getHandlerList() { ++ return HANDLER_LIST; ++ } ++} diff --git a/patches/server/1073-Call-PlayerUseBowWithoutProjectileEvent-in-Player-ge.patch b/patches/server/1073-Call-PlayerUseBowWithoutProjectileEvent-in-Player-ge.patch new file mode 100644 index 000000000000..65145c5740a0 --- /dev/null +++ b/patches/server/1073-Call-PlayerUseBowWithoutProjectileEvent-in-Player-ge.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Chaosdave34 +Date: Tue, 26 Nov 2024 17:11:23 +0100 +Subject: [PATCH] Call PlayerUseBowWithoutProjectileEvent in + Player#getProjectile + + +diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java +index 61d412c4f1ebd55661cc3f0260468e3ac0efe0bb..6cf27e4e95b6b73212236ce739dc2514ea8dbab4 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Player.java ++++ b/src/main/java/net/minecraft/world/entity/player/Player.java +@@ -2266,7 +2266,15 @@ public abstract class Player extends LivingEntity { + } + } + +- return this.abilities.instabuild ? new ItemStack(Items.ARROW) : ItemStack.EMPTY; ++ // Paper start - Call PlayerUseBowWithoutProjectileEvent in Player#getProjectile ++ if (this.abilities.instabuild) { ++ return new ItemStack(Items.ARROW); ++ } else { ++ io.papermc.paper.event.player.PlayerUseBowWithoutProjectileEvent event = new io.papermc.paper.event.player.PlayerUseBowWithoutProjectileEvent((org.bukkit.entity.Player) getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(stack)); ++ event.callEvent(); ++ return org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getProjectile()); ++ } ++ // Paper end - Call PlayerUseBowWithoutProjectileEvent in Player#getProjectile + } + } + }