From 492716ee6b5c17b09b6e2194923a24b0cfbbb787 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sun, 2 Nov 2025 10:30:55 +0100 Subject: [PATCH] Type check the ignore list --- apps/openmw/mwlua/nearbybindings.cpp | 32 +++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/apps/openmw/mwlua/nearbybindings.cpp b/apps/openmw/mwlua/nearbybindings.cpp index c6cc44a538..2436dd887e 100644 --- a/apps/openmw/mwlua/nearbybindings.cpp +++ b/apps/openmw/mwlua/nearbybindings.cpp @@ -26,25 +26,27 @@ namespace { std::vector ignore; - if (const auto& ignoreObj = options.get>("ignore")) + if (const auto& ignoreObj = options.get>("ignore")) { - ignore.push_back(ignoreObj->ptr()); - } - else if (const auto& ignoreList = options.get>("ignore")) - { - for (const MWLua::ObjectId& id : *ignoreList->mIds) + if (ignoreObj->is()) + ignore.push_back(ignoreObj->as().ptr()); + else if (ignoreObj->is()) { - ignore.push_back(MWLua::LObject(id).ptr()); - } - } - else if (const auto& ignoreTable = options.get>("ignore")) - { - ignoreTable->for_each([&](const auto& _, const sol::object& value) { - if (value.is()) + for (const MWLua::ObjectId& id : *ignoreObj->as().mIds) { - ignore.push_back(value.as().ptr()); + ignore.push_back(MWLua::LObject(id).ptr()); } - }); + } + else + { + // ignoreObj->as throws if the type doesn't match, but an unchecked value.as crashes... + ignoreObj->as().for_each([&](sol::object _, sol::object value) { + if (value.is()) + ignore.push_back(value.as().ptr()); + else + throw std::runtime_error("Table value is not a GameObject"); + }); + } } return ignore;