diff --git a/apps/openmw/mwlua/types/player.cpp b/apps/openmw/mwlua/types/player.cpp index 15dc719f2e..a763575748 100644 --- a/apps/openmw/mwlua/types/player.cpp +++ b/apps/openmw/mwlua/types/player.cpp @@ -1,7 +1,9 @@ #include "types.hpp" +#include #include #include +#include #include "../birthsignbindings.hpp" #include "../luamanagerimp.hpp" @@ -195,6 +197,22 @@ 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_view topicId) { + verifyPlayer(player); + + ESM::RefId topic = ESM::RefId::deserializeText(topicId); + 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); + }; player["sendMenuEvent"] = [context](const Object& player, std::string eventName, const sol::object& eventData) { verifyPlayer(player); context.mLuaEvents->addMenuEvent({ std::move(eventName), LuaUtil::serialize(eventData) });