From bdcd2bc802ca423b6b476c73c4c74fb3d871c4bf Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Wed, 21 Oct 2020 17:21:28 +0200 Subject: [PATCH] Allow adding levelled lists with AddItem --- CHANGELOG.md | 1 + apps/openmw/mwscript/containerextensions.cpp | 35 +++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39f6684a9..b0128af4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ Bug #5644: Summon effects running on the player during game initialization cause crashes Feature #390: 3rd person look "over the shoulder" Feature #2386: Distant Statics in the form of Object Paging + Feature #2404: Levelled List can not be placed into a container Feature #4894: Consider actors as obstacles for pathfinding Feature #5043: Head Bobbing Feature #5297: Add a search function to the "Datafiles" tab of the OpenMW launcher diff --git a/apps/openmw/mwscript/containerextensions.cpp b/apps/openmw/mwscript/containerextensions.cpp index 0af5cee2b..2e78fe374 100644 --- a/apps/openmw/mwscript/containerextensions.cpp +++ b/apps/openmw/mwscript/containerextensions.cpp @@ -28,12 +28,13 @@ #include "../mwworld/manualref.hpp" #include "../mwmechanics/actorutil.hpp" +#include "../mwmechanics/levelledlist.hpp" #include "ref.hpp" namespace { - void addToStore(MWWorld::Ptr& itemPtr, int count, MWWorld::Ptr& ptr, MWWorld::ContainerStore& store, bool resolve = true) + void addToStore(const MWWorld::Ptr& itemPtr, int count, MWWorld::Ptr& ptr, MWWorld::ContainerStore& store, bool resolve = true) { if (itemPtr.getClass().getScript(itemPtr).empty()) { @@ -46,6 +47,30 @@ namespace store.add (itemPtr, 1, ptr, true, resolve); } } + + void addRandomToStore(const MWWorld::Ptr& itemPtr, int count, MWWorld::Ptr& owner, MWWorld::ContainerStore& store, bool topLevel = true) + { + if(itemPtr.getTypeName() == typeid(ESM::ItemLevList).name()) + { + const ESM::ItemLevList* levItemList = itemPtr.get()->mBase; + + if(topLevel && count > 1 && levItemList->mFlags & ESM::ItemLevList::Each) + { + for(int i = 0; i < count; i++) + addRandomToStore(itemPtr, 1, owner, store, true); + } + else + { + std::string itemId = MWMechanics::getLevelledItem(itemPtr.get()->mBase, false); + if (itemId.empty()) + return; + MWWorld::ManualRef manualRef(MWBase::Environment::get().getWorld()->getStore(), itemId, 1); + addRandomToStore(manualRef.getPtr(), count, owner, store, false); + } + } + else + addToStore(itemPtr, count, owner, store); + } } namespace MWScript @@ -112,7 +137,7 @@ namespace MWScript { if(store.isResolved()) { - // TODO #2404 + addRandomToStore(itemPtr, count, ptr, store); } } else @@ -122,8 +147,10 @@ namespace MWScript return; } MWWorld::ContainerStore& store = ptr.getClass().getContainerStore(ptr); - // TODO #2404 - addToStore(itemPtr, count, ptr, store); + if(isLevelledList) + addRandomToStore(itemPtr, count, ptr, store); + else + addToStore(itemPtr, count, ptr, store); // Spawn a messagebox (only for items added to player's inventory and if player is talking to someone) if (ptr == MWBase::Environment::get().getWorld ()->getPlayerPtr() )