diff --git a/src/main/java/cam72cam/mod/entity/DamageType.java b/src/main/java/cam72cam/mod/entity/DamageType.java index b651853c..bf081a77 100644 --- a/src/main/java/cam72cam/mod/entity/DamageType.java +++ b/src/main/java/cam72cam/mod/entity/DamageType.java @@ -1,9 +1,53 @@ package cam72cam.mod.entity; -public enum DamageType { - FIRE, - PROJECTILE, - EXPLOSION, - MAGIC, - OTHER, +import cam72cam.mod.resource.Identifier; +import net.minecraft.util.DamageSource; + +import java.util.HashMap; +import java.util.Objects; + +/** + * Damage type wrapper + *

+ * Note that in order to make this work on 1.21.1 and upper, DamageTypes should be treated as constants and created as soon as possible (like CONSTRUCT phase) + */ +public class DamageType { + public static final DamageType FIRE = new DamageType("fire"); + public static final DamageType PROJECTILE = new DamageType("projectile"); + public static final DamageType EXPLOSION = new DamageType("explosion"); + public static final DamageType MAGIC = new DamageType("magic"); + public static final DamageType OTHER = new DamageType("other"); + + private static final HashMap registered = new HashMap<>(); + + public Identifier damageType; + public DamageSource internal; + + public static DamageType getOrCreate(String cause) { + return getOrCreate(new Identifier(cause)); + } + + public static DamageType getOrCreate(Identifier cause) { + return registered.computeIfAbsent(cause, DamageType::new); + } + + private DamageType(String cause) { + this(new Identifier(cause)); + } + + private DamageType(DamageSource source) { + this(new Identifier("minecraft", source.damageType)); + } + + private DamageType(Identifier cause) { + this.damageType = cause; + this.internal = new DamageSource(damageType.internal.toString()); + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + DamageType other = (DamageType) o; + return Objects.equals(damageType, other.damageType); + } } diff --git a/src/main/java/cam72cam/mod/entity/Entity.java b/src/main/java/cam72cam/mod/entity/Entity.java index c6df089a..9e6f460d 100644 --- a/src/main/java/cam72cam/mod/entity/Entity.java +++ b/src/main/java/cam72cam/mod/entity/Entity.java @@ -225,8 +225,8 @@ public float getRidingSoundModifier() { } /** Damage entity directly (bypassing armor) */ - public void directDamage(String msg, double damage) { - internal.attackEntityFrom((new DamageSource(msg)).setDamageBypassesArmor(), (float) damage); + public void directDamage(DamageType type, double damage) { + internal.attackEntityFrom(type.internal.setDamageBypassesArmor(), (float) damage); } protected void createExplosion(Vec3d pos, float size, boolean damageTerrain) {