diff options
author | WasabiRaptor <ketchupraptor@gmail.com> | 2024-03-07 13:12:11 -0500 |
---|---|---|
committer | WasabiRaptor <ketchupraptor@gmail.com> | 2024-03-07 19:18:28 -0500 |
commit | f8a6a3e57d30f60fcca1c467a2dc1b185e1e4fa4 (patch) | |
tree | 1576a8c7806f25a57a64b89393bb15e970da8ccc /source/game/StarPlayerInventory.cpp | |
parent | 79cd235939dece80a2df15bcafcf559b0de81df7 (diff) |
inventory and hotbar size mismatch fixes
I realized why that was there
checking patch arrays in a more clean manner
also support for checking values in other files using a string in the patch arrays
Revert "checking patch arrays in a more clean manner"
sorry that wasn't supposed to be in this one
Diffstat (limited to 'source/game/StarPlayerInventory.cpp')
-rw-r--r-- | source/game/StarPlayerInventory.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/source/game/StarPlayerInventory.cpp b/source/game/StarPlayerInventory.cpp index b6c4af3..83d2266 100644 --- a/source/game/StarPlayerInventory.cpp +++ b/source/game/StarPlayerInventory.cpp @@ -443,7 +443,7 @@ void PlayerInventory::condenseBagStacks(String const& bagType) {\ auto bag = m_bags[bagType]; bag->condenseStacks(); - + m_customBar.forEach([&](auto const&, CustomBarLink& link) { if (link.first) { if (auto bs = link.first->ptr<BagSlot>()) { @@ -756,6 +756,12 @@ Maybe<InventorySlot> PlayerInventory::secondaryHeldSlot() const { return {}; } +List<ItemPtr> PlayerInventory::clearOverflow(){ + auto list = m_inventoryLoadOverflow; + m_inventoryLoadOverflow.clear(); + return list; +} + void PlayerInventory::load(Json const& store) { auto itemDatabase = Root::singleton().itemDatabase(); @@ -771,14 +777,21 @@ void PlayerInventory::load(Json const& store) { //reuse ItemBags so the Inventory pane still works after load()'ing into the same PlayerInventory again (from swap) auto itemBags = store.get("itemBags").toObject(); eraseWhere(m_bags, [&](auto const& p) { return !itemBags.contains(p.first); }); + m_inventoryLoadOverflow.clear(); for (auto const& p : itemBags) { auto& bagType = p.first; auto newBag = ItemBag::loadStore(p.second); - auto& bagPtr = m_bags[bagType]; - if (bagPtr) - *bagPtr = std::move(newBag); - else - bagPtr = make_shared<ItemBag>(std::move(newBag)); + if (m_bags.keys().contains(bagType)) { + auto& bagPtr = m_bags[bagType]; + auto size = bagPtr.get()->size(); + if (bagPtr) + *bagPtr = std::move(newBag); + else + bagPtr = make_shared<ItemBag>(std::move(newBag)); + m_inventoryLoadOverflow.appendAll(bagPtr.get()->resize(size)); + } else { + m_inventoryLoadOverflow.appendAll(ItemBag(newBag).items()); + } } m_swapSlot = itemDatabase->diskLoad(store.get("swapSlot")); @@ -790,10 +803,17 @@ void PlayerInventory::load(Json const& store) { for (size_t i = 0; i < m_customBar.size(0); ++i) { for (size_t j = 0; j < m_customBar.size(1); ++j) { - Json cbl = store.get("customBar").get(i).get(j); + Json cbl = store.get("customBar").get(i,JsonArray()).get(j,JsonArray()); + auto validateLink = [this](Json link) -> Json { + if ((link.isType(Json::Type::Object)) + && (m_bags.keys().contains(link.getString("type"))) + && (m_bags[link.getString("type")].get()->size() > link.getUInt("location"))) + return link; + return Json(); + }; m_customBar.at(i, j) = CustomBarLink{ - jsonToMaybe<InventorySlot>(cbl.get(0, {}), jsonToInventorySlot), - jsonToMaybe<InventorySlot>(cbl.get(1, {}), jsonToInventorySlot) + jsonToMaybe<InventorySlot>(validateLink(cbl.get(0, Json())), jsonToInventorySlot), + jsonToMaybe<InventorySlot>(validateLink(cbl.get(1, Json())), jsonToInventorySlot) }; } } |