diff options
author | Gildor <gildor55@gmail.com> | 2022-04-06 23:56:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-06 23:56:40 +0200 |
commit | 70767717c112f1acbf19e5ce366b61ae6dc73475 (patch) | |
tree | 817e56874649f6432d8fde978c5dc4c962512b69 /src | |
parent | f47bd13db30ba4ae335f3f800843a33a7f357c32 (diff) |
Core/Spells: Increase search radius for avoid problems with some spells that can't find units with huge combat reach (#27827)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/CoreAI/TotemAI.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Object/ObjectDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 7 |
4 files changed, 12 insertions, 4 deletions
diff --git a/src/server/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp index 64f9f21b2c9..881d49b6609 100644 --- a/src/server/game/AI/CoreAI/TotemAI.cpp +++ b/src/server/game/AI/CoreAI/TotemAI.cpp @@ -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 diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h index 14ab651e826..11d2f2fe376 100644 --- a/src/server/game/Entities/Object/ObjectDefines.h +++ b/src/server/game/Entities/Object/ObjectDefines.h @@ -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, diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index ee58689813f..08a6dd42f62 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -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) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 47b89a48f1b..1c0042b06dc 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -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) |