diff --git a/data/sql/updates/pending_db_world/rev_1740153600000000000.sql b/data/sql/updates/pending_db_world/rev_1740153600000000000.sql new file mode 100644 index 000000000..54c12d40a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1740153600000000000.sql @@ -0,0 +1,3 @@ +-- Lock and Load: allow periodic tick procs (Black Arrow, Explosive Trap) +-- SpellPhaseMask 6 = PROC_SPELL_PHASE_HIT | PROC_SPELL_PHASE_FINISH +UPDATE `spell_proc` SET `SpellPhaseMask` = 6 WHERE `SpellId` = -56342; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index fb9b33958..9a1c2dc5e 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -719,6 +719,7 @@ Spell::~Spell() void Spell::InitExplicitTargets(SpellCastTargets const& targets) { m_targets = targets; + m_originalTargetGUID = targets.GetObjectTargetGUID(); // this function tries to correct spell explicit targets for spell // client doesn't send explicit targets correctly sometimes - we need to fix such spells serverside // this also makes sure that we correctly send explicit targets to client (removes redundant data) @@ -7855,6 +7856,11 @@ void Spell::DelayedChannel() SendChannelUpdate(m_timer); } +Unit* Spell::GetOriginalTarget() const +{ + return ObjectAccessor::GetUnit(*m_caster, m_originalTargetGUID); +} + bool Spell::UpdatePointers() { if (m_originalCasterGUID == m_caster->GetGUID()) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index cb3f89540..a23d3b43c 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -585,6 +585,7 @@ public: Unit* GetCaster() const { return m_caster; } Unit* GetOriginalCaster() const { return m_originalCaster; } + Unit* GetOriginalTarget() const; SpellInfo const* GetSpellInfo() const { return m_spellInfo; } int32 GetPowerCost() const { return m_powerCost; } @@ -621,6 +622,8 @@ public: // e.g. damage around area spell trigered by victim aura and damage enemies of aura caster Unit* m_originalCaster; // cached pointer for m_originalCaster, updated at Spell::UpdatePointers() + ObjectGuid m_originalTargetGUID; // unit target saved before InitExplicitTargets strips it + Spell** m_selfContainer; // pointer to our spell container (if applicable) std::string GetDebugInfo() const; diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 860415bcf..74ffa2b77 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -67,6 +67,7 @@ enum HunterSpells SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT = 61389, SPELL_LOCK_AND_LOAD_TRIGGER = 56453, SPELL_LOCK_AND_LOAD_MARKER = 67544, + SPELL_FROST_TRAP_SLOW = 67035, SPELL_HUNTER_PET_LEGGINGS_OF_BEAST_MASTERY = 38297, // Leggings of Beast Mastery // Proc system spells @@ -1177,7 +1178,8 @@ class spell_hun_lock_and_load : public AuraScript return ValidateSpellInfo( { SPELL_LOCK_AND_LOAD_TRIGGER, - SPELL_LOCK_AND_LOAD_MARKER + SPELL_LOCK_AND_LOAD_MARKER, + SPELL_FROST_TRAP_SLOW }); } @@ -1197,6 +1199,13 @@ class spell_hun_lock_and_load : public AuraScript if (!spellInfo || !(spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_FIRE))) return false; + // TODO: Research whether Lock and Load should proc on targets + // immune to Frost Trap slow (bosses) in WotLK 3.3.5a. + // if (Spell const* procSpell = eventInfo.GetProcSpell()) + // if (Unit* target = procSpell->GetOriginalTarget()) + // if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(SPELL_FROST_TRAP_SLOW))) + // return false; + return roll_chance_i(aurEff->GetAmount()); }