From c3dd9ac71c8bfab421495c29d955b796ad424c94 Mon Sep 17 00:00:00 2001 From: DragonsAscent Date: Sun, 23 Aug 2026 15:07:33 -0400 Subject: [PATCH 01/14] feat: ProxySpell --- .../magicspells/spells/buff/ProxySpell.java | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java new file mode 100644 index 000000000..362d84f15 --- /dev/null +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -0,0 +1,135 @@ +package com.nisovin.magicspells.spells.buff; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.jetbrains.annotations.NotNull; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +import com.nisovin.magicspells.events.SpellTargetEvent; +import com.nisovin.magicspells.events.SpellPreImpactEvent; +import com.nisovin.magicspells.events.MagicSpellsEntityDamageByEntityEvent; +import com.nisovin.magicspells.spells.BuffSpell; +import com.nisovin.magicspells.spelleffects.EffectPosition; +import com.nisovin.magicspells.util.MagicConfig; +import com.nisovin.magicspells.util.SpellData; + +public class ProxySpell extends BuffSpell implements Listener { + + private final Map proxies; + private final Set redirecting; + + public ProxySpell(MagicConfig config, String spellName) { + super(config, spellName); + + proxies = new HashMap<>(); + redirecting = new HashSet<>(); + } + + @Override + public boolean castBuff(SpellData data) { + proxies.put(data.target().getUniqueId(), data); + return true; + } + + @Override + public boolean recastBuff(SpellData data) { + stopEffects(data.target()); + return castBuff(data); + } + + @Override + public boolean isActive(LivingEntity entity) { + return proxies.containsKey(entity.getUniqueId()); + } + + @Override + public void turnOffBuff(LivingEntity entity) { + proxies.remove(entity.getUniqueId()); + } + + @Override + protected @NotNull Collection getActiveEntities() { + return proxies.keySet(); + } + + @EventHandler(ignoreCancelled = true) + public void onSpellTarget(SpellTargetEvent event) { + LivingEntity target = event.getTarget(); + if (target == null || !target.isValid()) return; + + LivingEntity proxyTarget = getProxyTarget(target); + if (proxyTarget == null) return; + + SpellData subData = event.getSpellData().target(proxyTarget); + playRedirectEffects(target, proxyTarget, subData); + + event.setTarget(proxyTarget); + addUseAndChargeCost(target); + } + + @EventHandler(ignoreCancelled = true) + public void onSpellPreImpact(SpellPreImpactEvent event) { + LivingEntity target = event.getTarget(); + if (target == null || !target.isValid()) return; + + LivingEntity proxyTarget = getProxyTarget(target); + if (proxyTarget == null) return; + + SpellData subData = new SpellData(event.getCaster(), proxyTarget, event.getPower()); + playRedirectEffects(target, proxyTarget, subData); + + event.setRedirected(true); + addUseAndChargeCost(target); + } + + @EventHandler(ignoreCancelled = true) + public void onEntityDamage(EntityDamageByEntityEvent event) { + if (!(event.getEntity() instanceof LivingEntity target) || !target.isValid()) return; + + LivingEntity proxyTarget = getProxyTarget(target); + if (proxyTarget == null) return; + if (!redirecting.add(proxyTarget.getUniqueId())) return; + + SpellData subData = new SpellData(event.getDamager() instanceof LivingEntity damager ? damager : null, proxyTarget); + playRedirectEffects(target, proxyTarget, subData); + + event.setCancelled(true); + try { + proxyTarget.damage(event.getDamage(), event.getDamager()); + addUseAndChargeCost(target); + } finally { + redirecting.remove(proxyTarget.getUniqueId()); + } + } + + @EventHandler(ignoreCancelled = true) + public void onLegacyDamage(MagicSpellsEntityDamageByEntityEvent event) { + onEntityDamage(event); + } + + private LivingEntity getProxyTarget(LivingEntity target) { + SpellData proxyData = proxies.get(target.getUniqueId()); + if (proxyData == null) return null; + + LivingEntity proxyTarget = proxyData.caster(); + if (proxyTarget != null && proxyTarget.isValid()) return proxyTarget; + + turnOff(target); + return null; + } + + private void playRedirectEffects(LivingEntity target, LivingEntity proxyTarget, SpellData data) { + playSpellEffects(EffectPosition.TARGET, target, data); + playSpellEffects(EffectPosition.END_POSITION, proxyTarget, data); + } + +} From 07902ccca1c86f9368ab365714401b34f6991c91 Mon Sep 17 00:00:00 2001 From: Dragon Date: Thu, 27 Aug 2026 03:08:06 -0400 Subject: [PATCH 02/14] Update core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/spells/buff/ProxySpell.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 362d84f15..1c4fcbf39 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -69,10 +69,9 @@ public void onSpellTarget(SpellTargetEvent event) { LivingEntity proxyTarget = getProxyTarget(target); if (proxyTarget == null) return; - SpellData subData = event.getSpellData().target(proxyTarget); - playRedirectEffects(target, proxyTarget, subData); - event.setTarget(proxyTarget); + playRedirectEffects(target, proxyTarget, event.getSpellData()); + addUseAndChargeCost(target); } From 80c59ce3033531775b29de1a9c200058be3dd1bf Mon Sep 17 00:00:00 2001 From: Dragon Date: Thu, 27 Aug 2026 03:08:22 -0400 Subject: [PATCH 03/14] Update core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/spells/buff/ProxySpell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 1c4fcbf39..f4e09734b 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -127,7 +127,7 @@ private LivingEntity getProxyTarget(LivingEntity target) { } private void playRedirectEffects(LivingEntity target, LivingEntity proxyTarget, SpellData data) { - playSpellEffects(EffectPosition.TARGET, target, data); + playSpellEffects(EffectPosition.START_POSITION, target, data); playSpellEffects(EffectPosition.END_POSITION, proxyTarget, data); } From eaee89b532aaa69d35489ce4dd0cb9fa53badcda Mon Sep 17 00:00:00 2001 From: Dragon Date: Thu, 27 Aug 2026 03:08:56 -0400 Subject: [PATCH 04/14] Update core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/spells/buff/ProxySpell.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index f4e09734b..6267dee9e 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -43,6 +43,7 @@ public boolean castBuff(SpellData data) { @Override public boolean recastBuff(SpellData data) { stopEffects(data.target()); + turnOffBuff(data.target()); return castBuff(data); } From 808204cded3bcc95acea86a774001b70db780bd8 Mon Sep 17 00:00:00 2001 From: Dragon Date: Thu, 27 Aug 2026 03:10:01 -0400 Subject: [PATCH 05/14] Update core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/spells/buff/ProxySpell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 6267dee9e..89c9955a0 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -104,7 +104,7 @@ public void onEntityDamage(EntityDamageByEntityEvent event) { event.setCancelled(true); try { - proxyTarget.damage(event.getDamage(), event.getDamager()); + proxyTarget.damage(event.getDamage(), event.getDamageSource()); addUseAndChargeCost(target); } finally { redirecting.remove(proxyTarget.getUniqueId()); From cdb4acbccf01627a6d5dc3279059450ca9c9d081 Mon Sep 17 00:00:00 2001 From: Dragon Date: Thu, 27 Aug 2026 03:10:35 -0400 Subject: [PATCH 06/14] Update core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java Co-authored-by: JasperLorelai --- .../com/nisovin/magicspells/spells/buff/ProxySpell.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 89c9955a0..f5a4f814e 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -110,12 +110,6 @@ public void onEntityDamage(EntityDamageByEntityEvent event) { redirecting.remove(proxyTarget.getUniqueId()); } } - - @EventHandler(ignoreCancelled = true) - public void onLegacyDamage(MagicSpellsEntityDamageByEntityEvent event) { - onEntityDamage(event); - } - private LivingEntity getProxyTarget(LivingEntity target) { SpellData proxyData = proxies.get(target.getUniqueId()); if (proxyData == null) return null; From b639531c16d208dac01428acb97373c09599fb19 Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Fri, 28 Aug 2026 07:04:46 +0200 Subject: [PATCH 07/14] Update core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java --- .../com/nisovin/magicspells/spells/buff/ProxySpell.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index f5a4f814e..0dc432550 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -24,14 +24,11 @@ public class ProxySpell extends BuffSpell implements Listener { - private final Map proxies; - private final Set redirecting; + private final Set redirecting = new HashSet<>(); + private final Map proxies = new HashMap<>(); public ProxySpell(MagicConfig config, String spellName) { super(config, spellName); - - proxies = new HashMap<>(); - redirecting = new HashSet<>(); } @Override From 1d970fb3bd51364b7481aeaf2c5e809c86299dc6 Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Fri, 28 Aug 2026 08:59:08 +0200 Subject: [PATCH 08/14] refactor: Sort imports --- .../magicspells/spells/buff/ProxySpell.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 0dc432550..a5324f366 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -1,28 +1,26 @@ package com.nisovin.magicspells.spells.buff; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Collection; import org.jetbrains.annotations.NotNull; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.Listener; import org.bukkit.event.EventHandler; +import org.bukkit.entity.LivingEntity; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import com.nisovin.magicspells.util.SpellData; +import com.nisovin.magicspells.spells.BuffSpell; +import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.events.SpellTargetEvent; import com.nisovin.magicspells.events.SpellPreImpactEvent; -import com.nisovin.magicspells.events.MagicSpellsEntityDamageByEntityEvent; -import com.nisovin.magicspells.spells.BuffSpell; import com.nisovin.magicspells.spelleffects.EffectPosition; -import com.nisovin.magicspells.util.MagicConfig; -import com.nisovin.magicspells.util.SpellData; -public class ProxySpell extends BuffSpell implements Listener { +public class ProxySpell extends BuffSpell { private final Set redirecting = new HashSet<>(); private final Map proxies = new HashMap<>(); @@ -107,6 +105,7 @@ public void onEntityDamage(EntityDamageByEntityEvent event) { redirecting.remove(proxyTarget.getUniqueId()); } } + private LivingEntity getProxyTarget(LivingEntity target) { SpellData proxyData = proxies.get(target.getUniqueId()); if (proxyData == null) return null; From 8970abacc9369f23cabb82f19bdeaed68b0b9074 Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Fri, 28 Aug 2026 07:06:14 +0200 Subject: [PATCH 09/14] fix: Increase priority --- .../java/com/nisovin/magicspells/spells/buff/ProxySpell.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index a5324f366..95fa65100 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -11,6 +11,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByEntityEvent; import com.nisovin.magicspells.util.SpellData; @@ -86,7 +87,7 @@ public void onSpellPreImpact(SpellPreImpactEvent event) { addUseAndChargeCost(target); } - @EventHandler(ignoreCancelled = true) + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onEntityDamage(EntityDamageByEntityEvent event) { if (!(event.getEntity() instanceof LivingEntity target) || !target.isValid()) return; From 0e01c96613f2031e3ea79543c2fa8b68ec816808 Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Fri, 28 Aug 2026 07:35:25 +0200 Subject: [PATCH 10/14] fix: Check if buff is active for the event-entity --- .../com/nisovin/magicspells/spells/buff/ProxySpell.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 95fa65100..2ee94324f 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -61,7 +61,7 @@ public void turnOffBuff(LivingEntity entity) { @EventHandler(ignoreCancelled = true) public void onSpellTarget(SpellTargetEvent event) { LivingEntity target = event.getTarget(); - if (target == null || !target.isValid()) return; + if (target == null || !isActive(target)) return; LivingEntity proxyTarget = getProxyTarget(target); if (proxyTarget == null) return; @@ -75,7 +75,7 @@ public void onSpellTarget(SpellTargetEvent event) { @EventHandler(ignoreCancelled = true) public void onSpellPreImpact(SpellPreImpactEvent event) { LivingEntity target = event.getTarget(); - if (target == null || !target.isValid()) return; + if (target == null || !isActive(target)) return; LivingEntity proxyTarget = getProxyTarget(target); if (proxyTarget == null) return; @@ -89,7 +89,7 @@ public void onSpellPreImpact(SpellPreImpactEvent event) { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onEntityDamage(EntityDamageByEntityEvent event) { - if (!(event.getEntity() instanceof LivingEntity target) || !target.isValid()) return; + if (!(event.getEntity() instanceof LivingEntity target) || !isActive(target)) return; LivingEntity proxyTarget = getProxyTarget(target); if (proxyTarget == null) return; From 7c96a577e738f60cf0af56785ff42babb90e4414 Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Fri, 28 Aug 2026 07:38:23 +0200 Subject: [PATCH 11/14] refactor: Store Entity instead of SpellData --- .../com/nisovin/magicspells/spells/buff/ProxySpell.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 2ee94324f..a64e09ff5 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -24,7 +24,7 @@ public class ProxySpell extends BuffSpell { private final Set redirecting = new HashSet<>(); - private final Map proxies = new HashMap<>(); + private final Map proxies = new HashMap<>(); public ProxySpell(MagicConfig config, String spellName) { super(config, spellName); @@ -32,7 +32,7 @@ public ProxySpell(MagicConfig config, String spellName) { @Override public boolean castBuff(SpellData data) { - proxies.put(data.target().getUniqueId(), data); + proxies.put(data.target().getUniqueId(), data.caster()); return true; } @@ -108,10 +108,7 @@ public void onEntityDamage(EntityDamageByEntityEvent event) { } private LivingEntity getProxyTarget(LivingEntity target) { - SpellData proxyData = proxies.get(target.getUniqueId()); - if (proxyData == null) return null; - - LivingEntity proxyTarget = proxyData.caster(); + LivingEntity proxyTarget = proxies.get(target.getUniqueId()); if (proxyTarget != null && proxyTarget.isValid()) return proxyTarget; turnOff(target); From 350167f115eafc5394247345af27d92b69ed2460 Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Fri, 28 Aug 2026 08:03:36 +0200 Subject: [PATCH 12/14] fix: Remove duplicate --- .../magicspells/spells/buff/ProxySpell.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index a64e09ff5..556c115a5 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -18,7 +18,6 @@ import com.nisovin.magicspells.spells.BuffSpell; import com.nisovin.magicspells.util.MagicConfig; import com.nisovin.magicspells.events.SpellTargetEvent; -import com.nisovin.magicspells.events.SpellPreImpactEvent; import com.nisovin.magicspells.spelleffects.EffectPosition; public class ProxySpell extends BuffSpell { @@ -72,21 +71,6 @@ public void onSpellTarget(SpellTargetEvent event) { addUseAndChargeCost(target); } - @EventHandler(ignoreCancelled = true) - public void onSpellPreImpact(SpellPreImpactEvent event) { - LivingEntity target = event.getTarget(); - if (target == null || !isActive(target)) return; - - LivingEntity proxyTarget = getProxyTarget(target); - if (proxyTarget == null) return; - - SpellData subData = new SpellData(event.getCaster(), proxyTarget, event.getPower()); - playRedirectEffects(target, proxyTarget, subData); - - event.setRedirected(true); - addUseAndChargeCost(target); - } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onEntityDamage(EntityDamageByEntityEvent event) { if (!(event.getEntity() instanceof LivingEntity target) || !isActive(target)) return; From d0c638e1f793da0a3a2545f720b441d632e591bd Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Fri, 28 Aug 2026 08:04:57 +0200 Subject: [PATCH 13/14] fix: Prevent same entity --- .../java/com/nisovin/magicspells/spells/buff/ProxySpell.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 556c115a5..141da8511 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -31,6 +31,7 @@ public ProxySpell(MagicConfig config, String spellName) { @Override public boolean castBuff(SpellData data) { + if (data.target().equals(data.caster())) return false; proxies.put(data.target().getUniqueId(), data.caster()); return true; } From e49078b4f2441ca7f762bfef2d8bf589313efca5 Mon Sep 17 00:00:00 2001 From: Dragon Date: Fri, 28 Aug 2026 13:24:39 -0400 Subject: [PATCH 14/14] Update core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/spells/buff/ProxySpell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java index 141da8511..cc8499881 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ProxySpell.java @@ -85,7 +85,7 @@ public void onEntityDamage(EntityDamageByEntityEvent event) { event.setCancelled(true); try { - proxyTarget.damage(event.getDamage(), event.getDamageSource()); + proxyTarget.damage(event.getFinalDamage(), event.getDamageSource()); addUseAndChargeCost(target); } finally { redirecting.remove(proxyTarget.getUniqueId());