    001package net.minecraft.entity.passive;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.entity.EntityLiving;
    006import net.minecraft.entity.ai.EntityAISit;
    007import net.minecraft.nbt.NBTTagCompound;
    008import net.minecraft.world.World;
    009
    010public 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 s = par1NBTTagCompound.getString("Owner");
    052
    053        if (s.length() > 0)
    054        {
    055            this.setOwner(s);
    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 s = "heart";
    069
    070        if (!par1)
    071        {
    072            s = "smoke";
    073        }
    074
    075        for (int i = 0; i < 7; ++i)
    076        {
    077            double d0 = this.rand.nextGaussian() * 0.02D;
    078            double d1 = this.rand.nextGaussian() * 0.02D;
    079            double d2 = this.rand.nextGaussian() * 0.02D;
    080            this.worldObj.spawnParticle(s, 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, d0, d1, d2);
    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 b0 = this.dataWatcher.getWatchableObjectByte(16);
    109
    110        if (par1)
    111        {
    112            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 4)));
    113        }
    114        else
    115        {
    116            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -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 b0 = this.dataWatcher.getWatchableObjectByte(16);
    128
    129        if (par1)
    130        {
    131            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 1)));
    132        }
    133        else
    134        {
    135            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -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}