From 4ca9cac784f4ade294337a0198490e6f75cf184a Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sat, 26 Jul 2025 11:05:40 +0200 Subject: [PATCH] Don't use cached awareness in combat --- apps/openmw/mwbase/mechanicsmanager.hpp | 2 +- apps/openmw/mwmechanics/aicombataction.cpp | 2 +- apps/openmw/mwmechanics/aipursue.cpp | 2 +- apps/openmw/mwmechanics/mechanicsmanagerimp.cpp | 7 +++++-- apps/openmw/mwmechanics/mechanicsmanagerimp.hpp | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwbase/mechanicsmanager.hpp b/apps/openmw/mwbase/mechanicsmanager.hpp index 23d79c1a6b..0a4676cfb0 100644 --- a/apps/openmw/mwbase/mechanicsmanager.hpp +++ b/apps/openmw/mwbase/mechanicsmanager.hpp @@ -102,7 +102,7 @@ namespace MWBase ///< Return the number of deaths for actors with the given ID. /// Check if \a observer is potentially aware of \a ptr. Does not do a line of sight check! - virtual bool awarenessCheck(const MWWorld::Ptr& ptr, const MWWorld::Ptr& observer) = 0; + virtual bool awarenessCheck(const MWWorld::Ptr& ptr, const MWWorld::Ptr& observer, bool useCache = true) = 0; /// Makes \a ptr fight \a target. Also shouts a combat taunt. virtual void startCombat( diff --git a/apps/openmw/mwmechanics/aicombataction.cpp b/apps/openmw/mwmechanics/aicombataction.cpp index 91d2a9bbb8..ac59de0426 100644 --- a/apps/openmw/mwmechanics/aicombataction.cpp +++ b/apps/openmw/mwmechanics/aicombataction.cpp @@ -433,7 +433,7 @@ namespace MWMechanics ESM::Position enemyPos = enemy.getRefData().getPosition(); if (isTargetMagicallyHidden(enemy) - && !MWBase::Environment::get().getMechanicsManager()->awarenessCheck(enemy, actor)) + && !MWBase::Environment::get().getMechanicsManager()->awarenessCheck(enemy, actor, false)) { return false; } diff --git a/apps/openmw/mwmechanics/aipursue.cpp b/apps/openmw/mwmechanics/aipursue.cpp index 461db45133..1dbbddd218 100644 --- a/apps/openmw/mwmechanics/aipursue.cpp +++ b/apps/openmw/mwmechanics/aipursue.cpp @@ -42,7 +42,7 @@ namespace MWMechanics return true; if (isTargetMagicallyHidden(target) - && !MWBase::Environment::get().getMechanicsManager()->awarenessCheck(target, actor)) + && !MWBase::Environment::get().getMechanicsManager()->awarenessCheck(target, actor, false)) return false; if (target.getClass().getCreatureStats(target).isDead()) diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index f0089a82ad..bb5c229433 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1608,7 +1608,7 @@ namespace MWMechanics commitCrime(player, victim, MWBase::MechanicsManager::OT_Murder); } - bool MechanicsManager::awarenessCheck(const MWWorld::Ptr& ptr, const MWWorld::Ptr& observer) + bool MechanicsManager::awarenessCheck(const MWWorld::Ptr& ptr, const MWWorld::Ptr& observer, bool useCache) { if (observer.getClass().getCreatureStats(observer).isDead() || !observer.getRefData().isEnabled()) return false; @@ -1675,7 +1675,10 @@ namespace MWMechanics } float target = x - y; - return observerStats.getAwarenessRoll() >= target; + if (useCache) + return observerStats.getAwarenessRoll() >= target; + auto& prng = MWBase::Environment::get().getWorld()->getPrng(); + return Misc::Rng::roll0to99(prng) >= target; } void MechanicsManager::startCombat( diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp index 93af89863b..419f5f2e41 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.hpp @@ -102,7 +102,7 @@ namespace MWMechanics ///< Perform a persuasion action on NPC /// Check if \a observer is potentially aware of \a ptr. Does not do a line of sight check! - bool awarenessCheck(const MWWorld::Ptr& ptr, const MWWorld::Ptr& observer) override; + bool awarenessCheck(const MWWorld::Ptr& ptr, const MWWorld::Ptr& observer, bool useCache = true) override; /// Makes \a ptr fight \a target. Also shouts a combat taunt. void startCombat(