    001package net.minecraft.util;
    002
    003import net.minecraft.entity.Entity;
    004import net.minecraft.entity.EntityLiving;
    005import net.minecraft.entity.player.EntityPlayer;
    006import net.minecraft.entity.projectile.EntityArrow;
    007import net.minecraft.entity.projectile.EntityFireball;
    008import net.minecraft.world.Explosion;
    009
    010public class DamageSource
    011{
    012    public static DamageSource inFire = (new DamageSource("inFire")).setFireDamage();
    013    public static DamageSource onFire = (new DamageSource("onFire")).setDamageBypassesArmor().setFireDamage();
    014    public static DamageSource lava = (new DamageSource("lava")).setFireDamage();
    015    public static DamageSource inWall = (new DamageSource("inWall")).setDamageBypassesArmor();
    016    public static DamageSource drown = (new DamageSource("drown")).setDamageBypassesArmor();
    017    public static DamageSource starve = (new DamageSource("starve")).setDamageBypassesArmor();
    018    public static DamageSource cactus = new DamageSource("cactus");
    019    public static DamageSource fall = (new DamageSource("fall")).setDamageBypassesArmor();
    020    public static DamageSource outOfWorld = (new DamageSource("outOfWorld")).setDamageBypassesArmor().setDamageAllowedInCreativeMode();
    021    public static DamageSource generic = (new DamageSource("generic")).setDamageBypassesArmor();
    022    public static DamageSource magic = (new DamageSource("magic")).setDamageBypassesArmor().setMagicDamage();
    023    public static DamageSource wither = (new DamageSource("wither")).setDamageBypassesArmor();
    024    public static DamageSource anvil = new DamageSource("anvil");
    025    public static DamageSource fallingBlock = new DamageSource("fallingBlock");
    026
    027    /** This kind of damage can be blocked or not. */
    028    private boolean isUnblockable = false;
    029    private boolean isDamageAllowedInCreativeMode = false;
    030    private float hungerDamage = 0.3F;
    031
    032    /** This kind of damage is based on fire or not. */
    033    private boolean fireDamage;
    034
    035    /** This kind of damage is based on a projectile or not. */
    036    private boolean projectile;
    037
    038    /**
    039     * Whether this damage source will have its damage amount scaled based on the current difficulty.
    040     */
    041    private boolean difficultyScaled;
    042    private boolean magicDamage = false;
    043    private boolean explosion = false;
    044    public String damageType;
    045
    046    public static DamageSource causeMobDamage(EntityLiving par0EntityLiving)
    047    {
    048        return new EntityDamageSource("mob", par0EntityLiving);
    049    }
    050
    051    /**
    052     * returns an EntityDamageSource of type player
    053     */
    054    public static DamageSource causePlayerDamage(EntityPlayer par0EntityPlayer)
    055    {
    056        return new EntityDamageSource("player", par0EntityPlayer);
    057    }
    058
    059    /**
    060     * returns EntityDamageSourceIndirect of an arrow
    061     */
    062    public static DamageSource causeArrowDamage(EntityArrow par0EntityArrow, Entity par1Entity)
    063    {
    064        return (new EntityDamageSourceIndirect("arrow", par0EntityArrow, par1Entity)).setProjectile();
    065    }
    066
    067    /**
    068     * returns EntityDamageSourceIndirect of a fireball
    069     */
    070    public static DamageSource causeFireballDamage(EntityFireball par0EntityFireball, Entity par1Entity)
    071    {
    072        return par1Entity == null ? (new EntityDamageSourceIndirect("onFire", par0EntityFireball, par0EntityFireball)).setFireDamage().setProjectile() : (new EntityDamageSourceIndirect("fireball", par0EntityFireball, par1Entity)).setFireDamage().setProjectile();
    073    }
    074
    075    public static DamageSource causeThrownDamage(Entity par0Entity, Entity par1Entity)
    076    {
    077        return (new EntityDamageSourceIndirect("thrown", par0Entity, par1Entity)).setProjectile();
    078    }
    079
    080    public static DamageSource causeIndirectMagicDamage(Entity par0Entity, Entity par1Entity)
    081    {
    082        return (new EntityDamageSourceIndirect("indirectMagic", par0Entity, par1Entity)).setDamageBypassesArmor().setMagicDamage();
    083    }
    084
    085    public static DamageSource func_92087_a(Entity par0Entity)
    086    {
    087        return (new EntityDamageSource("thorns", par0Entity)).setMagicDamage();
    088    }
    089
    090    public static DamageSource setExplosionSource(Explosion par0Explosion)
    091    {
    092        return par0Explosion != null && par0Explosion.func_94613_c() != null ? (new EntityDamageSource("explosion.player", par0Explosion.func_94613_c())).setDifficultyScaled().setExplosion() : (new DamageSource("explosion")).setDifficultyScaled().setExplosion();
    093    }
    094
    095    /**
    096     * Returns true if the damage is projectile based.
    097     */
    098    public boolean isProjectile()
    099    {
    100        return this.projectile;
    101    }
    102
    103    /**
    104     * Define the damage type as projectile based.
    105     */
    106    public DamageSource setProjectile()
    107    {
    108        this.projectile = true;
    109        return this;
    110    }
    111
    112    public boolean isExplosion()
    113    {
    114        return this.explosion;
    115    }
    116
    117    public DamageSource setExplosion()
    118    {
    119        this.explosion = true;
    120        return this;
    121    }
    122
    123    public boolean isUnblockable()
    124    {
    125        return this.isUnblockable;
    126    }
    127
    128    /**
    129     * How much satiate(food) is consumed by this DamageSource
    130     */
    131    public float getHungerDamage()
    132    {
    133        return this.hungerDamage;
    134    }
    135
    136    public boolean canHarmInCreative()
    137    {
    138        return this.isDamageAllowedInCreativeMode;
    139    }
    140
    141    protected DamageSource(String par1Str)
    142    {
    143        this.damageType = par1Str;
    144    }
    145
    146    public Entity getSourceOfDamage()
    147    {
    148        return this.getEntity();
    149    }
    150
    151    public Entity getEntity()
    152    {
    153        return null;
    154    }
    155
    156    protected DamageSource setDamageBypassesArmor()
    157    {
    158        this.isUnblockable = true;
    159        this.hungerDamage = 0.0F;
    160        return this;
    161    }
    162
    163    protected DamageSource setDamageAllowedInCreativeMode()
    164    {
    165        this.isDamageAllowedInCreativeMode = true;
    166        return this;
    167    }
    168
    169    /**
    170     * Define the damage type as fire based.
    171     */
    172    protected DamageSource setFireDamage()
    173    {
    174        this.fireDamage = true;
    175        return this;
    176    }
    177
    178    /**
    179     * Returns the message to be displayed on player death.
    180     */
    181    public String getDeathMessage(EntityLiving par1EntityLiving)
    182    {
    183        EntityLiving entityliving1 = par1EntityLiving.func_94060_bK();
    184        String s = "death.attack." + this.damageType;
    185        String s1 = s + ".player";
    186        return entityliving1 != null && StatCollector.func_94522_b(s1) ? StatCollector.translateToLocalFormatted(s1, new Object[] {par1EntityLiving.func_96090_ax(), entityliving1.func_96090_ax()}): StatCollector.translateToLocalFormatted(s, new Object[] {par1EntityLiving.func_96090_ax()});
    187    }
    188
    189    /**
    190     * Returns true if the damage is fire based.
    191     */
    192    public boolean isFireDamage()
    193    {
    194        return this.fireDamage;
    195    }
    196
    197    /**
    198     * Return the name of damage type.
    199     */
    200    public String getDamageType()
    201    {
    202        return this.damageType;
    203    }
    204
    205    /**
    206     * Set whether this damage source will have its damage amount scaled based on the current difficulty.
    207     */
    208    public DamageSource setDifficultyScaled()
    209    {
    210        this.difficultyScaled = true;
    211        return this;
    212    }
    213
    214    /**
    215     * Return whether this damage source will have its damage amount scaled based on the current difficulty.
    216     */
    217    public boolean isDifficultyScaled()
    218    {
    219        return this.difficultyScaled;
    220    }
    221
    222    /**
    223     * Returns true if the damage is magic based.
    224     */
    225    public boolean isMagicDamage()
    226    {
    227        return this.magicDamage;
    228    }
    229
    230    /**
    231     * Define the damage type as magic based.
    232     */
    233    public DamageSource setMagicDamage()
    234    {
    235        this.magicDamage = true;
    236        return this;
    237    }
    238}