SPIGOT-4571: EntityCombustEvent not firing for phantoms

This commit is contained in:
md_5 2019-01-09 20:38:37 +11:00
parent 9dc56581e6
commit 438556243d
5 changed files with 75 additions and 125 deletions

View file

@ -184,7 +184,7 @@
this.av();
this.r();
@@ -337,7 +470,23 @@
@@ -337,12 +470,44 @@
protected void burnFromLava() {
if (!this.fireProof) {
@ -199,17 +199,38 @@
+ this.world.getServer().getPluginManager().callEvent(combustEvent);
+
+ if (!combustEvent.isCancelled()) {
+ this.setOnFire(combustEvent.getDuration());
+ this.setOnFire(combustEvent.getDuration(), false);
+ }
+ } else {
+ // This will be called every single tick the entity is in lava, so don't throw an event
+ this.setOnFire(15);
+ this.setOnFire(15, false);
+ }
+ // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls
this.damageEntity(DamageSource.LAVA, 4.0F);
}
}
@@ -503,7 +652,7 @@
public void setOnFire(int i) {
+ // CraftBukkit start
+ this.setOnFire(i, true);
+ }
+
+ public void setOnFire(int i, boolean callEvent) {
+ if (callEvent) {
+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), i);
+ this.world.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ return;
+ }
+
+ i = event.getDuration();
+ }
+ // CraftBukkit end
int j = i * 20;
if (this instanceof EntityLiving) {
@@ -503,7 +668,7 @@
}
}
@ -218,7 +239,7 @@
double d11;
if (this.Q > 0.0F && flag && (d7 != d0 || d9 != d2)) {
@@ -590,7 +739,7 @@
@@ -590,7 +755,7 @@
this.world.methodProfiler.enter("rest");
this.recalcPosition();
this.positionChanged = d7 != d0 || d9 != d2;
@ -227,7 +248,7 @@
this.onGround = this.C && d8 < 0.0D;
this.D = this.positionChanged || this.C;
int k = MathHelper.floor(this.locX);
@@ -625,6 +774,28 @@
@@ -625,6 +790,28 @@
block1.a((IBlockAccess) this.world, this);
}
@ -256,7 +277,7 @@
if (this.playStepSound() && (!this.onGround || !this.isSneaking() || !(this instanceof EntityHuman)) && !this.isPassenger()) {
double d22 = this.locX - d4;
double d23 = this.locY - d5;
@@ -676,7 +847,14 @@
@@ -676,7 +863,14 @@
if (!flag1) {
++this.fireTicks;
if (this.fireTicks == 0) {
@ -272,7 +293,7 @@
}
}
@@ -704,6 +882,7 @@
@@ -704,6 +898,7 @@
this.locX = (axisalignedbb.minX + axisalignedbb.maxX) / 2.0D;
this.locY = axisalignedbb.minY;
this.locZ = (axisalignedbb.minZ + axisalignedbb.maxZ) / 2.0D;
@ -280,7 +301,7 @@
}
protected SoundEffect ad() {
@@ -874,7 +1053,7 @@
@@ -874,7 +1069,7 @@
return null;
}
@ -289,7 +310,7 @@
if (!this.fireProof) {
this.damageEntity(DamageSource.FIRE, (float) i);
}
@@ -1093,6 +1272,13 @@
@@ -1093,6 +1288,13 @@
}
public void spawnIn(World world) {
@ -303,7 +324,7 @@
this.world = world;
}
@@ -1118,6 +1304,7 @@
@@ -1118,6 +1320,7 @@
this.lastYaw -= 360.0F;
}
@ -311,7 +332,7 @@
this.setPosition(this.locX, this.locY, this.locZ);
this.setYawPitch(f, f1);
}
@@ -1300,7 +1487,7 @@
@@ -1300,7 +1503,7 @@
public boolean c(NBTTagCompound nbttagcompound) {
String s = this.getSaveID();
@ -320,7 +341,7 @@
nbttagcompound.setString("id", s);
this.save(nbttagcompound);
return true;
@@ -1317,6 +1504,18 @@
@@ -1317,6 +1520,18 @@
try {
nbttagcompound.set("Pos", this.a(this.locX, this.locY, this.locZ));
nbttagcompound.set("Motion", this.a(this.motX, this.motY, this.motZ));
@ -339,7 +360,7 @@
nbttagcompound.set("Rotation", this.a(this.yaw, this.pitch));
nbttagcompound.setFloat("FallDistance", this.fallDistance);
nbttagcompound.setShort("Fire", (short) this.fireTicks);
@@ -1326,6 +1525,12 @@
@@ -1326,6 +1541,12 @@
nbttagcompound.setBoolean("Invulnerable", this.invulnerable);
nbttagcompound.setInt("PortalCooldown", this.portalCooldown);
nbttagcompound.a("UUID", this.getUniqueID());
@ -352,7 +373,7 @@
IChatBaseComponent ichatbasecomponent = this.getCustomName();
if (ichatbasecomponent != null) {
@@ -1402,6 +1607,8 @@
@@ -1402,6 +1623,8 @@
this.motX = nbttaglist1.k(0);
this.motY = nbttaglist1.k(1);
this.motZ = nbttaglist1.k(2);
@ -361,7 +382,7 @@
if (Math.abs(this.motX) > 10.0D) {
this.motX = 0.0D;
}
@@ -1413,6 +1620,7 @@
@@ -1413,6 +1636,7 @@
if (Math.abs(this.motZ) > 10.0D) {
this.motZ = 0.0D;
}
@ -369,7 +390,7 @@
this.locX = nbttaglist.k(0);
this.locY = nbttaglist.k(1);
@@ -1469,6 +1677,56 @@
@@ -1469,6 +1693,56 @@
this.setPosition(this.locX, this.locY, this.locZ);
}
@ -426,7 +447,7 @@
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded");
@@ -1542,9 +1800,22 @@
@@ -1542,9 +1816,22 @@
if (itemstack.isEmpty()) {
return null;
} else {
@ -449,7 +470,7 @@
this.world.addEntity(entityitem);
return entityitem;
}
@@ -1656,7 +1927,7 @@
@@ -1656,7 +1943,7 @@
}
this.vehicle = entity;
@ -458,7 +479,7 @@
return true;
}
}
@@ -1677,15 +1948,33 @@
@@ -1677,15 +1964,33 @@
Entity entity = this.vehicle;
this.vehicle = null;
@ -494,7 +515,7 @@
if (!this.world.isClientSide && entity instanceof EntityHuman && !(this.bO() instanceof EntityHuman)) {
this.passengers.add(0, entity);
} else {
@@ -1693,15 +1982,33 @@
@@ -1693,15 +1998,33 @@
}
}
@ -529,7 +550,7 @@
}
protected boolean q(Entity entity) {
@@ -1798,6 +2105,13 @@
@@ -1798,6 +2121,13 @@
}
public void setSwimming(boolean flag) {
@ -543,7 +564,7 @@
this.setFlag(4, flag);
}
@@ -1858,16 +2172,53 @@
@@ -1858,16 +2188,53 @@
}
public void setAirTicks(int i) {
@ -600,7 +621,7 @@
}
public void j(boolean flag) {
@@ -2034,19 +2385,72 @@
@@ -2034,19 +2401,72 @@
if (!this.world.isClientSide && !this.dead) {
this.world.methodProfiler.enter("changeDimension");
MinecraftServer minecraftserver = this.bK();
@ -676,7 +697,7 @@
BlockPosition blockposition;
if (dimensionmanager == DimensionManager.THE_END) {
@@ -2075,12 +2479,18 @@
@@ -2075,12 +2495,18 @@
blockposition = new BlockPosition(this);
}
@ -696,7 +717,7 @@
if (dimensionmanager1 == DimensionManager.THE_END && dimensionmanager == DimensionManager.THE_END) {
BlockPosition blockposition1 = worldserver1.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver1.getSpawn());
@@ -2088,6 +2498,7 @@
@@ -2088,6 +2514,7 @@
} else {
entity.setPositionRotation(blockposition, entity.yaw, entity.pitch);
}
@ -704,7 +725,7 @@
boolean flag = entity.attachedToPlayer;
@@ -2095,13 +2506,21 @@
@@ -2095,13 +2522,21 @@
worldserver1.addEntity(entity);
entity.attachedToPlayer = flag;
worldserver1.entityJoinedWorld(entity, false);
@ -727,7 +748,7 @@
return entity;
} else {
return null;
@@ -2241,7 +2660,26 @@
@@ -2241,7 +2676,26 @@
}
public void a(AxisAlignedBB axisalignedbb) {

View file

@ -1,20 +1,19 @@
--- a/net/minecraft/server/EntityArrow.java
+++ b/net/minecraft/server/EntityArrow.java
@@ -7,6 +7,13 @@
@@ -7,6 +7,12 @@
import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.event.entity.EntityCombustByEntityEvent;
+import org.bukkit.event.entity.EntityCombustEvent;
+import org.bukkit.event.player.PlayerPickupArrowEvent;
+// CraftBukkit end
+
public abstract class EntityArrow extends Entity implements IProjectile {
private static final Predicate<Entity> g = IEntitySelector.f.and(IEntitySelector.a.and(Entity::isInteractable));
@@ -22,7 +29,7 @@
@@ -22,7 +28,7 @@
public EntityArrow.PickupStatus fromPlayer;
public int shake;
public UUID shooter;
@ -23,7 +22,7 @@
private int aB;
private double damage;
public int knockbackStrength;
@@ -250,6 +257,7 @@
@@ -250,6 +256,7 @@
}
protected void a(MovingObjectPosition movingobjectposition) {
@ -31,7 +30,7 @@
if (movingobjectposition.entity != null) {
this.b(movingobjectposition);
} else {
@@ -299,7 +307,13 @@
@@ -299,7 +306,13 @@
}
if (this.isBurning() && !(entity instanceof EntityEnderman)) {
@ -46,7 +45,7 @@
}
if (entity.damageEntity(damagesource, (float) i)) {
@@ -444,6 +458,7 @@
@@ -444,6 +457,7 @@
public void setShooter(@Nullable Entity entity) {
this.shooter = entity == null ? null : entity.getUniqueID();
@ -54,7 +53,7 @@
}
@Nullable
@@ -453,9 +468,23 @@
@@ -453,9 +467,23 @@
public void d(EntityHuman entityhuman) {
if (!this.world.isClientSide && (this.inGround || this.q()) && this.shake <= 0) {
@ -79,19 +78,3 @@
flag = false;
}
@@ -528,7 +557,14 @@
}
if (EnchantmentManager.a(Enchantments.ARROW_FIRE, entityliving) > 0) {
- this.setOnFire(100);
+ // CraftBukkit start - call EntityCombustEvent
+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 100);
+ this.world.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ this.setOnFire(event.getDuration());
+ }
+ // CraftBukkit end
}
}

View file

@ -1,30 +1,6 @@
--- a/net/minecraft/server/EntitySkeletonAbstract.java
+++ b/net/minecraft/server/EntitySkeletonAbstract.java
@@ -3,6 +3,7 @@
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import javax.annotation.Nullable;
+import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit
public abstract class EntitySkeletonAbstract extends EntityMonster implements IRangedEntity {
@@ -78,7 +79,14 @@
}
if (flag) {
- this.setOnFire(8);
+ // CraftBukkit start
+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8);
+ this.world.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ this.setOnFire(event.getDuration());
+ }
+ // CraftBukkit end
}
}
@@ -151,8 +159,19 @@
@@ -151,8 +151,19 @@
double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2);
entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.world.getDifficulty().a() * 4));

View file

@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityZombie.java
+++ b/net/minecraft/server/EntityZombie.java
@@ -6,6 +6,15 @@
@@ -6,6 +6,14 @@
import java.util.UUID;
import javax.annotation.Nullable;
@ -8,7 +8,6 @@
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.bukkit.event.entity.EntityCombustByEntityEvent;
+import org.bukkit.event.entity.EntityCombustEvent;
+import org.bukkit.event.entity.EntityTargetEvent;
+import org.bukkit.event.entity.EntityTransformEvent;
+// CraftBukkit end
@ -16,7 +15,7 @@
public class EntityZombie extends EntityMonster {
protected static final IAttribute c = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance");
@@ -21,6 +30,7 @@
@@ -21,6 +29,7 @@
public int drownedConversionTime;
private float bK;
private float bL;
@ -24,7 +23,7 @@
public EntityZombie(EntityTypes<?> entitytypes, World world) {
super(entitytypes, world);
@@ -143,8 +153,12 @@
@@ -143,8 +152,12 @@
public void tick() {
if (!this.world.isClientSide) {
@ -39,23 +38,7 @@
if (this.drownedConversionTime < 0) {
this.dE();
}
@@ -182,7 +196,14 @@
}
if (flag) {
- this.setOnFire(8);
+ // CraftBukkit start
+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8);
+ this.world.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ this.setOnFire(event.getDuration());
+ }
+ // CraftBukkit end
}
}
@@ -221,7 +242,12 @@
@@ -221,7 +234,12 @@
entityzombie.setCustomNameVisible(this.getCustomNameVisible());
}
@ -69,7 +52,7 @@
this.die();
}
}
@@ -252,8 +278,8 @@
@@ -252,8 +270,8 @@
if (this.world.getType(new BlockPosition(i1, j1 - 1, k1)).q() && this.world.getLightLevel(new BlockPosition(i1, j1, k1)) < 10) {
entityzombie.setPosition((double) i1, (double) j1, (double) k1);
if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.world.a_(entityzombie, entityzombie.getBoundingBox()) && this.world.getCubes(entityzombie, entityzombie.getBoundingBox()) && !this.world.containsLiquid(entityzombie.getBoundingBox())) {
@ -80,7 +63,7 @@
entityzombie.prepare(this.world.getDamageScaler(new BlockPosition(entityzombie)), (GroupDataEntity) null, (NBTTagCompound) null);
this.getAttributeInstance(EntityZombie.c).b(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, 0));
entityzombie.getAttributeInstance(EntityZombie.c).b(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, 0));
@@ -276,7 +302,14 @@
@@ -276,7 +294,14 @@
float f = this.world.getDamageScaler(new BlockPosition(this)).b();
if (this.getItemInMainHand().isEmpty() && this.isBurning() && this.random.nextFloat() < f * 0.3F) {
@ -96,7 +79,7 @@
}
}
@@ -362,7 +395,7 @@
@@ -362,7 +387,7 @@
EntityZombieVillager entityzombievillager = new EntityZombieVillager(this.world);
entityzombievillager.u(entityvillager);
@ -105,7 +88,7 @@
entityzombievillager.prepare(this.world.getDamageScaler(new BlockPosition(entityzombievillager)), new EntityZombie.GroupDataZombie(false), (NBTTagCompound) null);
entityzombievillager.setProfession(entityvillager.getProfession());
entityzombievillager.setBaby(entityvillager.isBaby());
@@ -372,7 +405,13 @@
@@ -372,7 +397,13 @@
entityzombievillager.setCustomNameVisible(entityvillager.getCustomNameVisible());
}
@ -120,7 +103,7 @@
this.world.a((EntityHuman) null, 1026, new BlockPosition(this), 0);
}
@@ -422,7 +461,7 @@
@@ -422,7 +453,7 @@
entitychicken1.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F);
entitychicken1.prepare(difficultydamagescaler, (GroupDataEntity) null, (NBTTagCompound) null);
entitychicken1.s(true);
@ -129,7 +112,7 @@
this.startRiding(entitychicken1);
}
}
@@ -495,7 +534,7 @@
@@ -495,7 +526,7 @@
}
public void die(DamageSource damagesource) {
@ -138,7 +121,7 @@
if (damagesource.getEntity() instanceof EntityCreeper) {
EntityCreeper entitycreeper = (EntityCreeper) damagesource.getEntity();
@@ -508,6 +547,7 @@
@@ -508,6 +539,7 @@
}
}
}

View file

@ -1,11 +1,6 @@
--- a/net/minecraft/server/ItemBow.java
+++ b/net/minecraft/server/ItemBow.java
@@ -1,15 +1,21 @@
package net.minecraft.server;
+import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit
+
public class ItemBow extends Item {
@@ -4,12 +4,16 @@
public ItemBow(Item.Info item_info) {
super(item_info);
@ -22,33 +17,25 @@
}
private ItemStack a(EntityHuman entityhuman) {
@@ -73,7 +79,20 @@
}
@@ -75,13 +79,29 @@
if (EnchantmentManager.getEnchantmentLevel(Enchantments.ARROW_FIRE, itemstack) > 0) {
- entityarrow.setOnFire(100);
+ // CraftBukkit start - call EntityCombustEvent
+ EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100);
+ entityarrow.world.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ entityarrow.setOnFire(event.getDuration());
+ }
+ // CraftBukkit end
+ }
entityarrow.setOnFire(100);
}
+ // CraftBukkit start
+ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f);
+ if (event.isCancelled()) {
+ event.getProjectile().remove();
+ return;
}
+ }
+ // CraftBukkit end
itemstack.damage(1, entityhuman);
@@ -81,7 +100,15 @@
if (flag1 || entityhuman.abilities.canInstantlyBuild && (itemstack1.getItem() == Items.SPECTRAL_ARROW || itemstack1.getItem() == Items.TIPPED_ARROW)) {
entityarrow.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY;
}
- world.addEntity(entityarrow);
+ // CraftBukkit start
+ if (event.getProjectile() == entityarrow.getBukkitEntity()) {
+ if (!world.addEntity(entityarrow)) {
+ if (entityhuman instanceof EntityPlayer) {