Update maxhealth for entities that have variable max health. Fixes BUKKIT-3308

Slimes and wolves have health that can change based on certain
conditions. So we check if their max health should be updated, and if
it has been customized in any way.

We also scale the wolf's health for their tail
Dieser Commit ist enthalten in:
feildmaster 2012-12-26 19:07:47 -06:00
Ursprung b908c192bf
Commit 509e3d2a32
3 geänderte Dateien mit 27 neuen und 4 gelöschten Zeilen

Datei anzeigen

@ -1155,6 +1155,16 @@ public abstract class Entity {
this.b(this.yaw, this.pitch); this.b(this.yaw, this.pitch);
this.a(nbttagcompound); 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 // CraftBukkit start - exempt Vehicles from notch's sanity check
if (!(this.getBukkitEntity() instanceof Vehicle)) { if (!(this.getBukkitEntity() instanceof Vehicle)) {
if (Math.abs(this.motX) > 10.0D) { if (Math.abs(this.motX) > 10.0D) {

Datei anzeigen

@ -26,10 +26,16 @@ public class EntitySlime extends EntityLiving implements IMonster {
// CraftBukkit - protected -> public // CraftBukkit - protected -> public
public void setSize(int i) { public void setSize(int i) {
boolean updateMaxHealth = this.getMaxHealth() == this.maxHealth; // CraftBukkit
this.datawatcher.watch(16, new Byte((byte) i)); this.datawatcher.watch(16, new Byte((byte) i));
this.a(0.6F * (float) i, 0.6F * (float) i); this.a(0.6F * (float) i, 0.6F * (float) i);
this.setPosition(this.locX, this.locY, this.locZ); 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; this.bd = i;
} }

Datei anzeigen

@ -43,7 +43,7 @@ public class EntityWolf extends EntityTameableAnimal {
} }
protected void bm() { 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() { public int getMaxHealth() {
@ -80,7 +80,8 @@ public class EntityWolf extends EntityTameableAnimal {
} }
protected String aY() { 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() { protected String aZ() {
@ -235,11 +236,17 @@ public class EntityWolf extends EntityTameableAnimal {
if (!this.world.isStatic) { if (!this.world.isStatic) {
// CraftBukkit - added event call and isCancelled check. // CraftBukkit - added event call and isCancelled check.
if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { 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.setTamed(true);
this.setPathEntity((PathEntity) null); this.setPathEntity((PathEntity) null);
this.b((EntityLiving) null); this.b((EntityLiving) null);
this.d.a(true); 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.setOwnerName(entityhuman.name);
this.f(true); this.f(true);
this.world.broadcastEntityEffect(this, (byte) 7); this.world.broadcastEntityEffect(this, (byte) 7);