Core/Spells: Define many unknown SpellCastTargetFlags enum values, rename some target type enum values to follow standards, also correctly implement TARGET_UNIT_TARGET_PASSENGER.
This commit is contained in:
@@ -119,16 +119,16 @@ void SpellCastTargets::Read(ByteBuffer& data, Unit* caster)
|
||||
if (m_targetMask == TARGET_FLAG_SELF)
|
||||
return;
|
||||
|
||||
if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNK17))
|
||||
if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_MINIPET))
|
||||
data.readPackGUID(m_unitTargetGUID);
|
||||
|
||||
if (m_targetMask & (TARGET_FLAG_OBJECT))
|
||||
if (m_targetMask & (TARGET_FLAG_GAMEOBJECT))
|
||||
data.readPackGUID(m_GOTargetGUID);
|
||||
|
||||
if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM))
|
||||
data.readPackGUID(m_itemTargetGUID);
|
||||
|
||||
if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE))
|
||||
if (m_targetMask & (TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_CORPSE_ALLY))
|
||||
data.readPackGUID(m_CorpseTargetGUID);
|
||||
|
||||
if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION)
|
||||
@@ -175,7 +175,7 @@ void SpellCastTargets::Write(ByteBuffer& data)
|
||||
{
|
||||
data << uint32(m_targetMask);
|
||||
|
||||
if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK17))
|
||||
if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_UNIT_MINIPET))
|
||||
{
|
||||
if (m_targetMask & TARGET_FLAG_UNIT)
|
||||
{
|
||||
@@ -184,14 +184,14 @@ void SpellCastTargets::Write(ByteBuffer& data)
|
||||
else
|
||||
data << uint8(0);
|
||||
}
|
||||
else if (m_targetMask & TARGET_FLAG_OBJECT)
|
||||
else if (m_targetMask & TARGET_FLAG_GAMEOBJECT)
|
||||
{
|
||||
if (m_GOTarget)
|
||||
data.append(m_GOTarget->GetPackGUID());
|
||||
else
|
||||
data << uint8(0);
|
||||
}
|
||||
else if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE))
|
||||
else if (m_targetMask & (TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY))
|
||||
data.appendPackGUID(m_CorpseTargetGUID);
|
||||
else
|
||||
data << uint8(0);
|
||||
@@ -333,7 +333,7 @@ void SpellCastTargets::SetGOTarget(GameObject* target)
|
||||
{
|
||||
m_GOTarget = target;
|
||||
m_GOTargetGUID = target->GetGUID();
|
||||
m_targetMask |= TARGET_FLAG_OBJECT;
|
||||
m_targetMask |= TARGET_FLAG_GAMEOBJECT;
|
||||
}
|
||||
|
||||
void SpellCastTargets::SetItemTarget(Item* item)
|
||||
@@ -417,14 +417,14 @@ void SpellCastTargets::OutDebug() const
|
||||
|
||||
if (m_targetMask & TARGET_FLAG_UNIT)
|
||||
sLog->outString("TARGET_FLAG_UNIT: " UI64FMTD, m_unitTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_UNK17)
|
||||
sLog->outString("TARGET_FLAG_UNK17: " UI64FMTD, m_unitTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_OBJECT)
|
||||
sLog->outString("TARGET_FLAG_OBJECT: " UI64FMTD, m_GOTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_CORPSE)
|
||||
sLog->outString("TARGET_FLAG_CORPSE: " UI64FMTD, m_CorpseTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_PVP_CORPSE)
|
||||
sLog->outString("TARGET_FLAG_PVP_CORPSE: " UI64FMTD, m_CorpseTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_UNIT_MINIPET)
|
||||
sLog->outString("TARGET_FLAG_UNIT_MINIPET: " UI64FMTD, m_unitTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_GAMEOBJECT)
|
||||
sLog->outString("TARGET_FLAG_GAMEOBJECT: " UI64FMTD, m_GOTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_CORPSE_ENEMY)
|
||||
sLog->outString("TARGET_FLAG_CORPSE_ENEMY: " UI64FMTD, m_CorpseTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_CORPSE_ALLY)
|
||||
sLog->outString("TARGET_FLAG_CORPSE_ALLY: " UI64FMTD, m_CorpseTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_ITEM)
|
||||
sLog->outString("TARGET_FLAG_ITEM: " UI64FMTD, m_itemTargetGUID);
|
||||
if (m_targetMask & TARGET_FLAG_TRADE_ITEM)
|
||||
@@ -768,7 +768,7 @@ void Spell::SelectSpellTargets()
|
||||
case SPELL_EFFECT_APPLY_AREA_AURA_PARTY:
|
||||
// AreaAura
|
||||
if (m_spellInfo->Attributes & (SPELL_ATTR0_CASTABLE_WHILE_SITTING | SPELL_ATTR0_CASTABLE_WHILE_MOUNTED | SPELL_ATTR0_UNK18 | SPELL_ATTR0_NOT_SHAPESHIFT) || m_spellInfo->Attributes == SPELL_ATTR0_NOT_SHAPESHIFT)
|
||||
SelectEffectTargets(i, TARGET_UNIT_PARTY_TARGET);
|
||||
SelectEffectTargets(i, TARGET_UNIT_TARGET_ALLY_PARTY);
|
||||
break;
|
||||
case SPELL_EFFECT_SKIN_PLAYER_CORPSE:
|
||||
if (m_targets.GetUnitTarget())
|
||||
@@ -2059,8 +2059,12 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
if (IsValidSingleTargetSpell(target))
|
||||
AddUnitTarget(target, i);
|
||||
break;
|
||||
case TARGET_UNIT_PARTY_TARGET:
|
||||
case TARGET_UNIT_CLASS_TARGET:
|
||||
case TARGET_UNIT_TARGET_PASSENGER:
|
||||
if (target->IsOnVehicle(m_caster))
|
||||
AddUnitTarget(target, i);
|
||||
break;
|
||||
case TARGET_UNIT_TARGET_ALLY_PARTY:
|
||||
case TARGET_UNIT_TARGET_CLASS_RAID:
|
||||
pushType = PUSH_CASTER_CENTER; // not real
|
||||
break;
|
||||
}
|
||||
@@ -2348,11 +2352,6 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
else if (m_targets.GetItemTarget())
|
||||
AddItemTarget(m_targets.GetItemTarget(), i);
|
||||
break;
|
||||
case TARGET_UNIT_DRIVER:
|
||||
if (Unit* driver = m_targets.GetUnitTarget())
|
||||
if (driver->IsOnVehicle(m_caster))
|
||||
AddUnitTarget(driver, i);
|
||||
break;
|
||||
default:
|
||||
sLog->outError("SPELL (caster[type: %u; guidlow: %u], spell: %u): unhandled spell target (%u)",
|
||||
m_caster->GetTypeId(), m_caster->GetGUIDLow(), m_spellInfo->Id, cur);
|
||||
@@ -2594,7 +2593,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
case TARGET_UNIT_AREA_PARTY_DST:
|
||||
m_caster->GetPartyMemberInDist(unitList, radius); //fix me
|
||||
break;
|
||||
case TARGET_UNIT_PARTY_TARGET:
|
||||
case TARGET_UNIT_TARGET_ALLY_PARTY:
|
||||
m_targets.GetUnitTarget()->GetPartyMemberInDist(unitList, radius);
|
||||
break;
|
||||
case TARGET_UNIT_PARTY_CASTER:
|
||||
@@ -2603,7 +2602,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur)
|
||||
case TARGET_UNIT_RAID_CASTER:
|
||||
m_caster->GetRaidMember(unitList, radius);
|
||||
break;
|
||||
case TARGET_UNIT_CLASS_TARGET:
|
||||
case TARGET_UNIT_TARGET_CLASS_RAID:
|
||||
{
|
||||
Player* targetPlayer = m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER
|
||||
? (Player*)m_targets.GetUnitTarget() : NULL;
|
||||
@@ -4711,9 +4710,8 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||
}
|
||||
|
||||
Unit* target = m_targets.GetUnitTarget();
|
||||
|
||||
// In pure self-cast spells, the client won't send any unit target
|
||||
if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_CASTER)) // TARGET_FLAG_SELF == 0, remember!
|
||||
if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_ALLY)) // TARGET_FLAG_SELF == 0, remember!
|
||||
target = m_caster;
|
||||
|
||||
if (target)
|
||||
@@ -6748,7 +6746,7 @@ bool Spell::IsValidSingleTargetEffect(Unit const* target, Targets type) const
|
||||
case TARGET_UNIT_TARGET_ENEMY:
|
||||
return !m_caster->IsFriendlyTo(target);
|
||||
case TARGET_UNIT_TARGET_ALLY:
|
||||
case TARGET_UNIT_PARTY_TARGET:
|
||||
case TARGET_UNIT_TARGET_ALLY_PARTY:
|
||||
return m_caster->IsFriendlyTo(target);
|
||||
case TARGET_UNIT_TARGET_PARTY:
|
||||
return m_caster != target && m_caster->IsInPartyWith(target);
|
||||
|
||||
@@ -39,36 +39,37 @@ struct SpellEntry;
|
||||
enum SpellCastTargetFlags
|
||||
{
|
||||
TARGET_FLAG_SELF = 0x00000000,
|
||||
TARGET_FLAG_UNUSED1 = 0x00000001, // not used in any spells as of 3.2.2a (can be set dynamically)
|
||||
TARGET_FLAG_UNUSED_1 = 0x00000001, // not used
|
||||
TARGET_FLAG_UNIT = 0x00000002, // pguid
|
||||
TARGET_FLAG_UNUSED2 = 0x00000004, // not used in any spells as of 3.2.2a (can be set dynamically)
|
||||
TARGET_FLAG_UNUSED3 = 0x00000008, // not used in any spells as of 3.2.2a (can be set dynamically)
|
||||
TARGET_FLAG_UNIT_RAID = 0x00000004, // not sent, used to validate target (if raid member)
|
||||
TARGET_FLAG_UNIT_PARTY = 0x00000008, // not sent, used to validate target (if party member)
|
||||
TARGET_FLAG_ITEM = 0x00000010, // pguid
|
||||
TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // 3 float
|
||||
TARGET_FLAG_DEST_LOCATION = 0x00000040, // 3 float
|
||||
TARGET_FLAG_OBJECT_CASTER = 0x00000080, // used in 7 spells only
|
||||
TARGET_FLAG_UNIT_CASTER = 0x00000100, // looks like self target (480 spells)
|
||||
TARGET_FLAG_PVP_CORPSE = 0x00000200, // pguid
|
||||
TARGET_FLAG_UNIT_CORPSE = 0x00000400, // 10 spells (gathering professions)
|
||||
TARGET_FLAG_OBJECT = 0x00000800, // pguid, 2 spells
|
||||
TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid, 0 spells
|
||||
TARGET_FLAG_STRING = 0x00002000, // string, 0 spells
|
||||
TARGET_FLAG_OPEN_LOCK = 0x00004000, // 199 spells, opening object/lock
|
||||
TARGET_FLAG_CORPSE = 0x00008000, // pguid, resurrection spells
|
||||
TARGET_FLAG_UNK17 = 0x00010000, // pguid, not used in any spells as of 3.2.2a (can be set dynamically)
|
||||
TARGET_FLAG_GLYPH = 0x00020000, // used in glyph spells
|
||||
TARGET_FLAG_UNK19 = 0x00040000, //
|
||||
TARGET_FLAG_UNUSED20 = 0x00080000 // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far
|
||||
TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // pguid, 3 float
|
||||
TARGET_FLAG_DEST_LOCATION = 0x00000040, // pguid, 3 float
|
||||
TARGET_FLAG_UNIT_ENEMY = 0x00000080, // not sent, used to validate target (if enemy)
|
||||
TARGET_FLAG_UNIT_ALLY = 0x00000100, // not sent, used to validate target (if ally)
|
||||
TARGET_FLAG_CORPSE_ENEMY = 0x00000200, // pguid
|
||||
TARGET_FLAG_UNIT_DEAD = 0x00000400, // not sent, used to validate target (if dead creature)
|
||||
TARGET_FLAG_GAMEOBJECT = 0x00000800, // pguid, used with TARGET_GAMEOBJECT
|
||||
TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
|
||||
TARGET_FLAG_STRING = 0x00002000, // string
|
||||
TARGET_FLAG_GAMEOBJECT_ITEM = 0x00004000, // not sent, used with TARGET_GAMEOBJECT_ITEM
|
||||
TARGET_FLAG_CORPSE_ALLY = 0x00008000, // pguid
|
||||
TARGET_FLAG_UNIT_MINIPET = 0x00010000, // pguid, used to validate target (if non combat pet)
|
||||
TARGET_FLAG_GLYPH_SLOT = 0x00020000, // used in glyph spells
|
||||
TARGET_FLAG_UNK19 = 0x00040000, // sometimes appears with DEST_TARGET spells (may appear or not for a given spell)
|
||||
TARGET_FLAG_UNUSED20 = 0x00080000, // uint32 counter, loop { vec3 - screen position (?), guid }, not used so far
|
||||
TARGET_FLAG_UNIT_PASSENGER = 0x00100000, // guessed, used to validate target (if vehicle passenger)
|
||||
};
|
||||
#define MAX_TARGET_FLAGS 21
|
||||
|
||||
enum SpellCastFlags
|
||||
{
|
||||
CAST_FLAG_NONE = 0x00000000,
|
||||
CAST_FLAG_PENDING = 0x00000001, // Pending == 1
|
||||
CAST_FLAG_PENDING = 0x00000001, // aoe combat log?
|
||||
CAST_FLAG_UNKNOWN_2 = 0x00000002,
|
||||
CAST_FLAG_UNKNOWN_3 = 0x00000004,
|
||||
CAST_FLAG_UNKNOWN_4 = 0x00000008,
|
||||
CAST_FLAG_UNKNOWN_4 = 0x00000008, // ignore AOE visual
|
||||
CAST_FLAG_UNKNOWN_5 = 0x00000010,
|
||||
CAST_FLAG_AMMO = 0x00000020, // Projectiles visual
|
||||
CAST_FLAG_UNKNOWN_7 = 0x00000040,
|
||||
|
||||
@@ -127,8 +127,9 @@ SpellMgr::SpellMgr()
|
||||
case TARGET_UNIT_TARGET_ANY:
|
||||
case TARGET_UNIT_TARGET_ENEMY:
|
||||
case TARGET_UNIT_TARGET_PARTY:
|
||||
case TARGET_UNIT_PARTY_TARGET:
|
||||
case TARGET_UNIT_CLASS_TARGET:
|
||||
case TARGET_UNIT_TARGET_PASSENGER:
|
||||
case TARGET_UNIT_TARGET_ALLY_PARTY:
|
||||
case TARGET_UNIT_TARGET_RAID_CLASS:
|
||||
case TARGET_UNIT_CHAINHEAL:
|
||||
SpellTargetType[i] = TARGET_TYPE_UNIT_TARGET;
|
||||
break;
|
||||
@@ -236,7 +237,7 @@ SpellMgr::SpellMgr()
|
||||
case TARGET_UNIT_AREA_ENTRY_SRC:
|
||||
case TARGET_UNIT_AREA_PARTY_DST:
|
||||
case TARGET_UNIT_AREA_PARTY_SRC:
|
||||
case TARGET_UNIT_PARTY_TARGET:
|
||||
case TARGET_UNIT_TARGET_ALLY_PARTY:
|
||||
case TARGET_UNIT_PARTY_CASTER:
|
||||
case TARGET_UNIT_CONE_ENEMY:
|
||||
case TARGET_UNIT_CONE_ALLY:
|
||||
@@ -4047,11 +4048,6 @@ void SpellMgr::LoadSpellCustomAttr()
|
||||
spellInfo->EffectBasePoints[2] += 30000;
|
||||
++count;
|
||||
break;
|
||||
// some dummy spell only has dest, should push caster in this case
|
||||
case 62324: // Throw Passenger
|
||||
spellInfo->Targets |= TARGET_FLAG_UNIT_CASTER;
|
||||
++count;
|
||||
break;
|
||||
case 16834: // Natural shapeshifter
|
||||
case 16835:
|
||||
spellInfo->DurationIndex = 21;
|
||||
|
||||
Reference in New Issue
Block a user