mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-17 16:10:49 +01:00
'small' update to Hyjal instance
*all bosses, trashes rescripted *almost all 'events' done *all mobs now use waypoints *added instance gate scripts (horde gate entry: 182060, elf: 182061) and lots of other fixes todo: -finish the 'cleaning waves' -code cleanup -fix small bugs (istance is fully playable at corrent dev point) --HG-- branch : trunk
This commit is contained in:
33
sql/updates/1318_world_scripts.sql
Normal file
33
sql/updates/1318_world_scripts.sql
Normal file
@@ -0,0 +1,33 @@
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_giant_infernal' WHERE `entry`=17908;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_abomination' WHERE `entry`=17898;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_ghoul' WHERE `entry`=17895;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_necromancer' WHERE `entry`=17899;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_banshee' WHERE `entry`=17905;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_crypt_fiend' WHERE `entry`=17897;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_fel_stalker' WHERE `entry`=17916;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_frost_wyrm' WHERE `entry`=17907;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_gargoyle' WHERE `entry`=17906;
|
||||
UPDATE `creature_template` SET `ScriptName`='alliance_rifleman' WHERE `entry`=17921;
|
||||
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_towering_infernal' WHERE `entry`=17818;
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_anetheron' WHERE `entry`=17808;
|
||||
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_azgalor' WHERE `entry`=17842;
|
||||
UPDATE `creature_template` SET `ScriptName`='mob_lesser_doomguard' WHERE `entry`=17864;
|
||||
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_kazrogal' WHERE `entry`=17888;
|
||||
|
||||
UPDATE `creature_template` SET `ScriptName`='boss_rage_winterchill' WHERE `entry`=17767;
|
||||
|
||||
UPDATE `creature_template` SET `scale`='0.5' WHERE `entry`=17968;
|
||||
|
||||
UPDATE `creature_template` SET `equipment_id`='17888' WHERE `entry`=17888;
|
||||
UPDATE `creature_template` SET `equipment_id`='17921' WHERE `entry`=17921;
|
||||
|
||||
DELETE FROM creature_equip_template WHERE `entry` IN (17888, 17921);
|
||||
INSERT INTO creature_equip_template () VALUES (17888, 45776, 0, 0, 33490946, 0, 0, 0, 0, 0);
|
||||
INSERT INTO creature_equip_template () VALUES (17921, 20732, 0, 20732, 33489666, 0, 33489666, 26, 0, 26);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -113,9 +113,15 @@ SET(trinityscript_LIB_SRCS
|
||||
scripts/zone/caverns_of_time/dark_portal/boss_aeonus.cpp
|
||||
scripts/zone/caverns_of_time/dark_portal/boss_chrono_lord_deja.cpp
|
||||
scripts/zone/caverns_of_time/dark_portal/boss_temporus.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/boss_anetheron.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/boss_archimonde.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/boss_azgalor.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/boss_kazrogal.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/boss_rage_winterchill.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/def_hyjal.h
|
||||
scripts/zone/caverns_of_time/hyjal/hyjal.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/hyjal_trash.h
|
||||
scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp
|
||||
scripts/zone/caverns_of_time/hyjal/hyjalAI.h
|
||||
scripts/zone/caverns_of_time/hyjal/instance_hyjal.cpp
|
||||
|
||||
@@ -219,6 +219,11 @@ extern void AddSC_burning_steppes();
|
||||
extern void AddSC_hyjal();
|
||||
extern void AddSC_boss_archimonde();
|
||||
extern void AddSC_instance_mount_hyjal();
|
||||
extern void AddSC_hyjal_trash();
|
||||
extern void AddSC_boss_rage_winterchill();
|
||||
extern void AddSC_boss_anetheron();
|
||||
extern void AddSC_boss_kazrogal();
|
||||
extern void AddSC_boss_azgalor();
|
||||
|
||||
//--Old Hillsbrad
|
||||
extern void AddSC_boss_captain_skarloc();
|
||||
@@ -1533,6 +1538,11 @@ void ScriptsInit()
|
||||
AddSC_hyjal();
|
||||
AddSC_boss_archimonde();
|
||||
AddSC_instance_mount_hyjal();
|
||||
AddSC_hyjal_trash();
|
||||
AddSC_boss_rage_winterchill();
|
||||
AddSC_boss_anetheron();
|
||||
AddSC_boss_kazrogal();
|
||||
AddSC_boss_azgalor();
|
||||
|
||||
//--Old Hillsbrad
|
||||
AddSC_boss_captain_skarloc();
|
||||
|
||||
@@ -1883,10 +1883,26 @@
|
||||
<Filter
|
||||
Name="Battle for Mt. Hyjal"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_anetheron.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_archimonde.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_azgalor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_kazrogal.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_rage_winterchill.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\def_hyjal.h"
|
||||
>
|
||||
@@ -1895,6 +1911,14 @@
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal_trash.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal_trash.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjalAI.cpp"
|
||||
>
|
||||
@@ -1908,6 +1932,7 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
|
||||
<Filter
|
||||
Name="Old Hillsbrad"
|
||||
>
|
||||
|
||||
@@ -2060,10 +2060,26 @@
|
||||
<Filter
|
||||
Name="Battle for Mt. Hyjal"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_anetheron.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_archimonde.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_azgalor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_kazrogal.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_rage_winterchill.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\def_hyjal.h"
|
||||
>
|
||||
@@ -2072,6 +2088,14 @@
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal_trash.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal_trash.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjalAI.cpp"
|
||||
>
|
||||
@@ -2085,6 +2109,7 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
|
||||
<Filter
|
||||
Name="Old Hillsbrad"
|
||||
>
|
||||
|
||||
@@ -2053,10 +2053,26 @@
|
||||
<Filter
|
||||
Name="Battle for Mt. Hyjal"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_anetheron.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_archimonde.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_azgalor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_kazrogal.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\boss_rage_winterchill.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\def_hyjal.h"
|
||||
>
|
||||
@@ -2065,6 +2081,14 @@
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal_trash.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjal_trash.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\caverns_of_time\hyjal\hyjalAI.cpp"
|
||||
>
|
||||
@@ -2078,6 +2102,7 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
|
||||
<Filter
|
||||
Name="Old Hillsbrad"
|
||||
>
|
||||
|
||||
@@ -0,0 +1,295 @@
|
||||
|
||||
#include "precompiled.h"
|
||||
#include "def_hyjal.h"
|
||||
#include "hyjal_trash.h"
|
||||
|
||||
#define SPELL_CARRION_SWARM 31306
|
||||
#define SPELL_SLEEP 31298
|
||||
#define SPELL_VAMPIRIC_AURA 38196
|
||||
#define SPELL_INFERNO 31299
|
||||
|
||||
#define SAY_ONDEATH "The clock... is still... ticking."
|
||||
#define SOUND_ONDEATH 10982
|
||||
|
||||
#define SAY_ONSLAY1 "Your hopes are lost!"
|
||||
#define SAY_ONSLAY2 "Scream for me!"
|
||||
#define SAY_ONSLAY3 "Pity, no time for a slow death!"
|
||||
#define SOUND_ONSLAY1 10981
|
||||
#define SOUND_ONSLAY2 11038
|
||||
#define SOUND_ONSLAY3 11039
|
||||
|
||||
#define SAY_SWARM1 "The swarm is eager to feed!"
|
||||
#define SAY_SWARM2 "Pestilence upon you!"
|
||||
#define SOUND_SWARM1 10979
|
||||
#define SOUND_SWARM2 11037
|
||||
|
||||
#define SAY_SLEEP1 "You look tired..."
|
||||
#define SAY_SLEEP2 "Sweet dreams..."
|
||||
#define SOUND_SLEEP1 10978
|
||||
#define SOUND_SLEEP2 11545
|
||||
|
||||
#define SAY_INFERNO1 "Let fire rain from above!"
|
||||
#define SAY_INFERNO2 "Earth and sky shall burn!"
|
||||
#define SOUND_INFERNO1 10980
|
||||
#define SOUND_INFERNO2 11036
|
||||
|
||||
#define SAY_ONAGGRO "You are defenders of a doomed world! Flee here, and perhaps you will prolong your pathetic lives!"
|
||||
#define SOUND_ONAGGRO 10977
|
||||
|
||||
struct TRINITY_DLL_DECL boss_anetheronAI : public hyjal_trashAI
|
||||
{
|
||||
boss_anetheronAI(Creature *c) : hyjal_trashAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)c->GetInstanceData());
|
||||
go = false;
|
||||
pos = 0;
|
||||
Reset();
|
||||
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SLEEP);
|
||||
if(TempSpell && TempSpell->EffectImplicitTargetA[0] != 1)
|
||||
{
|
||||
TempSpell->EffectImplicitTargetA[0] = 1;
|
||||
TempSpell->EffectImplicitTargetB[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 SwarmTimer;
|
||||
uint32 SleepTimer;
|
||||
uint32 AuraTimer;
|
||||
uint32 InfernoTimer;
|
||||
bool go;
|
||||
uint32 pos;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
SwarmTimer = 45000;
|
||||
SleepTimer = 60000;
|
||||
AuraTimer = 5000;
|
||||
InfernoTimer = 45000;
|
||||
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_ANETHERONEVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_ANETHERONEVENT, IN_PROGRESS);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONAGGRO);
|
||||
DoYell(SAY_ONAGGRO, LANG_UNIVERSAL, NULL);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
switch(rand()%3)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY1);
|
||||
DoYell(SAY_ONSLAY1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY2);
|
||||
DoYell(SAY_ONSLAY2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 2:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY3);
|
||||
DoYell(SAY_ONSLAY3, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 i)
|
||||
{
|
||||
pos = i;
|
||||
if (i == 7 && pInstance)
|
||||
{
|
||||
Unit* target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_JAINAPROUDMOORE));
|
||||
if (target && target->isAlive())
|
||||
m_creature->AddThreat(target,0.0);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_ANETHERONEVENT, DONE);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONDEATH);
|
||||
DoYell(SAY_ONDEATH, LANG_UNIVERSAL, NULL);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (IsEvent)
|
||||
{
|
||||
//Must update npc_escortAI
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
if(!go)
|
||||
{
|
||||
go = true;
|
||||
if(pInstance)
|
||||
{
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(0, 4896.08, -1576.35, 1333.65);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(1, 4898.68, -1615.02, 1329.48);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(2, 4907.12, -1667.08, 1321.00);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(3, 4963.18, -1699.35, 1340.51);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(4, 4989.16, -1716.67, 1335.74);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(5, 5026.27, -1736.89, 1323.02);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(6, 5037.77, -1770.56, 1324.36);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(7, 5067.23, -1789.95, 1321.17);
|
||||
((npc_escortAI*)(m_creature->AI()))->Start(false, true, true);
|
||||
((npc_escortAI*)(m_creature->AI()))->SetDespawnAtEnd(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim() )
|
||||
return;
|
||||
|
||||
if(SwarmTimer < diff)
|
||||
{
|
||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
|
||||
if(target)
|
||||
DoCast(target,SPELL_CARRION_SWARM);
|
||||
|
||||
SwarmTimer = 45000+rand()%15000;
|
||||
switch(rand()%2)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_SWARM1);
|
||||
DoYell(SAY_SWARM1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_SWARM2);
|
||||
DoYell(SAY_SWARM2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}else SwarmTimer -= diff;
|
||||
|
||||
if(SleepTimer < diff)
|
||||
{
|
||||
for(uint8 i=0;i<3;++i)
|
||||
{
|
||||
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0,100,true);
|
||||
if(target)
|
||||
target->CastSpell(target,SPELL_SLEEP,true);
|
||||
}
|
||||
SleepTimer = 60000;
|
||||
switch(rand()%2)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_SLEEP1);
|
||||
DoYell(SAY_SLEEP1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_SLEEP2);
|
||||
DoYell(SAY_SLEEP2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}else SleepTimer -= diff;
|
||||
if(AuraTimer < diff)
|
||||
{
|
||||
DoCast(m_creature, SPELL_VAMPIRIC_AURA,true);
|
||||
AuraTimer = 10000+rand()%10000;
|
||||
}else AuraTimer -= diff;
|
||||
if(InfernoTimer < diff)
|
||||
{
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,100,true), SPELL_INFERNO);
|
||||
InfernoTimer = 45000;
|
||||
switch(rand()%2)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_INFERNO1);
|
||||
DoYell(SAY_INFERNO1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_INFERNO2);
|
||||
DoYell(SAY_INFERNO2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}else InfernoTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_anetheron(Creature *_Creature)
|
||||
{
|
||||
return new boss_anetheronAI (_Creature);
|
||||
}
|
||||
|
||||
#define SPELL_IMMOLATION 31303
|
||||
#define SPELL_INFERNO_EFFECT 31302
|
||||
|
||||
struct TRINITY_DLL_DECL mob_towering_infernalAI : public ScriptedAI
|
||||
{
|
||||
mob_towering_infernalAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint32 ImmolationTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
DoCast(m_creature, SPELL_INFERNO_EFFECT);
|
||||
ImmolationTimer = 5000;
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (m_creature->GetDistance(who) <= 50 && !InCombat && m_creature->IsHostileTo(who))
|
||||
{
|
||||
m_creature->AddThreat(who,0.0);
|
||||
m_creature->Attack(who,false);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if(ImmolationTimer < diff)
|
||||
{
|
||||
DoCast(m_creature, SPELL_IMMOLATION);
|
||||
ImmolationTimer = 5000;
|
||||
}else ImmolationTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_towering_infernal(Creature *_Creature)
|
||||
{
|
||||
return new mob_towering_infernalAI (_Creature);
|
||||
}
|
||||
|
||||
void AddSC_boss_anetheron()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name="boss_anetheron";
|
||||
newscript->GetAI = &GetAI_boss_anetheron;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name="mob_towering_infernal";
|
||||
newscript->GetAI = &GetAI_mob_towering_infernal;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -368,6 +368,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
|
||||
WispCount = 0; // When ~30 wisps are summoned, Archimonde dies
|
||||
EnrageTimer = 600000; // 10 minutes
|
||||
CheckDistanceTimer = 30000; // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage
|
||||
SummonWispTimer = 0;
|
||||
|
||||
Enraged = false;
|
||||
BelowTenPercent = false;
|
||||
@@ -663,7 +664,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
|
||||
DoScriptText(SAY_AIR_BURST2, m_creature);
|
||||
|
||||
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_AIR_BURST);
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 1), SPELL_AIR_BURST);//not on tank
|
||||
AirBurstTimer = 25000 + rand()%15000;
|
||||
}else AirBurstTimer -= diff;
|
||||
|
||||
|
||||
@@ -0,0 +1,270 @@
|
||||
|
||||
#include "precompiled.h"
|
||||
#include "def_hyjal.h"
|
||||
#include "hyjal_trash.h"
|
||||
|
||||
#define SPELL_RAIN_OF_FIRE 31340
|
||||
#define SPELL_DOOM 31347
|
||||
#define SPELL_HOWL_OF_AZGALOR 31344
|
||||
#define SPELL_CLEAVE 31345
|
||||
#define SPELL_BERSERK 26662
|
||||
|
||||
#define SAY_ONDEATH "Your time is almost... up"
|
||||
#define SOUND_ONDEATH 11002
|
||||
|
||||
#define SAY_ONSLAY1 "Reesh, hokta!"
|
||||
#define SAY_ONSLAY2 "Don't fight it"
|
||||
#define SAY_ONSLAY3 "No one is going to save you"
|
||||
#define SOUND_ONSLAY1 11001
|
||||
#define SOUND_ONSLAY2 11048
|
||||
#define SOUND_ONSLAY3 11047
|
||||
|
||||
#define SAY_DOOM1 "Just a taste... of what awaits you"
|
||||
#define SAY_DOOM2 "Suffer you despicable insect!"
|
||||
#define SOUND_DOOM1 11046
|
||||
#define SOUND_DOOM2 11000
|
||||
|
||||
#define SAY_ONAGGRO "Abandon all hope! The legion has returned to finish what was begun so many years ago. This time there will be no escape!"
|
||||
#define SOUND_ONAGGRO 10999
|
||||
|
||||
struct TRINITY_DLL_DECL boss_azgalorAI : public hyjal_trashAI
|
||||
{
|
||||
boss_azgalorAI(Creature *c) : hyjal_trashAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)c->GetInstanceData());
|
||||
go = false;
|
||||
pos = 0;
|
||||
Reset();
|
||||
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_HOWL_OF_AZGALOR);
|
||||
if(TempSpell)
|
||||
TempSpell->EffectRadiusIndex[0] = 12;//100yards instead of 50000?!
|
||||
}
|
||||
|
||||
uint32 RainTimer;
|
||||
uint32 DoomTimer;
|
||||
uint32 HowlTimer;
|
||||
uint32 CleaveTimer;
|
||||
uint32 EnrageTimer;
|
||||
bool enraged;
|
||||
|
||||
bool go;
|
||||
uint32 pos;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
RainTimer = 20000;
|
||||
DoomTimer = 50000;
|
||||
HowlTimer = 30000;
|
||||
CleaveTimer = 10000;
|
||||
EnrageTimer = 600000;
|
||||
enraged = false;
|
||||
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_AZGALOREVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_AZGALOREVENT, IN_PROGRESS);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONAGGRO);
|
||||
DoYell(SAY_ONAGGRO, LANG_UNIVERSAL, NULL);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
switch(rand()%3)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY1);
|
||||
DoYell(SAY_ONSLAY1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY2);
|
||||
DoYell(SAY_ONSLAY2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 2:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY3);
|
||||
DoYell(SAY_ONSLAY3, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 i)
|
||||
{
|
||||
pos = i;
|
||||
if (i == 7 && pInstance)
|
||||
{
|
||||
Unit* target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_THRALL));
|
||||
if (target && target->isAlive())
|
||||
m_creature->AddThreat(target,0.0);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_AZGALOREVENT, DONE);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONDEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (IsEvent)
|
||||
{
|
||||
//Must update npc_escortAI
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
if(!go)
|
||||
{
|
||||
go = true;
|
||||
if(pInstance)
|
||||
{
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(0, 5492.91, -2404.61, 1462.63);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(1, 5531.76, -2460.87, 1469.55);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(2, 5554.58, -2514.66, 1476.12);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(3, 5554.16, -2567.23, 1479.90);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(4, 5540.67, -2625.99, 1480.89);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(5, 5508.16, -2659.2, 1480.15);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(6, 5489.62, -2704.05, 1482.18);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(7, 5457.04, -2726.26, 1485.10);
|
||||
((npc_escortAI*)(m_creature->AI()))->Start(false, true, true);
|
||||
((npc_escortAI*)(m_creature->AI()))->SetDespawnAtEnd(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim() )
|
||||
return;
|
||||
|
||||
if(RainTimer < diff)
|
||||
{
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,30,true), SPELL_RAIN_OF_FIRE);
|
||||
RainTimer = 20000+rand()%15000;
|
||||
}else RainTimer -= diff;
|
||||
|
||||
if(DoomTimer < diff)
|
||||
{
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,1,100,true), SPELL_DOOM);//never on tank
|
||||
DoomTimer = 45000+rand()%5000;
|
||||
}else DoomTimer -= diff;
|
||||
|
||||
if(HowlTimer < diff)
|
||||
{
|
||||
DoCast(m_creature, SPELL_HOWL_OF_AZGALOR);
|
||||
HowlTimer = 30000;
|
||||
}else HowlTimer -= diff;
|
||||
|
||||
if(CleaveTimer < diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_CLEAVE);
|
||||
CleaveTimer = 10000+rand()%5000;
|
||||
}else CleaveTimer -= diff;
|
||||
|
||||
if(EnrageTimer < diff && !enraged)
|
||||
{
|
||||
m_creature->InterruptNonMeleeSpells(false);
|
||||
DoCast(m_creature, SPELL_BERSERK, true);
|
||||
enraged = true;
|
||||
EnrageTimer = 600000;
|
||||
}else EnrageTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_azgalor(Creature *_Creature)
|
||||
{
|
||||
return new boss_azgalorAI (_Creature);
|
||||
}
|
||||
|
||||
#define SPELL_THRASH 12787
|
||||
#define SPELL_CRIPPLE 31406
|
||||
#define SPELL_WARSTOMP 31408
|
||||
|
||||
struct TRINITY_DLL_DECL mob_lesser_doomguardAI : public hyjal_trashAI
|
||||
{
|
||||
mob_lesser_doomguardAI(Creature *c) : hyjal_trashAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)c->GetInstanceData());
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint32 CrippleTimer;
|
||||
uint32 WarstompTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
CrippleTimer = 50000;
|
||||
WarstompTimer = 10000;
|
||||
DoCast(m_creature, SPELL_THRASH);
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 i)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (m_creature->GetDistance(who) <= 50 && !InCombat && m_creature->IsHostileTo(who))
|
||||
{
|
||||
m_creature->AddThreat(who,0.0);
|
||||
m_creature->Attack(who,false);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim() )
|
||||
return;
|
||||
|
||||
if(WarstompTimer < diff)
|
||||
{
|
||||
DoCast(m_creature, SPELL_WARSTOMP);
|
||||
WarstompTimer = 10000+rand()%5000;
|
||||
}else WarstompTimer -= diff;
|
||||
|
||||
if(CrippleTimer < diff)
|
||||
{
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,100,true), SPELL_CRIPPLE);
|
||||
CrippleTimer = 25000+rand()%5000;
|
||||
}else CrippleTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_lesser_doomguard(Creature *_Creature)
|
||||
{
|
||||
return new mob_lesser_doomguardAI (_Creature);
|
||||
}
|
||||
|
||||
void AddSC_boss_azgalor()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name="boss_azgalor";
|
||||
newscript->GetAI = &GetAI_boss_azgalor;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name="mob_lesser_doomguard";
|
||||
newscript->GetAI = &GetAI_mob_lesser_doomguard;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
|
||||
#include "precompiled.h"
|
||||
#include "def_hyjal.h"
|
||||
#include "hyjal_trash.h"
|
||||
|
||||
#define SPELL_CLEAVE 31436
|
||||
#define SPELL_WARSTOMP 31480
|
||||
#define SPELL_MARK 31447
|
||||
|
||||
#define SOUND_ONDEATH 11018
|
||||
|
||||
#define SAY_ONSLAY1 "Shaza-Kiel!"
|
||||
#define SAY_ONSLAY2 "You... are nothing!"
|
||||
#define SAY_ONSLAY3 "Miserable nuisance!"
|
||||
#define SOUND_ONSLAY1 11017
|
||||
#define SOUND_ONSLAY2 11053
|
||||
#define SOUND_ONSLAY3 11054
|
||||
|
||||
#define SAY_MARK1 "Your death will be a painful one."
|
||||
#define SAY_MARK2 "You... are marked."
|
||||
#define SOUND_MARK1 11016
|
||||
#define SOUND_MARK2 11052
|
||||
|
||||
#define SAY_ONAGGRO "Cry for mercy! Your meaningless lives will soon be forfeit."
|
||||
#define SOUND_ONAGGRO 11015
|
||||
|
||||
struct TRINITY_DLL_DECL boss_kazrogalAI : public hyjal_trashAI
|
||||
{
|
||||
boss_kazrogalAI(Creature *c) : hyjal_trashAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)c->GetInstanceData());
|
||||
go = false;
|
||||
pos = 0;
|
||||
Reset();
|
||||
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_MARK);
|
||||
if(TempSpell && TempSpell->EffectImplicitTargetA[0] != 1)
|
||||
{
|
||||
TempSpell->EffectImplicitTargetA[0] = 1;
|
||||
TempSpell->EffectImplicitTargetB[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 CleaveTimer;
|
||||
uint32 WarStompTimer;
|
||||
uint32 MarkTimer;
|
||||
uint32 MarkTimerBase;
|
||||
bool go;
|
||||
uint32 pos;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
CleaveTimer = 5000;
|
||||
WarStompTimer = 15000;
|
||||
MarkTimer = 45000;
|
||||
MarkTimerBase = 45000;
|
||||
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_KAZROGALEVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_KAZROGALEVENT, IN_PROGRESS);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONAGGRO);
|
||||
DoYell(SAY_ONAGGRO, LANG_UNIVERSAL, NULL);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
switch(rand()%3)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY1);
|
||||
DoYell(SAY_ONSLAY1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY2);
|
||||
DoYell(SAY_ONSLAY2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 2:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY3);
|
||||
DoYell(SAY_ONSLAY3, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 i)
|
||||
{
|
||||
pos = i;
|
||||
if (i == 7 && pInstance)
|
||||
{
|
||||
Unit* target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_THRALL));
|
||||
if (target && target->isAlive())
|
||||
m_creature->AddThreat(target,0.0);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_KAZROGALEVENT, DONE);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONDEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (IsEvent)
|
||||
{
|
||||
//Must update npc_escortAI
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
if(!go)
|
||||
{
|
||||
go = true;
|
||||
if(pInstance)
|
||||
{
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(0, 5492.91, -2404.61, 1462.63);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(1, 5531.76, -2460.87, 1469.55);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(2, 5554.58, -2514.66, 1476.12);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(3, 5554.16, -2567.23, 1479.90);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(4, 5540.67, -2625.99, 1480.89);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(5, 5508.16, -2659.2, 1480.15);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(6, 5489.62, -2704.05, 1482.18);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(7, 5457.04, -2726.26, 1485.10);
|
||||
((npc_escortAI*)(m_creature->AI()))->Start(false, true, true);
|
||||
((npc_escortAI*)(m_creature->AI()))->SetDespawnAtEnd(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim() )
|
||||
return;
|
||||
|
||||
if(CleaveTimer < diff)
|
||||
{
|
||||
DoCast(m_creature, SPELL_CLEAVE);
|
||||
CleaveTimer = 6000+rand()%15000;
|
||||
}else CleaveTimer -= diff;
|
||||
|
||||
if(WarStompTimer < diff)
|
||||
{
|
||||
DoCast(m_creature, SPELL_WARSTOMP);
|
||||
WarStompTimer = 60000;
|
||||
}else WarStompTimer -= diff;
|
||||
|
||||
if(m_creature->HasAura(SPELL_MARK,0))
|
||||
m_creature->RemoveAurasDueToSpell(SPELL_MARK);
|
||||
if(MarkTimer < diff)
|
||||
{
|
||||
//cast dummy, useful for bos addons
|
||||
m_creature->CastCustomSpell(m_creature, SPELL_MARK, NULL, NULL, NULL, false, NULL, NULL, m_creature->GetGUID());
|
||||
|
||||
std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList();
|
||||
for(std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
|
||||
{
|
||||
Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
|
||||
if (target && target->GetTypeId() == TYPEID_PLAYER && target->getPowerType() == POWER_MANA)
|
||||
{
|
||||
target->CastSpell(target, SPELL_MARK,true);//only cast on mana users
|
||||
}
|
||||
}
|
||||
MarkTimerBase -= 5000;
|
||||
if(MarkTimerBase < 5500)
|
||||
MarkTimerBase = 5500;
|
||||
MarkTimer = MarkTimerBase;
|
||||
switch(rand()%3)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_MARK1);
|
||||
DoYell(SAY_MARK1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_MARK2);
|
||||
DoYell(SAY_MARK2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}else MarkTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_kazrogal(Creature *_Creature)
|
||||
{
|
||||
return new boss_kazrogalAI (_Creature);
|
||||
}
|
||||
|
||||
void AddSC_boss_kazrogal()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name="boss_kazrogal";
|
||||
newscript->GetAI = &GetAI_boss_kazrogal;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
|
||||
#include "precompiled.h"
|
||||
#include "def_hyjal.h"
|
||||
#include "hyjal_trash.h"
|
||||
|
||||
#define SPELL_FROST_ARMOR 31256
|
||||
#define SPELL_DEATH_AND_DECAY 31258
|
||||
|
||||
#define SPELL_FROST_NOVA 31250
|
||||
#define SPELL_ICEBOLT 31249
|
||||
|
||||
#define SAY_ONDEATH "You have won this battle, but not... the... war"
|
||||
#define SOUND_ONDEATH 11026
|
||||
|
||||
#define SAY_ONSLAY1 "All life must perish!"
|
||||
#define SAY_ONSLAY2 "Victory to the Legion!"
|
||||
#define SOUND_ONSLAY1 11025
|
||||
#define SOUND_ONSLAY2 11057
|
||||
|
||||
#define SAY_DECAY1 "Crumble and rot!"
|
||||
#define SAY_DECAY2 "Ashes to ashes, dust to dust"
|
||||
#define SOUND_DECAY1 11023
|
||||
#define SOUND_DECAY2 11055
|
||||
|
||||
#define SAY_NOVA1 "Succumb to the icy chill... of death!"
|
||||
#define SAY_NOVA2 "It will be much colder in your grave"
|
||||
#define SOUND_NOVA1 11024
|
||||
#define SOUND_NOVA2 11058
|
||||
|
||||
#define SAY_ONAGGRO "The Legion's final conquest has begun! Once again the subjugation of this world is within our grasp. Let none survive!"
|
||||
#define SOUND_ONAGGRO 11022
|
||||
|
||||
struct TRINITY_DLL_DECL boss_rage_winterchillAI : public hyjal_trashAI
|
||||
{
|
||||
boss_rage_winterchillAI(Creature *c) : hyjal_trashAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)c->GetInstanceData());
|
||||
go = false;
|
||||
pos = 0;
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint32 FrostArmorTimer;
|
||||
uint32 DecayTimer;
|
||||
uint32 NovaTimer;
|
||||
uint32 IceboltTimer;
|
||||
bool go;
|
||||
uint32 pos;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
FrostArmorTimer = 37000;
|
||||
DecayTimer = 45000;
|
||||
NovaTimer = 15000;
|
||||
IceboltTimer = 10000;
|
||||
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_RAGEWINTERCHILLEVENT, IN_PROGRESS);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONAGGRO);
|
||||
DoYell(SAY_ONAGGRO, LANG_UNIVERSAL, NULL);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
switch(rand()%2)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY1);
|
||||
DoYell(SAY_ONSLAY1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONSLAY2);
|
||||
DoYell(SAY_ONSLAY2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 i)
|
||||
{
|
||||
pos = i;
|
||||
if (i == 7 && pInstance)
|
||||
{
|
||||
Unit* target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_JAINAPROUDMOORE));
|
||||
if (target && target->isAlive())
|
||||
m_creature->AddThreat(target,0.0);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit *victim)
|
||||
{
|
||||
if(pInstance && IsEvent)
|
||||
pInstance->SetData(DATA_RAGEWINTERCHILLEVENT, DONE);
|
||||
DoPlaySoundToSet(m_creature, SOUND_ONDEATH);
|
||||
DoYell(SAY_ONDEATH, LANG_UNIVERSAL, NULL);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (IsEvent)
|
||||
{
|
||||
//Must update npc_escortAI
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
if(!go)
|
||||
{
|
||||
go = true;
|
||||
if(pInstance)
|
||||
{
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(0, 4896.08, -1576.35, 1333.65);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(1, 4898.68, -1615.02, 1329.48);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(2, 4907.12, -1667.08, 1321.00);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(3, 4963.18, -1699.35, 1340.51);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(4, 4989.16, -1716.67, 1335.74);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(5, 5026.27, -1736.89, 1323.02);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(6, 5037.77, -1770.56, 1324.36);
|
||||
((npc_escortAI*)(m_creature->AI()))->AddWaypoint(7, 5067.23, -1789.95, 1321.17);
|
||||
((npc_escortAI*)(m_creature->AI()))->Start(false, true, true);
|
||||
((npc_escortAI*)(m_creature->AI()))->SetDespawnAtEnd(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim() )
|
||||
return;
|
||||
|
||||
if(FrostArmorTimer < diff)
|
||||
{
|
||||
DoCast(m_creature, SPELL_FROST_ARMOR);
|
||||
FrostArmorTimer = 40000+rand()%20000;
|
||||
}else FrostArmorTimer -= diff;
|
||||
if(DecayTimer < diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_DEATH_AND_DECAY);
|
||||
DecayTimer = 60000+rand()%20000;
|
||||
switch(rand()%2)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_DECAY1);
|
||||
DoYell(SAY_DECAY1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_DECAY2);
|
||||
DoYell(SAY_DECAY2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}else DecayTimer -= diff;
|
||||
if(NovaTimer < diff)
|
||||
{
|
||||
DoCast(m_creature->getVictim(), SPELL_FROST_NOVA);
|
||||
NovaTimer = 30000+rand()%15000;
|
||||
switch(rand()%2)
|
||||
{
|
||||
case 0:
|
||||
DoPlaySoundToSet(m_creature, SOUND_NOVA1);
|
||||
DoYell(SAY_NOVA1, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
case 1:
|
||||
DoPlaySoundToSet(m_creature, SOUND_NOVA2);
|
||||
DoYell(SAY_NOVA2, LANG_UNIVERSAL, NULL);
|
||||
break;
|
||||
}
|
||||
}else NovaTimer -= diff;
|
||||
if(IceboltTimer < diff)
|
||||
{
|
||||
DoCast(SelectUnit(SELECT_TARGET_RANDOM,0,40,true), SPELL_ICEBOLT);
|
||||
IceboltTimer = 11000+rand()%20000;
|
||||
}else IceboltTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_rage_winterchill(Creature *_Creature)
|
||||
{
|
||||
return new boss_rage_winterchillAI (_Creature);
|
||||
}
|
||||
|
||||
void AddSC_boss_rage_winterchill()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name="boss_rage_winterchill";
|
||||
newscript->GetAI = &GetAI_boss_rage_winterchill;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
@@ -24,6 +24,8 @@
|
||||
#define DATA_TYRANDEWHISPERWIND 13
|
||||
#define DATA_TRASH 14
|
||||
#define DATA_RESET_TRASH_COUNT 15
|
||||
#define DATA_ALLIANCE_RETREAT 16
|
||||
#define DATA_HORDE_RETREAT 17
|
||||
|
||||
#define ERROR_INST_DATA "TSCR: Instance data not set properly for Mount Hyjal. Encounters will be buggy"
|
||||
#endif
|
||||
|
||||
@@ -89,6 +89,11 @@ bool GossipHello_npc_jaina_proudmoore(Player *player, Creature *_Creature)
|
||||
|
||||
bool GossipSelect_npc_jaina_proudmoore(Player *player, Creature *_Creature, uint32 sender, uint32 action)
|
||||
{
|
||||
if(_Creature->GetMap()->GetPlayersCountExceptGMs() < MINPLAYERS && !player->isGameMaster())
|
||||
{
|
||||
_Creature->Say("Did you come to die with me?",0,0);
|
||||
return true;
|
||||
}
|
||||
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
|
||||
switch(action)
|
||||
{
|
||||
@@ -120,7 +125,7 @@ CreatureAI* GetAI_npc_thrall(Creature *_Creature)
|
||||
ai->EnterEvadeMode();
|
||||
|
||||
ai->Spell[0].SpellId = SPELL_CHAIN_LIGHTNING;
|
||||
ai->Spell[0].Cooldown = 2000 + rand()%5000;
|
||||
ai->Spell[0].Cooldown = 3000 + rand()%5000;
|
||||
ai->Spell[0].TargetType = TARGETTYPE_VICTIM;
|
||||
|
||||
ai->Spell[1].SpellId = SPELL_SUMMON_DIRE_WOLF;
|
||||
@@ -140,7 +145,7 @@ bool GossipHello_npc_thrall(Player *player, Creature *_Creature)
|
||||
uint32 AnetheronEvent = ai->GetInstanceData(DATA_ANETHERONEVENT);
|
||||
|
||||
// Only let them start the Horde phases if Anetheron is dead.
|
||||
if (AnetheronEvent == DONE)
|
||||
if (AnetheronEvent == DONE && ai->GetInstanceData(DATA_ALLIANCE_RETREAT))
|
||||
{
|
||||
uint32 KazrogalEvent = ai->GetInstanceData(DATA_KAZROGALEVENT);
|
||||
uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
|
||||
@@ -162,7 +167,13 @@ bool GossipHello_npc_thrall(Player *player, Creature *_Creature)
|
||||
|
||||
bool GossipSelect_npc_thrall(Player *player, Creature *_Creature, uint32 sender, uint32 action)
|
||||
{
|
||||
if(_Creature->GetMap()->GetPlayersCountExceptGMs() < MINPLAYERS && !player->isGameMaster())//to stop idiot farmers
|
||||
{
|
||||
_Creature->Say("Did you come to die with me?",0,0);
|
||||
return true;
|
||||
}
|
||||
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
|
||||
ai->DeSpawnVeins();//despawn the alliance veins
|
||||
switch(action)
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
@@ -197,6 +208,7 @@ CreatureAI* GetAI_npc_tyrande_whisperwind(Creature *_Creature)
|
||||
bool GossipHello_npc_tyrande_whisperwind(Player* player, Creature* _Creature)
|
||||
{
|
||||
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
|
||||
//ai->DeSpawnVeins();//dont despawn the horde veins if someone takes the item from Tyrande
|
||||
uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
|
||||
|
||||
// Only let them get item if Azgalor is dead.
|
||||
@@ -208,15 +220,18 @@ bool GossipHello_npc_tyrande_whisperwind(Player* player, Creature* _Creature)
|
||||
|
||||
bool GossipSelect_npc_tyrande_whisperwind(Player *player, Creature *_Creature, uint32 sender, uint32 action)
|
||||
{
|
||||
if (action == GOSSIP_ACTION_INFO_DEF)
|
||||
if (action == GOSSIP_ACTION_INFO_DEF)
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, ITEM_TEAR_OF_GODDESS, 1);
|
||||
if (msg == EQUIP_ERR_OK)
|
||||
{
|
||||
player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true);
|
||||
Item* item = player->StoreNewItem(dest, ITEM_TEAR_OF_GODDESS, true);
|
||||
if(item && player)
|
||||
player->SendNewItem(item,1,true,false,true);
|
||||
}
|
||||
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
|
||||
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -23,39 +23,298 @@ EndScriptData */
|
||||
|
||||
#include "precompiled.h"
|
||||
#include "hyjalAI.h"
|
||||
#include "hyjal_trash.h"
|
||||
#include "MapManager.h"
|
||||
#include "Language.h"
|
||||
#include "Chat.h"
|
||||
#include "Object.h"
|
||||
|
||||
#define SPAWN_GARG_GATE 0
|
||||
#define SPAWN_WYRM_GATE 1
|
||||
#define SPAWN_NEAR_TOWER 2
|
||||
// Locations for summoning gargoyls and frost wyrms in special cases
|
||||
float SpawnPointSpecial[3][3]=
|
||||
{
|
||||
{5497.08, -2493.23, 1535.72}, //spawn point for the gargoyles near the horde gate
|
||||
{5624.53, -2548.12, 1551.54}, //spawn point for the frost wyrm near the horde gate
|
||||
{5604.41, -2811.98, 1547.77} //spawn point for the gargoyles and wyrms near the horde tower
|
||||
};
|
||||
|
||||
// Locations for summoning waves in Alliance base
|
||||
float AllianceBase[4][3]=
|
||||
{
|
||||
{4979.010, -1709.134, 1339.674},
|
||||
{4969.123, -1705.904, 1341.363},
|
||||
{4970.260, -1698.546, 1341.200},
|
||||
{4975.262, -1698.239, 1341.427}
|
||||
{4928.48, -1526.38, 1326.83},
|
||||
{4923.54, -1514.29, 1327.98},
|
||||
{4928.41, -1510.35, 1327.99},
|
||||
{4938.35, -1521.00, 1326.69}
|
||||
};
|
||||
|
||||
float JainaDummySpawn[2][4]=
|
||||
{
|
||||
{5497.01, -2719.03, 1483.08, 2.90426},
|
||||
{5484.98, -2721.69, 1483.39, 6.00656}
|
||||
};
|
||||
|
||||
|
||||
// Locations for summoning waves in Horde base
|
||||
float HordeBase[4][3]=
|
||||
float HordeBase[4][3]=
|
||||
{
|
||||
{5554.399, -2581.419, 1480.820},
|
||||
{5538.996, -2577.742, 1479.790},
|
||||
{5565.642, -2565.666, 1481.635},
|
||||
{5547.218, -2574.589, 1479.194}
|
||||
{5458.01, -2340.27, 1459.60},
|
||||
{5466.01, -2334.69, 1460.06},
|
||||
{5468.45, -2355.13, 1459.99},
|
||||
{5479.06, -2344.16, 1461.74}
|
||||
};
|
||||
|
||||
// used to inform the wave where to move and attack to
|
||||
float AttackArea[2][3]=
|
||||
// Lady Jaina's waypoints when retreathing
|
||||
float JainaWPs[2][3]=
|
||||
{
|
||||
{5042.9189, -1776.2562, 1323.0621}, // Alliance
|
||||
{5510.4815, -2676.7112, 1480.4314} // Horde
|
||||
{5078.56, -1789.79, 1320.73},//next to the small stairs
|
||||
{5037.38, -1778.39, 1322.61},//center of alliance base
|
||||
};
|
||||
|
||||
hyjalAI::hyjalAI(Creature *c) : ScriptedAI(c)
|
||||
float InfernalPos[8][3]=//spawn points for the infernals in the horde base
|
||||
{
|
||||
{5453.59, -2764.52, 1493.50},
|
||||
{5478.4, -2781.77, 1497.52},
|
||||
{5506.09, -2780.53, 1496.32},
|
||||
{5532.1, -2763.42, 1492.37},
|
||||
{5544.16, -2733.99, 1487.14},
|
||||
{5536.19, -2708.18, 1480.01},
|
||||
{5510.16, -2691.75, 1479.66},
|
||||
{5482.39, -2689.19, 1481.09}
|
||||
};
|
||||
|
||||
float InfernalSPWP[10][3]=//spawn points for the infernals in the horde base used in the cleaning wave
|
||||
{
|
||||
{5528.5, -2771.23, 1494.08},
|
||||
{5471.41, -2711.17, 1483.97},
|
||||
{5464.08, -2653.9, 1482.67},
|
||||
{5550.84, -2633.8, 1484.08},
|
||||
{5579.86, -2704.86, 1489.33},
|
||||
{5589.67, -2655.5, 1490.15},
|
||||
{5432.36, -2744.81, 1486.25},
|
||||
{5463.14, -2857.41, 1512.45},
|
||||
{5534.31, -2774.58, 1494.89},
|
||||
{5524.36, -2735.52, 1484.16}
|
||||
};
|
||||
|
||||
float VeinPos[14][8]=//spawn points of the ancient gem veins
|
||||
{
|
||||
{5184.84, -1982.59, 1382.66, 2.58079, 0, 0, 0.960944, 0.276742}, //alliance
|
||||
{5107.66, -2071.16, 1368.37, 2.65148, 0, 0, 0.970124, 0.242611}, //alliance
|
||||
{5040.53, -2227.65, 1403.17, 3.35049, 0, 0, 0.99455, -0.104257}, //alliance
|
||||
{5187.59, -2453.12, 1455.51, 5.87943, 0, 0, 0.20051, -0.979692}, //alliance
|
||||
{5429.43, -2340.65, 1465.38, 4.7681, 0, 0, 0.687138, -0.726527}, //alliance
|
||||
{5463.99, -2315.95, 1470.29, 1.52045, 0, 0, 0.689084, 0.724682}, //alliance
|
||||
{5624.65, -2495.09, 1510.11, 0.0124869, 0, 0, 0.00624342, 0.999981}, //alliance
|
||||
{5285.41, -3348.32, 1663.01, 1.57152, 0, 0, 0.707362, 0.706852}, //horde
|
||||
{5417.69, -3372.52, 1656.31, 0.361993, 0, 0, 0.18001, 0.983665}, //horde
|
||||
{5315.34, -3238.32, 1622.88, 3.03627, 0, 0, 0.998614, 0.0526347}, //horde
|
||||
{5303.4, -3096.44, 1596.41, 1.72073, 0, 0, 0.758081, 0.65216}, //horde
|
||||
{5265.13, -3177.27, 1616.22, 0.813604, 0, 0, 0.395674, 0.918391}, //horde
|
||||
{5374.3, -3420.59, 1653.43, 1.45762, 0, 0, 0.665981, 0.745969}, //horde
|
||||
{5441.54, -3321.59, 1651.55, 0.258306, 0, 0, 0.128794, 0.991671} //horde
|
||||
};
|
||||
|
||||
float AllianceFirePos[92][8]=//spawn points for the fire visuals (GO) in the alliance base
|
||||
{
|
||||
{5039.9, -1796.84, 1323.88, 2.59222, 0, 0, 0.962511, 0.271243},
|
||||
{5087.2, -1795.2, 1320.68, 1.03946, 0, 0, 0.496644, 0.867954},
|
||||
{5112.68, -1806.66, 1359.93, 1.37799, 0, 0, 0.63576, 0.771887},
|
||||
{5095.61, -1793.27, 1359.78, 0.580806, 0, 0, 0.286338, 0.958129},
|
||||
{5090.43, -1784.45, 1360.44, 0.796784, 0, 0, 0.387937, 0.921686},
|
||||
{5139.25, -1783.11, 1359.39, 3.30849, 0, 0, 0.99652, -0.0833509},
|
||||
{5112.16, -1763.72, 1361.35, 5.10312, 0, 0, 0.556388, -0.830922},
|
||||
{4981.18, -1793.98, 1335.7, 3.23072, 0, 0, 0.999007, -0.0445498},
|
||||
{4996.57, -1766.75, 1341.62, 3.5331, 0, 0, 0.980902, -0.194505},
|
||||
{4983.74, -1769.25, 1345.75, 3.79228, 0, 0, 0.947541, -0.319635},
|
||||
{4996.01, -1774.43, 1330.71, 3.07364, 0, 0, 0.999423, 0.0339693},
|
||||
{5094.2, -1726.13, 1330.55, 1.56175, 0, 0, 0.703901, 0.710298},
|
||||
{5079.82, -1721.24, 1336.26, 1.18868, 0, 0, 0.559964, 0.828517},
|
||||
{5077.68, -1717.15, 1327.78, 0.0145145, 0, 0, 0.00725717, 0.999974},
|
||||
{5122.27, -1738.22, 1341.67, 0.835256, 0, 0, 0.405593, 0.914054},
|
||||
{5131.88, -1741.15, 1335.25, 2.15472, 0, 0, 0.880712, 0.473653},
|
||||
{5196.93, -1772.99, 1345.2, 0.128397, 0, 0, 0.0641544, 0.99794},
|
||||
{5225.33, -1756.06, 1344.17, 3.04223, 0, 0, 0.998766, 0.0496599},
|
||||
{5224.84, -1767.05, 1360.06, 3.19538, 0, 0, 0.999638, -0.0268922},
|
||||
{5202.05, -1763.47, 1361.68, 2.59455, 0, 0, 0.962826, 0.270122},
|
||||
{5194.74, -1766.66, 1356.94, 0.0734191, 0, 0, 0.0367013, 0.999326},
|
||||
{5159.67, -1832.97, 1344.5, 5.17457, 0, 0, 0.526356, -0.850264},
|
||||
{5096.17, -1858.73, 1332.46, 5.30021, 0, 0, 0.471939, -0.881631},
|
||||
{5110.7, -1856.59, 1342.84, 5.97564, 0, 0, 0.153167, -0.9882},
|
||||
{5109.76, -1855.3, 1332.38, 4.89572, 0, 0, 0.639411, -0.768865},
|
||||
{5068.95, -1837.37, 1328.81, 2.61569, 0, 0, 0.965628, 0.25993},
|
||||
{5064.4, -1824.77, 1329.02, 2.16409, 0, 0, 0.88292, 0.469524},
|
||||
{5059.89, -1848.79, 1329.59, 0.0709955, 0, 0, 0.0354903, 0.99937},
|
||||
{5014.37, -1851.39, 1322.56, 4.66949, 0, 0, 0.722111, -0.691777},
|
||||
{5025.1, -1848.27, 1323.39, 4.44565, 0, 0, 0.794854, -0.606801},
|
||||
{4942.63, -1890.13, 1326.59, 3.28719, 0, 0, 0.997351, -0.0727343},
|
||||
{4937.95, -1888.71, 1352.41, 3.41678, 0, 0, 0.990549, -0.13716},
|
||||
{4922.48, -1881.92, 1352.41, 5.03077, 0, 0, 0.586075, -0.810257},
|
||||
{4915.35, -1894.32, 1351.24, 6.22457, 0, 0, 0.0293048, -0.999571},
|
||||
{4922.71, -1904.84, 1352.56, 1.37866, 0, 0, 0.63602, 0.771672},
|
||||
{4932.89, -1905.49, 1352.56, 1.89702, 0, 0, 0.812549, 0.582893},
|
||||
{5011.83, -1861.05, 1345.86, 4.43777, 0, 0, 0.797239, -0.603664},
|
||||
{5011.83, -1861.05, 1363.26, 4.748, 0, 0, 0.694406, -0.719583},
|
||||
{5021.46, -1858.35, 1342.17, 4.86188, 0, 0, 0.652329, -0.757936},
|
||||
{4995.02, -1698.3, 1370.38, 6.15779, 0, 0, 0.0626579, -0.998035},
|
||||
{5119.85, -1728.9, 1336.04, 5.87112, 0, 0, 0.204579, -0.97885},
|
||||
{5214.75, -1751.02, 1342.5, 5.08965, 0, 0, 0.561972, -0.827156},
|
||||
{5075.04, -1822.43, 1328.87, 3.99951, 0, 0, 0.9094, -0.415924},
|
||||
{5057.09, -1823.32, 1350.35, 3.88169, 0, 0, 0.93231, -0.361659},
|
||||
{4984.6, -1816.99, 1329.21, 3.05308, 0, 0, 0.999021, 0.0442417},
|
||||
{4983.35, -1811.55, 1356.82, 3.33975, 0, 0, 0.995096, -0.098917},
|
||||
{4984.11, -1825.73, 1350.76, 2.26375, 0, 0, 0.905211, 0.424962},
|
||||
{4968.47, -1786.46, 1354.09, 3.07663, 0, 0, 0.999473, 0.0324733},
|
||||
{5061.82, -1751.16, 1339.07, 5.94727, 0, 0, 0.167171, -0.985928},
|
||||
{5063.75, -1763, 1351.91, 0.759707, 0, 0, 0.370784, 0.928719},
|
||||
{5078.65, -1708.26, 1353.9, 1.27022, 0, 0, 0.593264, 0.805008},
|
||||
{4983.19, -1755.96, 1331.13, 4.28221, 0, 0, 0.841733, -0.539894},
|
||||
{4972.76, -1755.3, 1332.5, 4.21938, 0, 0, 0.858276, -0.513188},
|
||||
{4961.65, -1760.82, 1351.69, 3.56515, 0, 0, 0.977659, -0.210198},
|
||||
{5086.45, -1779.83, 1321.62, 6.23157, 0, 0, 0.0258051, -0.999667},
|
||||
{5063.15, -1756.74, 1328.56, 0.886926, 0, 0, 0.42907, 0.903271},
|
||||
{5042.45, -1800.61, 1323.88, 2.50093, 0, 0, 0.949131, 0.31488},
|
||||
{5084.74, -1725.35, 1327.89, 1.65034, 0, 0, 0.734663, 0.678432},
|
||||
{4993.25, -1758.1, 1331.07, 3.49995, 0, 0, 0.98399, -0.178223},
|
||||
{5078.53, -1867.85, 1348.91, 5.85612, 0, 0, 0.211913, -0.977288},
|
||||
{5080.74, -1869.73, 1333.18, 6.18206, 0, 0, 0.0505424, -0.998722},
|
||||
{5089.55, -1894.13, 1356.08, 1.52072, 0, 0, 0.689181, 0.724589},
|
||||
{5113.24, -1899.49, 1363.77, 1.50108, 0, 0, 0.682034, 0.731321},
|
||||
{4984.18, -1907.69, 1325.62, 3.82193, 0, 0, 0.942698, -0.333646},
|
||||
{5094.14, -2432.08, 1429.38, 4.70083, 0, 0, 0.711182, -0.703007},
|
||||
{5329.89, -2113.30, 1281.06, 5.60560, 0, 0, 0.332347, -0.943157},
|
||||
{5170.87, -2148.13, 1278.32, 1.63540, 0, 0, 0.729573, 0.683903 },
|
||||
{5132.94, -1960.25, 1367.8, 3.69787, 0, 0, 0.961568, -0.274566},
|
||||
{5280.82, -2351.55, 1431.57, 4.46913, 0, 0, 0.787677, -0.616088},
|
||||
{5176.78, -2121.43, 1295.27, 3.24153, 0, 0, 0.998752, -0.04995},
|
||||
{5332.75, -2101.41, 1296.37, 5.50350, 0, 0, 0.380043, -0.924969},
|
||||
{5265.70, -2050.27, 1287.57, 0.50051, 0, 0, 0.247655, 0.968848 },
|
||||
{5194.21, -2129.89, 1274.04, 3.08053, 0, 0, 0.999534, 0.0305272},
|
||||
{5225.81, -1985.50, 1364.15, 0.37247, 0, 0, 0.185163, 0.982708 },
|
||||
{5339.46, -2204.47, 1280.45, 0.99921, 0, 0, 0.479081, 0.877771 },
|
||||
{5269.63, -2020.57, 1299.62, 3.00201, 0, 0, 0.997566, 0.0697332},
|
||||
{5111.54, -2445.70, 1435.31, 2.70983, 0, 0, 0.976788, 0.214207 },
|
||||
{5111.24, -1901.14, 1355.33, 1.61028, 0, 0, 0.720929, 0.693009 },
|
||||
{5310.42, -2207.82, 1277.46, 0.50441, 0, 0, 0.249544, 0.968363 },
|
||||
{5150.81, -2042.13, 1394.3, 2.21031, 0, 0, 0.893534, 0.448995 },
|
||||
{5224.84, -2376.61, 1366.33, 5.0621, 0, 0, 0.573311, -0.819338},
|
||||
{5105.41, -2454.86, 1446.16, 4.64584, 0, 0, 0.730239, -0.683191},
|
||||
{5309.65, -2188.28, 1266.84, 5.56631, 0, 0, 0.350811, -0.936446},
|
||||
{5281.46, -2047.82, 1287.67, 2.44909, 0, 0, 0.940652, 0.339373 },
|
||||
{5325.45, -2189.41, 1309.6, 6.23783, 0, 0, 0.0226771, -0.999743},
|
||||
{5190.96, -2142.54, 1293.03, 6.25668, 0, 0, 0.0132544, -0.999912},
|
||||
{5089.99, -2467.49, 1441.8, 0.77381, 0, 0, 0.377326, 0.92608 },
|
||||
{5195.08, -2129.01, 1285.36, 3.55727, 0, 0, 0.978480, -0.206344},
|
||||
{5353.76, -2116.28, 1299.27, 6.17894, 0, 0, 0.0521006, -0.998642},
|
||||
{5271.14, -2037.38, 1299.24, 4.07879, 0, 0, 0.892201, -0.451638},
|
||||
{5332.5 , -2181.28, 1279.95, 4.6906, 0, 0, 0.714768, -0.699362},
|
||||
{5108.2 , -2429.84, 1427.73, 4.5194, 0, 0, 0.771943, -0.635691}
|
||||
};
|
||||
|
||||
float HordeFirePos[65][8]=//spawn points for the fire visuals (GO) in the horde base
|
||||
{
|
||||
{5524.11, -2612.73, 1483.38, 1.96198, 0, 0, 0.831047, 0.556202},
|
||||
{5514.42, -2617.19, 1505.77, 1.82453, 0, 0, 0.790892, 0.611956},
|
||||
{5510.21, -2624.77, 1485.34, 1.71065, 0, 0, 0.754783, 0.655974},
|
||||
{5570.72, -2619.04, 1487.62, 0.728898, 0, 0, 0.356435, 0.93432},
|
||||
{5570.29, -2639.37, 1487.31, 1.49308, 0, 0, 0.679104, 0.734042},
|
||||
{5583.56, -2637.2, 1503.78, 1.46559, 0, 0, 0.668951, 0.743307},
|
||||
{5571.53, -2626.81, 1510.99, 0.362107, 0, 0, 0.180066, 0.983654},
|
||||
{5545.97, -2659.62, 1489.64, 5.07055, 0, 0, 0.569845, -0.821752},
|
||||
{5557.44, -2675.91, 1482.58, 1.70118, 0, 0, 0.751671, 0.659539},
|
||||
{5594.98, -2742.31, 1495.51, 4.5993, 0, 0, 0.74594, -0.666013},
|
||||
{5599.65, -2755.6, 1505.05, 1.66896, 0, 0, 0.740947, 0.671564},
|
||||
{5565.95, -2774.75, 1499.48, 6.22425, 0, 0, 0.0294611, -0.999566},
|
||||
{5567.1, -2769.7, 1511.17, 5.99257, 0, 0, 0.144799, -0.989461},
|
||||
{5572.84, -2774.16, 1527.06, 0.836428, 0, 0, 0.406129, 0.913816},
|
||||
{5538.32, -2805.94, 1498.87, 4.30082, 0, 0, 0.836674, -0.547701},
|
||||
{5515.66, -2801.74, 1503.53, 5.57316, 0, 0, 0.347602, -0.937642},
|
||||
{5516.76, -2827.14, 1501.15, 0.35026, 0, 0, 0.174236, 0.984704},
|
||||
{5536.13, -2813.51, 1537.21, 4.51681, 0, 0, 0.772765, -0.634692},
|
||||
{5525.05, -2825.16, 1538.53, 0.489275, 0, 0, 0.242205, 0.970225},
|
||||
{5534.42, -2815.45, 1562.84, 4.62834, 0, 0, 0.736191, -0.676774},
|
||||
{5519.64, -2831.12, 1526.46, 0.611008, 0, 0, 0.300774, 0.953696},
|
||||
{5551.04, -2827.55, 1523.5, 3.35206, 0, 0, 0.994468, -0.10504},
|
||||
{5469.22, -2802.87, 1503.5, 4.99509, 0, 0, 0.600436, -0.799673},
|
||||
{5427.8, -2737.26, 1487.12, 1.78673, 0, 0, 0.779186, 0.626793},
|
||||
{5454.1, -2709.1, 1485.92, 3.03552, 0, 0, 0.998594, 0.0530137},
|
||||
{5436.3, -2718.2, 1506.02, 2.7567, 0, 0, 0.981539, 0.191261},
|
||||
{5412.6, -2740.55, 1510.79, 2.98446, 0, 0, 0.996915, 0.0784832},
|
||||
{5406.12, -2752.48, 1521.01, 2.05769, 0, 0, 0.856705, 0.515807},
|
||||
{5445.24, -2676.35, 1521.89, 2.91378, 0, 0, 0.99352, 0.113661},
|
||||
{5481.4, -2665.08, 1482.23, 4.30001, 0, 0, 0.836895, -0.547363},
|
||||
{5443.51, -2675.44, 1487.12, 2.90986, 0, 0, 0.993295, 0.115606},
|
||||
{5391.72, -2647.3, 1528.9, 3.76987, 0, 0, 0.951063, -0.308997},
|
||||
{5421.09, -2734.12, 1521.01, 2.70567, 0, 0, 0.97634, 0.216242},
|
||||
{5405.39, -2710.33, 1533.77, 2.51324, 0, 0, 0.951052, 0.309032},
|
||||
{5423.96, -2703.76, 1516.34, 2.79206, 0, 0, 0.984767, 0.173879},
|
||||
{5444.75, -2735.23, 1486.37, 2.22657, 0, 0, 0.897155, 0.441715},
|
||||
{5570.98, -2747.91, 1495.7, 5.14433, 0, 0, 0.53915, -0.84221},
|
||||
{5567.79, -2673.9, 1484.66, 2.72529, 0, 0, 0.978415, 0.20665},
|
||||
{5600.71, -2696.8, 1500.42, 0.443704, 0, 0, 0.220036, 0.975492},
|
||||
{5600.7, -2693.04, 1515.2, 5.16003, 0, 0, 0.532522, -0.846416},
|
||||
{5627.56, -2839.66, 1510.53, 5.41527, 0, 0, 0.420463, -0.907309},
|
||||
{5622.02, -2868.71, 1516.22, 2.25482, 0, 0, 0.903303, 0.429002},
|
||||
{5586.61, -2878.97, 1510.34, 4.55604, 0, 0, 0.76017, -0.649724},
|
||||
{5583.78, -2843.71, 1509.54, 5.35715, 0, 0, 0.44665, -0.894709},
|
||||
{5580.95, -2811.3, 1513.3, 3.57587, 0, 0, 0.976518, -0.215434},
|
||||
{5542.52, -2869.31, 1523.13, 5.23304, 0, 0, 0.501275, -0.865288},
|
||||
{5557.35, -2866.36, 1518.76, 4.48299, 0, 0, 0.783388, -0.621533},
|
||||
{5380.91, -2849.36, 1512.81, 3.90962, 0, 0, 0.927168, -0.374646},
|
||||
{5395.76, -2881.41, 1521.11, 4.28426, 0, 0, 0.84118, -0.540755},
|
||||
{5374.87, -2859.63, 1528.98, 3.30252, 0, 0, 0.996765, -0.0803745},
|
||||
{5356.07, -2854.66, 1520.34, 5.83933, 0, 0, 0.220108, -0.975475},
|
||||
{5363.01, -2975.72, 1539.02, 4.13738, 0, 0, 0.87859, -0.477576},
|
||||
{5336.85, -2980.74, 1561.24, 5.11126, 0, 0, 0.553001, -0.83318},
|
||||
{5335.23, -2974.62, 1540.05, 5.04451, 0, 0, 0.580496, -0.814263},
|
||||
{5422.37, -2998.87, 1549.98, 4.51831, 0, 0, 0.772288, -0.635272},
|
||||
{5405.54, -3014.6, 1562.16, 5.86761, 0, 0, 0.206298, -0.978489},
|
||||
{5427.96, -3019.4, 1561.58, 3.53498, 0, 0, 0.980718, -0.19543},
|
||||
{5348.12, -2977.84, 1582.47, 3.94025, 0, 0, 0.921323, -0.388799},
|
||||
{5331.12, -2993.71, 1576.14, 0.0642734, 0, 0, 0.0321311, 0.999484},
|
||||
{5321.63, -2986.55, 1552.2, 5.29503, 0, 0, 0.474219, -0.880407},
|
||||
{5292.1, -2914.36, 1529.52, 2.9742, 0, 0, 0.996499, 0.083601},
|
||||
{5281.77, -2926.5, 1530.62, 1.67829, 0, 0, 0.744071, 0.6681},
|
||||
{5287.19, -2909.94, 1543.49, 3.31192, 0, 0, 0.996376, -0.0850591},
|
||||
{5534.15, -2679.35, 1483.61, 0.428685, 0, 0, 0.212705, 0.977116},
|
||||
{5545.43, -2647.82, 1483.05, 5.38848, 0, 0, 0.432578, -0.901596}
|
||||
};
|
||||
|
||||
hyjalAI::hyjalAI(Creature *c) : npc_escortAI(c), Summons(m_creature)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)c->GetInstanceData());
|
||||
VeinsSpawned[0] = false;
|
||||
VeinsSpawned[1] = false;
|
||||
for(uint8 i=0;i<14;i++)
|
||||
VeinGUID[i] = 0;
|
||||
InfernalCount = 0;
|
||||
TeleportTimer = 1000;
|
||||
Overrun = false;
|
||||
Teleported = false;
|
||||
WaitForTeleport = false;
|
||||
OverrunCounter = 0;
|
||||
OverrunCounter2 = 0;
|
||||
InfernalPoint = 0;
|
||||
RespawnTimer = 10000;
|
||||
DoRespawn = false;
|
||||
DoHide = false;
|
||||
}
|
||||
|
||||
void hyjalAI::JustSummoned(Creature *summoned)
|
||||
{
|
||||
Summons.Summon(summoned);
|
||||
}
|
||||
|
||||
void hyjalAI::SummonedCreatureDespawn(Creature* summoned)
|
||||
{
|
||||
Summons.Despawn(summoned);
|
||||
}
|
||||
|
||||
void hyjalAI::Reset()
|
||||
{
|
||||
IsDummy = false;
|
||||
m_creature->setActive(true);
|
||||
// GUIDs
|
||||
PlayerGUID = 0;
|
||||
BossGUID[0] = 0;
|
||||
@@ -72,23 +331,28 @@ void hyjalAI::Reset()
|
||||
// Set faction properly based on creature entry
|
||||
switch(m_creature->GetEntry())
|
||||
{
|
||||
case 17772:
|
||||
case JAINA:
|
||||
Faction = 0;
|
||||
DoCast(m_creature, SPELL_BRILLIANCE_AURA, true);
|
||||
break;
|
||||
|
||||
case 17852:
|
||||
case THRALL:
|
||||
Faction = 1;
|
||||
break;
|
||||
|
||||
case TYRANDE:
|
||||
Faction = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
//Bools
|
||||
//Bools
|
||||
EventBegun = false;
|
||||
FirstBossDead = false;
|
||||
SecondBossDead = false;
|
||||
Summon = false;
|
||||
bRetreat = false;
|
||||
Debug = false;
|
||||
|
||||
|
||||
//Flags
|
||||
m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
@@ -107,27 +371,18 @@ void hyjalAI::Reset()
|
||||
else error_log(ERROR_INST_DATA);
|
||||
|
||||
//Visibility
|
||||
switch(m_creature->GetEntry())
|
||||
{
|
||||
case 17772: if(pInstance->GetData(DATA_ANETHERONEVENT) == DONE)
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
else m_creature->SetVisibility(VISIBILITY_ON);
|
||||
break;
|
||||
case 17852: if(pInstance->GetData(DATA_AZGALOREVENT) == DONE)
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
else m_creature->SetVisibility(VISIBILITY_ON);
|
||||
break;
|
||||
}
|
||||
|
||||
DoHide = true;
|
||||
|
||||
//CreatureList.clear();
|
||||
//If Jaina evades, reset the visibility of all other creatures in the grid.
|
||||
if(CreatureList.empty())
|
||||
/*if(CreatureList.empty())
|
||||
return;
|
||||
|
||||
for(std::list<uint64>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr)
|
||||
if(Creature* cr = ((Creature*)Unit::GetUnit(*m_creature, *itr)))
|
||||
cr->SetVisibility(VISIBILITY_ON);
|
||||
|
||||
CreatureList.clear();
|
||||
CreatureList.clear();*/
|
||||
}
|
||||
|
||||
void hyjalAI::EnterEvadeMode()
|
||||
@@ -140,7 +395,7 @@ void hyjalAI::EnterEvadeMode()
|
||||
|
||||
if(m_creature->isAlive())
|
||||
m_creature->GetMotionMaster()->MoveTargetedHome();
|
||||
|
||||
|
||||
m_creature->SetLootRecipient(NULL);
|
||||
|
||||
InCombat = false;
|
||||
@@ -159,25 +414,74 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3])
|
||||
{
|
||||
uint32 random = rand()%4;
|
||||
float SpawnLoc[3];
|
||||
float AttackLoc[3];
|
||||
|
||||
for(uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
SpawnLoc[i] = Base[random][i];
|
||||
AttackLoc[i] = AttackArea[Faction][i];
|
||||
}
|
||||
Creature* pCreature = NULL;
|
||||
switch(entry)
|
||||
{
|
||||
case 17906: //GARGOYLE
|
||||
|
||||
Creature* pCreature = m_creature->SummonCreature(entry, SpawnLoc[0], SpawnLoc[1], SpawnLoc[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 120000);
|
||||
if(!FirstBossDead && (WaveCount == 1 || WaveCount == 3))
|
||||
{//summon at tower
|
||||
pCreature = m_creature->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0]+irand(-20,20), SpawnPointSpecial[SPAWN_NEAR_TOWER][1]+irand(-20,20), SpawnPointSpecial[SPAWN_NEAR_TOWER][2]+irand(-10,10), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
|
||||
if(pCreature)
|
||||
((hyjal_trashAI*)pCreature->AI())->useFlyPath = true;
|
||||
}else{//summon at gate
|
||||
pCreature = m_creature->SummonCreature(entry, SpawnPointSpecial[SPAWN_GARG_GATE][0]+irand(-10,10), SpawnPointSpecial[SPAWN_GARG_GATE][1]+irand(-10,10), SpawnPointSpecial[SPAWN_GARG_GATE][2]+irand(-10,10), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
|
||||
}
|
||||
break;
|
||||
case 17907: //FROST_WYRM ,
|
||||
if(FirstBossDead && WaveCount == 1)
|
||||
{//summon at gate
|
||||
pCreature = m_creature->SummonCreature(entry, SpawnPointSpecial[SPAWN_WYRM_GATE][0],SpawnPointSpecial[SPAWN_WYRM_GATE][1],SpawnPointSpecial[SPAWN_WYRM_GATE][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
|
||||
}else{
|
||||
pCreature = m_creature->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0], SpawnPointSpecial[SPAWN_NEAR_TOWER][1],SpawnPointSpecial[SPAWN_NEAR_TOWER][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
|
||||
if(pCreature)
|
||||
((hyjal_trashAI*)pCreature->AI())->useFlyPath = true;
|
||||
}
|
||||
break;
|
||||
case 17908: //GIANT_INFERNAL
|
||||
InfernalCount++;
|
||||
if(InfernalCount > 7)InfernalCount = 0;
|
||||
pCreature = m_creature->SummonCreature(entry, InfernalPos[InfernalCount][0], InfernalPos[InfernalCount][1], InfernalPos[InfernalCount][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
|
||||
break;
|
||||
default:
|
||||
pCreature = m_creature->SummonCreature(entry, SpawnLoc[0], SpawnLoc[1], SpawnLoc[2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if(pCreature)
|
||||
{
|
||||
// Increment Enemy Count to be used in World States and instance script
|
||||
++EnemyCount;
|
||||
|
||||
pCreature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
|
||||
pCreature->GetMotionMaster()->MovePoint(0, AttackLoc[0],AttackLoc[1],AttackLoc[2]);
|
||||
pCreature->AddThreat(m_creature, 0.0f);
|
||||
//pCreature->GetMotionMaster()->MovePoint(0, AttackLoc[0],AttackLoc[1],AttackLoc[2]);
|
||||
//pCreature->AddThreat(m_creature, 0.0f);
|
||||
//DoZoneInCombat(pCreature);
|
||||
pCreature->setActive(true);
|
||||
DoZoneInCombat(pCreature);
|
||||
switch(entry)
|
||||
{
|
||||
case NECROMANCER:
|
||||
case ABOMINATION:
|
||||
case GHOUL:
|
||||
case BANSHEE:
|
||||
case CRYPT_FIEND:
|
||||
case GARGOYLE:
|
||||
case FROST_WYRM:
|
||||
case GIANT_INFERNAL:
|
||||
case FEL_STALKER:
|
||||
case RAGE_WINTERCHILL:
|
||||
case ANETHERON:
|
||||
case KAZROGAL:
|
||||
case AZGALOR:
|
||||
((hyjal_trashAI*)pCreature->AI())->IsEvent = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if creature is a boss.
|
||||
if (pCreature->isWorldBoss())
|
||||
@@ -200,6 +504,7 @@ void hyjalAI::SummonNextWave(Wave wave[18], uint32 Count, float Base[4][3])
|
||||
error_log(ERROR_INST_DATA);
|
||||
return;
|
||||
}
|
||||
InfernalCount = 0;//reset infernal count every new wave
|
||||
|
||||
EnemyCount = pInstance->GetData(DATA_TRASH);
|
||||
for(uint8 i = 0; i < 18; ++i)
|
||||
@@ -238,7 +543,7 @@ void hyjalAI::SummonNextWave(Wave wave[18], uint32 Count, float Base[4][3])
|
||||
|
||||
void hyjalAI::StartEvent(Player* player)
|
||||
{
|
||||
if(!player)
|
||||
if(!player || IsDummy)
|
||||
return;
|
||||
|
||||
Talk(BEGIN);
|
||||
@@ -255,6 +560,8 @@ void hyjalAI::StartEvent(Player* player)
|
||||
UpdateWorldState(WORLD_STATE_WAVES, 0);
|
||||
UpdateWorldState(WORLD_STATE_ENEMY, 0);
|
||||
UpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0);
|
||||
|
||||
DeSpawnVeins();
|
||||
}
|
||||
|
||||
uint32 hyjalAI::GetInstanceData(uint32 Event)
|
||||
@@ -305,12 +612,12 @@ void hyjalAI::Talk(uint32 id)
|
||||
void hyjalAI::UpdateWorldState(uint32 id, uint32 state)
|
||||
{
|
||||
Map * map = m_creature->GetMap();
|
||||
|
||||
if(!map->IsDungeon())
|
||||
|
||||
if(!map->IsDungeon())
|
||||
return;
|
||||
|
||||
Map::PlayerList const& players = map->GetPlayers();
|
||||
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
@@ -326,7 +633,7 @@ void hyjalAI::UpdateWorldState(uint32 id, uint32 state)
|
||||
|
||||
void hyjalAI::Retreat()
|
||||
{
|
||||
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
|
||||
/*CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
|
||||
Cell cell(pair);
|
||||
cell.data.Part.reserved = ALL_DISTRICT;
|
||||
cell.SetNoCreate();
|
||||
@@ -339,18 +646,9 @@ void hyjalAI::Retreat()
|
||||
<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>,
|
||||
GridTypeMapContainer> creature_visitor(creature_searcher);
|
||||
|
||||
// Then get all Ancient Gem Veins. NOTE: Grid Search will only be able to find those in the grid.
|
||||
std::list<GameObject*> goList;
|
||||
Trinity::AllGameObjectsWithEntryInGrid go_check(185557);
|
||||
Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid> go_search(goList, go_check);
|
||||
TypeContainerVisitor
|
||||
<Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid>, GridTypeMapContainer> go_visit(go_search);
|
||||
|
||||
CellLock<GridReadGuard> cell_lock(cell, pair);
|
||||
// Get Creatures
|
||||
cell_lock->Visit(cell_lock, creature_visitor, *(m_creature->GetMap()));
|
||||
// Get GOs
|
||||
cell_lock->Visit(cell_lock, go_visit, *(m_creature->GetMap()));
|
||||
|
||||
CreatureList.clear();
|
||||
if(!creatures.empty())
|
||||
@@ -358,36 +656,188 @@ void hyjalAI::Retreat()
|
||||
for(std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
|
||||
{
|
||||
(*itr)->CastSpell(*itr, SPELL_TELEPORT_VISUAL, true);
|
||||
(*itr)->setFaction(35);//make them friendly so mobs won't attack them
|
||||
CreatureList.push_back((*itr)->GetGUID());
|
||||
}
|
||||
|
||||
DoCast(m_creature, SPELL_TELEPORT_VISUAL);
|
||||
bRetreat = true;
|
||||
RetreatTimer = 1000;
|
||||
}
|
||||
|
||||
if(!goList.empty())
|
||||
}*/
|
||||
if(pInstance)
|
||||
{
|
||||
for(std::list<GameObject*>::iterator itr = goList.begin(); itr != goList.end(); ++itr)
|
||||
(*itr)->SetRespawnTime(5000);
|
||||
if(Faction == 0)
|
||||
{
|
||||
pInstance->SetData(DATA_ALLIANCE_RETREAT, 1);
|
||||
AddWaypoint(0,JainaWPs[0][0],JainaWPs[0][1],JainaWPs[0][2]);
|
||||
AddWaypoint(1,JainaWPs[1][0],JainaWPs[1][1],JainaWPs[1][2]);
|
||||
Start(false, false, false);
|
||||
SetDespawnAtEnd(false);//move to center of alliance base
|
||||
}
|
||||
if(Faction == 1)
|
||||
{
|
||||
pInstance->SetData(DATA_HORDE_RETREAT, 1);
|
||||
Creature* JainaDummy = m_creature->SummonCreature(JAINA,JainaDummySpawn[0][0],JainaDummySpawn[0][1],JainaDummySpawn[0][2],JainaDummySpawn[0][3],TEMPSUMMON_TIMED_DESPAWN,60000);
|
||||
if(JainaDummy)
|
||||
{
|
||||
JainaDummy->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
((hyjalAI*)JainaDummy->AI())->IsDummy = true;
|
||||
JainaDummy->CastSpell(JainaDummy, SPELL_TELEPORT_VISUAL, true);
|
||||
}
|
||||
AddWaypoint(0,JainaDummySpawn[1][0],JainaDummySpawn[1][1],JainaDummySpawn[1][2]);
|
||||
Start(false, false, false);
|
||||
SetDespawnAtEnd(false);//move to center of alliance base
|
||||
}
|
||||
}
|
||||
SpawnVeins();
|
||||
Overrun = true;
|
||||
m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);//cant talk after overrun event started
|
||||
}
|
||||
|
||||
void hyjalAI::SpawnVeins()
|
||||
{
|
||||
if(Faction == 0)
|
||||
{
|
||||
if (VeinsSpawned[0])//prevent any buggers
|
||||
return;
|
||||
for (uint8 i = 0; i<7; i++)
|
||||
{
|
||||
GameObject* gem = m_creature->SummonGameObject(ANCIENT_VEIN,VeinPos[i][0],VeinPos[i][1],VeinPos[i][2],VeinPos[i][3],VeinPos[i][4],VeinPos[i][5],VeinPos[i][6],VeinPos[i][7],0);
|
||||
if(gem)
|
||||
VeinGUID[i]=gem->GetGUID();
|
||||
}
|
||||
VeinsSpawned[0] = true;
|
||||
}else{
|
||||
if (VeinsSpawned[1])
|
||||
return;
|
||||
for (uint8 i = 7; i<14; i++)
|
||||
{
|
||||
GameObject* gem = m_creature->SummonGameObject(ANCIENT_VEIN,VeinPos[i][0],VeinPos[i][1],VeinPos[i][2],VeinPos[i][3],VeinPos[i][4],VeinPos[i][5],VeinPos[i][6],VeinPos[i][7],0);
|
||||
if(gem)
|
||||
VeinGUID[i]=gem->GetGUID();
|
||||
}
|
||||
VeinsSpawned[1] = true;
|
||||
}
|
||||
}
|
||||
|
||||
void hyjalAI::DeSpawnVeins()
|
||||
{
|
||||
if(!pInstance)return;
|
||||
if(Faction == 1)
|
||||
{
|
||||
Creature* pUnit=(Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_JAINAPROUDMOORE));
|
||||
if (!pUnit)return;
|
||||
hyjalAI* ai = ((hyjalAI*)pUnit->AI());
|
||||
if(!ai)return;
|
||||
for (uint8 i = 0; i<7; i++)
|
||||
{
|
||||
GameObject* gem = GameObject::GetGameObject((*m_creature), ai->VeinGUID[i]);
|
||||
if(gem)
|
||||
gem->RemoveFromWorld();
|
||||
}
|
||||
}else if (Faction)
|
||||
{
|
||||
Creature* pUnit=(Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_THRALL));
|
||||
if (!pUnit)return;
|
||||
hyjalAI* ai = ((hyjalAI*)pUnit->AI());
|
||||
if(!ai)return;
|
||||
for (uint8 i = 7; i<14; i++)
|
||||
{
|
||||
GameObject* gem = GameObject::GetGameObject((*m_creature), ai->VeinGUID[i]);
|
||||
if(gem)
|
||||
gem->RemoveFromWorld();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void hyjalAI::UpdateAI(const uint32 diff)
|
||||
{
|
||||
if(IsDummy)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if(DoHide)
|
||||
{
|
||||
DoHide = false;
|
||||
switch(m_creature->GetEntry())
|
||||
{
|
||||
case JAINA:
|
||||
if(pInstance->GetData(DATA_ALLIANCE_RETREAT))
|
||||
{
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
HideNearPos(m_creature->GetPositionX(), m_creature->GetPositionY());
|
||||
HideNearPos(5037.76, -1889.71);
|
||||
for(uint8 i = 0; i < 92; i++)//summon fires
|
||||
m_creature->SummonGameObject(FLAMEOBJECT,AllianceFirePos[i][0],AllianceFirePos[i][1],AllianceFirePos[i][2],AllianceFirePos[i][3],AllianceFirePos[i][4],AllianceFirePos[i][5],AllianceFirePos[i][6],AllianceFirePos[i][7],0);
|
||||
|
||||
}
|
||||
else m_creature->SetVisibility(VISIBILITY_ON);
|
||||
break;
|
||||
case THRALL: //thrall
|
||||
if(pInstance->GetData(DATA_HORDE_RETREAT))
|
||||
{
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
HideNearPos(m_creature->GetPositionX(), m_creature->GetPositionY());
|
||||
HideNearPos(5563, -2763.19);
|
||||
HideNearPos(5542.2, -2629.36);
|
||||
}
|
||||
else m_creature->SetVisibility(VISIBILITY_ON);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(DoRespawn)
|
||||
{
|
||||
if(RespawnTimer < diff)
|
||||
{
|
||||
DoRespawn = false;
|
||||
RespawnNearPos(m_creature->GetPositionX(), m_creature->GetPositionY());
|
||||
if(Faction == 0)
|
||||
{
|
||||
RespawnNearPos(5037.76, -1889.71);
|
||||
}else if (Faction == 1)
|
||||
{
|
||||
RespawnNearPos(5563, -2763.19);
|
||||
RespawnNearPos(5542.2, -2629.36);
|
||||
}
|
||||
m_creature->SetVisibility(VISIBILITY_ON);
|
||||
}else{
|
||||
RespawnTimer -= diff;
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(Overrun)
|
||||
DoOverrun(Faction, diff);
|
||||
if(m_creature->GetEntry() == 17772)
|
||||
{
|
||||
if(!m_creature->HasAura(SPELL_BRILLIANCE_AURA,0))
|
||||
DoCast(m_creature, SPELL_BRILLIANCE_AURA, true);
|
||||
}
|
||||
if(bRetreat)
|
||||
{
|
||||
if(RetreatTimer < diff)
|
||||
{
|
||||
bRetreat = false;
|
||||
if(CreatureList.empty())
|
||||
HideNearPos(m_creature->GetPositionX(), m_creature->GetPositionY());
|
||||
switch(m_creature->GetEntry())
|
||||
{
|
||||
case JAINA://jaina
|
||||
HideNearPos(5037.76, -1889.71);
|
||||
break;
|
||||
case THRALL://thrall
|
||||
HideNearPos(5563, -2763.19);
|
||||
HideNearPos(5542.2, -2629.36);
|
||||
HideNearPos(5603.75, -2853.12);
|
||||
break;
|
||||
}
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
/*if(CreatureList.empty())
|
||||
return;
|
||||
|
||||
for(std::list<uint64>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr)
|
||||
if(Unit* pUnit = Unit::GetUnit(*m_creature, *itr))
|
||||
pUnit->SetVisibility(VISIBILITY_OFF);
|
||||
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
CreatureList.clear();*/
|
||||
}else RetreatTimer -= diff;
|
||||
}
|
||||
|
||||
@@ -475,4 +925,203 @@ void hyjalAI::UpdateAI(const uint32 diff)
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
void hyjalAI::JustDied(Unit* killer)
|
||||
{
|
||||
if(IsDummy)return;
|
||||
m_creature->Respawn();
|
||||
m_creature->SetVisibility(VISIBILITY_OFF);
|
||||
DoRespawn = true;
|
||||
RespawnTimer = 120000;
|
||||
Talk(DEATH);
|
||||
Summons.DespawnAll();//despawn all wave's summons
|
||||
if(pInstance)
|
||||
{//reset encounter if boss is despawned (ex: thrall is killed, boss despawns, event stucks at inprogress)
|
||||
if(pInstance->GetData(DATA_RAGEWINTERCHILLEVENT) == IN_PROGRESS)
|
||||
pInstance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED);
|
||||
if(pInstance->GetData(DATA_ANETHERONEVENT) == IN_PROGRESS)
|
||||
pInstance->SetData(DATA_ANETHERONEVENT, NOT_STARTED);
|
||||
if(pInstance->GetData(DATA_KAZROGALEVENT) == IN_PROGRESS)
|
||||
pInstance->SetData(DATA_KAZROGALEVENT, NOT_STARTED);
|
||||
if(pInstance->GetData(DATA_AZGALOREVENT) == IN_PROGRESS)
|
||||
pInstance->SetData(DATA_AZGALOREVENT, NOT_STARTED);
|
||||
}
|
||||
}
|
||||
void hyjalAI::HideNearPos(float x, float y)
|
||||
{
|
||||
CellPair pair(Trinity::ComputeCellPair(x, y));
|
||||
Cell cell(pair);
|
||||
cell.data.Part.reserved = ALL_DISTRICT;
|
||||
cell.SetNoCreate();
|
||||
|
||||
// First get all creatures.
|
||||
std::list<Creature*> creatures;
|
||||
Trinity::AllFriendlyCreaturesInGrid creature_check(m_creature);
|
||||
Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> creature_searcher(creatures, creature_check);
|
||||
TypeContainerVisitor
|
||||
<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>,
|
||||
GridTypeMapContainer> creature_visitor(creature_searcher);
|
||||
|
||||
CellLock<GridReadGuard> cell_lock(cell, pair);
|
||||
// Get Creatures
|
||||
cell_lock->Visit(cell_lock, creature_visitor, *(m_creature->GetMap()));
|
||||
|
||||
//CreatureList.clear();
|
||||
if(!creatures.empty())
|
||||
{
|
||||
for(std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
|
||||
{
|
||||
(*itr)->SetVisibility(VISIBILITY_OFF);
|
||||
(*itr)->setFaction(35);//make them friendly so mobs won't attack them
|
||||
//CreatureList.push_back((*itr)->GetGUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
void hyjalAI::RespawnNearPos(float x, float y)
|
||||
{
|
||||
CellPair p(Trinity::ComputeCellPair(x, y));
|
||||
Cell cell(p);
|
||||
cell.data.Part.reserved = ALL_DISTRICT;
|
||||
cell.SetNoCreate();
|
||||
|
||||
Trinity::RespawnDo u_do;
|
||||
Trinity::WorldObjectWorker<Trinity::RespawnDo> worker(u_do);
|
||||
TypeContainerVisitor<Trinity::WorldObjectWorker<Trinity::RespawnDo>, GridTypeMapContainer > obj_worker(worker);
|
||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
||||
cell_lock->Visit(cell_lock, obj_worker, *m_creature->GetMap());
|
||||
}
|
||||
void hyjalAI::WaypointReached(uint32 i)
|
||||
{
|
||||
if(i == 1 || (i == 0 && m_creature->GetEntry() == THRALL))
|
||||
{
|
||||
m_creature->Yell("Hurry, we don't have much time",0,0);
|
||||
WaitForTeleport = true;
|
||||
TeleportTimer = 15000;
|
||||
//do some talking
|
||||
//all alive guards walk near here
|
||||
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
|
||||
Cell cell(pair);
|
||||
cell.data.Part.reserved = ALL_DISTRICT;
|
||||
cell.SetNoCreate();
|
||||
|
||||
// First get all creatures.
|
||||
std::list<Creature*> creatures;
|
||||
Trinity::AllFriendlyCreaturesInGrid creature_check(m_creature);
|
||||
Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> creature_searcher(creatures, creature_check);
|
||||
TypeContainerVisitor
|
||||
<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>,
|
||||
GridTypeMapContainer> creature_visitor(creature_searcher);
|
||||
|
||||
CellLock<GridReadGuard> cell_lock(cell, pair);
|
||||
cell_lock->Visit(cell_lock, creature_visitor, *(m_creature->GetMap()));
|
||||
|
||||
if(!creatures.empty())
|
||||
{
|
||||
for(std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
|
||||
{
|
||||
if((*itr) && (*itr)->isAlive() && (*itr) != m_creature && (*itr)->GetEntry() != JAINA)
|
||||
{
|
||||
if((*itr)->GetDistance(m_creature) >= 60)
|
||||
(*itr)->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
|
||||
float x, y, z;
|
||||
(*itr)->SetDefaultMovementType(IDLE_MOTION_TYPE);
|
||||
(*itr)->GetMotionMaster()->Initialize();
|
||||
float range = 10;
|
||||
if(m_creature->GetEntry() == THRALL)range = 20;
|
||||
m_creature->GetNearPoint(m_creature, x, y, z, range, 0, m_creature->GetAngle((*itr)));
|
||||
(*itr)->GetMotionMaster()->MovePoint(0, x+irand(-5,5), y+irand(-5,5), m_creature->GetPositionZ());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void hyjalAI::DoOverrun(uint32 faction, const uint32 diff)
|
||||
{
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
if(WaitForTeleport)
|
||||
{
|
||||
if(TeleportTimer < diff)
|
||||
{
|
||||
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
|
||||
Cell cell(pair);
|
||||
cell.data.Part.reserved = ALL_DISTRICT;
|
||||
cell.SetNoCreate();
|
||||
|
||||
std::list<Creature*> creatures;
|
||||
Trinity::AllFriendlyCreaturesInGrid creature_check(m_creature);
|
||||
Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> creature_searcher(creatures, creature_check);
|
||||
TypeContainerVisitor
|
||||
<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>,
|
||||
GridTypeMapContainer> creature_visitor(creature_searcher);
|
||||
|
||||
CellLock<GridReadGuard> cell_lock(cell, pair);
|
||||
cell_lock->Visit(cell_lock, creature_visitor, *(m_creature->GetMap()));
|
||||
|
||||
if(!creatures.empty())
|
||||
{
|
||||
for(std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
|
||||
{
|
||||
if((*itr) && (*itr)->isAlive())
|
||||
{
|
||||
(*itr)->CastSpell(*itr, SPELL_TELEPORT_VISUAL, true);
|
||||
(*itr)->setFaction(35);//make them friendly so mobs won't attack them
|
||||
}
|
||||
}
|
||||
DoCast(m_creature, SPELL_TELEPORT_VISUAL);
|
||||
bRetreat = true;
|
||||
RetreatTimer = 1000;
|
||||
}
|
||||
|
||||
WaitForTeleport = false;
|
||||
Teleported = true;
|
||||
}TeleportTimer -= diff;
|
||||
}
|
||||
if(!Teleported)
|
||||
return;
|
||||
Overrun = false;//execute once
|
||||
switch(faction)
|
||||
{
|
||||
case 0://alliance
|
||||
for(uint8 i = 0; i < 92; i++)//summon fires
|
||||
m_creature->SummonGameObject(FLAMEOBJECT,AllianceFirePos[i][0],AllianceFirePos[i][1],AllianceFirePos[i][2],AllianceFirePos[i][3],AllianceFirePos[i][4],AllianceFirePos[i][5],AllianceFirePos[i][6],AllianceFirePos[i][7],0);
|
||||
|
||||
for(uint8 i = 0; i < 25; i++)//summon 25 ghouls
|
||||
{
|
||||
uint8 r = rand()%4;
|
||||
Creature* pUnit = m_creature->SummonCreature(GHOUL, AllianceBase[r][0]+irand(-15,15), AllianceBase[r][1]+irand(-15,15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
|
||||
if(pUnit)
|
||||
{
|
||||
((hyjal_trashAI*)pUnit->AI())->faction = Faction;
|
||||
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
|
||||
((hyjal_trashAI*)pUnit->AI())->OverrunType = i;
|
||||
pUnit->setActive(true);
|
||||
}
|
||||
}
|
||||
for(uint8 i = 0; i < 5; i++)//summon 5 abominations
|
||||
{
|
||||
uint8 r = rand()%4;
|
||||
Creature* pUnit = m_creature->SummonCreature(ABOMINATION, AllianceBase[r][0]+irand(-15,15), AllianceBase[r][1]+irand(-15,15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
|
||||
if(pUnit)
|
||||
{
|
||||
((hyjal_trashAI*)pUnit->AI())->faction = Faction;
|
||||
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
|
||||
((hyjal_trashAI*)pUnit->AI())->OverrunType = i;
|
||||
pUnit->setActive(true);
|
||||
}
|
||||
}
|
||||
for(uint8 i = 0; i < 5; i++)//summon 5 gargoyles
|
||||
{
|
||||
uint8 r = rand()%4;
|
||||
Creature* pUnit = m_creature->SummonCreature(GARGOYLE, AllianceBase[r][0]+irand(-15,15), AllianceBase[r][1]+irand(-15,15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
|
||||
if(pUnit)
|
||||
{
|
||||
((hyjal_trashAI*)pUnit->AI())->faction = Faction;
|
||||
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
|
||||
((hyjal_trashAI*)pUnit->AI())->OverrunType = i;
|
||||
pUnit->setActive(true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1://horde
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -6,17 +6,29 @@
|
||||
#define SC_HYJALAI_H
|
||||
|
||||
#include "def_hyjal.h"
|
||||
#include "../../../npc/npc_escortAI.h"
|
||||
|
||||
|
||||
#define MINPLAYERS 1//min players on the map (except gms) to start the events, to prevent one player farming
|
||||
|
||||
|
||||
// Trash Mobs summoned in waves
|
||||
#define NECROMANCER 17899
|
||||
#define ABOMINATION 17898
|
||||
#define GHOUL 17895
|
||||
#define BANSHEE 17905
|
||||
#define CRYPT_FIEND 17897
|
||||
#define GARGOYLE 17906
|
||||
#define FROST_WYRM 17907
|
||||
#define GIANT_INFERNAL 17908
|
||||
#define FEL_STALKER 17916
|
||||
#define NECROMANCER 17899//done
|
||||
#define ABOMINATION 17898//done
|
||||
#define GHOUL 17895//done
|
||||
#define BANSHEE 17905//done
|
||||
#define CRYPT_FIEND 17897//done
|
||||
#define GARGOYLE 17906//done
|
||||
#define FROST_WYRM 17907//done
|
||||
#define GIANT_INFERNAL 17908//done
|
||||
#define FEL_STALKER 17916//done
|
||||
|
||||
#define JAINA 17772
|
||||
#define THRALL 17852
|
||||
#define TYRANDE 17948
|
||||
|
||||
#define ANCIENT_VEIN 185557
|
||||
#define FLAMEOBJECT 182592
|
||||
|
||||
// Bosses summoned after every 8 waves
|
||||
#define RAGE_WINTERCHILL 17767
|
||||
@@ -51,7 +63,7 @@ static Wave AllianceWaves[]= // Waves that will b
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
|
||||
// All 8 Waves are summoned, summon Rage Winterchill, next few waves are for Anetheron
|
||||
@@ -60,10 +72,10 @@ static Wave AllianceWaves[]= // Waves that will b
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, 0, 0, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, GHOUL, GHOUL, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
|
||||
// All 8 Waves are summoned, summon Anatheron
|
||||
{ANETHERON, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true}
|
||||
@@ -71,25 +83,25 @@ static Wave AllianceWaves[]= // Waves that will b
|
||||
|
||||
static Wave HordeWaves[]= // Waves that are summoned in the Horde base
|
||||
{ // Kaz'Rogal Wave 1-8
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false},
|
||||
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, FROST_WYRM, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, FROST_WYRM, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
|
||||
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
|
||||
{GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, FROST_WYRM, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, FROST_WYRM, 0, 0, 0, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 240000, false},
|
||||
// All 8 Waves are summoned, summon Kaz'Rogal, next few waves are for Azgalor
|
||||
{KAZROGAL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true},
|
||||
// Azgalor Wave 1-8
|
||||
{ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, FROST_WYRM, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 120000, false},
|
||||
{GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, 0, 0, 0, 0, 120000, false},
|
||||
{FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 120000, false},
|
||||
{NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 120000, false},
|
||||
{GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 0, 0, 120000, false},
|
||||
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 180000, false},
|
||||
{ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, FROST_WYRM, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, GARGOYLE, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 180000, false},
|
||||
{GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, 0, 0, 0, 0, 180000, false},
|
||||
{FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, 0, 0, 0, 0, 180000, false},
|
||||
{NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, NECROMANCER, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, BANSHEE, 0, 0, 0, 0, 0, 0, 180000, false},
|
||||
{GHOUL, GHOUL, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, GIANT_INFERNAL, 0, 0, 0, 0, 180000, false},
|
||||
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, FEL_STALKER, FEL_STALKER, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, BANSHEE, BANSHEE, BANSHEE, BANSHEE, NECROMANCER, NECROMANCER, 0, 0, 240000, false},
|
||||
// All 8 Waves are summoned, summon Azgalor
|
||||
{AZGALOR, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true}
|
||||
};
|
||||
@@ -144,7 +156,7 @@ static Yells ThrallQuotes[]=
|
||||
{DEATH, -1534017},
|
||||
};
|
||||
|
||||
struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
|
||||
struct TRINITY_DLL_DECL hyjalAI : public npc_escortAI
|
||||
{
|
||||
hyjalAI(Creature *c);
|
||||
|
||||
@@ -156,10 +168,7 @@ struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
|
||||
|
||||
void UpdateAI(const uint32 diff); // Called to summon waves, check for boss deaths and to cast our spells.
|
||||
|
||||
void JustDied(Unit* killer) // Called on death, informs the raid that they have failed.
|
||||
{
|
||||
Talk(DEATH);
|
||||
}
|
||||
void JustDied(Unit* killer); // Called on death, informs the raid that they have failed.
|
||||
|
||||
void SetFaction(uint32 _faction) // Set the faction to either Alliance or Horde in Hyjal
|
||||
{
|
||||
@@ -168,6 +177,15 @@ struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
|
||||
|
||||
void Retreat(); // "Teleport" (teleport visual + set invisible) all friendly creatures away from the base.
|
||||
|
||||
void SpawnVeins();
|
||||
void DeSpawnVeins();
|
||||
void JustSummoned(Creature *summoned);
|
||||
void SummonedCreatureDespawn(Creature* summoned);
|
||||
void HideNearPos(float x, float y);
|
||||
void RespawnNearPos(float x, float y);
|
||||
void WaypointReached(uint32 i);
|
||||
void DoOverrun(uint32 faction, const uint32 diff);
|
||||
|
||||
void SummonCreature(uint32 entry, float Base[4][3]); // Summons a creature for that wave in that base
|
||||
|
||||
// Summons the next wave, calls SummonCreature
|
||||
@@ -185,6 +203,7 @@ struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
|
||||
|
||||
uint64 PlayerGUID;
|
||||
uint64 BossGUID[2];
|
||||
uint64 VeinGUID[14];
|
||||
|
||||
uint32 NextWaveTimer;
|
||||
uint32 WaveCount;
|
||||
@@ -199,6 +218,20 @@ struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
|
||||
bool Summon;
|
||||
bool bRetreat;
|
||||
bool Debug;
|
||||
bool VeinsSpawned[2];
|
||||
uint8 InfernalCount;
|
||||
SummonList Summons;
|
||||
bool Overrun;
|
||||
bool Teleported;
|
||||
bool WaitForTeleport;
|
||||
uint32 TeleportTimer;
|
||||
uint32 OverrunCounter;
|
||||
uint32 OverrunCounter2;
|
||||
uint32 InfernalPoint;
|
||||
uint32 RespawnTimer;
|
||||
bool DoRespawn;
|
||||
bool DoHide;
|
||||
bool IsDummy;
|
||||
|
||||
struct Spell
|
||||
{
|
||||
@@ -209,7 +242,7 @@ struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
|
||||
|
||||
private:
|
||||
uint32 SpellTimer[3];
|
||||
std::list<uint64> CreatureList;
|
||||
//std::list<uint64> CreatureList;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,37 @@
|
||||
|
||||
#ifndef SC_HYJAL_TRASH_AI_H
|
||||
#define SC_HYJAL_TRASH_AI_H
|
||||
|
||||
#include "def_hyjal.h"
|
||||
#include "../../../npc/npc_escortAI.h"
|
||||
|
||||
struct TRINITY_DLL_DECL hyjal_trashAI : public npc_escortAI
|
||||
{
|
||||
hyjal_trashAI(Creature *c);
|
||||
|
||||
void Reset();
|
||||
|
||||
//void EnterEvadeMode();
|
||||
|
||||
void Aggro(Unit *who);
|
||||
|
||||
void UpdateAI(const uint32 diff);
|
||||
|
||||
void JustDied(Unit* killer);
|
||||
|
||||
void DamageTaken(Unit *done_by, uint32 &damage);
|
||||
|
||||
public:
|
||||
ScriptedInstance* pInstance;
|
||||
bool IsEvent;
|
||||
uint32 Delay;
|
||||
uint32 LastOverronPos;
|
||||
bool IsOverrun;
|
||||
bool SetupOverrun;
|
||||
uint32 OverrunType;
|
||||
uint8 faction;
|
||||
bool useFlyPath;
|
||||
|
||||
//private:
|
||||
};
|
||||
#endif
|
||||
@@ -46,10 +46,16 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
uint64 JainaProudmoore;
|
||||
uint64 Thrall;
|
||||
uint64 TyrandeWhisperwind;
|
||||
uint64 HordeGate;
|
||||
uint64 ElfGate;
|
||||
|
||||
uint32 Trash;
|
||||
uint32 Encounters[ENCOUNTERS];
|
||||
|
||||
uint32 hordeRetreat;
|
||||
uint32 allianceRetreat;
|
||||
bool ArchiYell;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
RageWinterchill = 0;
|
||||
@@ -60,10 +66,17 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
JainaProudmoore = 0;
|
||||
Thrall = 0;
|
||||
TyrandeWhisperwind = 0;
|
||||
HordeGate = 0;
|
||||
ElfGate = 0;
|
||||
ArchiYell = false;
|
||||
|
||||
Trash = 0;
|
||||
for(uint8 i = 0; i < ENCOUNTERS; ++i)
|
||||
Encounters[i] = NOT_STARTED;
|
||||
|
||||
hordeRetreat = 0;
|
||||
allianceRetreat = 0;
|
||||
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
@@ -74,6 +87,33 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnObjectCreate(GameObject *go)
|
||||
{
|
||||
switch(go->GetEntry())
|
||||
{
|
||||
case 182060:
|
||||
HordeGate = go->GetGUID();
|
||||
if(allianceRetreat)
|
||||
go->SetGoState(0);
|
||||
else
|
||||
go->SetGoState(1);
|
||||
break;
|
||||
case 182061:
|
||||
ElfGate = go->GetGUID();
|
||||
if(hordeRetreat)
|
||||
go->SetGoState(0);
|
||||
else
|
||||
go->SetGoState(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OpenDoor(uint64 DoorGUID, bool open)
|
||||
{
|
||||
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
|
||||
Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
|
||||
{
|
||||
switch(creature_entry)
|
||||
@@ -111,9 +151,49 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
switch(type)
|
||||
{
|
||||
case DATA_RAGEWINTERCHILLEVENT: Encounters[0] = data; break;
|
||||
case DATA_ANETHERONEVENT: Encounters[1] = data; break;
|
||||
case DATA_ANETHERONEVENT:
|
||||
Encounters[1] = data;
|
||||
break;
|
||||
case DATA_KAZROGALEVENT: Encounters[2] = data; break;
|
||||
case DATA_AZGALOREVENT: Encounters[3] = data; break;
|
||||
case DATA_AZGALOREVENT:
|
||||
{
|
||||
Encounters[3] = data;
|
||||
if(data==DONE)
|
||||
{
|
||||
if(ArchiYell)break;
|
||||
ArchiYell = true;
|
||||
|
||||
Creature* pCreature = instance->GetCreatureInMap(Azgalor);
|
||||
if(pCreature)
|
||||
{
|
||||
Creature* pUnit = pCreature->SummonCreature(21987,pCreature->GetPositionX(),pCreature->GetPositionY(),pCreature->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,10000);
|
||||
|
||||
Map *map = pCreature->GetMap();
|
||||
if (map->IsDungeon() && pUnit)
|
||||
{
|
||||
pUnit->SetVisibility(VISIBILITY_OFF);
|
||||
Map::PlayerList const &PlayerList = map->GetPlayers();
|
||||
if (PlayerList.isEmpty())
|
||||
return;
|
||||
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
{
|
||||
if (i->getSource())
|
||||
{
|
||||
WorldPacket data(SMSG_MESSAGECHAT, 200);
|
||||
pUnit->BuildMonsterChat(&data,CHAT_MSG_MONSTER_YELL,"All of your efforts have been in vain, for the draining of the World Tree has already begun. Soon the heart of your world will beat no more.",0,"Archimonde",i->getSource()->GetGUID());
|
||||
i->getSource()->GetSession()->SendPacket(&data);
|
||||
|
||||
WorldPacket data2(SMSG_PLAY_SOUND, 4);
|
||||
data2 << 10986;
|
||||
i->getSource()->GetSession()->SendPacket(&data2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DATA_ARCHIMONDEEVENT: Encounters[4] = data; break;
|
||||
case DATA_RESET_TRASH_COUNT: Trash = 0; break;
|
||||
|
||||
@@ -122,6 +202,16 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
else Trash--;
|
||||
UpdateWorldState(WORLD_STATE_ENEMYCOUNT, Trash);
|
||||
break;
|
||||
case DATA_ALLIANCE_RETREAT:
|
||||
allianceRetreat = data;
|
||||
OpenDoor(HordeGate,true);
|
||||
SaveToDB();
|
||||
break;
|
||||
case DATA_HORDE_RETREAT:
|
||||
hordeRetreat = data;
|
||||
OpenDoor(ElfGate,true);
|
||||
SaveToDB();
|
||||
break;
|
||||
}
|
||||
|
||||
debug_log("SD2: Instance Hyjal: Instance data updated for event %u (Data=%u)",type,data);
|
||||
@@ -140,6 +230,8 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
case DATA_AZGALOREVENT: return Encounters[3];
|
||||
case DATA_ARCHIMONDEEVENT: return Encounters[4];
|
||||
case DATA_TRASH: return Trash;
|
||||
case DATA_ALLIANCE_RETREAT: return allianceRetreat;
|
||||
case DATA_HORDE_RETREAT: return hordeRetreat;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -147,7 +239,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
void UpdateWorldState(uint32 id, uint32 state)
|
||||
{
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
@@ -163,7 +255,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
OUT_SAVE_INST_DATA;
|
||||
std::ostringstream stream;
|
||||
stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
|
||||
<< Encounters[3] << " " << Encounters[4];
|
||||
<< Encounters[3] << " " << Encounters[4] << " " << allianceRetreat << " " << hordeRetreat;
|
||||
char* out = new char[stream.str().length() + 1];
|
||||
strcpy(out, stream.str().c_str());
|
||||
if(out)
|
||||
@@ -186,7 +278,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
std::istringstream loadStream;
|
||||
loadStream.str(in);
|
||||
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3] >> Encounters[4];
|
||||
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3] >> Encounters[4] >> allianceRetreat >> hordeRetreat;
|
||||
for(uint8 i = 0; i < ENCOUNTERS; ++i)
|
||||
if(Encounters[i] == IN_PROGRESS) // Do not load an encounter as IN_PROGRESS - reset it instead.
|
||||
Encounters[i] = NOT_STARTED;
|
||||
|
||||
Reference in New Issue
Block a user