Skip to content

Commit a13f8f3

Browse files
author
Daisyhasacat
committed
Merge branch 'onInfoGetText' into 'master'
onDialogueResponse implementation See merge request OpenMW/openmw!5142
2 parents 01bcd6a + 731a0ee commit a13f8f3

File tree

5 files changed

+58
-0
lines changed

5 files changed

+58
-0
lines changed

apps/openmw/mwbase/luamanager.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ namespace ESM
3030
class ESMWriter;
3131
class RefId;
3232
struct LuaScripts;
33+
struct DialInfo;
34+
struct Dialogue;
3335
}
3436

3537
namespace LuaUtil
@@ -84,6 +86,9 @@ namespace MWBase
8486
= 0;
8587
virtual void exteriorCreated(MWWorld::CellStore& cell) = 0;
8688
virtual void actorDied(const MWWorld::Ptr& actor) = 0;
89+
virtual void onDialogueResponse(
90+
const MWWorld::Ptr& actor, const ESM::DialInfo& info, const ESM::Dialogue& record)
91+
= 0;
8792
virtual void questUpdated(const ESM::RefId& questId, int stage) = 0;
8893
// `arg` is either forwarded from MWGui::pushGuiMode or empty
8994
virtual void uiModeChanged(const MWWorld::Ptr& arg) = 0;

apps/openmw/mwdialogue/dialoguemanagerimp.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include "../mwbase/environment.hpp"
3232
#include "../mwbase/journal.hpp"
33+
#include "../mwbase/luamanager.hpp"
3334
#include "../mwbase/mechanicsmanager.hpp"
3435
#include "../mwbase/scriptmanager.hpp"
3536
#include "../mwbase/soundmanager.hpp"
@@ -178,6 +179,7 @@ namespace MWDialogue
178179

179180
MWScript::InterpreterContext interpreterContext(&mActor.getRefData().getLocals(), mActor);
180181
callback->addResponse({}, Interpreter::fixDefinesDialog(info->mResponse, interpreterContext));
182+
MWBase::Environment::get().getLuaManager()->onDialogueResponse(mActor, *info, dialogue);
181183
executeScript(info->mResultScript, mActor);
182184
mLastTopic = dialogue.mId;
183185

@@ -307,6 +309,7 @@ namespace MWDialogue
307309

308310
MWScript::InterpreterContext interpreterContext(&mActor.getRefData().getLocals(), mActor);
309311
callback->addResponse(title, Interpreter::fixDefinesDialog(info->mResponse, interpreterContext));
312+
MWBase::Environment::get().getLuaManager()->onDialogueResponse(mActor, *info, dialogue);
310313

311314
if (dialogue.mType == ESM::Dialogue::Topic)
312315
{
@@ -477,6 +480,7 @@ namespace MWDialogue
477480

478481
MWScript::InterpreterContext interpreterContext(&mActor.getRefData().getLocals(), mActor);
479482
callback->addResponse({}, Interpreter::fixDefinesDialog(text, interpreterContext));
483+
MWBase::Environment::get().getLuaManager()->onDialogueResponse(mActor, *info, *dialogue);
480484

481485
if (dialogue->mType == ESM::Dialogue::Topic)
482486
{
@@ -606,6 +610,7 @@ namespace MWDialogue
606610

607611
callback->addResponse(gmsts.find("sServiceRefusal")->mValue.getString(),
608612
Interpreter::fixDefinesDialog(info->mResponse, interpreterContext));
613+
MWBase::Environment::get().getLuaManager()->onDialogueResponse(mActor, *info, dialogue);
609614

610615
executeScript(info->mResultScript, mActor);
611616
return true;
@@ -649,6 +654,7 @@ namespace MWDialogue
649654
sndMgr->say(actor, Misc::ResourceHelpers::correctSoundPath(VFS::Path::Normalized(info->mSound)));
650655
if (!info->mResultScript.empty())
651656
executeScript(info->mResultScript, actor);
657+
MWBase::Environment::get().getLuaManager()->onDialogueResponse(actor, *info, *dial);
652658
}
653659
return info != nullptr;
654660
}

apps/openmw/mwlua/luamanagerimp.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,28 @@ namespace MWLua
448448
mLuaEvents.addLocalEvent({ getId(actor), "Died", {} });
449449
}
450450

451+
void LuaManager::onDialogueResponse(
452+
const MWWorld::Ptr& actor, const ESM::DialInfo& info, const ESM::Dialogue& record)
453+
{
454+
mLua.protectedCall([&](LuaUtil::LuaView& view) {
455+
sol::table data = view.newTable();
456+
data["actor"] = LObject(actor);
457+
if (record.mType == ESM::Dialogue::Type::Greeting)
458+
data["type"] = "greeting";
459+
else if (record.mType == ESM::Dialogue::Type::Journal)
460+
data["type"] = "journal";
461+
else if (record.mType == ESM::Dialogue::Type::Persuasion)
462+
data["type"] = "persuasion";
463+
else if (record.mType == ESM::Dialogue::Type::Topic)
464+
data["type"] = "topic";
465+
else if (record.mType == ESM::Dialogue::Type::Voice)
466+
data["type"] = "voice";
467+
data["infoId"] = info.mId.serializeText();
468+
data["recordId"] = record.mId.serializeText();
469+
sendLocalEvent(mPlayer, "DialogueResponse", data);
470+
});
471+
}
472+
451473
void LuaManager::useItem(const MWWorld::Ptr& object, const MWWorld::Ptr& actor, bool force)
452474
{
453475
MWBase::Environment::get().getWorldModel()->registerPtr(object);

apps/openmw/mwlua/luamanagerimp.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ namespace MWLua
105105
void questUpdated(const ESM::RefId& questId, int stage) override;
106106
void uiModeChanged(const MWWorld::Ptr& arg) override;
107107
void actorDied(const MWWorld::Ptr& actor) override;
108+
void onDialogueResponse(
109+
const MWWorld::Ptr& actor, const ESM::DialInfo& info, const ESM::Dialogue& record) override;
108110

109111
MWBase::LuaManager::ActorControls* getActorControls(const MWWorld::Ptr&) const override;
110112

docs/source/reference/lua-scripting/events.rst

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,29 @@ Events
66
Actor events
77
------------
88

9+
**DialogueResponse**
10+
11+
This event is sent to the player's local script when an actor triggers a greeting, topic response, service refusal, or plays a voice line.
12+
It returns a lua table with the following fields:
13+
- ``actor``: The actor that responded.
14+
- ``type``: The type of ``DialogueRecord`` that triggered the event, can be ``"greeting"``, ``"journal"``, ``"persuasion"``, ``"topic"``, or ``"voice"``.
15+
- ``recordId``: The ID of the ``DialogueRecord``.
16+
- ``infoId``: The ID of the ``DialogueRecordInfo`` in question.
17+
18+
.. code-block:: Lua
19+
20+
eventHandlers = {
21+
DialogueResponse = function(e)
22+
local topic = core.dialogue[e.type].records[e.recordId];
23+
for _, info in pairs(topic.infos) do
24+
if info.id == e.infoId then
25+
print(e.actor, 'said', info.text)
26+
return
27+
end
28+
end
29+
end
30+
}
31+
932
**Died**
1033

1134
This event is sent to an actor's local script when that actor dies.

0 commit comments

Comments
 (0)