001package net.minecraft.entity.passive;
002
003import net.minecraft.entity.EntityAgeable;
004import net.minecraft.entity.ai.EntityAIFollowParent;
005import net.minecraft.entity.ai.EntityAILookIdle;
006import net.minecraft.entity.ai.EntityAIMate;
007import net.minecraft.entity.ai.EntityAIPanic;
008import net.minecraft.entity.ai.EntityAISwimming;
009import net.minecraft.entity.ai.EntityAITempt;
010import net.minecraft.entity.ai.EntityAIWander;
011import net.minecraft.entity.ai.EntityAIWatchClosest;
012import net.minecraft.entity.player.EntityPlayer;
013import net.minecraft.item.Item;
014import net.minecraft.item.ItemSeeds;
015import net.minecraft.item.ItemStack;
016import net.minecraft.world.World;
017
018public class EntityChicken extends EntityAnimal
019{
020    public boolean field_70885_d = false;
021    public float field_70886_e = 0.0F;
022    public float destPos = 0.0F;
023    public float field_70884_g;
024    public float field_70888_h;
025    public float field_70889_i = 1.0F;
026
027    /** The time until the next egg is spawned. */
028    public int timeUntilNextEgg;
029
030    public EntityChicken(World par1World)
031    {
032        super(par1World);
033        this.texture = "/mob/chicken.png";
034        this.setSize(0.3F, 0.7F);
035        this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000;
036        float var2 = 0.25F;
037        this.tasks.addTask(0, new EntityAISwimming(this));
038        this.tasks.addTask(1, new EntityAIPanic(this, 0.38F));
039        this.tasks.addTask(2, new EntityAIMate(this, var2));
040        this.tasks.addTask(3, new EntityAITempt(this, 0.25F, Item.seeds.itemID, false));
041        this.tasks.addTask(4, new EntityAIFollowParent(this, 0.28F));
042        this.tasks.addTask(5, new EntityAIWander(this, var2));
043        this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F));
044        this.tasks.addTask(7, new EntityAILookIdle(this));
045    }
046
047    /**
048     * Returns true if the newer Entity AI code should be run
049     */
050    public boolean isAIEnabled()
051    {
052        return true;
053    }
054
055    public int getMaxHealth()
056    {
057        return 4;
058    }
059
060    /**
061     * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
062     * use this to react to sunlight and start to burn.
063     */
064    public void onLivingUpdate()
065    {
066        super.onLivingUpdate();
067        this.field_70888_h = this.field_70886_e;
068        this.field_70884_g = this.destPos;
069        this.destPos = (float)((double)this.destPos + (double)(this.onGround ? -1 : 4) * 0.3D);
070
071        if (this.destPos < 0.0F)
072        {
073            this.destPos = 0.0F;
074        }
075
076        if (this.destPos > 1.0F)
077        {
078            this.destPos = 1.0F;
079        }
080
081        if (!this.onGround && this.field_70889_i < 1.0F)
082        {
083            this.field_70889_i = 1.0F;
084        }
085
086        this.field_70889_i = (float)((double)this.field_70889_i * 0.9D);
087
088        if (!this.onGround && this.motionY < 0.0D)
089        {
090            this.motionY *= 0.6D;
091        }
092
093        this.field_70886_e += this.field_70889_i * 2.0F;
094
095        if (!this.isChild() && !this.worldObj.isRemote && --this.timeUntilNextEgg <= 0)
096        {
097            this.playSound("mob.chicken.plop", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
098            this.dropItem(Item.egg.itemID, 1);
099            this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000;
100        }
101    }
102
103    /**
104     * Called when the mob is falling. Calculates and applies fall damage.
105     */
106    protected void fall(float par1) {}
107
108    /**
109     * Returns the sound this mob makes while it's alive.
110     */
111    protected String getLivingSound()
112    {
113        return "mob.chicken.say";
114    }
115
116    /**
117     * Returns the sound this mob makes when it is hurt.
118     */
119    protected String getHurtSound()
120    {
121        return "mob.chicken.hurt";
122    }
123
124    /**
125     * Returns the sound this mob makes on death.
126     */
127    protected String getDeathSound()
128    {
129        return "mob.chicken.hurt";
130    }
131
132    /**
133     * Plays step sound at given x, y, z for the entity
134     */
135    protected void playStepSound(int par1, int par2, int par3, int par4)
136    {
137        this.playSound("mob.chicken.step", 0.15F, 1.0F);
138    }
139
140    /**
141     * Returns the item ID for the item the mob drops on death.
142     */
143    protected int getDropItemId()
144    {
145        return Item.feather.itemID;
146    }
147
148    /**
149     * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param
150     * par2 - Level of Looting used to kill this mob.
151     */
152    protected void dropFewItems(boolean par1, int par2)
153    {
154        int var3 = this.rand.nextInt(3) + this.rand.nextInt(1 + par2);
155
156        for (int var4 = 0; var4 < var3; ++var4)
157        {
158            this.dropItem(Item.feather.itemID, 1);
159        }
160
161        if (this.isBurning())
162        {
163            this.dropItem(Item.chickenCooked.itemID, 1);
164        }
165        else
166        {
167            this.dropItem(Item.chickenRaw.itemID, 1);
168        }
169    }
170
171    /**
172     * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal.
173     */
174    public EntityChicken spawnBabyAnimal(EntityAgeable par1EntityAgeable)
175    {
176        return new EntityChicken(this.worldObj);
177    }
178
179    /**
180     * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on
181     * the animal type)
182     */
183    public boolean isBreedingItem(ItemStack par1ItemStack)
184    {
185        return par1ItemStack != null && par1ItemStack.getItem() instanceof ItemSeeds;
186    }
187
188    public EntityAgeable createChild(EntityAgeable par1EntityAgeable)
189    {
190        return this.spawnBabyAnimal(par1EntityAgeable);
191    }
192}