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 }