aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-06-21 15:59:43 +0200
committerShauren <shauren.trinity@gmail.com>2020-06-21 15:59:43 +0200
commitfce9fca9002e5bfc99990b9108aa56447e5001bd (patch)
treea8a77da024e79d03e77d8a6ea985657398745075 /src/server/game/Spells/Spell.cpp
parent8c4e6c5e1404b0663edaf8432bf3eed251a99f85 (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.cpp73
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