From a3cb64b7616c604096acb3be0858a26bc9c1dd31 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 1 Feb 2025 03:21:40 -0700 Subject: [PATCH 1/3] 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 8565d0ab6cf5407d20cbda42a9ad88fde5a9f146 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 1 Feb 2025 04:32:20 -0700 Subject: [PATCH 2/3] 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 2e93b982f35db0315fbf26f5a6802c9c597583d1 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 1 Feb 2025 12:01:16 -0700 Subject: [PATCH 3/3] 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); };