From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Thu, 20 May 2021 20:40:53 -0700 Subject: [PATCH] Fix PotionSplashEvent for water splash potions Fixes SPIGOT-6221: https://hub.spigotmc.org/jira/projects/SPIGOT/issues/SPIGOT-6221 diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java @@ -0,0 +0,0 @@ public class DamageSource { return (new IndirectEntityDamageSource("thrown", projectile, attacker)).setProjectile(); } + public static DamageSource indirectMagic(Entity target, Entity cause) { return indirectMagic(target, cause); } // Paper - OBFHELPER public static DamageSource indirectMagic(Entity magic, @Nullable Entity attacker) { return (new IndirectEntityDamageSource("indirectMagic", magic, attacker)).bypassArmor().setMagic(); } diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java @@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile { private void applyWater() { AABB axisalignedbb = this.getBoundingBox().inflate(4.0D, 2.0D, 4.0D); List list = this.level.getEntitiesOfClass(net.minecraft.world.entity.LivingEntity.class, axisalignedbb, ThrownPotion.WATER_SENSITIVE); + Map affected = new HashMap<>(); // Paper if (!list.isEmpty()) { Iterator iterator = list.iterator(); @@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile { double d0 = this.distanceToSqr(entityliving); if (d0 < 16.0D && entityliving.isSensitiveToWater()) { - entityliving.hurt(DamageSource.indirectMagic(entityliving, this.getOwner()), 1.0F); + // Paper start + double intensity = 1.0D - Math.sqrt(d0) / 4.0D; + affected.put(entityliving.getBukkitLivingEntity(), intensity); + // entityliving.damageEntity(DamageSource.c(entityliving, this.getShooter()), 1.0F); // Paper - moved down } } } + org.bukkit.event.entity.PotionSplashEvent event = CraftEventFactory.callPotionSplashEvent(this, affected); + if (!event.isCancelled()) { + for (LivingEntity affectedEntity : event.getAffectedEntities()) { + net.minecraft.world.entity.LivingEntity entityliving = ((CraftLivingEntity) affectedEntity).getHandle(); + entityliving.hurt(DamageSource.indirectMagic(entityliving, this.getOwner()), 1.0F); + } + } + // Paper end } private void applySplash(List statusEffects, @Nullable Entity entity) { @@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile { double d0 = this.distanceToSqr(entityliving); if (d0 < 16.0D) { + // Paper - diff on change, used when calling the splash event for water splash potions double d1 = 1.0D - Math.sqrt(d0) / 4.0D; if (entityliving == entity) {