fix 0AE8 command

This commit is contained in:
Martin Michelsen
2024-01-03 21:01:14 -08:00
parent 1449bf090b
commit fccc0f7346
2 changed files with 32 additions and 24 deletions
+4 -4
View File
@@ -3222,11 +3222,11 @@ struct C_WriteGuildCardComment_BB_09E8 {
pstring<TextEncoding::UTF16, 0x58> comment; pstring<TextEncoding::UTF16, 0x58> comment;
} __packed__; } __packed__;
// 0AE8 (C->S): Set guild card position in list // 0AE8 (C->S): Swap positions of guild cards in list
struct C_MoveGuildCard_BB_0AE8 { struct C_SwapGuildCardPositions_BB_0AE8 {
le_uint32_t guild_card_number = 0; le_uint32_t guild_card_number1 = 0;
le_uint32_t position = 0; le_uint32_t guild_card_number2 = 0;
} __packed__; } __packed__;
// E9 (S->C): Remove player from spectator team (Episode 3) // E9 (S->C): Remove player from spectator team (Episode 3)
+28 -20
View File
@@ -3422,30 +3422,38 @@ static void on_E8_BB(shared_ptr<Client> c, uint16_t command, uint32_t, string& d
} }
break; break;
} }
case 0x0AE8: { // Move guild card in list case 0x0AE8: { // Swap guild card positions in list
auto& cmd = check_size_t<C_MoveGuildCard_BB_0AE8>(data); auto& cmd = check_size_t<C_SwapGuildCardPositions_BB_0AE8>(data);
if (cmd.position >= max_count) { size_t index1 = max_count;
throw invalid_argument("invalid new position"); size_t index2 = max_count;
} for (size_t z = 0; z < max_count; z++) {
size_t index; if (gcf->entries[z].data.guild_card_number == cmd.guild_card_number1) {
for (index = 0; index < max_count; index++) { if (index1 >= max_count) {
if (gcf->entries[index].data.guild_card_number == cmd.guild_card_number) { index1 = z;
break; } else {
throw runtime_error("guild card 1 appears multiple times in file");
}
}
if (gcf->entries[z].data.guild_card_number == cmd.guild_card_number2) {
if (index2 >= max_count) {
index2 = z;
} else {
throw runtime_error("guild card 2 appears multiple times in file");
}
} }
} }
if (index >= max_count) { if ((index1 >= max_count) || (index2 >= max_count)) {
throw invalid_argument("player does not have requested guild card"); throw runtime_error("player does not have both requested guild cards");
} }
auto moved_gc = gcf->entries[index];
for (; index < cmd.position; index++) { if (index1 != index2) {
gcf->entries[index] = gcf->entries[index + 1]; PSOBBGuildCardFile::Entry displaced_entry = gcf->entries[index1];
gcf->entries[index1] = gcf->entries[index2];
gcf->entries[index2] = displaced_entry;
c->log.info("Swapped positions of guild cards %" PRIu32 " and %" PRIu32,
cmd.guild_card_number1.load(), cmd.guild_card_number2.load());
should_save = true;
} }
for (; index > cmd.position; index--) {
gcf->entries[index] = gcf->entries[index - 1];
}
gcf->entries[index] = moved_gc;
c->log.info("Moved guild card %" PRIu32 " to position %zu", cmd.guild_card_number.load(), index);
should_save = true;
break; break;
} }
default: default: