diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2023-03-15 17:13:33 -0300 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2023-03-15 17:19:42 -0300 |
commit | b025d4874b171c675dc18889c3900c83194863e6 (patch) | |
tree | 2a3e49d2ca29d8fe46e2713b5e5b8ca1ed3de265 /include | |
parent | d164c4385eeebed9f461a8314f45a227fb0dca20 (diff) |
TProtocol: Add `flex_packet`, and make use of it in `packet`
This will be needed later on.
Diffstat (limited to 'include')
-rw-r--r-- | include/pso/TProtocol.h | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/include/pso/TProtocol.h b/include/pso/TProtocol.h index f8943e2..d19b37d 100644 --- a/include/pso/TProtocol.h +++ b/include/pso/TProtocol.h @@ -26,20 +26,26 @@ extern TPlyMeetUserExtension meet_user_settings; extern u32 game_variations[16][2]; extern void copy_packet(struct packet *pkt); -struct packet { - union { - struct { - packet_header header; - u8 data[0x7c00-sizeof(packet_header)]; - } pkt; - u8 bytes[0x7c00]; - }; - +// NOTE: Having this outside of `flex_packet` is required in some cases. +// This is because some of the senders allocate a different sized +// packet from what `TProtocol` uses, but also call `_packet::bswap()`. +struct _packet { void bswap() { - pkt.header.bswap(); + header.bswap(); }; + + packet_header header; + u8 data[]; }; +template<size_t n = 0> +union flex_packet { + struct _packet pkt; + u8 bytes[(n) ? n : sizeof(packet_header)]; +}; + +struct packet : public flex_packet<0x7c00> {}; + #define RECV_PACKET_HANDLERS \ o(handle_unused_login, void) \ o(handle_03_recv_regist, u8 state) \ |