001 package net.minecraft.entity.passive; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import net.minecraft.entity.EntityLiving; 006 import net.minecraft.entity.ai.EntityAISit; 007 import net.minecraft.nbt.NBTTagCompound; 008 import net.minecraft.world.World; 009 010 public abstract class EntityTameable extends EntityAnimal 011 { 012 protected EntityAISit aiSit = new EntityAISit(this); 013 014 public EntityTameable(World par1World) 015 { 016 super(par1World); 017 } 018 019 protected void entityInit() 020 { 021 super.entityInit(); 022 this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); 023 this.dataWatcher.addObject(17, ""); 024 } 025 026 /** 027 * (abstract) Protected helper method to write subclass entity data to NBT. 028 */ 029 public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) 030 { 031 super.writeEntityToNBT(par1NBTTagCompound); 032 033 if (this.getOwnerName() == null) 034 { 035 par1NBTTagCompound.setString("Owner", ""); 036 } 037 else 038 { 039 par1NBTTagCompound.setString("Owner", this.getOwnerName()); 040 } 041 042 par1NBTTagCompound.setBoolean("Sitting", this.isSitting()); 043 } 044 045 /** 046 * (abstract) Protected helper method to read subclass entity data from NBT. 047 */ 048 public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) 049 { 050 super.readEntityFromNBT(par1NBTTagCompound); 051 String var2 = par1NBTTagCompound.getString("Owner"); 052 053 if (var2.length() > 0) 054 { 055 this.setOwner(var2); 056 this.setTamed(true); 057 } 058 059 this.aiSit.setSitting(par1NBTTagCompound.getBoolean("Sitting")); 060 this.setSitting(par1NBTTagCompound.getBoolean("Sitting")); 061 } 062 063 /** 064 * Play the taming effect, will either be hearts or smoke depending on status 065 */ 066 protected void playTameEffect(boolean par1) 067 { 068 String var2 = "heart"; 069 070 if (!par1) 071 { 072 var2 = "smoke"; 073 } 074 075 for (int var3 = 0; var3 < 7; ++var3) 076 { 077 double var4 = this.rand.nextGaussian() * 0.02D; 078 double var6 = this.rand.nextGaussian() * 0.02D; 079 double var8 = this.rand.nextGaussian() * 0.02D; 080 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); 081 } 082 } 083 084 @SideOnly(Side.CLIENT) 085 public void handleHealthUpdate(byte par1) 086 { 087 if (par1 == 7) 088 { 089 this.playTameEffect(true); 090 } 091 else if (par1 == 6) 092 { 093 this.playTameEffect(false); 094 } 095 else 096 { 097 super.handleHealthUpdate(par1); 098 } 099 } 100 101 public boolean isTamed() 102 { 103 return (this.dataWatcher.getWatchableObjectByte(16) & 4) != 0; 104 } 105 106 public void setTamed(boolean par1) 107 { 108 byte var2 = this.dataWatcher.getWatchableObjectByte(16); 109 110 if (par1) 111 { 112 this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 4))); 113 } 114 else 115 { 116 this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -5))); 117 } 118 } 119 120 public boolean isSitting() 121 { 122 return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; 123 } 124 125 public void setSitting(boolean par1) 126 { 127 byte var2 = this.dataWatcher.getWatchableObjectByte(16); 128 129 if (par1) 130 { 131 this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 1))); 132 } 133 else 134 { 135 this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -2))); 136 } 137 } 138 139 public String getOwnerName() 140 { 141 return this.dataWatcher.getWatchableObjectString(17); 142 } 143 144 public void setOwner(String par1Str) 145 { 146 this.dataWatcher.updateObject(17, par1Str); 147 } 148 149 public EntityLiving getOwner() 150 { 151 return this.worldObj.getPlayerEntityByName(this.getOwnerName()); 152 } 153 154 public EntityAISit func_70907_r() 155 { 156 return this.aiSit; 157 } 158 }