#ifndef TPROTOCOL_H #define TPROTOCOL_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include EXTERN_OBJECT_NAME(TProtocol); extern void copy_packet(struct packet *pkt); struct packet { union { struct { packet_header header; TArray data; } pkt; u8 bytes[0x7c00]; }; template T &as() { return reinterpret_cast(*this); }; template T *as_ptr() { return reinterpret_cast(this); }; }; struct GameListEntry { u8 difficulty_tag; u8 num_players; TArray name; u8 episode; u8 flags; }; struct LobbyListEntry { u32 smth; }; struct QuestListEntry { TArray name; TArray short_description; }; typedef void (*recv_packet_handler)(packet &pkt); class TProtocol : public TTcpSocket { public: TPlySmth m_smth; TPlyGuildCardTag m_guildcard_tag; u16 m_sub_version; int m_login_response_state; int m_connected; int m_joined_game; int m_has_meet_user_settings; int m_handle_pings_only; int m_entry_count; int m_unused; int m_lobby_list_count; int m_unused2; int m_udp_disabled; int m_language; TArray m_unused3; TPlyCharData m_character_data; u32 m_unused4; TMenuListEntry m_game_entries[64]; TMenuListEntry m_game_entries2[64]; TMenuListEntry m_lobby_entries[16]; TMenuListEntry m_quest_entries[30]; TArray m_unused5; TArray m_serial_number3; TArray m_password2; TArray m_serial_number; TArray m_access_key; TArray m_password; TArray m_player_name; TArray m_serial_number2; TArray m_access_key2; TPlyClientConfig m_client_config; int m_packet_offset; int m_packet_size; struct packet m_packet; TArray m_recv_handlers; public: TProtocol(TObject *parent, u16 sub_version, int language, char *serial_number, char *access_key, char *password); virtual ~TProtocol(); virtual void run_task(); virtual short send(u8 *data, size_t size); void some_stub() {}; int handle_command(struct packet *pkt); void parse_packet(); PRIVATE_MEMBER_ACCESSORS(TPlySmth, smth); PRIVATE_MEMBER_ACCESSORS(TPlyGuildCardTag, guildcard_tag); PRIVATE_MEMBER_ACCESSORS(u16, sub_version); PRIVATE_MEMBER_ACCESSORS(int, login_response_state); PRIVATE_MEMBER_ACCESSORS(int, connected); PRIVATE_MEMBER_ACCESSORS(int, joined_game); PRIVATE_MEMBER_ACCESSORS(int, has_meet_user_settings); PRIVATE_MEMBER_ACCESSORS(int, handle_pings_only); PRIVATE_MEMBER_ACCESSORS(int, entry_count); PRIVATE_MEMBER_ACCESSORS(int, unused); PRIVATE_MEMBER_ACCESSORS(int, lobby_list_count); PRIVATE_MEMBER_ACCESSORS(int, unused2); PRIVATE_MEMBER_ACCESSORS(int, udp_disabled); PRIVATE_MEMBER_ACCESSORS(int, language); PRIVATE_MEMBER_ACCESSORS_ARRAY(u8, unused3, 80); PRIVATE_MEMBER_ACCESSORS(TPlyCharData, character_data); PRIVATE_MEMBER_ACCESSORS(u32, unused4); PRIVATE_MEMBER_ACCESSORS_C_ARRAY(TMenuListEntry, game_entries, 64); PRIVATE_MEMBER_ACCESSORS_C_ARRAY(TMenuListEntry, game_entries2, 64); PRIVATE_MEMBER_ACCESSORS_C_ARRAY(TMenuListEntry, lobby_entries, 16); PRIVATE_MEMBER_ACCESSORS_C_ARRAY(TMenuListEntry, quest_entries, 30); PRIVATE_MEMBER_ACCESSORS_ARRAY(u8, unused5, 128); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, serial_number3, 17); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, password2, 17); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, serial_number, 48); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, access_key, 48); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, password, 64); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, player_name, 16); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, serial_number2, 17); PRIVATE_MEMBER_ACCESSORS_ARRAY(char, access_key2, 17); PRIVATE_MEMBER_ACCESSORS(int, packet_offset); PRIVATE_MEMBER_ACCESSORS(int, packet_size); PRIVATE_MEMBER_ACCESSORS(struct packet, packet); PRIVATE_MEMBER_ACCESSORS_ARRAY(recv_packet_handler, recv_handlers, 52); }; #endif