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