diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Handlers/LootHandler.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 140 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.h | 133 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_item.cpp | 6 |
9 files changed, 190 insertions, 152 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bc725a0a529..407cfc9cb46 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -26509,6 +26509,8 @@ void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore cons Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomBonusListId, GuidSet(), lootItem->context, lootItem->BonusListIDs); SendNewItem(pItem, lootItem->count, false, createdByPlayer, broadcast); } + + Unit::ProcSkillsAndAuras(this, nullptr, PROC_FLAG_LOOTED, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); } void Player::StoreLootItem(uint8 lootSlot, Loot* loot, AELootResult* aeResult/* = nullptr*/) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index bc133cc31ec..cce8a554c4e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1224,12 +1224,12 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon switch (attackType) { case BASE_ATTACK: - damageInfo->ProcAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_MAINHAND_ATTACK; - damageInfo->ProcVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + damageInfo->ProcAttacker = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_MAIN_HAND_WEAPON_SWING; + damageInfo->ProcVictim = PROC_FLAG_TAKE_MELEE_SWING; break; case OFF_ATTACK: - damageInfo->ProcAttacker = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK; - damageInfo->ProcVictim = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + damageInfo->ProcAttacker = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_OFF_HAND_WEAPON_SWING; + damageInfo->ProcVictim = PROC_FLAG_TAKE_MELEE_SWING; damageInfo->HitInfo = HITINFO_OFFHAND; break; default: @@ -1372,7 +1372,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon // Calculate absorb resist if (int32(damageInfo->Damage) > 0) { - damageInfo->ProcVictim |= PROC_FLAG_TAKEN_DAMAGE; + damageInfo->ProcVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; // Calculate absorb & resists DamageInfo dmgInfo(*damageInfo); Unit::CalcAbsorbResist(dmgInfo); @@ -1933,7 +1933,7 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit caster->SendSpellNonMeleeDamageLog(&log); // break 'Fear' and similar auras - Unit::ProcSkillsAndAuras(damageInfo.GetAttacker(), caster, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_SPELL_TYPE_DAMAGE, PROC_SPELL_PHASE_HIT, PROC_HIT_NONE, nullptr, &damageInfo, nullptr); + Unit::ProcSkillsAndAuras(damageInfo.GetAttacker(), caster, PROC_FLAG_NONE, PROC_FLAG_TAKE_HARMFUL_SPELL, PROC_SPELL_TYPE_DAMAGE, PROC_SPELL_PHASE_HIT, PROC_HIT_NONE, nullptr, &damageInfo, nullptr); } } } @@ -10571,7 +10571,7 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) if (!victim->IsCritter()) { - Unit::ProcSkillsAndAuras(attacker, victim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); + Unit::ProcSkillsAndAuras(attacker, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); if (player && player->GetGroup()) for (GroupReference* itr = player->GetGroup()->GetFirstMember(); itr != nullptr; itr = itr->next()) diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 42db7477f10..771b40d1b7f 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -34,6 +34,7 @@ #include "Object.h" #include "ObjectAccessor.h" #include "Player.h" +#include "SpellMgr.h" #include "WorldPacket.h" class AELootCreatureCheck @@ -140,6 +141,8 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPackets::Loot::LootItem& p player->UpdateCriteria(CriteriaType::LootAnyItem, resultValue.item->GetEntry(), resultValue.count); } } + + Unit::ProcSkillsAndAuras(player, nullptr, PROC_FLAG_LOOTED, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, nullptr, nullptr, nullptr); } void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet*/) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 814b99ebb6b..99f8414d47a 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5324,13 +5324,13 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const Unit::DealDamageMods(caster, target, damage, &absorb); // Set trigger flag - ProcFlagsInit procAttacker = PROC_FLAG_DONE_PERIODIC; - ProcFlagsInit procVictim = PROC_FLAG_TAKEN_PERIODIC; + ProcFlagsInit procAttacker = PROC_FLAG_DEAL_HARMFUL_PERIODIC; + ProcFlagsInit procVictim = PROC_FLAG_TAKE_HARMFUL_PERIODIC; ProcFlagsHit hitMask = damageInfo.GetHitMask(); if (damage) { hitMask |= crit ? PROC_HIT_CRITICAL : PROC_HIT_NORMAL; - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; } int32 overkill = damage - target->GetHealth(); @@ -5420,13 +5420,13 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c log.HitInfo |= SPELL_HIT_TYPE_CRIT; // Set trigger flag - ProcFlagsInit procAttacker = PROC_FLAG_DONE_PERIODIC; - ProcFlagsInit procVictim = PROC_FLAG_TAKEN_PERIODIC; + ProcFlagsInit procAttacker = PROC_FLAG_DEAL_HARMFUL_PERIODIC; + ProcFlagsInit procVictim = PROC_FLAG_TAKE_HARMFUL_PERIODIC; ProcFlagsHit hitMask = damageInfo.GetHitMask(); if (damage) { hitMask |= crit ? PROC_HIT_CRITICAL : PROC_HIT_NORMAL; - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; } int32 new_damage = Unit::DealDamage(caster, target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), false); @@ -5445,7 +5445,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c caster->HealBySpell(healInfo); caster->GetThreatManager().ForwardThreatForAssistingMe(caster, healInfo.GetEffectiveHeal() * 0.5f, GetSpellInfo()); - Unit::ProcSkillsAndAuras(caster, caster, PROC_FLAG_DONE_PERIODIC, PROC_FLAG_TAKEN_PERIODIC, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, hitMask, nullptr, nullptr, &healInfo); + Unit::ProcSkillsAndAuras(caster, caster, PROC_FLAG_DEAL_HARMFUL_PERIODIC, PROC_FLAG_TAKE_HARMFUL_PERIODIC, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, hitMask, nullptr, nullptr, &healInfo); caster->SendSpellNonMeleeDamageLog(&log); } @@ -5477,7 +5477,7 @@ void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) HealInfo healInfo(caster, target, damage, GetSpellInfo(), GetSpellInfo()->GetSchoolMask()); caster->HealBySpell(healInfo); - Unit::ProcSkillsAndAuras(caster, target, PROC_FLAG_DONE_PERIODIC, PROC_FLAG_TAKEN_PERIODIC, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, PROC_HIT_NORMAL, nullptr, nullptr, &healInfo); + Unit::ProcSkillsAndAuras(caster, target, PROC_FLAG_DEAL_HARMFUL_PERIODIC, PROC_FLAG_TAKE_HARMFUL_PERIODIC, PROC_SPELL_TYPE_HEAL, PROC_SPELL_PHASE_HIT, PROC_HIT_NORMAL, nullptr, nullptr, &healInfo); } void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const @@ -5534,8 +5534,8 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const if (GetAuraType() == SPELL_AURA_OBS_MOD_HEALTH) return; - ProcFlagsInit procAttacker = PROC_FLAG_DONE_PERIODIC; - ProcFlagsInit procVictim = PROC_FLAG_TAKEN_PERIODIC; + ProcFlagsInit procAttacker = PROC_FLAG_DEAL_HARMFUL_PERIODIC; + ProcFlagsInit procVictim = PROC_FLAG_TAKE_HARMFUL_PERIODIC; ProcFlagsHit hitMask = crit ? PROC_HIT_CRITICAL : PROC_HIT_NORMAL; // ignore item heals if (GetBase()->GetCastItemGUID().IsEmpty()) @@ -5696,13 +5696,13 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con Unit::DealDamageMods(damageInfo.attacker, damageInfo.target, damageInfo.damage, &damageInfo.absorb); // Set trigger flag - ProcFlagsInit procAttacker = PROC_FLAG_DONE_PERIODIC; - ProcFlagsInit procVictim = PROC_FLAG_TAKEN_PERIODIC; + ProcFlagsInit procAttacker = PROC_FLAG_DEAL_HARMFUL_PERIODIC; + ProcFlagsInit procVictim = PROC_FLAG_TAKE_HARMFUL_PERIODIC; ProcFlagsHit hitMask = createProcHitMask(&damageInfo, SPELL_MISS_NONE); ProcFlagsSpellType spellTypeMask = PROC_SPELL_TYPE_NO_DMG_HEAL; if (damageInfo.damage) { - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; spellTypeMask |= PROC_SPELL_TYPE_DAMAGE; } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 60e4e568402..69db8b9c1fa 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2151,24 +2151,24 @@ void Spell::prepareDataForTriggerSystem() switch (m_spellInfo->DmgClass) { case SPELL_DAMAGE_CLASS_MELEE: - m_procAttacker = PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS; + m_procAttacker = PROC_FLAG_DEAL_MELEE_ABILITY; if (m_attackType == OFF_ATTACK) - m_procAttacker |= PROC_FLAG_DONE_OFFHAND_ATTACK; + m_procAttacker |= PROC_FLAG_OFF_HAND_WEAPON_SWING; else - m_procAttacker |= PROC_FLAG_DONE_MAINHAND_ATTACK; - m_procVictim = PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS; + m_procAttacker |= PROC_FLAG_MAIN_HAND_WEAPON_SWING; + m_procVictim = PROC_FLAG_TAKE_MELEE_ABILITY; break; case SPELL_DAMAGE_CLASS_RANGED: // Auto attack if (m_spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG)) { - m_procAttacker = PROC_FLAG_DONE_RANGED_AUTO_ATTACK; - m_procVictim = PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK; + m_procAttacker = PROC_FLAG_DEAL_RANGED_ATTACK; + m_procVictim = PROC_FLAG_TAKE_RANGED_ATTACK; } else // Ranged spell attack { - m_procAttacker = PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS; - m_procVictim = PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS; + m_procAttacker = PROC_FLAG_DEAL_RANGED_ABILITY; + m_procVictim = PROC_FLAG_TAKE_RANGED_ABILITY; } break; default: @@ -2176,32 +2176,12 @@ void Spell::prepareDataForTriggerSystem() m_spellInfo->EquippedItemSubClassMask & (1 << ITEM_SUBCLASS_WEAPON_WAND) && m_spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG)) // Wands auto attack { - m_procAttacker = PROC_FLAG_DONE_RANGED_AUTO_ATTACK; - m_procVictim = PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK; + m_procAttacker = PROC_FLAG_DEAL_RANGED_ATTACK; + m_procVictim = PROC_FLAG_TAKE_RANGED_ATTACK; } // For other spells trigger procflags are set in Spell::TargetInfo::DoDamageAndTriggers // Because spell positivity is dependant on target } - - // Hunter trap spells - activation proc for Lock and Load, Entrapment and Misdirection - if (m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER && - (m_spellInfo->SpellFamilyFlags[0] & 0x18 || // Freezing and Frost Trap, Freezing Arrow - m_spellInfo->Id == 57879 || // Snake Trap - done this way to avoid double proc - m_spellInfo->SpellFamilyFlags[2] & 0x00024000)) // Explosive and Immolation Trap - { - m_procAttacker |= PROC_FLAG_DONE_TRAP_ACTIVATION; - - // also fill up other flags (TargetInfo::DoDamageAndTriggers only fills up flag if both are not set) - m_procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG; - m_procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG; - } - - // Hellfire Effect - trigger as DOT - if (m_spellInfo->SpellFamilyName == SPELLFAMILY_WARLOCK && m_spellInfo->SpellFamilyFlags[0] & 0x00000040) - { - m_procAttacker = PROC_FLAG_DONE_PERIODIC; - m_procVictim = PROC_FLAG_TAKEN_PERIODIC; - } } void Spell::CleanupTargetList() @@ -2224,7 +2204,7 @@ class ProcReflectDelayed : public BasicEvent return true; ProcFlags const typeMaskActor = PROC_FLAG_NONE; - ProcFlags const typeMaskActionTarget = PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG; + ProcFlags const typeMaskActionTarget = PROC_FLAG_TAKE_HARMFUL_SPELL | PROC_FLAG_TAKE_HARMFUL_ABILITY; ProcFlagsSpellType const spellTypeMask = PROC_SPELL_TYPE_DAMAGE | PROC_SPELL_TYPE_NO_DMG_HEAL; ProcFlagsSpellPhase const spellPhaseMask = PROC_SPELL_PHASE_NONE; ProcFlagsHit const hitMask = PROC_HIT_REFLECT; @@ -2628,28 +2608,46 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) switch (spell->m_spellInfo->DmgClass) { + case SPELL_DAMAGE_CLASS_NONE: case SPELL_DAMAGE_CLASS_MAGIC: - if (positive) - { - procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS; - procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS; - } - else + if (spell->m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC)) { - procAttacker |= PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG; - procVictim |= PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG; + if (positive) + { + procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC; + procVictim |= PROC_FLAG_TAKE_HELPFUL_PERIODIC; + } + else + { + procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC; + procVictim |= PROC_FLAG_TAKE_HARMFUL_PERIODIC; + } } - break; - case SPELL_DAMAGE_CLASS_NONE: - if (positive) + else if (spell->m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) { - procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS; - procVictim |= PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS; + if (positive) + { + procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY; + procVictim |= PROC_FLAG_TAKE_HELPFUL_ABILITY; + } + else + { + procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY; + procVictim |= PROC_FLAG_TAKE_HARMFUL_ABILITY; + } } else { - procAttacker |= PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG; - procVictim |= PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG; + if (positive) + { + procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL; + procVictim |= PROC_FLAG_TAKE_HELPFUL_SPELL; + } + else + { + procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL; + procVictim |= PROC_FLAG_TAKE_HARMFUL_SPELL; + } } break; } @@ -2702,7 +2700,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) Unit::DealDamageMods(damageInfo.attacker, damageInfo.target, damageInfo.damage, &damageInfo.absorb); hitMask |= createProcHitMask(&damageInfo, MissCondition); - procVictim |= PROC_FLAG_TAKEN_DAMAGE; + procVictim |= PROC_FLAG_TAKE_ANY_DAMAGE; spell->m_damage = damageInfo.damage; @@ -3691,10 +3689,27 @@ void Spell::_cast(bool skipCheck) ProcFlagsInit procAttacker = m_procAttacker; if (!procAttacker) { - if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC) - procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG; + if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC)) + { + if (IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC; + } + else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) + { + if (IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY; + } else - procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG; + { + if (IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL; + } } procAttacker |= PROC_FLAG_2_CAST_SUCCESSFUL; @@ -3952,10 +3967,27 @@ void Spell::_handle_finish_phase() ProcFlagsInit procAttacker = m_procAttacker; if (!procAttacker) { - if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC) - procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG; + if (m_spellInfo->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC)) + { + if (IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_PERIODIC; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_PERIODIC; + } + else if (m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)) + { + if (IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_ABILITY; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_ABILITY; + } else - procAttacker = IsPositive() ? PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS : PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG; + { + if (IsPositive()) + procAttacker |= PROC_FLAG_DEAL_HELPFUL_SPELL; + else + procAttacker |= PROC_FLAG_DEAL_HARMFUL_SPELL; + } } Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_FINISH, m_hitMask, this, nullptr, nullptr); @@ -4093,6 +4125,8 @@ void Spell::finish(bool ok) if (Creature* creatureCaster = unitCaster->ToCreature()) creatureCaster->ReleaseSpellFocus(this); + Unit::ProcSkillsAndAuras(unitCaster, nullptr, PROC_FLAG_CAST_ENDED, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, this, nullptr, nullptr); + if (!ok) return; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 67c667b268e..99c54857502 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2928,18 +2928,10 @@ void Spell::EffectInterruptCast() || (spell->getState() == SPELL_STATE_PREPARING && spell->GetCastTime() > 0.0f)) && curSpellInfo->CanBeInterrupted(m_caster, unitTarget)) { - if (Unit* unitCaster = GetUnitCasterForEffectHandlers()) - { - int32 duration = m_spellInfo->GetDuration(); - duration = unitTarget->ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1 << effectInfo->EffectIndex); - unitTarget->GetSpellHistory()->LockSpellSchool(curSpellInfo->GetSchoolMask(), Milliseconds(duration)); - if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC) - Unit::ProcSkillsAndAuras(unitCaster, unitTarget, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, - PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_HIT, PROC_HIT_INTERRUPT, nullptr, nullptr, nullptr); - else if (m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE) - Unit::ProcSkillsAndAuras(unitCaster, unitTarget, PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS, PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS, - PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_HIT, PROC_HIT_INTERRUPT, nullptr, nullptr, nullptr); - } + int32 duration = m_spellInfo->GetDuration(); + duration = unitTarget->ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1 << effectInfo->EffectIndex); + unitTarget->GetSpellHistory()->LockSpellSchool(curSpellInfo->GetSchoolMask(), Milliseconds(duration)); + m_hitMask |= PROC_HIT_INTERRUPT; SendSpellInterruptLog(unitTarget, curSpellInfo->Id); unitTarget->InterruptSpell(CurrentSpellTypes(i), false); } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 864985a6444..fa7fd7c0357 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -532,7 +532,7 @@ bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcE } // always trigger for these types - if (eventInfo.GetTypeMask() & (PROC_FLAG_KILLED | PROC_FLAG_KILL | PROC_FLAG_DEATH)) + if (eventInfo.GetTypeMask() & (PROC_FLAG_HEARTBEAT | PROC_FLAG_KILL | PROC_FLAG_DEATH)) return true; // check school mask (if set) for other trigger types diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 8ee2aed0b81..6e1fe9ea80e 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -136,86 +136,93 @@ enum ProcFlags : uint32 { PROC_FLAG_NONE = 0x00000000, - PROC_FLAG_KILLED = 0x00000001, // 00 Killed by agressor - not sure about this flag + PROC_FLAG_HEARTBEAT = 0x00000001, // 00 Killed by agressor - not sure about this flag PROC_FLAG_KILL = 0x00000002, // 01 Kill target (in most cases need XP/Honor reward) - PROC_FLAG_DONE_MELEE_AUTO_ATTACK = 0x00000004, // 02 Done melee auto attack - PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK = 0x00000008, // 03 Taken melee auto attack + PROC_FLAG_DEAL_MELEE_SWING = 0x00000004, // 02 Done melee auto attack + PROC_FLAG_TAKE_MELEE_SWING = 0x00000008, // 03 Taken melee auto attack - PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS = 0x00000010, // 04 Done attack by Spell that has dmg class melee - PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS = 0x00000020, // 05 Taken attack by Spell that has dmg class melee + PROC_FLAG_DEAL_MELEE_ABILITY = 0x00000010, // 04 Done attack by Spell that has dmg class melee + PROC_FLAG_TAKE_MELEE_ABILITY = 0x00000020, // 05 Taken attack by Spell that has dmg class melee - PROC_FLAG_DONE_RANGED_AUTO_ATTACK = 0x00000040, // 06 Done ranged auto attack - PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK = 0x00000080, // 07 Taken ranged auto attack + PROC_FLAG_DEAL_RANGED_ATTACK = 0x00000040, // 06 Done ranged auto attack + PROC_FLAG_TAKE_RANGED_ATTACK = 0x00000080, // 07 Taken ranged auto attack - PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS = 0x00000100, // 08 Done attack by Spell that has dmg class ranged - PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS = 0x00000200, // 09 Taken attack by Spell that has dmg class ranged + PROC_FLAG_DEAL_RANGED_ABILITY = 0x00000100, // 08 Done attack by Spell that has dmg class ranged + PROC_FLAG_TAKE_RANGED_ABILITY = 0x00000200, // 09 Taken attack by Spell that has dmg class ranged - PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS = 0x00000400, // 10 Done positive spell that has dmg class none - PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS = 0x00000800, // 11 Taken positive spell that has dmg class none + PROC_FLAG_DEAL_HELPFUL_ABILITY = 0x00000400, // 10 Done positive spell that has dmg class none + PROC_FLAG_TAKE_HELPFUL_ABILITY = 0x00000800, // 11 Taken positive spell that has dmg class none - PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG = 0x00001000, // 12 Done negative spell that has dmg class none - PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG = 0x00002000, // 13 Taken negative spell that has dmg class none + PROC_FLAG_DEAL_HARMFUL_ABILITY = 0x00001000, // 12 Done negative spell that has dmg class none + PROC_FLAG_TAKE_HARMFUL_ABILITY = 0x00002000, // 13 Taken negative spell that has dmg class none - PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS = 0x00004000, // 14 Done positive spell that has dmg class magic - PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS = 0x00008000, // 15 Taken positive spell that has dmg class magic + PROC_FLAG_DEAL_HELPFUL_SPELL = 0x00004000, // 14 Done positive spell that has dmg class magic + PROC_FLAG_TAKE_HELPFUL_SPELL = 0x00008000, // 15 Taken positive spell that has dmg class magic - PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG = 0x00010000, // 16 Done negative spell that has dmg class magic - PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG = 0x00020000, // 17 Taken negative spell that has dmg class magic + PROC_FLAG_DEAL_HARMFUL_SPELL = 0x00010000, // 16 Done negative spell that has dmg class magic + PROC_FLAG_TAKE_HARMFUL_SPELL = 0x00020000, // 17 Taken negative spell that has dmg class magic - PROC_FLAG_DONE_PERIODIC = 0x00040000, // 18 Successful do periodic (damage / healing) - PROC_FLAG_TAKEN_PERIODIC = 0x00080000, // 19 Taken spell periodic (damage / healing) + PROC_FLAG_DEAL_HARMFUL_PERIODIC = 0x00040000, // 18 Successful do periodic (damage) + PROC_FLAG_TAKE_HARMFUL_PERIODIC = 0x00080000, // 19 Taken spell periodic (damage) - PROC_FLAG_TAKEN_DAMAGE = 0x00100000, // 20 Taken any damage - PROC_FLAG_DONE_TRAP_ACTIVATION = 0x00200000, // 21 On trap activation (possibly needs name change to ON_GAMEOBJECT_CAST or USE) + PROC_FLAG_TAKE_ANY_DAMAGE = 0x00100000, // 20 Taken any damage - PROC_FLAG_DONE_MAINHAND_ATTACK = 0x00400000, // 22 Done main-hand melee attacks (spell and autoattack) - PROC_FLAG_DONE_OFFHAND_ATTACK = 0x00800000, // 23 Done off-hand melee attacks (spell and autoattack) + PROC_FLAG_DEAL_HELPFUL_PERIODIC = 0x00200000, // 21 On trap activation (possibly needs name change to ON_GAMEOBJECT_CAST or USE) + + PROC_FLAG_MAIN_HAND_WEAPON_SWING = 0x00400000, // 22 Done main-hand melee attacks (spell and autoattack) + PROC_FLAG_OFF_HAND_WEAPON_SWING = 0x00800000, // 23 Done off-hand melee attacks (spell and autoattack) PROC_FLAG_DEATH = 0x01000000, // 24 Died in any way + PROC_FLAG_JUMP = 0x02000000, // 25 Jumped + PROC_FLAG_PROC_CLONE_SPELL = 0x04000000, // 26 Proc Clone Spell + PROC_FLAG_ENTER_COMBAT = 0x08000000, // 27 Entered combat + PROC_FLAG_ENCOUNTER_START = 0x10000000, // 28 Encounter started PROC_FLAG_CAST_ENDED = 0x20000000, // 29 Cast Ended + PROC_FLAG_LOOTED = 0x40000000, // 30 Looted (took from loot, not opened loot window) PROC_FLAG_TAKE_HELPFUL_PERIODIC = 0x80000000, // 31 Take Helpful Periodic // flag masks - AUTO_ATTACK_PROC_FLAG_MASK = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK - | PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK, - - MELEE_PROC_FLAG_MASK = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS - | PROC_FLAG_DONE_MAINHAND_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK, - - RANGED_PROC_FLAG_MASK = PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS, - - SPELL_PROC_FLAG_MASK = PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS - | PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS - | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS - | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG - | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS - | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG - | PROC_FLAG_DONE_PERIODIC | PROC_FLAG_TAKEN_PERIODIC - | PROC_FLAG_DONE_TRAP_ACTIVATION, - - DONE_HIT_PROC_FLAG_MASK = PROC_FLAG_DONE_MELEE_AUTO_ATTACK | PROC_FLAG_DONE_RANGED_AUTO_ATTACK - | PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS - | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG - | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG - | PROC_FLAG_DONE_PERIODIC | PROC_FLAG_DONE_TRAP_ACTIVATION - | PROC_FLAG_DONE_MAINHAND_ATTACK | PROC_FLAG_DONE_OFFHAND_ATTACK, - - TAKEN_HIT_PROC_FLAG_MASK = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK | PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK - | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS | PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS - | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG - | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG - | PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_TAKEN_DAMAGE, + AUTO_ATTACK_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_TAKE_MELEE_SWING + | PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_TAKE_RANGED_ATTACK, + + MELEE_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_TAKE_MELEE_SWING + | PROC_FLAG_DEAL_MELEE_ABILITY | PROC_FLAG_TAKE_MELEE_ABILITY + | PROC_FLAG_MAIN_HAND_WEAPON_SWING | PROC_FLAG_OFF_HAND_WEAPON_SWING, + + RANGED_PROC_FLAG_MASK = PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_TAKE_RANGED_ATTACK + | PROC_FLAG_DEAL_RANGED_ABILITY | PROC_FLAG_TAKE_RANGED_ABILITY, + + SPELL_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_ABILITY | PROC_FLAG_TAKE_MELEE_ABILITY + | PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_TAKE_RANGED_ATTACK + | PROC_FLAG_DEAL_RANGED_ABILITY | PROC_FLAG_TAKE_RANGED_ABILITY + | PROC_FLAG_DEAL_HELPFUL_ABILITY | PROC_FLAG_TAKE_HELPFUL_ABILITY + | PROC_FLAG_DEAL_HARMFUL_ABILITY | PROC_FLAG_TAKE_HARMFUL_ABILITY + | PROC_FLAG_DEAL_HELPFUL_SPELL | PROC_FLAG_TAKE_HELPFUL_SPELL + | PROC_FLAG_DEAL_HARMFUL_SPELL | PROC_FLAG_TAKE_HARMFUL_SPELL + | PROC_FLAG_DEAL_HARMFUL_PERIODIC | PROC_FLAG_TAKE_HARMFUL_PERIODIC + | PROC_FLAG_DEAL_HELPFUL_PERIODIC | PROC_FLAG_TAKE_HELPFUL_PERIODIC, + + DONE_HIT_PROC_FLAG_MASK = PROC_FLAG_DEAL_MELEE_SWING | PROC_FLAG_DEAL_RANGED_ATTACK + | PROC_FLAG_DEAL_MELEE_ABILITY | PROC_FLAG_DEAL_RANGED_ABILITY + | PROC_FLAG_DEAL_HELPFUL_ABILITY | PROC_FLAG_DEAL_HARMFUL_ABILITY + | PROC_FLAG_DEAL_HELPFUL_SPELL | PROC_FLAG_DEAL_HARMFUL_SPELL + | PROC_FLAG_DEAL_HARMFUL_PERIODIC | PROC_FLAG_DEAL_HELPFUL_PERIODIC + | PROC_FLAG_MAIN_HAND_WEAPON_SWING | PROC_FLAG_OFF_HAND_WEAPON_SWING, + + TAKEN_HIT_PROC_FLAG_MASK = PROC_FLAG_TAKE_MELEE_SWING | PROC_FLAG_TAKE_RANGED_ATTACK + | PROC_FLAG_TAKE_MELEE_ABILITY | PROC_FLAG_TAKE_RANGED_ABILITY + | PROC_FLAG_TAKE_HELPFUL_ABILITY | PROC_FLAG_TAKE_HARMFUL_ABILITY + | PROC_FLAG_TAKE_HELPFUL_SPELL | PROC_FLAG_TAKE_HARMFUL_SPELL + | PROC_FLAG_TAKE_HARMFUL_PERIODIC | PROC_FLAG_TAKE_HELPFUL_PERIODIC + | PROC_FLAG_TAKE_ANY_DAMAGE, REQ_SPELL_PHASE_PROC_FLAG_MASK = SPELL_PROC_FLAG_MASK & DONE_HIT_PROC_FLAG_MASK }; @@ -232,14 +239,14 @@ enum ProcFlags2 : int32 DEFINE_ENUM_FLAG(ProcFlags2); -#define MELEE_BASED_TRIGGER_MASK (PROC_FLAG_DONE_MELEE_AUTO_ATTACK | \ - PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK | \ - PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS | \ - PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS | \ - PROC_FLAG_DONE_RANGED_AUTO_ATTACK | \ - PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK | \ - PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS | \ - PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS) +#define MELEE_BASED_TRIGGER_MASK (PROC_FLAG_DEAL_MELEE_SWING | \ + PROC_FLAG_TAKE_MELEE_SWING | \ + PROC_FLAG_DEAL_MELEE_ABILITY | \ + PROC_FLAG_TAKE_MELEE_ABILITY | \ + PROC_FLAG_DEAL_RANGED_ATTACK | \ + PROC_FLAG_TAKE_RANGED_ATTACK | \ + PROC_FLAG_DEAL_RANGED_ABILITY | \ + PROC_FLAG_TAKE_RANGED_ABILITY) enum ProcFlagsSpellType : uint32 { diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index a034330a837..355155d67ed 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -1331,7 +1331,7 @@ class spell_item_mark_of_conquest : public AuraScript void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) { - if (eventInfo.GetTypeMask() & (PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS)) + if (eventInfo.GetTypeMask() & (PROC_FLAG_DEAL_RANGED_ATTACK | PROC_FLAG_DEAL_RANGED_ABILITY)) { // in that case, do not cast heal spell PreventDefaultAction(); @@ -3485,10 +3485,10 @@ class spell_item_shard_of_the_scale : public SpellScriptLoader Unit* caster = eventInfo.GetActor(); Unit* target = eventInfo.GetProcTarget(); - if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) + if (eventInfo.GetTypeMask() & PROC_FLAG_DEAL_HELPFUL_SPELL) caster->CastSpell(target, HealProc, aurEff); - if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG) + if (eventInfo.GetTypeMask() & PROC_FLAG_DEAL_HARMFUL_SPELL) caster->CastSpell(target, DamageProc, aurEff); } |