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