Skip to content

Commit 1680579

Browse files
committed
Move FmlHs parsing to read_from Serializable trait instead of one-off from_message
1 parent 10f30bd commit 1680579

File tree

2 files changed

+38
-33
lines changed

2 files changed

+38
-33
lines changed

src/server/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,8 @@ impl Server {
684684
// TODO: "REGISTER" =>
685685
// TODO: "UNREGISTER" =>
686686
"FML|HS" => {
687-
let msg = plugin_messages::FmlHs::from_message(&data);
687+
//let msg = plugin_messages::FmlHs::from_message(&data);
688+
let msg = crate::protocol::Serializable::read_from(&mut std::io::Cursor::new(data)).unwrap();
688689
println!("FML|HS msg={:?}", msg);
689690
match msg {
690691
plugin_messages::FmlHs::ServerHello { fml_protocol_version, override_dimension } => {

src/server/plugin_messages.rs

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11

22
use std::collections::HashMap;
3+
use std::io;
34

4-
use crate::protocol::Serializable;
55
use crate::protocol::packet::play::serverbound::PluginMessageServerbound;
66
use crate::protocol::packet::play::serverbound::PluginMessageServerbound_i16;
7-
use crate::protocol::VarInt;
7+
use crate::protocol::{Serializable, VarInt, Error};
88

99
#[derive(Debug)]
1010
pub enum FmlHs<'a> {
@@ -31,60 +31,64 @@ pub enum FmlHs<'a> {
3131
HandshakeReset,
3232
}
3333

34-
impl<'a> FmlHs<'a> {
35-
pub fn as_message(&'a self) -> Vec<u8> {
36-
match self {
37-
FmlHs::ClientHello { fml_protocol_version } => {
38-
vec![1, *fml_protocol_version as u8]
39-
},
40-
FmlHs::ModList { mods } => {
41-
let mut buf = vec![2];
42-
let number_of_mods = VarInt(mods.len() as i32);
43-
number_of_mods.write_to(&mut buf).unwrap();
44-
// TODO: write mods
45-
46-
buf
47-
},
48-
_ => unimplemented!()
49-
}
50-
}
51-
52-
pub fn from_message(data: &[u8]) -> FmlHs<'a> {
34+
impl<'a> Serializable for FmlHs<'a> {
35+
fn read_from<R: io::Read>(buf: &mut R) -> Result<Self, Error> {
5336
// https://wiki.vg/Minecraft_Forge_Handshake
54-
let discriminator = data[0];
37+
let discriminator: u8 = Serializable::read_from(buf)?;
5538

5639
match discriminator {
5740
0 => {
5841
// ServerHello
59-
let fml_protocol_version = data[1] as i8;
42+
let fml_protocol_version: i8 = Serializable::read_from(buf)?;
6043
let override_dimension = if fml_protocol_version > 1 {
61-
use byteorder::{BigEndian, ReadBytesExt};
62-
let dimension = (&data[2..2 + 4]).read_i32::<BigEndian>().unwrap();
44+
let dimension: i32 = Serializable::read_from(buf)?;
6345
Some(dimension)
6446
} else {
6547
None
6648
};
6749

6850
println!("FML|HS ServerHello: fml_protocol_version={}, override_dimension={:?}", fml_protocol_version, override_dimension);
6951

70-
FmlHs::ServerHello {
52+
Ok(FmlHs::ServerHello {
7153
fml_protocol_version,
7254
override_dimension,
73-
}
55+
})
7456
},
7557
1 => panic!("Received unexpected FML|HS ClientHello from server"),
7658
2 => {
7759
//TODO let number_of_mods = VarInt::read_from(&mut data[1..].to_vec());
7860
let mods: HashMap<&'a str, &'a str> = HashMap::new();
7961
// TODO: read mods
8062

81-
FmlHs::ModList {
63+
Ok(FmlHs::ModList {
8264
mods,
83-
}
65+
})
66+
},
67+
_ => panic!("Unhandled FML|HS packet: discriminator={}", discriminator),
68+
}
69+
}
70+
71+
72+
fn write_to<W: io::Write>(&self, buf: &mut W) -> Result<(), Error> {
73+
unimplemented!()
74+
}
75+
}
76+
77+
impl<'a> FmlHs<'a> {
78+
pub fn as_message(&'a self) -> Vec<u8> {
79+
match self {
80+
FmlHs::ClientHello { fml_protocol_version } => {
81+
vec![1, *fml_protocol_version as u8]
82+
},
83+
FmlHs::ModList { mods } => {
84+
let mut buf = vec![2];
85+
let number_of_mods = VarInt(mods.len() as i32);
86+
number_of_mods.write_to(&mut buf).unwrap();
87+
// TODO: write mods
88+
89+
buf
8490
},
85-
_ => {
86-
panic!("Unhandled FML|HS packet: discriminator={}", discriminator);
87-
}
91+
_ => unimplemented!()
8892
}
8993
}
9094
}

0 commit comments

Comments
 (0)