    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.Iterator;
    006    import java.util.List;
    007
    008    public class EntityPigZombie extends EntityZombie
    009    {
    010        /** Above zero if this PigZombie is Angry. */
    011        private int angerLevel = 0;
    012
    013        /** A random delay until this PigZombie next makes a sound. */
    014        private int randomSoundDelay = 0;
    015
    016        /** The ItemStack that any PigZombie holds (a gold sword, in fact). */
    017        private static final ItemStack defaultHeldItem = new ItemStack(Item.swordGold, 1);
    018
    019        public EntityPigZombie(World par1World)
    020        {
    021            super(par1World);
    022            this.texture = "/mob/pigzombie.png";
    023            this.moveSpeed = 0.5F;
    024            this.attackStrength = 5;
    025            this.isImmuneToFire = true;
    026        }
    027
    028        /**
    029         * Returns true if the newer Entity AI code should be run
    030         */
    031        protected boolean isAIEnabled()
    032        {
    033            return false;
    034        }
    035
    036        /**
    037         * Called to update the entity's position/logic.
    038         */
    039        public void onUpdate()
    040        {
    041            this.moveSpeed = this.entityToAttack != null ? 0.95F : 0.5F;
    042
    043            if (this.randomSoundDelay > 0 && --this.randomSoundDelay == 0)
    044            {
    045                this.worldObj.playSoundAtEntity(this, "mob.zombiepig.zpigangry", this.getSoundVolume() * 2.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 1.8F);
    046            }
    047
    048            super.onUpdate();
    049        }
    050
    051        /**
    052         * Checks if the entity's current position is a valid location to spawn this entity.
    053         */
    054        public boolean getCanSpawnHere()
    055        {
    056            return this.worldObj.difficultySetting > 0 && this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox);
    057        }
    058
    059        /**
    060         * (abstract) Protected helper method to write subclass entity data to NBT.
    061         */
    062        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    063        {
    064            super.writeEntityToNBT(par1NBTTagCompound);
    065            par1NBTTagCompound.setShort("Anger", (short)this.angerLevel);
    066        }
    067
    068        /**
    069         * (abstract) Protected helper method to read subclass entity data from NBT.
    070         */
    071        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    072        {
    073            super.readEntityFromNBT(par1NBTTagCompound);
    074            this.angerLevel = par1NBTTagCompound.getShort("Anger");
    075        }
    076
    077        /**
    078         * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking
    079         * (Animals, Spiders at day, peaceful PigZombies).
    080         */
    081        protected Entity findPlayerToAttack()
    082        {
    083            return this.angerLevel == 0 ? null : super.findPlayerToAttack();
    084        }
    085
    086        /**
    087         * Called when the entity is attacked.
    088         */
    089        public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
    090        {
    091            Entity var3 = par1DamageSource.getEntity();
    092
    093            if (var3 instanceof EntityPlayer)
    094            {
    095                List var4 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(32.0D, 32.0D, 32.0D));
    096                Iterator var5 = var4.iterator();
    097
    098                while (var5.hasNext())
    099                {
    100                    Entity var6 = (Entity)var5.next();
    101
    102                    if (var6 instanceof EntityPigZombie)
    103                    {
    104                        EntityPigZombie var7 = (EntityPigZombie)var6;
    105                        var7.becomeAngryAt(var3);
    106                    }
    107                }
    108
    109                this.becomeAngryAt(var3);
    110            }
    111
    112            return super.attackEntityFrom(par1DamageSource, par2);
    113        }
    114
    115        /**
    116         * Causes this PigZombie to become angry at the supplied Entity (which will be a player).
    117         */
    118        private void becomeAngryAt(Entity par1Entity)
    119        {
    120            this.entityToAttack = par1Entity;
    121            this.angerLevel = 400 + this.rand.nextInt(400);
    122            this.randomSoundDelay = this.rand.nextInt(40);
    123        }
    124
    125        /**
    126         * Returns the sound this mob makes while it's alive.
    127         */
    128        protected String getLivingSound()
    129        {
    130            return "mob.zombiepig.zpig";
    131        }
    132
    133        /**
    134         * Returns the sound this mob makes when it is hurt.
    135         */
    136        protected String getHurtSound()
    137        {
    138            return "mob.zombiepig.zpighurt";
    139        }
    140
    141        /**
    142         * Returns the sound this mob makes on death.
    143         */
    144        protected String getDeathSound()
    145        {
    146            return "mob.zombiepig.zpigdeath";
    147        }
    148
    149        /**
    150         * Drop 0-2 items of this living's type
    151         */
    152        protected void dropFewItems(boolean par1, int par2)
    153        {
    154            int var3 = this.rand.nextInt(2 + par2);
    155            int var4;
    156
    157            for (var4 = 0; var4 < var3; ++var4)
    158            {
    159                this.dropItem(Item.rottenFlesh.shiftedIndex, 1);
    160            }
    161
    162            var3 = this.rand.nextInt(2 + par2);
    163
    164            for (var4 = 0; var4 < var3; ++var4)
    165            {
    166                this.dropItem(Item.goldNugget.shiftedIndex, 1);
    167            }
    168        }
    169
    170        protected void dropRareDrop(int par1)
    171        {
    172            if (par1 > 0)
    173            {
    174                ItemStack var2 = new ItemStack(Item.swordGold);
    175                EnchantmentHelper.addRandomEnchantment(this.rand, var2, 5);
    176                this.entityDropItem(var2, 0.0F);
    177            }
    178            else
    179            {
    180                int var3 = this.rand.nextInt(3);
    181
    182                if (var3 == 0)
    183                {
    184                    this.dropItem(Item.ingotGold.shiftedIndex, 1);
    185                }
    186                else if (var3 == 1)
    187                {
    188                    this.dropItem(Item.swordGold.shiftedIndex, 1);
    189                }
    190                else if (var3 == 2)
    191                {
    192                    this.dropItem(Item.helmetGold.shiftedIndex, 1);
    193                }
    194            }
    195        }
    196
    197        /**
    198         * Returns the item ID for the item the mob drops on death.
    199         */
    200        protected int getDropItemId()
    201        {
    202            return Item.rottenFlesh.shiftedIndex;
    203        }
    204
    205        @SideOnly(Side.CLIENT)
    206
    207        /**
    208         * Returns the item that this EntityLiving is holding, if any.
    209         */
    210        public ItemStack getHeldItem()
    211        {
    212            return defaultHeldItem;
    213        }
    214    }