Core/Auras: Proc flag updates
Port From (https://github.com/TrinityCore/TrinityCore/commit/02979daf761a5122efa7b8fa3e70509ecd69789e)
This commit is contained in:
@@ -2434,45 +2434,48 @@ namespace Framework.Constants
|
|||||||
{
|
{
|
||||||
None = 0x0,
|
None = 0x0,
|
||||||
|
|
||||||
Killed = 0x01, // 00 Killed by agressor - not sure about this flag
|
Heartbeat = 0x01, // 00 Killed by agressor - not sure about this flag
|
||||||
Kill = 0x02, // 01 Kill target (in most cases need XP/Honor reward)
|
Kill = 0x02, // 01 Kill target (in most cases need XP/Honor reward)
|
||||||
|
|
||||||
DoneMeleeAutoAttack = 0x04, // 02 Done melee auto attack
|
DealMeleeSwing = 0x04, // 02 Done melee auto attack
|
||||||
TakenMeleeAutoAttack = 0x08, // 03 Taken melee auto attack
|
TakeMeleeSwing = 0x08, // 03 Taken melee auto attack
|
||||||
|
|
||||||
DoneSpellMeleeDmgClass = 0x10, // 04 Done attack by Spell that has dmg class melee
|
DealMeleeAbility = 0x10, // 04 Done attack by Spell that has dmg class melee
|
||||||
TakenSpellMeleeDmgClass = 0x20, // 05 Taken attack by Spell that has dmg class melee
|
TakeMeleeAbility = 0x20, // 05 Taken attack by Spell that has dmg class melee
|
||||||
|
|
||||||
DoneRangedAutoAttack = 0x40, // 06 Done ranged auto attack
|
DealRangedAttack = 0x40, // 06 Done ranged auto attack
|
||||||
TakenRangedAutoAttack = 0x80, // 07 Taken ranged auto attack
|
TakeRangedAttack = 0x80, // 07 Taken ranged auto attack
|
||||||
|
|
||||||
DoneSpellRangedDmgClass = 0x100, // 08 Done attack by Spell that has dmg class ranged
|
DealRangedAbility = 0x100, // 08 Done attack by Spell that has dmg class ranged
|
||||||
TakenSpellRangedDmgClass = 0x200, // 09 Taken attack by Spell that has dmg class ranged
|
TakeRangedAbility = 0x200, // 09 Taken attack by Spell that has dmg class ranged
|
||||||
|
|
||||||
DoneSpellNoneDmgClassPos = 0x400, // 10 Done positive spell that has dmg class none
|
DealHelpfulAbility = 0x400, // 10 Done positive spell that has dmg class none
|
||||||
TakenSpellNoneDmgClassPos = 0x800, // 11 Taken positive spell that has dmg class none
|
TakeHelpfulAbility = 0x800, // 11 Taken positive spell that has dmg class none
|
||||||
|
|
||||||
DoneSpellNoneDmgClassNeg = 0x1000, // 12 Done negative spell that has dmg class none
|
DealHarmfulAbility = 0x1000, // 12 Done negative spell that has dmg class none
|
||||||
TakenSpellNoneDmgClassNeg = 0x2000, // 13 Taken negative spell that has dmg class none
|
TakeHarmfulAbility = 0x2000, // 13 Taken negative spell that has dmg class none
|
||||||
|
|
||||||
DoneSpellMagicDmgClassPos = 0x4000, // 14 Done positive spell that has dmg class magic
|
DealHelpfulSpell = 0x4000, // 14 Done positive spell that has dmg class magic
|
||||||
TakenSpellMagicDmgClassPos = 0x8000, // 15 Taken positive spell that has dmg class magic
|
TakeHelpfulSpell = 0x8000, // 15 Taken positive spell that has dmg class magic
|
||||||
|
|
||||||
DoneSpellMagicDmgClassNeg = 0x10000, // 16 Done negative spell that has dmg class magic
|
DealHarmfulSpell = 0x10000, // 16 Done negative spell that has dmg class magic
|
||||||
TakenSpellMagicDmgClassNeg = 0x20000, // 17 Taken negative spell that has dmg class magic
|
TakeHarmfulSpell = 0x20000, // 17 Taken negative spell that has dmg class magic
|
||||||
|
|
||||||
DonePeriodic = 0x40000, // 18 Successful do periodic (damage / healing)
|
DealHarmfulPeriodic = 0x40000, // 18 Successful do periodic damage
|
||||||
TakenPeriodic = 0x80000, // 19 Taken spell periodic (damage / healing)
|
TakeHarmfulPeriodic = 0x80000, // 19 Taken spell periodic damage
|
||||||
|
|
||||||
TakenDamage = 0x100000, // 20 Taken any damage
|
TakeAnyDamage = 0x100000, // 20 Taken any damage
|
||||||
DoneTrapActivation = 0x200000, // 21 On trap activation (possibly needs name change to ONGAMEOBJECTCAST or USE)
|
|
||||||
|
|
||||||
DoneMainHandAttack = 0x400000, // 22 Done main-hand melee attacks (spell and autoattack)
|
DealHelpfulPeriodic = 0x200000, // 21 On trap activation (possibly needs name change to ONGAMEOBJECTCAST or USE)
|
||||||
DoneOffHandAttack = 0x800000, // 23 Done off-hand melee attacks (spell and autoattack)
|
|
||||||
|
MainHandWeaponSwing = 0x400000, // 22 Done main-hand melee attacks (spell and autoattack)
|
||||||
|
OffHandWeaponSwing = 0x800000, // 23 Done off-hand melee attacks (spell and autoattack)
|
||||||
|
|
||||||
Death = 0x1000000, // 24 Died in any way
|
Death = 0x1000000, // 24 Died in any way
|
||||||
Jump = 0x02000000, // 25 Jumped
|
Jump = 0x02000000, // 25 Jumped
|
||||||
|
|
||||||
|
CloneSpell = 0x4000000, // 26 Proc Clone Spell
|
||||||
|
|
||||||
EnterCombat = 0x08000000, // 27 Entered combat
|
EnterCombat = 0x08000000, // 27 Entered combat
|
||||||
EncounterStart = 0x10000000, // 28 Encounter started
|
EncounterStart = 0x10000000, // 28 Encounter started
|
||||||
|
|
||||||
@@ -2482,30 +2485,30 @@ namespace Framework.Constants
|
|||||||
TakeHelpfulPeriodic = 0x80000000, // 31 Take Helpful Periodic
|
TakeHelpfulPeriodic = 0x80000000, // 31 Take Helpful Periodic
|
||||||
|
|
||||||
// flag masks
|
// flag masks
|
||||||
AutoAttackMask = DoneMeleeAutoAttack | TakenMeleeAutoAttack | DoneRangedAutoAttack | TakenRangedAutoAttack,
|
AutoAttackMask = DealMeleeSwing | TakeMeleeSwing | DealRangedAttack | TakeRangedAttack,
|
||||||
|
|
||||||
MeleeMask = DoneMeleeAutoAttack | TakenMeleeAutoAttack | DoneSpellMeleeDmgClass | TakenSpellMeleeDmgClass
|
MeleeMask = DealMeleeSwing | TakeMeleeSwing | DealMeleeAbility | TakeMeleeAbility
|
||||||
| DoneMainHandAttack | DoneOffHandAttack,
|
| MainHandWeaponSwing | OffHandWeaponSwing,
|
||||||
|
|
||||||
RangedMask = DoneRangedAutoAttack | TakenRangedAutoAttack | DoneSpellRangedDmgClass | TakenSpellRangedDmgClass,
|
RangedMask = DealRangedAttack | TakeRangedAttack | DealRangedAbility | TakeRangedAbility,
|
||||||
|
|
||||||
SpellMask = DoneSpellMeleeDmgClass | TakenSpellMeleeDmgClass | DoneRangedAutoAttack | TakenRangedAutoAttack
|
SpellMask = DealMeleeAbility | TakeMeleeAbility | DealRangedAttack | TakeRangedAttack
|
||||||
| DoneSpellRangedDmgClass | TakenSpellRangedDmgClass | DoneSpellNoneDmgClassPos | TakenSpellNoneDmgClassPos
|
| DealRangedAbility | TakeRangedAbility | DealHelpfulAbility | TakeHelpfulAbility
|
||||||
| DoneSpellNoneDmgClassNeg | TakenSpellNoneDmgClassNeg | DoneSpellMagicDmgClassPos | TakenSpellMagicDmgClassPos
|
| DealHarmfulAbility | TakeHarmfulAbility | DealHelpfulSpell | TakeHelpfulSpell
|
||||||
| DoneSpellMagicDmgClassNeg | TakenSpellMagicDmgClassNeg | DonePeriodic | TakenPeriodic | DoneTrapActivation,
|
| DealHarmfulSpell | TakeHarmfulSpell | DealHarmfulPeriodic | TakeHarmfulPeriodic | DealHelpfulPeriodic | TakeHelpfulPeriodic,
|
||||||
|
|
||||||
DoneHitMask = DoneMeleeAutoAttack | DoneRangedAutoAttack | DoneSpellMeleeDmgClass | DoneSpellRangedDmgClass
|
DoneHitMask = DealMeleeSwing | DealRangedAttack | DealMeleeAbility | DealRangedAbility
|
||||||
| DoneSpellNoneDmgClassPos | DoneSpellNoneDmgClassNeg | DoneSpellMagicDmgClassPos | DoneSpellMagicDmgClassNeg
|
| DealHelpfulAbility | DealHarmfulAbility | DealHelpfulSpell | DealHarmfulSpell
|
||||||
| DonePeriodic | DoneTrapActivation | DoneMainHandAttack | DoneOffHandAttack,
|
| DealHarmfulPeriodic | DealHelpfulPeriodic | MainHandWeaponSwing | OffHandWeaponSwing,
|
||||||
|
|
||||||
TakenHitMask = TakenMeleeAutoAttack | TakenRangedAutoAttack | TakenSpellMeleeDmgClass | TakenSpellRangedDmgClass
|
TakenHitMask = TakeMeleeSwing | TakeRangedAttack | TakeMeleeAbility | TakeRangedAbility
|
||||||
| TakenSpellNoneDmgClassPos | TakenSpellNoneDmgClassNeg | TakenSpellMagicDmgClassPos | TakenSpellMagicDmgClassNeg
|
| TakeHelpfulAbility | TakeHarmfulAbility | TakeHelpfulSpell | TakeHarmfulSpell
|
||||||
| TakenPeriodic | TakenDamage,
|
| TakeHarmfulPeriodic | TakeAnyDamage,
|
||||||
|
|
||||||
ReqSpellPhaseMask = SpellMask & DoneHitMask,
|
ReqSpellPhaseMask = SpellMask & DoneHitMask,
|
||||||
|
|
||||||
MeleeBasedTriggerMask = (DoneMeleeAutoAttack | TakenMeleeAutoAttack | DoneSpellMeleeDmgClass | TakenSpellMeleeDmgClass |
|
MeleeBasedTriggerMask = (DealMeleeSwing | TakeMeleeSwing | DealMeleeAbility | TakeMeleeAbility |
|
||||||
DoneRangedAutoAttack | TakenRangedAutoAttack | DoneSpellRangedDmgClass | TakenSpellRangedDmgClass)
|
DealRangedAttack | TakeRangedAttack | DealRangedAbility | TakeRangedAbility)
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ProcFlags2
|
public enum ProcFlags2
|
||||||
|
|||||||
@@ -5873,6 +5873,8 @@ namespace Game.Entities
|
|||||||
Item pItem = StoreNewItem(dest, lootItem.itemid, true, lootItem.randomBonusListId, null, lootItem.context, lootItem.BonusListIDs);
|
Item pItem = StoreNewItem(dest, lootItem.itemid, true, lootItem.randomBonusListId, null, lootItem.context, lootItem.BonusListIDs);
|
||||||
SendNewItem(pItem, lootItem.count, false, createdByPlayer, broadcast);
|
SendNewItem(pItem, lootItem.count, false, createdByPlayer, broadcast);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Unit.ProcSkillsAndAuras(this, null, new ProcFlagsInit(ProcFlags.Looted), new ProcFlagsInit(ProcFlags.None), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte GetInventorySlotCount() { return m_activePlayerData.NumBackpackSlots; }
|
public byte GetInventorySlotCount() { return m_activePlayerData.NumBackpackSlots; }
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
if (!victim.IsCritter())
|
if (!victim.IsCritter())
|
||||||
{
|
{
|
||||||
ProcSkillsAndAuras(attacker, victim, new ProcFlagsInit(ProcFlags.Kill), new ProcFlagsInit(ProcFlags.Killed), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, null, null, null);
|
ProcSkillsAndAuras(attacker, victim, new ProcFlagsInit(ProcFlags.Kill), new ProcFlagsInit(ProcFlags.Heartbeat), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, null, null, null);
|
||||||
if (player != null && player.GetGroup() != null)
|
if (player != null && player.GetGroup() != null)
|
||||||
{
|
{
|
||||||
for (GroupReference itr = player.GetGroup().GetFirstMember(); itr != null; itr = itr.Next())
|
for (GroupReference itr = player.GetGroup().GetFirstMember(); itr != null; itr = itr.Next())
|
||||||
@@ -1053,12 +1053,12 @@ namespace Game.Entities
|
|||||||
switch (attackType)
|
switch (attackType)
|
||||||
{
|
{
|
||||||
case WeaponAttackType.BaseAttack:
|
case WeaponAttackType.BaseAttack:
|
||||||
damageInfo.ProcAttacker = new ProcFlagsInit(ProcFlags.DoneMeleeAutoAttack | ProcFlags.DoneMainHandAttack);
|
damageInfo.ProcAttacker = new ProcFlagsInit(ProcFlags.DealMeleeSwing | ProcFlags.MainHandWeaponSwing);
|
||||||
damageInfo.ProcVictim = new ProcFlagsInit(ProcFlags.TakenMeleeAutoAttack);
|
damageInfo.ProcVictim = new ProcFlagsInit(ProcFlags.TakeMeleeSwing);
|
||||||
break;
|
break;
|
||||||
case WeaponAttackType.OffAttack:
|
case WeaponAttackType.OffAttack:
|
||||||
damageInfo.ProcAttacker = new ProcFlagsInit(ProcFlags.DoneMeleeAutoAttack | ProcFlags.DoneOffHandAttack);
|
damageInfo.ProcAttacker = new ProcFlagsInit(ProcFlags.DealMeleeSwing | ProcFlags.OffHandWeaponSwing);
|
||||||
damageInfo.ProcVictim = new ProcFlagsInit(ProcFlags.TakenMeleeAutoAttack);
|
damageInfo.ProcVictim = new ProcFlagsInit(ProcFlags.TakeMeleeSwing);
|
||||||
damageInfo.HitInfo = HitInfo.OffHand;
|
damageInfo.HitInfo = HitInfo.OffHand;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -1197,7 +1197,7 @@ namespace Game.Entities
|
|||||||
// Calculate absorb resist
|
// Calculate absorb resist
|
||||||
if (damageInfo.Damage > 0)
|
if (damageInfo.Damage > 0)
|
||||||
{
|
{
|
||||||
damageInfo.ProcVictim.Or(ProcFlags.TakenDamage);
|
damageInfo.ProcVictim.Or(ProcFlags.TakeAnyDamage);
|
||||||
// Calculate absorb & resists
|
// Calculate absorb & resists
|
||||||
DamageInfo dmgInfo = new(damageInfo);
|
DamageInfo dmgInfo = new(damageInfo);
|
||||||
CalcAbsorbResist(dmgInfo);
|
CalcAbsorbResist(dmgInfo);
|
||||||
|
|||||||
@@ -3513,7 +3513,7 @@ namespace Game.Entities
|
|||||||
caster.SendSpellNonMeleeDamageLog(log);
|
caster.SendSpellNonMeleeDamageLog(log);
|
||||||
|
|
||||||
// break 'Fear' and similar auras
|
// break 'Fear' and similar auras
|
||||||
ProcSkillsAndAuras(damageInfo.GetAttacker(), caster, new ProcFlagsInit(ProcFlags.None), new ProcFlagsInit(ProcFlags.TakenSpellMagicDmgClassNeg), ProcFlagsSpellType.Damage, ProcFlagsSpellPhase.Hit, ProcFlagsHit.None, null, damageInfo, null);
|
ProcSkillsAndAuras(damageInfo.GetAttacker(), caster, new ProcFlagsInit(ProcFlags.None), new ProcFlagsInit(ProcFlags.TakeHarmfulSpell), ProcFlagsSpellType.Damage, ProcFlagsSpellPhase.Hit, ProcFlagsHit.None, null, damageInfo, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ using Game.Loots;
|
|||||||
using Game.Maps;
|
using Game.Maps;
|
||||||
using Game.Networking;
|
using Game.Networking;
|
||||||
using Game.Networking.Packets;
|
using Game.Networking.Packets;
|
||||||
using System;
|
using Game.Spells;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Game
|
namespace Game
|
||||||
@@ -109,6 +109,8 @@ namespace Game
|
|||||||
player.UpdateCriteria(CriteriaType.LootAnyItem, resultValue.item.GetEntry(), resultValue.count);
|
player.UpdateCriteria(CriteriaType.LootAnyItem, resultValue.item.GetEntry(), resultValue.count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Unit.ProcSkillsAndAuras(player, null, new ProcFlagsInit(ProcFlags.Looted), new ProcFlagsInit(), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, null, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
[WorldPacketHandler(ClientOpcodes.LootMoney)]
|
[WorldPacketHandler(ClientOpcodes.LootMoney)]
|
||||||
|
|||||||
@@ -5065,14 +5065,14 @@ namespace Game.Spells
|
|||||||
Unit.DealDamageMods(caster, target, ref damage, ref absorb);
|
Unit.DealDamageMods(caster, target, ref damage, ref absorb);
|
||||||
|
|
||||||
// Set trigger flag
|
// Set trigger flag
|
||||||
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DonePeriodic);
|
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DealHarmfulPeriodic);
|
||||||
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakenPeriodic);
|
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakeHarmfulPeriodic);
|
||||||
ProcFlagsHit hitMask = damageInfo.GetHitMask();
|
ProcFlagsHit hitMask = damageInfo.GetHitMask();
|
||||||
|
|
||||||
if (damage != 0)
|
if (damage != 0)
|
||||||
{
|
{
|
||||||
hitMask |= crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
hitMask |= crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
||||||
procVictim.Or(ProcFlags.TakenDamage);
|
procVictim.Or(ProcFlags.TakeAnyDamage);
|
||||||
}
|
}
|
||||||
|
|
||||||
int overkill = (int)(damage - target.GetHealth());
|
int overkill = (int)(damage - target.GetHealth());
|
||||||
@@ -5156,14 +5156,14 @@ namespace Game.Spells
|
|||||||
log.HitInfo |= HitInfo.CriticalHit;
|
log.HitInfo |= HitInfo.CriticalHit;
|
||||||
|
|
||||||
// Set trigger flag
|
// Set trigger flag
|
||||||
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DonePeriodic);
|
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DealHarmfulPeriodic);
|
||||||
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakenPeriodic);
|
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakeHarmfulPeriodic);
|
||||||
ProcFlagsHit hitMask = damageInfo.GetHitMask();
|
ProcFlagsHit hitMask = damageInfo.GetHitMask();
|
||||||
|
|
||||||
if (damage != 0)
|
if (damage != 0)
|
||||||
{
|
{
|
||||||
hitMask |= crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
hitMask |= crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
||||||
procVictim.Or(ProcFlags.TakenDamage);
|
procVictim.Or(ProcFlags.TakeAnyDamage);
|
||||||
}
|
}
|
||||||
|
|
||||||
int new_damage = (int)Unit.DealDamage(caster, target, damage, cleanDamage, DamageEffectType.DOT, GetSpellInfo().GetSchoolMask(), GetSpellInfo(), false);
|
int new_damage = (int)Unit.DealDamage(caster, target, damage, cleanDamage, DamageEffectType.DOT, GetSpellInfo().GetSchoolMask(), GetSpellInfo(), false);
|
||||||
@@ -5182,7 +5182,7 @@ namespace Game.Spells
|
|||||||
caster.HealBySpell(healInfo);
|
caster.HealBySpell(healInfo);
|
||||||
|
|
||||||
caster.GetThreatManager().ForwardThreatForAssistingMe(caster, healInfo.GetEffectiveHeal() * 0.5f, GetSpellInfo());
|
caster.GetThreatManager().ForwardThreatForAssistingMe(caster, healInfo.GetEffectiveHeal() * 0.5f, GetSpellInfo());
|
||||||
Unit.ProcSkillsAndAuras(caster, caster, new ProcFlagsInit(ProcFlags.DonePeriodic), new ProcFlagsInit(ProcFlags.TakenPeriodic), ProcFlagsSpellType.Heal, ProcFlagsSpellPhase.Hit, hitMask, null, null, healInfo);
|
Unit.ProcSkillsAndAuras(caster, caster, new ProcFlagsInit(ProcFlags.DealHarmfulPeriodic), new ProcFlagsInit(ProcFlags.TakeHarmfulPeriodic), ProcFlagsSpellType.Heal, ProcFlagsSpellPhase.Hit, hitMask, null, null, healInfo);
|
||||||
|
|
||||||
caster.SendSpellNonMeleeDamageLog(log);
|
caster.SendSpellNonMeleeDamageLog(log);
|
||||||
}
|
}
|
||||||
@@ -5214,7 +5214,7 @@ namespace Game.Spells
|
|||||||
|
|
||||||
HealInfo healInfo = new(caster, target, damage, GetSpellInfo(), GetSpellInfo().GetSchoolMask());
|
HealInfo healInfo = new(caster, target, damage, GetSpellInfo(), GetSpellInfo().GetSchoolMask());
|
||||||
caster.HealBySpell(healInfo);
|
caster.HealBySpell(healInfo);
|
||||||
Unit.ProcSkillsAndAuras(caster, target, new ProcFlagsInit(ProcFlags.DonePeriodic), new ProcFlagsInit(ProcFlags.TakenPeriodic), ProcFlagsSpellType.Heal, ProcFlagsSpellPhase.Hit, ProcFlagsHit.Normal, null, null, healInfo);
|
Unit.ProcSkillsAndAuras(caster, target, new ProcFlagsInit(ProcFlags.DealHarmfulPeriodic), new ProcFlagsInit(ProcFlags.TakeHarmfulPeriodic), ProcFlagsSpellType.Heal, ProcFlagsSpellPhase.Hit, ProcFlagsHit.Normal, null, null, healInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandlePeriodicHealAurasTick(Unit target, Unit caster)
|
void HandlePeriodicHealAurasTick(Unit target, Unit caster)
|
||||||
@@ -5271,8 +5271,8 @@ namespace Game.Spells
|
|||||||
if (GetAuraType() == AuraType.ObsModHealth)
|
if (GetAuraType() == AuraType.ObsModHealth)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DonePeriodic);
|
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DealHarmfulPeriodic);
|
||||||
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakenPeriodic);
|
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakeHarmfulPeriodic);
|
||||||
ProcFlagsHit hitMask = crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
ProcFlagsHit hitMask = crit ? ProcFlagsHit.Critical : ProcFlagsHit.Normal;
|
||||||
// ignore item heals
|
// ignore item heals
|
||||||
if (GetBase().GetCastItemGUID().IsEmpty())
|
if (GetBase().GetCastItemGUID().IsEmpty())
|
||||||
@@ -5426,13 +5426,13 @@ namespace Game.Spells
|
|||||||
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
||||||
|
|
||||||
// Set trigger flag
|
// Set trigger flag
|
||||||
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DonePeriodic);
|
ProcFlagsInit procAttacker = new ProcFlagsInit(ProcFlags.DealHarmfulPeriodic);
|
||||||
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakenPeriodic);
|
ProcFlagsInit procVictim = new ProcFlagsInit(ProcFlags.TakeHarmfulPeriodic);
|
||||||
ProcFlagsHit hitMask = Unit.CreateProcHitMask(damageInfo, SpellMissInfo.None);
|
ProcFlagsHit hitMask = Unit.CreateProcHitMask(damageInfo, SpellMissInfo.None);
|
||||||
ProcFlagsSpellType spellTypeMask = ProcFlagsSpellType.NoDmgHeal;
|
ProcFlagsSpellType spellTypeMask = ProcFlagsSpellType.NoDmgHeal;
|
||||||
if (damageInfo.damage != 0)
|
if (damageInfo.damage != 0)
|
||||||
{
|
{
|
||||||
procVictim.Or(ProcFlags.TakenDamage);
|
procVictim.Or(ProcFlags.TakeAnyDamage);
|
||||||
spellTypeMask |= ProcFlagsSpellType.Damage;
|
spellTypeMask |= ProcFlagsSpellType.Damage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+89
-54
@@ -1703,24 +1703,24 @@ namespace Game.Spells
|
|||||||
switch (m_spellInfo.DmgClass)
|
switch (m_spellInfo.DmgClass)
|
||||||
{
|
{
|
||||||
case SpellDmgClass.Melee:
|
case SpellDmgClass.Melee:
|
||||||
m_procAttacker = new ProcFlagsInit(ProcFlags.DoneSpellMeleeDmgClass);
|
m_procAttacker = new ProcFlagsInit(ProcFlags.DealMeleeAbility);
|
||||||
if (m_attackType == WeaponAttackType.OffAttack)
|
if (m_attackType == WeaponAttackType.OffAttack)
|
||||||
m_procAttacker.Or(ProcFlags.DoneOffHandAttack);
|
m_procAttacker.Or(ProcFlags.OffHandWeaponSwing);
|
||||||
else
|
else
|
||||||
m_procAttacker.Or(ProcFlags.DoneMainHandAttack);
|
m_procAttacker.Or(ProcFlags.MainHandWeaponSwing);
|
||||||
m_procVictim = new ProcFlagsInit(ProcFlags.TakenSpellMeleeDmgClass);
|
m_procVictim = new ProcFlagsInit(ProcFlags.TakeMeleeAbility);
|
||||||
break;
|
break;
|
||||||
case SpellDmgClass.Ranged:
|
case SpellDmgClass.Ranged:
|
||||||
// Auto attack
|
// Auto attack
|
||||||
if (m_spellInfo.HasAttribute(SpellAttr2.AutorepeatFlag))
|
if (m_spellInfo.HasAttribute(SpellAttr2.AutorepeatFlag))
|
||||||
{
|
{
|
||||||
m_procAttacker = new ProcFlagsInit(ProcFlags.DoneRangedAutoAttack);
|
m_procAttacker = new ProcFlagsInit(ProcFlags.DealRangedAttack);
|
||||||
m_procVictim = new ProcFlagsInit(ProcFlags.TakenRangedAutoAttack);
|
m_procVictim = new ProcFlagsInit(ProcFlags.TakeRangedAttack);
|
||||||
}
|
}
|
||||||
else // Ranged spell attack
|
else // Ranged spell attack
|
||||||
{
|
{
|
||||||
m_procAttacker = new ProcFlagsInit(ProcFlags.DoneSpellRangedDmgClass);
|
m_procAttacker = new ProcFlagsInit(ProcFlags.DealRangedAbility);
|
||||||
m_procVictim = new ProcFlagsInit(ProcFlags.TakenSpellRangedDmgClass);
|
m_procVictim = new ProcFlagsInit(ProcFlags.TakeRangedAbility);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -1728,32 +1728,13 @@ namespace Game.Spells
|
|||||||
Convert.ToBoolean(m_spellInfo.EquippedItemSubClassMask & (1 << (int)ItemSubClassWeapon.Wand))
|
Convert.ToBoolean(m_spellInfo.EquippedItemSubClassMask & (1 << (int)ItemSubClassWeapon.Wand))
|
||||||
&& m_spellInfo.HasAttribute(SpellAttr2.AutorepeatFlag)) // Wands auto attack
|
&& m_spellInfo.HasAttribute(SpellAttr2.AutorepeatFlag)) // Wands auto attack
|
||||||
{
|
{
|
||||||
m_procAttacker = new ProcFlagsInit(ProcFlags.DoneRangedAutoAttack);
|
m_procAttacker = new ProcFlagsInit(ProcFlags.DealRangedAttack);
|
||||||
m_procVictim = new ProcFlagsInit(ProcFlags.TakenRangedAutoAttack);
|
m_procVictim = new ProcFlagsInit(ProcFlags.TakeRangedAttack);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
// For other spells trigger procflags are set in Spell::TargetInfo::DoDamageAndTriggers
|
// For other spells trigger procflags are set in Spell::TargetInfo::DoDamageAndTriggers
|
||||||
// Because spell positivity is dependant on target
|
// Because spell positivity is dependant on target
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hunter trap spells - activation proc for Lock and Load, Entrapment and Misdirection
|
|
||||||
if (m_spellInfo.SpellFamilyName == SpellFamilyNames.Hunter && (m_spellInfo.SpellFamilyFlags[0].HasAnyFlag(0x18u) || // Freezing and Frost Trap, Freezing Arrow
|
|
||||||
m_spellInfo.Id == 57879 || // Snake Trap - done this way to avoid double proc
|
|
||||||
m_spellInfo.SpellFamilyFlags[2].HasAnyFlag(0x00024000u))) // Explosive and Immolation Trap
|
|
||||||
{
|
|
||||||
m_procAttacker.Or(ProcFlags.DoneTrapActivation);
|
|
||||||
|
|
||||||
// also fill up other flags (TargetInfo::DoDamageAndTriggers only fills up flag if both are not set)
|
|
||||||
m_procAttacker.Or(ProcFlags.DoneSpellMagicDmgClassNeg);
|
|
||||||
m_procVictim.Or(ProcFlags.TakenSpellMagicDmgClassNeg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hellfire Effect - trigger as DOT
|
|
||||||
if (m_spellInfo.SpellFamilyName == SpellFamilyNames.Warlock && m_spellInfo.SpellFamilyFlags[0].HasAnyFlag(0x00000040u))
|
|
||||||
{
|
|
||||||
m_procAttacker = new ProcFlagsInit(ProcFlags.DonePeriodic);
|
|
||||||
m_procVictim = new ProcFlagsInit(ProcFlags.TakenPeriodic);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CleanupTargetList()
|
public void CleanupTargetList()
|
||||||
@@ -2885,10 +2866,27 @@ namespace Game.Spells
|
|||||||
ProcFlagsInit procAttacker = m_procAttacker;
|
ProcFlagsInit procAttacker = m_procAttacker;
|
||||||
if (!procAttacker)
|
if (!procAttacker)
|
||||||
{
|
{
|
||||||
if (m_spellInfo.DmgClass == SpellDmgClass.Magic)
|
if (m_spellInfo.HasAttribute(SpellAttr3.TreatAsPeriodic))
|
||||||
procAttacker = new ProcFlagsInit(IsPositive() ? ProcFlags.DoneSpellMagicDmgClassPos : ProcFlags.DoneSpellMagicDmgClassNeg);
|
{
|
||||||
|
if (IsPositive())
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulPeriodic);
|
||||||
|
else
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulPeriodic);
|
||||||
|
}
|
||||||
|
else if (m_spellInfo.HasAttribute(SpellAttr0.Ability))
|
||||||
|
{
|
||||||
|
if (IsPositive())
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulAbility);
|
||||||
|
else
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulSpell);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
procAttacker = new ProcFlagsInit(IsPositive() ? ProcFlags.DoneSpellNoneDmgClassPos : ProcFlags.DoneSpellNoneDmgClassNeg);
|
{
|
||||||
|
if (IsPositive())
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulSpell);
|
||||||
|
else
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulSpell);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
procAttacker.Or(ProcFlags2.CastSuccessful);
|
procAttacker.Or(ProcFlags2.CastSuccessful);
|
||||||
@@ -3149,10 +3147,27 @@ namespace Game.Spells
|
|||||||
ProcFlagsInit procAttacker = m_procAttacker;
|
ProcFlagsInit procAttacker = m_procAttacker;
|
||||||
if (!procAttacker)
|
if (!procAttacker)
|
||||||
{
|
{
|
||||||
if (m_spellInfo.DmgClass == SpellDmgClass.Magic)
|
if (m_spellInfo.HasAttribute(SpellAttr3.TreatAsPeriodic))
|
||||||
procAttacker = new ProcFlagsInit(IsPositive() ? ProcFlags.DoneSpellMagicDmgClassPos : ProcFlags.DoneSpellMagicDmgClassNeg);
|
{
|
||||||
|
if (IsPositive())
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulPeriodic);
|
||||||
|
else
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulPeriodic);
|
||||||
|
}
|
||||||
|
else if (m_spellInfo.HasAttribute(SpellAttr0.Ability))
|
||||||
|
{
|
||||||
|
if (IsPositive())
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulAbility);
|
||||||
|
else
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulAbility);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
procAttacker = new ProcFlagsInit(IsPositive() ? ProcFlags.DoneSpellNoneDmgClassPos : ProcFlags.DoneSpellNoneDmgClassNeg);
|
{
|
||||||
|
if (IsPositive())
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulSpell);
|
||||||
|
else
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulSpell);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Unit.ProcSkillsAndAuras(m_originalCaster, null, procAttacker, new ProcFlagsInit(ProcFlags.None), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.Finish, m_hitMask, this, null, null);
|
Unit.ProcSkillsAndAuras(m_originalCaster, null, procAttacker, new ProcFlagsInit(ProcFlags.None), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.Finish, m_hitMask, this, null, null);
|
||||||
@@ -3294,6 +3309,8 @@ namespace Game.Spells
|
|||||||
if (creatureCaster != null)
|
if (creatureCaster != null)
|
||||||
creatureCaster.ReleaseSpellFocus(this);
|
creatureCaster.ReleaseSpellFocus(this);
|
||||||
|
|
||||||
|
Unit.ProcSkillsAndAuras(unitCaster, null, new ProcFlagsInit(ProcFlags.CastEnded), new ProcFlagsInit(), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.None, ProcFlagsHit.None, this, null, null);
|
||||||
|
|
||||||
if (!ok)
|
if (!ok)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -8225,28 +8242,46 @@ namespace Game.Spells
|
|||||||
|
|
||||||
switch (spell.m_spellInfo.DmgClass)
|
switch (spell.m_spellInfo.DmgClass)
|
||||||
{
|
{
|
||||||
case SpellDmgClass.Magic:
|
|
||||||
if (positive)
|
|
||||||
{
|
|
||||||
procAttacker.Or(ProcFlags.DoneSpellMagicDmgClassPos);
|
|
||||||
procVictim.Or(ProcFlags.TakenSpellMagicDmgClassPos);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
procAttacker.Or(ProcFlags.DoneSpellMagicDmgClassNeg);
|
|
||||||
procVictim.Or(ProcFlags.TakenSpellMagicDmgClassNeg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SpellDmgClass.None:
|
case SpellDmgClass.None:
|
||||||
if (positive)
|
case SpellDmgClass.Magic:
|
||||||
|
if (spell.m_spellInfo.HasAttribute(SpellAttr3.TreatAsPeriodic))
|
||||||
{
|
{
|
||||||
procAttacker.Or(ProcFlags.DoneSpellNoneDmgClassPos);
|
if (positive)
|
||||||
procVictim.Or(ProcFlags.TakenSpellNoneDmgClassPos);
|
{
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulPeriodic);
|
||||||
|
procVictim.Or(ProcFlags.TakeHelpfulPeriodic);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulPeriodic);
|
||||||
|
procVictim.Or(ProcFlags.TakeHarmfulPeriodic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (spell.m_spellInfo.HasAttribute(SpellAttr0.Ability))
|
||||||
|
{
|
||||||
|
if (positive)
|
||||||
|
{
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulAbility);
|
||||||
|
procVictim.Or(ProcFlags.TakeHelpfulAbility);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulAbility);
|
||||||
|
procVictim.Or(ProcFlags.TakeHarmfulAbility);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
procAttacker.Or(ProcFlags.DoneSpellNoneDmgClassNeg);
|
if (positive)
|
||||||
procVictim.Or(ProcFlags.TakenSpellNoneDmgClassNeg);
|
{
|
||||||
|
procAttacker.Or(ProcFlags.DealHelpfulSpell);
|
||||||
|
procVictim.Or(ProcFlags.TakeHelpfulSpell);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
procAttacker.Or(ProcFlags.DealHarmfulSpell);
|
||||||
|
procVictim.Or(ProcFlags.TakeHarmfulSpell);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -8299,7 +8334,7 @@ namespace Game.Spells
|
|||||||
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
|
||||||
|
|
||||||
hitMask |= Unit.CreateProcHitMask(damageInfo, MissCondition);
|
hitMask |= Unit.CreateProcHitMask(damageInfo, MissCondition);
|
||||||
procVictim.Or(ProcFlags.TakenDamage);
|
procVictim.Or(ProcFlags.TakeAnyDamage);
|
||||||
|
|
||||||
spell.m_damage = (int)damageInfo.damage;
|
spell.m_damage = (int)damageInfo.damage;
|
||||||
|
|
||||||
@@ -8931,7 +8966,7 @@ namespace Game.Spells
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
ProcFlags typeMaskActor = ProcFlags.None;
|
ProcFlags typeMaskActor = ProcFlags.None;
|
||||||
ProcFlags typeMaskActionTarget = ProcFlags.TakenSpellMagicDmgClassNeg | ProcFlags.TakenSpellNoneDmgClassNeg;
|
ProcFlags typeMaskActionTarget = ProcFlags.TakeHarmfulSpell | ProcFlags.TakeHarmfulAbility;
|
||||||
ProcFlagsSpellType spellTypeMask = ProcFlagsSpellType.Damage | ProcFlagsSpellType.NoDmgHeal;
|
ProcFlagsSpellType spellTypeMask = ProcFlagsSpellType.Damage | ProcFlagsSpellType.NoDmgHeal;
|
||||||
ProcFlagsSpellPhase spellPhaseMask = ProcFlagsSpellPhase.None;
|
ProcFlagsSpellPhase spellPhaseMask = ProcFlagsSpellPhase.None;
|
||||||
ProcFlagsHit hitMask = ProcFlagsHit.Reflect;
|
ProcFlagsHit hitMask = ProcFlagsHit.Reflect;
|
||||||
|
|||||||
@@ -2620,17 +2620,10 @@ namespace Game.Spells
|
|||||||
|| (spell.GetState() == SpellState.Preparing && spell.GetCastTime() > 0.0f))
|
|| (spell.GetState() == SpellState.Preparing && spell.GetCastTime() > 0.0f))
|
||||||
&& curSpellInfo.CanBeInterrupted(m_caster, unitTarget))
|
&& curSpellInfo.CanBeInterrupted(m_caster, unitTarget))
|
||||||
{
|
{
|
||||||
Unit unitCaster = GetUnitCasterForEffectHandlers();
|
int duration = m_spellInfo.GetDuration();
|
||||||
if (unitCaster != null)
|
duration = unitTarget.ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1u << (int)effectInfo.EffectIndex);
|
||||||
{
|
unitTarget.GetSpellHistory().LockSpellSchool(curSpellInfo.GetSchoolMask(), TimeSpan.FromMilliseconds(duration));
|
||||||
int duration = m_spellInfo.GetDuration();
|
m_hitMask |= ProcFlagsHit.Interrupt;
|
||||||
duration = unitTarget.ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1u << (int)effectInfo.EffectIndex);
|
|
||||||
unitTarget.GetSpellHistory().LockSpellSchool(curSpellInfo.GetSchoolMask(), TimeSpan.FromMilliseconds(duration));
|
|
||||||
if (m_spellInfo.DmgClass == SpellDmgClass.Magic)
|
|
||||||
Unit.ProcSkillsAndAuras(unitCaster, unitTarget, new ProcFlagsInit(ProcFlags.DoneSpellMagicDmgClassNeg), new ProcFlagsInit(ProcFlags.TakenSpellMagicDmgClassNeg), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.Hit, ProcFlagsHit.Interrupt, null, null, null);
|
|
||||||
else if (m_spellInfo.DmgClass == SpellDmgClass.Melee)
|
|
||||||
Unit.ProcSkillsAndAuras(unitCaster, unitTarget, new ProcFlagsInit(ProcFlags.DoneSpellMeleeDmgClass), new ProcFlagsInit(ProcFlags.TakenSpellMeleeDmgClass), ProcFlagsSpellType.MaskAll, ProcFlagsSpellPhase.Hit, ProcFlagsHit.Interrupt, null, null, null);
|
|
||||||
}
|
|
||||||
SendSpellInterruptLog(unitTarget, curSpellInfo.Id);
|
SendSpellInterruptLog(unitTarget, curSpellInfo.Id);
|
||||||
unitTarget.InterruptSpell(i, false);
|
unitTarget.InterruptSpell(i, false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -484,7 +484,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
|
|
||||||
// always trigger for these types
|
// always trigger for these types
|
||||||
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.Killed | ProcFlags.Kill | ProcFlags.Death))
|
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.Heartbeat | ProcFlags.Kill | ProcFlags.Death))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// check school mask (if set) for other trigger types
|
// check school mask (if set) for other trigger types
|
||||||
|
|||||||
@@ -1498,7 +1498,7 @@ namespace Scripts.Spells.Items
|
|||||||
|
|
||||||
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
void HandleProc(AuraEffect aurEff, ProcEventInfo eventInfo)
|
||||||
{
|
{
|
||||||
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.DoneRangedAutoAttack | ProcFlags.DoneSpellRangedDmgClass))
|
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.DealRangedAttack | ProcFlags.DealRangedAbility))
|
||||||
{
|
{
|
||||||
// in that case, do not cast heal spell
|
// in that case, do not cast heal spell
|
||||||
PreventDefaultAction();
|
PreventDefaultAction();
|
||||||
@@ -3191,10 +3191,10 @@ namespace Scripts.Spells.Items
|
|||||||
Unit caster = eventInfo.GetActor();
|
Unit caster = eventInfo.GetActor();
|
||||||
Unit target = eventInfo.GetProcTarget();
|
Unit target = eventInfo.GetProcTarget();
|
||||||
|
|
||||||
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.DoneSpellMagicDmgClassPos))
|
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.DealHelpfulSpell))
|
||||||
caster.CastSpell(target, _healProcSpellId, new CastSpellExtraArgs(aurEff));
|
caster.CastSpell(target, _healProcSpellId, new CastSpellExtraArgs(aurEff));
|
||||||
|
|
||||||
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.DoneSpellMagicDmgClassNeg))
|
if (eventInfo.GetTypeMask().HasFlag(ProcFlags.DealHarmfulSpell))
|
||||||
caster.CastSpell(target, _damageProcSpellId, new CastSpellExtraArgs(aurEff));
|
caster.CastSpell(target, _damageProcSpellId, new CastSpellExtraArgs(aurEff));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user