From e974230ed76da6273e7db75bb3fbefb098a173b7 Mon Sep 17 00:00:00 2001 From: Dueris Date: Sat, 14 Feb 2026 14:03:47 -0800 Subject: [PATCH 1/3] Add EntityLungeEvent --- .../paper/event/entity/EntityLungeEvent.java | 47 +++++++++++++++++++ .../world/entity/LivingEntity.java.patch | 9 ++++ 2 files changed, 56 insertions(+) create mode 100644 paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java diff --git a/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java b/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java new file mode 100644 index 000000000000..f3e7146fdb3c --- /dev/null +++ b/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java @@ -0,0 +1,47 @@ +package io.papermc.paper.event.entity; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.entity.EntityEvent; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Called when a living entity tries to lunge with a spear + */ +@NullMarked +public class EntityLungeEvent extends EntityEvent implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private boolean cancelled; + + @ApiStatus.Internal + public EntityLungeEvent(final LivingEntity entity) { + super(entity); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + /** + * Set whether to cancel the lunge. If canceled, the living entity will not lunge forward + * @param cancel {@code true} if you wish to cancel this event + */ + @Override + public void setCancelled(final boolean cancel) { + this.cancelled = cancel; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } +} diff --git a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch index e763a6ef5cad..90e93823b173 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch @@ -1007,6 +1007,15 @@ } } +@@ -1668,7 +_,7 @@ + } + + public void lungeForwardMaybe() { +- if (this.level() instanceof ServerLevel serverLevel) { ++ if (this.level() instanceof ServerLevel serverLevel && new io.papermc.paper.event.entity.EntityLungeEvent(getBukkitLivingEntity()).callEvent()) { // Paper - EntityLungeEvent + EnchantmentHelper.doLungeEffects(serverLevel, this); + } + } @@ -1712,7 +_,7 @@ @Override From d6222af57a1b1cebfea63ee6c4c7a0a385a8f3bc Mon Sep 17 00:00:00 2001 From: Dueris Date: Wed, 18 Feb 2026 23:33:35 -0800 Subject: [PATCH 2/3] Cleanup EntityLungeEvent --- .../paper/event/entity/EntityLungeEvent.java | 25 ++++++++++++++++++- .../world/entity/LivingEntity.java.patch | 9 ------- .../item/enchantment/Enchantment.java.patch | 22 ++++++++++++++++ 3 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 paper-server/patches/sources/net/minecraft/world/item/enchantment/Enchantment.java.patch diff --git a/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java b/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java index f3e7146fdb3c..ddb805a7e2df 100644 --- a/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java +++ b/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java @@ -15,11 +15,34 @@ public class EntityLungeEvent extends EntityEvent implements Cancellable { private static final HandlerList HANDLER_LIST = new HandlerList(); + private int lungePower; + private boolean cancelled; @ApiStatus.Internal - public EntityLungeEvent(final LivingEntity entity) { + public EntityLungeEvent(final LivingEntity entity, int lungePower) { super(entity); + this.lungePower = lungePower; + } + + /** + * Gets the lunge power, which when initially passed, matches the enchantment level of the item, but can be higher. + * + * @return the lunge power + */ + public int getLungePower() { + return lungePower; + } + + /** + * Sets the lunge power. This commonly matches the enchantment level of the item, and can be set higher. + *

+ * If set higher than 3, the power of the lunge will continue to scale like normal, as if the max enchantment + * level is higher. + * @param lungePower the new lunge power + */ + public void setLungePower(final int lungePower) { + this.lungePower = lungePower; } @Override diff --git a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch index 90e93823b173..e763a6ef5cad 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch @@ -1007,15 +1007,6 @@ } } -@@ -1668,7 +_,7 @@ - } - - public void lungeForwardMaybe() { -- if (this.level() instanceof ServerLevel serverLevel) { -+ if (this.level() instanceof ServerLevel serverLevel && new io.papermc.paper.event.entity.EntityLungeEvent(getBukkitLivingEntity()).callEvent()) { // Paper - EntityLungeEvent - EnchantmentHelper.doLungeEffects(serverLevel, this); - } - } @@ -1712,7 +_,7 @@ @Override diff --git a/paper-server/patches/sources/net/minecraft/world/item/enchantment/Enchantment.java.patch b/paper-server/patches/sources/net/minecraft/world/item/enchantment/Enchantment.java.patch new file mode 100644 index 000000000000..b96baf3f764e --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/item/enchantment/Enchantment.java.patch @@ -0,0 +1,22 @@ +--- a/net/minecraft/world/item/enchantment/Enchantment.java ++++ b/net/minecraft/world/item/enchantment/Enchantment.java +@@ -317,7 +_,18 @@ + applyEffects( + this.getEffects(EnchantmentEffectComponents.POST_PIERCING_ATTACK), + entityContext(level, enchantmentLevel, entity, entity.position()), +- enchantmentEntityEffect -> enchantmentEntityEffect.apply(level, enchantmentLevel, item, entity, entity.position()) ++ // Paper start - EntityLungeEvent ++ enchantmentEntityEffect -> { ++ io.papermc.paper.event.entity.EntityLungeEvent entityLungeEvent = new io.papermc.paper.event.entity.EntityLungeEvent( ++ entity.asLivingEntity().getBukkitLivingEntity(), enchantmentLevel ++ ); ++ if (!entityLungeEvent.callEvent()) { ++ // event was canceled ++ return; ++ } ++ enchantmentEntityEffect.apply(level, entityLungeEvent.getLungePower(), item, entity, entity.position()); ++ } ++ // Paper end - EntityLungeEvent + ); + } + From 00cb6f0df17e7966581d72bf7fd01c7c131fd3ea Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:01:32 +0100 Subject: [PATCH 3/3] minor nitpick --- .../java/io/papermc/paper/event/entity/EntityLungeEvent.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java b/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java index ddb805a7e2df..45ba8972fc3e 100644 --- a/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java +++ b/paper-api/src/main/java/io/papermc/paper/event/entity/EntityLungeEvent.java @@ -16,7 +16,6 @@ public class EntityLungeEvent extends EntityEvent implements Cancellable { private static final HandlerList HANDLER_LIST = new HandlerList(); private int lungePower; - private boolean cancelled; @ApiStatus.Internal @@ -51,7 +50,7 @@ public boolean isCancelled() { } /** - * Set whether to cancel the lunge. If canceled, the living entity will not lunge forward + * Set whether to cancel the lunge. If cancelled, the living entity will not lunge forward. * @param cancel {@code true} if you wish to cancel this event */ @Override