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
+ }
+}