From 889e88ab8033a78db837e0bb8619d8ce9d64967f Mon Sep 17 00:00:00 2001 From: Meji Date: Thu, 20 Jul 2023 10:10:18 +0200 Subject: Core/Spells: Fixed target radius logic in spell effects for TargetB (#29158) --- src/server/game/Spells/Spell.cpp | 59 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 29 deletions(-) (limited to 'src/server/game/Spells/Spell.cpp') diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 55dc8c2ba91..1c3d183692a 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -755,8 +755,8 @@ void Spell::SelectSpellTargets() if (implicitTargetMask & (TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_GAMEOBJECT_ITEM)) m_targets.SetTargetFlag(TARGET_FLAG_GAMEOBJECT); - SelectEffectImplicitTargets(spellEffectInfo, spellEffectInfo.TargetA, processedAreaEffectsMask); - SelectEffectImplicitTargets(spellEffectInfo, spellEffectInfo.TargetB, processedAreaEffectsMask); + SelectEffectImplicitTargets(spellEffectInfo, spellEffectInfo.TargetA, SpellTargetIndex::TargetA, processedAreaEffectsMask); + SelectEffectImplicitTargets(spellEffectInfo, spellEffectInfo.TargetB, SpellTargetIndex::TargetB, processedAreaEffectsMask); // Select targets of effect based on effect type // those are used when no valid target could be added for spell effect based on spell target type @@ -894,7 +894,7 @@ void Spell::UpdateDelayMomentForUnitTarget(Unit* unit, uint64 hitDelay) m_caster->m_Events.ModifyEventTime(_spellEvent, Milliseconds(GetDelayStart() + m_delayMoment)); } -void Spell::SelectEffectImplicitTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, uint32& processedEffectMask) +void Spell::SelectEffectImplicitTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex, uint32& processedEffectMask) { if (!targetType.GetTarget()) return; @@ -920,7 +920,8 @@ void Spell::SelectEffectImplicitTargets(SpellEffectInfo const& spellEffectInfo, spellEffectInfo.TargetA.GetTarget() == effects[j].TargetA.GetTarget() && spellEffectInfo.TargetB.GetTarget() == effects[j].TargetB.GetTarget() && spellEffectInfo.ImplicitTargetConditions == effects[j].ImplicitTargetConditions && - spellEffectInfo.CalcRadius(m_caster) == effects[j].CalcRadius(m_caster) && + spellEffectInfo.CalcRadius(m_caster, SpellTargetIndex::TargetA) == effects[j].CalcRadius(m_caster, SpellTargetIndex::TargetA) && + spellEffectInfo.CalcRadius(m_caster, SpellTargetIndex::TargetB) == effects[j].CalcRadius(m_caster, SpellTargetIndex::TargetB) && CheckScriptEffectImplicitTargets(spellEffectInfo.EffectIndex, j)) { effectMask |= 1 << j; @@ -939,13 +940,13 @@ void Spell::SelectEffectImplicitTargets(SpellEffectInfo const& spellEffectInfo, SelectImplicitChannelTargets(spellEffectInfo, targetType); break; case TARGET_SELECT_CATEGORY_NEARBY: - SelectImplicitNearbyTargets(spellEffectInfo, targetType, effectMask); + SelectImplicitNearbyTargets(spellEffectInfo, targetType, targetIndex, effectMask); break; case TARGET_SELECT_CATEGORY_CONE: - SelectImplicitConeTargets(spellEffectInfo, targetType, effectMask); + SelectImplicitConeTargets(spellEffectInfo, targetType, targetIndex, effectMask); break; case TARGET_SELECT_CATEGORY_AREA: - SelectImplicitAreaTargets(spellEffectInfo, targetType, effectMask); + SelectImplicitAreaTargets(spellEffectInfo, targetType, targetIndex, effectMask); break; case TARGET_SELECT_CATEGORY_TRAJ: // just in case there is no dest, explanation in SelectImplicitDestDestTargets @@ -954,7 +955,7 @@ void Spell::SelectEffectImplicitTargets(SpellEffectInfo const& spellEffectInfo, SelectImplicitTrajTargets(spellEffectInfo, targetType); break; case TARGET_SELECT_CATEGORY_LINE: - SelectImplicitLineTargets(spellEffectInfo, targetType, effectMask); + SelectImplicitLineTargets(spellEffectInfo, targetType, targetIndex, effectMask); break; case TARGET_SELECT_CATEGORY_DEFAULT: switch (targetType.GetObjectType()) @@ -974,13 +975,13 @@ void Spell::SelectEffectImplicitTargets(SpellEffectInfo const& spellEffectInfo, switch (targetType.GetReferenceType()) { case TARGET_REFERENCE_TYPE_CASTER: - SelectImplicitCasterDestTargets(spellEffectInfo, targetType); + SelectImplicitCasterDestTargets(spellEffectInfo, targetType, targetIndex); break; case TARGET_REFERENCE_TYPE_TARGET: - SelectImplicitTargetDestTargets(spellEffectInfo, targetType); + SelectImplicitTargetDestTargets(spellEffectInfo, targetType, targetIndex); break; case TARGET_REFERENCE_TYPE_DEST: - SelectImplicitDestDestTargets(spellEffectInfo, targetType); + SelectImplicitDestDestTargets(spellEffectInfo, targetType, targetIndex); break; default: ABORT_MSG("Spell::SelectEffectImplicitTargets: received not implemented select target reference type for TARGET_TYPE_OBJECT_DEST"); @@ -1083,7 +1084,7 @@ void Spell::SelectImplicitChannelTargets(SpellEffectInfo const& spellEffectInfo, } } -void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, uint32 effMask) +void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex, uint32 effMask) { if (targetType.GetReferenceType() != TARGET_REFERENCE_TYPE_CASTER) { @@ -1161,7 +1162,7 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, dest = SpellDestination(st->target_X, st->target_Y, st->target_Z, st->target_Orientation); else { - float randomRadius = spellEffectInfo.CalcRadius(m_caster); + float randomRadius = spellEffectInfo.CalcRadius(m_caster, targetIndex); if (randomRadius > 0.0f) m_caster->MovePositionToFirstCollision(dest._position, randomRadius, targetType.CalcDirectionAngle()); } @@ -1187,7 +1188,7 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, { target = m_caster; // radius is only meant to be randomized when using caster fallback - randomRadius = spellEffectInfo.CalcRadius(m_caster); + randomRadius = spellEffectInfo.CalcRadius(m_caster, targetIndex); } break; default: @@ -1267,7 +1268,7 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo, SelectImplicitChainTargets(spellEffectInfo, targetType, target, effMask); } -void Spell::SelectImplicitConeTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, uint32 effMask) +void Spell::SelectImplicitConeTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex, uint32 effMask) { Position coneSrc(*m_caster); float coneAngle = m_spellInfo->ConeAngle; @@ -1297,7 +1298,7 @@ void Spell::SelectImplicitConeTargets(SpellEffectInfo const& spellEffectInfo, Sp SpellTargetObjectTypes objectType = targetType.GetObjectType(); SpellTargetCheckTypes selectionType = targetType.GetCheckType(); ConditionContainer* condList = spellEffectInfo.ImplicitTargetConditions; - float radius = spellEffectInfo.CalcRadius(m_caster) * m_spellValue->RadiusMod; + float radius = spellEffectInfo.CalcRadius(m_caster, targetIndex) * m_spellValue->RadiusMod; if (uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList)) { @@ -1327,7 +1328,7 @@ void Spell::SelectImplicitConeTargets(SpellEffectInfo const& spellEffectInfo, Sp } } -void Spell::SelectImplicitAreaTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, uint32 effMask) +void Spell::SelectImplicitAreaTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex, uint32 effMask) { WorldObject* referer = nullptr; switch (targetType.GetReferenceType()) @@ -1382,7 +1383,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffectInfo const& spellEffectInfo, Sp return; } - float radius = spellEffectInfo.CalcRadius(m_caster) * m_spellValue->RadiusMod; + float radius = spellEffectInfo.CalcRadius(m_caster, targetIndex) * m_spellValue->RadiusMod; std::list targets; switch (targetType.GetTarget()) { @@ -1451,7 +1452,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffectInfo const& spellEffectInfo, Sp } } -void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType) +void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex) { SpellDestination dest(*m_caster); @@ -1520,7 +1521,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn if (!unitCaster) break; - float dist = spellEffectInfo.CalcRadius(unitCaster); + float dist = spellEffectInfo.CalcRadius(unitCaster, targetIndex); float angle = targetType.CalcDirectionAngle(); if (targetType.GetTarget() == TARGET_DEST_CASTER_MOVEMENT_DIRECTION) { @@ -1576,7 +1577,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn break; default: { - float dist = spellEffectInfo.CalcRadius(m_caster); + float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex); float angle = targetType.CalcDirectionAngle(); float objSize = m_caster->GetCombatReach(); @@ -1595,7 +1596,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn case TARGET_DEST_CASTER_BACK_RIGHT: { static float const DefaultTotemDistance = 3.0f; - if (!spellEffectInfo.HasRadius() && !spellEffectInfo.HasMaxRadius()) + if (!spellEffectInfo.HasRadius(targetIndex)) dist = DefaultTotemDistance; break; } @@ -1621,7 +1622,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn m_targets.SetDst(dest); } -void Spell::SelectImplicitTargetDestTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType) +void Spell::SelectImplicitTargetDestTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex) { ASSERT(m_targets.GetObjectTarget() && "Spell::SelectImplicitTargetDestTargets - no explicit object target available!"); WorldObject* target = m_targets.GetObjectTarget(); @@ -1637,7 +1638,7 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffectInfo const& spellEffectIn default: { float angle = targetType.CalcDirectionAngle(); - float dist = spellEffectInfo.CalcRadius(nullptr); + float dist = spellEffectInfo.CalcRadius(nullptr, targetIndex); if (targetType.GetTarget() == TARGET_DEST_TARGET_RANDOM) dist *= float(rand_norm()); @@ -1656,7 +1657,7 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffectInfo const& spellEffectIn m_targets.SetDst(dest); } -void Spell::SelectImplicitDestDestTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType) +void Spell::SelectImplicitDestDestTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex) { // set destination to caster if no dest provided // can only happen if previous destination target could not be set for some reason @@ -1678,7 +1679,7 @@ void Spell::SelectImplicitDestDestTargets(SpellEffectInfo const& spellEffectInfo break; case TARGET_DEST_DEST_TARGET_TOWARDS_CASTER: { - float dist = spellEffectInfo.CalcRadius(m_caster); + float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex); Position pos = dest._position; float angle = pos.GetAbsoluteAngle(m_caster) - m_caster->GetOrientation(); @@ -1691,7 +1692,7 @@ void Spell::SelectImplicitDestDestTargets(SpellEffectInfo const& spellEffectInfo default: { float angle = targetType.CalcDirectionAngle(); - float dist = spellEffectInfo.CalcRadius(m_caster); + float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex); if (targetType.GetTarget() == TARGET_DEST_DEST_RANDOM) dist *= float(rand_norm()); @@ -1931,7 +1932,7 @@ void Spell::SelectImplicitTrajTargets(SpellEffectInfo const& spellEffectInfo, Sp } } -void Spell::SelectImplicitLineTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, uint32 effMask) +void Spell::SelectImplicitLineTargets(SpellEffectInfo const& spellEffectInfo, SpellImplicitTargetInfo const& targetType, SpellTargetIndex targetIndex, uint32 effMask) { std::list targets; SpellTargetObjectTypes objectType = targetType.GetObjectType(); @@ -1957,7 +1958,7 @@ void Spell::SelectImplicitLineTargets(SpellEffectInfo const& spellEffectInfo, Sp } ConditionContainer* condList = spellEffectInfo.ImplicitTargetConditions; - float radius = spellEffectInfo.CalcRadius(m_caster) * m_spellValue->RadiusMod; + float radius = spellEffectInfo.CalcRadius(m_caster, targetIndex) * m_spellValue->RadiusMod; if (uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList)) { -- cgit v1.2.3