[Client] Add MechanicsHelper::makePeace() for pacifying actors and allies

0.8.2
David Cernat 2 years ago
parent 14a8dae86c
commit 21df69d78a

@ -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<MWWorld::Ptr> allies1 = MWBase::Environment::get().getMechanicsManager()->getActorsSidingWith(actor1);
std::list<MWWorld::Ptr> 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",

@ -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);

Loading…
Cancel
Save