├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── lombok.config
├── core
├── src
│ └── main
│ │ ├── java
│ │ └── de
│ │ │ └── rexlmanu
│ │ │ └── viaversionaddon
│ │ │ └── core
│ │ │ ├── handler
│ │ │ ├── PipelineReorderEvent.java
│ │ │ ├── CommonTransformer.java
│ │ │ ├── ViaEncodeHandler.java
│ │ │ └── ViaDecodeHandler.java
│ │ │ ├── Constants.java
│ │ │ ├── platform
│ │ │ ├── AddonViaAPI.java
│ │ │ ├── AddonViaInjector.java
│ │ │ ├── AddonViaConfig.java
│ │ │ └── AddonViaPlatform.java
│ │ │ ├── utility
│ │ │ └── FutureTaskId.java
│ │ │ ├── loader
│ │ │ ├── AddonRewindLoader.java
│ │ │ ├── AddonBackwardsLoader.java
│ │ │ └── AddonViaProviderLoader.java
│ │ │ ├── ViaVersionConfiguration.java
│ │ │ ├── version
│ │ │ └── Version.java
│ │ │ └── ViaVersionAddon.java
│ │ └── resources
│ │ └── assets
│ │ └── viaversionaddon
│ │ └── i18n
│ │ └── en_us.json
└── build.gradle.kts
├── .idea
├── .gitignore
└── google-java-format.xml
├── settings.gradle.kts
├── gradle.properties
├── README.md
├── .github
└── workflows
│ └── build.yml
├── versions
├── v1_17
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── de
│ │ │ └── rexlmanu
│ │ │ └── viaversionaddon
│ │ │ └── v1_17
│ │ │ └── mixins
│ │ │ ├── MixinConnection.java
│ │ │ └── MixinConnectionChInit.java
│ ├── build.gradle.kts
│ └── runClient.launch
├── v1_18
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── de
│ │ │ └── rexlmanu
│ │ │ └── viaversionaddon
│ │ │ └── v1_18
│ │ │ └── mixins
│ │ │ ├── MixinConnection.java
│ │ │ └── MixinConnectionChInit.java
│ ├── build.gradle.kts
│ └── runClient.launch
├── v1_19
│ ├── src
│ │ └── main
│ │ │ └── java
│ │ │ └── de
│ │ │ └── rexlmanu
│ │ │ └── viaversionaddon
│ │ │ └── v1_19
│ │ │ └── mixins
│ │ │ ├── MixinConnection.java
│ │ │ └── MixinConnectionChInit.java
│ ├── runClient.launch
│ └── build.gradle.kts
└── v1_8
│ ├── src
│ └── main
│ │ └── java
│ │ └── de
│ │ └── rexlmanu
│ │ └── viaversionaddon
│ │ └── v1_8
│ │ └── mixins
│ │ ├── MixinNetworkManager.java
│ │ └── MixinNetworkManagerChInit.java
│ └── build.gradle.kts
├── api
└── build.gradle.kts
├── gradlew.bat
├── .gitignore
├── gradlew
├── LICENSE
└── .editorconfig
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ViaVersionAddons/labymod-addon/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/lombok.config:
--------------------------------------------------------------------------------
1 | config.stopBubbling = true
2 | lombok.accessors.fluent = true
3 | lombok.accessors.chain = true
4 | lombok.addNullAnnotations = jetbrains
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/handler/PipelineReorderEvent.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.handler;
2 |
3 | public class PipelineReorderEvent {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Datasource local storage ignored files
5 | /dataSources/
6 | /dataSources.local.xml
7 | # Editor-based HTTP Client requests
8 | /httpRequests/
9 |
--------------------------------------------------------------------------------
/.idea/google-java-format.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | rootProject.name = "viaversionaddon"
2 |
3 | include(":api")
4 | include(":core")
5 | include(":versions:v1_8")
6 | include(":versions:v1_17")
7 | include(":versions:v1_18")
8 | include(":versions:v1_19")
9 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/Constants.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core;
2 |
3 | public interface Constants {
4 |
5 | String NAME = "ViaVersionAddon";
6 | String ENCODER_NAME = "via-encoder";
7 | String DECODER_NAME = "via-decoder";
8 | }
9 |
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/platform/AddonViaAPI.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.platform;
2 |
3 | import com.viaversion.viaversion.ViaAPIBase;
4 | import java.util.UUID;
5 |
6 | public class AddonViaAPI extends ViaAPIBase {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/core/src/main/resources/assets/viaversionaddon/i18n/en_us.json:
--------------------------------------------------------------------------------
1 | {
2 | "viaversionaddon": {
3 | "settings": {
4 | "name": "ViaVersionAddon",
5 | "enabled": {
6 | "name": "Enabled"
7 | },
8 | "version": {
9 | "name": "Version"
10 | }
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx4096m
2 | net.labymod.labymod4.release-type=internal
3 | net.labymod.labymod4.addon-annotation-processor-version=0.1.0
4 | net.labymod.labymod4.injection-processor-version=0.1.0
5 | net.labymod.labymod4.api-version=0.1.0
6 | net.labymod.labymod4.core-version=4.0.0
7 | net.labymod.labymod4.v1_8-version=0.1.0
8 | net.labymod.labymod4.v1_17-version=0.1.0
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ViaVersion Addon
2 |
3 | This is a labymod addon for [ViaVersion](https://viaversion.com) to easily switch your protocol
4 | version.
5 |
6 | This is the LabyMod v4 version of the addon. If you are looking for the LabyMod v3 version, you can
7 | find it [here](https://github.com/rexlManu/viaversion-addon/tree/main).
8 |
9 | ## Credits
10 |
11 | - https://github.com/ViaVersion/ViaVersion
12 | - https://github.com/ViaVersion/ViaFabric
13 | - https://github.com/FlorianMichael/ViaForge
14 |
15 | # License
16 |
17 | This project is licensed under the GNU Public License - see the [LICENSE](LICENSE) file for details
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/utility/FutureTaskId.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.utility;
2 |
3 | import com.viaversion.viaversion.api.platform.PlatformTask;
4 | import java.util.concurrent.Future;
5 |
6 | public class FutureTaskId implements PlatformTask> {
7 |
8 | private final Future> object;
9 |
10 | public FutureTaskId(Future> object) {
11 | this.object = object;
12 | }
13 |
14 | @Override
15 | public Future> getObject() {
16 | return object;
17 | }
18 |
19 | @Override
20 | public void cancel() {
21 | object.cancel(false);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/loader/AddonRewindLoader.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.loader;
2 |
3 | import de.gerrygames.viarewind.api.ViaRewindConfigImpl;
4 | import de.gerrygames.viarewind.api.ViaRewindPlatform;
5 | import java.io.File;
6 | import java.util.logging.Logger;
7 | import lombok.experimental.Accessors;
8 |
9 | @Accessors(fluent = true)
10 | public class AddonRewindLoader implements ViaRewindPlatform {
11 |
12 | public AddonRewindLoader(File file) {
13 | ViaRewindConfigImpl config = new ViaRewindConfigImpl(new File(file, "config.yml"));
14 | config.reloadConfig();
15 | this.init(config);
16 | }
17 |
18 | @Override
19 | public Logger getLogger() {
20 | return Logger.getLogger("ViaRewind");
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: LabyAddon Build
2 |
3 | on:
4 | push:
5 | branches : [ "v4" ]
6 | pull_request:
7 | branches : [ "v4" ]
8 | workflow_dispatch:
9 |
10 | env:
11 | PUBLIC_RELEASE_BUILD: true
12 | PUBLIC_RELEASE_BUILD_TOKEN: ${{ secrets.PUBLIC_RELEASE_BUILD_TOKEN }}
13 |
14 | jobs:
15 | build:
16 | runs-on: ubuntu-latest
17 | steps:
18 | - uses: actions/checkout@v3
19 | - name: Set up JDK 17
20 | uses: actions/setup-java@v3
21 | with:
22 | distribution: 'corretto'
23 | java-version: '17'
24 | - name: Grant execute permission for gradlew
25 | run: chmod +x gradlew
26 | - name: Build with Gradle
27 | run: ./gradlew remapJar --full-stacktrace
28 | - name: Upload Artifact
29 | uses: actions/upload-artifact@v3
30 | with:
31 | name: Artifacts
32 | path: build/libs/*
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/loader/AddonBackwardsLoader.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.loader;
2 |
3 | import com.viaversion.viabackwards.api.ViaBackwardsPlatform;
4 | import java.io.File;
5 | import java.util.logging.Logger;
6 |
7 | public class AddonBackwardsLoader implements ViaBackwardsPlatform {
8 |
9 | private File file;
10 |
11 | public AddonBackwardsLoader(File file) {
12 | this.file = file;
13 | this.file.mkdir();
14 | this.init(this.file);
15 | }
16 |
17 | @Override
18 | public Logger getLogger() {
19 | return Logger.getLogger("ViaBackwards");
20 | }
21 |
22 | @Override
23 | public void disable() {
24 |
25 | }
26 |
27 | @Override
28 | public boolean isOutdated() {
29 | return false;
30 | }
31 |
32 | @Override
33 | public File getDataFolder() {
34 | return new File(this.file, "config.yml");
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/versions/v1_17/src/main/java/de/rexlmanu/viaversionaddon/v1_17/mixins/MixinConnection.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_17.mixins;
2 |
3 |
4 | import de.rexlmanu.viaversionaddon.core.handler.PipelineReorderEvent;
5 | import io.netty.channel.Channel;
6 | import net.minecraft.network.Connection;
7 | import org.spongepowered.asm.mixin.Mixin;
8 | import org.spongepowered.asm.mixin.Shadow;
9 | import org.spongepowered.asm.mixin.injection.At;
10 | import org.spongepowered.asm.mixin.injection.Inject;
11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12 |
13 | @Mixin(Connection.class)
14 | public class MixinConnection {
15 |
16 | @Shadow
17 | private Channel channel;
18 |
19 | @Inject(method = "setupCompression", at = @At("RETURN"))
20 | private void reorderCompression(int $$0, boolean $$1, CallbackInfo ci) {
21 | channel.pipeline().fireUserEventTriggered(new PipelineReorderEvent());
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/versions/v1_18/src/main/java/de/rexlmanu/viaversionaddon/v1_18/mixins/MixinConnection.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_18.mixins;
2 |
3 |
4 | import de.rexlmanu.viaversionaddon.core.handler.PipelineReorderEvent;
5 | import io.netty.channel.Channel;
6 | import net.minecraft.network.Connection;
7 | import org.spongepowered.asm.mixin.Mixin;
8 | import org.spongepowered.asm.mixin.Shadow;
9 | import org.spongepowered.asm.mixin.injection.At;
10 | import org.spongepowered.asm.mixin.injection.Inject;
11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12 |
13 | @Mixin(Connection.class)
14 | public class MixinConnection {
15 |
16 | @Shadow
17 | private Channel channel;
18 |
19 | @Inject(method = "setupCompression", at = @At("RETURN"))
20 | private void reorderCompression(int $$0, boolean $$1, CallbackInfo ci) {
21 | channel.pipeline().fireUserEventTriggered(new PipelineReorderEvent());
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/versions/v1_19/src/main/java/de/rexlmanu/viaversionaddon/v1_19/mixins/MixinConnection.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_19.mixins;
2 |
3 |
4 | import de.rexlmanu.viaversionaddon.core.handler.PipelineReorderEvent;
5 | import io.netty.channel.Channel;
6 | import net.minecraft.network.Connection;
7 | import org.spongepowered.asm.mixin.Mixin;
8 | import org.spongepowered.asm.mixin.Shadow;
9 | import org.spongepowered.asm.mixin.injection.At;
10 | import org.spongepowered.asm.mixin.injection.Inject;
11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12 |
13 | @Mixin(Connection.class)
14 | public class MixinConnection {
15 |
16 | @Shadow
17 | private Channel channel;
18 |
19 | @Inject(method = "setupCompression", at = @At("RETURN"))
20 | private void reorderCompression(int $$0, boolean $$1, CallbackInfo ci) {
21 | channel.pipeline().fireUserEventTriggered(new PipelineReorderEvent());
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/versions/v1_8/src/main/java/de/rexlmanu/viaversionaddon/v1_8/mixins/MixinNetworkManager.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_8.mixins;
2 |
3 | import de.rexlmanu.viaversionaddon.core.handler.PipelineReorderEvent;
4 | import io.netty.channel.Channel;
5 | import net.minecraft.network.NetworkManager;
6 | import org.spongepowered.asm.mixin.Mixin;
7 | import org.spongepowered.asm.mixin.Shadow;
8 | import org.spongepowered.asm.mixin.injection.At;
9 | import org.spongepowered.asm.mixin.injection.Inject;
10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11 |
12 | @Mixin(NetworkManager.class)
13 | public class MixinNetworkManager {
14 |
15 | @Shadow
16 | private Channel channel;
17 |
18 | @Inject(method = "setCompressionTreshold", at = @At("RETURN"))
19 | private void reorderCompression(int compressionThreshold, CallbackInfo ci) {
20 | channel.pipeline().fireUserEventTriggered(new PipelineReorderEvent());
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/ViaVersionConfiguration.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core;
2 |
3 | import de.rexlmanu.viaversionaddon.core.version.Version;
4 | import lombok.Getter;
5 | import net.labymod.api.addon.AddonConfig;
6 | import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting;
7 | import net.labymod.api.client.gui.screen.widget.widgets.input.dropdown.DropdownWidget.DropdownSetting;
8 | import net.labymod.api.configuration.loader.annotation.ConfigName;
9 | import net.labymod.api.configuration.loader.property.ConfigProperty;
10 |
11 | @SuppressWarnings("FieldMayBeFinal")
12 | @ConfigName("settings")
13 | @Getter
14 | public class ViaVersionConfiguration extends AddonConfig {
15 |
16 | @SwitchSetting
17 | private final ConfigProperty enabled = new ConfigProperty<>(true);
18 |
19 | @DropdownSetting
20 | private final ConfigProperty version = new ConfigProperty<>(Version.UNDEFINED);
21 | }
22 |
--------------------------------------------------------------------------------
/api/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "0.1.0"
2 |
3 | plugins {
4 | id("java-library")
5 | }
6 |
7 | repositories {
8 | mavenLocal()
9 | }
10 |
11 | dependencies {
12 | labyProcessor()
13 | labyApi("api")
14 |
15 | // If you want to use external libraries, you can do that here.
16 | // The dependencies that are specified here are loaded into your project but will also
17 | // automatically be downloaded by labymod, but only if the repository is public.
18 | // If it is private, you have to add and compile the dependency manually.
19 | // You have to specify the repository, there are getters for maven central and sonatype, every
20 | // other repository has to be specified with their url. Example:
21 | // maven(mavenCentral(), "org.apache.httpcomponents:httpclient:4.5.13")
22 | }
23 |
24 | java {
25 | sourceCompatibility = JavaVersion.VERSION_1_8
26 | targetCompatibility = JavaVersion.VERSION_1_8
27 | }
28 |
29 | tasks.compileJava {
30 | sourceCompatibility = JavaVersion.VERSION_1_8.toString()
31 | targetCompatibility = JavaVersion.VERSION_1_8.toString()
32 | }
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/platform/AddonViaInjector.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.platform;
2 |
3 | import com.viaversion.viaversion.api.platform.ViaInjector;
4 | import com.viaversion.viaversion.libs.gson.JsonObject;
5 | import de.rexlmanu.viaversionaddon.core.Constants;
6 | import de.rexlmanu.viaversionaddon.core.ViaVersionAddon;
7 | import lombok.RequiredArgsConstructor;
8 |
9 | @RequiredArgsConstructor
10 | public class AddonViaInjector implements ViaInjector {
11 |
12 | private final ViaVersionAddon addon;
13 |
14 | @Override
15 | public void inject() throws Exception {
16 |
17 | }
18 |
19 | @Override
20 | public void uninject() throws Exception {
21 |
22 | }
23 |
24 | @Override
25 | public int getServerProtocolVersion() throws Exception {
26 | return this.addon.protocolVersion();
27 | }
28 |
29 | @Override
30 | public JsonObject getDump() {
31 | return new JsonObject();
32 | }
33 |
34 | @Override
35 | public String getDecoderName() {
36 | return Constants.DECODER_NAME;
37 | }
38 |
39 | @Override
40 | public String getEncoderName() {
41 | return Constants.ENCODER_NAME;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/versions/v1_8/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "0.1.0"
2 |
3 | plugins {
4 | id("net.labymod.gradle.legacyminecraft")
5 | id("net.labymod.gradle.volt")
6 | }
7 |
8 | val minecraftGameVersion: String = "1.8.9"
9 | val minecraftVersionTag: String = "1.8"
10 |
11 | dependencies {
12 | annotationProcessor("net.labymod:sponge-mixin:0.1.0+0.11.2+mixin.0.8.5")
13 | labyProcessor()
14 | labyApi("v1_8")
15 | api(project(":core"))
16 | }
17 |
18 | legacyMinecraft {
19 | version(minecraftGameVersion)
20 |
21 | mainClass("net.minecraft.launchwrapper.Launch")
22 | args("--tweakClass", "net.labymod.core.loader.vanilla.launchwrapper.LabyModLaunchWrapperTweaker")
23 | args("--labymod-dev-environment", "true")
24 | args("--addon-dev-environment", "true")
25 | jvmArgs("-Dnet.labymod.running-version=$minecraftGameVersion")
26 | }
27 |
28 | volt {
29 | mixin {
30 | compatibilityLevel = "JAVA_8"
31 | minVersion = "0.6.6"
32 | }
33 |
34 | packageName("de.rexlmanu.viaversionaddon.v1_8.mixins")
35 |
36 | version = minecraftGameVersion
37 | }
38 |
39 | intellij {
40 | minorMinecraftVersion(minecraftVersionTag)
41 | val javaVersion = project.findProperty("net.labymod.runconfig-v1_8-java-version")
42 |
43 | if (javaVersion != null) {
44 | run {
45 | javaVersion(javaVersion as String)
46 | }
47 | }
48 | }
49 |
50 | java {
51 | sourceCompatibility = JavaVersion.VERSION_1_8
52 | targetCompatibility = JavaVersion.VERSION_1_8
53 | }
54 |
55 |
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/handler/CommonTransformer.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.handler;
2 |
3 | import com.viaversion.viaversion.util.PipelineUtil;
4 | import io.netty.buffer.ByteBuf;
5 | import io.netty.channel.ChannelHandler;
6 | import io.netty.channel.ChannelHandlerContext;
7 | import io.netty.handler.codec.ByteToMessageDecoder;
8 | import io.netty.handler.codec.MessageToByteEncoder;
9 | import io.netty.handler.codec.MessageToMessageDecoder;
10 | import java.lang.reflect.InvocationTargetException;
11 |
12 | public class CommonTransformer {
13 |
14 | public static void decompress(ChannelHandlerContext ctx, ByteBuf buf)
15 | throws InvocationTargetException {
16 | ChannelHandler handler = ctx.pipeline().get("decompress");
17 | ByteBuf decompressed = handler instanceof MessageToMessageDecoder
18 | ? (ByteBuf) PipelineUtil.callDecode((MessageToMessageDecoder>) handler, ctx, buf).get(0)
19 | : (ByteBuf) PipelineUtil.callDecode((ByteToMessageDecoder) handler, ctx, buf).get(0);
20 | try {
21 | buf.clear().writeBytes(decompressed);
22 | } finally {
23 | decompressed.release();
24 | }
25 | }
26 |
27 | public static void compress(ChannelHandlerContext ctx, ByteBuf buf) throws Exception {
28 | ByteBuf compressed = ctx.alloc().buffer();
29 | try {
30 | PipelineUtil.callEncode((MessageToByteEncoder>) ctx.pipeline().get("compress"), ctx, buf,
31 | compressed);
32 | buf.clear().writeBytes(compressed);
33 | } finally {
34 | compressed.release();
35 | }
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/loader/AddonViaProviderLoader.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.loader;
2 |
3 | import com.viaversion.viaversion.api.Via;
4 | import com.viaversion.viaversion.api.connection.UserConnection;
5 | import com.viaversion.viaversion.api.platform.ViaPlatformLoader;
6 | import com.viaversion.viaversion.api.protocol.version.VersionProvider;
7 | import com.viaversion.viaversion.bungee.providers.BungeeMovementTransmitter;
8 | import com.viaversion.viaversion.protocols.base.BaseVersionProvider;
9 | import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
10 | import de.rexlmanu.viaversionaddon.core.ViaVersionAddon;
11 | import lombok.RequiredArgsConstructor;
12 |
13 | @RequiredArgsConstructor
14 | public class AddonViaProviderLoader implements ViaPlatformLoader {
15 |
16 | private final ViaVersionAddon addon;
17 |
18 | @Override
19 | public void load() {
20 | Via.getManager().getProviders().use(
21 | MovementTransmitterProvider.class, new BungeeMovementTransmitter());
22 | Via.getManager().getProviders().use(VersionProvider.class, new BaseVersionProvider() {
23 | @Override
24 | public int getClosestServerProtocol(UserConnection connection) throws Exception {
25 | if (connection.isClientSide()) {
26 | return addon.configuration().version().get().lazyProtocolVersion().get()
27 | .getVersion();
28 | }
29 | return super.getClosestServerProtocol(connection);
30 | }
31 | });
32 | }
33 |
34 | @Override
35 | public void unload() {
36 |
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/versions/v1_8/src/main/java/de/rexlmanu/viaversionaddon/v1_8/mixins/MixinNetworkManagerChInit.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_8.mixins;
2 |
3 | import com.viaversion.viaversion.api.connection.UserConnection;
4 | import com.viaversion.viaversion.connection.UserConnectionImpl;
5 | import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
6 | import de.rexlmanu.viaversionaddon.core.Constants;
7 | import de.rexlmanu.viaversionaddon.core.ViaVersionAddon;
8 | import de.rexlmanu.viaversionaddon.core.handler.ViaDecodeHandler;
9 | import de.rexlmanu.viaversionaddon.core.handler.ViaEncodeHandler;
10 | import io.netty.channel.Channel;
11 | import io.netty.channel.socket.SocketChannel;
12 | import net.labymod.api.inject.LabyGuice;
13 | import org.spongepowered.asm.mixin.Mixin;
14 | import org.spongepowered.asm.mixin.injection.At;
15 | import org.spongepowered.asm.mixin.injection.Inject;
16 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
17 |
18 | @Mixin(targets = "net.minecraft.network.NetworkManager$5")
19 | public class MixinNetworkManagerChInit {
20 |
21 | @Inject(method = "initChannel", at = @At("RETURN"))
22 | private void onInitChannel(Channel channel, CallbackInfo ci) {
23 | if (channel instanceof SocketChannel && !LabyGuice.getInstance(ViaVersionAddon.class)
24 | .nativeVersion()) {
25 |
26 | UserConnection user = new UserConnectionImpl(channel, true);
27 | new ProtocolPipelineImpl(user);
28 | channel.pipeline()
29 | .addBefore("encoder", Constants.ENCODER_NAME, new ViaEncodeHandler(user))
30 | .addBefore("decoder", Constants.DECODER_NAME, new ViaDecodeHandler(user));
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/versions/v1_17/src/main/java/de/rexlmanu/viaversionaddon/v1_17/mixins/MixinConnectionChInit.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_17.mixins;
2 |
3 |
4 | import com.viaversion.viaversion.api.connection.UserConnection;
5 | import com.viaversion.viaversion.connection.UserConnectionImpl;
6 | import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
7 | import de.rexlmanu.viaversionaddon.core.Constants;
8 | import de.rexlmanu.viaversionaddon.core.ViaVersionAddon;
9 | import de.rexlmanu.viaversionaddon.core.handler.ViaDecodeHandler;
10 | import de.rexlmanu.viaversionaddon.core.handler.ViaEncodeHandler;
11 | import io.netty.channel.Channel;
12 | import io.netty.channel.socket.SocketChannel;
13 | import net.labymod.api.inject.LabyGuice;
14 | import org.spongepowered.asm.mixin.Mixin;
15 | import org.spongepowered.asm.mixin.injection.At;
16 | import org.spongepowered.asm.mixin.injection.Inject;
17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
18 |
19 | @Mixin(targets = "net/minecraft/network/Connection$1")
20 | public class MixinConnectionChInit {
21 |
22 | @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false)
23 | private void onInitChannel(Channel channel, CallbackInfo ci) {
24 | if (channel instanceof SocketChannel && !LabyGuice.getInstance(ViaVersionAddon.class)
25 | .nativeVersion()) {
26 |
27 | UserConnection user = new UserConnectionImpl(channel, true);
28 | new ProtocolPipelineImpl(user);
29 | channel.pipeline()
30 | .addBefore("encoder", Constants.ENCODER_NAME, new ViaEncodeHandler(user))
31 | .addBefore("decoder", Constants.DECODER_NAME, new ViaDecodeHandler(user));
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/versions/v1_18/src/main/java/de/rexlmanu/viaversionaddon/v1_18/mixins/MixinConnectionChInit.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_18.mixins;
2 |
3 |
4 | import com.viaversion.viaversion.api.connection.UserConnection;
5 | import com.viaversion.viaversion.connection.UserConnectionImpl;
6 | import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
7 | import de.rexlmanu.viaversionaddon.core.Constants;
8 | import de.rexlmanu.viaversionaddon.core.ViaVersionAddon;
9 | import de.rexlmanu.viaversionaddon.core.handler.ViaDecodeHandler;
10 | import de.rexlmanu.viaversionaddon.core.handler.ViaEncodeHandler;
11 | import io.netty.channel.Channel;
12 | import io.netty.channel.socket.SocketChannel;
13 | import net.labymod.api.inject.LabyGuice;
14 | import org.spongepowered.asm.mixin.Mixin;
15 | import org.spongepowered.asm.mixin.injection.At;
16 | import org.spongepowered.asm.mixin.injection.Inject;
17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
18 |
19 | @Mixin(targets = "net/minecraft/network/Connection$1")
20 | public class MixinConnectionChInit {
21 |
22 | @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false)
23 | private void onInitChannel(Channel channel, CallbackInfo ci) {
24 | if (channel instanceof SocketChannel && !LabyGuice.getInstance(ViaVersionAddon.class)
25 | .nativeVersion()) {
26 |
27 | UserConnection user = new UserConnectionImpl(channel, true);
28 | new ProtocolPipelineImpl(user);
29 | channel.pipeline()
30 | .addBefore("encoder", Constants.ENCODER_NAME, new ViaEncodeHandler(user))
31 | .addBefore("decoder", Constants.DECODER_NAME, new ViaDecodeHandler(user));
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/versions/v1_19/src/main/java/de/rexlmanu/viaversionaddon/v1_19/mixins/MixinConnectionChInit.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.v1_19.mixins;
2 |
3 |
4 | import com.viaversion.viaversion.api.connection.UserConnection;
5 | import com.viaversion.viaversion.connection.UserConnectionImpl;
6 | import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
7 | import de.rexlmanu.viaversionaddon.core.Constants;
8 | import de.rexlmanu.viaversionaddon.core.ViaVersionAddon;
9 | import de.rexlmanu.viaversionaddon.core.handler.ViaDecodeHandler;
10 | import de.rexlmanu.viaversionaddon.core.handler.ViaEncodeHandler;
11 | import io.netty.channel.Channel;
12 | import io.netty.channel.socket.SocketChannel;
13 | import net.labymod.api.inject.LabyGuice;
14 | import org.spongepowered.asm.mixin.Mixin;
15 | import org.spongepowered.asm.mixin.injection.At;
16 | import org.spongepowered.asm.mixin.injection.Inject;
17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
18 |
19 | @Mixin(targets = "net/minecraft/network/Connection$1")
20 | public class MixinConnectionChInit {
21 |
22 | @Inject(method = "initChannel", at = @At(value = "TAIL"), remap = false)
23 | private void onInitChannel(Channel channel, CallbackInfo ci) {
24 | if (channel instanceof SocketChannel && !LabyGuice.getInstance(ViaVersionAddon.class)
25 | .nativeVersion()) {
26 |
27 | UserConnection user = new UserConnectionImpl(channel, true);
28 | new ProtocolPipelineImpl(user);
29 | channel.pipeline()
30 | .addBefore("encoder", Constants.ENCODER_NAME, new ViaEncodeHandler(user))
31 | .addBefore("decoder", Constants.DECODER_NAME, new ViaDecodeHandler(user));
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/core/src/main/java/de/rexlmanu/viaversionaddon/core/handler/ViaEncodeHandler.java:
--------------------------------------------------------------------------------
1 | package de.rexlmanu.viaversionaddon.core.handler;
2 |
3 | import com.viaversion.viaversion.api.connection.UserConnection;
4 | import com.viaversion.viaversion.exception.CancelCodecException;
5 | import com.viaversion.viaversion.exception.CancelEncoderException;
6 | import com.viaversion.viaversion.util.PipelineUtil;
7 | import io.netty.buffer.ByteBuf;
8 | import io.netty.channel.ChannelHandler;
9 | import io.netty.channel.ChannelHandlerContext;
10 | import io.netty.handler.codec.MessageToMessageEncoder;
11 | import java.util.List;
12 |
13 | @ChannelHandler.Sharable
14 | public class ViaEncodeHandler extends MessageToMessageEncoder {
15 |
16 | private final UserConnection info;
17 |
18 | public ViaEncodeHandler(UserConnection info) {
19 | this.info = info;
20 | }
21 |
22 | @Override
23 | protected void encode(final ChannelHandlerContext ctx, ByteBuf bytebuf, List