improve bank handling across version boundaries

This commit is contained in:
Martin Michelsen
2024-05-25 09:08:55 -07:00
parent 8775367043
commit e77ee397cd
2 changed files with 17 additions and 3 deletions
+13 -3
View File
@@ -353,7 +353,6 @@ struct PlayerBankT {
}
ItemData remove_item(uint32_t item_id, uint32_t amount, const ItemData::StackLimits& limits) {
size_t index = this->find_item(item_id);
auto& bank_item = this->items[index];
@@ -397,11 +396,22 @@ struct PlayerBankT {
}
}
void decode_from_client(Version v) {
for (size_t z = 0; z < this->items.size(); z++) {
this->items[z].data.decode_for_version(v);
}
}
void encode_for_client(Version v) {
for (size_t z = 0; z < this->items.size(); z++) {
this->items[z].data.encode_for_version(v, nullptr);
}
}
template <size_t DestSlotCount, bool DestIsBigEndian>
operator PlayerBankT<DestSlotCount, DestIsBigEndian>() const {
PlayerBankT<DestSlotCount, DestIsBigEndian> ret;
ret.num_items = this->num_items.load();
ret.num_items = std::min<size_t>(ret.items.size(), this->num_items.load());
ret.meseta = this->meseta.load();
for (size_t z = 0; z < std::min<size_t>(ret.items.size(), this->items.size()); z++) {
ret.items[z] = this->items[z];
+4
View File
@@ -496,6 +496,7 @@ shared_ptr<PSOBBCharacterFile> PSOBBCharacterFile::create_from_dc_v2(const PSODC
ret->save_count = dc.save_count;
ret->quest_flags = dc.quest_flags;
ret->bank = dc.bank;
ret->bank.decode_from_client(Version::DC_V2);
ret->guild_card = dc.guild_card;
for (size_t z = 0; z < std::min<size_t>(ret->symbol_chats.size(), dc.symbol_chats.size()); z++) {
auto& ret_sc = ret->symbol_chats[z];
@@ -610,6 +611,7 @@ shared_ptr<PSOBBCharacterFile> PSOBBCharacterFile::create_from_xb(const PSOXBCha
ret->quest_flags = xb.quest_flags;
ret->death_count = xb.death_count.load();
ret->bank = xb.bank;
ret->bank.decode_from_client(Version::XB_V3);
ret->guild_card = xb.guild_card;
for (size_t z = 0; z < std::min<size_t>(ret->symbol_chats.size(), xb.symbol_chats.size()); z++) {
auto& ret_sc = ret->symbol_chats[z];
@@ -655,6 +657,7 @@ PSODCV2CharacterFile PSOBBCharacterFile::to_dc_v2() const {
ret.save_count = this->save_count.load();
ret.quest_flags = this->quest_flags;
ret.bank = this->bank;
ret.bank.encode_for_client(Version::DC_V2);
ret.guild_card = this->guild_card;
for (size_t z = 0; z < std::min<size_t>(ret.symbol_chats.size(), this->symbol_chats.size()); z++) {
auto& ret_sc = ret.symbol_chats[z];
@@ -777,6 +780,7 @@ PSOXBCharacterFileCharacter PSOBBCharacterFile::to_xb(uint64_t xb_user_id) const
ret.quest_flags = this->quest_flags;
ret.death_count = this->death_count.load();
ret.bank = this->bank;
ret.bank.encode_for_client(Version::XB_V3);
ret.guild_card = this->guild_card;
ret.guild_card.xb_user_id_high = (xb_user_id >> 32) & 0xFFFFFFFF;
ret.guild_card.xb_user_id_low = xb_user_id & 0xFFFFFFFF;