    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        public EntityPigZombie(World par1World)
    017        {
    018            super(par1World);
    019            this.texture = "/mob/pigzombie.png";
    020            this.moveSpeed = 0.5F;
    021            this.isImmuneToFire = true;
    022        }
    023
    024        /**
    025         * Returns true if the newer Entity AI code should be run
    026         */
    027        protected boolean isAIEnabled()
    028        {
    029            return false;
    030        }
    031
    032        /**
    033         * Called to update the entity's position/logic.
    034         */
    035        public void onUpdate()
    036        {
    037            this.moveSpeed = this.entityToAttack != null ? 0.95F : 0.5F;
    038
    039            if (this.randomSoundDelay > 0 && --this.randomSoundDelay == 0)
    040            {
    041                this.func_85030_a("mob.zombiepig.zpigangry", this.getSoundVolume() * 2.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 1.8F);
    042            }
    043
    044            super.onUpdate();
    045        }
    046
    047        @SideOnly(Side.CLIENT)
    048
    049        /**
    050         * Returns the texture's file path as a String.
    051         */
    052        public String getTexture()
    053        {
    054            return "/mob/pigzombie.png";
    055        }
    056
    057        /**
    058         * Checks if the entity's current position is a valid location to spawn this entity.
    059         */
    060        public boolean getCanSpawnHere()
    061        {
    062            return this.worldObj.difficultySetting > 0 && this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox);
    063        }
    064
    065        /**
    066         * (abstract) Protected helper method to write subclass entity data to NBT.
    067         */
    068        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    069        {
    070            super.writeEntityToNBT(par1NBTTagCompound);
    071            par1NBTTagCompound.setShort("Anger", (short)this.angerLevel);
    072        }
    073
    074        /**
    075         * (abstract) Protected helper method to read subclass entity data from NBT.
    076         */
    077        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    078        {
    079            super.readEntityFromNBT(par1NBTTagCompound);
    080            this.angerLevel = par1NBTTagCompound.getShort("Anger");
    081        }
    082
    083        /**
    084         * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking
    085         * (Animals, Spiders at day, peaceful PigZombies).
    086         */
    087        protected Entity findPlayerToAttack()
    088        {
    089            return this.angerLevel == 0 ? null : super.findPlayerToAttack();
    090        }
    091
    092        /**
    093         * Called when the entity is attacked.
    094         */
    095        public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
    096        {
    097            if (this.func_85032_ar())
    098            {
    099                return false;
    100            }
    101            else
    102            {
    103                Entity var3 = par1DamageSource.getEntity();
    104
    105                if (var3 instanceof EntityPlayer)
    106                {
    107                    List var4 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(32.0D, 32.0D, 32.0D));
    108                    Iterator var5 = var4.iterator();
    109
    110                    while (var5.hasNext())
    111                    {
    112                        Entity var6 = (Entity)var5.next();
    113
    114                        if (var6 instanceof EntityPigZombie)
    115                        {
    116                            EntityPigZombie var7 = (EntityPigZombie)var6;
    117                            var7.becomeAngryAt(var3);
    118                        }
    119                    }
    120
    121                    this.becomeAngryAt(var3);
    122                }
    123
    124                return super.attackEntityFrom(par1DamageSource, par2);
    125            }
    126        }
    127
    128        /**
    129         * Causes this PigZombie to become angry at the supplied Entity (which will be a player).
    130         */
    131        private void becomeAngryAt(Entity par1Entity)
    132        {
    133            this.entityToAttack = par1Entity;
    134            this.angerLevel = 400 + this.rand.nextInt(400);
    135            this.randomSoundDelay = this.rand.nextInt(40);
    136        }
    137
    138        /**
    139         * Returns the sound this mob makes while it's alive.
    140         */
    141        protected String getLivingSound()
    142        {
    143            return "mob.zombiepig.zpig";
    144        }
    145
    146        /**
    147         * Returns the sound this mob makes when it is hurt.
    148         */
    149        protected String getHurtSound()
    150        {
    151            return "mob.zombiepig.zpighurt";
    152        }
    153
    154        /**
    155         * Returns the sound this mob makes on death.
    156         */
    157        protected String getDeathSound()
    158        {
    159            return "mob.zombiepig.zpigdeath";
    160        }
    161
    162        /**
    163         * Drop 0-2 items of this living's type
    164         */
    165        protected void dropFewItems(boolean par1, int par2)
    166        {
    167            int var3 = this.rand.nextInt(2 + par2);
    168            int var4;
    169
    170            for (var4 = 0; var4 < var3; ++var4)
    171            {
    172                this.dropItem(Item.rottenFlesh.shiftedIndex, 1);
    173            }
    174
    175            var3 = this.rand.nextInt(2 + par2);
    176
    177            for (var4 = 0; var4 < var3; ++var4)
    178            {
    179                this.dropItem(Item.goldNugget.shiftedIndex, 1);
    180            }
    181        }
    182
    183        /**
    184         * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
    185         */
    186        public boolean interact(EntityPlayer par1EntityPlayer)
    187        {
    188            return false;
    189        }
    190
    191        protected void dropRareDrop(int par1)
    192        {
    193            this.dropItem(Item.ingotGold.shiftedIndex, 1);
    194        }
    195
    196        /**
    197         * Returns the item ID for the item the mob drops on death.
    198         */
    199        protected int getDropItemId()
    200        {
    201            return Item.rottenFlesh.shiftedIndex;
    202        }
    203
    204        protected void func_82164_bB()
    205        {
    206            this.setCurrentItemOrArmor(0, new ItemStack(Item.swordGold));
    207        }
    208
    209        /**
    210         * Initialize this creature.
    211         */
    212        public void initCreature()
    213        {
    214            super.initCreature();
    215            this.setVillager(false);
    216        }
    217
    218        /**
    219         * Returns the amount of damage a mob should deal.
    220         */
    221        public int getAttackStrength(Entity par1Entity)
    222        {
    223            ItemStack var2 = this.getHeldItem();
    224            int var3 = 5;
    225
    226            if (var2 != null)
    227            {
    228                var3 += var2.getDamageVsEntity(this);
    229            }
    230
    231            return var3;
    232        }
    233    }