--- a/net/minecraft/world/entity/projectile/ThrownSplashPotion.java +++ b/net/minecraft/world/entity/projectile/ThrownSplashPotion.java @@ -17,6 +17,16 @@ import net.minecraft.world.level.World; import net.minecraft.world.phys.AxisAlignedBB; +// CraftBukkit start +import java.util.HashMap; +import java.util.Map; +import net.minecraft.server.level.EntityPlayer; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.phys.MovingObjectPosition; +import org.bukkit.craftbukkit.entity.CraftLivingEntity; +import org.bukkit.entity.LivingEntity; +// CraftBukkit end + public class ThrownSplashPotion extends EntityPotion { public ThrownSplashPotion(EntityTypes entitytypes, World world) { @@ -37,12 +47,13 @@ } @Override - public void onHitAsPotion(WorldServer worldserver, ItemStack itemstack, @Nullable Entity entity) { + public void onHitAsPotion(WorldServer worldserver, ItemStack itemstack, @Nullable Entity entity, MovingObjectPosition position) { // CraftBukkit - Pass MovingObjectPosition PotionContents potioncontents = (PotionContents) itemstack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); float f = (Float) itemstack.getOrDefault(DataComponents.POTION_DURATION_SCALE, 1.0F); Iterable iterable = potioncontents.getAllEffects(); AxisAlignedBB axisalignedbb = this.getBoundingBox().inflate(4.0D, 2.0D, 4.0D); List list = this.level().getEntitiesOfClass(EntityLiving.class, axisalignedbb); + Map affected = new HashMap(); // CraftBukkit if (!list.isEmpty()) { Entity entity1 = this.getEffectSource(); @@ -60,8 +71,38 @@ d1 = 1.0D - Math.sqrt(d0) / 4.0D; } + // CraftBukkit start + affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); + } + } + } + } + + { + { + org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, position, affected); + if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process + Entity entity1 = this.getEffectSource(); + for (LivingEntity victim : event.getAffectedEntities()) { + if (!(victim instanceof CraftLivingEntity)) { + continue; + } + + EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); + double d1 = event.getIntensity(victim); + // CraftBukkit end + for (MobEffect mobeffect : iterable) { Holder holder = mobeffect.getEffect(); + // CraftBukkit start - Abide by PVP settings - for players only! + if (!this.level().pvpMode && this.getOwner() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getOwner()) { + MobEffectList mobeffectlist = (MobEffectList) holder.value(); + if (mobeffectlist == MobEffects.SLOWNESS || mobeffectlist == MobEffects.MINING_FATIGUE || mobeffectlist == MobEffects.INSTANT_DAMAGE || mobeffectlist == MobEffects.BLINDNESS + || mobeffectlist == MobEffects.HUNGER || mobeffectlist == MobEffects.WEAKNESS || mobeffectlist == MobEffects.POISON) { + continue; + } + } + // CraftBukkit end if (((MobEffectList) holder.value()).isInstantenous()) { ((MobEffectList) holder.value()).applyInstantenousEffect(worldserver, this, this.getOwner(), entityliving, mobeffect.getAmplifier(), d1); @@ -72,7 +113,7 @@ MobEffect mobeffect1 = new MobEffect(holder, i, mobeffect.getAmplifier(), mobeffect.isAmbient(), mobeffect.isVisible()); if (!mobeffect1.endsWithin(20)) { - entityliving.addEffect(mobeffect1, entity1); + entityliving.addEffect(mobeffect1, entity1, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.POTION_SPLASH); // CraftBukkit } } }