From cefdfd7ca6d8d6eaa37999a5168efe10cc947929 Mon Sep 17 00:00:00 2001 From: micvog <41322907+micvog@users.noreply.github.com> Date: Sun, 4 Oct 2026 09:20:27 +0200 Subject: [PATCH] Fix Ring of Far Reach stacking reach on every dimension change (#157) --- .../client/core/proxy/ClientProxy.java | 40 +++++++++++++------ .../common/core/proxy/CommonProxy.java | 7 ++++ .../item/equipment/bauble/ItemReachRing.java | 26 ++++++++++++ 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java b/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java index b42044d5e..144b737a8 100644 --- a/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java +++ b/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java @@ -381,24 +381,38 @@ public class ClientProxy extends CommonProxy { @Override public void setExtraReach(EntityLivingBase entity, float reach) { super.setExtraReach(entity, reach); + IExtendedPlayerController controller = getReachController(entity); + if(controller != null) + controller.setReachDistanceExtension(Math.max(0, controller.getReachDistanceExtension() + reach)); + } + + @Override + public void setClientExtraReach(EntityLivingBase entity, float reach) { + IExtendedPlayerController controller = getReachController(entity); + if(controller != null) + controller.setReachDistanceExtension(Math.max(0, reach)); + } + + private IExtendedPlayerController getReachController(EntityLivingBase entity) { Minecraft mc = Minecraft.getMinecraft(); EntityPlayer player = mc.thePlayer; // Player object might have changed, need to check the UUID. - if(entity.worldObj.isRemote && entity.getUniqueID().equals(player.getUniqueID())) { - if(!(mc.playerController instanceof IExtendedPlayerController)) { - GameType type = ReflectionHelper.getPrivateValue(PlayerControllerMP.class, mc.playerController, LibObfuscation.CURRENT_GAME_TYPE); - NetHandlerPlayClient net = ReflectionHelper.getPrivateValue(PlayerControllerMP.class, mc.playerController, LibObfuscation.NET_CLIENT_HANDLER); - BotaniaPlayerController controller = new BotaniaPlayerController(mc, net); - boolean isFlying = player.capabilities.isFlying; - boolean allowFlying = player.capabilities.allowFlying; - controller.setGameType(type); - player.capabilities.isFlying = isFlying; - player.capabilities.allowFlying = allowFlying; - mc.playerController = controller; - } + if(!entity.worldObj.isRemote || !entity.getUniqueID().equals(player.getUniqueID())) + return null; - ((IExtendedPlayerController) mc.playerController).setReachDistanceExtension(Math.max(0, ((IExtendedPlayerController) mc.playerController).getReachDistanceExtension() + reach)); + if(!(mc.playerController instanceof IExtendedPlayerController)) { + GameType type = ReflectionHelper.getPrivateValue(PlayerControllerMP.class, mc.playerController, LibObfuscation.CURRENT_GAME_TYPE); + NetHandlerPlayClient net = ReflectionHelper.getPrivateValue(PlayerControllerMP.class, mc.playerController, LibObfuscation.NET_CLIENT_HANDLER); + BotaniaPlayerController controller = new BotaniaPlayerController(mc, net); + boolean isFlying = player.capabilities.isFlying; + boolean allowFlying = player.capabilities.allowFlying; + controller.setGameType(type); + player.capabilities.isFlying = isFlying; + player.capabilities.allowFlying = allowFlying; + mc.playerController = controller; } + + return (IExtendedPlayerController) mc.playerController; } @Override diff --git a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java index 24c14e5f4..5a0f60996 100644 --- a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java +++ b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java @@ -256,6 +256,13 @@ public class CommonProxy { ((EntityPlayerMP) entity).theItemInWorldManager.setBlockReachDistance(Math.max(5, ((EntityPlayerMP) entity).theItemInWorldManager.getBlockReachDistance() + reach)); } + /** + * Sets (instead of adds to) the extra reach of the client player. No-op on the server. + */ + public void setClientExtraReach(EntityLivingBase entity, float reach) { + // NO-OP + } + public boolean openWikiPage(World world, Block block, MovingObjectPosition pos) { return false; } diff --git a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemReachRing.java b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemReachRing.java index 4916afa7a..ec661f844 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemReachRing.java +++ b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemReachRing.java @@ -11,10 +11,13 @@ package vazkii.botania.common.item.equipment.bauble; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import vazkii.botania.common.Botania; import vazkii.botania.common.lib.LibItemNames; import baubles.api.BaubleType; +import baubles.api.BaublesApi; public class ItemReachRing extends ItemBauble { @@ -27,6 +30,29 @@ public class ItemReachRing extends ItemBauble { Botania.proxy.setExtraReach(player, 3.5F); } + @Override + public void onPlayerLoad(ItemStack stack, EntityLivingBase player) { + if(player.worldObj.isRemote) { + // Baubles resends all baubles to the client on login and on every dimension change and calls this for each + // of them, but the client keeps its reach extension across dimension changes. Set it instead of adding to it. + Botania.proxy.setClientExtraReach(player, 3.5F * countWornRings(player)); + } else super.onPlayerLoad(stack, player); + } + + private static int countWornRings(EntityLivingBase player) { + if(!(player instanceof EntityPlayer)) + return 0; + + int count = 0; + IInventory baubles = BaublesApi.getBaubles((EntityPlayer) player); + for(int i = 0; i < baubles.getSizeInventory(); i++) { + ItemStack bauble = baubles.getStackInSlot(i); + if(bauble != null && bauble.getItem() instanceof ItemReachRing) + count++; + } + return count; + } + @Override public void onUnequipped(ItemStack stack, EntityLivingBase player) { Botania.proxy.setExtraReach(player, -3.5F);