From 4749ddf58670425e668f31b81bd4be4441eefa69 Mon Sep 17 00:00:00 2001 From: Kuyondo Date: Thu, 14 Aug 2025 15:03:43 +0800 Subject: [PATCH] save lifetime of temporary quickkey items --- apps/openmw/mwgui/quickkeysmenu.cpp | 23 ++++++++--------------- apps/openmw/mwgui/quickkeysmenu.hpp | 3 +++ apps/openmw/mwworld/manualref.hpp | 9 ++++++--- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/apps/openmw/mwgui/quickkeysmenu.cpp b/apps/openmw/mwgui/quickkeysmenu.cpp index 6ee1ed9e4a..fc0ee18f47 100644 --- a/apps/openmw/mwgui/quickkeysmenu.cpp +++ b/apps/openmw/mwgui/quickkeysmenu.cpp @@ -16,9 +16,7 @@ #include "../mwworld/class.hpp" #include "../mwworld/esmstore.hpp" #include "../mwworld/inventorystore.hpp" -#include "../mwworld/manualref.hpp" #include "../mwworld/player.hpp" -#include "../mwworld/worldmodel.hpp" #include "../mwbase/environment.hpp" #include "../mwbase/mechanicsmanager.hpp" @@ -400,11 +398,9 @@ namespace MWGui if (*it == item) break; } - if (it == store.end()) - item = nullptr; - // check the quickkey item is available - if (item.isEmpty() || item.getCellRef().getCount() < 1) + // Is the quickkey item not in the inventory? + if (it == store.end()) { MWBase::Environment::get().getWindowManager()->messageBox("#{sQuickMenu5} " + key->name); return; @@ -629,11 +625,10 @@ namespace MWGui MWWorld::Ptr player = MWMechanics::getPlayer(); MWWorld::InventoryStore& store = player.getClass().getInventoryStore(player); - MWWorld::CellStore& draftCell = MWBase::Environment::get().getWorldModel()->getDraftCell(); - auto assignItem = [this](auto type, MWWorld::Ptr item) { + auto assign = [this](auto type, MWWorld::Ptr item) { if (type == ESM::QuickKeys::Type::Item) - onAssignItem(item); + assignItem(item); else // if (quickKey.mType == ESM::QuickKeys::Type::MagicItem) onAssignMagicItem(item); }; @@ -666,16 +661,14 @@ namespace MWGui // Fallback to a temporary object for UI display purposes if (MWBase::Environment::get().getESMStore()->find(quickKey.mId) != 0) { - MWWorld::ManualRef mref(*MWBase::Environment::get().getESMStore(), quickKey.mId); - item = mref.getPtr().getClass().copyToCell(mref.getPtr(), draftCell, 1); - assignItem(quickKey.mType, item); - MWBase::Environment::get().getWorld()->disable(item); - MWBase::Environment::get().getWorld()->deleteObject(item); + // Tie temporary item lifetime to this window + mTemp.emplace_back(*MWBase::Environment::get().getESMStore(), quickKey.mId, 0); + assign(quickKey.mType, mTemp.back().getPtr()); } } } else - assignItem(quickKey.mType, item); + assign(quickKey.mType, item); break; } diff --git a/apps/openmw/mwgui/quickkeysmenu.hpp b/apps/openmw/mwgui/quickkeysmenu.hpp index 11648cdb40..6fcf46b073 100644 --- a/apps/openmw/mwgui/quickkeysmenu.hpp +++ b/apps/openmw/mwgui/quickkeysmenu.hpp @@ -5,6 +5,8 @@ #include "components/esm3/quickkeys.hpp" +#include "../mwworld/manualref.hpp" + #include "itemselection.hpp" #include "spellmodel.hpp" #include "windowbase.hpp" @@ -57,6 +59,7 @@ namespace MWGui }; std::vector mKey; + std::vector mTemp; keyData* mSelected; keyData* mActivated; diff --git a/apps/openmw/mwworld/manualref.hpp b/apps/openmw/mwworld/manualref.hpp index 4611ed95bb..f7d85928d1 100644 --- a/apps/openmw/mwworld/manualref.hpp +++ b/apps/openmw/mwworld/manualref.hpp @@ -15,13 +15,16 @@ namespace MWWorld std::any mRef; Ptr mPtr; - ManualRef(const ManualRef&); - ManualRef& operator=(const ManualRef&); - public: ManualRef(const MWWorld::ESMStore& store, const ESM::RefId& name, const int count = 1); ManualRef(const MWWorld::ESMStore& store, const MWWorld::Ptr& template_, const int count = 1); + ManualRef(const ManualRef&) = delete; + ManualRef& operator=(const ManualRef&) = delete; + + ManualRef(ManualRef&&) noexcept = default; + ManualRef& operator=(ManualRef&&) noexcept = default; + const Ptr& getPtr() const { return mPtr; } }; }