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 | |
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')
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 16 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 73 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 5 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 3 |
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: |