aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h16
-rw-r--r--src/server/game/Spells/Spell.cpp73
-rw-r--r--src/server/game/Spells/Spell.h3
-rw-r--r--src/server/game/Spells/SpellInfo.cpp18
-rw-r--r--src/server/game/Spells/SpellInfo.h5
-rw-r--r--src/server/game/Spells/SpellMgr.cpp3
6 files changed, 95 insertions, 23 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 03b0f954ccd..378f8ad4217 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -2347,21 +2347,21 @@ enum Targets
TARGET_UNK_115 = 115,
TARGET_UNK_116 = 116,
TARGET_UNK_117 = 117,
- TARGET_UNK_118 = 118,
- TARGET_UNK_119 = 119,
- TARGET_UNK_120 = 120,
+ TARGET_UNIT_TARGET_ALLY_OR_RAID = 118, // If target is in your party or raid, all party and raid members will be affected
+ TARGET_CORPSE_SRC_AREA_RAID = 119,
+ TARGET_UNIT_CASTER_AND_SUMMONS = 120,
TARGET_UNK_121 = 121,
- TARGET_UNK_122 = 122,
- TARGET_UNK_123 = 123,
+ TARGET_UNIT_AREA_THREAT_LIST = 122, // any unit on threat list
+ TARGET_UNIT_AREA_TAP_LIST = 123,
TARGET_UNK_124 = 124,
- TARGET_UNK_125 = 125,
+ TARGET_DEST_CASTER_GROUND = 125,
TARGET_UNK_126 = 126,
TARGET_UNK_127 = 127,
TARGET_UNK_128 = 128,
TARGET_UNIT_CONE_ENTRY_129 = 129,
TARGET_UNK_130 = 130,
- TARGET_UNK_131 = 131,
- TARGET_UNK_132 = 132,
+ TARGET_DEST_SUMMONER = 131,
+ TARGET_DEST_TARGET_ALLY = 132,
TARGET_UNK_133 = 133,
TARGET_UNK_134 = 134,
TARGET_UNK_135 = 135,
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
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index e4ed1464a9f..8f3410ac162 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -935,7 +935,8 @@ namespace Trinity
struct TC_GAME_API WorldObjectSpellConeTargetCheck : public WorldObjectSpellAreaTargetCheck
{
float _coneAngle;
- WorldObjectSpellConeTargetCheck(float coneAngle, float range, Unit* caster,
+ float _lineWidth;
+ WorldObjectSpellConeTargetCheck(float coneAngle, float lineWidth, float range, Unit* caster,
SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionContainer* condList);
bool operator()(WorldObject* target);
};
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 084695559bd..f399fe610a0 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -336,21 +336,21 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 115
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 116
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 117
- {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 118
- {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_RAID, TARGET_DIR_NONE}, // 119
- {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 120
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_RAID, TARGET_DIR_NONE}, // 118 TARGET_UNIT_TARGET_ALLY_OR_RAID
+ {TARGET_OBJECT_TYPE_CORPSE, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_RAID, TARGET_DIR_NONE}, // 119 TARGET_CORPSE_SRC_AREA_RAID
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_SUMMONED, TARGET_DIR_NONE}, // 120 TARGET_UNIT_SELF_AND_SUMMONS
{TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 121
- {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 122
- {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 123
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_THREAT, TARGET_DIR_NONE}, // 122 TARGET_UNIT_AREA_THREAT_LIST
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_TAP, TARGET_DIR_NONE}, // 123 TARGET_UNIT_AREA_TAP_LIST
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 124
- {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 125
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 125 TARGET_DEST_CASTER_GROUND
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 126
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 127
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 128
- {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_CHECK_ENTRY, TARGET_DIR_FRONT }, // 129 TARGET_UNIT_CONE_ENTRY_129
+ {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_CONE, TARGET_CHECK_ENTRY, TARGET_DIR_FRONT}, // 129 TARGET_UNIT_CONE_ENTRY_129
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 130
- {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 131
- {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 132
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 131 TARGET_DEST_SUMMONER
+ {TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_ALLY, TARGET_DIR_NONE}, // 132 TARGET_DEST_TARGET_ALLY
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 133
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 134
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 135
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 5a5afeff4ee..8c92fd6c9c1 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -123,7 +123,10 @@ enum SpellTargetCheckTypes : uint8
TARGET_CHECK_PARTY,
TARGET_CHECK_RAID,
TARGET_CHECK_RAID_CLASS,
- TARGET_CHECK_PASSENGER
+ TARGET_CHECK_PASSENGER,
+ TARGET_CHECK_SUMMONED,
+ TARGET_CHECK_THREAT,
+ TARGET_CHECK_TAP
};
enum SpellTargetDirectionTypes
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index f2afcdbc474..c0997426960 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2829,6 +2829,9 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
if (talentSpells.count(spellInfoMutable->Id))
spellInfoMutable->AttributesCu |= SPELL_ATTR0_CU_IS_TALENT;
+ if (G3D::fuzzyNe(spellInfoMutable->Width, 0.0f))
+ spellInfoMutable->AttributesCu |= SPELL_ATTR0_CU_CONE_LINE;
+
switch (spellInfoMutable->SpellFamilyName)
{
case SPELLFAMILY_WARRIOR: