From f00fcea5510f6a822a8e5c27c8088b97055c3ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Miklo=C5=A1?= Date: Wed, 3 Dec 2025 03:44:51 +0100 Subject: [PATCH] feat: make creeper fuse time a gamerule --- src/main/java/systems/brn/tweaks/Tweaks.java | 3 ++ .../brn/tweaks/mixin/CreeperEntityMixin.java | 29 +++++++++++++++++++ .../accessors/CreeperEntityAccessor.java | 14 +++++++++ src/main/resources/tweaks.mixins.json | 4 ++- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/systems/brn/tweaks/mixin/CreeperEntityMixin.java create mode 100644 src/main/java/systems/brn/tweaks/mixin/accessors/CreeperEntityAccessor.java diff --git a/src/main/java/systems/brn/tweaks/Tweaks.java b/src/main/java/systems/brn/tweaks/Tweaks.java index ce97bd3..ccf5cd3 100644 --- a/src/main/java/systems/brn/tweaks/Tweaks.java +++ b/src/main/java/systems/brn/tweaks/Tweaks.java @@ -18,6 +18,9 @@ public class Tweaks implements ModInitializer { public static final GameRules.Key CRITICAL_MULTIPLIER = GameRuleRegistry.register("criticalHitMultiplier", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(150, 0, Integer.MAX_VALUE)); + public static final GameRules.Key CREEPER_FUSE_TIME = + GameRuleRegistry.register("creeperDefaultFuseTime", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(30, 0, Integer.MAX_VALUE)); + @Override public void onInitialize() { } diff --git a/src/main/java/systems/brn/tweaks/mixin/CreeperEntityMixin.java b/src/main/java/systems/brn/tweaks/mixin/CreeperEntityMixin.java new file mode 100644 index 0000000..e52d5af --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/CreeperEntityMixin.java @@ -0,0 +1,29 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.mob.CreeperEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.GameRules; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import systems.brn.tweaks.Tweaks; +import systems.brn.tweaks.mixin.accessors.CreeperEntityAccessor; + +@Mixin(CreeperEntity.class) +public abstract class CreeperEntityMixin { + @Inject( + method = "", + at = @At("TAIL") + ) + private void onConstructor(EntityType entityType, World world, CallbackInfo ci) { + CreeperEntity creeper = (CreeperEntity)(Object)this; + if (!world.isClient) { + ServerWorld serverWorld = (ServerWorld) world; + GameRules.IntRule rule = serverWorld.getGameRules().get(Tweaks.CREEPER_FUSE_TIME); + ((CreeperEntityAccessor) creeper).setFuseTime(rule.get()); + } + } +} \ No newline at end of file diff --git a/src/main/java/systems/brn/tweaks/mixin/accessors/CreeperEntityAccessor.java b/src/main/java/systems/brn/tweaks/mixin/accessors/CreeperEntityAccessor.java new file mode 100644 index 0000000..17d3462 --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/accessors/CreeperEntityAccessor.java @@ -0,0 +1,14 @@ +package systems.brn.tweaks.mixin.accessors; + +import net.minecraft.entity.mob.CreeperEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(CreeperEntity.class) +public interface CreeperEntityAccessor { + @Accessor("fuseTime") + void setFuseTime(int fuseTime); + + @Accessor("fuseTime") + int getFuseTime(); +} \ No newline at end of file diff --git a/src/main/resources/tweaks.mixins.json b/src/main/resources/tweaks.mixins.json index 0ece2ab..f193acc 100644 --- a/src/main/resources/tweaks.mixins.json +++ b/src/main/resources/tweaks.mixins.json @@ -4,9 +4,11 @@ "package": "systems.brn.tweaks.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "CreeperEntityMixin", "DontHurtMePearlMixin", "JustTeleportAlreadyMixin", - "PlayerEntityMixin" + "PlayerEntityMixin", + "accessors.CreeperEntityAccessor" ], "injectors": { "defaultRequire": 1