    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    }