diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 1b1cd91254..328041438d 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -1155,6 +1155,16 @@ public abstract class Entity { this.b(this.yaw, this.pitch); this.a(nbttagcompound); + // CraftBukkit start + if (this instanceof EntityLiving) { + EntityLiving entity = (EntityLiving) this; + // If the entity does not have a max health set yet, update it (it may have changed after loading the entity) + if (!nbttagcompound.hasKey("Bukkit.MaxHealth")) { + entity.maxHealth = entity.getMaxHealth(); + } + } + // CraftBukkit end + // CraftBukkit start - exempt Vehicles from notch's sanity check if (!(this.getBukkitEntity() instanceof Vehicle)) { if (Math.abs(this.motX) > 10.0D) { diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java index 54e50d13bd..8be7249847 100644 --- a/src/main/java/net/minecraft/server/EntitySlime.java +++ b/src/main/java/net/minecraft/server/EntitySlime.java @@ -26,10 +26,16 @@ public class EntitySlime extends EntityLiving implements IMonster { // CraftBukkit - protected -> public public void setSize(int i) { + boolean updateMaxHealth = this.getMaxHealth() == this.maxHealth; // CraftBukkit this.datawatcher.watch(16, new Byte((byte) i)); this.a(0.6F * (float) i, 0.6F * (float) i); this.setPosition(this.locX, this.locY, this.locZ); - this.setHealth(this.getMaxHealth()); + // CraftBukkit start + if (updateMaxHealth) { + this.maxHealth = this.getMaxHealth(); + } + this.setHealth(this.maxHealth); + // CraftBukkit end this.bd = i; } diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java index cd71c1dcc4..19de09e230 100644 --- a/src/main/java/net/minecraft/server/EntityWolf.java +++ b/src/main/java/net/minecraft/server/EntityWolf.java @@ -43,7 +43,7 @@ public class EntityWolf extends EntityTameableAnimal { } protected void bm() { - this.datawatcher.watch(18, Integer.valueOf(this.getHealth())); + this.datawatcher.watch(18, Integer.valueOf(this.getScaledHealth())); // CraftBukkit - this.getHealth() -> this.getScaledHealth() } public int getMaxHealth() { @@ -80,7 +80,8 @@ public class EntityWolf extends EntityTameableAnimal { } protected String aY() { - return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getInt(18) < 10 ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); + // CraftBukkit - getInt(18) < 10 -> < this.maxHealth / 2 + return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getInt(18) < this.maxHealth / 2 ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); } protected String aZ() { @@ -235,11 +236,17 @@ public class EntityWolf extends EntityTameableAnimal { if (!this.world.isStatic) { // CraftBukkit - added event call and isCancelled check. if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { + boolean updateMaxHealth = this.getMaxHealth() == this.maxHealth; // CraftBukkit this.setTamed(true); this.setPathEntity((PathEntity) null); this.b((EntityLiving) null); this.d.a(true); - this.setHealth(20); + // CraftBukkit start + if (updateMaxHealth) { + this.maxHealth = this.getMaxHealth(); + } + this.setHealth(this.maxHealth); + // CraftBukkit end this.setOwnerName(entityhuman.name); this.f(true); this.world.broadcastEntityEffect(this, (byte) 7);