Merge [SD2]

r1251 Add waypoints for Hellmaw
r1252 Add missing SQL to *_full for script added in rev 1243
r1253 Increment count value only for alive creature in SL instance script. Some minor cleanup.
r1254 Fix typo, and not set friendly creature in combat with zone. Also add comments and re-order code for readability. Patch by astriconX - skip
r1255 Handle akama channelers in different way, fill list of guids only when needed for event. - skip
r1256 Clean up akama script and apply sd2 code style. - skip
r1257 Correct 2 waypoints and apply sd2 code style to related script.
r1258 Add basic support for quest 1560
r1259 Simplify way to summon druid creatures. Patch by Turok
r1260 Clean up two more world bosses, apply SD2 code style and simplify code. Add missing texts. Patch by Turok.

--HG--
branch : trunk
This commit is contained in:
Kudlaty
2009-08-14 15:58:37 +02:00
parent 1bb93e3534
commit 75faad4b93
10 changed files with 626 additions and 423 deletions

View File

@@ -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, '');

View File

@@ -910,6 +910,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;

View File

@@ -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;

View File

@@ -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;
// DoCast(m_creature->getVictim(), SPELL_MARKOFNATURE);
// m_uiMarkOfNature_Timer = 45000;
//}
//else
// m_uiMarkOfNature_Timer -= uiDiff;
//VolatileInfection_Timer
if (VolatileInfection_Timer < diff)
if (m_uiVolatileInfection_Timer < uiDiff)
{
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);
//1 minutes for next one. Means not again with this health value
CorruptionofEarth1_Timer = 60000;
} else CorruptionofEarth1_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) == 50)
{
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;
}
//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);

View File

@@ -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
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,
#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
SPELL_SUMMONSHADE_1 = 24841,
SPELL_SUMMONSHADE_2 = 24842,
SPELL_SUMMONSHADE_3 = 24843,
//Spells of Shades of Taerar
//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);
//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);
Summon2_Timer = 120000;
Shades = true;
Shades_Timer = 60000;
} else Summon2_Timer -= diff;
}
DoScriptText(SAY_SUMMONSHADE, m_creature);
//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);
m_creature->setFaction(35);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
//m_creature->m_canMove = false;
int iSize = sizeof(m_auiSpellSummonShade) / sizeof(uint32);
//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;
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();
}

View File

@@ -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();

View File

@@ -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
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,
#define QUEST_SUNKEN_TREASURE 665
#define MOB_VENGEFUL_SURGE 2776
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)
void JustSummoned(Creature* pSummoned)
{
summoned->AI()->AttackStart(m_creature);
pSummoned->AI()->AttackStart(m_creature);
}
void Reset()
void EnterCombat(Unit* pWho)
{
m_bCompleted = true;
}
void EnterCombat(Unit* who)
{
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);
}

View File

@@ -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
struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI
enum
{
boss_ambassador_hellmawAI(Creature *c) : ScriptedAI(c)
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 npc_escortAI
{
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()

View File

@@ -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;

View File

@@ -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();
}