/* Copyright (C) 2006 - 2009 ScriptDev2 * 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: Desolace SD%Complete: 100 SDComment: Quest support: 5561 SDCategory: Desolace EndScriptData */ /* ContentData npc_aged_dying_ancient_kodo EndContentData */ #include "ScriptedPch.h" enum eDyingKodo { // signed for 9999 SAY_SMEED_HOME_1 = -1000428, SAY_SMEED_HOME_2 = -1000429, SAY_SMEED_HOME_3 = -1000430, QUEST_KODO = 5561, NPC_SMEED = 11596, NPC_AGED_KODO = 4700, NPC_DYING_KODO = 4701, NPC_ANCIENT_KODO = 4702, NPC_TAMED_KODO = 11627, SPELL_KODO_KOMBO_ITEM = 18153, SPELL_KODO_KOMBO_PLAYER_BUFF = 18172, //spells here have unclear function, but using them at least for visual parts and checks SPELL_KODO_KOMBO_DESPAWN_BUFF = 18377, SPELL_KODO_KOMBO_GOSSIP = 18362 }; struct npc_aged_dying_ancient_kodoAI : public ScriptedAI { npc_aged_dying_ancient_kodoAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } uint32 m_uiDespawnTimer; void Reset() { m_uiDespawnTimer = 0; } void MoveInLineOfSight(Unit* pWho) { if (pWho->GetEntry() == NPC_SMEED) { if (m_creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) return; if (m_creature->IsWithinDistInMap(pWho, 10.0f)) { DoScriptText(RAND(SAY_SMEED_HOME_1,SAY_SMEED_HOME_2,SAY_SMEED_HOME_3), pWho); //spell have no implemented effect (dummy), so useful to notify spellHit DoCast(m_creature, SPELL_KODO_KOMBO_GOSSIP, true); } } } void SpellHit(Unit* pCaster, SpellEntry const* pSpell) { if (pSpell->Id == SPELL_KODO_KOMBO_GOSSIP) { m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); m_uiDespawnTimer = 60000; } } void UpdateAI(const uint32 diff) { //timer should always be == 0 unless we already updated entry of creature. Then not expect this updated to ever be in combat. if (m_uiDespawnTimer && m_uiDespawnTimer <= diff) { if (!m_creature->getVictim() && m_creature->isAlive()) { Reset(); m_creature->setDeathState(JUST_DIED); m_creature->Respawn(); return; } } else m_uiDespawnTimer -= diff; if (!UpdateVictim()) return; DoMeleeAttackIfReady(); } }; CreatureAI* GetAI_npc_aged_dying_ancient_kodo(Creature* pCreature) { return new npc_aged_dying_ancient_kodoAI(pCreature); } bool EffectDummyCreature_npc_aged_dying_ancient_kodo(Unit *pCaster, uint32 spellId, uint32 effIndex, Creature *pCreatureTarget) { //always check spellid and effectindex if (spellId == SPELL_KODO_KOMBO_ITEM && effIndex == 0) { //no effect if player/creature already have aura from spells if (pCaster->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) || pCreatureTarget->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) return true; if (pCreatureTarget->GetEntry() == NPC_AGED_KODO || pCreatureTarget->GetEntry() == NPC_DYING_KODO || pCreatureTarget->GetEntry() == NPC_ANCIENT_KODO) { pCaster->CastSpell(pCaster,SPELL_KODO_KOMBO_PLAYER_BUFF,true); pCreatureTarget->UpdateEntry(NPC_TAMED_KODO); pCreatureTarget->CastSpell(pCreatureTarget,SPELL_KODO_KOMBO_DESPAWN_BUFF,false); if (pCreatureTarget->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) pCreatureTarget->GetMotionMaster()->MoveIdle(); pCreatureTarget->GetMotionMaster()->MoveFollow(pCaster, PET_FOLLOW_DIST, pCreatureTarget->GetFollowAngle()); } //always return true when we are handling this spell and effect return true; } return false; } bool GossipHello_npc_aged_dying_ancient_kodo(Player* pPlayer, Creature* pCreature) { if (pPlayer->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && pCreature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF)) { //the expected quest objective pPlayer->TalkedToCreature(pCreature->GetEntry(), pCreature->GetGUID()); pPlayer->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF); pCreature->GetMotionMaster()->MoveIdle(); } pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID()); return true; } /*###### ## go_iruxos. Quest 5381 ######*/ bool GOHello_go_iruxos(Player *pPlayer, GameObject* pGO) { if (pPlayer->GetQuestStatus(5381) == QUEST_STATUS_INCOMPLETE) pPlayer->SummonCreature(11876, pPlayer->GetInnPosX(),pPlayer->GetInnPosY(),pPlayer->GetInnPosZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); return true; } void AddSC_desolace() { Script *newscript; newscript = new Script; newscript->Name = "npc_aged_dying_ancient_kodo"; newscript->GetAI = &GetAI_npc_aged_dying_ancient_kodo; newscript->pEffectDummyCreature = &EffectDummyCreature_npc_aged_dying_ancient_kodo; newscript->pGossipHello = &GossipHello_npc_aged_dying_ancient_kodo; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "go_iruxos"; newscript->pGOHello = &GOHello_go_iruxos; newscript->RegisterSelf(); }