diff options
10 files changed, 630 insertions, 427 deletions
diff --git a/sql/FULL/world_script_waypoints.sql b/sql/FULL/world_script_waypoints.sql index f7c7e30631d..5aae839f3ec 100644 --- a/sql/FULL/world_script_waypoints.sql +++ b/sql/FULL/world_script_waypoints.sql @@ -13,6 +13,18 @@ CREATE TABLE script_waypoint ( PRIMARY KEY (entry, pointid) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Creature waypoints'; +DELETE FROM script_waypoint WHERE entry=18731; +INSERT INTO script_waypoint VALUES +(18731, 0, -157.366, 2.177, 8.073, 0, ''), +(18731, 1, -172.266, -18.280, 8.073, 0, ''), +(18731, 2, -171.051, -38.748, 8.073, 0, ''), +(18731, 3, -170.718, -59.436, 8.073, 0, ''), +(18731, 4, -156.659, -72.118, 8.073, 0, ''), +(18731, 5, -142.292, -59.423, 8.073, 0, ''), +(18731, 6, -141.779, -38.972, 8.073, 0, ''), +(18731, 7, -142.922, -18.950, 8.073, 0, ''), +(18731, 8, -157.366, 2.177, 8.073, 0, ''); + DELETE FROM script_waypoint WHERE entry=21027; INSERT INTO script_waypoint VALUES (21027, 0, -2714.697266, 1326.879395, 34.306953, 0, ''), @@ -378,7 +390,7 @@ INSERT INTO script_waypoint VALUES DELETE FROM script_waypoint WHERE entry=2768; INSERT INTO script_waypoint VALUES -(2768, 0, -2066.45, -2085.96, 9.08, 0, ''), +(2768, 0, -2077.73, -2091.17, 9.49, 0, ''), (2768, 1, -2077.99, -2105.33, 13.24, 0, ''), (2768, 2, -2074.60, -2109.67, 14.24, 0, ''), (2768, 3, -2076.60, -2117.46, 16.67, 0, ''), @@ -396,7 +408,7 @@ INSERT INTO script_waypoint VALUES (2768, 15, -2076.60, -2117.46, 16.67, 0, ''), (2768, 16, -2074.60, -2109.67, 14.24, 0, ''), (2768, 17, -2077.99, -2105.33, 13.24, 0, ''), -(2768, 18, -2066.45, -2085.96, 9.08, 0, ''), +(2768, 18, -2077.73, -2091.17, 9.49, 0, ''), (2768, 19, -2066.41, -2086.21, 8.97, 6000, ''), (2768, 20, -2066.41, -2086.21, 8.97, 2000, ''); diff --git a/sql/FULL/world_scripts_full.sql b/sql/FULL/world_scripts_full.sql index 7b86cb1167e..fa83cee479a 100644 --- a/sql/FULL/world_scripts_full.sql +++ b/sql/FULL/world_scripts_full.sql @@ -911,6 +911,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_marin_noggenfogger' WHERE `entr UPDATE `creature_template` SET `ScriptName`='npc_steward_of_time' WHERE `entry`=20142; UPDATE `creature_template` SET `ScriptName`='npc_stone_watcher_of_norgannon' WHERE `entry`=7918; UPDATE `creature_template` SET `ScriptName`='npc_OOX17' WHERE `entry`=7784; +UPDATE `creature_template` SET `ScriptNam`e='npc_tooga' WHERE `entry`=5955; /* TELDRASSIL */ UPDATE `creature_template` SET `ScriptName`='npc_mist' WHERE `entry`=3568; diff --git a/sql/updates/5012_world_scripts.sql b/sql/updates/5012_world_scripts.sql new file mode 100644 index 00000000000..fa3b6e7a860 --- /dev/null +++ b/sql/updates/5012_world_scripts.sql @@ -0,0 +1,18 @@ +DELETE FROM script_waypoint WHERE entry=18731; +INSERT INTO script_waypoint VALUES +(18731, 0, -157.366, 2.177, 8.073, 0, ''), +(18731, 1, -172.266, -18.280, 8.073, 0, ''), +(18731, 2, -171.051, -38.748, 8.073, 0, ''), +(18731, 3, -170.718, -59.436, 8.073, 0, ''), +(18731, 4, -156.659, -72.118, 8.073, 0, ''), +(18731, 5, -142.292, -59.423, 8.073, 0, ''), +(18731, 6, -141.779, -38.972, 8.073, 0, ''), +(18731, 7, -142.922, -18.950, 8.073, 0, ''), +(18731, 8, -157.366, 2.177, 8.073, 0, ''); + +DELETE FROM script_waypoint WHERE entry=2768 AND pointid IN (0, 18); +INSERT INTO script_waypoint VALUES +(2768, 0, -2077.73, -2091.17, 9.49, 0, ''), +(2768, 18, -2077.73, -2091.17, 9.49, 0, ''); + +UPDATE creature_template SET ScriptName='npc_tooga' WHERE entry=5955; diff --git a/src/bindings/scripts/scripts/boss/boss_emeriss.cpp b/src/bindings/scripts/scripts/boss/boss_emeriss.cpp index 5814c58773d..9881525e3ad 100644 --- a/src/bindings/scripts/scripts/boss/boss_emeriss.cpp +++ b/src/bindings/scripts/scripts/boss/boss_emeriss.cpp @@ -23,124 +23,113 @@ EndScriptData */ #include "precompiled.h" -#define SPELL_SLEEP 24777 -#define SPELL_NOXIOUSBREATH 24818 -#define SPELL_TAILSWEEP 15847 -//#define SPELL_MARKOFNATURE 25040 // Not working -#define SPELL_VOLATILEINFECTION 24928 -#define SPELL_CORRUPTIONOFEARTH 24910 +enum +{ + SAY_AGGRO = -1000401, + SAY_CASTCORRUPTION = -1000402, + + SPELL_SLEEP = 24777, + SPELL_NOXIOUSBREATH = 24818, + SPELL_TAILSWEEP = 15847, + //SPELL_MARKOFNATURE = 25040, // Not working + SPELL_VOLATILEINFECTION = 24928, + SPELL_CORRUPTIONOFEARTH = 24910 +}; struct TRINITY_DLL_DECL boss_emerissAI : public ScriptedAI { boss_emerissAI(Creature *c) : ScriptedAI(c) {} - uint32 Sleep_Timer; - uint32 NoxiousBreath_Timer; - uint32 TailSweep_Timer; - //uint32 MarkOfNature_Timer; - uint32 VolatileInfection_Timer; - uint32 CorruptionofEarth1_Timer; - uint32 CorruptionofEarth2_Timer; - uint32 CorruptionofEarth3_Timer; + uint32 m_uiSleep_Timer; + uint32 m_uiNoxiousBreath_Timer; + uint32 m_uiTailSweep_Timer; + //uint32 m_uiMarkOfNature_Timer; + uint32 m_uiVolatileInfection_Timer; + uint32 m_uiCorruptionsCasted; + void Reset() { - Sleep_Timer = 15000 + rand()%5000; - NoxiousBreath_Timer = 8000; - TailSweep_Timer = 4000; - //MarkOfNature_Timer = 45000; - VolatileInfection_Timer = 12000; - CorruptionofEarth1_Timer = 0; - CorruptionofEarth2_Timer = 0; - CorruptionofEarth3_Timer = 0; + m_uiSleep_Timer = 15000 + rand()%5000; + m_uiNoxiousBreath_Timer = 8000; + m_uiTailSweep_Timer = 4000; + //m_uiMarkOfNature_Timer = 45000; + m_uiVolatileInfection_Timer = 12000; + m_uiCorruptionsCasted = 0; } - void EnterCombat(Unit *who) {} + void Aggro(Unit* pWho) + { + DoScriptText(SAY_AGGRO, m_creature); + } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { //Return since we have no target if (!UpdateVictim()) return; //Sleep_Timer - if (Sleep_Timer < diff) + if (m_uiSleep_Timer < uiDiff) { - if (Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0)) - DoCast(target,SPELL_SLEEP); + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + DoCast(pTarget, SPELL_SLEEP); - Sleep_Timer = 8000 + rand()%8000; - }else Sleep_Timer -= diff; + m_uiSleep_Timer = 8000 + rand()%8000; + } + else + m_uiSleep_Timer -= uiDiff; //NoxiousBreath_Timer - if (NoxiousBreath_Timer < diff) + if (m_uiNoxiousBreath_Timer < uiDiff) { - DoCast(m_creature->getVictim(),SPELL_NOXIOUSBREATH); - NoxiousBreath_Timer = 14000 + rand()%6000; - }else NoxiousBreath_Timer -= diff; + DoCast(m_creature->getVictim(), SPELL_NOXIOUSBREATH); + m_uiNoxiousBreath_Timer = 14000 + rand()%6000; + } + else + m_uiNoxiousBreath_Timer -= uiDiff; //Tailsweep every 2 seconds - if (TailSweep_Timer < diff) + if (m_uiTailSweep_Timer < uiDiff) { - if (Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0)) - DoCast(target,SPELL_TAILSWEEP); - - TailSweep_Timer = 2000; - }else TailSweep_Timer -= diff; + DoCast(m_creature, SPELL_TAILSWEEP); + m_uiTailSweep_Timer = 2000; + } + else + m_uiTailSweep_Timer -= uiDiff; //MarkOfNature_Timer - //if (MarkOfNature_Timer < diff) + //if (m_uiMarkOfNature_Timer < uiDiff) //{ - // DoCast(m_creature->getVictim(),SPELL_MARKOFNATURE); - // MarkOfNature_Timer = 45000; - //}else MarkOfNature_Timer -= diff; - - //VolatileInfection_Timer - if (VolatileInfection_Timer < diff) - { - DoCast(m_creature->getVictim(),SPELL_VOLATILEINFECTION); - VolatileInfection_Timer = 7000 + rand()%5000; - }else VolatileInfection_Timer -= diff; - - //CorruptionofEarth_Timer - if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 75) - { - if (CorruptionofEarth1_Timer < diff) - { - DoCast(m_creature->getVictim(),SPELL_CORRUPTIONOFEARTH); + // DoCast(m_creature->getVictim(), SPELL_MARKOFNATURE); + // m_uiMarkOfNature_Timer = 45000; + //} + //else + // m_uiMarkOfNature_Timer -= uiDiff; - //1 minutes for next one. Means not again with this health value - CorruptionofEarth1_Timer = 60000; - } else CorruptionofEarth1_Timer -= diff; - } - //CorruptionofEarth_Timer - if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 50) + //VolatileInfection_Timer + if (m_uiVolatileInfection_Timer < uiDiff) { - if (CorruptionofEarth2_Timer < diff) - { - DoCast(m_creature->getVictim(),SPELL_CORRUPTIONOFEARTH); - - //1 minutes for next one. Means not again with this health value - CorruptionofEarth2_Timer = 60000; - } else CorruptionofEarth2_Timer -= diff; + DoCast(m_creature->getVictim(), SPELL_VOLATILEINFECTION); + m_uiVolatileInfection_Timer = 7000 + rand()%5000; } + else + m_uiVolatileInfection_Timer -= uiDiff; //CorruptionofEarth_Timer - if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 25) - { - if (CorruptionofEarth3_Timer < diff) - { - DoCast(m_creature->getVictim(),SPELL_CORRUPTIONOFEARTH); - - //1 minutes for next one. Means not again with this health value - CorruptionofEarth3_Timer = 60000; - } else CorruptionofEarth3_Timer -= diff; + //CorruptionofEarth at 75%, 50% and 25% + if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= (100-(25*m_uiCorruptionsCasted))) + { + ++m_uiCorruptionsCasted; // prevent casting twice on same hp + DoScriptText(SAY_CASTCORRUPTION, m_creature); + DoCast(m_creature->getVictim(), SPELL_CORRUPTIONOFEARTH); } DoMeleeAttackIfReady(); } }; + CreatureAI* GetAI_boss_emeriss(Creature* pCreature) { return new boss_emerissAI (pCreature); diff --git a/src/bindings/scripts/scripts/boss/boss_taerar.cpp b/src/bindings/scripts/scripts/boss/boss_taerar.cpp index 11baa975e0c..3f45ab26331 100644 --- a/src/bindings/scripts/scripts/boss/boss_taerar.cpp +++ b/src/bindings/scripts/scripts/boss/boss_taerar.cpp @@ -16,103 +16,92 @@ /* ScriptData SDName: Taerar -SD%Complete: 90 -SDComment: Mark of Nature & Teleport NYI +SD%Complete: 70 +SDComment: Mark of Nature & Teleport NYI. Fix the way to be banished. SDCategory: Bosses EndScriptData */ #include "precompiled.h" -//Spells of Taerar - -#define SPELL_SLEEP 24777 -#define SPELL_NOXIOUSBREATH 24818 -#define SPELL_TAILSWEEP 15847 -//#define SPELL_MARKOFNATURE 25040 // Not working -#define SPELL_ARCANEBLAST 24857 -#define SPELL_BELLOWINGROAR 22686 -#define SPELL_SUMMONSHADE 24843 - -//Spells of Shades of Taerar +enum +{ + SAY_AGGRO = -1000399, + SAY_SUMMONSHADE = -1000400, + + //Spells of Taerar + SPELL_SLEEP = 24777, + SPELL_NOXIOUSBREATH = 24818, + SPELL_TAILSWEEP = 15847, + // SPELL_MARKOFNATURE = 25040, // Not working + SPELL_ARCANEBLAST = 24857, + SPELL_BELLOWINGROAR = 22686, + + SPELL_SUMMONSHADE_1 = 24841, + SPELL_SUMMONSHADE_2 = 24842, + SPELL_SUMMONSHADE_3 = 24843, + + //Spells of Shades of Taerar + SPELL_POSIONCLOUD = 24840, + SPELL_POSIONBREATH = 20667 +}; -#define SPELL_POSIONCLOUD 24840 -#define SPELL_POSIONBREATH 20667 +uint32 m_auiSpellSummonShade[]= +{ + SPELL_SUMMONSHADE_1, SPELL_SUMMONSHADE_2, SPELL_SUMMONSHADE_3 +}; struct TRINITY_DLL_DECL boss_taerarAI : public ScriptedAI { boss_taerarAI(Creature *c) : ScriptedAI(c) {} - uint32 Sleep_Timer; - uint32 NoxiousBreath_Timer; - uint32 TailSweep_Timer; - //uint32 MarkOfNature_Timer; - uint32 ArcaneBlast_Timer; - uint32 BellowingRoar_Timer; - uint32 Shades_Timer; - uint32 Summon1_Timer; - uint32 Summon2_Timer; - uint32 Summon3_Timer; - int Rand; - int RandX; - int RandY; - Creature* Summoned; - bool Shades; + uint32 m_uiSleep_Timer; + uint32 m_uiNoxiousBreath_Timer; + uint32 m_uiTailSweep_Timer; + //uint32 m_uiMarkOfNature_Timer; + uint32 m_uiArcaneBlast_Timer; + uint32 m_uiBellowingRoar_Timer; + uint32 m_uiShades_Timer; + uint32 m_uiShadesSummoned; + + bool m_bShades; void Reset() { - Sleep_Timer = 15000 + rand()%5000; - NoxiousBreath_Timer = 8000; - TailSweep_Timer = 4000; - //MarkOfNature_Timer = 45000; - ArcaneBlast_Timer = 12000; - BellowingRoar_Timer = 30000; - Summon1_Timer = 0; - Summon2_Timer = 0; - Summon3_Timer = 0; - Shades_Timer = 60000; //The time that Taerar is banished - Shades = false; + m_uiSleep_Timer = 15000 + rand()%5000; + m_uiNoxiousBreath_Timer = 8000; + m_uiTailSweep_Timer = 4000; + //m_uiMarkOfNature_Timer = 45000; + m_uiArcaneBlast_Timer = 12000; + m_uiBellowingRoar_Timer = 30000; + m_uiShades_Timer = 60000; //The time that Taerar is banished + m_uiShadesSummoned = 0; + + m_bShades = false; } - void EnterCombat(Unit *who) + void EnterCombat(Unit* pWho) { + DoScriptText(SAY_AGGRO, m_creature); } - void SummonShades(Unit* victim) + void JustSummoned(Creature* pSummoned) { - if (!victim) - return; - - Rand = rand()%15; - switch (rand()%2) - { - case 0: RandX = 0 - Rand; break; - case 1: RandX = 0 + Rand; break; - } - Rand = 0; - Rand = rand()%15; - switch (rand()%2) - { - case 0: RandY = 0 - Rand; break; - case 1: RandY = 0 + Rand; break; - } - Rand = 0; - Summoned = DoSpawnCreature(15302, RandX, RandY, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); - if (Summoned) - (Summoned->AI())->AttackStart(victim); + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + pSummoned->AI()->AttackStart(pTarget); } - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { - if (Shades && Shades_Timer < diff) + if (m_bShades && m_uiShades_Timer < uiDiff) { //Become unbanished again m_creature->setFaction(14); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - //m_creature->m_canMove = true; - Shades = false; - } else if (Shades) + m_bShades = false; + } + else if (m_bShades) { - Shades_Timer -= diff; + m_uiShades_Timer -= uiDiff; //Do nothing while banished return; } @@ -122,119 +111,84 @@ struct TRINITY_DLL_DECL boss_taerarAI : public ScriptedAI return; //Sleep_Timer - if (Sleep_Timer < diff) + if (m_uiSleep_Timer < uiDiff) { - Unit* target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM,0); - if (target) DoCast(target,SPELL_SLEEP); + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + DoCast(pTarget, SPELL_SLEEP); - Sleep_Timer = 8000 + rand()%7000; - }else Sleep_Timer -= diff; + m_uiSleep_Timer = 8000 + rand()%7000; + } + else + m_uiSleep_Timer -= uiDiff; //NoxiousBreath_Timer - if (NoxiousBreath_Timer < diff) + if (m_uiNoxiousBreath_Timer < uiDiff) { - DoCast(m_creature->getVictim(),SPELL_NOXIOUSBREATH); - NoxiousBreath_Timer = 14000 + rand()%6000; - } else NoxiousBreath_Timer -= diff; + DoCast(m_creature->getVictim(), SPELL_NOXIOUSBREATH); + m_uiNoxiousBreath_Timer = 14000 + rand()%6000; + } + else + m_uiNoxiousBreath_Timer -= uiDiff; //Tailsweep every 2 seconds - if (TailSweep_Timer < diff) + if (m_uiTailSweep_Timer < uiDiff) { - if (Unit *target = SelectUnit(SELECT_TARGET_RANDOM,0)) - DoCast(target,SPELL_TAILSWEEP); - - TailSweep_Timer = 2000; - }else TailSweep_Timer -= diff; + DoCast(m_creature, SPELL_TAILSWEEP); + m_uiTailSweep_Timer = 2000; + } + else + m_uiTailSweep_Timer -= uiDiff; //MarkOfNature_Timer - //if (MarkOfNature_Timer < diff) + //if (m_uiMarkOfNature_Timer < uiDiff) //{ - // DoCast(m_creature->getVictim(),SPELL_MARKOFNATURE); - // MarkOfNature_Timer = 45000; - //}else MarkOfNature_Timer -= diff; + // DoCast(m_creature->getVictim(), SPELL_MARKOFNATURE); + // m_uiMarkOfNature_Timer = 45000; + //} + //else + // m_uiMarkOfNature_Timer -= uiDiff; //ArcaneBlast_Timer - if (ArcaneBlast_Timer < diff) + if (m_uiArcaneBlast_Timer < uiDiff) { - DoCast(m_creature->getVictim(),SPELL_ARCANEBLAST); - ArcaneBlast_Timer = 7000 + rand()%5000; - }else ArcaneBlast_Timer -= diff; + DoCast(m_creature->getVictim(), SPELL_ARCANEBLAST); + m_uiArcaneBlast_Timer = 7000 + rand()%5000; + } + else + m_uiArcaneBlast_Timer -= uiDiff; //BellowingRoar_Timer - if (BellowingRoar_Timer < diff) + if (m_uiBellowingRoar_Timer < uiDiff) { - DoCast(m_creature->getVictim(),SPELL_BELLOWINGROAR); - BellowingRoar_Timer = 20000 + rand()%10000; - } else BellowingRoar_Timer -= diff; - - //Summon 3 Shades - if (!Shades && (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 75) - { - if (Summon1_Timer < diff) - { - //Inturrupt any spell casting - m_creature->InterruptNonMeleeSpells(false); - m_creature->setFaction(35); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - //m_creature->m_canMove = false; - - //Cast - Unit* target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM,0); - SummonShades(target); - SummonShades(target); - SummonShades(target); - Summon1_Timer = 120000; - Shades = true; - Shades_Timer = 60000; - } else Summon1_Timer -= diff; + DoCast(m_creature->getVictim(), SPELL_BELLOWINGROAR); + m_uiBellowingRoar_Timer = 20000 + rand()%10000; } + else + m_uiBellowingRoar_Timer -= uiDiff; - //Summon 3 Shades - if (!Shades && (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 50) + //Summon 3 Shades at 75%, 50% and 25% (if bShades is true we already left in line 117, no need to check here again) + if (!m_bShades && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= (100-(25*m_uiShadesSummoned))) { - if (Summon2_Timer < diff) + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { //Inturrupt any spell casting m_creature->InterruptNonMeleeSpells(false); - m_creature->setFaction(35); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - //m_creature->m_canMove = false; - - //Cast - Unit* target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM,0); - SummonShades(target); - SummonShades(target); - SummonShades(target); - Summon2_Timer = 120000; - Shades = true; - Shades_Timer = 60000; - } else Summon2_Timer -= diff; - } - //Summon 3 Shades - if (!Shades && (int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 25) - { - if (Summon3_Timer < diff) - { - //Inturrupt any spell casting - m_creature->InterruptNonMeleeSpells(false); + //horrible workaround, need to fix m_creature->setFaction(35); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - //m_creature->m_canMove = false; - - //Cast - Unit* target = NULL; - target = SelectUnit(SELECT_TARGET_RANDOM,0); - SummonShades(target); - SummonShades(target); - SummonShades(target); - Summon3_Timer = 120000; - Shades = true; - Shades_Timer = 60000; - } else Summon3_Timer -= diff; + + DoScriptText(SAY_SUMMONSHADE, m_creature); + + int iSize = sizeof(m_auiSpellSummonShade) / sizeof(uint32); + + for(int i = 0; i < iSize; ++i) + m_creature->CastSpell(pTarget, m_auiSpellSummonShade[i], true); + + ++m_uiShadesSummoned; // prevent casting twice at same health + m_bShades = true; + } + m_uiShades_Timer = 60000; } DoMeleeAttackIfReady(); @@ -242,42 +196,41 @@ struct TRINITY_DLL_DECL boss_taerarAI : public ScriptedAI }; // Shades of Taerar Script - struct TRINITY_DLL_DECL boss_shadeoftaerarAI : public ScriptedAI { boss_shadeoftaerarAI(Creature *c) : ScriptedAI(c) {} - uint32 PoisonCloud_Timer; - uint32 PosionBreath_Timer; + uint32 m_uiPoisonCloud_Timer; + uint32 m_uiPosionBreath_Timer; void Reset() { - PoisonCloud_Timer = 8000; - PosionBreath_Timer = 12000; + m_uiPoisonCloud_Timer = 8000; + m_uiPosionBreath_Timer = 12000; } - void EnterCombat(Unit *who) - { - } - - void UpdateAI(const uint32 diff) + void UpdateAI(const uint32 uiDiff) { if (!UpdateVictim()) return; //PoisonCloud_Timer - if (PoisonCloud_Timer < diff) + if (m_uiPoisonCloud_Timer < uiDiff) { - DoCast(m_creature->getVictim(),SPELL_POSIONCLOUD); - PoisonCloud_Timer = 30000; - }else PoisonCloud_Timer -= diff; + DoCast(m_creature->getVictim(), SPELL_POSIONCLOUD); + m_uiPoisonCloud_Timer = 30000; + } + else + m_uiPoisonCloud_Timer -= uiDiff; //PosionBreath_Timer - if (PosionBreath_Timer < diff) + if (m_uiPosionBreath_Timer < uiDiff) { - DoCast(m_creature->getVictim(),SPELL_POSIONBREATH); - PosionBreath_Timer = 12000; - }else PosionBreath_Timer -= diff; + DoCast(m_creature->getVictim(), SPELL_POSIONBREATH); + m_uiPosionBreath_Timer = 12000; + } + else + m_uiPosionBreath_Timer -= uiDiff; DoMeleeAttackIfReady(); } diff --git a/src/bindings/scripts/scripts/boss/boss_ysondre.cpp b/src/bindings/scripts/scripts/boss/boss_ysondre.cpp index 116f8807cd3..1b93f54c047 100644 --- a/src/bindings/scripts/scripts/boss/boss_ysondre.cpp +++ b/src/bindings/scripts/scripts/boss/boss_ysondre.cpp @@ -25,16 +25,18 @@ EndScriptData */ enum { - SAY_AGGRO = -1000360, // sound unknown - SAY_SUMMONDRUIDS = -1000361, // sound unknown + SAY_AGGRO = -1000360, + SAY_SUMMONDRUIDS = -1000361, SPELL_SLEEP = 24777, SPELL_NOXIOUSBREATH = 24818, SPELL_TAILSWEEP = 15847, - //#SPELL_MARKOFNATURE = 25040, // Not working + //SPELL_MARKOFNATURE = 25040, // Not working SPELL_LIGHTNINGWAVE = 24819, SPELL_SUMMONDRUIDS = 24795, + SPELL_SUMMON_PLAYER = 24776, + //druid spells SPELL_MOONFIRE = 21669 }; @@ -49,9 +51,7 @@ struct TRINITY_DLL_DECL boss_ysondreAI : public ScriptedAI uint32 m_uiTailSweep_Timer; //uint32 m_uiMarkOfNature_Timer; uint32 m_uiLightningWave_Timer; - uint32 m_uiSummonDruids1_Timer; - uint32 m_uiSummonDruids2_Timer; - uint32 m_uiSummonDruids3_Timer; + uint32 m_uiSummonDruidModifier; void Reset() { @@ -60,9 +60,7 @@ struct TRINITY_DLL_DECL boss_ysondreAI : public ScriptedAI m_uiTailSweep_Timer = 4000; //m_uiMarkOfNature_Timer = 45000; m_uiLightningWave_Timer = 12000; - m_uiSummonDruids1_Timer = 0; - m_uiSummonDruids2_Timer = 0; - m_uiSummonDruids3_Timer = 0; + m_uiSummonDruidModifier = 0; } void EnterCombat(Unit* pWho) @@ -70,13 +68,10 @@ struct TRINITY_DLL_DECL boss_ysondreAI : public ScriptedAI DoScriptText(SAY_AGGRO, m_creature); } - void DoSummonDruids() + void JustSummoned(Creature* pSummoned) { - for(int i = 0; i < 10; ++i) - { - if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) - DoCast(pTarget, SPELL_SUMMONDRUIDS, true); - } + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + pSummoned->AI()->AttackStart(pTarget); } void UpdateAI(const uint32 uiDiff) @@ -87,8 +82,8 @@ struct TRINITY_DLL_DECL boss_ysondreAI : public ScriptedAI //Sleep_Timer if (m_uiSleep_Timer < uiDiff) { - if (Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SLEEP); + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + DoCast(pTarget, SPELL_SLEEP); m_uiSleep_Timer = 8000 + rand()%7000; } @@ -137,42 +132,14 @@ struct TRINITY_DLL_DECL boss_ysondreAI : public ScriptedAI m_uiLightningWave_Timer -= uiDiff; //Summon Druids - if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 75) + if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= (100-(25*m_uiSummonDruidModifier))) { - if (m_uiSummonDruids1_Timer < uiDiff) - { - DoScriptText(SAY_SUMMONDRUIDS, m_creature); - DoSummonDruids(); - m_uiSummonDruids1_Timer = 60000; - } - else - m_uiSummonDruids1_Timer -= uiDiff; - } + DoScriptText(SAY_SUMMONDRUIDS, m_creature); - //Summon Druids - if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 50) - { - if (m_uiSummonDruids2_Timer < uiDiff) - { - DoScriptText(SAY_SUMMONDRUIDS, m_creature); - DoSummonDruids(); - m_uiSummonDruids2_Timer = 60000; - } - else - m_uiSummonDruids2_Timer -= uiDiff; - } + for(int i = 0; i < 10; ++i) + DoCast(m_creature, SPELL_SUMMONDRUIDS, true); - //Summon Druids - if ((int) (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() +0.5) == 25) - { - if (m_uiSummonDruids3_Timer < uiDiff) - { - DoScriptText(SAY_SUMMONDRUIDS, m_creature); - DoSummonDruids(); - m_uiSummonDruids3_Timer = 60000; - } - else - m_uiSummonDruids3_Timer -= uiDiff; + ++m_uiSummonDruidModifier; } DoMeleeAttackIfReady(); diff --git a/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp b/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp index 98d589ed009..0a4b6839011 100644 --- a/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp +++ b/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp @@ -32,31 +32,32 @@ EndContentData */ ## npc_professor_phizzlethorpe ######*/ -#define SAY_PROGRESS_1 -1000235 -#define SAY_PROGRESS_2 -1000236 -#define SAY_PROGRESS_3 -1000237 -#define EMOTE_PROGRESS_4 -1000238 -#define SAY_AGGRO -1000239 -#define SAY_PROGRESS_5 -1000240 -#define SAY_PROGRESS_6 -1000241 -#define SAY_PROGRESS_7 -1000242 -#define EMOTE_PROGRESS_8 -1000243 -#define SAY_PROGRESS_9 -1000244 - -#define QUEST_SUNKEN_TREASURE 665 -#define MOB_VENGEFUL_SURGE 2776 +enum +{ + SAY_PROGRESS_1 = -1000235, + SAY_PROGRESS_2 = -1000236, + SAY_PROGRESS_3 = -1000237, + EMOTE_PROGRESS_4 = -1000238, + SAY_AGGRO = -1000239, + SAY_PROGRESS_5 = -1000240, + SAY_PROGRESS_6 = -1000241, + SAY_PROGRESS_7 = -1000242, + EMOTE_PROGRESS_8 = -1000243, + SAY_PROGRESS_9 = -1000244, + + QUEST_SUNKEN_TREASURE = 665, + MOB_VENGEFUL_SURGE = 2776 +}; struct TRINITY_DLL_DECL npc_professor_phizzlethorpeAI : public npc_escortAI { npc_professor_phizzlethorpeAI(Creature *c) : npc_escortAI(c) {} - bool m_bCompleted; - - void WaypointReached(uint32 i) + void WaypointReached(uint32 uiPointId) { Player* pPlayer = Unit::GetPlayer(PlayerGUID); - switch(i) + switch(uiPointId) { case 4:DoScriptText(SAY_PROGRESS_2, m_creature, pPlayer);break; case 5:DoScriptText(SAY_PROGRESS_3, m_creature, pPlayer);break; @@ -68,31 +69,28 @@ struct TRINITY_DLL_DECL npc_professor_phizzlethorpeAI : public npc_escortAI break; } case 10:DoScriptText(SAY_PROGRESS_5, m_creature, pPlayer);break; - case 11:DoScriptText(SAY_PROGRESS_6, m_creature, pPlayer);break; + case 11: + DoScriptText(SAY_PROGRESS_6, m_creature, pPlayer); + SetRun(); + break; case 19:DoScriptText(SAY_PROGRESS_7, m_creature, pPlayer); break; case 20: DoScriptText(EMOTE_PROGRESS_8, m_creature); DoScriptText(SAY_PROGRESS_9, m_creature, pPlayer); - m_bCompleted = true; if (pPlayer) CAST_PLR(pPlayer)->GroupEventHappens(QUEST_SUNKEN_TREASURE, m_creature); break; } } - void JustSummoned(Creature *summoned) - { - summoned->AI()->AttackStart(m_creature); - } - - void Reset() + void JustSummoned(Creature* pSummoned) { - m_bCompleted = true; + pSummoned->AI()->AttackStart(m_creature); } - void EnterCombat(Unit* who) + void EnterCombat(Unit* pWho) { - DoScriptText(SAY_AGGRO, m_creature, NULL); + DoScriptText(SAY_AGGRO, m_creature); } void UpdateAI(const uint32 diff) @@ -101,13 +99,13 @@ struct TRINITY_DLL_DECL npc_professor_phizzlethorpeAI : public npc_escortAI } }; -bool QuestAccept_npc_professor_phizzlethorpe(Player* pPlayer, Creature* pCreature, Quest const* quest) +bool QuestAccept_npc_professor_phizzlethorpe(Player* pPlayer, Creature* pCreature, Quest const* pQuest) { - if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) + if (pQuest->GetQuestId() == QUEST_SUNKEN_TREASURE) { DoScriptText(SAY_PROGRESS_1, pCreature, pPlayer); if (npc_escortAI* pEscortAI = CAST_AI(npc_professor_phizzlethorpeAI, (pCreature->AI()))) - pEscortAI->Start(false, false, pPlayer->GetGUID()); + pEscortAI->Start(false, false, pPlayer->GetGUID(), pQuest); pCreature->setFaction(113); } diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp index 70e37b48504..7266c0d5a2a 100644 --- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp +++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/boss_ambassador_hellmaw.cpp @@ -16,41 +16,41 @@ /* ScriptData SDName: Boss_Ambassador_Hellmaw -SD%Complete: 75 -SDComment: Waypoints after Intro not implemented. Enrage spell missing/not known +SD%Complete: 80 +SDComment: Enrage spell missing/not known SDCategory: Auchindoun, Shadow Labyrinth EndScriptData */ #include "precompiled.h" +#include "../../../npc/npc_escortAI.h" #include "def_shadow_labyrinth.h" -#define SAY_INTRO -1555000 - -#define SAY_AGGRO1 -1555001 -#define SAY_AGGRO2 -1555002 -#define SAY_AGGRO3 -1555003 - -#define SAY_HELP -1555004 - -#define SAY_SLAY1 -1555005 -#define SAY_SLAY2 -1555006 - -#define SAY_DEATH -1555007 - -#define SPELL_BANISH 30231 -#define SPELL_CORROSIVE_ACID 33551 -#define SPELL_FEAR 33547 -#define SPELL_ENRAGE 34970 +enum +{ + SAY_INTRO = -1555000, + SAY_AGGRO1 = -1555001, + SAY_AGGRO2 = -1555002, + SAY_AGGRO3 = -1555003, + SAY_HELP = -1555004, + SAY_SLAY1 = -1555005, + SAY_SLAY2 = -1555006, + SAY_DEATH = -1555007, + + SPELL_BANISH = 30231, + SPELL_CORROSIVE_ACID = 33551, + SPELL_FEAR = 33547, + SPELL_ENRAGE = 34970 +}; -struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI +struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public npc_escortAI { - boss_ambassador_hellmawAI(Creature *c) : ScriptedAI(c) + boss_ambassador_hellmawAI(Creature* pCreature) : npc_escortAI(pCreature) { - pInstance = c->GetInstanceData(); - HeroicMode = m_creature->GetMap()->IsHeroic(); + m_pInstance = pCreature->GetInstanceData(); + HeroicMode = pCreature->GetMap()->IsHeroic(); } - ScriptedInstance* pInstance; + ScriptedInstance* m_pInstance; bool HeroicMode; uint32 EventCheck_Timer; @@ -68,52 +68,52 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI Fear_Timer = 25000 + rand()%5000; Enrage_Timer = 180000; Intro = false; - IsBanished = false; + IsBanished = true; Enraged = false; - if (pInstance) + if (m_pInstance && m_creature->isAlive()) { - if (pInstance->GetData(TYPE_HELLMAW) == NOT_STARTED) - { - DoCast(m_creature,SPELL_BANISH); - IsBanished = true; - } - else pInstance->SetData(TYPE_HELLMAW,FAIL); - if (pInstance->GetData(TYPE_OVERSEER) == DONE) - { - if (m_creature->HasAura(SPELL_BANISH)) - m_creature->RemoveAurasDueToSpell(SPELL_BANISH); - Intro = true; - } + if (m_pInstance->GetData(TYPE_OVERSEER) != DONE) + m_creature->CastSpell(m_creature, SPELL_BANISH, true); } } - void MoveInLineOfSight(Unit *who) + void JustReachedHome() + { + if (m_pInstance) + m_pInstance->SetData(TYPE_HELLMAW, FAIL); + } + + void MoveInLineOfSight(Unit* pWho) { if (m_creature->HasAura(SPELL_BANISH)) return; - ScriptedAI::MoveInLineOfSight(who); + npc_escortAI::MoveInLineOfSight(pWho); } - void MovementInform(uint32 type, uint32 id) + void WaypointReached(uint32 i) { - if (type != POINT_MOTION_TYPE) - return; } void DoIntro() { - DoScriptText(SAY_INTRO, m_creature); - if (m_creature->HasAura(SPELL_BANISH)) m_creature->RemoveAurasDueToSpell(SPELL_BANISH); IsBanished = false; Intro = true; - if (pInstance) - pInstance->SetData(TYPE_HELLMAW, IN_PROGRESS); + if (m_pInstance) + { + if (m_pInstance->GetData(TYPE_HELLMAW) != FAIL) + { + DoScriptText(SAY_INTRO, m_creature); + Start(true, false, 0, NULL, false, true); + } + + m_pInstance->SetData(TYPE_HELLMAW, IN_PROGRESS); + } } void EnterCombat(Unit *who) @@ -139,30 +139,35 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI { DoScriptText(SAY_DEATH, m_creature); - if (pInstance) - pInstance->SetData(TYPE_HELLMAW, DONE); + if (m_pInstance) + m_pInstance->SetData(TYPE_HELLMAW, DONE); } void UpdateAI(const uint32 diff) { - if (!Intro) + if (!Intro && !IsBeingEscorted) { if (EventCheck_Timer < diff) { - if (pInstance) + if (m_pInstance) { - if (pInstance->GetData(TYPE_OVERSEER) == DONE) + if (m_pInstance->GetData(TYPE_OVERSEER) == DONE) + { DoIntro(); + return; + } } EventCheck_Timer = 5000; - }else EventCheck_Timer -= diff; + return; + } + else + { + EventCheck_Timer -= diff; + return; + } } - if (!m_creature->isInCombat() && !IsBanished) - { - //this is where we add MovePoint() - //DoWhine("I haz no mount!", LANG_UNIVERSAL, NULL); - } + npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; @@ -193,13 +198,16 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI Enraged = true; }else Enrage_Timer -= diff; } - - DoMeleeAttackIfReady(); } }; + CreatureAI* GetAI_boss_ambassador_hellmaw(Creature* pCreature) { - return new boss_ambassador_hellmawAI (pCreature); + boss_ambassador_hellmawAI* pHellAI = new boss_ambassador_hellmawAI(pCreature); + + pHellAI->FillPointMovementListForCreature(); + + return (CreatureAI*)pHellAI; } void AddSC_boss_ambassador_hellmaw() diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp index 084dcec32c0..f8f3b73bffa 100644 --- a/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp +++ b/src/bindings/scripts/scripts/zone/aunchindoun/shadow_labyrinth/instance_shadow_labyrinth.cpp @@ -68,78 +68,86 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance return false; } - void OnGameObjectCreate(GameObject *go, bool add) + void OnGameObjectCreate(GameObject* pGo, bool add) { - switch(go->GetEntry()) + switch(pGo->GetEntry()) { case REFECTORY_DOOR: - m_uiRefectoryDoorGUID = go->GetGUID(); + m_uiRefectoryDoorGUID = pGo->GetGUID(); if (m_auiEncounter[2] == DONE) - DoUseDoorOrButton(m_uiRefectoryDoorGUID); + pGo->SetGoState(GO_STATE_ACTIVE); break; case SCREAMING_HALL_DOOR: - m_uiScreamingHallDoorGUID = go->GetGUID(); + m_uiScreamingHallDoorGUID = pGo->GetGUID(); if (m_auiEncounter[3] == DONE) - DoUseDoorOrButton(m_uiScreamingHallDoorGUID); + pGo->SetGoState(GO_STATE_ACTIVE); break; } } - void OnCreatureCreate(Creature *creature, bool add) + void OnCreatureCreate(Creature* pCreature, bool add) { - switch(creature->GetEntry()) + switch(pCreature->GetEntry()) { case 18732: - m_uiGrandmasterVorpil = creature->GetGUID(); + m_uiGrandmasterVorpil = pCreature->GetGUID(); break; case 18796: - ++m_uiFelOverseerCount; - debug_log("TSCR: Shadow Labyrinth: counting %u Fel Overseers.",m_uiFelOverseerCount); + if (pCreature->isAlive()) + { + ++m_uiFelOverseerCount; + debug_log("TSCR: Shadow Labyrinth: counting %u Fel Overseers.",m_uiFelOverseerCount); + } break; } } - void SetData(uint32 type, uint32 data) + void SetData(uint32 type, uint32 uiData) { switch(type) { case TYPE_HELLMAW: - m_auiEncounter[0] = data; + m_auiEncounter[0] = uiData; break; case TYPE_OVERSEER: - if (data != DONE) + if (uiData != DONE) + { error_log("TSCR: Shadow Labyrinth: TYPE_OVERSEER did not expect other data than DONE"); + return; + } if (m_uiFelOverseerCount) { --m_uiFelOverseerCount; - debug_log("TSCR: Shadow Labyrinth: %u Fel Overseers left to kill.",m_uiFelOverseerCount); - } - if (m_uiFelOverseerCount == 0) - { - m_auiEncounter[1] = DONE; - debug_log("TSCR: Shadow Labyrinth: TYPE_OVERSEER == DONE"); + + if (m_uiFelOverseerCount) + debug_log("TSCR: Shadow Labyrinth: %u Fel Overseers left to kill.",m_uiFelOverseerCount); + else + { + m_auiEncounter[1] = DONE; + debug_log("TSCR: Shadow Labyrinth: TYPE_OVERSEER == DONE"); + } } break; case DATA_BLACKHEARTTHEINCITEREVENT: - if (data == DONE) + if (uiData == DONE) DoUseDoorOrButton(m_uiRefectoryDoorGUID); - m_auiEncounter[2] = data; + m_auiEncounter[2] = uiData; break; case DATA_GRANDMASTERVORPILEVENT: - if (data == DONE) + if (uiData == DONE) DoUseDoorOrButton(m_uiScreamingHallDoorGUID); - m_auiEncounter[3] = data; + m_auiEncounter[3] = uiData; break; case DATA_MURMUREVENT: - m_auiEncounter[4] = data; + m_auiEncounter[4] = uiData; break; } - if (data == DONE) + if (uiData == DONE) { if (type == TYPE_OVERSEER && m_uiFelOverseerCount != 0) return; diff --git a/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp b/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp index a44aa564c2e..a12da0c5f80 100644 --- a/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp +++ b/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp @@ -17,7 +17,7 @@ /* ScriptData SDName: Tanaris SD%Complete: 80 -SDComment: Quest support: 648, 2954, 4005, 10277, 10279(Special flight path). Noggenfogger vendor +SDComment: Quest support: 648, 1560, 2954, 4005, 10277, 10279(Special flight path). Noggenfogger vendor SDCategory: Tanaris EndScriptData */ @@ -28,6 +28,7 @@ npc_marin_noggenfogger npc_steward_of_time npc_stone_watcher_of_norgannon npc_OOX17 +npc_tooga EndContentData */ #include "precompiled.h" @@ -520,9 +521,251 @@ CreatureAI* GetAI_npc_OOX17(Creature* pCreature) return OOX17AI; } -/*###### -## AddSC -######*/ +/*#### +# npc_tooga +####*/ + +enum +{ + SAY_TOOG_THIRST = -1000391, + SAY_TOOG_WORRIED = -1000392, + SAY_TOOG_POST_1 = -1000393, + SAY_TORT_POST_2 = -1000394, + SAY_TOOG_POST_3 = -1000395, + SAY_TORT_POST_4 = -1000396, + SAY_TOOG_POST_5 = -1000397, + SAY_TORT_POST_6 = -1000398, + + QUEST_TOOGA = 1560, + NPC_TORTA = 6015, + + POINT_ID_TO_WATER = 1, + FACTION_TOOG_ESCORTEE = 113 +}; + +const float m_afToWaterLoc[] = {-7032.664551, -4906.199219, -1.606446}; + +//Script not fully complete, need to change faction. +struct MANGOS_DLL_DECL npc_toogaAI : public ScriptedAI +{ + npc_toogaAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_uiNpcFlags = pCreature->GetUInt32Value(UNIT_NPC_FLAGS); + m_uiPlayerGUID = 0; + } + + uint64 m_uiPlayerGUID; + uint32 m_uiNpcFlags; + uint32 m_uiCheckPlayerTimer; + uint32 m_uiPostEventTimer; + uint32 m_uiPhasePostEvent; + + Unit* pTorta; + + void Reset() + { + m_uiCheckPlayerTimer = 2500; + m_uiPostEventTimer = 5000; + m_uiPhasePostEvent = 0; + + pTorta = NULL; + } + + void MoveInLineOfSight(Unit *pWho) + { + if (pWho->GetEntry() == NPC_TORTA) + { + if (m_creature->IsWithinDistInMap(pWho, INTERACTION_DISTANCE)) + { + if (!pTorta && CanDoComplete()) + { + pTorta = pWho; + m_uiPhasePostEvent = 1; + } + } + } + } + + void EnterEvadeMode() + { + m_creature->RemoveAllAuras(); + m_creature->DeleteThreatList(); + m_creature->CombatStop(true); + m_creature->LoadCreaturesAddon(); + + if (m_creature->isAlive()) + { + if (Unit* pUnit = Unit::GetUnit(*m_creature, m_uiPlayerGUID)) + { + //for later development, it appear this kind return to combatStart, then resume to MoveFollow + m_creature->GetMotionMaster()->MoveFollow(pUnit, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + } + else + { + m_creature->GetMotionMaster()->MoveTargetedHome(); + } + } + + m_creature->SetLootRecipient(NULL); + + Reset(); + } + + void JustRespawned() + { + if (m_creature->getFaction() != m_creature->GetCreatureInfo()->faction_A) + m_creature->setFaction(m_creature->GetCreatureInfo()->faction_A); + + m_creature->SetUInt32Value(UNIT_NPC_FLAGS, m_creature->GetCreatureInfo()->npcflag); + + Reset(); + } + + void DoStart(Player* pPlayer) + { + m_uiPlayerGUID = pPlayer->GetGUID(); + m_creature->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + + //m_creature->setFaction(FACTION_TOOG_ESCORTEE); + + m_creature->GetMotionMaster()->MoveFollow(pPlayer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + } + + bool CanDoComplete() + { + if (Player* pPlayer = (Player*)Unit::GetUnit(*m_creature, m_uiPlayerGUID)) + { + if (pPlayer->GetQuestStatus(QUEST_TOOGA) == QUEST_STATUS_INCOMPLETE) + { + uint16 uiQuestLogSlot = pPlayer->FindQuestSlot(QUEST_TOOGA); + + if (uiQuestLogSlot < MAX_QUEST_LOG_SIZE) + { + if (pPlayer->GetQuestSlotState(uiQuestLogSlot) != QUEST_STATE_FAIL) + { + pPlayer->GroupEventHappens(QUEST_TOOGA, m_creature); + m_creature->GetMotionMaster()->MovementExpired(); + return true; + } + } + } + } + + return false; + } + + void MovementInform(uint32 uiMoveType, uint32 uiPointId) + { + if (uiMoveType != POINT_MOTION_TYPE || !m_uiPlayerGUID) + return; + + if (uiPointId == POINT_ID_TO_WATER) + m_creature->ForcedDespawn(); + } + + void JustDied(Unit* pKiller) + { + if (Player* pPlayer = Unit::GetPlayer(m_uiPlayerGUID)) + pPlayer->FailQuest(QUEST_TOOGA); + + m_uiPlayerGUID = 0; + m_creature->GetMotionMaster()->MovementExpired(); + } + + void UpdateAI(const uint32 uiDiff) + { + if (!UpdateVictim()) + { + //we are doing the post-event, or... + if (m_uiPhasePostEvent) + { + if (m_uiPostEventTimer < uiDiff) + { + m_uiPostEventTimer = 5000; + + if (!pTorta || !pTorta->isAlive()) + { + //something happened, so just despawn (what can go wrong?) + m_creature->ForcedDespawn(); + return; + } + + switch(m_uiPhasePostEvent) + { + case 1: + DoScriptText(SAY_TOOG_POST_1, m_creature); + break; + case 2: + DoScriptText(SAY_TORT_POST_2, pTorta); + break; + case 3: + DoScriptText(SAY_TOOG_POST_3, m_creature); + break; + case 4: + DoScriptText(SAY_TORT_POST_4, pTorta); + break; + case 5: + DoScriptText(SAY_TOOG_POST_5, m_creature); + break; + case 6: + DoScriptText(SAY_TORT_POST_6, pTorta); + m_creature->GetMotionMaster()->MovementExpired(); + m_creature->GetMotionMaster()->MovePoint(POINT_ID_TO_WATER, m_afToWaterLoc[0], m_afToWaterLoc[1], m_afToWaterLoc[2]); + break; + } + + ++m_uiPhasePostEvent; + } + else + m_uiPostEventTimer -= uiDiff; + } + //...we are doing regular player check + else if (m_uiPlayerGUID) + { + if (m_uiCheckPlayerTimer < uiDiff) + { + m_uiCheckPlayerTimer = 5000; + + switch(rand()%50) + { + case 10: DoScriptText(SAY_TOOG_THIRST, m_creature); break; + case 25: DoScriptText(SAY_TOOG_WORRIED, m_creature); break; + } + + Unit* pUnit = Unit::GetUnit(*m_creature, m_uiPlayerGUID); + + if (pUnit && !pUnit->isAlive()) + { + m_uiPlayerGUID = 0; + m_creature->ForcedDespawn(); + } + } + else + m_uiCheckPlayerTimer -= uiDiff; + } + + return; + } + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_npc_tooga(Creature* pCreature) +{ + return new npc_toogaAI(pCreature); +} + +bool QuestAccept_npc_tooga(Player* pPlayer, Creature* pCreature, const Quest* pQuest) +{ + if (pQuest->GetQuestId() == QUEST_TOOGA) + { + if (npc_toogaAI* pToogaAI = CAST_AI(npc_toogaAI, pCreature->AI())) + pToogaAI->DoStart(pPlayer); + } + + return true; +} void AddSC_tanaris() { @@ -562,5 +805,11 @@ void AddSC_tanaris() newscript->GetAI = &GetAI_npc_OOX17; newscript->pQuestAccept = &QuestAccept_npc_OOX17; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "npc_tooga"; + newscript->GetAI = &GetAI_npc_tooga; + newscript->pQuestAccept = &QuestAccept_npc_tooga; + newscript->RegisterSelf(); } |