001package net.minecraft.util;
002
003import net.minecraft.entity.Entity;
004import net.minecraft.entity.EntityLiving;
005import net.minecraft.entity.player.EntityPlayer;
006import net.minecraft.entity.projectile.EntityArrow;
007import net.minecraft.entity.projectile.EntityFireball;
008import net.minecraft.world.Explosion;
009
010public class DamageSource
011{
012    public static DamageSource inFire = (new DamageSource("inFire")).setFireDamage();
013    public static DamageSource onFire = (new DamageSource("onFire")).setDamageBypassesArmor().setFireDamage();
014    public static DamageSource lava = (new DamageSource("lava")).setFireDamage();
015    public static DamageSource inWall = (new DamageSource("inWall")).setDamageBypassesArmor();
016    public static DamageSource drown = (new DamageSource("drown")).setDamageBypassesArmor();
017    public static DamageSource starve = (new DamageSource("starve")).setDamageBypassesArmor();
018    public static DamageSource cactus = new DamageSource("cactus");
019    public static DamageSource fall = (new DamageSource("fall")).setDamageBypassesArmor();
020    public static DamageSource outOfWorld = (new DamageSource("outOfWorld")).setDamageBypassesArmor().setDamageAllowedInCreativeMode();
021    public static DamageSource generic = (new DamageSource("generic")).setDamageBypassesArmor();
022    public static DamageSource magic = (new DamageSource("magic")).setDamageBypassesArmor().setMagicDamage();
023    public static DamageSource wither = (new DamageSource("wither")).setDamageBypassesArmor();
024    public static DamageSource anvil = new DamageSource("anvil");
025    public static DamageSource fallingBlock = new DamageSource("fallingBlock");
026
027    /** This kind of damage can be blocked or not. */
028    private boolean isUnblockable = false;
029    private boolean isDamageAllowedInCreativeMode = false;
030    private float hungerDamage = 0.3F;
031
032    /** This kind of damage is based on fire or not. */
033    private boolean fireDamage;
034
035    /** This kind of damage is based on a projectile or not. */
036    private boolean projectile;
037
038    /**
039     * Whether this damage source will have its damage amount scaled based on the current difficulty.
040     */
041    private boolean difficultyScaled;
042    private boolean magicDamage = false;
043    private boolean explosion = 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_92087_a(Entity par0Entity)
086    {
087        return (new EntityDamageSource("thorns", par0Entity)).setMagicDamage();
088    }
089
090    public static DamageSource setExplosionSource(Explosion par0Explosion)
091    {
092        return par0Explosion != null && par0Explosion.func_94613_c() != null ? (new EntityDamageSource("explosion.player", par0Explosion.func_94613_c())).setDifficultyScaled().setExplosion() : (new DamageSource("explosion")).setDifficultyScaled().setExplosion();
093    }
094
095    /**
096     * Returns true if the damage is projectile based.
097     */
098    public boolean isProjectile()
099    {
100        return this.projectile;
101    }
102
103    /**
104     * Define the damage type as projectile based.
105     */
106    public DamageSource setProjectile()
107    {
108        this.projectile = true;
109        return this;
110    }
111
112    public boolean isExplosion()
113    {
114        return this.explosion;
115    }
116
117    public DamageSource setExplosion()
118    {
119        this.explosion = true;
120        return this;
121    }
122
123    public boolean isUnblockable()
124    {
125        return this.isUnblockable;
126    }
127
128    /**
129     * How much satiate(food) is consumed by this DamageSource
130     */
131    public float getHungerDamage()
132    {
133        return this.hungerDamage;
134    }
135
136    public boolean canHarmInCreative()
137    {
138        return this.isDamageAllowedInCreativeMode;
139    }
140
141    protected DamageSource(String par1Str)
142    {
143        this.damageType = par1Str;
144    }
145
146    public Entity getSourceOfDamage()
147    {
148        return this.getEntity();
149    }
150
151    public Entity getEntity()
152    {
153        return null;
154    }
155
156    protected DamageSource setDamageBypassesArmor()
157    {
158        this.isUnblockable = true;
159        this.hungerDamage = 0.0F;
160        return this;
161    }
162
163    protected DamageSource setDamageAllowedInCreativeMode()
164    {
165        this.isDamageAllowedInCreativeMode = true;
166        return this;
167    }
168
169    /**
170     * Define the damage type as fire based.
171     */
172    protected DamageSource setFireDamage()
173    {
174        this.fireDamage = true;
175        return this;
176    }
177
178    /**
179     * Returns the message to be displayed on player death.
180     */
181    public String getDeathMessage(EntityLiving par1EntityLiving)
182    {
183        EntityLiving entityliving1 = par1EntityLiving.func_94060_bK();
184        String s = "death.attack." + this.damageType;
185        String s1 = s + ".player";
186        return entityliving1 != null && StatCollector.func_94522_b(s1) ? StatCollector.translateToLocalFormatted(s1, new Object[] {par1EntityLiving.func_96090_ax(), entityliving1.func_96090_ax()}): StatCollector.translateToLocalFormatted(s, new Object[] {par1EntityLiving.func_96090_ax()});
187    }
188
189    /**
190     * Returns true if the damage is fire based.
191     */
192    public boolean isFireDamage()
193    {
194        return this.fireDamage;
195    }
196
197    /**
198     * Return the name of damage type.
199     */
200    public String getDamageType()
201    {
202        return this.damageType;
203    }
204
205    /**
206     * Set whether this damage source will have its damage amount scaled based on the current difficulty.
207     */
208    public DamageSource setDifficultyScaled()
209    {
210        this.difficultyScaled = true;
211        return this;
212    }
213
214    /**
215     * Return whether this damage source will have its damage amount scaled based on the current difficulty.
216     */
217    public boolean isDifficultyScaled()
218    {
219        return this.difficultyScaled;
220    }
221
222    /**
223     * Returns true if the damage is magic based.
224     */
225    public boolean isMagicDamage()
226    {
227        return this.magicDamage;
228    }
229
230    /**
231     * Define the damage type as magic based.
232     */
233    public DamageSource setMagicDamage()
234    {
235        this.magicDamage = true;
236        return this;
237    }
238}