package net.minecraft.server; import java.util.Iterator; import java.util.List; // CraftBukkit start import java.util.HashMap; import org.bukkit.craftbukkit.entity.CraftLivingEntity; import org.bukkit.entity.LivingEntity; // CraftBukkit end public class EntityPotion extends EntityProjectile { public ItemStack c; // CraftBukkit private --> public public EntityPotion(World world) { super(world); } public EntityPotion(World world, EntityLiving entityliving, int i) { this(world, entityliving, new ItemStack(Item.POTION, 1, i)); } public EntityPotion(World world, EntityLiving entityliving, ItemStack itemstack) { super(world, entityliving); this.c = itemstack; } public EntityPotion(World world, double d0, double d1, double d2, ItemStack itemstack) { super(world, d0, d1, d2); this.c = itemstack; } protected float e() { return 0.05F; } protected float c() { return 0.5F; } protected float d() { return -20.0F; } public void setPotionValue(int i) { if (this.c == null) { this.c = new ItemStack(Item.POTION, 1, 0); } this.c.setData(i); } public int getPotionValue() { if (this.c == null) { this.c = new ItemStack(Item.POTION, 1, 0); } return this.c.getData(); } protected void a(MovingObjectPosition movingobjectposition) { if (!this.world.isStatic) { List list = Item.POTION.g(this.c); if (true || list != null && !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply AxisAlignedBB axisalignedbb = this.boundingBox.grow(4.0D, 2.0D, 4.0D); List list1 = this.world.a(EntityLiving.class, axisalignedbb); if (list1 != null) { // CraftBukkit - Run code even if there are no entities around Iterator iterator = list1.iterator(); // CraftBukkit HashMap affected = new HashMap(); while (iterator.hasNext()) { EntityLiving entityliving = (EntityLiving) iterator.next(); double d0 = this.e(entityliving); if (d0 < 16.0D) { double d1 = 1.0D - Math.sqrt(d0) / 4.0D; if (entityliving == movingobjectposition.entity) { d1 = 1.0D; } // CraftBukkit start affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); } } org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, affected); if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process for (LivingEntity victim : event.getAffectedEntities()) { if (!(victim instanceof CraftLivingEntity)) { continue; } EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); double d1 = event.getIntensity(victim); // CraftBukkit end Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { MobEffect mobeffect = (MobEffect) iterator1.next(); int i = mobeffect.getEffectId(); // CraftBukkit start - Abide by PVP settings - for players only! if (!this.world.pvpMode && this.getShooter() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getShooter()) { // Block SLOWER_MOVEMENT, SLOWER_DIG, HARM, BLINDNESS, HUNGER, WEAKNESS and POISON potions if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18 || i == 19) continue; } // CraftBukkit end if (MobEffectList.byId[i].isInstant()) { // CraftBukkit - Added 'this' MobEffectList.byId[i].applyInstantEffect(this.getShooter(), entityliving, mobeffect.getAmplifier(), d1, this); } else { int j = (int) (d1 * (double) mobeffect.getDuration() + 0.5D); if (j > 20) { entityliving.addEffect(new MobEffect(i, j, mobeffect.getAmplifier())); } } } } } } } this.world.triggerEffect(2002, (int) Math.round(this.locX), (int) Math.round(this.locY), (int) Math.round(this.locZ), this.getPotionValue()); this.die(); } } public void a(NBTTagCompound nbttagcompound) { super.a(nbttagcompound); if (nbttagcompound.hasKey("Potion")) { this.c = ItemStack.createStack(nbttagcompound.getCompound("Potion")); } else { this.setPotionValue(nbttagcompound.getInt("potionValue")); } if (this.c == null) { this.die(); } } public void b(NBTTagCompound nbttagcompound) { super.b(nbttagcompound); if (this.c != null) { nbttagcompound.setCompound("Potion", this.c.save(new NBTTagCompound())); } } }