turns out not everything has a flag, putting it in the struct will be easier at this point
This commit is contained in:
parent
7c246f5446
commit
7cac700dd5
@ -13,7 +13,6 @@ pub fn pso_packet(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|||||||
|
|
||||||
let parsed = parse_macro_input!(item as ItemStruct);
|
let parsed = parse_macro_input!(item as ItemStruct);
|
||||||
|
|
||||||
let mut has_flag: bool = false;
|
|
||||||
let mut from_bytes = Vec::new();
|
let mut from_bytes = Vec::new();
|
||||||
let mut as_bytes = Vec::new();
|
let mut as_bytes = Vec::new();
|
||||||
let mut dbg_write_vars = Vec::new();
|
let mut dbg_write_vars = Vec::new();
|
||||||
@ -139,13 +138,6 @@ pub fn pso_packet(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
"u32" => {
|
"u32" => {
|
||||||
if ident_str == "flag" {
|
|
||||||
if i != 0 {
|
|
||||||
return syn::Error::new(ident.span(), "flag must be first member of struct").to_compile_error().into();
|
|
||||||
}
|
|
||||||
has_flag = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
from_bytes.push(quote! {
|
from_bytes.push(quote! {
|
||||||
#ident: {
|
#ident: {
|
||||||
let mut b: [u8; 4] = [0; 4];
|
let mut b: [u8; 4] = [0; 4];
|
||||||
@ -181,17 +173,6 @@ pub fn pso_packet(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|||||||
let this_struct = parsed.ident.clone();
|
let this_struct = parsed.ident.clone();
|
||||||
let this_struct_str = this_struct.to_string();
|
let this_struct_str = this_struct.to_string();
|
||||||
|
|
||||||
let flag_write = if has_flag {
|
|
||||||
quote! {
|
|
||||||
buf.extend_from_slice(&u32::to_le_bytes(self.flag));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
quote! {
|
|
||||||
buf.extend_from_slice(&u32::to_le_bytes(0));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let psopacket = quote! {
|
let psopacket = quote! {
|
||||||
impl PSOPacket for #this_struct {
|
impl PSOPacket for #this_struct {
|
||||||
fn from_bytes(data: &Vec<u8>) -> Result<#this_struct, PacketParseError> {
|
fn from_bytes(data: &Vec<u8>) -> Result<#this_struct, PacketParseError> {
|
||||||
@ -205,22 +186,15 @@ pub fn pso_packet(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|||||||
return Err(PacketParseError::WrongPacketCommand);
|
return Err(PacketParseError::WrongPacketCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
if #has_flag {
|
|
||||||
cur.seek(SeekFrom::Start(4)).unwrap();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cur.seek(SeekFrom::Start(8)).unwrap();
|
|
||||||
}
|
|
||||||
Ok(#this_struct {
|
Ok(#this_struct {
|
||||||
#(#from_bytes)*
|
#(#from_bytes)*
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
fn as_bytes(&self) -> Vec<u8> {
|
fn as_bytes(&self) -> Vec<u8> {
|
||||||
let mut buf: Vec<u8> = Vec::new();
|
let mut buf: Vec<u8> = Vec::new();
|
||||||
#flag_write
|
|
||||||
#(#as_bytes)*
|
#(#as_bytes)*
|
||||||
|
|
||||||
let pkt_len = buf.len() as u16;
|
let pkt_len = (buf.len() + 4) as u16;
|
||||||
let mut prebuf: Vec<u8> = Vec::new();
|
let mut prebuf: Vec<u8> = Vec::new();
|
||||||
|
|
||||||
prebuf.extend_from_slice(&u16::to_le_bytes(pkt_len));
|
prebuf.extend_from_slice(&u16::to_le_bytes(pkt_len));
|
||||||
|
@ -6,6 +6,7 @@ use std::io::{Read, Seek, SeekFrom};
|
|||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
type u8_str = u8;
|
type u8_str = u8;
|
||||||
|
|
||||||
|
// outgoing packets
|
||||||
#[pso_packet(0x02)]
|
#[pso_packet(0x02)]
|
||||||
pub struct PatchWelcome {
|
pub struct PatchWelcome {
|
||||||
copyright: [u8_str; 44],
|
copyright: [u8_str; 44],
|
||||||
@ -15,7 +16,7 @@ pub struct PatchWelcome {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PatchWelcome {
|
impl PatchWelcome {
|
||||||
fn new(server_key: u32, client_key: u32) -> PatchWelcome {
|
pub fn new(server_key: u32, client_key: u32) -> PatchWelcome {
|
||||||
PatchWelcome {
|
PatchWelcome {
|
||||||
copyright: b"Patch Server. Copyright SonicTeam, LTD. 2001".clone(),
|
copyright: b"Patch Server. Copyright SonicTeam, LTD. 2001".clone(),
|
||||||
padding: [0; 20],
|
padding: [0; 20],
|
||||||
@ -25,11 +26,16 @@ impl PatchWelcome {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum PatchPacket {
|
|
||||||
PatchWelcome(PatchWelcome),
|
// incoming packets
|
||||||
|
#[pso_packet(0x02)]
|
||||||
|
pub struct PatchWelcomeReply {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
@ -38,7 +44,7 @@ mod tests {
|
|||||||
|
|
||||||
let pkt = super::PatchWelcome::new(123, 456);
|
let pkt = super::PatchWelcome::new(123, 456);
|
||||||
|
|
||||||
assert!(pkt.as_bytes() == vec![0x4C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x53, 0x65,
|
assert!(pkt.as_bytes() == vec![0x4C, 0x00, 0x02, 0x00, 0x50, 0x61, 0x74, 0x63, 0x68, 0x20, 0x53, 0x65,
|
||||||
0x72, 0x76, 0x65, 0x72, 0x2E, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20,
|
0x72, 0x76, 0x65, 0x72, 0x2E, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20,
|
||||||
0x53, 0x6F, 0x6E, 0x69, 0x63, 0x54, 0x65, 0x61, 0x6D, 0x2C, 0x20, 0x4C, 0x54, 0x44, 0x2E, 0x20,
|
0x53, 0x6F, 0x6E, 0x69, 0x63, 0x54, 0x65, 0x61, 0x6D, 0x2C, 0x20, 0x4C, 0x54, 0x44, 0x2E, 0x20,
|
||||||
0x32, 0x30, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x32, 0x30, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
@ -47,7 +53,7 @@ mod tests {
|
|||||||
|
|
||||||
|
|
||||||
let mut bytes = pkt.as_bytes();
|
let mut bytes = pkt.as_bytes();
|
||||||
bytes.splice(32..41, b"Elsewhere".iter().cloned());
|
bytes.splice(28..37, b"Elsewhere".iter().cloned());
|
||||||
|
|
||||||
let new_pkt = super::PatchWelcome::from_bytes(&bytes);
|
let new_pkt = super::PatchWelcome::from_bytes(&bytes);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user