From 769a0228d72e5f65cdca22bc8b1eb8290804d9a8 Mon Sep 17 00:00:00 2001 From: Aikar Date: Sun, 27 Sep 2015 01:18:02 -0400 Subject: [PATCH] handle NaN health/absorb values and repair bad data diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index 1eca778d31..08d0728e16 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -496,7 +496,13 @@ public abstract class EntityLiving extends Entity { @Override public void a(NBTTagCompound nbttagcompound) { - this.setAbsorptionHearts(nbttagcompound.getFloat("AbsorptionAmount")); + // Paper start - jvm keeps optimizing the setter + float absorptionAmount = nbttagcompound.getFloat("AbsorptionAmount"); + if (Float.isNaN(absorptionAmount)) { + absorptionAmount = 0; + } + this.setAbsorptionHearts(absorptionAmount); + // Paper end if (nbttagcompound.hasKeyOfType("Attributes", 9) && this.world != null && !this.world.isClientSide) { GenericAttributes.a(this.getAttributeMap(), nbttagcompound.getList("Attributes", 10)); } @@ -945,6 +951,10 @@ public abstract class EntityLiving extends Entity { } public void setHealth(float f) { + // Paper start + if (Float.isNaN(f)) { f = getMaxHealth(); if (this.valid) { + System.err.println("[NAN-HEALTH] " + getName() + " had NaN health set"); + } } // Paper end // CraftBukkit start - Handle scaled health if (this instanceof EntityPlayer) { org.bukkit.craftbukkit.entity.CraftPlayer player = ((EntityPlayer) this).getBukkitEntity(); @@ -2739,7 +2749,7 @@ public abstract class EntityLiving extends Entity { } public void setAbsorptionHearts(float f) { - if (f < 0.0F) { + if (f < 0.0F || Float.isNaN(f)) { // Paper f = 0.0F; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 2cdea9f5d0..8688b727a3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1584,6 +1584,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void setRealHealth(double health) { + if (Double.isNaN(health)) {return;} // Paper this.health = health; } -- 2.25.1