From 9f1a2e2bafd2fa1ef8a546bbc5de34510c0bc4a3 Mon Sep 17 00:00:00 2001 From: FlorianMichael <60033407+FlorianMichael@users.noreply.github.com> Date: Tue, 30 Apr 2024 20:42:50 +0200 Subject: [PATCH] Restructure connecting code and mixins --- .../viaforge/common/ViaForgeCommon.java | 33 +++++++----- .../common/platform/VersionTracker.java | 44 ++++++++++++++++ .../{ => connect}/MixinGuiConnecting_1.java | 31 +++++------ .../MixinNetHandlerLoginClient.java | 7 +-- .../{ => connect}/MixinNetworkManager.java | 33 +++++------- .../{ => connect}/MixinNetworkManager_5.java | 4 +- .../impl/{ => connect}/MixinServerPinger.java | 23 +++------ .../mixin/impl/fixes/MixinEntityPlayerSP.java | 1 + .../resources/mixins.viaforge-mc1122.json | 10 ++-- .../MixinClientLoginNetHandler.java | 7 +-- .../MixinConnectingScreen_1.java | 28 ++++------ .../{ => connect}/MixinNetworkManager.java | 33 +++++------- .../{ => connect}/MixinNetworkManager_1.java | 4 +- .../{ => connect}/MixinServerPinger.java | 23 +++------ .../resources/mixins.viaforge-mc1165.json | 10 ++-- ...ixinClientHandshakePacketListenerImpl.java | 7 +-- .../mixin/connect}/MixinConnectScreen_1.java | 29 ++++------- .../mixin/connect}/MixinConnection.java | 36 ++++++------- .../mixin/connect}/MixinConnection_1.java | 2 +- .../connect}/MixinServerStatusPinger.java | 23 +++------ .../resources/mixins.viaforge-mc1171.json | 12 ++--- ...ixinClientHandshakePacketListenerImpl.java | 7 +-- .../mixin/connect}/MixinConnectScreen_1.java | 29 ++++------- .../mixin/connect}/MixinConnection.java | 36 ++++++------- .../{ => connect}/MixinConnection_1.java | 18 +++---- .../connect}/MixinServerStatusPinger.java | 23 +++------ .../resources/mixins.viaforge-mc1182.json | 10 ++-- ...ixinClientHandshakePacketListenerImpl.java | 7 +-- .../mixin/connect}/MixinConnectScreen_1.java | 35 ++++++------- .../mixin/connect}/MixinConnection.java | 36 ++++++------- .../mixin/connect}/MixinConnection_1.java | 18 +++---- .../connect}/MixinServerStatusPinger.java | 23 +++------ .../resources/mixins.viaforge-mc1194.json | 10 ++-- ...ixinClientHandshakePacketListenerImpl.java | 7 +-- .../mixin/connect/MixinConnectScreen_1.java | 51 +++++++++++++++++++ .../mixin/{ => connect}/MixinConnection.java | 51 +++++-------------- .../mixin/connect}/MixinConnection_1.java | 18 +++---- .../MixinServerStatusPinger.java | 23 +++------ .../resources/mixins.viaforge-mc1204.json | 9 ++-- 39 files changed, 390 insertions(+), 421 deletions(-) create mode 100644 src/main/java/de/florianmichael/viaforge/common/platform/VersionTracker.java rename viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/{ => connect}/MixinGuiConnecting_1.java (54%) rename viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/{ => connect}/MixinNetHandlerLoginClient.java (89%) rename viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/{ => connect}/MixinNetworkManager.java (75%) rename viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/{ => connect}/MixinNetworkManager_5.java (92%) rename viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/{ => connect}/MixinServerPinger.java (71%) rename viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinClientLoginNetHandler.java (89%) rename viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinConnectingScreen_1.java (56%) rename viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinNetworkManager.java (74%) rename viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinNetworkManager_1.java (93%) rename viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinServerPinger.java (72%) rename viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinClientHandshakePacketListenerImpl.java (89%) rename {viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnectScreen_1.java (55%) rename {viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnection.java (75%) rename {viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnection_1.java (97%) rename {viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinServerStatusPinger.java (72%) rename viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinClientHandshakePacketListenerImpl.java (89%) rename {viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnectScreen_1.java (55%) rename {viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnection.java (75%) rename viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinConnection_1.java (62%) rename {viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinServerStatusPinger.java (72%) rename viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinClientHandshakePacketListenerImpl.java (89%) rename {viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnectScreen_1.java (53%) rename {viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnection.java (75%) rename {viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnection_1.java (62%) rename {viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinServerStatusPinger.java (72%) rename viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinClientHandshakePacketListenerImpl.java (89%) create mode 100644 viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java rename viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinConnection.java (61%) rename {viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin => viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect}/MixinConnection_1.java (62%) rename viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/{ => connect}/MixinServerStatusPinger.java (73%) diff --git a/src/main/java/de/florianmichael/viaforge/common/ViaForgeCommon.java b/src/main/java/de/florianmichael/viaforge/common/ViaForgeCommon.java index 569cc3f..9e2bb92 100644 --- a/src/main/java/de/florianmichael/viaforge/common/ViaForgeCommon.java +++ b/src/main/java/de/florianmichael/viaforge/common/ViaForgeCommon.java @@ -29,7 +29,6 @@ import de.florianmichael.viaforge.common.protocoltranslator.ViaForgeVLLoader; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import de.florianmichael.viaforge.common.protocoltranslator.netty.ViaForgeVLLegacyPipeline; import io.netty.channel.Channel; -import io.netty.channel.socket.SocketChannel; import io.netty.util.AttributeKey; import net.raphimc.vialoader.ViaLoader; import net.raphimc.vialoader.impl.platform.*; @@ -50,6 +49,7 @@ public class ViaForgeCommon { private final VFPlatform platform; private ProtocolVersion targetVersion; + private ProtocolVersion previousVersion; private ViaForgeConfig config; @@ -89,19 +89,22 @@ public class ViaForgeCommon { * @param channel the channel to inject the pipeline into */ public void inject(final Channel channel, final VFNetworkManager networkManager) { - if (channel instanceof SocketChannel) { - if (targetVersion.equals(getNativeVersion())) { - return; // Don't inject ViaVersion into pipeline if there is nothing to translate anyway - } - channel.attr(VF_NETWORK_MANAGER).set(networkManager); - - final UserConnection user = new UserConnectionImpl(channel, true); - new ProtocolPipelineImpl(user); - - channel.attr(LOCAL_VIA_USER).set(user); - - channel.pipeline().addLast(new ViaForgeVLLegacyPipeline(user, targetVersion)); + if (networkManager.viaForge$getTrackedVersion().equals(getNativeVersion())) { + return; // Don't inject ViaVersion into pipeline if there is nothing to translate anyway } + channel.attr(VF_NETWORK_MANAGER).set(networkManager); + + final UserConnection user = new UserConnectionImpl(channel, true); + new ProtocolPipelineImpl(user); + + channel.attr(LOCAL_VIA_USER).set(user); + + channel.pipeline().addLast(new ViaForgeVLLegacyPipeline(user, targetVersion)); + channel.closeFuture().addListener(future -> { + if (previousVersion != null) { + restoreVersion(); + } + }); } /** @@ -128,7 +131,11 @@ public class ViaForgeCommon { } public void setTargetVersionSilent(final ProtocolVersion targetVersion) { + final ProtocolVersion oldVersion = this.targetVersion; this.targetVersion = targetVersion; + if (oldVersion != targetVersion) { + previousVersion = oldVersion; + } } public void setTargetVersion(final ProtocolVersion targetVersion) { diff --git a/src/main/java/de/florianmichael/viaforge/common/platform/VersionTracker.java b/src/main/java/de/florianmichael/viaforge/common/platform/VersionTracker.java new file mode 100644 index 0000000..e26d4a8 --- /dev/null +++ b/src/main/java/de/florianmichael/viaforge/common/platform/VersionTracker.java @@ -0,0 +1,44 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * Copyright (C) 2021-2024 FlorianMichael/EnZaXD and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.florianmichael.viaforge.common.platform; + +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import de.florianmichael.viaforge.common.ViaForgeCommon; + +import java.net.InetAddress; +import java.util.HashMap; +import java.util.Map; + +/** + * Dirty, but needed to store the server specific version until building the netty pipeline. + */ +public class VersionTracker { + + public static final Map SERVER_PROTOCOL_VERSIONS = new HashMap<>(); + + public static void storeServerProtocolVersion(InetAddress address, ProtocolVersion version) { + SERVER_PROTOCOL_VERSIONS.put(address, version); + ViaForgeCommon.getManager().setTargetVersionSilent(version); + } + + public static ProtocolVersion getServerProtocolVersion(InetAddress address) { + return SERVER_PROTOCOL_VERSIONS.remove(address); + } + +} diff --git a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinGuiConnecting_1.java b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinGuiConnecting_1.java similarity index 54% rename from viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinGuiConnecting_1.java rename to viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinGuiConnecting_1.java index ac88fbd..7331a70 100644 --- a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinGuiConnecting_1.java +++ b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinGuiConnecting_1.java @@ -16,39 +16,32 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin.impl; +package de.florianmichael.viaforge.mixin.impl.connect; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.Minecraft; -import net.minecraft.network.NetworkManager; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import java.net.InetAddress; +import java.net.UnknownHostException; @Mixin(targets = "net.minecraft.client.multiplayer.GuiConnecting$1") public class MixinGuiConnecting_1 { - @Redirect(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;createNetworkManagerAndConnect(Ljava/net/InetAddress;IZ)Lnet/minecraft/network/NetworkManager;")) - public NetworkManager trackVersion(InetAddress address, int i, boolean b) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - if (Minecraft.getMinecraft().getCurrentServerData() instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) Minecraft.getMinecraft().getCurrentServerData()).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } + @Redirect(method = "run", at = @At(value = "INVOKE", target = "Ljava/net/InetAddress;getByName(Ljava/lang/String;)Ljava/net/InetAddress;")) + public InetAddress trackServerVersion(String s) throws UnknownHostException { + final InetAddress address = InetAddress.getByName(s); + ProtocolVersion version = ((ExtendedServerData) Minecraft.getMinecraft().getCurrentServerData()).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } - - return NetworkManager.createNetworkManagerAndConnect(address, i, b); + VersionTracker.storeServerProtocolVersion(address, version); + return address; } } diff --git a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetHandlerLoginClient.java b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetHandlerLoginClient.java similarity index 89% rename from viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetHandlerLoginClient.java rename to viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetHandlerLoginClient.java index a104edf..2a6cd63 100644 --- a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetHandlerLoginClient.java +++ b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetHandlerLoginClient.java @@ -16,18 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin.impl; +package de.florianmichael.viaforge.mixin.impl.connect; import com.mojang.authlib.GameProfile; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.viaversion.viaversion.api.connection.UserConnection; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import net.minecraft.client.network.NetHandlerLoginClient; import net.minecraft.network.NetworkManager; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.storage.ProtocolMetadataStorage; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -42,7 +42,8 @@ public class MixinNetHandlerLoginClient { @Redirect(method = "handleEncryptionRequest", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/lang/String;)V")) public void onlyJoinServerIfPremium(MinecraftSessionService instance, GameProfile profile, String authenticationToken, String serverId) throws AuthenticationException { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + final VFNetworkManager mixinNetworkManager = (VFNetworkManager) networkManager; + if (mixinNetworkManager.viaForge$getTrackedVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { final UserConnection user = networkManager.channel().attr(ViaForgeCommon.LOCAL_VIA_USER).get(); if (user != null && user.has(ProtocolMetadataStorage.class) && !user.get(ProtocolMetadataStorage.class).authenticate) { // We are in the 1.7 -> 1.6 protocol, so we need to skip the joinServer call diff --git a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetworkManager.java b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetworkManager.java similarity index 75% rename from viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetworkManager.java rename to viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetworkManager.java index bc5a8c2..b14f5e1 100644 --- a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetworkManager.java +++ b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetworkManager.java @@ -16,9 +16,10 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin.impl; +package de.florianmichael.viaforge.mixin.impl.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.platform.VersionTracker; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import io.netty.channel.Channel; import net.minecraft.network.NettyEncryptingDecoder; @@ -26,7 +27,6 @@ import net.minecraft.network.NettyEncryptingEncoder; import net.minecraft.network.NetworkManager; import net.minecraft.util.CryptManager; import net.minecraft.util.LazyLoadBase; -import net.minecraft.util.text.ITextComponent; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialoader.netty.VLLegacyPipeline; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -48,46 +48,39 @@ public class MixinNetworkManager implements VFNetworkManager { @Shadow private Channel channel; + @Shadow private boolean isEncrypted; @Unique private Cipher viaForge$decryptionCipher; @Unique private ProtocolVersion viaForge$targetVersion; - @Inject(method = "createNetworkManagerAndConnect", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) - private static void trackSelfTarget(InetAddress address, int serverPort, boolean useNativeTransport, CallbackInfoReturnable cir, NetworkManager networkmanager, Class oclass, LazyLoadBase lazyloadbase) { - // The connecting screen and server pinger are setting the main target version when a specific version for a server is set, - // This works for joining perfect since we can simply restore the version when the server doesn't have a specific one set, - // but for the server pinger we need to store the target version and force the pinging to use the target version. - // Due to the fact that the server pinger is being called multiple times. - ((VFNetworkManager) networkmanager).viaForge$setTrackedVersion(ViaForgeCommon.getManager().getTargetVersion()); + @Inject(method = "setCompressionThreshold", at = @At("RETURN")) + public void reorderPipeline(int p_setCompressionTreshold_1_, CallbackInfo ci) { + ViaForgeCommon.getManager().reorderCompression(channel); } @Inject(method = "enableEncryption", at = @At("HEAD"), cancellable = true) private void storeEncryptionCiphers(SecretKey key, CallbackInfo ci) { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + if (viaForge$targetVersion != null && viaForge$targetVersion.olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { // Minecraft's encryption code is bad for us, we need to reorder the pipeline ci.cancel(); - // Minecraft 1.6.4 supports tile encryption which means the server can only disable one side of the encryption + // Minecraft 1.6.4 supports tile encryption which means the server can only enable one side of the encryption // So we only enable the encryption side and later enable the decryption side if the 1.7 -> 1.6 protocol // tells us to do, therefore we need to store the cipher instance. this.viaForge$decryptionCipher = CryptManager.createNetCipherInstance(2, key); // Enabling the encryption side + this.isEncrypted = true; this.channel.pipeline().addBefore(VLLegacyPipeline.VIALEGACY_PRE_NETTY_LENGTH_REMOVER_NAME, "encrypt", new NettyEncryptingEncoder(CryptManager.createNetCipherInstance(1, key))); } } - @Inject(method = "closeChannel", at = @At("HEAD")) - public void restoreTargetVersion(ITextComponent message, CallbackInfo ci) { - // If the previous server forced a version, we need to restore the version to the default one. - ViaForgeCommon.getManager().restoreVersion(); - } - - @Inject(method = "setCompressionThreshold", at = @At("RETURN")) - public void reorderPipeline(int p_setCompressionTreshold_1_, CallbackInfo ci) { - ViaForgeCommon.getManager().reorderCompression(channel); + @Inject(method = "createNetworkManagerAndConnect", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) + private static void setTargetVersion(InetAddress address, int serverPort, boolean useNativeTransport, CallbackInfoReturnable cir, NetworkManager networkmanager, Class oclass, LazyLoadBase lazyloadbase) { + final VFNetworkManager mixinNetworkManager = (VFNetworkManager) networkmanager; + mixinNetworkManager.viaForge$setTrackedVersion(VersionTracker.getServerProtocolVersion(address)); } @Override diff --git a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetworkManager_5.java b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetworkManager_5.java similarity index 92% rename from viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetworkManager_5.java rename to viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetworkManager_5.java index 3e8e125..121aa75 100644 --- a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinNetworkManager_5.java +++ b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinNetworkManager_5.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin.impl; +package de.florianmichael.viaforge.mixin.impl.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; @@ -35,7 +35,7 @@ public class MixinNetworkManager_5 { NetworkManager val$networkmanager; @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false) - private void onInitChannel(Channel channel, CallbackInfo ci) { + private void hookViaPipeline(Channel channel, CallbackInfo ci) { ViaForgeCommon.getManager().inject(channel, (VFNetworkManager) val$networkmanager); } diff --git a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinServerPinger.java b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinServerPinger.java similarity index 71% rename from viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinServerPinger.java rename to viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinServerPinger.java index 69fed6b..5dffb1e 100644 --- a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/MixinServerPinger.java +++ b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/connect/MixinServerPinger.java @@ -16,11 +16,12 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin.impl; +package de.florianmichael.viaforge.mixin.impl.connect; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.network.ServerPinger; import net.minecraft.network.NetworkManager; @@ -46,22 +47,12 @@ public class MixinServerPinger { @Redirect(method = "ping", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;createNetworkManagerAndConnect(Ljava/net/InetAddress;IZ)Lnet/minecraft/network/NetworkManager;")) public NetworkManager trackVersion(InetAddress address, int i, boolean b) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - - if (viaForge$serverData instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - - viaForge$serverData = null; + ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } + VersionTracker.storeServerProtocolVersion(address, version); + viaForge$serverData = null; return NetworkManager.createNetworkManagerAndConnect(address, i, b); } diff --git a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/fixes/MixinEntityPlayerSP.java b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/fixes/MixinEntityPlayerSP.java index e4e778e..4ce66d1 100644 --- a/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/fixes/MixinEntityPlayerSP.java +++ b/viaforge-mc1122/src/main/java/de/florianmichael/viaforge/mixin/impl/fixes/MixinEntityPlayerSP.java @@ -40,6 +40,7 @@ public class MixinEntityPlayerSP extends AbstractClientPlayer { @Redirect(method = "onUpdateWalkingPlayer", at = @At(value = "FIELD", target = "Lnet/minecraft/client/entity/EntityPlayerSP;prevOnGround:Z", ordinal = 0)) public boolean emulateIdlePacket(EntityPlayerSP instance) { + System.out.println(ViaForgeCommon.getManager().getTargetVersion()); if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(ProtocolVersion.v1_8)) { // <= 1.8 spams the idle packet instead of only sending it when the ground state changes // So we invert the original logic: diff --git a/viaforge-mc1122/src/main/resources/mixins.viaforge-mc1122.json b/viaforge-mc1122/src/main/resources/mixins.viaforge-mc1122.json index b6d2ace..ff30943 100644 --- a/viaforge-mc1122/src/main/resources/mixins.viaforge-mc1122.json +++ b/viaforge-mc1122/src/main/resources/mixins.viaforge-mc1122.json @@ -5,17 +5,17 @@ "package": "de.florianmichael.viaforge.mixin.impl", "refmap": "mixins.viaforge-mc1122.refmap.json", "client": [ - "MixinGuiConnecting_1", + "connect.MixinGuiConnecting_1", "MixinGuiMainMenu", "MixinGuiMultiplayer", "MixinGuiOverlayDebug", "MixinGuiScreenAddServer", "MixinGuiScreenServerList", - "MixinNetHandlerLoginClient", - "MixinNetworkManager", - "MixinNetworkManager_5", + "connect.MixinNetHandlerLoginClient", + "connect.MixinNetworkManager", + "connect.MixinNetworkManager_5", "MixinServerData", - "MixinServerPinger", + "connect.MixinServerPinger", "fixes.MixinEntityPlayerSP" ], "verbose": true diff --git a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinClientLoginNetHandler.java b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientLoginNetHandler.java similarity index 89% rename from viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinClientLoginNetHandler.java rename to viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientLoginNetHandler.java index 4083ba7..6bfd5a9 100644 --- a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinClientLoginNetHandler.java +++ b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientLoginNetHandler.java @@ -16,18 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import com.mojang.authlib.GameProfile; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.viaversion.viaversion.api.connection.UserConnection; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import net.minecraft.client.network.login.ClientLoginNetHandler; import net.minecraft.network.NetworkManager; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.storage.ProtocolMetadataStorage; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -42,7 +42,8 @@ public class MixinClientLoginNetHandler { @Redirect(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/lang/String;)V")) public void onlyJoinServerIfPremium(MinecraftSessionService instance, GameProfile profile, String authenticationToken, String serverId) throws AuthenticationException { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + if (mixinConnection.viaForge$getTrackedVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { final UserConnection user = connection.channel().attr(ViaForgeCommon.LOCAL_VIA_USER).get(); if (user != null && user.has(ProtocolMetadataStorage.class) && !user.get(ProtocolMetadataStorage.class).authenticate) { // We are in the 1.7 -> 1.6 protocol, so we need to skip the joinServer call diff --git a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectingScreen_1.java b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectingScreen_1.java similarity index 56% rename from viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectingScreen_1.java rename to viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectingScreen_1.java index ac01fc0..506d690 100644 --- a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectingScreen_1.java +++ b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectingScreen_1.java @@ -16,10 +16,11 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.Minecraft; import net.minecraft.network.NetworkManager; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -28,27 +29,20 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import java.net.InetAddress; +import java.net.UnknownHostException; @Mixin(targets = "net.minecraft.client.gui.screen.ConnectingScreen$1") public class MixinConnectingScreen_1 { - @Redirect(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;connectToServer(Ljava/net/InetAddress;IZ)Lnet/minecraft/network/NetworkManager;")) - public NetworkManager trackVersion(InetAddress address, int i, boolean b) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - if (Minecraft.getInstance().getCurrentServer() instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } + @Redirect(method = "run", at = @At(value = "INVOKE", target = "Ljava/net/InetAddress;getByName(Ljava/lang/String;)Ljava/net/InetAddress;")) + public InetAddress trackServerVersion(String s) throws UnknownHostException { + final InetAddress address = InetAddress.getByName(s); + ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } - - return NetworkManager.connectToServer(address, i, b); + VersionTracker.storeServerProtocolVersion(address, version); + return address; } } diff --git a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager.java b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinNetworkManager.java similarity index 74% rename from viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager.java rename to viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinNetworkManager.java index b54aac9..c08d5ac 100644 --- a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager.java +++ b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinNetworkManager.java @@ -16,16 +16,16 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.platform.VersionTracker; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import io.netty.channel.Channel; import net.minecraft.network.NettyEncryptingDecoder; import net.minecraft.network.NettyEncryptingEncoder; import net.minecraft.network.NetworkManager; import net.minecraft.util.LazyValue; -import net.minecraft.util.text.ITextComponent; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialoader.netty.VLLegacyPipeline; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -46,46 +46,39 @@ public class MixinNetworkManager implements VFNetworkManager { @Shadow private Channel channel; + @Shadow private boolean encrypted; @Unique private Cipher viaForge$decryptionCipher; @Unique private ProtocolVersion viaForge$targetVersion; - @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) - private static void trackSelfTarget(InetAddress p_181124_0_, int p_181124_1_, boolean p_181124_2_, CallbackInfoReturnable cir, NetworkManager networkmanager, Class oclass, LazyValue lazyvalue) { - // The connecting screen and server pinger are setting the main target version when a specific version for a server is set, - // This works for joining perfect since we can simply restore the version when the server doesn't have a specific one set, - // but for the server pinger we need to store the target version and force the pinging to use the target version. - // Due to the fact that the server pinger is being called multiple times. - ((VFNetworkManager) networkmanager).viaForge$setTrackedVersion(ViaForgeCommon.getManager().getTargetVersion()); + @Inject(method = "setupCompression", at = @At("RETURN")) + public void reorderPipeline(int p_setCompressionTreshold_1_, CallbackInfo ci) { + ViaForgeCommon.getManager().reorderCompression(channel); } @Inject(method = "setEncryptionKey", at = @At("HEAD"), cancellable = true) private void storeEncryptionCiphers(Cipher p_244777_1_, Cipher p_244777_2_, CallbackInfo ci) { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + if (viaForge$targetVersion != null && viaForge$targetVersion.olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { // Minecraft's encryption code is bad for us, we need to reorder the pipeline ci.cancel(); - // Minecraft 1.6.4 supports tile encryption which means the server can only disable one side of the encryption + // Minecraft 1.6.4 supports tile encryption which means the server can only enable one side of the encryption // So we only enable the encryption side and later enable the decryption side if the 1.7 -> 1.6 protocol // tells us to do, therefore we need to store the cipher instance. this.viaForge$decryptionCipher = p_244777_1_; // Enabling the encryption side + this.encrypted = true; this.channel.pipeline().addBefore(VLLegacyPipeline.VIALEGACY_PRE_NETTY_LENGTH_REMOVER_NAME, "encrypt", new NettyEncryptingEncoder(p_244777_2_)); } } - @Inject(method = "disconnect", at = @At("HEAD")) - public void restoreTargetVersion(ITextComponent p_150718_1_, CallbackInfo ci) { - // If the previous server forced a version, we need to restore the version to the default one. - ViaForgeCommon.getManager().restoreVersion(); - } - - @Inject(method = "setupCompression", at = @At("RETURN")) - public void reorderPipeline(int p_setCompressionTreshold_1_, CallbackInfo ci) { - ViaForgeCommon.getManager().reorderCompression(channel); + @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) + private static void setTargetVersion(InetAddress address, int serverPort, boolean useNativeTransport, CallbackInfoReturnable cir, NetworkManager networkmanager, Class oclass, LazyValue lazyvalue) { + final VFNetworkManager mixinNetworkManager = (VFNetworkManager) networkmanager; + mixinNetworkManager.viaForge$setTrackedVersion(VersionTracker.getServerProtocolVersion(address)); } @Override diff --git a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager_1.java b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinNetworkManager_1.java similarity index 93% rename from viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager_1.java rename to viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinNetworkManager_1.java index d703544..5c01288 100644 --- a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager_1.java +++ b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinNetworkManager_1.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; @@ -37,7 +37,7 @@ public class MixinNetworkManager_1 { NetworkManager val$networkmanager; @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false) - private void onInitChannel(Channel channel, CallbackInfo ci) { + private void hookViaPipeline(Channel channel, CallbackInfo ci) { ViaForgeCommon.getManager().inject(channel, (VFNetworkManager) val$networkmanager); } diff --git a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinServerPinger.java b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerPinger.java similarity index 72% rename from viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinServerPinger.java rename to viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerPinger.java index 963e1a8..3fafedd 100644 --- a/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/MixinServerPinger.java +++ b/viaforge-mc1165/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerPinger.java @@ -16,10 +16,11 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.network.ServerPinger; import net.minecraft.network.NetworkManager; @@ -46,22 +47,12 @@ public class MixinServerPinger { @Redirect(method = "pingServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkManager;connectToServer(Ljava/net/InetAddress;IZ)Lnet/minecraft/network/NetworkManager;")) public NetworkManager trackVersion(InetAddress address, int i, boolean b) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - - if (viaForge$serverData instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - - viaForge$serverData = null; + ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } + VersionTracker.storeServerProtocolVersion(address, version); + viaForge$serverData = null; return NetworkManager.connectToServer(address, i, b); } diff --git a/viaforge-mc1165/src/main/resources/mixins.viaforge-mc1165.json b/viaforge-mc1165/src/main/resources/mixins.viaforge-mc1165.json index e27effe..070fbee 100644 --- a/viaforge-mc1165/src/main/resources/mixins.viaforge-mc1165.json +++ b/viaforge-mc1165/src/main/resources/mixins.viaforge-mc1165.json @@ -5,16 +5,16 @@ "package": "de.florianmichael.viaforge.mixin", "client": [ "MixinAddServerScreen", - "MixinClientLoginNetHandler", - "MixinConnectingScreen_1", + "connect.MixinClientLoginNetHandler", + "connect.MixinConnectingScreen_1", "MixinDebugOverlayGui", "MixinMainMenuScreen", "MixinMultiplayerScreen", - "MixinNetworkManager", - "MixinNetworkManager_1", + "connect.MixinNetworkManager", + "connect.MixinNetworkManager_1", "MixinServerData", "MixinServerListScreen", - "MixinServerPinger", + "connect.MixinServerPinger", "fixes.MixinClientPlayerEntity" ], "injectors": { diff --git a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java similarity index 89% rename from viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java rename to viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java index dad35ad..dfd8e88 100644 --- a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java +++ b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java @@ -16,18 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import com.mojang.authlib.GameProfile; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.viaversion.viaversion.api.connection.UserConnection; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl; import net.minecraft.network.Connection; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.storage.ProtocolMetadataStorage; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -42,7 +42,8 @@ public class MixinClientHandshakePacketListenerImpl { @Redirect(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/lang/String;)V")) public void onlyJoinServerIfPremium(MinecraftSessionService instance, GameProfile profile, String authenticationToken, String serverId) throws AuthenticationException { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + if (mixinConnection.viaForge$getTrackedVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { final UserConnection user = connection.channel().attr(ViaForgeCommon.LOCAL_VIA_USER).get(); if (user != null && user.has(ProtocolMetadataStorage.class) && !user.get(ProtocolMetadataStorage.class).authenticate) { // We are in the 1.7 -> 1.6 protocol, so we need to skip the joinServer call diff --git a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java similarity index 55% rename from viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java rename to viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java index 68d4da4..476b268 100644 --- a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java +++ b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java @@ -16,39 +16,32 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.Minecraft; -import net.minecraft.network.Connection; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import java.net.InetSocketAddress; +import java.util.Optional; @Mixin(targets = "net.minecraft.client.gui.screens.ConnectScreen$1") public class MixinConnectScreen_1 { - @Redirect(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;connectToServer(Ljava/net/InetSocketAddress;Z)Lnet/minecraft/network/Connection;")) - public Connection trackVersion(InetSocketAddress oclass, boolean lazyloadedvalue) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - if (Minecraft.getInstance().getCurrentServer() instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } + @Redirect(method = "run", at = @At(value = "INVOKE", target = "Ljava/util/Optional;get()Ljava/lang/Object;")) + public Object trackServerVersion(Optional instance) { + final InetSocketAddress address = (InetSocketAddress) instance.get(); + ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } - - return Connection.connectToServer(oclass, lazyloadedvalue); + VersionTracker.storeServerProtocolVersion(address.getAddress(), version); + return address; } } diff --git a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java similarity index 75% rename from viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java rename to viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java index 12f98b1..bee94ed 100644 --- a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java +++ b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java @@ -16,15 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.platform.VersionTracker; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import io.netty.channel.Channel; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.socket.SocketChannel; import net.minecraft.network.CipherDecoder; import net.minecraft.network.CipherEncoder; import net.minecraft.network.Connection; -import net.minecraft.network.chat.Component; +import net.minecraft.util.LazyLoadedValue; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialoader.netty.VLLegacyPipeline; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -45,46 +48,39 @@ public class MixinConnection implements VFNetworkManager { @Shadow private Channel channel; + @Shadow private boolean encrypted; @Unique private Cipher viaForge$decryptionCipher; @Unique private ProtocolVersion viaForge$targetVersion; - @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) - private static void trackSelfTarget(InetSocketAddress p_178301_, boolean p_178302_, CallbackInfoReturnable cir, final Connection connection) { - // The connecting screen and server pinger are setting the main target version when a specific version for a server is set, - // This works for joining perfect since we can simply restore the version when the server doesn't have a specific one set, - // but for the server pinger we need to store the target version and force the pinging to use the target version. - // Due to the fact that the server pinger is being called multiple times. - ((VFNetworkManager) connection).viaForge$setTrackedVersion(ViaForgeCommon.getManager().getTargetVersion()); + @Inject(method = "setupCompression", at = @At("RETURN")) + public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { + ViaForgeCommon.getManager().reorderCompression(channel); } @Inject(method = "setEncryptionKey", at = @At("HEAD"), cancellable = true) private void storeEncryptionCiphers(Cipher p_244777_1_, Cipher p_244777_2_, CallbackInfo ci) { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + if (viaForge$targetVersion != null && viaForge$targetVersion.olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { // Minecraft's encryption code is bad for us, we need to reorder the pipeline ci.cancel(); - // Minecraft 1.6.4 supports tile encryption which means the server can only disable one side of the encryption + // Minecraft 1.6.4 supports tile encryption which means the server can only enable one side of the encryption // So we only enable the encryption side and later enable the decryption side if the 1.7 -> 1.6 protocol // tells us to do, therefore we need to store the cipher instance. this.viaForge$decryptionCipher = p_244777_1_; // Enabling the encryption side + this.encrypted = true; this.channel.pipeline().addBefore(VLLegacyPipeline.VIALEGACY_PRE_NETTY_LENGTH_REMOVER_NAME, "encrypt", new CipherEncoder(p_244777_2_)); } } - @Inject(method = "disconnect", at = @At("HEAD")) - public void restoreTargetVersion(Component p_129508_, CallbackInfo ci) { - // If the previous server forced a version, we need to restore the version to the default one. - ViaForgeCommon.getManager().restoreVersion(); - } - - @Inject(method = "setupCompression", at = @At("RETURN")) - public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { - ViaForgeCommon.getManager().reorderCompression(channel); + @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) + private static void setTargetVersion(InetSocketAddress p_178301_, boolean p_178302_, CallbackInfoReturnable cir, Connection connection, Class oclass, LazyLoadedValue lazyloadedvalue) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + mixinConnection.viaForge$setTrackedVersion(VersionTracker.getServerProtocolVersion(p_178301_.getAddress())); } @Override diff --git a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java similarity index 97% rename from viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java rename to viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java index 4cb9628..8e0e567 100644 --- a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java +++ b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; diff --git a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java similarity index 72% rename from viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java rename to viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java index 3f175c4..76d0a7c 100644 --- a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java +++ b/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java @@ -16,10 +16,11 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerStatusPinger; import net.minecraft.network.Connection; @@ -46,22 +47,12 @@ public class MixinServerStatusPinger { @Redirect(method = "pingServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;connectToServer(Ljava/net/InetSocketAddress;Z)Lnet/minecraft/network/Connection;")) public Connection trackVersion(InetSocketAddress oclass, boolean lazyloadedvalue) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - - if (viaForge$serverData instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - - viaForge$serverData = null; + ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } + VersionTracker.storeServerProtocolVersion(oclass.getAddress(), version); + viaForge$serverData = null; return Connection.connectToServer(oclass, lazyloadedvalue); } diff --git a/viaforge-mc1171/src/main/resources/mixins.viaforge-mc1171.json b/viaforge-mc1171/src/main/resources/mixins.viaforge-mc1171.json index 8f8cd90..a49cf02 100644 --- a/viaforge-mc1171/src/main/resources/mixins.viaforge-mc1171.json +++ b/viaforge-mc1171/src/main/resources/mixins.viaforge-mc1171.json @@ -4,19 +4,19 @@ "compatibilityLevel": "JAVA_8", "package": "de.florianmichael.viaforge.mixin", "client": [ - "MixinClientHandshakePacketListenerImpl", - "MixinConnection", - "MixinConnection_1", + "connect.MixinClientHandshakePacketListenerImpl", + "connect.MixinConnection", + "connect.MixinConnection_1", "MixinDebugScreenOverlay", "MixinDirectJoinServerScreen", "MixinEditServerScreen", "MixinJoinMultiplayerScreen", "MixinServerData", - "MixinServerStatusPinger", + "connect.MixinServerStatusPinger", "MixinTitleScreen", "fixes.MixinLocalPlayer", - "MixinConnection_1", - "MixinConnectScreen_1" + "connect.MixinConnection_1", + "connect.MixinConnectScreen_1" ], "injectors": { "defaultRequire": 1 diff --git a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java similarity index 89% rename from viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java rename to viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java index dad35ad..dfd8e88 100644 --- a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java +++ b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java @@ -16,18 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import com.mojang.authlib.GameProfile; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.viaversion.viaversion.api.connection.UserConnection; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl; import net.minecraft.network.Connection; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.storage.ProtocolMetadataStorage; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -42,7 +42,8 @@ public class MixinClientHandshakePacketListenerImpl { @Redirect(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/lang/String;)V")) public void onlyJoinServerIfPremium(MinecraftSessionService instance, GameProfile profile, String authenticationToken, String serverId) throws AuthenticationException { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + if (mixinConnection.viaForge$getTrackedVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { final UserConnection user = connection.channel().attr(ViaForgeCommon.LOCAL_VIA_USER).get(); if (user != null && user.has(ProtocolMetadataStorage.class) && !user.get(ProtocolMetadataStorage.class).authenticate) { // We are in the 1.7 -> 1.6 protocol, so we need to skip the joinServer call diff --git a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java similarity index 55% rename from viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java rename to viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java index 68d4da4..476b268 100644 --- a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java +++ b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java @@ -16,39 +16,32 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.Minecraft; -import net.minecraft.network.Connection; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import java.net.InetSocketAddress; +import java.util.Optional; @Mixin(targets = "net.minecraft.client.gui.screens.ConnectScreen$1") public class MixinConnectScreen_1 { - @Redirect(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;connectToServer(Ljava/net/InetSocketAddress;Z)Lnet/minecraft/network/Connection;")) - public Connection trackVersion(InetSocketAddress oclass, boolean lazyloadedvalue) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - if (Minecraft.getInstance().getCurrentServer() instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } + @Redirect(method = "run", at = @At(value = "INVOKE", target = "Ljava/util/Optional;get()Ljava/lang/Object;")) + public Object trackServerVersion(Optional instance) { + final InetSocketAddress address = (InetSocketAddress) instance.get(); + ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } - - return Connection.connectToServer(oclass, lazyloadedvalue); + VersionTracker.storeServerProtocolVersion(address.getAddress(), version); + return address; } } diff --git a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java similarity index 75% rename from viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java rename to viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java index 12f98b1..bee94ed 100644 --- a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java +++ b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java @@ -16,15 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.platform.VersionTracker; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import io.netty.channel.Channel; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.socket.SocketChannel; import net.minecraft.network.CipherDecoder; import net.minecraft.network.CipherEncoder; import net.minecraft.network.Connection; -import net.minecraft.network.chat.Component; +import net.minecraft.util.LazyLoadedValue; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialoader.netty.VLLegacyPipeline; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -45,46 +48,39 @@ public class MixinConnection implements VFNetworkManager { @Shadow private Channel channel; + @Shadow private boolean encrypted; @Unique private Cipher viaForge$decryptionCipher; @Unique private ProtocolVersion viaForge$targetVersion; - @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) - private static void trackSelfTarget(InetSocketAddress p_178301_, boolean p_178302_, CallbackInfoReturnable cir, final Connection connection) { - // The connecting screen and server pinger are setting the main target version when a specific version for a server is set, - // This works for joining perfect since we can simply restore the version when the server doesn't have a specific one set, - // but for the server pinger we need to store the target version and force the pinging to use the target version. - // Due to the fact that the server pinger is being called multiple times. - ((VFNetworkManager) connection).viaForge$setTrackedVersion(ViaForgeCommon.getManager().getTargetVersion()); + @Inject(method = "setupCompression", at = @At("RETURN")) + public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { + ViaForgeCommon.getManager().reorderCompression(channel); } @Inject(method = "setEncryptionKey", at = @At("HEAD"), cancellable = true) private void storeEncryptionCiphers(Cipher p_244777_1_, Cipher p_244777_2_, CallbackInfo ci) { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + if (viaForge$targetVersion != null && viaForge$targetVersion.olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { // Minecraft's encryption code is bad for us, we need to reorder the pipeline ci.cancel(); - // Minecraft 1.6.4 supports tile encryption which means the server can only disable one side of the encryption + // Minecraft 1.6.4 supports tile encryption which means the server can only enable one side of the encryption // So we only enable the encryption side and later enable the decryption side if the 1.7 -> 1.6 protocol // tells us to do, therefore we need to store the cipher instance. this.viaForge$decryptionCipher = p_244777_1_; // Enabling the encryption side + this.encrypted = true; this.channel.pipeline().addBefore(VLLegacyPipeline.VIALEGACY_PRE_NETTY_LENGTH_REMOVER_NAME, "encrypt", new CipherEncoder(p_244777_2_)); } } - @Inject(method = "disconnect", at = @At("HEAD")) - public void restoreTargetVersion(Component p_129508_, CallbackInfo ci) { - // If the previous server forced a version, we need to restore the version to the default one. - ViaForgeCommon.getManager().restoreVersion(); - } - - @Inject(method = "setupCompression", at = @At("RETURN")) - public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { - ViaForgeCommon.getManager().reorderCompression(channel); + @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) + private static void setTargetVersion(InetSocketAddress p_178301_, boolean p_178302_, CallbackInfoReturnable cir, Connection connection, Class oclass, LazyLoadedValue lazyloadedvalue) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + mixinConnection.viaForge$setTrackedVersion(VersionTracker.getServerProtocolVersion(p_178301_.getAddress())); } @Override diff --git a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java similarity index 62% rename from viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java rename to viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java index 882b866..8e0e567 100644 --- a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java +++ b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java @@ -16,26 +16,24 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelPipeline; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(targets = "net.minecraft.network.Connection$1") public class MixinConnection_1 { - @Redirect(method = "initChannel", at = @At(value = "INVOKE", target = "Lio/netty/channel/ChannelPipeline;addLast(Ljava/lang/String;Lio/netty/channel/ChannelHandler;)Lio/netty/channel/ChannelPipeline;")) - private ChannelPipeline hookViaPipeline(ChannelPipeline instance, String s, ChannelHandler channelHandler) { - final ChannelPipeline handler = instance.addLast(s, channelHandler); - if (channelHandler instanceof VFNetworkManager mixinNetworkManager) { - ViaForgeCommon.getManager().inject(instance.channel(), mixinNetworkManager); - } - return handler; + @Inject(method = "initChannel", at = @At("TAIL")) + private void hookViaPipeline(Channel p_129552_, CallbackInfo ci) { + final ChannelHandler connection = p_129552_.pipeline().get("packet_handler"); + ViaForgeCommon.getManager().inject(p_129552_, (VFNetworkManager) connection); } } diff --git a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java similarity index 72% rename from viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java rename to viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java index 3f175c4..76d0a7c 100644 --- a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java +++ b/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java @@ -16,10 +16,11 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerStatusPinger; import net.minecraft.network.Connection; @@ -46,22 +47,12 @@ public class MixinServerStatusPinger { @Redirect(method = "pingServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;connectToServer(Ljava/net/InetSocketAddress;Z)Lnet/minecraft/network/Connection;")) public Connection trackVersion(InetSocketAddress oclass, boolean lazyloadedvalue) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - - if (viaForge$serverData instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - - viaForge$serverData = null; + ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } + VersionTracker.storeServerProtocolVersion(oclass.getAddress(), version); + viaForge$serverData = null; return Connection.connectToServer(oclass, lazyloadedvalue); } diff --git a/viaforge-mc1182/src/main/resources/mixins.viaforge-mc1182.json b/viaforge-mc1182/src/main/resources/mixins.viaforge-mc1182.json index a1e3831..32592d8 100644 --- a/viaforge-mc1182/src/main/resources/mixins.viaforge-mc1182.json +++ b/viaforge-mc1182/src/main/resources/mixins.viaforge-mc1182.json @@ -4,16 +4,16 @@ "compatibilityLevel": "JAVA_8", "package": "de.florianmichael.viaforge.mixin", "client": [ - "MixinClientHandshakePacketListenerImpl", - "MixinConnection", - "MixinConnection_1", - "MixinConnectScreen_1", + "connect.MixinClientHandshakePacketListenerImpl", + "connect.MixinConnection", + "connect.MixinConnection_1", + "connect.MixinConnectScreen_1", "MixinDebugScreenOverlay", "MixinDirectJoinServerScreen", "MixinEditServerScreen", "MixinJoinMultiplayerScreen", "MixinServerData", - "MixinServerStatusPinger", + "connect.MixinServerStatusPinger", "MixinTitleScreen", "fixes.MixinLocalPlayer" ], diff --git a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java similarity index 89% rename from viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java rename to viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java index dad35ad..dfd8e88 100644 --- a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java +++ b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java @@ -16,18 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import com.mojang.authlib.GameProfile; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.viaversion.viaversion.api.connection.UserConnection; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl; import net.minecraft.network.Connection; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.storage.ProtocolMetadataStorage; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -42,7 +42,8 @@ public class MixinClientHandshakePacketListenerImpl { @Redirect(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/lang/String;)V")) public void onlyJoinServerIfPremium(MinecraftSessionService instance, GameProfile profile, String authenticationToken, String serverId) throws AuthenticationException { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + if (mixinConnection.viaForge$getTrackedVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { final UserConnection user = connection.channel().attr(ViaForgeCommon.LOCAL_VIA_USER).get(); if (user != null && user.has(ProtocolMetadataStorage.class) && !user.get(ProtocolMetadataStorage.class).authenticate) { // We are in the 1.7 -> 1.6 protocol, so we need to skip the joinServer call diff --git a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java similarity index 53% rename from viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java rename to viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java index 68d4da4..cf292ac 100644 --- a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnectScreen_1.java +++ b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java @@ -16,39 +16,36 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; -import net.minecraft.client.Minecraft; -import net.minecraft.network.Connection; +import de.florianmichael.viaforge.common.platform.VersionTracker; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.client.multiplayer.ServerData; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import java.net.InetSocketAddress; +import java.util.Optional; @Mixin(targets = "net.minecraft.client.gui.screens.ConnectScreen$1") public class MixinConnectScreen_1 { - @Redirect(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;connectToServer(Ljava/net/InetSocketAddress;Z)Lnet/minecraft/network/Connection;")) - public Connection trackVersion(InetSocketAddress oclass, boolean lazyloadedvalue) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - if (Minecraft.getInstance().getCurrentServer() instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - } + @Shadow @Final private ServerData val$p_252078_; - return Connection.connectToServer(oclass, lazyloadedvalue); + @Redirect(method = "run", at = @At(value = "INVOKE", target = "Ljava/util/Optional;get()Ljava/lang/Object;")) + public Object trackServerVersion(Optional instance) { + final InetSocketAddress address = (InetSocketAddress) instance.get(); + ProtocolVersion version = ((ExtendedServerData) val$p_252078_).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); + } + VersionTracker.storeServerProtocolVersion(address.getAddress(), version); + return address; } } diff --git a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java similarity index 75% rename from viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java rename to viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java index 12f98b1..bee94ed 100644 --- a/viaforge-mc1182/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java +++ b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java @@ -16,15 +16,18 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.platform.VersionTracker; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import io.netty.channel.Channel; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.socket.SocketChannel; import net.minecraft.network.CipherDecoder; import net.minecraft.network.CipherEncoder; import net.minecraft.network.Connection; -import net.minecraft.network.chat.Component; +import net.minecraft.util.LazyLoadedValue; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialoader.netty.VLLegacyPipeline; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -45,46 +48,39 @@ public class MixinConnection implements VFNetworkManager { @Shadow private Channel channel; + @Shadow private boolean encrypted; @Unique private Cipher viaForge$decryptionCipher; @Unique private ProtocolVersion viaForge$targetVersion; - @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) - private static void trackSelfTarget(InetSocketAddress p_178301_, boolean p_178302_, CallbackInfoReturnable cir, final Connection connection) { - // The connecting screen and server pinger are setting the main target version when a specific version for a server is set, - // This works for joining perfect since we can simply restore the version when the server doesn't have a specific one set, - // but for the server pinger we need to store the target version and force the pinging to use the target version. - // Due to the fact that the server pinger is being called multiple times. - ((VFNetworkManager) connection).viaForge$setTrackedVersion(ViaForgeCommon.getManager().getTargetVersion()); + @Inject(method = "setupCompression", at = @At("RETURN")) + public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { + ViaForgeCommon.getManager().reorderCompression(channel); } @Inject(method = "setEncryptionKey", at = @At("HEAD"), cancellable = true) private void storeEncryptionCiphers(Cipher p_244777_1_, Cipher p_244777_2_, CallbackInfo ci) { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + if (viaForge$targetVersion != null && viaForge$targetVersion.olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { // Minecraft's encryption code is bad for us, we need to reorder the pipeline ci.cancel(); - // Minecraft 1.6.4 supports tile encryption which means the server can only disable one side of the encryption + // Minecraft 1.6.4 supports tile encryption which means the server can only enable one side of the encryption // So we only enable the encryption side and later enable the decryption side if the 1.7 -> 1.6 protocol // tells us to do, therefore we need to store the cipher instance. this.viaForge$decryptionCipher = p_244777_1_; // Enabling the encryption side + this.encrypted = true; this.channel.pipeline().addBefore(VLLegacyPipeline.VIALEGACY_PRE_NETTY_LENGTH_REMOVER_NAME, "encrypt", new CipherEncoder(p_244777_2_)); } } - @Inject(method = "disconnect", at = @At("HEAD")) - public void restoreTargetVersion(Component p_129508_, CallbackInfo ci) { - // If the previous server forced a version, we need to restore the version to the default one. - ViaForgeCommon.getManager().restoreVersion(); - } - - @Inject(method = "setupCompression", at = @At("RETURN")) - public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { - ViaForgeCommon.getManager().reorderCompression(channel); + @Inject(method = "connectToServer", at = @At(value = "INVOKE", target = "Lio/netty/bootstrap/Bootstrap;group(Lio/netty/channel/EventLoopGroup;)Lio/netty/bootstrap/AbstractBootstrap;"), locals = LocalCapture.CAPTURE_FAILHARD) + private static void setTargetVersion(InetSocketAddress p_178301_, boolean p_178302_, CallbackInfoReturnable cir, Connection connection, Class oclass, LazyLoadedValue lazyloadedvalue) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + mixinConnection.viaForge$setTrackedVersion(VersionTracker.getServerProtocolVersion(p_178301_.getAddress())); } @Override diff --git a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java similarity index 62% rename from viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java rename to viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java index 882b866..8e0e567 100644 --- a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java +++ b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java @@ -16,26 +16,24 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelPipeline; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(targets = "net.minecraft.network.Connection$1") public class MixinConnection_1 { - @Redirect(method = "initChannel", at = @At(value = "INVOKE", target = "Lio/netty/channel/ChannelPipeline;addLast(Ljava/lang/String;Lio/netty/channel/ChannelHandler;)Lio/netty/channel/ChannelPipeline;")) - private ChannelPipeline hookViaPipeline(ChannelPipeline instance, String s, ChannelHandler channelHandler) { - final ChannelPipeline handler = instance.addLast(s, channelHandler); - if (channelHandler instanceof VFNetworkManager mixinNetworkManager) { - ViaForgeCommon.getManager().inject(instance.channel(), mixinNetworkManager); - } - return handler; + @Inject(method = "initChannel", at = @At("TAIL")) + private void hookViaPipeline(Channel p_129552_, CallbackInfo ci) { + final ChannelHandler connection = p_129552_.pipeline().get("packet_handler"); + ViaForgeCommon.getManager().inject(p_129552_, (VFNetworkManager) connection); } } diff --git a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java similarity index 72% rename from viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java rename to viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java index 3f175c4..76d0a7c 100644 --- a/viaforge-mc1171/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java +++ b/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java @@ -16,10 +16,11 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerStatusPinger; import net.minecraft.network.Connection; @@ -46,22 +47,12 @@ public class MixinServerStatusPinger { @Redirect(method = "pingServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;connectToServer(Ljava/net/InetSocketAddress;Z)Lnet/minecraft/network/Connection;")) public Connection trackVersion(InetSocketAddress oclass, boolean lazyloadedvalue) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - - if (viaForge$serverData instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - - viaForge$serverData = null; + ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } + VersionTracker.storeServerProtocolVersion(oclass.getAddress(), version); + viaForge$serverData = null; return Connection.connectToServer(oclass, lazyloadedvalue); } diff --git a/viaforge-mc1194/src/main/resources/mixins.viaforge-mc1194.json b/viaforge-mc1194/src/main/resources/mixins.viaforge-mc1194.json index 46b4b57..1a327c5 100644 --- a/viaforge-mc1194/src/main/resources/mixins.viaforge-mc1194.json +++ b/viaforge-mc1194/src/main/resources/mixins.viaforge-mc1194.json @@ -4,16 +4,16 @@ "compatibilityLevel": "JAVA_8", "package": "de.florianmichael.viaforge.mixin", "client": [ - "MixinClientHandshakePacketListenerImpl", - "MixinConnection", - "MixinConnection_1", - "MixinConnectScreen_1", + "connect.MixinClientHandshakePacketListenerImpl", + "connect.MixinConnection", + "connect.MixinConnection_1", + "connect.MixinConnectScreen_1", "MixinDebugScreenOverlay", "MixinDirectJoinServerScreen", "MixinEditServerScreen", "MixinJoinMultiplayerScreen", "MixinServerData", - "MixinServerStatusPinger", + "connect.MixinServerStatusPinger", "MixinTitleScreen", "fixes.MixinLocalPlayer" ], diff --git a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java similarity index 89% rename from viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java rename to viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java index c426d4e..1b54048 100644 --- a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinClientHandshakePacketListenerImpl.java +++ b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinClientHandshakePacketListenerImpl.java @@ -16,17 +16,17 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.minecraft.MinecraftSessionService; import com.viaversion.viaversion.api.connection.UserConnection; import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl; import net.minecraft.network.Connection; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.storage.ProtocolMetadataStorage; -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -43,7 +43,8 @@ public class MixinClientHandshakePacketListenerImpl { @Redirect(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;)V")) public void onlyJoinServerIfPremium(MinecraftSessionService instance, UUID uuid, String authenticationToken, String serverId) throws AuthenticationException { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + final VFNetworkManager mixinConnection = (VFNetworkManager) connection; + if (mixinConnection.viaForge$getTrackedVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { final UserConnection user = connection.channel().attr(ViaForgeCommon.LOCAL_VIA_USER).get(); if (user != null && user.has(ProtocolMetadataStorage.class) && !user.get(ProtocolMetadataStorage.class).authenticate) { // We are in the 1.7 -> 1.6 protocol, so we need to skip the joinServer call diff --git a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java new file mode 100644 index 0000000..1972e54 --- /dev/null +++ b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnectScreen_1.java @@ -0,0 +1,51 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * Copyright (C) 2021-2024 FlorianMichael/EnZaXD and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.florianmichael.viaforge.mixin.connect; + +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import de.florianmichael.viaforge.common.ViaForgeCommon; +import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; +import net.minecraft.client.multiplayer.ServerData; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.net.InetSocketAddress; +import java.util.Optional; + +@Mixin(targets = "net.minecraft.client.gui.screens.ConnectScreen$1") +public class MixinConnectScreen_1 { + + @Shadow @Final private ServerData val$p_252078_; + + @Redirect(method = "run", at = @At(value = "INVOKE", target = "Ljava/util/Optional;get()Ljava/lang/Object;")) + public Object trackServerVersion(Optional instance) { + final InetSocketAddress address = (InetSocketAddress) instance.get(); + ProtocolVersion version = ((ExtendedServerData) val$p_252078_).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); + } + VersionTracker.storeServerProtocolVersion(address.getAddress(), version); + return address; + } + +} diff --git a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java similarity index 61% rename from viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java rename to viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java index 929d586..3f86925 100644 --- a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection.java +++ b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection.java @@ -16,20 +16,16 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; -import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; -import net.minecraft.client.Minecraft; import net.minecraft.network.CipherDecoder; import net.minecraft.network.CipherEncoder; import net.minecraft.network.Connection; -import net.minecraft.network.PacketListener; -import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.handshake.ClientIntent; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import net.raphimc.vialoader.netty.VLLegacyPipeline; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -49,60 +45,39 @@ public class MixinConnection implements VFNetworkManager { @Shadow private Channel channel; + @Shadow private boolean encrypted; @Unique private Cipher viaForge$decryptionCipher; @Unique private ProtocolVersion viaForge$targetVersion; - @Inject(method = "connect", at = @At("HEAD")) - private static void trackSelfTarget(InetSocketAddress p_290034_, boolean p_290035_, Connection p_290031_, CallbackInfoReturnable cir) { - // The connecting screen and server pinger are setting the main target version when a specific version for a server is set, - // This works for joining perfect since we can simply restore the version when the server doesn't have a specific one set, - // but for the server pinger we need to store the target version and force the pinging to use the target version. - // Due to the fact that the server pinger is being called multiple times. - ((VFNetworkManager) p_290031_).viaForge$setTrackedVersion(ViaForgeCommon.getManager().getTargetVersion()); - } - - @Inject(method = "initiateServerboundConnection", at = @At("HEAD")) - public void resetTargetVersion(String p_300730_, int p_300598_, PacketListener p_298739_, ClientIntent p_297789_, CallbackInfo ci) { - if (Minecraft.getInstance().getCurrentServer() instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) Minecraft.getInstance().getCurrentServer()).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - } + @Inject(method = "setupCompression", at = @At("RETURN")) + public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { + ViaForgeCommon.getManager().reorderCompression(channel); } @Inject(method = "setEncryptionKey", at = @At("HEAD"), cancellable = true) private void storeEncryptionCiphers(Cipher p_244777_1_, Cipher p_244777_2_, CallbackInfo ci) { - if (ViaForgeCommon.getManager().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + if (viaForge$targetVersion != null && viaForge$targetVersion.olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { // Minecraft's encryption code is bad for us, we need to reorder the pipeline ci.cancel(); - // Minecraft 1.6.4 supports tile encryption which means the server can only disable one side of the encryption + // Minecraft 1.6.4 supports tile encryption which means the server can only enable one side of the encryption // So we only enable the encryption side and later enable the decryption side if the 1.7 -> 1.6 protocol // tells us to do, therefore we need to store the cipher instance. this.viaForge$decryptionCipher = p_244777_1_; // Enabling the encryption side + this.encrypted = true; this.channel.pipeline().addBefore(VLLegacyPipeline.VIALEGACY_PRE_NETTY_LENGTH_REMOVER_NAME, "encrypt", new CipherEncoder(p_244777_2_)); } } - @Inject(method = "disconnect", at = @At("HEAD")) - public void restoreTargetVersion(Component p_129508_, CallbackInfo ci) { - // If the previous server forced a version, we need to restore the version to the default one. - ViaForgeCommon.getManager().restoreVersion(); - } - - @Inject(method = "setupCompression", at = @At("RETURN")) - public void reorderPipeline(int p_129485_, boolean p_182682_, CallbackInfo ci) { - ViaForgeCommon.getManager().reorderCompression(channel); + @Inject(method = "connect", at = @At("HEAD")) + private static void setTargetVersion(InetSocketAddress p_290034_, boolean p_290035_, Connection p_290031_, CallbackInfoReturnable cir) { + final VFNetworkManager mixinConnection = (VFNetworkManager) p_290031_; + mixinConnection.viaForge$setTrackedVersion(VersionTracker.getServerProtocolVersion(p_290034_.getAddress())); } @Override diff --git a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java similarity index 62% rename from viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java rename to viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java index 882b866..8e0e567 100644 --- a/viaforge-mc1194/src/main/java/de/florianmichael/viaforge/mixin/MixinConnection_1.java +++ b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinConnection_1.java @@ -16,26 +16,24 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.protocoltranslator.netty.VFNetworkManager; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelPipeline; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(targets = "net.minecraft.network.Connection$1") public class MixinConnection_1 { - @Redirect(method = "initChannel", at = @At(value = "INVOKE", target = "Lio/netty/channel/ChannelPipeline;addLast(Ljava/lang/String;Lio/netty/channel/ChannelHandler;)Lio/netty/channel/ChannelPipeline;")) - private ChannelPipeline hookViaPipeline(ChannelPipeline instance, String s, ChannelHandler channelHandler) { - final ChannelPipeline handler = instance.addLast(s, channelHandler); - if (channelHandler instanceof VFNetworkManager mixinNetworkManager) { - ViaForgeCommon.getManager().inject(instance.channel(), mixinNetworkManager); - } - return handler; + @Inject(method = "initChannel", at = @At("TAIL")) + private void hookViaPipeline(Channel p_129552_, CallbackInfo ci) { + final ChannelHandler connection = p_129552_.pipeline().get("packet_handler"); + ViaForgeCommon.getManager().inject(p_129552_, (VFNetworkManager) connection); } } diff --git a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java similarity index 73% rename from viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java rename to viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java index d262d5d..d6a5b17 100644 --- a/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/MixinServerStatusPinger.java +++ b/viaforge-mc1204/src/main/java/de/florianmichael/viaforge/mixin/connect/MixinServerStatusPinger.java @@ -16,10 +16,11 @@ * along with this program. If not, see . */ -package de.florianmichael.viaforge.mixin; +package de.florianmichael.viaforge.mixin.connect; import de.florianmichael.viaforge.common.ViaForgeCommon; import de.florianmichael.viaforge.common.gui.ExtendedServerData; +import de.florianmichael.viaforge.common.platform.VersionTracker; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerStatusPinger; import net.minecraft.network.Connection; @@ -47,22 +48,12 @@ public class MixinServerStatusPinger { @Redirect(method = "pingServer", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/Connection;connectToServer(Ljava/net/InetSocketAddress;ZLnet/minecraft/util/SampleLogger;)Lnet/minecraft/network/Connection;")) public Connection trackVersion(InetSocketAddress address, boolean b, SampleLogger sampleLogger) { - // We need to track the version of the server we are connecting to, so we can later - // use it to determine the protocol version to use. - // We hope that the current server data is not null - - if (viaForge$serverData instanceof ExtendedServerData) { - final ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); - if (version != null) { - ViaForgeCommon.getManager().setTargetVersionSilent(version); - } else { - // If the server data does not contain a version, we need to restore the version - // we had before, so we don't use the wrong version. - ViaForgeCommon.getManager().restoreVersion(); - } - - viaForge$serverData = null; + ProtocolVersion version = ((ExtendedServerData) viaForge$serverData).viaForge$getVersion(); + if (version == null) { + version = ViaForgeCommon.getManager().getTargetVersion(); } + VersionTracker.storeServerProtocolVersion(address.getAddress(), version); + viaForge$serverData = null; return Connection.connectToServer(address, b, sampleLogger); } diff --git a/viaforge-mc1204/src/main/resources/mixins.viaforge-mc1204.json b/viaforge-mc1204/src/main/resources/mixins.viaforge-mc1204.json index 40289cd..68365b9 100644 --- a/viaforge-mc1204/src/main/resources/mixins.viaforge-mc1204.json +++ b/viaforge-mc1204/src/main/resources/mixins.viaforge-mc1204.json @@ -4,16 +4,17 @@ "compatibilityLevel": "JAVA_8", "package": "de.florianmichael.viaforge.mixin", "client": [ - "MixinClientHandshakePacketListenerImpl", - "MixinConnection", - "MixinConnection_1", "MixinDebugScreenOverlay", "MixinDirectJoinServerScreen", "MixinEditServerScreen", "MixinJoinMultiplayerScreen", "MixinServerData", - "MixinServerStatusPinger", "MixinTitleScreen", + "connect.MixinClientHandshakePacketListenerImpl", + "connect.MixinConnection", + "connect.MixinConnection_1", + "connect.MixinConnectScreen_1", + "connect.MixinServerStatusPinger", "fixes.MixinLocalPlayer" ], "injectors": {