Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions patches/api/0501-Added-PlayerUseBowWithoutProjectileEvent.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Chaosdave34 <david.emanuel@gmx.de>
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
+ * <p>
+ * 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;
+ }
+}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Chaosdave34 <david.emanuel@gmx.de>
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
}
}
}
Loading