Update to Minecraft 1.17

By: md_5 <git@md-5.net>
This commit is contained in:
CraftBukkit/Spigot
2021-06-11 15:00:00 +10:00
parent 75faba7fde
commit b3a8254758
619 changed files with 10708 additions and 8451 deletions

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -106,8 +106,58 @@
@@ -116,8 +116,58 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -33,7 +33,7 @@
+import org.bukkit.plugin.PluginManager;
+// CraftBukkit end
+
public abstract class Entity implements INamableTileEntity, ICommandListener {
public abstract class Entity implements INamableTileEntity, EntityAccess, ICommandListener {
+ // CraftBukkit start
+ private static final int CURRENT_LEVEL = 2;
@@ -45,7 +45,7 @@
+
+ public CraftEntity getBukkitEntity() {
+ if (bukkitEntity == null) {
+ bukkitEntity = CraftEntity.getEntity(world.getServer(), this);
+ bukkitEntity = CraftEntity.getEntity(level.getServer(), this);
+ }
+ return bukkitEntity;
+ }
@@ -57,12 +57,12 @@
+ // CraftBukkit end
+
protected static final Logger LOGGER = LogManager.getLogger();
private static final AtomicInteger entityCount = new AtomicInteger();
private static final List<ItemStack> c = Collections.emptyList();
@@ -191,6 +241,21 @@
private long aB;
private EntitySize size;
private float headHeight;
public static final String ID_TAG = "id";
public static final String PASSENGERS_TAG = "Passengers";
@@ -224,6 +274,21 @@
private float crystalSoundIntensity;
private int lastCrystalSoundPlayTick;
public boolean hasVisualFire;
+ // CraftBukkit start
+ public boolean persist = true;
+ public boolean valid;
@@ -71,30 +71,30 @@
+ public boolean persistentInvisibility = false;
+
+ public float getBukkitYaw() {
+ return this.yaw;
+ return this.yRot;
+ }
+
+ public boolean isChunkLoaded() {
+ return world.isChunkLoaded((int) Math.floor(this.locX()) >> 4, (int) Math.floor(this.locZ()) >> 4);
+ return level.isChunkLoaded((int) Math.floor(this.locX()) >> 4, (int) Math.floor(this.locZ()) >> 4);
+ }
+ // CraftBukkit end
public Entity(EntityTypes<?> entitytypes, World world) {
this.id = Entity.entityCount.incrementAndGet();
@@ -297,6 +362,12 @@
}
this.id = Entity.ENTITY_COUNTER.incrementAndGet();
@@ -359,6 +424,12 @@
public void ae() {}
public void setPose(EntityPose entitypose) {
+ // CraftBukkit start
+ if (entitypose == this.getPose()) {
+ return;
+ }
+ this.world.getServer().getPluginManager().callEvent(new EntityPoseChangeEvent(this.getBukkitEntity(), Pose.values()[entitypose.ordinal()]));
+ this.level.getServer().getPluginManager().callEvent(new EntityPoseChangeEvent(this.getBukkitEntity(), Pose.values()[entitypose.ordinal()]));
+ // CraftBukkit end
this.datawatcher.set(Entity.POSE, entitypose);
this.entityData.set(Entity.DATA_POSE, entitypose);
}
@@ -313,6 +384,33 @@
@@ -375,6 +446,33 @@
}
protected void setYawPitch(float f, float f1) {
@@ -105,7 +105,7 @@
+
+ if (f == Float.POSITIVE_INFINITY || f == Float.NEGATIVE_INFINITY) {
+ if (this instanceof EntityPlayer) {
+ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid yaw");
+ this.level.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid yaw");
+ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Infinite yaw (Hacking?)");
+ }
+ f = 0;
@@ -118,25 +118,17 @@
+
+ if (f1 == Float.POSITIVE_INFINITY || f1 == Float.NEGATIVE_INFINITY) {
+ if (this instanceof EntityPlayer) {
+ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid pitch");
+ this.level.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid pitch");
+ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Infinite pitch (Hacking?)");
+ }
+ f1 = 0;
+ }
+ // CraftBukkit end
+
this.yaw = f % 360.0F;
this.pitch = f1 % 360.0F;
this.setYRot(f % 360.0F);
this.setXRot(f1 % 360.0F);
}
@@ -320,6 +418,7 @@
public void setPosition(double d0, double d1, double d2) {
this.setPositionRaw(d0, d1, d2);
this.a(this.size.a(d0, d1, d2));
+ if (valid) ((WorldServer) world).chunkCheck(this); // CraftBukkit
}
protected void af() {
@@ -334,6 +433,15 @@
@@ -416,6 +514,15 @@
this.entityBaseTick();
}
@@ -150,30 +142,30 @@
+ // CraftBukkit end
+
public void entityBaseTick() {
this.world.getMethodProfiler().enter("entityBaseTick");
if (this.isPassenger() && this.getVehicle().dead) {
@@ -347,7 +455,7 @@
this.z = this.A;
this.lastPitch = this.pitch;
this.lastYaw = this.yaw;
this.level.getMethodProfiler().enter("entityBaseTick");
if (this.isPassenger() && this.getVehicle().isRemoved()) {
@@ -429,7 +536,7 @@
this.walkDistO = this.walkDist;
this.xRotO = this.getXRot();
this.yRotO = this.getYRot();
- this.doPortalTick();
+ if (this instanceof EntityPlayer) this.doPortalTick(); // CraftBukkit - // Moved up to postTick
if (this.aO()) {
this.aP();
if (this.aV()) {
this.aW();
}
@@ -410,12 +518,44 @@
@@ -507,7 +614,23 @@
protected void burnFromLava() {
public void burnFromLava() {
if (!this.isFireProof()) {
- this.setOnFire(15);
+ // CraftBukkit start - Fallen in lava TODO: this event spams!
+ if (this instanceof EntityLiving && fireTicks <= 0) {
+ if (this instanceof EntityLiving && remainingFireTicks <= 0) {
+ // not on fire yet
+ // TODO: shouldn't be sending null for the block
+ org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k);
+ org.bukkit.entity.Entity damagee = this.getBukkitEntity();
+ EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15);
+ this.world.getServer().getPluginManager().callEvent(combustEvent);
+ this.level.getServer().getPluginManager().callEvent(combustEvent);
+
+ if (!combustEvent.isCancelled()) {
+ this.setOnFire(combustEvent.getDuration(), false);
@@ -183,8 +175,10 @@
+ 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);
}
if (this.damageEntity(DamageSource.LAVA, 4.0F)) {
this.playSound(SoundEffects.GENERIC_BURN, 0.4F, 2.0F + this.random.nextFloat() * 0.4F);
}
@@ -516,6 +639,22 @@
}
public void setOnFire(int i) {
@@ -195,7 +189,7 @@
+ public void setOnFire(int i, boolean callEvent) {
+ if (callEvent) {
+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), i);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ return;
@@ -207,114 +201,92 @@
int j = i * 20;
if (this instanceof EntityLiving) {
@@ -512,6 +652,28 @@
block.a((IBlockAccess) this.world, this);
}
@@ -614,6 +753,28 @@
block.a((IBlockAccess) this.level, this);
}
+ // CraftBukkit start
+ if (positionChanged && getBukkitEntity() instanceof Vehicle) {
+ Vehicle vehicle = (Vehicle) this.getBukkitEntity();
+ org.bukkit.block.Block bl = this.world.getWorld().getBlockAt(MathHelper.floor(this.locX()), MathHelper.floor(this.locY()), MathHelper.floor(this.locZ()));
+ // CraftBukkit start
+ if (horizontalCollision && getBukkitEntity() instanceof Vehicle) {
+ Vehicle vehicle = (Vehicle) this.getBukkitEntity();
+ org.bukkit.block.Block bl = this.level.getWorld().getBlockAt(MathHelper.floor(this.locX()), MathHelper.floor(this.locY()), MathHelper.floor(this.locZ()));
+
+ if (vec3d.x > vec3d1.x) {
+ bl = bl.getRelative(BlockFace.EAST);
+ } else if (vec3d.x < vec3d1.x) {
+ bl = bl.getRelative(BlockFace.WEST);
+ } else if (vec3d.z > vec3d1.z) {
+ bl = bl.getRelative(BlockFace.SOUTH);
+ } else if (vec3d.z < vec3d1.z) {
+ bl = bl.getRelative(BlockFace.NORTH);
+ if (vec3d.x > vec3d1.x) {
+ bl = bl.getRelative(BlockFace.EAST);
+ } else if (vec3d.x < vec3d1.x) {
+ bl = bl.getRelative(BlockFace.WEST);
+ } else if (vec3d.z > vec3d1.z) {
+ bl = bl.getRelative(BlockFace.SOUTH);
+ } else if (vec3d.z < vec3d1.z) {
+ bl = bl.getRelative(BlockFace.NORTH);
+ }
+
+ if (!bl.getType().isAir()) {
+ VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, bl);
+ level.getServer().getPluginManager().callEvent(event);
+ }
+ }
+ // CraftBukkit end
+
+ if (!bl.getType().isAir()) {
+ VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, bl);
+ world.getServer().getPluginManager().callEvent(event);
+ }
+ }
+ // CraftBukkit end
+
if (this.onGround && !this.bv()) {
block.stepOn(this.world, blockposition, this);
}
@@ -785,6 +947,7 @@
AxisAlignedBB axisalignedbb = this.getBoundingBox();
this.setPositionRaw((axisalignedbb.minX + axisalignedbb.maxX) / 2.0D, axisalignedbb.minY, (axisalignedbb.minZ + axisalignedbb.maxZ) / 2.0D);
+ if (valid) ((WorldServer) world).chunkCheck(this); // CraftBukkit
}
protected SoundEffect getSoundSwim() {
@@ -1110,6 +1273,13 @@
}
public void spawnIn(World world) {
+ // CraftBukkit start
+ if (world == null) {
+ die();
+ this.world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle();
+ return;
+ }
+ // CraftBukkit end
this.world = world;
}
@@ -1129,6 +1299,7 @@
this.lastY = d1;
this.lastZ = d4;
if (this.onGround && !this.bE()) {
block.stepOn(this.level, blockposition, iblockdata, this);
}
@@ -1276,6 +1437,7 @@
this.yo = d1;
this.zo = d4;
this.setPosition(d3, d1, d4);
+ world.getChunkAt((int) Math.floor(this.locX()) >> 4, (int) Math.floor(this.locZ()) >> 4); // CraftBukkit
+ level.getChunkAt((int) Math.floor(this.locX()) >> 4, (int) Math.floor(this.locZ()) >> 4); // CraftBukkit
}
public void d(Vec3D vec3d) {
@@ -1303,6 +1474,12 @@
@@ -1466,6 +1628,12 @@
return false;
}
+ // CraftBukkit start - collidable API
+ public boolean canCollideWith(Entity entity) {
+ public boolean canCollideWithBukkit(Entity entity) {
+ return isCollidable();
+ }
+ // CraftBukkit end
+
public void a(Entity entity, int i, DamageSource damagesource) {
if (entity instanceof EntityPlayer) {
CriterionTriggers.c.a((EntityPlayer) entity, this, damagesource);
@@ -1313,7 +1490,7 @@
public boolean a_(NBTTagCompound nbttagcompound) {
String s = this.getSaveID();
CriterionTriggers.ENTITY_KILLED_PLAYER.a((EntityPlayer) entity, this, damagesource);
@@ -1499,7 +1667,7 @@
} else {
String s = this.getSaveID();
- if (!this.dead && s != null) {
+ if (this.persist && !this.dead && s != null) { // CraftBukkit - persist flag
nbttagcompound.setString("id", s);
this.save(nbttagcompound);
return true;
@@ -1337,6 +1514,18 @@
- if (s == null) {
+ if (!this.persist || s == null) { // CraftBukkit - persist flag
return false;
} else {
nbttagcompound.setString("id", s);
@@ -1524,6 +1692,18 @@
Vec3D vec3d = this.getMot();
nbttagcompound.set("Motion", this.a(vec3d.x, vec3d.y, vec3d.z));
nbttagcompound.set("Motion", this.newDoubleList(vec3d.x, vec3d.y, vec3d.z));
+
+ // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero
+ // TODO: make sure this is the best way to address this.
+ if (Float.isNaN(this.yaw)) {
+ this.yaw = 0;
+ if (Float.isNaN(this.yRot)) {
+ this.yRot = 0;
+ }
+
+ if (Float.isNaN(this.pitch)) {
+ this.pitch = 0;
+ if (Float.isNaN(this.xRot)) {
+ this.xRot = 0;
+ }
+ // CraftBukkit end
+
nbttagcompound.set("Rotation", this.a(this.yaw, this.pitch));
nbttagcompound.set("Rotation", this.newFloatList(this.getYRot(), this.getXRot()));
nbttagcompound.setFloat("FallDistance", this.fallDistance);
nbttagcompound.setShort("Fire", (short) this.fireTicks);
@@ -1345,6 +1534,18 @@
nbttagcompound.setShort("Fire", (short) this.remainingFireTicks);
@@ -1532,6 +1712,18 @@
nbttagcompound.setBoolean("Invulnerable", this.invulnerable);
nbttagcompound.setInt("PortalCooldown", this.portalCooldown);
nbttagcompound.a("UUID", this.getUniqueID());
+ // CraftBukkit start
+ // PAIL: Check above UUID reads 1.8 properly, ie: UUIDMost / UUIDLeast
+ nbttagcompound.setLong("WorldUUIDLeast", ((WorldServer) this.world).getWorld().getUID().getLeastSignificantBits());
+ nbttagcompound.setLong("WorldUUIDMost", ((WorldServer) this.world).getWorld().getUID().getMostSignificantBits());
+ nbttagcompound.setLong("WorldUUIDLeast", ((WorldServer) this.level).getWorld().getUID().getLeastSignificantBits());
+ nbttagcompound.setLong("WorldUUIDMost", ((WorldServer) this.level).getWorld().getUID().getMostSignificantBits());
+ nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL);
+ if (!this.persist) {
+ nbttagcompound.setBoolean("Bukkit.persist", this.persist);
@@ -326,7 +298,7 @@
IChatBaseComponent ichatbasecomponent = this.getCustomName();
if (ichatbasecomponent != null) {
@@ -1402,6 +1603,11 @@
@@ -1599,6 +1791,11 @@
}
}
@@ -338,7 +310,7 @@
return nbttagcompound;
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Saving entity NBT");
@@ -1479,6 +1685,49 @@
@@ -1680,6 +1877,49 @@
} else {
throw new IllegalStateException("Entity has invalid position");
}
@@ -350,7 +322,7 @@
+ // Reset the persistence for tamed animals
+ if (entity instanceof EntityTameableAnimal && !isLevelAtLeast(nbttagcompound, 2) && !nbttagcompound.getBoolean("PersistenceRequired")) {
+ EntityInsentient entityinsentient = (EntityInsentient) entity;
+ entityinsentient.persistent = !entityinsentient.isTypeNotPersistent(0);
+ entityinsentient.persistenceRequired = !entityinsentient.isTypeNotPersistent(0);
+ }
+ }
+ this.persist = !nbttagcompound.hasKey("Bukkit.persist") || nbttagcompound.getBoolean("Bukkit.persist");
@@ -375,7 +347,7 @@
+ bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(World.OVERWORLD).getWorld();
+ }
+
+ spawnIn(bworld == null ? null : ((CraftWorld) bworld).getHandle());
+ ((EntityPlayer) this).spawnIn(bworld == null ? null : ((CraftWorld) bworld).getHandle());
+ }
+ this.getBukkitEntity().readBukkitValues(nbttagcompound);
+ if (nbttagcompound.hasKey("Bukkit.invisible")) {
@@ -388,8 +360,8 @@
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded");
@@ -1554,9 +1803,22 @@
} else if (this.world.isClientSide) {
@@ -1755,9 +1995,22 @@
} else if (this.level.isClientSide) {
return null;
} else {
+ // CraftBukkit start - Capture drops for death event
@@ -398,7 +370,7 @@
+ return null;
+ }
+ // CraftBukkit end
EntityItem entityitem = new EntityItem(this.world, this.locX(), this.locY() + (double) f, this.locZ(), itemstack);
EntityItem entityitem = new EntityItem(this.level, this.locX(), this.locY() + (double) f, this.locZ(), itemstack);
entityitem.defaultPickupDelay();
+ // CraftBukkit start
@@ -408,19 +380,19 @@
+ return null;
+ }
+ // CraftBukkit end
this.world.addEntity(entityitem);
this.level.addEntity(entityitem);
return entityitem;
}
@@ -1640,7 +1902,7 @@
@@ -1849,7 +2102,7 @@
this.setPose(EntityPose.STANDING);
this.vehicle = entity;
- this.vehicle.addPassenger(this);
+ if (!this.vehicle.addPassenger(this)) this.vehicle = null; // CraftBukkit
return true;
}
}
@@ -1665,7 +1927,7 @@
this.setPose(EntityPose.STANDING);
this.vehicle = entity;
- this.vehicle.addPassenger(this);
+ if (!this.vehicle.addPassenger(this)) this.vehicle = null; // CraftBukkit
entity.n().filter((entity2) -> {
return entity2 instanceof EntityPlayer;
}).forEach((entity2) -> {
@@ -1880,7 +2133,7 @@
Entity entity = this.vehicle;
this.vehicle = null;
@@ -429,8 +401,8 @@
}
}
@@ -1674,10 +1936,31 @@
this.bf();
@@ -1889,10 +2142,31 @@
this.bo();
}
- protected void addPassenger(Entity entity) {
@@ -459,10 +431,10 @@
+ }
+ }
+ // CraftBukkit end
if (!this.world.isClientSide && entity instanceof EntityHuman && !(this.getRidingPassenger() instanceof EntityHuman)) {
this.passengers.add(0, entity);
if (this.passengers.isEmpty()) {
this.passengers = ImmutableList.of(entity);
} else {
@@ -1685,15 +1968,36 @@
@@ -1908,12 +2182,32 @@
}
}
@@ -493,25 +465,29 @@
+ }
+ }
+ // CraftBukkit end
this.passengers.remove(entity);
entity.j = 60;
if (this.passengers.size() == 1 && this.passengers.get(0) == entity) {
this.passengers = ImmutableList.of();
} else {
@@ -1924,6 +2218,7 @@
entity.boardingCooldown = 60;
}
+ return true; // CraftBukkit
}
protected boolean q(Entity entity) {
@@ -1731,14 +2035,20 @@
protected boolean o(Entity entity) {
@@ -1974,14 +2269,20 @@
if (this.inPortal) {
if (this.isInsidePortal) {
MinecraftServer minecraftserver = worldserver.getMinecraftServer();
- ResourceKey<World> resourcekey = this.world.getDimensionKey() == World.THE_NETHER ? World.OVERWORLD : World.THE_NETHER;
+ ResourceKey<World> resourcekey = this.world.getTypeKey() == DimensionManager.THE_NETHER ? World.OVERWORLD : World.THE_NETHER; // CraftBukkit
- ResourceKey<World> resourcekey = this.level.getDimensionKey() == World.NETHER ? World.OVERWORLD : World.NETHER;
+ ResourceKey<World> resourcekey = this.level.getTypeKey() == DimensionManager.NETHER_LOCATION ? World.OVERWORLD : World.NETHER; // CraftBukkit
WorldServer worldserver1 = minecraftserver.getWorldServer(resourcekey);
- if (worldserver1 != null && minecraftserver.getAllowNether() && !this.isPassenger() && this.portalTicks++ >= i) {
+ if (true && !this.isPassenger() && this.portalTicks++ >= i) { // CraftBukkit
this.world.getMethodProfiler().enter("portal");
this.portalTicks = i;
- if (worldserver1 != null && minecraftserver.getAllowNether() && !this.isPassenger() && this.portalTime++ >= i) {
+ if (true && !this.isPassenger() && this.portalTime++ >= i) { // CraftBukkit
this.level.getMethodProfiler().enter("portal");
this.portalTime = i;
this.resetPortalCooldown();
- this.b(worldserver1);
+ // CraftBukkit start
@@ -521,10 +497,10 @@
+ this.b(worldserver1);
+ }
+ // CraftBukkit end
this.world.getMethodProfiler().exit();
this.level.getMethodProfiler().exit();
}
@@ -1838,6 +2148,13 @@
@@ -2099,6 +2400,13 @@
}
public void setSwimming(boolean flag) {
@@ -538,7 +514,7 @@
this.setFlag(4, flag);
}
@@ -1870,8 +2187,12 @@
@@ -2147,8 +2455,12 @@
return this.getScoreboardTeam() != null ? this.getScoreboardTeam().isAlly(scoreboardteambase) : false;
}
@@ -552,11 +528,11 @@
}
public boolean getFlag(int i) {
@@ -1898,16 +2219,56 @@
@@ -2175,7 +2487,17 @@
}
public void setAirTicks(int i) {
- this.datawatcher.set(Entity.AIR_TICKS, i);
- this.entityData.set(Entity.DATA_AIR_SUPPLY_ID, i);
+ // CraftBukkit start
+ EntityAirChangeEvent event = new EntityAirChangeEvent(this.getBukkitEntity(), i);
+ // Suppress during worldgen
@@ -566,19 +542,22 @@
+ if (event.isCancelled()) {
+ return;
+ }
+ this.datawatcher.set(Entity.AIR_TICKS, event.getAmount());
+ this.entityData.set(Entity.DATA_AIR_SUPPLY_ID, event.getAmount());
+ // CraftBukkit end
}
public int getTicksFrozen() {
@@ -2202,11 +2524,41 @@
public void onLightningStrike(WorldServer worldserver, EntityLightning entitylightning) {
this.setFireTicks(this.fireTicks + 1);
this.setFireTicks(this.remainingFireTicks + 1);
+ // CraftBukkit start
+ final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity();
+ final org.bukkit.entity.Entity stormBukkitEntity = entitylightning.getBukkitEntity();
+ final PluginManager pluginManager = Bukkit.getPluginManager();
+ // CraftBukkit end
+
if (this.fireTicks == 0) {
if (this.remainingFireTicks == 0) {
- this.setOnFire(8);
+ // CraftBukkit start - Call a combust event when lightning strikes
+ EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8);
@@ -599,12 +578,12 @@
+ }
}
- this.damageEntity(DamageSource.LIGHTNING, 5.0F);
- this.damageEntity(DamageSource.LIGHTNING_BOLT, 5.0F);
+ if (this.isFireProof()) {
+ return;
+ }
+ CraftEventFactory.entityDamage = entitylightning;
+ if (!this.damageEntity(DamageSource.LIGHTNING, 5.0F)) {
+ if (!this.damageEntity(DamageSource.LIGHTNING_BOLT, 5.0F)) {
+ CraftEventFactory.entityDamage = null;
+ return;
+ }
@@ -612,7 +591,7 @@
}
public void k(boolean flag) {
@@ -2057,15 +2418,32 @@
@@ -2356,15 +2708,32 @@
@Nullable
public Entity b(WorldServer worldserver) {
@@ -623,8 +602,8 @@
+ @Nullable
+ public Entity teleportTo(WorldServer worldserver, BlockPosition location) {
+ // CraftBukkit end
if (this.world instanceof WorldServer && !this.dead) {
this.world.getMethodProfiler().enter("changeDimension");
if (this.level instanceof WorldServer && !this.isRemoved()) {
this.level.getMethodProfiler().enter("changeDimension");
- this.decouple();
+ // CraftBukkit start
+ // this.decouple();
@@ -632,9 +611,9 @@
+ return null;
+ }
+ // CraftBukkit end
this.world.getMethodProfiler().enter("reposition");
this.level.getMethodProfiler().enter("reposition");
- ShapeDetectorShape shapedetectorshape = this.a(worldserver);
+ ShapeDetectorShape shapedetectorshape = (location == null) ? this.a(worldserver) : new ShapeDetectorShape(new Vec3D(location.getX(), location.getY(), location.getZ()), Vec3D.ORIGIN, this.yaw, this.pitch, worldserver, null); // CraftBukkit
+ ShapeDetectorShape shapedetectorshape = (location == null) ? this.a(worldserver) : new ShapeDetectorShape(new Vec3D(location.getX(), location.getY(), location.getZ()), Vec3D.ZERO, this.yRot, this.xRot, worldserver, null); // CraftBukkit
if (shapedetectorshape == null) {
return null;
@@ -644,55 +623,55 @@
+ this.decouple();
+ // CraftBukkit end
+
this.world.getMethodProfiler().exitEnter("reloading");
this.level.getMethodProfiler().exitEnter("reloading");
Entity entity = this.getEntityType().a((World) worldserver);
@@ -2074,9 +2452,17 @@
entity.setPositionRotation(shapedetectorshape.position.x, shapedetectorshape.position.y, shapedetectorshape.position.z, shapedetectorshape.yaw, entity.pitch);
entity.setMot(shapedetectorshape.velocity);
@@ -2373,9 +2742,17 @@
entity.setPositionRotation(shapedetectorshape.pos.x, shapedetectorshape.pos.y, shapedetectorshape.pos.z, shapedetectorshape.yRot, entity.getXRot());
entity.setMot(shapedetectorshape.speed);
worldserver.addEntityTeleport(entity);
- if (worldserver.getDimensionKey() == World.THE_END) {
- if (worldserver.getDimensionKey() == World.END) {
- WorldServer.a(worldserver);
+ if (worldserver.getTypeKey() == DimensionManager.THE_END) { // CraftBukkit
+ if (worldserver.getTypeKey() == DimensionManager.END_LOCATION) { // CraftBukkit
+ WorldServer.a(worldserver, this); // CraftBukkit
}
+ }
+ // CraftBukkit start - Forward the CraftEntity to the new entity
+ this.getBukkitEntity().setHandle(entity);
+ entity.bukkitEntity = this.getBukkitEntity();
+
+ if (this instanceof EntityInsentient) {
+ ((EntityInsentient) this).unleash(true, false); // Unleash to prevent duping of leads.
+ }
}
+ // CraftBukkit end
}
this.bN();
@@ -2097,13 +2483,18 @@
this.cc();
@@ -2396,13 +2773,18 @@
@Nullable
protected ShapeDetectorShape a(WorldServer worldserver) {
- boolean flag = this.world.getDimensionKey() == World.THE_END && worldserver.getDimensionKey() == World.OVERWORLD;
- boolean flag1 = worldserver.getDimensionKey() == World.THE_END;
- boolean flag = this.level.getDimensionKey() == World.END && worldserver.getDimensionKey() == World.OVERWORLD;
- boolean flag1 = worldserver.getDimensionKey() == World.END;
+ // CraftBukkit start
+ if (worldserver == null) {
+ return null;
+ }
+ boolean flag = this.world.getTypeKey() == DimensionManager.THE_END && worldserver.getTypeKey() == DimensionManager.OVERWORLD; // fromEndToOverworld
+ boolean flag1 = worldserver.getTypeKey() == DimensionManager.THE_END; // targetIsEnd
+ boolean flag = this.level.getTypeKey() == DimensionManager.END_LOCATION && worldserver.getTypeKey() == DimensionManager.OVERWORLD_LOCATION; // fromEndToOverworld
+ boolean flag1 = worldserver.getTypeKey() == DimensionManager.END_LOCATION; // targetIsEnd
+ // CraftBukkit end
if (!flag && !flag1) {
- boolean flag2 = worldserver.getDimensionKey() == World.THE_NETHER;
+ boolean flag2 = worldserver.getTypeKey() == DimensionManager.THE_NETHER; // CraftBukkit
- boolean flag2 = worldserver.getDimensionKey() == World.NETHER;
+ boolean flag2 = worldserver.getTypeKey() == DimensionManager.NETHER_LOCATION; // CraftBukkit
- if (this.world.getDimensionKey() != World.THE_NETHER && !flag2) {
+ if (this.world.getTypeKey() != DimensionManager.THE_NETHER && !flag2) {
- if (this.level.getDimensionKey() != World.NETHER && !flag2) {
+ if (this.level.getTypeKey() != DimensionManager.NETHER_LOCATION && !flag2) {
return null;
} else {
WorldBorder worldborder = worldserver.getWorldBorder();
@@ -2113,8 +2504,16 @@
@@ -2412,8 +2794,16 @@
double d3 = Math.min(2.9999872E7D, worldborder.h() - 16.0D);
double d4 = DimensionManager.a(this.world.getDimensionManager(), worldserver.getDimensionManager());
double d4 = DimensionManager.a(this.level.getDimensionManager(), worldserver.getDimensionManager());
BlockPosition blockposition = new BlockPosition(MathHelper.a(this.locX() * d4, d0, d2), this.locY(), MathHelper.a(this.locZ() * d4, d1, d3));
+ // CraftBukkit start
+ CraftPortalEvent event = callPortalEvent(this, worldserver, blockposition, PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, flag2 ? 16 : 128, 16);
@@ -705,21 +684,21 @@
- return (ShapeDetectorShape) this.findOrCreatePortal(worldserver, blockposition, flag2).map((blockutil_rectangle) -> {
+ return (ShapeDetectorShape) this.findOrCreatePortal(worldserver, blockposition, flag2, event.getSearchRadius(), event.getCanCreatePortal(), event.getCreationRadius()).map((blockutil_rectangle) -> {
+ // CraftBukkit end
IBlockData iblockdata = this.world.getType(this.ac);
IBlockData iblockdata = this.level.getType(this.portalEntrancePos);
EnumDirection.EnumAxis enumdirection_enumaxis;
Vec3D vec3d;
@@ -2131,8 +2530,8 @@
@@ -2430,8 +2820,8 @@
vec3d = new Vec3D(0.5D, 0.0D, 0.0D);
}
- return BlockPortalShape.a(worldserver, blockutil_rectangle, enumdirection_enumaxis, vec3d, this.a(this.getPose()), this.getMot(), this.yaw, this.pitch);
- return BlockPortalShape.a(worldserver, blockutil_rectangle, enumdirection_enumaxis, vec3d, this.a(this.getPose()), this.getMot(), this.getYRot(), this.getXRot());
- }).orElse((Object) null);
+ return BlockPortalShape.a(worldserverFinal, blockutil_rectangle, enumdirection_enumaxis, vec3d, this.a(this.getPose()), this.getMot(), this.yaw, this.pitch, event); // CraftBukkit
+ return BlockPortalShape.a(worldserverFinal, blockutil_rectangle, enumdirection_enumaxis, vec3d, this.a(this.getPose()), this.getMot(), this.getYRot(), this.getXRot(), event); // CraftBukkit
+ }).orElse(null); // CraftBuukkit - decompile error
}
} else {
BlockPosition blockposition1;
@@ -2142,8 +2541,15 @@
@@ -2441,8 +2831,15 @@
} else {
blockposition1 = worldserver.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver.getSpawn());
}
@@ -730,13 +709,13 @@
+ }
+ blockposition1 = new BlockPosition(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ());
- return new ShapeDetectorShape(new Vec3D((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY(), (double) blockposition1.getZ() + 0.5D), this.getMot(), this.yaw, this.pitch);
+ return new ShapeDetectorShape(new Vec3D((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY(), (double) blockposition1.getZ() + 0.5D), this.getMot(), this.yaw, this.pitch, ((CraftWorld) event.getTo().getWorld()).getHandle(), event);
- return new ShapeDetectorShape(new Vec3D((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY(), (double) blockposition1.getZ() + 0.5D), this.getMot(), this.getYRot(), this.getXRot());
+ return new ShapeDetectorShape(new Vec3D((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY(), (double) blockposition1.getZ() + 0.5D), this.getMot(), this.getYRot(), this.getXRot(), ((CraftWorld) event.getTo().getWorld()).getHandle(), event);
+ // CraftBukkit end
}
}
@@ -2151,8 +2557,23 @@
@@ -2450,8 +2847,23 @@
return BlockPortalShape.a(blockutil_rectangle, enumdirection_enumaxis, this.getPositionVector(), this.a(this.getPose()));
}
@@ -762,11 +741,11 @@
}
public boolean canPortal() {
@@ -2338,7 +2759,26 @@
@@ -2660,7 +3072,26 @@
}
public void a(AxisAlignedBB axisalignedbb) {
- this.boundingBox = axisalignedbb;
public final void a(AxisAlignedBB axisalignedbb) {
- this.bb = axisalignedbb;
+ // CraftBukkit start - block invalid bounding boxes
+ double minX = axisalignedbb.minX,
+ minY = axisalignedbb.minY,
@@ -785,7 +764,7 @@
+ len = axisalignedbb.maxZ - axisalignedbb.minZ;
+ if (len < 0) maxZ = minZ;
+ if (len > 64) maxZ = minZ + 64.0;
+ this.boundingBox = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ);
+ this.bb = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ);
+ // CraftBukkit end
}

View File

@@ -1,35 +1,35 @@
--- a/net/minecraft/world/entity/EntityAgeable.java
+++ b/net/minecraft/world/entity/EntityAgeable.java
@@ -17,6 +17,7 @@
protected int b;
protected int c;
protected int d;
@@ -19,6 +19,7 @@
protected int age;
protected int forcedAge;
protected int forcedAgeTimer;
+ public boolean ageLocked; // CraftBukkit
protected EntityAgeable(EntityTypes<? extends EntityAgeable> entitytypes, World world) {
super(entitytypes, world);
@@ -100,6 +101,7 @@
@@ -102,6 +103,7 @@
super.saveData(nbttagcompound);
nbttagcompound.setInt("Age", this.getAge());
nbttagcompound.setInt("ForcedAge", this.c);
nbttagcompound.setInt("ForcedAge", this.forcedAge);
+ nbttagcompound.setBoolean("AgeLocked", this.ageLocked); // CraftBukkit
}
@Override
@@ -107,6 +109,7 @@
@@ -109,6 +111,7 @@
super.loadData(nbttagcompound);
this.setAgeRaw(nbttagcompound.getInt("Age"));
this.c = nbttagcompound.getInt("ForcedAge");
this.forcedAge = nbttagcompound.getInt("ForcedAge");
+ this.ageLocked = nbttagcompound.getBoolean("AgeLocked"); // CraftBukkit
}
@Override
@@ -121,7 +124,7 @@
@@ -123,7 +126,7 @@
@Override
public void movementTick() {
super.movementTick();
- if (this.world.isClientSide) {
+ if (this.world.isClientSide || ageLocked) { // CraftBukkit
if (this.d > 0) {
if (this.d % 4 == 0) {
this.world.addParticle(Particles.HAPPY_VILLAGER, this.d(1.0D), this.cF() + 0.5D, this.g(1.0D), 0.0D, 0.0D, 0.0D);
- if (this.level.isClientSide) {
+ if (this.level.isClientSide || ageLocked) { // CraftBukkit
if (this.forcedAgeTimer > 0) {
if (this.forcedAgeTimer % 4 == 0) {
this.level.addParticle(Particles.HAPPY_VILLAGER, this.d(1.0D), this.da() + 0.5D, this.g(1.0D), 0.0D, 0.0D, 0.0D);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/EntityAreaEffectCloud.java
+++ b/net/minecraft/world/entity/EntityAreaEffectCloud.java
@@ -33,6 +33,12 @@
@@ -32,6 +32,12 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -13,19 +13,19 @@
public class EntityAreaEffectCloud extends Entity {
private static final Logger LOGGER = LogManager.getLogger();
@@ -124,6 +130,22 @@
@@ -127,6 +133,22 @@
}
+ // CraftBukkit start accessor methods
+ public void refreshEffects() {
+ if (!this.hasColor) {
+ this.getDataWatcher().set(EntityAreaEffectCloud.COLOR, PotionUtil.a((Collection) PotionUtil.a(this.potionRegistry, (Collection) this.effects))); // PAIL: rename
+ if (!this.fixedColor) {
+ this.getDataWatcher().set(EntityAreaEffectCloud.DATA_COLOR, PotionUtil.a((Collection) PotionUtil.a(this.potion, (Collection) this.effects))); // PAIL: rename
+ }
+ }
+
+ public String getType() {
+ return ((MinecraftKey) IRegistry.POTION.getKey(this.potionRegistry)).toString();
+ return ((MinecraftKey) IRegistry.POTION.getKey(this.potion)).toString();
+ }
+
+ public void setType(String string) {
@@ -34,20 +34,20 @@
+ // CraftBukkit end
+
public int getColor() {
return (Integer) this.getDataWatcher().get(EntityAreaEffectCloud.COLOR);
return (Integer) this.getDataWatcher().get(EntityAreaEffectCloud.DATA_COLOR);
}
@@ -268,6 +290,7 @@
@@ -259,6 +281,7 @@
if (!list1.isEmpty()) {
Iterator iterator2 = list1.iterator();
Iterator iterator1 = list1.iterator();
+ List<LivingEntity> entities = new java.util.ArrayList<LivingEntity>(); // CraftBukkit
while (iterator2.hasNext()) {
EntityLiving entityliving = (EntityLiving) iterator2.next();
while (iterator1.hasNext()) {
EntityLiving entityliving = (EntityLiving) iterator1.next();
@@ -277,6 +300,17 @@
double d2 = d0 * d0 + d1 * d1;
@@ -268,6 +291,17 @@
double d8 = d6 * d6 + d7 * d7;
if (d2 <= (double) (f * f)) {
if (d8 <= (double) (f * f)) {
+ // CraftBukkit start
+ entities.add((LivingEntity) entityliving.getBukkitEntity());
+ }
@@ -59,15 +59,15 @@
+ if (entity instanceof CraftLivingEntity) {
+ EntityLiving entityliving = ((CraftLivingEntity) entity).getHandle();
+ // CraftBukkit end
this.affectedEntities.put(entityliving, this.ticksLived + this.reapplicationDelay);
Iterator iterator3 = list.iterator();
this.victims.put(entityliving, this.tickCount + this.reapplicationDelay);
Iterator iterator2 = list.iterator();
@@ -286,7 +320,7 @@
@@ -277,7 +311,7 @@
if (mobeffect1.getMobEffect().isInstant()) {
mobeffect1.getMobEffect().applyInstantEffect(this, this.getSource(), entityliving, mobeffect1.getAmplifier(), 0.5D);
} else {
- entityliving.addEffect(new MobEffect(mobeffect1));
+ entityliving.addEffect(new MobEffect(mobeffect1), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.AREA_EFFECT_CLOUD); // CraftBukkit
- entityliving.addEffect(new MobEffect(mobeffect1), this);
+ entityliving.addEffect(new MobEffect(mobeffect1), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.AREA_EFFECT_CLOUD); // CraftBukkit
}
}

View File

@@ -15,15 +15,15 @@
if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) {
if (f > 10.0F) {
+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
+ this.level.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
this.unleash(true, true);
}
@@ -49,6 +54,7 @@
this.x(f);
this.y(f);
if (f > 10.0F) {
+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
+ this.level.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
this.unleash(true, true);
this.goalSelector.a(PathfinderGoal.Type.MOVE);
} else if (f > 6.0F) {

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/EntityExperienceOrb.java
+++ b/net/minecraft/world/entity/EntityExperienceOrb.java
@@ -16,6 +16,12 @@
import net.minecraft.world.level.World;
@@ -21,6 +21,12 @@
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
@@ -12,63 +12,63 @@
+
public class EntityExperienceOrb extends Entity {
public int b;
@@ -50,6 +56,7 @@
private static final int LIFETIME = 6000;
@@ -59,6 +65,7 @@
@Override
public void tick() {
super.tick();
+ EntityHuman prevTarget = this.targetPlayer;// CraftBukkit - store old target
if (this.d > 0) {
--this.d;
}
@@ -86,7 +93,22 @@
this.targetPlayer = null;
+ EntityHuman prevTarget = this.followingPlayer;// CraftBukkit - store old target
this.xo = this.locX();
this.yo = this.locY();
this.zo = this.locZ();
@@ -84,7 +91,22 @@
this.followingPlayer = null;
}
- if (this.targetPlayer != null) {
- if (this.followingPlayer != null) {
+ // CraftBukkit start
+ boolean cancelled = false;
+ if (this.targetPlayer != prevTarget) {
+ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this, targetPlayer, (targetPlayer != null) ? EntityTargetEvent.TargetReason.CLOSEST_PLAYER : EntityTargetEvent.TargetReason.FORGOT_TARGET);
+ if (this.followingPlayer != prevTarget) {
+ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this, followingPlayer, (followingPlayer != null) ? EntityTargetEvent.TargetReason.CLOSEST_PLAYER : EntityTargetEvent.TargetReason.FORGOT_TARGET);
+ EntityLiving target = (event.getTarget() == null) ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle();
+ cancelled = event.isCancelled();
+
+ if (cancelled) {
+ targetPlayer = prevTarget;
+ followingPlayer = prevTarget;
+ } else {
+ targetPlayer = (target instanceof EntityHuman) ? (EntityHuman) target : null;
+ followingPlayer = (target instanceof EntityHuman) ? (EntityHuman) target : null;
+ }
+ }
+
+ if (this.targetPlayer != null && !cancelled) {
+ if (this.followingPlayer != null && !cancelled) {
+ // CraftBukkit end
Vec3D vec3d = new Vec3D(this.targetPlayer.locX() - this.locX(), this.targetPlayer.locY() + (double) this.targetPlayer.getHeadHeight() / 2.0D - this.locY(), this.targetPlayer.locZ() - this.locZ());
double d1 = vec3d.g();
Vec3D vec3d = new Vec3D(this.followingPlayer.locX() - this.locX(), this.followingPlayer.locY() + (double) this.followingPlayer.getHeadHeight() / 2.0D - this.locY(), this.followingPlayer.locZ() - this.locZ());
double d0 = vec3d.g();
@@ -169,13 +191,19 @@
if (!itemstack.isEmpty() && itemstack.f()) {
int i = Math.min(this.c(this.value), itemstack.getDamage());
@@ -225,7 +247,7 @@
int i = this.a(entityhuman, this.value);
- this.value -= this.b(i);
- itemstack.setDamage(itemstack.getDamage() - i);
+ // CraftBukkit start
+ org.bukkit.event.player.PlayerItemMendEvent event = CraftEventFactory.callPlayerItemMendEvent(entityhuman, this, itemstack, i);
+ i = event.getRepairAmount();
+ if (!event.isCancelled()) {
+ this.value -= this.b(i);
+ itemstack.setDamage(itemstack.getDamage() - i);
+ }
+ // CraftBukkit end
}
if (i > 0) {
- entityhuman.giveExp(i);
+ entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, i).getAmount()); // CraftBukkit - this.value -> event.getAmount()
}
if (this.value > 0) {
- entityhuman.giveExp(this.value);
+ entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, this.value).getAmount()); // CraftBukkit - this.value -> event.getAmount()
}
--this.count;
@@ -243,6 +265,13 @@
if (entry != null) {
ItemStack itemstack = (ItemStack) entry.getValue();
int j = Math.min(this.c(this.value), itemstack.getDamage());
+ // CraftBukkit start
+ org.bukkit.event.player.PlayerItemMendEvent event = CraftEventFactory.callPlayerItemMendEvent(entityhuman, this, itemstack, j);
+ j = event.getRepairAmount();
+ if (event.isCancelled()) {
+ return i;
+ }
+ // CraftBukkit end
this.die();
@@ -197,6 +225,24 @@
itemstack.setDamage(itemstack.getDamage() - j);
int k = i - this.b(j);
@@ -270,6 +299,24 @@
}
public static int getOrbValue(int i) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/EntityInsentient.java
+++ b/net/minecraft/world/entity/EntityInsentient.java
@@ -74,6 +74,19 @@
@@ -72,6 +72,19 @@
import net.minecraft.world.level.pathfinder.PathType;
import net.minecraft.world.level.storage.loot.LootTableInfo;
@@ -19,36 +19,27 @@
+
public abstract class EntityInsentient extends EntityLiving {
private static final DataWatcherObject<Byte> b = DataWatcher.a(EntityInsentient.class, DataWatcherRegistry.a);
@@ -92,7 +105,7 @@
public final float[] dropChanceHand;
private final NonNullList<ItemStack> bq;
public final float[] dropChanceArmor;
- private boolean canPickUpLoot;
+ // private boolean canPickUpLoot; // CraftBukkit - moved up to EntityLiving
public boolean persistent;
private final Map<PathType, Float> bt;
public MinecraftKey lootTableKey;
@@ -105,6 +118,8 @@
private BlockPosition bz;
private float bA;
private static final DataWatcherObject<Byte> DATA_MOB_FLAGS_ID = DataWatcher.a(EntityInsentient.class, DataWatcherRegistry.BYTE);
@@ -112,6 +125,8 @@
private BlockPosition restrictCenter;
private float restrictRadius;
+ public boolean aware = true; // CraftBukkit
+
protected EntityInsentient(EntityTypes<? extends EntityInsentient> entitytypes, World world) {
super(entitytypes, world);
this.bp = NonNullList.a(2, ItemStack.b);
@@ -128,6 +143,9 @@
this.handItems = NonNullList.a(2, ItemStack.EMPTY);
@@ -135,6 +150,9 @@
this.initPathfinder();
}
+ // CraftBukkit start - default persistance to type's persistance value
+ this.persistent = !isTypeNotPersistent(0);
+ this.persistenceRequired = !isTypeNotPersistent(0);
+ // CraftBukkit end
}
protected void initPathfinder() {}
@@ -208,7 +226,38 @@
@@ -215,7 +233,38 @@
}
public void setGoalTarget(@Nullable EntityLiving entityliving) {
@@ -63,14 +54,14 @@
+ reason = getGoalTarget().isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED;
+ }
+ if (reason == EntityTargetEvent.TargetReason.UNKNOWN) {
+ world.getServer().getLogger().log(java.util.logging.Level.WARNING, "Unknown target reason, please report on the issue tracker", new Exception());
+ level.getServer().getLogger().log(java.util.logging.Level.WARNING, "Unknown target reason, please report on the issue tracker", new Exception());
+ }
+ CraftLivingEntity ctarget = null;
+ if (entityliving != null) {
+ ctarget = (CraftLivingEntity) entityliving.getBukkitEntity();
+ }
+ EntityTargetLivingEntityEvent event = new EntityTargetLivingEntityEvent(this.getBukkitEntity(), ctarget, reason);
+ world.getServer().getPluginManager().callEvent(event);
+ level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return false;
+ }
@@ -81,13 +72,13 @@
+ entityliving = null;
+ }
+ }
this.goalTarget = entityliving;
this.target = entityliving;
+ return true;
+ // CraftBukkit end
}
@Override
@@ -425,16 +474,26 @@
@@ -442,16 +491,26 @@
nbttagcompound.setBoolean("NoAI", this.isNoAI());
}
@@ -107,16 +98,16 @@
+ }
}
- this.persistent = nbttagcompound.getBoolean("PersistenceRequired");
- this.persistenceRequired = nbttagcompound.getBoolean("PersistenceRequired");
+ boolean data = nbttagcompound.getBoolean("PersistenceRequired");
+ if (isLevelAtLeast(nbttagcompound, 1) || data) {
+ this.persistent = data;
+ this.persistenceRequired = data;
+ }
+ // CraftBukkit end
NBTTagList nbttaglist;
int i;
@@ -481,6 +540,11 @@
@@ -498,6 +557,11 @@
}
this.setNoAI(nbttagcompound.getBoolean("NoAI"));
@@ -128,38 +119,26 @@
}
@Override
@@ -488,6 +552,11 @@
super.a(damagesource, flag);
this.lootTableKey = null;
}
+ // CraftBukkit - start
+ public MinecraftKey getLootTable() {
+ return getDefaultLootTable();
+ }
+ // CraftBukkit - end
@Override
protected LootTableInfo.Builder a(boolean flag, DamageSource damagesource) {
@@ -544,7 +613,7 @@
@@ -561,7 +625,7 @@
protected void b(EntityItem entityitem) {
ItemStack itemstack = entityitem.getItemStack();
- if (this.g(itemstack)) {
+ if (this.g(itemstack, entityitem)) { // CraftBukkit - add item
- if (this.j(itemstack)) {
+ if (this.j(itemstack, entityitem)) { // CraftBukkit - add item
this.a(entityitem);
this.receive(entityitem, itemstack.getCount());
entityitem.die();
@@ -553,15 +622,29 @@
@@ -570,15 +634,29 @@
}
public boolean g(ItemStack itemstack) {
public boolean j(ItemStack itemstack) {
+ // CraftBukkit start - add item
+ return this.g(itemstack, null);
+ return this.j(itemstack, null);
+ }
+
+ public boolean g(ItemStack itemstack, EntityItem entityitem) {
+ public boolean j(ItemStack itemstack, EntityItem entityitem) {
+ // CraftBukkit end
EnumItemSlot enumitemslot = j(itemstack);
EnumItemSlot enumitemslot = getEquipmentSlotForItem(itemstack);
ItemStack itemstack1 = this.getEquipment(enumitemslot);
boolean flag = this.a(itemstack, itemstack1);
@@ -175,18 +154,18 @@
if (!itemstack1.isEmpty() && (double) Math.max(this.random.nextFloat() - 0.1F, 0.0F) < d0) {
+ this.forceDrops = true; // CraftBukkit
this.a(itemstack1);
this.b(itemstack1);
+ this.forceDrops = false; // CraftBukkit
}
this.b(enumitemslot, itemstack);
@@ -674,18 +757,18 @@
EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D);
@@ -691,18 +769,18 @@
EntityHuman entityhuman = this.level.findNearbyPlayer(this, -1.0D);
if (entityhuman != null) {
- double d0 = entityhuman.h(this);
+ double d0 = entityhuman.h((Entity) this); // CraftBukkit - decompile error
int i = this.getEntityType().e().f();
- double d0 = entityhuman.f(this);
+ double d0 = entityhuman.f((Entity) this); // CraftBukkit - decompile error
int i = this.getEntityType().f().f();
int j = i * i;
- if (d0 > (double) j && this.isTypeNotPersistent(d0)) {
@@ -194,59 +173,59 @@
this.die();
}
int k = this.getEntityType().e().g();
int k = this.getEntityType().f().g();
int l = k * k;
- if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d0 > (double) l && this.isTypeNotPersistent(d0)) {
+ if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d0 > (double) l) { // CraftBukkit - remove isTypeNotPersistent() check
- if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && d0 > (double) l && this.isTypeNotPersistent(d0)) {
+ if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && d0 > (double) l) { // CraftBukkit - remove isTypeNotPersistent() check
this.die();
} else if (d0 < (double) l) {
this.ticksFarFromPlayer = 0;
@@ -700,6 +783,7 @@
this.noActionTime = 0;
@@ -717,6 +795,7 @@
@Override
protected final void doTick() {
++this.ticksFarFromPlayer;
++this.noActionTime;
+ if (!this.aware) return; // CraftBukkit
this.world.getMethodProfiler().enter("sensing");
this.bo.a();
this.world.getMethodProfiler().exit();
@@ -1088,6 +1172,12 @@
this.level.getMethodProfiler().enter("sensing");
this.sensing.a();
this.level.getMethodProfiler().exit();
@@ -1100,6 +1179,12 @@
if (!this.isAlive()) {
return EnumInteractionResult.PASS;
} else if (this.getLeashHolder() == entityhuman) {
+ // CraftBukkit start - fire PlayerUnleashEntityEvent
+ if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) {
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(this, this.getLeashHolder()));
+ ((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutAttachEntity(this, this.getLeashHolder()));
+ return EnumInteractionResult.PASS;
+ }
+ // CraftBukkit end
this.unleash(true, !entityhuman.abilities.canInstantlyBuild);
return EnumInteractionResult.a(this.world.isClientSide);
this.unleash(true, !entityhuman.getAbilities().instabuild);
return EnumInteractionResult.a(this.level.isClientSide);
} else {
@@ -1106,6 +1196,12 @@
@@ -1118,6 +1203,12 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.LEAD && this.a(entityhuman)) {
if (itemstack.a(Items.LEAD) && this.a(entityhuman)) {
+ // CraftBukkit start - fire PlayerLeashEntityEvent
+ if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) {
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(this, this.getLeashHolder()));
+ ((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutAttachEntity(this, this.getLeashHolder()));
+ return EnumInteractionResult.PASS;
+ }
+ // CraftBukkit end
this.setLeashHolder(entityhuman, true);
itemstack.subtract(1);
return EnumInteractionResult.a(this.world.isClientSide);
@@ -1121,7 +1217,7 @@
return EnumInteractionResult.a(this.level.isClientSide);
@@ -1133,7 +1224,7 @@
if (itemstack.getItem() instanceof ItemMonsterEgg) {
if (this.world instanceof WorldServer) {
if (this.level instanceof WorldServer) {
ItemMonsterEgg itemmonsteregg = (ItemMonsterEgg) itemstack.getItem();
- Optional<EntityInsentient> optional = itemmonsteregg.a(entityhuman, this, this.getEntityType(), (WorldServer) this.world, this.getPositionVector(), itemstack);
+ Optional<EntityInsentient> optional = itemmonsteregg.a(entityhuman, this, (EntityTypes<? extends EntityInsentient>) this.getEntityType(), (WorldServer) this.world, this.getPositionVector(), itemstack); // CraftBukkit - decompile error
- Optional<EntityInsentient> optional = itemmonsteregg.a(entityhuman, this, this.getEntityType(), (WorldServer) this.level, this.getPositionVector(), itemstack);
+ Optional<EntityInsentient> optional = itemmonsteregg.a(entityhuman, this, (EntityTypes<? extends EntityInsentient>) this.getEntityType(), (WorldServer) this.level, this.getPositionVector(), itemstack); // CraftBukkit - decompile error
optional.ifPresent((entityinsentient) -> {
this.a(entityhuman, entityinsentient);
@@ -1167,12 +1263,19 @@
return this.bA != -1.0F;
@@ -1183,12 +1274,19 @@
return this.restrictRadius != -1.0F;
}
+ // CraftBukkit start
@@ -258,55 +237,55 @@
+ @Nullable
+ public <T extends EntityInsentient> T a(EntityTypes<T> entitytypes, boolean flag, EntityTransformEvent.TransformReason transformReason, CreatureSpawnEvent.SpawnReason spawnReason) {
+ // CraftBukkit end
if (this.dead) {
if (this.isRemoved()) {
return null;
} else {
- T t0 = (EntityInsentient) entitytypes.a(this.world);
+ T t0 = entitytypes.a(this.world); // CraftBukkit - decompile error
- T t0 = (EntityInsentient) entitytypes.a(this.level);
+ T t0 = entitytypes.a(this.level); // CraftBukkit - decompile error
t0.u(this);
t0.s(this);
t0.setBaby(this.isBaby());
@@ -1204,7 +1307,12 @@
@@ -1220,7 +1318,12 @@
}
}
- this.world.addEntity(t0);
- this.level.addEntity(t0);
+ // CraftBukkit start
+ if (CraftEventFactory.callEntityTransformEvent(this, t0, transformReason).isCancelled()) {
+ return null;
+ }
+ this.world.addEntity(t0, spawnReason);
+ this.level.addEntity(t0, spawnReason);
+ // CraftBukkit end
if (this.isPassenger()) {
Entity entity = this.getVehicle();
@@ -1224,6 +1332,7 @@
@@ -1240,6 +1343,7 @@
if (this.leashHolder != null) {
if (!this.isAlive() || !this.leashHolder.isAlive()) {
+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), (!this.isAlive()) ? UnleashReason.PLAYER_UNLEASH : UnleashReason.HOLDER_GONE)); // CraftBukkit
+ this.level.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), (!this.isAlive()) ? UnleashReason.PLAYER_UNLEASH : UnleashReason.HOLDER_GONE)); // CraftBukkit
this.unleash(true, true);
}
@@ -1240,7 +1349,9 @@
@@ -1251,7 +1355,9 @@
this.leashHolder = null;
this.by = null;
if (!this.world.isClientSide && flag1) {
this.leashInfoTag = null;
if (!this.level.isClientSide && flag1) {
+ this.forceDrops = true; // CraftBukkit
this.a((IMaterial) Items.LEAD);
+ this.forceDrops = false; // CraftBukkit
}
if (!this.world.isClientSide && flag && this.world instanceof WorldServer) {
@@ -1290,6 +1401,7 @@
if (!this.level.isClientSide && flag && this.level instanceof WorldServer) {
@@ -1301,6 +1407,7 @@
boolean flag1 = super.a(entity, flag);
if (flag1 && this.isLeashed()) {
+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit
+ this.level.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit
this.unleash(true, true);
}
@@ -1422,7 +1534,14 @@
@@ -1396,7 +1503,14 @@
int i = EnchantmentManager.getFireAspectEnchantmentLevel(this);
if (i > 0) {
@@ -322,11 +301,15 @@
}
boolean flag = entity.damageEntity(DamageSource.mobAttack(this), f);
@@ -1484,6 +1603,7 @@
@@ -1464,9 +1578,10 @@
@Override
protected void bN() {
super.bN();
+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit
protected void cc() {
super.cc();
+ this.level.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit
this.unleash(true, false);
this.by().forEach((itemstack) -> {
- itemstack.setCount(0);
+ if (!itemstack.isEmpty()) itemstack.setCount(0); // CraftBukkit
});
}
}

View File

@@ -1,8 +1,8 @@
--- a/net/minecraft/world/entity/EntityLightning.java
+++ b/net/minecraft/world/entity/EntityLightning.java
@@ -22,6 +22,11 @@
import net.minecraft.world.level.block.state.IBlockData;
@@ -32,6 +32,11 @@
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
+import net.minecraft.network.protocol.game.PacketPlayOutNamedSoundEffect;
@@ -11,65 +11,54 @@
+
public class EntityLightning extends Entity {
private int lifeTicks;
@@ -62,7 +67,24 @@
this.a(4);
}
- this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F);
+ // CraftBukkit start - Use relative location for far away sounds
+ // this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F);
+ float pitch = 0.8F + this.random.nextFloat() * 0.2F;
+ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16;
+ for (EntityPlayer player : (List<EntityPlayer>) (List) this.world.getPlayers()) {
+ double deltaX = this.locX() - player.locX();
+ double deltaZ = this.locZ() - player.locZ();
+ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ;
+ if (distanceSquared > viewDistance * viewDistance) {
+ double deltaLength = Math.sqrt(distanceSquared);
+ double relativeX = player.locX() + (deltaX / deltaLength) * viewDistance;
+ double relativeZ = player.locZ() + (deltaZ / deltaLength) * viewDistance;
+ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, relativeX, this.locY(), relativeZ, 10000.0F, pitch));
+ } else {
+ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, this.locX(), this.locY(), this.locZ(), 10000.0F, pitch));
+ }
+ }
+ // CraftBukkit end
this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F);
}
@@ -78,7 +100,7 @@
private static final int START_LIFE = 2;
@@ -132,7 +137,7 @@
}
}
- if (this.lifeTicks >= 0) {
+ if (this.lifeTicks >= 0 && !this.isEffect) { // CraftBukkit - add !this.isEffect
if (!(this.world instanceof WorldServer)) {
this.world.c(2);
} else if (!this.isEffect) {
@@ -106,7 +128,11 @@
IBlockData iblockdata = BlockFireAbstract.a((IBlockAccess) this.world, blockposition);
- if (this.life >= 0) {
+ if (this.life >= 0 && !this.visualOnly) { // CraftBukkit - add !this.isEffect
if (!(this.level instanceof WorldServer)) {
this.level.c(2);
} else if (!this.visualOnly) {
@@ -166,8 +171,12 @@
IBlockData iblockdata = BlockFireAbstract.a((IBlockAccess) this.level, blockposition);
if (this.world.getType(blockposition).isAir() && iblockdata.canPlace(this.world, blockposition)) {
- this.world.setTypeUpdate(blockposition, iblockdata);
if (this.level.getType(blockposition).isAir() && iblockdata.canPlace(this.level, blockposition)) {
- this.level.setTypeUpdate(blockposition, iblockdata);
- ++this.blocksSetOnFire;
+ // CraftBukkit start - add "!isEffect"
+ if (!isEffect && !CraftEventFactory.callBlockIgniteEvent(world, blockposition, this).isCancelled()) {
+ this.world.setTypeUpdate(blockposition, iblockdata);
+ if (!visualOnly && !CraftEventFactory.callBlockIgniteEvent(level, blockposition, this).isCancelled()) {
+ this.level.setTypeUpdate(blockposition, iblockdata);
+ ++this.blocksSetOnFire;
+ }
+ // CraftBukkit end
}
for (int j = 0; j < i; ++j) {
@@ -114,7 +140,11 @@
@@ -175,8 +184,12 @@
iblockdata = BlockFireAbstract.a((IBlockAccess) this.world, blockposition1);
if (this.world.getType(blockposition1).isAir() && iblockdata.canPlace(this.world, blockposition1)) {
- this.world.setTypeUpdate(blockposition1, iblockdata);
iblockdata = BlockFireAbstract.a((IBlockAccess) this.level, blockposition1);
if (this.level.getType(blockposition1).isAir() && iblockdata.canPlace(this.level, blockposition1)) {
- this.level.setTypeUpdate(blockposition1, iblockdata);
- ++this.blocksSetOnFire;
+ // CraftBukkit start - add "!isEffect"
+ if (!isEffect && !CraftEventFactory.callBlockIgniteEvent(world, blockposition1, this).isCancelled()) {
+ this.world.setTypeUpdate(blockposition1, iblockdata);
+ if (!visualOnly && !CraftEventFactory.callBlockIgniteEvent(level, blockposition1, this).isCancelled()) {
+ this.level.setTypeUpdate(blockposition1, iblockdata);
+ ++this.blocksSetOnFire;
+ }
+ // CraftBukkit end
}
}
@@ -240,8 +253,9 @@
iblockdata = world.getType(blockposition1);
} while (!(iblockdata.getBlock() instanceof WeatheringCopper));
+ BlockPosition blockposition1Final = blockposition1; // CraftBukkit - decompile error
WeatheringCopper.b(iblockdata).ifPresent((iblockdata1) -> {
- world.setTypeUpdate(blockposition1, iblockdata1);
+ world.setTypeUpdate(blockposition1Final, iblockdata1); // CraftBukkit - decompile error
});
world.triggerEffect(3002, blockposition1, -1);
return Optional.of(blockposition1);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/EntityLiving.java
+++ b/net/minecraft/world/entity/EntityLiving.java
@@ -111,6 +111,30 @@
@@ -119,6 +119,30 @@
import net.minecraft.world.scores.ScoreboardTeam;
import org.apache.logging.log4j.Logger;
@@ -30,11 +30,11 @@
+
public abstract class EntityLiving extends Entity {
private static final UUID b = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D");
@@ -196,6 +220,21 @@
private float bB;
private float bC;
protected BehaviorController<?> bg;
private static final UUID SPEED_MODIFIER_SPRINTING_UUID = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D");
@@ -227,6 +251,21 @@
private float swimAmount;
private float swimAmountO;
protected BehaviorController<?> brain;
+ // CraftBukkit start
+ public int expToDrop;
+ public int maxAirTicks = 300;
@@ -43,7 +43,7 @@
+ public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes;
+ public boolean collides = true;
+ public Set<UUID> collidableExemptions = new HashSet<>();
+ public boolean canPickUpLoot;
+ public boolean bukkitPickUpLoot;
+
+ @Override
+ public float getBukkitYaw() {
@@ -53,57 +53,59 @@
protected EntityLiving(EntityTypes<? extends EntityLiving> entitytypes, World world) {
super(entitytypes, world);
@@ -207,7 +246,9 @@
this.activeItem = ItemStack.b;
this.by = Optional.empty();
this.attributeMap = new AttributeMapBase(AttributeDefaults.a(entitytypes));
@@ -239,7 +278,9 @@
this.useItem = ItemStack.EMPTY;
this.lastClimbablePos = Optional.empty();
this.attributes = new AttributeMapBase(AttributeDefaults.a(entitytypes));
- this.setHealth(this.getMaxHealth());
+ this.craftAttributes = new CraftAttributeMap(attributeMap); // CraftBukkit
+ this.craftAttributes = new CraftAttributeMap(attributes); // CraftBukkit
+ // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor
+ this.datawatcher.set(EntityLiving.HEALTH, (float) this.getAttributeInstance(GenericAttributes.MAX_HEALTH).getValue());
this.i = true;
this.az = (float) ((Math.random() + 1.0D) * 0.009999999776482582D);
this.af();
@@ -274,7 +315,13 @@
+ this.entityData.set(EntityLiving.DATA_HEALTH_ID, (float) this.getAttributeInstance(GenericAttributes.MAX_HEALTH).getValue());
this.blocksBuilding = true;
this.rotA = (float) ((Math.random() + 1.0D) * 0.009999999776482582D);
this.ah();
@@ -306,7 +347,13 @@
double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D);
int i = (int) (150.0D * d1);
- ((WorldServer) this.world).a(new ParticleParamBlock(Particles.BLOCK, iblockdata), this.locX(), this.locY(), this.locZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D);
- ((WorldServer) this.level).a(new ParticleParamBlock(Particles.BLOCK, iblockdata), this.locX(), this.locY(), this.locZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D);
+ // CraftBukkit start - visiblity api
+ if (this instanceof EntityPlayer) {
+ ((WorldServer) this.world).sendParticles((EntityPlayer) this, new ParticleParamBlock(Particles.BLOCK, iblockdata), this.locX(), this.locY(), this.locZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, false);
+ ((WorldServer) this.level).sendParticles((EntityPlayer) this, new ParticleParamBlock(Particles.BLOCK, iblockdata), this.locX(), this.locY(), this.locZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, false);
+ } else {
+ ((WorldServer) this.world).a(new ParticleParamBlock(Particles.BLOCK, iblockdata), this.locX(), this.locY(), this.locZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D);
+ ((WorldServer) this.level).a(new ParticleParamBlock(Particles.BLOCK, iblockdata), this.locX(), this.locY(), this.locZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D);
+ }
+ // CraftBukkit end
}
}
@@ -496,7 +543,7 @@
@@ -566,7 +613,7 @@
protected void cU() {
++this.deathTicks;
- if (this.deathTicks == 20) {
+ if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead)
this.die();
for (int i = 0; i < 20; ++i) {
@@ -587,7 +634,13 @@
protected void dB() {
++this.deathTime;
- if (this.deathTime == 20 && !this.level.isClientSide()) {
+ if (this.deathTime >= 20 && !this.isRemoved() && !this.level.isClientSide()) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead)
this.level.broadcastEntityEffect(this, (byte) 60);
this.a(Entity.RemovalReason.KILLED);
}
@@ -658,9 +705,15 @@
}
protected void playEquipSound(ItemStack itemstack) {
- if (!itemstack.isEmpty()) {
+ // CraftBukkit start
+ this.playEquipSound(itemstack, false);
+ }
+
+ protected void playEquipSound(ItemStack itemstack, boolean silent) {
+ if (!itemstack.isEmpty() && !silent) {
+ // CraftBukkit end
SoundEffect soundeffect = SoundEffects.ITEM_ARMOR_EQUIP_GENERIC;
Item item = itemstack.getItem();
SoundEffect soundeffect = itemstack.M();
@@ -657,6 +710,17 @@
- if (!itemstack.isEmpty() && soundeffect != null && !this.isSpectator()) {
+ if (!itemstack.isEmpty() && soundeffect != null && !this.isSpectator() && !silent) {
+ // CraftBukkit end
this.a(GameEvent.EQUIP);
this.playSound(soundeffect, 1.0F, 1.0F);
}
@@ -722,6 +775,17 @@
}
}
@@ -121,7 +123,7 @@
if (nbttagcompound.hasKeyOfType("Health", 99)) {
this.setHealth(nbttagcompound.getFloat("Health"));
}
@@ -694,9 +758,32 @@
@@ -759,9 +823,32 @@
}
@@ -148,16 +150,16 @@
+ // CraftBukkit end
+
protected void tickPotionEffects() {
Iterator iterator = this.effects.keySet().iterator();
Iterator iterator = this.activeEffects.keySet().iterator();
+ isTickingEffects = true; // CraftBukkit
try {
while (iterator.hasNext()) {
MobEffectList mobeffectlist = (MobEffectList) iterator.next();
@@ -706,6 +793,12 @@
this.a(mobeffect, true);
@@ -771,6 +858,12 @@
this.a(mobeffect, true, (Entity) null);
})) {
if (!this.world.isClientSide) {
if (!this.level.isClientSide) {
+ // CraftBukkit start
+ EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, mobeffect, null, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.EXPIRATION);
+ if (event.isCancelled()) {
@@ -165,9 +167,9 @@
+ }
+ // CraftBukkit end
iterator.remove();
this.b(mobeffect);
this.a(mobeffect);
}
@@ -716,6 +809,17 @@
@@ -781,6 +874,17 @@
} catch (ConcurrentModificationException concurrentmodificationexception) {
;
}
@@ -183,10 +185,10 @@
+ effectsToProcess.clear();
+ // CraftBukkit end
if (this.updateEffects) {
if (!this.world.isClientSide) {
@@ -825,7 +929,13 @@
this.datawatcher.set(EntityLiving.f, 0);
if (this.effectsDirty) {
if (!this.level.isClientSide) {
@@ -907,7 +1011,13 @@
this.entityData.set(EntityLiving.DATA_EFFECT_COLOR_ID, 0);
}
+ // CraftBukkit start
@@ -196,45 +198,49 @@
+
+ public boolean removeAllEffects(EntityPotionEffectEvent.Cause cause) {
+ // CraftBukkit end
if (this.world.isClientSide) {
if (this.level.isClientSide) {
return false;
} else {
@@ -834,7 +944,14 @@
@@ -916,7 +1026,14 @@
boolean flag;
for (flag = false; iterator.hasNext(); flag = true) {
- this.b((MobEffect) iterator.next());
- this.a((MobEffect) iterator.next());
+ // CraftBukkit start
+ MobEffect effect = (MobEffect) iterator.next();
+ EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED);
+ if (event.isCancelled()) {
+ continue;
+ }
+ this.b(effect);
+ this.a(effect);
+ // CraftBukkit end
iterator.remove();
}
@@ -859,18 +976,44 @@
return (MobEffect) this.effects.get(mobeffectlist);
@@ -945,18 +1062,48 @@
return this.addEffect(mobeffect, (Entity) null);
}
+ // CraftBukkit start
public boolean addEffect(MobEffect mobeffect) {
+ return addEffect(mobeffect, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN);
+ public boolean addEffect(MobEffect mobeffect, EntityPotionEffectEvent.Cause cause) {
+ return this.addEffect(mobeffect, (Entity) null, cause);
+ }
+
+ public boolean addEffect(MobEffect mobeffect, EntityPotionEffectEvent.Cause cause) {
public boolean addEffect(MobEffect mobeffect, @Nullable Entity entity) {
+ return this.addEffect(mobeffect, entity, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.UNKNOWN);
+ }
+
+ public boolean addEffect(MobEffect mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause) {
+ if (isTickingEffects) {
+ effectsToProcess.add(new ProcessableEffect(mobeffect, cause));
+ return true;
+ }
+ // CraftBukkit end
+
if (!this.d(mobeffect)) {
if (!this.c(mobeffect)) {
return false;
} else {
MobEffect mobeffect1 = (MobEffect) this.effects.get(mobeffect.getMobEffect());
MobEffect mobeffect1 = (MobEffect) this.activeEffects.get(mobeffect.getMobEffect());
+ // CraftBukkit start
+ boolean override = false;
@@ -249,19 +255,19 @@
+ // CraftBukkit end
+
if (mobeffect1 == null) {
this.effects.put(mobeffect.getMobEffect(), mobeffect);
this.a(mobeffect);
this.activeEffects.put(mobeffect.getMobEffect(), mobeffect);
this.a(mobeffect, entity);
return true;
- } else if (mobeffect1.b(mobeffect)) {
+ // CraftBukkit start
+ } else if (event.isOverride()) {
+ mobeffect1.b(mobeffect);
this.a(mobeffect1, true);
this.a(mobeffect1, true, entity);
+ // CraftBukkit end
return true;
} else {
return false;
@@ -894,13 +1037,39 @@
@@ -993,13 +1140,39 @@
return this.getMonsterType() == EnumMonsterType.UNDEAD;
}
@@ -278,7 +284,7 @@
+ return null;
+ }
+
+ MobEffect effect = this.effects.get(mobeffectlist);
+ MobEffect effect = this.activeEffects.get(mobeffectlist);
+ if (effect == null) {
+ return null;
+ }
@@ -288,7 +294,7 @@
+ return null;
+ }
+
return (MobEffect) this.effects.remove(mobeffectlist);
return (MobEffect) this.activeEffects.remove(mobeffectlist);
}
public boolean removeEffect(MobEffectList mobeffectlist) {
@@ -301,8 +307,8 @@
+ // CraftBukkit end
if (mobeffect != null) {
this.b(mobeffect);
@@ -937,20 +1106,55 @@
this.a(mobeffect);
@@ -1036,20 +1209,55 @@
}
@@ -319,7 +325,7 @@
+ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), f, regainReason);
+ // Suppress during worldgen
+ if (this.valid) {
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+ }
+
+ if (!event.isCancelled()) {
@@ -336,7 +342,7 @@
+ return (float) ((EntityPlayer) this).getBukkitEntity().getHealth();
+ }
+ // CraftBukkit end
return (Float) this.datawatcher.get(EntityLiving.HEALTH);
return (Float) this.entityData.get(EntityLiving.DATA_HEALTH_ID);
}
public void setHealth(float f) {
@@ -356,31 +362,22 @@
+ return;
+ }
+ // CraftBukkit end
this.datawatcher.set(EntityLiving.HEALTH, MathHelper.a(f, 0.0F, this.getMaxHealth()));
this.entityData.set(EntityLiving.DATA_HEALTH_ID, MathHelper.a(f, 0.0F, this.getMaxHealth()));
}
@@ -964,7 +1168,7 @@
@@ -1063,7 +1271,7 @@
return false;
} else if (this.world.isClientSide) {
} else if (this.level.isClientSide) {
return false;
- } else if (this.dl()) {
+ } else if (this.dead || this.killed || this.getHealth() <= 0.0F) { // CraftBukkit - Don't allow entities that got set to dead/killed elsewhere to get damaged and die
- } else if (this.dV()) {
+ } else if (this.isRemoved() || this.dead || this.getHealth() <= 0.0F) { // CraftBukkit - Don't allow entities that got set to dead/killed elsewhere to get damaged and die
return false;
} else if (damagesource.isFire() && this.hasEffect(MobEffects.FIRE_RESISTANCE)) {
return false;
@@ -976,17 +1180,19 @@
this.ticksFarFromPlayer = 0;
@@ -1074,10 +1282,11 @@
this.noActionTime = 0;
float f1 = f;
- if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && !this.getEquipment(EnumItemSlot.HEAD).isEmpty()) {
+ // CraftBukkit - Moved into damageEntity0(DamageSource, float)
+ if (false && (damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && !this.getEquipment(EnumItemSlot.HEAD).isEmpty()) {
this.getEquipment(EnumItemSlot.HEAD).damage((int) (f * 4.0F + this.random.nextFloat() * f * 2.0F), this, (entityliving) -> {
entityliving.broadcastItemBreak(EnumItemSlot.HEAD);
});
f *= 0.75F;
}
- boolean flag = false;
+ boolean flag = f > 0.0F && this.applyBlockingModifier(damagesource); // Copied from below
float f2 = 0.0F;
@@ -391,38 +388,45 @@
this.damageShield(f);
f2 = f;
f = 0.0F;
@@ -1004,22 +1210,41 @@
this.av = 1.5F;
@@ -1095,27 +1304,47 @@
this.animationSpeed = 1.5F;
boolean flag1 = true;
- if ((float) this.noDamageTicks > 10.0F) {
+ if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) { // CraftBukkit - restore use of maxNoDamageTicks
if (f <= this.lastDamage) {
- if ((float) this.invulnerableTime > 10.0F) {
+ if ((float) this.invulnerableTime > (float) this.invulnerableDuration / 2.0F) { // CraftBukkit - restore use of maxNoDamageTicks
if (f <= this.lastHurt) {
+ this.forceExplosionKnockback = true; // CraftBukkit - SPIGOT-949 - for vanilla consistency, cooldown does not prevent explosion knockback
return false;
}
- this.damageEntity0(damagesource, f - this.lastDamage);
- this.damageEntity0(damagesource, f - this.lastHurt);
+ // CraftBukkit start
+ if (!this.damageEntity0(damagesource, f - this.lastDamage)) {
+ if (!this.damageEntity0(damagesource, f - this.lastHurt)) {
+ return false;
+ }
+ // CraftBukkit end
this.lastDamage = f;
this.lastHurt = f;
flag1 = false;
} else {
+ // CraftBukkit start
+ if (!this.damageEntity0(damagesource, f)) {
+ return false;
+ }
this.lastDamage = f;
- this.noDamageTicks = 20;
this.lastHurt = f;
- this.invulnerableTime = 20;
- this.damageEntity0(damagesource, f);
+ this.noDamageTicks = this.maxNoDamageTicks; // CraftBukkit - restore use of maxNoDamageTicks
+ this.invulnerableTime = this.invulnerableDuration; // CraftBukkit - restore use of maxNoDamageTicks
+ // this.damageEntity0(damagesource, f);
+ // CraftBukkit end
this.hurtDuration = 10;
this.hurtTicks = this.hurtDuration;
this.hurtTime = this.hurtDuration;
}
- if (damagesource.g() && !this.getEquipment(EnumItemSlot.HEAD).isEmpty()) {
+ // CraftBukkit - Moved into damageEntity0(DamageSource, float)
+ if (false && damagesource.g() && !this.getEquipment(EnumItemSlot.HEAD).isEmpty()) {
this.damageHelmet(damagesource, f);
f *= 0.75F;
}
+ // CraftBukkit start
@@ -434,21 +438,21 @@
+ }
+ // CraftBukkit end
+
this.ap = 0.0F;
this.hurtDir = 0.0F;
Entity entity1 = damagesource.getEntity();
@@ -1140,19 +1365,29 @@
@@ -1238,19 +1467,29 @@
EnumHand[] aenumhand = EnumHand.values();
int i = aenumhand.length;
+ // CraftBukkit start
+ ItemStack itemstack1 = ItemStack.b;
+ ItemStack itemstack1 = ItemStack.EMPTY;
for (int j = 0; j < i; ++j) {
EnumHand enumhand = aenumhand[j];
- ItemStack itemstack1 = this.b(enumhand);
+ itemstack1 = this.b(enumhand);
if (itemstack1.getItem() == Items.TOTEM_OF_UNDYING) {
if (itemstack1.a(Items.TOTEM_OF_UNDYING)) {
itemstack = itemstack1.cloneItemStack();
- itemstack1.subtract(1);
+ // itemstack1.subtract(1); // CraftBukkit
@@ -460,7 +464,7 @@
- if (this instanceof EntityPlayer) {
+ EntityResurrectEvent event = new EntityResurrectEvent((LivingEntity) this.getBukkitEntity());
+ event.setCancelled(itemstack == null);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ if (!itemstack1.isEmpty()) {
@@ -471,21 +475,21 @@
EntityPlayer entityplayer = (EntityPlayer) this;
entityplayer.b(StatisticList.ITEM_USED.b(Items.TOTEM_OF_UNDYING));
@@ -1160,14 +1395,16 @@
@@ -1258,14 +1497,16 @@
}
this.setHealth(1.0F);
- this.removeAllEffects();
- this.addEffect(new MobEffect(MobEffects.REGENERATION, 900, 1));
- this.addEffect(new MobEffect(MobEffects.ABSORBTION, 100, 1));
- this.addEffect(new MobEffect(MobEffects.ABSORPTION, 100, 1));
- this.addEffect(new MobEffect(MobEffects.FIRE_RESISTANCE, 800, 0));
+ // CraftBukkit start
+ this.removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM);
+ this.addEffect(new MobEffect(MobEffects.REGENERATION, 900, 1), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM);
+ this.addEffect(new MobEffect(MobEffects.ABSORBTION, 100, 1), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM);
+ this.addEffect(new MobEffect(MobEffects.ABSORPTION, 100, 1), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM);
+ this.addEffect(new MobEffect(MobEffects.FIRE_RESISTANCE, 800, 0), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM);
+ // CraftBukkit end
this.world.broadcastEntityEffect(this, (byte) 35);
this.level.broadcastEntityEffect(this, (byte) 35);
}
- return itemstack != null;
@@ -493,9 +497,9 @@
}
}
@@ -1265,6 +1502,13 @@
@@ -1374,6 +1615,13 @@
if (!flag) {
EntityItem entityitem = new EntityItem(this.world, this.locX(), this.locY(), this.locZ(), new ItemStack(Items.bt));
EntityItem entityitem = new EntityItem(this.level, this.locX(), this.locY(), this.locZ(), new ItemStack(Items.WITHER_ROSE));
+ // CraftBukkit start
+ org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity());
@@ -504,15 +508,15 @@
+ return;
+ }
+ // CraftBukkit end
this.world.addEntity(entityitem);
this.level.addEntity(entityitem);
}
}
@@ -1284,28 +1528,46 @@
@@ -1393,21 +1641,40 @@
boolean flag = this.lastDamageByPlayerTime > 0;
boolean flag = this.lastHurtByPlayerTime > 0;
+ this.dropInventory(); // CraftBukkit - from below
if (this.cW() && this.world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) {
if (this.dD() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
this.a(damagesource, flag);
this.dropDeathLoot(damagesource, i, flag);
}
@@ -531,48 +535,43 @@
- protected void dropExperience() {
+ // CraftBukkit start
+ public int getExpReward() {
if (!this.world.isClientSide && (this.alwaysGivesExp() || this.lastDamageByPlayerTime > 0 && this.isDropExperience() && this.world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT))) {
int i = this.getExpValue(this.killer);
if (this.level instanceof WorldServer && (this.alwaysGivesExp() || this.lastHurtByPlayerTime > 0 && this.isDropExperience() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) {
- EntityExperienceOrb.a((WorldServer) this.level, this.getPositionVector(), this.getExpValue(this.lastHurtByPlayer));
+ int i = this.getExpValue(this.lastHurtByPlayer);
+ return i;
+ } else {
+ return 0;
+ }
+ }
+ // CraftBukkit end
+
+ protected void dropExperience() {
+ // CraftBukkit start - Update getExpReward() above if the removed if() changes!
+ if (true) {
+ int i = this.expToDrop;
while (i > 0) {
int j = EntityExperienceOrb.getOrbValue(i);
i -= j;
this.world.addEntity(new EntityExperienceOrb(this.world, this.locX(), this.locY(), this.locZ(), j));
}
+ EntityExperienceOrb.a((WorldServer) this.level, this.getPositionVector(), this.expToDrop);
+ this.expToDrop = 0;
}
+ // CraftBukkit end
}
@@ -1426,9 +1688,14 @@
int i = this.e(f, f1);
@@ -1523,9 +1790,14 @@
int i = this.d(f, f1);
if (i > 0) {
+ // CraftBukkit start
+ if (!this.damageEntity(DamageSource.FALL, (float) i)) {
+ if (!this.damageEntity(damagesource, (float) i)) {
+ return true;
+ }
+ // CraftBukkit end
this.playSound(this.getSoundFall(i), 1.0F, 1.0F);
this.playBlockStepSound();
- this.damageEntity(DamageSource.FALL, (float) i);
+ // this.damageEntity(DamageSource.FALL, (float) i); // CraftBukkit - moved up
- this.damageEntity(damagesource, (float) i);
+ // this.damageEntity(damagesource, (float) i); // CraftBukkit - moved up
return true;
} else {
return flag;
@@ -1468,7 +1735,7 @@
@@ -1574,7 +1846,7 @@
protected float applyArmorModifier(DamageSource damagesource, float f) {
if (!damagesource.ignoresArmor()) {
@@ -581,17 +580,17 @@
f = CombatMath.a(f, (float) this.getArmorStrength(), (float) this.b(GenericAttributes.ARMOR_TOUGHNESS));
}
@@ -1481,7 +1748,8 @@
@@ -1587,7 +1859,8 @@
} else {
int i;
- if (this.hasEffect(MobEffects.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
- if (this.hasEffect(MobEffects.DAMAGE_RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
+ // CraftBukkit - Moved to damageEntity0(DamageSource, float)
+ if (false && this.hasEffect(MobEffects.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
i = (this.getEffect(MobEffects.RESISTANCE).getAmplifier() + 1) * 5;
+ if (false && this.hasEffect(MobEffects.DAMAGE_RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
i = (this.getEffect(MobEffects.DAMAGE_RESISTANCE).getAmplifier() + 1) * 5;
int j = 25 - i;
float f1 = f * (float) j;
@@ -1512,28 +1780,173 @@
@@ -1618,29 +1891,172 @@
}
}
@@ -608,7 +607,7 @@
+ Function<Double, Double> hardHat = new Function<Double, Double>() {
+ @Override
+ public Double apply(Double f) {
+ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && !EntityLiving.this.getEquipment(EnumItemSlot.HEAD).isEmpty()) {
+ if (damagesource.g() && !EntityLiving.this.getEquipment(EnumItemSlot.HEAD).isEmpty()) {
+ return -(f - (f * 0.75F));
+
+ }
@@ -639,8 +638,8 @@
+ Function<Double, Double> resistance = new Function<Double, Double>() {
+ @Override
+ public Double apply(Double f) {
+ if (!damagesource.isStarvation() && EntityLiving.this.hasEffect(MobEffects.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
+ int i = (EntityLiving.this.getEffect(MobEffects.RESISTANCE).getAmplifier() + 1) * 5;
+ if (!damagesource.isStarvation() && EntityLiving.this.hasEffect(MobEffects.DAMAGE_RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
+ int i = (EntityLiving.this.getEffect(MobEffects.DAMAGE_RESISTANCE).getAmplifier() + 1) * 5;
+ int j = 25 - i;
+ float f1 = f.floatValue() * (float) j;
+ return -(f - (f1 / 25.0F));
@@ -675,9 +674,12 @@
+ if (event.isCancelled()) {
+ return false;
+ }
+
- f = Math.max(f - this.getAbsorptionHearts(), 0.0F);
- this.setAbsorptionHearts(this.getAbsorptionHearts() - (f1 - f));
- float f2 = f1 - f;
+ f = (float) event.getFinalDamage();
+
+ // Resistance
+ if (event.getDamage(DamageModifier.RESISTANCE) < 0) {
+ float f3 = (float) -event.getDamage(DamageModifier.RESISTANCE);
@@ -689,15 +691,10 @@
+ }
+ }
+ }
- f = Math.max(f - this.getAbsorptionHearts(), 0.0F);
- this.setAbsorptionHearts(this.getAbsorptionHearts() - (f1 - f));
- float f2 = f1 - f;
+
+ // Apply damage to helmet
+ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(EnumItemSlot.HEAD) != null) {
+ this.getEquipment(EnumItemSlot.HEAD).damage((int) (event.getDamage() * 4.0F + this.random.nextFloat() * event.getDamage() * 2.0F), this, (entityliving) -> {
+ entityliving.broadcastItemBreak(EnumItemSlot.HEAD);
+ });
+ if (damagesource.g() && !this.getEquipment(EnumItemSlot.HEAD).isEmpty()) {
+ this.damageHelmet(damagesource, f);
+ }
+
+ // Apply damage to armor
@@ -705,12 +702,12 @@
+ float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT));
+ this.damageArmor(damagesource, armorDamage);
+ }
+
+ // Apply blocking code // PAIL: steal from above
+ if (event.getDamage(DamageModifier.BLOCKING) < 0) {
+ this.world.broadcastEntityEffect(this, (byte) 29); // SPIGOT-4635 - shield damage sound
+ this.level.broadcastEntityEffect(this, (byte) 29); // SPIGOT-4635 - shield damage sound
+ this.damageShield((float) -event.getDamage(DamageModifier.BLOCKING));
+ Entity entity = damagesource.j();
+ Entity entity = damagesource.k();
+
+ if (entity instanceof EntityLiving) {
+ this.shieldBlock((EntityLiving) entity);
@@ -747,13 +744,14 @@
+ if (!human) {
+ this.setAbsorptionHearts(this.getAbsorptionHearts() - f);
+ }
this.a(GameEvent.ENTITY_DAMAGED, damagesource.getEntity());
+
+ return true;
+ } else {
+ // Duplicate triggers if blocking
+ if (event.getDamage(DamageModifier.BLOCKING) < 0) {
+ if (this instanceof EntityPlayer) {
+ CriterionTriggers.h.a((EntityPlayer) this, damagesource, f, originalDamage, true);
+ CriterionTriggers.ENTITY_HURT_PLAYER.a((EntityPlayer) this, damagesource, f, originalDamage, true);
+ f2 = (float) -event.getDamage(DamageModifier.BLOCKING);
+ if (f2 > 0.0F && f2 < 3.4028235E37F) {
+ ((EntityPlayer) this).a(StatisticList.DAMAGE_BLOCKED_BY_SHIELD, Math.round(originalDamage * 10.0F));
@@ -761,7 +759,7 @@
+ }
+
+ if (damagesource.getEntity() instanceof EntityPlayer) {
+ CriterionTriggers.g.a((EntityPlayer) damagesource.getEntity(), this, damagesource, f, originalDamage, true);
+ CriterionTriggers.PLAYER_HURT_ENTITY.a((EntityPlayer) damagesource.getEntity(), this, damagesource, f, originalDamage, true);
+ }
+
+ return false;
@@ -775,28 +773,27 @@
}
public CombatTracker getCombatTracker() {
@@ -1554,9 +1967,19 @@
@@ -1661,8 +2077,18 @@
}
public final void setArrowCount(int i) {
- this.datawatcher.set(EntityLiving.ARROWS_IN_BODY, i);
- this.entityData.set(EntityLiving.DATA_ARROW_COUNT_ID, i);
+ // CraftBukkit start
+ setArrowCount(i, false);
}
+ }
+
+ public final void setArrowCount(int i, boolean flag) {
+ ArrowBodyCountChangeEvent event = CraftEventFactory.callArrowBodyCountChangeEvent(this, getArrowCount(), i, flag);
+ if (event.isCancelled()) {
+ return;
+ }
+ this.datawatcher.set(EntityLiving.ARROWS_IN_BODY, event.getNewAmount());
+ }
+ // CraftBukkit end
+
public final int dz() {
return (Integer) this.datawatcher.get(EntityLiving.bi);
+ this.entityData.set(EntityLiving.DATA_ARROW_COUNT_ID, event.getNewAmount());
}
@@ -1684,6 +2107,12 @@
+ // CraftBukkit end
public final int eh() {
return (Integer) this.entityData.get(EntityLiving.DATA_STINGER_COUNT_ID);
@@ -1958,6 +2384,12 @@
public abstract ItemStack getEquipment(EnumItemSlot enumitemslot);
@@ -809,64 +806,57 @@
@Override
public abstract void setSlot(EnumItemSlot enumitemslot, ItemStack itemstack);
@@ -1906,6 +2335,7 @@
@@ -2202,6 +2634,7 @@
}
if (this.onGround && !this.world.isClientSide) {
if (this.onGround && !this.level.isClientSide) {
+ if (getFlag(7) && !CraftEventFactory.callToggleGlideEvent(this, false).isCancelled()) // CraftBukkit
this.setFlag(7, false);
}
} else {
@@ -2411,6 +2841,7 @@
@@ -2732,6 +3165,7 @@
}
if (!this.world.isClientSide) {
if (!this.level.isClientSide) {
+ if (flag != this.getFlag(7) && !CraftEventFactory.callToggleGlideEvent(this, flag).isCancelled()) // CraftBukkit
this.setFlag(7, flag);
}
@@ -2531,6 +2962,7 @@
}
public boolean hasLineOfSight(Entity entity) {
+ if (this.world != entity.world) return false; // CraftBukkit - SPIGOT-5675, SPIGOT-5798, MC-149563
Vec3D vec3d = new Vec3D(this.locX(), this.getHeadY(), this.locZ());
Vec3D vec3d1 = new Vec3D(entity.locX(), entity.getHeadY(), entity.locZ());
@@ -2548,13 +2980,20 @@
@@ -2899,14 +3333,21 @@
@Override
public boolean isInteractable() {
- return !this.dead;
+ return !this.dead && this.collides; // CraftBukkit
- return !this.isRemoved();
+ return !this.isRemoved() && this.collides; // CraftBukkit
}
@Override
public boolean isCollidable() {
- return this.isAlive() && !this.isSpectator() && !this.isClimbing();
+ return this.isAlive() && !this.isSpectator() && !this.isClimbing() && this.collides; // CraftBukkit
+ }
+
}
+ // CraftBukkit start - collidable API
+ @Override
+ public boolean canCollideWith(Entity entity) {
+ public boolean canCollideWithBukkit(Entity entity) {
+ return isCollidable() && this.collides != this.collidableExemptions.contains(entity.getUniqueID());
}
+ }
+ // CraftBukkit end
+
@Override
protected void velocityChanged() {
@@ -2748,7 +3187,25 @@
this.hurtMarked = this.random.nextDouble() >= this.b(GenericAttributes.KNOCKBACK_RESISTANCE);
@@ -3104,7 +3545,25 @@
} else {
if (!this.activeItem.isEmpty() && this.isHandRaised()) {
this.b(this.activeItem, 16);
- ItemStack itemstack = this.activeItem.a(this.world, this);
if (!this.useItem.isEmpty() && this.isHandRaised()) {
this.b(this.useItem, 16);
- ItemStack itemstack = this.useItem.a(this.level, this);
+ // CraftBukkit start - fire PlayerItemConsumeEvent
+ ItemStack itemstack;
+ if (this instanceof EntityPlayer) {
+ org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.activeItem);
+ org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.useItem);
+ PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem);
+ world.getServer().getPluginManager().callEvent(event);
+ level.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ // Update client
@@ -875,15 +865,15 @@
+ return;
+ }
+
+ itemstack = (craftItem.equals(event.getItem())) ? this.activeItem.a(this.world, this) : CraftItemStack.asNMSCopy(event.getItem()).a(world, this);
+ itemstack = (craftItem.equals(event.getItem())) ? this.useItem.a(this.level, this) : CraftItemStack.asNMSCopy(event.getItem()).a(level, this);
+ } else {
+ itemstack = this.activeItem.a(this.world, this);
+ itemstack = this.useItem.a(this.level, this);
+ }
+ // CraftBukkit end
if (itemstack != this.activeItem) {
if (itemstack != this.useItem) {
this.a(enumhand, itemstack);
@@ -2816,6 +3273,12 @@
@@ -3176,6 +3635,12 @@
}
public boolean a(double d0, double d1, double d2, boolean flag) {
@@ -896,7 +886,7 @@
double d3 = this.locX();
double d4 = this.locY();
double d5 = this.locZ();
@@ -2840,16 +3303,41 @@
@@ -3200,16 +3665,41 @@
}
if (flag2) {
@@ -914,8 +904,8 @@
+
+ if (flag1) {
+ if (!(this instanceof EntityPlayer)) {
+ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.world.getWorld(), d3, d4, d5), new Location(this.world.getWorld(), d0, d6, d2));
+ this.world.getServer().getPluginManager().callEvent(teleport);
+ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.level.getWorld(), d3, d4, d5), new Location(this.level.getWorld(), d0, d6, d2));
+ this.level.getServer().getPluginManager().callEvent(teleport);
+ if (!teleport.isCancelled()) {
+ Location to = teleport.getTo();
+ this.enderTeleportTo(to.getX(), to.getY(), to.getZ());
@@ -924,7 +914,7 @@
+ }
+ } else {
+ // player teleport event is called in the underlining code
+ if (((EntityPlayer) this).playerConnection.a(d0, d6, d2, this.yaw, this.pitch, java.util.Collections.emptySet(), cause)) {
+ if (((EntityPlayer) this).connection.a(d0, d6, d2, this.getYRot(), this.getXRot(), java.util.Collections.emptySet(), false, cause)) {
+ return Optional.empty();
+ }
+ }
@@ -941,7 +931,7 @@
} else {
if (flag) {
world.broadcastEntityEffect(this, (byte) 46);
@@ -2859,7 +3347,7 @@
@@ -3219,7 +3709,7 @@
((EntityCreature) this).getNavigation().o();
}
@@ -950,16 +940,25 @@
}
}
@@ -2940,7 +3428,7 @@
@@ -3302,7 +3792,7 @@
}
public void entityWakeup() {
- Optional optional = this.getBedPosition();
+ Optional<BlockPosition> optional = this.getBedPosition(); // CraftBukkit - decompile error
World world = this.world;
World world = this.level;
this.world.getClass();
@@ -3011,7 +3499,7 @@
java.util.Objects.requireNonNull(this.level);
@@ -3334,7 +3824,7 @@
@Nullable
public EnumDirection eW() {
- BlockPosition blockposition = (BlockPosition) this.getBedPosition().orElse((Object) null);
+ BlockPosition blockposition = (BlockPosition) this.getBedPosition().orElse(null); // CraftBukkit - decompile error
return blockposition != null ? BlockBed.a((IBlockAccess) this.level, blockposition) : null;
}
@@ -3383,7 +3873,7 @@
Pair<MobEffect, Float> pair = (Pair) iterator.next();
if (!world.isClientSide && pair.getFirst() != null && world.random.nextFloat() < (Float) pair.getSecond()) {

View File

@@ -1,24 +1,24 @@
--- a/net/minecraft/world/entity/EntityTypes.java
+++ b/net/minecraft/world/entity/EntityTypes.java
@@ -142,7 +142,7 @@
public class EntityTypes<T extends Entity> {
@@ -152,7 +152,7 @@
private static final Logger LOGGER = LogManager.getLogger();
public static final String ENTITY_TAG = "EntityTag";
private static final float MAGIC_HORSE_WIDTH = 1.3964844F;
- public static final EntityTypes<EntityAreaEffectCloud> AREA_EFFECT_CLOUD = a("area_effect_cloud", EntityTypes.Builder.a(EntityAreaEffectCloud::new, EnumCreatureType.MISC).c().a(6.0F, 0.5F).trackingRange(10).updateInterval(Integer.MAX_VALUE));
+ public static final EntityTypes<EntityAreaEffectCloud> AREA_EFFECT_CLOUD = a("area_effect_cloud", EntityTypes.Builder.a(EntityAreaEffectCloud::new, EnumCreatureType.MISC).c().a(6.0F, 0.5F).trackingRange(10).updateInterval(10)); // CraftBukkit - SPIGOT-3729: track area effect clouds
public static final EntityTypes<EntityArmorStand> ARMOR_STAND = a("armor_stand", EntityTypes.Builder.a(EntityArmorStand::new, EnumCreatureType.MISC).a(0.5F, 1.975F).trackingRange(10));
public static final EntityTypes<EntityTippedArrow> ARROW = a("arrow", EntityTypes.Builder.a(EntityTippedArrow::new, EnumCreatureType.MISC).a(0.5F, 0.5F).trackingRange(4).updateInterval(20));
public static final EntityTypes<EntityBat> BAT = a("bat", EntityTypes.Builder.a(EntityBat::new, EnumCreatureType.AMBIENT).a(0.5F, 0.9F).trackingRange(5));
@@ -267,7 +267,7 @@
private MinecraftKey bq;
private final EntitySize br;
public static final EntityTypes<Axolotl> AXOLOTL = a("axolotl", EntityTypes.Builder.a(Axolotl::new, EnumCreatureType.UNDERGROUND_WATER_CREATURE).a(0.75F, 0.42F).trackingRange(10));
@@ -282,7 +282,7 @@
private MinecraftKey lootTable;
private final EntitySize dimensions;
- private static <T extends Entity> EntityTypes<T> a(String s, EntityTypes.Builder<T> entitytypes_builder) {
+ private static <T extends Entity> EntityTypes<T> a(String s, EntityTypes.Builder entitytypes_builder) { // CraftBukkit - decompile error
return (EntityTypes) IRegistry.a((IRegistry) IRegistry.ENTITY_TYPE, s, (Object) entitytypes_builder.a(s));
}
@@ -299,10 +299,18 @@
@@ -314,10 +314,18 @@
@Nullable
public T spawnCreature(WorldServer worldserver, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) {
@@ -33,12 +33,12 @@
if (t0 != null) {
- worldserver.addAllEntities(t0);
+ worldserver.addAllEntities(t0, spawnReason);
+ return !t0.dead ? t0 : null; // Don't return an entity when CreatureSpawnEvent is canceled
+ return !t0.isRemoved() ? t0 : null; // Don't return an entity when CreatureSpawnEvent is canceled
+ // CraftBukkit end
}
return t0;
@@ -338,7 +346,7 @@
@@ -353,7 +361,7 @@
t0.setCustomName(ichatbasecomponent);
}
@@ -47,7 +47,7 @@
return t0;
}
}
@@ -481,7 +489,7 @@
@@ -512,7 +520,7 @@
}
return entity;
@@ -55,9 +55,18 @@
+ }).orElse(null); // CraftBukkit - decompile error
}
private static Optional<Entity> b(NBTTagCompound nbttagcompound, World world) {
@@ -533,7 +541,7 @@
this.g = enumcreaturetype == EnumCreatureType.CREATURE || enumcreaturetype == EnumCreatureType.MISC;
public static Stream<Entity> a(final List<? extends NBTBase> list, final World world) {
@@ -569,7 +577,7 @@
@Nullable
public T a(Entity entity) {
- return entity.getEntityType() == this ? entity : null;
+ return entity.getEntityType() == this ? (T) entity : null; // CraftBukkit - decompile error
}
@Override
@@ -596,7 +604,7 @@
this.canSpawnFarFromPlayer = enumcreaturetype == EnumCreatureType.CREATURE || enumcreaturetype == EnumCreatureType.MISC;
}
- public static <T extends Entity> EntityTypes.Builder<T> a(EntityTypes.b<T> entitytypes_b, EnumCreatureType enumcreaturetype) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/IEntityAngerable.java
+++ b/net/minecraft/world/entity/IEntityAngerable.java
@@ -103,7 +103,7 @@
@@ -108,7 +108,7 @@
default void pacify() {
this.setLastDamager((EntityLiving) null);
this.setAngerTarget((UUID) null);
@@ -9,12 +9,12 @@
this.setAnger(0);
}
@@ -113,6 +113,8 @@
@@ -121,6 +121,8 @@
void setGoalTarget(@Nullable EntityLiving entityliving);
+ boolean setGoalTarget(EntityLiving entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent); // CraftBukkit
+ boolean setGoalTarget(@Nullable EntityLiving entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent); // CraftBukkit
+
boolean c(EntityLiving entityliving);
@Nullable
EntityLiving getGoalTarget();
}

View File

@@ -3,9 +3,9 @@
@@ -42,7 +42,7 @@
ScoreboardTeamBase.EnumTeamPush scoreboardteambase_enumteampush = scoreboardteambase == null ? ScoreboardTeamBase.EnumTeamPush.ALWAYS : scoreboardteambase.getCollisionRule();
return (Predicate) (scoreboardteambase_enumteampush == ScoreboardTeamBase.EnumTeamPush.NEVER ? Predicates.alwaysFalse() : IEntitySelector.g.and((entity1) -> {
return (Predicate) (scoreboardteambase_enumteampush == ScoreboardTeamBase.EnumTeamPush.NEVER ? Predicates.alwaysFalse() : IEntitySelector.NO_SPECTATORS.and((entity1) -> {
- if (!entity1.isCollidable()) {
+ if (!entity1.canCollideWith(entity) || !entity.canCollideWith(entity1)) { // CraftBukkit - collidable API
+ if (!entity1.canCollideWithBukkit(entity) || !entity.canCollideWithBukkit(entity1)) { // CraftBukkit - collidable API
return false;
} else if (entity.world.isClientSide && (!(entity1 instanceof EntityHuman) || !((EntityHuman) entity1).ez())) {
} else if (entity.level.isClientSide && (!(entity1 instanceof EntityHuman) || !((EntityHuman) entity1).fh())) {
return false;

View File

@@ -1,15 +1,15 @@
--- a/net/minecraft/world/entity/SaddleStorage.java
+++ b/net/minecraft/world/entity/SaddleStorage.java
@@ -38,6 +38,15 @@
@@ -40,6 +40,15 @@
}
}
+ // CraftBukkit add setBoostTicks(int)
+ public void setBoostTicks(int ticks) {
+ this.boosting = true;
+ this.currentBoostTicks = 0;
+ this.boostTicks = ticks;
+ this.dataWatcher.set(this.dataWatcherBoostTicks, this.boostTicks);
+ this.boostTime = 0;
+ this.boostTimeTotal = ticks;
+ this.entityData.set(this.boostTimeAccessor, this.boostTimeTotal);
+ }
+ // CraftBukkit end
+

View File

@@ -1,11 +1,11 @@
--- a/net/minecraft/world/entity/ai/attributes/AttributeRanged.java
+++ b/net/minecraft/world/entity/ai/attributes/AttributeRanged.java
@@ -22,6 +22,8 @@
@@ -30,6 +30,8 @@
@Override
public double a(double d0) {
+ if (d0 != d0) return getDefault(); // CraftBukkit
+
d0 = MathHelper.a(d0, this.a, this.maximum);
d0 = MathHelper.a(d0, this.minValue, this.maxValue);
return d0;
}

View File

@@ -5,8 +5,8 @@
package net.minecraft.world.entity.ai.attributes;
import net.minecraft.core.IRegistry;
@@ -19,6 +20,6 @@
public static final AttributeBase JUMP_STRENGTH = a("horse.jump_strength", (new AttributeRanged("attribute.name.horse.jump_strength", 0.7D, 0.0D, 2.0D)).a(true));
@@ -21,6 +22,6 @@
public GenericAttributes() {}
private static AttributeBase a(String s, AttributeBase attributebase) {
- return (AttributeBase) IRegistry.a(IRegistry.ATTRIBUTE, s, (Object) attributebase);

View File

@@ -12,11 +12,11 @@
+
public class BehaviorAttackTargetForget<E extends EntityInsentient> extends Behavior<E> {
private final Predicate<EntityLiving> b;
@@ -60,6 +66,17 @@
private static final int TIMEOUT_TO_GET_WITHIN_ATTACK_RANGE = 200;
@@ -77,6 +83,17 @@
}
private void d(E e0) {
protected void a(E e0) {
+ // CraftBukkit start
+ EntityLiving old = e0.getBehaviorController().getMemory(MemoryModuleType.ATTACK_TARGET).orElse(null);
+ EntityTargetEvent event = CraftEventFactory.callEntityTargetLivingEvent(e0, null, (old != null && !old.isAlive()) ? EntityTargetEvent.TargetReason.TARGET_DIED : EntityTargetEvent.TargetReason.FORGOT_TARGET);
@@ -28,6 +28,6 @@
+ return;
+ }
+ // CraftBukkit end
this.onTargetErased.accept(e0);
e0.getBehaviorController().removeMemory(MemoryModuleType.ATTACK_TARGET);
}
}

View File

@@ -13,13 +13,13 @@
+
public class BehaviorAttackTargetSet<E extends EntityInsentient> extends Behavior<E> {
private final Predicate<E> b;
private final Predicate<E> canAttackPredicate;
@@ -38,13 +45,21 @@
}
protected void a(WorldServer worldserver, E e0, long i) {
- ((Optional) this.c.apply(e0)).ifPresent((entityliving) -> {
+ (this.c.apply(e0)).ifPresent((entityliving) -> { // CraftBukkit - decompile error
- ((Optional) this.targetFinderFunction.apply(e0)).ifPresent((entityliving) -> {
+ (this.targetFinderFunction.apply(e0)).ifPresent((entityliving) -> { // CraftBukkit - decompile error
this.a(e0, entityliving);
});
}

View File

@@ -1,55 +1,55 @@
--- a/net/minecraft/world/entity/ai/behavior/BehaviorFarm.java
+++ b/net/minecraft/world/entity/ai/behavior/BehaviorFarm.java
@@ -78,8 +78,8 @@
@@ -80,8 +80,8 @@
protected void a(WorldServer worldserver, EntityVillager entityvillager, long i) {
if (i > this.c && this.farmBlock != null) {
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (Object) (new BehaviorTarget(this.farmBlock)));
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (Object) (new MemoryTarget(new BehaviorTarget(this.farmBlock), 0.5F, 1)));
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (new BehaviorTarget(this.farmBlock))); // CraftBukkit - decompile error
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (new MemoryTarget(new BehaviorTarget(this.farmBlock), 0.5F, 1))); // CraftBukkit - decompile error
if (i > this.nextOkStartTime && this.aboveFarmlandPos != null) {
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (Object) (new BehaviorTarget(this.aboveFarmlandPos)));
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (Object) (new MemoryTarget(new BehaviorTarget(this.aboveFarmlandPos), 0.5F, 1)));
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (new BehaviorTarget(this.aboveFarmlandPos))); // CraftBukkit - decompile error
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (new MemoryTarget(new BehaviorTarget(this.aboveFarmlandPos), 0.5F, 1))); // CraftBukkit - decompile error
}
}
@@ -99,7 +99,11 @@
Block block1 = worldserver.getType(this.farmBlock.down()).getBlock();
@@ -101,7 +101,11 @@
Block block1 = worldserver.getType(this.aboveFarmlandPos.down()).getBlock();
if (block instanceof BlockCrops && ((BlockCrops) block).isRipe(iblockdata)) {
- worldserver.a(this.farmBlock, true, entityvillager);
- worldserver.a(this.aboveFarmlandPos, true, entityvillager);
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityvillager, this.farmBlock, Blocks.AIR.getBlockData()).isCancelled()) {
+ worldserver.a(this.farmBlock, true, entityvillager);
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityvillager, this.aboveFarmlandPos, Blocks.AIR.getBlockData()).isCancelled()) {
+ worldserver.a(this.aboveFarmlandPos, true, entityvillager);
+ }
+ // CraftBukkit end
}
if (iblockdata.isAir() && block1 instanceof BlockSoil && entityvillager.canPlant()) {
@@ -110,19 +114,28 @@
@@ -112,19 +116,28 @@
boolean flag = false;
if (!itemstack.isEmpty()) {
+ // CraftBukkit start
+ Block planted = null;
if (itemstack.getItem() == Items.WHEAT_SEEDS) {
- worldserver.setTypeAndData(this.farmBlock, Blocks.WHEAT.getBlockData(), 3);
if (itemstack.a(Items.WHEAT_SEEDS)) {
- worldserver.setTypeAndData(this.aboveFarmlandPos, Blocks.WHEAT.getBlockData(), 3);
+ planted = Blocks.WHEAT;
flag = true;
} else if (itemstack.getItem() == Items.POTATO) {
- worldserver.setTypeAndData(this.farmBlock, Blocks.POTATOES.getBlockData(), 3);
} else if (itemstack.a(Items.POTATO)) {
- worldserver.setTypeAndData(this.aboveFarmlandPos, Blocks.POTATOES.getBlockData(), 3);
+ planted = Blocks.POTATOES;
flag = true;
} else if (itemstack.getItem() == Items.CARROT) {
- worldserver.setTypeAndData(this.farmBlock, Blocks.CARROTS.getBlockData(), 3);
} else if (itemstack.a(Items.CARROT)) {
- worldserver.setTypeAndData(this.aboveFarmlandPos, Blocks.CARROTS.getBlockData(), 3);
+ planted = Blocks.CARROTS;
flag = true;
} else if (itemstack.getItem() == Items.BEETROOT_SEEDS) {
- worldserver.setTypeAndData(this.farmBlock, Blocks.BEETROOTS.getBlockData(), 3);
} else if (itemstack.a(Items.BEETROOT_SEEDS)) {
- worldserver.setTypeAndData(this.aboveFarmlandPos, Blocks.BEETROOTS.getBlockData(), 3);
+ planted = Blocks.BEETROOTS;
flag = true;
}
+
+ if (planted != null && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityvillager, this.farmBlock, planted.getBlockData()).isCancelled()) {
+ worldserver.setTypeAndData(this.farmBlock, planted.getBlockData(), 3);
+ if (planted != null && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityvillager, this.aboveFarmlandPos, planted.getBlockData()).isCancelled()) {
+ worldserver.setTypeAndData(this.aboveFarmlandPos, planted.getBlockData(), 3);
+ } else {
+ flag = false;
+ }
@@ -57,14 +57,14 @@
}
if (flag) {
@@ -141,8 +154,8 @@
this.farmBlock = this.a(worldserver);
if (this.farmBlock != null) {
this.c = i + 20L;
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (Object) (new MemoryTarget(new BehaviorTarget(this.farmBlock), 0.5F, 1)));
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (Object) (new BehaviorTarget(this.farmBlock)));
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (new MemoryTarget(new BehaviorTarget(this.farmBlock), 0.5F, 1))); // CraftBukkit - decompile error
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (new BehaviorTarget(this.farmBlock))); // CraftBukkit - decompile error
@@ -143,8 +156,8 @@
this.aboveFarmlandPos = this.a(worldserver);
if (this.aboveFarmlandPos != null) {
this.nextOkStartTime = i + 20L;
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (Object) (new MemoryTarget(new BehaviorTarget(this.aboveFarmlandPos), 0.5F, 1)));
- entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (Object) (new BehaviorTarget(this.aboveFarmlandPos)));
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (new MemoryTarget(new BehaviorTarget(this.aboveFarmlandPos), 0.5F, 1))); // CraftBukkit - decompile error
+ entityvillager.getBehaviorController().setMemory(MemoryModuleType.LOOK_TARGET, (new BehaviorTarget(this.aboveFarmlandPos))); // CraftBukkit - decompile error
}
}
}

View File

@@ -1,43 +1,43 @@
--- a/net/minecraft/world/entity/ai/behavior/BehaviorInteractDoor.java
+++ b/net/minecraft/world/entity/ai/behavior/BehaviorInteractDoor.java
@@ -66,6 +66,13 @@
@@ -69,6 +69,13 @@
BlockDoor blockdoor = (BlockDoor) iblockdata.getBlock();
if (!blockdoor.h(iblockdata)) {
+ // CraftBukkit start - entities opening doors
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.world, blockposition));
+ entityliving.world.getServer().getPluginManager().callEvent(event);
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.level, blockposition));
+ entityliving.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
blockdoor.setDoor(worldserver, iblockdata, blockposition, true);
blockdoor.setDoor(entityliving, worldserver, iblockdata, blockposition, true);
}
@@ -79,6 +86,13 @@
@@ -82,6 +89,13 @@
BlockDoor blockdoor1 = (BlockDoor) iblockdata1.getBlock();
if (!blockdoor1.h(iblockdata1)) {
+ // CraftBukkit start - entities opening doors
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.world, blockposition));
+ entityliving.world.getServer().getPluginManager().callEvent(event);
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.level, blockposition));
+ entityliving.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
blockdoor1.setDoor(worldserver, iblockdata1, blockposition1, true);
blockdoor1.setDoor(entityliving, worldserver, iblockdata1, blockposition1, true);
this.c(worldserver, entityliving, blockposition1);
}
@@ -127,7 +141,7 @@
@@ -130,7 +144,7 @@
private static boolean a(WorldServer worldserver, EntityLiving entityliving, BlockPosition blockposition) {
BehaviorController<?> behaviorcontroller = entityliving.getBehaviorController();
- return !behaviorcontroller.hasMemory(MemoryModuleType.MOBS) ? false : ((List) behaviorcontroller.getMemory(MemoryModuleType.MOBS).get()).stream().filter((entityliving1) -> {
+ return !behaviorcontroller.hasMemory(MemoryModuleType.MOBS) ? false : (behaviorcontroller.getMemory(MemoryModuleType.MOBS).get()).stream().filter((entityliving1) -> { // CraftBukkit - decompile error
- return !behaviorcontroller.hasMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES) ? false : ((List) behaviorcontroller.getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES).get()).stream().filter((entityliving1) -> {
+ return !behaviorcontroller.hasMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES) ? false : (behaviorcontroller.getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES).get()).stream().filter((entityliving1) -> { // CraftBukkit - decompile error
return entityliving1.getEntityType() == entityliving.getEntityType();
}).filter((entityliving1) -> {
return blockposition.a((IPosition) entityliving1.getPositionVector(), 2.0D);
@@ -169,7 +183,7 @@
@@ -172,7 +186,7 @@
if (behaviorcontroller.getMemory(MemoryModuleType.DOORS_TO_CLOSE).isPresent()) {
((Set) behaviorcontroller.getMemory(MemoryModuleType.DOORS_TO_CLOSE).get()).add(globalpos);
} else {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java
+++ b/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java
@@ -110,11 +110,16 @@
@@ -112,11 +112,16 @@
if (entityvillager2 == null) {
return Optional.empty();
} else {
@@ -20,7 +20,7 @@
worldserver.broadcastEntityEffect(entityvillager2, (byte) 12);
return Optional.of(entityvillager2);
}
@@ -123,6 +128,6 @@
@@ -125,6 +130,6 @@
private void a(WorldServer worldserver, EntityVillager entityvillager, BlockPosition blockposition) {
GlobalPos globalpos = GlobalPos.create(worldserver.getDimensionKey(), blockposition);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/ai/behavior/BehaviorUtil.java
+++ b/net/minecraft/world/entity/ai/behavior/BehaviorUtil.java
@@ -54,7 +54,7 @@
@@ -62,7 +62,7 @@
}
public static void a(EntityLiving entityliving, EntityLiving entityliving1) {
@@ -9,7 +9,7 @@
}
private static void b(EntityLiving entityliving, EntityLiving entityliving1, float f) {
@@ -67,18 +67,19 @@
@@ -75,18 +75,19 @@
public static void a(EntityLiving entityliving, Entity entity, float f, int i) {
MemoryTarget memorytarget = new MemoryTarget(new BehaviorPositionEntity(entity, false), f, i);
@@ -31,20 +31,20 @@
public static void a(EntityLiving entityliving, ItemStack itemstack, Vec3D vec3d) {
+ if (itemstack.isEmpty()) return; // CraftBukkit - SPIGOT-4940: no empty loot
double d0 = entityliving.getHeadY() - 0.30000001192092896D;
EntityItem entityitem = new EntityItem(entityliving.world, entityliving.locX(), d0, entityliving.locZ(), itemstack);
EntityItem entityitem = new EntityItem(entityliving.level, entityliving.locX(), d0, entityliving.locZ(), itemstack);
float f = 0.3F;
@@ -87,12 +88,19 @@
@@ -95,12 +96,19 @@
vec3d1 = vec3d1.d().a(0.30000001192092896D);
entityitem.setMot(vec3d1);
entityitem.defaultPickupDelay();
+ // CraftBukkit start
+ org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(entityliving.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity());
+ entityitem.world.getServer().getPluginManager().callEvent(event);
+ entityitem.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
entityliving.world.addEntity(entityitem);
entityliving.level.addEntity(entityitem);
}
public static SectionPosition a(WorldServer worldserver, SectionPosition sectionposition, int i) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/ai/behavior/BehaviorWorkComposter.java
+++ b/net/minecraft/world/entity/ai/behavior/BehaviorWorkComposter.java
@@ -24,7 +24,7 @@
@@ -23,7 +23,7 @@
public BehaviorWorkComposter() {}
@Override
@@ -9,21 +9,21 @@
Optional<GlobalPos> optional = entityvillager.getBehaviorController().getMemory(MemoryModuleType.JOB_SITE);
if (optional.isPresent()) {
@@ -43,7 +43,7 @@
@@ -42,7 +42,7 @@
BlockPosition blockposition = globalpos.getBlockPosition();
if ((Integer) iblockdata.get(BlockComposter.a) == 8) {
- iblockdata = BlockComposter.d(iblockdata, (World) worldserver, blockposition);
+ iblockdata = BlockComposter.d(iblockdata, (World) worldserver, blockposition, entityvillager); // CraftBukkit
if ((Integer) iblockdata.get(BlockComposter.LEVEL) == 8) {
- iblockdata = BlockComposter.d(iblockdata, worldserver, blockposition);
+ iblockdata = BlockComposter.d(iblockdata, worldserver, blockposition, entityvillager); // CraftBukkit
}
int i = 20;
@@ -68,7 +68,7 @@
@@ -67,7 +67,7 @@
i -= k1;
for (int l1 = 0; l1 < k1; ++l1) {
- iblockdata1 = BlockComposter.a(iblockdata1, worldserver, itemstack, blockposition);
+ iblockdata1 = BlockComposter.a(iblockdata1, worldserver, itemstack, blockposition, entityvillager); // CraftBukkit
if ((Integer) iblockdata1.get(BlockComposter.a) == 7) {
if ((Integer) iblockdata1.get(BlockComposter.LEVEL) == 7) {
this.a(worldserver, iblockdata, blockposition, iblockdata1);
return;

View File

@@ -1,15 +1,15 @@
--- a/net/minecraft/world/entity/ai/goal/PathfinderGoalBreakDoor.java
+++ b/net/minecraft/world/entity/ai/goal/PathfinderGoalBreakDoor.java
@@ -71,6 +71,12 @@
@@ -72,6 +72,12 @@
}
if (this.a == this.f() && this.a(this.entity.world.getDifficulty())) {
if (this.breakTime == this.f() && this.a(this.mob.level.getDifficulty())) {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.entity, this.door).isCancelled()) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.mob, this.doorPos).isCancelled()) {
+ this.c();
+ return;
+ }
+ // CraftBukkit end
this.entity.world.a(this.door, false);
this.entity.world.triggerEffect(1021, this.door, 0);
this.entity.world.triggerEffect(2001, this.door, Block.getCombinedId(this.entity.world.getType(this.door)));
this.mob.level.a(this.doorPos, false);
this.mob.level.triggerEffect(1021, this.doorPos, 0);
this.mob.level.triggerEffect(2001, this.doorPos, Block.getCombinedId(this.mob.level.getType(this.doorPos)));

View File

@@ -1,8 +1,8 @@
--- a/net/minecraft/world/entity/ai/goal/PathfinderGoalEatTile.java
+++ b/net/minecraft/world/entity/ai/goal/PathfinderGoalEatTile.java
@@ -11,6 +11,10 @@
import net.minecraft.world.level.block.state.IBlockData;
@@ -12,6 +12,10 @@
import net.minecraft.world.level.block.state.predicate.BlockStatePredicate;
import net.minecraft.world.level.gameevent.GameEvent;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
@@ -10,24 +10,24 @@
+
public class PathfinderGoalEatTile extends PathfinderGoal {
private static final Predicate<IBlockData> a = BlockStatePredicate.a(Blocks.GRASS);
@@ -63,7 +67,8 @@
BlockPosition blockposition = this.b.getChunkCoordinates();
private static final int EAT_ANIMATION_TICKS = 40;
@@ -65,7 +69,8 @@
BlockPosition blockposition = this.mob.getChunkCoordinates();
if (PathfinderGoalEatTile.a.test(this.c.getType(blockposition))) {
- if (this.c.getGameRules().getBoolean(GameRules.MOB_GRIEFING)) {
if (PathfinderGoalEatTile.IS_TALL_GRASS.test(this.level.getType(blockposition))) {
- if (this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
+ // CraftBukkit
+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, blockposition, Blocks.AIR.getBlockData(), !this.c.getGameRules().getBoolean(GameRules.MOB_GRIEFING)).isCancelled()) {
this.c.b(blockposition, false);
+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, Blocks.AIR.getBlockData(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) {
this.level.b(blockposition, false);
}
@@ -72,7 +77,8 @@
@@ -75,7 +80,8 @@
BlockPosition blockposition1 = blockposition.down();
if (this.c.getType(blockposition1).a(Blocks.GRASS_BLOCK)) {
- if (this.c.getGameRules().getBoolean(GameRules.MOB_GRIEFING)) {
if (this.level.getType(blockposition1).a(Blocks.GRASS_BLOCK)) {
- if (this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
+ // CraftBukkit
+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, blockposition, Blocks.AIR.getBlockData(), !this.c.getGameRules().getBoolean(GameRules.MOB_GRIEFING)).isCancelled()) {
this.c.triggerEffect(2001, blockposition1, Block.getCombinedId(Blocks.GRASS_BLOCK.getBlockData()));
this.c.setTypeAndData(blockposition1, Blocks.DIRT.getBlockData(), 2);
+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, Blocks.AIR.getBlockData(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) {
this.level.triggerEffect(2001, blockposition1, Block.getCombinedId(Blocks.GRASS_BLOCK.getBlockData()));
this.level.setTypeAndData(blockposition1, Blocks.DIRT.getBlockData(), 2);
}

View File

@@ -12,24 +12,24 @@
+
public class PathfinderGoalFollowOwner extends PathfinderGoal {
private final EntityTameableAnimal a;
@@ -117,7 +123,18 @@
public static final int TELEPORT_WHEN_DISTANCE_IS = 12;
@@ -121,7 +127,18 @@
} else if (!this.a(new BlockPosition(i, j, k))) {
return false;
} else {
- this.a.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, this.a.yaw, this.a.pitch);
- this.tamable.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, this.tamable.getYRot(), this.tamable.getXRot());
+ // CraftBukkit start
+ CraftEntity entity = this.a.getBukkitEntity();
+ Location to = new Location(entity.getWorld(), (double) i + 0.5D, (double) j, (double) k + 0.5D, this.a.yaw, this.a.pitch);
+ CraftEntity entity = this.tamable.getBukkitEntity();
+ Location to = new Location(entity.getWorld(), (double) i + 0.5D, (double) j, (double) k + 0.5D, this.tamable.getYRot(), this.tamable.getXRot());
+ EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
+ this.a.world.getServer().getPluginManager().callEvent(event);
+ this.tamable.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return false;
+ }
+ to = event.getTo();
+
+ this.a.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
+ this.tamable.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
+ // CraftBukkit end
this.e.o();
this.navigation.o();
return true;
}

View File

@@ -10,17 +10,17 @@
+
public class PathfinderGoalPanic extends PathfinderGoal {
protected final EntityCreature a;
protected final EntityCreature mob;
@@ -76,6 +80,12 @@
@Override
public boolean b() {
+ // CraftBukkit start - introduce a temporary timeout hack until this is fixed properly
+ if ((this.a.ticksLived - this.a.hurtTimestamp) > 100) {
+ this.a.setLastDamager((EntityLiving) null);
+ if ((this.mob.tickCount - this.mob.lastHurtByMobTimestamp) > 100) {
+ this.mob.setLastDamager((EntityLiving) null);
+ return false;
+ }
+ // CraftBukkit end
return !this.a.getNavigation().m();
return !this.mob.getNavigation().m();
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/ai/goal/PathfinderGoalRemoveBlock.java
+++ b/net/minecraft/world/entity/ai/goal/PathfinderGoalRemoveBlock.java
@@ -20,6 +20,11 @@
@@ -21,6 +21,11 @@
import net.minecraft.world.level.chunk.IChunkAccess;
import net.minecraft.world.phys.Vec3D;
@@ -11,13 +11,13 @@
+
public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
private final Block g;
@@ -98,6 +103,14 @@
private final Block blockToRemove;
@@ -100,6 +105,14 @@
}
if (this.i > 60) {
if (this.ticksSinceReachedGoal > 60) {
+ // CraftBukkit start - Step on eggs
+ EntityInteractEvent event = new EntityInteractEvent(this.entity.getBukkitEntity(), CraftBlock.at(world, blockposition1));
+ EntityInteractEvent event = new EntityInteractEvent(this.removerMob.getBukkitEntity(), CraftBlock.at(world, blockposition1));
+ world.getServer().getPluginManager().callEvent((EntityInteractEvent) event);
+
+ if (event.isCancelled()) {

View File

@@ -3,9 +3,9 @@
@@ -22,7 +22,7 @@
@Override
public boolean a() {
if (!this.entity.isTamed()) {
if (!this.mob.isTamed()) {
- return false;
+ return this.entity.isWillSit() && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals
} else if (this.entity.aH()) {
+ return this.mob.isWillSit() && this.mob.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals
} else if (this.mob.aO()) {
return false;
} else if (!this.entity.isOnGround()) {
} else if (!this.mob.isOnGround()) {

View File

@@ -1,12 +1,12 @@
--- a/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.java
+++ b/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.java
@@ -62,7 +62,8 @@
int i = this.entity.getTemper();
int j = this.entity.getMaxDomestication();
int i = this.horse.getTemper();
int j = this.horse.getMaxDomestication();
- if (j > 0 && this.entity.getRandom().nextInt(j) < i) {
- if (j > 0 && this.horse.getRandom().nextInt(j) < i) {
+ // CraftBukkit - fire EntityTameEvent
+ if (j > 0 && this.entity.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.entity.getBukkitEntity().getPassenger()).getHandle()).isCancelled()) {
this.entity.i((EntityHuman) entity);
+ if (j > 0 && this.horse.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.horse, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.horse.getBukkitEntity().getPassenger()).getHandle()).isCancelled()) {
this.horse.i((EntityHuman) entity);
return;
}

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/ai/goal/PathfinderGoalTempt.java
+++ b/net/minecraft/world/entity/ai/goal/PathfinderGoalTempt.java
@@ -11,6 +11,13 @@
import net.minecraft.world.item.ItemStack;
@@ -8,6 +8,13 @@
import net.minecraft.world.entity.player.EntityHuman;
import net.minecraft.world.item.crafting.RecipeItemStack;
+// CraftBukkit start
@@ -13,32 +13,29 @@
+
public class PathfinderGoalTempt extends PathfinderGoal {
private static final PathfinderTargetCondition c = (new PathfinderTargetCondition()).a(10.0D).a().b().d().c();
@@ -21,7 +28,7 @@
private double g;
private double h;
private double i;
- protected EntityHuman target;
+ protected EntityLiving target; // CraftBukkit
private int j;
private boolean k;
private final RecipeItemStack l;
@@ -49,7 +56,17 @@
private static final PathfinderTargetCondition TEMP_TARGETING = PathfinderTargetCondition.b().a(10.0D).d();
@@ -19,7 +26,7 @@
private double pz;
private double pRotX;
private double pRotY;
- protected EntityHuman player;
+ protected EntityLiving player; // CraftBukkit
private int calmDown;
private boolean isRunning;
private final RecipeItemStack items;
@@ -41,6 +48,15 @@
return false;
} else {
this.target = this.a.world.a(PathfinderGoalTempt.c, (EntityLiving) this.a);
- return this.target == null ? false : this.a(this.target.getItemInMainHand()) || this.a(this.target.getItemInOffHand());
this.player = this.mob.level.a(this.targetingConditions, (EntityLiving) this.mob);
+ // CraftBukkit start
+ boolean tempt = this.target == null ? false : this.a(this.target.getItemInMainHand()) || this.a(this.target.getItemInOffHand());
+ if (tempt) {
+ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this.a, this.target, EntityTargetEvent.TargetReason.TEMPT);
+ if (this.player != null) {
+ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this.mob, this.player, EntityTargetEvent.TargetReason.TEMPT);
+ if (event.isCancelled()) {
+ return false;
+ }
+ this.target = (event.getTarget() == null) ? null : ((CraftLivingEntity) event.getTarget()).getHandle();
+ this.player = (event.getTarget() == null) ? null : ((CraftLivingEntity) event.getTarget()).getHandle();
+ }
+ return tempt;
+ // CraftBukkit end
return this.player != null;
}
}

View File

@@ -4,8 +4,8 @@
@Override
public void c() {
- this.a.setGoalTarget(this.b);
+ this.a.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.DEFEND_VILLAGE, true); // CraftBukkit - reason
- this.golem.setGoalTarget(this.potentialTarget);
+ this.golem.setGoalTarget(this.potentialTarget, org.bukkit.event.entity.EntityTargetEvent.TargetReason.DEFEND_VILLAGE, true); // CraftBukkit - reason
super.c();
}
}

View File

@@ -1,15 +1,15 @@
--- a/net/minecraft/world/entity/ai/goal/target/PathfinderGoalHurtByTarget.java
+++ b/net/minecraft/world/entity/ai/goal/target/PathfinderGoalHurtByTarget.java
@@ -62,7 +62,7 @@
@@ -64,7 +64,7 @@
@Override
public void c() {
- this.e.setGoalTarget(this.e.getLastDamager());
+ this.e.setGoalTarget(this.e.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason
this.g = this.e.getGoalTarget();
this.c = this.e.da();
this.h = 300;
@@ -109,6 +109,6 @@
- this.mob.setGoalTarget(this.mob.getLastDamager());
+ this.mob.setGoalTarget(this.mob.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason
this.targetMob = this.mob.getGoalTarget();
this.timestamp = this.mob.dH();
this.unseenMemoryTicks = 300;
@@ -111,6 +111,6 @@
}
protected void a(EntityInsentient entityinsentient, EntityLiving entityliving) {

View File

@@ -1,11 +1,11 @@
--- a/net/minecraft/world/entity/ai/goal/target/PathfinderGoalNearestAttackableTarget.java
+++ b/net/minecraft/world/entity/ai/goal/target/PathfinderGoalNearestAttackableTarget.java
@@ -59,7 +59,7 @@
@@ -61,7 +61,7 @@
@Override
public void c() {
- this.e.setGoalTarget(this.c);
+ this.e.setGoalTarget(this.c, c instanceof EntityPlayer ? org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER : org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit - reason
- this.mob.setGoalTarget(this.target);
+ this.mob.setGoalTarget(this.target, target instanceof EntityPlayer ? org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER : org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit - reason
super.c();
}

View File

@@ -4,8 +4,8 @@
@Override
public void c() {
- this.e.setGoalTarget(this.b);
+ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit - reason
EntityLiving entityliving = this.a.getOwner();
- this.mob.setGoalTarget(this.ownerLastHurtBy);
+ this.mob.setGoalTarget(this.ownerLastHurtBy, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit - reason
EntityLiving entityliving = this.tameAnimal.getOwner();
if (entityliving != null) {

View File

@@ -4,8 +4,8 @@
@Override
public void c() {
- this.e.setGoalTarget(this.b);
+ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit - reason
EntityLiving entityliving = this.a.getOwner();
- this.mob.setGoalTarget(this.ownerLastHurt);
+ this.mob.setGoalTarget(this.ownerLastHurt, org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit - reason
EntityLiving entityliving = this.tameAnimal.getOwner();
if (entityliving != null) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/ai/goal/target/PathfinderGoalTarget.java
+++ b/net/minecraft/world/entity/ai/goal/target/PathfinderGoalTarget.java
@@ -13,6 +13,8 @@
@@ -11,6 +11,8 @@
import net.minecraft.world.level.pathfinder.PathPoint;
import net.minecraft.world.scores.ScoreboardTeamBase;
@@ -8,22 +8,22 @@
+
public abstract class PathfinderGoalTarget extends PathfinderGoal {
protected final EntityInsentient e;
@@ -70,7 +72,7 @@
if (entityliving instanceof EntityHuman && ((EntityHuman) entityliving).abilities.isInvulnerable) {
return false;
} else {
- this.e.setGoalTarget(entityliving);
+ this.e.setGoalTarget(entityliving, EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit
return true;
private static final int EMPTY_REACH_CACHE = 0;
@@ -68,7 +70,7 @@
}
}
- this.mob.setGoalTarget(entityliving);
+ this.mob.setGoalTarget(entityliving, EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit
return true;
}
@@ -91,7 +93,7 @@
}
@@ -88,7 +90,7 @@
@Override
public void d() {
- this.e.setGoalTarget((EntityLiving) null);
+ this.e.setGoalTarget((EntityLiving) null, EntityTargetEvent.TargetReason.FORGOT_TARGET, true); // CraftBukkit
this.g = null;
- this.mob.setGoalTarget((EntityLiving) null);
+ this.mob.setGoalTarget((EntityLiving) null, EntityTargetEvent.TargetReason.FORGOT_TARGET, true); // CraftBukkit
this.targetMob = null;
}

View File

@@ -8,16 +8,16 @@
+
public class EntityBat extends EntityAmbient {
private static final DataWatcherObject<Byte> b = DataWatcher.a(EntityBat.class, DataWatcherRegistry.a);
@@ -130,16 +132,24 @@
public static final float FLAP_DEGREES_PER_TICK = 74.48451F;
@@ -138,16 +140,24 @@
}
if (this.world.a(EntityBat.c, (EntityLiving) this) != null) {
if (this.level.a(EntityBat.BAT_RESTING_TARGETING, (EntityLiving) this) != null) {
+ // CraftBukkit Start - Call BatToggleSleepEvent
+ if (CraftEventFactory.handleBatToggleSleepEvent(this, true)) {
+ this.setAsleep(false);
+ if (!flag) {
+ this.world.a((EntityHuman) null, 1025, blockposition, 0);
+ this.level.a((EntityHuman) null, 1025, blockposition, 0);
+ }
+ }
+ // CraftBukkit End
@@ -27,22 +27,22 @@
+ if (CraftEventFactory.handleBatToggleSleepEvent(this, true)) {
this.setAsleep(false);
if (!flag) {
this.world.a((EntityHuman) null, 1025, blockposition, 0);
this.level.a((EntityHuman) null, 1025, blockposition, 0);
}
}
- } else {
- this.setAsleep(false);
- if (!flag) {
- this.world.a((EntityHuman) null, 1025, blockposition, 0);
- this.level.a((EntityHuman) null, 1025, blockposition, 0);
- }
+ // CraftBukkit End - Call BatToggleSleepEvent
}
} else {
if (this.d != null && (!this.world.isEmpty(this.d) || this.d.getY() < 1)) {
@@ -163,7 +173,11 @@
this.aT = 0.5F;
this.yaw += f1;
if (this.random.nextInt(100) == 0 && this.world.getType(blockposition1).isOccluding(this.world, blockposition1)) {
if (this.targetPosition != null && (!this.level.isEmpty(this.targetPosition) || this.targetPosition.getY() <= this.level.getMinBuildHeight())) {
@@ -171,7 +181,11 @@
this.zza = 0.5F;
this.setYRot(this.getYRot() + f1);
if (this.random.nextInt(100) == 0 && this.level.getType(blockposition1).isOccluding(this.level, blockposition1)) {
- this.setAsleep(true);
+ // CraftBukkit Start - Call BatToggleSleepEvent
+ if (CraftEventFactory.handleBatToggleSleepEvent(this, false)) {
@@ -52,10 +52,10 @@
}
}
@@ -193,7 +207,11 @@
@@ -201,7 +215,11 @@
return false;
} else {
if (!this.world.isClientSide && this.isAsleep()) {
if (!this.level.isClientSide && this.isAsleep()) {
- this.setAsleep(false);
+ // CraftBukkit Start - Call BatToggleSleepEvent
+ if (CraftEventFactory.handleBatToggleSleepEvent(this, true)) {

View File

@@ -0,0 +1,41 @@
--- a/net/minecraft/world/entity/animal/Bucketable.java
+++ b/net/minecraft/world/entity/animal/Bucketable.java
@@ -15,6 +15,14 @@
import net.minecraft.world.item.Items;
import net.minecraft.world.level.World;
+// CraftBukkit start
+import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
+import net.minecraft.network.protocol.game.PacketPlayOutSpawnEntityLiving;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.event.player.PlayerBucketEntityEvent;
+// CraftBukkit end
+
public interface Bucketable {
boolean isFromBucket();
@@ -90,10 +98,22 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.WATER_BUCKET && t0.isAlive()) {
- t0.playSound(((Bucketable) t0).t(), 1.0F, 1.0F);
+ // CraftBukkit start
+ // t0.playSound(((Bucketable) t0).t(), 1.0F, 1.0F); // CraftBukkit - moved down
ItemStack itemstack1 = ((Bucketable) t0).getBucketItem();
((Bucketable) t0).setBucketName(itemstack1);
+
+ PlayerBucketEntityEvent playerBucketFishEvent = CraftEventFactory.callPlayerFishBucketEvent(t0, entityhuman, itemstack, itemstack1);
+ itemstack1 = CraftItemStack.asNMSCopy(playerBucketFishEvent.getEntityBucket());
+ if (playerBucketFishEvent.isCancelled()) {
+ ((EntityPlayer) entityhuman).containerMenu.updateInventory(); // We need to update inventory to resync client's bucket
+ ((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutSpawnEntityLiving(t0)); // We need to play out these packets as the client assumes the fish is gone
+ ((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutEntityMetadata(t0.getId(), t0.getDataWatcher(), true)); // Need to send data such as the display name to client
+ return Optional.of(EnumInteractionResult.FAIL);
+ }
+ t0.playSound(((Bucketable) t0).t(), 1.0F, 1.0F);
+ // CraftBukkit end
ItemStack itemstack2 = ItemLiquidUtil.a(itemstack, entityhuman, itemstack1, false);
entityhuman.a(enumhand, itemstack2);

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/animal/EntityAnimal.java
+++ b/net/minecraft/world/entity/animal/EntityAnimal.java
@@ -27,10 +27,17 @@
import net.minecraft.world.level.block.Blocks;
@@ -28,11 +28,18 @@
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.pathfinder.PathType;
+// CraftBukkit start
@@ -12,13 +12,14 @@
+
public abstract class EntityAnimal extends EntityAgeable {
public int loveTicks;
public UUID breedCause;
static final int PARENT_AGE_AFTER_BREEDING = 6000;
public int inLove;
public UUID loveCause;
+ public ItemStack breedItem; // CraftBukkit - Add breedItem variable
protected EntityAnimal(EntityTypes<? extends EntityAnimal> entitytypes, World world) {
super(entitytypes, world);
@@ -67,6 +74,9 @@
@@ -69,6 +76,9 @@
}
@@ -28,7 +29,7 @@
@Override
public boolean damageEntity(DamageSource damagesource, float f) {
if (this.isInvulnerable(damagesource)) {
@@ -76,6 +86,7 @@
@@ -78,6 +88,7 @@
return super.damageEntity(damagesource, f);
}
}
@@ -36,32 +37,32 @@
@Override
public float a(BlockPosition blockposition, IWorldReader iworldreader) {
@@ -166,10 +177,17 @@
@@ -170,10 +181,17 @@
}
public void g(@Nullable EntityHuman entityhuman) {
- this.loveTicks = 600;
- this.inLove = 600;
+ // CraftBukkit start
+ EntityEnterLoveModeEvent entityEnterLoveModeEvent = CraftEventFactory.callEntityEnterLoveModeEvent(entityhuman, this, 600);
+ if (entityEnterLoveModeEvent.isCancelled()) {
+ return;
+ }
+ this.loveTicks = entityEnterLoveModeEvent.getTicksInLove();
+ this.inLove = entityEnterLoveModeEvent.getTicksInLove();
+ // CraftBukkit end
if (entityhuman != null) {
this.breedCause = entityhuman.getUniqueID();
this.loveCause = entityhuman.getUniqueID();
}
+ this.breedItem = entityhuman.inventory.getItemInHand(); // CraftBukkit
+ this.breedItem = entityhuman.getInventory().getItemInHand(); // CraftBukkit
this.world.broadcastEntityEffect(this, (byte) 18);
this.level.broadcastEntityEffect(this, (byte) 18);
}
@@ -209,11 +227,26 @@
@@ -213,11 +231,26 @@
EntityAgeable entityageable = this.createChild(worldserver, entityanimal);
if (entityageable != null) {
+ // CraftBukkit start - set persistence for tame animals
+ if (entityageable instanceof EntityTameableAnimal && ((EntityTameableAnimal) entityageable).isTamed()) {
+ entityageable.persistent = true;
+ entityageable.persistenceRequired = true;
+ }
+ // CraftBukkit end
EntityPlayer entityplayer = this.getBreedCause();
@@ -82,7 +83,7 @@
if (entityplayer != null) {
entityplayer.a(StatisticList.ANIMALS_BRED);
@@ -224,12 +257,14 @@
@@ -228,12 +261,14 @@
entityanimal.setAgeRaw(6000);
this.resetLove();
entityanimal.resetLove();
@@ -91,7 +92,7 @@
- worldserver.addAllEntities(entityageable);
+ worldserver.addAllEntities(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
worldserver.broadcastEntityEffect(this, (byte) 18);
if (worldserver.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) {
if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
- worldserver.addEntity(new EntityExperienceOrb(worldserver, this.locX(), this.locY(), this.locZ(), this.getRandom().nextInt(7) + 1));
+ // CraftBukkit start - use event experience
+ if (experience > 0) {

View File

@@ -1,24 +1,24 @@
--- a/net/minecraft/world/entity/animal/EntityBee.java
+++ b/net/minecraft/world/entity/animal/EntityBee.java
@@ -211,7 +211,7 @@
@@ -243,7 +243,7 @@
}
if (b0 > 0) {
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0));
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), this);
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
}
@@ -586,11 +586,15 @@
@@ -642,11 +642,15 @@
if (this.isInvulnerable(damagesource)) {
return false;
} else {
Entity entity = damagesource.getEntity();
- if (!this.world.isClientSide) {
- if (!this.level.isClientSide) {
+ // CraftBukkit start
+ boolean result = super.damageEntity(damagesource, f);
+
+ if (result && !this.world.isClientSide) {
this.bC.l();
+ if (result && !this.level.isClientSide) {
this.beePollinateGoal.l();
}
- return super.damageEntity(damagesource, f);
@@ -27,75 +27,30 @@
}
}
@@ -611,7 +615,7 @@
class d extends EntityBee.a {
private d() {
- super(null);
+ super(); // CraftBukkit - decompile error
}
@Override
@@ -671,7 +675,7 @@
class g extends EntityBee.a {
private g() {
- super(null);
+ super(); // CraftBukkit - decompile error
}
@Override
@@ -720,7 +724,7 @@
@@ -1216,7 +1220,7 @@
}
}
- if (flag) {
+ if (flag && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(EntityBee.this, blockposition, iblockdata.set(blockstateinteger, (Integer) iblockdata.get(blockstateinteger) + 1)).isCancelled()) { // Spigot
EntityBee.this.world.triggerEffect(2005, blockposition, 0);
EntityBee.this.world.setTypeUpdate(blockposition, (IBlockData) iblockdata.set(blockstateinteger, (Integer) iblockdata.get(blockstateinteger) + 1));
EntityBee.this.fi();
@@ -735,7 +739,7 @@
class i extends EntityBee.a {
private i() {
- super(null);
+ super(); // CraftBukkit - decompile error
}
@Override
@@ -799,7 +803,7 @@
private int h = 0;
k() {
- super(null);
+ super(); // CraftBukkit - decompile error
this.a(EnumSet.of(PathfinderGoal.Type.MOVE));
}
@@ -983,7 +987,7 @@
private int c;
f() {
- super(null);
+ super(); // CraftBukkit - decompile error
this.c = EntityBee.this.world.random.nextInt(10);
this.a(EnumSet.of(PathfinderGoal.Type.MOVE));
}
@@ -1041,7 +1045,7 @@
private int f;
e() {
- super(null);
+ super(); // CraftBukkit - decompile error
this.c = EntityBee.this.world.random.nextInt(10);
this.d = Lists.newArrayList();
this.e = null;
@@ -1261,7 +1265,7 @@
EntityBee.this.level.triggerEffect(2005, blockposition, 0);
EntityBee.this.level.setTypeUpdate(blockposition, (IBlockData) iblockdata.set(blockstateinteger, (Integer) iblockdata.get(blockstateinteger) + 1));
EntityBee.this.fR();
@@ -1289,7 +1293,7 @@
@Override
protected void a(EntityInsentient entityinsentient, EntityLiving entityliving) {
if (entityinsentient instanceof EntityBee && this.e.hasLineOfSight(entityliving)) {
if (entityinsentient instanceof EntityBee && this.mob.hasLineOfSight(entityliving)) {
- entityinsentient.setGoalTarget(entityliving);
+ entityinsentient.setGoalTarget(entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason
}
}
@@ -1298,7 +1302,7 @@
private static class c extends PathfinderGoalNearestAttackableTarget<EntityHuman> {
c(EntityBee entitybee) {
- Objects.requireNonNull(entitybee);
+ // Objects.requireNonNull(entitybee); // CraftBukkit - decompile error
super(entitybee, EntityHuman.class, 10, true, false, entitybee::a_);
}

View File

@@ -1,58 +1,60 @@
--- a/net/minecraft/world/entity/animal/EntityCat.java
+++ b/net/minecraft/world/entity/animal/EntityCat.java
@@ -78,7 +78,7 @@
private static final DataWatcherObject<Boolean> bt = DataWatcher.a(EntityCat.class, DataWatcherRegistry.i);
private static final DataWatcherObject<Boolean> bu = DataWatcher.a(EntityCat.class, DataWatcherRegistry.i);
private static final DataWatcherObject<Integer> bv = DataWatcher.a(EntityCat.class, DataWatcherRegistry.b);
- public static final Map<Integer, MinecraftKey> bq = (Map) SystemUtils.a((Object) Maps.newHashMap(), (hashmap) -> {
+ public static final Map<Integer, MinecraftKey> bq = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
@@ -95,7 +95,7 @@
public static final int TYPE_ALL_BLACK = 10;
private static final int NUMBER_OF_CAT_TYPES = 11;
private static final int NUMBER_OF_CAT_TYPES_EXCEPT_ALL_BLACK = 10;
- public static final Map<Integer, MinecraftKey> TEXTURE_BY_TYPE = (Map) SystemUtils.a((Object) Maps.newHashMap(), (hashmap) -> {
+ public static final Map<Integer, MinecraftKey> TEXTURE_BY_TYPE = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
hashmap.put(0, new MinecraftKey("textures/entity/cat/tabby.png"));
hashmap.put(1, new MinecraftKey("textures/entity/cat/black.png"));
hashmap.put(2, new MinecraftKey("textures/entity/cat/red.png"));
@@ -404,7 +404,7 @@
@@ -433,7 +433,7 @@
}
} else if (this.k(itemstack)) {
this.a(entityhuman, itemstack);
} else if (this.n(itemstack)) {
this.a(entityhuman, enumhand, itemstack);
- if (this.random.nextInt(3) == 0) {
+ if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { // CraftBukkit
this.tame(entityhuman);
this.setWillSit(true);
this.world.broadcastEntityEffect(this, (byte) 7);
@@ -562,7 +562,15 @@
this.level.broadcastEntityEffect(this, (byte) 7);
@@ -490,7 +490,7 @@
private static class PathfinderGoalTemptChance extends PathfinderGoalTempt {
@Nullable
- private EntityHuman selectedPlayer;
+ private EntityLiving selectedPlayer; // CraftBukkit
private final EntityCat cat;
public PathfinderGoalTemptChance(EntityCat entitycat, double d0, RecipeItemStack recipeitemstack, boolean flag) {
@@ -629,7 +629,15 @@
while (iterator.hasNext()) {
ItemStack itemstack = (ItemStack) iterator.next();
- this.a.world.addEntity(new EntityItem(this.a.world, (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.a.aA * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.a.aA * 0.017453292F), itemstack));
- this.cat.level.addEntity(new EntityItem(this.cat.level, (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.cat.yBodyRot * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.cat.yBodyRot * 0.017453292F), itemstack));
+ // CraftBukkit start
+ EntityItem entityitem = new EntityItem(this.a.world, (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.a.aA * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.a.aA * 0.017453292F), itemstack);
+ org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(this.a.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity());
+ entityitem.world.getServer().getPluginManager().callEvent(event);
+ EntityItem entityitem = new EntityItem(this.cat.level, (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.cat.yBodyRot * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.cat.yBodyRot * 0.017453292F), itemstack);
+ org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(this.cat.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity());
+ entityitem.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ continue;
+ }
+ this.a.world.addEntity(entityitem);
+ this.cat.level.addEntity(entityitem);
+ // CraftBukkit end
}
}
@@ -592,7 +600,7 @@
static class PathfinderGoalTemptChance extends PathfinderGoalTempt {
@Nullable
- private EntityHuman chosenTarget;
+ private EntityLiving chosenTarget; // CraftBukkit
private final EntityCat d;
public PathfinderGoalTemptChance(EntityCat entitycat, double d0, RecipeItemStack recipeitemstack, boolean flag) {
@@ -627,9 +635,9 @@
private final EntityCat i;
@@ -661,10 +669,10 @@
private final EntityCat cat;
public a(EntityCat entitycat, Class<T> oclass, float f, double d0, double d1) {
- Predicate predicate = IEntitySelector.e;
- Predicate predicate = IEntitySelector.NO_CREATIVE_OR_SPECTATOR;
+ // Predicate predicate = IEntitySelector.e; // CraftBukkit - decompile error
- Objects.requireNonNull(predicate);
- super(entitycat, oclass, f, d0, d1, predicate::test);
+ super(entitycat, oclass, f, d0, d1, IEntitySelector.e::test); // CraftBukkit - decompile error
this.i = entitycat;
+ // Objects.requireNonNull(predicate); // CraftBukkit - decompile error
+ super(entitycat, oclass, f, d0, d1, IEntitySelector.NO_CREATIVE_OR_SPECTATOR::test); // CraftBukkit - decompile error
this.cat = entitycat;
}

View File

@@ -1,24 +1,24 @@
--- a/net/minecraft/world/entity/animal/EntityChicken.java
+++ b/net/minecraft/world/entity/animal/EntityChicken.java
@@ -74,6 +74,11 @@
@@ -75,6 +75,11 @@
@Override
public void movementTick() {
+ // CraftBukkit start
+ if (this.isChickenJockey()) {
+ this.persistent = !this.isTypeNotPersistent(0);
+ this.persistenceRequired = !this.isTypeNotPersistent(0);
+ }
+ // CraftBukkit end
super.movementTick();
this.br = this.bo;
this.bq = this.bp;
@@ -93,7 +98,9 @@
this.bo += this.bs * 2.0F;
if (!this.world.isClientSide && this.isAlive() && !this.isBaby() && !this.isChickenJockey() && --this.eggLayTime <= 0) {
this.playSound(SoundEffects.ENTITY_CHICKEN_EGG, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
this.oFlap = this.flap;
this.oFlapSpeed = this.flapSpeed;
@@ -94,7 +99,9 @@
this.flap += this.flapping * 2.0F;
if (!this.level.isClientSide && this.isAlive() && !this.isBaby() && !this.isChickenJockey() && --this.eggTime <= 0) {
this.playSound(SoundEffects.CHICKEN_EGG, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
+ this.forceDrops = true; // CraftBukkit
this.a((IMaterial) Items.EGG);
+ this.forceDrops = false; // CraftBukkit
this.eggLayTime = this.random.nextInt(6000) + 6000;
this.eggTime = this.random.nextInt(6000) + 6000;
}

View File

@@ -15,18 +15,18 @@
@@ -82,8 +87,16 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.BUCKET && !this.isBaby()) {
if (itemstack.a(Items.BUCKET) && !this.isBaby()) {
+ // CraftBukkit start - Got milk?
+ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) entityhuman.world, entityhuman, this.getChunkCoordinates(), this.getChunkCoordinates(), null, itemstack, Items.MILK_BUCKET);
+ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) entityhuman.level, entityhuman, this.getChunkCoordinates(), this.getChunkCoordinates(), null, itemstack, Items.MILK_BUCKET);
+
+ if (event.isCancelled()) {
+ return EnumInteractionResult.PASS;
+ }
+ // CraftBukkit end
+
entityhuman.playSound(SoundEffects.ENTITY_COW_MILK, 1.0F, 1.0F);
entityhuman.playSound(SoundEffects.COW_MILK, 1.0F, 1.0F);
- ItemStack itemstack1 = ItemLiquidUtil.a(itemstack, entityhuman, Items.MILK_BUCKET.createItemStack());
+ ItemStack itemstack1 = ItemLiquidUtil.a(itemstack, entityhuman, CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit
entityhuman.a(enumhand, itemstack1);
return EnumInteractionResult.a(this.world.isClientSide);
return EnumInteractionResult.a(this.level.isClientSide);

View File

@@ -1,15 +1,15 @@
--- a/net/minecraft/world/entity/animal/EntityDolphin.java
+++ b/net/minecraft/world/entity/animal/EntityDolphin.java
@@ -173,7 +173,7 @@
this.goalSelector.a(8, new EntityDolphin.d());
@@ -176,7 +176,7 @@
this.goalSelector.a(8, new EntityDolphin.c());
this.goalSelector.a(8, new PathfinderGoalFollowBoat(this));
this.goalSelector.a(9, new PathfinderGoalAvoidTarget<>(this, EntityGuardian.class, 8.0F, 1.0D, 1.0D));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{EntityGuardian.class})).a());
+ this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{EntityGuardian.class})).a(new Class[0])); // CraftBukkit - decompile error
}
public static AttributeProvider.Builder eM() {
@@ -240,6 +240,12 @@
public static AttributeProvider.Builder fv() {
@@ -243,6 +243,12 @@
ItemStack itemstack = entityitem.getItemStack();
if (this.canPickup(itemstack)) {
@@ -21,31 +21,31 @@
+ // CraftBukkit end
this.a(entityitem);
this.setSlot(EnumItemSlot.MAINHAND, itemstack);
this.dropChanceHand[EnumItemSlot.MAINHAND.b()] = 2.0F;
@@ -387,7 +393,7 @@
this.handDropChances[EnumItemSlot.MAINHAND.b()] = 2.0F;
@@ -411,7 +417,7 @@
@Override
public boolean a() {
- return this.a.gotFish() && this.a.getAirTicks() >= 100;
+ return this.a.gotFish() && this.a.getAirTicks() >= 100 && this.a.world.getWorld().canGenerateStructures(); // MC-151364, SPIGOT-5494: hangs if generate-structures=false
- return this.dolphin.gotFish() && this.dolphin.getAirTicks() >= 100;
+ return this.dolphin.gotFish() && this.dolphin.getAirTicks() >= 100 && this.dolphin.level.getWorld().canGenerateStructures(); // MC-151364, SPIGOT-5494: hangs if generate-structures=false
}
@Override
@@ -496,7 +502,7 @@
@@ -520,7 +526,7 @@
@Override
public void c() {
- this.c.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100));
+ this.c.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DOLPHIN); // CraftBukkit
- this.player.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), this.dolphin);
+ this.player.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), this.dolphin, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DOLPHIN); // CraftBukkit
}
@Override
@@ -515,7 +521,7 @@
@@ -539,7 +545,7 @@
}
if (this.c.isSwimming() && this.c.world.random.nextInt(6) == 0) {
- this.c.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100));
+ this.c.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DOLPHIN); // CraftBukkit
if (this.player.isSwimming() && this.player.level.random.nextInt(6) == 0) {
- this.player.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), this.dolphin);
+ this.player.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), this.dolphin, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DOLPHIN); // CraftBukkit
}
}

View File

@@ -1,21 +1,6 @@
--- a/net/minecraft/world/entity/animal/EntityFish.java
+++ b/net/minecraft/world/entity/animal/EntityFish.java
@@ -41,6 +41,14 @@
import net.minecraft.world.level.block.state.IBlockData;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
+import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
+import net.minecraft.network.protocol.game.PacketPlayOutSpawnEntityLiving;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.event.player.PlayerBucketFishEvent;
+// CraftBukkit end
+
public abstract class EntityFish extends EntityWaterAnimal {
private static final DataWatcherObject<Boolean> FROM_BUCKET = DataWatcher.a(EntityFish.class, DataWatcherRegistry.i);
@@ -70,7 +78,7 @@
@@ -68,7 +68,7 @@
@Override
public boolean isTypeNotPersistent(double d0) {
@@ -24,38 +9,11 @@
}
@Override
@@ -90,6 +98,7 @@
@@ -90,6 +90,7 @@
@Override
public void setFromBucket(boolean flag) {
this.datawatcher.set(EntityFish.FROM_BUCKET, flag);
+ this.persistent = this.isPersistent(); // CraftBukkit - SPIGOT-4106 update persistence
this.entityData.set(EntityFish.FROM_BUCKET, flag);
+ this.persistenceRequired = this.isPersistent(); // CraftBukkit - SPIGOT-4106 update persistence
}
@Override
@@ -153,11 +162,24 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.WATER_BUCKET && this.isAlive()) {
+ // CraftBukkit start
+ ItemStack itemstack1 = this.eK();
+ this.k(itemstack1);
+
+ PlayerBucketFishEvent playerBucketFishEvent = CraftEventFactory.callPlayerFishBucketEvent(this, entityhuman, itemstack, itemstack1);
+ itemstack1 = CraftItemStack.asNMSCopy(playerBucketFishEvent.getFishBucket());
+ if (playerBucketFishEvent.isCancelled()) {
+ ((EntityPlayer) entityhuman).updateInventory(((EntityPlayer) entityhuman).activeContainer); // We need to update inventory to resync client's bucket
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSpawnEntityLiving(this)); // We need to play out these packets as the client assumes the fish is gone
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutEntityMetadata(this.getId(), datawatcher, true)); // Need to send data such as the display name to client
+ return EnumInteractionResult.FAIL;
+ }
+ // CraftBukkit end
this.playSound(SoundEffects.ITEM_BUCKET_FILL_FISH, 1.0F, 1.0F);
itemstack.subtract(1);
- ItemStack itemstack1 = this.eK();
+ // ItemStack itemstack1 = this.eK(); // CraftBukkit - moved up
- this.k(itemstack1);
+ // this.k(itemstack1); // CraftBukkit - moved up
if (!this.world.isClientSide) {
CriterionTriggers.j.a((EntityPlayer) entityhuman, itemstack1);
}

View File

@@ -1,17 +1,6 @@
--- a/net/minecraft/world/entity/animal/EntityFox.java
+++ b/net/minecraft/world/entity/animal/EntityFox.java
@@ -334,8 +334,8 @@
private List<UUID> fa() {
List<UUID> list = Lists.newArrayList();
- list.add(((Optional) this.datawatcher.get(EntityFox.FIRST_TRUSTED_PLAYER)).orElse((Object) null));
- list.add(((Optional) this.datawatcher.get(EntityFox.SECOND_TRUSTED_PLAYER)).orElse((Object) null));
+ list.add((this.datawatcher.get(EntityFox.FIRST_TRUSTED_PLAYER)).orElse(null)); // CraftBukkit - decompile error
+ list.add((this.datawatcher.get(EntityFox.SECOND_TRUSTED_PLAYER)).orElse(null)); // CraftBukkit - decompile error
return list;
}
@@ -471,7 +471,8 @@
@@ -502,7 +502,8 @@
protected void b(EntityItem entityitem) {
ItemStack itemstack = entityitem.getItemStack();
@@ -21,46 +10,7 @@
int i = itemstack.getCount();
if (i > 1) {
@@ -993,6 +994,11 @@
int i = (Integer) iblockdata.get(BlockSweetBerryBush.a);
iblockdata.set(BlockSweetBerryBush.a, 1);
+ // CraftBukkit start - call EntityChangeBlockEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(EntityFox.this, this.e, iblockdata.set(BlockSweetBerryBush.a, 1)).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
int j = 1 + EntityFox.this.world.random.nextInt(2) + (i == 3 ? 1 : 0);
ItemStack itemstack = EntityFox.this.getEquipment(EnumItemSlot.MAINHAND);
@@ -1032,7 +1038,7 @@
private int f;
public r() {
- super(null);
+ super(); // CraftBukkit - decompile error
this.a(EnumSet.of(PathfinderGoal.Type.MOVE, PathfinderGoal.Type.LOOK));
}
@@ -1084,7 +1090,7 @@
private int c;
public t() {
- super(null);
+ super(); // CraftBukkit - decompile error
this.c = EntityFox.this.random.nextInt(140);
this.a(EnumSet.of(PathfinderGoal.Type.MOVE, PathfinderGoal.Type.LOOK, PathfinderGoal.Type.JUMP));
}
@@ -1195,7 +1201,7 @@
private EntityLiving k;
private int l;
- public a(Class oclass, boolean flag, boolean flag1, Predicate predicate) {
+ public a(Class oclass, boolean flag, boolean flag1, Predicate<EntityLiving> predicate) { // CraftBukkit - decompile error
super(EntityFox.this, oclass, 10, flag, flag1, predicate);
}
@@ -1275,6 +1281,16 @@
@@ -857,6 +858,16 @@
if (entityplayer1 != null && entityplayer != entityplayer1) {
entityfox.b(entityplayer1.getUniqueID());
}
@@ -77,7 +27,7 @@
if (entityplayer2 != null) {
entityplayer2.a(StatisticList.ANIMALS_BRED);
@@ -1285,12 +1301,14 @@
@@ -867,12 +878,14 @@
this.partner.setAgeRaw(6000);
this.animal.resetLove();
this.partner.resetLove();
@@ -85,14 +35,43 @@
- entityfox.setPositionRotation(this.animal.locX(), this.animal.locY(), this.animal.locZ(), 0.0F, 0.0F);
- worldserver.addAllEntities(entityfox);
+ worldserver.addAllEntities(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
this.b.broadcastEntityEffect(this.animal, (byte) 18);
if (this.b.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) {
- this.b.addEntity(new EntityExperienceOrb(this.b, this.animal.locX(), this.animal.locY(), this.animal.locZ(), this.animal.getRandom().nextInt(7) + 1));
this.level.broadcastEntityEffect(this.animal, (byte) 18);
if (this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
- this.level.addEntity(new EntityExperienceOrb(this.level, this.animal.locX(), this.animal.locY(), this.animal.locZ(), this.animal.getRandom().nextInt(7) + 1));
+ // CraftBukkit start - use event experience
+ if (experience > 0) {
+ this.b.addEntity(new EntityExperienceOrb(this.b, this.animal.locX(), this.animal.locY(), this.animal.locZ(), experience));
+ this.level.addEntity(new EntityExperienceOrb(this.level, this.animal.locX(), this.animal.locY(), this.animal.locZ(), experience));
+ }
+ // CraftBukkit end
}
}
@@ -1258,13 +1271,18 @@
}
private void a(IBlockData iblockdata) {
- CaveVines.harvest(iblockdata, EntityFox.this.level, this.blockPos);
+ CaveVines.harvest(iblockdata, EntityFox.this.level, this.blockPos, EntityFox.this); // CraftBukkit
}
private void b(IBlockData iblockdata) {
int i = (Integer) iblockdata.get(BlockSweetBerryBush.AGE);
iblockdata.set(BlockSweetBerryBush.AGE, 1);
+ // CraftBukkit start - call EntityChangeBlockEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(EntityFox.this, this.blockPos, iblockdata.set(BlockSweetBerryBush.AGE, 1)).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
int j = 1 + EntityFox.this.level.random.nextInt(2) + (i == 3 ? 1 : 0);
ItemStack itemstack = EntityFox.this.getEquipment(EnumItemSlot.MAINHAND);
@@ -1420,7 +1438,7 @@
private EntityLiving trustedLastHurt;
private int timestamp;
- public a(Class oclass, boolean flag, boolean flag1, @Nullable Predicate predicate) {
+ public a(Class oclass, boolean flag, boolean flag1, @Nullable Predicate<EntityLiving> predicate) { // CraftBukkit - decompile error
super(EntityFox.this, oclass, 10, flag, flag1, predicate);
}

View File

@@ -1,11 +1,11 @@
--- a/net/minecraft/world/entity/animal/EntityIronGolem.java
+++ b/net/minecraft/world/entity/animal/EntityIronGolem.java
@@ -104,7 +104,7 @@
@@ -106,7 +106,7 @@
@Override
protected void C(Entity entity) {
protected void A(Entity entity) {
if (entity instanceof IMonster && !(entity instanceof EntityCreeper) && this.getRandom().nextInt(20) == 0) {
- this.setGoalTarget((EntityLiving) entity);
+ this.setGoalTarget((EntityLiving) entity, org.bukkit.event.entity.EntityTargetLivingEntityEvent.TargetReason.COLLISION, true); // CraftBukkit - set reason
}
super.C(entity);
super.A(entity);

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/animal/EntityMushroomCow.java
+++ b/net/minecraft/world/entity/animal/EntityMushroomCow.java
@@ -41,6 +41,11 @@
import net.minecraft.world.level.block.state.IBlockData;
@@ -42,6 +42,11 @@
import net.minecraft.world.level.gameevent.GameEvent;
import org.apache.commons.lang3.tuple.Pair;
+// CraftBukkit start
@@ -11,41 +11,41 @@
+
public class EntityMushroomCow extends EntityCow implements IShearable {
private static final DataWatcherObject<String> bo = DataWatcher.a(EntityMushroomCow.class, DataWatcherRegistry.d);
@@ -111,6 +116,11 @@
private static final DataWatcherObject<String> DATA_TYPE = DataWatcher.a(EntityMushroomCow.class, DataWatcherRegistry.STRING);
@@ -113,6 +118,11 @@
this.playSound(soundeffect, 1.0F, 1.0F);
return EnumInteractionResult.a(this.world.isClientSide);
} else if (itemstack.getItem() == Items.SHEARS && this.canShear()) {
return EnumInteractionResult.a(this.level.isClientSide);
} else if (itemstack.a(Items.SHEARS) && this.canShear()) {
+ // CraftBukkit start
+ if (!CraftEventFactory.handlePlayerShearEntityEvent(entityhuman, this, itemstack, enumhand)) {
+ return EnumInteractionResult.PASS;
+ }
+ // CraftBukkit end
this.shear(SoundCategory.PLAYERS);
if (!this.world.isClientSide) {
itemstack.damage(1, entityhuman, (entityhuman1) -> {
@@ -157,7 +167,7 @@
this.world.playSound((EntityHuman) null, (Entity) this, SoundEffects.ENTITY_MOOSHROOM_SHEAR, soundcategory, 1.0F, 1.0F);
if (!this.world.s_()) {
((WorldServer) this.world).a(Particles.EXPLOSION, this.locX(), this.e(0.5D), this.locZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D);
this.a(GameEvent.SHEAR, (Entity) entityhuman);
if (!this.level.isClientSide) {
@@ -160,7 +170,7 @@
this.level.playSound((EntityHuman) null, (Entity) this, SoundEffects.MOOSHROOM_SHEAR, soundcategory, 1.0F, 1.0F);
if (!this.level.isClientSide()) {
((WorldServer) this.level).a(Particles.EXPLOSION, this.locX(), this.e(0.5D), this.locZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D);
- this.die();
+ // this.die(); // CraftBukkit - moved down
EntityCow entitycow = (EntityCow) EntityTypes.COW.a(this.world);
EntityCow entitycow = (EntityCow) EntityTypes.COW.a(this.level);
entitycow.setPositionRotation(this.locX(), this.locY(), this.locZ(), this.yaw, this.pitch);
@@ -173,7 +183,14 @@
entitycow.setPositionRotation(this.locX(), this.locY(), this.locZ(), this.getYRot(), this.getXRot());
@@ -176,7 +186,14 @@
}
entitycow.setInvulnerable(this.isInvulnerable());
- this.world.addEntity(entitycow);
- this.level.addEntity(entitycow);
+ // CraftBukkit start
+ if (CraftEventFactory.callEntityTransformEvent(this, entitycow, EntityTransformEvent.TransformReason.SHEARED).isCancelled()) {
+ return;
+ }
+ this.world.addEntity(entitycow, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SHEARED);
+ this.level.addEntity(entitycow, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SHEARED);
+
+ this.die(); // CraftBukkit - from above
+ // CraftBukkit end
for (int i = 0; i < 5; ++i) {
this.world.addEntity(new EntityItem(this.world, this.locX(), this.e(1.0D), this.locZ(), new ItemStack(this.getVariant().d.getBlock())));
this.level.addEntity(new EntityItem(this.level, this.locX(), this.e(1.0D), this.locZ(), new ItemStack(this.getVariant().blockState.getBlock())));

View File

@@ -1,33 +1,35 @@
--- a/net/minecraft/world/entity/animal/EntityOcelot.java
+++ b/net/minecraft/world/entity/animal/EntityOcelot.java
@@ -128,7 +128,7 @@
@@ -133,7 +133,7 @@
@Override
public boolean isTypeNotPersistent(double d0) {
- return !this.isTrusting() && this.ticksLived > 2400;
- return !this.isTrusting() && this.tickCount > 2400;
+ return !this.isTrusting() /*&& this.ticksLived > 2400*/; // CraftBukkit
}
public static AttributeProvider.Builder eK() {
public static AttributeProvider.Builder p() {
@@ -182,7 +182,8 @@
if ((this.br == null || this.br.h()) && !this.isTrusting() && this.k(itemstack) && entityhuman.h((Entity) this) < 9.0D) {
this.a(entityhuman, itemstack);
if (!this.world.isClientSide) {
if ((this.temptGoal == null || this.temptGoal.h()) && !this.isTrusting() && this.n(itemstack) && entityhuman.f((Entity) this) < 9.0D) {
this.a(entityhuman, enumhand, itemstack);
if (!this.level.isClientSide) {
- if (this.random.nextInt(3) == 0) {
+ // CraftBukkit - added event call and isCancelled check
+ if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) {
this.setTrusting(true);
this.u(true);
this.world.broadcastEntityEffect(this, (byte) 41);
@@ -290,9 +291,9 @@
private final EntityOcelot i;
this.w(true);
this.level.broadcastEntityEffect(this, (byte) 41);
@@ -312,10 +313,10 @@
private final EntityOcelot ocelot;
public a(EntityOcelot entityocelot, Class<T> oclass, float f, double d0, double d1) {
- Predicate predicate = IEntitySelector.e;
+ // Predicate predicate = IEntitySelector.e; // CraftBukkit - decompile error
- Predicate predicate = IEntitySelector.NO_CREATIVE_OR_SPECTATOR;
+ // Predicate predicate = IEntitySelector.NO_CREATIVE_OR_SPECTATOR; // CraftBukkit - decompile error
- Objects.requireNonNull(predicate);
- super(entityocelot, oclass, f, d0, d1, predicate::test);
+ super(entityocelot, oclass, f, d0, d1, IEntitySelector.e::test); // CraftBukkit - decompile error
this.i = entityocelot;
+ // Objects.requireNonNull(predicate); // CraftBukkit - decompile error
+ super(entityocelot, oclass, f, d0, d1, IEntitySelector.NO_CREATIVE_OR_SPECTATOR::test); // CraftBukkit - decompile error
this.ocelot = entityocelot;
}

View File

@@ -1,24 +1,38 @@
--- a/net/minecraft/world/entity/animal/EntityPanda.java
+++ b/net/minecraft/world/entity/animal/EntityPanda.java
@@ -64,6 +64,8 @@
import net.minecraft.world.level.block.state.IBlockData;
@@ -65,6 +65,8 @@
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.Vec3D;
+import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit
+
public class EntityPanda extends EntityAnimal {
private static final DataWatcherObject<Integer> bp = DataWatcher.a(EntityPanda.class, DataWatcherRegistry.b);
@@ -500,7 +502,7 @@
private static final DataWatcherObject<Integer> UNHAPPY_COUNTER = DataWatcher.a(EntityPanda.class, DataWatcherRegistry.INT);
@@ -525,7 +527,7 @@
@Override
protected void b(EntityItem entityitem) {
- if (this.getEquipment(EnumItemSlot.MAINHAND).isEmpty() && EntityPanda.PICKUP_PREDICATE.test(entityitem)) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPickupItemEvent(this, entityitem, 0, !(this.getEquipment(EnumItemSlot.MAINHAND).isEmpty() && EntityPanda.PICKUP_PREDICATE.test(entityitem))).isCancelled()) { // CraftBukkit
- if (this.getEquipment(EnumItemSlot.MAINHAND).isEmpty() && EntityPanda.PANDA_ITEMS.test(entityitem)) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPickupItemEvent(this, entityitem, 0, !(this.getEquipment(EnumItemSlot.MAINHAND).isEmpty() && EntityPanda.PANDA_ITEMS.test(entityitem))).isCancelled()) { // CraftBukkit
this.a(entityitem);
ItemStack itemstack = entityitem.getItemStack();
@@ -721,7 +723,7 @@
@@ -881,10 +883,10 @@
private final EntityPanda panda;
public c(EntityPanda entitypanda, Class<T> oclass, float f, double d0, double d1) {
- Predicate predicate = IEntitySelector.NO_SPECTATORS;
+ // Predicate predicate = IEntitySelector.NO_SPECTATORS;
- Objects.requireNonNull(predicate);
- super(entitypanda, oclass, f, d0, d1, predicate::test);
+ // Objects.requireNonNull(predicate);
+ super(entitypanda, oclass, f, d0, d1, IEntitySelector.NO_SPECTATORS::test);
this.panda = entitypanda;
}
@@ -1131,7 +1133,7 @@
@Override
protected void a(EntityInsentient entityinsentient, EntityLiving entityliving) {
if (entityinsentient instanceof EntityPanda && ((EntityPanda) entityinsentient).isAggressive()) {
@@ -27,15 +41,3 @@
}
}
@@ -825,9 +827,9 @@
private final EntityPanda i;
public c(EntityPanda entitypanda, Class<T> oclass, float f, double d0, double d1) {
- Predicate predicate = IEntitySelector.g;
+ // Predicate predicate = IEntitySelector.g; // CraftBukkit - decompile error
- super(entitypanda, oclass, f, d0, d1, predicate::test);
+ super(entitypanda, oclass, f, d0, d1, IEntitySelector.g::test); // CraftBukkit - decompile error
this.i = entitypanda;
}

View File

@@ -1,24 +1,24 @@
--- a/net/minecraft/world/entity/animal/EntityParrot.java
+++ b/net/minecraft/world/entity/animal/EntityParrot.java
@@ -74,7 +74,7 @@
};
private static final Item bw = Items.COOKIE;
private static final Set<Item> bx = Sets.newHashSet(new Item[]{Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS});
- private static final Map<EntityTypes<?>, SoundEffect> by = (Map) SystemUtils.a((Object) Maps.newHashMap(), (hashmap) -> {
+ private static final Map<EntityTypes<?>, SoundEffect> by = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
hashmap.put(EntityTypes.BLAZE, SoundEffects.ENTITY_PARROT_IMITATE_BLAZE);
hashmap.put(EntityTypes.CAVE_SPIDER, SoundEffects.ENTITY_PARROT_IMITATE_SPIDER);
hashmap.put(EntityTypes.CREEPER, SoundEffects.ENTITY_PARROT_IMITATE_CREEPER);
@@ -241,7 +241,7 @@
@@ -75,7 +75,7 @@
private static final Item POISONOUS_FOOD = Items.COOKIE;
private static final Set<Item> TAME_FOOD = Sets.newHashSet(new Item[]{Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS});
private static final int VARIANTS = 5;
- static final Map<EntityTypes<?>, SoundEffect> MOB_SOUND_MAP = (Map) SystemUtils.a((Object) Maps.newHashMap(), (hashmap) -> {
+ static final Map<EntityTypes<?>, SoundEffect> MOB_SOUND_MAP = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
hashmap.put(EntityTypes.BLAZE, SoundEffects.PARROT_IMITATE_BLAZE);
hashmap.put(EntityTypes.CAVE_SPIDER, SoundEffects.PARROT_IMITATE_SPIDER);
hashmap.put(EntityTypes.CREEPER, SoundEffects.PARROT_IMITATE_CREEPER);
@@ -253,7 +253,7 @@
}
if (!this.world.isClientSide) {
if (!this.level.isClientSide) {
- if (this.random.nextInt(10) == 0) {
+ if (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { // CraftBukkit
this.tame(entityhuman);
this.world.broadcastEntityEffect(this, (byte) 7);
this.level.broadcastEntityEffect(this, (byte) 7);
} else {
@@ -255,7 +255,7 @@
@@ -267,7 +267,7 @@
itemstack.subtract(1);
}
@@ -27,7 +27,7 @@
if (entityhuman.isCreative() || !this.isInvulnerable()) {
this.damageEntity(DamageSource.playerAttack(entityhuman), Float.MAX_VALUE);
}
@@ -369,7 +369,7 @@
@@ -381,7 +381,7 @@
@Override
public boolean isCollidable() {
@@ -36,7 +36,7 @@
}
@Override
@@ -384,7 +384,7 @@
@@ -396,7 +396,7 @@
if (this.isInvulnerable(damagesource)) {
return false;
} else {

View File

@@ -10,7 +10,7 @@
+
public class EntityPig extends EntityAnimal implements ISteerable, ISaddleable {
private static final DataWatcherObject<Boolean> bo = DataWatcher.a(EntityPig.class, DataWatcherRegistry.i);
private static final DataWatcherObject<Boolean> DATA_SADDLE_ID = DataWatcher.a(EntityPig.class, DataWatcherRegistry.BOOLEAN);
@@ -251,7 +255,13 @@
}

View File

@@ -1,20 +1,20 @@
--- a/net/minecraft/world/entity/animal/EntityPufferFish.java
+++ b/net/minecraft/world/entity/animal/EntityPufferFish.java
@@ -136,7 +136,7 @@
@@ -144,7 +144,7 @@
int i = this.getPuffState();
if (entityinsentient.damageEntity(DamageSource.mobAttack(this), (float) (1 + i))) {
- entityinsentient.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0));
+ entityinsentient.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
this.playSound(SoundEffects.ENTITY_PUFFER_FISH_STING, 1.0F, 1.0F);
- entityinsentient.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0), this);
+ entityinsentient.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
this.playSound(SoundEffects.PUFFER_FISH_STING, 1.0F, 1.0F);
}
@@ -151,7 +151,7 @@
((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.j, 0.0F));
@@ -159,7 +159,7 @@
((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.PUFFER_FISH_STING, 0.0F));
}
- entityhuman.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0));
+ entityhuman.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
- entityhuman.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0), this);
+ entityhuman.addEffect(new MobEffect(MobEffects.POISON, 60 * i, 0), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
}

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/entity/animal/EntityRabbit.java
+++ b/net/minecraft/world/entity/animal/EntityRabbit.java
@@ -72,8 +72,14 @@
@@ -86,8 +86,14 @@
super(entitytypes, world);
this.bi = new EntityRabbit.ControllerJumpRabbit(this);
this.moveController = new EntityRabbit.ControllerMoveRabbit(this);
this.jumpControl = new EntityRabbit.ControllerJumpRabbit(this);
this.moveControl = new EntityRabbit.ControllerMoveRabbit(this);
+ this.initializePathFinderGoals(); // CraftBukkit - moved code
+ }
+
@@ -15,7 +15,7 @@
@Override
public void initPathfinder() {
@@ -340,7 +346,7 @@
@@ -353,7 +359,7 @@
if (i == 99) {
this.getAttributeInstance(GenericAttributes.ARMOR).setValue(8.0D);
this.goalSelector.a(4, new EntityRabbit.PathfinderGoalKillerRabbitMeleeAttack(this));
@@ -24,27 +24,27 @@
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityWolf.class, true));
if (!this.hasCustomName()) {
@@ -456,9 +462,23 @@
Integer integer = (Integer) iblockdata.get(BlockCarrots.AGE);
@@ -556,9 +562,23 @@
int i = (Integer) iblockdata.get(BlockCarrots.AGE);
if (integer == 0) {
if (i == 0) {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.entity, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.rabbit, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 2);
world.a(blockposition, true, this.entity);
world.a(blockposition, true, this.rabbit);
} else {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(
+ this.entity,
+ this.rabbit,
+ blockposition,
+ iblockdata.set(BlockCarrots.AGE, integer - 1)
+ iblockdata.set(BlockCarrots.AGE, i - 1)
+ ).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockCarrots.AGE, integer - 1), 2);
world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockCarrots.AGE, i - 1), 2);
world.triggerEffect(2001, blockposition, Block.getCombinedId(iblockdata));
}

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/animal/EntitySheep.java
+++ b/net/minecraft/world/entity/animal/EntitySheep.java
@@ -60,10 +60,18 @@
import net.minecraft.world.level.block.state.IBlockData;
@@ -64,11 +64,19 @@
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.storage.loot.LootTables;
+// CraftBukkit start
@@ -14,57 +14,60 @@
+
public class EntitySheep extends EntityAnimal implements IShearable {
private static final DataWatcherObject<Byte> bo = DataWatcher.a(EntitySheep.class, DataWatcherRegistry.a);
- private static final Map<EnumColor, IMaterial> bp = (Map) SystemUtils.a((Object) Maps.newEnumMap(EnumColor.class), (enummap) -> {
+ private static final Map<EnumColor, IMaterial> bp = (Map) SystemUtils.a(Maps.newEnumMap(EnumColor.class), (enummap) -> { // CraftBukkit - decompile error
private static final int EAT_ANIMATION_TICKS = 40;
private static final DataWatcherObject<Byte> DATA_WOOL_ID = DataWatcher.a(EntitySheep.class, DataWatcherRegistry.BYTE);
- private static final Map<EnumColor, IMaterial> ITEM_BY_DYE = (Map) SystemUtils.a((Object) Maps.newEnumMap(EnumColor.class), (enummap) -> {
+ private static final Map<EnumColor, IMaterial> ITEM_BY_DYE = (Map) SystemUtils.a(Maps.newEnumMap(EnumColor.class), (enummap) -> { // CraftBukkit - decompile error
enummap.put(EnumColor.WHITE, Blocks.WHITE_WOOL);
enummap.put(EnumColor.ORANGE, Blocks.ORANGE_WOOL);
enummap.put(EnumColor.MAGENTA, Blocks.MAGENTA_WOOL);
@@ -190,6 +198,11 @@
@@ -223,6 +231,11 @@
if (itemstack.getItem() == Items.SHEARS) {
if (!this.world.isClientSide && this.canShear()) {
if (itemstack.a(Items.SHEARS)) {
if (!this.level.isClientSide && this.canShear()) {
+ // CraftBukkit start
+ if (!CraftEventFactory.handlePlayerShearEntityEvent(entityhuman, this, itemstack, enumhand)) {
+ return EnumInteractionResult.PASS;
+ }
+ // CraftBukkit end
this.shear(SoundCategory.PLAYERS);
this.a(GameEvent.SHEAR, (Entity) entityhuman);
itemstack.damage(1, entityhuman, (entityhuman1) -> {
entityhuman1.broadcastItemBreak(enumhand);
@@ -210,7 +223,9 @@
@@ -244,7 +257,9 @@
int i = 1 + this.random.nextInt(3);
for (int j = 0; j < i; ++j) {
+ this.forceDrops = true; // CraftBukkit
EntityItem entityitem = this.a((IMaterial) EntitySheep.bp.get(this.getColor()), 1);
EntityItem entityitem = this.a((IMaterial) EntitySheep.ITEM_BY_DYE.get(this.getColor()), 1);
+ this.forceDrops = false; // CraftBukkit
if (entityitem != null) {
entityitem.setMot(entityitem.getMot().add((double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F), (double) (this.random.nextFloat() * 0.05F), (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F)));
@@ -300,6 +315,12 @@
@@ -334,6 +349,12 @@
@Override
public void blockEaten() {
+ // CraftBukkit start
+ SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity());
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) return;
+ // CraftBukkit end
this.setSheared(false);
if (this.isBaby()) {
this.setAge(60);
@@ -318,7 +339,7 @@
@@ -352,8 +373,8 @@
EnumColor enumcolor = ((EntitySheep) entityanimal).getColor();
EnumColor enumcolor1 = ((EntitySheep) entityanimal1).getColor();
InventoryCrafting inventorycrafting = a(enumcolor, enumcolor1);
- Optional optional = this.world.getCraftingManager().craft(Recipes.CRAFTING, inventorycrafting, this.world).map((recipecrafting) -> {
+ Optional<Item> optional = this.world.getCraftingManager().craft(Recipes.CRAFTING, inventorycrafting, this.world).map((recipecrafting) -> { // Eclipse fail
return recipecrafting.a(inventorycrafting);
- Optional optional = this.level.getCraftingManager().craft(Recipes.CRAFTING, inventorycrafting, this.level).map((recipecrafting) -> {
- return recipecrafting.a((IInventory) inventorycrafting);
+ Optional<Item> optional = this.level.getCraftingManager().craft(Recipes.CRAFTING, inventorycrafting, this.level).map((recipecrafting) -> { // Eclipse fail
+ return recipecrafting.a(inventorycrafting); // CraftBukkit - decompile error
}).map(ItemStack::getItem);
@@ -336,10 +357,18 @@
Objects.requireNonNull(ItemDye.class);
@@ -370,10 +391,18 @@
public boolean canUse(EntityHuman entityhuman) {
return false;
}

View File

@@ -1,8 +1,8 @@
--- a/net/minecraft/world/entity/animal/EntitySnowman.java
+++ b/net/minecraft/world/entity/animal/EntitySnowman.java
@@ -38,6 +38,10 @@
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.IBlockData;
@@ -40,6 +40,10 @@
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
@@ -10,34 +10,34 @@
+
public class EntitySnowman extends EntityGolem implements IShearable, IRangedEntity {
private static final DataWatcherObject<Byte> b = DataWatcher.a(EntitySnowman.class, DataWatcherRegistry.a);
@@ -96,7 +100,7 @@
private static final DataWatcherObject<Byte> DATA_PUMPKIN_ID = DataWatcher.a(EntitySnowman.class, DataWatcherRegistry.BYTE);
@@ -100,7 +104,7 @@
int k = MathHelper.floor(this.locZ());
if (this.world.getBiome(new BlockPosition(i, 0, k)).getAdjustedTemperature(new BlockPosition(i, j, k)) > 1.0F) {
- this.damageEntity(DamageSource.BURN, 1.0F);
if (this.level.getBiome(new BlockPosition(i, 0, k)).getAdjustedTemperature(new BlockPosition(i, j, k)) > 1.0F) {
- this.damageEntity(DamageSource.ON_FIRE, 1.0F);
+ this.damageEntity(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING
}
if (!this.world.getGameRules().getBoolean(GameRules.MOB_GRIEFING)) {
@@ -112,7 +116,7 @@
if (!this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
@@ -116,7 +120,7 @@
BlockPosition blockposition = new BlockPosition(i, j, k);
if (this.world.getType(blockposition).isAir() && this.world.getBiome(blockposition).getAdjustedTemperature(blockposition) < 0.8F && iblockdata.canPlace(this.world, blockposition)) {
- this.world.setTypeUpdate(blockposition, iblockdata);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.world, blockposition, iblockdata, this); // CraftBukkit
if (this.level.getType(blockposition).isAir() && this.level.getBiome(blockposition).getAdjustedTemperature(blockposition) < 0.8F && iblockdata.canPlace(this.level, blockposition)) {
- this.level.setTypeUpdate(blockposition, iblockdata);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.level, blockposition, iblockdata, this); // CraftBukkit
}
}
}
@@ -143,6 +147,11 @@
@@ -147,6 +151,11 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.SHEARS && this.canShear()) {
if (itemstack.a(Items.SHEARS) && this.canShear()) {
+ // CraftBukkit start
+ if (!CraftEventFactory.handlePlayerShearEntityEvent(entityhuman, this, itemstack, enumhand)) {
+ return EnumInteractionResult.PASS;
+ }
+ // CraftBukkit end
this.shear(SoundCategory.PLAYERS);
if (!this.world.isClientSide) {
itemstack.damage(1, entityhuman, (entityhuman1) -> {
this.a(GameEvent.SHEAR, (Entity) entityhuman);
if (!this.level.isClientSide) {

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/entity/animal/EntityTurtle.java
+++ b/net/minecraft/world/entity/animal/EntityTurtle.java
@@ -314,7 +314,9 @@
protected void m() {
super.m();
if (!this.isBaby() && this.world.getGameRules().getBoolean(GameRules.DO_MOB_LOOT)) {
protected void n() {
super.n();
if (!this.isBaby() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
+ this.forceDrops = true; // CraftBukkit
this.a((IMaterial) Items.SCUTE, 1);
+ this.forceDrops = false; // CraftBukkit
@@ -15,30 +15,21 @@
@Override
public void onLightningStrike(WorldServer worldserver, EntityLightning entitylightning) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.entityDamage = entitylightning; // CraftBukkit
this.damageEntity(DamageSource.LIGHTNING, Float.MAX_VALUE);
this.damageEntity(DamageSource.LIGHTNING_BOLT, Float.MAX_VALUE);
+ org.bukkit.craftbukkit.event.CraftEventFactory.entityDamage = null; // CraftBukkit
}
static class g extends NavigationGuardian {
@@ -500,8 +504,12 @@
} else if (this.g.bv > 200) {
World world = this.g.world;
private static class e extends ControllerMove {
@@ -487,8 +491,12 @@
} else if (this.turtle.layEggCounter > 200) {
World world = this.turtle.level;
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.g, this.e.up(), (IBlockData) Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.b, this.g.random.nextInt(4) + 1)).isCancelled()) {
world.playSound((EntityHuman) null, blockposition, SoundEffects.ENTITY_TURTLE_LAY_EGG, SoundCategory.BLOCKS, 0.3F, 0.9F + world.random.nextFloat() * 0.2F);
world.setTypeAndData(this.e.up(), (IBlockData) Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.b, this.g.random.nextInt(4) + 1), 3);
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.up(), (IBlockData) Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.EGGS, this.turtle.random.nextInt(4) + 1)).isCancelled()) {
world.playSound((EntityHuman) null, blockposition, SoundEffects.TURTLE_LAY_EGG, SoundCategory.BLOCKS, 0.3F, 0.9F + world.random.nextFloat() * 0.2F);
world.setTypeAndData(this.blockPos.up(), (IBlockData) Blocks.TURTLE_EGG.getBlockData().set(BlockTurtleEgg.EGGS, this.turtle.random.nextInt(4) + 1), 3);
+ }
+ // CraftBukkit end
this.g.setHasEgg(false);
this.g.u(false);
this.g.setLoveTicks(600);
@@ -581,7 +589,7 @@
--this.e;
return false;
} else {
- this.d = this.b.world.a(EntityTurtle.i.a, (EntityLiving) this.b);
+ this.d = this.b.world.a(this.a, (EntityLiving) this.b); // CraftBukkit - decompile error
return this.d == null ? false : this.a(this.d.getItemInMainHand()) || this.a(this.d.getItemInOffHand());
}
}
this.turtle.setHasEgg(false);
this.turtle.w(false);
this.turtle.setLoveTicks(600);

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/animal/EntityWolf.java
+++ b/net/minecraft/world/entity/animal/EntityWolf.java
@@ -62,6 +62,11 @@
import net.minecraft.world.level.block.state.IBlockData;
@@ -63,6 +63,11 @@
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
@@ -11,18 +11,18 @@
+
public class EntityWolf extends EntityTameableAnimal implements IEntityAngerable {
private static final DataWatcherObject<Boolean> br = DataWatcher.a(EntityWolf.class, DataWatcherRegistry.i);
@@ -101,7 +106,7 @@
private static final DataWatcherObject<Boolean> DATA_INTERESTED_ID = DataWatcher.a(EntityWolf.class, DataWatcherRegistry.BOOLEAN);
@@ -104,7 +109,7 @@
this.goalSelector.a(10, new PathfinderGoalRandomLookaround(this));
this.targetSelector.a(1, new PathfinderGoalOwnerHurtByTarget(this));
this.targetSelector.a(2, new PathfinderGoalOwnerHurtTarget(this));
- this.targetSelector.a(3, (new PathfinderGoalHurtByTarget(this, new Class[0])).a());
+ this.targetSelector.a(3, (new PathfinderGoalHurtByTarget(this, new Class[0])).a(new Class[0])); // CraftBukkit - decompile error
this.targetSelector.a(4, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, 10, true, false, this::a_));
this.targetSelector.a(5, new PathfinderGoalRandomTargetNonTamed<>(this, EntityAnimal.class, false, EntityWolf.bq));
this.targetSelector.a(6, new PathfinderGoalRandomTargetNonTamed<>(this, EntityTurtle.class, false, EntityTurtle.bo));
@@ -113,6 +118,24 @@
return EntityInsentient.p().a(GenericAttributes.MOVEMENT_SPEED, 0.30000001192092896D).a(GenericAttributes.MAX_HEALTH, 8.0D).a(GenericAttributes.ATTACK_DAMAGE, 2.0D);
this.targetSelector.a(5, new PathfinderGoalRandomTargetNonTamed<>(this, EntityAnimal.class, false, EntityWolf.PREY_SELECTOR));
this.targetSelector.a(6, new PathfinderGoalRandomTargetNonTamed<>(this, EntityTurtle.class, false, EntityTurtle.BABY_ON_LAND_SELECTOR));
@@ -116,6 +121,24 @@
return EntityInsentient.w().a(GenericAttributes.MOVEMENT_SPEED, 0.30000001192092896D).a(GenericAttributes.MAX_HEALTH, 8.0D).a(GenericAttributes.ATTACK_DAMAGE, 2.0D);
}
+ // CraftBukkit - add overriden version
@@ -46,7 +46,7 @@
@Override
protected void initDatawatcher() {
super.initDatawatcher();
@@ -259,7 +282,7 @@
@@ -287,7 +310,7 @@
} else {
Entity entity = damagesource.getEntity();
@@ -55,7 +55,7 @@
if (entity != null && !(entity instanceof EntityHuman) && !(entity instanceof EntityArrow)) {
f = (f + 1.0F) / 2.0F;
}
@@ -284,7 +307,7 @@
@@ -312,7 +335,7 @@
super.setTamed(flag);
if (flag) {
this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(20.0D);
@@ -64,16 +64,16 @@
} else {
this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(8.0D);
}
@@ -308,7 +331,7 @@
@@ -336,7 +359,7 @@
itemstack.subtract(1);
}
- this.heal((float) item.getFoodInfo().getNutrition());
+ this.heal((float) item.getFoodInfo().getNutrition(), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit
this.a(GameEvent.MOB_INTERACT, this.cT());
return EnumInteractionResult.SUCCESS;
}
@@ -319,7 +342,7 @@
@@ -348,7 +371,7 @@
this.setWillSit(!this.isWillSit());
this.jumping = false;
this.navigation.o();
@@ -82,7 +82,7 @@
return EnumInteractionResult.SUCCESS;
}
@@ -341,7 +364,8 @@
@@ -370,7 +393,8 @@
itemstack.subtract(1);
}

View File

@@ -0,0 +1,56 @@
--- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java
+++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java
@@ -68,7 +68,8 @@
public static final int TOTAL_PLAYDEAD_TIME = 200;
protected static final ImmutableList<? extends SensorType<? extends Sensor<? super Axolotl>>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_ADULT, SensorType.HURT_BY, SensorType.AXOLOTL_ATTACKABLES, SensorType.AXOLOTL_TEMPTATIONS);
- protected static final ImmutableList<? extends MemoryModuleType<?>> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.BREED_TARGET, MemoryModuleType.NEAREST_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYER, MemoryModuleType.LOOK_TARGET, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.PATH, MemoryModuleType.ATTACK_TARGET, MemoryModuleType.ATTACK_COOLING_DOWN, MemoryModuleType.NEAREST_VISIBLE_ADULT, new MemoryModuleType[]{MemoryModuleType.HURT_BY_ENTITY, MemoryModuleType.PLAY_DEAD_TICKS, MemoryModuleType.NEAREST_ATTACKABLE, MemoryModuleType.TEMPTING_PLAYER, MemoryModuleType.TEMPTATION_COOLDOWN_TICKS, MemoryModuleType.IS_TEMPTED, MemoryModuleType.HAS_HUNTING_COOLDOWN});
+ // CraftBukkit - decompile error
+ protected static final ImmutableList<? extends MemoryModuleType<?>> MEMORY_TYPES = ImmutableList.<MemoryModuleType<?>>of(MemoryModuleType.BREED_TARGET, MemoryModuleType.NEAREST_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYER, MemoryModuleType.LOOK_TARGET, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.PATH, MemoryModuleType.ATTACK_TARGET, MemoryModuleType.ATTACK_COOLING_DOWN, MemoryModuleType.NEAREST_VISIBLE_ADULT, new MemoryModuleType[]{MemoryModuleType.HURT_BY_ENTITY, MemoryModuleType.PLAY_DEAD_TICKS, MemoryModuleType.NEAREST_ATTACKABLE, MemoryModuleType.TEMPTING_PLAYER, MemoryModuleType.TEMPTATION_COOLDOWN_TICKS, MemoryModuleType.IS_TEMPTED, MemoryModuleType.HAS_HUNTING_COOLDOWN});
private static final DataWatcherObject<Integer> DATA_VARIANT = DataWatcher.a(Axolotl.class, DataWatcherRegistry.INT);
private static final DataWatcherObject<Boolean> DATA_PLAYING_DEAD = DataWatcher.a(Axolotl.class, DataWatcherRegistry.BOOLEAN);
private static final DataWatcherObject<Boolean> FROM_BUCKET = DataWatcher.a(Axolotl.class, DataWatcherRegistry.BOOLEAN);
@@ -239,6 +240,7 @@
@Override
public void setFromBucket(boolean flag) {
this.entityData.set(Axolotl.FROM_BUCKET, flag);
+ this.persistenceRequired = this.isPersistent(); // CraftBukkit - SPIGOT-4106 update persistence
}
@Nullable
@@ -280,7 +282,7 @@
@Override
protected void mobTick() {
this.level.getMethodProfiler().enter("axolotlBrain");
- this.getBehaviorController().a((WorldServer) this.level, (EntityLiving) this);
+ this.getBehaviorController().a((WorldServer) this.level, this); // CraftBukkit - decompile error
this.level.getMethodProfiler().exit();
this.level.getMethodProfiler().enter("axolotlActivityUpdate");
AxolotlAi.a(this);
@@ -422,7 +424,7 @@
if (i < 2400) {
i = Math.min(2400, 100 + i);
- entityhuman.addEffect(new MobEffect(MobEffects.REGENERATION, i, 0), this);
+ entityhuman.addEffect(new MobEffect(MobEffects.REGENERATION, i, 0), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.AXOLOTL); // CraftBukkit
}
entityhuman.removeEffect(MobEffects.DIG_SLOWDOWN);
@@ -472,7 +474,7 @@
@Override
public BehaviorController<Axolotl> getBehaviorController() {
- return super.getBehaviorController();
+ return (BehaviorController<Axolotl>) super.getBehaviorController(); // CraftBukkit - decompile error
}
@Override
@@ -505,7 +507,7 @@
@Override
public boolean isTypeNotPersistent(double d0) {
- return !this.isFromBucket() && !this.hasCustomName();
+ return true; // CraftBukkit
}
private static class c extends SmoothSwimmingMoveControl {

View File

@@ -0,0 +1,47 @@
--- a/net/minecraft/world/entity/animal/goat/Goat.java
+++ b/net/minecraft/world/entity/animal/goat/Goat.java
@@ -50,6 +50,11 @@
import net.minecraft.world.level.pathfinder.Pathfinder;
import net.minecraft.world.level.pathfinder.PathfinderNormal;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+// CraftBukkit end
+
public class Goat extends EntityAnimal {
public static final EntitySize LONG_JUMPING_DIMENSIONS = EntitySize.b(0.9F, 1.3F).a(0.7F);
@@ -123,13 +128,13 @@
@Override
public BehaviorController<Goat> getBehaviorController() {
- return super.getBehaviorController();
+ return (BehaviorController<Goat>) super.getBehaviorController(); // CraftBukkit - decompile error
}
@Override
protected void mobTick() {
this.level.getMethodProfiler().enter("goatBrain");
- this.getBehaviorController().a((WorldServer) this.level, (EntityLiving) this);
+ this.getBehaviorController().a((WorldServer) this.level, this); // CraftBukkit - decompile error
this.level.getMethodProfiler().exit();
this.level.getMethodProfiler().enter("goatActivityUpdate");
GoatAi.b(this);
@@ -161,8 +166,15 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.a(Items.BUCKET) && !this.isBaby()) {
+ // CraftBukkit start - Got milk?
+ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) entityhuman.level, entityhuman, this.getChunkCoordinates(), this.getChunkCoordinates(), null, itemstack, Items.MILK_BUCKET);
+
+ if (event.isCancelled()) {
+ return EnumInteractionResult.PASS;
+ }
+ // CraftBukkit end
entityhuman.playSound(this.t(), 1.0F, 1.0F);
- ItemStack itemstack1 = ItemLiquidUtil.a(itemstack, entityhuman, Items.MILK_BUCKET.createItemStack());
+ ItemStack itemstack1 = ItemLiquidUtil.a(itemstack, entityhuman, CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit
entityhuman.a(enumhand, itemstack1);
return EnumInteractionResult.a(this.level.isClientSide);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java
+++ b/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java
@@ -68,6 +68,8 @@
@@ -70,6 +70,8 @@
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.Vec3D;
@@ -8,25 +8,25 @@
+
public abstract class EntityHorseAbstract extends EntityAnimal implements IInventoryListener, IJumpable, ISaddleable {
private static final Predicate<EntityLiving> bw = (entityliving) -> {
@@ -95,6 +97,7 @@
private float bK;
protected boolean bu = true;
protected int bv;
public static final int EQUIPMENT_SLOT_OFFSET = 400;
@@ -109,6 +111,7 @@
private float mouthAnimO;
protected boolean canGallop = true;
protected int gallopSoundCounter;
+ public int maxDomestication = 100; // CraftBukkit - store max domestication value
protected EntityHorseAbstract(EntityTypes<? extends EntityHorseAbstract> entitytypes, World world) {
super(entitytypes, world);
@@ -279,7 +282,7 @@
@@ -293,7 +296,7 @@
public void loadChest() {
InventorySubcontainer inventorysubcontainer = this.inventoryChest;
InventorySubcontainer inventorysubcontainer = this.inventory;
- this.inventoryChest = new InventorySubcontainer(this.getChestSlots());
+ this.inventoryChest = new InventorySubcontainer(this.getChestSlots(), (org.bukkit.entity.AbstractHorse) this.getBukkitEntity()); // CraftBukkit
- this.inventory = new InventorySubcontainer(this.getChestSlots());
+ this.inventory = new InventorySubcontainer(this.getChestSlots(), (org.bukkit.entity.AbstractHorse) this.getBukkitEntity()); // CraftBukkit
if (inventorysubcontainer != null) {
inventorysubcontainer.b((IInventoryListener) this);
int i = Math.min(inventorysubcontainer.getSize(), this.inventoryChest.getSize());
@@ -395,7 +398,7 @@
int i = Math.min(inventorysubcontainer.getSize(), this.inventory.getSize());
@@ -409,7 +412,7 @@
}
public int getMaxDomestication() {
@@ -35,7 +35,7 @@
}
@Override
@@ -466,7 +469,7 @@
@@ -479,7 +482,7 @@
}
if (this.getHealth() < this.getMaxHealth() && f > 0.0F) {
@@ -44,24 +44,24 @@
flag = true;
}
@@ -542,7 +545,7 @@
@@ -556,7 +559,7 @@
super.movementTick();
if (!this.world.isClientSide && this.isAlive()) {
if (this.random.nextInt(900) == 0 && this.deathTicks == 0) {
if (!this.level.isClientSide && this.isAlive()) {
if (this.random.nextInt(900) == 0 && this.deathTime == 0) {
- this.heal(1.0F);
+ this.heal(1.0F, RegainReason.REGEN); // CraftBukkit
}
if (this.fl()) {
@@ -779,6 +782,7 @@
if (this.fU()) {
@@ -794,6 +797,7 @@
if (this.getOwnerUUID() != null) {
nbttagcompound.a("Owner", this.getOwnerUUID());
}
+ nbttagcompound.setInt("Bukkit.MaxDomestication", this.maxDomestication); // CraftBukkit
if (!this.inventoryChest.getItem(0).isEmpty()) {
nbttagcompound.set("SaddleItem", this.inventoryChest.getItem(0).save(new NBTTagCompound()));
@@ -806,6 +810,11 @@
if (!this.inventory.getItem(0).isEmpty()) {
nbttagcompound.set("SaddleItem", this.inventory.getItem(0).save(new NBTTagCompound()));
@@ -821,6 +825,11 @@
if (uuid != null) {
this.setOwnerUUID(uuid);
}
@@ -73,7 +73,7 @@
if (nbttagcompound.hasKeyOfType("SaddleItem", 10)) {
ItemStack itemstack = ItemStack.a(nbttagcompound.getCompound("SaddleItem"));
@@ -857,6 +866,18 @@
@@ -903,6 +912,18 @@
@Override
public void b(int i) {
@@ -89,6 +89,6 @@
+ return;
+ }
+ // CraftBukkit end
this.canSlide = true;
this.eU();
this.fn();
this.allowStandSliding = true;
this.fD();
this.fW();

View File

@@ -1,11 +1,11 @@
--- a/net/minecraft/world/entity/animal/horse/EntityLlamaTrader.java
+++ b/net/minecraft/world/entity/animal/horse/EntityLlamaTrader.java
@@ -143,7 +143,7 @@
@@ -152,7 +152,7 @@
@Override
public void c() {
- this.e.setGoalTarget(this.c);
+ this.e.setGoalTarget(this.c, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit
Entity entity = this.b.getLeashHolder();
- this.mob.setGoalTarget(this.ownerLastHurtBy);
+ this.mob.setGoalTarget(this.ownerLastHurtBy, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit
Entity entity = this.llama.getLeashHolder();
if (entity instanceof EntityVillagerTrader) {

View File

@@ -2,15 +2,15 @@
+++ b/net/minecraft/world/entity/animal/horse/PathfinderGoalHorseTrap.java
@@ -40,19 +40,20 @@
entitylightning.teleportAndSync(this.a.locX(), this.a.locY(), this.a.locZ());
entitylightning.teleportAndSync(this.horse.locX(), this.horse.locY(), this.horse.locZ());
entitylightning.setEffect(true);
- worldserver.addEntity(entitylightning);
+ worldserver.strikeLightning(entitylightning, org.bukkit.event.weather.LightningStrikeEvent.Cause.TRAP); // CraftBukkit
EntitySkeleton entityskeleton = this.a(difficultydamagescaler, this.a);
EntitySkeleton entityskeleton = this.a(difficultydamagescaler, this.horse);
- entityskeleton.startRiding(this.a);
- entityskeleton.startRiding(this.horse);
- worldserver.addAllEntities(entityskeleton);
+ if (entityskeleton != null) entityskeleton.startRiding(this.a); // CraftBukkit
+ if (entityskeleton != null) entityskeleton.startRiding(this.horse); // CraftBukkit
+ worldserver.addAllEntities(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRAP); // CraftBukkit
for (int i = 0; i < 3; ++i) {
@@ -20,7 +20,7 @@
- entityskeleton1.startRiding(entityhorseabstract);
+ if (entityskeleton1 != null) entityskeleton1.startRiding(entityhorseabstract); // CraftBukkit
entityhorseabstract.i(this.a.getRandom().nextGaussian() * 0.5D, 0.0D, this.a.getRandom().nextGaussian() * 0.5D);
entityhorseabstract.i(this.horse.getRandom().nextGaussian() * 0.5D, 0.0D, this.horse.getRandom().nextGaussian() * 0.5D);
- worldserver.addAllEntities(entityhorseabstract);
+ worldserver.addAllEntities(entityhorseabstract, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java
+++ b/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java
@@ -20,6 +20,11 @@
@@ -22,6 +22,11 @@
import net.minecraft.world.level.block.BlockFireAbstract;
import net.minecraft.world.level.dimension.end.EnderDragonBattle;
@@ -11,40 +11,40 @@
+
public class EntityEnderCrystal extends Entity {
private static final DataWatcherObject<Optional<BlockPosition>> c = DataWatcher.a(EntityEnderCrystal.class, DataWatcherRegistry.m);
@@ -55,7 +60,11 @@
private static final DataWatcherObject<Optional<BlockPosition>> DATA_BEAM_TARGET = DataWatcher.a(EntityEnderCrystal.class, DataWatcherRegistry.OPTIONAL_BLOCK_POS);
@@ -57,7 +62,11 @@
BlockPosition blockposition = this.getChunkCoordinates();
if (((WorldServer) this.world).getDragonBattle() != null && this.world.getType(blockposition).isAir()) {
- this.world.setTypeUpdate(blockposition, BlockFireAbstract.a((IBlockAccess) this.world, blockposition));
if (((WorldServer) this.level).getDragonBattle() != null && this.level.getType(blockposition).isAir()) {
- this.level.setTypeUpdate(blockposition, BlockFireAbstract.a((IBlockAccess) this.level, blockposition));
+ // CraftBukkit start
+ if (!CraftEventFactory.callBlockIgniteEvent(this.world, blockposition, this).isCancelled()) {
+ this.world.setTypeUpdate(blockposition, BlockFireAbstract.a((IBlockAccess) this.world, blockposition));
+ if (!CraftEventFactory.callBlockIgniteEvent(this.level, blockposition, this).isCancelled()) {
+ this.level.setTypeUpdate(blockposition, BlockFireAbstract.a((IBlockAccess) this.level, blockposition));
+ }
+ // CraftBukkit end
}
}
@@ -95,9 +104,22 @@
@@ -97,9 +106,22 @@
return false;
} else {
if (!this.dead && !this.world.isClientSide) {
if (!this.isRemoved() && !this.level.isClientSide) {
+ // CraftBukkit start - All non-living entities need this
+ if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false)) {
+ return false;
+ }
+ // CraftBukkit end
this.die();
this.a(Entity.RemovalReason.KILLED);
if (!damagesource.isExplosion()) {
- this.world.explode((Entity) null, this.locX(), this.locY(), this.locZ(), 6.0F, Explosion.Effect.DESTROY);
- this.level.explode((Entity) null, this.locX(), this.locY(), this.locZ(), 6.0F, Explosion.Effect.DESTROY);
+ // CraftBukkit start
+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ this.dead = false;
+ this.unsetRemoved();
+ return false;
+ }
+ this.world.createExplosion(this, this.locX(), this.locY(), this.locZ(), event.getRadius(), event.getFire(), Explosion.Effect.DESTROY);
+ this.level.createExplosion(this, this.locX(), this.locY(), this.locZ(), event.getRadius(), event.getFire(), Explosion.Effect.DESTROY);
+ // CraftBukkit end
}

View File

@@ -1,12 +1,13 @@
--- a/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
+++ b/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
@@ -51,6 +51,17 @@
@@ -53,6 +53,18 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+// CraftBukkit start
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.Explosion;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.entity.TileEntity;
+import net.minecraft.world.level.storage.loot.LootTableInfo;
+import net.minecraft.world.level.storage.loot.parameters.LootContextParameters;
@@ -18,31 +19,31 @@
public class EntityEnderDragon extends EntityInsentient implements IMonster {
private static final Logger LOGGER = LogManager.getLogger();
@@ -82,6 +93,7 @@
private final PathPoint[] bJ = new PathPoint[24];
private final int[] bK = new int[24];
private final Path bL = new Path();
@@ -89,6 +101,7 @@
private final PathPoint[] nodes = new PathPoint[24];
private final int[] nodeAdjacency = new int[24];
private final Path openSet = new Path();
+ private Explosion explosionSource = new Explosion(null, this, null, null, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.Effect.DESTROY); // CraftBukkit - reusable source for CraftTNTPrimed.getSource()
public EntityEnderDragon(EntityTypes<? extends EntityEnderDragon> entitytypes, World world) {
super(EntityTypes.ENDER_DRAGON, world);
@@ -219,7 +231,7 @@
@@ -236,7 +249,7 @@
Vec3D vec3d1 = idragoncontroller.g();
- if (vec3d1 != null) {
+ if (vec3d1 != null && idragoncontroller.getControllerPhase() != DragonControllerPhase.HOVER) { // CraftBukkit - Don't move when hovering
+ if (vec3d1 != null && idragoncontroller.getControllerPhase() != DragonControllerPhase.HOVERING) { // CraftBukkit - Don't move when hovering
d0 = vec3d1.x - this.locX();
d1 = vec3d1.y - this.locY();
d2 = vec3d1.z - this.locZ();
@@ -357,7 +369,14 @@
if (this.currentEnderCrystal.dead) {
this.currentEnderCrystal = null;
} else if (this.ticksLived % 10 == 0 && this.getHealth() < this.getMaxHealth()) {
@@ -378,7 +391,14 @@
if (this.nearestCrystal.isRemoved()) {
this.nearestCrystal = null;
} else if (this.tickCount % 10 == 0 && this.getHealth() < this.getMaxHealth()) {
- this.setHealth(this.getHealth() + 1.0F);
+ // CraftBukkit start
+ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1.0F, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ this.setHealth((float) (this.getHealth() + event.getAmount()));
@@ -51,7 +52,7 @@
}
}
@@ -432,6 +451,9 @@
@@ -453,6 +473,9 @@
int j1 = MathHelper.floor(axisalignedbb.maxZ);
boolean flag = false;
boolean flag1 = false;
@@ -61,20 +62,20 @@
for (int k1 = i; k1 <= l; ++k1) {
for (int l1 = j; l1 <= i1; ++l1) {
@@ -442,7 +464,11 @@
@@ -462,7 +485,11 @@
if (!iblockdata.isAir() && iblockdata.getMaterial() != Material.FIRE) {
if (this.world.getGameRules().getBoolean(GameRules.MOB_GRIEFING) && !TagsBlock.DRAGON_IMMUNE.isTagged(block)) {
- flag1 = this.world.a(blockposition, false) || flag1;
if (this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !iblockdata.a((Tag) TagsBlock.DRAGON_IMMUNE)) {
- flag1 = this.level.a(blockposition, false) || flag1;
+ // CraftBukkit start - Add blocks to list rather than destroying them
+ // flag1 = this.world.a(blockposition, false) || flag1;
+ // flag1 = this.level.a(blockposition, false) || flag1;
+ flag1 = true;
+ destroyedBlocks.add(CraftBlock.at(world, blockposition));
+ destroyedBlocks.add(CraftBlock.at(level, blockposition));
+ // CraftBukkit end
} else {
flag = true;
}
@@ -451,6 +477,51 @@
@@ -471,6 +498,51 @@
}
}
@@ -94,7 +95,7 @@
+ } else if (event.getYield() == 0F) {
+ // Yield zero ==> no drops
+ for (org.bukkit.block.Block block : event.blockList()) {
+ this.world.a(new BlockPosition(block.getX(), block.getY(), block.getZ()), false);
+ this.level.a(new BlockPosition(block.getX(), block.getY(), block.getZ()), false);
+ }
+ } else {
+ for (org.bukkit.block.Block block : event.blockList()) {
@@ -108,17 +109,17 @@
+
+ Block nmsBlock = craftBlock.getNMS().getBlock();
+ if (nmsBlock.a(explosionSource)) {
+ TileEntity tileentity = nmsBlock.isTileEntity() ? this.world.getTileEntity(blockposition) : null;
+ LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder((WorldServer) this.world)).a(this.world.random).set(LootContextParameters.ORIGIN, Vec3D.a(blockposition)).set(LootContextParameters.TOOL, ItemStack.b).set(LootContextParameters.EXPLOSION_RADIUS, 1.0F / event.getYield()).setOptional(LootContextParameters.BLOCK_ENTITY, tileentity);
+ TileEntity tileentity = craftBlock.getNMS().isTileEntity() ? this.level.getTileEntity(blockposition) : null;
+ LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder((WorldServer) this.level)).a(this.level.random).set(LootContextParameters.ORIGIN, Vec3D.a(blockposition)).set(LootContextParameters.TOOL, ItemStack.EMPTY).set(LootContextParameters.EXPLOSION_RADIUS, 1.0F / event.getYield()).setOptional(LootContextParameters.BLOCK_ENTITY, tileentity);
+
+ craftBlock.getNMS().a(loottableinfo_builder).forEach((itemstack) -> {
+ Block.a(world, blockposition, itemstack);
+ Block.a(level, blockposition, itemstack);
+ });
+ craftBlock.getNMS().dropNaturally((WorldServer) world, blockposition, ItemStack.b);
+ craftBlock.getNMS().dropNaturally((WorldServer) level, blockposition, ItemStack.EMPTY);
+ }
+ nmsBlock.wasExploded(world, blockposition, explosionSource);
+ nmsBlock.wasExploded(level, blockposition, explosionSource);
+
+ this.world.a(blockposition, false);
+ this.level.a(blockposition, false);
+ }
+ }
+ // CraftBukkit end

View File

@@ -13,30 +13,30 @@
private static final Logger LOGGER = LogManager.getLogger();
@@ -22,6 +27,19 @@
this.currentDragonController.e();
this.currentPhase.e();
}
+ // CraftBukkit start - Call EnderDragonChangePhaseEvent
+ EnderDragonChangePhaseEvent event = new EnderDragonChangePhaseEvent(
+ (CraftEnderDragon) this.enderDragon.getBukkitEntity(),
+ (this.currentDragonController == null) ? null : CraftEnderDragon.getBukkitPhase(this.currentDragonController.getControllerPhase()),
+ (CraftEnderDragon) this.dragon.getBukkitEntity(),
+ (this.currentPhase == null) ? null : CraftEnderDragon.getBukkitPhase(this.currentPhase.getControllerPhase()),
+ CraftEnderDragon.getBukkitPhase(dragoncontrollerphase)
+ );
+ this.enderDragon.world.getServer().getPluginManager().callEvent(event);
+ this.dragon.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return;
+ }
+ dragoncontrollerphase = CraftEnderDragon.getMinecraftPhase(event.getNewPhase());
+ // CraftBukkit end
+
this.currentDragonController = this.b(dragoncontrollerphase);
if (!this.enderDragon.world.isClientSide) {
this.enderDragon.getDataWatcher().set(EntityEnderDragon.PHASE, dragoncontrollerphase.b());
this.currentPhase = this.b(dragoncontrollerphase);
if (!this.dragon.level.isClientSide) {
this.dragon.getDataWatcher().set(EntityEnderDragon.DATA_PHASE, dragoncontrollerphase.b());
@@ -43,6 +61,6 @@
this.dragonControllers[i] = dragoncontrollerphase.a(this.enderDragon);
this.phases[i] = dragoncontrollerphase.a(this.dragon);
}
- return this.dragonControllers[i];
+ return (T) this.dragonControllers[i]; // CraftBukkit - decompile error
- return this.phases[i];
+ return (T) this.phases[i]; // CraftBukkit - decompile error
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/boss/wither/EntityWither.java
+++ b/net/minecraft/world/entity/boss/wither/EntityWither.java
@@ -52,6 +52,17 @@
@@ -54,6 +54,17 @@
import net.minecraft.world.level.block.state.IBlockData;
import net.minecraft.world.phys.Vec3D;
@@ -15,29 +15,29 @@
+import org.bukkit.event.entity.ExplosionPrimeEvent;
+// CraftBukkit end
+
public class EntityWither extends EntityMonster implements IRangedEntity {
public class EntityWither extends EntityMonster implements PowerableMob, IRangedEntity {
private static final DataWatcherObject<Integer> b = DataWatcher.a(EntityWither.class, DataWatcherRegistry.b);
@@ -234,16 +245,40 @@
i = this.getInvul() - 1;
private static final DataWatcherObject<Integer> DATA_TARGET_A = DataWatcher.a(EntityWither.class, DataWatcherRegistry.INT);
@@ -238,16 +249,40 @@
this.bossEvent.setProgress(1.0F - (float) i / 220.0F);
if (i <= 0) {
Explosion.Effect explosion_effect = this.world.getGameRules().getBoolean(GameRules.MOB_GRIEFING) ? Explosion.Effect.DESTROY : Explosion.Effect.NONE;
Explosion.Effect explosion_effect = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? Explosion.Effect.DESTROY : Explosion.Effect.NONE;
+ // CraftBukkit start
+ // this.world.createExplosion(this, this.locX(), this.getHeadY(), this.locZ(), 7.0F, false, explosion_effect);
+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ this.world.createExplosion(this, this.locX(), this.getHeadY(), this.locZ(), event.getRadius(), event.getFire(), explosion_effect);
+ this.level.createExplosion(this, this.locX(), this.getHeadY(), this.locZ(), event.getRadius(), event.getFire(), explosion_effect);
+ }
+ // CraftBukkit end
- this.world.createExplosion(this, this.locX(), this.getHeadY(), this.locZ(), 7.0F, false, explosion_effect);
- this.level.createExplosion(this, this.locX(), this.getHeadY(), this.locZ(), 7.0F, false, explosion_effect);
if (!this.isSilent()) {
- this.world.b(1023, this.getChunkCoordinates(), 0);
- this.level.b(1023, this.getChunkCoordinates(), 0);
+ // CraftBukkit start - Use relative location for far away sounds
+ // this.world.b(1023, new BlockPosition(this), 0);
+ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16;
+ int viewDistance = ((WorldServer) this.level).getServer().getViewDistance() * 16;
+ for (EntityPlayer player : (List<EntityPlayer>) MinecraftServer.getServer().getPlayerList().players) {
+ double deltaX = this.locX() - player.locX();
+ double deltaZ = this.locZ() - player.locZ();
@@ -46,9 +46,9 @@
+ double deltaLength = Math.sqrt(distanceSquared);
+ double relativeX = player.locX() + (deltaX / deltaLength) * viewDistance;
+ double relativeZ = player.locZ() + (deltaZ / deltaLength) * viewDistance;
+ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1023, new BlockPosition((int) relativeX, (int) this.locY(), (int) relativeZ), 0, true));
+ player.connection.sendPacket(new PacketPlayOutWorldEvent(1023, new BlockPosition((int) relativeX, (int) this.locY(), (int) relativeZ), 0, true));
+ } else {
+ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1023, this.getChunkCoordinates(), 0, true));
+ player.connection.sendPacket(new PacketPlayOutWorldEvent(1023, this.getChunkCoordinates(), 0, true));
+ }
+ }
+ // CraftBukkit end
@@ -56,26 +56,22 @@
}
this.setInvul(i);
if (this.ticksLived % 10 == 0) {
if (this.tickCount % 10 == 0) {
- this.heal(10.0F);
+ this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit
}
} else {
@@ -295,9 +330,11 @@
if (entityliving != this && entityliving.isAlive() && this.hasLineOfSight(entityliving)) {
if (entityliving instanceof EntityHuman) {
if (!((EntityHuman) entityliving).abilities.isInvulnerable) {
+ if (CraftEventFactory.callEntityTargetLivingEvent(this, entityliving, EntityTargetEvent.TargetReason.CLOSEST_PLAYER).isCancelled()) continue; // CraftBukkit
this.setHeadTarget(i, entityliving.getId());
}
} else {
+ if (CraftEventFactory.callEntityTargetLivingEvent(this, entityliving, EntityTargetEvent.TargetReason.CLOSEST_ENTITY).isCancelled()) continue; // CraftBukkit
this.setHeadTarget(i, entityliving.getId());
}
break;
@@ -333,6 +370,11 @@
IBlockData iblockdata = this.world.getType(blockposition);
@@ -292,6 +327,7 @@
if (!list.isEmpty()) {
EntityLiving entityliving1 = (EntityLiving) list.get(this.random.nextInt(list.size()));
+ if (CraftEventFactory.callEntityTargetLivingEvent(this, entityliving1, EntityTargetEvent.TargetReason.CLOSEST_ENTITY).isCancelled()) continue; // CraftBukkit
this.setHeadTarget(i, entityliving1.getId());
}
}
@@ -322,6 +358,11 @@
IBlockData iblockdata = this.level.getType(blockposition);
if (c(iblockdata)) {
+ // CraftBukkit start
@@ -83,15 +79,15 @@
+ continue;
+ }
+ // CraftBukkit end
flag = this.world.a(blockposition, true, this) || flag;
flag = this.level.a(blockposition, true, this) || flag;
}
}
@@ -346,7 +388,7 @@
@@ -335,7 +376,7 @@
}
if (this.ticksLived % 20 == 0) {
if (this.tickCount % 20 == 0) {
- this.heal(1.0F);
+ this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit
}
this.bossBattle.setProgress(this.getHealth() / this.getMaxHealth());
this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth());

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/decoration/EntityArmorStand.java
+++ b/net/minecraft/world/entity/decoration/EntityArmorStand.java
@@ -39,6 +39,15 @@
import net.minecraft.world.level.material.EnumPistonReaction;
@@ -44,6 +44,15 @@
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
@@ -15,22 +15,22 @@
+
public class EntityArmorStand extends EntityLiving {
private static final Vector3f bj = new Vector3f(0.0F, 0.0F, 0.0F);
@@ -89,6 +98,13 @@
public static final int WOBBLE_TIME = 5;
@@ -106,6 +115,13 @@
this.setPosition(d0, d1, d2);
}
+ // CraftBukkit start - SPIGOT-3607, SPIGOT-3637
+ @Override
+ public float getBukkitYaw() {
+ return this.yaw;
+ return this.getYRot();
+ }
+ // CraftBukkit end
+
@Override
public void updateSize() {
double d0 = this.locX();
@@ -144,13 +160,20 @@
@@ -161,14 +177,21 @@
@Override
public void setSlot(EnumItemSlot enumitemslot, ItemStack itemstack) {
@@ -41,6 +41,7 @@
+ @Override
+ public void setSlot(EnumItemSlot enumitemslot, ItemStack itemstack, boolean silent) {
+ // CraftBukkit end
this.f(itemstack);
switch (enumitemslot.a()) {
case HAND:
- this.playEquipSound(itemstack);
@@ -53,7 +54,7 @@
this.armorItems.set(enumitemslot.b(), itemstack);
}
@@ -417,6 +440,21 @@
@@ -405,6 +428,21 @@
return false;
} else {
ItemStack itemstack2;
@@ -66,107 +67,84 @@
+
+ EquipmentSlot slot = CraftEquipmentSlot.getSlot(enumitemslot);
+ PlayerArmorStandManipulateEvent armorStandManipulateEvent = new PlayerArmorStandManipulateEvent(player,self,playerHeldItem,armorStandItem,slot);
+ this.world.getServer().getPluginManager().callEvent(armorStandManipulateEvent);
+ this.level.getServer().getPluginManager().callEvent(armorStandManipulateEvent);
+
+ if (armorStandManipulateEvent.isCancelled()) {
+ return true;
+ }
+ // CraftBukkit end
if (entityhuman.abilities.canInstantlyBuild && itemstack1.isEmpty() && !itemstack.isEmpty()) {
if (entityhuman.getAbilities().instabuild && itemstack1.isEmpty() && !itemstack.isEmpty()) {
itemstack2 = itemstack.cloneItemStack();
@@ -445,12 +483,22 @@
@@ -433,9 +471,19 @@
public boolean damageEntity(DamageSource damagesource, float f) {
if (!this.world.isClientSide && !this.dead) {
if (!this.level.isClientSide && !this.isRemoved()) {
if (DamageSource.OUT_OF_WORLD.equals(damagesource)) {
- this.die();
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) {
+ return false;
+ }
+ // CraftBukkit end
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
this.killEntity();
return false;
- } else if (!this.isInvulnerable(damagesource) && !this.armorStandInvisible && !this.isMarker()) {
+ } else if (!this.isInvulnerable(damagesource) && (true || !this.armorStandInvisible) && !this.isMarker()) { // CraftBukkit
- } else if (!this.isInvulnerable(damagesource) && !this.invisible && !this.isMarker()) {
+ } else if (!this.isInvulnerable(damagesource) && (true || !this.invisible) && !this.isMarker()) { // CraftBukkit
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, true, this.armorStandInvisible)) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, true, this.invisible)) {
+ return false;
+ }
+ // CraftBukkit end
if (damagesource.isExplosion()) {
this.g(damagesource);
- this.die();
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
return false;
} else if (DamageSource.FIRE.equals(damagesource)) {
if (this.isBurning()) {
this.h(damagesource);
this.killEntity();
@@ -475,7 +523,7 @@
} else if (damagesource.v()) {
this.F();
this.D();
- this.die();
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
return flag1;
} else {
long i = this.world.getTime();
@@ -486,7 +534,7 @@
} else {
this.f(damagesource);
this.D();
- this.die();
this.g(damagesource);
this.G();
- this.killEntity();
+ this.die(); // CraftBukkit - SPIGOT-4890: remain as this.die() since above damagesource method will call death event
}
return true;
@@ -513,7 +561,7 @@
f1 -= f;
if (f1 <= 0.5F) {
this.g(damagesource);
- this.die();
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
} else {
this.setHealth(f1);
}
@@ -521,13 +569,13 @@
}
private void f(DamageSource damagesource) {
- Block.a(this.world, this.getChunkCoordinates(), new ItemStack(Items.ARMOR_STAND));
+ drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(new ItemStack(Items.ARMOR_STAND))); // CraftBukkit - add to drops
this.g(damagesource);
@@ -536,13 +584,13 @@
}
private void g(DamageSource damagesource) {
this.F();
- this.d(damagesource);
+ // this.d(damagesource); // CraftBukkit - moved down
- Block.a(this.level, this.getChunkCoordinates(), new ItemStack(Items.ARMOR_STAND));
+ drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(new ItemStack(Items.ARMOR_STAND))); // CraftBukkit - add to drops
this.h(damagesource);
}
private void h(DamageSource damagesource) {
this.H();
- this.f(damagesource);
+ // this.f(damagesource); // CraftBukkit - moved down
ItemStack itemstack;
int i;
@@ -535,7 +583,7 @@
@@ -550,7 +598,7 @@
for (i = 0; i < this.handItems.size(); ++i) {
itemstack = (ItemStack) this.handItems.get(i);
if (!itemstack.isEmpty()) {
- Block.a(this.world, this.getChunkCoordinates().up(), itemstack);
- Block.a(this.level, this.getChunkCoordinates().up(), itemstack);
+ drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops
this.handItems.set(i, ItemStack.b);
this.handItems.set(i, ItemStack.EMPTY);
}
}
@@ -543,10 +591,11 @@
@@ -558,10 +606,11 @@
for (i = 0; i < this.armorItems.size(); ++i) {
itemstack = (ItemStack) this.armorItems.get(i);
if (!itemstack.isEmpty()) {
- Block.a(this.world, this.getChunkCoordinates().up(), itemstack);
- Block.a(this.level, this.getChunkCoordinates().up(), itemstack);
+ drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops
this.armorItems.set(i, ItemStack.b);
this.armorItems.set(i, ItemStack.EMPTY);
}
}
+ this.d(damagesource); // CraftBukkit - moved from above
+ this.f(damagesource); // CraftBukkit - moved from above
}
@@ -647,8 +696,16 @@
@@ -662,8 +711,16 @@
return this.isSmall();
}
@@ -180,6 +158,6 @@
@Override
public void killEntity() {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callEntityDeathEvent(this, drops); // CraftBukkit - call event
this.die();
this.a(Entity.RemovalReason.KILLED);
}

View File

@@ -14,16 +14,16 @@
+
public abstract class EntityHanging extends Entity {
protected static final Predicate<Entity> b = (entity) -> {
protected static final Predicate<Entity> HANGING_ENTITY = (entity) -> {
@@ -57,26 +65,37 @@
protected void updateBoundingBox() {
if (this.direction != null) {
- double d0 = (double) this.blockPosition.getX() + 0.5D;
- double d1 = (double) this.blockPosition.getY() + 0.5D;
- double d2 = (double) this.blockPosition.getZ() + 0.5D;
- double d0 = (double) this.pos.getX() + 0.5D;
- double d1 = (double) this.pos.getY() + 0.5D;
- double d2 = (double) this.pos.getZ() + 0.5D;
+ // CraftBukkit start code moved in to calculateBoundingBox
+ this.a(calculateBoundingBox(this, this.blockPosition, this.direction, this.getHangingWidth(), this.getHangingHeight()));
+ this.a(calculateBoundingBox(this, this.pos, this.direction, this.getHangingWidth(), this.getHangingHeight()));
+ // CraftBukkit end
+ }
+ }
@@ -81,12 +81,12 @@
return i % 32 == 0 ? 0.5D : 0.0D;
}
@@ -103,6 +123,24 @@
if (this.e++ == 100) {
this.e = 0;
if (!this.dead && !this.survives()) {
@@ -100,6 +120,24 @@
if (this.checkInterval++ == 100) {
this.checkInterval = 0;
if (!this.isRemoved() && !this.survives()) {
+ // CraftBukkit start - fire break events
+ Material material = this.world.getType(this.getChunkCoordinates()).getMaterial();
+ Material material = this.level.getType(this.getChunkCoordinates()).getMaterial();
+ HangingBreakEvent.RemoveCause cause;
+
+ if (!material.equals(Material.AIR)) {
@@ -97,19 +97,19 @@
+ }
+
+ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (dead || event.isCancelled()) {
+ if (this.isRemoved() || event.isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
this.die();
this.a((Entity) null);
}
@@ -166,6 +204,22 @@
@@ -163,6 +201,22 @@
return false;
} else {
if (!this.dead && !this.world.isClientSide) {
if (!this.isRemoved() && !this.level.isClientSide) {
+ // CraftBukkit start - fire break events
+ Entity damager = (damagesource instanceof EntityDamageSourceIndirect) ? ((EntityDamageSourceIndirect) damagesource).getProximateDamageSource() : damagesource.getEntity();
+ HangingBreakEvent event;
@@ -119,41 +119,41 @@
+ event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), damagesource.isExplosion() ? HangingBreakEvent.RemoveCause.EXPLOSION : HangingBreakEvent.RemoveCause.DEFAULT);
+ }
+
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (this.dead || event.isCancelled()) {
+ if (this.isRemoved() || event.isCancelled()) {
+ return true;
+ }
+ // CraftBukkit end
+
this.die();
this.killEntity();
this.velocityChanged();
this.a(damagesource.getEntity());
@@ -178,6 +232,18 @@
@@ -175,6 +229,18 @@
@Override
public void move(EnumMoveType enummovetype, Vec3D vec3d) {
if (!this.world.isClientSide && !this.dead && vec3d.g() > 0.0D) {
+ if (this.dead) return; // CraftBukkit
if (!this.level.isClientSide && !this.isRemoved() && vec3d.g() > 0.0D) {
+ if (this.isRemoved()) return; // CraftBukkit
+
+ // CraftBukkit start - fire break events
+ // TODO - Does this need its own cause? Seems to only be triggered by pistons
+ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.PHYSICS);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (this.dead || event.isCancelled()) {
+ if (this.isRemoved() || event.isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
+
this.die();
this.killEntity();
this.a((Entity) null);
}
@@ -186,7 +252,7 @@
@@ -183,7 +249,7 @@
@Override
public void i(double d0, double d1, double d2) {
- if (!this.world.isClientSide && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) {
+ if (false && !this.world.isClientSide && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed
this.die();
- if (!this.level.isClientSide && !this.isRemoved() && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) {
+ if (false && !this.level.isClientSide && !this.isRemoved() && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed
this.killEntity();
this.a((Entity) null);
}

View File

@@ -1,11 +1,11 @@
--- a/net/minecraft/world/entity/decoration/EntityItemFrame.java
+++ b/net/minecraft/world/entity/decoration/EntityItemFrame.java
@@ -83,16 +83,27 @@
@@ -91,16 +91,27 @@
@Override
protected void updateBoundingBox() {
if (this.direction != null) {
+ // CraftBukkit start code moved in to calculateBoundingBox
+ this.a(calculateBoundingBox(this, this.blockPosition, this.direction, this.getHangingWidth(), this.getHangingHeight()));
+ this.a(calculateBoundingBox(this, this.pos, this.direction, this.getHangingWidth(), this.getHangingHeight()));
+ // CraftBukkit end
+ }
+ }
@@ -14,9 +14,9 @@
+ public static AxisAlignedBB calculateBoundingBox(@Nullable Entity entity, BlockPosition blockPosition, EnumDirection direction, int width, int height) {
+ {
double d0 = 0.46875D;
- double d1 = (double) this.blockPosition.getX() + 0.5D - (double) this.direction.getAdjacentX() * 0.46875D;
- double d2 = (double) this.blockPosition.getY() + 0.5D - (double) this.direction.getAdjacentY() * 0.46875D;
- double d3 = (double) this.blockPosition.getZ() + 0.5D - (double) this.direction.getAdjacentZ() * 0.46875D;
- double d1 = (double) this.pos.getX() + 0.5D - (double) this.direction.getAdjacentX() * 0.46875D;
- double d2 = (double) this.pos.getY() + 0.5D - (double) this.direction.getAdjacentY() * 0.46875D;
- double d3 = (double) this.pos.getZ() + 0.5D - (double) this.direction.getAdjacentZ() * 0.46875D;
-
- this.setPositionRaw(d1, d2, d3);
- double d4 = (double) this.getHangingWidth();
@@ -37,7 +37,7 @@
switch (enumdirection_enumaxis) {
case X:
@@ -108,9 +119,10 @@
@@ -116,9 +127,10 @@
d4 /= 32.0D;
d5 /= 32.0D;
d6 /= 32.0D;
@@ -49,19 +49,19 @@
@Override
public boolean survives() {
@@ -160,6 +172,11 @@
@@ -168,6 +180,11 @@
return false;
} else if (!damagesource.isExplosion() && !this.getItem().isEmpty()) {
if (!this.world.isClientSide) {
if (!this.level.isClientSide) {
+ // CraftBukkit start - fire EntityDamageEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.dead) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.isRemoved()) {
+ return true;
+ }
+ // CraftBukkit end
this.b(damagesource.getEntity(), false);
this.playSound(SoundEffects.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1.0F, 1.0F);
this.playSound(this.h(), 1.0F, 1.0F);
}
@@ -247,6 +264,12 @@
@@ -277,6 +294,12 @@
}
public void setItem(ItemStack itemstack, boolean flag) {
@@ -74,12 +74,12 @@
if (!itemstack.isEmpty()) {
itemstack = itemstack.cloneItemStack();
itemstack.setCount(1);
@@ -254,7 +277,7 @@
@@ -284,7 +307,7 @@
}
this.getDataWatcher().set(EntityItemFrame.ITEM, itemstack);
this.getDataWatcher().set(EntityItemFrame.DATA_ITEM, itemstack);
- if (!itemstack.isEmpty()) {
+ if (!itemstack.isEmpty() && playSound) { // CraftBukkit
this.playSound(SoundEffects.ENTITY_ITEM_FRAME_ADD_ITEM, 1.0F, 1.0F);
this.playSound(this.l(), 1.0F, 1.0F);
}

View File

@@ -1,34 +1,25 @@
--- a/net/minecraft/world/entity/decoration/EntityLeash.java
+++ b/net/minecraft/world/entity/decoration/EntityLeash.java
@@ -23,6 +23,13 @@
import net.minecraft.world.level.World;
@@ -25,6 +25,12 @@
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
+import net.minecraft.network.protocol.game.PacketPlayOutAttachEntity;
+import net.minecraft.server.level.EntityPlayer;
+import net.minecraft.server.level.WorldServer;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+// CraftBukkit end
+
public class EntityLeash extends EntityHanging {
public EntityLeash(EntityTypes<? extends EntityLeash> entitytypes, World world) {
@@ -48,6 +55,7 @@
@Override
protected void updateBoundingBox() {
this.setPositionRaw((double) this.blockPosition.getX() + 0.5D, (double) this.blockPosition.getY() + 0.5D, (double) this.blockPosition.getZ() + 0.5D);
+ if (valid) ((WorldServer) world).chunkCheck(this); // CraftBukkit
}
@Override
@@ -94,22 +102,42 @@
public static final double OFFSET_Y = 0.375D;
@@ -96,22 +102,42 @@
while (iterator.hasNext()) {
entityinsentient = (EntityInsentient) iterator.next();
if (entityinsentient.getLeashHolder() == entityhuman) {
+ // CraftBukkit start
+ if (CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, this, entityhuman).isCancelled()) {
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(entityinsentient, entityinsentient.getLeashHolder()));
+ ((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutAttachEntity(entityinsentient, entityinsentient.getLeashHolder()));
+ continue;
+ }
+ // CraftBukkit end
@@ -39,12 +30,12 @@
if (!flag) {
- this.die();
- if (entityhuman.abilities.canInstantlyBuild) {
- if (entityhuman.getAbilities().instabuild) {
+ // CraftBukkit start - Move below
+ // this.die();
+ boolean die = true;
+ // CraftBukkit end
+ if (true || entityhuman.abilities.canInstantlyBuild) { // CraftBukkit - Process for non-creative as well
+ if (true || entityhuman.getAbilities().instabuild) { // CraftBukkit - Process for non-creative as well
iterator = list.iterator();
while (iterator.hasNext()) {
@@ -56,7 +47,7 @@
+ die = false;
+ continue;
+ }
+ entityinsentient.unleash(true, !entityhuman.abilities.canInstantlyBuild); // false -> survival mode boolean
+ entityinsentient.unleash(true, !entityhuman.getAbilities().instabuild); // false -> survival mode boolean
+ // CraftBukkit end
}
}

View File

@@ -1,12 +1,12 @@
--- a/net/minecraft/world/entity/decoration/EntityPainting.java
+++ b/net/minecraft/world/entity/decoration/EntityPainting.java
@@ -26,6 +26,10 @@
@@ -27,6 +27,10 @@
public EntityPainting(EntityTypes<? extends EntityPainting> entitytypes, World world) {
super(entitytypes, world);
+ // CraftBukkit start - generate a non-null painting
+ List<Paintings> list = Lists.newArrayList(Paintings.a);
+ this.art = (Paintings) list.get(this.random.nextInt(list.size()));
+ List<Paintings> list = Lists.newArrayList(Paintings.KEBAB);
+ this.motive = (Paintings) list.get(this.random.nextInt(list.size()));
+ // CraftBukkit end
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/item/EntityFallingBlock.java
+++ b/net/minecraft/world/entity/item/EntityFallingBlock.java
@@ -43,6 +43,8 @@
@@ -45,6 +45,8 @@
import net.minecraft.world.phys.MovingObjectPositionBlock;
import net.minecraft.world.phys.Vec3D;
@@ -8,35 +8,44 @@
+
public class EntityFallingBlock extends Entity {
private IBlockData block;
@@ -109,7 +111,7 @@
private IBlockData blockState;
@@ -114,7 +116,7 @@
if (this.ticksLived++ == 0) {
if (this.time++ == 0) {
blockposition = this.getChunkCoordinates();
- if (this.world.getType(blockposition).a(block)) {
+ if (this.world.getType(blockposition).a(block) && !CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
this.world.a(blockposition, false);
} else if (!this.world.isClientSide) {
- if (this.level.getType(blockposition).a(block)) {
+ if (this.level.getType(blockposition).a(block) && !CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
this.level.a(blockposition, false);
} else if (!this.level.isClientSide) {
this.die();
@@ -161,6 +163,11 @@
this.block = (IBlockData) this.block.set(BlockProperties.C, true);
@@ -165,6 +167,11 @@
this.blockState = (IBlockData) this.blockState.set(BlockProperties.WATERLOGGED, true);
}
+ // CraftBukkit start
+ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, this.block).isCancelled()) {
+ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, this.blockState).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
if (this.world.setTypeAndData(blockposition, this.block, 3)) {
if (block instanceof BlockFalling) {
((BlockFalling) block).a(this.world, blockposition, this.block, iblockdata, this);
@@ -217,7 +224,9 @@
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
if (this.level.setTypeAndData(blockposition, this.blockState, 3)) {
((WorldServer) this.level).getChunkProvider().chunkMap.broadcast(this, new PacketPlayOutBlockChange(blockposition, this.level.getType(blockposition)));
this.die();
@@ -238,7 +245,7 @@
if (i < 0) {
return false;
} else {
- Predicate predicate;
+ Predicate<Entity> predicate; // CraftBukkit - decompile error
DamageSource damagesource1;
if (this.blockState.getBlock() instanceof Fallable) {
@@ -254,7 +261,9 @@
float f2 = (float) Math.min(MathHelper.d((float) i * this.fallDamagePerDistance), this.fallDamageMax);
this.level.getEntities(this, this.getBoundingBox(), predicate).forEach((entity) -> {
+ CraftEventFactory.entityDamage = this; // CraftBukkit
entity.damageEntity(damagesource, (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax));
entity.damageEntity(damagesource1, f2);
+ CraftEventFactory.entityDamage = null; // CraftBukkit
}
});
boolean flag = this.blockState.a((Tag) TagsBlock.ANVIL);
if (flag && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) {

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/item/EntityItem.java
+++ b/net/minecraft/world/entity/item/EntityItem.java
@@ -31,6 +31,12 @@
import net.minecraft.world.level.World;
@@ -33,6 +33,12 @@
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
@@ -12,16 +12,16 @@
+
public class EntityItem extends Entity {
private static final DataWatcherObject<ItemStack> ITEM = DataWatcher.a(EntityItem.class, DataWatcherRegistry.g);
@@ -40,6 +46,7 @@
private static final DataWatcherObject<ItemStack> DATA_ITEM = DataWatcher.a(EntityItem.class, DataWatcherRegistry.ITEM_STACK);
@@ -45,6 +51,7 @@
private UUID thrower;
private UUID owner;
public final float b;
public final float bobOffs;
+ private int lastTick = MinecraftServer.currentTick - 1; // CraftBukkit
public EntityItem(EntityTypes<? extends EntityItem> entitytypes, World world) {
super(entitytypes, world);
@@ -75,9 +82,12 @@
@@ -94,9 +101,12 @@
this.die();
} else {
super.tick();
@@ -35,10 +35,10 @@
+ this.lastTick = MinecraftServer.currentTick;
+ // CraftBukkit end
this.lastX = this.locX();
this.lastY = this.locY();
@@ -133,9 +143,11 @@
}
this.xo = this.locX();
this.yo = this.locY();
@@ -148,9 +158,11 @@
this.mergeNearby();
}
+ /* CraftBukkit start - moved up
@@ -47,12 +47,12 @@
}
+ // CraftBukkit end */
this.impulse |= this.aK();
if (!this.world.isClientSide) {
@@ -147,6 +159,12 @@
this.hasImpulse |= this.aR();
if (!this.level.isClientSide) {
@@ -162,6 +174,12 @@
}
if (!this.world.isClientSide && this.age >= 6000) {
if (!this.level.isClientSide && this.age >= 6000) {
+ // CraftBukkit start - fire ItemDespawnEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
+ this.age = 0;
@@ -62,7 +62,7 @@
this.die();
}
@@ -222,10 +240,11 @@
@@ -237,10 +255,11 @@
private static void a(EntityItem entityitem, ItemStack itemstack, ItemStack itemstack1) {
ItemStack itemstack2 = a(itemstack, itemstack1, 64);
@@ -75,7 +75,7 @@
a(entityitem, itemstack, itemstack1);
entityitem.pickupDelay = Math.max(entityitem.pickupDelay, entityitem1.pickupDelay);
entityitem.age = Math.min(entityitem.age, entityitem1.age);
@@ -249,6 +268,11 @@
@@ -264,6 +283,11 @@
} else if (!this.getItemStack().getItem().a(damagesource)) {
return false;
} else {
@@ -85,22 +85,22 @@
+ }
+ // CraftBukkit end
this.velocityChanged();
this.f = (int) ((float) this.f - f);
if (this.f <= 0) {
@@ -310,6 +334,46 @@
this.health = (int) ((float) this.health - f);
this.a(GameEvent.ENTITY_DAMAGED, damagesource.getEntity());
@@ -327,6 +351,46 @@
Item item = itemstack.getItem();
int i = itemstack.getCount();
+ // CraftBukkit start - fire PlayerPickupItemEvent
+ int canHold = entityhuman.inventory.canHold(itemstack);
+ int canHold = entityhuman.getInventory().canHold(itemstack);
+ int remaining = i - canHold;
+
+ if (this.pickupDelay <= 0 && canHold > 0) {
+ itemstack.setCount(canHold);
+ // Call legacy event
+ PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
+ playerEvent.setCancelled(!entityhuman.canPickUpLoot);
+ this.world.getServer().getPluginManager().callEvent(playerEvent);
+ playerEvent.setCancelled(!playerEvent.getPlayer().getCanPickupItems());
+ this.level.getServer().getPluginManager().callEvent(playerEvent);
+ if (playerEvent.isCancelled()) {
+ itemstack.setCount(i); // SPIGOT-5294 - restore count
+ return;
@@ -108,8 +108,8 @@
+
+ // Call newer event afterwards
+ EntityPickupItemEvent entityEvent = new EntityPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
+ entityEvent.setCancelled(!entityhuman.canPickUpLoot);
+ this.world.getServer().getPluginManager().callEvent(entityEvent);
+ entityEvent.setCancelled(!entityEvent.getEntity().getCanPickupItems());
+ this.level.getServer().getPluginManager().callEvent(entityEvent);
+ if (entityEvent.isCancelled()) {
+ itemstack.setCount(i); // SPIGOT-5294 - restore count
+ return;
@@ -131,16 +131,16 @@
+ }
+ // CraftBukkit end
+
if (this.pickupDelay == 0 && (this.owner == null || this.owner.equals(entityhuman.getUniqueID())) && entityhuman.inventory.pickup(itemstack)) {
if (this.pickupDelay == 0 && (this.owner == null || this.owner.equals(entityhuman.getUniqueID())) && entityhuman.getInventory().pickup(itemstack)) {
entityhuman.receive(this, i);
if (itemstack.isEmpty()) {
@@ -353,7 +417,9 @@
@@ -370,7 +434,9 @@
}
public void setItemStack(ItemStack itemstack) {
+ com.google.common.base.Preconditions.checkArgument(!itemstack.isEmpty(), "Cannot drop air"); // CraftBukkit
this.getDataWatcher().set(EntityItem.ITEM, itemstack);
+ this.getDataWatcher().markDirty(EntityItem.ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty
this.getDataWatcher().set(EntityItem.DATA_ITEM, itemstack);
+ this.getDataWatcher().markDirty(EntityItem.DATA_ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty
}
@Override

View File

@@ -8,31 +8,31 @@
+
public class EntityTNTPrimed extends Entity {
private static final DataWatcherObject<Integer> FUSE_TICKS = DataWatcher.a(EntityTNTPrimed.class, DataWatcherRegistry.b);
private static final DataWatcherObject<Integer> DATA_FUSE_ID = DataWatcher.a(EntityTNTPrimed.class, DataWatcherRegistry.INT);
private static final int DEFAULT_FUSE_TIME = 80;
@Nullable
public EntityLiving source;
private int fuseTicks;
public EntityLiving owner;
+ public float yield = 4; // CraftBukkit - add field
+ public boolean isIncendiary = false; // CraftBukkit - add field
public EntityTNTPrimed(EntityTypes<? extends EntityTNTPrimed> entitytypes, World world) {
super(entitytypes, world);
@@ -72,10 +76,13 @@
@@ -73,10 +77,13 @@
--this.fuseTicks;
if (this.fuseTicks <= 0) {
this.setFuseTicks(i);
if (i <= 0) {
- this.die();
+ // CraftBukkit start - Need to reverse the order of the explosion and the entity death so we have a location for the event
+ // this.die();
if (!this.world.isClientSide) {
if (!this.level.isClientSide) {
this.explode();
}
+ this.die();
+ // CraftBukkit end
} else {
this.aK();
if (this.world.isClientSide) {
@@ -86,9 +93,16 @@
this.aR();
if (this.level.isClientSide) {
@@ -87,9 +94,16 @@
}
private void explode() {
@@ -40,12 +40,12 @@
+ // CraftBukkit start
+ // float f = 4.0F;
- this.world.explode(this, this.locX(), this.e(0.0625D), this.locZ(), 4.0F, Explosion.Effect.BREAK);
- this.level.explode(this, this.locX(), this.e(0.0625D), this.locZ(), 4.0F, Explosion.Effect.BREAK);
+ ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity());
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ this.world.createExplosion(this, this.locX(), this.e(0.0625D), this.locZ(), event.getRadius(), event.getFire(), Explosion.Effect.BREAK);
+ this.level.createExplosion(this, this.locX(), this.e(0.0625D), this.locZ(), event.getRadius(), event.getFire(), Explosion.Effect.BREAK);
+ }
+ // CraftBukkit end
}

View File

@@ -4,8 +4,8 @@
}
if (b0 > 0) {
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0));
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), this);
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.POISON, b0 * 20, 0), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
}

View File

@@ -1,8 +1,8 @@
--- a/net/minecraft/world/entity/monster/EntityCreeper.java
+++ b/net/minecraft/world/entity/monster/EntityCreeper.java
@@ -38,13 +38,19 @@
import net.minecraft.world.level.IMaterial;
@@ -44,6 +44,12 @@
import net.minecraft.world.level.World;
import net.minecraft.world.level.gameevent.GameEvent;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
@@ -10,22 +10,14 @@
+import org.bukkit.event.entity.ExplosionPrimeEvent;
+// CraftBukkit end
+
public class EntityCreeper extends EntityMonster {
public class EntityCreeper extends EntityMonster implements PowerableMob {
private static final DataWatcherObject<Integer> b = DataWatcher.a(EntityCreeper.class, DataWatcherRegistry.b);
private static final DataWatcherObject<Boolean> POWERED = DataWatcher.a(EntityCreeper.class, DataWatcherRegistry.i);
private static final DataWatcherObject<Boolean> d = DataWatcher.a(EntityCreeper.class, DataWatcherRegistry.i);
private int bo;
- private int fuseTicks;
+ public int fuseTicks; // PAIL
public int maxFuseTicks = 30;
public int explosionRadius = 3;
private int bs;
@@ -200,9 +206,19 @@
private static final DataWatcherObject<Integer> DATA_SWELL_DIR = DataWatcher.a(EntityCreeper.class, DataWatcherRegistry.INT);
@@ -219,9 +225,19 @@
@Override
public void onLightningStrike(WorldServer worldserver, EntityLightning entitylightning) {
super.onLightningStrike(worldserver, entitylightning);
- this.datawatcher.set(EntityCreeper.POWERED, true);
- this.entityData.set(EntityCreeper.DATA_IS_POWERED, true);
+ // CraftBukkit start
+ if (CraftEventFactory.callCreeperPowerEvent(this, entitylightning, org.bukkit.event.entity.CreeperPowerEvent.PowerCause.LIGHTNING).isCancelled()) {
+ return;
@@ -35,50 +27,50 @@
}
+ public void setPowered(boolean powered) {
+ this.datawatcher.set(EntityCreeper.POWERED, powered);
+ this.entityData.set(EntityCreeper.DATA_IS_POWERED, powered);
+ }
+ // CraftBukkit end
+
@Override
protected EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
@@ -227,10 +243,18 @@
Explosion.Effect explosion_effect = this.world.getGameRules().getBoolean(GameRules.MOB_GRIEFING) ? Explosion.Effect.DESTROY : Explosion.Effect.NONE;
@@ -246,10 +262,18 @@
Explosion.Effect explosion_effect = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? Explosion.Effect.DESTROY : Explosion.Effect.NONE;
float f = this.isPowered() ? 2.0F : 1.0F;
- this.killed = true;
- this.world.explode(this, this.locX(), this.locY(), this.locZ(), (float) this.explosionRadius * f, explosion_effect);
- this.dead = true;
- this.level.explode(this, this.locX(), this.locY(), this.locZ(), (float) this.explosionRadius * f, explosion_effect);
- this.die();
- this.createEffectCloud();
+ // CraftBukkit start
+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.explosionRadius * f, false);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+ if (!event.isCancelled()) {
+ this.killed = true;
+ this.world.createExplosion(this, this.locX(), this.locY(), this.locZ(), event.getRadius(), event.getFire(), explosion_effect);
+ this.dead = true;
+ this.level.createExplosion(this, this.locX(), this.locY(), this.locZ(), event.getRadius(), event.getFire(), explosion_effect);
+ this.die();
+ this.createEffectCloud();
+ } else {
+ fuseTicks = 0;
+ swell = 0;
+ }
+ // CraftBukkit end
}
}
@@ -241,6 +265,7 @@
@@ -260,6 +284,7 @@
if (!collection.isEmpty()) {
EntityAreaEffectCloud entityareaeffectcloud = new EntityAreaEffectCloud(this.world, this.locX(), this.locY(), this.locZ());
EntityAreaEffectCloud entityareaeffectcloud = new EntityAreaEffectCloud(this.level, this.locX(), this.locY(), this.locZ());
+ entityareaeffectcloud.setSource(this); // CraftBukkit
entityareaeffectcloud.setRadius(2.5F);
entityareaeffectcloud.setRadiusOnUse(-0.5F);
entityareaeffectcloud.setWaitTime(10);
@@ -254,7 +279,7 @@
@@ -273,7 +298,7 @@
entityareaeffectcloud.addEffect(new MobEffect(mobeffect));
}
- this.world.addEntity(entityareaeffectcloud);
+ this.world.addEntity(entityareaeffectcloud, CreatureSpawnEvent.SpawnReason.EXPLOSION); // CraftBukkit
- this.level.addEntity(entityareaeffectcloud);
+ this.level.addEntity(entityareaeffectcloud, CreatureSpawnEvent.SpawnReason.EXPLOSION); // CraftBukkit
}
}

View File

@@ -20,38 +20,41 @@
if (entityliving == null) {
@@ -120,6 +130,7 @@
attributemodifiable.b(EntityEnderman.c);
attributemodifiable.b(EntityEnderman.SPEED_MODIFIER_ATTACKING);
}
}
+ return true;
}
@@ -413,8 +424,12 @@
@@ -446,9 +457,13 @@
if (iblockdata2 != null) {
iblockdata2 = Block.b(iblockdata2, (GeneratorAccess) this.enderman.level, blockposition);
if (this.a(world, blockposition, iblockdata2, iblockdata, iblockdata1, blockposition1)) {
+ // CraftBukkit start - Place event
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, blockposition, iblockdata2).isCancelled()) {
world.setTypeAndData(blockposition, iblockdata2, 3);
world.a((Entity) this.enderman, GameEvent.BLOCK_PLACE, blockposition);
this.enderman.setCarried((IBlockData) null);
+ }
+ // CraftBukkit end
}
}
@@ -487,9 +502,13 @@
boolean flag = movingobjectpositionblock.getBlockPosition().equals(blockposition);
if (block.a((Tag) TagsBlock.ENDERMAN_HOLDABLE) && flag) {
if (iblockdata.a((Tag) TagsBlock.ENDERMAN_HOLDABLE) && flag) {
- world.a(blockposition, false);
- world.a((Entity) this.enderman, GameEvent.BLOCK_DESTROY, blockposition);
- this.enderman.setCarried(iblockdata.getBlock().getBlockData());
+ // CraftBukkit start - Pickup event
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ world.a(blockposition, false);
+ world.a((Entity) this.enderman, GameEvent.BLOCK_DESTROY, blockposition);
+ this.enderman.setCarried(iblockdata.getBlock().getBlockData());
+ }
+ // CraftBukkit end
}
}
@@ -449,8 +464,12 @@
if (iblockdata2 != null) {
iblockdata2 = Block.b(iblockdata2, (GeneratorAccess) this.a.world, blockposition);
if (this.a(world, blockposition, iblockdata2, iblockdata, iblockdata1, blockposition1)) {
+ // CraftBukkit start - Place event
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition, iblockdata2).isCancelled()) {
world.setTypeAndData(blockposition, iblockdata2, 3);
this.a.setCarried((IBlockData) null);
+ }
+ // CraftBukkit end
}
}

View File

@@ -1,12 +1,11 @@
--- a/net/minecraft/world/entity/monster/EntityGhast.java
+++ b/net/minecraft/world/entity/monster/EntityGhast.java
@@ -193,7 +193,8 @@
@@ -318,6 +318,8 @@
EntityLargeFireball entitylargefireball = new EntityLargeFireball(world, this.ghast, d2, d3, d4);
EntityLargeFireball entitylargefireball = new EntityLargeFireball(world, this.ghast, d2, d3, d4, this.ghast.getPower());
- entitylargefireball.yield = this.ghast.getPower();
+ // CraftBukkit - set bukkitYield when setting explosionpower
+ entitylargefireball.bukkitYield = entitylargefireball.yield = this.ghast.getPower();
+ entitylargefireball.bukkitYield = entitylargefireball.explosionPower = this.ghast.getPower();
entitylargefireball.setPosition(this.ghast.locX() + vec3d.x * 4.0D, this.ghast.e(0.5D) + 0.5D, entitylargefireball.locZ() + vec3d.z * 4.0D);
world.addEntity(entitylargefireball);
this.a = -40;
this.chargeTime = -40;

View File

@@ -3,9 +3,9 @@
@@ -79,7 +79,7 @@
if (!entityplayer.hasEffect(mobeffectlist) || entityplayer.getEffect(mobeffectlist).getAmplifier() < 2 || entityplayer.getEffect(mobeffectlist).getDuration() < 1200) {
entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.k, this.isSilent() ? 0.0F : 1.0F));
- entityplayer.addEffect(new MobEffect(mobeffectlist, 6000, 2));
+ entityplayer.addEffect(new MobEffect(mobeffectlist, 6000, 2), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
entityplayer.connection.sendPacket(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.GUARDIAN_ELDER_EFFECT, this.isSilent() ? 0.0F : 1.0F));
- entityplayer.addEffect(new MobEffect(mobeffectlist, 6000, 2), this);
+ entityplayer.addEffect(new MobEffect(mobeffectlist, 6000, 2), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/EntityIllagerIllusioner.java
+++ b/net/minecraft/world/entity/monster/EntityIllagerIllusioner.java
@@ -67,7 +67,7 @@
@@ -70,7 +70,7 @@
this.goalSelector.a(8, new PathfinderGoalRandomStroll(this, 0.6D));
this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 3.0F, 1.0F));
this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F));
@@ -9,16 +9,7 @@
this.targetSelector.a(2, (new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)).a(300));
this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)).a(300));
this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, false)).a(300));
@@ -206,7 +206,7 @@
@Override
protected void j() {
- EntityIllagerIllusioner.this.getGoalTarget().addEffect(new MobEffect(MobEffects.BLINDNESS, 400));
+ EntityIllagerIllusioner.this.getGoalTarget().addEffect(new MobEffect(MobEffects.BLINDNESS, 400), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
@Override
@@ -243,7 +243,7 @@
@@ -228,7 +228,7 @@
@Override
protected void j() {
@@ -27,3 +18,12 @@
}
@Nullable
@@ -274,7 +274,7 @@
@Override
protected void j() {
- EntityIllagerIllusioner.this.getGoalTarget().addEffect(new MobEffect(MobEffects.BLINDNESS, 400), EntityIllagerIllusioner.this);
+ EntityIllagerIllusioner.this.getGoalTarget().addEffect(new MobEffect(MobEffects.BLINDNESS, 400), EntityIllagerIllusioner.this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
@Override

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/entity/monster/EntityIllagerWizard.java
+++ b/net/minecraft/world/entity/monster/EntityIllagerWizard.java
@@ -156,6 +156,11 @@
@@ -161,6 +161,11 @@
public void e() {
--this.b;
if (this.b == 0) {
--this.attackWarmupDelay;
if (this.attackWarmupDelay == 0) {
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleEntitySpellCastEvent(EntityIllagerWizard.this, this.getCastSpell())) {
+ return;

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/entity/monster/EntityPhantom.java
+++ b/net/minecraft/world/entity/monster/EntityPhantom.java
@@ -243,7 +243,7 @@
@@ -529,7 +529,7 @@
EntityHuman entityhuman = (EntityHuman) iterator.next();
if (EntityPhantom.this.a((EntityLiving) entityhuman, PathfinderTargetCondition.a)) {
if (EntityPhantom.this.a((EntityLiving) entityhuman, PathfinderTargetCondition.DEFAULT)) {
- EntityPhantom.this.setGoalTarget(entityhuman);
+ EntityPhantom.this.setGoalTarget(entityhuman, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit - reason
return true;

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/monster/EntityPigZombie.java
+++ b/net/minecraft/world/entity/monster/EntityPigZombie.java
@@ -69,7 +69,7 @@
protected void m() {
@@ -71,7 +71,7 @@
protected void n() {
this.goalSelector.a(2, new PathfinderGoalZombieAttack(this, 1.0D, false));
this.goalSelector.a(7, new PathfinderGoalRandomStrollLand(this, 1.0D));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a());
@@ -9,25 +9,25 @@
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, 10, true, false, this::a_));
this.targetSelector.a(3, new PathfinderGoalUniversalAngerReset<>(this, true));
}
@@ -142,7 +142,7 @@
@@ -144,7 +144,7 @@
}).filter((entitypigzombie) -> {
return !entitypigzombie.r(this.getGoalTarget());
return !entitypigzombie.p(this.getGoalTarget());
}).forEach((entitypigzombie) -> {
- entitypigzombie.setGoalTarget(this.getGoalTarget());
+ entitypigzombie.setGoalTarget(this.getGoalTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit
});
}
@@ -151,7 +151,7 @@
@@ -153,7 +153,7 @@
}
@Override
- public void setGoalTarget(@Nullable EntityLiving entityliving) {
+ public boolean setGoalTarget(@Nullable EntityLiving entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) { // CraftBukkit - signature
if (this.getGoalTarget() == null && entityliving != null) {
this.bo = EntityPigZombie.d.a(this.random);
this.bt = EntityPigZombie.bs.a(this.random);
@@ -161,12 +161,21 @@
this.playFirstAngerSoundIn = EntityPigZombie.FIRST_ANGER_SOUND_DELAY.a(this.random);
this.ticksUntilNextAlert = EntityPigZombie.ALERT_INTERVAL.a(this.random);
@@ -163,12 +163,21 @@
this.e((EntityHuman) entityliving);
}
@@ -37,11 +37,11 @@
@Override
public void anger() {
- this.setAnger(EntityPigZombie.bp.a(this.random));
- this.setAnger(EntityPigZombie.PERSISTENT_ANGER_TIME.a(this.random));
+ // CraftBukkit start
+ Entity entity = ((WorldServer) this.world).getEntity(getAngerTarget());
+ org.bukkit.event.entity.PigZombieAngerEvent event = new org.bukkit.event.entity.PigZombieAngerEvent((org.bukkit.entity.PigZombie) this.getBukkitEntity(), (entity == null) ? null : entity.getBukkitEntity(), EntityPigZombie.bp.a(this.random));
+ this.world.getServer().getPluginManager().callEvent(event);
+ Entity entity = ((WorldServer) this.level).getEntity(getAngerTarget());
+ org.bukkit.event.entity.PigZombieAngerEvent event = new org.bukkit.event.entity.PigZombieAngerEvent((org.bukkit.entity.PigZombie) this.getBukkitEntity(), (entity == null) ? null : entity.getBukkitEntity(), EntityPigZombie.PERSISTENT_ANGER_TIME.a(this.random));
+ this.level.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ this.setAngerTarget(null);
+ return;

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/EntityPillager.java
+++ b/net/minecraft/world/entity/monster/EntityPillager.java
@@ -70,7 +70,7 @@
@@ -75,7 +75,7 @@
this.goalSelector.a(8, new PathfinderGoalRandomStroll(this, 0.6D));
this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 15.0F, 1.0F));
this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 15.0F));

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/EntityRavager.java
+++ b/net/minecraft/world/entity/monster/EntityRavager.java
@@ -69,7 +69,7 @@
@@ -78,7 +78,7 @@
this.goalSelector.a(5, new PathfinderGoalRandomStrollLand(this, 0.4D));
this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F));
this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F));
@@ -9,12 +9,12 @@
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(4, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, true));
this.targetSelector.a(4, new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, true));
@@ -160,7 +160,7 @@
IBlockData iblockdata = this.world.getType(blockposition);
@@ -169,7 +169,7 @@
IBlockData iblockdata = this.level.getType(blockposition);
Block block = iblockdata.getBlock();
- if (block instanceof BlockLeaves) {
+ if (block instanceof BlockLeaves && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, net.minecraft.world.level.block.Blocks.AIR.getBlockData()).isCancelled()) { // CraftBukkit
flag = this.world.a(blockposition, true, this) || flag;
flag = this.level.a(blockposition, true, this) || flag;
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/EntityShulker.java
+++ b/net/minecraft/world/entity/monster/EntityShulker.java
@@ -47,11 +47,17 @@
@@ -57,6 +57,12 @@
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.Vec3D;
@@ -12,29 +12,23 @@
+
public class EntityShulker extends EntityGolem implements IMonster {
private static final UUID bp = UUID.fromString("7E0292F2-9434-48D5-A29F-9583AF7DF27F");
private static final AttributeModifier bq = new AttributeModifier(EntityShulker.bp, "Covered armor bonus", 20.0D, AttributeModifier.Operation.ADDITION);
- protected static final DataWatcherObject<EnumDirection> b = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.n);
+ public static final DataWatcherObject<EnumDirection> b = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.n); // PAIL protected -> public, rename ATTACH_FACE
protected static final DataWatcherObject<Optional<BlockPosition>> c = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.m);
protected static final DataWatcherObject<Byte> d = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.a);
public static final DataWatcherObject<Byte> COLOR = DataWatcher.a(EntityShulker.class, DataWatcherRegistry.a);
@@ -71,7 +77,7 @@
private static final UUID COVERED_ARMOR_MODIFIER_UUID = UUID.fromString("7E0292F2-9434-48D5-A29F-9583AF7DF27F");
@@ -95,7 +101,7 @@
this.goalSelector.a(4, new EntityShulker.a());
this.goalSelector.a(7, new EntityShulker.e());
this.goalSelector.a(7, new EntityShulker.f());
this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a());
+ this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a(new Class[0])); // CraftBukkit - decompile error
this.targetSelector.a(2, new EntityShulker.d(this));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{this.getClass()})).a());
+ this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{this.getClass()})).a(new Class[0])); // CraftBukkit - decompile error
this.targetSelector.a(2, new EntityShulker.e(this));
this.targetSelector.a(3, new EntityShulker.c(this));
}
@@ -319,6 +325,16 @@
@@ -405,6 +411,16 @@
EnumDirection enumdirection = this.g(blockposition1);
if (enumdirection != null) {
+ // CraftBukkit start
+ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), this.getBukkitEntity().getLocation(), new Location(this.world.getWorld(), blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()));
+ this.world.getServer().getPluginManager().callEvent(teleport);
+ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), this.getBukkitEntity().getLocation(), new Location(this.level.getWorld(), blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()));
+ this.level.getServer().getPluginManager().callEvent(teleport);
+ if (!teleport.isCancelled()) {
+ Location to = teleport.getTo();
+ blockposition1 = new BlockPosition(to.getX(), to.getY(), to.getZ());
@@ -42,14 +36,15 @@
+ return false;
+ }
+ // CraftBukkit end
this.datawatcher.set(EntityShulker.b, enumdirection);
this.playSound(SoundEffects.ENTITY_SHULKER_TELEPORT, 1.0F, 1.0F);
this.datawatcher.set(EntityShulker.c, Optional.of(blockposition1));
@@ -359,6 +375,7 @@
this.decouple();
this.setAttachFace(enumdirection);
this.playSound(SoundEffects.SHULKER_TELEPORT, 1.0F, 1.0F);
@@ -477,7 +493,7 @@
}
this.g((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D);
+ if (valid) ((WorldServer) world).chunkCheck(this); // CraftBukkit
entityshulker.d(vec3d);
- this.level.addEntity(entityshulker);
+ this.level.addEntity(entityshulker, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - the mysteries of life
}
}
}

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/monster/EntitySilverfish.java
+++ b/net/minecraft/world/entity/monster/EntitySilverfish.java
@@ -45,7 +45,7 @@
this.goalSelector.a(3, this.b);
@@ -46,7 +46,7 @@
this.goalSelector.a(3, this.friendsGoal);
this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, 1.0D, false));
this.goalSelector.a(5, new EntitySilverfish.PathfinderGoalSilverfishHideInBlock(this));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a());
@@ -9,19 +9,7 @@
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
}
@@ -183,6 +183,11 @@
IBlockData iblockdata = world.getType(blockposition);
if (BlockMonsterEggs.h(iblockdata)) {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition, BlockMonsterEggs.c(iblockdata.getBlock())).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
world.setTypeAndData(blockposition, BlockMonsterEggs.c(iblockdata.getBlock()), 3);
this.a.doSpawnEffect();
this.a.die();
@@ -229,6 +234,11 @@
@@ -171,6 +171,11 @@
Block block = iblockdata.getBlock();
if (block instanceof BlockMonsterEggs) {
@@ -30,6 +18,18 @@
+ continue;
+ }
+ // CraftBukkit end
if (world.getGameRules().getBoolean(GameRules.MOB_GRIEFING)) {
if (world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
world.a(blockposition1, true, this.silverfish);
} else {
@@ -239,6 +244,11 @@
IBlockData iblockdata = world.getType(blockposition);
if (BlockMonsterEggs.h(iblockdata)) {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, BlockMonsterEggs.n(iblockdata)).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
world.setTypeAndData(blockposition, BlockMonsterEggs.n(iblockdata), 3);
this.mob.doSpawnEffect();
this.mob.die();

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/entity/monster/EntitySkeletonAbstract.java
+++ b/net/minecraft/world/entity/monster/EntitySkeletonAbstract.java
@@ -196,8 +196,19 @@
double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2);
@@ -195,8 +195,19 @@
double d3 = Math.sqrt(d0 * d0 + d2 * d2);
entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.world.getDifficulty().a() * 4));
entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level.getDifficulty().a() * 4));
+ // CraftBukkit start
+ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getItemInMainHand(), null, entityarrow, net.minecraft.world.EnumHand.MAIN_HAND, 0.8F, true);
+ if (event.isCancelled()) {
@@ -12,11 +12,11 @@
+ }
+
+ if (event.getProjectile() == entityarrow.getBukkitEntity()) {
+ world.addEntity(entityarrow);
+ level.addEntity(entityarrow);
+ }
+ // CraftBukkit end
this.playSound(SoundEffects.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F));
- this.world.addEntity(entityarrow);
this.playSound(SoundEffects.SKELETON_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F));
- this.level.addEntity(entityarrow);
+ // this.world.addEntity(entityarrow); // CraftBukkit - moved up
}

View File

@@ -4,8 +4,8 @@
return false;
} else {
if (entity instanceof EntityLiving) {
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.WITHER, 200));
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.WITHER, 200), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.WITHER, 200), this);
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.WITHER, 200), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
return true;

View File

@@ -14,8 +14,8 @@
+
public class EntitySlime extends EntityInsentient implements IMonster {
private static final DataWatcherObject<Integer> bo = DataWatcher.a(EntitySlime.class, DataWatcherRegistry.b);
@@ -188,7 +196,7 @@
private static final DataWatcherObject<Integer> ID_SIZE = DataWatcher.a(EntitySlime.class, DataWatcherRegistry.INT);
@@ -186,7 +194,7 @@
@Override
public EntityTypes<? extends EntitySlime> getEntityType() {
@@ -24,13 +24,13 @@
}
@Override
@@ -202,6 +210,19 @@
@@ -200,6 +208,19 @@
int j = i / 2;
int k = 2 + this.random.nextInt(3);
+ // CraftBukkit start
+ SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), k);
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled() && event.getCount() > 0) {
+ k = event.getCount();
@@ -44,11 +44,11 @@
for (int l = 0; l < k; ++l) {
float f1 = ((float) (l % 2) - 0.5F) * f;
float f2 = ((float) (l / 2) - 0.5F) * f;
@@ -216,8 +237,17 @@
@@ -214,8 +235,17 @@
entityslime.setInvulnerable(this.isInvulnerable());
entityslime.setSize(j, true);
entityslime.setPositionRotation(this.locX() + (double) f1, this.locY() + 0.5D, this.locZ() + (double) f2, this.random.nextFloat() * 360.0F, 0.0F);
- this.world.addEntity(entityslime);
- this.level.addEntity(entityslime);
+ slimes.add(entityslime); // CraftBukkit
+ }
+
@@ -57,9 +57,9 @@
+ return;
+ }
+ for (EntityLiving living : slimes) {
+ this.world.addEntity(living, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason
+ this.level.addEntity(living, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason
}
+ // CraftBukkit end
}
super.die();
super.a(entity_removalreason);

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/monster/EntitySpider.java
+++ b/net/minecraft/world/entity/monster/EntitySpider.java
@@ -175,7 +175,7 @@
MobEffectList mobeffectlist = ((EntitySpider.GroupDataSpider) object).a;
@@ -176,7 +176,7 @@
MobEffectList mobeffectlist = ((EntitySpider.GroupDataSpider) object).effect;
if (mobeffectlist != null) {
- this.addEffect(new MobEffect(mobeffectlist, Integer.MAX_VALUE));

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/monster/EntityStrider.java
+++ b/net/minecraft/world/entity/monster/EntityStrider.java
@@ -318,7 +318,12 @@
IBlockData iblockdata1 = this.aN();
@@ -321,7 +321,12 @@
IBlockData iblockdata1 = this.aU();
boolean flag = iblockdata.a((Tag) TagsBlock.STRIDER_WARM_BLOCKS) || iblockdata1.a((Tag) TagsBlock.STRIDER_WARM_BLOCKS) || this.b((Tag) TagsFluid.LAVA) > 0.0D;
- this.setShivering(!flag);
@@ -12,5 +12,5 @@
+ }
+ // CraftBukkit end
super.tick();
this.eU();
this.fD();
this.checkBlockCollisions();

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/EntityVex.java
+++ b/net/minecraft/world/entity/monster/EntityVex.java
@@ -81,7 +81,7 @@
@@ -89,7 +89,7 @@
this.goalSelector.a(8, new EntityVex.d());
this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 3.0F, 1.0F));
this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F));
@@ -9,12 +9,12 @@
this.targetSelector.a(2, new EntityVex.b(this));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
}
@@ -222,7 +222,7 @@
@@ -355,7 +355,7 @@
@Override
public void c() {
- EntityVex.this.setGoalTarget(EntityVex.this.c.getGoalTarget());
+ EntityVex.this.setGoalTarget(EntityVex.this.c.getGoalTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit
- EntityVex.this.setGoalTarget(EntityVex.this.owner.getGoalTarget());
+ EntityVex.this.setGoalTarget(EntityVex.this.owner.getGoalTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit
super.c();
}
}

View File

@@ -15,28 +15,28 @@
+
public class EntityZombie extends EntityMonster {
private static final UUID b = UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836");
@@ -84,6 +93,7 @@
private boolean bs;
private int bt;
public int drownedConversionTime;
private static final UUID SPEED_MODIFIER_BABY_UUID = UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836");
@@ -89,6 +98,7 @@
private boolean canBreakDoors;
private int inWaterTime;
public int conversionTime;
+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field
public EntityZombie(EntityTypes<? extends EntityZombie> entitytypes, World world) {
super(entitytypes, world);
@@ -200,7 +210,10 @@
@@ -205,7 +215,10 @@
public void tick() {
if (!this.world.isClientSide && this.isAlive() && !this.isNoAI()) {
if (!this.level.isClientSide && this.isAlive() && !this.isNoAI()) {
if (this.isDrownConverting()) {
- --this.drownedConversionTime;
- --this.conversionTime;
+ // CraftBukkit start - Use wall time instead of ticks for conversion
+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
+ this.drownedConversionTime -= elapsedTicks;
+ this.conversionTime -= elapsedTicks;
+ // CraftBukkit end
if (this.drownedConversionTime < 0) {
this.eP();
if (this.conversionTime < 0) {
this.fy();
}
@@ -217,6 +230,7 @@
@@ -222,6 +235,7 @@
}
super.tick();
@@ -44,15 +44,15 @@
}
@Override
@@ -249,6 +263,7 @@
@@ -254,6 +268,7 @@
}
public void startDrownedConversion(int i) {
+ this.lastTick = MinecraftServer.currentTick; // CraftBukkit
this.drownedConversionTime = i;
this.getDataWatcher().set(EntityZombie.DROWN_CONVERTING, true);
this.conversionTime = i;
this.getDataWatcher().set(EntityZombie.DATA_DROWNED_CONVERSION_ID, true);
}
@@ -262,11 +277,15 @@
@@ -267,11 +282,15 @@
}
protected void b(EntityTypes<? extends EntityZombie> entitytypes) {
@@ -60,8 +60,8 @@
+ EntityZombie entityzombie = (EntityZombie) this.a(entitytypes, true, EntityTransformEvent.TransformReason.DROWNED, CreatureSpawnEvent.SpawnReason.DROWNED);
if (entityzombie != null) {
entityzombie.y(entityzombie.world.getDamageScaler(entityzombie.getChunkCoordinates()).d());
entityzombie.u(entityzombie.eK() && this.eU());
entityzombie.z(entityzombie.level.getDamageScaler(entityzombie.getChunkCoordinates()).d());
entityzombie.w(entityzombie.p() && this.fD());
+ // CraftBukkit start - SPIGOT-5208: End conversion to stop event spam
+ } else {
+ ((Zombie) getBukkitEntity()).setConversionTime(-1);
@@ -69,26 +69,26 @@
}
}
@@ -306,9 +325,9 @@
if (SpawnerCreature.a(entitypositiontypes_surface, (IWorldReader) this.world, blockposition, entitytypes) && EntityPositionTypes.a(entitytypes, worldserver, EnumMobSpawn.REINFORCEMENT, blockposition, this.world.random)) {
@@ -311,9 +330,9 @@
if (SpawnerCreature.a(entitypositiontypes_surface, (IWorldReader) this.level, blockposition, entitytypes) && EntityPositionTypes.a(entitytypes, worldserver, EnumMobSpawn.REINFORCEMENT, blockposition, this.level.random)) {
entityzombie.setPosition((double) i1, (double) j1, (double) k1);
if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.world.j((Entity) entityzombie) && this.world.getCubes(entityzombie) && !this.world.containsLiquid(entityzombie.getBoundingBox())) {
if (!this.level.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.level.f((Entity) entityzombie) && this.level.getCubes(entityzombie) && !this.level.containsLiquid(entityzombie.getBoundingBox())) {
- entityzombie.setGoalTarget(entityliving);
+ entityzombie.setGoalTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit
entityzombie.prepare(worldserver, this.world.getDamageScaler(entityzombie.getChunkCoordinates()), EnumMobSpawn.REINFORCEMENT, (GroupDataEntity) null, (NBTTagCompound) null);
entityzombie.prepare(worldserver, this.level.getDamageScaler(entityzombie.getChunkCoordinates()), EnumMobSpawn.REINFORCEMENT, (GroupDataEntity) null, (NBTTagCompound) null);
- worldserver.addAllEntities(entityzombie);
+ worldserver.addAllEntities(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit
this.getAttributeInstance(GenericAttributes.SPAWN_REINFORCEMENTS).addModifier(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION));
entityzombie.getAttributeInstance(GenericAttributes.SPAWN_REINFORCEMENTS).addModifier(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION));
this.getAttributeInstance(GenericAttributes.SPAWN_REINFORCEMENTS_CHANCE).addModifier(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION));
entityzombie.getAttributeInstance(GenericAttributes.SPAWN_REINFORCEMENTS_CHANCE).addModifier(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION));
break;
@@ -329,7 +348,14 @@
float f = this.world.getDamageScaler(this.getChunkCoordinates()).b();
@@ -334,7 +353,14 @@
float f = this.level.getDamageScaler(this.getChunkCoordinates()).b();
if (this.getItemInMainHand().isEmpty() && this.isBurning() && this.random.nextFloat() < f * 0.3F) {
- entity.setOnFire(2 * (int) f);
+ // CraftBukkit start
+ EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 2 * (int) f); // PAIL: fixme
+ this.world.getServer().getPluginManager().callEvent(event);
+ this.level.getServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ entity.setOnFire(event.getDuration(), false);
@@ -97,7 +97,7 @@
}
}
@@ -410,7 +436,12 @@
@@ -415,7 +441,12 @@
}
EntityVillager entityvillager = (EntityVillager) entityliving;
@@ -111,7 +111,7 @@
entityzombievillager.prepare(worldserver, worldserver.getDamageScaler(entityzombievillager.getChunkCoordinates()), EnumMobSpawn.CONVERSION, new EntityZombie.GroupDataZombie(false, true), (NBTTagCompound) null);
entityzombievillager.setVillagerData(entityvillager.getVillagerData());
@@ -467,7 +498,7 @@
@@ -472,7 +503,7 @@
entitychicken1.prepare(worldaccess, difficultydamagescaler, EnumMobSpawn.JOCKEY, (GroupDataEntity) null, (NBTTagCompound) null);
entitychicken1.setChickenJockey(true);
this.startRiding(entitychicken1);

View File

@@ -2,10 +2,10 @@
+++ b/net/minecraft/world/entity/monster/EntityZombieHusk.java
@@ -58,7 +58,7 @@
if (flag && this.getItemInMainHand().isEmpty() && entity instanceof EntityLiving) {
float f = this.world.getDamageScaler(this.getChunkCoordinates()).b();
float f = this.level.getDamageScaler(this.getChunkCoordinates()).b();
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.HUNGER, 140 * (int) f));
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.HUNGER, 140 * (int) f), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
- ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.HUNGER, 140 * (int) f), this);
+ ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.HUNGER, 140 * (int) f), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
}
return flag;

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/monster/EntityZombieVillager.java
+++ b/net/minecraft/world/entity/monster/EntityZombieVillager.java
@@ -47,6 +47,13 @@
import net.minecraft.world.level.block.Blocks;
@@ -49,6 +49,13 @@
import net.minecraft.world.level.gameevent.GameEvent;
import org.apache.logging.log4j.Logger;
+// CraftBukkit start
@@ -13,36 +13,36 @@
+
public class EntityZombieVillager extends EntityZombie implements VillagerDataHolder {
public static final DataWatcherObject<Boolean> CONVERTING = DataWatcher.a(EntityZombieVillager.class, DataWatcherRegistry.i);
@@ -56,6 +63,7 @@
private NBTBase bp;
private NBTTagCompound bq;
private int br;
public static final DataWatcherObject<Boolean> DATA_CONVERTING_ID = DataWatcher.a(EntityZombieVillager.class, DataWatcherRegistry.BOOLEAN);
@@ -62,6 +69,7 @@
private NBTBase gossips;
private NBTTagCompound tradeOffers;
private int villagerXp;
+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field
public EntityZombieVillager(EntityTypes<? extends EntityZombieVillager> entitytypes, World world) {
super(entitytypes, world);
@@ -72,7 +80,7 @@
@@ -78,7 +86,7 @@
@Override
public void saveData(NBTTagCompound nbttagcompound) {
super.saveData(nbttagcompound);
- DataResult dataresult = VillagerData.a.encodeStart(DynamicOpsNBT.a, this.getVillagerData());
+ DataResult<NBTBase> dataresult = VillagerData.a.encodeStart(DynamicOpsNBT.a, this.getVillagerData()); // CraftBukkit - decompile error
- DataResult dataresult = VillagerData.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.getVillagerData());
+ DataResult<NBTBase> dataresult = VillagerData.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.getVillagerData()); // CraftBukkit - decompile error
Logger logger = EntityZombieVillager.LOGGER;
logger.getClass();
@@ -128,6 +136,10 @@
Objects.requireNonNull(logger);
@@ -134,6 +142,10 @@
public void tick() {
if (!this.world.isClientSide && this.isAlive() && this.isConverting()) {
if (!this.level.isClientSide && this.isAlive() && this.isConverting()) {
int i = this.getConversionProgress();
+ // CraftBukkit start - Use wall time instead of ticks for villager conversion
+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
+ i *= elapsedTicks;
+ // CraftBukkit end
this.conversionTime -= i;
if (this.conversionTime <= 0) {
@@ -136,6 +148,7 @@
this.villagerConversionTime -= i;
if (this.villagerConversionTime <= 0) {
@@ -142,6 +154,7 @@
}
super.tick();
@@ -50,18 +50,21 @@
}
@Override
@@ -179,13 +192,22 @@
this.conversionPlayer = uuid;
this.conversionTime = i;
this.getDataWatcher().set(EntityZombieVillager.CONVERTING, true);
@@ -186,8 +199,11 @@
this.conversionStarter = uuid;
this.villagerConversionTime = i;
this.getDataWatcher().set(EntityZombieVillager.DATA_CONVERTING_ID, true);
- this.removeEffect(MobEffects.WEAKNESS);
- this.addEffect(new MobEffect(MobEffects.INCREASE_DAMAGE, i, Math.min(this.world.getDifficulty().a() - 1, 0)));
- this.addEffect(new MobEffect(MobEffects.DAMAGE_BOOST, i, Math.min(this.level.getDifficulty().a() - 1, 0)));
+ // CraftBukkit start
+ this.persistent = true; // CraftBukkit - SPIGOT-4684 update persistence
+ this.persistenceRequired = true; // CraftBukkit - SPIGOT-4684 update persistence
+ this.removeEffect(MobEffects.WEAKNESS, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+ this.addEffect(new MobEffect(MobEffects.INCREASE_DAMAGE, i, Math.min(this.world.getDifficulty().a() - 1, 0)), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+ this.addEffect(new MobEffect(MobEffects.DAMAGE_BOOST, i, Math.min(this.level.getDifficulty().a() - 1, 0)), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
+ // CraftBukkit end
this.world.broadcastEntityEffect(this, (byte) 16);
this.level.broadcastEntityEffect(this, (byte) 16);
}
@@ -204,7 +220,13 @@
}
private void c(WorldServer worldserver) {
@@ -76,17 +79,17 @@
EnumItemSlot[] aenumitemslot = EnumItemSlot.values();
int i = aenumitemslot.length;
@@ -200,7 +222,9 @@
@@ -219,7 +241,9 @@
double d0 = (double) this.e(enumitemslot);
if (d0 > 1.0D) {
+ this.forceDrops = true; // CraftBukkit
this.a(itemstack);
this.b(itemstack);
+ this.forceDrops = false; // CraftBukkit
}
}
}
@@ -226,7 +250,7 @@
@@ -245,7 +269,7 @@
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
+++ b/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
@@ -53,6 +53,18 @@
@@ -56,6 +56,18 @@
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.IBlockData;
@@ -16,18 +16,13 @@
+import net.minecraft.world.item.Item;
+// CraftBukkit end
+
public class EntityPiglin extends EntityPiglinAbstract implements ICrossbow {
public class EntityPiglin extends EntityPiglinAbstract implements ICrossbow, InventoryCarrier {
private static final DataWatcherObject<Boolean> bp = DataWatcher.a(EntityPiglin.class, DataWatcherRegistry.i);
@@ -60,10 +72,14 @@
private static final DataWatcherObject<Boolean> br = DataWatcher.a(EntityPiglin.class, DataWatcherRegistry.i);
private static final UUID bs = UUID.fromString("766bfa64-11f3-11ea-8d71-362b9e155667");
private static final AttributeModifier bt = new AttributeModifier(EntityPiglin.bs, "Baby speed boost", 0.20000000298023224D, AttributeModifier.Operation.MULTIPLY_BASE);
- private final InventorySubcontainer bu = new InventorySubcontainer(8);
+ public final InventorySubcontainer bu = new InventorySubcontainer(8); // PAIL private -> public
public boolean cannotHunt = false;
protected static final ImmutableList<SensorType<? extends Sensor<? super EntityPiglin>>> d = ImmutableList.of(SensorType.c, SensorType.d, SensorType.b, SensorType.f, SensorType.k);
protected static final ImmutableList<MemoryModuleType<?>> bo = ImmutableList.of(MemoryModuleType.LOOK_TARGET, MemoryModuleType.DOORS_TO_CLOSE, MemoryModuleType.MOBS, MemoryModuleType.VISIBLE_MOBS, MemoryModuleType.NEAREST_VISIBLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_TARGETABLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ADULT_PIGLINS, MemoryModuleType.NEARBY_ADULT_PIGLINS, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.HURT_BY, MemoryModuleType.HURT_BY_ENTITY, MemoryModuleType.WALK_TARGET, new MemoryModuleType[]{MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.ATTACK_TARGET, MemoryModuleType.ATTACK_COOLING_DOWN, MemoryModuleType.INTERACTION_TARGET, MemoryModuleType.PATH, MemoryModuleType.ANGRY_AT, MemoryModuleType.UNIVERSAL_ANGER, MemoryModuleType.AVOID_TARGET, MemoryModuleType.ADMIRING_ITEM, MemoryModuleType.TIME_TRYING_TO_REACH_ADMIRE_ITEM, MemoryModuleType.ADMIRING_DISABLED, MemoryModuleType.DISABLE_WALK_TO_ADMIRE_ITEM, MemoryModuleType.CELEBRATE_LOCATION, MemoryModuleType.DANCING, MemoryModuleType.HUNTED_RECENTLY, MemoryModuleType.NEAREST_VISIBLE_BABY_HOGLIN, MemoryModuleType.NEAREST_VISIBLE_NEMSIS, MemoryModuleType.NEAREST_VISIBLE_ZOMBIFIED, MemoryModuleType.RIDE_TARGET, MemoryModuleType.VISIBLE_ADULT_PIGLIN_COUNT, MemoryModuleType.VISIBLE_ADULT_HOGLIN_COUNT, MemoryModuleType.NEAREST_VISIBLE_HUNTABLE_HOGLIN, MemoryModuleType.NEAREST_TARGETABLE_PLAYER_NOT_WEARING_GOLD, MemoryModuleType.NEAREST_PLAYER_HOLDING_WANTED_ITEM, MemoryModuleType.ATE_RECENTLY, MemoryModuleType.NEAREST_REPELLENT});
private static final DataWatcherObject<Boolean> DATA_BABY_ID = DataWatcher.a(EntityPiglin.class, DataWatcherRegistry.BOOLEAN);
@@ -76,6 +88,10 @@
public boolean cannotHunt;
protected static final ImmutableList<SensorType<? extends Sensor<? super EntityPiglin>>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.NEAREST_ITEMS, SensorType.HURT_BY, SensorType.PIGLIN_SPECIFIC_SENSOR);
protected static final ImmutableList<MemoryModuleType<?>> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.LOOK_TARGET, MemoryModuleType.DOORS_TO_CLOSE, MemoryModuleType.NEAREST_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ADULT_PIGLINS, MemoryModuleType.NEARBY_ADULT_PIGLINS, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.HURT_BY, MemoryModuleType.HURT_BY_ENTITY, MemoryModuleType.WALK_TARGET, new MemoryModuleType[]{MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.ATTACK_TARGET, MemoryModuleType.ATTACK_COOLING_DOWN, MemoryModuleType.INTERACTION_TARGET, MemoryModuleType.PATH, MemoryModuleType.ANGRY_AT, MemoryModuleType.UNIVERSAL_ANGER, MemoryModuleType.AVOID_TARGET, MemoryModuleType.ADMIRING_ITEM, MemoryModuleType.TIME_TRYING_TO_REACH_ADMIRE_ITEM, MemoryModuleType.ADMIRING_DISABLED, MemoryModuleType.DISABLE_WALK_TO_ADMIRE_ITEM, MemoryModuleType.CELEBRATE_LOCATION, MemoryModuleType.DANCING, MemoryModuleType.HUNTED_RECENTLY, MemoryModuleType.NEAREST_VISIBLE_BABY_HOGLIN, MemoryModuleType.NEAREST_VISIBLE_NEMESIS, MemoryModuleType.NEAREST_VISIBLE_ZOMBIFIED, MemoryModuleType.RIDE_TARGET, MemoryModuleType.VISIBLE_ADULT_PIGLIN_COUNT, MemoryModuleType.VISIBLE_ADULT_HOGLIN_COUNT, MemoryModuleType.NEAREST_VISIBLE_HUNTABLE_HOGLIN, MemoryModuleType.NEAREST_TARGETABLE_PLAYER_NOT_WEARING_GOLD, MemoryModuleType.NEAREST_PLAYER_HOLDING_WANTED_ITEM, MemoryModuleType.ATE_RECENTLY, MemoryModuleType.NEAREST_REPELLENT});
+ // CraftBukkit start - Custom bartering and interest list
+ public Set<Item> allowedBarterItems = new HashSet<>();
+ public Set<Item> interestItems = new HashSet<>();
@@ -35,10 +30,10 @@
public EntityPiglin(EntityTypes<? extends EntityPiglinAbstract> entitytypes, World world) {
super(entitytypes, world);
@@ -82,6 +98,14 @@
@@ -94,6 +110,14 @@
}
nbttagcompound.set("Inventory", this.bu.g());
nbttagcompound.set("Inventory", this.inventory.g());
+ // CraftBukkit start
+ NBTTagList barterList = new NBTTagList();
+ allowedBarterItems.stream().map(IRegistry.ITEM::getKey).map(MinecraftKey::toString).map(NBTTagString::a).forEach(barterList::add);
@@ -50,18 +45,18 @@
}
@Override
@@ -90,6 +114,10 @@
@@ -102,6 +126,10 @@
this.setBaby(nbttagcompound.getBoolean("IsBaby"));
this.v(nbttagcompound.getBoolean("CannotHunt"));
this.bu.a(nbttagcompound.getList("Inventory", 10));
this.x(nbttagcompound.getBoolean("CannotHunt"));
this.inventory.a(nbttagcompound.getList("Inventory", 10));
+ // CraftBukkit start
+ this.allowedBarterItems = nbttagcompound.getList("Bukkit.BarterList", 8).stream().map(NBTBase::asString).map(MinecraftKey::a).map(IRegistry.ITEM::get).collect(Collectors.toCollection(HashSet::new));
+ this.interestItems = nbttagcompound.getList("Bukkit.InterestList", 8).stream().map(NBTBase::asString).map(MinecraftKey::a).map(IRegistry.ITEM::get).collect(Collectors.toCollection(HashSet::new));
+ // CraftBukkit end
}
@Override
@@ -188,7 +216,7 @@
@VisibleForDebug
@@ -206,7 +234,7 @@
@Override
public BehaviorController<EntityPiglin> getBehaviorController() {
@@ -70,41 +65,41 @@
}
@Override
@@ -247,7 +275,7 @@
@@ -265,7 +293,7 @@
@Override
protected void mobTick() {
this.world.getMethodProfiler().enter("piglinBrain");
- this.getBehaviorController().a((WorldServer) this.world, (EntityLiving) this);
+ this.getBehaviorController().a((WorldServer) this.world, (EntityPiglin) this); // CraftBukkit - decompile error
this.world.getMethodProfiler().exit();
this.level.getMethodProfiler().enter("piglinBrain");
- this.getBehaviorController().a((WorldServer) this.level, (EntityLiving) this);
+ this.getBehaviorController().a((WorldServer) this.level, (EntityPiglin) this); // CraftBukkit - decompile error
this.level.getMethodProfiler().exit();
PiglinAI.b(this);
super.mobTick();
@@ -330,7 +358,7 @@
@@ -349,7 +377,7 @@
}
protected void n(ItemStack itemstack) {
- if (itemstack.getItem() == PiglinAI.a) {
+ if (itemstack.getItem() == PiglinAI.a || allowedBarterItems.contains(itemstack.getItem())) { // CraftBukkit - Changes to accept custom payment items
protected void p(ItemStack itemstack) {
- if (itemstack.a(PiglinAI.BARTERING_ITEM)) {
+ if (itemstack.a(PiglinAI.BARTERING_ITEM) || allowedBarterItems.contains(itemstack.getItem())) { // CraftBukkit - Changes to accept custom payment items
this.setSlot(EnumItemSlot.OFFHAND, itemstack);
this.d(EnumItemSlot.OFFHAND);
} else {
@@ -356,8 +384,8 @@
@@ -375,8 +403,8 @@
if (EnchantmentManager.d(itemstack1)) {
return false;
} else {
- boolean flag = PiglinAI.a(itemstack.getItem()) || itemstack.getItem() == Items.CROSSBOW;
- boolean flag1 = PiglinAI.a(itemstack1.getItem()) || itemstack1.getItem() == Items.CROSSBOW;
+ boolean flag = PiglinAI.isLovedByPiglin(itemstack.getItem(), this) || itemstack.getItem() == Items.CROSSBOW; // CraftBukkit
+ boolean flag1 = PiglinAI.isLovedByPiglin(itemstack1.getItem(), this) || itemstack1.getItem() == Items.CROSSBOW; // CraftBukkit
- boolean flag = PiglinAI.a(itemstack) || itemstack.a(Items.CROSSBOW);
- boolean flag1 = PiglinAI.a(itemstack1) || itemstack1.a(Items.CROSSBOW);
+ boolean flag = PiglinAI.isLovedByPiglin(itemstack, this) || itemstack.a(Items.CROSSBOW); // CraftBukkit
+ boolean flag1 = PiglinAI.isLovedByPiglin(itemstack1, this) || itemstack1.a(Items.CROSSBOW); // CraftBukkit
return flag && !flag1 ? true : (!flag && flag1 ? false : (this.eM() && itemstack.getItem() != Items.CROSSBOW && itemstack1.getItem() == Items.CROSSBOW ? false : super.a(itemstack, itemstack1)));
return flag && !flag1 ? true : (!flag && flag1 ? false : (this.fv() && !itemstack.a(Items.CROSSBOW) && itemstack1.a(Items.CROSSBOW) ? false : super.a(itemstack, itemstack1)));
}
@@ -386,7 +414,7 @@
@@ -405,7 +433,7 @@
@Override
protected SoundEffect getSoundAmbient() {
- return this.world.isClientSide ? null : (SoundEffect) PiglinAI.d(this).orElse((Object) null);
+ return this.world.isClientSide ? null : (SoundEffect) PiglinAI.d(this).orElse(null); // CraftBukkit - Decompile error
- return this.level.isClientSide ? null : (SoundEffect) PiglinAI.d(this).orElse((Object) null);
+ return this.level.isClientSide ? null : (SoundEffect) PiglinAI.d(this).orElse(null); // CraftBukkit - Decompile error
}
@Override

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.java
+++ b/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.java
@@ -99,7 +99,7 @@
@@ -100,7 +100,7 @@
}
protected void c(WorldServer worldserver) {
@@ -9,12 +9,12 @@
if (entitypigzombie != null) {
entitypigzombie.addEffect(new MobEffect(MobEffects.CONFUSION, 200, 0));
@@ -114,7 +114,7 @@
@@ -117,7 +117,7 @@
@Nullable
@Override
public EntityLiving getGoalTarget() {
- return (EntityLiving) this.bg.getMemory(MemoryModuleType.ATTACK_TARGET).orElse((Object) null);
+ return (EntityLiving) this.bg.getMemory(MemoryModuleType.ATTACK_TARGET).orElse(null); // CraftBukkit - decompile error
- return (EntityLiving) this.brain.getMemory(MemoryModuleType.ATTACK_TARGET).orElse((Object) null);
+ return (EntityLiving) this.brain.getMemory(MemoryModuleType.ATTACK_TARGET).orElse(null); // CraftBukkit - decompile error
}
protected boolean eO() {
protected boolean fx() {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/piglin/PiglinAI.java
+++ b/net/minecraft/world/entity/monster/piglin/PiglinAI.java
@@ -72,6 +72,13 @@
@@ -73,6 +73,13 @@
import net.minecraft.world.level.storage.loot.parameters.LootContextParameters;
import net.minecraft.world.phys.Vec3D;
@@ -13,10 +13,10 @@
+
public class PiglinAI {
public static final Item a = Items.GOLD_INGOT;
@@ -114,7 +121,8 @@
public static final int REPELLENT_DETECTION_RANGE_HORIZONTAL = 8;
@@ -145,7 +152,8 @@
private static void b(EntityPiglin entitypiglin, BehaviorController<EntityPiglin> behaviorcontroller) {
behaviorcontroller.a(Activity.FLIGHT, 10, ImmutableList.of(new BehaviorAttackTargetForget<>((entityliving) -> {
behaviorcontroller.a(Activity.FIGHT, 10, ImmutableList.of(new BehaviorAttackTargetForget<>((entityliving) -> {
return !b(entitypiglin, entityliving);
- }), new BehaviorRunIf<>(PiglinAI::c, new BehaviorRetreat<>(5, 0.75F)), new BehaviorWalkAwayOutOfRange(1.0F), new BehaviorAttack(20), new BehaviorCrossbowAttack<>(), new BehaviorRememberHuntedHoglin<>(), new BehaviorRemoveMemory<>(PiglinAI::j, MemoryModuleType.ATTACK_TARGET)), MemoryModuleType.ATTACK_TARGET);
+ // CraftBukkit - decompile error
@@ -24,7 +24,7 @@
}
private static void c(BehaviorController<EntityPiglin> behaviorcontroller) {
@@ -132,7 +140,8 @@
@@ -163,7 +171,8 @@
}
private static void f(BehaviorController<EntityPiglin> behaviorcontroller) {
@@ -34,36 +34,40 @@
}
private static BehaviorGateSingle<EntityPiglin> a() {
@@ -140,7 +149,8 @@
@@ -171,7 +180,8 @@
}
private static BehaviorGateSingle<EntityPiglin> b() {
- return new BehaviorGateSingle<>(ImmutableList.of(Pair.of(new BehaviorStrollRandomUnconstrained(0.6F), 2), Pair.of(BehaviorInteract.a(EntityTypes.PIGLIN, 8, MemoryModuleType.INTERACTION_TARGET, 0.6F, 2), 2), Pair.of(new BehaviorRunIf<>(PiglinAI::g, new BehaviorLookWalk(0.6F, 3)), 2), Pair.of(new BehaviorNop(30, 60), 1)));
- return new BehaviorGateSingle<>(ImmutableList.of(Pair.of(new BehaviorStrollRandomUnconstrained(0.6F), 2), Pair.of(BehaviorInteract.a(EntityTypes.PIGLIN, 8, MemoryModuleType.INTERACTION_TARGET, 0.6F, 2), 2), Pair.of(new BehaviorRunIf<>(PiglinAI::f, new BehaviorLookWalk(0.6F, 3)), 2), Pair.of(new BehaviorNop(30, 60), 1)));
+ // CraftBukkit - decompile error
+ return new BehaviorGateSingle<>(ImmutableList.of(Pair.of(new BehaviorStrollRandomUnconstrained(0.6F), 2), Pair.of(BehaviorInteract.a(EntityTypes.PIGLIN, 8, MemoryModuleType.INTERACTION_TARGET, 0.6F, 2), 2), Pair.of(new BehaviorRunIf<>((java.util.function.Predicate<EntityLiving>) PiglinAI::g, new BehaviorLookWalk(0.6F, 3)), 2), Pair.of(new BehaviorNop(30, 60), 1)));
+ return new BehaviorGateSingle<>(ImmutableList.of(Pair.of(new BehaviorStrollRandomUnconstrained(0.6F), 2), Pair.of(BehaviorInteract.a(EntityTypes.PIGLIN, 8, MemoryModuleType.INTERACTION_TARGET, 0.6F, 2), 2), Pair.of(new BehaviorRunIf<>((java.util.function.Predicate<EntityLiving>) PiglinAI::f, new BehaviorLookWalk(0.6F, 3)), 2), Pair.of(new BehaviorNop(30, 60), 1)));
}
private static BehaviorWalkAway<BlockPosition> c() {
@@ -157,10 +167,10 @@
@@ -188,13 +198,13 @@
protected static void b(EntityPiglin entitypiglin) {
BehaviorController<EntityPiglin> behaviorcontroller = entitypiglin.getBehaviorController();
- Activity activity = (Activity) behaviorcontroller.f().orElse((Object) null);
+ Activity activity = (Activity) behaviorcontroller.f().orElse(null); // CraftBukkit - decompile error
behaviorcontroller.a((List) ImmutableList.of(Activity.ADMIRE_ITEM, Activity.FLIGHT, Activity.AVOID, Activity.CELEBRATE, Activity.RIDE, Activity.IDLE));
behaviorcontroller.a((List) ImmutableList.of(Activity.ADMIRE_ITEM, Activity.FIGHT, Activity.AVOID, Activity.CELEBRATE, Activity.RIDE, Activity.IDLE));
- Activity activity1 = (Activity) behaviorcontroller.f().orElse((Object) null);
+ Activity activity1 = (Activity) behaviorcontroller.f().orElse(null); // CraftBukkit - decompile error
if (activity != activity1) {
d(entitypiglin).ifPresent(entitypiglin::a);
@@ -192,25 +202,29 @@
- Optional optional = d(entitypiglin);
+ Optional<SoundEffect> optional = d(entitypiglin); // CraftBukkit - decompile error
Objects.requireNonNull(entitypiglin);
optional.ifPresent(entitypiglin::a);
@@ -226,23 +236,27 @@
n(entitypiglin);
ItemStack itemstack;
- if (entityitem.getItemStack().getItem() == Items.GOLD_NUGGET) {
- if (entityitem.getItemStack().a(Items.GOLD_NUGGET)) {
+ // CraftBukkit start
+ if (entityitem.getItemStack().getItem() == Items.GOLD_NUGGET && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPickupItemEvent(entitypiglin, entityitem, 0, false).isCancelled()) {
+ if (entityitem.getItemStack().a(Items.GOLD_NUGGET) && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPickupItemEvent(entitypiglin, entityitem, 0, false).isCancelled()) {
entitypiglin.receive(entityitem, entityitem.getItemStack().getCount());
itemstack = entityitem.getItemStack();
entityitem.die();
@@ -76,27 +80,25 @@
}
+ // CraftBukkit end
Item item = itemstack.getItem();
- if (a(item)) {
+ if (isLovedByPiglin(item, entitypiglin)) { // CraftBukkit - Changes to allow for custom payment in bartering
- if (a(itemstack)) {
+ if (isLovedByPiglin(itemstack, entitypiglin)) { // CraftBukkit - Changes to allow for custom payment in bartering
entitypiglin.getBehaviorController().removeMemory(MemoryModuleType.TIME_TRYING_TO_REACH_ADMIRE_ITEM);
c(entitypiglin, itemstack);
d((EntityLiving) entitypiglin);
} else if (c(item) && !u(entitypiglin)) {
} else if (c(itemstack) && !u(entitypiglin)) {
s(entitypiglin);
} else {
- boolean flag = entitypiglin.g(itemstack);
+ boolean flag = entitypiglin.g(itemstack, entityitem); // CraftBukkit
- boolean flag = entitypiglin.j(itemstack);
+ boolean flag = entitypiglin.j(itemstack, entityitem); // CraftBukkit
if (!flag) {
d(entitypiglin, itemstack);
@@ -246,9 +260,14 @@
@@ -278,9 +292,14 @@
boolean flag1;
if (entitypiglin.eM()) {
- flag1 = b(itemstack.getItem());
+ flag1 = isBarterItem(itemstack.getItem(), entitypiglin); // CraftBukkit - Changes to allow custom payment for bartering
if (entitypiglin.fv()) {
- flag1 = b(itemstack);
+ flag1 = isBarterItem(itemstack, entitypiglin); // CraftBukkit - Changes to allow custom payment for bartering
if (flag && flag1) {
- a(entitypiglin, i(entitypiglin));
+ // CraftBukkit start
@@ -106,60 +108,58 @@
+ }
+ // CraftBukkit end
} else if (!flag1) {
boolean flag2 = entitypiglin.g(itemstack);
boolean flag2 = entitypiglin.j(itemstack);
@@ -261,7 +280,7 @@
@@ -293,7 +312,7 @@
if (!flag1) {
ItemStack itemstack1 = entitypiglin.getItemInMainHand();
- if (a(itemstack1.getItem())) {
+ if (isLovedByPiglin(itemstack1.getItem(), entitypiglin)) { // CraftBukkit - Changes to allow for custom payment in bartering
- if (a(itemstack1)) {
+ if (isLovedByPiglin(itemstack1, entitypiglin)) { // CraftBukkit - Changes to allow for custom payment in bartering
d(entitypiglin, itemstack1);
} else {
a(entitypiglin, Collections.singletonList(itemstack1));
@@ -338,15 +357,21 @@
@@ -370,7 +389,7 @@
return false;
} else if (x(entitypiglin) && entitypiglin.getBehaviorController().hasMemory(MemoryModuleType.ATTACK_TARGET)) {
return false;
- } else if (b(item)) {
+ } else if (isBarterItem(item, entitypiglin)) { // CraftBukkit
- } else if (b(itemstack)) {
+ } else if (isBarterItem(itemstack, entitypiglin)) { // CraftBukkit
return z(entitypiglin);
} else {
boolean flag = entitypiglin.l(itemstack);
- return item == Items.GOLD_NUGGET ? flag : (c(item) ? !u(entitypiglin) && flag : (!a(item) ? entitypiglin.o(itemstack) : z(entitypiglin) && flag));
+ return item == Items.GOLD_NUGGET ? flag : (c(item) ? !u(entitypiglin) && flag : (!isLovedByPiglin(item, entitypiglin) ? entitypiglin.o(itemstack) : z(entitypiglin) && flag)); //CraftBukkit
boolean flag = entitypiglin.n(itemstack);
@@ -379,6 +398,12 @@
}
}
+ // CraftBukkit start - Added method to allow checking for custom payment items
+ protected static boolean isLovedByPiglin(Item item, EntityPiglin piglin) {
+ return a(item) || (piglin.interestItems.contains(item) || piglin.allowedBarterItems.contains(item));
+ protected static boolean isLovedByPiglin(ItemStack itemstack, EntityPiglin piglin) {
+ return a(itemstack) || (piglin.interestItems.contains(itemstack.getItem()) || piglin.allowedBarterItems.contains(itemstack.getItem()));
+ }
+ // CraftBukkit end
+
protected static boolean a(Item item) {
return item.a((Tag) TagsItem.PIGLIN_LOVED);
protected static boolean a(ItemStack itemstack) {
return itemstack.a((Tag) TagsItem.PIGLIN_LOVED);
}
@@ -412,7 +437,7 @@
@@ -444,7 +469,7 @@
}
public static void a(EntityHuman entityhuman, boolean flag) {
- List<EntityPiglin> list = entityhuman.world.a(EntityPiglin.class, entityhuman.getBoundingBox().g(16.0D));
+ List<EntityPiglinAbstract> list = entityhuman.world.a(EntityPiglin.class, entityhuman.getBoundingBox().g(16.0D)); // CraftBukkit - decompile error
- List<EntityPiglin> list = entityhuman.level.a(EntityPiglin.class, entityhuman.getBoundingBox().g(16.0D));
+ List<EntityPiglinAbstract> list = (List) entityhuman.level.a(EntityPiglin.class, entityhuman.getBoundingBox().g(16.0D)); // CraftBukkit - decompile error
list.stream().filter(PiglinAI::d).filter((entitypiglin) -> {
return !flag || BehaviorUtil.c(entitypiglin, entityhuman);
@@ -442,7 +467,7 @@
return !flag || BehaviorUtil.b((EntityLiving) entitypiglin, entityhuman);
@@ -474,7 +499,7 @@
}
protected static boolean b(EntityPiglin entitypiglin, ItemStack itemstack) {
- return !x(entitypiglin) && !v(entitypiglin) && entitypiglin.eM() && b(itemstack.getItem());
+ return !x(entitypiglin) && !v(entitypiglin) && entitypiglin.eM() && isBarterItem(itemstack.getItem(), entitypiglin); // CraftBukkit
- return !x(entitypiglin) && !v(entitypiglin) && entitypiglin.fv() && b(itemstack);
+ return !x(entitypiglin) && !v(entitypiglin) && entitypiglin.fv() && isBarterItem(itemstack, entitypiglin); // CraftBukkit
}
protected static void a(EntityPiglin entitypiglin, EntityLiving entityliving) {
@@ -648,7 +673,7 @@
@@ -680,7 +705,7 @@
EntityLiving entityliving = (EntityLiving) behaviorcontroller.getMemory(MemoryModuleType.AVOID_TARGET).get();
EntityTypes<?> entitytypes = entityliving.getEntityType();
@@ -168,34 +168,25 @@
}
}
@@ -705,6 +730,12 @@
@@ -741,6 +766,12 @@
return entitypiglin.getBehaviorController().hasMemory(MemoryModuleType.ADMIRING_ITEM);
}
+ // CraftBukkit start - Changes to allow custom payment for bartering
+ private static boolean isBarterItem(Item item, EntityPiglin piglin) {
+ return b(item) || piglin.allowedBarterItems.contains(item);
+ private static boolean isBarterItem(ItemStack itemstack, EntityPiglin piglin) {
+ return b(itemstack) || piglin.allowedBarterItems.contains(itemstack.getItem());
+ }
+ // CraftBukkit end
+
private static boolean b(Item item) {
return item == PiglinAI.a;
private static boolean b(ItemStack itemstack) {
return itemstack.a(PiglinAI.BARTERING_ITEM);
}
@@ -730,7 +761,7 @@
}
public static boolean b(EntityLiving entityliving) {
- return entityliving.getEntityType() == EntityTypes.PLAYER && entityliving.a(PiglinAI::a);
+ return entityliving.getEntityType() == EntityTypes.PLAYER && entityliving.a((java.util.function.Predicate<Item>) PiglinAI::a); // CraftBukkit - decompile error
}
private static boolean x(EntityPiglin entitypiglin) {
@@ -746,7 +777,7 @@
@@ -778,7 +809,7 @@
}
private static boolean z(EntityPiglin entitypiglin) {
- return entitypiglin.getItemInOffHand().isEmpty() || !a(entitypiglin.getItemInOffHand().getItem());
+ return entitypiglin.getItemInOffHand().isEmpty() || !isLovedByPiglin(entitypiglin.getItemInOffHand().getItem(), entitypiglin); // CraftBukkit - Changes to allow custom payment for bartering
- return entitypiglin.getItemInOffHand().isEmpty() || !a(entitypiglin.getItemInOffHand());
+ return entitypiglin.getItemInOffHand().isEmpty() || !isLovedByPiglin(entitypiglin.getItemInOffHand(), entitypiglin); // CraftBukkit - Changes to allow custom payment for bartering
}
public static boolean a(EntityTypes entitytypes) {
public static boolean a(EntityTypes<?> entitytypes) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/net/minecraft/world/entity/npc/EntityVillager.java
@@ -89,6 +89,14 @@
@@ -93,6 +93,14 @@
import net.minecraft.world.phys.AxisAlignedBB;
import org.apache.logging.log4j.Logger;
@@ -14,8 +14,8 @@
+
public class EntityVillager extends EntityVillagerAbstract implements ReputationHandler, VillagerDataHolder {
private static final DataWatcherObject<VillagerData> br = DataWatcher.a(EntityVillager.class, DataWatcherRegistry.q);
@@ -134,7 +142,7 @@
private static final DataWatcherObject<VillagerData> DATA_VILLAGER_DATA = DataWatcher.a(EntityVillager.class, DataWatcherRegistry.VILLAGER_DATA);
@@ -150,7 +158,7 @@
@Override
public BehaviorController<EntityVillager> getBehaviorController() {
@@ -24,26 +24,26 @@
}
@Override
@@ -153,7 +161,7 @@
@@ -169,7 +177,7 @@
public void c(WorldServer worldserver) {
BehaviorController<EntityVillager> behaviorcontroller = this.getBehaviorController();
- behaviorcontroller.b(worldserver, (EntityLiving) this);
+ behaviorcontroller.b(worldserver, this); // CraftBukkit - decompile error
this.bg = behaviorcontroller.h();
this.brain = behaviorcontroller.h();
this.a(this.getBehaviorController());
}
@@ -203,7 +211,7 @@
@@ -219,7 +227,7 @@
@Override
protected void mobTick() {
this.world.getMethodProfiler().enter("villagerBrain");
- this.getBehaviorController().a((WorldServer) this.world, (EntityLiving) this);
+ this.getBehaviorController().a((WorldServer) this.world, this); // CraftBukkit - decompile error
this.world.getMethodProfiler().exit();
if (this.bF) {
this.bF = false;
@@ -217,7 +225,7 @@
this.bu = false;
this.level.getMethodProfiler().enter("villagerBrain");
- this.getBehaviorController().a((WorldServer) this.level, (EntityLiving) this);
+ this.getBehaviorController().a((WorldServer) this.level, this); // CraftBukkit - decompile error
this.level.getMethodProfiler().exit();
if (this.assignProfessionWhenSpawned) {
this.assignProfessionWhenSpawned = false;
@@ -233,7 +241,7 @@
this.increaseProfessionLevelOnUpdate = false;
}
- this.addEffect(new MobEffect(MobEffects.REGENERATION, 200, 0));
@@ -51,7 +51,7 @@
}
}
@@ -428,7 +436,14 @@
@@ -444,7 +452,14 @@
while (iterator.hasNext()) {
MerchantRecipe merchantrecipe = (MerchantRecipe) iterator.next();
@@ -67,16 +67,16 @@
}
}
@@ -457,7 +472,7 @@
@@ -473,7 +488,7 @@
@Override
public void saveData(NBTTagCompound nbttagcompound) {
super.saveData(nbttagcompound);
- DataResult dataresult = VillagerData.a.encodeStart(DynamicOpsNBT.a, this.getVillagerData());
+ DataResult<NBTBase> dataresult = VillagerData.a.encodeStart(DynamicOpsNBT.a, this.getVillagerData()); // CraftBukkit - decompile error
- DataResult dataresult = VillagerData.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.getVillagerData());
+ DataResult<NBTBase> dataresult = VillagerData.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.getVillagerData()); // CraftBukkit - decompile error
Logger logger = EntityVillager.LOGGER;
logger.getClass();
@@ -770,7 +785,12 @@
Objects.requireNonNull(logger);
@@ -813,7 +828,12 @@
}
entitywitch.setPersistent();
@@ -87,10 +87,10 @@
+ }
+ worldserver.addAllEntities(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING);
+ // CraftBukkit end
this.fq();
this.fZ();
this.die();
} else {
@@ -791,6 +811,13 @@
@@ -834,6 +854,13 @@
return;
}
@@ -104,7 +104,7 @@
this.a(entityitem);
this.receive(entityitem, itemstack.getCount());
ItemStack itemstack1 = inventorysubcontainer.a(itemstack);
@@ -903,7 +930,7 @@
@@ -946,7 +973,7 @@
if (entityirongolem != null) {
if (entityirongolem.a((GeneratorAccess) worldserver, EnumMobSpawn.MOB_SUMMONED) && entityirongolem.a((IWorldReader) worldserver)) {
@@ -113,21 +113,21 @@
return entityirongolem;
}
@@ -981,7 +1008,7 @@
@@ -1024,7 +1051,7 @@
@Override
public void entitySleep(BlockPosition blockposition) {
super.entitySleep(blockposition);
- this.bg.setMemory(MemoryModuleType.LAST_SLEPT, (Object) this.world.getTime());
+ this.bg.setMemory(MemoryModuleType.LAST_SLEPT, this.world.getTime()); // CraftBukkit - decompile error
this.bg.removeMemory(MemoryModuleType.WALK_TARGET);
this.bg.removeMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE);
- this.brain.setMemory(MemoryModuleType.LAST_SLEPT, (Object) this.level.getTime());
+ this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level.getTime()); // CraftBukkit - decompile error
this.brain.removeMemory(MemoryModuleType.WALK_TARGET);
this.brain.removeMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE);
}
@@ -989,7 +1016,7 @@
@@ -1032,7 +1059,7 @@
@Override
public void entityWakeup() {
super.entityWakeup();
- this.bg.setMemory(MemoryModuleType.LAST_WOKEN, (Object) this.world.getTime());
+ this.bg.setMemory(MemoryModuleType.LAST_WOKEN, this.world.getTime()); // CraftBukkit - decompile error
- this.brain.setMemory(MemoryModuleType.LAST_WOKEN, (Object) this.level.getTime());
+ this.brain.setMemory(MemoryModuleType.LAST_WOKEN, this.level.getTime()); // CraftBukkit - decompile error
}
private boolean b(long i) {

Some files were not shown because too many files have changed in this diff Show More