From df8ce3c05f999e1fd17977caf93cfbbc6ef85f22 Mon Sep 17 00:00:00 2001 From: WinterSolstice8 <60417494+wintersolstice8@users.noreply.github.com> Date: Sun, 5 May 2024 16:30:55 -0600 Subject: [PATCH] [core] Targetfind will now reject matching allegiances for ENEMY search --- src/map/ai/controllers/mob_controller.cpp | 2 +- src/map/ai/helpers/targetfind.cpp | 28 +++++++++++++++-------- src/map/ai/helpers/targetfind.h | 9 ++++---- src/map/entities/battleentity.cpp | 12 +++++----- src/map/entities/battleentity.h | 1 + src/map/entities/charentity.cpp | 8 +++---- src/map/entities/petentity.cpp | 6 ++--- src/map/entities/trustentity.cpp | 6 ++--- 8 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/map/ai/controllers/mob_controller.cpp b/src/map/ai/controllers/mob_controller.cpp index 1ff5ad2251a..388fff8c382 100644 --- a/src/map/ai/controllers/mob_controller.cpp +++ b/src/map/ai/controllers/mob_controller.cpp @@ -531,7 +531,7 @@ void CMobController::CastSpell(SpellID spellid) { // chance to target party PMob->PAI->TargetFind->reset(); - PMob->PAI->TargetFind->findWithinArea(PMob, AOE_RADIUS::ATTACKER, PSpell->getRange()); + PMob->PAI->TargetFind->findWithinArea(PMob, AOE_RADIUS::ATTACKER, PSpell->getRange(), FINDFLAGS_NONE, TARGET_NONE); if (!PMob->PAI->TargetFind->m_targets.empty()) { diff --git a/src/map/ai/helpers/targetfind.cpp b/src/map/ai/helpers/targetfind.cpp index 2337782b610..74abb342724 100644 --- a/src/map/ai/helpers/targetfind.cpp +++ b/src/map/ai/helpers/targetfind.cpp @@ -70,9 +70,9 @@ void CTargetFind::reset() m_PMasterTarget = nullptr; } -void CTargetFind::findSingleTarget(CBattleEntity* PTarget, uint8 flags) +void CTargetFind::findSingleTarget(CBattleEntity* PTarget, uint8 findFlags, uint16 targetFlags) { - m_findFlags = flags; + m_findFlags = findFlags; m_zone = m_PBattleEntity->getZone(); m_PTarget = nullptr; m_PRadiusAround = &PTarget->loc.p; @@ -80,12 +80,13 @@ void CTargetFind::findSingleTarget(CBattleEntity* PTarget, uint8 flags) addEntity(PTarget, false); } -void CTargetFind::findWithinArea(CBattleEntity* PTarget, AOE_RADIUS radiusType, float radius, uint8 flags) +void CTargetFind::findWithinArea(CBattleEntity* PTarget, AOE_RADIUS radiusType, float radius, uint8 findFlags, uint16 targetFlags) { TracyZoneScoped; - m_findFlags = flags; - m_radius = radius; - m_zone = m_PBattleEntity->getZone(); + m_findFlags = findFlags; + m_targetFlags = targetFlags; + m_radius = radius; + m_zone = m_PBattleEntity->getZone(); if (radiusType == AOE_RADIUS::ATTACKER) { @@ -186,10 +187,11 @@ void CTargetFind::findWithinArea(CBattleEntity* PTarget, AOE_RADIUS radiusType, } } -void CTargetFind::findWithinCone(CBattleEntity* PTarget, float distance, float angle, uint8 flags, uint8 aoeType) +void CTargetFind::findWithinCone(CBattleEntity* PTarget, float distance, float angle, uint8 findFlags, uint16 targetFlags, uint8 aoeType) { - m_findFlags = flags; - m_conal = true; + m_findFlags = findFlags; + m_targetFlags = targetFlags; + m_conal = true; m_APoint = &m_PBattleEntity->loc.p; @@ -224,7 +226,7 @@ void CTargetFind::findWithinCone(CBattleEntity* PTarget, float distance, float a // calculate scalar m_scalar = (m_BPoint.x * m_CPoint.z) - (m_BPoint.z * m_CPoint.x); - findWithinArea(PTarget, AOE_RADIUS::ATTACKER, distance, flags); + findWithinArea(PTarget, AOE_RADIUS::ATTACKER, distance, findFlags, targetFlags); } void CTargetFind::addAllInMobList(CBattleEntity* PTarget, bool withPet) @@ -458,6 +460,12 @@ bool CTargetFind::validEntity(CBattleEntity* PTarget) return false; } + // If offensive, don't target other entities with same allegiance + if ((m_targetFlags & TARGET_ENEMY) && m_PBattleEntity->allegiance == PTarget->allegiance) + { + return false; + } + // shouldn't add if target is charmed by the enemy if (PTarget->PMaster != nullptr) { diff --git a/src/map/ai/helpers/targetfind.h b/src/map/ai/helpers/targetfind.h index c43e34c4b58..f7c212c990a 100644 --- a/src/map/ai/helpers/targetfind.h +++ b/src/map/ai/helpers/targetfind.h @@ -99,9 +99,9 @@ class CTargetFind void reset(); // remove all found targets // Main methods for finding targets - void findSingleTarget(CBattleEntity* PTarget, uint8 flags = FINDFLAGS_NONE); - void findWithinArea(CBattleEntity* PTarget, AOE_RADIUS radiusType, float radius, uint8 flags = FINDFLAGS_NONE); - void findWithinCone(CBattleEntity* PTarget, float distance, float angle, uint8 flags = FINDFLAGS_NONE, uint8 aoeType = 4); + void findSingleTarget(CBattleEntity* PTarget, uint8 findFlags, uint16 targetflags); + void findWithinArea(CBattleEntity* PTarget, AOE_RADIUS radiusType, float radius, uint8 findFlags, uint16 targetFlags); + void findWithinCone(CBattleEntity* PTarget, float distance, float angle, uint8 findFlags, uint16 targetFlags, uint8 aoeType = 4); // add all targets in contexts void addAllInZone(CBattleEntity* PTarget, bool withPet); @@ -138,7 +138,8 @@ class CTargetFind uint16 m_zone; FIND_TYPE m_findType; - uint8 m_findFlags; + uint8 m_findFlags; // what to search for + uint16 m_targetFlags; // targetflags to reject potentially bad targets // conal vars bool m_conal; diff --git a/src/map/entities/battleentity.cpp b/src/map/entities/battleentity.cpp index 245012f3115..d4b6aeda8ed 100644 --- a/src/map/entities/battleentity.cpp +++ b/src/map/entities/battleentity.cpp @@ -1600,14 +1600,14 @@ void CBattleEntity::OnCastFinished(CMagicState& state, action_t& action) { float distance = spell::GetSpellRadius(PSpell, this); - PAI->TargetFind->findWithinArea(PActionTarget, AOE_RADIUS::TARGET, distance, flags); + PAI->TargetFind->findWithinArea(PActionTarget, AOE_RADIUS::TARGET, distance, flags, PSpell->getValidTarget()); } else if (aoeType == SPELLAOE_CONAL) { // TODO: actual radius calculation float radius = spell::GetSpellRadius(PSpell, this); - PAI->TargetFind->findWithinCone(PActionTarget, radius, 45, flags); + PAI->TargetFind->findWithinCone(PActionTarget, radius, 45, flags, PSpell->getValidTarget()); } else { @@ -1622,7 +1622,7 @@ void CBattleEntity::OnCastFinished(CMagicState& state, action_t& action) } } // only add target - PAI->TargetFind->findSingleTarget(PActionTarget, flags); + PAI->TargetFind->findSingleTarget(PActionTarget, flags, PSpell->getValidTarget()); } auto totalTargets = (uint16)PAI->TargetFind->m_targets.size(); @@ -1876,12 +1876,12 @@ void CBattleEntity::OnMobSkillFinished(CMobSkillState& state, action_t& action) { if (PSkill->isAoE()) { - PAI->TargetFind->findWithinArea(PTarget, static_cast(PSkill->getAoe()), PSkill->getRadius(), findFlags); + PAI->TargetFind->findWithinArea(PTarget, static_cast(PSkill->getAoe()), PSkill->getRadius(), findFlags, PSkill->getValidTargets()); } else if (PSkill->isConal()) { float angle = 45.0f; - PAI->TargetFind->findWithinCone(PTarget, distance, angle, findFlags, PSkill->getAoe()); + PAI->TargetFind->findWithinCone(PTarget, distance, angle, findFlags, PSkill->getValidTargets(), PSkill->getAoe()); } else { @@ -1894,7 +1894,7 @@ void CBattleEntity::OnMobSkillFinished(CMobSkillState& state, action_t& action) } } - PAI->TargetFind->findSingleTarget(PTarget, findFlags); + PAI->TargetFind->findSingleTarget(PTarget, findFlags, PSkill->getValidTargets()); } } else // Out of range diff --git a/src/map/entities/battleentity.h b/src/map/entities/battleentity.h index 7aa20f34f92..bd892e63950 100644 --- a/src/map/entities/battleentity.h +++ b/src/map/entities/battleentity.h @@ -413,6 +413,7 @@ DECLARE_FORMAT_AS_UNDERLYING(SUBEFFECT); enum TARGETTYPE { + TARGET_NONE = 0x00, TARGET_SELF = 0x01, TARGET_PLAYER_PARTY = 0x02, TARGET_ENEMY = 0x04, diff --git a/src/map/entities/charentity.cpp b/src/map/entities/charentity.cpp index 9ebb31706ba..30692c4f285 100644 --- a/src/map/entities/charentity.cpp +++ b/src/map/entities/charentity.cpp @@ -1288,11 +1288,11 @@ void CCharEntity::OnWeaponSkillFinished(CWeaponSkillState& state, action_t& acti // TODO: revise parameters if (PWeaponSkill->isAoE()) { - PAI->TargetFind->findWithinArea(PBattleTarget, AOE_RADIUS::TARGET, 10); + PAI->TargetFind->findWithinArea(PBattleTarget, AOE_RADIUS::TARGET, 10, FINDFLAGS_NONE, TARGET_NONE); } else { - PAI->TargetFind->findSingleTarget(PBattleTarget); + PAI->TargetFind->findSingleTarget(PBattleTarget, FINDFLAGS_NONE, TARGET_NONE); } // Assumed, it's very difficult to produce this due to WS being nearly instant @@ -1468,7 +1468,7 @@ void CCharEntity::OnAbility(CAbilityState& state, action_t& action) auto* PTarget = static_cast(state.GetTarget()); PAI->TargetFind->reset(); - PAI->TargetFind->findSingleTarget(PTarget, findFlags); + PAI->TargetFind->findSingleTarget(PTarget, findFlags, PAbility->getValidTarget()); // Check if target is untargetable if (PAI->TargetFind->m_targets.size() == 0) @@ -1704,7 +1704,7 @@ void CCharEntity::OnAbility(CAbilityState& state, action_t& action) float distance = PAbility->getRange(); - PAI->TargetFind->findWithinArea(this, AOE_RADIUS::ATTACKER, distance, findFlags); + PAI->TargetFind->findWithinArea(this, AOE_RADIUS::ATTACKER, distance, findFlags, PAbility->getValidTarget()); uint16 prevMsg = 0; for (auto&& PTargetFound : PAI->TargetFind->m_targets) diff --git a/src/map/entities/petentity.cpp b/src/map/entities/petentity.cpp index 16c821fbf4a..3e583c59d69 100644 --- a/src/map/entities/petentity.cpp +++ b/src/map/entities/petentity.cpp @@ -453,12 +453,12 @@ void CPetEntity::OnPetSkillFinished(CPetSkillState& state, action_t& action) { if (PSkill->isAoE()) { - PAI->TargetFind->findWithinArea(PTarget, static_cast(PSkill->getAoe()), PSkill->getRadius(), findFlags); + PAI->TargetFind->findWithinArea(PTarget, static_cast(PSkill->getAoe()), PSkill->getRadius(), findFlags, PSkill->getValidTargets()); } else if (PSkill->isConal()) { float angle = 45.0f; - PAI->TargetFind->findWithinCone(PTarget, distance, angle, findFlags); + PAI->TargetFind->findWithinCone(PTarget, distance, angle, findFlags, PSkill->getValidTargets()); } else { @@ -471,7 +471,7 @@ void CPetEntity::OnPetSkillFinished(CPetSkillState& state, action_t& action) } } - PAI->TargetFind->findSingleTarget(PTarget, findFlags); + PAI->TargetFind->findSingleTarget(PTarget, findFlags, PSkill->getValidTargets()); } } else // Out of range diff --git a/src/map/entities/trustentity.cpp b/src/map/entities/trustentity.cpp index 5d7dcede075..4792124fea7 100644 --- a/src/map/entities/trustentity.cpp +++ b/src/map/entities/trustentity.cpp @@ -154,7 +154,7 @@ void CTrustEntity::OnAbility(CAbilityState& state, action_t& action) float distance = PAbility->getRange(); - PAI->TargetFind->findWithinArea(this, AOE_RADIUS::ATTACKER, distance); + PAI->TargetFind->findWithinArea(this, AOE_RADIUS::ATTACKER, distance, FINDFLAGS_NONE, PAbility->getValidTarget()); uint16 prevMsg = 0; for (auto&& PTargetFound : PAI->TargetFind->m_targets) @@ -539,11 +539,11 @@ void CTrustEntity::OnWeaponSkillFinished(CWeaponSkillState& state, action_t& act PAI->TargetFind->reset(); if (PWeaponSkill->isAoE()) { - PAI->TargetFind->findWithinArea(PBattleTarget, AOE_RADIUS::TARGET, 10); + PAI->TargetFind->findWithinArea(PBattleTarget, AOE_RADIUS::TARGET, 10, FINDFLAGS_NONE, TARGET_NONE); } else { - PAI->TargetFind->findSingleTarget(PBattleTarget); + PAI->TargetFind->findSingleTarget(PBattleTarget, FINDFLAGS_NONE, TARGET_NONE); } // Assumed, it's very difficult to produce this due to WS being nearly instant