mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Spells: Increase search radius for avoid problems with some spells that can't find units with huge combat reach (#27827)
This commit is contained in:
@@ -63,9 +63,10 @@ void TotemAI::UpdateAI(uint32 /*diff*/)
|
||||
if (!victim || !victim->isTargetableForAttack() || !me->IsWithinDistInMap(victim, max_range) || me->IsFriendlyTo(victim) || !me->CanSeeOrDetect(victim))
|
||||
{
|
||||
victim = nullptr;
|
||||
float extraSearchRadius = max_range > 0.0f ? EXTRA_CELL_SEARCH_RADIUS : 0.0f;
|
||||
Trinity::NearestAttackableUnitInObjectRangeCheck u_check(me, me->GetCharmerOrOwnerOrSelf(), max_range);
|
||||
Trinity::UnitLastSearcher<Trinity::NearestAttackableUnitInObjectRangeCheck> checker(me, victim, u_check);
|
||||
Cell::VisitAllObjects(me, checker, max_range);
|
||||
Cell::VisitAllObjects(me, checker, max_range + extraSearchRadius);
|
||||
}
|
||||
|
||||
// If have target
|
||||
|
||||
@@ -42,6 +42,8 @@
|
||||
#define NOMINAL_MELEE_RANGE 5.0f
|
||||
#define MELEE_RANGE (NOMINAL_MELEE_RANGE - MIN_MELEE_REACH * 2) //center to center for players
|
||||
|
||||
#define EXTRA_CELL_SEARCH_RADIUS 40.0f // We need in some cases increase search radius. Allow to find creatures with huge combat reach in a different nearby cell.
|
||||
|
||||
enum class VisibilityDistanceType : uint8
|
||||
{
|
||||
Normal = 0,
|
||||
|
||||
@@ -2625,6 +2625,7 @@ void UnitAura::FillTargetMap(std::unordered_map<Unit*, uint8>& targets, Unit* ca
|
||||
ConditionContainer* condList = spellEffectInfo.ImplicitTargetConditions;
|
||||
|
||||
float radius = spellEffectInfo.CalcRadius(ref);
|
||||
float extraSearchRadius = 0.0f;
|
||||
|
||||
SpellTargetCheckTypes selectionType = TARGET_CHECK_DEFAULT;
|
||||
switch (spellEffectInfo.Effect)
|
||||
@@ -2640,6 +2641,7 @@ void UnitAura::FillTargetMap(std::unordered_map<Unit*, uint8>& targets, Unit* ca
|
||||
break;
|
||||
case SPELL_EFFECT_APPLY_AREA_AURA_ENEMY:
|
||||
selectionType = TARGET_CHECK_ENEMY;
|
||||
extraSearchRadius = radius > 0.0f ? EXTRA_CELL_SEARCH_RADIUS : 0.0f;
|
||||
break;
|
||||
case SPELL_EFFECT_APPLY_AREA_AURA_PET:
|
||||
if (!condList || sConditionMgr->IsObjectMeetToConditions(GetUnitOwner(), ref, *condList))
|
||||
@@ -2661,7 +2663,7 @@ void UnitAura::FillTargetMap(std::unordered_map<Unit*, uint8>& targets, Unit* ca
|
||||
{
|
||||
Trinity::WorldObjectSpellAreaTargetCheck check(radius, GetUnitOwner(), ref, GetUnitOwner(), m_spellInfo, selectionType, condList);
|
||||
Trinity::UnitListSearcher<Trinity::WorldObjectSpellAreaTargetCheck> searcher(GetUnitOwner(), units, check);
|
||||
Cell::VisitAllObjects(GetUnitOwner(), searcher, radius);
|
||||
Cell::VisitAllObjects(GetUnitOwner(), searcher, radius + extraSearchRadius);
|
||||
}
|
||||
|
||||
for (Unit* unit : units)
|
||||
|
||||
@@ -1165,9 +1165,10 @@ void Spell::SelectImplicitConeTargets(SpellEffectInfo const& spellEffectInfo, Sp
|
||||
|
||||
if (uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList))
|
||||
{
|
||||
float extraSearchRadius = radius > 0.0f ? EXTRA_CELL_SEARCH_RADIUS : 0.0f;
|
||||
Trinity::WorldObjectSpellConeTargetCheck check(coneAngle, radius, m_caster, m_spellInfo, selectionType, condList);
|
||||
Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellConeTargetCheck> searcher(m_caster, targets, check, containerTypeMask);
|
||||
SearchTargets<Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellConeTargetCheck> >(searcher, containerTypeMask, m_caster, m_caster, radius);
|
||||
SearchTargets<Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellConeTargetCheck> >(searcher, containerTypeMask, m_caster, m_caster, radius + extraSearchRadius);
|
||||
|
||||
CallScriptObjectAreaTargetSelectHandlers(targets, spellEffectInfo.EffectIndex, targetType);
|
||||
|
||||
@@ -1844,9 +1845,11 @@ void Spell::SearchAreaTargets(std::list<WorldObject*>& targets, float range, Pos
|
||||
uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList);
|
||||
if (!containerTypeMask)
|
||||
return;
|
||||
|
||||
float extraSearchRadius = range > 0.0f ? EXTRA_CELL_SEARCH_RADIUS : 0.0f;
|
||||
Trinity::WorldObjectSpellAreaTargetCheck check(range, position, m_caster, referer, m_spellInfo, selectionType, condList);
|
||||
Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellAreaTargetCheck> searcher(m_caster, targets, check, containerTypeMask);
|
||||
SearchTargets<Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellAreaTargetCheck> > (searcher, containerTypeMask, m_caster, position, range);
|
||||
SearchTargets<Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellAreaTargetCheck> > (searcher, containerTypeMask, m_caster, position, range + extraSearchRadius);
|
||||
}
|
||||
|
||||
void Spell::SearchChainTargets(std::list<WorldObject*>& targets, uint32 chainTargets, WorldObject* target, SpellTargetObjectTypes objectType, SpellTargetCheckTypes selectType, ConditionContainer* condList, bool isChainHeal)
|
||||
|
||||
Reference in New Issue
Block a user