From e1f5e0462f83c0d84e1df880ff31255a94ee75f2 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 7 Nov 2020 15:12:09 +0800 Subject: [PATCH] Hooks for setting radius for explosion --- .../shedaniel/architectury/hooks/ExplosionHooks.java | 6 ++++++ .../hooks/fabric/ExplosionHooksImpl.java | 7 +++++++ .../architectury/mixin/fabric/MixinExplosion.java | 12 +++++++----- .../architectury/hooks/forge/ExplosionHooksImpl.java | 9 +++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/me/shedaniel/architectury/hooks/ExplosionHooks.java b/common/src/main/java/me/shedaniel/architectury/hooks/ExplosionHooks.java index 5f445894..cadf64f1 100644 --- a/common/src/main/java/me/shedaniel/architectury/hooks/ExplosionHooks.java +++ b/common/src/main/java/me/shedaniel/architectury/hooks/ExplosionHooks.java @@ -45,12 +45,18 @@ public final class ExplosionHooks { return IMPL.getRadius(explosion); } + public static void setRadius(Explosion explosion, float radius) { + IMPL.setRadius(explosion, radius); + } + public interface Impl { Vec3 getPosition(Explosion explosion); Entity getSource(Explosion explosion); float getRadius(Explosion explosion); + + void setRadius(Explosion explosion, float radius); } static { diff --git a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/ExplosionHooksImpl.java b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/ExplosionHooksImpl.java index 6e613c06..9aed2cc2 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/ExplosionHooksImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/hooks/fabric/ExplosionHooksImpl.java @@ -37,11 +37,18 @@ public class ExplosionHooksImpl implements ExplosionHooks.Impl { return ((ExplosionExtensions) explosion).architectury_getRadius(); } + @Override + public void setRadius(Explosion explosion, float radius) { + ((ExplosionExtensions) explosion).architectury_setRadius(radius); + } + public interface ExplosionExtensions { Vec3 architectury_getPosition(); Entity architectury_getSource(); float architectury_getRadius(); + + void architectury_setRadius(float v); } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinExplosion.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinExplosion.java index a792d344..d7c60086 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinExplosion.java +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinExplosion.java @@ -24,10 +24,7 @@ import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -43,7 +40,7 @@ public class MixinExplosion implements ExplosionHooksImpl.ExplosionExtensions { @Shadow @Final private double y; @Shadow @Final private double z; @Shadow @Final @Nullable private Entity source; - @Shadow @Final private float radius; + @Shadow @Final @Mutable private float radius; @Unique Vec3 position; @Inject(method = "explode", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;(DDD)V", ordinal = 0), @@ -69,4 +66,9 @@ public class MixinExplosion implements ExplosionHooksImpl.ExplosionExtensions { public float architectury_getRadius() { return radius; } + + @Override + public void architectury_setRadius(float v) { + radius = v; + } } diff --git a/forge/src/main/java/me/shedaniel/architectury/hooks/forge/ExplosionHooksImpl.java b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/ExplosionHooksImpl.java index be87f282..a7efc941 100644 --- a/forge/src/main/java/me/shedaniel/architectury/hooks/forge/ExplosionHooksImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/hooks/forge/ExplosionHooksImpl.java @@ -41,4 +41,13 @@ public class ExplosionHooksImpl implements ExplosionHooks.Impl { throw new RuntimeException(e); } } + + @Override + public void setRadius(Explosion explosion, float v) { + try { + ObfuscationReflectionHelper.findField(Explosion.class, "field_77280_f").set(explosion, v); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } }