package net.minecraft.entity.passive; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.ai.EntityAISit; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; public abstract class EntityTameable extends EntityAnimal { protected EntityAISit aiSit = new EntityAISit(this); public EntityTameable(World par1World) { super(par1World); } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); this.dataWatcher.addObject(17, ""); } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) { super.writeEntityToNBT(par1NBTTagCompound); if (this.getOwnerName() == null) { par1NBTTagCompound.setString("Owner", ""); } else { par1NBTTagCompound.setString("Owner", this.getOwnerName()); } par1NBTTagCompound.setBoolean("Sitting", this.isSitting()); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { super.readEntityFromNBT(par1NBTTagCompound); String var2 = par1NBTTagCompound.getString("Owner"); if (var2.length() > 0) { this.setOwner(var2); this.setTamed(true); } this.aiSit.setSitting(par1NBTTagCompound.getBoolean("Sitting")); this.setSitting(par1NBTTagCompound.getBoolean("Sitting")); } /** * Play the taming effect, will either be hearts or smoke depending on status */ protected void playTameEffect(boolean par1) { String var2 = "heart"; if (!par1) { var2 = "smoke"; } for (int var3 = 0; var3 < 7; ++var3) { double var4 = this.rand.nextGaussian() * 0.02D; double var6 = this.rand.nextGaussian() * 0.02D; double var8 = this.rand.nextGaussian() * 0.02D; this.worldObj.spawnParticle(var2, this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + 0.5D + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, var4, var6, var8); } } @SideOnly(Side.CLIENT) public void handleHealthUpdate(byte par1) { if (par1 == 7) { this.playTameEffect(true); } else if (par1 == 6) { this.playTameEffect(false); } else { super.handleHealthUpdate(par1); } } public boolean isTamed() { return (this.dataWatcher.getWatchableObjectByte(16) & 4) != 0; } public void setTamed(boolean par1) { byte var2 = this.dataWatcher.getWatchableObjectByte(16); if (par1) { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 4))); } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -5))); } } public boolean isSitting() { return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; } public void setSitting(boolean par1) { byte var2 = this.dataWatcher.getWatchableObjectByte(16); if (par1) { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 1))); } else { this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -2))); } } public String getOwnerName() { return this.dataWatcher.getWatchableObjectString(17); } public void setOwner(String par1Str) { this.dataWatcher.updateObject(17, par1Str); } public EntityLiving getOwner() { return this.worldObj.getPlayerEntityByName(this.getOwnerName()); } public EntityAISit func_70907_r() { return this.aiSit; } }