From 4f1c9ac5b7535d882b9bac28a6f67500b91745a7 Mon Sep 17 00:00:00 2001 From: creeper123123321 <7974274+creeper123123321@users.noreply.github.com> Date: Wed, 16 Sep 2020 10:19:51 -0300 Subject: [PATCH] workaround FabricMC/fabric-loom#279, implement #52, update gradle and fabric, update README.md --- README.md | 4 +- build.gradle.kts | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 58694 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 + gradlew.bat | 1 + .../viafabric/config/VRConfig.java | 9 + .../viafabric/gui/ModMenuConfig.java | 43 ++++ .../viafabric/gui/ViaConfigScreen.java | 192 ++++++++++++++++++ .../client/MixinConnectScreenThread.java | 2 +- .../mixin/client/MixinMultiplayerScreen.java | 122 +---------- .../mixin/client/MixinServerAddress.java | 12 +- .../providers/VRVersionProvider.java | 55 ++--- ...onFormatFilter.java => ProtocolUtils.java} | 39 +++- .../resources/assets/viafabric/config.yml | 4 +- .../assets/viafabric/lang/en_us.json | 9 +- src/main/resources/fabric.mod.json | 6 +- src/main/resources/viafabric.accesswidener | 4 + 18 files changed, 348 insertions(+), 162 deletions(-) create mode 100644 src/main/java/com/github/creeper123123321/viafabric/gui/ModMenuConfig.java create mode 100644 src/main/java/com/github/creeper123123321/viafabric/gui/ViaConfigScreen.java rename src/main/java/com/github/creeper123123321/viafabric/util/{VersionFormatFilter.java => ProtocolUtils.java} (61%) create mode 100644 src/main/resources/viafabric.accesswidener diff --git a/README.md b/README.md index 372a766..42aaeda 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Note: ViaVersion is designed for Vanilla Minecraft servers. It probably will not | Dependency | Download | | ----------------------------------------- | ------------------------------------------------------------------------------------------ | -| (Bundled 3.1.0 release) ViaVersion 3.0.2+ | https://ci.viaversion.com/job/ViaVersion/ or https://ci.viaversion.com/job/ViaVersion-DEV/ | +| (Bundled 3.1.1 release) ViaVersion 3.0.2+ | https://ci.viaversion.com/job/ViaVersion/ or https://ci.viaversion.com/job/ViaVersion-DEV/ | | (Bundled) Cotton Client Commands | https://www.curseforge.com/minecraft/mc-mods/cotton-client-commands | | (Optional) Fabric Command API v1/v0 | https://www.curseforge.com/minecraft/mc-mods/fabric-api | | Fabric Resource Loader v0 | https://www.curseforge.com/minecraft/mc-mods/fabric-api | @@ -28,7 +28,7 @@ Note: ViaVersion is designed for Vanilla Minecraft servers. It probably will not | Dependency | Download | | ----------------------------------------- | ------------------------------------------------------------------------------------------ | -| (Bundled 3.1.0 release) ViaVersion 3.0.2+ | https://ci.viaversion.com/job/ViaVersion/ or https://ci.viaversion.com/job/ViaVersion-DEV/ | +| (Bundled 3.1.1 release) ViaVersion 3.0.2+ | https://ci.viaversion.com/job/ViaVersion/ or https://ci.viaversion.com/job/ViaVersion-DEV/ | | (Optional) Fabric Commands v0 | https://www.curseforge.com/minecraft/mc-mods/legacy-fabric-api | | Fabric Resource Loader v0 | https://www.curseforge.com/minecraft/mc-mods/legacy-fabric-api | diff --git a/build.gradle.kts b/build.gradle.kts index 0af15a9..92a042f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,7 +20,7 @@ val branch = if (!travisBranch.isNullOrBlank()) travisBranch else try { "unknown" } -version = "0.2.12-SNAPSHOT+" + try { +version = "0.2.13-SNAPSHOT+" + try { gitVersion() + "-" + branch } catch (e: Exception) { "unknown" @@ -70,6 +70,7 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:0.8.2+build.194") modImplementation("net.fabricmc.fabric-api:fabric-api:0.13.1+build.257-1.14") + modImplementation("io.github.prospector:modmenu:1.7.16.1.14.4+build.128") modImplementation("io.github.cottonmc:cotton-client-commands:1.0.0+1.15.2") include("io.github.cottonmc:cotton-client-commands:1.0.0+1.15.2") @@ -137,6 +138,7 @@ curseforge { } minecraft { + accessWidener("src/main/resources/viafabric.accesswidener") } license { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda8577df6c95960ba7077c43220e5bb2c0d9..62d4c053550b91381bbd28b1afc82d634bf73a8a 100644 GIT binary patch delta 6447 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 F{|nTN-B$nr diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 622ab64..12d38de 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7..fbd7c51 100755 --- a/gradlew +++ b/gradlew @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 62bd9b9..5093609 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -84,6 +84,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% diff --git a/src/main/java/com/github/creeper123123321/viafabric/config/VRConfig.java b/src/main/java/com/github/creeper123123321/viafabric/config/VRConfig.java index 77f96a5..ba88bc6 100644 --- a/src/main/java/com/github/creeper123123321/viafabric/config/VRConfig.java +++ b/src/main/java/com/github/creeper123123321/viafabric/config/VRConfig.java @@ -38,6 +38,7 @@ public class VRConfig extends Config { public static final String ENABLE_CLIENT_SIDE = "enable-client-side"; public static final String CLIENT_SIDE_VERSION = "client-side-version"; public static final String CLIENT_SIDE_FORCE_DISABLE = "client-side-force-disable"; + public static final String HIDE_BUTTON = "hide-button"; public VRConfig(File configFile) { super(configFile); @@ -79,6 +80,14 @@ public class VRConfig extends Config { return (List) get(CLIENT_SIDE_FORCE_DISABLE, List.class, Collections.emptyList()); } + public void setHideButton(boolean val) { + set(HIDE_BUTTON, val); + } + + public boolean isHideButton() { + return getBoolean(HIDE_BUTTON, false); + } + public boolean isForcedDisable(String line) { return getClientSideForceDisable().contains(line); } diff --git a/src/main/java/com/github/creeper123123321/viafabric/gui/ModMenuConfig.java b/src/main/java/com/github/creeper123123321/viafabric/gui/ModMenuConfig.java new file mode 100644 index 0000000..33d6414 --- /dev/null +++ b/src/main/java/com/github/creeper123123321/viafabric/gui/ModMenuConfig.java @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2018- creeper123123321 + * Copyright (c) 2019- contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.github.creeper123123321.viafabric.gui; + +import io.github.prospector.modmenu.api.ModMenuApi; +import net.minecraft.client.gui.screen.Screen; + +import java.util.function.Function; + +public class ModMenuConfig implements ModMenuApi { + @Override + public String getModId() { + return "viafabric"; + } + + @Override + public Function getConfigScreenFactory() { + return ViaConfigScreen::new; + } +} diff --git a/src/main/java/com/github/creeper123123321/viafabric/gui/ViaConfigScreen.java b/src/main/java/com/github/creeper123123321/viafabric/gui/ViaConfigScreen.java new file mode 100644 index 0000000..eea029b --- /dev/null +++ b/src/main/java/com/github/creeper123123321/viafabric/gui/ViaConfigScreen.java @@ -0,0 +1,192 @@ +/* + * MIT License + * + * Copyright (c) 2018- creeper123123321 + * Copyright (c) 2019- contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.github.creeper123123321.viafabric.gui; + + +import com.github.creeper123123321.viafabric.ViaFabric; +import com.github.creeper123123321.viafabric.util.ProtocolUtils; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ConfirmScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.text.TranslatableText; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; + +import java.util.concurrent.CompletableFuture; + +@Environment(EnvType.CLIENT) +public class ViaConfigScreen extends Screen { + private static CompletableFuture latestProtocolSave; + private final Screen parent; + private TextFieldWidget protocolVersion; + + public ViaConfigScreen(Screen parent) { + super(new TranslatableText("gui.viafabric_config.title")); + this.parent = parent; + } + + private static int getProtocolTextColor(boolean valid, boolean supported) { + + if (!valid) { + return 0xff0000; // Red + } else if (!supported) { + return 0xFFA500; // Orange + } + return 0xE0E0E0; // Default + } + + protected void init() { + int entries = 0; + + this.addButton(new ButtonWidget(this.width / 2 - 155 + entries % 2 * 160, + this.height / 6 + 24 * (entries >> 1), + 150, + 20, getClientSideText().asString(), this::onClickClientSide)); + entries++; + + this.addButton(new ButtonWidget(this.width / 2 - 155 + entries % 2 * 160, + this.height / 6 + 24 * (entries >> 1), + 150, + 20, getHideViaButtonText().asString(), this::onHideViaButton)); + entries++; + + protocolVersion = new TextFieldWidget(this.font, + this.width / 2 - 155 + entries % 2 * 160, + this.height / 6 + 24 * (entries >> 1), + 150, + 20, new TranslatableText("gui.protocol_version_field.name").asString()); + entries++; + + protocolVersion.setTextPredicate(ProtocolUtils::isStartOfProtocolText); + protocolVersion.setChangedListener(this::onChangeVersionField); + int clientSideVersion = ViaFabric.config.getClientSideVersion(); + protocolVersion.setText(ProtocolUtils.getProtocolName(clientSideVersion)); + + this.children.add(protocolVersion); + + //noinspection ConstantConditions + if (entries % 2 == 1) { + entries++; + } + + this.addButton(new ButtonWidget(this.width / 2 - 100, this.height / 6 + 24 * (entries >> 1), 200, 20, new TranslatableText("gui.done").asString(), (buttonWidget) -> MinecraftClient.getInstance().openScreen(this.parent))); + } + + private void onChangeVersionField(String text) { + protocolVersion.setSuggestion(null); + int newVersion = ViaFabric.config.getClientSideVersion(); + + Integer parsed = ProtocolUtils.parseProtocolId(text); + boolean validProtocol; + + if (parsed != null) { + newVersion = parsed; + validProtocol = true; + } else { + validProtocol = false; + String[] suggestions = ProtocolUtils.getProtocolSuggestions(text); + if (suggestions.length == 1) { + protocolVersion.setSuggestion(suggestions[0].substring(text.length())); + } + } + + protocolVersion.setEditableColor( + getProtocolTextColor(ProtocolUtils.isSupported(newVersion, ProtocolRegistry.SERVER_PROTOCOL), + validProtocol)); + + int finalNewVersion = newVersion; + if (latestProtocolSave == null) latestProtocolSave = CompletableFuture.completedFuture(null); + ViaFabric.config.setClientSideVersion(finalNewVersion); + latestProtocolSave = latestProtocolSave.thenRunAsync(ViaFabric.config::saveConfig, ViaFabric.ASYNC_EXECUTOR); + } + + private void onClickClientSide(ButtonWidget widget) { + if (!ViaFabric.config.isClientSideEnabled()) { + MinecraftClient.getInstance().openScreen(new ConfirmScreen( + answer -> { + MinecraftClient.getInstance().openScreen(this); + if (answer) { + ViaFabric.config.setClientSideEnabled(true); + ViaFabric.config.saveConfig(); + widget.setMessage(getClientSideText().asString()); + } + }, + new TranslatableText("gui.enable_client_side.question"), + new TranslatableText("gui.enable_client_side.warning"), + new TranslatableText("gui.enable_client_side.enable").asString(), + new TranslatableText("gui.cancel").asString() + )); + } else { + ViaFabric.config.setClientSideEnabled(false); + ViaFabric.config.saveConfig(); + } + widget.setMessage(getClientSideText().asString()); + } + + @Override + public void removed() { + ViaFabric.config.saveConfig(); + } + + @Override + public void onClose() { + MinecraftClient.getInstance().openScreen(this.parent); + } + + private TranslatableText getClientSideText() { + return ViaFabric.config.isClientSideEnabled() ? + new TranslatableText("gui.client_side.disable") + : new TranslatableText("gui.client_side.enable"); + } + + private TranslatableText getHideViaButtonText() { + return ViaFabric.config.isHideButton() ? + new TranslatableText("gui.hide_via_button.disable") : new TranslatableText("gui.hide_via_button.enable"); + } + + private void onHideViaButton(ButtonWidget widget) { + ViaFabric.config.setHideButton(!ViaFabric.config.isHideButton()); + ViaFabric.config.saveConfig(); + widget.setMessage(getHideViaButtonText().asString()); + } + + public void render(int mouseX, int mouseY, float delta) { + this.renderBackground(); + drawCenteredString(this.font, this.title.asString(), this.width / 2, 20, 16777215); + super.render(mouseX, mouseY, delta); + protocolVersion.render(mouseX, mouseY, delta); + } + + @Override + public void tick() { + super.tick(); + protocolVersion.tick(); + } +} + diff --git a/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinConnectScreenThread.java b/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinConnectScreenThread.java index 896dcd3..dac1ead 100644 --- a/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinConnectScreenThread.java +++ b/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinConnectScreenThread.java @@ -35,7 +35,7 @@ import java.net.UnknownHostException; @Mixin(targets = "net/minecraft/client/gui/screen/ConnectScreen$1", priority = 2000) // don't know if it will work with MinerParty mod public class MixinConnectScreenThread { - @Redirect(method = "run", at = @At(value = "INVOKE", + @Redirect(method = "run()V", at = @At(value = "INVOKE", target = "Ljava/net/InetAddress;getByName(Ljava/lang/String;)Ljava/net/InetAddress;")) private InetAddress resolveViaFabricAddr(String address) throws UnknownHostException { ViaFabricAddress viaAddr = new ViaFabricAddress().parse(address); diff --git a/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinMultiplayerScreen.java b/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinMultiplayerScreen.java index ba5ba67..581d6b5 100644 --- a/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinMultiplayerScreen.java +++ b/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinMultiplayerScreen.java @@ -26,45 +26,22 @@ package com.github.creeper123123321.viafabric.mixin.client; import com.github.creeper123123321.viafabric.ViaFabric; -import com.github.creeper123123321.viafabric.util.VersionFormatFilter; +import com.github.creeper123123321.viafabric.gui.ViaConfigScreen; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ConfirmScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.client.gui.widget.TexturedButtonWidget; -import net.minecraft.client.resource.language.I18n; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import us.myles.ViaVersion.api.protocol.ProtocolRegistry; -import us.myles.ViaVersion.api.protocol.ProtocolVersion; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; -import java.util.stream.Stream; @Mixin(MultiplayerScreen.class) public abstract class MixinMultiplayerScreen extends Screen { - @Unique - private TextFieldWidget protocolVersion; - @Unique - private ButtonWidget enableClientSideViaVersion; - @Unique - private boolean validProtocol; - @Unique - private boolean supportedProtocol; - @Unique - private CompletableFuture latestProtocolSave; - protected MixinMultiplayerScreen(Text title, UnsupportedOperationException e) { super(title); throw e; @@ -72,104 +49,15 @@ public abstract class MixinMultiplayerScreen extends Screen { @Inject(method = "init", at = @At("TAIL"), remap = false) private void onInit(CallbackInfo ci) { - protocolVersion = new TextFieldWidget(font, this.width / 2 + 88, 13, 65, 15, I18n.translate("gui.protocol_version_field.name")); - protocolVersion.setTextPredicate(new VersionFormatFilter()); - protocolVersion.setChangedListener((text) -> { - protocolVersion.setSuggestion(null); - int newVersion = ViaFabric.config.getClientSideVersion(); - validProtocol = true; - try { - newVersion = Integer.parseInt(text); - } catch (NumberFormatException e) { - ProtocolVersion closest = ProtocolVersion.getClosest(text); - if (closest != null) { - newVersion = closest.getId(); - } else { - validProtocol = false; - List completions = ProtocolVersion.getProtocols().stream() - .map(ProtocolVersion::getName) - .flatMap(str -> Stream.concat( - Arrays.stream(str.split("-")), - Arrays.stream(new String[]{str}) - )) - .distinct() - .filter(ver -> ver.startsWith(text)) - .collect(Collectors.toList()); - if (completions.size() == 1) { - protocolVersion.setSuggestion(completions.get(0).substring(text.length())); - } - } - } - supportedProtocol = isSupported(newVersion); - protocolVersion.setEditableColor(getTextColor()); - int finalNewVersion = newVersion; - if (latestProtocolSave == null) latestProtocolSave = CompletableFuture.completedFuture(null); - latestProtocolSave = latestProtocolSave.thenRunAsync(() -> { - ViaFabric.config.setClientSideVersion(finalNewVersion); - ViaFabric.config.saveConfig(); - }, ViaFabric.ASYNC_EXECUTOR); - }); - int clientSideVersion = ViaFabric.config.getClientSideVersion(); - - protocolVersion.setVisible(ViaFabric.config.isClientSideEnabled()); - - protocolVersion.setText(ProtocolVersion.isRegistered(clientSideVersion) - ? ProtocolVersion.getProtocol(clientSideVersion).getName() - : Integer.toString(clientSideVersion)); - this.children.add(protocolVersion); - - enableClientSideViaVersion = new TexturedButtonWidget(this.width / 2 + 113, 10, + ButtonWidget enableClientSideViaVersion = new TexturedButtonWidget(this.width / 2 + 113, 10, 40, 20, // Size 0, 0, // Start pos of texture 20, // v Hover offset new Identifier("viafabric:textures/gui/widgets.png"), 256, 256, // Texture size - button -> MinecraftClient.getInstance().openScreen(new ConfirmScreen( - answer -> { - MinecraftClient.getInstance().openScreen(this); - if (answer) { - ViaFabric.config.setClientSideEnabled(true); - ViaFabric.config.saveConfig(); - protocolVersion.setVisible(true); - enableClientSideViaVersion.visible = false; - } - }, - new TranslatableText("gui.enable_client_side.question"), - new TranslatableText("gui.enable_client_side.warning"), - I18n.translate("gui.enable_client_side.enable"), - I18n.translate("gui.cancel") - )), - I18n.translate("gui.enable_client_side_button")); - enableClientSideViaVersion.visible = !protocolVersion.isVisible(); + it -> MinecraftClient.getInstance().openScreen(new ViaConfigScreen(this)), + new TranslatableText("gui.via_button").asString()); + if (ViaFabric.config.isHideButton()) enableClientSideViaVersion.visible = false; addButton(enableClientSideViaVersion); } - - @Inject(method = "render", at = { - @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;render(IIF)V"), - @At(value = "INVOKE", target = "Lnet/minecraft/class_437;render(IIF)V") // todo check if refmap was fixed - }, remap = false) - private void onRender(int int_1, int int_2, float float_1, CallbackInfo ci) { - protocolVersion.render(int_1, int_2, float_1); - } - - @Inject(method = "tick", at = @At("TAIL"), remap = false) - private void onTick(CallbackInfo ci) { - protocolVersion.tick(); - } - - @Unique - private int getTextColor() { - if (!validProtocol) { - return 0xff0000; // Red - } else if (!supportedProtocol) { - return 0xFFA500; // Orange - } - return 0xE0E0E0; // Default - } - - @Unique - private boolean isSupported(int protocol) { - return ProtocolRegistry.getProtocolPath(ProtocolRegistry.SERVER_PROTOCOL, protocol) != null - || ProtocolRegistry.SERVER_PROTOCOL == protocol; - } } diff --git a/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinServerAddress.java b/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinServerAddress.java index e2a13e9..aad0f7b 100644 --- a/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinServerAddress.java +++ b/src/main/java/com/github/creeper123123321/viafabric/mixin/client/MixinServerAddress.java @@ -28,29 +28,21 @@ package com.github.creeper123123321.viafabric.mixin.client; import com.github.creeper123123321.viafabric.ViaFabricAddress; import net.minecraft.network.ServerAddress; 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.Arrays; - @Mixin(ServerAddress.class) public class MixinServerAddress { @Redirect(method = "parse", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ServerAddress;resolveSrv(Ljava/lang/String;)[Ljava/lang/String;")) private static String[] modifySrvAddr(String address) { ViaFabricAddress viaAddr = new ViaFabricAddress().parse(address); if (viaAddr.viaSuffix == null) { - return resolveSrv(address); + return ServerAddress.resolveSrv(address); } - String[] resolvedSrv = resolveSrv(viaAddr.realAddress); + String[] resolvedSrv = ServerAddress.resolveSrv(viaAddr.realAddress); resolvedSrv[0] = resolvedSrv[0].replaceAll("\\.$", "") + "." + viaAddr.viaSuffix; return resolvedSrv; } - - @Shadow - private static String[] resolveSrv(String address) { - throw new IllegalStateException(); - } } diff --git a/src/main/java/com/github/creeper123123321/viafabric/providers/VRVersionProvider.java b/src/main/java/com/github/creeper123123321/viafabric/providers/VRVersionProvider.java index e1311cf..cf0be41 100644 --- a/src/main/java/com/github/creeper123123321/viafabric/providers/VRVersionProvider.java +++ b/src/main/java/com/github/creeper123123321/viafabric/providers/VRVersionProvider.java @@ -28,6 +28,7 @@ package com.github.creeper123123321.viafabric.providers; import com.github.creeper123123321.viafabric.ViaFabric; import com.github.creeper123123321.viafabric.ViaFabricAddress; import com.github.creeper123123321.viafabric.platform.VRClientSideUserConnection; +import com.github.creeper123123321.viafabric.util.ProtocolUtils; import com.google.common.primitives.Ints; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.network.ClientConnection; @@ -83,44 +84,52 @@ public class VRVersionProvider extends VersionProvider { @Override public int getServerProtocol(UserConnection connection) throws Exception { if (connection instanceof VRClientSideUserConnection) { - int clientSideVersion = ViaFabric.config.getClientSideVersion(); + int serverVer = ViaFabric.config.getClientSideVersion(); SocketAddress addr = connection.getChannel().remoteAddress(); if (addr instanceof InetSocketAddress && ViaFabric.config.isClientSideEnabled()) { int addrVersion = new ViaFabricAddress().parse(((InetSocketAddress) addr).getHostName()).protocol; - if (addrVersion != 0) clientSideVersion = addrVersion; + if (addrVersion != 0) serverVer = addrVersion; } - boolean blocked = false; if (connection.getChannel() != null) { ProtocolInfo info = Objects.requireNonNull(connection.getProtocolInfo()); - if (addr instanceof InetSocketAddress && (isDisabled(((InetSocketAddress) addr).getHostString()) - || ((((InetSocketAddress) addr).getAddress() != null) && - (isDisabled(((InetSocketAddress) addr).getAddress().getHostAddress()) - || isDisabled(((InetSocketAddress) addr).getAddress().getHostName()))))) { - blocked = true; - } + boolean blocked = checkAddressBlocked(addr); + boolean supported = ProtocolUtils.isSupported(serverVer, info.getProtocolVersion()); - if (info.getState() == State.STATUS && info.getProtocolVersion() == -1 - && (clientSideVersion != -1 || blocked) - && connection.getChannel().pipeline().get(ClientConnection.class).getPacketListener() - .getClass().getName().startsWith("net.earthcomputer.multiconnect")) { // multiconnect version detector - int multiconnectSuggestion = getVersionForMulticonnect(clientSideVersion); - if (blocked) multiconnectSuggestion = -1; - ViaFabric.JLOGGER.info("Sending " + ProtocolVersion.getProtocol(multiconnectSuggestion) + " for multiconnect version detector"); - PacketWrapper newAnswer = new PacketWrapper(0x00, null, connection); - newAnswer.write(Type.STRING, "{\"version\":{\"name\":\"viafabric integration\",\"protocol\":" + multiconnectSuggestion + "}}"); - newAnswer.send(info.getPipeline().contains(BaseProtocol1_16.class) ? BaseProtocol1_16.class : BaseProtocol1_7.class); - throw CancelException.generate(); - } - if (clientSideVersion == -1 || blocked) return info.getProtocolVersion(); + handleMulticonnectPing(connection, info, blocked, supported, serverVer); + + if (serverVer == -1 || blocked) return info.getProtocolVersion(); } - return clientSideVersion; + return serverVer; } return super.getServerProtocol(connection); } + private boolean checkAddressBlocked(SocketAddress addr) { + return addr instanceof InetSocketAddress && (isDisabled(((InetSocketAddress) addr).getHostString()) + || ((((InetSocketAddress) addr).getAddress() != null) && + (isDisabled(((InetSocketAddress) addr).getAddress().getHostAddress()) + || isDisabled(((InetSocketAddress) addr).getAddress().getHostName())))); + } + + private void handleMulticonnectPing(UserConnection connection, ProtocolInfo info, boolean blocked, boolean supported, int serverVer) throws Exception { + if (info.getState() == State.STATUS + && info.getProtocolVersion() == -1 + && connection.getChannel().pipeline().get(ClientConnection.class).getPacketListener() + .getClass().getName().startsWith("net.earthcomputer.multiconnect") // multiconnect version detector + && (supported || blocked)) { // Intercept the connection + int multiconnectSuggestion = getVersionForMulticonnect(serverVer); + if (blocked) multiconnectSuggestion = -1; + ViaFabric.JLOGGER.info("Sending " + ProtocolVersion.getProtocol(multiconnectSuggestion) + " for multiconnect version detector"); + PacketWrapper newAnswer = new PacketWrapper(0x00, null, connection); + newAnswer.write(Type.STRING, "{\"version\":{\"name\":\"viafabric integration\",\"protocol\":" + multiconnectSuggestion + "}}"); + newAnswer.send(info.getPipeline().contains(BaseProtocol1_16.class) ? BaseProtocol1_16.class : BaseProtocol1_7.class); + throw CancelException.generate(); + } + } + private int getVersionForMulticonnect(int clientSideVersion) { // https://github.com/ViaVersion/ViaVersion/blob/master/velocity/src/main/java/us/myles/ViaVersion/velocity/providers/VelocityVersionProvider.java // multiconnect supports it diff --git a/src/main/java/com/github/creeper123123321/viafabric/util/VersionFormatFilter.java b/src/main/java/com/github/creeper123123321/viafabric/util/ProtocolUtils.java similarity index 61% rename from src/main/java/com/github/creeper123123321/viafabric/util/VersionFormatFilter.java rename to src/main/java/com/github/creeper123123321/viafabric/util/ProtocolUtils.java index a076a66..2ab326a 100644 --- a/src/main/java/com/github/creeper123123321/viafabric/util/VersionFormatFilter.java +++ b/src/main/java/com/github/creeper123123321/viafabric/util/ProtocolUtils.java @@ -25,15 +25,24 @@ package com.github.creeper123123321.viafabric.util; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolVersion; import java.util.Arrays; -import java.util.function.Predicate; import java.util.stream.Stream; -public class VersionFormatFilter implements Predicate { - @Override - public boolean test(String s) { +public class ProtocolUtils { + public static boolean isSupported(int server, int client) { + return server == client || ProtocolRegistry.getProtocolPath(client, server) != null; + } + + public static String getProtocolName(int id) { + ProtocolVersion ver = ProtocolVersion.getProtocol(id); + if (ver == null) return Integer.toString(id); + return ver.getName(); + } + + public static boolean isStartOfProtocolText(String s) { try { Integer.parseInt(s); return true; @@ -52,4 +61,26 @@ public class VersionFormatFilter implements Predicate { } } } + + public static Integer parseProtocolId(String s) { + try { + return Integer.parseInt(s); + } catch (NumberFormatException ignored) { + ProtocolVersion closest = ProtocolVersion.getClosest(s); + if (closest == null) return null; + return closest.getId(); + } + } + + public static String[] getProtocolSuggestions(String text) { + return ProtocolVersion.getProtocols().stream() + .map(ProtocolVersion::getName) + .flatMap(str -> Stream.concat( + Arrays.stream(str.split("-")), + Arrays.stream(new String[]{str}) + )) + .distinct() + .filter(ver -> ver.startsWith(text)) + .toArray(String[]::new); + } } diff --git a/src/main/resources/assets/viafabric/config.yml b/src/main/resources/assets/viafabric/config.yml index 186e22f..84481c4 100644 --- a/src/main/resources/assets/viafabric/config.yml +++ b/src/main/resources/assets/viafabric/config.yml @@ -4,7 +4,9 @@ enable-client-side: false # This option sets the protocol version to be used when connection to the server (can also be changed in-game) client-side-version: -1 -# List of servers which ViaFabric will force disabling transforming on client-side. +# Hides VIA button from multiplayer menu. +hide-button: false +# List of servers which ViaFabric will force disabling transforming on client-side. It can be overwritten by setting per-server version. # This isn't always the address in multiplayer GUI. It will use the SRV record pointer when present. Check the game log for the address. # Uses https://wiki.vg/Mojang_API#Blocked_Servers format (mc.example.com, *.example.com, 192.168.0.1, 192.168.*) client-side-force-disable: ["hypixel.net", "*.hypixel.net", "hivemc.com", "*.hivemc.com", "hivemc.eu", "*.hivemc.eu"] \ No newline at end of file diff --git a/src/main/resources/assets/viafabric/lang/en_us.json b/src/main/resources/assets/viafabric/lang/en_us.json index 819cdb6..8edaadf 100644 --- a/src/main/resources/assets/viafabric/lang/en_us.json +++ b/src/main/resources/assets/viafabric/lang/en_us.json @@ -3,5 +3,12 @@ "gui.enable_client_side_button": "Enable ViaVersion", "gui.enable_client_side.question": "Are you sure you want to enable client-side mode?", "gui.enable_client_side.warning": "I cannot guarantee that this mod is allowed on every (or even any) server. This mod may cause problems with anti-cheat plugins. USE AT OWN RISK.", - "gui.enable_client_side.enable": "Enable" + "gui.enable_client_side.enable": "Enable", + "gui.viafabric_config.title": "ViaFabric Configurations", + "gui.client_side.enable": "Enable client-side", + "gui.client_side.disable": "Disable client-side", + "gui.ping_version.translated": "VIA: %s", + "gui.hide_via_button.enable": "Hide VIA button", + "gui.hide_via_button.disable": "Show VIA button", + "gui.via_button": "VIA" } \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 78655fa..8737969 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -63,6 +63,9 @@ ], "cotton-client-commands": [ "com.github.creeper123123321.viafabric.commands.VRClientCommands" + ], + "modmenu": [ + "com.github.creeper123123321.viafabric.gui.ModMenuConfig" ] }, "depends": { @@ -81,5 +84,6 @@ "icon": "assets/viafabric/textures/logo.png", "mixins": [ "mixins.viafabric.json" - ] + ], + "accessWidener": "viafabric.accesswidener" } diff --git a/src/main/resources/viafabric.accesswidener b/src/main/resources/viafabric.accesswidener new file mode 100644 index 0000000..61c5e14 --- /dev/null +++ b/src/main/resources/viafabric.accesswidener @@ -0,0 +1,4 @@ +accessWidener v1 named + +# @Shadow bug workaround https://github.com/FabricMC/fabric-loom/issues/279 +accessible method net/minecraft/network/ServerAddress resolveSrv (Ljava/lang/String;)[Ljava/lang/String; \ No newline at end of file