From 4150f5fad6ae722cdcea43444efb50d4eb7e0ad2 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 1 Feb 2025 03:21:40 -0700 Subject: [PATCH 1/6] FEAT: AddTopic in Lua, close #8334 --- apps/openmw/mwlua/types/player.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/openmw/mwlua/types/player.cpp b/apps/openmw/mwlua/types/player.cpp index 15dc719f2e..2235cfc49c 100644 --- a/apps/openmw/mwlua/types/player.cpp +++ b/apps/openmw/mwlua/types/player.cpp @@ -1,5 +1,6 @@ #include "types.hpp" +#include #include #include @@ -195,6 +196,18 @@ namespace MWLua throw std::runtime_error("Only player and global scripts can toggle teleportation."); MWBase::Environment::get().getWorld()->enableTeleporting(state); }; + player["addTopic"] = [](const Object& player, std::string topicId) { + if (dynamic_cast(&player) && !dynamic_cast(&player)) + throw std::runtime_error("Only player and global scripts may add topics."); + + ESM::RefId topic = ESM::RefId::stringRefId(topicId); + if (!MWBase::Environment::get().getESMStore()->get().search(topic)) + { + throw std::runtime_error("Failed to add topic " + topicId + ": topic record not found"); + } + + MWBase::Environment::get().getDialogueManager()->addTopic(topic); + }; player["sendMenuEvent"] = [context](const Object& player, std::string eventName, const sol::object& eventData) { verifyPlayer(player); context.mLuaEvents->addMenuEvent({ std::move(eventName), LuaUtil::serialize(eventData) }); From 05b12ac8799ed18369a8932dad44c0c89a348761 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 1 Feb 2025 04:32:20 -0700 Subject: [PATCH 2/6] CLEANUP: Use more appropriate object types & functions in addTopic binding --- apps/openmw/mwlua/types/player.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwlua/types/player.cpp b/apps/openmw/mwlua/types/player.cpp index 2235cfc49c..25056caa41 100644 --- a/apps/openmw/mwlua/types/player.cpp +++ b/apps/openmw/mwlua/types/player.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "../birthsignbindings.hpp" #include "../luamanagerimp.hpp" @@ -196,14 +197,14 @@ namespace MWLua throw std::runtime_error("Only player and global scripts can toggle teleportation."); MWBase::Environment::get().getWorld()->enableTeleporting(state); }; - player["addTopic"] = [](const Object& player, std::string topicId) { - if (dynamic_cast(&player) && !dynamic_cast(&player)) - throw std::runtime_error("Only player and global scripts may add topics."); + player["addTopic"] = [](const Object& player, std::string_view topicId) { + verifyPlayer(player); - ESM::RefId topic = ESM::RefId::stringRefId(topicId); + ESM::RefId topic = ESM::RefId::deserializeText(topicId); if (!MWBase::Environment::get().getESMStore()->get().search(topic)) { - throw std::runtime_error("Failed to add topic " + topicId + ": topic record not found"); + throw std::runtime_error( + Misc::StringUtils::format("Failed to add topic ", topicId, ": topic record not found")); } MWBase::Environment::get().getDialogueManager()->addTopic(topic); From 8ec4fcbf301d81fc21a3a5b60795400a8ad96a5d Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 1 Feb 2025 12:01:16 -0700 Subject: [PATCH 3/6] CLEANUP: Actually check the record in question is a topic when using addTopic --- apps/openmw/mwlua/types/player.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwlua/types/player.cpp b/apps/openmw/mwlua/types/player.cpp index 25056caa41..a763575748 100644 --- a/apps/openmw/mwlua/types/player.cpp +++ b/apps/openmw/mwlua/types/player.cpp @@ -201,11 +201,15 @@ namespace MWLua verifyPlayer(player); ESM::RefId topic = ESM::RefId::deserializeText(topicId); - if (!MWBase::Environment::get().getESMStore()->get().search(topic)) - { + const ESM::Dialogue* dialogueRecord + = MWBase::Environment::get().getESMStore()->get().search(topic); + + if (!dialogueRecord) throw std::runtime_error( Misc::StringUtils::format("Failed to add topic ", topicId, ": topic record not found")); - } + else if (dialogueRecord->mType != ESM::Dialogue::Topic) + throw std::runtime_error( + Misc::StringUtils::format("Failed to add topic ", topicId, ": record is not a topic")); MWBase::Environment::get().getDialogueManager()->addTopic(topic); }; From 943cd765e77e370c19353b957aee01dd1202a7f9 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Thu, 10 Jul 2025 17:25:30 -0700 Subject: [PATCH 4/6] CLEANUP: Update for MR Comments --- apps/openmw/mwlua/types/player.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwlua/types/player.cpp b/apps/openmw/mwlua/types/player.cpp index a763575748..b0912f5bbd 100644 --- a/apps/openmw/mwlua/types/player.cpp +++ b/apps/openmw/mwlua/types/player.cpp @@ -1,13 +1,12 @@ #include "types.hpp" -#include #include #include -#include #include "../birthsignbindings.hpp" #include "../luamanagerimp.hpp" +#include "apps/openmw/mwbase/dialoguemanager.hpp" #include "apps/openmw/mwbase/inputmanager.hpp" #include "apps/openmw/mwbase/journal.hpp" #include "apps/openmw/mwbase/mechanicsmanager.hpp" @@ -205,11 +204,10 @@ namespace MWLua = MWBase::Environment::get().getESMStore()->get().search(topic); if (!dialogueRecord) - throw std::runtime_error( - Misc::StringUtils::format("Failed to add topic ", topicId, ": topic record not found")); - else if (dialogueRecord->mType != ESM::Dialogue::Topic) - throw std::runtime_error( - Misc::StringUtils::format("Failed to add topic ", topicId, ": record is not a topic")); + throw std::runtime_error("Failed to add topic " + std::string(topicId) + ": topic record not found"); + + if (dialogueRecord->mType != ESM::Dialogue::Topic) + throw std::runtime_error("Failed to add topic " + std::string(topicId) + ": record is not a topic"); MWBase::Environment::get().getDialogueManager()->addTopic(topic); }; From ced135bc87f832c611c21c6ed2c2eff006c681c3 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Fri, 11 Jul 2025 01:47:22 -0700 Subject: [PATCH 5/6] CLEANUP: No, record ids should totally be quoted --- apps/openmw/mwlua/types/player.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwlua/types/player.cpp b/apps/openmw/mwlua/types/player.cpp index b0912f5bbd..e8e0eaebb5 100644 --- a/apps/openmw/mwlua/types/player.cpp +++ b/apps/openmw/mwlua/types/player.cpp @@ -204,10 +204,11 @@ namespace MWLua = MWBase::Environment::get().getESMStore()->get().search(topic); if (!dialogueRecord) - throw std::runtime_error("Failed to add topic " + std::string(topicId) + ": topic record not found"); + throw std::runtime_error( + "Failed to add topic \"" + std::string(topicId) + "\": topic record not found"); if (dialogueRecord->mType != ESM::Dialogue::Topic) - throw std::runtime_error("Failed to add topic " + std::string(topicId) + ": record is not a topic"); + throw std::runtime_error("Failed to add topic \"" + std::string(topicId) + "\": record is not a topic"); MWBase::Environment::get().getDialogueManager()->addTopic(topic); }; From 1abaf706c81879d6cae95a2f0fe5f0717925b3ed Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 12 Jul 2025 19:37:36 -0700 Subject: [PATCH 6/6] CLEANUP: Bump api revision --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1d25f9350..a00dafc7ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ message(STATUS "Configuring OpenMW...") set(OPENMW_VERSION_MAJOR 0) set(OPENMW_VERSION_MINOR 50) set(OPENMW_VERSION_RELEASE 0) -set(OPENMW_LUA_API_REVISION 80) +set(OPENMW_LUA_API_REVISION 81) set(OPENMW_POSTPROCESSING_API_REVISION 3) set(OPENMW_VERSION_COMMITHASH "")