    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    }