    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        /**
    082         * Returns true if the damage is projectile based.
    083         */
    084        public boolean isProjectile()
    085        {
    086            return this.projectile;
    087        }
    088
    089        /**
    090         * Define the damage type as projectile based.
    091         */
    092        public DamageSource setProjectile()
    093        {
    094            this.projectile = true;
    095            return this;
    096        }
    097
    098        public boolean isUnblockable()
    099        {
    100            return this.isUnblockable;
    101        }
    102
    103        /**
    104         * How much satiate(food) is consumed by this DamageSource
    105         */
    106        public float getHungerDamage()
    107        {
    108            return this.hungerDamage;
    109        }
    110
    111        public boolean canHarmInCreative()
    112        {
    113            return this.isDamageAllowedInCreativeMode;
    114        }
    115
    116        protected DamageSource(String par1Str)
    117        {
    118            this.damageType = par1Str;
    119        }
    120
    121        public Entity getSourceOfDamage()
    122        {
    123            return this.getEntity();
    124        }
    125
    126        public Entity getEntity()
    127        {
    128            return null;
    129        }
    130
    131        protected DamageSource setDamageBypassesArmor()
    132        {
    133            this.isUnblockable = true;
    134            this.hungerDamage = 0.0F;
    135            return this;
    136        }
    137
    138        protected DamageSource setDamageAllowedInCreativeMode()
    139        {
    140            this.isDamageAllowedInCreativeMode = true;
    141            return this;
    142        }
    143
    144        /**
    145         * Define the damage type as fire based.
    146         */
    147        protected DamageSource setFireDamage()
    148        {
    149            this.fireDamage = true;
    150            return this;
    151        }
    152
    153        /**
    154         * Returns the message to be displayed on player death.
    155         */
    156        public String getDeathMessage(EntityPlayer par1EntityPlayer)
    157        {
    158            return StatCollector.translateToLocalFormatted("death." + this.damageType, new Object[] {par1EntityPlayer.username});
    159        }
    160
    161        /**
    162         * Returns true if the damage is fire based.
    163         */
    164        public boolean isFireDamage()
    165        {
    166            return this.fireDamage;
    167        }
    168
    169        /**
    170         * Return the name of damage type.
    171         */
    172        public String getDamageType()
    173        {
    174            return this.damageType;
    175        }
    176
    177        public DamageSource func_76351_m()
    178        {
    179            this.field_76381_t = true;
    180            return this;
    181        }
    182
    183        public boolean func_76350_n()
    184        {
    185            return this.field_76381_t;
    186        }
    187
    188        /**
    189         * Returns true if the damage is magic based.
    190         */
    191        public boolean isMagicDamage()
    192        {
    193            return this.magicDamage;
    194        }
    195
    196        /**
    197         * Define the damage type as magic based.
    198         */
    199        public DamageSource setMagicDamage()
    200        {
    201            this.magicDamage = true;
    202            return this;
    203        }
    204    }