Fixed Incompatibility with Raknetify

This commit is contained in:
FlorianMichael 2023-03-23 23:44:45 +01:00
parent d5876090c0
commit 9cbd8bb559
7 changed files with 67 additions and 78 deletions

View File

@ -65,7 +65,6 @@ It should work fine with most if not all mods and modpacks.
- ***[ViaFabric](https://github.com/ViaVersion/ViaFabric)***
- ***[multiconnect](https://github.com/Earthcomputer/multiconnect)***
- ***[Krypton](https://github.com/astei/krypton)***
- ***[Raknetify](https://github.com/RelativityMC/raknetify/tree/master)***
## Supported Server versions
- Release (1.0.0 - 1.20 [23w12a])

View File

@ -22,7 +22,7 @@ import de.florianmichael.viafabricplus.injection.access.IClientConnection;
import de.florianmichael.viafabricplus.protocolhack.constants.PreNettyConstants;
import de.florianmichael.viafabricplus.protocolhack.constants.BedrockRakNetConstants;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.protocolhack.platform.viabedrock.RakNetClientConnection;
import de.florianmichael.viafabricplus.protocolhack.PipelineInjector;
import de.florianmichael.vialoadingbase.ViaLoadingBase;
import de.florianmichael.vialoadingbase.event.PipelineReorderEvent;
import io.netty.channel.*;
@ -90,7 +90,7 @@ public abstract class MixinClientConnection extends SimpleChannelInboundHandler<
((IClientConnection) clientConnection).viafabricplus_captureAddress(address);
if (ProtocolHack.getForcedVersions().containsKey(address) ? (ProtocolHack.getForcedVersions().get(address).getVersion() == BedrockProtocolVersion.bedrockLatest.getVersion()) : ProtocolHack.getTargetVersion().isEqualTo(BedrockProtocolVersion.bedrockLatest)) {
RakNetClientConnection.connect(clientConnection, address, lazy, class_);
PipelineInjector.connectRakNet(clientConnection, address, lazy, class_);
cir.setReturnValue(clientConnection);
}
}

View File

@ -18,7 +18,7 @@
package de.florianmichael.viafabricplus.injection.mixin.base;
import de.florianmichael.viafabricplus.injection.access.IClientConnection;
import de.florianmichael.viafabricplus.injection.reference.ClientConnectionReference;
import de.florianmichael.viafabricplus.protocolhack.PipelineInjector;
import io.netty.channel.Channel;
import io.netty.channel.socket.SocketChannel;
import net.minecraft.network.ClientConnection;
@ -39,7 +39,7 @@ public class MixinClientConnection_1 {
@Inject(method = "initChannel", at = @At("TAIL"))
public void hackNettyPipeline(Channel channel, CallbackInfo ci) {
if (channel instanceof SocketChannel) {
ClientConnectionReference.hackNettyPipeline(field_11663, channel, ((IClientConnection) field_11663).viafabricplus_capturedAddress());
PipelineInjector.hookProtocolHack(field_11663, channel, ((IClientConnection) field_11663).viafabricplus_capturedAddress());
}
}
}

View File

@ -28,6 +28,7 @@ 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 org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@Mixin(MultiplayerServerListPinger.class)
public class MixinMultiplayerServerListPinger {
@ -35,13 +36,26 @@ public class MixinMultiplayerServerListPinger {
@Unique
private ServerInfo viafabricplus_lastConnect;
@Unique
private ServerAddress viafabricplus_wrappedAddress;
@Inject(method = "add", at = @At("HEAD"))
public void track(ServerInfo entry, Runnable saver, CallbackInfo ci) {
viafabricplus_lastConnect = entry;
}
@Redirect(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;parse(Ljava/lang/String;)Lnet/minecraft/client/network/ServerAddress;"))
public ServerAddress doOwnParse(String address) {
return TileServerAddress.parse(((IServerInfo) viafabricplus_lastConnect).viafabricplus_forcedVersion(), address);
@Inject(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/AllowedAddressResolver;resolve(Lnet/minecraft/client/network/ServerAddress;)Ljava/util/Optional;"), locals = LocalCapture.CAPTURE_FAILHARD)
public void doOwnParse(ServerInfo entry, Runnable saver, CallbackInfo ci, ServerAddress serverAddress) {
viafabricplus_wrappedAddress = TileServerAddress.parse(((IServerInfo) viafabricplus_lastConnect).viafabricplus_forcedVersion(), serverAddress.getAddress());
}
@Redirect(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;getAddress()Ljava/lang/String;"))
public String replaceWithWrappedAddress(ServerAddress instance) {
return viafabricplus_wrappedAddress.getAddress();
}
@Redirect(method = "add", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ServerAddress;getPort()I"))
public int replaceWithWrappedPort(ServerAddress instance) {
return viafabricplus_wrappedAddress.getPort();
}
}

View File

@ -1,62 +0,0 @@
/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* 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 <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.injection.reference;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.connection.UserConnectionImpl;
import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.protocolhack.constants.PreNettyConstants;
import de.florianmichael.viafabricplus.protocolhack.platform.vialegacy.VFPPreNettyDecoder;
import de.florianmichael.viafabricplus.protocolhack.platform.vialegacy.VFPPreNettyEncoder;
import de.florianmichael.viafabricplus.protocolhack.replacement.ViaFabricPlusVLBViaDecodeHandler;
import de.florianmichael.vialoadingbase.netty.NettyConstants;
import de.florianmichael.vialoadingbase.netty.VLBViaEncodeHandler;
import io.netty.channel.Channel;
import net.minecraft.network.ClientConnection;
import net.raphimc.vialegacy.api.LegacyProtocolVersion;
import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.baseprotocols.PreNettyBaseProtocol;
import java.net.InetSocketAddress;
public class ClientConnectionReference {
public static void hackNettyPipeline(final ClientConnection connection, final Channel channel, final InetSocketAddress address) {
if (ProtocolHack.getForcedVersions().containsKey(address)) {
channel.attr(ProtocolHack.FORCED_VERSION).set(ProtocolHack.getForcedVersions().get(address));
ProtocolHack.getForcedVersions().remove(address);
}
final UserConnection user = new UserConnectionImpl(channel, true);
channel.attr(ProtocolHack.LOCAL_VIA_CONNECTION).set(user);
channel.attr(ProtocolHack.LOCAL_MINECRAFT_CONNECTION).set(connection);
new ProtocolPipelineImpl(user);
System.out.println("Hacking Netty Pipeline (ViaVersion)");
channel.pipeline().addBefore("encoder", NettyConstants.HANDLER_ENCODER_NAME, new VLBViaEncodeHandler(user));
channel.pipeline().addBefore("decoder", NettyConstants.HANDLER_DECODER_NAME, new ViaFabricPlusVLBViaDecodeHandler(user));
if (ProtocolHack.getTargetVersion(channel).isOlderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) {
user.getProtocolInfo().getPipeline().add(PreNettyBaseProtocol.INSTANCE);
channel.pipeline().addBefore("prepender", PreNettyConstants.HANDLER_ENCODER_NAME, new VFPPreNettyEncoder(user));
channel.pipeline().addBefore("splitter", PreNettyConstants.HANDLER_DECODER_NAME, new VFPPreNettyDecoder(user));
}
}
}

View File

@ -15,14 +15,23 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.florianmichael.viafabricplus.protocolhack.platform.viabedrock;
package de.florianmichael.viafabricplus.protocolhack;
import com.viaversion.viaversion.api.connection.UserConnection;
import de.florianmichael.viafabricplus.injection.reference.ClientConnectionReference;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import com.viaversion.viaversion.connection.UserConnectionImpl;
import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
import de.florianmichael.viafabricplus.protocolhack.constants.BedrockRakNetConstants;
import de.florianmichael.viafabricplus.protocolhack.constants.PreNettyConstants;
import de.florianmichael.viafabricplus.protocolhack.platform.viabedrock.DisconnectHandler;
import de.florianmichael.viafabricplus.protocolhack.platform.viabedrock.PingEncapsulationCodec;
import de.florianmichael.viafabricplus.protocolhack.platform.viabedrock.RakMessageEncapsulationCodec;
import de.florianmichael.viafabricplus.protocolhack.platform.viabedrock.library_fix.FixedUnconnectedPingEncoder;
import de.florianmichael.viafabricplus.protocolhack.platform.viabedrock.library_fix.FixedUnconnectedPongDecoder;
import de.florianmichael.viafabricplus.protocolhack.platform.vialegacy.VFPPreNettyDecoder;
import de.florianmichael.viafabricplus.protocolhack.platform.vialegacy.VFPPreNettyEncoder;
import de.florianmichael.viafabricplus.protocolhack.replacement.ViaFabricPlusVLBViaDecodeHandler;
import de.florianmichael.vialoadingbase.netty.NettyConstants;
import de.florianmichael.vialoadingbase.netty.VLBViaEncodeHandler;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.epoll.EpollDatagramChannel;
@ -35,6 +44,8 @@ import net.minecraft.util.Lazy;
import net.raphimc.viabedrock.netty.BatchLengthCodec;
import net.raphimc.viabedrock.netty.PacketEncapsulationCodec;
import net.raphimc.viabedrock.protocol.BedrockBaseProtocol;
import net.raphimc.vialegacy.api.LegacyProtocolVersion;
import net.raphimc.vialegacy.protocols.release.protocol1_7_2_5to1_6_4.baseprotocols.PreNettyBaseProtocol;
import org.cloudburstmc.netty.channel.raknet.RakChannelFactory;
import org.cloudburstmc.netty.channel.raknet.RakClientChannel;
import org.cloudburstmc.netty.channel.raknet.config.RakChannelOption;
@ -45,9 +56,37 @@ import org.jetbrains.annotations.NotNull;
import java.net.InetSocketAddress;
import java.util.concurrent.ThreadLocalRandom;
public class RakNetClientConnection {
public class PipelineInjector {
public static void connect(final ClientConnection clientConnection, final InetSocketAddress address, final Lazy<? extends MultithreadEventLoopGroup> lazy, final Class<? extends AbstractChannel> channelType) {
/**
* This method adds the channel handlers required for ViaVersion, ViaBackwards, ViaAprilFools and ViaLegacy, it also tracks the Via and Minecraft Connection
*/
public static void hookProtocolHack(final ClientConnection connection, final Channel channel, final InetSocketAddress address) {
if (ProtocolHack.getForcedVersions().containsKey(address)) {
channel.attr(ProtocolHack.FORCED_VERSION).set(ProtocolHack.getForcedVersions().get(address));
ProtocolHack.getForcedVersions().remove(address);
}
final UserConnection user = new UserConnectionImpl(channel, true);
channel.attr(ProtocolHack.LOCAL_VIA_CONNECTION).set(user);
channel.attr(ProtocolHack.LOCAL_MINECRAFT_CONNECTION).set(connection);
new ProtocolPipelineImpl(user);
channel.pipeline().addBefore("encoder", NettyConstants.HANDLER_ENCODER_NAME, new VLBViaEncodeHandler(user));
channel.pipeline().addBefore("decoder", NettyConstants.HANDLER_DECODER_NAME, new ViaFabricPlusVLBViaDecodeHandler(user));
if (ProtocolHack.getTargetVersion(channel).isOlderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) {
user.getProtocolInfo().getPipeline().add(PreNettyBaseProtocol.INSTANCE);
channel.pipeline().addBefore("prepender", PreNettyConstants.HANDLER_ENCODER_NAME, new VFPPreNettyEncoder(user));
channel.pipeline().addBefore("splitter", PreNettyConstants.HANDLER_DECODER_NAME, new VFPPreNettyDecoder(user));
}
}
/**
* This method represents the rak net connection for bedrock edition, it's a replacement of the ClientConnection#connect method
*/
public static void connectRakNet(final ClientConnection clientConnection, final InetSocketAddress address, final Lazy<? extends MultithreadEventLoopGroup> lazy, final Class<? extends AbstractChannel> channelType) {
Bootstrap nettyBoostrap = new Bootstrap();
nettyBoostrap = nettyBoostrap.group(lazy.get());
nettyBoostrap = nettyBoostrap.handler(new ChannelInitializer<>() {
@ -65,7 +104,7 @@ public class RakNetClientConnection {
channelPipeline.addLast("packet_handler", clientConnection);
ClientConnectionReference.hackNettyPipeline(clientConnection, channel, address);
PipelineInjector.hookProtocolHack(clientConnection, channel, address);
final UserConnection user = channel.attr(ProtocolHack.LOCAL_VIA_CONNECTION).get();
user.getProtocolInfo().getPipeline().add(BedrockBaseProtocol.INSTANCE);

View File

@ -33,7 +33,6 @@
"breaks": {
"viafabric": "*",
"multiconnect": "*",
"krypton": "*",
"raknetify": "*"
"krypton": "*"
}
}