fix uneven command size on ep3 card list update

This commit is contained in:
Martin Michelsen
2022-04-01 11:27:13 -07:00
parent 4cff7105fd
commit aa1a2e852b
+11 -5
View File
@@ -40,11 +40,11 @@ void send_command(
PSOCommandHeaderDCGC header; PSOCommandHeaderDCGC header;
header.command = command; header.command = command;
header.flag = flag; header.flag = flag;
header.size = sizeof(header) + size; header.size = (sizeof(header) + size + 3) & ~3;
send_data.append(reinterpret_cast<const char*>(&header), sizeof(header)); send_data.append(reinterpret_cast<const char*>(&header), sizeof(header));
if (size) { if (size) {
send_data.append(reinterpret_cast<const char*>(data), size); send_data.append(reinterpret_cast<const char*>(data), size);
send_data.resize((send_data.size() + 3) & ~3); send_data.resize(header.size);
} }
break; break;
} }
@@ -52,20 +52,23 @@ void send_command(
case GameVersion::PC: case GameVersion::PC:
case GameVersion::PATCH: { case GameVersion::PATCH: {
PSOCommandHeaderPC header; PSOCommandHeaderPC header;
header.size = sizeof(header) + size; header.size = (sizeof(header) + size + 3) & ~3;
header.command = command; header.command = command;
header.flag = flag; header.flag = flag;
send_data.append(reinterpret_cast<const char*>(&header), sizeof(header)); send_data.append(reinterpret_cast<const char*>(&header), sizeof(header));
if (size) { if (size) {
send_data.append(reinterpret_cast<const char*>(data), size); send_data.append(reinterpret_cast<const char*>(data), size);
send_data.resize((send_data.size() + 3) & ~3); send_data.resize(header.size);
} }
break; break;
} }
case GameVersion::BB: { case GameVersion::BB: {
// BB has an annoying behavior here: command lengths must be multiples of
// 4, but the actual data length must be a multiple of 8. If the size
// field is not divisible by 8, 4 extra bytes are sent anyway.
PSOCommandHeaderBB header; PSOCommandHeaderBB header;
header.size = sizeof(header) + size; header.size = (sizeof(header) + size + 3) & ~3;
header.command = command; header.command = command;
header.flag = flag; header.flag = flag;
send_data.append(reinterpret_cast<const char*>(&header), sizeof(header)); send_data.append(reinterpret_cast<const char*>(&header), sizeof(header));
@@ -854,6 +857,9 @@ void send_join_game_t(shared_ptr<Client> c, shared_ptr<Lobby> l) {
l->clients[x]->player.disp); l->clients[x]->player.disp);
} }
player_count++; player_count++;
} else {
// inventory doesn't have a default contructor, so clear it manually
memset(&cmd.players_ep3[x].inventory, 0, sizeof(cmd.players_ep3[x].inventory));
} }
} }