    001    package net.minecraft.entity.passive;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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    }