improve bank handling across version boundaries
This commit is contained in:
+13
-3
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user