package net.minecraft.util; import javax.annotation.Nullable; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityFireball; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.translation.I18n; import net.minecraft.world.Explosion; public class DamageSource { public static final DamageSource IN_FIRE = (new DamageSource("inFire")).setFireDamage(); public static final DamageSource LIGHTNING_BOLT = new DamageSource("lightningBolt"); public static final DamageSource ON_FIRE = (new DamageSource("onFire")).setDamageBypassesArmor().setFireDamage(); public static final DamageSource LAVA = (new DamageSource("lava")).setFireDamage(); public static final DamageSource HOT_FLOOR = (new DamageSource("hotFloor")).setFireDamage(); public static final DamageSource IN_WALL = (new DamageSource("inWall")).setDamageBypassesArmor(); public static final DamageSource CRAMMING = (new DamageSource("cramming")).setDamageBypassesArmor(); public static final DamageSource DROWN = (new DamageSource("drown")).setDamageBypassesArmor(); public static final DamageSource STARVE = (new DamageSource("starve")).setDamageBypassesArmor().setDamageIsAbsolute(); public static final DamageSource CACTUS = new DamageSource("cactus"); public static final DamageSource FALL = (new DamageSource("fall")).setDamageBypassesArmor(); public static final DamageSource FLY_INTO_WALL = (new DamageSource("flyIntoWall")).setDamageBypassesArmor(); public static final DamageSource OUT_OF_WORLD = (new DamageSource("outOfWorld")).setDamageBypassesArmor().setDamageAllowedInCreativeMode(); public static final DamageSource GENERIC = (new DamageSource("generic")).setDamageBypassesArmor(); public static final DamageSource MAGIC = (new DamageSource("magic")).setDamageBypassesArmor().setMagicDamage(); public static final DamageSource WITHER = (new DamageSource("wither")).setDamageBypassesArmor(); public static final DamageSource ANVIL = new DamageSource("anvil"); public static final DamageSource FALLING_BLOCK = new DamageSource("fallingBlock"); public static final DamageSource DRAGON_BREATH = (new DamageSource("dragonBreath")).setDamageBypassesArmor(); public static final DamageSource FIREWORKS = (new DamageSource("fireworks")).setExplosion(); /** This kind of damage can be blocked or not. */ private boolean isUnblockable; private boolean isDamageAllowedInCreativeMode; /** Whether or not the damage ignores modification by potion effects or enchantments. */ private boolean damageIsAbsolute; private float hungerDamage = 0.1F; /** This kind of damage is based on fire or not. */ private boolean fireDamage; /** This kind of damage is based on a projectile or not. */ private boolean projectile; /** Whether this damage source will have its damage amount scaled based on the current difficulty. */ private boolean difficultyScaled; /** Whether the damage is magic based. */ private boolean magicDamage; private boolean explosion; public String damageType; public static DamageSource causeMobDamage(EntityLivingBase mob) { return new EntityDamageSource("mob", mob); } public static DamageSource causeIndirectDamage(Entity source, EntityLivingBase indirectEntityIn) { return new EntityDamageSourceIndirect("mob", source, indirectEntityIn); } /** * returns an EntityDamageSource of type player */ public static DamageSource causePlayerDamage(EntityPlayer player) { return new EntityDamageSource("player", player); } /** * returns EntityDamageSourceIndirect of an arrow */ public static DamageSource causeArrowDamage(EntityArrow arrow, @Nullable Entity indirectEntityIn) { return (new EntityDamageSourceIndirect("arrow", arrow, indirectEntityIn)).setProjectile(); } /** * returns EntityDamageSourceIndirect of a fireball */ public static DamageSource causeFireballDamage(EntityFireball fireball, @Nullable Entity indirectEntityIn) { return indirectEntityIn == null ? (new EntityDamageSourceIndirect("onFire", fireball, fireball)).setFireDamage().setProjectile() : (new EntityDamageSourceIndirect("fireball", fireball, indirectEntityIn)).setFireDamage().setProjectile(); } public static DamageSource causeThrownDamage(Entity source, @Nullable Entity indirectEntityIn) { return (new EntityDamageSourceIndirect("thrown", source, indirectEntityIn)).setProjectile(); } public static DamageSource causeIndirectMagicDamage(Entity source, @Nullable Entity indirectEntityIn) { return (new EntityDamageSourceIndirect("indirectMagic", source, indirectEntityIn)).setDamageBypassesArmor().setMagicDamage(); } /** * Returns the EntityDamageSource of the Thorns enchantment */ public static DamageSource causeThornsDamage(Entity source) { return (new EntityDamageSource("thorns", source)).setIsThornsDamage().setMagicDamage(); } public static DamageSource causeExplosionDamage(@Nullable Explosion explosionIn) { return explosionIn != null && explosionIn.getExplosivePlacedBy() != null ? (new EntityDamageSource("explosion.player", explosionIn.getExplosivePlacedBy())).setDifficultyScaled().setExplosion() : (new DamageSource("explosion")).setDifficultyScaled().setExplosion(); } public static DamageSource causeExplosionDamage(@Nullable EntityLivingBase entityLivingBaseIn) { return entityLivingBaseIn != null ? (new EntityDamageSource("explosion.player", entityLivingBaseIn)).setDifficultyScaled().setExplosion() : (new DamageSource("explosion")).setDifficultyScaled().setExplosion(); } /** * Returns true if the damage is projectile based. */ public boolean isProjectile() { return this.projectile; } /** * Define the damage type as projectile based. */ public DamageSource setProjectile() { this.projectile = true; return this; } public boolean isExplosion() { return this.explosion; } public DamageSource setExplosion() { this.explosion = true; return this; } public boolean isUnblockable() { return this.isUnblockable; } /** * How much satiate(food) is consumed by this DamageSource */ public float getHungerDamage() { return this.hungerDamage; } public boolean canHarmInCreative() { return this.isDamageAllowedInCreativeMode; } /** * Whether or not the damage ignores modification by potion effects or enchantments. */ public boolean isDamageAbsolute() { return this.damageIsAbsolute; } public DamageSource(String damageTypeIn) { this.damageType = damageTypeIn; } /** * Retrieves the immediate causer of the damage, e.g. the arrow entity, not its shooter */ @Nullable public Entity getImmediateSource() { return this.getTrueSource(); } /** * Retrieves the true causer of the damage, e.g. the player who fired an arrow, the shulker who fired the bullet, * etc. */ @Nullable public Entity getTrueSource() { return null; } public DamageSource setDamageBypassesArmor() { this.isUnblockable = true; this.hungerDamage = 0.0F; return this; } public DamageSource setDamageAllowedInCreativeMode() { this.isDamageAllowedInCreativeMode = true; return this; } /** * Sets a value indicating whether the damage is absolute (ignores modification by potion effects or enchantments), * and also clears out hunger damage. */ public DamageSource setDamageIsAbsolute() { this.damageIsAbsolute = true; this.hungerDamage = 0.0F; return this; } /** * Define the damage type as fire based. */ public DamageSource setFireDamage() { this.fireDamage = true; return this; } /** * Gets the death message that is displayed when the player dies */ public ITextComponent getDeathMessage(EntityLivingBase entityLivingBaseIn) { EntityLivingBase entitylivingbase = entityLivingBaseIn.getAttackingEntity(); String s = "death.attack." + this.damageType; String s1 = s + ".player"; return entitylivingbase != null && I18n.canTranslate(s1) ? new TextComponentTranslation(s1, new Object[] {entityLivingBaseIn.getDisplayName(), entitylivingbase.getDisplayName()}) : new TextComponentTranslation(s, new Object[] {entityLivingBaseIn.getDisplayName()}); } /** * Returns true if the damage is fire based. */ public boolean isFireDamage() { return this.fireDamage; } /** * Return the name of damage type. */ public String getDamageType() { return this.damageType; } /** * Set whether this damage source will have its damage amount scaled based on the current difficulty. */ public DamageSource setDifficultyScaled() { this.difficultyScaled = true; return this; } /** * Return whether this damage source will have its damage amount scaled based on the current difficulty. */ public boolean isDifficultyScaled() { return this.difficultyScaled; } /** * Returns true if the damage is magic based. */ public boolean isMagicDamage() { return this.magicDamage; } /** * Define the damage type as magic based. */ public DamageSource setMagicDamage() { this.magicDamage = true; return this; } public boolean isCreativePlayer() { Entity entity = this.getTrueSource(); return entity instanceof EntityPlayer && ((EntityPlayer)entity).capabilities.isCreativeMode; } /** * Gets the location from which the damage originates. */ @Nullable public Vec3d getDamageLocation() { return null; } }