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 }