forked from mirror/openmw-tes3mp
Change environment check to canFight check
Instead of just checking that combatants are in compatible environments, allow combat if in attack range using canFight. Together with previous commit, fixes #3690.
This commit is contained in:
parent
588442b6cc
commit
e8c7ad2f4b
1 changed files with 29 additions and 30 deletions
|
@ -29,6 +29,7 @@
|
||||||
#include "movement.hpp"
|
#include "movement.hpp"
|
||||||
#include "character.hpp"
|
#include "character.hpp"
|
||||||
#include "aicombat.hpp"
|
#include "aicombat.hpp"
|
||||||
|
#include "aicombataction.hpp"
|
||||||
#include "aifollow.hpp"
|
#include "aifollow.hpp"
|
||||||
#include "aipursue.hpp"
|
#include "aipursue.hpp"
|
||||||
#include "actor.hpp"
|
#include "actor.hpp"
|
||||||
|
@ -298,41 +299,12 @@ namespace MWMechanics
|
||||||
if (sqrDist > sqrAiProcessingDistance)
|
if (sqrDist > sqrAiProcessingDistance)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// pure water creatures won't try to fight with the target on the ground
|
|
||||||
// except that creature is already hostile
|
|
||||||
if ((againstPlayer || !creatureStats.getAiSequence().isInCombat())
|
|
||||||
&& !MWMechanics::isEnvironmentCompatible(actor1, actor2)) // creature can't swim to target
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// no combat for totally static creatures (they have no movement or attack animations anyway)
|
// no combat for totally static creatures (they have no movement or attack animations anyway)
|
||||||
if (!actor1.getClass().isMobile(actor1))
|
if (!actor1.getClass().isMobile(actor1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const std::list<MWWorld::Ptr>& playerFollowersAndEscorters = getActorsSidingWith(getPlayer());
|
const std::list<MWWorld::Ptr>& playerFollowersAndEscorters = getActorsSidingWith(getPlayer());
|
||||||
bool aggressive;
|
bool aggressive = false;
|
||||||
|
|
||||||
if (againstPlayer || std::find(playerFollowersAndEscorters.begin(), playerFollowersAndEscorters.end(), actor2) != playerFollowersAndEscorters.end())
|
|
||||||
{
|
|
||||||
// Player followers and escorters with high fight should not initiate combat with the player or with
|
|
||||||
// other player followers or escorters
|
|
||||||
if (std::find(playerFollowersAndEscorters.begin(), playerFollowersAndEscorters.end(), actor1) != playerFollowersAndEscorters.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
aggressive = MWBase::Environment::get().getMechanicsManager()->isAggressive(actor1, actor2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
aggressive = false;
|
|
||||||
|
|
||||||
// Make guards fight aggressive creatures
|
|
||||||
if (!actor1.getClass().isNpc() && actor2.getClass().isClass(actor2, "Guard"))
|
|
||||||
{
|
|
||||||
if (creatureStats.getAiSequence().isInCombat() && MWBase::Environment::get().getMechanicsManager()->isAggressive(actor1, actor2))
|
|
||||||
aggressive = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// start combat if target actor is in combat with one of our followers
|
// start combat if target actor is in combat with one of our followers
|
||||||
const std::list<MWWorld::Ptr>& followers = getActorsSidingWith(actor1);
|
const std::list<MWWorld::Ptr>& followers = getActorsSidingWith(actor1);
|
||||||
|
@ -366,6 +338,33 @@ namespace MWMechanics
|
||||||
aggressive = true;
|
aggressive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pure water creatures won't try to fight with the target on the ground
|
||||||
|
// except that creature is already hostile
|
||||||
|
if (!aggressive && (againstPlayer || !creatureStats.getAiSequence().isInCombat())
|
||||||
|
&& !MWMechanics::canFight(actor1,actor2)) // creature can't swim to target
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!aggressive && againstPlayer || std::find(playerFollowersAndEscorters.begin(), playerFollowersAndEscorters.end(), actor2) != playerFollowersAndEscorters.end())
|
||||||
|
{
|
||||||
|
// Player followers and escorters with high fight should not initiate combat with the player or with
|
||||||
|
// other player followers or escorters
|
||||||
|
if (std::find(playerFollowersAndEscorters.begin(), playerFollowersAndEscorters.end(), actor1) != playerFollowersAndEscorters.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
aggressive = MWBase::Environment::get().getMechanicsManager()->isAggressive(actor1, actor2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Make guards fight aggressive creatures
|
||||||
|
if (!actor1.getClass().isNpc() && actor2.getClass().isClass(actor2, "Guard"))
|
||||||
|
{
|
||||||
|
if (creatureStats.getAiSequence().isInCombat() && MWBase::Environment::get().getMechanicsManager()->isAggressive(actor1, actor2))
|
||||||
|
aggressive = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(aggressive)
|
if(aggressive)
|
||||||
{
|
{
|
||||||
bool LOS = MWBase::Environment::get().getWorld()->getLOS(actor1, actor2);
|
bool LOS = MWBase::Environment::get().getWorld()->getLOS(actor1, actor2);
|
||||||
|
|
Loading…
Reference in a new issue