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
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user