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