Fix for Area of Affect Behaviors targeting incorrect entities

This commit is contained in:
Jacob Hofer 2022-01-02 20:37:03 +00:00
parent 203e75ef3d
commit 1ddf7d1f94
6 changed files with 20 additions and 8 deletions

View File

@ -74,7 +74,7 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream
includeFaction = 1; includeFaction = 1;
} }
for (auto validTarget : context->GetValidTargets(m_ignoreFaction , includeFaction, m_TargetSelf == 1)) for (auto validTarget : context->GetValidTargets(m_ignoreFaction , includeFaction, m_TargetSelf == 1, m_targetEnemy == 1, m_targetFriend == 1))
{ {
auto* entity = EntityManager::Instance()->GetEntity(validTarget); auto* entity = EntityManager::Instance()->GetEntity(validTarget);
@ -157,4 +157,8 @@ void AreaOfEffectBehavior::Load()
this->m_includeFaction = GetInt("include_faction"); this->m_includeFaction = GetInt("include_faction");
this->m_TargetSelf = GetInt("target_self"); this->m_TargetSelf = GetInt("target_self");
this->m_targetEnemy = GetInt("target_enemy");
this->m_targetFriend = GetInt("target_friend");
} }

View File

@ -15,6 +15,10 @@ public:
int32_t m_includeFaction; int32_t m_includeFaction;
int32_t m_TargetSelf; int32_t m_TargetSelf;
int32_t m_targetEnemy;
int32_t m_targetFriend;
/* /*
* Inherited * Inherited

View File

@ -325,7 +325,7 @@ void BehaviorContext::Reset()
this->scheduledUpdates.clear(); this->scheduledUpdates.clear();
} }
std::vector<LWOOBJID> BehaviorContext::GetValidTargets(int32_t ignoreFaction, int32_t includeFaction, bool targetSelf) const std::vector<LWOOBJID> BehaviorContext::GetValidTargets(int32_t ignoreFaction, int32_t includeFaction, bool targetSelf, bool targetEnemy, bool targetFriend) const
{ {
auto* entity = EntityManager::Instance()->GetEntity(this->caster); auto* entity = EntityManager::Instance()->GetEntity(this->caster);
@ -366,7 +366,7 @@ std::vector<LWOOBJID> BehaviorContext::GetValidTargets(int32_t ignoreFaction, in
{ {
const auto id = candidate->GetObjectID(); const auto id = candidate->GetObjectID();
if ((id != entity->GetObjectID() || targetSelf) && destroyableComponent->CheckValidity(id, ignoreFaction || includeFaction)) if ((id != entity->GetObjectID() || targetSelf) && destroyableComponent->CheckValidity(id, ignoreFaction || includeFaction, targetEnemy, targetFriend))
{ {
targets.push_back(id); targets.push_back(id);
} }

View File

@ -102,7 +102,7 @@ struct BehaviorContext
void Reset(); void Reset();
std::vector<LWOOBJID> GetValidTargets(int32_t ignoreFaction = 0, int32_t includeFaction = 0, const bool targetSelf = false) const; std::vector<LWOOBJID> GetValidTargets(int32_t ignoreFaction = 0, int32_t includeFaction = 0, const bool targetSelf = false, const bool targetEnemy = true, const bool targetFriend = false) const;
explicit BehaviorContext(LWOOBJID originator, bool calculation = false); explicit BehaviorContext(LWOOBJID originator, bool calculation = false);

View File

@ -498,7 +498,7 @@ Entity* DestroyableComponent::GetKiller() const
return EntityManager::Instance()->GetEntity(m_KillerID); return EntityManager::Instance()->GetEntity(m_KillerID);
} }
bool DestroyableComponent::CheckValidity(const LWOOBJID target, const bool ignoreFactions) const bool DestroyableComponent::CheckValidity(const LWOOBJID target, const bool ignoreFactions, const bool targetEnemy, const bool targetFriend) const
{ {
auto* entity = EntityManager::Instance()->GetEntity(target); auto* entity = EntityManager::Instance()->GetEntity(target);
@ -537,15 +537,19 @@ bool DestroyableComponent::CheckValidity(const LWOOBJID target, const bool ignor
auto candidateList = destroyable->GetFactionIDs(); auto candidateList = destroyable->GetFactionIDs();
bool isEnemy = false;
for (auto value : candidateList) for (auto value : candidateList)
{ {
if (std::find(enemyList.begin(), enemyList.end(), value) != enemyList.end()) if (std::find(enemyList.begin(), enemyList.end(), value) != enemyList.end())
{ {
return true; isEnemy = true;
break;
} }
} }
return false; return (isEnemy && targetEnemy) || (!isEnemy && targetFriend);
} }

View File

@ -371,7 +371,7 @@ public:
* @param ignoreFactions whether or not check for the factions, e.g. just return true if the entity cannot be smashed * @param ignoreFactions whether or not check for the factions, e.g. just return true if the entity cannot be smashed
* @return if the target ID is a valid enemy * @return if the target ID is a valid enemy
*/ */
bool CheckValidity(LWOOBJID target, bool ignoreFactions = false) const; bool CheckValidity(LWOOBJID target, bool ignoreFactions = false, bool targetEnemy = true, bool targetFriend = false) const;
/** /**
* Attempt to damage this entity, handles everything from health and armor to absorption, immunity and callbacks. * Attempt to damage this entity, handles everything from health and armor to absorption, immunity and callbacks.