Core/Spells: Don't ignore power costs and reagents for spells triggered by SPELL_EFFECT_TRIGGER_SPELL, SPELL_EFFECT_TRIGGER_MISSILE, SPELL_EFFECT_FORCE_CAST, SPELL_AURA_PERIODIC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL and fixed implementation of SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
This commit is contained in:
1 parent
a2079b5835
commit
16aa620ca0
5 files changed
+61
-32
No files matched your search
@@ -5673,7 +5673,10 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)
|
|||||||
{
|
{
|
||||||
if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
|
if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
|
||||||
{
|
{
|
||||||
triggerCaster->CastSpell(target, triggeredSpellInfo->Id, this);
|
triggerCaster->CastSpell(target, triggerSpellId, CastSpellExtraArgsInit {
|
||||||
|
.TriggerFlags = TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST),
|
||||||
|
.TriggeringAura = this
|
||||||
|
});
|
||||||
TC_LOG_DEBUG("spells", "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id);
|
TC_LOG_DEBUG("spells", "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5689,6 +5692,7 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit*
|
|||||||
if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
|
if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target)
|
||||||
{
|
{
|
||||||
CastSpellExtraArgs args(this);
|
CastSpellExtraArgs args(this);
|
||||||
|
args.SetTriggerFlags(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST));
|
||||||
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), GetAmount());
|
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), GetAmount());
|
||||||
triggerCaster->CastSpell(target, triggerSpellId, args);
|
triggerCaster->CastSpell(target, triggerSpellId, args);
|
||||||
@@ -6259,7 +6263,9 @@ void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEve
|
|||||||
if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))
|
if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))
|
||||||
{
|
{
|
||||||
TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId());
|
TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId());
|
||||||
triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, this);
|
triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, CastSpellExtraArgs(this)
|
||||||
|
.SetTriggeringSpell(eventInfo.GetProcSpell())
|
||||||
|
.SetTriggerFlags(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST)));
|
||||||
}
|
}
|
||||||
else if (triggerSpellId && GetAuraType() != SPELL_AURA_DUMMY)
|
else if (triggerSpellId && GetAuraType() != SPELL_AURA_DUMMY)
|
||||||
TC_LOG_ERROR("spells","AuraEffect::HandleProcTriggerSpellAuraProc: Could not trigger spell %u from aura %u proc, because the spell does not have an entry in Spell.dbc.", triggerSpellId, GetId());
|
TC_LOG_ERROR("spells","AuraEffect::HandleProcTriggerSpellAuraProc: Could not trigger spell %u from aura %u proc, because the spell does not have an entry in Spell.dbc.", triggerSpellId, GetId());
|
||||||
@@ -6277,7 +6283,9 @@ void AuraEffect::HandleProcTriggerSpellCopyAuraProc(AuraApplication* aurApp, Pro
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId());
|
TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellAuraProc: Triggering spell %u from aura %u proc", triggeredSpellInfo->Id, GetId());
|
||||||
triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, this);
|
triggerCaster->CastSpell(triggerTarget, triggeredSpellInfo->Id, CastSpellExtraArgs(this)
|
||||||
|
.SetTriggeringSpell(eventInfo.GetProcSpell())
|
||||||
|
.SetTriggerFlags(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo)
|
void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo)
|
||||||
@@ -6289,6 +6297,7 @@ void AuraEffect::HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp
|
|||||||
if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))
|
if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId))
|
||||||
{
|
{
|
||||||
CastSpellExtraArgs args(this);
|
CastSpellExtraArgs args(this);
|
||||||
|
args.SetTriggerFlags(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST));
|
||||||
args.AddSpellMod(SPELLVALUE_BASE_POINT0, GetAmount());
|
args.AddSpellMod(SPELLVALUE_BASE_POINT0, GetAmount());
|
||||||
triggerCaster->CastSpell(triggerTarget, triggerSpellId, args);
|
triggerCaster->CastSpell(triggerTarget, triggerSpellId, args);
|
||||||
TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellWithValueAuraProc: Triggering spell %u with value %d from aura %u proc", triggeredSpellInfo->Id, GetAmount(), GetId());
|
TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerSpellWithValueAuraProc: Triggering spell %u with value %d from aura %u proc", triggeredSpellInfo->Id, GetAmount(), GetId());
|
||||||
|
|||||||
@@ -5263,7 +5263,7 @@ void Spell::TakePower()
|
|||||||
if (!unitCaster)
|
if (!unitCaster)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_CastItem || m_triggeredByAuraSpell)
|
if (m_CastItem || m_spellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//Don't take power if the spell is cast while .cheat power is enabled.
|
//Don't take power if the spell is cast while .cheat power is enabled.
|
||||||
@@ -5483,7 +5483,7 @@ void Spell::TakeReagents()
|
|||||||
ItemTemplate const* castItemTemplate = m_CastItem ? m_CastItem->GetTemplate() : nullptr;
|
ItemTemplate const* castItemTemplate = m_CastItem ? m_CastItem->GetTemplate() : nullptr;
|
||||||
|
|
||||||
// do not take reagents for these item casts
|
// do not take reagents for these item casts
|
||||||
if (castItemTemplate && castItemTemplate->GetFlags() & ITEM_FLAG_NO_REAGENT_COST)
|
if ((castItemTemplate && castItemTemplate->GetFlags() & ITEM_FLAG_NO_REAGENT_COST) || m_spellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Player* p_caster = m_caster->ToPlayer();
|
Player* p_caster = m_caster->ToPlayer();
|
||||||
@@ -8947,3 +8947,10 @@ bool WorldObjectSpellTrajTargetCheck::operator()(WorldObject* target)
|
|||||||
}
|
}
|
||||||
|
|
||||||
} //namespace Trinity
|
} //namespace Trinity
|
||||||
|
|
||||||
|
CastSpellExtraArgs::CastSpellExtraArgs() = default;
|
||||||
|
CastSpellExtraArgs::CastSpellExtraArgs(CastSpellExtraArgs const& other) = default;
|
||||||
|
CastSpellExtraArgs::CastSpellExtraArgs(CastSpellExtraArgs&& other) noexcept = default;
|
||||||
|
CastSpellExtraArgs& CastSpellExtraArgs::operator=(CastSpellExtraArgs const& other) = default;
|
||||||
|
CastSpellExtraArgs& CastSpellExtraArgs::operator=(CastSpellExtraArgs&& other) noexcept = default;
|
||||||
|
CastSpellExtraArgs::~CastSpellExtraArgs() = default;
|
||||||
@@ -192,31 +192,14 @@ enum TriggerCastFlags : uint32
|
|||||||
|
|
||||||
DEFINE_ENUM_FLAG(TriggerCastFlags);
|
DEFINE_ENUM_FLAG(TriggerCastFlags);
|
||||||
|
|
||||||
struct TC_GAME_API CastSpellExtraArgs
|
struct CastSpellExtraArgsInit
|
||||||
{
|
{
|
||||||
CastSpellExtraArgs() {}
|
|
||||||
CastSpellExtraArgs(bool triggered) : TriggerFlags(triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE) {}
|
|
||||||
CastSpellExtraArgs(TriggerCastFlags trigger) : TriggerFlags(trigger) {}
|
|
||||||
CastSpellExtraArgs(Item* item) : TriggerFlags(TRIGGERED_FULL_MASK), CastItem(item) {}
|
|
||||||
CastSpellExtraArgs(AuraEffect const* eff) : TriggerFlags(TRIGGERED_FULL_MASK), TriggeringAura(eff) {}
|
|
||||||
CastSpellExtraArgs(ObjectGuid const& origCaster) : TriggerFlags(TRIGGERED_FULL_MASK), OriginalCaster(origCaster) {}
|
|
||||||
CastSpellExtraArgs(AuraEffect const* eff, ObjectGuid const& origCaster) : TriggerFlags(TRIGGERED_FULL_MASK), TriggeringAura(eff), OriginalCaster(origCaster) {}
|
|
||||||
CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); }
|
|
||||||
|
|
||||||
CastSpellExtraArgs& SetTriggerFlags(TriggerCastFlags flag) { TriggerFlags = flag; return *this; }
|
|
||||||
CastSpellExtraArgs& SetCastItem(Item* item) { CastItem = item; return *this; }
|
|
||||||
CastSpellExtraArgs& SetTriggeringSpell(Spell const* triggeringSpell) { TriggeringSpell = triggeringSpell; return *this; }
|
|
||||||
CastSpellExtraArgs& SetTriggeringAura(AuraEffect const* triggeringAura) { TriggeringAura = triggeringAura; return *this; }
|
|
||||||
CastSpellExtraArgs& SetOriginalCaster(ObjectGuid const& guid) { OriginalCaster = guid; return *this; }
|
|
||||||
CastSpellExtraArgs& AddSpellMod(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); return *this; }
|
|
||||||
CastSpellExtraArgs& AddSpellBP0(int32 val) { return AddSpellMod(SPELLVALUE_BASE_POINT0, val); } // because i don't want to type SPELLVALUE_BASE_POINT0 300 times
|
|
||||||
CastSpellExtraArgs& SetCustomArg(std::any customArg) { CustomArg = std::move(customArg); return *this; }
|
|
||||||
|
|
||||||
TriggerCastFlags TriggerFlags = TRIGGERED_NONE;
|
TriggerCastFlags TriggerFlags = TRIGGERED_NONE;
|
||||||
Item* CastItem = nullptr;
|
Item* CastItem = nullptr;
|
||||||
Spell const* TriggeringSpell = nullptr;
|
Spell const* TriggeringSpell = nullptr;
|
||||||
AuraEffect const* TriggeringAura = nullptr;
|
AuraEffect const* TriggeringAura = nullptr;
|
||||||
ObjectGuid OriginalCaster = ObjectGuid::Empty;
|
ObjectGuid OriginalCaster = ObjectGuid::Empty;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
friend struct CastSpellExtraArgs;
|
friend struct CastSpellExtraArgs;
|
||||||
@@ -230,13 +213,39 @@ struct TC_GAME_API CastSpellExtraArgs
|
|||||||
|
|
||||||
std::vector<std::pair<SpellValueMod, int32>> data;
|
std::vector<std::pair<SpellValueMod, int32>> data;
|
||||||
} SpellValueOverrides;
|
} SpellValueOverrides;
|
||||||
|
|
||||||
std::any CustomArg;
|
std::any CustomArg;
|
||||||
|
};
|
||||||
|
|
||||||
CastSpellExtraArgs(CastSpellExtraArgs const&) = delete;
|
struct TC_GAME_API CastSpellExtraArgs : public CastSpellExtraArgsInit
|
||||||
CastSpellExtraArgs(CastSpellExtraArgs&&) = delete;
|
{
|
||||||
|
CastSpellExtraArgs();
|
||||||
|
CastSpellExtraArgs(bool triggered) { TriggerFlags = triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE; }
|
||||||
|
CastSpellExtraArgs(TriggerCastFlags trigger) { TriggerFlags = trigger; }
|
||||||
|
CastSpellExtraArgs(Item* item) { TriggerFlags = TRIGGERED_FULL_MASK; CastItem = item; }
|
||||||
|
CastSpellExtraArgs(Spell const* triggeringSpell) { TriggerFlags = TRIGGERED_FULL_MASK; SetTriggeringSpell(triggeringSpell); }
|
||||||
|
CastSpellExtraArgs(AuraEffect const* eff) { TriggerFlags = TRIGGERED_FULL_MASK; SetTriggeringAura(eff); }
|
||||||
|
CastSpellExtraArgs(ObjectGuid const& origCaster) { TriggerFlags = TRIGGERED_FULL_MASK; SetOriginalCaster(origCaster); }
|
||||||
|
CastSpellExtraArgs(AuraEffect const* eff, ObjectGuid const& origCaster) { TriggerFlags = TRIGGERED_FULL_MASK; SetTriggeringAura(eff); SetOriginalCaster(origCaster); }
|
||||||
|
CastSpellExtraArgs(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); }
|
||||||
|
CastSpellExtraArgs(CastSpellExtraArgsInit&& init) : CastSpellExtraArgsInit(std::move(init)) { SetTriggeringSpell(TriggeringSpell); }
|
||||||
|
|
||||||
CastSpellExtraArgs& operator=(CastSpellExtraArgs const&) = delete;
|
CastSpellExtraArgs(CastSpellExtraArgs const& other);
|
||||||
CastSpellExtraArgs& operator=(CastSpellExtraArgs&&) = delete;
|
CastSpellExtraArgs(CastSpellExtraArgs&& other) noexcept;
|
||||||
|
|
||||||
|
CastSpellExtraArgs& operator=(CastSpellExtraArgs const& other);
|
||||||
|
CastSpellExtraArgs& operator=(CastSpellExtraArgs&& other) noexcept;
|
||||||
|
|
||||||
|
~CastSpellExtraArgs();
|
||||||
|
|
||||||
|
CastSpellExtraArgs& SetTriggerFlags(TriggerCastFlags flag) { TriggerFlags = flag; return *this; }
|
||||||
|
CastSpellExtraArgs& SetCastItem(Item* item) { CastItem = item; return *this; }
|
||||||
|
CastSpellExtraArgs& SetTriggeringSpell(Spell const* triggeringSpell) { TriggeringSpell = triggeringSpell; return *this; }
|
||||||
|
CastSpellExtraArgs& SetTriggeringAura(AuraEffect const* triggeringAura) { TriggeringAura = triggeringAura; return *this; }
|
||||||
|
CastSpellExtraArgs& SetOriginalCaster(ObjectGuid const& guid) { OriginalCaster = guid; return *this; }
|
||||||
|
CastSpellExtraArgs& AddSpellMod(SpellValueMod mod, int32 val) { SpellValueOverrides.AddMod(mod, val); return *this; }
|
||||||
|
CastSpellExtraArgs& AddSpellBP0(int32 val) { return AddSpellMod(SPELLVALUE_BASE_POINT0, val); } // because i don't want to type SPELLVALUE_BASE_POINT0 300 times
|
||||||
|
CastSpellExtraArgs& SetCustomArg(std::any customArg) { CustomArg = std::move(customArg); return *this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class SummonPropertiesParamType : uint8
|
enum class SummonPropertiesParamType : uint8
|
||||||
|
|||||||
@@ -571,7 +571,7 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// original caster guid only for GO cast
|
// original caster guid only for GO cast
|
||||||
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
|
CastSpellExtraArgs args(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST));
|
||||||
args.SetOriginalCaster(m_originalCasterGUID);
|
args.SetOriginalCaster(m_originalCasterGUID);
|
||||||
|
|
||||||
if (!m_castItemGUID.IsEmpty() && sSpellMgr->AssertSpellInfo(m_spellInfo->Effects[effIndex].TriggerSpell)->HasAttribute(SPELL_ATTR2_RETAIN_ITEM_CAST))
|
if (!m_castItemGUID.IsEmpty() && sSpellMgr->AssertSpellInfo(m_spellInfo->Effects[effIndex].TriggerSpell)->HasAttribute(SPELL_ATTR2_RETAIN_ITEM_CAST))
|
||||||
@@ -624,7 +624,11 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex)
|
|||||||
targets.SetGOTarget(go);
|
targets.SetGOTarget(go);
|
||||||
}
|
}
|
||||||
|
|
||||||
CastSpellExtraArgs args(m_originalCasterGUID);
|
CastSpellExtraArgs args(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST));
|
||||||
|
args.SetOriginalCaster(m_originalCasterGUID);
|
||||||
|
args.SetTriggeringSpell(this);
|
||||||
|
args.SetCustomArg(m_customArg);
|
||||||
|
|
||||||
// set basepoints for trigger with value effect
|
// set basepoints for trigger with value effect
|
||||||
if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE)
|
if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE)
|
||||||
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
@@ -679,7 +683,7 @@ void Spell::EffectForceCast(SpellEffIndex effIndex)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
|
CastSpellExtraArgs args(TRIGGERED_FULL_MASK & ~(TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_REAGENT_COST));
|
||||||
if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE)
|
if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE)
|
||||||
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage);
|
args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + i), damage);
|
||||||
|
|||||||
@@ -584,7 +584,7 @@ enum SpellAttr6 : uint32
|
|||||||
SPELL_ATTR6_NOT_AN_ATTACK = 0x00000004, /*NYI*/ // TITLE Not an Attack
|
SPELL_ATTR6_NOT_AN_ATTACK = 0x00000004, /*NYI*/ // TITLE Not an Attack
|
||||||
SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC = 0x00000008, // TITLE Can Assist Immune PC
|
SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC = 0x00000008, // TITLE Can Assist Immune PC
|
||||||
SPELL_ATTR6_IGNORE_FOR_MOD_TIME_RATE = 0x00000010, /*NYI, time rate not implemented*/ // TITLE Ignore For Mod Time Rate
|
SPELL_ATTR6_IGNORE_FOR_MOD_TIME_RATE = 0x00000010, /*NYI, time rate not implemented*/ // TITLE Ignore For Mod Time Rate
|
||||||
SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES = 0x00000020, // TITLE Do Not Consume Resources
|
SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES = 0x00000020, // TITLE Do Not Consume Resources DESCRIPTION Requires power/reagents to cast but doesn't consume them
|
||||||
SPELL_ATTR6_FLOATING_COMBAT_TEXT_ON_CAST = 0x00000040, // TITLE Floating Combat Text On Cast (client only)
|
SPELL_ATTR6_FLOATING_COMBAT_TEXT_ON_CAST = 0x00000040, // TITLE Floating Combat Text On Cast (client only)
|
||||||
SPELL_ATTR6_AURA_IS_WEAPON_PROC = 0x00000080, // TITLE Aura Is Weapon Proc
|
SPELL_ATTR6_AURA_IS_WEAPON_PROC = 0x00000080, // TITLE Aura Is Weapon Proc
|
||||||
SPELL_ATTR6_DO_NOT_CHAIN_TO_CROWD_CONTROLLED_TARGETS = 0x00000100, // TITLE Do Not Chain To Crowd-Controlled Targets DESCRIPTION Implicit targeting (chaining and area targeting) will not impact crowd controlled targets
|
SPELL_ATTR6_DO_NOT_CHAIN_TO_CROWD_CONTROLLED_TARGETS = 0x00000100, // TITLE Do Not Chain To Crowd-Controlled Targets DESCRIPTION Implicit targeting (chaining and area targeting) will not impact crowd controlled targets
|
||||||
|
|||||||
Reference in new issue
Block a user