When a splash potion has no applicable effects we currently do not call PotionSplashEvent. This means plugins are unable to make custom potions with reliable splash handling as they have to relicate the functionality themselves. With this commit we simply make the event fire regardless of the effects on the potion.
158 lines
5.8 KiB
Java
158 lines
5.8 KiB
Java
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 g() {
|
|
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<LivingEntity, Double> affected = new HashMap<LivingEntity, Double>();
|
|
|
|
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()));
|
|
}
|
|
}
|
|
}
|