fix bug causing private subcommands to get truncated
This commit is contained in:
@@ -445,7 +445,7 @@ void process_ep3_menu_challenge(shared_ptr<ServerState>, shared_ptr<Client> c,
|
|||||||
uint16_t, uint32_t flag, const string& data) { // DC
|
uint16_t, uint32_t flag, const string& data) { // DC
|
||||||
check_size_v(data.size(), 0);
|
check_size_v(data.size(), 0);
|
||||||
if (flag != 0) {
|
if (flag != 0) {
|
||||||
send_command(c, 0xDC);
|
send_command(c, 0xDC, 0x00);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1030,7 +1030,7 @@ void process_quest_ready(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
|||||||
|
|
||||||
// if they're all done, start the quest
|
// if they're all done, start the quest
|
||||||
if (x == l->max_clients) {
|
if (x == l->max_clients) {
|
||||||
send_command(l, 0xAC);
|
send_command(l, 0xAC, 0x00);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1710,7 +1710,7 @@ void process_team_command_bb(shared_ptr<ServerState>, shared_ptr<Client> c,
|
|||||||
void process_encryption_ok_patch(shared_ptr<ServerState>, shared_ptr<Client> c,
|
void process_encryption_ok_patch(shared_ptr<ServerState>, shared_ptr<Client> c,
|
||||||
uint16_t, uint32_t, const string& data) {
|
uint16_t, uint32_t, const string& data) {
|
||||||
check_size_v(data.size(), 0);
|
check_size_v(data.size(), 0);
|
||||||
send_command(c, 0x04); // this requests the user's login information
|
send_command(c, 0x04, 0x00); // This requests the user's login information
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_login_patch(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
void process_login_patch(shared_ptr<ServerState> s, shared_ptr<Client> c,
|
||||||
@@ -1762,13 +1762,13 @@ independently.\r\n\
|
|||||||
send_check_directory_patch(c, ".");
|
send_check_directory_patch(c, ".");
|
||||||
send_check_directory_patch(c, "data");
|
send_check_directory_patch(c, "data");
|
||||||
send_check_directory_patch(c, "scene");
|
send_check_directory_patch(c, "scene");
|
||||||
send_command(c, 0x0A);
|
send_command(c, 0x0A, 0x00);
|
||||||
send_command(c, 0x0A);
|
send_command(c, 0x0A, 0x00);
|
||||||
send_command(c, 0x0A);
|
send_command(c, 0x0A, 0x00);
|
||||||
|
|
||||||
// This command terminates the patch connection successfully. PSOBB complains
|
// This command terminates the patch connection successfully. PSOBB complains
|
||||||
// if we don't check the above directories before sending this though
|
// if we don't check the above directories before sending this though
|
||||||
send_command(c, 0x0012, 0x00000000);
|
send_command(c, 0x12, 0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ static void forward_subcommand(shared_ptr<Lobby> l, shared_ptr<Client> c,
|
|||||||
if (command_is_ep3 && !(target->flags & Client::Flag::EPISODE_3)) {
|
if (command_is_ep3 && !(target->flags & Client::Flag::EPISODE_3)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
send_command(target, command, flag, data);
|
send_command(target, command, flag, data, size);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (command_is_ep3) {
|
if (command_is_ep3) {
|
||||||
@@ -86,7 +86,7 @@ static void forward_subcommand(shared_ptr<Lobby> l, shared_ptr<Client> c,
|
|||||||
if (!target || (target == c) || !(target->flags & Client::Flag::EPISODE_3)) {
|
if (!target || (target == c) || !(target->flags & Client::Flag::EPISODE_3)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
send_command(target, command, flag, data);
|
send_command(target, command, flag, data, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+1
-1
@@ -1017,7 +1017,7 @@ void send_player_leave_notification(shared_ptr<Lobby> l, uint8_t leaving_client_
|
|||||||
}
|
}
|
||||||
|
|
||||||
void send_get_player_info(shared_ptr<Client> c) {
|
void send_get_player_info(shared_ptr<Client> c) {
|
||||||
send_command(c, 0x95);
|
send_command(c, 0x95, 0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+35
-8
@@ -17,22 +17,49 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Note: There are so many versions of this function for a few reasons:
|
||||||
|
// - There are a lot of different target types (sometimes we want to send a
|
||||||
|
// command to one client, sometimes to everyone in a lobby, etc.)
|
||||||
|
// - For the const void* versions, the data and size arguments should not be
|
||||||
|
// independently optional - this can lead to bugs where a non-null data
|
||||||
|
// pointer is given but size is accidentally not given zero (e.g. if the type
|
||||||
|
// of data in the calling function is changed from string to void*).
|
||||||
|
|
||||||
void send_command(struct bufferevent* bev, GameVersion version,
|
void send_command(struct bufferevent* bev, GameVersion version,
|
||||||
PSOEncryption* crypt, uint16_t command, uint32_t flag = 0,
|
PSOEncryption* crypt, uint16_t command, uint32_t flag, const void* data,
|
||||||
const void* data = nullptr, size_t size = 0, const char* name_str = nullptr);
|
size_t size, const char* name_str = nullptr);
|
||||||
|
|
||||||
void send_command(std::shared_ptr<Client> c, uint16_t command,
|
void send_command(std::shared_ptr<Client> c, uint16_t command,
|
||||||
uint32_t flag = 0, const void* data = nullptr, size_t size = 0);
|
uint32_t flag, const void* data, size_t size);
|
||||||
|
|
||||||
|
inline void send_command(std::shared_ptr<Client> c, uint16_t command,
|
||||||
|
uint32_t flag) {
|
||||||
|
send_command(c, command, flag, nullptr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void send_command_excluding_client(std::shared_ptr<Lobby> l,
|
void send_command_excluding_client(std::shared_ptr<Lobby> l,
|
||||||
std::shared_ptr<Client> c, uint16_t command, uint32_t flag = 0,
|
std::shared_ptr<Client> c, uint16_t command, uint32_t flag,
|
||||||
const void* data = nullptr, size_t size = 0);
|
const void* data, size_t size);
|
||||||
|
|
||||||
void send_command(std::shared_ptr<Lobby> l, uint16_t command, uint32_t flag = 0,
|
inline void send_command_excluding_client(std::shared_ptr<Lobby> l,
|
||||||
const void* data = nullptr, size_t size = 0);
|
std::shared_ptr<Client> c, uint16_t command, uint32_t flag) {
|
||||||
|
send_command_excluding_client(l, c, command, flag, nullptr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_command(std::shared_ptr<Lobby> l, uint16_t command, uint32_t flag,
|
||||||
|
const void* data, size_t size);
|
||||||
|
|
||||||
|
inline void send_command(std::shared_ptr<Lobby> l, uint16_t command, uint32_t flag) {
|
||||||
|
send_command(l, command, flag, nullptr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void send_command(std::shared_ptr<ServerState> s, uint16_t command,
|
void send_command(std::shared_ptr<ServerState> s, uint16_t command,
|
||||||
uint32_t flag = 0, const void* data = nullptr, size_t size = 0);
|
uint32_t flag, const void* data, size_t size);
|
||||||
|
|
||||||
|
inline void send_command(std::shared_ptr<ServerState> s, uint16_t command,
|
||||||
|
uint32_t flag) {
|
||||||
|
send_command(s, command, flag, nullptr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename TargetT, typename StructT>
|
template <typename TargetT, typename StructT>
|
||||||
static void send_command(std::shared_ptr<TargetT> c, uint16_t command, uint32_t flag,
|
static void send_command(std::shared_ptr<TargetT> c, uint16_t command, uint32_t flag,
|
||||||
|
|||||||
Reference in New Issue
Block a user