From 6e19aa653415dd8b179ed660c3ecefb927cb2263 Mon Sep 17 00:00:00 2001 From: FlorianMichael <60033407+FlorianMichael@users.noreply.github.com> Date: Fri, 2 Jun 2023 17:34:56 +0200 Subject: [PATCH] fixed https://github.com/ViaVersion/ViaFabricPlus/issues/115 --- .../base/settings/groups/GeneralSettings.java | 1 + .../injection/access/IServerInfo.java | 6 ++ .../MixinMultiplayerServerListPinger_1.java | 53 ++++++++++++++++++ ...ltiplayerServerListWidget_ServerEntry.java | 55 +++++++++++++++++++ .../injection/mixin/base/MixinServerInfo.java | 26 +++++++++ .../assets/viafabricplus/lang/en_us.json | 2 + src/main/resources/viafabricplus.mixins.json | 2 + 7 files changed, 145 insertions(+) create mode 100644 src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListPinger_1.java create mode 100644 src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListWidget_ServerEntry.java diff --git a/src/main/java/de/florianmichael/viafabricplus/base/settings/groups/GeneralSettings.java b/src/main/java/de/florianmichael/viafabricplus/base/settings/groups/GeneralSettings.java index ea6beb86..c87f511e 100644 --- a/src/main/java/de/florianmichael/viafabricplus/base/settings/groups/GeneralSettings.java +++ b/src/main/java/de/florianmichael/viafabricplus/base/settings/groups/GeneralSettings.java @@ -37,6 +37,7 @@ public class GeneralSettings extends SettingGroup { public final BooleanSetting showExtraInformationInDebugHud = new BooleanSetting(this, Text.translatable("general.viafabricplus.extrainformation"), true); public final BooleanSetting showClassicLoadingProgressInConnectScreen = new BooleanSetting(this, Text.translatable("general.viafabricplus.classicloading"), true); public final BooleanSetting autoDetectVersion = new BooleanSetting(this, Text.translatable("general.viafabricplus.autodetect"), false); + public final BooleanSetting showAdvertisedServerVersion = new BooleanSetting(this, Text.translatable("general.viafabricplus.advertised"), true); public GeneralSettings() { super(Text.translatable("settings.viafabricplus.general")); diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/access/IServerInfo.java b/src/main/java/de/florianmichael/viafabricplus/injection/access/IServerInfo.java index 1e67177d..99927adb 100644 --- a/src/main/java/de/florianmichael/viafabricplus/injection/access/IServerInfo.java +++ b/src/main/java/de/florianmichael/viafabricplus/injection/access/IServerInfo.java @@ -23,4 +23,10 @@ public interface IServerInfo { VersionEnum viafabricplus_forcedVersion(); void viafabricplus_forceVersion(VersionEnum version); + + boolean viafabricplus_enabled(); + void viafabricplus_enable(); + + int viafabricplus_translatingVersion(); + void viafabricplus_setTranslatingVersion(final int version); } diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListPinger_1.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListPinger_1.java new file mode 100644 index 00000000..3bcfc8d7 --- /dev/null +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListPinger_1.java @@ -0,0 +1,53 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus + * Copyright (C) 2021-2023 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.viafabricplus.injection.mixin.base; + +import de.florianmichael.viafabricplus.injection.access.IServerInfo; +import de.florianmichael.viafabricplus.protocolhack.ProtocolHack; +import net.minecraft.client.network.ServerInfo; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.listener.ClientQueryPacketListener; +import net.minecraft.network.packet.s2c.query.QueryResponseS2CPacket; +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.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(targets = "net.minecraft.client.network.MultiplayerServerListPinger$1") +public abstract class MixinMultiplayerServerListPinger_1 implements ClientQueryPacketListener { + + @Final + @Shadow + ClientConnection field_3774; + + @Final + @Shadow + ServerInfo field_3776; + + @Inject(method = "onResponse(Lnet/minecraft/network/packet/s2c/query/QueryResponseS2CPacket;)V", at = @At("HEAD")) + public void trackTranslatingState(QueryResponseS2CPacket packet, CallbackInfo ci) { + if (field_3774.channel.hasAttr(ProtocolHack.LOCAL_VIA_CONNECTION)) { + ((IServerInfo) field_3776).viafabricplus_enable(); + + final var userConnection = field_3774.channel.attr(ProtocolHack.LOCAL_VIA_CONNECTION).get(); + ((IServerInfo) field_3776).viafabricplus_setTranslatingVersion(userConnection.getProtocolInfo().getServerProtocolVersion()); + } + } +} diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListWidget_ServerEntry.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListWidget_ServerEntry.java new file mode 100644 index 00000000..9871ee34 --- /dev/null +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMultiplayerServerListWidget_ServerEntry.java @@ -0,0 +1,55 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus + * Copyright (C) 2021-2023 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.viafabricplus.injection.mixin.base; + +import de.florianmichael.viafabricplus.base.settings.groups.GeneralSettings; +import de.florianmichael.viafabricplus.injection.access.IServerInfo; +import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; +import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget; +import net.minecraft.client.network.ServerInfo; +import net.minecraft.text.Text; +import net.raphimc.vialoader.util.VersionEnum; +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.util.ArrayList; +import java.util.List; + +@Mixin(MultiplayerServerListWidget.ServerEntry.class) +public class MixinMultiplayerServerListWidget_ServerEntry { + + @Shadow @Final private ServerInfo server; + + @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/multiplayer/MultiplayerScreen;setMultiplayerScreenTooltip(Ljava/util/List;)V", ordinal = 0)) + public void showTranslatingInformation(MultiplayerScreen instance, List tooltip) { + final List tooltipOverwrite = new ArrayList<>(tooltip); + if (GeneralSettings.INSTANCE.showAdvertisedServerVersion.getValue()) { + final IServerInfo accessor = ((IServerInfo) server); + if (accessor.viafabricplus_enabled()) { + final var versionEnum = VersionEnum.fromProtocolId(accessor.viafabricplus_translatingVersion()); + + tooltipOverwrite.add(Text.translatable("words.viafabricplus.translate", versionEnum != VersionEnum.UNKNOWN ? versionEnum.getName() + " (" + versionEnum.getVersion() + ")" : accessor.viafabricplus_translatingVersion())); + tooltipOverwrite.add(Text.of("Server version: " + server.version.getString() + " (" + server.protocolVersion + ")")); + } + } + instance.setMultiplayerScreenTooltip(tooltipOverwrite); + } +} diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinServerInfo.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinServerInfo.java index ac457756..089a8bb1 100644 --- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinServerInfo.java +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinServerInfo.java @@ -70,4 +70,30 @@ public class MixinServerInfo implements IServerInfo { public void trackForcedVersion(ServerInfo serverInfo, CallbackInfo ci) { viafabricplus_forceVersion(((IServerInfo) serverInfo).viafabricplus_forcedVersion()); } + + @Unique + private boolean viafabricplus_enabled; + + @Override + public boolean viafabricplus_enabled() { + return viafabricplus_enabled; + } + + @Override + public void viafabricplus_enable() { + viafabricplus_enabled = true; + } + + @Unique + private int viafabricplus_translatingVersion; + + @Override + public int viafabricplus_translatingVersion() { + return viafabricplus_translatingVersion; + } + + @Override + public void viafabricplus_setTranslatingVersion(int version) { + viafabricplus_translatingVersion = version; + } } diff --git a/src/main/resources/assets/viafabricplus/lang/en_us.json b/src/main/resources/assets/viafabricplus/lang/en_us.json index 17ba1611..7185d690 100644 --- a/src/main/resources/assets/viafabricplus/lang/en_us.json +++ b/src/main/resources/assets/viafabricplus/lang/en_us.json @@ -13,6 +13,7 @@ "words.viafabricplus.reset": "Reset", "words.viafabricplus.copy": "Copy code", "words.viafabricplus.error": "Something went wrong! Please try again later", + "words.viafabricplus.translate": "Via translates to: %s", "settings.viafabricplus.authentication": "Authentication", "settings.viafabricplus.experimental": "Experimental", @@ -27,6 +28,7 @@ "general.viafabricplus.creative": "Remove not available items from creative tab", "general.viafabricplus.protocolsync": "Automatically change Settings based on the current version", "general.viafabricplus.autodetect": "Auto detect version", + "general.viafabricplus.advertised": "Show advertised/server version in Multiplayer", "experimental.viafabricplus.chunkborderfix": "Fix Chunk borders", "experimental.viafabricplus.watermovement": "Water movement edge detection", diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 5528cc2b..efa465ad 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -16,6 +16,8 @@ "base.MixinMinecraftClient", "base.MixinMultiplayerScreen", "base.MixinMultiplayerServerListPinger", + "base.MixinMultiplayerServerListPinger_1", + "base.MixinMultiplayerServerListWidget_ServerEntry", "base.MixinOptionsScreen", "base.MixinServerInfo", "base.MixinSharedConstants",