diff --git a/src/PlayerInventory.hh b/src/PlayerInventory.hh index 7e0339ab..c67a5446 100644 --- a/src/PlayerInventory.hh +++ b/src/PlayerInventory.hh @@ -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 operator PlayerBankT() const { - PlayerBankT ret; - ret.num_items = this->num_items.load(); + ret.num_items = std::min(ret.items.size(), this->num_items.load()); ret.meseta = this->meseta.load(); for (size_t z = 0; z < std::min(ret.items.size(), this->items.size()); z++) { ret.items[z] = this->items[z]; diff --git a/src/SaveFileFormats.cc b/src/SaveFileFormats.cc index 1a379ebe..1ebd5c7c 100644 --- a/src/SaveFileFormats.cc +++ b/src/SaveFileFormats.cc @@ -496,6 +496,7 @@ shared_ptr 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(ret->symbol_chats.size(), dc.symbol_chats.size()); z++) { auto& ret_sc = ret->symbol_chats[z]; @@ -610,6 +611,7 @@ shared_ptr 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(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(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;