    001    package net.minecraft.entity.passive;
    002
    003    import net.minecraft.entity.EntityAgeable;
    004    import net.minecraft.entity.ai.EntityAIFollowParent;
    005    import net.minecraft.entity.ai.EntityAILookIdle;
    006    import net.minecraft.entity.ai.EntityAIMate;
    007    import net.minecraft.entity.ai.EntityAIPanic;
    008    import net.minecraft.entity.ai.EntityAISwimming;
    009    import net.minecraft.entity.ai.EntityAITempt;
    010    import net.minecraft.entity.ai.EntityAIWander;
    011    import net.minecraft.entity.ai.EntityAIWatchClosest;
    012    import net.minecraft.entity.player.EntityPlayer;
    013    import net.minecraft.item.Item;
    014    import net.minecraft.item.ItemSeeds;
    015    import net.minecraft.item.ItemStack;
    016    import net.minecraft.world.World;
    017
    018    public 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.shiftedIndex, 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.func_85030_a("mob.chicken.plop", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
    098                this.dropItem(Item.egg.shiftedIndex, 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.func_85030_a("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.shiftedIndex;
    146        }
    147
    148        /**
    149         * Drop 0-2 items of this living's type
    150         */
    151        protected void dropFewItems(boolean par1, int par2)
    152        {
    153            int var3 = this.rand.nextInt(3) + this.rand.nextInt(1 + par2);
    154
    155            for (int var4 = 0; var4 < var3; ++var4)
    156            {
    157                this.dropItem(Item.feather.shiftedIndex, 1);
    158            }
    159
    160            if (this.isBurning())
    161            {
    162                this.dropItem(Item.chickenCooked.shiftedIndex, 1);
    163            }
    164            else
    165            {
    166                this.dropItem(Item.chickenRaw.shiftedIndex, 1);
    167            }
    168        }
    169
    170        /**
    171         * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal.
    172         */
    173        public EntityChicken spawnBabyAnimal(EntityAgeable par1EntityAgeable)
    174        {
    175            return new EntityChicken(this.worldObj);
    176        }
    177
    178        /**
    179         * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on
    180         * the animal type)
    181         */
    182        public boolean isBreedingItem(ItemStack par1ItemStack)
    183        {
    184            return par1ItemStack != null && par1ItemStack.getItem() instanceof ItemSeeds;
    185        }
    186
    187        public EntityAgeable func_90011_a(EntityAgeable par1EntityAgeable)
    188        {
    189            return this.spawnBabyAnimal(par1EntityAgeable);
    190        }
    191    }