diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index e0a626cf683..12394255f34 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1741,12 +1741,12 @@ enum Targets TARGET_UNK_115 = 115, TARGET_UNK_116 = 116, TARGET_UNK_117 = 117, - TARGET_UNK_118 = 118, + 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_UNK_120 = 120, + TARGET_UNIT_CASTER_AND_SUMMONS = 120, TARGET_UNK_121 = 121, - TARGET_UNK_122 = 122, - TARGET_UNK_123 = 123, + TARGET_UNIT_AREA_THREAT_LIST = 122, + TARGET_UNIT_AREA_TAP_LIST = 123, TARGET_UNK_124 = 124, TARGET_DEST_CASTER_FLOOR = 125, // 1 spell in 4.3.4 TARGET_UNK_126 = 126, diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 7eb9b8ea95c..50907d9cd1f 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1277,6 +1277,46 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge } std::list targets; + + 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 = m_spellInfo->Effects[effIndex].CalcRadius(m_caster); // Workaround for some spells that don't have RadiusEntry set in dbc (but SpellRange instead) if (G3D::fuzzyEq(radius, 0.f)) @@ -8224,6 +8264,16 @@ bool WorldObjectSpellTargetCheck::operator()(WorldObject* target) if (!_referer->IsInRaidWith(unitTarget)) 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; } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 4e200777ab9..2a0f3390d55 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -334,12 +334,12 @@ 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_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, 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}, // 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_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 120 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, 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_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 125 TARGET_DEST_CASTER_FLOOR {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 126 diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 6ea3689128c..e846de8bf5e 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -119,7 +119,9 @@ enum SpellTargetCheckTypes : uint8 TARGET_CHECK_PARTY, TARGET_CHECK_RAID, TARGET_CHECK_RAID_CLASS, - TARGET_CHECK_PASSENGER + TARGET_CHECK_PASSENGER, + TARGET_CHECK_THREAT, + TARGET_CHECK_TAP }; enum SpellTargetDirectionTypes