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 }