11
22use std:: collections:: HashMap ;
3+ use std:: io;
34
4- use crate :: protocol:: Serializable ;
55use crate :: protocol:: packet:: play:: serverbound:: PluginMessageServerbound ;
66use crate :: protocol:: packet:: play:: serverbound:: PluginMessageServerbound_i16 ;
7- use crate :: protocol:: VarInt ;
7+ use crate :: protocol:: { Serializable , VarInt , Error } ;
88
99#[ derive( Debug ) ]
1010pub 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