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