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            this.setSitting(par1NBTTagCompound.getBoolean("Sitting"));
057        }
058    
059        /**
060         * Play the taming effect, will either be hearts or smoke depending on status
061         */
062        protected void playTameEffect(boolean par1)
063        {
064            String var2 = "heart";
065    
066            if (!par1)
067            {
068                var2 = "smoke";
069            }
070    
071            for (int var3 = 0; var3 < 7; ++var3)
072            {
073                double var4 = this.rand.nextGaussian() * 0.02D;
074                double var6 = this.rand.nextGaussian() * 0.02D;
075                double var8 = this.rand.nextGaussian() * 0.02D;
076                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);
077            }
078        }
079    
080        @SideOnly(Side.CLIENT)
081        public void handleHealthUpdate(byte par1)
082        {
083            if (par1 == 7)
084            {
085                this.playTameEffect(true);
086            }
087            else if (par1 == 6)
088            {
089                this.playTameEffect(false);
090            }
091            else
092            {
093                super.handleHealthUpdate(par1);
094            }
095        }
096    
097        public boolean isTamed()
098        {
099            return (this.dataWatcher.getWatchableObjectByte(16) & 4) != 0;
100        }
101    
102        public void setTamed(boolean par1)
103        {
104            byte var2 = this.dataWatcher.getWatchableObjectByte(16);
105    
106            if (par1)
107            {
108                this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 4)));
109            }
110            else
111            {
112                this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -5)));
113            }
114        }
115    
116        public boolean isSitting()
117        {
118            return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
119        }
120    
121        public void setSitting(boolean par1)
122        {
123            byte var2 = this.dataWatcher.getWatchableObjectByte(16);
124    
125            if (par1)
126            {
127                this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 1)));
128            }
129            else
130            {
131                this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -2)));
132            }
133        }
134    
135        public String getOwnerName()
136        {
137            return this.dataWatcher.getWatchableObjectString(17);
138        }
139    
140        public void setOwner(String par1Str)
141        {
142            this.dataWatcher.updateObject(17, par1Str);
143        }
144    
145        public EntityLiving getOwner()
146        {
147            return this.worldObj.getPlayerEntityByName(this.getOwnerName());
148        }
149    
150        public EntityAISit func_70907_r()
151        {
152            return this.aiSit;
153        }
154    }