diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java index 31bbf5379b..61c8671edd 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -27,6 +27,8 @@ public interface CommonConfigAccess { int artifactCooldown(); + int explosionScaling(); + long DEFAULT_DUST_MEDIA_AMOUNT = MediaConstants.DUST_UNIT; long DEFAULT_SHARD_MEDIA_AMOUNT = MediaConstants.SHARD_UNIT; long DEFAULT_CHARGED_MEDIA_AMOUNT = MediaConstants.CRYSTAL_UNIT; @@ -36,6 +38,7 @@ public interface CommonConfigAccess { int DEFAULT_TRINKET_COOLDOWN = 5; int DEFAULT_ARTIFACT_COOLDOWN = 3; + int DEFAULT_EXPLOSION_SCALING = 100; } public interface ClientConfigAccess { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt index 0bed07989c..8ae185013f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/OpExplode.kt @@ -9,6 +9,7 @@ import at.petrak.hexcasting.api.casting.getVec3 import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.misc.MediaConstants import at.petrak.hexcasting.common.casting.actions.selectors.OpGetEntitiesBy +import at.petrak.hexcasting.helper.ExplosionSourceTracker import net.minecraft.core.BlockPos import net.minecraft.util.Mth import net.minecraft.world.level.Level @@ -53,15 +54,20 @@ class OpExplode(val fire: Boolean) : SpellAction { if (!env.canEditBlockAt(BlockPos.containing(pos))) return - env.world.explode( - env.castingEntity, - pos.x, - pos.y, - pos.z, - strength.toFloat(), - this.fire, - Level.ExplosionInteraction.TNT - ) + ExplosionSourceTracker.setSpellSource(true) + try { + env.world.explode( + env.castingEntity, + pos.x, + pos.y, + pos.z, + strength.toFloat(), + this.fire, + Level.ExplosionInteraction.TNT + ) + } finally { + ExplosionSourceTracker.setSpellSource(false) + } } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/helper/ExplosionSourceTracker.java b/Common/src/main/java/at/petrak/hexcasting/helper/ExplosionSourceTracker.java new file mode 100644 index 0000000000..a5bbd422a4 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/helper/ExplosionSourceTracker.java @@ -0,0 +1,13 @@ +package at.petrak.hexcasting.helper; + +public final class ExplosionSourceTracker { + private static final ThreadLocal IS_SPELL_SOURCE = ThreadLocal.withInitial(() -> false); + + public static boolean isSpellSource() { + return IS_SPELL_SOURCE.get(); + } + + public static void setSpellSource(boolean spellSource) { + IS_SPELL_SOURCE.set(spellSource); + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinExplosion.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinExplosion.java new file mode 100644 index 0000000000..9b43864e13 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinExplosion.java @@ -0,0 +1,19 @@ +package at.petrak.hexcasting.mixin; + +import at.petrak.hexcasting.api.mod.HexConfig; +import at.petrak.hexcasting.helper.ExplosionSourceTracker; +import net.minecraft.world.level.Explosion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArgs; +import org.spongepowered.asm.mixin.injection.invoke.arg.Args; + +@Mixin(Explosion.class) +public abstract class MixinExplosion { + @ModifyArgs(method = "explode", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z")) + private void scaleEntityExplosionDamage(Args args) { + if (ExplosionSourceTracker.isSpellSource()) { + args.set(1, (Float) args.get(1) * HexConfig.common().explosionScaling() / 100f); + } + } +} diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index c361c595e5..5c9b007014 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -337,6 +337,10 @@ "": "Artifact Cooldown", "@Tooltip": "Cooldown of an artifact in ticks", }, + explosionScaling: { + "": "Explosion Scaling", + "@Tooltip": "Scaling for entity damage caused by explosion spells in %", + }, }, client: { diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index a70b99261b..9683c3dc83 100644 --- a/Common/src/main/resources/hexplat.mixins.json +++ b/Common/src/main/resources/hexplat.mixins.json @@ -11,6 +11,7 @@ "MixinVillager", "MixinWanderingTrader", "MixinWitch", + "MixinExplosion", "accessor.AccessorAbstractArrow", "accessor.AccessorEntity", "accessor.AccessorLivingEntity", diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java index 8fc4d8465d..996bea3c5a 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java @@ -80,6 +80,8 @@ public static final class Common implements HexConfig.CommonConfigAccess, Config @ConfigEntry.Gui.Tooltip private int artifactCooldown = DEFAULT_ARTIFACT_COOLDOWN; + @ConfigEntry.Gui.Tooltip + private int explosionScaling = DEFAULT_EXPLOSION_SCALING; @Override public void validatePostLoad() throws ValidationException { @@ -123,6 +125,12 @@ public int trinketCooldown() { public int artifactCooldown() { return artifactCooldown; } + + @Override + public int explosionScaling() { + return explosionScaling; + } + } @Config(name = "client") diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java index 510e7eb8b7..027a305c05 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java @@ -23,6 +23,8 @@ public class ForgeHexConfig implements HexConfig.CommonConfigAccess { private static ForgeConfigSpec.IntValue trinketCooldown; private static ForgeConfigSpec.IntValue artifactCooldown; + private static ForgeConfigSpec.IntValue explosionScaling; + public ForgeHexConfig(ForgeConfigSpec.Builder builder) { builder.push("Media Amounts"); dustMediaAmount = builder.comment("How much media a single Amethyst Dust item is worth") @@ -43,6 +45,11 @@ public ForgeHexConfig(ForgeConfigSpec.Builder builder) { artifactCooldown = builder.comment("Cooldown in ticks of a artifact") .defineInRange("artifactCooldown", DEFAULT_ARTIFACT_COOLDOWN, 0, Integer.MAX_VALUE); builder.pop(); + + builder.push("Misc"); + explosionScaling = builder.comment("Scaling for entity damage caused by explosion spells in %") + .defineInRange("explosionScaling", DEFAULT_EXPLOSION_SCALING, 0, Integer.MAX_VALUE); + builder.pop(); } @Override @@ -80,6 +87,11 @@ public int artifactCooldown() { return artifactCooldown.get(); } + @Override + public int explosionScaling() { + return explosionScaling.get(); + } + public static class Client implements HexConfig.ClientConfigAccess { private static ForgeConfigSpec.BooleanValue ctrlTogglesOffStrokeOrder; private static ForgeConfigSpec.BooleanValue disableInworldScrolling;