mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 00:48:56 +01:00
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
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -1277,6 +1277,46 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge
|
||||
}
|
||||
|
||||
std::list<WorldObject*> 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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user