From 790568b04d8d122d5fe71388fbd75d1211564446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Miklo=C5=A1?= Date: Wed, 3 Dec 2025 04:01:39 +0100 Subject: [PATCH] feat: divergence and power for the pearl are now gamerules --- src/main/java/systems/brn/tweaks/Tweaks.java | 6 ++ .../brn/tweaks/mixin/EnderPearlItemMixin.java | 57 +++++++++++++++++++ src/main/resources/tweaks.mixins.json | 1 + 3 files changed, 64 insertions(+) create mode 100644 src/main/java/systems/brn/tweaks/mixin/EnderPearlItemMixin.java diff --git a/src/main/java/systems/brn/tweaks/Tweaks.java b/src/main/java/systems/brn/tweaks/Tweaks.java index ccf5cd3..c087fcc 100644 --- a/src/main/java/systems/brn/tweaks/Tweaks.java +++ b/src/main/java/systems/brn/tweaks/Tweaks.java @@ -21,6 +21,12 @@ public class Tweaks implements ModInitializer { public static final GameRules.Key CREEPER_FUSE_TIME = GameRuleRegistry.register("creeperDefaultFuseTime", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(30, 0, Integer.MAX_VALUE)); + public static final GameRules.Key ENDER_PEARL_POWER = + GameRuleRegistry.register("enderPearlPower", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(150, 0, Integer.MAX_VALUE)); + + public static final GameRules.Key ENDER_PEARL_DIVERGENCE = + GameRuleRegistry.register("enderPearlDivergence", GameRules.Category.PLAYER, GameRuleFactory.createIntRule(100, 0, Integer.MAX_VALUE)); + @Override public void onInitialize() { } diff --git a/src/main/java/systems/brn/tweaks/mixin/EnderPearlItemMixin.java b/src/main/java/systems/brn/tweaks/mixin/EnderPearlItemMixin.java new file mode 100644 index 0000000..1f5844e --- /dev/null +++ b/src/main/java/systems/brn/tweaks/mixin/EnderPearlItemMixin.java @@ -0,0 +1,57 @@ +package systems.brn.tweaks.mixin; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.thrown.EnderPearlEntity; +import net.minecraft.item.EnderPearlItem; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +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.CallbackInfoReturnable; +import systems.brn.tweaks.Tweaks; + +@Mixin(EnderPearlItem.class) +public class EnderPearlItemMixin { + + @Inject(method = "use", at = @At("HEAD"), cancellable = true) + private void injectCustomVelocity(World world, PlayerEntity user, Hand hand, + CallbackInfoReturnable cir) { + + if (!(world instanceof ServerWorld serverWorld)) return; + + ItemStack stack = user.getStackInHand(hand); + + float power = serverWorld.getGameRules().getInt(Tweaks.ENDER_PEARL_POWER) / 100f; + float divergence = serverWorld.getGameRules().getInt(Tweaks.ENDER_PEARL_DIVERGENCE) / 100f; + + world.playSound( + null, + user.getX(), + user.getY(), + user.getZ(), + net.minecraft.sound.SoundEvents.ENTITY_ENDER_PEARL_THROW, + net.minecraft.sound.SoundCategory.NEUTRAL, + 0.5F, + 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F) + ); + + net.minecraft.entity.projectile.ProjectileEntity.spawnWithVelocity( + EnderPearlEntity::new, + serverWorld, + stack, + user, + 0f, + power, + divergence + ); + + user.incrementStat(net.minecraft.stat.Stats.USED.getOrCreateStat((EnderPearlItem)(Object)this)); + stack.decrementUnlessCreative(1, user); + + cir.setReturnValue(ActionResult.SUCCESS); + } +} diff --git a/src/main/resources/tweaks.mixins.json b/src/main/resources/tweaks.mixins.json index f193acc..68c00e9 100644 --- a/src/main/resources/tweaks.mixins.json +++ b/src/main/resources/tweaks.mixins.json @@ -6,6 +6,7 @@ "mixins": [ "CreeperEntityMixin", "DontHurtMePearlMixin", + "EnderPearlItemMixin", "JustTeleportAlreadyMixin", "PlayerEntityMixin", "accessors.CreeperEntityAccessor"