Paper/src/main/java/net/minecraft/server/EntityWolf.java

340 Zeilen
11 KiB
Java

2012-03-10 03:52:32 +01:00
package net.minecraft.server;
public class EntityWolf extends EntityTameableAnimal {
2012-07-29 09:33:13 +02:00
private float e;
private float f;
private boolean g;
2012-03-10 03:52:32 +01:00
private boolean h;
2012-07-29 09:33:13 +02:00
private float i;
2012-03-10 03:52:32 +01:00
private float j;
public EntityWolf(World world) {
super(world);
this.texture = "/mob/wolf.png";
2012-07-29 09:33:13 +02:00
this.a(0.6F, 0.8F);
2013-03-13 23:33:27 +01:00
this.bI = 0.3F;
2012-07-29 09:33:13 +02:00
this.getNavigation().a(true);
2012-03-10 03:52:32 +01:00
this.goalSelector.a(1, new PathfinderGoalFloat(this));
2012-07-29 09:33:13 +02:00
this.goalSelector.a(2, this.d);
2012-03-10 03:52:32 +01:00
this.goalSelector.a(3, new PathfinderGoalLeapAtTarget(this, 0.4F));
2013-03-13 23:33:27 +01:00
this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, this.bI, true));
this.goalSelector.a(5, new PathfinderGoalFollowOwner(this, this.bI, 10.0F, 2.0F));
this.goalSelector.a(6, new PathfinderGoalBreed(this, this.bI));
this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, this.bI));
2012-03-10 03:52:32 +01:00
this.goalSelector.a(8, new PathfinderGoalBeg(this, 8.0F));
this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F));
this.goalSelector.a(9, new PathfinderGoalRandomLookaround(this));
this.targetSelector.a(1, new PathfinderGoalOwnerHurtByTarget(this));
this.targetSelector.a(2, new PathfinderGoalOwnerHurtTarget(this));
this.targetSelector.a(3, new PathfinderGoalHurtByTarget(this, true));
this.targetSelector.a(4, new PathfinderGoalRandomTargetNonTamed(this, EntitySheep.class, 16.0F, 200, false));
}
2013-03-13 23:33:27 +01:00
public boolean bh() {
2012-03-10 03:52:32 +01:00
return true;
}
2013-01-17 10:28:44 +01:00
public void setGoalTarget(EntityLiving entityliving) {
super.setGoalTarget(entityliving);
2012-03-10 03:52:32 +01:00
if (entityliving instanceof EntityHuman) {
this.setAngry(true);
}
}
2013-03-13 23:33:27 +01:00
protected void bp() {
this.datawatcher.watch(18, Integer.valueOf(this.getScaledHealth())); // CraftBukkit - this.getHealth() -> this.getScaledHealth()
2012-03-10 03:52:32 +01:00
}
public int getMaxHealth() {
return this.isTamed() ? 20 : 8;
}
2012-07-29 09:33:13 +02:00
protected void a() {
super.a();
2012-03-10 03:52:32 +01:00
this.datawatcher.a(18, new Integer(this.getHealth()));
2012-07-29 09:33:13 +02:00
this.datawatcher.a(19, new Byte((byte) 0));
2013-03-13 23:33:27 +01:00
this.datawatcher.a(20, new Byte((byte) BlockCloth.g_(1)));
2012-03-10 03:52:32 +01:00
}
protected void a(int i, int j, int k, int l) {
2012-11-06 13:05:28 +01:00
this.makeSound("mob.wolf.step", 0.15F, 1.0F);
2012-03-10 03:52:32 +01:00
}
public void b(NBTTagCompound nbttagcompound) {
super.b(nbttagcompound);
nbttagcompound.setBoolean("Angry", this.isAngry());
nbttagcompound.setByte("CollarColor", (byte) this.getCollarColor());
2012-03-10 03:52:32 +01:00
}
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
this.setAngry(nbttagcompound.getBoolean("Angry"));
if (nbttagcompound.hasKey("CollarColor")) {
this.setCollarColor(nbttagcompound.getByte("CollarColor"));
}
2012-03-10 03:52:32 +01:00
}
2013-01-17 10:28:44 +01:00
protected boolean isTypeNotPersistent() {
// CraftBukkit - added && !this.isTamed()
return this.isAngry() && !this.isTamed();
2012-03-10 03:52:32 +01:00
}
2013-03-13 23:33:27 +01:00
protected String bb() {
// 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");
2012-03-10 03:52:32 +01:00
}
2013-03-13 23:33:27 +01:00
protected String bc() {
2012-03-10 03:52:32 +01:00
return "mob.wolf.hurt";
}
2013-03-13 23:33:27 +01:00
protected String bd() {
2012-03-10 03:52:32 +01:00
return "mob.wolf.death";
}
2013-03-13 23:33:27 +01:00
protected float ba() {
2012-03-10 03:52:32 +01:00
return 0.4F;
}
protected int getLootId() {
return -1;
}
public void c() {
super.c();
if (!this.world.isStatic && this.g && !this.h && !this.k() && this.onGround) {
2012-07-29 09:33:13 +02:00
this.h = true;
this.i = 0.0F;
2012-03-10 03:52:32 +01:00
this.j = 0.0F;
this.world.broadcastEntityEffect(this, (byte) 8);
}
}
2013-03-13 23:33:27 +01:00
public void l_() {
super.l_();
2012-07-29 09:33:13 +02:00
this.f = this.e;
2013-03-13 23:33:27 +01:00
if (this.bW()) {
2012-07-29 09:33:13 +02:00
this.e += (1.0F - this.e) * 0.4F;
2012-03-10 03:52:32 +01:00
} else {
2012-07-29 09:33:13 +02:00
this.e += (0.0F - this.e) * 0.4F;
2012-03-10 03:52:32 +01:00
}
2013-03-13 23:33:27 +01:00
if (this.bW()) {
this.bJ = 10;
2012-03-10 03:52:32 +01:00
}
2013-03-13 23:33:27 +01:00
if (this.F()) {
2012-07-29 09:33:13 +02:00
this.g = true;
this.h = false;
this.i = 0.0F;
2012-03-10 03:52:32 +01:00
this.j = 0.0F;
2012-07-29 09:33:13 +02:00
} else if ((this.g || this.h) && this.h) {
if (this.i == 0.0F) {
2013-03-13 23:33:27 +01:00
this.makeSound("mob.wolf.shake", this.ba(), (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
2012-03-10 03:52:32 +01:00
}
2012-07-29 09:33:13 +02:00
this.j = this.i;
this.i += 0.05F;
if (this.j >= 2.0F) {
this.g = false;
2012-03-10 03:52:32 +01:00
this.h = false;
this.j = 0.0F;
2012-07-29 09:33:13 +02:00
this.i = 0.0F;
2012-03-10 03:52:32 +01:00
}
2012-07-29 09:33:13 +02:00
if (this.i > 0.4F) {
2012-03-10 03:52:32 +01:00
float f = (float) this.boundingBox.b;
2012-07-29 09:33:13 +02:00
int i = (int) (MathHelper.sin((this.i - 0.4F) * 3.1415927F) * 7.0F);
2012-03-10 03:52:32 +01:00
for (int j = 0; j < i; ++j) {
float f1 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
float f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
this.world.addParticle("splash", this.locX + (double) f1, (double) (f + 0.8F), this.locZ + (double) f2, this.motX, this.motY, this.motZ);
2012-03-10 03:52:32 +01:00
}
}
}
}
public float getHeadHeight() {
return this.length * 0.8F;
}
2013-03-13 23:33:27 +01:00
public int bs() {
return this.isSitting() ? 20 : super.bs();
2012-03-10 03:52:32 +01:00
}
public boolean damageEntity(DamageSource damagesource, int i) {
2012-11-06 13:05:28 +01:00
if (this.isInvulnerable()) {
return false;
} else {
Entity entity = damagesource.getEntity();
2012-03-10 03:52:32 +01:00
2013-01-17 10:28:44 +01:00
this.d.setSitting(false);
2012-11-06 13:05:28 +01:00
if (entity != null && !(entity instanceof EntityHuman) && !(entity instanceof EntityArrow)) {
i = (i + 1) / 2;
}
2012-03-10 03:52:32 +01:00
2012-11-06 13:05:28 +01:00
return super.damageEntity(damagesource, i);
}
2012-03-10 03:52:32 +01:00
}
2012-11-06 13:05:28 +01:00
public boolean m(Entity entity) {
2012-03-10 03:52:32 +01:00
int i = this.isTamed() ? 4 : 2;
return entity.damageEntity(DamageSource.mobAttack(this), i);
}
2013-03-13 23:33:27 +01:00
public boolean a_(EntityHuman entityhuman) {
2012-03-10 03:52:32 +01:00
ItemStack itemstack = entityhuman.inventory.getItemInHand();
2012-07-29 09:33:13 +02:00
if (this.isTamed()) {
if (itemstack != null) {
if (Item.byId[itemstack.id] instanceof ItemFood) {
ItemFood itemfood = (ItemFood) Item.byId[itemstack.id];
2012-03-10 03:52:32 +01:00
if (itemfood.i() && this.datawatcher.getInt(18) < 20) {
if (!entityhuman.abilities.canInstantlyBuild) {
--itemstack.count;
}
this.heal(itemfood.getNutrition());
if (itemstack.count <= 0) {
entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null);
}
2012-03-30 23:33:51 +02:00
return true;
2012-03-10 03:52:32 +01:00
}
} else if (itemstack.id == Item.INK_SACK.id) {
2013-03-13 23:33:27 +01:00
int i = BlockCloth.g_(itemstack.getData());
2012-03-10 03:52:32 +01:00
if (i != this.getCollarColor()) {
this.setCollarColor(i);
2012-11-06 13:05:28 +01:00
if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count <= 0) {
entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null);
}
return true;
}
2012-03-10 03:52:32 +01:00
}
}
if (entityhuman.name.equalsIgnoreCase(this.getOwnerName()) && !this.world.isStatic && !this.c(itemstack)) {
2013-01-17 10:28:44 +01:00
this.d.setSitting(!this.isSitting());
2013-03-13 23:33:27 +01:00
this.bG = false;
2012-03-10 03:52:32 +01:00
this.setPathEntity((PathEntity) null);
}
2012-07-29 09:33:13 +02:00
} else if (itemstack != null && itemstack.id == Item.BONE.id && !this.isAngry()) {
if (!entityhuman.abilities.canInstantlyBuild) {
--itemstack.count;
}
if (itemstack.count <= 0) {
entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null);
}
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
2012-07-29 09:33:13 +02:00
this.setTamed(true);
this.setPathEntity((PathEntity) null);
2013-01-17 10:28:44 +01:00
this.setGoalTarget((EntityLiving) null);
this.d.setSitting(true);
// CraftBukkit start
if (updateMaxHealth) {
this.maxHealth = this.getMaxHealth();
}
this.setHealth(this.maxHealth);
// CraftBukkit end
2012-07-29 09:33:13 +02:00
this.setOwnerName(entityhuman.name);
2013-03-13 23:33:27 +01:00
this.i(true);
2012-07-29 09:33:13 +02:00
this.world.broadcastEntityEffect(this, (byte) 7);
} else {
2013-03-13 23:33:27 +01:00
this.i(false);
2012-07-29 09:33:13 +02:00
this.world.broadcastEntityEffect(this, (byte) 6);
}
}
return true;
2012-03-10 03:52:32 +01:00
}
2013-03-13 23:33:27 +01:00
return super.a_(entityhuman);
2012-03-10 03:52:32 +01:00
}
public boolean c(ItemStack itemstack) {
return itemstack == null ? false : (!(Item.byId[itemstack.id] instanceof ItemFood) ? false : ((ItemFood) Item.byId[itemstack.id]).i());
2012-03-10 03:52:32 +01:00
}
2013-03-13 23:33:27 +01:00
public int by() {
2012-03-10 03:52:32 +01:00
return 8;
}
public boolean isAngry() {
return (this.datawatcher.getByte(16) & 2) != 0;
}
public void setAngry(boolean flag) {
byte b0 = this.datawatcher.getByte(16);
if (flag) {
this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 2)));
} else {
this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -3)));
}
}
public int getCollarColor() {
return this.datawatcher.getByte(20) & 15;
}
public void setCollarColor(int i) {
this.datawatcher.watch(20, Byte.valueOf((byte) (i & 15)));
}
2012-11-06 13:05:28 +01:00
public EntityWolf b(EntityAgeable entityageable) {
2012-03-10 03:52:32 +01:00
EntityWolf entitywolf = new EntityWolf(this.world);
2012-11-16 17:13:34 +01:00
String s = this.getOwnerName();
if (s != null && s.trim().length() > 0) {
entitywolf.setOwnerName(s);
entitywolf.setTamed(true);
}
2012-03-10 03:52:32 +01:00
return entitywolf;
}
2013-03-13 23:33:27 +01:00
public void m(boolean flag) {
2012-07-29 09:33:13 +02:00
byte b0 = this.datawatcher.getByte(19);
if (flag) {
this.datawatcher.watch(19, Byte.valueOf((byte) 1));
} else {
this.datawatcher.watch(19, Byte.valueOf((byte) 0));
}
2012-03-10 03:52:32 +01:00
}
public boolean mate(EntityAnimal entityanimal) {
if (entityanimal == this) {
return false;
} else if (!this.isTamed()) {
return false;
} else if (!(entityanimal instanceof EntityWolf)) {
return false;
} else {
EntityWolf entitywolf = (EntityWolf) entityanimal;
return !entitywolf.isTamed() ? false : (entitywolf.isSitting() ? false : this.r() && entitywolf.r());
2012-03-10 03:52:32 +01:00
}
}
2012-07-29 09:33:13 +02:00
2013-03-13 23:33:27 +01:00
public boolean bW() {
2012-07-29 09:33:13 +02:00
return this.datawatcher.getByte(19) == 1;
}
2012-11-06 13:05:28 +01:00
public EntityAgeable createChild(EntityAgeable entityageable) {
return this.b(entityageable);
}
2012-03-10 03:52:32 +01:00
}