001    package net.minecraft.src;
002    
003    public class EntityZombie extends EntityMob
004    {
005        public EntityZombie(World par1World)
006        {
007            super(par1World);
008            this.texture = "/mob/zombie.png";
009            this.moveSpeed = 0.23F;
010            this.attackStrength = 4;
011            this.getNavigator().setBreakDoors(true);
012            this.tasks.addTask(0, new EntityAISwimming(this));
013            this.tasks.addTask(1, new EntityAIBreakDoor(this));
014            this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, this.moveSpeed, false));
015            this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityVillager.class, this.moveSpeed, true));
016            this.tasks.addTask(4, new EntityAIMoveTwardsRestriction(this, this.moveSpeed));
017            this.tasks.addTask(5, new EntityAIMoveThroughVillage(this, this.moveSpeed, false));
018            this.tasks.addTask(6, new EntityAIWander(this, this.moveSpeed));
019            this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));
020            this.tasks.addTask(7, new EntityAILookIdle(this));
021            this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false));
022            this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 16.0F, 0, true));
023            this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityVillager.class, 16.0F, 0, false));
024        }
025    
026        public int getMaxHealth()
027        {
028            return 20;
029        }
030    
031        /**
032         * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue
033         */
034        public int getTotalArmorValue()
035        {
036            return 2;
037        }
038    
039        /**
040         * Returns true if the newer Entity AI code should be run
041         */
042        protected boolean isAIEnabled()
043        {
044            return true;
045        }
046    
047        /**
048         * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
049         * use this to react to sunlight and start to burn.
050         */
051        public void onLivingUpdate()
052        {
053            if (this.worldObj.isDaytime() && !this.worldObj.isRemote)
054            {
055                float var1 = this.getBrightness(1.0F);
056    
057                if (var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F)
058                {
059                    this.setFire(8);
060                }
061            }
062    
063            super.onLivingUpdate();
064        }
065    
066        /**
067         * Returns the sound this mob makes while it's alive.
068         */
069        protected String getLivingSound()
070        {
071            return "mob.zombie";
072        }
073    
074        /**
075         * Returns the sound this mob makes when it is hurt.
076         */
077        protected String getHurtSound()
078        {
079            return "mob.zombiehurt";
080        }
081    
082        /**
083         * Returns the sound this mob makes on death.
084         */
085        protected String getDeathSound()
086        {
087            return "mob.zombiedeath";
088        }
089    
090        /**
091         * Returns the item ID for the item the mob drops on death.
092         */
093        protected int getDropItemId()
094        {
095            return Item.rottenFlesh.shiftedIndex;
096        }
097    
098        /**
099         * Get this Entity's EnumCreatureAttribute
100         */
101        public EnumCreatureAttribute getCreatureAttribute()
102        {
103            return EnumCreatureAttribute.UNDEAD;
104        }
105    
106        protected void dropRareDrop(int par1)
107        {
108            switch (this.rand.nextInt(4))
109            {
110                case 0:
111                    this.dropItem(Item.swordSteel.shiftedIndex, 1);
112                    break;
113                case 1:
114                    this.dropItem(Item.helmetSteel.shiftedIndex, 1);
115                    break;
116                case 2:
117                    this.dropItem(Item.ingotIron.shiftedIndex, 1);
118                    break;
119                case 3:
120                    this.dropItem(Item.shovelSteel.shiftedIndex, 1);
121            }
122        }
123    }