diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-06-21 15:59:43 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-06-21 15:59:43 +0200 |
| commit | fce9fca9002e5bfc99990b9108aa56447e5001bd (patch) | |
| tree | a8a77da024e79d03e77d8a6ea985657398745075 /src/server/game/Spells/Spell.cpp | |
| parent | 8c4e6c5e1404b0663edaf8432bf3eed251a99f85 (diff) | |
Core/Spells: Implemented new target types
* TARGET_UNIT_TARGET_ALLY_OR_RAID
* TARGET_UNIT_CASTER_AND_SUMMONS
* TARGET_UNIT_AREA_THREAT_LIST
* TARGET_UNIT_AREA_TAP_LIST
* TARGET_DEST_CASTER_GROUND
* TARGET_DEST_SUMMONER
* TARGET_DEST_TARGET_ALLY
Closes #18558
Closes #18867
Closes #24295
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 73 |
1 files changed, 69 insertions, 4 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index ca79aa1ac0e..e9f01061f75 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1167,7 +1167,7 @@ void Spell::SelectImplicitConeTargets(SpellEffIndex effIndex, SpellImplicitTarge if (uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList)) { - Trinity::WorldObjectSpellConeTargetCheck check(DegToRad(m_spellInfo->ConeAngle), radius, m_caster, m_spellInfo, selectionType, condList); + Trinity::WorldObjectSpellConeTargetCheck check(DegToRad(m_spellInfo->ConeAngle), m_spellInfo->Width ? m_spellInfo->Width : m_caster->GetCombatReach(), 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); @@ -1247,6 +1247,46 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge SpellEffectInfo const* effect = m_spellInfo->GetEffect(effIndex); if (!effect) return; + + switch (targetType.GetTarget()) + { + case TARGET_UNIT_TARGET_ALLY_OR_RAID: + if (Unit* targetedUnit = m_targets.GetUnitTarget()) + { + if (!m_caster->IsInRaidWith(targetedUnit)) + { + targets.push_back(m_targets.GetUnitTarget()); + + CallScriptObjectAreaTargetSelectHandlers(targets, effIndex, targetType); + + if (!targets.empty()) + { + // Other special target selection goes here + if (uint32 maxTargets = m_spellValue->MaxAffectedTargets) + Trinity::Containers::RandomResize(targets, maxTargets); + + for (WorldObject* target : targets) + { + if (Unit* unit = target->ToUnit()) + AddUnitTarget(unit, effMask, false, true, center); + else if (GameObject* gObjTarget = target->ToGameObject()) + AddGOTarget(gObjTarget, effMask); + } + } + + return; + } + + center = targetedUnit; + } + break; + case TARGET_UNIT_CASTER_AND_SUMMONS: + targets.push_back(m_caster); + break; + default: + break; + } + float radius = effect->CalcRadius(m_caster) * m_spellValue->RadiusMod; SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), effect->ImplicitTargetConditions); @@ -1331,6 +1371,14 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici dest = SpellDestination(x, y, liquidLevel, m_caster->GetOrientation()); break; } + case TARGET_DEST_CASTER_GROUND: + m_caster->UpdateAllowedPositionZ(dest._position.GetPositionX(), dest._position.GetPositionY(), dest._position.m_positionZ); + break; + case TARGET_DEST_SUMMONER: + if (TempSummon const* casterSummon = m_caster->ToTempSummon()) + if (Unit const* summoner = casterSummon->GetSummoner()) + dest = SpellDestination(*summoner); + break; default: { if (SpellEffectInfo const* effect = m_spellInfo->GetEffect(effIndex)) @@ -1389,6 +1437,7 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffIndex effIndex, SpellImplici { case TARGET_DEST_TARGET_ENEMY: case TARGET_DEST_TARGET_ANY: + case TARGET_DEST_TARGET_ALLY: break; default: { @@ -7874,6 +7923,22 @@ bool WorldObjectSpellTargetCheck::operator()(WorldObject* target) if (!_referer->IsInRaidWith(unitTarget)) return false; break; + case TARGET_CHECK_SUMMONED: + if (!unitTarget->IsSummon()) + return false; + if (unitTarget->ToTempSummon()->GetSummonerGUID() != _caster->GetGUID()) + return false; + break; + case TARGET_CHECK_THREAT: + if (_referer->getThreatManager().getThreat(unitTarget, true) <= 0.0f) + return false; + break; + case TARGET_CHECK_TAP: + if (_referer->GetTypeId() != TYPEID_UNIT || unitTarget->GetTypeId() != TYPEID_PLAYER) + return false; + if (!_referer->ToCreature()->isTappedBy(unitTarget->ToPlayer())) + return false; + break; default: break; } @@ -7922,9 +7987,9 @@ bool WorldObjectSpellAreaTargetCheck::operator()(WorldObject* target) return WorldObjectSpellTargetCheck::operator ()(target); } -WorldObjectSpellConeTargetCheck::WorldObjectSpellConeTargetCheck(float coneAngle, float range, Unit* caster, +WorldObjectSpellConeTargetCheck::WorldObjectSpellConeTargetCheck(float coneAngle, float lineWidth, float range, Unit* caster, SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionContainer* condList) - : WorldObjectSpellAreaTargetCheck(range, caster, caster, caster, spellInfo, selectionType, condList), _coneAngle(coneAngle) { } + : WorldObjectSpellAreaTargetCheck(range, caster, caster, caster, spellInfo, selectionType, condList), _coneAngle(coneAngle), _lineWidth(lineWidth) { } bool WorldObjectSpellConeTargetCheck::operator()(WorldObject* target) { @@ -7935,7 +8000,7 @@ bool WorldObjectSpellConeTargetCheck::operator()(WorldObject* target) } else if (_spellInfo->HasAttribute(SPELL_ATTR0_CU_CONE_LINE)) { - if (!_caster->HasInLine(target, target->GetCombatReach(), _caster->GetCombatReach())) + if (!_caster->HasInLine(target, target->GetCombatReach(), _lineWidth)) return false; } else |
