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:
Shauren
2020-06-22 11:49:26 +02:00
committed by Ovahlord
parent 6622a94384
commit 9fe40967b1
4 changed files with 60 additions and 8 deletions

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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