From f99845314afad3091ac505019b4d7f29bf5f9470 Mon Sep 17 00:00:00 2001 From: FlorianMichael Date: Thu, 22 Aug 2024 14:11:14 +0200 Subject: [PATCH] Try to improve mod compatibility with port replacement --- .../viafabricplus/fixes/ClientsideFixes.java | 6 +++--- .../visual/EntityRidingOffsetsPre1_20_2.java | 1 - .../integration/MixinMultiplayerScreen.java | 20 +++++++++++-------- .../MixinMultiplayerServerListPinger.java | 7 +++---- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/florianmichael/viafabricplus/fixes/ClientsideFixes.java b/src/main/java/de/florianmichael/viafabricplus/fixes/ClientsideFixes.java index 4f18aed3..ed24ac49 100644 --- a/src/main/java/de/florianmichael/viafabricplus/fixes/ClientsideFixes.java +++ b/src/main/java/de/florianmichael/viafabricplus/fixes/ClientsideFixes.java @@ -171,13 +171,13 @@ public class ClientsideFixes { * @param version The protocol version * @return The server address with the replaced default port */ - public static ServerAddress replaceDefaultPort(final String address, final ProtocolVersion version) { + public static String replaceDefaultPort(final String address, final ProtocolVersion version) { // If the default port for this entry should be replaced, check if the address already contains a port // We can't just replace vanilla's default port because a bedrock server might be running on the same port if (BedrockSettings.global().replaceDefaultPort.getValue() && Objects.equals(version, BedrockProtocolVersion.bedrockLatest) && !address.contains(":")) { - return ServerAddress.parse(address + ":" + ProtocolConstants.BEDROCK_DEFAULT_PORT); + return address + ":" + ProtocolConstants.BEDROCK_DEFAULT_PORT; } else { - return ServerAddress.parse(address); + return address; } } diff --git a/src/main/java/de/florianmichael/viafabricplus/fixes/versioned/visual/EntityRidingOffsetsPre1_20_2.java b/src/main/java/de/florianmichael/viafabricplus/fixes/versioned/visual/EntityRidingOffsetsPre1_20_2.java index 776b08e9..9715eb85 100644 --- a/src/main/java/de/florianmichael/viafabricplus/fixes/versioned/visual/EntityRidingOffsetsPre1_20_2.java +++ b/src/main/java/de/florianmichael/viafabricplus/fixes/versioned/visual/EntityRidingOffsetsPre1_20_2.java @@ -80,7 +80,6 @@ public class EntityRidingOffsetsPre1_20_2 { if (passenger instanceof AnimalEntity) xOffset += 0.2F; } - return new Vec3d(xOffset, yOffset, 0F).rotateY(-(float) (Math.PI / 2)); } } else if (entity instanceof CamelEntity camelEntity) { diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/integration/MixinMultiplayerScreen.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/integration/MixinMultiplayerScreen.java index 44234ab1..c7aa6667 100644 --- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/integration/MixinMultiplayerScreen.java +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/integration/MixinMultiplayerScreen.java @@ -19,7 +19,10 @@ package de.florianmichael.viafabricplus.injection.mixin.base.integration; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import de.florianmichael.viafabricplus.fixes.ClientsideFixes; import de.florianmichael.viafabricplus.injection.access.IServerInfo; import de.florianmichael.viafabricplus.protocoltranslator.ProtocolTranslator; @@ -34,7 +37,6 @@ import net.minecraft.text.Text; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MultiplayerScreen.class) @@ -56,15 +58,17 @@ public abstract class MixinMultiplayerScreen extends Screen { this.addDrawableChild(GeneralSettings.withOrientation(builder, buttonPosition, width, height).build()); } - @Redirect(method = "connect(Lnet/minecraft/client/network/ServerInfo;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;parse(Ljava/lang/String;)Lnet/minecraft/client/network/ServerAddress;")) - private ServerAddress replaceDefaultPort(String address, @Local(argsOnly = true) ServerInfo entry) { - if (((IServerInfo) entry).viaFabricPlus$passedDirectConnectScreen()) { - // If the user has already passed the direct connect screen, we use the target version - return ClientsideFixes.replaceDefaultPort(address, ProtocolTranslator.getTargetVersion()); + @WrapOperation(method = "connect(Lnet/minecraft/client/network/ServerInfo;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;parse(Ljava/lang/String;)Lnet/minecraft/client/network/ServerAddress;")) + private ServerAddress replaceDefaultPort(String address, Operation original, @Local(argsOnly = true) ServerInfo entry) { + final IServerInfo mixinServerInfo = (IServerInfo) entry; + + ProtocolVersion version; + if (mixinServerInfo.viaFabricPlus$passedDirectConnectScreen()) { + version = ProtocolTranslator.getTargetVersion(); } else { - // Otherwise the forced version is used - return ClientsideFixes.replaceDefaultPort(address, ((IServerInfo) entry).viaFabricPlus$forcedVersion()); + version = mixinServerInfo.viaFabricPlus$forcedVersion(); } + return original.call(ClientsideFixes.replaceDefaultPort(address, version)); } } diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/perserverversion/MixinMultiplayerServerListPinger.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/perserverversion/MixinMultiplayerServerListPinger.java index f4a625a8..3efbeec7 100644 --- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/perserverversion/MixinMultiplayerServerListPinger.java +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/perserverversion/MixinMultiplayerServerListPinger.java @@ -32,17 +32,16 @@ import net.minecraft.network.ClientConnection; import net.minecraft.util.profiler.MultiValueDebugSampleLogImpl; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; import java.net.InetSocketAddress; @Mixin(MultiplayerServerListPinger.class) public abstract class MixinMultiplayerServerListPinger { - @Redirect(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;parse(Ljava/lang/String;)Lnet/minecraft/client/network/ServerAddress;")) - private ServerAddress replaceDefaultPort(String address, @Local(argsOnly = true) ServerInfo entry) { + @WrapOperation(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;parse(Ljava/lang/String;)Lnet/minecraft/client/network/ServerAddress;")) + private ServerAddress replaceDefaultPort(String address, Operation original, @Local(argsOnly = true) ServerInfo entry) { // Replace port when pinging the server and the forced version is set - return ClientsideFixes.replaceDefaultPort(address, ((IServerInfo) entry).viaFabricPlus$forcedVersion()); + return original.call(ClientsideFixes.replaceDefaultPort(address, ((IServerInfo) entry).viaFabricPlus$forcedVersion())); } @WrapOperation(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ClientConnection;connect(Ljava/net/InetSocketAddress;ZLnet/minecraft/util/profiler/MultiValueDebugSampleLogImpl;)Lnet/minecraft/network/ClientConnection;"))