From 75fed26c3c7025d173342f584e110d52039c715c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Miklo=C5=A1?= Date: Wed, 3 Dec 2025 04:07:54 +0100 Subject: [PATCH] feat: ender eye break chance is a gamerule --- src/main/java/systems/brn/tweaks/Tweaks.java | 3 ++ .../brn/tweaks/mixin/EyeOfEnderMixin.java | 39 +++++++++++++++++++ .../accessors/EyeOfEnderEntityAccessor.java | 11 ++++++ src/main/resources/tweaks.mixins.json | 4 +- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/main/java/systems/brn/tweaks/mixin/EyeOfEnderMixin.java create mode 100644 src/main/java/systems/brn/tweaks/mixin/accessors/EyeOfEnderEntityAccessor.java diff --git a/src/main/java/systems/brn/tweaks/Tweaks.java b/src/main/java/systems/brn/tweaks/Tweaks.java index c087fcc..8604bc6 100644 --- a/src/main/java/systems/brn/tweaks/Tweaks.java +++ b/src/main/java/systems/brn/tweaks/Tweaks.java @@ -27,6 +27,9 @@ public class Tweaks implements ModInitializer { public static final GameRules.Key ENDER_PEARL_DIVERGENCE = GameRuleRegistry.register("enderPearlDivergence", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(100, 0, Integer.MAX_VALUE)); + public static final GameRules.Key ENDER_EYE_POP_CHANCE = + GameRuleRegistry.register("enderEyePopChance", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(20, 0, 100)); + @Override public void onInitialize() { } diff --git a/src/main/java/systems/brn/tweaks/mixin/EyeOfEnderMixin.java b/src/main/java/systems/brn/tweaks/mixin/EyeOfEnderMixin.java new file mode 100644 index 0000000..5343a02 --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/EyeOfEnderMixin.java @@ -0,0 +1,39 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.EyeOfEnderEntity; +import net.minecraft.server.world.ServerWorld; +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.EyeOfEnderEntityAccessor; + +@Mixin(EyeOfEnderEntity.class) +public class EyeOfEnderMixin { + + @Inject( + method = "initTargetPos", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/entity/EyeOfEnderEntity;dropsItem:Z", + ordinal = 0, + shift = At.Shift.AFTER + ) + ) + private void applyCustomBreakChance(CallbackInfo ci) { + EyeOfEnderEntity self = (EyeOfEnderEntity)(Object)this; + World world = self.getWorld(); + + if (!(world instanceof ServerWorld serverWorld)) + return; + + int popChance = serverWorld.getGameRules().getInt(Tweaks.ENDER_EYE_POP_CHANCE); + int roll = self.getRandom().nextInt(100); + + boolean dropsItem = roll >= popChance; + + ((EyeOfEnderEntityAccessor) self).setDropsItem(dropsItem); + } +} \ No newline at end of file diff --git a/src/main/java/systems/brn/tweaks/mixin/accessors/EyeOfEnderEntityAccessor.java b/src/main/java/systems/brn/tweaks/mixin/accessors/EyeOfEnderEntityAccessor.java new file mode 100644 index 0000000..b2e72e6 --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/accessors/EyeOfEnderEntityAccessor.java @@ -0,0 +1,11 @@ +package systems.brn.tweaks.mixin.accessors; + +import net.minecraft.entity.EyeOfEnderEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EyeOfEnderEntity.class) +public interface EyeOfEnderEntityAccessor { + @Accessor("dropsItem") + void setDropsItem(boolean value); +} diff --git a/src/main/resources/tweaks.mixins.json b/src/main/resources/tweaks.mixins.json index 68c00e9..36c8a6d 100644 --- a/src/main/resources/tweaks.mixins.json +++ b/src/main/resources/tweaks.mixins.json @@ -7,9 +7,11 @@ "CreeperEntityMixin", "DontHurtMePearlMixin", "EnderPearlItemMixin", + "EyeOfEnderMixin", "JustTeleportAlreadyMixin", "PlayerEntityMixin", - "accessors.CreeperEntityAccessor" + "accessors.CreeperEntityAccessor", + "accessors.EyeOfEnderEntityAccessor" ], "injectors": { "defaultRequire": 1