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}