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