From fea081e2ae27b3a108a3f71941e113ac442a95ff Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Tue, 9 Mar 2021 16:28:24 +0800 Subject: [PATCH] Support ip forward --- .../ServerHandshakeNetHandlerMixin.java | 1 - .../client/CHandshakePacketMixin.java | 35 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java index 7591ce18..67c8ab89 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java @@ -54,7 +54,6 @@ public class ServerHandshakeNetHandlerMixin { case LOGIN: { this.networkManager.setConnectionState(ProtocolType.LOGIN); - // todo forge use ip field for storing forge data, this may be an issue try { long currentTime = System.currentTimeMillis(); long connectionThrottle = Bukkit.getServer().getConnectionThrottle(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java index 301141f7..78751762 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java @@ -1,16 +1,51 @@ package io.izzel.arclight.common.mixin.core.network.handshake.client; +import com.google.gson.Gson; +import com.mojang.authlib.properties.Property; import net.minecraft.network.PacketBuffer; import net.minecraft.network.handshake.client.CHandshakePacket; +import net.minecraftforge.fml.network.FMLNetworkConstants; +import net.minecraftforge.fml.network.NetworkHooks; +import org.spigotmc.SpigotConfig; 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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Objects; @Mixin(CHandshakePacket.class) public class CHandshakePacketMixin { + // @formatter:off + @Shadow(remap = false) private String fmlVersion; + @Shadow public String ip; + // @formatter:on + + private static final String EXTRA_DATA = "extraData"; + private static final Gson GSON = new Gson(); + @Redirect(method = "readPacketData", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketBuffer;readString(I)Ljava/lang/String;")) private String arclight$bungeeHostname(PacketBuffer packetBuffer, int maxLength) { return packetBuffer.readString(Short.MAX_VALUE); } + + @Inject(method = "readPacketData", cancellable = true, at = @At(value = "FIELD", shift = At.Shift.AFTER, remap = false, target = "Lnet/minecraft/network/handshake/client/CHandshakePacket;fmlVersion:Ljava/lang/String;")) + private void arclight$readFromProfile(PacketBuffer buf, CallbackInfo ci) { + if (SpigotConfig.bungee && !Objects.equals(this.fmlVersion, FMLNetworkConstants.NETVERSION)) { + String[] split = this.ip.split("\0"); + if (split.length == 4) { + Property[] properties = GSON.fromJson(split[3], Property[].class); + for (Property property : properties) { + if (Objects.equals(property.getName(), EXTRA_DATA)) { + String extraData = property.getValue().replace("\1", "\0"); + this.fmlVersion = NetworkHooks.getFMLVersion(split[0] + extraData); + } + } + } + } + ci.cancel(); + } }