diff --git a/Spigot-API-Patches/0251-Add-EntityLoadCrossbowEvent.patch b/Spigot-API-Patches/0251-Add-EntityLoadCrossbowEvent.patch new file mode 100644 index 0000000000..b96905bcd8 --- /dev/null +++ b/Spigot-API-Patches/0251-Add-EntityLoadCrossbowEvent.patch @@ -0,0 +1,96 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: JRoy +Date: Wed, 7 Oct 2020 12:04:17 -0400 +Subject: [PATCH] Add EntityLoadCrossbowEvent + + +diff --git a/src/main/java/io/papermc/paper/event/entity/EntityLoadCrossbowEvent.java b/src/main/java/io/papermc/paper/event/entity/EntityLoadCrossbowEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..8ba1c04af4058e70bf5925b9ccd36c3c8f8f8250 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/event/entity/EntityLoadCrossbowEvent.java +@@ -0,0 +1,84 @@ ++package io.papermc.paper.event.entity; ++ ++import org.bukkit.entity.LivingEntity; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.entity.EntityEvent; ++import org.bukkit.inventory.EquipmentSlot; ++import org.bukkit.inventory.ItemStack; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++/** ++ * Called when a LivingEntity loads a crossbow with a projectile. ++ */ ++public class EntityLoadCrossbowEvent extends EntityEvent implements Cancellable { ++ private static final HandlerList handlers = new HandlerList(); ++ private final ItemStack crossbow; ++ private final EquipmentSlot hand; ++ private boolean cancelled; ++ ++ public EntityLoadCrossbowEvent(@NotNull LivingEntity entity, @Nullable ItemStack crossbow, @NotNull EquipmentSlot hand) { ++ super(entity); ++ this.crossbow = crossbow; ++ this.hand = hand; ++ } ++ ++ @NotNull ++ @Override ++ public LivingEntity getEntity() { ++ return (LivingEntity) entity; ++ } ++ ++ /** ++ * Gets the crossbow {@link ItemStack} being loaded. ++ * ++ * @return the crossbow involved in this event ++ */ ++ @Nullable ++ public ItemStack getCrossbow() { ++ return crossbow; ++ } ++ ++ /** ++ * Gets the hand from which the crossbow was loaded. ++ * ++ * @return the hand ++ */ ++ @NotNull ++ public EquipmentSlot getHand() { ++ return hand; ++ } ++ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ /** ++ * Set whether or not to cancel the crossbow being loaded. If canceled, the ++ * projectile that would be loaded into the crossbow will not be consumed. ++ * ++ * If set to false, and this event is pertaining to a player entity, ++ * it's recommended that a call to {@link Player#updateInventory()} is made ++ * as the client may think the server still loaded an item into the crossbow. ++ * ++ * @param cancel true if you wish to cancel this event ++ */ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancelled = cancel; ++ } ++ ++ @NotNull ++ @Override ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} diff --git a/Spigot-Server-Patches/0636-Add-EntityLoadCrossbowEvent.patch b/Spigot-Server-Patches/0636-Add-EntityLoadCrossbowEvent.patch new file mode 100644 index 0000000000..125bbdaed8 --- /dev/null +++ b/Spigot-Server-Patches/0636-Add-EntityLoadCrossbowEvent.patch @@ -0,0 +1,38 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: JRoy +Date: Wed, 7 Oct 2020 12:04:01 -0400 +Subject: [PATCH] Add EntityLoadCrossbowEvent + + +diff --git a/src/main/java/net/minecraft/server/ItemCrossbow.java b/src/main/java/net/minecraft/server/ItemCrossbow.java +index 14c0e7382292b3d39858d4d957df8016c301c712..9bf5d77db3bca4073867139844fbcdcc4d3f7c83 100644 +--- a/src/main/java/net/minecraft/server/ItemCrossbow.java ++++ b/src/main/java/net/minecraft/server/ItemCrossbow.java +@@ -1,6 +1,7 @@ + package net.minecraft.server; + + import com.google.common.collect.Lists; ++import io.papermc.paper.event.entity.EntityLoadCrossbowEvent; // Paper - EntityLoadCrossbowEvent namespace conflicts + import java.util.List; + import java.util.Random; + import java.util.function.Predicate; +@@ -50,7 +51,10 @@ public class ItemCrossbow extends ItemProjectileWeapon implements ItemVanishable + int j = this.e_(itemstack) - i; + float f = a(j, itemstack); + +- if (f >= 1.0F && !d(itemstack) && a(entityliving, itemstack)) { ++ // Paper start - EntityLoadCrossbowEvent ++ if (f >= 1.0F && !d(itemstack) /*&& a(entityliving, itemstack)*/) { ++ if (!new EntityLoadCrossbowEvent(entityliving.getBukkitLivingEntity(), itemstack.asBukkitMirror(), entityliving.getRaisedHand() == EnumHand.MAIN_HAND ? org.bukkit.inventory.EquipmentSlot.HAND : org.bukkit.inventory.EquipmentSlot.OFF_HAND).callEvent() || !attemptProjectileLoad(entityliving, itemstack)) return; ++ // Paper end + a(itemstack, true); + SoundCategory soundcategory = entityliving instanceof EntityHuman ? SoundCategory.PLAYERS : SoundCategory.HOSTILE; + +@@ -59,6 +63,7 @@ public class ItemCrossbow extends ItemProjectileWeapon implements ItemVanishable + + } + ++ private static boolean attemptProjectileLoad(EntityLiving ent, ItemStack bow) { return a(ent, bow); } // Paper - EntityLoadCrossbowEvent - OBFHELPER + private static boolean a(EntityLiving entityliving, ItemStack itemstack) { + int i = EnchantmentManager.getEnchantmentLevel(Enchantments.MULTISHOT, itemstack); + int j = i == 0 ? 1 : 3;