mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 21:40:03 +00:00
Move friendly fire logic to onHit
This commit is contained in:
parent
a497d40689
commit
1834597361
@ -353,16 +353,23 @@ namespace MWClass
|
||||
{
|
||||
MWMechanics::CreatureStats& stats = getCreatureStats(ptr);
|
||||
|
||||
// Self defense
|
||||
bool setOnPcHitMe = true;
|
||||
|
||||
// NOTE: 'object' and/or 'attacker' may be empty.
|
||||
if (!attacker.isEmpty() && attacker.getClass().isActor() && !stats.getAiSequence().isInCombat(attacker))
|
||||
{
|
||||
stats.setAttacked(true);
|
||||
|
||||
// Self defense
|
||||
bool setOnPcHitMe = true; // Note OnPcHitMe is not set for friendly hits.
|
||||
|
||||
// No retaliation for totally static creatures (they have no movement or attacks anyway)
|
||||
if (isMobile(ptr) && !attacker.isEmpty())
|
||||
setOnPcHitMe = MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
|
||||
// No retaliation for totally static creatures (they have no movement or attacks anyway)
|
||||
if (isMobile(ptr))
|
||||
{
|
||||
if (MWMechanics::friendlyHit(attacker, ptr, true))
|
||||
setOnPcHitMe = false;
|
||||
else
|
||||
setOnPcHitMe = MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
|
||||
}
|
||||
}
|
||||
|
||||
// Attacker and target store each other as hitattemptactor if they have no one stored yet
|
||||
if (!attacker.isEmpty() && attacker.getClass().isActor())
|
||||
|
@ -682,14 +682,16 @@ namespace MWClass
|
||||
MWMechanics::CreatureStats& stats = getCreatureStats(ptr);
|
||||
bool wasDead = stats.isDead();
|
||||
|
||||
// Note OnPcHitMe is not set for friendly hits.
|
||||
bool setOnPcHitMe = true;
|
||||
|
||||
// NOTE: 'object' and/or 'attacker' may be empty.
|
||||
if (!attacker.isEmpty() && attacker.getClass().isActor() && !stats.getAiSequence().isInCombat(attacker))
|
||||
{
|
||||
stats.setAttacked(true);
|
||||
setOnPcHitMe = MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
|
||||
if (MWMechanics::friendlyHit(attacker, ptr, true))
|
||||
setOnPcHitMe = false;
|
||||
else
|
||||
setOnPcHitMe = MWBase::Environment::get().getMechanicsManager()->actorAttacked(ptr, attacker);
|
||||
}
|
||||
|
||||
// Attacker and target store each other as hitattemptactor if they have no one stored yet
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <components/esm3/loadmgef.hpp>
|
||||
#include <components/esm3/loadsoun.hpp>
|
||||
|
||||
#include "../mwbase/dialoguemanager.hpp"
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/mechanicsmanager.hpp"
|
||||
#include "../mwbase/soundmanager.hpp"
|
||||
@ -649,4 +650,26 @@ namespace MWMechanics
|
||||
|
||||
return std::make_pair(result, hitPos);
|
||||
}
|
||||
|
||||
bool friendlyHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& target, bool complain)
|
||||
{
|
||||
const MWWorld::Ptr& player = getPlayer();
|
||||
if (attacker != player)
|
||||
return false;
|
||||
|
||||
std::set<MWWorld::Ptr> followersAttacker;
|
||||
MWBase::Environment::get().getMechanicsManager()->getActorsSidingWith(attacker, followersAttacker);
|
||||
if (followersAttacker.find(target) == followersAttacker.end())
|
||||
return false;
|
||||
|
||||
MWMechanics::CreatureStats& statsTarget = target.getClass().getCreatureStats(target);
|
||||
statsTarget.friendlyHit();
|
||||
if (statsTarget.getFriendlyHits() >= 4)
|
||||
return false;
|
||||
|
||||
if (complain)
|
||||
MWBase::Environment::get().getDialogueManager()->say(target, ESM::RefId::stringRefId("hit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -66,6 +66,8 @@ namespace MWMechanics
|
||||
|
||||
// Similarly cursed hit target selection
|
||||
std::pair<MWWorld::Ptr, osg::Vec3f> getHitContact(const MWWorld::Ptr& actor, float reach);
|
||||
|
||||
bool friendlyHit(const MWWorld::Ptr& attacker, const MWWorld::Ptr& target, bool complain);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1394,26 +1394,10 @@ namespace MWMechanics
|
||||
if (target == player || !attacker.getClass().isActor())
|
||||
return false;
|
||||
|
||||
MWMechanics::CreatureStats& statsTarget = target.getClass().getCreatureStats(target);
|
||||
if (attacker == player)
|
||||
{
|
||||
std::set<MWWorld::Ptr> followersAttacker;
|
||||
getActorsSidingWith(attacker, followersAttacker);
|
||||
if (followersAttacker.find(target) != followersAttacker.end())
|
||||
{
|
||||
statsTarget.friendlyHit();
|
||||
|
||||
if (statsTarget.getFriendlyHits() < 4)
|
||||
{
|
||||
MWBase::Environment::get().getDialogueManager()->say(target, ESM::RefId::stringRefId("hit"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (canCommitCrimeAgainst(target, attacker))
|
||||
commitCrime(attacker, target, MWBase::MechanicsManager::OT_Assault);
|
||||
|
||||
MWMechanics::CreatureStats& statsTarget = target.getClass().getCreatureStats(target);
|
||||
AiSequence& seq = statsTarget.getAiSequence();
|
||||
|
||||
if (!attacker.isEmpty()
|
||||
|
Loading…
x
Reference in New Issue
Block a user