aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Spells
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-08-20 00:29:57 +0200
committerQAston <qaston@gmail.com>2011-08-20 00:30:38 +0200
commite2d8faea093ab9aeeca1bbd8bba98fb06527a35b (patch)
treee9b760a5496b934d852b8fb52eea6c60710dafbd /src/server/scripts/Spells
parentcd03dadb7fd46f186bb39c6848d553902a48f495 (diff)
Core/Spells: move Cannibalize and Carrion Feeder cast checks to SpellScripts.
Diffstat (limited to 'src/server/scripts/Spells')
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp56
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp18
2 files changed, 72 insertions, 2 deletions
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 48deb028625..3d6b4fba8bc 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -25,6 +25,7 @@
#include "ScriptPCH.h"
#include "SpellAuraEffects.h"
#include "SkillDiscovery.h"
+#include "GridNotifiers.h"
class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
{
@@ -161,6 +162,60 @@ class spell_gen_burn_brutallus : public SpellScriptLoader
}
};
+enum eCannibalizeSpells
+{
+ SPELL_CANNIBALIZE_TRIGGERED = 20578,
+};
+
+class spell_gen_cannibalize : public SpellScriptLoader
+{
+ public:
+ spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { }
+
+ class spell_gen_cannibalize_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_cannibalize_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED))
+ return false;
+ return true;
+ }
+
+ SpellCastResult CheckIfCorpseNear()
+ {
+ Unit* caster = GetCaster();
+ float max_range = GetSpellInfo()->GetMaxRange(false);
+ WorldObject* result = NULL;
+ // search for nearby enemy corpse in range
+ Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_SELECT_CHECK_ENEMY);
+ Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
+ caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
+ if (!result)
+ return SPELL_FAILED_NO_EDIBLE_CORPSES;
+ return SPELL_CAST_OK;
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ caster->CastSpell(caster, SPELL_CANNIBALIZE_TRIGGERED, false);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_cannibalize_SpellScript();
+ }
+};
+
// 45472 Parachute
enum eParachuteSpells
{
@@ -1264,6 +1319,7 @@ void AddSC_generic_spell_scripts()
new spell_gen_aura_of_anger();
new spell_gen_av_drekthar_presence();
new spell_gen_burn_brutallus();
+ new spell_gen_cannibalize();
new spell_gen_leeching_swarm();
new spell_gen_parachute();
new spell_gen_pet_summoned();
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 79f92368ff9..0a81b13ed64 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -23,6 +23,7 @@
#include "ScriptPCH.h"
#include "SpellAuraEffects.h"
+#include "GridNotifiers.h"
enum HunterSpells
{
@@ -468,10 +469,22 @@ public:
return true;
}
+ SpellCastResult CheckIfCorpseNear()
+ {
+ Unit* caster = GetCaster();
+ float max_range = GetSpellInfo()->GetMaxRange(false);
+ WorldObject* result = NULL;
+ // search for nearby enemy corpse in range
+ Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_SELECT_CHECK_ENEMY);
+ Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
+ caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
+ if (!result)
+ return SPELL_FAILED_NO_EDIBLE_CORPSES;
+ return SPELL_CAST_OK;
+ }
+
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (!GetHitUnit())
- return;
Unit* caster = GetCaster();
caster->CastSpell(caster, HUNTER_PET_SPELL_CARRION_FEEDER_TRIGGERED, false);
}
@@ -480,6 +493,7 @@ public:
{
// add dummy effect spell handler to pet's Last Stand
OnEffect += SpellEffectFn(spell_hun_pet_carrion_feeder_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_hun_pet_carrion_feeder_SpellScript::CheckIfCorpseNear);
}
bool Load()