summaryrefslogtreecommitdiffstats
path: root/nms-patches/Entity.patch
diff options
context:
space:
mode:
Diffstat (limited to 'nms-patches/Entity.patch')
-rw-r--r--nms-patches/Entity.patch305
1 files changed, 156 insertions, 149 deletions
diff --git a/nms-patches/Entity.patch b/nms-patches/Entity.patch
index 6e7195e1..d33d1882 100644
--- a/nms-patches/Entity.patch
+++ b/nms-patches/Entity.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/Entity.java
+++ b/net/minecraft/server/Entity.java
-@@ -6,8 +6,40 @@
- import java.util.UUID;
- import java.util.concurrent.Callable;
+@@ -15,8 +15,47 @@
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+// CraftBukkit start
+import org.bukkit.Bukkit;
@@ -12,11 +12,9 @@
+import org.bukkit.block.BlockFace;
+import org.bukkit.entity.Hanging;
+import org.bukkit.entity.LivingEntity;
-+import org.bukkit.entity.Painting;
+import org.bukkit.entity.Vehicle;
+import org.bukkit.event.entity.EntityCombustByEntityEvent;
+import org.bukkit.event.hanging.HangingBreakByEntityEvent;
-+import org.bukkit.event.painting.PaintingBreakByEntityEvent;
+import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
+import org.bukkit.event.vehicle.VehicleEnterEvent;
+import org.bukkit.event.vehicle.VehicleExitEvent;
@@ -36,22 +34,31 @@
+ static boolean isLevelAtLeast(NBTTagCompound tag, int level) {
+ return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level;
+ }
++
++ protected CraftEntity bukkitEntity;
++
++ public CraftEntity getBukkitEntity() {
++ if (bukkitEntity == null) {
++ bukkitEntity = CraftEntity.getEntity(world.getServer(), this);
++ }
++ return bukkitEntity;
++ }
+ // CraftBukikt end
+
- private static final AxisAlignedBB a = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
- private static int entityCount;
- private int id;
-@@ -79,6 +111,9 @@
- private boolean invulnerable;
- protected UUID uniqueID;
- private final CommandObjectiveExecutor au;
+ private static final Logger a = LogManager.getLogger();
+ private static final AxisAlignedBB b = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
+ private static double c = 1.0D;
+@@ -97,6 +136,9 @@
+ public boolean glowing;
+ private final Set<String> aF;
+ private boolean aG;
+ public boolean valid; // CraftBukkit
+ public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only
+ public boolean forceExplosionKnockback; // CraftBukkit - SPIGOT-949
- public int getId() {
- return this.id;
-@@ -152,6 +187,33 @@
+ public Entity(World world) {
+ this.id = Entity.entityCount++;
+@@ -193,6 +235,33 @@
}
protected void setYawPitch(float f, float f1) {
@@ -85,16 +92,16 @@
this.yaw = f % 360.0F;
this.pitch = f1 % 360.0F;
}
-@@ -188,7 +250,7 @@
- int i = this.L();
-
+@@ -236,7 +305,7 @@
if (this.ak) {
+ MinecraftServer minecraftserver = this.world.getMinecraftServer();
+
- if (minecraftserver.getAllowNether()) {
+ if (true || minecraftserver.getAllowNether()) { // CraftBukkit
- if (this.vehicle == null && this.al++ >= i) {
- this.al = i;
- this.portalCooldown = this.aq();
-@@ -265,6 +327,27 @@
+ if (!this.isPassenger()) {
+ int i = this.V();
+
+@@ -321,6 +390,27 @@
protected void burnFromLava() {
if (!this.fireProof) {
this.damageEntity(DamageSource.LAVA, 4.0F);
@@ -122,7 +129,7 @@
this.setOnFire(15);
}
}
-@@ -302,6 +385,22 @@
+@@ -361,6 +451,22 @@
this.a(this.getBoundingBox().c(d0, d1, d2));
this.recalcPosition();
} else {
@@ -138,15 +145,15 @@
+ throw new ReportedException(crashreport);
+ }
+ // Check if we're moving
-+ if (d0 == 0 && d1 == 0 && d2 == 0 && this.vehicle == null && this.passenger == null) {
++ if (d0 == 0 && d1 == 0 && d2 == 0 && this.isVehicle() && this.isPassenger()) {
+ return;
+ }
+ // CraftBukkit end
this.world.methodProfiler.a("move");
double d3 = this.locX;
double d4 = this.locY;
-@@ -522,6 +621,26 @@
- block.a(this.world, this);
+@@ -585,6 +691,26 @@
+ block1.a(this.world, this);
}
+ // CraftBukkit start
@@ -169,23 +176,23 @@
+ }
+ // CraftBukkit end
+
- if (this.s_() && !flag && this.vehicle == null) {
+ if (this.playStepSound() && !flag && !this.isPassenger()) {
double d21 = this.locX - d3;
double d22 = this.locY - d4;
-@@ -532,7 +651,7 @@
+@@ -595,7 +721,7 @@
}
- if (block != null && this.onGround) {
-- block.a(this.world, blockposition, this);
-+ // block.a(this.world, blockposition, this); // CraftBukkit moved down
+ if (block1 != null && this.onGround) {
+- block1.stepOn(this.world, blockposition, this);
++ // block1.stepOn(this.world, blockposition, this); // CraftBukkit moved down
}
- this.M = (float) ((double) this.M + (double) MathHelper.sqrt(d21 * d21 + d23 * d23) * 0.6D);
-@@ -550,9 +669,12 @@
+ this.J = (float) ((double) this.J + (double) MathHelper.sqrt(d21 * d21 + d10 * d10) * 0.6D);
+@@ -613,9 +739,12 @@
}
- this.a(blockposition, block);
-+ block.a(this.world, blockposition, this); // CraftBukkit moved from above
+ this.a(blockposition, block1);
++ block1.stepOn(this.world, blockposition, this); // CraftBukkit moved from above
}
}
@@ -194,16 +201,16 @@
try {
this.checkBlockCollisions();
} catch (Throwable throwable) {
-@@ -562,6 +684,8 @@
+@@ -625,6 +754,8 @@
this.appendEntityCrashDetails(crashreportsystemdetails);
throw new ReportedException(crashreport);
}
+ */
+ // CraftBukkit end
- boolean flag2 = this.U();
+ boolean flag2 = this.ah();
-@@ -569,7 +693,16 @@
+@@ -632,7 +763,16 @@
this.burn(1);
if (!flag2) {
++this.fireTicks;
@@ -221,7 +228,7 @@
this.setOnFire(8);
}
}
-@@ -675,7 +808,7 @@
+@@ -745,7 +885,7 @@
return null;
}
@@ -230,7 +237,7 @@
if (!this.fireProof) {
this.damageEntity(DamageSource.FIRE, (float) i);
}
-@@ -818,6 +951,13 @@
+@@ -911,6 +1051,13 @@
}
public void spawnIn(World world) {
@@ -244,7 +251,7 @@
this.world = world;
}
-@@ -1010,6 +1150,18 @@
+@@ -1104,6 +1251,18 @@
try {
nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY, this.locZ}));
nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ}));
@@ -263,36 +270,37 @@
nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch}));
nbttagcompound.setFloat("FallDistance", this.fallDistance);
nbttagcompound.setShort("Fire", (short) this.fireTicks);
-@@ -1020,6 +1172,11 @@
+@@ -1113,6 +1272,12 @@
+ nbttagcompound.setBoolean("Invulnerable", this.invulnerable);
nbttagcompound.setInt("PortalCooldown", this.portalCooldown);
- nbttagcompound.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits());
- nbttagcompound.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits());
+ nbttagcompound.a("UUID", this.getUniqueID());
+ // CraftBukkit start
++ // PAIL: Check above UUID reads 1.8 properly, ie: UUIDMost / UUIDLeast
+ nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits());
+ nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits());
+ nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL);
+ // CraftBukkit end
- if (this.getCustomName() != null && this.getCustomName().length() > 0) {
+ if (this.getCustomName() != null && !this.getCustomName().isEmpty()) {
nbttagcompound.setString("CustomName", this.getCustomName());
- nbttagcompound.setBoolean("CustomNameVisible", this.getCustomNameVisible());
-@@ -1057,6 +1214,8 @@
- this.motX = nbttaglist1.d(0);
- this.motY = nbttaglist1.d(1);
- this.motZ = nbttaglist1.d(2);
+ }
+@@ -1183,6 +1348,8 @@
+ this.motX = nbttaglist1.e(0);
+ this.motY = nbttaglist1.e(1);
+ this.motZ = nbttaglist1.e(2);
+
+ /* CraftBukkit start - Moved section down
if (Math.abs(this.motX) > 10.0D) {
this.motX = 0.0D;
}
-@@ -1068,6 +1227,7 @@
+@@ -1194,6 +1361,7 @@
if (Math.abs(this.motZ) > 10.0D) {
this.motZ = 0.0D;
}
+ // CraftBukkit end */
- this.lastX = this.P = this.locX = nbttaglist.d(0);
- this.lastY = this.Q = this.locY = nbttaglist.d(1);
-@@ -1103,6 +1263,58 @@
+ this.lastX = this.M = this.locX = nbttaglist.e(0);
+ this.lastY = this.N = this.locY = nbttaglist.e(1);
+@@ -1241,6 +1409,58 @@
this.setPosition(this.locX, this.locY, this.locZ);
}
@@ -351,7 +359,7 @@
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded");
-@@ -1164,6 +1376,12 @@
+@@ -1302,6 +1522,12 @@
public EntityItem a(ItemStack itemstack, float f) {
if (itemstack.count != 0 && itemstack.getItem() != null) {
@@ -363,79 +371,54 @@
+ // CraftBukkit end
EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack);
- entityitem.p();
-@@ -1277,17 +1495,70 @@
- return (double) this.length * 0.75D;
- }
-
-+ // CraftBukkit start
-+ protected CraftEntity bukkitEntity;
-+
-+ public CraftEntity getBukkitEntity() {
-+ if (bukkitEntity == null) {
-+ bukkitEntity = CraftEntity.getEntity(world.getServer(), this);
-+ }
-+ return bukkitEntity;
-+ }
-+
- public void mount(Entity entity) {
-+ Entity originalVehicle = this.vehicle;
-+ Entity originalPassenger = this.vehicle == null ? null : this.vehicle.passenger;
-+ PluginManager pluginManager = Bukkit.getPluginManager();
-+ getBukkitEntity(); // make sure bukkitEntity is initialised
-+ // CraftBukkit end
- this.ar = 0.0D;
- this.as = 0.0D;
- if (entity == null) {
- if (this.vehicle != null) {
-+ // CraftBukkit start
-+ if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) {
-+ VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
-+ pluginManager.callEvent(event);
-+
-+ if (event.isCancelled() || vehicle != originalVehicle) {
-+ return;
-+ }
-+ }
-+ // CraftBukkit end
- this.setPositionRotation(this.vehicle.locX, this.vehicle.getBoundingBox().b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch);
- this.vehicle.passenger = null;
- }
-
- this.vehicle = null;
+ entityitem.q();
+@@ -1422,6 +1648,22 @@
+ if (entity.by() != this) {
+ throw new IllegalStateException("Use x.startRiding(y), not y.addPassenger(x)");
} else {
+ // CraftBukkit start
-+ if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4, true)) {
-+ // It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are.
-+ VehicleExitEvent exitEvent = null;
-+ if (this.vehicle != null && this.vehicle.getBukkitEntity() instanceof Vehicle) {
-+ exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity);
-+ pluginManager.callEvent(exitEvent);
-+
-+ if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) {
-+ return;
-+ }
++ CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle();
++ Entity orig = craft == null ? null : craft.getHandle();
++ if (getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) {
++ VehicleEnterEvent event = new VehicleEnterEvent(
++ (Vehicle) getBukkitEntity(),
++ entity.getBukkitEntity()
++ );
++ Bukkit.getPluginManager().callEvent(event);
++ CraftEntity craftn = (CraftEntity) entity.getBukkitEntity().getVehicle();
++ Entity n = craftn == null ? null : craftn.getHandle();
++ if (event.isCancelled() || n != orig) {
++ return;
+ }
-+
-+ VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity);
-+ pluginManager.callEvent(event);
-+
-+ // If a plugin messes with the vehicle or the vehicle's passenger
-+ if (event.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) {
-+ // If we only cancelled the enterevent then we need to put the player in a decent position.
-+ if (exitEvent != null && this.vehicle == originalVehicle && this.vehicle != null && this.vehicle.passenger == originalPassenger) {
-+ this.setPositionRotation(this.vehicle.locX, this.vehicle.getBoundingBox().b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch);
-+ this.vehicle.passenger = null;
-+ this.vehicle = null;
-+ }
++ }
++ // CraftBukkit end
+ if (!this.world.isClientSide && entity instanceof EntityHuman && !(this.bt() instanceof EntityHuman)) {
+ this.passengers.add(0, entity);
+ } else {
+@@ -1435,6 +1677,22 @@
+ if (entity.by() == this) {
+ throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)");
+ } else {
++ // CraftBukkit start
++ CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle();
++ Entity orig = craft == null ? null : craft.getHandle();
++ if (getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) {
++ VehicleExitEvent event = new VehicleExitEvent(
++ (Vehicle) getBukkitEntity(),
++ (LivingEntity) entity.getBukkitEntity()
++ );
++ Bukkit.getPluginManager().callEvent(event);
++ CraftEntity craftn = (CraftEntity) entity.getBukkitEntity().getVehicle();
++ Entity n = craftn == null ? null : craftn.getHandle();
++ if (event.isCancelled() || n != orig) {
+ return;
+ }
+ }
+ // CraftBukkit end
- if (this.vehicle != null) {
- this.vehicle.passenger = null;
- }
-@@ -1406,10 +1677,49 @@
+ this.passengers.remove(entity);
+ entity.j = 60;
+ }
+@@ -1577,10 +1835,38 @@
}
public void onLightningStrike(EntityLightning entitylightning) {
@@ -447,20 +430,9 @@
+
+ if (thisBukkitEntity instanceof Hanging) {
+ HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity);
-+ PaintingBreakByEntityEvent paintingEvent = null;
-+
-+ if (thisBukkitEntity instanceof Painting) {
-+ paintingEvent = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity);
-+ }
-+
+ pluginManager.callEvent(hangingEvent);
+
-+ if (paintingEvent != null) {
-+ paintingEvent.setCancelled(hangingEvent.isCancelled());
-+ pluginManager.callEvent(paintingEvent);
-+ }
-+
-+ if (hangingEvent.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) {
++ if (hangingEvent.isCancelled()) {
+ return;
+ }
+ }
@@ -487,14 +459,14 @@
}
}
-@@ -1550,32 +1860,83 @@
+@@ -1715,19 +2001,67 @@
if (!this.world.isClientSide && !this.dead) {
this.world.methodProfiler.a("changeDimension");
- MinecraftServer minecraftserver = MinecraftServer.getServer();
+ MinecraftServer minecraftserver = this.h();
- int j = this.dimension;
- WorldServer worldserver = minecraftserver.getWorldServer(j);
- WorldServer worldserver1 = minecraftserver.getWorldServer(i);
-+ // CraftBukkit start - Move logic into new function "teleportToLocation"
++ // CraftBukkit start - Move logic into new function "teleportTo(Location,boolean)"
+ // int j = this.dimension;
+ // WorldServer worldserver = minecraftserver.getWorldServer(j);
+ // WorldServer worldserver1 = minecraftserver.getWorldServer(i);
@@ -508,8 +480,19 @@
+ }
+ }
+
++ BlockPosition blockposition = null; // PAIL: CHECK
+ Location enter = this.getBukkitEntity().getLocation();
-+ Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null;
++ Location exit;
++ if (exitWorld != null) {
++ if (blockposition != null) {
++ exit = new Location(exitWorld.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ());
++ } else {
++ exit = minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i));
++ }
++ }
++ else {
++ exit = null;
++ }
+ boolean useTravelAgent = exitWorld != null && !(this.dimension == 1 && exitWorld.dimension == 1); // don't use agent for custom worlds or return from THE_END
+
+ TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins
@@ -517,14 +500,15 @@
+ event.useTravelAgent(useTravelAgent);
+ event.getEntity().getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) {
-+ return;
++ return null;
+ }
+ exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo();
-+ this.teleportTo(exit, true);
++ return this.teleportTo(exit, true);
+ }
++ return null;
+ }
+
-+ public void teleportTo(Location exit, boolean portal) {
++ public Entity teleportTo(Location exit, boolean portal) {
+ if (true) {
+ WorldServer worldserver = ((CraftWorld) getBukkitEntity().getLocation().getWorld()).getHandle();
+ WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle();
@@ -542,28 +526,42 @@
this.world.kill(this);
this.dead = false;
this.world.methodProfiler.a("reposition");
-- minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1);
++ /* CraftBukkit start - Handled in calculateTarget
+ BlockPosition blockposition;
+
+ if (i == 1) {
+@@ -1756,12 +2090,18 @@
+ blockposition = new BlockPosition(this);
+ }
+
+- worldserver.entityJoinedWorld(this, false);
++ // CraftBukkit end */
+ // CraftBukkit start - Ensure chunks are loaded in case TravelAgent is not used which would initially cause chunks to load during find/create
+ // minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1);
-+ boolean before = worldserver1.chunkProviderServer.forceChunkLoad;
-+ worldserver1.chunkProviderServer.forceChunkLoad = true;
+ worldserver1.getMinecraftServer().getPlayerList().repositionEntity(this, exit, portal);
-+ worldserver1.chunkProviderServer.forceChunkLoad = before;
++ // worldserver.entityJoinedWorld(this, false); // Handled in repositionEntity
+ // CraftBukkit end
this.world.methodProfiler.c("reloading");
Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1);
if (entity != null) {
- entity.n(this);
+ entity.a(this);
+ /* CraftBukkit start - We need to do this...
if (j == 1 && i == 1) {
- BlockPosition blockposition = this.world.r(worldserver1.getSpawn());
+ BlockPosition blockposition1 = worldserver1.q(worldserver1.getSpawn());
+@@ -1769,6 +2109,7 @@
+ } else {
entity.setPositionRotation(blockposition, entity.yaw, entity.pitch);
}
+ // CraftBukkit end */
+ boolean flag = entity.attachedToPlayer;
+
+@@ -1776,6 +2117,14 @@
worldserver1.addEntity(entity);
+ entity.attachedToPlayer = flag;
+ worldserver1.entityJoinedWorld(entity, false);
+ // CraftBukkit start - Forward the CraftEntity to the new entity
+ this.getBukkitEntity().setHandle(entity);
+ entity.bukkitEntity = this.getBukkitEntity();
@@ -575,7 +573,7 @@
}
this.dead = true;
-@@ -1670,6 +2031,11 @@
+@@ -1881,6 +2230,11 @@
}
public void setCustomName(String s) {
@@ -584,10 +582,10 @@
+ s = s.substring(0, 256);
+ }
+ // CraftBukkit end
- this.datawatcher.watch(2, s);
+ this.datawatcher.set(Entity.az, s);
}
-@@ -1721,7 +2087,26 @@
+@@ -1938,7 +2292,26 @@
}
public void a(AxisAlignedBB axisalignedbb) {
@@ -615,3 +613,12 @@
}
public float getHeadHeight() {
+@@ -2110,7 +2483,7 @@
+ for (Iterator iterator = this.bu().iterator(); iterator.hasNext(); entity.a(oclass, set)) {
+ entity = (Entity) iterator.next();
+ if (oclass.isAssignableFrom(entity.getClass())) {
+- set.add(entity);
++ set.add((T) entity); // CraftBukkit - decompile error
+ }
+ }
+