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