From 18f17e4494bad139446ff3b71bbcbb98a529a5da Mon Sep 17 00:00:00 2001 From: FlorianMichael <60033407+FlorianMichael@users.noreply.github.com> Date: Fri, 20 Oct 2023 18:32:52 +0200 Subject: [PATCH] Add support for Minecraft 1.16.5 :tm: --- .github/workflows/main.yml | 6 +- build.gradle | 19 ---- settings.gradle | 1 + viaforge-mc112/build.gradle | 19 ++++ .../viaforge/gui/GuiProtocolSelector.java | 2 +- .../viaforge/mixin/MixinLoader.java | 2 +- viaforge-mc112/src/main/resources/mcmod.info | 8 +- ...aforge.json => mixins.viaforge-mc112.json} | 0 viaforge-mc116/build.gradle | 82 ++++++++++++++ viaforge-mc116/gradle.properties | 2 + .../de/florianmichael/viaforge/ViaForge.java | 42 ++++++++ .../viaforge/gui/GuiProtocolSelector.java | 102 ++++++++++++++++++ .../viaforge/mixin/MixinMainMenuScreen.java | 45 ++++++++ .../mixin/MixinMultiplayerScreen.java | 44 ++++++++ .../viaforge/mixin/MixinNetworkManager.java | 38 +++++++ .../viaforge/mixin/MixinNetworkManager_1.java | 44 ++++++++ .../viaforge/mixin/MixinServerListScreen.java | 44 ++++++++ .../protocolhack/ViaForgeVLInjector.java | 34 ++++++ .../ViaForgeVLLegacyPipeline.java | 59 ++++++++++ .../protocolhack/ViaForgeVLLoader.java | 45 ++++++++ .../src/main/resources/META-INF/mods.toml | 17 +++ .../main/resources/mixins.viaforge-mc116.json | 17 +++ viaforge-mc116/src/main/resources/pack.mcmeta | 6 ++ 23 files changed, 652 insertions(+), 26 deletions(-) rename viaforge-mc112/src/main/resources/{mixins.viaforge.json => mixins.viaforge-mc112.json} (100%) create mode 100644 viaforge-mc116/build.gradle create mode 100644 viaforge-mc116/gradle.properties create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/ViaForge.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMainMenuScreen.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMultiplayerScreen.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager_1.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinServerListScreen.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLInjector.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLegacyPipeline.java create mode 100644 viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLoader.java create mode 100644 viaforge-mc116/src/main/resources/META-INF/mods.toml create mode 100644 viaforge-mc116/src/main/resources/mixins.viaforge-mc116.json create mode 100644 viaforge-mc116/src/main/resources/pack.mcmeta diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d4265cd..f3930cf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -26,5 +26,7 @@ jobs: if: ${{ runner.os == 'Linux' && matrix.java == '8' }} uses: actions/upload-artifact@v3 with: - name: ViaForge-1.12.2 - path: viaforge-mc112/build/libs/ + name: ViaForge All-in-One + path: | + - viaforge-mc112/build/libs/ + - viaforge-mc116/build/libs/ diff --git a/build.gradle b/build.gradle index 2bae1ab..d46d67c 100644 --- a/build.gradle +++ b/build.gradle @@ -32,23 +32,4 @@ subprojects { include "net.raphimc:ViaLoader:${project.vialoader_version}" } - - jar { - manifest.attributes( - "Specification-Title": "viaforge", - "Specification-Vendor": "viaforge", - "Specification-Version": "1", - "Implementation-Title": project.name, - "Implementation-Version": "${archiveVersion}", - "Implementation-Vendor" :"viaforge", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd"-"HH:mm:ssZ"), - "TweakClass": "org.spongepowered.asm.launch.MixinTweaker", - "TweakOrder": "0", - "FMLCorePluginContainsFMLMod": "true", - "FMLCorePlugin": "de.florianmichael.viaforge.mixin.MixinLoader", - "MixinConfigs": "mixins.${maven_name}.json", - "ForceLoadAsMod": "true" - ) - enabled = false - } } diff --git a/settings.gradle b/settings.gradle index 07eb70b..a856e16 100644 --- a/settings.gradle +++ b/settings.gradle @@ -13,4 +13,5 @@ pluginManagement { rootProject.name = "ViaForge" include "viaforge-mc112" +include 'viaforge-mc116' diff --git a/viaforge-mc112/build.gradle b/viaforge-mc112/build.gradle index f4e9be6..7aff85a 100644 --- a/viaforge-mc112/build.gradle +++ b/viaforge-mc112/build.gradle @@ -48,6 +48,25 @@ mixin { add sourceSets.main, "mixins.${maven_name}.refmap.json" } +jar { + manifest.attributes( + "Specification-Title": "viaforge", + "Specification-Vendor": "viaforge", + "Specification-Version": "1", + "Implementation-Title": project.name, + "Implementation-Version": "${archiveVersion}", + "Implementation-Vendor" :"viaforge", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd"-"HH:mm:ssZ"), + "TweakClass": "org.spongepowered.asm.launch.MixinTweaker", + "TweakOrder": "0", + "FMLCorePluginContainsFMLMod": "true", + "FMLCorePlugin": "de.florianmichael.viaforge.mixin.MixinLoader", + "MixinConfigs": "mixins.${maven_name}.json", + "ForceLoadAsMod": "true" + ) + enabled = false +} + shadowJar { archiveFileName = jar.archiveFileName configurations = [project.configurations.include] diff --git a/viaforge-mc112/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java b/viaforge-mc112/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java index 4de9f76..67190ff 100644 --- a/viaforge-mc112/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java +++ b/viaforge-mc112/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java @@ -66,7 +66,7 @@ public class GuiProtocolSelector extends GuiScreen { this.drawCenteredString(this.fontRenderer, ChatFormatting.GOLD + "ViaForge", this.width / 4, 6, 16777215); GL11.glPopMatrix(); - drawString(this.fontRenderer, "by https://github.com/FlorianMichael/ViaForge", 1, 1, -1); + drawString(this.fontRenderer, "by https://github.com/ViaVersion/ViaForge", 1, 1, -1); drawString(this.fontRenderer, "Discord: florianmichael", 1, 11, -1); super.drawScreen(p_drawScreen_1_, p_drawScreen_2_, p_drawScreen_3_); diff --git a/viaforge-mc112/src/main/java/de/florianmichael/viaforge/mixin/MixinLoader.java b/viaforge-mc112/src/main/java/de/florianmichael/viaforge/mixin/MixinLoader.java index 333b933..c362ed0 100644 --- a/viaforge-mc112/src/main/java/de/florianmichael/viaforge/mixin/MixinLoader.java +++ b/viaforge-mc112/src/main/java/de/florianmichael/viaforge/mixin/MixinLoader.java @@ -28,7 +28,7 @@ public class MixinLoader implements IFMLLoadingPlugin { public MixinLoader() { MixinBootstrap.init(); - Mixins.addConfiguration("mixins.viaforge.json"); + Mixins.addConfiguration("mixins.viaforge-mc112.json"); MixinEnvironment.getDefaultEnvironment().setSide(MixinEnvironment.Side.CLIENT); } diff --git a/viaforge-mc112/src/main/resources/mcmod.info b/viaforge-mc112/src/main/resources/mcmod.info index 3d94b05..ea3d531 100644 --- a/viaforge-mc112/src/main/resources/mcmod.info +++ b/viaforge-mc112/src/main/resources/mcmod.info @@ -5,10 +5,12 @@ "description": "Client-side Implementation of ViaVersion, ViaBackwards and ViaRewind for Legacy Minecraft Forge", "version": "3.3.3", "mcversion": "[1.8,1.12.2]", - "url": "https://github.com/FlorianMichael/ViaForge", + "url": "https://github.com/ViaVersion/ViaForge", "updateUrl": "", - "authorList": [], - "credits": "", + "authorList": [ + "FlorianMichael/EnZaXD" + ], + "credits": "https://github.com/FlorianMichael/", "logoFile": "", "screenshots": [], "dependencies": [] diff --git a/viaforge-mc112/src/main/resources/mixins.viaforge.json b/viaforge-mc112/src/main/resources/mixins.viaforge-mc112.json similarity index 100% rename from viaforge-mc112/src/main/resources/mixins.viaforge.json rename to viaforge-mc112/src/main/resources/mixins.viaforge-mc112.json diff --git a/viaforge-mc116/build.gradle b/viaforge-mc116/build.gradle new file mode 100644 index 0000000..be5065b --- /dev/null +++ b/viaforge-mc116/build.gradle @@ -0,0 +1,82 @@ +plugins { + id "net.minecraftforge.gradle" version "5.1.+" + id "org.spongepowered.mixin" version "0.7-SNAPSHOT" +} + +java.toolchain.languageVersion = JavaLanguageVersion.of(8) +compileJava.options.encoding = "UTF-8" + +minecraft { + mappings channel: "official", version: "1.16.5" + + runs { + client { + workingDirectory project.file("run") + + property 'forge.logging.markers', 'REGISTRIES' + property "forge.logging.console.level", "debug" + + // mixin + property 'mixin.debug.export', 'true' + property "mixin.hotSwap", "true" + property "fml.coreMods.load", "de.florianmichael.viaforge.mixin.MixinLoader" + args '-mixin.config=' + 'mixins.' + project.getProperty('maven_name') + '.json' + + mods { + "ViaForge" { + source sourceSets.main + } + } + } + } +} + +sourceSets.main.resources { + srcDir "src/generated/resources" +} + +dependencies { + minecraft "net.minecraftforge:forge:1.16.5-36.2.34" + + include "org.spongepowered:mixin:${mixin_version}" + include "org.slf4j:slf4j-api:${project.slf4j_version}" + + annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" +} + +mixin { + add sourceSets.main, "mixins.${maven_name}.refmap.json" +} + +jar { + manifest.attributes( + "Specification-Title": "viaforge", + "Specification-Vendor": "viaforge", + "Specification-Version": "1", + "Implementation-Title": project.name, + "Implementation-Version": "${archiveVersion}", + "Implementation-Vendor" :"viaforge", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd"-"HH:mm:ssZ"), + "TweakClass": "org.spongepowered.asm.launch.MixinTweaker", + "TweakOrder": "0", + "MixinConfigs": "mixins.${maven_name}.json", + "ForceLoadAsMod": "true" + ) + enabled = false +} + +shadowJar { + archiveFileName = jar.archiveFileName + configurations = [project.configurations.include] + duplicatesStrategy DuplicatesStrategy.EXCLUDE + + exclude("META-INF/maven/**") + exclude("META-INF/services/**") + exclude("META-INF/versions/**") +} + +reobf { + shadowJar {} +} + +jar.dependsOn("shadowJar") diff --git a/viaforge-mc116/gradle.properties b/viaforge-mc116/gradle.properties new file mode 100644 index 0000000..229f7cb --- /dev/null +++ b/viaforge-mc116/gradle.properties @@ -0,0 +1,2 @@ +maven_name=viaforge-mc116 +mc_version=1.16.5 diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/ViaForge.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/ViaForge.java new file mode 100644 index 0000000..d2e2dae --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/ViaForge.java @@ -0,0 +1,42 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge; + +import de.florianmichael.viaforge.protocolhack.ViaForgeVLInjector; +import de.florianmichael.viaforge.protocolhack.ViaForgeVLLoader; +import net.minecraftforge.fml.common.Mod; +import net.raphimc.vialoader.ViaLoader; +import net.raphimc.vialoader.impl.platform.ViaBackwardsPlatformImpl; +import net.raphimc.vialoader.impl.platform.ViaRewindPlatformImpl; +import net.raphimc.vialoader.util.VersionEnum; + +@Mod("viaforge") +public class ViaForge { + public final static VersionEnum NATIVE_VERSION = VersionEnum.r1_16_4tor1_16_5; + + public static VersionEnum targetVersion = VersionEnum.r1_16_4tor1_16_5; + + private static boolean loaded; + + public static void initViaVersion() { + if (loaded) return; + + ViaLoader.init(null, new ViaForgeVLLoader(), new ViaForgeVLInjector(), null, ViaBackwardsPlatformImpl::new, ViaRewindPlatformImpl::new); + loaded = true; + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java new file mode 100644 index 0000000..2166830 --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/gui/GuiProtocolSelector.java @@ -0,0 +1,102 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.gui; + +import com.mojang.blaze3d.matrix.MatrixStack; +import de.florianmichael.viaforge.ViaForge; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.client.gui.widget.list.AbstractList; +import net.minecraft.client.gui.widget.list.ExtendedList; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; +import net.raphimc.vialoader.util.VersionEnum; +import org.lwjgl.opengl.GL11; + +public class GuiProtocolSelector extends Screen { + + private final Screen parent; + + public static void open(final Minecraft minecraft) { // Bypass for some weird bytecode instructions errors in Forge + minecraft.setScreen(new GuiProtocolSelector(minecraft.screen)); + } + + private SlotList slotList; + + public GuiProtocolSelector(Screen parent) { + super(ITextComponent.nullToEmpty("ViaForge Protocol Selector")); + this.parent = parent; + } + + @Override + protected void init() { + super.init(); + + addWidget(slotList = new SlotList(minecraft, width, height, 32, height - 32, 10)); + addButton(new Button(width / 2 - 100, height - 27, 200, 20, ITextComponent.nullToEmpty("Back"), b -> minecraft.setScreen(parent))); + } + + @Override + public void render(MatrixStack p_230430_1_, int p_230430_2_, int p_230430_3_, float p_230430_4_) { + renderBackground(p_230430_1_); + this.slotList.render(p_230430_1_, p_230430_2_, p_230430_3_, p_230430_4_); + + super.render(p_230430_1_, p_230430_2_, p_230430_3_, p_230430_4_); + + GL11.glPushMatrix(); + GL11.glScalef(2.0F, 2.0F, 2.0F); + drawCenteredString(p_230430_1_, this.font, ITextComponent.nullToEmpty(TextFormatting.GOLD + "ViaForge"), this.width / 4, 6, 16777215); + GL11.glPopMatrix(); + + drawString(p_230430_1_, this.font, "by https://github.com/ViaVersion/ViaForge", 1, 1, -1); + drawString(p_230430_1_, this.font, "Discord: florianmichael", 1, 11, -1); + } + + static class SlotList extends ExtendedList { + + public SlotList(Minecraft p_i51146_1_, int p_i51146_2_, int p_i51146_3_, int p_i51146_4_, int p_i51146_5_, int p_i51146_6_) { + super(p_i51146_1_, p_i51146_2_, p_i51146_3_, p_i51146_4_, p_i51146_5_, p_i51146_6_); + + for (VersionEnum version : VersionEnum.SORTED_VERSIONS) { + addEntry(new SlotEntry(version)); + } + } + + public class SlotEntry extends AbstractList.AbstractListEntry { + + private final VersionEnum versionEnum; + + public SlotEntry(VersionEnum versionEnum) { + this.versionEnum = versionEnum; + } + + @Override + public boolean mouseClicked(double p_231044_1_, double p_231044_3_, int p_231044_5_) { + ViaForge.targetVersion = versionEnum; + return super.mouseClicked(p_231044_1_, p_231044_3_, p_231044_5_); + } + + @Override + public void render(MatrixStack p_230432_1_, int p_230432_2_, int p_230432_3_, int p_230432_4_, int p_230432_5_, int p_230432_6_, int p_230432_7_, int p_230432_8_, boolean p_230432_9_, float p_230432_10_) { + drawCenteredString(p_230432_1_, Minecraft.getInstance().font, + (ViaForge.targetVersion.getVersion() == versionEnum.getVersion() ? TextFormatting.GREEN.toString() : TextFormatting.DARK_RED.toString()) + versionEnum.getName(), width / 2, p_230432_3_, -1); + } + } + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMainMenuScreen.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMainMenuScreen.java new file mode 100644 index 0000000..47d795a --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMainMenuScreen.java @@ -0,0 +1,45 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.mixin; + +import de.florianmichael.viaforge.ViaForge; +import de.florianmichael.viaforge.gui.GuiProtocolSelector; +import net.minecraft.client.gui.screen.MainMenuScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(MainMenuScreen.class) +public class MixinMainMenuScreen extends Screen { + + public MixinMainMenuScreen(ITextComponent p_i51108_1_) { + super(p_i51108_1_); + } + + @Inject(method = "init", at = @At("HEAD")) + public void hookViaForgeButton(CallbackInfo ci) { + addButton(new Button(5, 6, 98, 20, new StringTextComponent("ViaForge"), b -> GuiProtocolSelector.open(minecraft))); + + ViaForge.initViaVersion(); + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMultiplayerScreen.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMultiplayerScreen.java new file mode 100644 index 0000000..d10e2df --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinMultiplayerScreen.java @@ -0,0 +1,44 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.mixin; + +import de.florianmichael.viaforge.ViaForge; +import de.florianmichael.viaforge.gui.GuiProtocolSelector; +import net.minecraft.client.gui.screen.MultiplayerScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.util.text.ITextComponent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(MultiplayerScreen.class) +public class MixinMultiplayerScreen extends Screen { + + protected MixinMultiplayerScreen(ITextComponent p_i51108_1_) { + super(p_i51108_1_); + } + + @Inject(method = "init", at = @At("RETURN")) + public void hookViaForgeButton(CallbackInfo ci) { + addButton(new Button(5, 6, 98, 20, ITextComponent.nullToEmpty("ViaForge"), b -> minecraft.setScreen(new GuiProtocolSelector(this)))); + + ViaForge.initViaVersion(); + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager.java new file mode 100644 index 0000000..ca36f19 --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager.java @@ -0,0 +1,38 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.mixin; + +import io.netty.channel.Channel; +import net.minecraft.network.NetworkManager; +import net.raphimc.vialoader.netty.CompressionReorderEvent; +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(NetworkManager.class) +public class MixinNetworkManager { + + @Shadow private Channel channel; + + @Inject(method = "setupCompression", at = @At("RETURN")) + public void reorderPipeline(int p_setCompressionTreshold_1_, CallbackInfo ci) { + channel.pipeline().fireUserEventTriggered(CompressionReorderEvent.INSTANCE); + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager_1.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager_1.java new file mode 100644 index 0000000..424fe67 --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinNetworkManager_1.java @@ -0,0 +1,44 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.mixin; + +import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.connection.UserConnectionImpl; +import com.viaversion.viaversion.protocol.ProtocolPipelineImpl; +import de.florianmichael.viaforge.ViaForge; +import de.florianmichael.viaforge.protocolhack.ViaForgeVLLegacyPipeline; +import io.netty.channel.Channel; +import io.netty.channel.socket.SocketChannel; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(targets = "net.minecraft.network.NetworkManager$1", remap = false) +public class MixinNetworkManager_1 { + + @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false) + private void onInitChannel(Channel channel, CallbackInfo ci) { + if (channel instanceof SocketChannel && ViaForge.targetVersion != ViaForge.NATIVE_VERSION) { + final UserConnection user = new UserConnectionImpl(channel, true); + new ProtocolPipelineImpl(user); + + channel.pipeline().addLast(new ViaForgeVLLegacyPipeline(user, ViaForge.targetVersion)); + } + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinServerListScreen.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinServerListScreen.java new file mode 100644 index 0000000..f344dc9 --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/mixin/MixinServerListScreen.java @@ -0,0 +1,44 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.mixin; + +import de.florianmichael.viaforge.ViaForge; +import de.florianmichael.viaforge.gui.GuiProtocolSelector; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.ServerListScreen; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.util.text.ITextComponent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ServerListScreen.class) +public class MixinServerListScreen extends Screen { + + protected MixinServerListScreen(ITextComponent p_i51108_1_) { + super(p_i51108_1_); + } + + @Inject(method = "init", at = @At("RETURN")) + public void hookViaForgeButton(CallbackInfo ci) { + addButton(new Button(5, 6, 98, 20, ITextComponent.nullToEmpty("ViaForge"), b -> minecraft.setScreen(new GuiProtocolSelector(this)))); + + ViaForge.initViaVersion(); + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLInjector.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLInjector.java new file mode 100644 index 0000000..5a30719 --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLInjector.java @@ -0,0 +1,34 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.protocolhack; + +import net.raphimc.vialoader.impl.viaversion.VLInjector; +import net.raphimc.vialoader.netty.VLLegacyPipeline; + +public class ViaForgeVLInjector extends VLInjector { + + @Override + public String getDecoderName() { + return VLLegacyPipeline.VIA_DECODER_NAME; + } + + @Override + public String getEncoderName() { + return VLLegacyPipeline.VIA_ENCODER_NAME; + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLegacyPipeline.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLegacyPipeline.java new file mode 100644 index 0000000..37da249 --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLegacyPipeline.java @@ -0,0 +1,59 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.protocolhack; + +import com.viaversion.viaversion.api.connection.UserConnection; +import net.raphimc.vialoader.netty.VLLegacyPipeline; +import net.raphimc.vialoader.util.VersionEnum; + +public class ViaForgeVLLegacyPipeline extends VLLegacyPipeline { + + public ViaForgeVLLegacyPipeline(UserConnection user, VersionEnum version) { + super(user, version); + } + + @Override + protected String decompressName() { + return "decompress"; + } + + @Override + protected String compressName() { + return "compress"; + } + + @Override + protected String packetDecoderName() { + return "decoder"; + } + + @Override + protected String packetEncoderName() { + return "encoder"; + } + + @Override + protected String lengthSplitterName() { + return "splitter"; + } + + @Override + protected String lengthPrependerName() { + return "prepender"; + } +} diff --git a/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLoader.java b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLoader.java new file mode 100644 index 0000000..2158ad3 --- /dev/null +++ b/viaforge-mc116/src/main/java/de/florianmichael/viaforge/protocolhack/ViaForgeVLLoader.java @@ -0,0 +1,45 @@ +/* + * This file is part of ViaForge - https://github.com/FlorianMichael/ViaForge + * 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.viaforge.protocolhack; + +import com.viaversion.viaversion.api.Via; +import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.protocol.version.VersionProvider; +import com.viaversion.viaversion.protocols.base.BaseVersionProvider; +import de.florianmichael.viaforge.ViaForge; +import net.minecraft.client.Minecraft; +import net.raphimc.vialoader.impl.viaversion.VLLoader; + +public class ViaForgeVLLoader extends VLLoader { + + @Override + public void load() { + super.load(); + + Via.getManager().getProviders().use(VersionProvider.class, new BaseVersionProvider() { + @Override + public int getClosestServerProtocol(UserConnection connection) throws Exception { + if (connection.isClientSide() && !Minecraft.getInstance().hasSingleplayerServer()) { + return ViaForge.targetVersion.getVersion(); + } + + return super.getClosestServerProtocol(connection); + } + }); + } +} diff --git a/viaforge-mc116/src/main/resources/META-INF/mods.toml b/viaforge-mc116/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..da8666d --- /dev/null +++ b/viaforge-mc116/src/main/resources/META-INF/mods.toml @@ -0,0 +1,17 @@ +modLoader="javafml" +loaderVersion="[1,)" + +license="GPL-3.0 license" +issueTrackerURL="https://github.com/ViaVersion/ViaForge/issues" +showAsResourcePack=false + +[[mods]] +modId="viaforge" +version="3.3.3" +displayName="ViaForge" +displayURL="https://github.com/FlorianMichael" +credits="FlorianMichael/EnZaXD and all ViaVersion/ViaForge contributors" +authors="FlorianMichael/EnZaXD" +description=''' + Client-side Implementation of ViaVersion, ViaBackwards and ViaRewind for Legacy Minecraft Forge + ''' \ No newline at end of file diff --git a/viaforge-mc116/src/main/resources/mixins.viaforge-mc116.json b/viaforge-mc116/src/main/resources/mixins.viaforge-mc116.json new file mode 100644 index 0000000..ebd2aa4 --- /dev/null +++ b/viaforge-mc116/src/main/resources/mixins.viaforge-mc116.json @@ -0,0 +1,17 @@ +{ + "required": true, + "minVersion": "0.7.5", + "compatibilityLevel": "JAVA_8", + "package": "de.florianmichael.viaforge.mixin", + "mixins": [ + "MixinNetworkManager", + "MixinNetworkManager_1", + "MixinMainMenuScreen", + "MixinMultiplayerScreen", + "MixinServerListScreen" + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "mixins.viaforge-mc116.refmap.json" +} diff --git a/viaforge-mc116/src/main/resources/pack.mcmeta b/viaforge-mc116/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..efafd46 --- /dev/null +++ b/viaforge-mc116/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "ViaForge", + "pack_format": 3 + } +}