Skip to content

forge: add FML2 protocol support (1.13.2-1.16.5)#494

Merged
iceiix merged 18 commits intomasterfrom
fml2
Jan 23, 2021
Merged

forge: add FML2 protocol support (1.13.2-1.16.5)#494
iceiix merged 18 commits intomasterfrom
fml2

Conversation

@iceiix
Copy link
Copy Markdown
Owner

@iceiix iceiix commented Jan 22, 2021

Add FML2 protocol support, Forge on 1.13 - Current #400

https://wiki.vg/Minecraft_Forge_Handshake#FML2_protocol_.281.13_-_Current.29

Extends #88 #134 Forge FML (1) support

@iceiix
Copy link
Copy Markdown
Owner Author

iceiix commented Jan 22, 2021

Screen Shot 2021-01-21 at 6 51 59 PM

LoginPluginResponse, new packet type we had defined but not handled, plugins in the login, interesting

@iceiix
Copy link
Copy Markdown
Owner Author

iceiix commented Jan 23, 2021

Added the new FML2 packet types in protocol/forge.rs, can parse the packets from the server but not complete yet, need to serialize the packets to the server. FML2 reuses the packet structure within the plugin channels — effectively "nested" packets, steven_protocol wasn't originally set up for this, requires some refactoring to reuse the same packet parsing (and serialization) code in the inner packet

@iceiix
Copy link
Copy Markdown
Owner Author

iceiix commented Jan 23, 2021

Expected server output with java -Dfml.debugNetworkHandshake=true -Dlog4j.configurationFile=log4j.xml -mx2G -jar forge-1.16.5-36.0.1.jar nogui and log4j.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

expected server output with a successful handshake:

[Server thread] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Sending ticking packet info 'net.minecraftforge.fml.network.FMLHandshakeMessages$S2CModList' to 'fml:handshake' sequence 0
[Netty Server IO #3] DEBUG net.minecraft.network.NettyPacketEncoder - OUT: [LOGIN:4] net.minecraft.network.login.server.SCustomPayloadLoginPacket
[Netty Server IO #3] DEBUG net.minecraft.network.NettyPacketDecoder -  IN: [LOGIN:2] net.minecraft.network.login.client.CCustomPayloadLoginPacket
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLLoginWrapper - Recieved login wrapper packet event for channel fml:handshake with index 0
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Received client indexed reply 0 of type net.minecraftforge.fml.network.FMLHandshakeMessages$C2SModListReply
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Received client connection with modlist [minecraft, forge, ironchest]
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.NetworkRegistry - Channel 'fml:loginwrapper' : Version test of 'FML2' from client : ACCEPTED
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.NetworkRegistry - Channel 'fml:handshake' : Version test of 'FML2' from client : ACCEPTED
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.NetworkRegistry - Channel 'minecraft:unregister' : Version test of 'FML2' from client : ACCEPTED
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.NetworkRegistry - Channel 'fml:play' : Version test of 'FML2' from client : ACCEPTED
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.NetworkRegistry - Channel 'minecraft:register' : Version test of 'FML2' from client : ACCEPTED
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.NetworkRegistry - Accepting channel list from client
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Accepted client connection mod list
[Server thread] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Sending ticking packet info 'Registry minecraft:recipe_serializer' to 'fml:handshake' sequence 1
[Netty Server IO #3] DEBUG net.minecraft.network.NettyPacketEncoder - OUT: [LOGIN:4] net.minecraft.network.login.server.SCustomPayloadLoginPacket
[Netty Server IO #3] DEBUG net.minecraft.network.NettyPacketDecoder -  IN: [LOGIN:2] net.minecraft.network.login.client.CCustomPayloadLoginPacket
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLLoginWrapper - Recieved login wrapper packet event for channel fml:handshake with index 1
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Received client indexed reply 1 of type net.minecraftforge.fml.network.FMLHandshakeMessages$C2SAcknowledge
...2-18 acknowledgements...
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Received acknowledgement from client
[Netty Server IO #3] DEBUG net.minecraft.network.NettyPacketDecoder -  IN: [LOGIN:2] net.minecraft.network.login.client.CCustomPayloadLoginPacket
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLLoginWrapper - Recieved login wrapper packet event for channel fml:handshake with index 19
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Received client indexed reply 19 of type net.minecraftforge.fml.network.FMLHandshakeMessages$C2SAcknowledge
[Netty Server IO #3] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Received acknowledgement from client
[Server thread] DEBUG net.minecraftforge.fml.network.FMLHandshakeHandler - Handshake complete!
[Netty Server IO #3] DEBUG net.minecraft.network.NettyPacketEncoder - OUT: [LOGIN:3] net.minecraft.network.login.server.SEnableCompressionPacket
[Netty Server IO #3] DEBUG net.minecraft.network.NettyPacketEncoder - OUT: [LOGIN:2] net.minecraft.network.login.server.SLoginSuccessPacket

actual, gets as far as OUT: [LOGIN:4] net.minecraft.network.login.server.SCustomPayloadLoginPacket, sending the ModList packet, but our ModListReply response is no good:

11:00:51.257 [Netty Server IO #4] DEBUG net.minecraft.network.NetworkManager - Failed to sent packet
io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: Index 11 out of bounds for length 3
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:459) ~[server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) ~[server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:647) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:547) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:501) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:461) [server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [server-1.16.5-20210115.111550-extra.jar:?]
	at java.lang.Thread.run(Thread.java:832) [?:?]
Caused by: java.lang.IndexOutOfBoundsException: Index 11 out of bounds for length 3
	at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[?:?]
	at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) ~[?:?]
	at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) ~[?:?]
	at java.util.Objects.checkIndex(Objects.java:359) ~[?:?]
	at java.util.ArrayList.get(ArrayList.java:427) ~[?:?]
	at net.minecraft.network.ProtocolType$PacketList.func_229718_a_(SourceFile:387) ~[?:?]
	at net.minecraft.network.ProtocolType.func_179244_a(SourceFile:429) ~[?:?]
	at net.minecraft.network.NettyPacketDecoder.decode(SourceFile:34) ~[?:?]
	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) ~[server-1.16.5-20210115.111550-extra.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) ~[server-1.16.5-20210115.111550-extra.jar:?]
	... 28 more
11:00:51.260 [Netty Server IO #4] DEBUG net.minecraft.network.NetworkManager - Disabled auto read
11:00:51.261 [Netty Server IO #4] DEBUG net.minecraft.network.NetworkManager - Enabled auto read
11:00:51.261 [Netty Server IO #4] DEBUG net.minecraft.network.NettyPacketEncoder - OUT: [PLAY:25] net.minecraft.network.play.server.SDisconnectPacket

Update: problem was sending play::PluginMessageServerbound instead of login::LoginPluginResponse. There is a different message for plugin channels in the Login state instead of the Play. Fixing this, server now receives IN: [LOGIN:2] net.minecraft.network.login.client.CCustomPayloadLoginPacket but disconnects with a different error:

?{"translate":"disconnect.genericReason","with":["Internal Exception: net.minecraft.util.ResourceLocationException: Non [a-z0-9/._-] character in path of location: minecraft:\u0003\t"]}

Update 2: next problem was not sending the outer packet, fixing it now hits:
thread '' panicked at 'unsupported command node parser forge:modid', protocol/src/protocol/packet.rs:3267:22

@iceiix
Copy link
Copy Markdown
Owner Author

iceiix commented Jan 23, 2021

Need to handle forgeid:modid and forge:enum command nodes properly. Example packet:

'\x10!\x00\x0b\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x01\x01\x0c\x06config\x01\x05\r\x0e\x0f\x10\x11\x05forge\x05\x01\x12\x04help\x05\x01\x13\x04list\x01\x01\x14\x02me\x01\x01\x15\x03msg\x01\x01\x16\x07teammsg\t\x00\x06\x04tell\t\x00\x07\x02tm\x01\x01\x17\x07trigger\t\x00\x06\x01w\x01\x01\x18\x08showfile\x05\x00\ndimensions\x01\x00\x06entity\x05\x00\x04mods\x05\x01\x19\x03tps\x01\x02\x1a\x1b\x05track\x06\x00\x07command\x10brigadier:string\x02\x05\x00\x05uuids\x06\x00\x06action\x10brigadier:string\x02\x02\x01\x1c\x07targets\x10minecraft:entity\x02\x06\x00\x07message\x11minecraft:message\x16\x02\x1d\x1e\tobjective\x13minecraft:objective\x14minecraft:ask_server\x02\x01\x1f\x03mod\x0bforge:modid\x06\x00\x03dim\x13minecraft:dimension\x05\x00\x06entity\x05\x00\x02te\x06\x00\x07message\x11minecraft:message\x01\x01 \x03add\x01\x01 \x03set\x06\x00\x04type\nforge:enum,net.minecraftforge.fml.config.ModConfig$Type\x06\x00\x05value\x11brigadier:integer\x00\x00'

0x10 = DeclareCommands

            packet DeclareCommands {
                field nodes: LenPrefixed<VarInt, packet::CommandNode> =,
                field root_index: VarInt =,
            }

#[derive(Debug, Default)]
pub struct CommandNode {
    pub flags: u8,
    pub children: LenPrefixed<VarInt, VarInt>,
    pub redirect_node: Option<VarInt>,
    pub name: Option<String>,
    pub parser: Option<String>,
    pub properties: Option<CommandProperty>,
    pub suggestions_type: Option<String>,
}

forge:modid\x06\x00\x03dim\x13
minecraft:dimension\x05\x00\x06entity\x05\x00\x02te\x06\x00\x07message\x11
minecraft:message\x01\x01 \x03add\x01\x01 \x03set\x06\x00\x04type\n
"forge:enum" \x44 (length) "net.minecraftforge.fml.config.ModConfig$Type"
\x06\x00\x05value\x11
brigadier:integer\x00\x00

@iceiix iceiix marked this pull request as ready for review January 23, 2021 21:37
@iceiix iceiix changed the title Fml2 forge: add FML2 protocol support (1.13.2-1.16.5) Jan 23, 2021
@iceiix iceiix merged commit 6b96162 into master Jan 23, 2021
@iceiix iceiix deleted the fml2 branch January 23, 2021 21:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant