From 21df69d78a7e6d83e4784061b6e9e848740b6765 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Mon, 25 Jul 2022 23:04:39 +0300 Subject: [PATCH] [Client] Add MechanicsHelper::makePeace() for pacifying actors and allies --- apps/openmw/mwmp/MechanicsHelper.cpp | 109 +++++++++++++++++++++++++++ apps/openmw/mwmp/MechanicsHelper.hpp | 2 + 2 files changed, 111 insertions(+) diff --git a/apps/openmw/mwmp/MechanicsHelper.cpp b/apps/openmw/mwmp/MechanicsHelper.cpp index d3b44088a..7b3cffd97 100644 --- a/apps/openmw/mwmp/MechanicsHelper.cpp +++ b/apps/openmw/mwmp/MechanicsHelper.cpp @@ -343,6 +343,115 @@ bool MechanicsHelper::isTeamMember(const MWWorld::Ptr& playerChecked, const MWWo return isTeamMember; } +void MechanicsHelper::makePeace(const MWWorld::Ptr& actor1, const MWWorld::Ptr& actor2) +{ + MWMechanics::CreatureStats& creatureStats1 = actor1.getClass().getCreatureStats(actor1); + MWMechanics::CreatureStats& creatureStats2 = actor2.getClass().getCreatureStats(actor2); + + if (creatureStats2.matchesActorId(creatureStats1.getHitAttemptActorId())) + { + creatureStats1.setHitAttemptActorId(-1); + } + + if (creatureStats1.matchesActorId(creatureStats2.getHitAttemptActorId())) + { + creatureStats2.setHitAttemptActorId(-1); + } + + if (creatureStats1.getAiSequence().isInCombat(actor2)) + { + creatureStats1.getAiSequence().stopCombat(); + } + + if (creatureStats2.getAiSequence().isInCombat(actor1)) + { + creatureStats2.getAiSequence().stopCombat(); + } + + std::list allies1 = MWBase::Environment::get().getMechanicsManager()->getActorsSidingWith(actor1); + std::list allies2 = MWBase::Environment::get().getMechanicsManager()->getActorsSidingWith(actor2); + + for (const auto& ally1 : allies1) + { + MWMechanics::CreatureStats& allyCreatureStats1 = ally1.getClass().getCreatureStats(ally1); + + if (creatureStats2.matchesActorId(allyCreatureStats1.getHitAttemptActorId())) + { + allyCreatureStats1.setHitAttemptActorId(-1); + } + + if (allyCreatureStats1.matchesActorId(creatureStats2.getHitAttemptActorId())) + { + creatureStats2.setHitAttemptActorId(-1); + } + + if (allyCreatureStats1.getAiSequence().isInCombat(actor2)) + { + allyCreatureStats1.getAiSequence().stopCombat(); + } + + if (creatureStats2.getAiSequence().isInCombat(ally1)) + { + creatureStats2.getAiSequence().stopCombat(); + } + } + + for (const auto& ally2 : allies2) + { + MWMechanics::CreatureStats& allyCreatureStats2 = ally2.getClass().getCreatureStats(ally2); + + if (creatureStats1.matchesActorId(allyCreatureStats2.getHitAttemptActorId())) + { + allyCreatureStats2.setHitAttemptActorId(-1); + } + + if (allyCreatureStats2.matchesActorId(creatureStats1.getHitAttemptActorId())) + { + creatureStats1.setHitAttemptActorId(-1); + } + + if (allyCreatureStats2.getAiSequence().isInCombat(actor1)) + { + allyCreatureStats2.getAiSequence().stopCombat(); + } + + if (creatureStats1.getAiSequence().isInCombat(ally2)) + { + creatureStats1.getAiSequence().stopCombat(); + } + } + + for (const auto& ally1 : allies1) + { + MWMechanics::CreatureStats& allyCreatureStats1 = ally1.getClass().getCreatureStats(ally1); + + for (const auto& ally2 : allies2) + { + MWMechanics::CreatureStats& allyCreatureStats2 = ally2.getClass().getCreatureStats(ally2); + + if (allyCreatureStats2.matchesActorId(allyCreatureStats1.getHitAttemptActorId())) + { + allyCreatureStats1.setHitAttemptActorId(-1); + } + + if (allyCreatureStats1.matchesActorId(allyCreatureStats2.getHitAttemptActorId())) + { + allyCreatureStats2.setHitAttemptActorId(-1); + } + + if (allyCreatureStats1.getAiSequence().isInCombat(ally2)) + { + allyCreatureStats1.getAiSequence().stopCombat(); + } + + if (allyCreatureStats2.getAiSequence().isInCombat(ally1)) + { + allyCreatureStats2.getAiSequence().stopCombat(); + } + } + } +} + void MechanicsHelper::processAttack(Attack attack, const MWWorld::Ptr& attacker) { LOG_MESSAGE_SIMPLE(TimedLog::LOG_VERBOSE, "Processing attack from %s of type %i", diff --git a/apps/openmw/mwmp/MechanicsHelper.hpp b/apps/openmw/mwmp/MechanicsHelper.hpp index 00c17a727..3b096ba3c 100644 --- a/apps/openmw/mwmp/MechanicsHelper.hpp +++ b/apps/openmw/mwmp/MechanicsHelper.hpp @@ -41,6 +41,8 @@ namespace MechanicsHelper // who isn't mutually allied to you bool isTeamMember(const MWWorld::Ptr& playerChecked, const MWWorld::Ptr& playerWithTeam); + void makePeace(const MWWorld::Ptr& actor1, const MWWorld::Ptr& actor2); + bool getSpellSuccess(std::string spellId, const MWWorld::Ptr& caster); void processAttack(mwmp::Attack attack, const MWWorld::Ptr& attacker);