/* This file is part of the ScriptDev2 Project. See AUTHORS file for Copyright information
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Spell_Scripts
SD%Complete: 100
SDComment: Spell scripts for dummy effects (if script need access/interaction with parts of other AI or instance, add it in related source files)
SDCategory: Spell
EndScriptData */
/* ContentData
spell 8913
spell 19512
spell 21014
spell 21050
spell 29528
spell 29866
spell 34665
spell 37136
spell 39246
spell 44935
spell 45109
spell 45111
EndContentData */
#include "precompiled.h"
/* When you make a spell effect:
- always check spell id and effect index
- always return true when the spell is handled by script
*/
enum
{
// quest 9452
SPELL_CAST_FISHING_NET = 29866,
GO_RED_SNAPPER = 181616,
NPC_ANGRY_MURLOC = 17102,
ITEM_RED_SNAPPER = 23614,
// SPELL_SUMMON_TEST = 49214 // ! Just wrong spell name? It summon correct creature (17102)but does not appear to be used.
};
bool EffectDummyGameObj_spell_dummy_go(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, GameObject* pGOTarget, ObjectGuid /*originalCasterGuid*/)
{
switch (uiSpellId)
{
case SPELL_CAST_FISHING_NET:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pGOTarget->GetRespawnTime() != 0 || pGOTarget->GetEntry() != GO_RED_SNAPPER || pCaster->GetTypeId() != TYPEID_PLAYER)
return true;
if (urand(0, 2))
{
if (Creature* pMurloc = pCaster->SummonCreature(NPC_ANGRY_MURLOC, pCaster->GetPositionX(), pCaster->GetPositionY() + 20.0f, pCaster->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OOC_DESPAWN, 10000))
pMurloc->AI()->AttackStart(pCaster);
}
else
{
if (Item* pItem = ((Player*)pCaster)->StoreNewItemInInventorySlot(ITEM_RED_SNAPPER, 1))
((Player*)pCaster)->SendNewItem(pItem, 1, true, false);
}
pGOTarget->SetLootState(GO_JUST_DEACTIVATED);
return true;
}
return true;
}
}
return false;
}
enum
{
// quest 9629
SPELL_TAG_MURLOC = 30877,
SPELL_TAG_MURLOC_PROC = 30875,
NPC_BLACKSILT_MURLOC = 17326,
NPC_TAGGED_MURLOC = 17654,
// quest 9447
SPELL_HEALING_SALVE = 29314,
SPELL_HEALING_SALVE_DUMMY = 29319,
NPC_MAGHAR_GRUNT = 16846,
// quest 10190
SPELL_RECHARGING_BATTERY = 34219,
NPC_DRAINED_PHASE_HUNTER = 19595,
// target hulking helboar
SPELL_ADMINISTER_ANTIDOTE = 34665,
NPC_HELBOAR = 16880,
NPC_DREADTUSK = 16992,
// quest 6124/6129
SPELL_APPLY_SALVE = 19512,
SPELL_SICKLY_AURA = 19502,
NPC_SICKLY_DEER = 12298,
NPC_SICKLY_GAZELLE = 12296,
NPC_CURED_DEER = 12299,
NPC_CURED_GAZELLE = 12297,
// target morbent fel
SPELL_SACRED_CLEANSING = 8913,
NPC_MORBENT = 1200,
NPC_WEAKENED_MORBENT = 24782,
// quest 11515
SPELL_FEL_SIPHON_DUMMY = 44936,
NPC_FELBLOOD_INITIATE = 24918,
NPC_EMACIATED_FELBLOOD = 24955,
// target nestlewood owlkin
SPELL_INOCULATE_OWLKIN = 29528,
NPC_OWLKIN = 16518,
NPC_OWLKIN_INOC = 16534,
// Quest "Disrupt the Greengill Coast" (11541)
SPELL_ORB_OF_MURLOC_CONTROL = 45109,
SPELL_GREENGILL_SLAVE_FREED = 45110,
SPELL_ENRAGE = 45111,
NPC_FREED_GREENGILL_SLAVE = 25085,
NPC_DARKSPINE_MYRMIDON = 25060,
NPC_DARKSPINE_SIREN = 25073,
// quest "The Big Bone Worm" 10930
SPELL_FUMPING = 39246,
SPELL_SUMMON_HAISHULUD = 39248,
NPC_SAND_GNOME = 22483,
NPC_MATURE_BONE_SIFTER = 22482,
// quest 9849, item 24501
SPELL_THROW_GORDAWG_BOULDER = 32001,
NPC_MINION_OF_GUROK = 18181,
// npcs that are only interactable while dead
SPELL_SHROUD_OF_DEATH = 10848,
SPELL_SPIRIT_PARTICLES = 17327,
NPC_FRANCLORN_FORGEWRIGHT = 8888,
NPC_GAERIYAN = 9299,
// quest 11521
SPELL_EXPOSE_RAZORTHORN_ROOT = 44935,
SPELL_SUMMON_RAZORTHORN_ROOT = 44941,
NPC_RAZORTHORN_RAVAGER = 24922,
GO_RAZORTHORN_DIRT_MOUND = 187073,
// for quest 10584
SPELL_PROTOVOLTAIC_MAGNETO_COLLECTOR = 37136,
NPC_ENCASED_ELECTROMENTAL = 21731,
// quest 6661
SPELL_MELODIOUS_RAPTURE = 21050,
SPELL_MELODIOUS_RAPTURE_VISUAL = 21051,
NPC_DEEPRUN_RAT = 13016,
NPC_ENTHRALLED_DEEPRUN_RAT = 13017,
};
bool EffectAuraDummy_spell_aura_dummy_npc(const Aura* pAura, bool bApply)
{
switch (pAura->GetId())
{
case SPELL_HEALING_SALVE:
{
if (pAura->GetEffIndex() != EFFECT_INDEX_0)
return true;
if (bApply)
{
if (Unit* pCaster = pAura->GetCaster())
pCaster->CastSpell(pAura->GetTarget(), SPELL_HEALING_SALVE_DUMMY, true);
}
return true;
}
case SPELL_HEALING_SALVE_DUMMY:
{
if (pAura->GetEffIndex() != EFFECT_INDEX_0)
return true;
if (!bApply)
{
Creature* pCreature = (Creature*)pAura->GetTarget();
pCreature->UpdateEntry(NPC_MAGHAR_GRUNT);
if (pCreature->getStandState() == UNIT_STAND_STATE_KNEEL)
pCreature->SetStandState(UNIT_STAND_STATE_STAND);
pCreature->ForcedDespawn(60 * IN_MILLISECONDS);
}
return true;
}
case SPELL_RECHARGING_BATTERY:
{
if (pAura->GetEffIndex() != EFFECT_INDEX_0)
return true;
if (!bApply)
{
if (pAura->GetTarget()->HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT))
((Creature*)pAura->GetTarget())->UpdateEntry(NPC_DRAINED_PHASE_HUNTER);
}
return true;
}
case SPELL_TAG_MURLOC:
{
Creature* pCreature = (Creature*)pAura->GetTarget();
if (pAura->GetEffIndex() != EFFECT_INDEX_0)
return true;
if (bApply)
{
if (pCreature->GetEntry() == NPC_BLACKSILT_MURLOC)
{
if (Unit* pCaster = pAura->GetCaster())
pCaster->CastSpell(pCreature, SPELL_TAG_MURLOC_PROC, true);
}
}
else
{
if (pCreature->GetEntry() == NPC_TAGGED_MURLOC)
pCreature->ForcedDespawn();
}
return true;
}
case SPELL_ENRAGE:
{
if (!bApply || pAura->GetTarget()->GetTypeId() != TYPEID_UNIT)
return false;
Creature* pTarget = (Creature*)pAura->GetTarget();
if (Creature* pCreature = GetClosestCreatureWithEntry(pTarget, NPC_DARKSPINE_MYRMIDON, 25.0f))
{
pTarget->AI()->AttackStart(pCreature);
return true;
}
if (Creature* pCreature = GetClosestCreatureWithEntry(pTarget, NPC_DARKSPINE_SIREN, 25.0f))
{
pTarget->AI()->AttackStart(pCreature);
return true;
}
return false;
}
case SPELL_SHROUD_OF_DEATH:
case SPELL_SPIRIT_PARTICLES:
{
Creature* pCreature = (Creature*)pAura->GetTarget();
if (!pCreature || (pCreature->GetEntry() != NPC_FRANCLORN_FORGEWRIGHT && pCreature->GetEntry() != NPC_GAERIYAN))
return false;
if (bApply)
pCreature->m_AuraFlags |= UNIT_AURAFLAG_ALIVE_INVISIBLE;
else
pCreature->m_AuraFlags &= ~UNIT_AURAFLAG_ALIVE_INVISIBLE;
return false;
}
case SPELL_PROTOVOLTAIC_MAGNETO_COLLECTOR:
{
if (pAura->GetEffIndex() != EFFECT_INDEX_0)
return true;
Unit* pTarget = pAura->GetTarget();
if (bApply && pTarget->GetTypeId() == TYPEID_UNIT)
((Creature*)pTarget)->UpdateEntry(NPC_ENCASED_ELECTROMENTAL);
return true;
}
}
return false;
}
bool EffectDummyCreature_spell_dummy_npc(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Creature* pCreatureTarget, ObjectGuid /*originalCasterGuid*/)
{
switch (uiSpellId)
{
case SPELL_ADMINISTER_ANTIDOTE:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pCreatureTarget->GetEntry() != NPC_HELBOAR)
return true;
// possible needs check for quest state, to not have any effect when quest really complete
pCreatureTarget->UpdateEntry(NPC_DREADTUSK);
return true;
}
return true;
}
case SPELL_APPLY_SALVE:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pCaster->GetTypeId() != TYPEID_PLAYER)
return true;
if (pCreatureTarget->GetEntry() != NPC_SICKLY_DEER && pCreatureTarget->GetEntry() != NPC_SICKLY_GAZELLE)
return true;
// Update entry, remove aura, set the kill credit and despawn
uint32 uiUpdateEntry = pCreatureTarget->GetEntry() == NPC_SICKLY_DEER ? NPC_CURED_DEER : NPC_CURED_GAZELLE;
pCreatureTarget->RemoveAurasDueToSpell(SPELL_SICKLY_AURA);
pCreatureTarget->UpdateEntry(uiUpdateEntry);
((Player*)pCaster)->KilledMonsterCredit(uiUpdateEntry);
pCreatureTarget->ForcedDespawn(20000);
return true;
}
return true;
}
case SPELL_INOCULATE_OWLKIN:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pCreatureTarget->GetEntry() != NPC_OWLKIN)
return true;
pCreatureTarget->UpdateEntry(NPC_OWLKIN_INOC);
((Player*)pCaster)->KilledMonsterCredit(NPC_OWLKIN_INOC);
// set despawn timer, since we want to remove creature after a short time
pCreatureTarget->ForcedDespawn(15000);
return true;
}
return true;
}
case SPELL_FEL_SIPHON_DUMMY:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pCreatureTarget->GetEntry() != NPC_FELBLOOD_INITIATE)
return true;
pCreatureTarget->UpdateEntry(NPC_EMACIATED_FELBLOOD);
return true;
}
return true;
}
case SPELL_SACRED_CLEANSING:
{
if (uiEffIndex == EFFECT_INDEX_1)
{
if (pCreatureTarget->GetEntry() != NPC_MORBENT)
return true;
pCreatureTarget->UpdateEntry(NPC_WEAKENED_MORBENT);
return true;
}
return true;
}
case SPELL_TAG_MURLOC_PROC:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pCreatureTarget->GetEntry() == NPC_BLACKSILT_MURLOC)
pCreatureTarget->UpdateEntry(NPC_TAGGED_MURLOC);
}
return true;
}
case SPELL_ORB_OF_MURLOC_CONTROL:
{
pCreatureTarget->CastSpell(pCaster, SPELL_GREENGILL_SLAVE_FREED, true);
// Freed Greengill Slave
pCreatureTarget->UpdateEntry(NPC_FREED_GREENGILL_SLAVE);
pCreatureTarget->CastSpell(pCreatureTarget, SPELL_ENRAGE, true);
return true;
}
case SPELL_FUMPING:
{
if (uiEffIndex == EFFECT_INDEX_2)
{
switch (urand(0, 2))
{
case 0:
{
pCaster->CastSpell(pCreatureTarget, SPELL_SUMMON_HAISHULUD, true);
break;
}
case 1:
{
for (int i = 0; i < 2; ++i)
{
if (Creature* pSandGnome = pCaster->SummonCreature(NPC_SAND_GNOME, pCreatureTarget->GetPositionX(), pCreatureTarget->GetPositionY(), pCreatureTarget->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OOC_DESPAWN, 30000))
pSandGnome->AI()->AttackStart(pCaster);
}
break;
}
case 2:
{
for (int i = 0; i < 2; ++i)
{
if (Creature* pMatureBoneSifter = pCaster->SummonCreature(NPC_MATURE_BONE_SIFTER, pCreatureTarget->GetPositionX(), pCreatureTarget->GetPositionY(), pCreatureTarget->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OOC_DESPAWN, 30000))
pMatureBoneSifter->AI()->AttackStart(pCaster);
}
break;
}
}
pCreatureTarget->ForcedDespawn();
}
return true;
}
case SPELL_THROW_GORDAWG_BOULDER:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
for (int i = 0; i < 3; ++i)
{
if (irand(i, 2)) // 2-3 summons
pCreatureTarget->SummonCreature(NPC_MINION_OF_GUROK, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 5000);
}
if (pCreatureTarget->getVictim())
{
pCaster->DealDamage(pCreatureTarget, pCreatureTarget->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
return true;
}
// If not in combat, no xp or loot
pCreatureTarget->SetDeathState(JUST_DIED);
pCreatureTarget->SetHealth(0);
return true;
}
return true;
}
case SPELL_EXPOSE_RAZORTHORN_ROOT:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pCreatureTarget->GetEntry() != NPC_RAZORTHORN_RAVAGER)
return true;
if (GameObject* pMound = GetClosestGameObjectWithEntry(pCreatureTarget, GO_RAZORTHORN_DIRT_MOUND, 20.0f))
{
if (pMound->GetRespawnTime() != 0)
return true;
pCreatureTarget->CastSpell(pCreatureTarget, SPELL_SUMMON_RAZORTHORN_ROOT, true);
pMound->SetLootState(GO_JUST_DEACTIVATED);
}
}
return true;
}
case SPELL_MELODIOUS_RAPTURE:
{
if (uiEffIndex == EFFECT_INDEX_0)
{
if (pCaster->GetTypeId() != TYPEID_PLAYER && pCreatureTarget->GetEntry() != NPC_DEEPRUN_RAT)
return true;
pCreatureTarget->UpdateEntry(NPC_ENTHRALLED_DEEPRUN_RAT);
pCreatureTarget->CastSpell(pCreatureTarget, SPELL_MELODIOUS_RAPTURE_VISUAL, false);
pCreatureTarget->GetMotionMaster()->MoveFollow(pCaster, frand(0.5f, 3.0f), frand(M_PI_F * 0.8f, M_PI_F * 1.2f));
((Player*)pCaster)->KilledMonsterCredit(NPC_ENTHRALLED_DEEPRUN_RAT);
}
return true;
}
}
return false;
}
void AddSC_spell_scripts()
{
Script* pNewScript;
pNewScript = new Script;
pNewScript->Name = "spell_dummy_go";
pNewScript->pEffectDummyGO = &EffectDummyGameObj_spell_dummy_go;
pNewScript->RegisterSelf();
pNewScript = new Script;
pNewScript->Name = "spell_dummy_npc";
pNewScript->pEffectDummyNPC = &EffectDummyCreature_spell_dummy_npc;
pNewScript->pEffectAuraDummy = &EffectAuraDummy_spell_aura_dummy_npc;
pNewScript->RegisterSelf();
}