Public feed #726862

Deedee/Jaina Proudmoore Script

public cpp v1 · immutable
Raw Edit
·published 2007-10-05 15:36 UTC
rendered paste body
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>* 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*//****************************** *  Another Script still      * *   under development!       * ******************************///Todo: Confirmation on Timers, see UpdateAI.#include "../../../sc_defines.h"#include "../../../../../../game/Player.h"#include "../../../../../../game/GossipDef.h"#define SOUND_INCOMING          11008 //Stay alert! Another wave approaches!#define SOUND_DEATH             11010 //I did... My best.#define SOUND_RALLY_ONE         11006 //Don't give up! We must prevail!#define SOUND_RALLY_TWO         11050 //Hold them back as long as possible!#define SOUND_RALLY_THREE       11051 //We must hold strong!#define SOUND_ATTACKED_ONE      11007 //I'm in jeopardy! Help me if you can!#define SOUND_ATTACKED_TWO      11049 //They've broken through!#define SOUND_RETREAT           11009 //We are lost! Fall back!#define SOUND_WIN               11011 //We have won valuable time! Now we must pull back!#define GOSSIP_ITEM             "Start first encounter <Needs Gossip Text>"#define GOSSIP_ITEM_TWO         "Start second encounter <Needs Gossip Text>"#define GOSSIP_ITEM_THREE       "Vanish Alliance NPCs <Needs Gossip Text>"#define CREATURE_ABOMINATION            17898#define CREATURE_GHOUL                  17895#define CREATURE_SHADOWY_NECROMANCER    17899#define CREATURE_CRYPT_FIEND            17897//Todo: The other mobs for other encounter#define CREATURE_RAGE_WINTERCHILL       17767//Alot of coords, as we use random spots for spawning...#define SPAWN_MIN_X 4900#define SPAWN_MIN_Y -1675//...btw, we use diff to simplify the rand() function...#define SPAWN_DIFF_X 20#define SPAWN_DIFF_Y 20#define SPAWN_Z 1322#define SPAWN_ORIENTATION 5.800//...and we move to the camp (see void SpawnMonster()).#define CAMP_MIN_X 5018#define CAMP_MIN_Y -1745#define CAMP_DIFF_X 17#define CAMP_DIFF_Y 13#define CAMP_Z 1324//Todo: Spells for Jaina//#define SPELL_SHADOWBOLT                21077struct MANGOS_DLL_DECL npc_jaina_proudmooreAI : public ScriptedAI{    npc_jaina_proudmooreAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();}        uint32 WaveTimer;    uint32 RageWinterchillGUID    uint32 TrashWave;    uint32 BossEncounter;    void EnterEvadeMode()    {        m_creature->RemoveAllAuras();        m_creature->DeleteThreatList();        m_creature->CombatStop();        DoGoHome();        if (BossEncounter != 1 && BossEncounter != 2 && BossEncounter != 3)        {            //No Encounter active, so we can talk to start first encounter.            BossEncounter = 0;        }        if (TrashWave != 10)        {            RageWinterchillGUID = 0;        }                }        void BeginEncounter(uint32 Encounter)    {        //10 secs before we start to spawn        WaveTimer = 10000;        //First trash wave coming up!        TrashWave = 1;                BossEncounter == Encounter;    }    void SpawnMonster(uint32 CreatureEntry)	{        Creature* Spawned = NULL;                //Use "random coords" to not let all mobs spawn at the same place        float SpawnX = (rand()%SPAWN_DIFF_X) + SPAWN_MIN_X;        float SpawnY = (rand()%SPAWN_DIFF_Y) + SPAWN_MIN_Y;        float SpawnZ = SPAWN_Z;        float SpawnOrientation = SPAWN_ORIENTATION;                Spawned = m_creature->SummonCreature(CreatureEntry,SpawnX,SpawnY,SpawnZ,SpawnOrientation,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,120000);        //Be sure to setFaction(1720) <--Hyjal Invaders        Spawned->setFaction(1720);                //Make them move towards the camp (random coords again)!        float CampX = (rand()%CAMP_DIFF_X) + CAMP_MIN_X;        float CampY = (rand()%CAMP_DIFF_Y) + CAMP_MIN_Y;        float CampZ = CAMP_Z;                //Oh wait, let's do some maths to calculate the time we need, thanks draenei script        float dx = CampX - SpawnX;        float dy = CampY - SpawnY;        float dz = CampZ - SpawnZ;        double dist = ::sqrt((dx*dx) + (dy*dy) + (dz*dz));        double speed = Spawned->GetSpeed(MOVE_RUN);                if(speed<=0)            speed = 2.5f;        speed *= 0.001f;                uint32 TotalTime = static_cast<uint32>( dist/speed + 0.5 );                Spawned->SendMonsterMove(CampX,CampY,CampZ,0,true,TotalTime);    }        void AttackStart(Unit *who)    {        if (!who)            return;        if (who->isTargetableForAttack() && who!= m_creature)        {            //Begin melee attack if we are within range            DoStartMeleeAttack(who);        }    }    void MoveInLineOfSight(Unit *who)    {        //We simply use this function to find players until we can use Map->GetPlayers()        if (who && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsHostileTo(who))        {            //Add them to our threat list            m_creature->AddThreat(who,0.0f);        }    }        void JustDied(Unit* Killer)    {        DoPlaySoundToSet(m_creature,SOUND_DEATH);        //Despawn all monsters    }    void UpdateAI(const uint32 diff)    {        //Return since we have no target        if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() )            return;        //Check if we're gonna spawn a trash wave        if (WaveTimer < diff)        {            if (BossEncounter == 1)            {                switch (TrashWave)                {                    case 1:                        //First Wave, 10 Ghouls                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        TrashWave++;                        WaveTimer = 85000;                        break;                    case 2:                        //Second Wave, 10 Ghouls, 2 Crypt Fiends                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        DoPlaySoundToSet(m_creature,SOUND_INCOMING);                        TrashWave++;                        WaveTimer = 85000;                        break;                    case 3:                        //Third Wave, 6 Ghouls, 6 Crypt Fiends                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        DoPlaySoundToSet(m_creature,SOUND_INCOMING);                        TrashWave++;                        WaveTimer = 100000;                        break;                    case 4:                        //Fourth Wave, 6 Ghouls, 4 Crypt Fiends, 2 Necromancers                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        DoPlaySoundToSet(m_creature,SOUND_INCOMING);                        TrashWave++;                        WaveTimer = 115000;                        break;                    case 5:                        //Fifth Wave, 2 Ghouls, 6 Crypt Fiends, 4 Necromancers                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        DoPlaySoundToSet(m_creature,SOUND_INCOMING);                        TrashWave++;                        WaveTimer = 125000;                        break;                    case 6:                        //Sixth Wave, 6 Ghouls, 6 Abominations                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        DoPlaySoundToSet(m_creature,SOUND_INCOMING);                        TrashWave++;                        WaveTimer = 135000;                        break;                    case 7:                        //Seventh Wave, 4 Ghouls, 4 Necromancers, 4 Abominations                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        DoPlaySoundToSet(m_creature,SOUND_INCOMING);                        TrashWave++;                        WaveTimer = 125000;                        break;                    case 8:                        //Eigth Wave, 6 Ghouls, 4 Crypt Fiends, 2 Abominations, 2 Necromancers                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_GHOUL);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_CRYPT_FIEND);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_ABOMINATION);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        SpawnMonster(CREATURE_SHADOWY_NECROMANCER);                        DoPlaySoundToSet(m_creature,SOUND_INCOMING);                        TrashWave++;                        //Totally unsure about this Timer, let's be nice and give players 2:30min                        WaveTimer = 150000;                        break;                    case 9:                        //Ninth "Wave", Rage Winterchill!                        Creature* RageWinterchillSpawn = NULL;                        RageWinterchillSpawn = SpawnMonster(CREATURE_RAGE_WINTERCHILL);                        RageWinterchillGUID = RageWinterchillSpawn->GetGUID();                        TrashWave = 10;                        WaveTimer = 0;                        break;                                    }            }            else if (BossEncounter == 3)                {                    //Anetheron part here                }        }else WaveTimer -= diff;                if (BossEncounter == 1 && TrashWave == 10)        {            Unit* RageWinterchill = NULL;            RageWinterchill = Unit::GetUnit((*m_creature),RageWinterchillGUID);                        if(!RageWinterchill || !RageWinterchill->isAlive())            {                RageWinterchillGUID = 0;                BossEncounter = 3;                TrashWave = 0;            }        }    }};CreatureAI* GetAI_npc_jaina_proudmoore(Creature *_Creature){    return new npc_jaina_proudmooreAI (_Creature);}bool GossipSelect_npc_jaina_proudmoore(Player *player, Creature *_Creature, uint32 sender, uint32 action ){    if (action == GOSSIP_ACTION_INFO_DEF + 1)//Fight time    {        player->PlayerTalkClass->CloseGossip();        ((npc_jaina_proudmooreAI*)_Creature->AI())->BeginEncounter(1);    }    else if (action == GOSSIP_ACTION_INFO_DEF + 2)//Fight time    {        player->PlayerTalkClass->CloseGossip();        ((npc_jaina_proudmooreAI*)_Creature->AI())->BeginEncounter(3);    }    return true;}bool GossipHello_npc_jaina_proudmoore(Player *player, Creature *_Creature){    if (((npc_jaina_proudmooreAI*)_Creature->AI())->BossEncounter == 0)    {        //ADD_GOSSIP_ITEM points to AddMenuItem        player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM , GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);        //first in fuction points to npc_text table        player->PlayerTalkClass->SendGossipMenu(907,_Creature->GetGUID());    }    else if (((npc_jaina_proudmooreAI*)_Creature->AI())->BossEncounter == 3)    {        //ADD_GOSSIP_ITEM points to AddMenuItem        player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_TWO , GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);        //first in fuction points to npc_text table        player->PlayerTalkClass->SendGossipMenu(907,_Creature->GetGUID());    }    else if (((npc_jaina_proudmooreAI*)_Creature->AI())->BossEncounter == 5)    {        //ADD_GOSSIP_ITEM points to AddMenuItem        player->ADD_GOSSIP_ITEM( 0, GOSSIP_ITEM_THREE , GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);        //first in fuction points to npc_text table        player->PlayerTalkClass->SendGossipMenu(907,_Creature->GetGUID());    }    return true;}void AddSC_npc_jaina_proudmoore(){    Script *newscript;    newscript = new Script;    newscript->Name="npc_jaina_proudmoore";    newscript->GetAI = GetAI_npc_jaina_proudmoore;    newscript->pGossipHello = &GossipHello_npc_jaina_proudmoore;    newscript->pGossipSelect = &GossipSelect_npc_jaina_proudmoore;    m_scripts[nrscripts++] = newscript;}