From 24f1feb67a9ecb6e2c0b5aed79f1ec344ccc8f70 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Thu, 2 Jan 2025 14:13:37 +0300 Subject: [PATCH] Allow disabling objects that have no placed instances (#4289) --- CHANGELOG.md | 1 + apps/openmw/mwscript/miscextensions.cpp | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84bd44bd18..fab893258f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Bug #4127: Weapon animation looks choppy Bug #4204: Dead slaughterfish doesn't float to water surface after loading saved game Bug #4207: RestoreHealth/Fatigue spells have a huge priority even if a success chance is near 0 + Bug #4289: Script compilation fails if an NPC deleted in a content file is disabled Bug #4382: Sound output device does not change when it should Bug #4508: Can't stack enchantment buffs from different instances of the same self-cast generic magic apparel Bug #4610: Casting a Bound Weapon spell cancels the casting animation by equipping the weapon prematurely diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 72faf0afa9..ed2ef756e6 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -254,7 +254,26 @@ namespace MWScript public: void execute(Interpreter::Runtime& runtime) override { - MWWorld::Ptr ptr = R()(runtime); + MWWorld::Ptr ptr; + if (!R::implicit) + { + ESM::RefId name = ESM::RefId::stringRefId(runtime.getStringLiteral(runtime[0].mInteger)); + runtime.pop(); + + ptr = MWBase::Environment::get().getWorld()->searchPtr(name, false); + // We don't normally want to let this go, but some mods insist on trying this + if (ptr.isEmpty()) + { + const std::string error = "Failed to find an instance of object " + name.toDebugString(); + runtime.getContext().report(error); + Log(Debug::Error) << error; + return; + } + } + else + { + ptr = R()(runtime); + } MWBase::Environment::get().getWorld()->disable(ptr); } };