From ac0b2843a79f5c34d8165154dfc44dc521b9d35f Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 16:24:38 -0700 Subject: [PATCH 1/8] Parse FmlHs::RegistryData packet for 1.8+ --- src/protocol/forge.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/protocol/forge.rs b/src/protocol/forge.rs index 21d47b3a..841df927 100644 --- a/src/protocol/forge.rs +++ b/src/protocol/forge.rs @@ -97,7 +97,6 @@ pub enum FmlHs { ModList { mods: LenPrefixed, }, - /* TODO: 1.8+ https://wiki.vg/Minecraft_Forge_Handshake#Differences_from_Forge_1.7.10 RegistryData { has_more: bool, name: String, @@ -105,7 +104,6 @@ pub enum FmlHs { substitutions: LenPrefixed, dummies: LenPrefixed, }, - */ ModIdData { mappings: LenPrefixed, block_substitutions: LenPrefixed, @@ -145,11 +143,23 @@ impl Serializable for FmlHs { }) }, 3 => { - Ok(FmlHs::ModIdData { - mappings: Serializable::read_from(buf)?, - block_substitutions: Serializable::read_from(buf)?, - item_substitutions: Serializable::read_from(buf)?, - }) + let protocol_version = unsafe { crate::protocol::CURRENT_PROTOCOL_VERSION }; + + if protocol_version >= 47 { + Ok(FmlHs::RegistryData { + has_more: Serializable::read_from(buf)?, + name: Serializable::read_from(buf)?, + ids: Serializable::read_from(buf)?, + substitutions: Serializable::read_from(buf)?, + dummies: Serializable::read_from(buf)?, + }) + } else { + Ok(FmlHs::ModIdData { + mappings: Serializable::read_from(buf)?, + block_substitutions: Serializable::read_from(buf)?, + item_substitutions: Serializable::read_from(buf)?, + }) + } }, 255 => { Ok(FmlHs::HandshakeAck { From 55d0568c0ca55dc200d63361c4e4577a9963d3de Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 16:39:59 -0700 Subject: [PATCH 2/8] Handle RegistryData, send ack only once no longer has more --- src/server/mod.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/server/mod.rs b/src/server/mod.rs index c2f0a55f..65211e38 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -711,8 +711,18 @@ impl Server { self.write_fmlhs_plugin_message(&HandshakeAck { phase: WaitingServerData }); }, ModIdData { mappings: _, block_substitutions: _, item_substitutions: _ } => { + println!("Received FML|HS ModIdData"); self.write_fmlhs_plugin_message(&HandshakeAck { phase: WaitingServerData }); + // TODO: dynamically register mod blocks }, + RegistryData { has_more, name, ids: _, substitutions: _, dummies: _ } => { + println!("Received FML|HS RegistryData for {}", name); + if !has_more { + self.write_fmlhs_plugin_message(&HandshakeAck { phase: WaitingServerData }); + } + // TODO: dynamically register mod blocks + }, + HandshakeAck { phase } => { match phase { WaitingCAck => { From cca34060f0f19cbf7977644efa7f1734fbf408fd Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 16:46:38 -0700 Subject: [PATCH 3/8] Fix RegistryData acknowledgement phase WaitingServerComplete --- src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 65211e38..da63b0ba 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -718,7 +718,7 @@ impl Server { RegistryData { has_more, name, ids: _, substitutions: _, dummies: _ } => { println!("Received FML|HS RegistryData for {}", name); if !has_more { - self.write_fmlhs_plugin_message(&HandshakeAck { phase: WaitingServerData }); + self.write_fmlhs_plugin_message(&HandshakeAck { phase: WaitingServerComplete }); } // TODO: dynamically register mod blocks }, From 2f1e0f3f356079e2230a797dc8de9e0cf48f73df Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 16:50:04 -0700 Subject: [PATCH 4/8] Fix acknowledgement phase for 1.7.10 ModIdData too, somehow it worked accidentally --- src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index da63b0ba..e4c97507 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -712,7 +712,7 @@ impl Server { }, ModIdData { mappings: _, block_substitutions: _, item_substitutions: _ } => { println!("Received FML|HS ModIdData"); - self.write_fmlhs_plugin_message(&HandshakeAck { phase: WaitingServerData }); + self.write_fmlhs_plugin_message(&HandshakeAck { phase: WaitingServerComplete }); // TODO: dynamically register mod blocks }, RegistryData { has_more, name, ids: _, substitutions: _, dummies: _ } => { From 268b4257ba1e9df42c7deb47bdc145cd90433d52 Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 17:25:34 -0700 Subject: [PATCH 5/8] Append \0FML\0 to end of server hostname if Forge mods detected https://wiki.vg/Minecraft_Forge_Handshake#Connection_to_a_forge_server --- src/server/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index e4c97507..632d60bc 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -108,7 +108,8 @@ impl Server { pub fn connect(resources: Arc>, profile: mojang::Profile, address: &str, protocol_version: i32, forge_mods: Vec) -> Result { let mut conn = protocol::Conn::new(address, protocol_version)?; - let host = conn.host.clone(); + let tag = if forge_mods.len() != 0 { "\0FML\0" } else { "" }; + let host = conn.host.clone() + tag; let port = conn.port; conn.write_packet(protocol::packet::handshake::serverbound::Handshake { protocol_version: protocol::VarInt(protocol_version), From ef9ab7004253345bdcafda7d614072774e5a2b44 Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 18:31:28 -0700 Subject: [PATCH 6/8] Add new Forge 1.13 server list ping JSON mod parsing --- src/protocol/mod.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index bfdd6839..32959790 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -1170,6 +1170,23 @@ impl Conn { } } } + // Forge 1.13+ + if let Some(forge_data) = val.get("forgeData") { + if let Some(mods) = forge_data.get("mods") { + if let Value::Array(items) = mods { + for item in items { + if let Value::Object(obj) = item { + let modid = obj.get("modId").unwrap().as_str().unwrap().to_string(); + let modmarker = obj.get("modmarker").unwrap().as_str().unwrap().to_string(); + + let version = modmarker; + + forge_mods.push(crate::protocol::forge::ForgeMod { modid, version }); + } + } + } + } + } Ok((Status { version: StatusVersion { From 7e9c00ec282665d332ee4718b72217d188d8210e Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 18:31:57 -0700 Subject: [PATCH 7/8] Revert "Add new Forge 1.13 server list ping JSON mod parsing" This reverts commit ef9ab7004253345bdcafda7d614072774e5a2b44. --- src/protocol/mod.rs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 32959790..bfdd6839 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -1170,23 +1170,6 @@ impl Conn { } } } - // Forge 1.13+ - if let Some(forge_data) = val.get("forgeData") { - if let Some(mods) = forge_data.get("mods") { - if let Value::Array(items) = mods { - for item in items { - if let Value::Object(obj) = item { - let modid = obj.get("modId").unwrap().as_str().unwrap().to_string(); - let modmarker = obj.get("modmarker").unwrap().as_str().unwrap().to_string(); - - let version = modmarker; - - forge_mods.push(crate::protocol::forge::ForgeMod { modid, version }); - } - } - } - } - } Ok((Status { version: StatusVersion { From f1f1ed9dd5ad3340864d2eb21d84e8e50bcf270b Mon Sep 17 00:00:00 2001 From: ice_iix Date: Sat, 11 May 2019 18:33:45 -0700 Subject: [PATCH 8/8] Whitespace --- src/server/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 632d60bc..9be139ac 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -723,7 +723,6 @@ impl Server { } // TODO: dynamically register mod blocks }, - HandshakeAck { phase } => { match phase { WaitingCAck => {