diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d126b88462..14302c0a300 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -190,6 +190,7 @@ Bug #8085: Don't search in scripts or shaders directories for "Select directories you wish to add" menu in launcher Bug #8097: GetEffect doesn't detect 0 magnitude spells Bug #8124: Normal weapon resistance is applied twice for NPCs + Bug #8132: Actors without hello responses turn to face the player Feature #1415: Infinite fall failsafe Feature #2566: Handle NAM9 records for manual cell references Feature #3501: OpenMW-CS: Instance Editing - Shortcuts for axial locking diff --git a/apps/openmw/mwbase/dialoguemanager.hpp b/apps/openmw/mwbase/dialoguemanager.hpp index ccb4b9f43fd..e4c60e596db 100644 --- a/apps/openmw/mwbase/dialoguemanager.hpp +++ b/apps/openmw/mwbase/dialoguemanager.hpp @@ -66,7 +66,7 @@ namespace MWBase virtual void goodbye() = 0; - virtual void say(const MWWorld::Ptr& actor, const ESM::RefId& topic) = 0; + virtual bool say(const MWWorld::Ptr& actor, const ESM::RefId& topic) = 0; virtual void keywordSelected(std::string_view keyword, ResponseCallback* callback) = 0; virtual void goodbyeSelected() = 0; diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp index 27178606bee..9f3bb0b26f8 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp @@ -620,25 +620,25 @@ namespace MWDialogue return false; } - void DialogueManager::say(const MWWorld::Ptr& actor, const ESM::RefId& topic) + bool DialogueManager::say(const MWWorld::Ptr& actor, const ESM::RefId& topic) { MWBase::SoundManager* sndMgr = MWBase::Environment::get().getSoundManager(); if (sndMgr->sayActive(actor)) { // Actor is already saying something. - return; + return false; } if (actor.getClass().isNpc() && MWBase::Environment::get().getWorld()->isSwimming(actor)) { // NPCs don't talk while submerged - return; + return false; } if (actor.getClass().getCreatureStats(actor).getKnockedDown()) { // Unconscious actors can not speak - return; + return false; } const MWWorld::ESMStore& store = *MWBase::Environment::get().getESMStore(); @@ -657,6 +657,7 @@ namespace MWDialogue if (!info->mResultScript.empty()) executeScript(info->mResultScript, actor); } + return info != nullptr; } int DialogueManager::countSavedGameRecords() const diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp index af8adfb8765..a735c57fefb 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp @@ -100,7 +100,7 @@ namespace MWDialogue bool checkServiceRefused(ResponseCallback* callback, ServiceType service = ServiceType::Any) override; - void say(const MWWorld::Ptr& actor, const ESM::RefId& topic) override; + bool say(const MWWorld::Ptr& actor, const ESM::RefId& topic) override; // calbacks for the GUI void keywordSelected(std::string_view keyword, ResponseCallback* callback) override; diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index 191ad867335..3f2a9b46bba 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -534,7 +534,8 @@ namespace MWMechanics if (greetingTimer >= GREETING_SHOULD_START) { greetingState = Greet_InProgress; - MWBase::Environment::get().getDialogueManager()->say(actor, ESM::RefId::stringRefId("hello")); + if (!MWBase::Environment::get().getDialogueManager()->say(actor, ESM::RefId::stringRefId("hello"))) + greetingState = Greet_Done; greetingTimer = 0; } }