summaryrefslogtreecommitdiff
path: root/include/pso/TProtocol.h
blob: 5be26ebac8be1795db0c3761f07030e902063269 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef TPROTOCOL_H
#define TPROTOCOL_H

#include <global_types.h>
#include <string.h>
#include <pso/macros.h>
#include <pso/forward.h>
#include <pso/protocol.h>
#include <pso/PSOV3EncryptionTCP.h>
#include <pso/TArray.h>
#include <pso/TMainTask.h>
#include <pso/TMenuList.h>
#include <pso/TObject.h>
#include <pso/TPlyCharData.h>
#include <pso/TPlyClientConfig.h>
#include <pso/TPlyGuildCardTag.h>
#include <pso/TPlySmth.h>
#include <pso/TSocket.h>
#include <pso/TTcpSocket.h>


struct packet {
	packet_header header;
	TArray<u8, 0x7c00-sizeof(packet_header)> data;

	template<typename T>
	T &as() {
		return reinterpret_cast<T>(*this);
	};
};

struct GameListEntry {
	u8 difficulty_tag;
	u8 num_players;
	TArray<char, 16> name;
	u8 episode;
	u8 flags;
};

struct LobbyListEntry {
	u32 smth;
};

struct QuestListEntry {
	TArray<char, 32> name;
	TArray<char, 112> short_description;
};

typedef void (*recv_packet_handler)(packet &pkt);

class TProtocol : public TTcpSocket {
private:
	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_buffer_ready;
	int m_entry_count;
	int m_unused;
	int m_lobby_list_count;
	int m_unused2;
	int m_udp_disabled;
	int m_language;
	TArray<u8, 80> m_unused3;
	TPlyCharData m_character_data;
	u32 m_unused4;
	TArray<TMenuListEntry<GameListEntry>, 64> m_game_entries;
	TArray<TMenuListEntry<GameListEntry>, 64> m_game_entries2;
	TArray<TMenuListEntry<LobbyListEntry>, 16> m_lobby_entries;
	TArray<TMenuListEntry<QuestListEntry>, 30> m_quest_entries;
	TArray<u8, 128> m_unused5;
	TArray<char, 17> m_serial_number3;
	TArray<char, 17> m_password2;
	TArray<char, 48> m_serial_number;
	TArray<char, 48> m_access_key;
	TArray<char, 64> m_password;
	TArray<char, 16> m_player_name;
	TArray<char, 17> m_serial_number2;
	TArray<char, 17> m_access_key2;
	TPlyClientConfig m_client_config;
	int m_packet_offset;
	int m_packet_size;
	packet m_packet;
	TArray<recv_packet_handler, 52> 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 int send(u8 *data, size_t size);

	int handle_command(packet *pkt);

	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, buffer_ready);
	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_ARRAY(TMenuListEntry<GameListEntry>, game_entries, 64);
	PRIVATE_MEMBER_ACCESSORS_ARRAY(TMenuListEntry<GameListEntry>, game_entries2, 64);
	PRIVATE_MEMBER_ACCESSORS_ARRAY(TMenuListEntry<LobbyListEntry>, lobby_entries, 16);
	PRIVATE_MEMBER_ACCESSORS_ARRAY(TMenuListEntry<QuestListEntry>, 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