diff options
author | joschiwald <joschiwald.trinity@gmail.com> | 2014-01-30 02:40:12 +0100 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2014-01-30 02:40:12 +0100 |
commit | acd46085d1f496657e27e0d5f823f53d466702dc (patch) | |
tree | 2b489957b50a475d8c410cc4a8ab71097c879714 /src | |
parent | 747184a7c0dc200b9c2c8607a3e1dd990161278e (diff) |
Core/Spells: drop last leftovers of hardcoded spell target selection and move it into spellscripts
Closes #1719
Closes #3186
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 74 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 61 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.h | 3 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 273 |
6 files changed, 277 insertions, 150 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index e72a1da563e..8e0861cdb88 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1171,77 +1171,6 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod; SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), m_spellInfo->Effects[effIndex].ImplicitTargetConditions); - // Custom entries - /// @todo remove those - switch (m_spellInfo->Id) - { - case 46584: // Raise Dead - { - if (Player* playerCaster = m_caster->ToPlayer()) - { - for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) - { - switch ((*itr)->GetTypeId()) - { - case TYPEID_UNIT: - case TYPEID_PLAYER: - { - Unit* unitTarget = (*itr)->ToUnit(); - if (unitTarget->IsAlive() || !playerCaster->isHonorOrXPTarget(unitTarget) - || ((unitTarget->GetCreatureTypeMask() & (1 << (CREATURE_TYPE_HUMANOID-1))) == 0) - || (unitTarget->GetDisplayId() != unitTarget->GetNativeDisplayId())) - break; - AddUnitTarget(unitTarget, effMask, false); - // no break; - } - case TYPEID_CORPSE: // wont work until corpses are allowed in target lists, but at least will send dest in packet - m_targets.SetDst(*(*itr)); - return; // nothing more to do here - default: - break; - } - } - } - return; // don't add targets to target map - } - // Corpse Explosion - case 49158: - case 51325: - case 51326: - case 51327: - case 51328: - // check if our target is not valid (spell can target ghoul or dead unit) - if (!(m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId() && - ((m_targets.GetUnitTarget()->GetEntry() == 26125 && m_targets.GetUnitTarget()->GetOwnerGUID() == m_caster->GetGUID()) - || m_targets.GetUnitTarget()->isDead()))) - { - // remove existing targets - CleanupTargetList(); - - for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) - { - switch ((*itr)->GetTypeId()) - { - case TYPEID_UNIT: - case TYPEID_PLAYER: - if (!(*itr)->ToUnit()->isDead()) - break; - AddUnitTarget((*itr)->ToUnit(), 1 << effIndex, false); - return; - default: - break; - } - } - if (m_caster->GetTypeId() == TYPEID_PLAYER) - m_caster->ToPlayer()->RemoveSpellCooldown(m_spellInfo->Id, true); - SendCastResult(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); - finish(false); - } - return; - default: - break; - } - CallScriptObjectAreaTargetSelectHandlers(targets, effIndex); if (!targets.empty()) @@ -4866,8 +4795,7 @@ SpellCastResult Spell::CheckCast(bool strict) uint32 zone, area; m_caster->GetZoneAndAreaId(zone, area); - SpellCastResult locRes= m_spellInfo->CheckLocation(m_caster->GetMapId(), zone, area, - m_caster->GetTypeId() == TYPEID_PLAYER ? m_caster->ToPlayer() : NULL); + SpellCastResult locRes = m_spellInfo->CheckLocation(m_caster->GetMapId(), zone, area, m_caster->ToPlayer()); if (locRes != SPELL_CAST_OK) return locRes; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 76be075e94d..031311f2749 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -557,7 +557,7 @@ class Spell GameObject* focusObject; // Damage and healing in effects need just calculate - int32 m_damage; // Damge in effects count here + int32 m_damage; // Damage in effects count here int32 m_healing; // Healing in effects count here // ****************************************** diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index b2b4690f893..19cc2fe95c5 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -682,11 +682,6 @@ void Spell::EffectDummy(SpellEffIndex effIndex) if (!unitTarget && !gameObjTarget && !itemTarget) return; - uint32 spell_id = 0; - int32 bp = 0; - bool triggered = true; - SpellCastTargets targets; - // selection by spell family switch (m_spellInfo->SpellFamilyName) { @@ -723,60 +718,10 @@ void Spell::EffectDummy(SpellEffIndex effIndex) } } break; - case SPELLFAMILY_DEATHKNIGHT: - switch (m_spellInfo->Id) - { - case 46584: // Raise Dead - if (m_caster->GetTypeId() != TYPEID_PLAYER) - return; - - // Do we have talent Master of Ghouls? - if (m_caster->HasAura(52143)) - // summon as pet - bp = 52150; - else - // or guardian - bp = 46585; - - if (m_targets.HasDst()) - targets.SetDst(*m_targets.GetDstPos()); - else - { - targets.SetDst(*m_caster); - // Corpse not found - take reagents (only not triggered cast can take them) - triggered = false; - } - // Remove cooldown - summon spellls have category - m_caster->ToPlayer()->RemoveSpellCooldown(m_spellInfo->Id, true); - spell_id = 48289; - break; - // Raise dead - take reagents and trigger summon spells - case 48289: - if (m_targets.HasDst()) - targets.SetDst(*m_targets.GetDstPos()); - spell_id = CalculateDamage(0, NULL); - break; - } + default: break; } - //spells triggered by dummy effect should not miss - if (spell_id) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id); - - if (!spellInfo) - { - TC_LOG_ERROR("spells", "EffectDummy of spell %u: triggering unknown spell id %i\n", m_spellInfo->Id, spell_id); - return; - } - - targets.SetUnitTarget(unitTarget); - Spell* spell = new Spell(m_caster, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, m_originalCasterGUID, true); - if (bp) spell->SetSpellValue(SPELLVALUE_BASE_POINT0, bp); - spell->prepare(&targets); - } - // pet auras if (PetAura const* petSpell = sSpellMgr->GetPetAura(m_spellInfo->Id, effIndex)) { @@ -910,7 +855,7 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) { - TC_LOG_DEBUG("spells", "Spell::EffectTriggerSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "Spell::EffectTriggerSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); return; } @@ -962,7 +907,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) { - TC_LOG_DEBUG("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); return; } diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index c7eebb495c0..d984dbc8901 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -576,16 +576,26 @@ void SpellScript::PreventHitDefaultEffect(SpellEffIndex effIndex) m_hitPreventDefaultEffectMask |= 1 << effIndex; } -int32 SpellScript::GetEffectValue() +int32 SpellScript::GetEffectValue() const { if (!IsInEffectHook()) { - TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::PreventHitDefaultEffect was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId); + TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::GetEffectValue was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId); return 0; } return m_spell->damage; } +void SpellScript::SetEffectValue(int32 value) +{ + if (!IsInEffectHook()) + { + TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::SetEffectValue was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId); + return; + } + m_spell->damage = value; +} + Item* SpellScript::GetCastItem() { return m_spell->m_CastItem; diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index dfa494e38e6..6378a8bed9b 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -411,7 +411,8 @@ class SpellScript : public _SpellScript void PreventHitDefaultEffect(SpellEffIndex effIndex); // method avalible only in EffectHandler method - int32 GetEffectValue(); + int32 GetEffectValue() const; + void SetEffectValue(int32 value); // returns: cast item if present. Item* GetCastItem(); diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index e2e4d30541c..e8108f03e7d 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -25,6 +25,7 @@ #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "Containers.h" enum DeathKnightSpells { @@ -49,6 +50,8 @@ enum DeathKnightSpells SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED = 63622, SPELL_DK_ITEM_SIGIL_VENGEFUL_HEART = 64962, SPELL_DK_ITEM_T8_MELEE_4P_BONUS = 64736, + SPELL_DK_MASTER_OF_GHOULS = 52143, + SPELL_DK_RAISE_DEAD_USE_REAGENT = 48289, SPELL_DK_RUNIC_POWER_ENERGIZE = 49088, SPELL_DK_SCENT_OF_BLOOD = 50422, SPELL_DK_SCOURGE_STRIKE_TRIGGERED = 70890, @@ -63,6 +66,11 @@ enum DeathKnightSpellIcons DK_ICON_ID_IMPROVED_DEATH_STRIKE = 2751 }; +enum Misc +{ + NPC_DK_GHOUL = 26125 +}; + // 50462 - Anti-Magic Shell (on raid member) class spell_dk_anti_magic_shell_raid : public SpellScriptLoader { @@ -311,6 +319,28 @@ class spell_dk_blood_gorged : public SpellScriptLoader } }; +class CorpseExplosionCheck +{ +public: + explicit CorpseExplosionCheck(uint64 casterGUID) : _casterGUID(casterGUID) { } + + bool operator()(WorldObject* obj) const + { + if (Unit* target = obj->ToUnit()) + { + if ((target->isDead() || (target->GetEntry() == NPC_DK_GHOUL && target->GetOwnerGUID() == _casterGUID)) + && !(target->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) + && target->GetDisplayId() == target->GetNativeDisplayId()) + return false; + } + + return true; + } + +private: + uint64 _casterGUID; +}; + // 49158 - Corpse Explosion (51325, 51326, 51327, 51328) class spell_dk_corpse_explosion : public SpellScriptLoader { @@ -321,41 +351,87 @@ class spell_dk_corpse_explosion : public SpellScriptLoader { PrepareSpellScript(spell_dk_corpse_explosion_SpellScript); - bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + bool Validate(SpellInfo const* spellInfo) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE)) - return false; - if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_VISUAL)) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) + || !sSpellMgr->GetSpellInfo(SPELL_DK_GHOUL_EXPLODE) + || !sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_VISUAL) + || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue())) return false; return true; } - void HandleDummy(SpellEffIndex /*effIndex*/) + bool Load() OVERRIDE + { + _target = NULL; + return true; + } + + void CheckTarget(WorldObject*& target) + { + if (CorpseExplosionCheck(GetCaster()->GetGUID())(target)) + target = NULL; + + _target = target; + } + + void CheckTargets(std::list<WorldObject*>& targets) + { + WorldObject* target = _target; + if (!target) + { + targets.remove_if(CorpseExplosionCheck(GetCaster()->GetGUID())); + if (targets.empty()) + { + FinishCast(SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW); + return; + } + target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + else + targets.clear(); + } + + void HandleDamage(SpellEffIndex effIndex, Unit* target) + { + if (effIndex == EFFECT_0) + GetCaster()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, GetEffectValue(), target, true); + else if (effIndex == EFFECT_1) + GetCaster()->CastCustomSpell(GetEffectValue(), SPELLVALUE_BASE_POINT0, GetSpell()->CalculateDamage(EFFECT_0, NULL), target, true); + } + + void HandleCorpseExplosion(SpellEffIndex effIndex) { if (Unit* unitTarget = GetHitUnit()) { - int32 bp = 0; if (unitTarget->IsAlive()) // Living ghoul as a target { - bp = int32(unitTarget->CountPctFromMaxHealth(25)); - unitTarget->CastCustomSpell(unitTarget, SPELL_DK_GHOUL_EXPLODE, &bp, NULL, NULL, false); + unitTarget->CastSpell(unitTarget, SPELL_DK_GHOUL_EXPLODE, false); + // Corpse Explosion (Suicide) and Set corpse look handled in SpellScript of SPELL_DK_GHOUL_EXPLODE } else // Some corpse { - bp = GetEffectValue(); - GetCaster()->CastCustomSpell(unitTarget, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), &bp, NULL, NULL, true); + HandleDamage(effIndex, unitTarget); // Corpse Explosion (Suicide) unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); + // Set corpse look + GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); } - // Set corpse look - GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); } } void Register() OVERRIDE { - OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTarget, EFFECT_0, TARGET_UNIT_TARGET_ANY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_corpse_explosion_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_0, SPELL_EFFECT_DUMMY); + OnEffectHitTarget += SpellEffectFn(spell_dk_corpse_explosion_SpellScript::HandleCorpseExplosion, EFFECT_1, SPELL_EFFECT_DUMMY); } + + private: + WorldObject* _target; }; SpellScript* GetSpellScript() const OVERRIDE @@ -616,24 +692,34 @@ class spell_dk_ghoul_explode : public SpellScriptLoader { PrepareSpellScript(spell_dk_ghoul_explode_SpellScript); - bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + bool Validate(SpellInfo const* spellInfo) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED)) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_CORPSE_EXPLOSION_TRIGGERED) + || spellInfo->Effects[EFFECT_2].CalcValue() <= 0) return false; return true; } + void HandleDamage(SpellEffIndex /*effIndex*/) + { + int32 value = int32(GetCaster()->CountPctFromMaxHealth(GetSpellInfo()->Effects[EFFECT_2].CalcValue(GetCaster()))); + SetEffectValue(value); + } + void Suicide(SpellEffIndex /*effIndex*/) { if (Unit* unitTarget = GetHitUnit()) { // Corpse Explosion (Suicide) unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true); + // Set corpse look + GetCaster()->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_VISUAL, true); } } void Register() OVERRIDE { + OnEffectLaunchTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); OnEffectHitTarget += SpellEffectFn(spell_dk_ghoul_explode_SpellScript::Suicide, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); } }; @@ -940,6 +1026,162 @@ class spell_dk_presence : public SpellScriptLoader } }; +class RaiseDeadCheck +{ + public: + explicit RaiseDeadCheck(Player const* caster) : _caster(caster) { } + + bool operator()(WorldObject* obj) const + { + if (Unit* target = obj->ToUnit()) + { + if (!target->IsAlive() + && _caster->isHonorOrXPTarget(target) + && target->GetCreatureType() == CREATURE_TYPE_HUMANOID + && target->GetDisplayId() == target->GetNativeDisplayId()) + return false; + } + + return true; + } + + private: + Player const* _caster; +}; + +// 46584 - Raise Dead +class spell_dk_raise_dead : public SpellScriptLoader +{ + public: + spell_dk_raise_dead() : SpellScriptLoader("spell_dk_raise_dead") { } + + class spell_dk_raise_dead_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dk_raise_dead_SpellScript); + + bool Validate(SpellInfo const* spellInfo) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].CalcValue()) + || !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_2].CalcValue()) + || !sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT) + || !sSpellMgr->GetSpellInfo(SPELL_DK_MASTER_OF_GHOULS)) + return false; + return true; + } + + bool Load() OVERRIDE + { + _result = SPELL_CAST_OK; + _corpse = false; + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + SpellCastResult CheckCast() + { + /// process spell target selection before cast starts + /// targets of effect_1 are used to check cast + GetSpell()->SelectSpellTargets(); + /// cleanup spell target map, and fill it again on normal way + GetSpell()->CleanupTargetList(); + /// _result is set in spell target selection + return _result; + } + + SpellCastResult CheckReagents() + { + /// @workaround: there is no access to castresult of other spells, check it manually + SpellInfo const* reagentSpell = sSpellMgr->GetSpellInfo(SPELL_DK_RAISE_DEAD_USE_REAGENT); + Player* player = GetCaster()->ToPlayer(); + if (!player->CanNoReagentCast(reagentSpell)) + { + for (uint32 i = 0; i < MAX_SPELL_REAGENTS; i++) + { + if (reagentSpell->Reagent[i] <= 0) + continue; + + if (!player->HasItemCount(reagentSpell->Reagent[i], reagentSpell->ReagentCount[i])) + { + Spell::SendCastResult(player, reagentSpell, 0, SPELL_FAILED_REAGENTS); + return SPELL_FAILED_DONT_REPORT; + } + } + } + return SPELL_CAST_OK; + } + + void CheckTargets(std::list<WorldObject*>& targets) + { + targets.remove_if(RaiseDeadCheck(GetCaster()->ToPlayer())); + + if (targets.empty()) + { + if (GetSpell()->getState() == SPELL_STATE_PREPARING) + _result = CheckReagents(); + + return; + } + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + _corpse = true; + } + + void CheckTarget(WorldObject*& target) + { + // Don't add caster to target map, if we found a corpse to raise dead + if (_corpse) + target = NULL; + } + + void ConsumeReagents() + { + // No corpse found, take reagents + if (!_corpse) + GetCaster()->CastSpell(GetCaster(), SPELL_DK_RAISE_DEAD_USE_REAGENT, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_POWER_AND_REAGENT_COST)); + } + + uint32 GetGhoulSpellId() + { + // Do we have talent Master of Ghouls? + if (GetCaster()->HasAura(SPELL_DK_MASTER_OF_GHOULS)) + // summon as pet + return GetSpellInfo()->Effects[EFFECT_2].CalcValue(); + + // or guardian + return GetSpellInfo()->Effects[EFFECT_1].CalcValue(); + } + + void HandleRaiseDead(SpellEffIndex /*effIndex*/) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetGhoulSpellId()); + SpellCastTargets targets; + targets.SetDst(*GetHitUnit()); + + GetCaster()->CastSpell(targets, spellInfo, NULL, TRIGGERED_FULL_MASK); + } + + void Register() OVERRIDE + { + OnCheckCast += SpellCheckCastFn(spell_dk_raise_dead_SpellScript::CheckCast); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENTRY); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_raise_dead_SpellScript::CheckTarget, EFFECT_2, TARGET_UNIT_CASTER); + OnCast += SpellCastFn(spell_dk_raise_dead_SpellScript::ConsumeReagents); + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead_SpellScript::HandleRaiseDead, EFFECT_2, SPELL_EFFECT_DUMMY); + } + + private: + SpellCastResult _result; + bool _corpse; + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_dk_raise_dead_SpellScript(); + } +}; + // 59754 Rune Tap - Party class spell_dk_rune_tap_party : public SpellScriptLoader { @@ -1224,6 +1466,7 @@ void AddSC_deathknight_spell_scripts() new spell_dk_improved_frost_presence(); new spell_dk_improved_unholy_presence(); new spell_dk_presence(); + new spell_dk_raise_dead(); new spell_dk_rune_tap_party(); new spell_dk_scent_of_blood(); new spell_dk_scourge_strike(); |