diff options
author | maximius <none@none> | 2009-09-26 16:01:30 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-09-26 16:01:30 -0700 |
commit | 7396b641ae82adcf5afd2591957ff944b7964203 (patch) | |
tree | b6d54ca311e779ae4e77b569b9a367dc26a4938a /src | |
parent | ff3f556423bc90f8476c8b09bacb60cd621b2664 (diff) |
*Gundrak: GO Handling & Slad Ran script by Tartalo
*Cleanup, and don't consider creatures to be in combat if they have no victim, or if their victim is a GM.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp | 37 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/boss_eck.cpp | 37 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/boss_gal_darah.cpp | 74 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/boss_moorabi.cpp | 14 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/boss_slad_ran.cpp | 207 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/def_gundrak.h | 16 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp | 303 | ||||
-rw-r--r-- | src/bindings/scripts/system/ScriptLoader.cpp | 21 | ||||
-rw-r--r-- | src/game/Creature.cpp | 3 | ||||
-rw-r--r-- | src/game/CreatureEventAIMgr.cpp | 8 | ||||
-rw-r--r-- | src/game/DynamicObject.cpp | 14 | ||||
-rw-r--r-- | src/game/Level3.cpp | 55 | ||||
-rw-r--r-- | src/game/Unit.cpp | 2 |
13 files changed, 664 insertions, 127 deletions
diff --git a/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp b/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp index 4d18ad6ba7c..dcfaf33b66a 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp @@ -10,6 +10,7 @@ Script Data End */ update creature_template set scriptname = '' where entry = ''; *** SQL END ***/ #include "precompiled.h" +#include "def_gundrak.h" //Spells #define SPELL_EMERGE 54850 //to phase2, Colossus unatackable, Elemental emerges @@ -18,25 +19,39 @@ update creature_template set scriptname = '' where entry = ''; struct TRINITY_DLL_DECL boss_drakkari_colossusAI : public ScriptedAI { - boss_drakkari_colossusAI(Creature *c) : ScriptedAI(c) {} - - uint32 phase; + boss_drakkari_colossusAI(Creature *c) : ScriptedAI(c) + { + pInstance = c->GetInstanceData(); + } + + ScriptedInstance* pInstance; - void Reset() {} - void EnterCombat(Unit* who) {} - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} + void Reset() + { + if (pInstance) + pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, NOT_STARTED); + } + + void EnterCombat(Unit* who) + { + if (pInstance) + pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, IN_PROGRESS); + } + void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; - - phase =1; - + DoMeleeAttackIfReady(); } - void JustDied(Unit* killer) {} + + void JustDied(Unit* killer) + { + if (pInstance) + pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, DONE); + } }; CreatureAI* GetAI_boss_drakkari_colossus(Creature* pCreature) diff --git a/src/bindings/scripts/scripts/northrend/gundrak/boss_eck.cpp b/src/bindings/scripts/scripts/northrend/gundrak/boss_eck.cpp index 8c72de6c9ad..241570fa0ed 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/boss_eck.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/boss_eck.cpp @@ -10,6 +10,7 @@ Script Data End */ update creature_template set scriptname = '' where entry = ''; *** SQL END ***/ #include "precompiled.h" +#include "def_gundrak.h" #define SPELL_ECK_BERSERK 55816 //Eck goes berserk, increasing his attack speed by 150% and all damage he deals by 500%. #define SPELL_ECK_BITE 55813 //Eck bites down hard, inflicting 150% of his normal damage to an enemy. @@ -19,34 +20,50 @@ update creature_template set scriptname = '' where entry = ''; struct TRINITY_DLL_DECL boss_eckAI : public ScriptedAI { - boss_eckAI(Creature *c) : ScriptedAI(c) {} + boss_eckAI(Creature *c) : ScriptedAI(c) + { + pInstance = c->GetInstanceData(); + } - uint32 berserk; + uint32 uiBerserkTimer; + + ScriptedInstance* pInstance; void Reset() { //Source Deadly Boss Mod - berserk = 120000; //2min + uiBerserkTimer = 120000; //2min + + if (pInstance) + pInstance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, NOT_STARTED); } - void EnterCombat(Unit* who) {} - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} + void EnterCombat(Unit* who) + { + if (pInstance) + pInstance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, IN_PROGRESS); + } + void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; - if (berserk < diff) + if (uiBerserkTimer < diff) { DoCast(m_creature,SPELL_ECK_BERSERK); - berserk = 120000; - }else berserk -= diff; + uiBerserkTimer = 120000; + }else uiBerserkTimer -= diff; DoMeleeAttackIfReady(); } - void JustDied(Unit* killer) {} + + void JustDied(Unit* killer) + { + if (pInstance) + pInstance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, DONE); + } }; CreatureAI* GetAI_boss_eck(Creature* pCreature) diff --git a/src/bindings/scripts/scripts/northrend/gundrak/boss_gal_darah.cpp b/src/bindings/scripts/scripts/northrend/gundrak/boss_gal_darah.cpp index b2462a32931..123a2b1ccc6 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/boss_gal_darah.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/boss_gal_darah.cpp @@ -10,40 +10,58 @@ Script Data End */ update creature_template set scriptname = '' where entry = ''; *** SQL END ***/ #include "precompiled.h" +#include "def_gundrak.h" //Spells -#define SPELL_ENRAGE 55285 -#define SPELL_IMPALING_CHARGE 54956 -#define SPELL_STOMP 55292 - -#define SPELL_PUNCTURE 55276 -#define SPELL_STAMPEDE 55218 -#define SPELL_WHIRLING_SLASH 55285 +enum Spells +{ + SPELL_ENRAGE = 55285, + SPELL_IMPALING_CHARGE = 54956, + SPELL_STOMP = 55292, + SPELL_PUNCTURE = 55276, + SPELL_STAMPEDE = 55218, + SPELL_WHIRLING_SLASH = 55249, + H_SPELL_WHIRLING_SLASH = 55825 +}; -//not in db //Yells -#define SAY_AGGRO -1604000 -#define SAY_SLAY_1 -1604001 -#define SAY_SLAY_2 -1604002 -#define SAY_SLAY_3 -1604003 -#define SAY_DEATH -1604004 -#define SAY_SUMMON_RHINO_1 -1604005 -#define SAY_SUMMON_RHINO_2 -1604006 -#define SAY_SUMMON_RHINO_3 -1604007 -#define SAY_TRANSFORM_1 -1604008 //Phase change -#define SAY_TRANSFORM_2 -1604009 +enum Yells +{ + SAY_AGGRO = -1604000, + SAY_SLAY_1 = -1604001, + SAY_SLAY_2 = -1604002, + SAY_SLAY_3 = -1604003, + SAY_DEATH = -1604004, + SAY_SUMMON_RHINO_1 = -1604005, + SAY_SUMMON_RHINO_2 = -1604006, + SAY_SUMMON_RHINO_3 = -1604007, + SAY_TRANSFORM_1 = -1604008, //Phase change + SAY_TRANSFORM_2 = -1604009 +}; struct TRINITY_DLL_DECL boss_gal_darahAI : public ScriptedAI { - boss_gal_darahAI(Creature *c) : ScriptedAI(c) {} + boss_gal_darahAI(Creature *c) : ScriptedAI(c) + { + pInstance = c->GetInstanceData(); + } + + ScriptedInstance* pInstance; - void Reset() {} + void Reset() + { + if (pInstance) + pInstance->SetData(DATA_GAL_DARAH_EVENT, NOT_STARTED); + } + void EnterCombat(Unit* who) { DoScriptText(SAY_AGGRO, m_creature); + + if (pInstance) + pInstance->SetData(DATA_GAL_DARAH_EVENT, IN_PROGRESS); } - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} + void UpdateAI(const uint32 diff) { //Return since we have no target @@ -52,21 +70,21 @@ struct TRINITY_DLL_DECL boss_gal_darahAI : public ScriptedAI DoMeleeAttackIfReady(); } + void JustDied(Unit* killer) { DoScriptText(SAY_DEATH, m_creature); + + if (pInstance) + pInstance->SetData(DATA_GAL_DARAH_EVENT, DONE); } + void KilledUnit(Unit *victim) { if (victim == m_creature) return; - switch(rand()%3) - { - case 0: DoScriptText(SAY_SLAY_1, m_creature);break; - case 1: DoScriptText(SAY_SLAY_2, m_creature);break; - case 2: DoScriptText(SAY_SLAY_3, m_creature);break; - } + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), m_creature); } }; diff --git a/src/bindings/scripts/scripts/northrend/gundrak/boss_moorabi.cpp b/src/bindings/scripts/scripts/northrend/gundrak/boss_moorabi.cpp index 3e0408fca90..dcf7bde6e41 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/boss_moorabi.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/boss_moorabi.cpp @@ -7,6 +7,7 @@ SDCategory: Gundrak Script Data End */ #include "precompiled.h" +#include "def_gundrak.h" //Spells @@ -38,10 +39,10 @@ struct TRINITY_DLL_DECL boss_moorabiAI : public ScriptedAI { boss_moorabiAI(Creature *c) : ScriptedAI(c) { - HeroicMode = c->GetMap()->IsHeroic(); + pInstance = c->GetInstanceData(); } - bool HeroicMode; + ScriptedInstance* pInstance; bool Phase; uint32 SPELL_QUAKE_TIMER; uint32 SPELL_NUMBING_SHOUT_TIMER; @@ -56,12 +57,18 @@ struct TRINITY_DLL_DECL boss_moorabiAI : public ScriptedAI SPELL_DETERMINED_STAB_TIMER = 20000; SPELL_TRANSFORMATION_TIMER = 12000; Phase = false; + + if (pInstance) + pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, NOT_STARTED); } void EnterCombat(Unit *who) { DoScriptText(SAY_AGGRO, m_creature); m_creature->CastSpell(m_creature,SPELL_MOJO_FRENZY,true); + + if (pInstance) + pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, IN_PROGRESS); } void UpdateAI(const uint32 diff) @@ -149,6 +156,9 @@ struct TRINITY_DLL_DECL boss_moorabiAI : public ScriptedAI } } } + + if (pInstance) + pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, DONE); } void KilledUnit(Unit *victim) { diff --git a/src/bindings/scripts/scripts/northrend/gundrak/boss_slad_ran.cpp b/src/bindings/scripts/scripts/northrend/gundrak/boss_slad_ran.cpp index e2ef3ab6713..3dd0b651de1 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/boss_slad_ran.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/boss_slad_ran.cpp @@ -10,73 +10,196 @@ Script Data End */ update creature_template set scriptname = 'boss_slad_ran' where entry = ''; *** SQL END ***/ #include "precompiled.h" +#include "def_gundrak.h" //Spells -#define SPELL_POISON_NOVA 55081 -#define SPELL_POISON_NOVA_2 59842 -//-- -#define SPELL_POWERFUL_BITE 48287 -#define SPELL_POWERFUL_BITE_2 59840 -//-- -#define SPELL_VENOM_BOLT 54970 -#define SPELL_VENOM_BOLT_2 59839 -//At 30% HPStart summoning small serpents - -//not in db +enum Spells +{ + SPELL_POISON_NOVA = 55081, + H_SPELL_POISON_NOVA = 59842, + SPELL_POWERFULL_BITE = 48287, + H_SPELL_POWERFULL_BITE = 59840, + SPELL_VENOM_BOLT = 54970, + H_SPELL_VENOM_BOLT = 59839 +}; + //Yell -#define SAY_AGGRO -1604017 -#define SAY_SLAY_1 -1604018 -#define SAY_SLAY_2 -1604019 -#define SAY_SLAY_3 -1604020 -#define SAY_DEATH -1604021 -#define SAY_SUMMON_SNAKES -1604022 //npc 29680 -#define SAY_SUMMON_CONSTRICTORS -1604023 //npc 29713, can cast Grip of Slad'ran (spell 55093) +enum Yells +{ + SAY_AGGRO = -1604017, + SAY_SLAY_1 = -1604018, + SAY_SLAY_2 = -1604019, + SAY_SLAY_3 = -1604020, + SAY_DEATH = -1604021, + SAY_SUMMON_SNAKES = -1604022, + SAY_SUMMON_CONSTRICTORS = -1604023 +}; + +//Creatures +enum Creatures +{ + CREATURE_SNAKE = 29680, + CREATURE_CONSTRICTORS = 29713 +}; + +//Creatures' spells +enum ConstrictorSpells +{ + SPELL_GRIP_OF_SLAD_RAN = 55093, + SPELL_VENOMOUS_BITE = 54987, + H_SPELL_VENOMOUS_BITE = 58996 +}; struct TRINITY_DLL_DECL boss_slad_ranAI : public ScriptedAI { - boss_slad_ranAI(Creature *c) : ScriptedAI(c) {} + boss_slad_ranAI(Creature *c) : ScriptedAI(c) + { + pInstance = c->GetInstanceData(); + } + + uint32 uiPoisonNovaTimer; + uint32 uiPowerfullBiteTimer; + uint32 uiVenomBoltTimer; + uint32 uiSpawnTimer; + + uint8 uiPhase; - void Reset() {} + ScriptedInstance* pInstance; + + void Reset() + { + uiPoisonNovaTimer = 10000; + uiPowerfullBiteTimer = 3000; + uiVenomBoltTimer = 15000; + uiSpawnTimer = 5000; + uiPhase = 0; + + if (pInstance) + pInstance->SetData(DATA_SLAD_RAN_EVENT, NOT_STARTED); + } + void EnterCombat(Unit* who) { DoScriptText(SAY_AGGRO, m_creature); + + if (pInstance) + pInstance->SetData(DATA_SLAD_RAN_EVENT, IN_PROGRESS); } - void AttackStart(Unit* who) {} - void MoveInLineOfSight(Unit* who) {} + void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; + + if (uiPoisonNovaTimer < diff) + { + DoCast(m_creature->getVictim(), HeroicMode ? H_SPELL_POISON_NOVA : SPELL_POISON_NOVA); + uiPoisonNovaTimer = 15000; + } else uiPoisonNovaTimer -= diff; + + if (uiPowerfullBiteTimer < diff) + { + DoCast(m_creature->getVictim(), HeroicMode ? H_SPELL_POWERFULL_BITE : SPELL_POWERFULL_BITE); + uiPowerfullBiteTimer = 10000; + } else uiPowerfullBiteTimer -= diff; + + if (uiVenomBoltTimer < diff) + { + DoCast(m_creature->getVictim(), HeroicMode ? H_SPELL_VENOM_BOLT : SPELL_VENOM_BOLT); + uiVenomBoltTimer = 10000; + } else uiVenomBoltTimer -= diff; + + if (uiPhase) + { + if(uiSpawnTimer < diff) + { + if (uiPhase == 1) + for (uint8 i = 0;i< HeroicMode ? 5 : 3;++i) + m_creature->SummonCreature(CREATURE_SNAKE, rand()%5, rand()%5, 0, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000); + if (uiPhase == 2) + for (uint8 i = 0;i< HeroicMode ? 5 : 3;++i) + m_creature->SummonCreature(CREATURE_CONSTRICTORS, rand()%5, rand()%5, 0, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000); + uiSpawnTimer = 5000; + } else uiSpawnTimer -= diff; + } - if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 30) + if ((uiPhase == 0) && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 30) { - //Summon 3 snakes --> npc 29680 DoScriptText(SAY_SUMMON_SNAKES,m_creature); + uiPhase = 1; } - if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) + if ((uiPhase == 1) && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) { - //Summon 3 constrictors --> npc 29713 DoScriptText(SAY_SUMMON_CONSTRICTORS,m_creature); + uiPhase = 2; } DoMeleeAttackIfReady(); } + void JustDied(Unit* killer) { DoScriptText(SAY_DEATH, m_creature); + + if (pInstance) + pInstance->SetData(DATA_SLAD_RAN_EVENT, DONE); } + void KilledUnit(Unit *victim) { - if (victim == m_creature) + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), m_creature); + } +}; + +struct TRINITY_DLL_DECL mob_slad_ran_constrictorAI : public ScriptedAI +{ + mob_slad_ran_constrictorAI(Creature *c) : ScriptedAI(c) {} + + uint32 uiGripOfSladRanTimer; + + void Reset() + { + uiGripOfSladRanTimer = 1000; + } + + void UpdateAI(const uint32 diff) + { + if (!UpdateVictim()) return; + if (uiGripOfSladRanTimer < diff) + { + DoCast(m_creature->getVictim(), SPELL_GRIP_OF_SLAD_RAN); + uiGripOfSladRanTimer = 5000; + } else uiGripOfSladRanTimer -= diff;; + } + + ScriptedInstance* pInstance; +}; - switch(rand()%3) +struct TRINITY_DLL_DECL mob_slad_ran_viperAI : public ScriptedAI +{ + mob_slad_ran_viperAI(Creature *c) : ScriptedAI(c) {} + + uint32 uiVenomousBiteTimer; + + ScriptedInstance* pInstance; + + void Reset() + { + uiVenomousBiteTimer = 2000; + } + + void UpdateAI(const uint32 diff) + { + if (!UpdateVictim()) + return; + + if (uiVenomousBiteTimer < diff) { - case 0:DoScriptText(SAY_SLAY_1, m_creature);break; - case 1:DoScriptText(SAY_SLAY_2, m_creature);break; - case 2:DoScriptText(SAY_SLAY_3, m_creature);break; - } + DoCast(m_creature->getVictim(), HeroicMode ? H_SPELL_VENOMOUS_BITE : SPELL_VENOMOUS_BITE); + uiVenomousBiteTimer = 10000; + } else uiVenomousBiteTimer -= diff; } }; @@ -85,6 +208,16 @@ CreatureAI* GetAI_boss_slad_ran(Creature* pCreature) return new boss_slad_ranAI (pCreature); } +CreatureAI* GetAI_mob_slad_ran_constrictor(Creature* pCreature) +{ + return new mob_slad_ran_constrictorAI (pCreature); +} + +CreatureAI* GetAI_mob_slad_ran_viper(Creature* pCreature) +{ + return new mob_slad_ran_viperAI (pCreature); +} + void AddSC_boss_slad_ran() { Script *newscript; @@ -93,4 +226,14 @@ void AddSC_boss_slad_ran() newscript->Name="boss_slad_ran"; newscript->GetAI = &GetAI_boss_slad_ran; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name="mob_slad_ran_constrictor"; + newscript->GetAI = &GetAI_mob_slad_ran_constrictor; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name="mob_slad_ran_viper"; + newscript->GetAI = &GetAI_mob_slad_ran_viper; + newscript->RegisterSelf(); } diff --git a/src/bindings/scripts/scripts/northrend/gundrak/def_gundrak.h b/src/bindings/scripts/scripts/northrend/gundrak/def_gundrak.h index 5f015610312..957023b3583 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/def_gundrak.h +++ b/src/bindings/scripts/scripts/northrend/gundrak/def_gundrak.h @@ -1,4 +1,20 @@ #ifndef DEF_GUNDRAK_H #define DEF_GUNDRAK_H +enum Data +{ + DATA_SLAD_RAN_EVENT, + DATA_MOORABI_EVENT, + DATA_DRAKKARI_COLOSSUS_EVENT, + DATA_GAL_DARAH_EVENT, + DATA_ECK_THE_FEROCIOUS_EVENT +}; + +enum Data64 +{ + DATA_SLAD_RAN_ALTAR, + DATA_MOORABI_ALTAR, + DATA_DRAKKARI_COLOSSUS_ALTAR +}; + #endif diff --git a/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp b/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp index 0ed874d905f..157b4c87991 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp @@ -1,11 +1,307 @@ #include "precompiled.h" #include "def_gundrak.h" +#define MAX_ENCOUNTER 5 + +/* GunDrak encounters: +0 - Slad'Ran +1 - Moorabi +2 - Drakkari Colossus +3 - Gal'Darah +4 - Eck the Ferocious +*/ + struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance { - instance_gundrak(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; + instance_gundrak(Map* pMap) : ScriptedInstance(pMap) + { + bHeroicMode = pMap->IsHeroic(); + Initialize(); + }; + + bool bHeroicMode; + + uint64 uiSladRan; + uint64 uiMoorabi; + uint64 uiDrakkariColossus; + uint64 uiGalDarah; + uint64 uiEckTheFerocious; + + uint32 uiSladRanAltar; + uint32 uiMoorabiAltar; + uint32 uiDrakkariColossusAltar; + uint32 uiSladRanStatue; + uint32 uiMoorabiStatue; + uint32 uiDrakkariColossusStatue; + uint32 uiEckTheFerociousDoor; + uint32 uiGalDarahDoor1; + uint32 uiGalDarahDoor2; + uint32 uiBridge; + uint32 uiCollision; + + uint32 m_auiEncounter[MAX_ENCOUNTER]; + + std::string str_data; + + void Initialize() + { + uiSladRan = 0; + uiMoorabi = 0; + uiDrakkariColossus = 0; + uiGalDarah = 0; + uiEckTheFerocious = 0; + + uiSladRanAltar = 0; + uiMoorabiAltar = 0; + uiDrakkariColossusAltar = 0; + + uiSladRanStatue = 0; + uiMoorabiStatue = 0; + uiDrakkariColossusStatue = 0; + + uiEckTheFerociousDoor = 0; + uiGalDarahDoor1 = 0; + uiGalDarahDoor2 = 0; + + uiBridge = 0; + uiCollision = 0; + + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + } + + bool IsEncounterInProgress() const + { + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) return true; + + return false; + } + + void OnCreatureCreate(Creature* pCreature, bool add) + { + switch(pCreature->GetEntry()) + { + case 29304: uiSladRan = pCreature->GetGUID(); break; + case 29305: uiMoorabi = pCreature->GetGUID(); break; + case 29306: uiGalDarah = pCreature->GetGUID(); break; + case 29307: uiDrakkariColossus = pCreature->GetGUID(); break; + case 29332: uiEckTheFerocious = pCreature->GetGUID(); break; + } + } + + void OnGameObjectCreate(GameObject* pGo, bool add) + { + switch(pGo->GetEntry()) + { + case 192518: + uiSladRanAltar = pGo->GetGUID(); + if (m_auiEncounter[0] == DONE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + break; + case 192519: + uiMoorabiAltar = pGo->GetGUID(); + if (m_auiEncounter[1] == DONE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + break; + case 192520: + uiDrakkariColossus = pGo->GetGUID(); + if (m_auiEncounter[2] == DONE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + break; + case 192564: + uiSladRanStatue = pGo->GetGUID(); + break; + case 192565: + uiMoorabiStatue = pGo->GetGUID(); + break; + case 192567: + uiDrakkariColossus = pGo->GetGUID(); + break; + case 192632: + uiEckTheFerociousDoor = pGo->GetGUID(); + if (bHeroicMode && m_auiEncounter[1] == DONE) + HandleGameObject(NULL,true,pGo); + break; + case 193208: + uiGalDarahDoor1 = pGo->GetGUID(); + if (m_auiEncounter[3] == DONE) + HandleGameObject(NULL,true,pGo); + break; + case 193209: + uiGalDarahDoor2 = pGo->GetGUID(); + if (m_auiEncounter[3] == DONE) + HandleGameObject(NULL,true,pGo); + break; + case 193188: + uiBridge = pGo->GetGUID(); + break; + case 192633: + uiBridge = pGo->GetGUID(); + break; + } + } + + void SetData(uint32 type, uint32 data) + { + switch(type) + { + case DATA_SLAD_RAN_EVENT: + m_auiEncounter[0] = data; + if (data == DONE) + { + GameObject* pGo = instance->GetGameObject(uiSladRanAltar); + if (pGo) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + } + break; + case DATA_MOORABI_EVENT: + m_auiEncounter[1] = data; + if (data == DONE) + { + GameObject* pGo = instance->GetGameObject(uiMoorabiAltar); + if (pGo) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + if (bHeroicMode) + HandleGameObject(uiEckTheFerociousDoor,true); + } + break; + case DATA_DRAKKARI_COLOSSUS_EVENT: + m_auiEncounter[2] = data; + if (data == DONE) + { + GameObject* pGo = instance->GetGameObject(uiDrakkariColossusAltar); + if (pGo) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + } + break; + case DATA_GAL_DARAH_EVENT: + m_auiEncounter[3] = data; + if (data == DONE) + { + HandleGameObject(uiGalDarahDoor1,true); + HandleGameObject(uiGalDarahDoor2,true); + } + break; + case DATA_ECK_THE_FEROCIOUS_EVENT: + m_auiEncounter[4] = data; + break; + } + + if (data == DONE) + SaveToDB(); + } + + uint32 GetData(uint32 type) + { + switch(type) + { + case DATA_SLAD_RAN_EVENT: return m_auiEncounter[0]; + case DATA_MOORABI_EVENT: return m_auiEncounter[1]; + case DATA_GAL_DARAH_EVENT: return m_auiEncounter[2]; + case DATA_DRAKKARI_COLOSSUS_EVENT: return m_auiEncounter[3]; + case DATA_ECK_THE_FEROCIOUS_EVENT: return m_auiEncounter[4]; + } + + return 0; + } + + uint64 GetData64(uint32 type) + { + switch(type) + { + case DATA_SLAD_RAN_ALTAR: return uiSladRanAltar; + case DATA_MOORABI_ALTAR: return uiMoorabiAltar; + case DATA_DRAKKARI_COLOSSUS_ALTAR: return uiDrakkariColossusAltar; + } + + return 0; + } + + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "G D " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " + << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4]; + + str_data = saveStream.str(); + + OUT_SAVE_INST_DATA_COMPLETE; + return str_data; + } + + void Load(const char* in) + { + if (!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(in); + + char dataHead1, dataHead2; + uint16 data0, data1, data2, data3, data4; + + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4; + + if (dataHead1 == 'G' && dataHead2 == 'D') + { + m_auiEncounter[0] = data0; + m_auiEncounter[1] = data1; + m_auiEncounter[2] = data2; + m_auiEncounter[3] = data3; + m_auiEncounter[4] = data4; + + for(uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS) + m_auiEncounter[i] = NOT_STARTED; + }else OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + void CheckAltars() + { + GameObject* pSladRanAltar = instance->GetGameObject(uiSladRanAltar); + GameObject* pMoorabiAltar = instance->GetGameObject(uiMoorabiAltar); + GameObject* pDrakkariColossusAltar = instance->GetGameObject(uiDrakkariColossusAltar); + + if (pSladRanAltar && pSladRanAltar->GetGoState() == GO_STATE_ACTIVE && + pMoorabiAltar && pMoorabiAltar->GetGoState() == GO_STATE_ACTIVE && + pDrakkariColossusAltar && pDrakkariColossusAltar->GetGoState()) + { + HandleGameObject(uiBridge,true); + HandleGameObject(uiCollision,true); + } + } }; +bool GOHello_altar(Player *pPlayer, GameObject *pGO) +{ + ScriptedInstance *pInstance = pGO->GetInstanceData(); + uint32 uiStatue; + + pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); + pGO->SetGoState(GO_STATE_ACTIVE); + + if (pInstance) + { + switch(pGO->GetEntry()) + { + case 192518: uiStatue = pInstance->GetData64(DATA_SLAD_RAN_ALTAR); break; + case 192519: uiStatue = pInstance->GetData64(DATA_MOORABI_ALTAR); break; + case 192520: uiStatue = pInstance->GetData64(DATA_DRAKKARI_COLOSSUS_ALTAR); break; + } + pInstance->HandleGameObject(uiStatue,true); + ((instance_gundrak*)pInstance)->CheckAltars(); + return true; + } + return false; +} + InstanceData* GetInstanceData_instance_gundrak(Map* pMap) { return new instance_gundrak(pMap); @@ -18,4 +314,9 @@ void AddSC_instance_gundrak() newscript->Name = "instance_gundrak"; newscript->GetInstanceData = &GetInstanceData_instance_gundrak; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "go_gundrak_altar"; + newscript->pGOHello = &GOHello_altar; + newscript->RegisterSelf(); } diff --git a/src/bindings/scripts/system/ScriptLoader.cpp b/src/bindings/scripts/system/ScriptLoader.cpp index e334070e520..8c06c9206b7 100644 --- a/src/bindings/scripts/system/ScriptLoader.cpp +++ b/src/bindings/scripts/system/ScriptLoader.cpp @@ -261,7 +261,12 @@ extern void AddSC_ungoro_crater(); extern void AddSC_winterspring(); //northrend +extern void AddSC_boss_slad_ran(); extern void AddSC_boss_moorabi(); +extern void AddSC_boss_drakkari_colossus(); +extern void AddSC_boss_gal_darah(); +extern void AddSC_boss_eck(); +extern void AddSC_instance_gundrak(); extern void AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet extern void AddSC_boss_krik_thir(); extern void AddSC_boss_taldaram(); @@ -670,12 +675,17 @@ void AddScripts() AddSC_winterspring(); //northrend + AddSC_boss_slad_ran(); //Gundrak AddSC_boss_moorabi(); - AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet - AddSC_boss_krik_thir(); - AddSC_boss_taldaram(); + AddSC_boss_drakkari_colossus(); + AddSC_boss_gal_darah(); + AddSC_boss_eck(); + AddSC_instance_gundrak(); + AddSC_boss_taldaram(); //Azjol-Nerub Ahn'kahet AddSC_boss_elder_nadox(); AddSC_boss_volazj(); + AddSC_instance_ahnkahet(); + AddSC_boss_krik_thir(); //Azjol-Nerub Azjol-Nerub AddSC_boss_anubrekhan(); //Naxxramas AddSC_boss_maexxna(); AddSC_boss_patchwerk(); @@ -717,6 +727,11 @@ void AddScripts() AddSC_boss_skarvald_dalronn(); AddSC_boss_ingvar_the_plunderer(); AddSC_instance_utgarde_keep(); + AddSC_boss_svala(); //Utgarde pinnacle + AddSC_boss_palehoof(); + AddSC_boss_skadi(); + AddSC_boss_ymiron(); + AddSC_instance_utgarde_pinnacle(); AddSC_utgarde_keep(); AddSC_boss_archavon(); //Vault of Archavon AddSC_boss_emalon(); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index a7e5153e255..6f24dbe1631 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -544,7 +544,8 @@ void Creature::Update(uint32 diff) if(!isAlive()) break; - bool bNotInCombatOrIsPolymorphed = (!isInCombat() || IsPolymorphed()); + bool bNotInCombatOrIsPolymorphed = (!isInCombat() || IsPolymorphed() || !getVictim() || + getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself()->isGameMaster()); if(m_regenTimer > diff && !bNotInCombatOrIsPolymorphed) m_regenTimer -= diff; diff --git a/src/game/CreatureEventAIMgr.cpp b/src/game/CreatureEventAIMgr.cpp index 901ec541455..5325edff4a9 100644 --- a/src/game/CreatureEventAIMgr.cpp +++ b/src/game/CreatureEventAIMgr.cpp @@ -147,13 +147,14 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Summons() //Add to map m_CreatureEventAI_Summon_Map[i] = temp; ++Count; - }while (result->NextRow()); + } while (result->NextRow()); delete result; sLog.outString(); sLog.outString(">> Loaded %u CreatureEventAI summon definitions", Count); - }else + } + else { barGoLink bar(1); bar.step(); @@ -728,7 +729,8 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts() sLog.outString(); sLog.outString(">> Loaded %u CreatureEventAI scripts", Count); - }else + } + else { barGoLink bar(1); bar.step(); diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index 5dd4059e21c..e616dc2f809 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -113,7 +113,7 @@ void DynamicObject::Update(uint32 p_time) { // caster can be not in world at time dynamic object update, but dynamic object not yet deleted in Unit destructor Unit* caster = GetCaster(); - if(!caster) + if (!caster) { Delete(); return; @@ -126,17 +126,17 @@ void DynamicObject::Update(uint32 p_time) else deleteThis = true; - if(m_effMask) + if (m_effMask) { - if(m_updateTimer < p_time) + if (m_updateTimer < p_time) { Trinity::DynamicObjectUpdater notifier(*this,caster); VisitNearbyObject(GetRadius(), notifier); m_updateTimer = 500; // is this official-like? - }else m_updateTimer -= p_time; + } else m_updateTimer -= p_time; } - if(deleteThis) + if (deleteThis) { caster->RemoveDynObjectWithGUID(GetGUID()); Delete(); @@ -153,9 +153,9 @@ void DynamicObject::Delete() void DynamicObject::Delay(int32 delaytime) { m_aliveDuration -= delaytime; - for(AffectedSet::iterator iunit= m_affected.begin(); iunit != m_affected.end(); ++iunit) + for (AffectedSet::iterator iunit = m_affected.begin(); iunit != m_affected.end(); ++iunit) if (*iunit) - (*iunit)->DelayAura(m_spellId, GetCaster()->GetGUID() , delaytime); + (*iunit)->DelayAura(m_spellId, GetCaster()->GetGUID(), delaytime); } bool DynamicObject::isVisibleForInState(Player const* u, bool inVisibleList) const diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index b14710c5191..bd4208c9647 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -1393,7 +1393,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) char* arg1 = strtok((char*)args, " "); char* arg2 = strtok(NULL, " "); - if(getSelectedPlayer() && arg1 && !arg2) + if (getSelectedPlayer() && arg1 && !arg2) { targetAccountId = getSelectedPlayer()->GetSession()->GetAccountId(); accmgr.GetName(targetAccountId, targetAccountName); @@ -1401,7 +1401,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) gm = atoi(arg1); // Check for invalid specified GM level. - if ( (gm < SEC_PLAYER || gm > SEC_ADMINISTRATOR) ) + if (gm < SEC_PLAYER || gm > SEC_ADMINISTRATOR) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); @@ -1410,7 +1410,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) // Check if targets GM level and specified GM level is not higher than current gm level targetSecurity = targetPlayer->GetSession()->GetSecurity(); - if(targetSecurity >= m_session->GetSecurity() || gm >= m_session->GetSecurity() ) + if (targetSecurity >= m_session->GetSecurity() || gm >= m_session->GetSecurity()) { SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); SetSentErrorMessage(true); @@ -1418,24 +1418,23 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) } // Decide which string to show - if(m_session->GetPlayer()!=targetPlayer) - { + if (m_session->GetPlayer() != targetPlayer) PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm); - }else{ + else PSendSysMessage(LANG_YOURS_SECURITY_CHANGED, m_session->GetPlayer()->GetName(), gm); - } loginDatabase.PExecute("UPDATE account SET gmlevel = '%d' WHERE id = '%u'", gm, targetAccountId); return true; - }else + } + else { // Check for second parameter - if(!arg2) + if (!arg2) return false; // Check for account targetAccountName = arg1; - if(!AccountMgr::normalizeString(targetAccountName)) + if (!AccountMgr::normalizeString(targetAccountName)) { PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,targetAccountName.c_str()); SetSentErrorMessage(true); @@ -1444,7 +1443,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) // Check for invalid specified GM level. gm = atoi(arg2); - if ( (gm < SEC_PLAYER || gm > SEC_ADMINISTRATOR) ) + if (gm < SEC_PLAYER || gm > SEC_ADMINISTRATOR) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); @@ -1458,7 +1457,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args) /// can set security level only for target with less security and to less security that we have /// This is also reject self apply in fact targetSecurity = accmgr.GetSecurity(targetAccountId); - if(targetSecurity >= plSecurity || gm >= plSecurity ) + if (targetSecurity >= plSecurity || gm >= plSecurity) { SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); SetSentErrorMessage(true); @@ -1486,7 +1485,7 @@ bool ChatHandler::HandleAccountSetPasswordCommand(const char* args) return false; std::string account_name = szAccount; - if(!AccountMgr::normalizeString(account_name)) + if (!AccountMgr::normalizeString(account_name)) { PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str()); SetSentErrorMessage(true); @@ -1503,7 +1502,7 @@ bool ChatHandler::HandleAccountSetPasswordCommand(const char* args) /// can set password only for target with less security /// This is also reject self apply in fact - if(HasLowerSecurityAccount (NULL,targetAccountId,true)) + if (HasLowerSecurityAccount (NULL,targetAccountId,true)) return false; if (strcmp(szPassword1,szPassword2)) @@ -1515,7 +1514,7 @@ bool ChatHandler::HandleAccountSetPasswordCommand(const char* args) AccountOpResult result = accmgr.ChangePassword(targetAccountId, szPassword1); - switch(result) + switch (result) { case AOR_OK: SendSysMessage(LANG_COMMAND_PASSWORD); @@ -1556,12 +1555,12 @@ bool ChatHandler::HandleSetSkillCommand(const char* args) { // number or [name] Shift-click form |color|Hskill:skill_id|h[name]|h|r char* skill_p = extractKeyFromLink((char*)args,"Hskill"); - if(!skill_p) + if (!skill_p) return false; char *level_p = strtok (NULL, " "); - if( !level_p) + if (!level_p) return false; char *max_p = strtok (NULL, " "); @@ -1577,7 +1576,7 @@ bool ChatHandler::HandleSetSkillCommand(const char* args) int32 level = atol (level_p); Player * target = getSelectedPlayer(); - if(!target) + if (!target) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); @@ -1585,7 +1584,7 @@ bool ChatHandler::HandleSetSkillCommand(const char* args) } SkillLineEntry const* sl = sSkillLineStore.LookupEntry(skill); - if(!sl) + if (!sl) { PSendSysMessage(LANG_INVALID_SKILL_ID, skill); SetSentErrorMessage(true); @@ -1594,7 +1593,7 @@ bool ChatHandler::HandleSetSkillCommand(const char* args) std::string tNameLink = GetNameLink(target); - if(!target->GetSkillValue(skill)) + if (!target->GetSkillValue(skill)) { PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, sl->name[0]); SetSentErrorMessage(true); @@ -1603,7 +1602,7 @@ bool ChatHandler::HandleSetSkillCommand(const char* args) int32 max = max_p ? atol (max_p) : target->GetPureMaxSkillValue(skill); - if( level <= 0 || level > max || max <= 0 ) + if (level <= 0 || level > max || max <= 0) return false; target->SetSkill(skill, level, max); @@ -1619,21 +1618,21 @@ bool ChatHandler::HandleUnLearnCommand(const char* args) // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r uint32 spell_id = extractSpellIdFromLink((char*)args); - if(!spell_id) + if (!spell_id) return false; char const* allStr = strtok(NULL," "); bool allRanks = allStr ? (strncmp(allStr, "all", strlen(allStr)) == 0) : false; Player* target = getSelectedPlayer(); - if(!target) + if (!target) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } - if(allRanks) + if (allRanks) spell_id = spellmgr.GetFirstSpellInChain (spell_id); if (target->HasSpell(spell_id)) @@ -1641,7 +1640,7 @@ bool ChatHandler::HandleUnLearnCommand(const char* args) else SendSysMessage(LANG_FORGET_SPELL); - if(GetTalentSpellCost(spell_id)) + if (GetTalentSpellCost(spell_id)) target->SendTalentsInfoData(false); return true; @@ -1650,7 +1649,7 @@ bool ChatHandler::HandleUnLearnCommand(const char* args) bool ChatHandler::HandleCooldownCommand(const char* args) { Player* target = getSelectedPlayer(); - if(!target) + if (!target) { SendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); @@ -1668,10 +1667,10 @@ bool ChatHandler::HandleCooldownCommand(const char* args) { // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form uint32 spell_id = extractSpellIdFromLink((char*)args); - if(!spell_id) + if (!spell_id) return false; - if(!sSpellStore.LookupEntry(spell_id)) + if (!sSpellStore.LookupEntry(spell_id)) { PSendSysMessage(LANG_UNKNOWN_SPELL, target==m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str()); SetSentErrorMessage(true); diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 4ab2f05dc49..067d953e381 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -217,7 +217,7 @@ void Unit::Update( uint32 p_time ) { m_AurasCheck = 2000; _UpdateAura(); - }else + } else m_AurasCheck -= p_time;*/ // WARNING! Order of execution here is important, do not change. |