--HG--
branch : trunk
This commit is contained in:
megamage
2009-02-12 17:09:15 -06:00
603 changed files with 40989 additions and 40987 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ Script* GetScriptByName(std::string Name)
TRINITY_DLL_EXPORT
char const* ScriptsVersion()
{
return "Default Trinity scripting library";
return "Default Trinity scripting library";
}
TRINITY_DLL_EXPORT
bool GossipHello ( Player * player, Creature *_Creature )
+53 -53
View File
@@ -29,7 +29,7 @@ struct StringTextData
uint32 SoundId;
uint8 Type;
uint32 Language;
uint32 Emote;
uint32 Emote;
};
// Enums used by StringTextData::Type
@@ -685,7 +685,7 @@ void LoadDatabase()
temp.SoundId = fields[1].GetInt32();
temp.Type = fields[2].GetInt32();
temp.Language = fields[3].GetInt32();
temp.Emote = 0;//fields[4].GetInt32();
temp.Emote = 0;//fields[4].GetInt32();
if (i >= 0)
{
@@ -750,7 +750,7 @@ void LoadDatabase()
temp.SoundId = fields[1].GetInt32();
temp.Type = fields[2].GetInt32();
temp.Language = fields[3].GetInt32();
temp.Emote = fields[4].GetInt32();
temp.Emote = fields[4].GetInt32();
if (i >= 0)
{
@@ -815,7 +815,7 @@ void LoadDatabase()
temp.SoundId = fields[1].GetInt32();
temp.Type = fields[2].GetInt32();
temp.Language = fields[3].GetInt32();
temp.Emote = fields[4].GetInt32();
temp.Emote = fields[4].GetInt32();
if (i >= 0)
{
@@ -1219,7 +1219,7 @@ void ScriptsFree()
delete []SpellSummary;
// Free resources before library unload
for(int i=0;i<num_sc_scripts;i++)
for(int i=0;i<num_sc_scripts;i++)
delete m_scripts[i];
num_sc_scripts = 0;
@@ -1327,15 +1327,15 @@ void ScriptsInit()
AddSC_alterac_mountains();
//Arathi Highlands
AddSC_arathi_highlands();
AddSC_arathi_highlands();
//Ashenvale Forest
AddSC_ashenvale();
AddSC_ashenvale();
//Aunchindoun
//--Auchenai Crypts
AddSC_boss_exarch_maladaar();
AddSC_boss_shirrak_the_dead_watcher();
AddSC_boss_shirrak_the_dead_watcher();
//--Mana Tombs
AddSC_boss_nexusprince_shaffar();
@@ -1380,17 +1380,17 @@ void ScriptsInit()
//Blackfathom Depths
//Blackrock Depths
AddSC_blackrock_depths();
AddSC_boss_ambassador_flamelash();
AddSC_boss_anubshiah();
AddSC_boss_draganthaurissan();
AddSC_boss_general_angerforge();
AddSC_boss_gorosh_the_dervish();
AddSC_boss_grizzle();
AddSC_boss_high_interrogator_gerstahn();
AddSC_boss_magmus();
AddSC_boss_moira_bronzebeard();
AddSC_boss_tomb_of_seven();
AddSC_instance_blackrock_depths();
AddSC_boss_ambassador_flamelash();
AddSC_boss_anubshiah();
AddSC_boss_draganthaurissan();
AddSC_boss_general_angerforge();
AddSC_boss_gorosh_the_dervish();
AddSC_boss_grizzle();
AddSC_boss_high_interrogator_gerstahn();
AddSC_boss_magmus();
AddSC_boss_moira_bronzebeard();
AddSC_boss_tomb_of_seven();
AddSC_instance_blackrock_depths();
//Blackrock Spire
AddSC_boss_drakkisath();
@@ -1450,8 +1450,8 @@ void ScriptsInit()
AddSC_boss_aeonus();
AddSC_boss_chrono_lord_deja();
AddSC_boss_temporus();
AddSC_dark_portal();
AddSC_instance_dark_portal();
AddSC_dark_portal();
AddSC_instance_dark_portal();
//Coilfang Resevoir
//--Serpent Shrine Cavern
@@ -1461,7 +1461,7 @@ void ScriptsInit()
AddSC_boss_leotheras_the_blind();
AddSC_boss_morogrim_tidewalker();
AddSC_instance_serpentshrine_cavern();
AddSC_boss_the_lurker_below();
AddSC_boss_the_lurker_below();
//--Slave Pens
//--Steam Vault
@@ -1520,7 +1520,7 @@ void ScriptsInit()
AddSC_boss_broggok();
AddSC_boss_kelidan_the_breaker();
AddSC_boss_the_maker();
AddSC_instance_blood_furnace();
AddSC_instance_blood_furnace();
//--Magtheridon's Lair
AddSC_boss_magtheridon();
@@ -1560,7 +1560,7 @@ void ScriptsInit()
AddSC_bosses_opera();
AddSC_instance_karazhan();
AddSC_karazhan();
AddSC_boss_nightbane();
AddSC_boss_nightbane();
//Loch Modan
AddSC_loch_modan();
@@ -1615,7 +1615,7 @@ void ScriptsInit()
AddSC_boss_noth();
AddSC_boss_gluth();
AddSC_boss_sapphiron();
AddSC_boss_four_horsemen();
AddSC_boss_four_horsemen();
//Netherstorm
AddSC_netherstorm();
@@ -1630,8 +1630,8 @@ void ScriptsInit()
//Razorfen Downs
AddSC_boss_amnennar_the_coldbringer();
//Razorfen Kraul
AddSC_razorfen_kraul();
//Razorfen Kraul
AddSC_razorfen_kraul();
//Redridge Mountains
//Ruins of Ahn'Qiraj
@@ -1639,14 +1639,14 @@ void ScriptsInit()
AddSC_boss_arcanist_doan();
AddSC_boss_azshir_the_sleepless();
AddSC_boss_bloodmage_thalnos();
AddSC_boss_headless_horseman();
AddSC_boss_headless_horseman();
AddSC_boss_herod();
AddSC_boss_high_inquisitor_fairbanks();
AddSC_boss_houndmaster_loksey();
AddSC_boss_interrogator_vishas();
AddSC_boss_scorn();
AddSC_instance_scarlet_monastery();
AddSC_boss_mograine_and_whitemane();
AddSC_instance_scarlet_monastery();
AddSC_boss_mograine_and_whitemane();
//Scholomance
AddSC_boss_darkmaster_gandling();
@@ -1712,10 +1712,10 @@ void ScriptsInit()
AddSC_stratholme();
//Sunken Temple
//Sunwell Plateau
//Sunwell Plateau
AddSC_instance_sunwell_plateau();
AddSC_boss_kalecgos();
AddSC_boss_brutallus();
AddSC_boss_brutallus();
AddSC_boss_felmyst();
AddSC_boss_eredar_twins();
@@ -1763,7 +1763,7 @@ void ScriptsInit()
AddSC_terokkar_forest();
//Thousand Needles
AddSC_thousand_needles();
AddSC_thousand_needles();
//Thunder Bluff
AddSC_thunder_bluff();
@@ -1781,7 +1781,7 @@ void ScriptsInit()
AddSC_undercity();
//Un'Goro Crater
AddSC_ungoro_crater();
AddSC_ungoro_crater();
//Upper blackrock spire
@@ -1805,7 +1805,7 @@ void ScriptsInit()
AddSC_zangarmarsh();
//Zul'Farrak
AddSC_zulfarrak();
AddSC_zulfarrak();
//Zul'Gurub
AddSC_boss_jeklik();
@@ -1825,17 +1825,17 @@ void ScriptsInit()
//Zul'Aman
AddSC_boss_akilzon();
AddSC_boss_halazzi();
AddSC_boss_hex_lord_malacrass();
AddSC_boss_janalai();
AddSC_boss_nalorakk();
AddSC_boss_zuljin();
AddSC_instance_zulaman();
AddSC_zulaman();
AddSC_boss_halazzi();
AddSC_boss_hex_lord_malacrass();
AddSC_boss_janalai();
AddSC_boss_nalorakk();
AddSC_boss_zuljin();
AddSC_instance_zulaman();
AddSC_zulaman();
// -------------------
outstring_log(">> Loaded %i C++ Scripts.", num_sc_scripts);
outstring_log(">> Loaded %i C++ Scripts.", num_sc_scripts);
outstring_log(">> Load Overriden SQL Data.");
LoadOverridenSQLData();
@@ -1880,15 +1880,15 @@ void DoScriptText(int32 textEntry, WorldObject* pSource, Unit* target)
error_log("TSCR: DoScriptText entry %i tried to process invalid sound id %u.",textEntry,(*i).second.SoundId);
}
if((*i).second.Emote)
{
if (pSource->GetTypeId() == TYPEID_UNIT || pSource->GetTypeId() == TYPEID_PLAYER)
{
((Unit*)pSource)->HandleEmoteCommand((*i).second.Emote);
}
else
error_log("TSCR: DoScriptText entry %i tried to process emote for invalid TypeId (%u).",textEntry,pSource->GetTypeId());
}
if((*i).second.Emote)
{
if (pSource->GetTypeId() == TYPEID_UNIT || pSource->GetTypeId() == TYPEID_PLAYER)
{
((Unit*)pSource)->HandleEmoteCommand((*i).second.Emote);
}
else
error_log("TSCR: DoScriptText entry %i tried to process emote for invalid TypeId (%u).",textEntry,pSource->GetTypeId());
}
switch((*i).second.Type)
{
@@ -1939,7 +1939,7 @@ void Script::RegisterSelf()
TRINITY_DLL_EXPORT
char const* ScriptsVersion()
{
return "Default Trinity scripting library";
return "Default Trinity scripting library";
}
TRINITY_DLL_EXPORT
bool GossipHello ( Player * player, Creature *_Creature )
+8 -8
View File
@@ -221,12 +221,12 @@ void ScriptedAI::DoCastSpell(Unit* who,SpellEntry const *spellInfo, bool trigger
void ScriptedAI::DoSay(const char* text, uint32 language, Unit* target, bool SayEmote)
{
if (target)
{
m_creature->Say(text, language, target->GetGUID());
if(SayEmote)
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
}
if (target)
{
m_creature->Say(text, language, target->GetGUID());
if(SayEmote)
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
}
else m_creature->Say(text, language, 0);
}
@@ -749,7 +749,7 @@ Unit* FindCreature(uint32 entry, float range, Unit* Finder)
if(!Finder)
return NULL;
Creature* target = NULL;
Trinity::AllCreaturesOfEntryInRange check(Finder, entry, range);
Trinity::AllCreaturesOfEntryInRange check(Finder, entry, range);
Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(Finder, target, check);
Finder->VisitNearbyObject(range, searcher);
return target;
@@ -760,7 +760,7 @@ GameObject* FindGameObject(uint32 entry, float range, Unit* Finder)
if(!Finder)
return NULL;
GameObject* target = NULL;
Trinity::AllGameObjectsWithEntryInGrid go_check(entry);
Trinity::AllGameObjectsWithEntryInGrid go_check(entry);
Trinity::GameObjectSearcher<Trinity::AllGameObjectsWithEntryInGrid> searcher(Finder, target, go_check);
Finder->VisitNearbyGridObject(range, searcher);
return target;
+1 -1
View File
@@ -14,7 +14,7 @@ enum EncounterState
IN_PROGRESS = 1,
FAIL = 2,
DONE = 3,
SPECIAL = 4
SPECIAL = 4
};
#define OUT_SAVE_INST_DATA debug_log("SD2: Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
@@ -37,23 +37,23 @@ EndContentData */
bool AreaTrigger_at_legion_teleporter(Player *player, AreaTriggerEntry *at)
{
if (player->isAlive() && !player->isInCombat())
{
if (player->GetTeam()== ALLIANCE && player->GetQuestRewardStatus(10589))
{
player->CastSpell(player,SPELL_TELE_A_TO,false);
return true;
}
if (player->isAlive() && !player->isInCombat())
{
if (player->GetTeam()== ALLIANCE && player->GetQuestRewardStatus(10589))
{
player->CastSpell(player,SPELL_TELE_A_TO,false);
return true;
}
if (player->GetTeam()== HORDE && player->GetQuestRewardStatus(10604))
{
player->CastSpell(player,SPELL_TELE_H_TO,false);
return true;
}
if (player->GetTeam()== HORDE && player->GetQuestRewardStatus(10604))
{
player->CastSpell(player,SPELL_TELE_H_TO,false);
return true;
}
return false;
}
return false;
return false;
}
return false;
}
bool ATtest(Player *player, AreaTriggerEntry *at)
@@ -66,10 +66,10 @@ void AddSC_areatrigger_scripts()
{
Script *newscript;
newscript = new Script;
newscript->Name = "at_legion_teleporter";
newscript->pAreaTrigger = &AreaTrigger_at_legion_teleporter;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "at_legion_teleporter";
newscript->pAreaTrigger = &AreaTrigger_at_legion_teleporter;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="at_test";
+17 -17
View File
@@ -36,24 +36,24 @@ void guardAI::Reset()
void guardAI::Aggro(Unit *who)
{
if (m_creature->GetEntry() == 15184)
{
switch(rand()%3)
{
case 0:
DoSay("Taste blade, mongrel!", LANG_UNIVERSAL,NULL);
break;
case 1:
DoSay("Please tell me that you didn't just do what I think you just did. Please tell me that I'm not going to have to hurt you...", LANG_UNIVERSAL,NULL);
break;
case 2:
DoSay("As if we don't have enough problems, you go and create more!", LANG_UNIVERSAL,NULL);
break;
}
}
if (m_creature->GetEntry() == 15184)
{
switch(rand()%3)
{
case 0:
DoSay("Taste blade, mongrel!", LANG_UNIVERSAL,NULL);
break;
case 1:
DoSay("Please tell me that you didn't just do what I think you just did. Please tell me that I'm not going to have to hurt you...", LANG_UNIVERSAL,NULL);
break;
case 2:
DoSay("As if we don't have enough problems, you go and create more!", LANG_UNIVERSAL,NULL);
break;
}
}
if (SpellEntry const *spell = m_creature->reachWithSpellAttack(who))
DoCastSpell(who, spell);
if (SpellEntry const *spell = m_creature->reachWithSpellAttack(who))
DoCastSpell(who, spell);
}
void guardAI::JustDied(Unit *Killer)
@@ -493,7 +493,7 @@ CreatureAI* GetAI_guard_bluffwatcher(Creature *_Creature)
CreatureAI* GetAI_guard_contested(Creature *_Creature)
{
return new guardAI (_Creature);
return new guardAI (_Creature);
}
/*******************************************************
* guard_contested end
@@ -41,7 +41,7 @@ item_voodoo_charm Provide proper error message and target(q256
item_vorenthals_presence(i30259) Prevents abuse of this item
item_yehkinyas_bramble(i10699) Allow cast spell on vale screecher only and remove corpse if cast sucessful (q3520)
item_zezzak_shard(i31463) Quest The eyes of Grillok (q10813). Prevents abuse
item_inoculating_crystal Quest Inoculating. Prevent abuse
item_inoculating_crystal Quest Inoculating. Prevent abuse
EndContentData */
#include "precompiled.h"
@@ -105,11 +105,11 @@ bool ItemUse_item_attuned_crystal_cores(Player *player, Item* _Item, SpellCastTa
{
if( targets.getUnitTarget() && targets.getUnitTarget()->GetTypeId()==TYPEID_UNIT &&
targets.getUnitTarget()->GetEntry() == 24972 && targets.getUnitTarget()->isDead() &&
(player->GetQuestStatus(11524) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11525) == QUEST_STATUS_INCOMPLETE) )
{
((Creature*)targets.getUnitTarget())->RemoveCorpse();
return false;
}
(player->GetQuestStatus(11524) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11525) == QUEST_STATUS_INCOMPLETE) )
{
((Creature*)targets.getUnitTarget())->RemoveCorpse();
return false;
}
player->SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW,_Item,NULL);
return true;
@@ -40,19 +40,19 @@ void npc_escortAI::AttackStart(Unit *who)
{
InCombat = true;
if (IsBeingEscorted)
{
if (IsBeingEscorted)
{
//Store last position
m_creature->GetPosition(LastPos.x, LastPos.y, LastPos.z);
debug_log("SD2: EscortAI has entered combat and stored last location.");
}
}
Aggro(who);
}
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MoveChase(who);
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->MoveChase(who);
}
}
@@ -64,7 +64,7 @@ void npc_escortAI::MoveInLineOfSight(Unit *who)
if(m_creature->getVictim() || !m_creature->canStartAttack(who))
return;
AttackStart(who);
AttackStart(who);
}
void npc_escortAI::JustRespawned()
@@ -109,7 +109,7 @@ void npc_escortAI::UpdateAI(const uint32 diff)
{
//Waypoint Updating
if (IsBeingEscorted && !InCombat && WaitTimer && !Returning)
{
{
if (WaitTimer <= diff)
{
if (ReconnectWP)
@@ -157,11 +157,11 @@ void npc_escortAI::UpdateAI(const uint32 diff)
WaitTimer = 0;
}
}else WaitTimer -= diff;
}
}
//Check if player is within range
if (IsBeingEscorted && !InCombat && PlayerGUID)
{
{
if (PlayerTimer < diff)
{
Unit* p = Unit::GetUnit(*m_creature, PlayerGUID);
@@ -186,7 +186,7 @@ void npc_escortAI::UpdateAI(const uint32 diff)
PlayerTimer = 1000;
}else PlayerTimer -= diff;
}
}
//Check if we have a current target
if( m_creature->isAlive() && UpdateVictim())
@@ -31,7 +31,7 @@ npc_doctor 100% Gustaf Vanhowzen and Gregory Victor, quest 6622
npc_mount_vendor 100% Regular mount vendors all over the world. Display gossip if player doesn't meet the requirements to buy
npc_rogue_trainer 80% Scripted trainers, so they are able to offer item 17126 for class quest 6681
npc_sayge 100% Darkmoon event fortune teller, buff player based on answers given
npc_snake_trap_serpents 80% AI for snakes that summoned by Snake Trap
npc_snake_trap_serpents 80% AI for snakes that summoned by Snake Trap
EndContentData */
#include "precompiled.h"
@@ -132,44 +132,44 @@ bool QuestComplete_npc_chicken_cluck(Player *player, Creature *_Creature, const
## npc_dancing_flames
######*/
#define SPELL_BRAZIER 45423
#define SPELL_SEDUCTION 47057
#define SPELL_FIERY_AURA 45427
#define SPELL_BRAZIER 45423
#define SPELL_SEDUCTION 47057
#define SPELL_FIERY_AURA 45427
struct TRINITY_DLL_DECL npc_dancing_flamesAI : public ScriptedAI
{
npc_dancing_flamesAI(Creature *c) : ScriptedAI(c) {Reset();}
bool active;
uint32 can_iteract;
bool active;
uint32 can_iteract;
void Reset()
{
active = true;
can_iteract = 3500;
DoCast(m_creature,SPELL_BRAZIER,true);
DoCast(m_creature,SPELL_FIERY_AURA,false);
float x, y, z;
m_creature->GetPosition(x,y,z);
m_creature->Relocate(x,y,z + 0.94f);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
WorldPacket data; //send update position to client
m_creature->BuildHeartBeatMsg(&data);
m_creature->SendMessageToSet(&data,true);
}
{
active = true;
can_iteract = 3500;
DoCast(m_creature,SPELL_BRAZIER,true);
DoCast(m_creature,SPELL_FIERY_AURA,false);
float x, y, z;
m_creature->GetPosition(x,y,z);
m_creature->Relocate(x,y,z + 0.94f);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_LEVITATING);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
WorldPacket data; //send update position to client
m_creature->BuildHeartBeatMsg(&data);
m_creature->SendMessageToSet(&data,true);
}
void UpdateAI(const uint32 diff)
{
if (!active)
{
if(can_iteract <= diff){
active = true;
can_iteract = 3500;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
}else can_iteract -= diff;
}
}
{
if (!active)
{
if(can_iteract <= diff){
active = true;
can_iteract = 3500;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
}else can_iteract -= diff;
}
}
void Aggro(Unit* who){}
};
@@ -181,30 +181,30 @@ CreatureAI* GetAI_npc_dancing_flames(Creature *_Creature)
bool ReceiveEmote_npc_dancing_flames( Player *player, Creature *flame, uint32 emote )
{
if ( ((npc_dancing_flamesAI*)flame->AI())->active &&
flame->IsWithinLOS(player->GetPositionX(),player->GetPositionY(),player->GetPositionZ()) && flame->IsWithinDistInMap(player,30.0f))
{
flame->SetInFront(player);
((npc_dancing_flamesAI*)flame->AI())->active = false;
if ( ((npc_dancing_flamesAI*)flame->AI())->active &&
flame->IsWithinLOS(player->GetPositionX(),player->GetPositionY(),player->GetPositionZ()) && flame->IsWithinDistInMap(player,30.0f))
{
flame->SetInFront(player);
((npc_dancing_flamesAI*)flame->AI())->active = false;
WorldPacket data;
flame->BuildHeartBeatMsg(&data);
flame->SendMessageToSet(&data,true);
switch(emote)
{
case TEXTEMOTE_KISS: flame->HandleEmoteCommand(EMOTE_ONESHOT_SHY); break;
case TEXTEMOTE_WAVE: flame->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); break;
case TEXTEMOTE_BOW: flame->HandleEmoteCommand(EMOTE_ONESHOT_BOW); break;
case TEXTEMOTE_JOKE: flame->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); break;
case TEXTEMOTE_DANCE:
{
if (!player->HasAura(SPELL_SEDUCTION,0))
flame->CastSpell(player,SPELL_SEDUCTION,true);
}
break;
}
}
return true;
WorldPacket data;
flame->BuildHeartBeatMsg(&data);
flame->SendMessageToSet(&data,true);
switch(emote)
{
case TEXTEMOTE_KISS: flame->HandleEmoteCommand(EMOTE_ONESHOT_SHY); break;
case TEXTEMOTE_WAVE: flame->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); break;
case TEXTEMOTE_BOW: flame->HandleEmoteCommand(EMOTE_ONESHOT_BOW); break;
case TEXTEMOTE_JOKE: flame->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); break;
case TEXTEMOTE_DANCE:
{
if (!player->HasAura(SPELL_SEDUCTION,0))
flame->CastSpell(player,SPELL_SEDUCTION,true);
}
break;
}
}
return true;
}
/*######
@@ -964,22 +964,22 @@ CreatureAI* GetAI_npc_tonk_mine(Creature *_Creature)
bool ReceiveEmote_npc_winter_reveler( Player *player, Creature *_Creature, uint32 emote )
{
//TODO: check auralist.
if(player->HasAura(26218, 0))
return false;
//TODO: check auralist.
if(player->HasAura(26218, 0))
return false;
if( emote == TEXTEMOTE_KISS )
{
_Creature->CastSpell(_Creature, 26218, false);
player->CastSpell(player, 26218, false);
switch(rand()%3)
{
case 0: _Creature->CastSpell(player, 26207, false); break;
case 1: _Creature->CastSpell(player, 26206, false); break;
case 2: _Creature->CastSpell(player, 45036, false); break;
}
}
return true;
if( emote == TEXTEMOTE_KISS )
{
_Creature->CastSpell(_Creature, 26218, false);
player->CastSpell(player, 26218, false);
switch(rand()%3)
{
case 0: _Creature->CastSpell(player, 26207, false); break;
case 1: _Creature->CastSpell(player, 26206, false); break;
case 2: _Creature->CastSpell(player, 45036, false); break;
}
}
return true;
}
/*####
@@ -988,10 +988,10 @@ bool ReceiveEmote_npc_winter_reveler( Player *player, Creature *_Creature, uint3
bool ReceiveEmote_npc_brewfest_reveler( Player *player, Creature *_Creature, uint32 emote )
{
if( emote == TEXTEMOTE_DANCE )
_Creature->CastSpell(player, 41586, false);
if( emote == TEXTEMOTE_DANCE )
_Creature->CastSpell(player, 41586, false);
return true;
return true;
}
/*####
@@ -1021,12 +1021,12 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
void Reset()
{
Owner = m_creature->GetOwner();
Owner = m_creature->GetOwner();
if (!m_creature->isPet() || !Owner)
return;
if (!m_creature->isPet() || !Owner)
return;
CreatureInfo const *Info = m_creature->GetCreatureInfo();
CreatureInfo const *Info = m_creature->GetCreatureInfo();
if(Info->Entry == C_VIPER)
IsViper = true;
@@ -1044,13 +1044,13 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
InCombat = false;
}
}
//Redefined for random target selection:
void MoveInLineOfSight(Unit *who)
{
if (!m_creature->isPet() || !Owner)
return;
return;
if( !m_creature->getVictim() && who->isTargetableForAttack() && ( m_creature->IsHostileTo( who )) && who->isInAccessiblePlaceFor(m_creature) && Owner->IsHostileTo(who))//don't attack not-pvp-flaged
{
@@ -1060,21 +1060,21 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
float attackRadius = m_creature->GetAttackDistance(who);
if( m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who) )
{
if (!(rand() % RAND) )
if (!(rand() % RAND) )
{
m_creature->setAttackTimer(BASE_ATTACK, (rand() % 10) * 100);
SpellTimer = (rand() % 10) * 100;
AttackStart(who);
InCombat = true;
}
}
}
}
}
}
}
}
void UpdateAI(const uint32 diff)
{
if (!m_creature->isPet() || !Owner)
return;
return;
//Follow if not in combat
if (!m_creature->hasUnitState(UNIT_STAT_FOLLOW)&& !InCombat)
@@ -1087,19 +1087,19 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
if (!m_creature->getVictim())
{
if (InCombat)
DoStopAttack();
DoStopAttack();
InCombat = false;
InCombat = false;
if(Owner->getAttackerForHelper())
AttackStart(Owner->getAttackerForHelper());
if(Owner->getAttackerForHelper())
AttackStart(Owner->getAttackerForHelper());
return;
}
if (SpellTimer < diff)
{
if (IsViper) //Viper
if (IsViper) //Viper
{
if (rand() % 3 == 0) //33% chance to cast
{
@@ -1112,7 +1112,7 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
DoCast(m_creature->getVictim(),spell);
}
SpellTimer = VIPER_TIMER;
SpellTimer = VIPER_TIMER;
}
else //Venomous Snake
{
@@ -1121,7 +1121,7 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
SpellTimer = VENOMOUS_SNAKE_TIMER + (rand() %5)*100;
}
}else SpellTimer-=diff;
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
};
@@ -1144,7 +1144,7 @@ void AddSC_npcs_special()
newscript = new Script;
newscript->Name="npc_dancing_flames";
newscript->GetAI = &GetAI_npc_dancing_flames;
newscript->GetAI = &GetAI_npc_dancing_flames;
newscript->pReceiveEmote = &ReceiveEmote_npc_dancing_flames;
newscript->RegisterSelf();
@@ -1192,12 +1192,12 @@ void AddSC_npcs_special()
newscript->GetAI = &GetAI_npc_tonk_mine;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="npc_winter_reveler";
newscript->pReceiveEmote = &ReceiveEmote_npc_winter_reveler;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="npc_brewfest_reveler";
newscript->pReceiveEmote = &ReceiveEmote_npc_brewfest_reveler;
newscript->RegisterSelf();
@@ -161,4 +161,4 @@ void AddSC_arathi_highlands()
newscript->GetAI = &GetAI_npc_professor_phizzlethorpeAI;
newscript->pQuestAccept = &QuestAccept_npc_professor_phizzlethorpe;
newscript->RegisterSelf();
}
}
@@ -51,133 +51,133 @@ EndContentData */
struct TRINITY_DLL_DECL npc_torekAI : public npc_escortAI
{
npc_torekAI(Creature *c) : npc_escortAI(c) {Reset();}
npc_torekAI(Creature *c) : npc_escortAI(c) {Reset();}
uint32 Rend_Timer;
uint32 Thunderclap_Timer;
bool Completed;
uint32 Rend_Timer;
uint32 Thunderclap_Timer;
bool Completed;
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (!player)
return;
if (!player)
return;
switch (i)
{
case 1:
DoScriptText(SAY_MOVE, m_creature, player);
break;
case 8:
DoScriptText(SAY_PREPARE, m_creature, player);
break;
case 19:
//TODO: verify location and creatures amount.
m_creature->SummonCreature(ENTRY_DURIEL,1776.73,-2049.06,109.83,1.54,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
m_creature->SummonCreature(ENTRY_SILVERWING_SENTINEL,1774.64,-2049.41,109.83,1.40,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
m_creature->SummonCreature(ENTRY_SILVERWING_WARRIOR,1778.73,-2049.50,109.83,1.67,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
break;
case 20:
DoScriptText(SAY_WIN, m_creature, player);
Completed = true;
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_TOREK_ASSULT,m_creature);
break;
case 21:
DoScriptText(SAY_END, m_creature, player);
break;
}
}
switch (i)
{
case 1:
DoScriptText(SAY_MOVE, m_creature, player);
break;
case 8:
DoScriptText(SAY_PREPARE, m_creature, player);
break;
case 19:
//TODO: verify location and creatures amount.
m_creature->SummonCreature(ENTRY_DURIEL,1776.73,-2049.06,109.83,1.54,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
m_creature->SummonCreature(ENTRY_SILVERWING_SENTINEL,1774.64,-2049.41,109.83,1.40,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
m_creature->SummonCreature(ENTRY_SILVERWING_WARRIOR,1778.73,-2049.50,109.83,1.67,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,25000);
break;
case 20:
DoScriptText(SAY_WIN, m_creature, player);
Completed = true;
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_TOREK_ASSULT,m_creature);
break;
case 21:
DoScriptText(SAY_END, m_creature, player);
break;
}
}
void Reset()
{
Rend_Timer = 5000;
Thunderclap_Timer = 8000;
Completed = false;
}
void Reset()
{
Rend_Timer = 5000;
Thunderclap_Timer = 8000;
Completed = false;
}
void Aggro(Unit* who)
{
}
void Aggro(Unit* who)
{
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
if (Unit* player = Unit::GetUnit((*m_creature), PlayerGUID))
((Player*)player)->FailQuest(QUEST_TOREK_ASSULT);
}
}
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
if (Unit* player = Unit::GetUnit((*m_creature), PlayerGUID))
((Player*)player)->FailQuest(QUEST_TOREK_ASSULT);
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
if (Rend_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_REND);
Rend_Timer = 20000;
}else Rend_Timer -= diff;
if (Rend_Timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_REND);
Rend_Timer = 20000;
}else Rend_Timer -= diff;
if (Thunderclap_Timer < diff)
{
DoCast(m_creature,SPELL_THUNDERCLAP);
Thunderclap_Timer = 30000;
}else Thunderclap_Timer -= diff;
}
if (Thunderclap_Timer < diff)
{
DoCast(m_creature,SPELL_THUNDERCLAP);
Thunderclap_Timer = 30000;
}else Thunderclap_Timer -= diff;
}
};
bool QuestAccept_npc_torek(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_TOREK_ASSULT)
{
//TODO: find companions, make them follow Torek, at any time (possibly done by mangos/database in future?)
((npc_escortAI*)(creature->AI()))->Start(true, true, true, player->GetGUID());
DoScriptText(SAY_READY, creature, player);
creature->setFaction(113);
}
if (quest->GetQuestId() == QUEST_TOREK_ASSULT)
{
//TODO: find companions, make them follow Torek, at any time (possibly done by mangos/database in future?)
((npc_escortAI*)(creature->AI()))->Start(true, true, true, player->GetGUID());
DoScriptText(SAY_READY, creature, player);
creature->setFaction(113);
}
return true;
return true;
}
CreatureAI* GetAI_npc_torek(Creature *_Creature)
{
npc_torekAI* thisAI = new npc_torekAI(_Creature);
npc_torekAI* thisAI = new npc_torekAI(_Creature);
thisAI->AddWaypoint(0, 1782.63, -2241.11, 109.73, 5000);
thisAI->AddWaypoint(1, 1788.88, -2240.17, 111.71);
thisAI->AddWaypoint(2, 1797.49, -2238.11, 112.31);
thisAI->AddWaypoint(3, 1803.83, -2232.77, 111.22);
thisAI->AddWaypoint(4, 1806.65, -2217.83, 107.36);
thisAI->AddWaypoint(5, 1811.81, -2208.01, 107.45);
thisAI->AddWaypoint(6, 1820.85, -2190.82, 100.49);
thisAI->AddWaypoint(7, 1829.60, -2177.49, 96.44);
thisAI->AddWaypoint(8, 1837.98, -2164.19, 96.71); //prepare
thisAI->AddWaypoint(9, 1839.99, -2149.29, 96.78);
thisAI->AddWaypoint(10, 1835.14, -2134.98, 96.80);
thisAI->AddWaypoint(11, 1823.57, -2118.27, 97.43);
thisAI->AddWaypoint(12, 1814.99, -2110.35, 98.38);
thisAI->AddWaypoint(13, 1806.60, -2103.09, 99.19);
thisAI->AddWaypoint(14, 1798.27, -2095.77, 100.04);
thisAI->AddWaypoint(15, 1783.59, -2079.92, 100.81);
thisAI->AddWaypoint(16, 1776.79, -2069.48, 101.77);
thisAI->AddWaypoint(17, 1776.82, -2054.59, 109.82);
thisAI->AddWaypoint(18, 1776.88, -2047.56, 109.83);
thisAI->AddWaypoint(19, 1776.86, -2036.55, 109.83);
thisAI->AddWaypoint(20, 1776.90, -2024.56, 109.83); //win
thisAI->AddWaypoint(21, 1776.87, -2028.31, 109.83,60000);//stay
thisAI->AddWaypoint(22, 1776.90, -2028.30, 109.83);
thisAI->AddWaypoint(0, 1782.63, -2241.11, 109.73, 5000);
thisAI->AddWaypoint(1, 1788.88, -2240.17, 111.71);
thisAI->AddWaypoint(2, 1797.49, -2238.11, 112.31);
thisAI->AddWaypoint(3, 1803.83, -2232.77, 111.22);
thisAI->AddWaypoint(4, 1806.65, -2217.83, 107.36);
thisAI->AddWaypoint(5, 1811.81, -2208.01, 107.45);
thisAI->AddWaypoint(6, 1820.85, -2190.82, 100.49);
thisAI->AddWaypoint(7, 1829.60, -2177.49, 96.44);
thisAI->AddWaypoint(8, 1837.98, -2164.19, 96.71); //prepare
thisAI->AddWaypoint(9, 1839.99, -2149.29, 96.78);
thisAI->AddWaypoint(10, 1835.14, -2134.98, 96.80);
thisAI->AddWaypoint(11, 1823.57, -2118.27, 97.43);
thisAI->AddWaypoint(12, 1814.99, -2110.35, 98.38);
thisAI->AddWaypoint(13, 1806.60, -2103.09, 99.19);
thisAI->AddWaypoint(14, 1798.27, -2095.77, 100.04);
thisAI->AddWaypoint(15, 1783.59, -2079.92, 100.81);
thisAI->AddWaypoint(16, 1776.79, -2069.48, 101.77);
thisAI->AddWaypoint(17, 1776.82, -2054.59, 109.82);
thisAI->AddWaypoint(18, 1776.88, -2047.56, 109.83);
thisAI->AddWaypoint(19, 1776.86, -2036.55, 109.83);
thisAI->AddWaypoint(20, 1776.90, -2024.56, 109.83); //win
thisAI->AddWaypoint(21, 1776.87, -2028.31, 109.83,60000);//stay
thisAI->AddWaypoint(22, 1776.90, -2028.30, 109.83);
return (CreatureAI*)thisAI;
return (CreatureAI*)thisAI;
}
/*####
@@ -237,10 +237,10 @@ struct TRINITY_DLL_DECL npc_ruul_snowhoofAI : public npc_escortAI
Cage->SetGoState(1);
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustDied(Unit* killer)
{
@@ -300,15 +300,15 @@ CreatureAI* GetAI_npc_ruul_snowhoofAI(Creature *_Creature)
void AddSC_ashenvale()
{
Script *newscript;
Script *newscript;
newscript = new Script;
newscript->Name = "npc_torek";
newscript->GetAI = &GetAI_npc_torek;
newscript->pQuestAccept = &QuestAccept_npc_torek;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_torek";
newscript->GetAI = &GetAI_npc_torek;
newscript->pQuestAccept = &QuestAccept_npc_torek;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name = "npc_ruul_snowhoof";
newscript->GetAI = &GetAI_npc_ruul_snowhoofAI;
newscript->pQuestAccept = &QuestAccept_npc_ruul_snowhoof;
@@ -143,11 +143,11 @@ CreatureAI* GetAI_mob_stolen_soul(Creature *_Creature)
struct TRINITY_DLL_DECL boss_exarch_maladaarAI : public ScriptedAI
{
boss_exarch_maladaarAI(Creature *c) : ScriptedAI(c)
{
HasTaunted = false;
Reset();
}
boss_exarch_maladaarAI(Creature *c) : ScriptedAI(c)
{
HasTaunted = false;
Reset();
}
uint32 soulmodel;
uint64 soulholder;
@@ -175,14 +175,14 @@ struct TRINITY_DLL_DECL boss_exarch_maladaarAI : public ScriptedAI
void MoveInLineOfSight(Unit *who)
{
if (!HasTaunted && m_creature->IsWithinDistInMap(who, 150.0))
{
DoScriptText(SAY_INTRO, m_creature);
HasTaunted = true;
}
if (!HasTaunted && m_creature->IsWithinDistInMap(who, 150.0))
{
DoScriptText(SAY_INTRO, m_creature);
HasTaunted = true;
}
ScriptedAI::MoveInLineOfSight(who);
}
ScriptedAI::MoveInLineOfSight(who);
}
void Aggro(Unit *who)
@@ -201,15 +201,15 @@ struct TRINITY_DLL_DECL boss_exarch_maladaarAI : public ScriptedAI
{
//SPELL_STOLEN_SOUL_VISUAL has shapeshift effect, but not implemented feature in Trinity for this spell.
summoned->CastSpell(summoned,SPELL_STOLEN_SOUL_VISUAL,false);
summoned->SetDisplayId(soulmodel);
summoned->setFaction(m_creature->getFaction());
summoned->SetDisplayId(soulmodel);
summoned->setFaction(m_creature->getFaction());
if (Unit *target = Unit::GetUnit(*m_creature,soulholder))
{
{
((mob_stolen_soulAI*)summoned->AI())->SetMyClass(soulclass);
summoned->AI()->AttackStart(target);
}
summoned->AI()->AttackStart(target);
}
}
}
@@ -79,7 +79,7 @@ struct TRINITY_DLL_DECL boss_shirrak_the_dead_watcherAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
//Inhibitmagic_Timer
//Inhibitmagic_Timer
if (Inhibitmagic_Timer < diff)
{
float dist;
@@ -110,7 +110,7 @@ struct TRINITY_DLL_DECL boss_shirrak_the_dead_watcherAI : public ScriptedAI
{
DoCast(m_creature,SPELL_ATTRACTMAGIC);
Attractmagic_Timer = 30000;
Carnivorousbite_Timer = 1500;
Carnivorousbite_Timer = 1500;
}else Attractmagic_Timer -= diff;
//Carnivorousbite_Timer
@@ -133,11 +133,11 @@ struct TRINITY_DLL_DECL boss_shirrak_the_dead_watcherAI : public ScriptedAI
// Emote
std::string *emote = new std::string("focuses on ");
emote->append(target->GetName());
emote->append("!");
emote->append("!");
DoTextEmote(emote->c_str(),NULL,true);
delete emote;
}
FocusFire_Timer = 15000+(rand()%5000);
FocusFire_Timer = 15000+(rand()%5000);
}else FocusFire_Timer -= diff;
DoMeleeAttackIfReady();
@@ -205,7 +205,7 @@ struct TRINITY_DLL_DECL mob_ethereal_beaconAI : public ScriptedAI
{
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
CanEvade = false;
CanEvade = false;
}
bool HeroicMode;
@@ -241,10 +241,10 @@ struct TRINITY_DLL_DECL mob_ethereal_beaconAI : public ScriptedAI
{
DoCast(m_creature->getVictim(),SPELL_ARCANE_BOLT);
ArcaneBolt_Timer = 2000 + rand()%2500;
Unit *shaffar = FindCreature(ENTRY_SHAFFAR, 100, m_creature);
Unit *shaffar = FindCreature(ENTRY_SHAFFAR, 100, m_creature);
if(!shaffar || shaffar->isDead())
{
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->SetLootRecipient(NULL);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
@@ -55,7 +55,7 @@ struct TRINITY_DLL_DECL boss_darkweaver_sythAI : public ScriptedAI
{
boss_darkweaver_sythAI(Creature *c) : ScriptedAI(c)
{
{
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
@@ -69,7 +69,7 @@ struct TRINITY_DLL_DECL boss_darkweaver_sythAI : public ScriptedAI
bool summon90;
bool summon50;
bool summon10;
bool HeroicMode;
bool HeroicMode;
void Reset()
{
@@ -208,14 +208,14 @@ struct TRINITY_DLL_DECL mob_syth_fireAI : public ScriptedAI
{
mob_syth_fireAI(Creature *c) : ScriptedAI(c)
{
{
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
uint32 flameshock_timer;
uint32 flamebuffet_timer;
bool HeroicMode;
bool HeroicMode;
void Reset()
{
@@ -260,14 +260,14 @@ struct TRINITY_DLL_DECL mob_syth_arcaneAI : public ScriptedAI
{
mob_syth_arcaneAI(Creature *c) : ScriptedAI(c)
{
HeroicMode = m_creature->GetMap()->IsHeroic();
{
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
uint32 arcaneshock_timer;
uint32 arcanebuffet_timer;
bool HeroicMode;
bool HeroicMode;
void Reset()
{
@@ -312,14 +312,14 @@ struct TRINITY_DLL_DECL mob_syth_frostAI : public ScriptedAI
{
mob_syth_frostAI(Creature *c) : ScriptedAI(c)
{
{
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
uint32 frostshock_timer;
uint32 frostbuffet_timer;
bool HeroicMode;
bool HeroicMode;
void Reset()
{
@@ -364,14 +364,14 @@ struct TRINITY_DLL_DECL mob_syth_shadowAI : public ScriptedAI
{
mob_syth_shadowAI(Creature *c) : ScriptedAI(c)
{
{
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
uint32 shadowshock_timer;
uint32 shadowbuffet_timer;
bool HeroicMode;
bool HeroicMode;
void Reset()
{
@@ -47,7 +47,7 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI
boss_ambassador_hellmawAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
@@ -88,13 +88,13 @@ struct TRINITY_DLL_DECL boss_ambassador_hellmawAI : public ScriptedAI
}
}
void MoveInLineOfSight(Unit *who)
{
if (m_creature->HasAura(SPELL_BANISH,0))
return;
void MoveInLineOfSight(Unit *who)
{
if (m_creature->HasAura(SPELL_BANISH,0))
return;
ScriptedAI::MoveInLineOfSight(who);
}
ScriptedAI::MoveInLineOfSight(who);
}
void MovementInform(uint32 type, uint32 id)
{
@@ -41,18 +41,18 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
instance_shadow_labyrinth(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
std::string str_data;
std::string str_data;
uint64 RefectoryDoorGUID;
uint64 ScreamingHallDoorGUID;
uint64 ScreamingHallDoorGUID;
uint64 GrandmasterVorpil;
uint32 FelOverseerCount;
void Initialize()
{
RefectoryDoorGUID = 0;
ScreamingHallDoorGUID = 0;
RefectoryDoorGUID = 0;
ScreamingHallDoorGUID = 0;
GrandmasterVorpil = 0;
FelOverseerCount = 0;
@@ -73,8 +73,8 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
{
switch(go->GetEntry())
{
case REFECTORY_DOOR: RefectoryDoorGUID = go->GetGUID(); break;
case SCREAMING_HALL_DOOR: ScreamingHallDoorGUID = go->GetGUID(); break;
case REFECTORY_DOOR: RefectoryDoorGUID = go->GetGUID(); break;
case SCREAMING_HALL_DOOR: ScreamingHallDoorGUID = go->GetGUID(); break;
}
}
@@ -92,36 +92,36 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
}
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("SD2: Instance Shadow Labyrinth: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
debug_log("SD2: Instance Shadow Labyrinth: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void HandleGameObject(uint64 guid, uint32 state)
{
Player *player = GetPlayerInMap();
void HandleGameObject(uint64 guid, uint32 state)
{
Player *player = GetPlayerInMap();
if (!player || !guid)
{
debug_log("SD2: Shadow Labyrinth: HandleGameObject fail");
return;
}
if (!player || !guid)
{
debug_log("SD2: Shadow Labyrinth: HandleGameObject fail");
return;
}
if (GameObject *go = GameObject::GetGameObject(*player,guid))
go->SetGoState(state);
}
if (GameObject *go = GameObject::GetGameObject(*player,guid))
go->SetGoState(state);
}
void SetData(uint32 type, uint32 data)
{
@@ -149,7 +149,7 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
case DATA_BLACKHEARTTHEINCITEREVENT:
if( data == DONE )
{
HandleGameObject(RefectoryDoorGUID,0);
HandleGameObject(RefectoryDoorGUID,0);
}
Encounter[2] = data;
break;
@@ -157,7 +157,7 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
case DATA_GRANDMASTERVORPILEVENT:
if( data == DONE )
{
HandleGameObject(ScreamingHallDoorGUID,0);
HandleGameObject(ScreamingHallDoorGUID,0);
}
Encounter[3] = data;
break;
@@ -167,22 +167,22 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
break;
}
if (data == DONE)
{
if (type == TYPE_OVERSEER && FelOverseerCount != 0)
return;
if (data == DONE)
{
if (type == TYPE_OVERSEER && FelOverseerCount != 0)
return;
OUT_SAVE_INST_DATA;
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << Encounter[0] << " " << Encounter[1] << " "
<< Encounter[2] << " " << Encounter[3] << " " << Encounter[4];
std::ostringstream saveStream;
saveStream << Encounter[0] << " " << Encounter[1] << " "
<< Encounter[2] << " " << Encounter[3] << " " << Encounter[4];
str_data = saveStream.str();
str_data = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
uint32 GetData(uint32 type)
@@ -205,30 +205,30 @@ struct TRINITY_DLL_DECL instance_shadow_labyrinth : public ScriptedInstance
return 0;
}
const char* Save()
{
return str_data.c_str();
}
const char* Save()
{
return str_data.c_str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> Encounter[0] >> Encounter[1] >> Encounter[2] >> Encounter[3] >> Encounter[4];
std::istringstream loadStream(in);
loadStream >> Encounter[0] >> Encounter[1] >> Encounter[2] >> Encounter[3] >> Encounter[4];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounter[i] == IN_PROGRESS)
Encounter[i] = NOT_STARTED;
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounter[i] == IN_PROGRESS)
Encounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_shadow_labyrinth(Map* map)
@@ -251,7 +251,7 @@ struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
bool Must_Die;
bool Escape;
bool ContinueWP;
bool Reached;
bool Reached;
void Reset()
{
@@ -267,7 +267,7 @@ struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
Must_Die = false;
Escape = false;
ContinueWP = false;
Reached = false;
Reached = false;
}
void Despawn()
@@ -306,8 +306,8 @@ struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
m_creature->AI_SendMoveToPacket(3706.39, -3969.15, 35.9118, 0, 0, 0);
}
//begin swimming and summon depth charges
Player* player = ((Player*)Unit::GetUnit((*m_creature), PlayerGUID));
SendText(MSG_ESCAPE_NOTICE, player);
Player* player = ((Player*)Unit::GetUnit((*m_creature), PlayerGUID));
SendText(MSG_ESCAPE_NOTICE, player);
DoCast(m_creature, SPELL_PERIODIC_DEPTH_CHARGE);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING);
m_creature->SetSpeed(MOVE_RUN, 0.85f, true);
@@ -336,7 +336,7 @@ struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
Grenade_Timer = 30000;
} else Grenade_Timer -= diff;
if(Check_Timer < diff)
if(Check_Timer < diff)
{
Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID);
if(!player)
@@ -345,16 +345,16 @@ struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
return;
}
float dist = m_creature->GetDistance(player);
if(dist < 10 && m_creature->GetPositionX() > player->GetPositionX() && !Reached)
if(dist < 10 && m_creature->GetPositionX() > player->GetPositionX() && !Reached)
{
DoScriptText(SAY_RIZZLE_FINAL, m_creature);
m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 1);
m_creature->setFaction(35);
m_creature->setFaction(35);
m_creature->StopMoving();
m_creature->GetMotionMaster()->MovementExpired();
m_creature->GetMotionMaster()->Clear(true);
m_creature->GetMotionMaster()->Clear(true);
m_creature->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE);
Reached = true;
Reached = true;
}
Check_Timer = 1000;
@@ -362,13 +362,13 @@ struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI
}
void SendText(const char *text, Player* player)
{
WorldPacket data(SMSG_SERVER_MESSAGE, 0); // guess size
data << text;
if(player)
player->GetSession()->SendPacket(&data);
}
void SendText(const char *text, Player* player)
{
WorldPacket data(SMSG_SERVER_MESSAGE, 0); // guess size
data << text;
if(player)
player->GetSession()->SendPacket(&data);
}
void AttackStart(Unit *who)
{
@@ -443,7 +443,7 @@ struct TRINITY_DLL_DECL mob_depth_chargeAI : public ScriptedAI
void Reset()
{
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
we_must_die = false;
must_die_timer = 1000;
}
@@ -478,9 +478,9 @@ struct TRINITY_DLL_DECL mob_depth_chargeAI : public ScriptedAI
}
void Aggro(Unit* who)
{
{
return;
}
}
};
CreatureAI* GetAI_mob_depth_charge(Creature *_Creature)
@@ -503,7 +503,7 @@ void AddSC_azshara()
newscript->pGossipSelect = &GossipSelect_npc_loramus_thalipedes;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="mob_rizzle_sprysprocket";
newscript->GetAI = &GetAI_mob_rizzle_sprysprocket;
newscript->pGossipHello = &GossipHello_mob_rizzle_sprysprocket;
@@ -70,7 +70,7 @@ struct TRINITY_DLL_DECL boss_azuregosAI : public ScriptedAI
if(Teleport_Timer < diff)
{
DoScriptText(SAY_TELEPORT, m_creature);
DoScriptText(SAY_TELEPORT, m_creature);
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
std::list<HostilReference*>::iterator i = m_threatlist.begin();
for (i = m_threatlist.begin(); i!= m_threatlist.end();++i)
@@ -110,7 +110,7 @@ struct TRINITY_DLL_DECL boss_azuregosAI : public ScriptedAI
//ManaStorm_Timer
if (ManaStorm_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_MANASTORM);
ManaStorm_Timer = 7500 + rand()%5000;
}else ManaStorm_Timer -= diff;
@@ -326,110 +326,110 @@ CreatureAI* GetAI_npc_injured_draenei(Creature *_Creature)
struct TRINITY_DLL_DECL npc_magwinAI : public npc_escortAI
{
npc_magwinAI(Creature *c) : npc_escortAI(c) {Reset();}
npc_magwinAI(Creature *c) : npc_escortAI(c) {Reset();}
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (!player)
return;
if (!player)
return;
switch(i)
{
case 0:
DoScriptText(SAY_START, m_creature, player);
break;
case 17:
DoScriptText(SAY_PROGRESS, m_creature, player);
break;
case 28:
DoScriptText(SAY_END1, m_creature, player);
break;
case 29:
DoScriptText(EMOTE_HUG, m_creature, player);
DoScriptText(SAY_END2, m_creature, player);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_A_CRY_FOR_HELP,m_creature);
break;
}
}
switch(i)
{
case 0:
DoScriptText(SAY_START, m_creature, player);
break;
case 17:
DoScriptText(SAY_PROGRESS, m_creature, player);
break;
case 28:
DoScriptText(SAY_END1, m_creature, player);
break;
case 29:
DoScriptText(EMOTE_HUG, m_creature, player);
DoScriptText(SAY_END2, m_creature, player);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_A_CRY_FOR_HELP,m_creature);
break;
}
}
void Aggro(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature, who);
}
void Aggro(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature, who);
}
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(80);
}
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(80);
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_A_CRY_FOR_HELP);
}
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_A_CRY_FOR_HELP);
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
bool QuestAccept_npc_magwin(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_A_CRY_FOR_HELP)
{
creature->setFaction(113);
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
}
return true;
if (quest->GetQuestId() == QUEST_A_CRY_FOR_HELP)
{
creature->setFaction(113);
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
}
return true;
}
CreatureAI* GetAI_npc_magwinAI(Creature *_Creature)
{
npc_magwinAI* magwinAI = new npc_magwinAI(_Creature);
npc_magwinAI* magwinAI = new npc_magwinAI(_Creature);
magwinAI->AddWaypoint(0, -4784.532227, -11051.060547, 3.484263);
magwinAI->AddWaypoint(1, -4805.509277, -11037.293945, 3.043942);
magwinAI->AddWaypoint(2, -4827.826172, -11034.398438, 1.741959);
magwinAI->AddWaypoint(3, -4852.630859, -11033.695313, 2.208656);
magwinAI->AddWaypoint(4, -4876.791992, -11034.517578, 3.175228);
magwinAI->AddWaypoint(5, -4895.486816, -11038.306641, 9.390890);
magwinAI->AddWaypoint(6, -4915.464844, -11048.402344, 12.369793);
magwinAI->AddWaypoint(7, -4937.288086, -11067.041992, 13.857983);
magwinAI->AddWaypoint(8, -4966.577637, -11067.507813, 15.754786);
magwinAI->AddWaypoint(9, -4993.799805, -11056.544922, 19.175295);
magwinAI->AddWaypoint(10, -5017.836426, -11052.569336, 22.476587);
magwinAI->AddWaypoint(11, -5039.706543, -11058.459961, 25.831593);
magwinAI->AddWaypoint(12, -5057.289063, -11045.474609, 26.972496);
magwinAI->AddWaypoint(13, -5078.828125, -11037.601563, 29.053417);
magwinAI->AddWaypoint(14, -5104.158691, -11039.195313, 29.440195);
magwinAI->AddWaypoint(15, -5120.780273, -11039.518555, 30.142139);
magwinAI->AddWaypoint(16, -5140.833008, -11039.810547, 28.788074);
magwinAI->AddWaypoint(17, -5161.201660, -11040.050781, 27.879545, 4000);
magwinAI->AddWaypoint(18, -5171.842285, -11046.803711, 27.183821);
magwinAI->AddWaypoint(19, -5185.995117, -11056.359375, 20.234867);
magwinAI->AddWaypoint(20, -5198.485840, -11065.065430, 18.872593);
magwinAI->AddWaypoint(21, -5214.062500, -11074.653320, 19.215731);
magwinAI->AddWaypoint(22, -5220.157227, -11088.377930, 19.818476);
magwinAI->AddWaypoint(23, -5233.652832, -11098.846680, 18.349432);
magwinAI->AddWaypoint(24, -5250.163086, -11111.653320, 16.438959);
magwinAI->AddWaypoint(25, -5268.194336, -11125.639648, 12.668313);
magwinAI->AddWaypoint(26, -5286.270508, -11130.669922, 6.912246);
magwinAI->AddWaypoint(27, -5317.449707, -11137.392578, 4.963446);
magwinAI->AddWaypoint(28, -5334.854492, -11154.384766, 6.742664);
magwinAI->AddWaypoint(29, -5353.874512, -11171.595703, 6.903912, 20000);
magwinAI->AddWaypoint(30, -5354.240000, -11171.940000, 6.890000);
magwinAI->AddWaypoint(0, -4784.532227, -11051.060547, 3.484263);
magwinAI->AddWaypoint(1, -4805.509277, -11037.293945, 3.043942);
magwinAI->AddWaypoint(2, -4827.826172, -11034.398438, 1.741959);
magwinAI->AddWaypoint(3, -4852.630859, -11033.695313, 2.208656);
magwinAI->AddWaypoint(4, -4876.791992, -11034.517578, 3.175228);
magwinAI->AddWaypoint(5, -4895.486816, -11038.306641, 9.390890);
magwinAI->AddWaypoint(6, -4915.464844, -11048.402344, 12.369793);
magwinAI->AddWaypoint(7, -4937.288086, -11067.041992, 13.857983);
magwinAI->AddWaypoint(8, -4966.577637, -11067.507813, 15.754786);
magwinAI->AddWaypoint(9, -4993.799805, -11056.544922, 19.175295);
magwinAI->AddWaypoint(10, -5017.836426, -11052.569336, 22.476587);
magwinAI->AddWaypoint(11, -5039.706543, -11058.459961, 25.831593);
magwinAI->AddWaypoint(12, -5057.289063, -11045.474609, 26.972496);
magwinAI->AddWaypoint(13, -5078.828125, -11037.601563, 29.053417);
magwinAI->AddWaypoint(14, -5104.158691, -11039.195313, 29.440195);
magwinAI->AddWaypoint(15, -5120.780273, -11039.518555, 30.142139);
magwinAI->AddWaypoint(16, -5140.833008, -11039.810547, 28.788074);
magwinAI->AddWaypoint(17, -5161.201660, -11040.050781, 27.879545, 4000);
magwinAI->AddWaypoint(18, -5171.842285, -11046.803711, 27.183821);
magwinAI->AddWaypoint(19, -5185.995117, -11056.359375, 20.234867);
magwinAI->AddWaypoint(20, -5198.485840, -11065.065430, 18.872593);
magwinAI->AddWaypoint(21, -5214.062500, -11074.653320, 19.215731);
magwinAI->AddWaypoint(22, -5220.157227, -11088.377930, 19.818476);
magwinAI->AddWaypoint(23, -5233.652832, -11098.846680, 18.349432);
magwinAI->AddWaypoint(24, -5250.163086, -11111.653320, 16.438959);
magwinAI->AddWaypoint(25, -5268.194336, -11125.639648, 12.668313);
magwinAI->AddWaypoint(26, -5286.270508, -11130.669922, 6.912246);
magwinAI->AddWaypoint(27, -5317.449707, -11137.392578, 4.963446);
magwinAI->AddWaypoint(28, -5334.854492, -11154.384766, 6.742664);
magwinAI->AddWaypoint(29, -5353.874512, -11171.595703, 6.903912, 20000);
magwinAI->AddWaypoint(30, -5354.240000, -11171.940000, 6.890000);
return (CreatureAI*)magwinAI;
return (CreatureAI*)magwinAI;
}
/*######
@@ -470,155 +470,155 @@ bool GossipSelect_npc_susurrus(Player *player, Creature *_Creature, uint32 sende
## npc_geezle
######*/
#define GEEZLE_SAY_1 -1000259
#define SPARK_SAY_2 -1000260
#define SPARK_SAY_3 -1000261
#define GEEZLE_SAY_4 -1000262
#define SPARK_SAY_5 -1000263
#define SPARK_SAY_6 -1000264
#define GEEZLE_SAY_7 -1000265
#define GEEZLE_SAY_1 -1000259
#define SPARK_SAY_2 -1000260
#define SPARK_SAY_3 -1000261
#define GEEZLE_SAY_4 -1000262
#define SPARK_SAY_5 -1000263
#define SPARK_SAY_6 -1000264
#define GEEZLE_SAY_7 -1000265
#define EMOTE_SPARK -1000266
#define EMOTE_SPARK -1000266
#define MOB_SPARK 17243
#define GO_NAGA_FLAG 181694
#define MOB_SPARK 17243
#define GO_NAGA_FLAG 181694
static float SparkPos[4] = {-5030.95, -11291.99, 7.97};
struct TRINITY_DLL_DECL npc_geezleAI : public ScriptedAI
{
npc_geezleAI(Creature *c) : ScriptedAI(c) {Reset();}
npc_geezleAI(Creature *c) : ScriptedAI(c) {Reset();}
std::list<GameObject*> FlagList;
std::list<GameObject*> FlagList;
uint64 SparkGUID;
uint64 SparkGUID;
uint32 Step;
uint32 SayTimer;
uint32 Step;
uint32 SayTimer;
bool EventStarted;
bool EventStarted;
void Reset()
{
SparkGUID = 0;
Step = 0;
StartEvent();
}
void Reset()
{
SparkGUID = 0;
Step = 0;
StartEvent();
}
void Aggro(Unit* who){}
void Aggro(Unit* who){}
void StartEvent()
{
Step = 1;
EventStarted = true;
Creature* Spark = m_creature->SummonCreature(MOB_SPARK, SparkPos[0], SparkPos[1], SparkPos[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000);
SparkGUID = Spark->GetGUID();
Spark->setActive(true);
Spark->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
m_creature->GetMotionMaster()->MovePoint(0, -5092.26, -11252, 0.71);
Spark->GetMotionMaster()->MovePoint(0, -5080.70, -11253.61, 0.56);
SayTimer = 23000;
}
void StartEvent()
{
Step = 1;
EventStarted = true;
Creature* Spark = m_creature->SummonCreature(MOB_SPARK, SparkPos[0], SparkPos[1], SparkPos[2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1000);
SparkGUID = Spark->GetGUID();
Spark->setActive(true);
Spark->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
m_creature->GetMotionMaster()->MovePoint(0, -5092.26, -11252, 0.71);
Spark->GetMotionMaster()->MovePoint(0, -5080.70, -11253.61, 0.56);
SayTimer = 23000;
}
uint32 NextStep(uint32 Step)
{
Unit* Spark = Unit::GetUnit((*m_creature), SparkGUID);
uint32 NextStep(uint32 Step)
{
Unit* Spark = Unit::GetUnit((*m_creature), SparkGUID);
switch(Step)
{
case 0: return 99999;
case 1:
//DespawnNagaFlag(true);
DoScriptText(EMOTE_SPARK, Spark);
return 1000;
case 2:
DoScriptText(GEEZLE_SAY_1, m_creature, Spark);
Spark->SetInFront(m_creature);
m_creature->SetInFront(Spark);
return 5000;
case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000;
case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000;
case 5: DoScriptText(GEEZLE_SAY_4, m_creature, Spark); return 8000;
case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000;
case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000;
case 8: DoScriptText(GEEZLE_SAY_7, m_creature, Spark); return 2000;
case 9:
m_creature->GetMotionMaster()->MoveTargetedHome();
Spark->GetMotionMaster()->MovePoint(0, -5030.95, -11291.99, 7.97);
return 20000;
case 10:
Spark->DealDamage(Spark,Spark->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
//DespawnNagaFlag(false);
m_creature->SetVisibility(VISIBILITY_OFF);
default: return 99999999;
}
}
switch(Step)
{
case 0: return 99999;
case 1:
//DespawnNagaFlag(true);
DoScriptText(EMOTE_SPARK, Spark);
return 1000;
case 2:
DoScriptText(GEEZLE_SAY_1, m_creature, Spark);
Spark->SetInFront(m_creature);
m_creature->SetInFront(Spark);
return 5000;
case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000;
case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000;
case 5: DoScriptText(GEEZLE_SAY_4, m_creature, Spark); return 8000;
case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000;
case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000;
case 8: DoScriptText(GEEZLE_SAY_7, m_creature, Spark); return 2000;
case 9:
m_creature->GetMotionMaster()->MoveTargetedHome();
Spark->GetMotionMaster()->MovePoint(0, -5030.95, -11291.99, 7.97);
return 20000;
case 10:
Spark->DealDamage(Spark,Spark->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
//DespawnNagaFlag(false);
m_creature->SetVisibility(VISIBILITY_OFF);
default: return 99999999;
}
}
void DespawnNagaFlag(bool despawn)
{
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
void DespawnNagaFlag(bool despawn)
{
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
Trinity::AllGameObjectsWithEntryInGrid go_check(GO_NAGA_FLAG);
Trinity::AllGameObjectsWithEntryInGrid go_check(GO_NAGA_FLAG);
Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid> go_search(m_creature, FlagList, go_check);
TypeContainerVisitor
<Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid>, GridTypeMapContainer> go_visit(go_search);
CellLock<GridReadGuard> cell_lock(cell, pair);
cell_lock->Visit(cell_lock, go_visit, *(m_creature->GetMap()));
TypeContainerVisitor
<Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInGrid>, GridTypeMapContainer> go_visit(go_search);
CellLock<GridReadGuard> cell_lock(cell, pair);
cell_lock->Visit(cell_lock, go_visit, *(m_creature->GetMap()));
Player* player = NULL;
if (!FlagList.empty())
{
for(std::list<GameObject*>::iterator itr = FlagList.begin(); itr != FlagList.end(); ++itr)
{
//TODO: Found how to despawn and respawn
if(despawn)
(*itr)->RemoveFromWorld();
else
(*itr)->Respawn();
}
} else error_log("SD2 ERROR: FlagList is empty!");
}
Player* player = NULL;
if (!FlagList.empty())
{
for(std::list<GameObject*>::iterator itr = FlagList.begin(); itr != FlagList.end(); ++itr)
{
//TODO: Found how to despawn and respawn
if(despawn)
(*itr)->RemoveFromWorld();
else
(*itr)->Respawn();
}
} else error_log("SD2 ERROR: FlagList is empty!");
}
void UpdateAI(const uint32 diff)
{
if(SayTimer < diff)
{
if(EventStarted)
{
SayTimer = NextStep(++Step);
}
}else SayTimer -= diff;
}
void UpdateAI(const uint32 diff)
{
if(SayTimer < diff)
{
if(EventStarted)
{
SayTimer = NextStep(++Step);
}
}else SayTimer -= diff;
}
};
CreatureAI* GetAI_npc_geezleAI(Creature *_Creature)
{
return new npc_geezleAI(_Creature);
return new npc_geezleAI(_Creature);
}
/*######
## mob_nestlewood_owlkin
######*/
#define INOCULATION_CHANNEL 29528
#define INOCULATED_OWLKIN 16534
#define INOCULATION_CHANNEL 29528
#define INOCULATED_OWLKIN 16534
struct TRINITY_DLL_DECL mob_nestlewood_owlkinAI : public ScriptedAI
{
mob_nestlewood_owlkinAI(Creature *c) : ScriptedAI(c) {Reset();}
uint32 ChannelTimer;
bool Channeled;
bool Hitted;
uint32 ChannelTimer;
bool Channeled;
bool Hitted;
void Reset()
{
ChannelTimer = 0;
Channeled = false;
Hitted = false;
ChannelTimer = 0;
Channeled = false;
Hitted = false;
}
void Aggro(Unit *who){}
@@ -629,23 +629,23 @@ struct TRINITY_DLL_DECL mob_nestlewood_owlkinAI : public ScriptedAI
return;
if(caster->GetTypeId() == TYPEID_PLAYER && spell->Id == INOCULATION_CHANNEL)
{
ChannelTimer = 3000;
Hitted = true;
}
{
ChannelTimer = 3000;
Hitted = true;
}
}
void UpdateAI(const uint32 diff)
{
if(ChannelTimer < diff && !Channeled && Hitted)
{
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
m_creature->SummonCreature(INOCULATED_OWLKIN, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 180000);
Channeled = true;
}else ChannelTimer -= diff;
if(ChannelTimer < diff && !Channeled && Hitted)
{
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
m_creature->SummonCreature(INOCULATED_OWLKIN, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 180000);
Channeled = true;
}else ChannelTimer -= diff;
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
};
@@ -675,11 +675,11 @@ void AddSC_azuremyst_isle()
newscript->GetAI = &GetAI_npc_injured_draenei;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_magwin";
newscript->GetAI = &GetAI_npc_magwinAI;
newscript->pQuestAccept = &QuestAccept_npc_magwin;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_magwin";
newscript->GetAI = &GetAI_npc_magwinAI;
newscript->pQuestAccept = &QuestAccept_npc_magwin;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_susurrus";
@@ -687,14 +687,14 @@ void AddSC_azuremyst_isle()
newscript->pGossipSelect = &GossipSelect_npc_susurrus;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_geezle";
newscript->GetAI = &GetAI_npc_geezleAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_geezle";
newscript->GetAI = &GetAI_npc_geezleAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_nestlewood_owlkin";
newscript->GetAI = &GetAI_mob_nestlewood_owlkinAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_nestlewood_owlkin";
newscript->GetAI = &GetAI_mob_nestlewood_owlkinAI;
newscript->RegisterSelf();
}
@@ -391,87 +391,87 @@ CreatureAI* GetAI_npc_twiggy_flathead(Creature *_Creature)
## npc_wizzlecrank_shredder
#####*/
#define SAY_PROGRESS_1 -1000272
#define SAY_PROGRESS_2 -1000273
#define SAY_PROGRESS_3 -1000274
#define SAY_PROGRESS_1 -1000272
#define SAY_PROGRESS_2 -1000273
#define SAY_PROGRESS_3 -1000274
#define SAY_MERCENARY_4 -1000275
#define SAY_MERCENARY_4 -1000275
#define SAY_PROGRESS_5 -1000276
#define SAY_PROGRESS_6 -1000277
#define SAY_PROGRESS_7 -1000278
#define SAY_PROGRESS_8 -1000279
#define SAY_PROGRESS_5 -1000276
#define SAY_PROGRESS_6 -1000277
#define SAY_PROGRESS_7 -1000278
#define SAY_PROGRESS_8 -1000279
#define QUEST_ESCAPE 863
#define NPC_PILOT 3451
#define MOB_MERCENARY 3282
#define QUEST_ESCAPE 863
#define NPC_PILOT 3451
#define MOB_MERCENARY 3282
struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI
{
npc_wizzlecrank_shredderAI(Creature* c) : npc_escortAI(c) {Reset();}
npc_wizzlecrank_shredderAI(Creature* c) : npc_escortAI(c) {Reset();}
bool Completed;
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if(!player)
return;
if(!player)
return;
switch(i)
{
case 0: DoScriptText(SAY_PROGRESS_1, m_creature);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 1: DoScriptText(SAY_PROGRESS_2, m_creature); break;
case 10: DoScriptText(SAY_PROGRESS_3, m_creature, player);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 20:{
Unit* Mercenary = FindCreature(MOB_MERCENARY, 99, m_creature);
if(Mercenary)
{
DoScriptText(SAY_MERCENARY_4, Mercenary);
((Creature*)Mercenary)->AI()->AttackStart(m_creature);
AttackStart(Mercenary);
}
}break;
case 21: DoScriptText(SAY_PROGRESS_5, m_creature);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 28: DoScriptText(SAY_PROGRESS_6, m_creature); break;
case 29: DoScriptText(SAY_PROGRESS_7, m_creature); break;
case 30: DoScriptText(SAY_PROGRESS_8, m_creature); break;
case 31: m_creature->SummonCreature(NPC_PILOT, 1088.77, -2985.39, 91.84, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000);
m_creature->setDeathState(JUST_DIED);
switch(i)
{
case 0: DoScriptText(SAY_PROGRESS_1, m_creature);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 1: DoScriptText(SAY_PROGRESS_2, m_creature); break;
case 10: DoScriptText(SAY_PROGRESS_3, m_creature, player);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 20:{
Unit* Mercenary = FindCreature(MOB_MERCENARY, 99, m_creature);
if(Mercenary)
{
DoScriptText(SAY_MERCENARY_4, Mercenary);
((Creature*)Mercenary)->AI()->AttackStart(m_creature);
AttackStart(Mercenary);
}
}break;
case 21: DoScriptText(SAY_PROGRESS_5, m_creature);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 28: DoScriptText(SAY_PROGRESS_6, m_creature); break;
case 29: DoScriptText(SAY_PROGRESS_7, m_creature); break;
case 30: DoScriptText(SAY_PROGRESS_8, m_creature); break;
case 31: m_creature->SummonCreature(NPC_PILOT, 1088.77, -2985.39, 91.84, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 300000);
m_creature->setDeathState(JUST_DIED);
Completed = true;
if (player && player->GetTypeId() == TYPEID_PLAYER)
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_ESCAPE, m_creature);
break;
}
}
break;
}
}
void Reset()
{
m_creature->setDeathState(ALIVE);
void Reset()
{
m_creature->setDeathState(ALIVE);
Completed = false;
m_creature->setFaction(69);
}
}
void Aggro(Unit* who){}
void Aggro(Unit* who){}
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_ESCAPE);
}
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
bool QuestAccept_npc_wizzlecrank_shredder(Player* player, Creature* creature, Quest const* quest)
@@ -479,49 +479,49 @@ bool QuestAccept_npc_wizzlecrank_shredder(Player* player, Creature* creature, Qu
if (quest->GetQuestId() == QUEST_ESCAPE)
{
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
creature->setFaction(113);
creature->setFaction(113);
}
return true;
}
CreatureAI* GetAI_npc_wizzlecrank_shredderAI(Creature *_Creature)
{
npc_wizzlecrank_shredderAI* thisAI = new npc_wizzlecrank_shredderAI(_Creature);
npc_wizzlecrank_shredderAI* thisAI = new npc_wizzlecrank_shredderAI(_Creature);
thisAI->AddWaypoint(0, 1109.15, -3104.11, 82.41, 6000);
thisAI->AddWaypoint(1, 1105.39, -3102.86, 82.74, 2000);
thisAI->AddWaypoint(2, 1104.97, -3108.52, 83.10, 1000);
thisAI->AddWaypoint(3, 1110.01, -3110.48, 82.81, 1000);
thisAI->AddWaypoint(4, 1111.72, -3103.03, 82.21, 1000);
thisAI->AddWaypoint(5, 1106.98, -3099.44, 82.18, 1000);
thisAI->AddWaypoint(6, 1103.74, -3103.29, 83.05, 1000);
thisAI->AddWaypoint(7, 1112.55, -3106.56, 82.31, 1000);
thisAI->AddWaypoint(8, 1108.12, -3111.04, 82.99, 1000);
thisAI->AddWaypoint(9, 1109.32, -3100.39, 82.08, 1000);
thisAI->AddWaypoint(10, 1109.32, -3100.39, 82.08, 6000);
thisAI->AddWaypoint(11, 1098.92, -3095.14, 82.97);
thisAI->AddWaypoint(12, 1100.94, -3082.60, 82.83);
thisAI->AddWaypoint(13, 1101.12, -3068.83, 82.53);
thisAI->AddWaypoint(14, 1096.97, -3051.99, 82.50);
thisAI->AddWaypoint(15, 1094.06, -3036.79, 82.70);
thisAI->AddWaypoint(16, 1098.22, -3027.84, 83.79);
thisAI->AddWaypoint(17, 1109.51, -3015.92, 85.73);
thisAI->AddWaypoint(18, 1119.87, -3007.21, 87.08);
thisAI->AddWaypoint(19, 1130.23, -3002.49, 91.27, 5000);
thisAI->AddWaypoint(20, 1130.23, -3002.49, 91.27, 3000);
thisAI->AddWaypoint(21, 1130.23, -3002.49, 91.27, 4000);
thisAI->AddWaypoint(22, 1129.73, -2985.89, 92.46);
thisAI->AddWaypoint(23, 1124.10, -2983.29, 92.81);
thisAI->AddWaypoint(24, 1111.74, -2992.38, 91.59);
thisAI->AddWaypoint(25, 1111.06, -2976.54, 91.81);
thisAI->AddWaypoint(26, 1099.91, -2991.17, 91.67);
thisAI->AddWaypoint(27, 1096.32, -2981.55, 91.73);
thisAI->AddWaypoint(28, 1091.28, -2985.82, 91.74, 4000);
thisAI->AddWaypoint(29, 1091.28, -2985.82, 91.74, 3000);
thisAI->AddWaypoint(30, 1091.28, -2985.82, 91.74, 7000);
thisAI->AddWaypoint(31, 1091.28, -2985.82, 91.74, 3000);
thisAI->AddWaypoint(0, 1109.15, -3104.11, 82.41, 6000);
thisAI->AddWaypoint(1, 1105.39, -3102.86, 82.74, 2000);
thisAI->AddWaypoint(2, 1104.97, -3108.52, 83.10, 1000);
thisAI->AddWaypoint(3, 1110.01, -3110.48, 82.81, 1000);
thisAI->AddWaypoint(4, 1111.72, -3103.03, 82.21, 1000);
thisAI->AddWaypoint(5, 1106.98, -3099.44, 82.18, 1000);
thisAI->AddWaypoint(6, 1103.74, -3103.29, 83.05, 1000);
thisAI->AddWaypoint(7, 1112.55, -3106.56, 82.31, 1000);
thisAI->AddWaypoint(8, 1108.12, -3111.04, 82.99, 1000);
thisAI->AddWaypoint(9, 1109.32, -3100.39, 82.08, 1000);
thisAI->AddWaypoint(10, 1109.32, -3100.39, 82.08, 6000);
thisAI->AddWaypoint(11, 1098.92, -3095.14, 82.97);
thisAI->AddWaypoint(12, 1100.94, -3082.60, 82.83);
thisAI->AddWaypoint(13, 1101.12, -3068.83, 82.53);
thisAI->AddWaypoint(14, 1096.97, -3051.99, 82.50);
thisAI->AddWaypoint(15, 1094.06, -3036.79, 82.70);
thisAI->AddWaypoint(16, 1098.22, -3027.84, 83.79);
thisAI->AddWaypoint(17, 1109.51, -3015.92, 85.73);
thisAI->AddWaypoint(18, 1119.87, -3007.21, 87.08);
thisAI->AddWaypoint(19, 1130.23, -3002.49, 91.27, 5000);
thisAI->AddWaypoint(20, 1130.23, -3002.49, 91.27, 3000);
thisAI->AddWaypoint(21, 1130.23, -3002.49, 91.27, 4000);
thisAI->AddWaypoint(22, 1129.73, -2985.89, 92.46);
thisAI->AddWaypoint(23, 1124.10, -2983.29, 92.81);
thisAI->AddWaypoint(24, 1111.74, -2992.38, 91.59);
thisAI->AddWaypoint(25, 1111.06, -2976.54, 91.81);
thisAI->AddWaypoint(26, 1099.91, -2991.17, 91.67);
thisAI->AddWaypoint(27, 1096.32, -2981.55, 91.73);
thisAI->AddWaypoint(28, 1091.28, -2985.82, 91.74, 4000);
thisAI->AddWaypoint(29, 1091.28, -2985.82, 91.74, 3000);
thisAI->AddWaypoint(30, 1091.28, -2985.82, 91.74, 7000);
thisAI->AddWaypoint(31, 1091.28, -2985.82, 91.74, 3000);
return (CreatureAI*)thisAI;
return (CreatureAI*)thisAI;
}
void AddSC_the_barrens()
@@ -551,9 +551,9 @@ void AddSC_the_barrens()
newscript->GetAI = &GetAI_npc_twiggy_flathead;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_wizzlecrank_shredder";
newscript->GetAI = &GetAI_npc_wizzlecrank_shredderAI;
newscript->pQuestAccept = &QuestAccept_npc_wizzlecrank_shredder;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_wizzlecrank_shredder";
newscript->GetAI = &GetAI_npc_wizzlecrank_shredderAI;
newscript->pQuestAccept = &QuestAccept_npc_wizzlecrank_shredder;
newscript->RegisterSelf();
}
@@ -116,7 +116,7 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
void Aggro(Unit *who)
{
DoZoneInCombat();
DoScriptText(SAY_AGGRO, m_creature);
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
pInstance->SetData(DATA_GURTOGGBLOODBOILEVENT, IN_PROGRESS);
}
@@ -125,8 +125,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -145,7 +145,7 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
std::list<HostilReference *> m_threatlist = m_creature->getThreatManager().getThreatList();
if(!m_threatlist.size()) // He doesn't have anyone in his threatlist, useless to continue
return;
return;
std::list<Unit *> targets;
std::list<HostilReference *>::iterator itr = m_threatlist.begin();
@@ -214,17 +214,17 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
}else FelAcidTimer -= diff;
if(!m_creature->HasAura(SPELL_BERSERK, 0))
{
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
switch(rand()%2)
{
case 0: DoScriptText(SAY_ENRAGE1, m_creature); break;
case 1: DoScriptText(SAY_ENRAGE2, m_creature); break;
}
}else EnrageTimer -= diff;
}
{
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
switch(rand()%2)
{
case 0: DoScriptText(SAY_ENRAGE1, m_creature); break;
case 1: DoScriptText(SAY_ENRAGE2, m_creature); break;
}
}else EnrageTimer -= diff;
}
if(Phase1)
{
@@ -232,8 +232,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
{
DoCast(m_creature->getVictim(), SPELL_BEWILDERING_STRIKE);
float mt_threat = DoGetThreat(m_creature->getVictim());
if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1))
m_creature->AddThreat(target, mt_threat);
if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1))
m_creature->AddThreat(target, mt_threat);
BewilderingStrikeTimer = 20000;
}else BewilderingStrikeTimer -= diff;
@@ -305,8 +305,8 @@ struct TRINITY_DLL_DECL boss_gurtogg_bloodboilAI : public ScriptedAI
switch(rand()%2)
{
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
}
AcidGeyserTimer = 1000;
@@ -94,7 +94,7 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
uint32 FatalAttractionTimer;
uint32 FatalAttractionExplodeTimer;
uint32 ShriekTimer;
uint32 SaberTimer;
uint32 SaberTimer;
uint32 RandomYellTimer;
uint32 EnrageTimer;
uint32 ExplosionCount;
@@ -116,7 +116,7 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
FatalAttractionTimer = 60000;
FatalAttractionExplodeTimer = 70000;
ShriekTimer = 30000;
SaberTimer = 35000;
SaberTimer = 35000;
RandomYellTimer = 70000 + rand()%41 * 1000;
EnrageTimer = 600000;
ExplosionCount = 0;
@@ -130,15 +130,15 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
pInstance->SetData(DATA_MOTHERSHAHRAZEVENT, IN_PROGRESS);
DoZoneInCombat();
DoScriptText(SAY_AGGRO, m_creature);
DoScriptText(SAY_AGGRO, m_creature);
}
void KilledUnit(Unit *victim)
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -230,8 +230,8 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
switch(rand()%2)
{
case 0: DoScriptText(SAY_SPELL2, m_creature); break;
case 1: DoScriptText(SAY_SPELL3, m_creature); break;
case 0: DoScriptText(SAY_SPELL2, m_creature); break;
case 1: DoScriptText(SAY_SPELL3, m_creature); break;
}
FatalAttractionExplodeTimer = 2000;
FatalAttractionTimer = 40000 + rand()%31 * 1000;
@@ -270,7 +270,7 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
ShriekTimer = 25000+rand()%10 * 1000;
}else ShriekTimer -= diff;
if(SaberTimer < diff)
if(SaberTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SABER_LASH);
SaberTimer = 25000+rand()%10 * 1000;
@@ -281,7 +281,7 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
DoScriptText(SAY_ENRAGE, m_creature);
DoScriptText(SAY_ENRAGE, m_creature);
}else EnrageTimer -= diff;
//Random taunts
@@ -289,9 +289,9 @@ struct TRINITY_DLL_DECL boss_shahrazAI : public ScriptedAI
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_TAUNT1, m_creature); break;
case 1: DoScriptText(SAY_TAUNT2, m_creature); break;
case 2: DoScriptText(SAY_TAUNT3, m_creature); break;
case 0: DoScriptText(SAY_TAUNT1, m_creature); break;
case 1: DoScriptText(SAY_TAUNT2, m_creature); break;
case 2: DoScriptText(SAY_TAUNT3, m_creature); break;
}
RandomYellTimer = 60000 + rand()%91 * 1000;
}else RandomYellTimer -= diff;
@@ -270,11 +270,11 @@ struct TRINITY_DLL_DECL boss_reliquary_of_soulsAI : public ScriptedAI
case 5:
if(Phase == 1)
{
DoScriptText(SUFF_SAY_AFTER, Essence);
DoScriptText(SUFF_SAY_AFTER, Essence);
}
else
{
DoScriptText(DESI_SAY_AFTER, Essence);
DoScriptText(DESI_SAY_AFTER, Essence);
}
Essence->SetVisibility(VISIBILITY_OFF);
Essence->setDeathState(DEAD);
@@ -356,7 +356,7 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
void Aggro(Unit *who)
{
DoScriptText(SUFF_SAY_FREED, m_creature);
DoScriptText(SUFF_SAY_FREED, m_creature);
DoZoneInCombat();
m_creature->CastSpell(m_creature, AURA_OF_SUFFERING, true); // linked aura need core support
m_creature->CastSpell(m_creature, ESSENCE_OF_SUFFERING_PASSIVE, true);
@@ -367,9 +367,9 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SUFF_SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SUFF_SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SUFF_SAY_SLAY3, m_creature); break;
case 0: DoScriptText(SUFF_SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SUFF_SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SUFF_SAY_SLAY3, m_creature); break;
}
}
@@ -407,7 +407,7 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
FixateTimer = 5000;
if(!(rand()%16))
{
DoScriptText(SUFF_SAY_AGGRO, m_creature);
DoScriptText(SUFF_SAY_AGGRO, m_creature);
}
}else FixateTimer -= diff;
@@ -415,7 +415,7 @@ struct TRINITY_DLL_DECL boss_essence_of_sufferingAI : public ScriptedAI
{
DoCast(m_creature, SPELL_ENRAGE);
EnrageTimer = 60000;
DoScriptText(SUFF_EMOTE_ENRAGE, m_creature);
DoScriptText(SUFF_EMOTE_ENRAGE, m_creature);
}else EnrageTimer -= diff;
if(SoulDrainTimer < diff)
@@ -453,7 +453,7 @@ struct TRINITY_DLL_DECL boss_essence_of_desireAI : public ScriptedAI
{
damage = 0;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
DoScriptText(SUFF_SAY_RECAP, m_creature);
DoScriptText(SUFF_SAY_RECAP, m_creature);
}
else
{
@@ -474,7 +474,7 @@ struct TRINITY_DLL_DECL boss_essence_of_desireAI : public ScriptedAI
void Aggro(Unit *who)
{
DoScriptText(DESI_SAY_FREED, m_creature);
DoScriptText(DESI_SAY_FREED, m_creature);
DoZoneInCombat();
DoCast(m_creature, AURA_OF_DESIRE, true);
}
@@ -516,7 +516,7 @@ struct TRINITY_DLL_DECL boss_essence_of_desireAI : public ScriptedAI
DeadenTimer = 25000 + rand()%10000;
if(!(rand()%2))
{
DoScriptText(DESI_SAY_SPEC, m_creature);
DoScriptText(DESI_SAY_SPEC, m_creature);
}
}else DeadenTimer -= diff;
@@ -553,11 +553,11 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
void Aggro(Unit *who)
{
switch(rand()%2)
{
case 0: DoScriptText(ANGER_SAY_FREED, m_creature); break;
case 1: DoScriptText(ANGER_SAY_FREED2, m_creature); break;
}
switch(rand()%2)
{
case 0: DoScriptText(ANGER_SAY_FREED, m_creature); break;
case 1: DoScriptText(ANGER_SAY_FREED2, m_creature); break;
}
DoZoneInCombat();
DoCast(m_creature, AURA_OF_ANGER, true);
@@ -565,7 +565,7 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
void JustDied(Unit *victim)
{
DoScriptText(ANGER_SAY_DEATH, m_creature);
DoScriptText(ANGER_SAY_DEATH, m_creature);
}
void KilledUnit(Unit *victim)
@@ -593,7 +593,7 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
{
if(m_creature->getVictim()->GetGUID() != AggroTargetGUID)
{
DoScriptText(ANGER_SAY_BEFORE, m_creature);
DoScriptText(ANGER_SAY_BEFORE, m_creature);
DoCast(m_creature, SPELL_SELF_SEETHE, true);
AggroTargetGUID = m_creature->getVictim()->GetGUID();
}
@@ -606,7 +606,7 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
SoulScreamTimer = 9000 + rand()%2000;
if(!(rand()%3))
{
DoScriptText(ANGER_SAY_SPEC, m_creature);
DoScriptText(ANGER_SAY_SPEC, m_creature);
}
}else SoulScreamTimer -= diff;
@@ -614,7 +614,7 @@ struct TRINITY_DLL_DECL boss_essence_of_angerAI : public ScriptedAI
{
DoCast(m_creature, SPELL_SPITE_TARGET);
SpiteTimer = 30000;
DoScriptText(ANGER_SAY_SPEC, m_creature);
DoScriptText(ANGER_SAY_SPEC, m_creature);
}else SpiteTimer -= diff;
DoMeleeAttackIfReady();
@@ -189,7 +189,7 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
bool IsBanished;
bool HasKilledAkama;
bool reseting;
bool GridSearcherSucceeded;
bool GridSearcherSucceeded;
void Reset()
{
@@ -257,17 +257,17 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
{
Channeler->RemoveCorpse();
Channeler->Respawn();
Channeler->InterruptNonMeleeSpells(true);
Channeler->RemoveAurasDueToSpell(SPELL_SHADE_SOUL_CHANNEL);
Channeler->InterruptNonMeleeSpells(true);
Channeler->RemoveAurasDueToSpell(SPELL_SHADE_SOUL_CHANNEL);
}
if (Channeler->isAlive())
{
if (Channeler->isAlive())
{
Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL, true);
Channeler->CastSpell(m_creature, SPELL_SHADE_SOUL_CHANNEL_2, true);
Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
GridSearcherSucceeded = true;
}
GridSearcherSucceeded = true;
}
}
}
}else error_log("SD2 ERROR: No Channelers are stored in the list. This encounter will not work properly");
@@ -329,8 +329,8 @@ struct TRINITY_DLL_DECL boss_shade_of_akamaAI : public ScriptedAI
{
Spawn->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
Spawn->GetMotionMaster()->MovePoint(0, AGGRO_X, AGGRO_Y, AGGRO_Z);
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);
Spawn->AI()->AttackStart(target);
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);
Spawn->AI()->AttackStart(target);
}
}
}
@@ -152,11 +152,11 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
return;
if(!m_creature->HasAura(SPELL_BERSERK, 0))
{
{
if(BerserkTimer < diff)
DoCast(m_creature, SPELL_BERSERK);
else BerserkTimer -= diff;
}
}
if(SummonFlameTimer < diff)
{
@@ -184,7 +184,7 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
{
DoResetThreat();
m_creature->AddThreat(target, 5000000.0f);
DoScriptText(EMOTE_NEW_TARGET, m_creature);
DoScriptText(EMOTE_NEW_TARGET, m_creature);
SwitchTargetTimer = 10000;
}
}else SwitchTargetTimer -= diff;
@@ -193,11 +193,11 @@ struct TRINITY_DLL_DECL boss_supremusAI : public ScriptedAI
{
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 999, true))
{
if(!target)
target = m_creature->getVictim();
if(!target)
target = m_creature->getVictim();
DoCast(target, SPELL_VOLCANIC_SUMMON);
DoScriptText(EMOTE_GROUND_CRACK, m_creature);
DoScriptText(EMOTE_GROUND_CRACK, m_creature);
SummonVolcanoTimer = 10000;
}
}else SummonVolcanoTimer -= diff;
@@ -306,7 +306,7 @@ void AddSC_boss_supremus()
newscript->GetAI = &GetAI_molten_flame;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="npc_volcano";
newscript->GetAI = &GetAI_npc_volcano;
newscript->RegisterSelf();
@@ -143,7 +143,7 @@ struct TRINITY_DLL_DECL mob_shadowy_constructAI : public ScriptedAI
if(!who || (!who->isAlive()) || (who->GetGUID() == GhostGUID))
return;
ScriptedAI::MoveInLineOfSight(who);
ScriptedAI::MoveInLineOfSight(who);
}
/* Comment it out for now. NOTE TO FUTURE DEV: UNCOMMENT THIS OUT ONLY AFTER MIND CONTROL IS IMPLEMENTED
@@ -265,7 +265,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear(false);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
DoScriptText(SAY_INTRO, m_creature);
DoScriptText(SAY_INTRO, m_creature);
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_TALK);
AggroTargetGUID = who->GetGUID();
Intro = true;
@@ -277,8 +277,8 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -287,7 +287,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_TERONGOREFIENDEVENT, DONE);
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
}
float CalculateRandomLocation(float Loc, uint32 radius)
@@ -375,7 +375,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
DoScriptText(SAY_AGGRO, m_creature);
DoScriptText(SAY_AGGRO, m_creature);
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
Intro = false;
if(AggroTargetGUID)
@@ -417,7 +417,7 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
if(SummonDoomBlossomTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
float X = CalculateRandomLocation(target->GetPositionX(), 20);
float Y = CalculateRandomLocation(target->GetPositionY(), 20);
@@ -445,8 +445,8 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
}
DoCast(target, SPELL_INCINERATE);
IncinerateTimer = 20000 + rand()%31 * 1000;
@@ -482,20 +482,20 @@ struct TRINITY_DLL_DECL boss_teron_gorefiendAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SPELL1, m_creature); break;
case 1: DoScriptText(SAY_SPELL2, m_creature); break;
case 0: DoScriptText(SAY_SPELL1, m_creature); break;
case 1: DoScriptText(SAY_SPELL2, m_creature); break;
}
RandomYellTimer = 50000 + rand()%51 * 1000;
}else RandomYellTimer -= diff;
if(!m_creature->HasAura(SPELL_BERSERK, 0))
{
{
if(EnrageTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
DoScriptText(SAY_ENRAGE, m_creature);
DoScriptText(SAY_ENRAGE, m_creature);
}else EnrageTimer -= diff;
}
}
DoMeleeAttackIfReady();
}
@@ -81,8 +81,8 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -91,7 +91,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
if(pInstance)
pInstance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, DONE);
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
}
void SpellHit(Unit *caster, const SpellEntry *spell)
@@ -143,7 +143,7 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
if(EnrageTimer < diff)
{
DoScriptText(SAY_ENRAGE2, m_creature);
DoScriptText(SAY_ENRAGE2, m_creature);
m_creature->CastSpell(m_creature, SPELL_BERSERK, true);
EnrageTimer = 600000;
}else EnrageTimer -= diff;
@@ -162,8 +162,8 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
case 0: DoScriptText(SAY_SPECIAL1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL2, m_creature); break;
}
SpecialYellTimer = 25000 + (rand()%76)*1000;
}else SpecialYellTimer -= diff;
@@ -181,8 +181,8 @@ struct TRINITY_DLL_DECL boss_najentusAI : public ScriptedAI
switch(rand()%2)
{
case 0: DoScriptText(SAY_NEEDLE1, m_creature); break;
case 1: DoScriptText(SAY_NEEDLE2, m_creature); break;
case 0: DoScriptText(SAY_NEEDLE1, m_creature); break;
case 1: DoScriptText(SAY_NEEDLE2, m_creature); break;
}
ImpalingSpineTimer = 21000;
}
@@ -53,25 +53,25 @@ EndScriptData */
struct CouncilYells
{
int32 entry;
uint32 timer;
int32 entry;
uint32 timer;
};
static CouncilYells CouncilAggro[]=
{
{-1564069, 5000}, // Gathios
{-1564070, 5500}, // Veras
{-1564071, 5000}, // Malande
{-1564072, 0}, // Zerevor
{-1564069, 5000}, // Gathios
{-1564070, 5500}, // Veras
{-1564071, 5000}, // Malande
{-1564072, 0}, // Zerevor
};
// Need to get proper timers for this later
static CouncilYells CouncilEnrage[]=
{
{-1564073, 2000}, // Gathios
{-1564074, 6000}, // Veras
{-1564075, 5000}, // Malande
{-1564076, 0}, // Zerevor
{-1564073, 2000}, // Gathios
{-1564074, 6000}, // Veras
{-1564075, 5000}, // Malande
{-1564076, 0}, // Zerevor
};
// High Nethermancer Zerevor's spells
@@ -159,33 +159,33 @@ struct TRINITY_DLL_DECL mob_blood_elf_council_voice_triggerAI : public ScriptedA
return;
if(AggroYellTimer)
{
{
if(AggroYellTimer <= diff)
{
if(Unit* pMember = Unit::GetUnit(*m_creature, Council[YellCounter]))
{
DoScriptText(CouncilAggro[YellCounter].entry, pMember);
DoScriptText(CouncilAggro[YellCounter].entry, pMember);
AggroYellTimer = CouncilAggro[YellCounter].timer;
}
++YellCounter;
if(YellCounter > 3)
YellCounter = 0; // Reuse for Enrage Yells
}else AggroYellTimer -= diff;
}
}
if(EnrageTimer)
{
{
if(EnrageTimer <= diff)
{
if(Unit* pMember = Unit::GetUnit(*m_creature, Council[YellCounter]))
{
pMember->CastSpell(pMember, SPELL_BERSERK, true);
DoScriptText(CouncilEnrage[YellCounter].entry, pMember);
DoScriptText(CouncilEnrage[YellCounter].entry, pMember);
EnrageTimer = CouncilEnrage[YellCounter].timer;
}
++YellCounter;
}else EnrageTimer -= diff;
}
}
}
};
@@ -451,12 +451,12 @@ struct TRINITY_DLL_DECL boss_gathios_the_shattererAI : public boss_illidari_coun
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_GATH_SLAY, m_creature);
DoScriptText(SAY_GATH_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_GATH_DEATH, m_creature);
DoScriptText(SAY_GATH_DEATH, m_creature);
}
Unit* SelectCouncilMember()
@@ -568,12 +568,12 @@ struct TRINITY_DLL_DECL boss_high_nethermancer_zerevorAI : public boss_illidari_
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_ZERE_SLAY, m_creature);
DoScriptText(SAY_ZERE_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_ZERE_DEATH, m_creature);
DoScriptText(SAY_ZERE_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -656,12 +656,12 @@ struct TRINITY_DLL_DECL boss_lady_malandeAI : public boss_illidari_councilAI
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_MALA_SLAY, m_creature);
DoScriptText(SAY_MALA_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_MALA_DEATH, m_creature);
DoScriptText(SAY_MALA_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -730,12 +730,12 @@ struct TRINITY_DLL_DECL boss_veras_darkshadowAI : public boss_illidari_councilAI
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_VERA_SLAY, m_creature);
DoScriptText(SAY_VERA_SLAY, m_creature);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_VERA_DEATH, m_creature);
DoScriptText(SAY_VERA_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -113,35 +113,35 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("TSCR: Instance Black Temple: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
debug_log("TSCR: Instance Black Temple: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void HandleGameObject(uint64 guid, uint32 state)
{
Player *player = GetPlayerInMap();
void HandleGameObject(uint64 guid, uint32 state)
{
Player *player = GetPlayerInMap();
if (!player || !guid)
{
debug_log("TSCR: Black Temple: HandleGameObject fail");
return;
}
if (!player || !guid)
{
debug_log("TSCR: Black Temple: HandleGameObject fail");
return;
}
if (GameObject *go = GameObject::GetGameObject(*player,guid))
go->SetGoState(state);
}
if (GameObject *go = GameObject::GetGameObject(*player,guid))
go->SetGoState(state);
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
@@ -274,20 +274,20 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
}
if (data == DONE)
{
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << Encounters[0] << " " << Encounters[1] << " "
<< Encounters[2] << " " << Encounters[3] << " " << Encounters[4]
std::ostringstream saveStream;
saveStream << Encounters[0] << " " << Encounters[1] << " "
<< Encounters[2] << " " << Encounters[3] << " " << Encounters[4]
<< " " << Encounters[5] << " " << Encounters[6] << " " << Encounters[7]
<< " " << Encounters[8];
str_data = saveStream.str();
str_data = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
uint32 GetData(uint32 type)
@@ -309,31 +309,31 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
}
const char* Save()
{
return str_data.c_str();
}
{
return str_data.c_str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2]
std::istringstream loadStream(in);
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2]
>> Encounters[3] >> Encounters[4] >> Encounters[5] >> Encounters[6]
>> Encounters[7] >> Encounters[8];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounters[i] == IN_PROGRESS)
Encounters[i] = NOT_STARTED;
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounters[i] == IN_PROGRESS)
Encounters[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_black_temple(Map* map)
File diff suppressed because it is too large Load Diff
@@ -57,244 +57,244 @@ update `instance_template` set `script`='instance_blackrock_depths' where `map`=
struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
{
instance_blackrock_depths(Map *map) : ScriptedInstance(map) {Initialize();};
instance_blackrock_depths(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
std::string str_data;
uint32 Encounter[ENCOUNTERS];
std::string str_data;
uint64 EmperorGUID;
uint64 PhalanxGUID;
uint64 EmperorGUID;
uint64 PhalanxGUID;
uint64 GoArena1GUID;
uint64 GoArena2GUID;
uint64 GoArena3GUID;
uint64 GoArena4GUID;
uint64 GoShadowLockGUID;
uint64 GoShadowMechGUID;
uint64 GoShadowGiantGUID;
uint64 GoShadowDummyGUID;
uint64 GoBarKegGUID;
uint64 GoBarKegTrapGUID;
uint64 GoBarDoorGUID;
uint64 GoTombEnterGUID;
uint64 GoTombExitGUID;
uint64 GoLyceumGUID;
uint64 GoGolemNGUID;
uint64 GoGolemSGUID;
uint64 GoThoneGUID;
uint64 GoArena1GUID;
uint64 GoArena2GUID;
uint64 GoArena3GUID;
uint64 GoArena4GUID;
uint64 GoShadowLockGUID;
uint64 GoShadowMechGUID;
uint64 GoShadowGiantGUID;
uint64 GoShadowDummyGUID;
uint64 GoBarKegGUID;
uint64 GoBarKegTrapGUID;
uint64 GoBarDoorGUID;
uint64 GoTombEnterGUID;
uint64 GoTombExitGUID;
uint64 GoLyceumGUID;
uint64 GoGolemNGUID;
uint64 GoGolemSGUID;
uint64 GoThoneGUID;
uint32 BarAleCount;
uint32 BarAleCount;
void Initialize()
{
EmperorGUID = 0;
PhalanxGUID = 0;
void Initialize()
{
EmperorGUID = 0;
PhalanxGUID = 0;
GoArena1GUID = 0;
GoArena2GUID = 0;
GoArena3GUID = 0;
GoArena4GUID = 0;
GoShadowLockGUID = 0;
GoShadowMechGUID = 0;
GoShadowGiantGUID = 0;
GoShadowDummyGUID = 0;
GoBarKegGUID = 0;
GoBarKegTrapGUID = 0;
GoBarDoorGUID = 0;
GoTombEnterGUID = 0;
GoTombExitGUID = 0;
GoLyceumGUID = 0;
GoGolemNGUID = 0;
GoGolemSGUID = 0;
GoThoneGUID = 0;
GoArena1GUID = 0;
GoArena2GUID = 0;
GoArena3GUID = 0;
GoArena4GUID = 0;
GoShadowLockGUID = 0;
GoShadowMechGUID = 0;
GoShadowGiantGUID = 0;
GoShadowDummyGUID = 0;
GoBarKegGUID = 0;
GoBarKegTrapGUID = 0;
GoBarDoorGUID = 0;
GoTombEnterGUID = 0;
GoTombExitGUID = 0;
GoLyceumGUID = 0;
GoGolemNGUID = 0;
GoGolemSGUID = 0;
GoThoneGUID = 0;
BarAleCount = 0;
BarAleCount = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
}
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("SD2: Instance Blackrock Depths: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
debug_log("SD2: Instance Blackrock Depths: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
switch(creature->GetEntry())
{
case C_EMPEROR: EmperorGUID = creature->GetGUID(); break;
case C_PHALANX: PhalanxGUID = creature->GetGUID(); break;
}
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
switch(creature->GetEntry())
{
case C_EMPEROR: EmperorGUID = creature->GetGUID(); break;
case C_PHALANX: PhalanxGUID = creature->GetGUID(); break;
}
}
void OnObjectCreate(GameObject* go)
{
switch(go->GetEntry())
{
case GO_ARENA1: GoArena1GUID = go->GetGUID(); break;
case GO_ARENA2: GoArena2GUID = go->GetGUID(); break;
case GO_ARENA3: GoArena3GUID = go->GetGUID(); break;
case GO_ARENA4: GoArena4GUID = go->GetGUID(); break;
case GO_SHADOW_LOCK: GoShadowLockGUID = go->GetGUID(); break;
case GO_SHADOW_MECHANISM: GoShadowMechGUID = go->GetGUID(); break;
case GO_SHADOW_GIANT_DOOR: GoShadowGiantGUID = go->GetGUID(); break;
case GO_SHADOW_DUMMY: GoShadowDummyGUID = go->GetGUID(); break;
case GO_BAR_KEG_SHOT: GoBarKegGUID = go->GetGUID(); break;
case GO_BAR_KEG_TRAP: GoBarKegTrapGUID = go->GetGUID(); break;
case GO_BAR_DOOR: GoBarDoorGUID = go->GetGUID(); break;
case GO_TOMB_ENTER: GoTombEnterGUID = go->GetGUID(); break;
case GO_TOMB_EXIT: GoTombExitGUID = go->GetGUID(); break;
case GO_LYCEUM: GoLyceumGUID = go->GetGUID(); break;
case GO_GOLEM_ROOM_N: GoGolemNGUID = go->GetGUID(); break;
case GO_GOLEM_ROOM_S: GoGolemSGUID = go->GetGUID(); break;
case GO_THONE_ROOM: GoThoneGUID = go->GetGUID(); break;
}
}
void OnObjectCreate(GameObject* go)
{
switch(go->GetEntry())
{
case GO_ARENA1: GoArena1GUID = go->GetGUID(); break;
case GO_ARENA2: GoArena2GUID = go->GetGUID(); break;
case GO_ARENA3: GoArena3GUID = go->GetGUID(); break;
case GO_ARENA4: GoArena4GUID = go->GetGUID(); break;
case GO_SHADOW_LOCK: GoShadowLockGUID = go->GetGUID(); break;
case GO_SHADOW_MECHANISM: GoShadowMechGUID = go->GetGUID(); break;
case GO_SHADOW_GIANT_DOOR: GoShadowGiantGUID = go->GetGUID(); break;
case GO_SHADOW_DUMMY: GoShadowDummyGUID = go->GetGUID(); break;
case GO_BAR_KEG_SHOT: GoBarKegGUID = go->GetGUID(); break;
case GO_BAR_KEG_TRAP: GoBarKegTrapGUID = go->GetGUID(); break;
case GO_BAR_DOOR: GoBarDoorGUID = go->GetGUID(); break;
case GO_TOMB_ENTER: GoTombEnterGUID = go->GetGUID(); break;
case GO_TOMB_EXIT: GoTombExitGUID = go->GetGUID(); break;
case GO_LYCEUM: GoLyceumGUID = go->GetGUID(); break;
case GO_GOLEM_ROOM_N: GoGolemNGUID = go->GetGUID(); break;
case GO_GOLEM_ROOM_S: GoGolemSGUID = go->GetGUID(); break;
case GO_THONE_ROOM: GoThoneGUID = go->GetGUID(); break;
}
}
void SetData(uint32 type, uint32 data)
{
Player *player = GetPlayerInMap();
void SetData(uint32 type, uint32 data)
{
Player *player = GetPlayerInMap();
if (!player)
{
debug_log("SD2: Instance Blackrock Depths: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
if (!player)
{
debug_log("SD2: Instance Blackrock Depths: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
debug_log("SD2: Instance Blackrock Depths: SetData update (Type: %u Data %u)", type, data);
debug_log("SD2: Instance Blackrock Depths: SetData update (Type: %u Data %u)", type, data);
switch(type)
{
case TYPE_RING_OF_LAW:
Encounter[0] = data;
break;
case TYPE_VAULT:
Encounter[1] = data;
break;
case TYPE_BAR:
if (data == SPECIAL)
++BarAleCount;
else
Encounter[2] = data;
break;
case TYPE_TOMB_OF_SEVEN:
Encounter[3] = data;
break;
case TYPE_LYCEUM:
Encounter[4] = data;
break;
case TYPE_IRON_HALL:
Encounter[5] = data;
break;
}
switch(type)
{
case TYPE_RING_OF_LAW:
Encounter[0] = data;
break;
case TYPE_VAULT:
Encounter[1] = data;
break;
case TYPE_BAR:
if (data == SPECIAL)
++BarAleCount;
else
Encounter[2] = data;
break;
case TYPE_TOMB_OF_SEVEN:
Encounter[3] = data;
break;
case TYPE_LYCEUM:
Encounter[4] = data;
break;
case TYPE_IRON_HALL:
Encounter[5] = data;
break;
}
if (data == DONE)
{
OUT_SAVE_INST_DATA;
if (data == DONE)
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << Encounter[0] << " " << Encounter[1] << " " << Encounter[2] << " "
<< Encounter[3] << " " << Encounter[4] << " " << Encounter[5];
std::ostringstream saveStream;
saveStream << Encounter[0] << " " << Encounter[1] << " " << Encounter[2] << " "
<< Encounter[3] << " " << Encounter[4] << " " << Encounter[5];
str_data = saveStream.str();
str_data = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
uint32 GetData(uint32 type)
{
switch(type)
{
case TYPE_RING_OF_LAW:
return Encounter[0];
case TYPE_VAULT:
return Encounter[1];
case TYPE_BAR:
if (Encounter[2] == IN_PROGRESS && BarAleCount == 3)
return SPECIAL;
else
return Encounter[2];
case TYPE_TOMB_OF_SEVEN:
return Encounter[3];
case TYPE_LYCEUM:
return Encounter[4];
case TYPE_IRON_HALL:
return Encounter[5];
}
return 0;
}
uint32 GetData(uint32 type)
{
switch(type)
{
case TYPE_RING_OF_LAW:
return Encounter[0];
case TYPE_VAULT:
return Encounter[1];
case TYPE_BAR:
if (Encounter[2] == IN_PROGRESS && BarAleCount == 3)
return SPECIAL;
else
return Encounter[2];
case TYPE_TOMB_OF_SEVEN:
return Encounter[3];
case TYPE_LYCEUM:
return Encounter[4];
case TYPE_IRON_HALL:
return Encounter[5];
}
return 0;
}
uint64 GetData64(uint32 data)
{
switch(data)
{
case DATA_EMPEROR:
return EmperorGUID;
case DATA_PHALANX:
return PhalanxGUID;
case DATA_ARENA1:
return GoArena1GUID;
case DATA_ARENA2:
return GoArena2GUID;
case DATA_ARENA3:
return GoArena3GUID;
case DATA_ARENA4:
return GoArena4GUID;
case DATA_GO_BAR_KEG:
return GoBarKegGUID;
case DATA_GO_BAR_KEG_TRAP:
return GoBarKegTrapGUID;
case DATA_GO_BAR_DOOR:
return GoBarDoorGUID;
}
return 0;
}
uint64 GetData64(uint32 data)
{
switch(data)
{
case DATA_EMPEROR:
return EmperorGUID;
case DATA_PHALANX:
return PhalanxGUID;
case DATA_ARENA1:
return GoArena1GUID;
case DATA_ARENA2:
return GoArena2GUID;
case DATA_ARENA3:
return GoArena3GUID;
case DATA_ARENA4:
return GoArena4GUID;
case DATA_GO_BAR_KEG:
return GoBarKegGUID;
case DATA_GO_BAR_KEG_TRAP:
return GoBarKegTrapGUID;
case DATA_GO_BAR_DOOR:
return GoBarDoorGUID;
}
return 0;
}
const char* Save()
{
return str_data.c_str();
}
const char* Save()
{
return str_data.c_str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> Encounter[0] >> Encounter[1] >> Encounter[2] >> Encounter[3]
>> Encounter[4] >> Encounter[5];
std::istringstream loadStream(in);
loadStream >> Encounter[0] >> Encounter[1] >> Encounter[2] >> Encounter[3]
>> Encounter[4] >> Encounter[5];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounter[i] == IN_PROGRESS)
Encounter[i] = NOT_STARTED;
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounter[i] == IN_PROGRESS)
Encounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_blackrock_depths(Map* map)
{
return new instance_blackrock_depths(map);
return new instance_blackrock_depths(map);
}
void AddSC_instance_blackrock_depths()
@@ -74,7 +74,7 @@ struct TRINITY_DLL_DECL boss_flamegorAI : public ScriptedAI
//Frenzy_Timer
if (Frenzy_Timer < diff)
{
DoScriptText(EMOTE_FRENZY, m_creature);
DoScriptText(EMOTE_FRENZY, m_creature);
DoCast(m_creature,SPELL_FRENZY);
Frenzy_Timer = 8000 + (rand()%2000);
}else Frenzy_Timer -= diff;
@@ -40,15 +40,15 @@ EndScriptData */
struct TRINITY_DLL_DECL boss_aeonusAI : public ScriptedAI
{
boss_aeonusAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
boss_aeonusAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
ScriptedInstance *pInstance;
bool HeroicMode;
ScriptedInstance *pInstance;
bool HeroicMode;
uint32 SandBreath_Timer;
uint32 TimeStop_Timer;
@@ -66,28 +66,28 @@ struct TRINITY_DLL_DECL boss_aeonusAI : public ScriptedAI
DoScriptText(SAY_AGGRO, m_creature);
}
void MoveInLineOfSight(Unit *who)
{
//Despawn Time Keeper
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
{
if (m_creature->IsWithinDistInMap(who,20.0f))
{
DoScriptText(SAY_BANISH, m_creature);
m_creature->DealDamage(who, who->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
void MoveInLineOfSight(Unit *who)
{
//Despawn Time Keeper
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
{
if (m_creature->IsWithinDistInMap(who,20.0f))
{
DoScriptText(SAY_BANISH, m_creature);
m_creature->DealDamage(who, who->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
ScriptedAI::MoveInLineOfSight(who);
}
ScriptedAI::MoveInLineOfSight(who);
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
if (pInstance)
{
pInstance->SetData(TYPE_RIFT,DONE);
pInstance->SetData(TYPE_RIFT,DONE);
pInstance->SetData(TYPE_MEDIVH,DONE);//FIXME: later should be removed
}
}
@@ -110,7 +110,7 @@ struct TRINITY_DLL_DECL boss_aeonusAI : public ScriptedAI
//Sand Breath
if (SandBreath_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SAND_BREATH);
DoCast(m_creature->getVictim(), SPELL_SAND_BREATH);
SandBreath_Timer = 30000;
}else SandBreath_Timer -= diff;
@@ -124,7 +124,7 @@ struct TRINITY_DLL_DECL boss_aeonusAI : public ScriptedAI
//Frenzy
if (Frenzy_Timer < diff)
{
DoScriptText(EMOTE_FRENZY, m_creature);
DoScriptText(EMOTE_FRENZY, m_creature);
DoCast(m_creature, SPELL_ENRAGE);
Frenzy_Timer = 120000;
}else Frenzy_Timer -= diff;
@@ -41,14 +41,14 @@ EndScriptData */
struct TRINITY_DLL_DECL boss_chrono_lord_dejaAI : public ScriptedAI
{
boss_chrono_lord_dejaAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
ScriptedInstance *pInstance;
bool HeroicMode;
ScriptedInstance *pInstance;
bool HeroicMode;
uint32 ArcaneBlast_Timer;
uint32 TimeLapse_Timer;
@@ -64,20 +64,20 @@ struct TRINITY_DLL_DECL boss_chrono_lord_dejaAI : public ScriptedAI
DoScriptText(SAY_AGGRO, m_creature);
}
void MoveInLineOfSight(Unit *who)
{
//Despawn Time Keeper
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
{
if (m_creature->IsWithinDistInMap(who,20.0f))
{
DoScriptText(SAY_BANISH, m_creature);
m_creature->DealDamage(who, who->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
void MoveInLineOfSight(Unit *who)
{
//Despawn Time Keeper
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
{
if (m_creature->IsWithinDistInMap(who,20.0f))
{
DoScriptText(SAY_BANISH, m_creature);
m_creature->DealDamage(who, who->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
ScriptedAI::MoveInLineOfSight(who);
}
ScriptedAI::MoveInLineOfSight(who);
}
void KilledUnit(Unit *victim)
{
@@ -92,8 +92,8 @@ struct TRINITY_DLL_DECL boss_chrono_lord_dejaAI : public ScriptedAI
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(TYPE_RIFT,SPECIAL);
if (pInstance)
pInstance->SetData(TYPE_RIFT,SPECIAL);
}
void UpdateAI(const uint32 diff)
@@ -39,15 +39,15 @@ EndScriptData */
struct TRINITY_DLL_DECL boss_temporusAI : public ScriptedAI
{
boss_temporusAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
boss_temporusAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
}
ScriptedInstance *pInstance;
bool HeroicMode;
ScriptedInstance *pInstance;
bool HeroicMode;
uint32 Haste_Timer;
uint32 SpellReflection_Timer;
@@ -79,8 +79,8 @@ struct TRINITY_DLL_DECL boss_temporusAI : public ScriptedAI
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(TYPE_RIFT,SPECIAL);
if (pInstance)
pInstance->SetData(TYPE_RIFT,SPECIAL);
}
void MoveInLineOfSight(Unit *who)
@@ -88,9 +88,9 @@ struct TRINITY_DLL_DECL boss_temporusAI : public ScriptedAI
//Despawn Time Keeper
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == C_TIME_KEEPER)
{
if (m_creature->IsWithinDistInMap(who,20.0f))
if (m_creature->IsWithinDistInMap(who,20.0f))
{
DoScriptText(SAY_BANISH, m_creature);
DoScriptText(SAY_BANISH, m_creature);
m_creature->DealDamage(who, who->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
@@ -56,293 +56,293 @@ EndContentData */
struct TRINITY_DLL_DECL npc_medivh_bmAI : public ScriptedAI
{
npc_medivh_bmAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
npc_medivh_bmAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
ScriptedInstance *pInstance;
uint32 SpellCorrupt_Timer;
uint32 Check_Timer;
uint32 SpellCorrupt_Timer;
uint32 Check_Timer;
bool Life75;
bool Life50;
bool Life25;
bool Life75;
bool Life50;
bool Life25;
void Reset()
{
SpellCorrupt_Timer = 0;
void Reset()
{
SpellCorrupt_Timer = 0;
if (!pInstance)
return;
if (!pInstance)
return;
if (pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
m_creature->CastSpell(m_creature,SPELL_CHANNEL,true);
else if (m_creature->HasAura(SPELL_CHANNEL,0))
m_creature->RemoveAura(SPELL_CHANNEL,0);
if (pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
m_creature->CastSpell(m_creature,SPELL_CHANNEL,true);
else if (m_creature->HasAura(SPELL_CHANNEL,0))
m_creature->RemoveAura(SPELL_CHANNEL,0);
m_creature->CastSpell(m_creature,SPELL_PORTAL_RUNE,true);
}
m_creature->CastSpell(m_creature,SPELL_PORTAL_RUNE,true);
}
void MoveInLineOfSight(Unit *who)
{
if (!pInstance)
return;
void MoveInLineOfSight(Unit *who)
{
if (!pInstance)
return;
if (who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(who, 10.0f))
{
if (pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
return;
if (who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(who, 10.0f))
{
if (pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
return;
DoScriptText(SAY_INTRO, m_creature);
pInstance->SetData(TYPE_MEDIVH,IN_PROGRESS);
m_creature->CastSpell(m_creature,SPELL_CHANNEL,false);
Check_Timer = 5000;
}
else if (who->GetTypeId() == TYPEID_UNIT && m_creature->IsWithinDistInMap(who, 15.0f))
{
if (pInstance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
return;
DoScriptText(SAY_INTRO, m_creature);
pInstance->SetData(TYPE_MEDIVH,IN_PROGRESS);
m_creature->CastSpell(m_creature,SPELL_CHANNEL,false);
Check_Timer = 5000;
}
else if (who->GetTypeId() == TYPEID_UNIT && m_creature->IsWithinDistInMap(who, 15.0f))
{
if (pInstance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
return;
uint32 entry = who->GetEntry();
if (entry == C_ASSAS || entry == C_WHELP || entry == C_CHRON || entry == C_EXECU || entry == C_VANQU)
{
who->StopMoving();
who->CastSpell(m_creature,SPELL_CORRUPT,false);
}
else if (entry == C_AEONUS)
{
who->StopMoving();
who->CastSpell(m_creature,SPELL_CORRUPT_AEONUS,false);
}
}
}
uint32 entry = who->GetEntry();
if (entry == C_ASSAS || entry == C_WHELP || entry == C_CHRON || entry == C_EXECU || entry == C_VANQU)
{
who->StopMoving();
who->CastSpell(m_creature,SPELL_CORRUPT,false);
}
else if (entry == C_AEONUS)
{
who->StopMoving();
who->CastSpell(m_creature,SPELL_CORRUPT_AEONUS,false);
}
}
}
void AttackStart(Unit *who)
{
//if (pInstance && pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
//return;
void AttackStart(Unit *who)
{
//if (pInstance && pInstance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
//return;
//ScriptedAI::AttackStart(who);
}
//ScriptedAI::AttackStart(who);
}
void Aggro(Unit *who) {}
void Aggro(Unit *who) {}
void SpellHit(Unit* caster, const SpellEntry* spell)
{
if (SpellCorrupt_Timer)
return;
void SpellHit(Unit* caster, const SpellEntry* spell)
{
if (SpellCorrupt_Timer)
return;
if (spell->Id == SPELL_CORRUPT_AEONUS)
SpellCorrupt_Timer = 1000;
if (spell->Id == SPELL_CORRUPT_AEONUS)
SpellCorrupt_Timer = 1000;
if (spell->Id == SPELL_CORRUPT)
SpellCorrupt_Timer = 3000;
}
if (spell->Id == SPELL_CORRUPT)
SpellCorrupt_Timer = 3000;
}
void JustDied(Unit* Killer)
{
if (Killer->GetEntry() == m_creature->GetEntry())
return;
void JustDied(Unit* Killer)
{
if (Killer->GetEntry() == m_creature->GetEntry())
return;
DoScriptText(SAY_DEATH, m_creature);
}
DoScriptText(SAY_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
if (SpellCorrupt_Timer)
{
if (SpellCorrupt_Timer < diff)
{
pInstance->SetData(TYPE_MEDIVH,SPECIAL);
if (SpellCorrupt_Timer)
{
if (SpellCorrupt_Timer < diff)
{
pInstance->SetData(TYPE_MEDIVH,SPECIAL);
if (m_creature->HasAura(SPELL_CORRUPT_AEONUS,0))
SpellCorrupt_Timer = 1000;
else if (m_creature->HasAura(SPELL_CORRUPT,0))
SpellCorrupt_Timer = 3000;
else
SpellCorrupt_Timer = 0;
}else SpellCorrupt_Timer -= diff;
}
if (m_creature->HasAura(SPELL_CORRUPT_AEONUS,0))
SpellCorrupt_Timer = 1000;
else if (m_creature->HasAura(SPELL_CORRUPT,0))
SpellCorrupt_Timer = 3000;
else
SpellCorrupt_Timer = 0;
}else SpellCorrupt_Timer -= diff;
}
if (Check_Timer)
{
if (Check_Timer < diff)
{
uint32 pct = pInstance->GetData(DATA_SHIELD);
if (Check_Timer)
{
if (Check_Timer < diff)
{
uint32 pct = pInstance->GetData(DATA_SHIELD);
Check_Timer = 5000;
Check_Timer = 5000;
if (Life25 && pct <= 25)
{
DoScriptText(SAY_WEAK25, m_creature);
Life25 = false;
Check_Timer = 0;
}
else if (Life50 && pct <= 50)
{
DoScriptText(SAY_WEAK50, m_creature);
Life50 = false;
}
else if (Life75 && pct <= 75)
{
DoScriptText(SAY_WEAK75, m_creature);
Life75 = false;
}
if (Life25 && pct <= 25)
{
DoScriptText(SAY_WEAK25, m_creature);
Life25 = false;
Check_Timer = 0;
}
else if (Life50 && pct <= 50)
{
DoScriptText(SAY_WEAK50, m_creature);
Life50 = false;
}
else if (Life75 && pct <= 75)
{
DoScriptText(SAY_WEAK75, m_creature);
Life75 = false;
}
//if we reach this it means event was running but at some point reset.
if (pInstance->GetData(TYPE_MEDIVH) == NOT_STARTED)
{
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
m_creature->Respawn();
return;
}
//if we reach this it means event was running but at some point reset.
if (pInstance->GetData(TYPE_MEDIVH) == NOT_STARTED)
{
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
m_creature->Respawn();
return;
}
if (pInstance->GetData(TYPE_MEDIVH) == DONE)
{
DoScriptText(SAY_WIN, m_creature);
Check_Timer = 0;
//TODO: start the post-event here
}
}else Check_Timer -= diff;
}
if (pInstance->GetData(TYPE_MEDIVH) == DONE)
{
DoScriptText(SAY_WIN, m_creature);
Check_Timer = 0;
//TODO: start the post-event here
}
}else Check_Timer -= diff;
}
//if (!UpdateVictim())
//return;
//if (!UpdateVictim())
//return;
//DoMeleeAttackIfReady();
}
//DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_medivh_bm(Creature *_Creature)
{
return new npc_medivh_bmAI (_Creature);
return new npc_medivh_bmAI (_Creature);
}
struct Wave
{
uint32 PortalMob[4]; //spawns for portal waves (in order)
uint32 PortalMob[4]; //spawns for portal waves (in order)
};
static Wave PortalWaves[]=
{
{C_ASSAS, C_WHELP, C_CHRON, 0},
{C_EXECU, C_CHRON, C_WHELP, C_ASSAS},
{C_EXECU, C_VANQU, C_CHRON, C_ASSAS}
{C_ASSAS, C_WHELP, C_CHRON, 0},
{C_EXECU, C_CHRON, C_WHELP, C_ASSAS},
{C_EXECU, C_VANQU, C_CHRON, C_ASSAS}
};
struct TRINITY_DLL_DECL npc_time_riftAI : public ScriptedAI
{
npc_time_riftAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
npc_time_riftAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
ScriptedInstance *pInstance;
uint32 TimeRiftWave_Timer;
uint8 mRiftWaveCount;
uint8 mPortalCount;
uint8 mWaveId;
uint32 TimeRiftWave_Timer;
uint8 mRiftWaveCount;
uint8 mPortalCount;
uint8 mWaveId;
void Reset()
{
void Reset()
{
TimeRiftWave_Timer = 15000;
mRiftWaveCount = 0;
TimeRiftWave_Timer = 15000;
mRiftWaveCount = 0;
if (!pInstance)
return;
if (!pInstance)
return;
mPortalCount = pInstance->GetData(DATA_PORTAL_COUNT);
mPortalCount = pInstance->GetData(DATA_PORTAL_COUNT);
if (mPortalCount < 6)
mWaveId = 0;
else if (mPortalCount > 12)
mWaveId = 2;
else mWaveId = 1;
if (mPortalCount < 6)
mWaveId = 0;
else if (mPortalCount > 12)
mWaveId = 2;
else mWaveId = 1;
}
void Aggro(Unit *who) {}
}
void Aggro(Unit *who) {}
void DoSummonAtRift(uint32 creature_entry)
{
if (!creature_entry)
return;
void DoSummonAtRift(uint32 creature_entry)
{
if (!creature_entry)
return;
if (pInstance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
{
m_creature->InterruptNonMeleeSpells(true);
m_creature->RemoveAllAuras();
return;
}
if (pInstance->GetData(TYPE_MEDIVH) != IN_PROGRESS)
{
m_creature->InterruptNonMeleeSpells(true);
m_creature->RemoveAllAuras();
return;
}
float x,y,z;
m_creature->GetRandomPoint(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),10.0f,x,y,z);
float x,y,z;
m_creature->GetRandomPoint(m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(),10.0f,x,y,z);
//normalize Z-level if we can, if rift is not at ground level.
z = std::max(m_creature->GetMap()->GetHeight(x, y, MAX_HEIGHT), m_creature->GetMap()->GetWaterLevel(x, y));
//normalize Z-level if we can, if rift is not at ground level.
z = std::max(m_creature->GetMap()->GetHeight(x, y, MAX_HEIGHT), m_creature->GetMap()->GetWaterLevel(x, y));
Unit *Summon = m_creature->SummonCreature(creature_entry,x,y,z,m_creature->GetOrientation(),
TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
Unit *Summon = m_creature->SummonCreature(creature_entry,x,y,z,m_creature->GetOrientation(),
TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
if (Summon)
{
if (Unit *temp = Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_MEDIVH)))
Summon->AddThreat(temp,0.0f);
}
}
if (Summon)
{
if (Unit *temp = Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_MEDIVH)))
Summon->AddThreat(temp,0.0f);
}
}
void DoSelectSummon()
{
uint32 entry = 0;
void DoSelectSummon()
{
uint32 entry = 0;
if ((mRiftWaveCount > 2 && mWaveId < 1) || mRiftWaveCount > 3)
mRiftWaveCount = 0;
if ((mRiftWaveCount > 2 && mWaveId < 1) || mRiftWaveCount > 3)
mRiftWaveCount = 0;
entry = PortalWaves[mWaveId].PortalMob[mRiftWaveCount];
debug_log("SD2: npc_time_rift: summoning wave creature (Wave %u, Entry %u).",mRiftWaveCount,entry);
entry = PortalWaves[mWaveId].PortalMob[mRiftWaveCount];
debug_log("SD2: npc_time_rift: summoning wave creature (Wave %u, Entry %u).",mRiftWaveCount,entry);
++mRiftWaveCount;
++mRiftWaveCount;
if (entry == C_WHELP)
{
for(uint8 i = 0; i < 3; i++)
DoSummonAtRift(entry);
}else DoSummonAtRift(entry);
}
if (entry == C_WHELP)
{
for(uint8 i = 0; i < 3; i++)
DoSummonAtRift(entry);
}else DoSummonAtRift(entry);
}
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
if (TimeRiftWave_Timer < diff)
{
DoSelectSummon();
TimeRiftWave_Timer = 15000;
}else TimeRiftWave_Timer -= diff;
if (TimeRiftWave_Timer < diff)
{
DoSelectSummon();
TimeRiftWave_Timer = 15000;
}else TimeRiftWave_Timer -= diff;
if (m_creature->IsNonMeleeSpellCasted(false))
return;
if (m_creature->IsNonMeleeSpellCasted(false))
return;
debug_log("SD2: npc_time_rift: not casting anylonger, i need to die.");
m_creature->setDeathState(JUST_DIED);
debug_log("SD2: npc_time_rift: not casting anylonger, i need to die.");
m_creature->setDeathState(JUST_DIED);
pInstance->SetData(TYPE_RIFT,SPECIAL);
}
pInstance->SetData(TYPE_RIFT,SPECIAL);
}
};
CreatureAI* GetAI_npc_time_rift(Creature *_Creature)
{
return new npc_time_riftAI (_Creature);
return new npc_time_riftAI (_Creature);
}
#define SAY_SAAT_WELCOME -1269019
@@ -402,4 +402,4 @@ void AddSC_dark_portal()
newscript->pGossipHello = &GossipHello_npc_saat;
newscript->pGossipSelect = &GossipSelect_npc_saat;
newscript->RegisterSelf();
}
}
@@ -379,4 +379,4 @@ void AddSC_instance_dark_portal()
newscript->Name = "instance_dark_portal";
newscript->GetInstanceData = &GetInstanceData_instance_dark_portal;
newscript->RegisterSelf();
}
}
@@ -249,7 +249,7 @@ struct TRINITY_DLL_DECL mob_doomfire_targettingAI : public ScriptedAI
|| who->GetEntry() == CREATURE_DOOMFIRE || who->GetEntry() == CREATURE_DOOMFIRE_TARGETING || !who->isTargetableForAttack())
return;
m_creature->AddThreat(who, 0.0f);
m_creature->AddThreat(who, 0.0f);
}
void DamageTaken(Unit *done_by, uint32 &damage) { damage = 0; }
@@ -397,9 +397,9 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
if(victim && (victim->GetTypeId() == TYPEID_PLAYER))
@@ -433,7 +433,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
void JustDied(Unit *victim)
{
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_ARCHIMONDEEVENT, DONE);
@@ -493,9 +493,9 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
Doomfire->AI()->AttackStart(target);
if(rand()%2 == 0)
DoScriptText(SAY_DOOMFIRE1, m_creature);
else
DoScriptText(SAY_DOOMFIRE2, m_creature);
DoScriptText(SAY_DOOMFIRE1, m_creature);
else
DoScriptText(SAY_DOOMFIRE2, m_creature);
}
}
@@ -589,13 +589,13 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
Enraged = true;
DoScriptText(SAY_ENRAGE, m_creature);
DoScriptText(SAY_ENRAGE, m_creature);
}
}else EnrageTimer -= diff;
if(CheckDistanceTimer < diff)
{
// To simplify the check, we simply summon a creature in the location and then check how far we are from the creature
{
// To simplify the check, we simply summon a creature in the location and then check how far we are from the creature
Creature* Check = m_creature->SummonCreature(CREATURE_CHANNEL_TARGET, NORDRASSIL_X, NORDRASSIL_Y, NORDRASSIL_Z, 0, TEMPSUMMON_TIMED_DESPAWN, 2000);
if(Check)
{
@@ -605,7 +605,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
Enraged = true;
DoScriptText(SAY_ENRAGE, m_creature);
DoScriptText(SAY_ENRAGE, m_creature);
}
}
CheckDistanceTimer = 5000;
@@ -618,7 +618,7 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
{
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
//all members of raid must get this buff
//all members of raid must get this buff
DoCast(m_creature->getVictim(), SPELL_PROTECTION_OF_ELUNE);
HasProtected = true;
Enraged = true;
@@ -666,9 +666,9 @@ struct TRINITY_DLL_DECL boss_archimondeAI : public ScriptedAI
if(AirBurstTimer < diff)
{
if(rand()%2 == 0)
DoScriptText(SAY_AIR_BURST1, m_creature);
else
DoScriptText(SAY_AIR_BURST2, m_creature);
DoScriptText(SAY_AIR_BURST1, m_creature);
else
DoScriptText(SAY_AIR_BURST2, m_creature);
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_AIR_BURST);
@@ -134,13 +134,13 @@ bool GossipHello_npc_thrall(Player *player, Creature *_Creature)
{
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
if (ai->EventBegun)
return false;
if (ai->EventBegun)
return false;
uint32 AnetheronEvent = ai->GetInstanceData(DATA_ANETHERONEVENT);
// Only let them start the Horde phases if Anetheron is dead.
if (AnetheronEvent == DONE)
// Only let them start the Horde phases if Anetheron is dead.
if (AnetheronEvent == DONE)
{
uint32 KazrogalEvent = ai->GetInstanceData(DATA_KAZROGALEVENT);
uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
@@ -187,37 +187,37 @@ bool GossipSelect_npc_thrall(Player *player, Creature *_Creature, uint32 sender,
CreatureAI* GetAI_npc_tyrande_whisperwind(Creature *_Creature)
{
hyjalAI* ai = new hyjalAI(_Creature);
ai->Reset();
ai->EnterEvadeMode();
hyjalAI* ai = new hyjalAI(_Creature);
ai->Reset();
ai->EnterEvadeMode();
return ai;
return ai;
}
bool GossipHello_npc_tyrande_whisperwind(Player* player, Creature* _Creature)
{
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
hyjalAI* ai = ((hyjalAI*)_Creature->AI());
uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT);
// Only let them get item if Azgalor is dead.
if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS,1))
player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
return true;
// Only let them get item if Azgalor is dead.
if (AzgalorEvent == DONE && !player->HasItemCount(ITEM_TEAR_OF_GODDESS,1))
player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM_TYRANDE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
return true;
}
bool GossipSelect_npc_tyrande_whisperwind(Player *player, Creature *_Creature, uint32 sender, uint32 action)
{
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);
}
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
}
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);
}
player->SEND_GOSSIP_MENU(907, _Creature->GetGUID());
}
return true;
}
@@ -244,6 +244,6 @@ void AddSC_hyjal()
newscript->Name = "npc_tyrande_whisperwind";
newscript->pGossipHello = &GossipHello_npc_tyrande_whisperwind;
newscript->pGossipSelect = &GossipSelect_npc_tyrande_whisperwind;
newscript->GetAI = &GetAI_npc_tyrande_whisperwind;
newscript->GetAI = &GetAI_npc_tyrande_whisperwind;
newscript->RegisterSelf();
}
@@ -46,7 +46,7 @@ float HordeBase[4][3]=
float AttackArea[2][3]=
{
{5042.9189, -1776.2562, 1323.0621}, // Alliance
{5510.4815, -2676.7112, 1480.4314} // Horde
{5510.4815, -2676.7112, 1480.4314} // Horde
};
hyjalAI::hyjalAI(Creature *c) : ScriptedAI(c)
@@ -78,9 +78,9 @@ void hyjalAI::Reset()
DoCast(m_creature, SPELL_BRILLIANCE_AURA, true);
break;
case 17852:
Faction = 1;
break;
case 17852:
Faction = 1;
break;
}
//Bools
@@ -89,7 +89,7 @@ void hyjalAI::Reset()
SecondBossDead = false;
Summon = false;
bRetreat = false;
Debug = false;
Debug = false;
//Flags
m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
@@ -132,7 +132,7 @@ void hyjalAI::EnterEvadeMode()
if(m_creature->isAlive())
m_creature->GetMotionMaster()->MoveTargetedHome();
m_creature->SetLootRecipient(NULL);
m_creature->SetLootRecipient(NULL);
InCombat = false;
}
@@ -161,12 +161,12 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3])
Creature* pCreature = m_creature->SummonCreature(entry, SpawnLoc[0], SpawnLoc[1], SpawnLoc[2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000);
if(pCreature)
{
// Increment Enemy Count to be used in World States and instance script
++EnemyCount;
// 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->AddThreat(m_creature, 0.0f);
DoZoneInCombat(pCreature);
// Check if creature is a boss.
@@ -181,9 +181,9 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3])
void hyjalAI::SummonNextWave(Wave wave[18], uint32 Count, float Base[4][3])
{
// 1 in 4 chance we give a rally yell. Not sure if the chance is offilike.
if (rand()%4 == 0)
Talk(RALLY);
// 1 in 4 chance we give a rally yell. Not sure if the chance is offilike.
if (rand()%4 == 0)
Talk(RALLY);
if(!pInstance)
{
@@ -278,18 +278,18 @@ void hyjalAI::Talk(uint32 id)
uint8 ind = *(index.begin()) + rand()%index.size();
int32 YellId = 0;
int32 YellId = 0;
if(Faction == 0) // Alliance
{
YellId = JainaQuotes[ind].textid;
YellId = JainaQuotes[ind].textid;
}
else if(Faction == 1) // Horde
{
YellId = ThrallQuotes[ind].textid;
YellId = ThrallQuotes[ind].textid;
}
if (YellId)
DoScriptText(YellId, m_creature);
DoScriptText(YellId, m_creature);
}
void hyjalAI::UpdateWorldState(uint32 id, uint32 state)
@@ -366,20 +366,20 @@ void hyjalAI::Retreat()
void hyjalAI::UpdateAI(const uint32 diff)
{
if(bRetreat)
{
{
if(RetreatTimer < diff)
{
bRetreat = false;
if(CreatureList.empty())
return;
{
bRetreat = false;
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);
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);
}else RetreatTimer -= diff;
}
m_creature->SetVisibility(VISIBILITY_OFF);
}else RetreatTimer -= diff;
}
if(!EventBegun)
return;
@@ -45,8 +45,8 @@ struct Wave
};
static Wave AllianceWaves[]= // Waves that will be summoned in the Alliance Base
{ // Rage Winterchill Wave 1-8
{GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, GHOUL, 0, 0, 0, 0, 0, 0, 0, 0, 120000, false},
{ // Rage Winterchill Wave 1-8
{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, GHOUL, GHOUL, 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, 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},
@@ -55,8 +55,8 @@ static Wave AllianceWaves[]= // Waves that will b
{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
{RAGE_WINTERCHILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true},
// Anetheron Wave 1-8
{RAGE_WINTERCHILL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true},
// Anetheron Wave 1-8
{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},
@@ -66,11 +66,11 @@ static Wave AllianceWaves[]= // Waves that will b
{CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, CRYPT_FIEND, BANSHEE, BANSHEE, BANSHEE, BANSHEE, ABOMINATION, ABOMINATION, ABOMINATION, ABOMINATION, 0, 0, 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}
{ANETHERON, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, true}
};
static Wave HordeWaves[]= // Waves that are summoned in the Horde base
{ // Kaz'Rogal Wave 1-8
{ // 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},
@@ -80,8 +80,8 @@ static Wave HordeWaves[]= // Waves that are su
{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},
// 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
{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},
@@ -90,7 +90,7 @@ static Wave HordeWaves[]= // Waves that are su
{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},
// All 8 Waves are summoned, summon Azgalor
// 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}
};
@@ -104,7 +104,7 @@ enum TargetType // Used in the spell
struct Yells
{
uint32 id; // Used to determine the type of yell (attack, rally, etc)
int32 textid; // The text id to be yelled
int32 textid; // The text id to be yelled
};
enum YellId
@@ -120,28 +120,28 @@ enum YellId
static Yells JainaQuotes[]=
{
{ATTACKED, -1534000},
{ATTACKED, -1534001},
{INCOMING, -1534002},
{BEGIN, -1534003},
{RALLY, -1534004},
{RALLY, -1534005},
{FAILURE, -1534006},
{SUCCESS, -1534007},
{DEATH, -1534008},
{ATTACKED, -1534000},
{ATTACKED, -1534001},
{INCOMING, -1534002},
{BEGIN, -1534003},
{RALLY, -1534004},
{RALLY, -1534005},
{FAILURE, -1534006},
{SUCCESS, -1534007},
{DEATH, -1534008},
};
static Yells ThrallQuotes[]=
{
{ATTACKED, -1534009},
{ATTACKED, -1534010},
{INCOMING, -1534011},
{BEGIN, -1534012},
{RALLY, -1534013},
{RALLY, -1534014},
{FAILURE, -1534015},
{SUCCESS, -1534016},
{DEATH, -1534017},
{ATTACKED, -1534009},
{ATTACKED, -1534010},
{INCOMING, -1534011},
{BEGIN, -1534012},
{RALLY, -1534013},
{RALLY, -1534014},
{FAILURE, -1534015},
{SUCCESS, -1534016},
{DEATH, -1534017},
};
struct TRINITY_DLL_DECL hyjalAI : public ScriptedAI
@@ -124,7 +124,7 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
break;
}
debug_log("SD2: Instance Hyjal: Instance data updated for event %u (Data=%u)",type,data);
debug_log("SD2: Instance Hyjal: Instance data updated for event %u (Data=%u)",type,data);
if(data == DONE)
SaveToDB();
@@ -162,8 +162,8 @@ 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];
stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
<< Encounters[3] << " " << Encounters[4];
char* out = new char[stream.str().length() + 1];
strcpy(out, stream.str().c_str());
if(out)
@@ -183,11 +183,11 @@ struct TRINITY_DLL_DECL instance_mount_hyjal : public ScriptedInstance
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream;
loadStream.str(in);
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3] >> Encounters[4];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream;
loadStream.str(in);
loadStream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3] >> Encounters[4];
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;
OUT_LOAD_INST_DATA_COMPLETE;
@@ -31,15 +31,15 @@ EndScriptData */
bool GOHello_go_barrel_old_hillsbrad(Player *player, GameObject* _GO)
{
ScriptedInstance* pInstance = (ScriptedInstance*)_GO->GetInstanceData();
ScriptedInstance* pInstance = (ScriptedInstance*)_GO->GetInstanceData();
if (!pInstance)
return false;
if (!pInstance)
return false;
if (pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE)
return false;
if (pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE)
return false;
pInstance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS);
pInstance->SetData(TYPE_BARREL_DIVERSION, IN_PROGRESS);
return false;
}
@@ -56,42 +56,42 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
Encounter[i] = NOT_STARTED;
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("SD2: Instance Old Hillsbrad: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
debug_log("SD2: Instance Old Hillsbrad: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void UpdateOHWorldState()
{
Map::PlayerList const& players = instance->GetPlayers();
void UpdateOHWorldState()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* player = itr->getSource())
{
player->SendUpdateWorldState(WORLD_STATE_OH,mBarrelCount);
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* player = itr->getSource())
{
player->SendUpdateWorldState(WORLD_STATE_OH,mBarrelCount);
if (mBarrelCount == 5)
player->KilledMonster(LODGE_QUEST_TRIGGER,0);
}
}
}else
debug_log("SD2: Instance Old Hillsbrad: UpdateOHWorldState, but PlayerList is empty!");
}
if (mBarrelCount == 5)
player->KilledMonster(LODGE_QUEST_TRIGGER,0);
}
}
}else
debug_log("SD2: Instance Old Hillsbrad: UpdateOHWorldState, but PlayerList is empty!");
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
@@ -108,36 +108,36 @@ struct TRINITY_DLL_DECL instance_old_hillsbrad : public ScriptedInstance
void SetData(uint32 type, uint32 data)
{
Player *player = GetPlayerInMap();
Player *player = GetPlayerInMap();
if (!player)
{
debug_log("SD2: Instance Old Hillsbrad: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
if (!player)
{
debug_log("SD2: Instance Old Hillsbrad: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
switch(type)
{
case TYPE_BARREL_DIVERSION:
{
if (data == IN_PROGRESS)
{
if (mBarrelCount >= 5)
return;
if (data == IN_PROGRESS)
{
if (mBarrelCount >= 5)
return;
++mBarrelCount;
UpdateOHWorldState();
++mBarrelCount;
UpdateOHWorldState();
debug_log("SD2: Instance Old Hillsbrad: go_barrel_old_hillsbrad count %u",mBarrelCount);
debug_log("SD2: Instance Old Hillsbrad: go_barrel_old_hillsbrad count %u",mBarrelCount);
Encounter[0] = IN_PROGRESS;
Encounter[0] = IN_PROGRESS;
if (mBarrelCount == 5)
{
player->SummonCreature(DRAKE_ENTRY,2128.43,71.01,64.42,1.74,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
Encounter[0] = DONE;
}
}
if (mBarrelCount == 5)
{
player->SummonCreature(DRAKE_ENTRY,2128.43,71.01,64.42,1.74,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
Encounter[0] = DONE;
}
}
break;
}
case TYPE_THRALL_EVENT:
@@ -214,7 +214,7 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
Reset();
}
ScriptedInstance *pInstance;
ScriptedInstance *pInstance;
uint64 TarethaGUID;
@@ -223,10 +223,10 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
void WaypointReached(uint32 i)
{
if (!pInstance)
return;
if (!pInstance)
return;
switch( i )
switch( i )
{
case 8:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
@@ -234,7 +234,7 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
break;
case 9:
DoScriptText(SAY_TH_ARMORY, m_creature);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, THRALL_WEAPON_MODEL);
//m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO);
//m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781);
@@ -297,7 +297,7 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
//make horsie run off
IsOnHold = true;
m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
pInstance->SetData(TYPE_THRALL_PART2, DONE);
pInstance->SetData(TYPE_THRALL_PART2, DONE);
break;
case 64:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
@@ -325,7 +325,7 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
break;
case 91:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
break;
case 93:
m_creature->SummonCreature(MOB_ENTRY_INN_PROTECTOR,2652.71,660.31,61.93,1.67,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
m_creature->SummonCreature(MOB_ENTRY_INN_LOOKOUT,2648.96,662.59,61.93,0.79,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,5000);
@@ -334,58 +334,58 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
break;
case 94:
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
if (uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA))
{
if (Unit* Taretha = Unit::GetUnit((*m_creature), TarethaGUID))
DoScriptText(SAY_TA_ESCAPED, Taretha, m_creature);
}
if (uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA))
{
if (Unit* Taretha = Unit::GetUnit((*m_creature), TarethaGUID))
DoScriptText(SAY_TA_ESCAPED, Taretha, m_creature);
}
break;
case 95:
DoScriptText(SAY_TH_MEET_TARETHA, m_creature);
pInstance->SetData(TYPE_THRALL_PART3,DONE);
pInstance->SetData(TYPE_THRALL_PART3,DONE);
IsOnHold = true;
break;
case 96:
DoScriptText(SAY_TH_EPOCH_WONDER, m_creature);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
break;
case 97:
DoScriptText(SAY_TH_EPOCH_KILL_TARETHA, m_creature);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
case 98:
//trigger epoch Yell("Thrall! Come outside and face your fate! ....")
//from here, thrall should not never be allowed to move to point 106 which he currently does.
//from here, thrall should not never be allowed to move to point 106 which he currently does.
break;
case 106:
if (!PlayerGUID)
break;
if (!PlayerGUID)
break;
//trigger taretha to run down outside
if (uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA))
{
if (Creature* Taretha = ((Creature*)Unit::GetUnit(*m_creature, TarethaGUID)))
((npc_escortAI*)(Taretha->AI()))->Start(false, false, true, PlayerGUID);
}
//trigger taretha to run down outside
if (uint64 TarethaGUID = pInstance->GetData64(DATA_TARETHA))
{
if (Creature* Taretha = ((Creature*)Unit::GetUnit(*m_creature, TarethaGUID)))
((npc_escortAI*)(Taretha->AI()))->Start(false, false, true, PlayerGUID);
}
//kill credit creature for quest
Map *map = m_creature->GetMap();
Map::PlayerList const& players = map->GetPlayers();
if (!players.isEmpty() && map->IsDungeon())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* pPlayer = itr->getSource())
pPlayer->KilledMonster(20156,m_creature->GetGUID());
}
}
//kill credit creature for quest
Map *map = m_creature->GetMap();
Map::PlayerList const& players = map->GetPlayers();
if (!players.isEmpty() && map->IsDungeon())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* pPlayer = itr->getSource())
pPlayer->KilledMonster(20156,m_creature->GetGUID());
}
}
//alot will happen here, thrall and taretha talk, erozion appear at spot to explain
m_creature->SummonCreature(EROZION_ENTRY,2646.47,680.416,55.38,4.16,TEMPSUMMON_TIMED_DESPAWN,120000);
break;
}
}
//alot will happen here, thrall and taretha talk, erozion appear at spot to explain
m_creature->SummonCreature(EROZION_ENTRY,2646.47,680.416,55.38,4.16,TEMPSUMMON_TIMED_DESPAWN,120000);
break;
}
}
void Reset()
@@ -407,9 +407,9 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_TH_LEAVE_COMBAT1, m_creature); break;
case 1: DoScriptText(SAY_TH_LEAVE_COMBAT2, m_creature); break;
case 2: DoScriptText(SAY_TH_LEAVE_COMBAT3, m_creature); break;
case 0: DoScriptText(SAY_TH_LEAVE_COMBAT1, m_creature); break;
case 1: DoScriptText(SAY_TH_LEAVE_COMBAT2, m_creature); break;
case 2: DoScriptText(SAY_TH_LEAVE_COMBAT3, m_creature); break;
}
}
}
@@ -433,10 +433,10 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
switch(rand()%4)
{
case 0: DoScriptText(SAY_TH_RANDOM_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_TH_RANDOM_AGGRO3, m_creature); break;
case 3: DoScriptText(SAY_TH_RANDOM_AGGRO4, m_creature); break;
case 0: DoScriptText(SAY_TH_RANDOM_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_TH_RANDOM_AGGRO3, m_creature); break;
case 3: DoScriptText(SAY_TH_RANDOM_AGGRO4, m_creature); break;
}
if( m_creature->IsMounted() )
{
@@ -445,45 +445,45 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
}
}
void JustSummoned(Creature* summoned)
{
switch(summoned->GetEntry())
{
//TODO: make Scarloc start into event instead, and not start attack directly
case MOB_ENTRY_BARN_GUARDSMAN:
case MOB_ENTRY_BARN_PROTECTOR:
case MOB_ENTRY_BARN_LOOKOUT:
case SKARLOC_MOUNT:
case EROZION_ENTRY:
break;
default:
summoned->AI()->AttackStart(m_creature);
break;
}
}
void JustSummoned(Creature* summoned)
{
switch(summoned->GetEntry())
{
//TODO: make Scarloc start into event instead, and not start attack directly
case MOB_ENTRY_BARN_GUARDSMAN:
case MOB_ENTRY_BARN_PROTECTOR:
case MOB_ENTRY_BARN_LOOKOUT:
case SKARLOC_MOUNT:
case EROZION_ENTRY:
break;
default:
summoned->AI()->AttackStart(m_creature);
break;
}
}
void KilledUnit(Unit *victim)
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_TH_RANDOM_KILL1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_KILL2, m_creature); break;
case 2: DoScriptText(SAY_TH_RANDOM_KILL3, m_creature); break;
case 0: DoScriptText(SAY_TH_RANDOM_KILL1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_KILL2, m_creature); break;
case 2: DoScriptText(SAY_TH_RANDOM_KILL3, m_creature); break;
}
}
void JustDied(Unit *slayer)
{
if (pInstance)
pInstance->SetData(TYPE_THRALL_EVENT,FAIL);
if (pInstance)
pInstance->SetData(TYPE_THRALL_EVENT,FAIL);
// Don't do a yell if he kills self (if player goes too far or at the end).
// Don't do a yell if he kills self (if player goes too far or at the end).
if(slayer == m_creature)
return;
switch(rand()%2)
{
case 0: DoScriptText(SAY_TH_RANDOM_DIE1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_DIE2, m_creature); break;
case 0: DoScriptText(SAY_TH_RANDOM_DIE1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_DIE2, m_creature); break;
}
}
@@ -491,16 +491,16 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
npc_escortAI::UpdateAI(diff);
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
//TODO: add his abilities'n-crap here
if( !LowHp && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 20) )
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_TH_RANDOM_LOW_HP1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_LOW_HP2, m_creature); break;
case 0: DoScriptText(SAY_TH_RANDOM_LOW_HP1, m_creature); break;
case 1: DoScriptText(SAY_TH_RANDOM_LOW_HP2, m_creature); break;
}
LowHp = true;
}
@@ -666,15 +666,15 @@ CreatureAI* GetAI_npc_thrall_old_hillsbrad(Creature *_Creature)
bool GossipHello_npc_thrall_old_hillsbrad(Player *player, Creature *_Creature)
{
if( _Creature->isQuestGiver() )
{
player->PrepareQuestMenu( _Creature->GetGUID() );
player->SendPreparedQuest(_Creature->GetGUID());
}
{
player->PrepareQuestMenu( _Creature->GetGUID() );
player->SendPreparedQuest(_Creature->GetGUID());
}
ScriptedInstance* pInstance = ((ScriptedInstance*)_Creature->GetInstanceData());
if( pInstance )
{
if (pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE && !pInstance->GetData(TYPE_THRALL_EVENT))
if (pInstance->GetData(TYPE_BARREL_DIVERSION) == DONE && !pInstance->GetData(TYPE_THRALL_EVENT))
{
player->ADD_GOSSIP_ITEM( 0, "[PH] Start walking.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(GOSSIP_ID_START, _Creature->GetGUID());
@@ -768,10 +768,10 @@ struct TRINITY_DLL_DECL npc_tarethaAI : public npc_escortAI
void Reset() {}
void Aggro(Unit* who) {}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
CreatureAI* GetAI_npc_taretha(Creature *_Creature)
{
@@ -817,15 +817,15 @@ bool GossipSelect_npc_taretha(Player *player, Creature *_Creature, uint32 sender
pInstance->SetData(TYPE_THRALL_PART4,IN_PROGRESS);
_Creature->SummonCreature(ENTRY_EPOCH,2639.13,698.55,65.43,4.59,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,120000);
if (uint64 ThrallGUID = pInstance->GetData64(DATA_THRALL))
{
Creature* Thrall = ((Creature*)Unit::GetUnit((*_Creature), ThrallGUID));
if(Thrall)
((npc_thrall_old_hillsbradAI*)Thrall->AI())->StartWP();
}
}
}
return true;
if (uint64 ThrallGUID = pInstance->GetData64(DATA_THRALL))
{
Creature* Thrall = ((Creature*)Unit::GetUnit((*_Creature), ThrallGUID));
if(Thrall)
((npc_thrall_old_hillsbradAI*)Thrall->AI())->StartWP();
}
}
}
return true;
}
/*######
@@ -859,6 +859,6 @@ void AddSC_old_hillsbrad()
newscript->Name="npc_taretha";
newscript->pGossipHello = &GossipHello_npc_taretha;
newscript->pGossipSelect = &GossipSelect_npc_taretha;
newscript->GetAI = &GetAI_npc_taretha;
newscript->GetAI = &GetAI_npc_taretha;
newscript->RegisterSelf();
}
@@ -42,38 +42,38 @@ EndScriptData */
#define SPELL_POWER_OF_CARIBDIS 38451
#define SPELL_ENRAGE 24318
#define SPELL_SEAR_NOVA 38445
#define SPELL_BLESSING_OF_THE_TIDES 38449
#define SPELL_BLESSING_OF_THE_TIDES 38449
//Sharkkis spells
#define SPELL_LEECHING_THROW 29436
#define SPELL_THE_BEAST_WITHIN 38373
#define SPELL_MULTISHOT 38366
#define SPELL_SUMMON_FATHOM_LURKER 38433
#define SPELL_SUMMON_FATHOM_SPOREBAT 38431
#define SPELL_MULTISHOT 38366
#define SPELL_SUMMON_FATHOM_LURKER 38433
#define SPELL_SUMMON_FATHOM_SPOREBAT 38431
#define SPELL_PET_ENRAGE 19574
//Tidalvess spells
#define SPELL_FROST_SHOCK 38234
#define SPELL_SPITFIRE_TOTEM 38236
#define SPELL_POISON_CLEANSING_TOTEM 38306
#define SPELL_POISON_CLEANSING_EFFECT 8167
#define SPELL_EARTHBIND_TOTEM 38304
#define SPELL_EARTHBIND_TOTEM_EFFECT 6474
#define SPELL_WINDFURY_WEAPON 38184
#define SPELL_FROST_SHOCK 38234
#define SPELL_SPITFIRE_TOTEM 38236
#define SPELL_POISON_CLEANSING_TOTEM 38306
#define SPELL_POISON_CLEANSING_EFFECT 8167
#define SPELL_EARTHBIND_TOTEM 38304
#define SPELL_EARTHBIND_TOTEM_EFFECT 6474
#define SPELL_WINDFURY_WEAPON 38184
//Caribdis Spells
#define SPELL_WATER_BOLT_VOLLEY 38335
#define SPELL_TIDAL_SURGE 38358
#define SPELL_TIDAL_SURGE_FREEZE 38357
#define SPELL_HEAL 38330
#define SPELL_SUMMON_CYCLONE 38337
#define SPELL_CYCLONE_CYCLONE 29538
#define SPELL_WATER_BOLT_VOLLEY 38335
#define SPELL_TIDAL_SURGE 38358
#define SPELL_TIDAL_SURGE_FREEZE 38357
#define SPELL_HEAL 38330
#define SPELL_SUMMON_CYCLONE 38337
#define SPELL_CYCLONE_CYCLONE 29538
//Yells and Quotes
#define SAY_GAIN_BLESSING_OF_TIDES "Your overconfidence will be your undoing! Guards, lend me your strength!"
#define SOUND_GAIN_BLESSING_OF_TIDES 11278
#define SAY_MISC "Alana be'lendor!" //don't know what use this
#define SOUND_MISC 11283
#define SAY_GAIN_BLESSING_OF_TIDES "Your overconfidence will be your undoing! Guards, lend me your strength!"
#define SOUND_GAIN_BLESSING_OF_TIDES 11278
#define SAY_MISC "Alana be'lendor!" //don't know what use this
#define SOUND_MISC 11283
//Summoned Unit GUIDs
#define CREATURE_CYCLONE 22104
@@ -106,9 +106,9 @@ struct TRINITY_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI
uint32 CataclysmicBolt_Timer;
uint32 Enrage_Timer;
uint32 SearNova_Timer;
uint32 SearNova_Timer;
bool BlessingOfTides;
bool BlessingOfTides;
uint64 Advisors[3];
@@ -116,38 +116,38 @@ struct TRINITY_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI
{
CataclysmicBolt_Timer = 10000;
Enrage_Timer = 600000; //10 minutes
SearNova_Timer = 20000+rand()%40000; // 20 - 60 seconds
SearNova_Timer = 20000+rand()%40000; // 20 - 60 seconds
BlessingOfTides = false;
BlessingOfTides = false;
if(pInstance)
{
uint64 RAdvisors[3];
RAdvisors[0] = pInstance->GetData64(DATA_SHARKKIS);
RAdvisors[1] = pInstance->GetData64(DATA_TIDALVESS);
RAdvisors[2] = pInstance->GetData64(DATA_CARIBDIS);
//Respawn of the 3 Advisors
Creature* pAdvisor = NULL;
for( int i=0; i<3; i++ )
if(pInstance)
{
uint64 RAdvisors[3];
RAdvisors[0] = pInstance->GetData64(DATA_SHARKKIS);
RAdvisors[1] = pInstance->GetData64(DATA_TIDALVESS);
RAdvisors[2] = pInstance->GetData64(DATA_CARIBDIS);
//Respawn of the 3 Advisors
Creature* pAdvisor = NULL;
for( int i=0; i<3; i++ )
if(RAdvisors[i])
{
pAdvisor = ((Creature*)Unit::GetUnit((*m_creature), RAdvisors[i]));
if(pAdvisor && !pAdvisor->isAlive())
{
pAdvisor->Respawn();
pAdvisor->AI()->EnterEvadeMode();
pAdvisor->GetMotionMaster()->MoveTargetedHome();
}
}
pInstance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED);
}
if(RAdvisors[i])
{
pAdvisor = ((Creature*)Unit::GetUnit((*m_creature), RAdvisors[i]));
if(pAdvisor && !pAdvisor->isAlive())
{
pAdvisor->Respawn();
pAdvisor->AI()->EnterEvadeMode();
pAdvisor->GetMotionMaster()->MoveTargetedHome();
}
}
pInstance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED);
}
}
}
void EventSharkkisDeath()
{
@@ -185,7 +185,7 @@ struct TRINITY_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI
GetAdvisors();
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
DoZoneInCombat();
pInstance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID());
pInstance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS);
@@ -237,10 +237,10 @@ struct TRINITY_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI
//someone evaded!
if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
{
{
EnterEvadeMode();
return;
}
return;
}
//CataclysmicBolt_Timer
if (CataclysmicBolt_Timer < diff)
@@ -258,12 +258,12 @@ struct TRINITY_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI
CataclysmicBolt_Timer = 10000;
}else CataclysmicBolt_Timer -= diff;
//SearNova_Timer
if(SearNova_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SEAR_NOVA);
SearNova_Timer = 20000+rand()%40000;
}else SearNova_Timer -= diff;
//SearNova_Timer
if(SearNova_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SEAR_NOVA);
SearNova_Timer = 20000+rand()%40000;
}else SearNova_Timer -= diff;
//Enrage_Timer
if (Enrage_Timer < diff)
@@ -272,32 +272,32 @@ struct TRINITY_DLL_DECL boss_fathomlord_karathressAI : public ScriptedAI
Enrage_Timer = 90000;
}else Enrage_Timer -= diff;
//Blessing of Tides Trigger
if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= 75 && !BlessingOfTides)
{
BlessingOfTides = true;
bool continueTriggering;
Creature* Advisor;
for(uint8 i = 0; i < 4; ++i)
if(Advisors[i])
{
Advisor = ((Creature*)Unit::GetUnit(*m_creature, Advisors[i]));
if(Advisor)
{
if(Advisor->isAlive())
{
continueTriggering = true;
break;
}
}
}
if( continueTriggering )
{
DoCast(m_creature, SPELL_BLESSING_OF_THE_TIDES);
DoYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_GAIN_BLESSING_OF_TIDES);
}
}
//Blessing of Tides Trigger
if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) <= 75 && !BlessingOfTides)
{
BlessingOfTides = true;
bool continueTriggering;
Creature* Advisor;
for(uint8 i = 0; i < 4; ++i)
if(Advisors[i])
{
Advisor = ((Creature*)Unit::GetUnit(*m_creature, Advisors[i]));
if(Advisor)
{
if(Advisor->isAlive())
{
continueTriggering = true;
break;
}
}
}
if( continueTriggering )
{
DoCast(m_creature, SPELL_BLESSING_OF_THE_TIDES);
DoYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_GAIN_BLESSING_OF_TIDES);
}
}
DoMeleeAttackIfReady();
}
@@ -316,30 +316,30 @@ struct TRINITY_DLL_DECL boss_fathomguard_sharkkisAI : public ScriptedAI
uint32 LeechingThrow_Timer;
uint32 TheBeastWithin_Timer;
uint32 Multishot_Timer;
uint32 Pet_Timer;
uint32 Multishot_Timer;
uint32 Pet_Timer;
bool pet;
bool pet;
uint64 SummonedPet;
uint64 SummonedPet;
void Reset()
{
LeechingThrow_Timer = 20000;
TheBeastWithin_Timer = 30000;
Multishot_Timer = 15000;
Pet_Timer = 10000;
Multishot_Timer = 15000;
Pet_Timer = 10000;
pet = false;
pet = false;
Creature *Pet = (Creature*) Unit::GetUnit(*m_creature, SummonedPet);
if( Pet && Pet->isAlive() )
{
Pet->DealDamage( Pet, Pet->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false );
}
Creature *Pet = (Creature*) Unit::GetUnit(*m_creature, SummonedPet);
if( Pet && Pet->isAlive() )
{
Pet->DealDamage( Pet, Pet->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false );
}
SummonedPet = 0;
SummonedPet = 0;
if( pInstance )
pInstance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED);
@@ -354,7 +354,7 @@ struct TRINITY_DLL_DECL boss_fathomguard_sharkkisAI : public ScriptedAI
if (Karathress)
((boss_fathomlord_karathressAI*)Karathress->AI())->EventSharkkisDeath();
((boss_fathomlord_karathressAI*)Karathress->AI())->EventSharkkisDeath();
((boss_fathomlord_karathressAI*)Karathress->AI())->EventSharkkisDeath();
}
}
@@ -386,10 +386,10 @@ struct TRINITY_DLL_DECL boss_fathomguard_sharkkisAI : public ScriptedAI
//someone evaded!
if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
{
EnterEvadeMode();
return;
}
{
EnterEvadeMode();
return;
}
//LeechingThrow_Timer
if(LeechingThrow_Timer < diff)
@@ -398,51 +398,51 @@ struct TRINITY_DLL_DECL boss_fathomguard_sharkkisAI : public ScriptedAI
LeechingThrow_Timer = 20000;
}else LeechingThrow_Timer -= diff;
//Multishot_Timer
if(Multishot_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_MULTISHOT);
Multishot_Timer = 20000;
}else Multishot_Timer -= diff;
//Multishot_Timer
if(Multishot_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_MULTISHOT);
Multishot_Timer = 20000;
}else Multishot_Timer -= diff;
//TheBeastWithin_Timer
if(TheBeastWithin_Timer < diff)
{
DoCast(m_creature, SPELL_THE_BEAST_WITHIN);
Creature *Pet = (Creature*) Unit::GetUnit(*m_creature, SummonedPet);
if( Pet && Pet->isAlive() )
{
Pet->CastSpell( Pet, SPELL_PET_ENRAGE, true );
}
TheBeastWithin_Timer = 30000;
}else TheBeastWithin_Timer -= diff;
//TheBeastWithin_Timer
if(TheBeastWithin_Timer < diff)
{
DoCast(m_creature, SPELL_THE_BEAST_WITHIN);
Creature *Pet = (Creature*) Unit::GetUnit(*m_creature, SummonedPet);
if( Pet && Pet->isAlive() )
{
Pet->CastSpell( Pet, SPELL_PET_ENRAGE, true );
}
TheBeastWithin_Timer = 30000;
}else TheBeastWithin_Timer -= diff;
//Pet_Timer
if(Pet_Timer < diff && pet == false)
{
pet = true;
//uint32 spell_id;
uint32 pet_id;
switch( rand()%2 )
{
case 0:
//spell_id = SPELL_SUMMON_FATHOM_LURKER;
pet_id = CREATURE_FATHOM_LURKER;
break;
case 1:
//spell_id = SPELL_SUMMON_FATHOM_SPOREBAT;
pet_id = CREATURE_FATHOM_SPOREBAT;
break;
}
//DoCast( m_creature, spell_id, true );
Creature *Pet = DoSpawnCreature(pet_id,0,0,0,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000 );
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (Pet && target)
{
Pet->AI()->AttackStart(target);
SummonedPet = Pet->GetGUID();
}
}else Pet_Timer -= diff;
//Pet_Timer
if(Pet_Timer < diff && pet == false)
{
pet = true;
//uint32 spell_id;
uint32 pet_id;
switch( rand()%2 )
{
case 0:
//spell_id = SPELL_SUMMON_FATHOM_LURKER;
pet_id = CREATURE_FATHOM_LURKER;
break;
case 1:
//spell_id = SPELL_SUMMON_FATHOM_SPOREBAT;
pet_id = CREATURE_FATHOM_SPOREBAT;
break;
}
//DoCast( m_creature, spell_id, true );
Creature *Pet = DoSpawnCreature(pet_id,0,0,0,0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000 );
Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (Pet && target)
{
Pet->AI()->AttackStart(target);
SummonedPet = Pet->GetGUID();
}
}else Pet_Timer -= diff;
DoMeleeAttackIfReady();
}
@@ -460,16 +460,16 @@ struct TRINITY_DLL_DECL boss_fathomguard_tidalvessAI : public ScriptedAI
ScriptedInstance* pInstance;
uint32 FrostShock_Timer;
uint32 Spitfire_Timer;
uint32 PoisonCleansing_Timer;
uint32 Earthbind_Timer;
uint32 Spitfire_Timer;
uint32 PoisonCleansing_Timer;
uint32 Earthbind_Timer;
void Reset()
{
FrostShock_Timer = 25000;
Spitfire_Timer = 60000;
PoisonCleansing_Timer = 30000;
Earthbind_Timer = 45000;
Spitfire_Timer = 60000;
PoisonCleansing_Timer = 30000;
Earthbind_Timer = 45000;
if (pInstance)
pInstance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED);
@@ -483,8 +483,8 @@ struct TRINITY_DLL_DECL boss_fathomguard_tidalvessAI : public ScriptedAI
Karathress = (Creature*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_KARATHRESS)));
if (Karathress)
if(!m_creature->isAlive() && Karathress)
((boss_fathomlord_karathressAI*)Karathress->AI())->EventTidalvessDeath();
if(!m_creature->isAlive() && Karathress)
((boss_fathomlord_karathressAI*)Karathress->AI())->EventTidalvessDeath();
}
}
@@ -495,7 +495,7 @@ struct TRINITY_DLL_DECL boss_fathomguard_tidalvessAI : public ScriptedAI
pInstance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID());
pInstance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS);
}
DoCast(m_creature, SPELL_WINDFURY_WEAPON);
DoCast(m_creature, SPELL_WINDFURY_WEAPON);
}
void UpdateAI(const uint32 diff)
@@ -517,15 +517,15 @@ struct TRINITY_DLL_DECL boss_fathomguard_tidalvessAI : public ScriptedAI
//someone evaded!
if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
{
{
EnterEvadeMode();
return;
}
return;
}
if( !m_creature->HasAura(SPELL_WINDFURY_WEAPON, 0) )
{
DoCast(m_creature, SPELL_WINDFURY_WEAPON);
}
if( !m_creature->HasAura(SPELL_WINDFURY_WEAPON, 0) )
{
DoCast(m_creature, SPELL_WINDFURY_WEAPON);
}
//FrostShock_Timer
if (FrostShock_Timer < diff)
@@ -534,31 +534,31 @@ struct TRINITY_DLL_DECL boss_fathomguard_tidalvessAI : public ScriptedAI
FrostShock_Timer = 25000+rand()%5000;
}else FrostShock_Timer -= diff;
//Spitfire_Timer
if(Spitfire_Timer < diff)
{
DoCast(m_creature, SPELL_SPITFIRE_TOTEM);
Unit *SpitfireTotem = Unit::GetUnit( *m_creature, CREATURE_SPITFIRE_TOTEM );
if( SpitfireTotem )
{
((Creature*)SpitfireTotem)->AI()->AttackStart( m_creature->getVictim() );
}
Spitfire_Timer = 60000;
}else Spitfire_Timer -= diff;
//Spitfire_Timer
if(Spitfire_Timer < diff)
{
DoCast(m_creature, SPELL_SPITFIRE_TOTEM);
Unit *SpitfireTotem = Unit::GetUnit( *m_creature, CREATURE_SPITFIRE_TOTEM );
if( SpitfireTotem )
{
((Creature*)SpitfireTotem)->AI()->AttackStart( m_creature->getVictim() );
}
Spitfire_Timer = 60000;
}else Spitfire_Timer -= diff;
//PoisonCleansing_Timer
if(PoisonCleansing_Timer < diff)
{
DoCast(m_creature, SPELL_POISON_CLEANSING_TOTEM);
PoisonCleansing_Timer = 30000;
}else PoisonCleansing_Timer -= diff;
//PoisonCleansing_Timer
if(PoisonCleansing_Timer < diff)
{
DoCast(m_creature, SPELL_POISON_CLEANSING_TOTEM);
PoisonCleansing_Timer = 30000;
}else PoisonCleansing_Timer -= diff;
//Earthbind_Timer
if(Earthbind_Timer < diff)
{
DoCast(m_creature, SPELL_EARTHBIND_TOTEM);
Earthbind_Timer = 45000;
}else Earthbind_Timer -= diff;
//Earthbind_Timer
if(Earthbind_Timer < diff)
{
DoCast(m_creature, SPELL_EARTHBIND_TOTEM);
Earthbind_Timer = 45000;
}else Earthbind_Timer -= diff;
DoMeleeAttackIfReady();
}
@@ -578,14 +578,14 @@ struct TRINITY_DLL_DECL boss_fathomguard_caribdisAI : public ScriptedAI
uint32 WaterBoltVolley_Timer;
uint32 TidalSurge_Timer;
uint32 Heal_Timer;
uint32 Cyclone_Timer;
uint32 Cyclone_Timer;
void Reset()
{
WaterBoltVolley_Timer = 35000;
TidalSurge_Timer = 15000+rand()%5000;
Heal_Timer = 55000;
Cyclone_Timer = 30000+rand()%10000;
Cyclone_Timer = 30000+rand()%10000;
if (pInstance)
pInstance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED);
@@ -599,8 +599,8 @@ struct TRINITY_DLL_DECL boss_fathomguard_caribdisAI : public ScriptedAI
Karathress = (Creature*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_KARATHRESS)));
if (Karathress)
if(!m_creature->isAlive() && Karathress)
((boss_fathomlord_karathressAI*)Karathress->AI())->EventCaribdisDeath();
if(!m_creature->isAlive() && Karathress)
((boss_fathomlord_karathressAI*)Karathress->AI())->EventCaribdisDeath();
}
}
@@ -632,10 +632,10 @@ struct TRINITY_DLL_DECL boss_fathomguard_caribdisAI : public ScriptedAI
//someone evaded!
if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
{
{
EnterEvadeMode();
return;
}
return;
}
//WaterBoltVolley_Timer
if (WaterBoltVolley_Timer < diff)
@@ -648,69 +648,69 @@ struct TRINITY_DLL_DECL boss_fathomguard_caribdisAI : public ScriptedAI
if (TidalSurge_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_TIDAL_SURGE);
// Hacky way to do it - won't trigger elseways
m_creature->getVictim()->CastSpell( m_creature->getVictim(), SPELL_TIDAL_SURGE_FREEZE, true );
// Hacky way to do it - won't trigger elseways
m_creature->getVictim()->CastSpell( m_creature->getVictim(), SPELL_TIDAL_SURGE_FREEZE, true );
TidalSurge_Timer = 15000+rand()%5000;
}else TidalSurge_Timer -= diff;
//Cyclone_Timer
if(Cyclone_Timer < diff)
{
//DoCast(m_creature, SPELL_SUMMON_CYCLONE); // Doesn't work
Cyclone_Timer = 30000+rand()%10000;
Creature *Cyclone = m_creature->SummonCreature(CREATURE_CYCLONE, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), (rand()%5), TEMPSUMMON_TIMED_DESPAWN, 15000);
if( Cyclone )
{
((Creature*)Cyclone)->SetFloatValue(OBJECT_FIELD_SCALE_X, 3.0f);
Cyclone->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Cyclone->setFaction(m_creature->getFaction());
Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_CYCLONE, true);
Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if( target )
{
Cyclone->AI()->AttackStart(target);
}
}
}else Cyclone_Timer -= diff;
//Cyclone_Timer
if(Cyclone_Timer < diff)
{
//DoCast(m_creature, SPELL_SUMMON_CYCLONE); // Doesn't work
Cyclone_Timer = 30000+rand()%10000;
Creature *Cyclone = m_creature->SummonCreature(CREATURE_CYCLONE, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), (rand()%5), TEMPSUMMON_TIMED_DESPAWN, 15000);
if( Cyclone )
{
((Creature*)Cyclone)->SetFloatValue(OBJECT_FIELD_SCALE_X, 3.0f);
Cyclone->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Cyclone->setFaction(m_creature->getFaction());
Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_CYCLONE, true);
Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if( target )
{
Cyclone->AI()->AttackStart(target);
}
}
}else Cyclone_Timer -= diff;
//Heal_Timer
if(Heal_Timer < diff)
{
// It can be cast on any of the mobs
Unit *pUnit = NULL;
//Heal_Timer
if(Heal_Timer < diff)
{
// It can be cast on any of the mobs
Unit *pUnit = NULL;
while( pUnit == NULL || !pUnit->isAlive() )
{
pUnit = selectAdvisorUnit();
}
while( pUnit == NULL || !pUnit->isAlive() )
{
pUnit = selectAdvisorUnit();
}
if(pUnit && pUnit->isAlive())
DoCast(pUnit, SPELL_HEAL);
Heal_Timer = 60000;
}else Heal_Timer -= diff;
if(pUnit && pUnit->isAlive())
DoCast(pUnit, SPELL_HEAL);
Heal_Timer = 60000;
}else Heal_Timer -= diff;
DoMeleeAttackIfReady();
}
Unit* selectAdvisorUnit()
{
Unit* pUnit;
if(pInstance)
{
switch(rand()%4)
{
case 0:
pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_KARATHRESS));
break;
case 1:
pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_SHARKKIS));
break;
case 2:
pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_TIDALVESS));
break;
case 3:
pUnit = m_creature;
break;
Unit* selectAdvisorUnit()
{
Unit* pUnit;
if(pInstance)
{
switch(rand()%4)
{
case 0:
pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_KARATHRESS));
break;
case 1:
pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_SHARKKIS));
break;
case 2:
pUnit = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_TIDALVESS));
break;
case 3:
pUnit = m_creature;
break;
}
}else pUnit = m_creature;
@@ -83,7 +83,7 @@ struct TRINITY_DLL_DECL boss_hydross_the_unstableAI : public ScriptedAI
}
ScriptedInstance* pInstance;
uint64 beams[2];
uint64 beams[2];
uint32 PosCheck_Timer;
uint32 MarkOfHydross_Timer;
uint32 MarkOfCorruption_Timer;
@@ -93,14 +93,14 @@ struct TRINITY_DLL_DECL boss_hydross_the_unstableAI : public ScriptedAI
uint32 MarkOfCorruption_Count;
uint32 EnrageTimer;
bool CorruptedForm;
bool beam;
SummonList Summons;
bool beam;
SummonList Summons;
void Reset()
{
DeSummonBeams();
beams[0] = 0;
beams[1] = 0;
DeSummonBeams();
beams[0] = 0;
beams[1] = 0;
PosCheck_Timer = 2500;
MarkOfHydross_Timer = 15000;
MarkOfCorruption_Timer = 15000;
@@ -119,41 +119,41 @@ struct TRINITY_DLL_DECL boss_hydross_the_unstableAI : public ScriptedAI
if (pInstance)
pInstance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, NOT_STARTED);
beam = false;
Summons.DespawnAll();
beam = false;
Summons.DespawnAll();
}
void SummonBeams()
{
Creature* beamer = m_creature->SummonCreature(ENTRY_BEAM_DUMMY,-258.333,-356.34,22.0499,5.90835,TEMPSUMMON_CORPSE_DESPAWN,0);
if(beamer)
{
beamer->CastSpell(m_creature,SPELL_BLUE_BEAM,true);
beamer->SetUInt32Value(UNIT_FIELD_DISPLAYID , 11686); //invisible
beamer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
beams[0]=beamer->GetGUID();
}
beamer = beamer = m_creature->SummonCreature(ENTRY_BEAM_DUMMY,-219.918,-371.308,22.0042,2.73072,TEMPSUMMON_CORPSE_DESPAWN,0);
if(beamer)
{
beamer->CastSpell(m_creature,SPELL_BLUE_BEAM,true);
beamer->SetUInt32Value(UNIT_FIELD_DISPLAYID , 11686); //invisible
beamer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
beams[1]=beamer->GetGUID();
}
}
void DeSummonBeams()
{
for(uint8 i=0;i<2;i++)
{
Creature* mob = (Creature*)Unit::GetUnit(*m_creature,beams[i]);
if(mob)
{
mob->setDeathState(DEAD);
void SummonBeams()
{
Creature* beamer = m_creature->SummonCreature(ENTRY_BEAM_DUMMY,-258.333,-356.34,22.0499,5.90835,TEMPSUMMON_CORPSE_DESPAWN,0);
if(beamer)
{
beamer->CastSpell(m_creature,SPELL_BLUE_BEAM,true);
beamer->SetUInt32Value(UNIT_FIELD_DISPLAYID , 11686); //invisible
beamer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
beams[0]=beamer->GetGUID();
}
beamer = beamer = m_creature->SummonCreature(ENTRY_BEAM_DUMMY,-219.918,-371.308,22.0042,2.73072,TEMPSUMMON_CORPSE_DESPAWN,0);
if(beamer)
{
beamer->CastSpell(m_creature,SPELL_BLUE_BEAM,true);
beamer->SetUInt32Value(UNIT_FIELD_DISPLAYID , 11686); //invisible
beamer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
beams[1]=beamer->GetGUID();
}
}
void DeSummonBeams()
{
for(uint8 i=0;i<2;i++)
{
Creature* mob = (Creature*)Unit::GetUnit(*m_creature,beams[i]);
if(mob)
{
mob->setDeathState(DEAD);
mob->RemoveCorpse();
}
}
}
}
}
}
void Aggro(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
@@ -185,20 +185,20 @@ struct TRINITY_DLL_DECL boss_hydross_the_unstableAI : public ScriptedAI
void JustSummoned(Creature* summoned)
{
if (summoned->GetEntry() == ENTRY_PURE_SPAWN)
{
summoned->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
summoned->CastSpell(summoned,SPELL_ELEMENTAL_SPAWNIN,true);
Summons.Summon(summoned);
}
{
summoned->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true);
summoned->CastSpell(summoned,SPELL_ELEMENTAL_SPAWNIN,true);
Summons.Summon(summoned);
}
if (summoned->GetEntry() == ENTRY_TAINTED_SPAWN)
{
summoned->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
summoned->CastSpell(summoned,SPELL_ELEMENTAL_SPAWNIN,true);
Summons.Summon(summoned);
}
{
summoned->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
summoned->CastSpell(summoned,SPELL_ELEMENTAL_SPAWNIN,true);
Summons.Summon(summoned);
}
}
void SummonedCreatureDespawn(Creature *summon)
void SummonedCreatureDespawn(Creature *summon)
{
Summons.Despawn(summon);
}
@@ -212,16 +212,16 @@ struct TRINITY_DLL_DECL boss_hydross_the_unstableAI : public ScriptedAI
if (pInstance)
pInstance->SetData(DATA_HYDROSSTHEUNSTABLEEVENT, NOT_STARTED);
Summons.DespawnAll();
Summons.DespawnAll();
}
void UpdateAI(const uint32 diff)
{
if(!beam)
{
SummonBeams();
beam=true;
}
if(!beam)
{
SummonBeams();
beam=true;
}
//Return since we have no target
if (!UpdateVictim() )
return;
@@ -277,7 +277,7 @@ struct TRINITY_DLL_DECL boss_hydross_the_unstableAI : public ScriptedAI
DoScriptText(SAY_SWITCH_TO_CLEAN, m_creature);
DoResetThreat();
SummonBeams();
SummonBeams();
// spawn 4 adds
DoSpawnCreature(ENTRY_PURE_SPAWN, SPAWN_X_DIFF1, SPAWN_Y_DIFF1, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
@@ -344,7 +344,7 @@ struct TRINITY_DLL_DECL boss_hydross_the_unstableAI : public ScriptedAI
DoScriptText(SAY_SWITCH_TO_CORRUPT, m_creature);
DoResetThreat();
DeSummonBeams();
DeSummonBeams();
// spawn 4 adds
DoSpawnCreature(ENTRY_TAINTED_SPAWN, SPAWN_X_DIFF1, SPAWN_Y_DIFF1, 3, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
@@ -41,7 +41,7 @@ EndScriptData */
#define SAY_SLAY3 -1548054
#define SAY_DEATH -1548055
#define SPELL_SURGE 38044
#define SPELL_SURGE 38044
#define SPELL_MULTI_SHOT 38310
#define SPELL_SHOCK_BLAST 38509
#define SPELL_ENTANGLE 38316
@@ -133,17 +133,17 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
boss_lady_vashjAI (Creature *c) : ScriptedAI(c)
{
pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL;
Intro = false;
Reset();
CanAttack = false;//must be after reset()
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //set it only once on creature create (no need do intro if wiped)
Intro = false;
Reset();
CanAttack = false;//must be after reset()
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //set it only once on creature create (no need do intro if wiped)
}
ScriptedInstance *pInstance;
uint64 ShieldGeneratorChannel[4];
uint32 AggroTimer;
uint32 AggroTimer;
uint32 ShockBlast_Timer;
uint32 Entangle_Timer;
uint32 StaticCharge_Timer;
@@ -160,12 +160,12 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
bool Entangle;
bool InCombat;
bool Intro;
bool CanAttack;
bool Intro;
bool CanAttack;
void Reset()
{
AggroTimer = 19000;
AggroTimer = 19000;
ShockBlast_Timer = 1+rand()%60000;
Entangle_Timer = 30000;
StaticCharge_Timer = 10000+rand()%15000;
@@ -182,24 +182,24 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
Entangle = false;
InCombat = false;
CanAttack = true;
CanAttack = true;
Unit *remo;
Unit *remo;
for(uint8 i = 0; i < 4; i++)
{
remo = Unit::GetUnit(*m_creature, ShieldGeneratorChannel[i]);
if (remo)
remo->setDeathState(JUST_DIED);
remo->setDeathState(JUST_DIED);
}
if(pInstance)
pInstance->SetData(DATA_LADYVASHJEVENT, NOT_STARTED);
pInstance->SetData(DATA_LADYVASHJEVENT, NOT_STARTED);
ShieldGeneratorChannel[0] = 0;
ShieldGeneratorChannel[1] = 0;
ShieldGeneratorChannel[2] = 0;
ShieldGeneratorChannel[3] = 0;
m_creature->SetCorpseDelay(1000*60*60);
m_creature->SetCorpseDelay(1000*60*60);
}
//Called when a tainted elemental dies
@@ -246,19 +246,19 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
void Aggro(Unit *who)
{
if (pInstance)
{
//remove old tainted cores to prevent cheating in phase 2
Map *map = m_creature->GetMap();
Map::PlayerList const &PlayerList = map->GetPlayers();
for(Map::PlayerList::const_iterator i = PlayerList.begin();i != PlayerList.end(); ++i)
if (pInstance)
{
//remove old tainted cores to prevent cheating in phase 2
Map *map = m_creature->GetMap();
Map::PlayerList const &PlayerList = map->GetPlayers();
for(Map::PlayerList::const_iterator i = PlayerList.begin();i != PlayerList.end(); ++i)
{
if(Player* i_pl = i->getSource())
{
i_pl->DestroyItemCount(31088, 1, true);
}
}
}
}
if(Phase != 2)
AttackStart(who);
@@ -268,13 +268,13 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
void MoveInLineOfSight(Unit *who)
{
if (!Intro)
{
Intro = true;
DoScriptText(SAY_INTRO, m_creature);
}
if (!CanAttack)
return;
if (!Intro)
{
Intro = true;
DoScriptText(SAY_INTRO, m_creature);
}
if (!CanAttack)
return;
if (!who || m_creature->getVictim())
return;
@@ -322,25 +322,25 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if(!CanAttack && Intro)
{
if(AggroTimer < diff)
{
CanAttack = true;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer=19000;
}else
{
AggroTimer-=diff;
return;
}
}
if(!CanAttack && Intro)
{
if(AggroTimer < diff)
{
CanAttack = true;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer=19000;
}else
{
AggroTimer-=diff;
return;
}
}
//to prevent abuses during phase 2
if(Phase == 2 && !m_creature->getVictim() && InCombat)
{
EnterEvadeMode();
return;
}
{
EnterEvadeMode();
return;
}
//Return since we have no target
if (!UpdateVictim() )
return;
@@ -438,7 +438,7 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
SummonSporebat_Timer = SummonSporebat_StaticTimer;
if(SummonSporebat_Timer < 5000)
if(SummonSporebat_Timer < 5000)
SummonSporebat_Timer = 5000;
}else SummonSporebat_Timer -= diff;
@@ -519,15 +519,15 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
{
uint32 pos = rand()%3;
Creature* CoilfangElite = NULL;
CoilfangElite = m_creature->SummonCreature(COILFANG_ELITE, CoilfangElitePos[pos][0], CoilfangElitePos[pos][1], CoilfangElitePos[pos][2], CoilfangElitePos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
if(CoilfangElite)
CoilfangElite = m_creature->SummonCreature(COILFANG_ELITE, CoilfangElitePos[pos][0], CoilfangElitePos[pos][1], CoilfangElitePos[pos][2], CoilfangElitePos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
if(CoilfangElite)
{
Unit *target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target)
CoilfangElite->AI()->AttackStart(target);
else if(m_creature->getVictim())
CoilfangElite->AI()->AttackStart(m_creature->getVictim());
else if(m_creature->getVictim())
CoilfangElite->AI()->AttackStart(m_creature->getVictim());
}
CoilfangElite_Timer = 45000+rand()%5000;
}else CoilfangElite_Timer -= diff;
@@ -536,16 +536,16 @@ struct TRINITY_DLL_DECL boss_lady_vashjAI : public ScriptedAI
if(CoilfangStrider_Timer < diff)
{
uint32 pos = rand()%3;
Creature* CoilfangStrider = NULL;
CoilfangStrider = m_creature->SummonCreature(COILFANG_STRIDER, CoilfangStriderPos[pos][0], CoilfangStriderPos[pos][1], CoilfangStriderPos[pos][2], CoilfangStriderPos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
if(CoilfangStrider)
Creature* CoilfangStrider = NULL;
CoilfangStrider = m_creature->SummonCreature(COILFANG_STRIDER, CoilfangStriderPos[pos][0], CoilfangStriderPos[pos][1], CoilfangStriderPos[pos][2], CoilfangStriderPos[pos][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
if(CoilfangStrider)
{
Unit *target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target)
CoilfangStrider->AI()->AttackStart(target);
else if(m_creature->getVictim())
CoilfangStrider->AI()->AttackStart(m_creature->getVictim());
else if(m_creature->getVictim())
CoilfangStrider->AI()->AttackStart(m_creature->getVictim());
}
CoilfangStrider_Timer = 60000+rand()%10000;
}else CoilfangStrider_Timer -= diff;
@@ -590,39 +590,39 @@ struct TRINITY_DLL_DECL mob_enchanted_elementalAI : public ScriptedAI
}
ScriptedInstance *pInstance;
uint32 move;
uint32 phase;
float x, y, z;
Unit *Vashj;
uint32 move;
uint32 phase;
float x, y, z;
Unit *Vashj;
void Reset()
{
m_creature->SetSpeed(MOVE_WALK,0.6);//walk
m_creature->SetSpeed(MOVE_RUN,0.6);//run
move = 0;
phase = 1;
Vashj = NULL;
m_creature->SetSpeed(MOVE_WALK,0.6);//walk
m_creature->SetSpeed(MOVE_RUN,0.6);//run
move = 0;
phase = 1;
Vashj = NULL;
for (int i = 0;i<8;i++)//search for nearest waypoint (up on stairs)
{
if (!x || !y || !z)
{
x = ElementWPPos[i][0];
y = ElementWPPos[i][1];
z = ElementWPPos[i][2];
}
else
{
if (m_creature->GetDistance(ElementWPPos[i][0],ElementWPPos[i][1],ElementWPPos[i][2]) < m_creature->GetDistance(x,y,z))
{
x = ElementWPPos[i][0];
y = ElementWPPos[i][1];
z = ElementWPPos[i][2];
}
}
}
if (pInstance)
Vashj = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_LADYVASHJ));
for (int i = 0;i<8;i++)//search for nearest waypoint (up on stairs)
{
if (!x || !y || !z)
{
x = ElementWPPos[i][0];
y = ElementWPPos[i][1];
z = ElementWPPos[i][2];
}
else
{
if (m_creature->GetDistance(ElementWPPos[i][0],ElementWPPos[i][1],ElementWPPos[i][2]) < m_creature->GetDistance(x,y,z))
{
x = ElementWPPos[i][0];
y = ElementWPPos[i][1];
z = ElementWPPos[i][2];
}
}
}
if (pInstance)
Vashj = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_LADYVASHJ));
}
void Aggro(Unit *who) { return; }
@@ -631,31 +631,31 @@ struct TRINITY_DLL_DECL mob_enchanted_elementalAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if(!pInstance)
return;
if(!pInstance)
return;
if (!Vashj)
{
return;
}
if(move < diff)
if (!Vashj)
{
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
if (phase == 1)
{
m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
}
if (phase == 1 && m_creature->GetDistance(x,y,z) < 0.1)
{
phase = 2;
}
if (phase == 2)
{
m_creature->GetMotionMaster()->MovePoint(0, MIDDLE_X, MIDDLE_Y, MIDDLE_Z);
phase = 3;
}
if (phase == 3)
return;
}
if(move < diff)
{
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE);
if (phase == 1)
{
m_creature->GetMotionMaster()->MovePoint(0, x, y, z);
}
if (phase == 1 && m_creature->GetDistance(x,y,z) < 0.1)
{
phase = 2;
}
if (phase == 2)
{
m_creature->GetMotionMaster()->MovePoint(0, MIDDLE_X, MIDDLE_Y, MIDDLE_Z);
phase = 3;
}
if (phase == 3)
{
m_creature->GetMotionMaster()->MovePoint(0, MIDDLE_X, MIDDLE_Y, MIDDLE_Z);
if(m_creature->GetDistance(MIDDLE_X, MIDDLE_Y, MIDDLE_Z) < 3)
@@ -674,13 +674,13 @@ struct TRINITY_DLL_DECL mob_enchanted_elementalAI : public ScriptedAI
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
if(((boss_lady_vashjAI*)((Creature*)Vashj)->AI())->InCombat == false || ((boss_lady_vashjAI*)((Creature*)Vashj)->AI())->Phase != 2 || Vashj->isDead())
if(((boss_lady_vashjAI*)((Creature*)Vashj)->AI())->InCombat == false || ((boss_lady_vashjAI*)((Creature*)Vashj)->AI())->Phase != 2 || Vashj->isDead())
{
//call Unsummon()
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
move = 1000;
}else move -= diff;
move = 1000;
}else move -= diff;
}
};
@@ -719,7 +719,7 @@ struct TRINITY_DLL_DECL mob_tainted_elementalAI : public ScriptedAI
void Aggro(Unit *who)
{
m_creature->AddThreat(who, 0.1f);
m_creature->AddThreat(who, 0.1f);
}
void UpdateAI(const uint32 diff)
@@ -760,18 +760,18 @@ struct TRINITY_DLL_DECL mob_toxic_sporebatAI : public ScriptedAI
ScriptedInstance *pInstance;
uint32 movement_timer;
uint32 movement_timer;
uint32 ToxicSpore_Timer;
uint32 bolt_timer;
uint32 bolt_timer;
uint32 Check_Timer;
void Reset()
{
m_creature->AddUnitMovementFlag(/*MOVEMENTFLAG_ONTRANSPORT + */MOVEMENTFLAG_LEVITATING);
m_creature->AddUnitMovementFlag(/*MOVEMENTFLAG_ONTRANSPORT + */MOVEMENTFLAG_LEVITATING);
m_creature->setFaction(14);
movement_timer = 0;
movement_timer = 0;
ToxicSpore_Timer = 5000;
bolt_timer = 5500;
bolt_timer = 5500;
Check_Timer = 1000;
}
@@ -781,50 +781,50 @@ struct TRINITY_DLL_DECL mob_toxic_sporebatAI : public ScriptedAI
}
void MoveInLineOfSight(Unit *who)
{
{
}
void MovementInform(uint32 type, uint32 id)
void MovementInform(uint32 type, uint32 id)
{
if(type != POINT_MOTION_TYPE)
return;
if(id == 1)
movement_timer = 0;
}
movement_timer = 0;
}
void UpdateAI (const uint32 diff)
{
/*if(!m_creature->isInCombat())
m_creature->SetInCombatState(false);*/
/*if(!m_creature->isInCombat())
m_creature->SetInCombatState(false);*/
//Random movement
//Random movement
if (movement_timer < diff)
{
uint32 rndpos = rand()%8;
m_creature->GetMotionMaster()->MovePoint(1,SporebatWPPos[rndpos][0], SporebatWPPos[rndpos][1], SporebatWPPos[rndpos][2]);
movement_timer = 6000;
}else movement_timer -= diff;
uint32 rndpos = rand()%8;
m_creature->GetMotionMaster()->MovePoint(1,SporebatWPPos[rndpos][0], SporebatWPPos[rndpos][1], SporebatWPPos[rndpos][2]);
movement_timer = 6000;
}else movement_timer -= diff;
//toxic spores
if(bolt_timer < diff)
{
Unit *target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target)
{
Creature* trig = m_creature->SummonCreature(TOXIC_SPORES_TRIGGER,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,30000);
if(trig)
{
trig->setFaction(14);
trig->CastSpell(trig, SPELL_TOXIC_SPORES,true);
}
}
bolt_timer = 10000+rand()%5000;
}
else bolt_timer -= diff;
//toxic spores
if(bolt_timer < diff)
{
Unit *target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
if(target)
{
Creature* trig = m_creature->SummonCreature(TOXIC_SPORES_TRIGGER,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,30000);
if(trig)
{
trig->setFaction(14);
trig->CastSpell(trig, SPELL_TOXIC_SPORES,true);
}
}
bolt_timer = 10000+rand()%5000;
}
else bolt_timer -= diff;
//Check_Timer
if(Check_Timer < diff)
@@ -845,7 +845,7 @@ struct TRINITY_DLL_DECL mob_toxic_sporebatAI : public ScriptedAI
Check_Timer = 1000;
}else Check_Timer -= diff;
}
}
};
//Coilfang Elite
@@ -896,11 +896,11 @@ struct TRINITY_DLL_DECL mob_shield_generator_channelAI : public ScriptedAI
ScriptedInstance *pInstance;
uint32 Check_Timer;
bool Casted;
bool Casted;
void Reset()
{
Check_Timer = 0;
Casted = false;
Casted = false;
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID , 11686); //invisible
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -923,13 +923,13 @@ struct TRINITY_DLL_DECL mob_shield_generator_channelAI : public ScriptedAI
if(Vashj && Vashj->isAlive())
{
//start visual channel
if (!Casted || !Vashj->HasAura(SPELL_MAGIC_BARRIER,0))
{
m_creature->CastSpell(Vashj,SPELL_MAGIC_BARRIER,true);
Casted = true;
}
if (!Casted || !Vashj->HasAura(SPELL_MAGIC_BARRIER,0))
{
m_creature->CastSpell(Vashj,SPELL_MAGIC_BARRIER,true);
Casted = true;
}
}
Check_Timer = 1000;
Check_Timer = 1000;
}else Check_Timer -= diff;
}
};
@@ -26,199 +26,199 @@ EndScriptData */
#include "../../../creature/simple_ai.h"
#include "Spell.h"
#define SPELL_SPOUT 37433
#define SPELL_SPOUT_ANIM 42835
#define SPELL_SPOUT_BREATH 37431
#define SPELL_KNOCKBACK 19813
#define SPELL_GEYSER 37478
#define SPELL_WHIRL 37660
#define SPELL_WATERBOLT 37138
#define SPELL_SUBMERGE 37550
#define SPELL_EMERGE 20568
#define SPELL_SCALDINGWATER 37284
#define SPELL_SPOUT 37433
#define SPELL_SPOUT_ANIM 42835
#define SPELL_SPOUT_BREATH 37431
#define SPELL_KNOCKBACK 19813
#define SPELL_GEYSER 37478
#define SPELL_WHIRL 37660
#define SPELL_WATERBOLT 37138
#define SPELL_SUBMERGE 37550
#define SPELL_EMERGE 20568
#define SPELL_SCALDINGWATER 37284
#define EMOTE_SPOUT "takes a deep breath."
#define EMOTE_SPOUT "takes a deep breath."
#define SPOUT_DIST 100
#define SPOUT_DIST 100
#define MOB_COILFANG_GUARDIAN 21873
#define MOB_COILFANG_AMBUSHER 21865
//Ambusher spells
#define SPELL_SPREAD_SHOT 37790
#define SPELL_SHOOT 37770
#define SPELL_SPREAD_SHOT 37790
#define SPELL_SHOOT 37770
//Guardian spells
#define SPELL_ARCINGSMASH 38761 // Wrong SpellId. Can't find the right one.
#define SPELL_HAMSTRING 26211
#define SPELL_ARCINGSMASH 38761 // Wrong SpellId. Can't find the right one.
#define SPELL_HAMSTRING 26211
float AddPos[9][3] =
{
{2.8553810, -459.823914, -19.182686}, //MOVE_AMBUSHER_1 X, Y, Z
{12.400000, -466.042267, -19.182686}, //MOVE_AMBUSHER_2 X, Y, Z
{51.366653, -460.836060, -19.182686}, //MOVE_AMBUSHER_3 X, Y, Z
{62.597980, -457.433044, -19.182686}, //MOVE_AMBUSHER_4 X, Y, Z
{77.607452, -384.302765, -19.182686}, //MOVE_AMBUSHER_5 X, Y, Z
{63.897900, -378.984924, -19.182686}, //MOVE_AMBUSHER_6 X, Y, Z
{34.447250, -387.333618, -19.182686}, //MOVE_GUARDIAN_1 X, Y, Z
{14.388216, -423.468018, -19.625271}, //MOVE_GUARDIAN_2 X, Y, Z
{42.471519, -445.115295, -19.769423} //MOVE_GUARDIAN_3 X, Y, Z
{2.8553810, -459.823914, -19.182686}, //MOVE_AMBUSHER_1 X, Y, Z
{12.400000, -466.042267, -19.182686}, //MOVE_AMBUSHER_2 X, Y, Z
{51.366653, -460.836060, -19.182686}, //MOVE_AMBUSHER_3 X, Y, Z
{62.597980, -457.433044, -19.182686}, //MOVE_AMBUSHER_4 X, Y, Z
{77.607452, -384.302765, -19.182686}, //MOVE_AMBUSHER_5 X, Y, Z
{63.897900, -378.984924, -19.182686}, //MOVE_AMBUSHER_6 X, Y, Z
{34.447250, -387.333618, -19.182686}, //MOVE_GUARDIAN_1 X, Y, Z
{14.388216, -423.468018, -19.625271}, //MOVE_GUARDIAN_2 X, Y, Z
{42.471519, -445.115295, -19.769423} //MOVE_GUARDIAN_3 X, Y, Z
};
enum RotationType
{
NOROTATE = 0,
CLOCKWISE = 1,
COUNTERCLOCKWISE = 2,
NOROTATE = 0,
CLOCKWISE = 1,
COUNTERCLOCKWISE = 2,
};
struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
{
boss_the_lurker_belowAI(Creature *c) : Scripted_NoMovementAI(c), Summons(m_creature)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SPOUT_ANIM);
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SPOUT_ANIM);
if(TempSpell)
{
TempSpell->Effect[0] = 0;//remove all spell effect, only anim is needed
TempSpell->Effect[1] = 0;
TempSpell->Effect[2] = 0;
}
}
{
TempSpell->Effect[0] = 0;//remove all spell effect, only anim is needed
TempSpell->Effect[1] = 0;
TempSpell->Effect[2] = 0;
}
}
ScriptedInstance* pInstance;
ScriptedInstance* pInstance;
SummonList Summons;
bool Spawned;
bool Spawned;
bool Submerged;
double SpoutAngle;
uint8 RotType;
uint8 RotType;
uint32 RotTimer;
uint32 SpoutAnimTimer;
uint32 WaterboltTimer;
uint32 SpoutTimer;
uint32 WhirlTimer;//after avery spout
uint32 PhaseTimer;
uint32 GeyserTimer;
uint32 RotTimer;
uint32 SpoutAnimTimer;
uint32 WaterboltTimer;
uint32 SpoutTimer;
uint32 WhirlTimer;//after avery spout
uint32 PhaseTimer;
uint32 GeyserTimer;
void Reset()
{
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING + MOVEMENTFLAG_LEVITATING);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetCorpseDelay(1000*60*60);
void Reset()
{
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING + MOVEMENTFLAG_LEVITATING);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetCorpseDelay(1000*60*60);
RotType = NOROTATE;
SpoutAngle = 0;
SpoutAnimTimer = 1000;
RotTimer = 20000;
WaterboltTimer = 3000;
SpoutTimer = 15000;
WhirlTimer = 18000;//after avery spout
PhaseTimer = 120000;
GeyserTimer = rand()%5000 + 15000;
SpoutAngle = 0;
SpoutAnimTimer = 1000;
RotTimer = 20000;
WaterboltTimer = 3000;
SpoutTimer = 15000;
WhirlTimer = 18000;//after avery spout
PhaseTimer = 120000;
GeyserTimer = rand()%5000 + 15000;
Submerged = false;
Spawned = false;
Spawned = false;
Summons.DespawnAll();
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, NOT_STARTED);
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, NOT_STARTED);
/*if(pInstance->GetData(DATA_STRANGE_POOL) != DONE)
{
m_creature->SetReactState(REACT_PASSIVE);
m_creature->SetVisibility(VISIBILITY_OFF);
}else {
m_creature->SetVisibility(VISIBILITY_ON);
m_creature->SetReactState(REACT_AGGRESSIVE);
}*/
}
/*if(pInstance->GetData(DATA_STRANGE_POOL) != DONE)
{
m_creature->SetReactState(REACT_PASSIVE);
m_creature->SetVisibility(VISIBILITY_OFF);
}else {
m_creature->SetVisibility(VISIBILITY_ON);
m_creature->SetReactState(REACT_AGGRESSIVE);
}*/
}
void MoveInLineOfSight(Unit *who)
{
if (!who || m_creature->getVictim())
if (!who || m_creature->getVictim())
return;
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
AttackStart(who);
AttackStart(who);
}
}
void Aggro(Unit *who)
{
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS);
void Aggro(Unit *who)
{
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS);
if (!who || m_creature->getVictim())
return;
if (!who || m_creature->getVictim())
return;
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
AttackStart(who);
}
}
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->IsWithinLOSInMap(who))
AttackStart(who);
}
}
void JustDied(Unit* Killer)
{
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, DONE);
void JustDied(Unit* Killer)
{
if(pInstance)
pInstance->SetData(DATA_THELURKERBELOWEVENT, DONE);
Summons.DespawnAll();
}
}
void Rotate(const uint32 diff)
{
bool Spout = false;
switch (RotType)
{
case NOROTATE:
return;
case CLOCKWISE://20secs for 360turn
//no target if rotating!
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
SpoutAngle += (double)diff/20000*(double)M_PI*2;
if (SpoutAngle >= M_PI*2)SpoutAngle = 0;
m_creature->SetOrientation(SpoutAngle);
m_creature->StopMoving();
Spout = true;
break;
case COUNTERCLOCKWISE://20secs for 360turn
//no target if rotating!
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
SpoutAngle -= (double)diff/20000*(double)M_PI*2;
if (SpoutAngle <= 0)SpoutAngle = M_PI*2;
m_creature->SetOrientation(SpoutAngle);
m_creature->StopMoving();
Spout = true;
break;
}
void Rotate(const uint32 diff)
{
bool Spout = false;
switch (RotType)
{
case NOROTATE:
return;
case CLOCKWISE://20secs for 360turn
//no target if rotating!
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
SpoutAngle += (double)diff/20000*(double)M_PI*2;
if (SpoutAngle >= M_PI*2)SpoutAngle = 0;
m_creature->SetOrientation(SpoutAngle);
m_creature->StopMoving();
Spout = true;
break;
case COUNTERCLOCKWISE://20secs for 360turn
//no target if rotating!
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
SpoutAngle -= (double)diff/20000*(double)M_PI*2;
if (SpoutAngle <= 0)SpoutAngle = M_PI*2;
m_creature->SetOrientation(SpoutAngle);
m_creature->StopMoving();
Spout = true;
break;
}
if(!Spout)
return;
if(!Spout)
return;
if(RotTimer<diff)//end rotate
{
RotType = NOROTATE;//set norotate state
RotTimer=20000;
m_creature->InterruptNonMeleeSpells(false);
WhirlTimer = 4000; //whirl directly after spout ends
return;
}else RotTimer-=diff;
if(RotTimer<diff)//end rotate
{
RotType = NOROTATE;//set norotate state
RotTimer=20000;
m_creature->InterruptNonMeleeSpells(false);
WhirlTimer = 4000; //whirl directly after spout ends
return;
}else RotTimer-=diff;
if(SpoutAnimTimer<diff)
{
DoCast(m_creature,SPELL_SPOUT_ANIM,true);
if(SpoutAnimTimer<diff)
{
DoCast(m_creature,SPELL_SPOUT_ANIM,true);
SpoutAnimTimer = 1000;
}else SpoutAnimTimer-=diff;
@@ -230,145 +230,145 @@ struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
{
Player *target = i->getSource();
if(target->isAlive() && m_creature->HasInArc((double)diff/20000*(double)M_PI*2,target) && m_creature->GetDistance(target) <= SPOUT_DIST && !target->IsInWater())
DoCast(target,SPELL_SPOUT,true);//only knock back palyers in arc, in 100yards, not in water
}
DoCast(target,SPELL_SPOUT,true);//only knock back palyers in arc, in 100yards, not in water
}
}
}
}
void StartRotate(Unit* victim)
{
switch (rand()%2)
{
case 0: RotType = CLOCKWISE; break;
case 1: RotType = COUNTERCLOCKWISE; break;
}
void StartRotate(Unit* victim)
{
switch (rand()%2)
{
case 0: RotType = CLOCKWISE; break;
case 1: RotType = COUNTERCLOCKWISE; break;
}
RotTimer=20000;
if(victim)
SpoutAngle = m_creature->GetAngle(victim);
SpoutAngle = m_creature->GetAngle(victim);
m_creature->MonsterTextEmote(EMOTE_SPOUT,0,true);
//DoCast(m_creature,SPELL_SPOUT_BREATH);//take breath anim
}
//DoCast(m_creature,SPELL_SPOUT_BREATH);//take breath anim
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim() /*|| !m_creature->getVictim()*/ )//rotate resets target
return;
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim() /*|| !m_creature->getVictim()*/ )//rotate resets target
return;
//Check if players in water and if in water cast spell
Map *map = m_creature->GetMap();
if (map->IsDungeon() && pInstance->GetData(DATA_THELURKERBELOWEVENT) == IN_PROGRESS)
{
Map::PlayerList const &PlayerList = map->GetPlayers();
//Check if players in water and if in water cast spell
Map *map = m_creature->GetMap();
if (map->IsDungeon() && pInstance->GetData(DATA_THELURKERBELOWEVENT) == IN_PROGRESS)
{
Map::PlayerList const &PlayerList = map->GetPlayers();
if (PlayerList.isEmpty())
return;
if (PlayerList.isEmpty())
return;
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (i->getSource()->isAlive() && i->getSource()->IsInWater() && !i->getSource()->HasAura(SPELL_SCALDINGWATER, 0))
i->getSource()->CastSpell(i->getSource(), SPELL_SCALDINGWATER, true);
else if(!i->getSource()->IsInWater())
i->getSource()->RemoveAurasDueToSpell(SPELL_SCALDINGWATER);
}
}
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (i->getSource()->isAlive() && i->getSource()->IsInWater() && !i->getSource()->HasAura(SPELL_SCALDINGWATER, 0))
i->getSource()->CastSpell(i->getSource(), SPELL_SCALDINGWATER, true);
else if(!i->getSource()->IsInWater())
i->getSource()->RemoveAurasDueToSpell(SPELL_SCALDINGWATER);
}
}
Rotate(diff);//always check rotate things
if(!Submerged)
{
if(PhaseTimer < diff)
{
m_creature->InterruptNonMeleeSpells(false);
DoCast(m_creature,SPELL_SUBMERGE);
PhaseTimer = 60000;//60secs submerged
Submerged = true;
}else PhaseTimer-=diff;
}
Rotate(diff);//always check rotate things
if(!Submerged)
{
if(PhaseTimer < diff)
{
m_creature->InterruptNonMeleeSpells(false);
DoCast(m_creature,SPELL_SUBMERGE);
PhaseTimer = 60000;//60secs submerged
Submerged = true;
}else PhaseTimer-=diff;
}
if(!Submerged && RotType == NOROTATE)//is not spouting and not submerged
{
if(SpoutTimer < diff)
{
if(m_creature->getVictim() && RotType == NOROTATE)
StartRotate(m_creature->getVictim());//start spout and random rotate
if(!Submerged && RotType == NOROTATE)//is not spouting and not submerged
{
if(SpoutTimer < diff)
{
if(m_creature->getVictim() && RotType == NOROTATE)
StartRotate(m_creature->getVictim());//start spout and random rotate
SpoutTimer= 35000;
return;
}else SpoutTimer -= diff;
SpoutTimer= 35000;
return;
}else SpoutTimer -= diff;
//Whirl directly after a Spout and at random times
if(WhirlTimer < diff)
{
WhirlTimer = rand()%5000 + 15000;
DoCast(m_creature,SPELL_WHIRL);
WaterboltTimer += 5000;//add 5secs to waterbolt timer, to add some time to run back to boss
}else WhirlTimer -= diff;
//Whirl directly after a Spout and at random times
if(WhirlTimer < diff)
{
WhirlTimer = rand()%5000 + 15000;
DoCast(m_creature,SPELL_WHIRL);
WaterboltTimer += 5000;//add 5secs to waterbolt timer, to add some time to run back to boss
}else WhirlTimer -= diff;
if(GeyserTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,1);
if(GeyserTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,1);
if(target)
DoCast(target,SPELL_GEYSER,true);
else
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
DoCast(target,SPELL_GEYSER,true);
if(target)
DoCast(target,SPELL_GEYSER,true);
else
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
DoCast(target,SPELL_GEYSER,true);
GeyserTimer = rand()%5000 + 15000;
}else GeyserTimer -= diff;
GeyserTimer = rand()%5000 + 15000;
}else GeyserTimer -= diff;
if(WaterboltTimer < diff)
{
Unit* target = SelectUnit(SELECT_TARGET_NEAREST,0,14,true);
if(!target)
{
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
DoCast(target,SPELL_WATERBOLT);
}
WaterboltTimer = 3000;
}else WaterboltTimer -= diff;
if(WaterboltTimer < diff)
{
Unit* target = SelectUnit(SELECT_TARGET_NEAREST,0,14,true);
if(!target)
{
target = SelectUnit(SELECT_TARGET_RANDOM,0);
if(target)
DoCast(target,SPELL_WATERBOLT);
}
WaterboltTimer = 3000;
}else WaterboltTimer -= diff;
if (!UpdateVictim() )
return;
if (!UpdateVictim() )
return;
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}else if(!Submerged)
return;
else if(Submerged)//phase 2, submerged
{
if(PhaseTimer < diff)
{
Submerged = false;
m_creature->InterruptNonMeleeSpells(false);//shouldn't be any
m_creature->RemoveAllAuras();
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED);
m_creature->RemoveFlag(UNIT_FIELD_BYTES_1,9);
DoCast(m_creature,SPELL_EMERGE);
Spawned = false;
SpoutTimer = 4000; // directly cast Spout after emerging!
WhirlTimer = 26000;
PhaseTimer = 120000;
return;
}else PhaseTimer-=diff;
}else if(!Submerged)
return;
else if(Submerged)//phase 2, submerged
{
if(PhaseTimer < diff)
{
Submerged = false;
m_creature->InterruptNonMeleeSpells(false);//shouldn't be any
m_creature->RemoveAllAuras();
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED);
m_creature->RemoveFlag(UNIT_FIELD_BYTES_1,9);
DoCast(m_creature,SPELL_EMERGE);
Spawned = false;
SpoutTimer = 4000; // directly cast Spout after emerging!
WhirlTimer = 26000;
PhaseTimer = 120000;
return;
}else PhaseTimer-=diff;
if(!m_creature->isInCombat())
m_creature->SetInCombatState(false);
if(!m_creature->isInCombat())
m_creature->SetInCombatState(false);
if(!Spawned)
{
m_creature->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
//spawn adds
if(!Spawned)
{
m_creature->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
//spawn adds
for (uint8 i = 0; i < 9; ++i)
{
Creature* Summoned;
if(i < 7)
if(i < 7)
Summoned = m_creature->SummonCreature(MOB_COILFANG_AMBUSHER,AddPos[i][0],AddPos[i][1],AddPos[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
else Summoned = m_creature->SummonCreature(MOB_COILFANG_GUARDIAN,AddPos[i][0],AddPos[i][1],AddPos[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
@@ -396,66 +396,66 @@ CreatureAI* GetAI_mob_coilfang_guardian(Creature *_Creature)
ai->Spell[1].First_Cast = 2000;
ai->Spell[1].Cast_Target_Type = CAST_HOSTILE_TARGET;
return ai;
return ai;
}
struct TRINITY_DLL_DECL mob_coilfang_ambusherAI : public Scripted_NoMovementAI
{
mob_coilfang_ambusherAI(Creature *c) : Scripted_NoMovementAI(c)
{
Reset();
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SHOOT);
{
Reset();
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SHOOT);
if(TempSpell)
TempSpell->Effect[0] = 2;//change spell effect from weapon % dmg to simple phisical dmg
}
TempSpell->Effect[0] = 2;//change spell effect from weapon % dmg to simple phisical dmg
}
uint32 MultiShotTimer;
uint32 ShootBowTimer;
uint32 MultiShotTimer;
uint32 ShootBowTimer;
void Reset()
{
MultiShotTimer = 10000;
ShootBowTimer = 4000;
MultiShotTimer = 10000;
ShootBowTimer = 4000;
}
}
void Aggro(Unit *who)
void Aggro(Unit *who)
{
}
void MoveInLineOfSight(Unit *who)
{
if (!who || m_creature->getVictim()) return;
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
AttackStart(who);
}
}
void UpdateAI(const uint32 diff)
{
if(MultiShotTimer < diff)
{
if(m_creature->getVictim())
DoCast(m_creature->getVictim(), SPELL_SPREAD_SHOT, true);
if (!who || m_creature->getVictim()) return;
MultiShotTimer = 10000;
ShootBowTimer += 1500;//add global cooldown
}else MultiShotTimer -= diff;
if (who->isTargetableForAttack() && who->isInAccessiblePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
AttackStart(who);
}
}
if(ShootBowTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
int bp0 = 1100;
if(target)
m_creature->CastCustomSpell(target,SPELL_SHOOT,&bp0,NULL,NULL,true);
ShootBowTimer = 4000;
MultiShotTimer += 1500;//add global cooldown
}else ShootBowTimer -= diff;
}
void UpdateAI(const uint32 diff)
{
if(MultiShotTimer < diff)
{
if(m_creature->getVictim())
DoCast(m_creature->getVictim(), SPELL_SPREAD_SHOT, true);
MultiShotTimer = 10000;
ShootBowTimer += 1500;//add global cooldown
}else MultiShotTimer -= diff;
if(ShootBowTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
int bp0 = 1100;
if(target)
m_creature->CastCustomSpell(target,SPELL_SHOOT,&bp0,NULL,NULL,true);
ShootBowTimer = 4000;
MultiShotTimer += 1500;//add global cooldown
}else ShootBowTimer -= diff;
}
};
CreatureAI* GetAI_mob_coilfang_ambusher(Creature *_Creature)
@@ -476,12 +476,12 @@ void AddSC_boss_the_lurker_below()
newscript->GetAI = &GetAI_boss_the_lurker_below;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="mob_coilfang_guardian";
newscript->GetAI = &GetAI_mob_coilfang_guardian;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="mob_coilfang_ambusher";
newscript->GetAI = &GetAI_mob_coilfang_ambusher;
newscript->RegisterSelf();
@@ -55,27 +55,27 @@ EndScriptData */
#define WATERY_GRAVE_Y4 -690.96
#define WATERY_GRAVE_Z4 -14.44
#define SPELL_WATERY_GRAVE_1 38023
#define SPELL_WATERY_GRAVE_2 38024
#define SPELL_WATERY_GRAVE_3 38025
#define SPELL_WATERY_GRAVE_4 37850
#define SPELL_WATERY_GRAVE_1 38023
#define SPELL_WATERY_GRAVE_2 38024
#define SPELL_WATERY_GRAVE_3 38025
#define SPELL_WATERY_GRAVE_4 37850
#define SPELL_SUMMON_WATER_GLOBULE_1 37854
#define SPELL_SUMMON_WATER_GLOBULE_2 37858
#define SPELL_SUMMON_WATER_GLOBULE_3 37860
#define SPELL_SUMMON_WATER_GLOBULE_4 37861
#define SPELL_SUMMON_WATER_GLOBULE_1 37854
#define SPELL_SUMMON_WATER_GLOBULE_2 37858
#define SPELL_SUMMON_WATER_GLOBULE_3 37860
#define SPELL_SUMMON_WATER_GLOBULE_4 37861
/*#define SPELL_SUMMON_MURLOC_A6 39813
#define SPELL_SUMMON_MURLOC_A7 39814
#define SPELL_SUMMON_MURLOC_A8 39815
#define SPELL_SUMMON_MURLOC_A9 39816
#define SPELL_SUMMON_MURLOC_A10 39817
/*#define SPELL_SUMMON_MURLOC_A6 39813
#define SPELL_SUMMON_MURLOC_A7 39814
#define SPELL_SUMMON_MURLOC_A8 39815
#define SPELL_SUMMON_MURLOC_A9 39816
#define SPELL_SUMMON_MURLOC_A10 39817
#define SPELL_SUMMON_MURLOC_B6 39818
#define SPELL_SUMMON_MURLOC_B7 39819
#define SPELL_SUMMON_MURLOC_B8 39820
#define SPELL_SUMMON_MURLOC_B9 39821
#define SPELL_SUMMON_MURLOC_B10 39822*/
#define SPELL_SUMMON_MURLOC_B6 39818
#define SPELL_SUMMON_MURLOC_B7 39819
#define SPELL_SUMMON_MURLOC_B8 39820
#define SPELL_SUMMON_MURLOC_B9 39821
#define SPELL_SUMMON_MURLOC_B10 39822*/
float MurlocCords[10][5] =
{
@@ -105,7 +105,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
}
ScriptedInstance* pInstance;
Map::PlayerList const *PlayerList;
Map::PlayerList const *PlayerList;
uint32 TidalWave_Timer;
uint32 WateryGrave_Timer;
@@ -124,7 +124,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
WateryGrave_Timer = 30000;
Earthquake_Timer = 40000;
WateryGlobules_Timer = 0;
globulespell[0] = SPELL_SUMMON_WATER_GLOBULE_1;
globulespell[0] = SPELL_SUMMON_WATER_GLOBULE_1;
globulespell[1] = SPELL_SUMMON_WATER_GLOBULE_2;
globulespell[2] = SPELL_SUMMON_WATER_GLOBULE_3;
globulespell[3] = SPELL_SUMMON_WATER_GLOBULE_4;
@@ -148,9 +148,9 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
}
@@ -162,18 +162,18 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
pInstance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, NOT_STARTED);
}
void Aggro(Unit *who)
{
void Aggro(Unit *who)
{
PlayerList = &((InstanceMap*)m_creature->GetMap())->GetPlayers();
Playercount = PlayerList->getSize();
StartEvent();
}
}
void ApplyWateryGrave(Unit *player, uint8 i)
{
switch(i)
switch(i)
{
case 0: player->CastSpell(player, SPELL_WATERY_GRAVE_1, true); break;
case 0: player->CastSpell(player, SPELL_WATERY_GRAVE_1, true); break;
case 1: player->CastSpell(player, SPELL_WATERY_GRAVE_2, true); break;
case 2: player->CastSpell(player, SPELL_WATERY_GRAVE_3, true); break;
case 3: player->CastSpell(player, SPELL_WATERY_GRAVE_4, true); break;
@@ -203,17 +203,17 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
}
for(uint8 i = 0; i < 10; i++)
{
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
Creature* Murloc = m_creature->SummonCreature(MurlocCords[i][0],MurlocCords[i][1],MurlocCords[i][2],MurlocCords[i][3],MurlocCords[i][4], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
Murloc->AI()->AttackStart(target);
}
DoScriptText(EMOTE_EARTHQUAKE, m_creature);
Earthquake = false;
Earthquake_Timer = 40000+rand()%5000;
}
}else Earthquake_Timer -= diff;
for(uint8 i = 0; i < 10; i++)
{
Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0);
Creature* Murloc = m_creature->SummonCreature(MurlocCords[i][0],MurlocCords[i][1],MurlocCords[i][2],MurlocCords[i][3],MurlocCords[i][4], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
Murloc->AI()->AttackStart(target);
}
DoScriptText(EMOTE_EARTHQUAKE, m_creature);
Earthquake = false;
Earthquake_Timer = 40000+rand()%5000;
}
}else Earthquake_Timer -= diff;
//TidalWave_Timer
if (TidalWave_Timer < diff)
@@ -229,21 +229,21 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
{
//Teleport 4 players under the waterfalls
Unit *target;
using std::set;
using std::set;
set<int>list;
set<int>::iterator itr;
for(uint8 i = 0; i < 4; i++)
{
counter = 0;
do{target = SelectUnit(SELECT_TARGET_RANDOM, 1, 50, true); //target players only
if(counter < Playercount)
break;
if(target) itr = list.find(target->GetGUID());
counter++;
}while(itr != list.end());
if(target){list.insert(target->GetGUID());
ApplyWateryGrave(target, i);
}
counter = 0;
do{target = SelectUnit(SELECT_TARGET_RANDOM, 1, 50, true); //target players only
if(counter < Playercount)
break;
if(target) itr = list.find(target->GetGUID());
counter++;
}while(itr != list.end());
if(target){list.insert(target->GetGUID());
ApplyWateryGrave(target, i);
}
}
switch(rand()%2)
@@ -265,7 +265,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
//WateryGlobules_Timer
if (WateryGlobules_Timer < diff)
{
Unit* globuletarget;
Unit* globuletarget;
using std::set;
set<int>globulelist;
set<int>::iterator itr;
@@ -333,7 +333,7 @@ struct TRINITY_DLL_DECL mob_water_globuleAI : public ScriptedAI
{
if (m_creature->IsWithinDistInMap(m_creature->getVictim(), 5))
{
DoCast(m_creature->getVictim(), SPELL_GLOBULE_EXPLOSION);
DoCast(m_creature->getVictim(), SPELL_GLOBULE_EXPLOSION);
//despawn
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
@@ -39,11 +39,11 @@ bool GOHello_go_bridge_console(Player *player, GameObject* go)
{
ScriptedInstance* pInstance = (ScriptedInstance*)go->GetInstanceData();
if(!pInstance)
return false;
if(!pInstance)
return false;
if (pInstance)
pInstance->SetData(DATA_CONTROL_CONSOLE, DONE);
if (pInstance)
pInstance->SetData(DATA_CONTROL_CONSOLE, DONE);
return true;
}
@@ -52,40 +52,40 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
{
instance_serpentshrine_cavern(Map *map) : ScriptedInstance(map) {Initialize();};
uint64 LurkerBelow;
uint64 LurkerBelow;
uint64 Sharkkis;
uint64 Tidalvess;
uint64 Caribdis;
uint64 LadyVashj;
uint64 Karathress;
uint64 KarathressEvent_Starter;
uint64 LeotherasTheBlind;
uint64 LeotherasEventStarter;
uint64 LeotherasTheBlind;
uint64 LeotherasEventStarter;
uint64 ControlConsole;
uint64 BridgePart[3];
uint64 StrangePool;
uint64 ControlConsole;
uint64 BridgePart[3];
uint64 StrangePool;
bool ShieldGeneratorDeactivated[4];
bool Encounters[ENCOUNTERS];
void Initialize()
{
LurkerBelow = 0;
LurkerBelow = 0;
Sharkkis = 0;
Tidalvess = 0;
Caribdis = 0;
LadyVashj = 0;
Karathress = 0;
KarathressEvent_Starter = 0;
LeotherasTheBlind = 0;
LeotherasEventStarter = 0;
LeotherasTheBlind = 0;
LeotherasEventStarter = 0;
ControlConsole = 0;
BridgePart[0] = 0;
BridgePart[1] = 0;
BridgePart[2] = 0;
StrangePool = 0;
ControlConsole = 0;
BridgePart[0] = 0;
BridgePart[1] = 0;
BridgePart[2] = 0;
StrangePool = 0;
ShieldGeneratorDeactivated[0] = false;
ShieldGeneratorDeactivated[1] = false;
@@ -104,37 +104,37 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
return false;
}
void OnObjectCreate(GameObject *go)
void OnObjectCreate(GameObject *go)
{
switch(go->GetEntry())
{
case 184568:
ControlConsole = go->GetGUID();
go->setActive(true);
case 184568:
ControlConsole = go->GetGUID();
go->setActive(true);
break;
case 184203:
BridgePart[0] = go->GetGUID();
go->setActive(true);
BridgePart[0] = go->GetGUID();
go->setActive(true);
break;
case 184204:
BridgePart[1] = go->GetGUID();
go->setActive(true);
BridgePart[1] = go->GetGUID();
go->setActive(true);
break;
case 184205:
BridgePart[2] = go->GetGUID();
go->setActive(true);
case 184205:
BridgePart[2] = go->GetGUID();
go->setActive(true);
break;
case 184956:
StrangePool = go->GetGUID();
if(go->isActive())
SetData(DATA_STRANGE_POOL, DONE);
case 184956:
StrangePool = go->GetGUID();
if(go->isActive())
SetData(DATA_STRANGE_POOL, DONE);
}
}
void OpenDoor(uint64 DoorGUID, bool open)
void OpenDoor(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
Door->SetGoState(open ? 0 : 1);
@@ -144,36 +144,36 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
{
switch(creature_entry)
{
case 21212: LadyVashj = creature->GetGUID(); break;
case 21214: Karathress = creature->GetGUID(); break;
case 21966: Sharkkis = creature->GetGUID(); break;
case 21217: LurkerBelow = creature->GetGUID(); break;
case 21965: Tidalvess = creature->GetGUID(); break;
case 21964: Caribdis = creature->GetGUID(); break;
case 21215: LeotherasTheBlind = creature->GetGUID(); break;}
case 21212: LadyVashj = creature->GetGUID(); break;
case 21214: Karathress = creature->GetGUID(); break;
case 21966: Sharkkis = creature->GetGUID(); break;
case 21217: LurkerBelow = creature->GetGUID(); break;
case 21965: Tidalvess = creature->GetGUID(); break;
case 21964: Caribdis = creature->GetGUID(); break;
case 21215: LeotherasTheBlind = creature->GetGUID(); break;}
}
void SetData64(uint32 type, uint64 data)
{
if(type == DATA_KARATHRESSEVENT_STARTER)
KarathressEvent_Starter = data;
if(type == DATA_LEOTHERAS_EVENT_STARTER)
LeotherasEventStarter = data;
KarathressEvent_Starter = data;
if(type == DATA_LEOTHERAS_EVENT_STARTER)
LeotherasEventStarter = data;
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_THELURKERBELOW: return LurkerBelow;
case DATA_SHARKKIS: return Sharkkis;
case DATA_TIDALVESS: return Tidalvess;
case DATA_CARIBDIS: return Caribdis;
case DATA_LADYVASHJ: return LadyVashj;
case DATA_KARATHRESS: return Karathress;
case DATA_KARATHRESSEVENT_STARTER: return KarathressEvent_Starter;
case DATA_LEOTHERAS: return LeotherasTheBlind;
case DATA_LEOTHERAS_EVENT_STARTER: return LeotherasEventStarter;
case DATA_THELURKERBELOW: return LurkerBelow;
case DATA_SHARKKIS: return Sharkkis;
case DATA_TIDALVESS: return Tidalvess;
case DATA_CARIBDIS: return Caribdis;
case DATA_LADYVASHJ: return LadyVashj;
case DATA_KARATHRESS: return Karathress;
case DATA_KARATHRESSEVENT_STARTER: return KarathressEvent_Starter;
case DATA_LEOTHERAS: return LeotherasTheBlind;
case DATA_LEOTHERAS_EVENT_STARTER: return LeotherasEventStarter;
}
return 0;
}
@@ -182,63 +182,63 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
{
switch(type)
{
case DATA_STRANGE_POOL: StrangePool = data;
case DATA_CONTROL_CONSOLE:
if(data = DONE)
{
OpenDoor(BridgePart[0], true);
OpenDoor(BridgePart[1], true);
OpenDoor(BridgePart[2], true);
}
ControlConsole = data;
case DATA_HYDROSSTHEUNSTABLEEVENT: Encounters[0] = data; break;
case DATA_LEOTHERASTHEBLINDEVENT: Encounters[1] = data; break;
case DATA_THELURKERBELOWEVENT: Encounters[2] = data; break;
case DATA_KARATHRESSEVENT: Encounters[3] = data; break;
case DATA_MOROGRIMTIDEWALKEREVENT: Encounters[4] = data; break;
//Lady Vashj
case DATA_LADYVASHJEVENT:
if(data == NOT_STARTED)
{
ShieldGeneratorDeactivated[0] = false;
ShieldGeneratorDeactivated[1] = false;
ShieldGeneratorDeactivated[2] = false;
ShieldGeneratorDeactivated[3] = false;
}
Encounters[5] = data; break;
case DATA_SHIELDGENERATOR1:ShieldGeneratorDeactivated[0] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR2:ShieldGeneratorDeactivated[1] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR3:ShieldGeneratorDeactivated[2] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR4:ShieldGeneratorDeactivated[3] = (data) ? true : false; break;
}
case DATA_STRANGE_POOL: StrangePool = data;
case DATA_CONTROL_CONSOLE:
if(data = DONE)
{
OpenDoor(BridgePart[0], true);
OpenDoor(BridgePart[1], true);
OpenDoor(BridgePart[2], true);
}
ControlConsole = data;
case DATA_HYDROSSTHEUNSTABLEEVENT: Encounters[0] = data; break;
case DATA_LEOTHERASTHEBLINDEVENT: Encounters[1] = data; break;
case DATA_THELURKERBELOWEVENT: Encounters[2] = data; break;
case DATA_KARATHRESSEVENT: Encounters[3] = data; break;
case DATA_MOROGRIMTIDEWALKEREVENT: Encounters[4] = data; break;
//Lady Vashj
case DATA_LADYVASHJEVENT:
if(data == NOT_STARTED)
{
ShieldGeneratorDeactivated[0] = false;
ShieldGeneratorDeactivated[1] = false;
ShieldGeneratorDeactivated[2] = false;
ShieldGeneratorDeactivated[3] = false;
}
Encounters[5] = data; break;
case DATA_SHIELDGENERATOR1:ShieldGeneratorDeactivated[0] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR2:ShieldGeneratorDeactivated[1] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR3:ShieldGeneratorDeactivated[2] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR4:ShieldGeneratorDeactivated[3] = (data) ? true : false; break;
}
if(data = DONE)
SaveToDB();
if(data = DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_HYDROSSTHEUNSTABLEEVENT: return Encounters[0];
case DATA_LEOTHERASTHEBLINDEVENT: return Encounters[1];
case DATA_THELURKERBELOWEVENT: return Encounters[2];
case DATA_KARATHRESSEVENT: return Encounters[3];
case DATA_MOROGRIMTIDEWALKEREVENT: return Encounters[4];
case DATA_HYDROSSTHEUNSTABLEEVENT: return Encounters[0];
case DATA_LEOTHERASTHEBLINDEVENT: return Encounters[1];
case DATA_THELURKERBELOWEVENT: return Encounters[2];
case DATA_KARATHRESSEVENT: return Encounters[3];
case DATA_MOROGRIMTIDEWALKEREVENT: return Encounters[4];
//Lady Vashj
case DATA_LADYVASHJEVENT: return Encounters[5];
case DATA_SHIELDGENERATOR1: return ShieldGeneratorDeactivated[0];
case DATA_SHIELDGENERATOR2: return ShieldGeneratorDeactivated[1];
case DATA_SHIELDGENERATOR3: return ShieldGeneratorDeactivated[2];
case DATA_SHIELDGENERATOR4: return ShieldGeneratorDeactivated[3];
case DATA_LADYVASHJEVENT: return Encounters[5];
case DATA_SHIELDGENERATOR1: return ShieldGeneratorDeactivated[0];
case DATA_SHIELDGENERATOR2: return ShieldGeneratorDeactivated[1];
case DATA_SHIELDGENERATOR3: return ShieldGeneratorDeactivated[2];
case DATA_SHIELDGENERATOR4: return ShieldGeneratorDeactivated[3];
case DATA_CANSTARTPHASE3:
if(ShieldGeneratorDeactivated[0] && ShieldGeneratorDeactivated[1] && ShieldGeneratorDeactivated[2] && ShieldGeneratorDeactivated[3])return 1;break;
if(ShieldGeneratorDeactivated[0] && ShieldGeneratorDeactivated[1] && ShieldGeneratorDeactivated[2] && ShieldGeneratorDeactivated[3])return 1;break;
}
return 0;
}
const char* Save()
{
OUT_SAVE_INST_DATA;
const char* Save()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " "
<< Encounters[3] << " " << Encounters[4] << " " << Encounters[5];
@@ -262,11 +262,11 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
OUT_LOAD_INST_DATA(in);
std::istringstream stream(in);
stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]
>> Encounters[4] >> Encounters[5];
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;
OUT_LOAD_INST_DATA_COMPLETE;
>> Encounters[4] >> Encounters[5];
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;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
@@ -284,8 +284,8 @@ void AddSC_instance_serpentshrine_cavern()
newscript->GetInstanceData = &GetInstanceData_instance_serpentshrine_cavern;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="go_bridge_console";
newscript->pGOHello = &GOHello_go_bridge_console;
newscript->RegisterSelf();
newscript->RegisterSelf();
}
@@ -38,33 +38,33 @@ EndScriptData */
bool GOHello_go_main_chambers_access_panel(Player *player, GameObject* _GO)
{
ScriptedInstance* pInstance = (ScriptedInstance*)_GO->GetInstanceData();
ScriptedInstance* pInstance = (ScriptedInstance*)_GO->GetInstanceData();
if (!pInstance)
return false;
if (!pInstance)
return false;
if (_GO->GetEntry() == ACCESS_PANEL_HYDRO && pInstance->GetData(TYPE_HYDROMANCER_THESPIA) == DONE)
pInstance->SetData(TYPE_HYDROMANCER_THESPIA,SPECIAL);
if (_GO->GetEntry() == ACCESS_PANEL_HYDRO && pInstance->GetData(TYPE_HYDROMANCER_THESPIA) == DONE)
pInstance->SetData(TYPE_HYDROMANCER_THESPIA,SPECIAL);
if (_GO->GetEntry() == ACCESS_PANEL_MEK && pInstance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == DONE)
pInstance->SetData(TYPE_MEKGINEER_STEAMRIGGER,SPECIAL);
if (_GO->GetEntry() == ACCESS_PANEL_MEK && pInstance->GetData(TYPE_MEKGINEER_STEAMRIGGER) == DONE)
pInstance->SetData(TYPE_MEKGINEER_STEAMRIGGER,SPECIAL);
return true;
return true;
}
struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
{
instance_steam_vault(Map *map) : ScriptedInstance(map) {Initialize();};
uint32 Encounter[ENCOUNTERS];
uint32 Encounter[ENCOUNTERS];
uint64 ThespiaGUID;
uint64 MekgineerGUID;
uint64 KalithreshGUID;
uint64 MainChambersDoor;
uint64 AccessPanelHydro;
uint64 AccessPanelMek;
uint64 MainChambersDoor;
uint64 AccessPanelHydro;
uint64 AccessPanelMek;
void Initialize()
{
@@ -72,46 +72,46 @@ struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
MekgineerGUID = 0;
KalithreshGUID = 0;
MainChambersDoor = 0;
AccessPanelHydro = 0;
AccessPanelMek = 0;
AccessPanelHydro = 0;
AccessPanelMek = 0;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
Encounter[i] = NOT_STARTED;
}
bool IsEncounterInProgress() const
{
for(uint8 i = 0; i < ENCOUNTERS; i++)
if (Encounter[i] == IN_PROGRESS)
return true;
return true;
return false;
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* plr = itr->getSource())
return plr;
}
}
debug_log("SD2: Instance Steamvault: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
debug_log("SD2: Instance Steamvault: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
{
switch(creature->GetEntry())
{
case 17797: ThespiaGUID = creature->GetGUID(); break;
case 17796: MekgineerGUID = creature->GetGUID(); break;
case 17798: KalithreshGUID = creature->GetGUID(); break;
case 17797: ThespiaGUID = creature->GetGUID(); break;
case 17796: MekgineerGUID = creature->GetGUID(); break;
case 17798: KalithreshGUID = creature->GetGUID(); break;
}
}
@@ -119,51 +119,51 @@ struct TRINITY_DLL_DECL instance_steam_vault : public ScriptedInstance
{
switch(go->GetEntry())
{
case MAIN_CHAMBERS_DOOR: MainChambersDoor = go->GetGUID(); break;
case ACCESS_PANEL_HYDRO: AccessPanelHydro = go->GetGUID(); break;
case ACCESS_PANEL_MEK: AccessPanelMek = go->GetGUID(); break;
case MAIN_CHAMBERS_DOOR: MainChambersDoor = go->GetGUID(); break;
case ACCESS_PANEL_HYDRO: AccessPanelHydro = go->GetGUID(); break;
case ACCESS_PANEL_MEK: AccessPanelMek = go->GetGUID(); break;
}
}
void SetData(uint32 type, uint32 data)
{
Player *player = GetPlayerInMap();
Player *player = GetPlayerInMap();
if (!player)
{
debug_log("SD2: Instance Steamvault: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
if (!player)
{
debug_log("SD2: Instance Steamvault: SetData (Type: %u Data %u) cannot find any player.", type, data);
return;
}
switch(type)
{
case TYPE_HYDROMANCER_THESPIA:
if (data == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,AccessPanelHydro))
_go->SetGoState(0);
if (data == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,AccessPanelHydro))
_go->SetGoState(0);
if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,MainChambersDoor))
_go->SetGoState(0);
}
debug_log("SD2: Instance Steamvault: Access panel used.");
}
Encounter[0] = data;
break;
if (GetData(TYPE_MEKGINEER_STEAMRIGGER) == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,MainChambersDoor))
_go->SetGoState(0);
}
debug_log("SD2: Instance Steamvault: Access panel used.");
}
Encounter[0] = data;
break;
case TYPE_MEKGINEER_STEAMRIGGER:
if (data == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,AccessPanelMek))
_go->SetGoState(0);
if (data == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,AccessPanelMek))
_go->SetGoState(0);
if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL)
{
if (GetData(TYPE_HYDROMANCER_THESPIA) == SPECIAL)
{
if (GameObject *_go = GameObject::GetGameObject(*player,MainChambersDoor))
_go->SetGoState(0);
}
debug_log("SD2: Instance Steamvault: Access panel used.");
}
debug_log("SD2: Instance Steamvault: Access panel used.");
}
Encounter[1] = data;
break;
@@ -216,10 +216,10 @@ void AddSC_instance_steam_vault()
{
Script *newscript;
newscript = new Script;
newscript->Name = "go_main_chambers_access_panel";
newscript->pGOHello = &GOHello_go_main_chambers_access_panel;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "go_main_chambers_access_panel";
newscript->pGOHello = &GOHello_go_main_chambers_access_panel;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "instance_steam_vault";
@@ -554,79 +554,79 @@ bool GOHello_go_second_trial(Player *player, GameObject* _GO)
## npc_apprentice_mirveda
######*/
#define QUEST_UNEXPECTED_RESULT 8488
#define MOB_GHARZUL 15958
#define MOB_ANGERSHADE 15656
#define QUEST_UNEXPECTED_RESULT 8488
#define MOB_GHARZUL 15958
#define MOB_ANGERSHADE 15656
struct TRINITY_DLL_DECL npc_apprentice_mirvedaAI : public ScriptedAI
{
npc_apprentice_mirvedaAI(Creature* c) : ScriptedAI(c), Summons(m_creature) {Reset();}
npc_apprentice_mirvedaAI(Creature* c) : ScriptedAI(c), Summons(m_creature) {Reset();}
uint32 KillCount;
uint64 PlayerGUID;
bool Summon;
SummonList Summons;
uint32 KillCount;
uint64 PlayerGUID;
bool Summon;
SummonList Summons;
void Reset()
{
KillCount = 0;
PlayerGUID = 0;
Summons.DespawnAll();
Summon = false;
}
void Reset()
{
KillCount = 0;
PlayerGUID = 0;
Summons.DespawnAll();
Summon = false;
}
void Aggro(Unit* who){}
void Aggro(Unit* who){}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature);
Summons.Summon(summoned);
}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature);
Summons.Summon(summoned);
}
void SummonedCreatureDespawn(Creature* summoned)
{
Summons.Despawn(summoned);
++KillCount;
}
void SummonedCreatureDespawn(Creature* summoned)
{
Summons.Despawn(summoned);
++KillCount;
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_UNEXPECTED_RESULT);
}
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_UNEXPECTED_RESULT);
}
}
void UpdateAI(const uint32 diff)
{
if(KillCount >= 3)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if(player)
((Player*)player)->CompleteQuest(QUEST_UNEXPECTED_RESULT);
}
}
void UpdateAI(const uint32 diff)
{
if(KillCount >= 3)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if(player)
((Player*)player)->CompleteQuest(QUEST_UNEXPECTED_RESULT);
}
}
if(Summon)
{
m_creature->SummonCreature(MOB_GHARZUL, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
m_creature->SummonCreature(MOB_ANGERSHADE, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
m_creature->SummonCreature(MOB_ANGERSHADE, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
Summon = false;
}
}
if(Summon)
{
m_creature->SummonCreature(MOB_GHARZUL, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
m_creature->SummonCreature(MOB_ANGERSHADE, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
m_creature->SummonCreature(MOB_ANGERSHADE, 8745, -7134.32, 35.22, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
Summon = false;
}
}
};
bool QuestAccept_npc_apprentice_mirveda(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_UNEXPECTED_RESULT)
{
((npc_apprentice_mirvedaAI*)creature->AI())->Summon = true;
((npc_apprentice_mirvedaAI*)creature->AI())->PlayerGUID = player->GetGUID();
((npc_apprentice_mirvedaAI*)creature->AI())->Summon = true;
((npc_apprentice_mirvedaAI*)creature->AI())->PlayerGUID = player->GetGUID();
}
return true;
}
@@ -640,9 +640,9 @@ CreatureAI* GetAI_npc_apprentice_mirvedaAI(Creature *_Creature)
## npc_infused_crystal
######*/
#define MOB_ENRAGED_WRAITH 17086
#define EMOTE -1000283
#define QUEST_POWERING_OUR_DEFENSES 8490
#define MOB_ENRAGED_WRAITH 17086
#define EMOTE -1000283
#define QUEST_POWERING_OUR_DEFENSES 8490
struct Location
{
@@ -651,97 +651,97 @@ struct Location
static Location SpawnLocations[]=
{
{8270.68, -7188.53, 139.619},
{8284.27, -7187.78, 139.603},
{8297.43, -7193.53, 139.603},
{8303.5, -7201.96, 139.577},
{8273.22, -7241.82, 139.382},
{8254.89, -7222.12, 139.603},
{8278.51, -7242.13, 139.162},
{8267.97, -7239.17, 139.517}
{8270.68, -7188.53, 139.619},
{8284.27, -7187.78, 139.603},
{8297.43, -7193.53, 139.603},
{8303.5, -7201.96, 139.577},
{8273.22, -7241.82, 139.382},
{8254.89, -7222.12, 139.603},
{8278.51, -7242.13, 139.162},
{8267.97, -7239.17, 139.517}
};
struct TRINITY_DLL_DECL npc_infused_crystalAI : public Scripted_NoMovementAI
{
npc_infused_crystalAI(Creature* c) : Scripted_NoMovementAI(c) {Reset();}
npc_infused_crystalAI(Creature* c) : Scripted_NoMovementAI(c) {Reset();}
uint32 EndTimer;
uint32 WaveTimer;
bool Completed;
bool Progress;
uint64 PlayerGUID;
uint32 EndTimer;
uint32 WaveTimer;
bool Completed;
bool Progress;
uint64 PlayerGUID;
void Reset()
{
EndTimer = 0;
Completed = false;
Progress = false;
PlayerGUID = 0;
WaveTimer = 0;
}
void Reset()
{
EndTimer = 0;
Completed = false;
Progress = false;
PlayerGUID = 0;
WaveTimer = 0;
}
void Aggro(Unit* who){}
void Aggro(Unit* who){}
void MoveInLineOfSight(Unit* who)
{
if( who->GetTypeId() == TYPEID_PLAYER && !m_creature->canStartAttack(who) && !Progress)
{
if( ((Player*)who)->GetQuestStatus(QUEST_POWERING_OUR_DEFENSES) == QUEST_STATUS_INCOMPLETE )
{
float Radius = 10.0;
if( m_creature->IsWithinDistInMap(who, Radius) )
{
PlayerGUID = who->GetGUID();
WaveTimer = 1000;
EndTimer = 60000;
Progress = true;
}
}
}
}
void MoveInLineOfSight(Unit* who)
{
if( who->GetTypeId() == TYPEID_PLAYER && !m_creature->canStartAttack(who) && !Progress)
{
if( ((Player*)who)->GetQuestStatus(QUEST_POWERING_OUR_DEFENSES) == QUEST_STATUS_INCOMPLETE )
{
float Radius = 10.0;
if( m_creature->IsWithinDistInMap(who, Radius) )
{
PlayerGUID = who->GetGUID();
WaveTimer = 1000;
EndTimer = 60000;
Progress = true;
}
}
}
}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_POWERING_OUR_DEFENSES);
}
}
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_POWERING_OUR_DEFENSES);
}
}
void UpdateAI(const uint32 diff)
{
if(EndTimer < diff && Progress)
{
DoScriptText(EMOTE, m_creature);
Completed = true;
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if(player)
((Player*)player)->CompleteQuest(QUEST_POWERING_OUR_DEFENSES);
}
m_creature->DealDamage(m_creature,m_creature->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
}else EndTimer -= diff;
void UpdateAI(const uint32 diff)
{
if(EndTimer < diff && Progress)
{
DoScriptText(EMOTE, m_creature);
Completed = true;
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if(player)
((Player*)player)->CompleteQuest(QUEST_POWERING_OUR_DEFENSES);
}
m_creature->DealDamage(m_creature,m_creature->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
}else EndTimer -= diff;
if(WaveTimer < diff && !Completed && Progress)
{
uint32 ran1 = rand()%8;
uint32 ran2 = rand()%8;
uint32 ran3 = rand()%8;
m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran1].x, SpawnLocations[ran1].y, SpawnLocations[ran1].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran2].x, SpawnLocations[ran2].y, SpawnLocations[ran2].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran3].x, SpawnLocations[ran3].y, SpawnLocations[ran3].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
WaveTimer = 30000;
}else WaveTimer -= diff;
}
if(WaveTimer < diff && !Completed && Progress)
{
uint32 ran1 = rand()%8;
uint32 ran2 = rand()%8;
uint32 ran3 = rand()%8;
m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran1].x, SpawnLocations[ran1].y, SpawnLocations[ran1].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran2].x, SpawnLocations[ran2].y, SpawnLocations[ran2].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
m_creature->SummonCreature(MOB_ENRAGED_WRAITH, SpawnLocations[ran3].x, SpawnLocations[ran3].y, SpawnLocations[ran3].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
WaveTimer = 30000;
}else WaveTimer -= diff;
}
};
CreatureAI* GetAI_npc_infused_crystalAI(Creature *_Creature)
@@ -782,14 +782,14 @@ void AddSC_eversong_woods()
newscript->pGOHello = &GOHello_go_second_trial;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_apprentice_mirveda";
newscript->GetAI = &GetAI_npc_apprentice_mirvedaAI;
newscript->pQuestAccept = &QuestAccept_npc_apprentice_mirveda;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_apprentice_mirveda";
newscript->GetAI = &GetAI_npc_apprentice_mirvedaAI;
newscript->pQuestAccept = &QuestAccept_npc_apprentice_mirveda;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_infused_crystal";
newscript->GetAI = &GetAI_npc_infused_crystalAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_infused_crystal";
newscript->GetAI = &GetAI_npc_infused_crystalAI;
newscript->RegisterSelf();
}
@@ -149,87 +149,87 @@ bool GOHello_gilded_brazier(Player *player, GameObject* _GO)
struct TRINITY_DLL_DECL npc_ranger_lilathaAI : public npc_escortAI
{
npc_ranger_lilathaAI(Creature *c) : npc_escortAI(c) {Reset();}
npc_ranger_lilathaAI(Creature *c) : npc_escortAI(c) {Reset();}
std::list<GameObject*> CageList;
std::list<GameObject*> CageList;
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (!player)
if (!player)
return;
switch(i)
{
case 0:
{
m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
GameObject* Cage = FindGameObject(GO_CAGE, 20, m_creature);
if(Cage)
Cage->SetGoState(0);
DoScriptText(SAY_START, m_creature, player);
break;
}
case 5:
DoScriptText(SAY_PROGRESS1, m_creature, player);
case 11:
DoScriptText(SAY_PROGRESS2, m_creature, player);
m_creature->SetOrientation(4.762841);
break;
case 18:
{
DoScriptText(SAY_PROGRESS3, m_creature, player);
Creature* Summ1 = m_creature->SummonCreature(16342, 7627.083984, -7532.538086, 152.128616, 1.082733, TEMPSUMMON_DEAD_DESPAWN, 0);
Creature* Summ2 = m_creature->SummonCreature(16343, 7620.432129, -7532.550293, 152.454865, 0.827478, TEMPSUMMON_DEAD_DESPAWN, 0);
Summ1->Attack(m_creature, true);
Summ2->Attack(player, true);
m_creature->AI()->AttackStart(Summ1);
break;
}
case 19: m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 25: m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 30:
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_ESCAPE_FROM_THE_CATACOMBS,m_creature);
break;
case 32:
m_creature->SetOrientation(2.978281);
DoScriptText(SAY_END1, m_creature, player);
break;
case 33:
m_creature->SetOrientation(5.858011);
DoScriptText(SAY_END2, m_creature, player);
Unit* CaptainHelios = FindCreature(NPC_CAPTAIN_HELIOS, 50, m_creature);
if(CaptainHelios)
DoScriptText(SAY_CAPTAIN_ANSWER, CaptainHelios, player);
break;
}
}
{
case 0:
{
m_creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
GameObject* Cage = FindGameObject(GO_CAGE, 20, m_creature);
if(Cage)
Cage->SetGoState(0);
DoScriptText(SAY_START, m_creature, player);
break;
}
case 5:
DoScriptText(SAY_PROGRESS1, m_creature, player);
case 11:
DoScriptText(SAY_PROGRESS2, m_creature, player);
m_creature->SetOrientation(4.762841);
break;
case 18:
{
DoScriptText(SAY_PROGRESS3, m_creature, player);
Creature* Summ1 = m_creature->SummonCreature(16342, 7627.083984, -7532.538086, 152.128616, 1.082733, TEMPSUMMON_DEAD_DESPAWN, 0);
Creature* Summ2 = m_creature->SummonCreature(16343, 7620.432129, -7532.550293, 152.454865, 0.827478, TEMPSUMMON_DEAD_DESPAWN, 0);
Summ1->Attack(m_creature, true);
Summ2->Attack(player, true);
m_creature->AI()->AttackStart(Summ1);
break;
}
case 19: m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 25: m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); break;
case 30:
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_ESCAPE_FROM_THE_CATACOMBS,m_creature);
break;
case 32:
m_creature->SetOrientation(2.978281);
DoScriptText(SAY_END1, m_creature, player);
break;
case 33:
m_creature->SetOrientation(5.858011);
DoScriptText(SAY_END2, m_creature, player);
Unit* CaptainHelios = FindCreature(NPC_CAPTAIN_HELIOS, 50, m_creature);
if(CaptainHelios)
DoScriptText(SAY_CAPTAIN_ANSWER, CaptainHelios, player);
break;
}
}
void Aggro(Unit* who) {}
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(1602);
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(1602);
GameObject* Cage = FindGameObject(GO_CAGE, 20, m_creature);
if(Cage)
Cage->SetGoState(1);
}
GameObject* Cage = FindGameObject(GO_CAGE, 20, m_creature);
if(Cage)
Cage->SetGoState(1);
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_ESCAPE_FROM_THE_CATACOMBS);
}
}
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player)
((Player*)player)->FailQuest(QUEST_ESCAPE_FROM_THE_CATACOMBS);
}
}
void UpdateAI(const uint32 diff)
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
@@ -249,43 +249,43 @@ CreatureAI* GetAI_npc_ranger_lilathaAI(Creature *_Creature)
{
npc_ranger_lilathaAI* ranger_lilathaAI = new npc_ranger_lilathaAI(_Creature);
ranger_lilathaAI->AddWaypoint(0, 7545.07, -7359.87, 162.354, 4000); // Say0
ranger_lilathaAI->AddWaypoint(1, 7550.048340, -7362.237793, 162.235657);
ranger_lilathaAI->AddWaypoint(2, 7566.976074, -7364.315430, 161.738770);
ranger_lilathaAI->AddWaypoint(3, 7578.830566, -7361.677734, 161.738770);
ranger_lilathaAI->AddWaypoint(4, 7590.969238, -7359.053711, 162.257660);
ranger_lilathaAI->AddWaypoint(5, 7598.354004, -7362.815430, 162.256683, 4000); // Say1
ranger_lilathaAI->AddWaypoint(6, 7605.861328, -7380.424316, 161.937073);
ranger_lilathaAI->AddWaypoint(7, 7605.295410, -7387.382813, 157.253998);
ranger_lilathaAI->AddWaypoint(8, 7606.131836, -7393.893555, 156.941925);
ranger_lilathaAI->AddWaypoint(9, 7615.207520, -7400.187012, 157.142639);
ranger_lilathaAI->AddWaypoint(10, 7618.956543, -7402.652832, 158.202042);
ranger_lilathaAI->AddWaypoint(11, 7636.850586, -7401.756836, 162.144791);
ranger_lilathaAI->AddWaypoint(12, 7637.058105, -7404.944824, 162.206970, 4000);// Say2
ranger_lilathaAI->AddWaypoint(13, 7636.910645, -7412.585449, 162.366425);
ranger_lilathaAI->AddWaypoint(14, 7637.607910, -7425.591797, 162.630661);
ranger_lilathaAI->AddWaypoint(15, 7637.816895, -7459.057129, 163.302704);
ranger_lilathaAI->AddWaypoint(16, 7638.859863, -7470.902344, 162.517059);
ranger_lilathaAI->AddWaypoint(17, 7641.395996, -7488.217285, 157.381287);
ranger_lilathaAI->AddWaypoint(18, 7634.455566, -7505.451660, 154.682159);
ranger_lilathaAI->AddWaypoint(19, 7631.906738, -7516.948730, 153.597382); // say3
ranger_lilathaAI->AddWaypoint(20, 7622.231445, -7537.037598, 151.587112);
ranger_lilathaAI->AddWaypoint(21, 7610.921875, -7550.670410, 149.639374);
ranger_lilathaAI->AddWaypoint(22, 7598.229004, -7562.551758, 145.953888);
ranger_lilathaAI->AddWaypoint(23, 7588.509277, -7577.755371, 148.294479);
ranger_lilathaAI->AddWaypoint(24, 7567.339355, -7608.456055, 146.006485);
ranger_lilathaAI->AddWaypoint(25, 7562.547852, -7617.417969, 148.097504);
ranger_lilathaAI->AddWaypoint(26, 7561.508789, -7645.064453, 151.245163);
ranger_lilathaAI->AddWaypoint(27, 7563.337402, -7654.652344, 151.227158);
ranger_lilathaAI->AddWaypoint(28, 7565.533691, -7658.296387, 151.248886);
ranger_lilathaAI->AddWaypoint(29, 7571.155762, -7659.118652, 151.244568);
ranger_lilathaAI->AddWaypoint(30, 7579.119629, -7662.213867, 151.651505);
ranger_lilathaAI->AddWaypoint(31, 7603.768066, -7667.000488, 153.997726);
ranger_lilathaAI->AddWaypoint(32, 7603.768066, -7667.000488, 153.997726, 4000); // Say4 & Set orientation
ranger_lilathaAI->AddWaypoint(33, 7603.768066, -7667.000488, 153.997726, 8000); // Say5 & Set orientation
ranger_lilathaAI->AddWaypoint(34, 7603.768066, -7667.000488, 153.997726);
ranger_lilathaAI->AddWaypoint(0, 7545.07, -7359.87, 162.354, 4000); // Say0
ranger_lilathaAI->AddWaypoint(1, 7550.048340, -7362.237793, 162.235657);
ranger_lilathaAI->AddWaypoint(2, 7566.976074, -7364.315430, 161.738770);
ranger_lilathaAI->AddWaypoint(3, 7578.830566, -7361.677734, 161.738770);
ranger_lilathaAI->AddWaypoint(4, 7590.969238, -7359.053711, 162.257660);
ranger_lilathaAI->AddWaypoint(5, 7598.354004, -7362.815430, 162.256683, 4000); // Say1
ranger_lilathaAI->AddWaypoint(6, 7605.861328, -7380.424316, 161.937073);
ranger_lilathaAI->AddWaypoint(7, 7605.295410, -7387.382813, 157.253998);
ranger_lilathaAI->AddWaypoint(8, 7606.131836, -7393.893555, 156.941925);
ranger_lilathaAI->AddWaypoint(9, 7615.207520, -7400.187012, 157.142639);
ranger_lilathaAI->AddWaypoint(10, 7618.956543, -7402.652832, 158.202042);
ranger_lilathaAI->AddWaypoint(11, 7636.850586, -7401.756836, 162.144791);
ranger_lilathaAI->AddWaypoint(12, 7637.058105, -7404.944824, 162.206970, 4000);// Say2
ranger_lilathaAI->AddWaypoint(13, 7636.910645, -7412.585449, 162.366425);
ranger_lilathaAI->AddWaypoint(14, 7637.607910, -7425.591797, 162.630661);
ranger_lilathaAI->AddWaypoint(15, 7637.816895, -7459.057129, 163.302704);
ranger_lilathaAI->AddWaypoint(16, 7638.859863, -7470.902344, 162.517059);
ranger_lilathaAI->AddWaypoint(17, 7641.395996, -7488.217285, 157.381287);
ranger_lilathaAI->AddWaypoint(18, 7634.455566, -7505.451660, 154.682159);
ranger_lilathaAI->AddWaypoint(19, 7631.906738, -7516.948730, 153.597382); // say3
ranger_lilathaAI->AddWaypoint(20, 7622.231445, -7537.037598, 151.587112);
ranger_lilathaAI->AddWaypoint(21, 7610.921875, -7550.670410, 149.639374);
ranger_lilathaAI->AddWaypoint(22, 7598.229004, -7562.551758, 145.953888);
ranger_lilathaAI->AddWaypoint(23, 7588.509277, -7577.755371, 148.294479);
ranger_lilathaAI->AddWaypoint(24, 7567.339355, -7608.456055, 146.006485);
ranger_lilathaAI->AddWaypoint(25, 7562.547852, -7617.417969, 148.097504);
ranger_lilathaAI->AddWaypoint(26, 7561.508789, -7645.064453, 151.245163);
ranger_lilathaAI->AddWaypoint(27, 7563.337402, -7654.652344, 151.227158);
ranger_lilathaAI->AddWaypoint(28, 7565.533691, -7658.296387, 151.248886);
ranger_lilathaAI->AddWaypoint(29, 7571.155762, -7659.118652, 151.244568);
ranger_lilathaAI->AddWaypoint(30, 7579.119629, -7662.213867, 151.651505);
ranger_lilathaAI->AddWaypoint(31, 7603.768066, -7667.000488, 153.997726);
ranger_lilathaAI->AddWaypoint(32, 7603.768066, -7667.000488, 153.997726, 4000); // Say4 & Set orientation
ranger_lilathaAI->AddWaypoint(33, 7603.768066, -7667.000488, 153.997726, 8000); // Say5 & Set orientation
ranger_lilathaAI->AddWaypoint(34, 7603.768066, -7667.000488, 153.997726);
return (CreatureAI*)ranger_lilathaAI;
return (CreatureAI*)ranger_lilathaAI;
}
void AddSC_ghostlands()
@@ -315,9 +315,9 @@ void AddSC_ghostlands()
newscript->pGOHello = &GOHello_gilded_brazier;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_ranger_lilatha";
newscript->GetAI = &GetAI_npc_ranger_lilathaAI;
newscript->pQuestAccept = &QuestAccept_npc_ranger_lilatha;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_ranger_lilatha";
newscript->GetAI = &GetAI_npc_ranger_lilathaAI;
newscript->pQuestAccept = &QuestAccept_npc_ranger_lilatha;
newscript->RegisterSelf();
}
@@ -52,10 +52,10 @@ EndScriptData */
struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
{
boss_gruulAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
@@ -77,36 +77,36 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
HurtfulStrike_Timer= 8000;
Reverberation_Timer= 60000+45000;
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, NOT_STARTED);
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, NOT_STARTED);
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
}
}
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
}
}
void JustDied(Unit* Killer)
{
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, DONE);
if(pInstance)
{
pInstance->SetData(DATA_GRUULEVENT, DONE);
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
}
}
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
if(Door)
Door->SetGoState(0);
}
}
void Aggro(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
if(pInstance)
{
@@ -119,15 +119,15 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
}
}
void KilledUnit()
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
}
void KilledUnit()
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
}
void UpdateAI(const uint32 diff)
{
@@ -184,7 +184,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
GroundSlamTimer = 7000;
break;
}
}
case 1:
{
@@ -205,7 +205,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
GroundSlamTimer = 5000;
break;
}
}
case 2:
{
@@ -215,7 +215,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
GroundSlamTimer = 1000;
break;
}
}
case 3:
{
@@ -253,7 +253,7 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
Reverberation_Timer += 10000;
break;
}
}
}
GroundSlamStage++;
@@ -280,14 +280,14 @@ struct TRINITY_DLL_DECL boss_gruulAI : public ScriptedAI
// Reverberation
if (Reverberation_Timer < diff)
{
DoCast(m_creature->getVictim(), SPELL_REVERBERATION, true);
Reverberation_Timer = 30000;
DoCast(m_creature->getVictim(), SPELL_REVERBERATION, true);
Reverberation_Timer = 30000;
}else Reverberation_Timer -= diff;
// Cave In
if (CaveIn_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_CAVE_IN);
CaveIn_Timer = 20000;
@@ -42,7 +42,7 @@ EndScriptData */
#define SPELL_BERSERKER_C 26561
#define SPELL_ROAR 16508
#define SPELL_FLURRY 33232
#define SPELL_DUAL_WIELD 29651 //used in phase
#define SPELL_DUAL_WIELD 29651 //used in phase
// Olm the Summoner
#define SPELL_DARK_DECAY 33129
@@ -50,14 +50,14 @@ EndScriptData */
#define SPELL_SUMMON_WFH 33131
//Kiggler the Craed
#define SPELL_GREATER_POLYMORPH 33173
#define SPELL_LIGHTNING_BOLT 36152
#define SPELL_ARCANE_SHOCK 33175
#define SPELL_ARCANE_EXPLOSION 33237
#define SPELL_GREATER_POLYMORPH 33173
#define SPELL_LIGHTNING_BOLT 36152
#define SPELL_ARCANE_SHOCK 33175
#define SPELL_ARCANE_EXPLOSION 33237
//Blindeye the Seer
#define SPELL_GREATER_PW_SHIELD 33147
#define SPELL_HEAL 33144
#define SPELL_GREATER_PW_SHIELD 33147
#define SPELL_HEAL 33144
#define SPELL_PRAYER_OH 33152
//Krosh Firehand
@@ -94,9 +94,9 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
MightyBlow_Timer = 40000;
Whirlwind_Timer = 30000;
Charging_Timer = 0;
Roar_Timer = 0;
Roar_Timer = 0;
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, false);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, false);
Phase2 = false;
@@ -134,25 +134,25 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
{
pInstance->SetData(DATA_MAULGAREVENT, DONE);
{
pInstance->SetData(DATA_MAULGAREVENT, DONE);
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_MAULGARDOOR));
if(Door)
Door->SetGoState(0);
}
}
GameObject* Door = NULL;
Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_MAULGARDOOR));
if(Door)
Door->SetGoState(0);
}
}
void AddDeath()
{
switch(rand()%4)
{
case 0: DoScriptText(SAY_OGRE_DEATH1, m_creature);break;
case 1: DoScriptText(SAY_OGRE_DEATH2, m_creature);break;
case 2: DoScriptText(SAY_OGRE_DEATH3, m_creature);break;
case 3: DoScriptText(SAY_OGRE_DEATH4, m_creature);break;
}
{
case 0: DoScriptText(SAY_OGRE_DEATH1, m_creature);break;
case 1: DoScriptText(SAY_OGRE_DEATH2, m_creature);break;
case 2: DoScriptText(SAY_OGRE_DEATH3, m_creature);break;
case 3: DoScriptText(SAY_OGRE_DEATH4, m_creature);break;
}
}
@@ -182,7 +182,7 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
DoZoneInCombat();
DoZoneInCombat();
}
void UpdateAI(const uint32 diff)
@@ -234,10 +234,10 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
//Entering Phase 2
if(!Phase2 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 50)
{
Phase2 = true;
DoScriptText(SAY_ENRAGE, m_creature);
Phase2 = true;
DoScriptText(SAY_ENRAGE, m_creature);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
}
@@ -134,21 +134,21 @@ struct TRINITY_DLL_DECL boss_kelidan_the_breakerAI : public ScriptedAI
}
}
for(int i=0; i<5; ++i)
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(who && channeler && !channeler->isInCombat())
channeler->AI()->AttackStart(who);
}
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(who && channeler && !channeler->isInCombat())
channeler->AI()->AttackStart(who);
}
}
void ChannelerDied(Unit* killer)
{
for(int i=0; i<5; ++i)
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(channeler && channeler->isAlive())
return;
}
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(channeler && channeler->isAlive())
return;
}
if(killer)
m_creature->AI()->AttackStart(killer);
@@ -160,30 +160,30 @@ struct TRINITY_DLL_DECL boss_kelidan_the_breakerAI : public ScriptedAI
if(!channeler1) return NULL;
int i;
for(i=0; i<5; ++i)
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(channeler && channeler->GetGUID()==channeler1->GetGUID())
break;
}
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(channeler && channeler->GetGUID()==channeler1->GetGUID())
break;
}
return Channelers[(i+2)%5];
}
void SummonChannelers()
{
for(int i=0; i<5; ++i)
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(!channeler || channeler->isDead())
channeler = m_creature->SummonCreature(ENTRY_CHANNELER,ShadowmoonChannelers[i][0],ShadowmoonChannelers[i][1],ShadowmoonChannelers[i][2],ShadowmoonChannelers[i][3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,300000);
Channelers[i] = channeler->GetGUID();
}
for(int i=0; i<5; ++i)
{
Creature *channeler = (Creature*)Unit::GetUnit(*m_creature, Channelers[i]);
if(!channeler || channeler->isDead())
channeler = m_creature->SummonCreature(ENTRY_CHANNELER,ShadowmoonChannelers[i][0],ShadowmoonChannelers[i][1],ShadowmoonChannelers[i][2],ShadowmoonChannelers[i][3],TEMPSUMMON_CORPSE_TIMED_DESPAWN,300000);
Channelers[i] = channeler->GetGUID();
}
}
void JustDied(Unit* Killer)
{
DoScriptText(SAY_DIE, m_creature);
if(pInstance)
pInstance->SetData(DATA_KELIDANEVENT, DONE);
pInstance->SetData(DATA_KELIDANEVENT, DONE);
}
void UpdateAI(const uint32 diff)
@@ -315,11 +315,11 @@ struct TRINITY_DLL_DECL mob_shadowmoon_channelerAI : public ScriptedAI
{
if (!m_creature->IsNonMeleeSpellCasted(false))
if(Creature *Kelidan = (Creature *)FindCreature(ENTRY_KELIDAN, 100, m_creature))
{
uint64 channeler = ((boss_kelidan_the_breakerAI*)Kelidan->AI())->GetChanneled(m_creature);
if(Unit *channeled = Unit::GetUnit(*m_creature, channeler))
DoCast(channeled,SPELL_CHANNELING);
}
{
uint64 channeler = ((boss_kelidan_the_breakerAI*)Kelidan->AI())->GetChanneled(m_creature);
if(Unit *channeled = Unit::GetUnit(*m_creature, channeler))
DoCast(channeled,SPELL_CHANNELING);
}
check_Timer = 5000;
}else check_Timer -= diff;
return;
@@ -114,7 +114,7 @@ struct TRINITY_DLL_DECL boss_nazanAI : public ScriptedAI
m_creature->SetLootRecipient(NULL);
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
m_creature->RemoveCorpse();
}else UnsummonCheck -= diff;
return;
}
@@ -62,15 +62,15 @@ static Yell RandomTaunt[]=
#define SPELL_BLAZE_TARGET 30541 // core bug, does not support target 7
#define SPELL_BLAZE_TRAP 30542
#define SPELL_DEBRIS_KNOCKDOWN 36449
#define SPELL_DEBRIS_VISUAL 30632
#define SPELL_DEBRIS_DAMAGE 30631 // core bug, does not support target 8
#define SPELL_DEBRIS_VISUAL 30632
#define SPELL_DEBRIS_DAMAGE 30631 // core bug, does not support target 8
#define SPELL_CAMERA_SHAKE 36455
#define SPELL_BERSERK 27680
#define SPELL_SHADOW_CAGE 30168
#define SPELL_SHADOW_GRASP 30410
#define SPELL_SHADOW_GRASP_VISUAL 30166
#define SPELL_MIND_EXHAUSTION 44032 //Casted by the cubes when channeling ends
#define SPELL_MIND_EXHAUSTION 44032 //Casted by the cubes when channeling ends
#define SPELL_SHADOW_CAGE_C 30205
#define SPELL_SHADOW_GRASP_C 30207
@@ -81,10 +81,10 @@ static Yell RandomTaunt[]=
#define SPELL_BURNING_ABYSSAL 30511
#define SPELL_SOUL_TRANSFER 30531 // core bug, does not support target 7
#define SPELL_FIRE_BLAST 37110
#define SPELL_FIRE_BLAST 37110
// count of clickers needed to interrupt blast nova
#define CLICKERS_COUNT 5
#define CLICKERS_COUNT 5
typedef std::map<uint64, uint64> CubeMap;
@@ -202,7 +202,7 @@ struct TRINITY_DLL_DECL boss_magtheridonAI : public ScriptedAI
uint32 BlastNova_Timer;
uint32 Blaze_Timer;
uint32 Debris_Timer;
uint32 RandChat_Timer;
uint32 RandChat_Timer;
bool Phase3;
bool NeedCheckCube;
@@ -6,8 +6,8 @@
#define DEF_MAGTHERIDONS_LAIR_H
#define DATA_MAGTHERIDON_EVENT 1
#define DATA_MAGTHERIDON 3
#define DATA_MAGTHERIDON 3
#define DATA_CHANNELER_EVENT 2
#define DATA_COLLAPSE 6
#define DATA_CHANNELER 9
#define DATA_COLLAPSE 6
#define DATA_CHANNELER 9
#endif
@@ -27,9 +27,9 @@ EndScriptData */
#define SPELL_SOUL_TRANSFER 30531 // core bug, does not support target 7
#define SPELL_BLAZE_TARGET 30541 // core bug, does not support target 7
#define CHAMBER_CENTER_X -15.14
#define CHAMBER_CENTER_Y 1.8
#define CHAMBER_CENTER_Z -0.4
#define CHAMBER_CENTER_X -15.14
#define CHAMBER_CENTER_Y 1.8
#define CHAMBER_CENTER_Z -0.4
#define ENCOUNTERS 2
@@ -180,7 +180,7 @@ struct TRINITY_DLL_DECL instance_magtheridons_lair : public ScriptedInstance
{
//Channeler->CastSpell(Channeler, SPELL_SOUL_TRANSFER, true);
data = IN_PROGRESS;
break;
break;
}
}break;
}
@@ -238,22 +238,22 @@ bool GossipHello_npc_wing_commander_brack(Player *player, Creature *_Creature)
bool GossipSelect_npc_wing_commander_brack(Player *player, Creature *_Creature, uint32 sender, uint32 action )
{
switch(action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33659,true); //TaxiPath 584 (Gateways Murket and Shaadraz)
break;
case GOSSIP_ACTION_INFO_DEF + 2:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33825,true); //TaxiPath 587 (Aerial Assault Flight (Horde))
break;
case GOSSIP_ACTION_INFO_DEF + 3:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,34578,true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge)
break;
}
return true;
switch(action)
{
case GOSSIP_ACTION_INFO_DEF + 1:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33659,true); //TaxiPath 584 (Gateways Murket and Shaadraz)
break;
case GOSSIP_ACTION_INFO_DEF + 2:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,33825,true); //TaxiPath 587 (Aerial Assault Flight (Horde))
break;
case GOSSIP_ACTION_INFO_DEF + 3:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player,34578,true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge)
break;
}
return true;
}
/*######
@@ -271,130 +271,130 @@ bool GossipSelect_npc_wing_commander_brack(Player *player, Creature *_Creature,
struct TRINITY_DLL_DECL npc_wounded_blood_elfAI : public npc_escortAI
{
npc_wounded_blood_elfAI(Creature *c) : npc_escortAI(c) {Reset();}
npc_wounded_blood_elfAI(Creature *c) : npc_escortAI(c) {Reset();}
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
void WaypointReached(uint32 i)
{
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (!player)
return;
if (!player)
return;
switch (i)
{
case 0:
DoScriptText(SAY_ELF_START, m_creature, player);
break;
case 9:
DoScriptText(SAY_ELF_SUMMON1, m_creature, player);
// Spawn two Haal'eshi Talonguard
DoSpawnCreature(16967, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
DoSpawnCreature(16967, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
break;
case 13:
DoScriptText(SAY_ELF_RESTING, m_creature, player);
// make the NPC kneel
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
break;
case 14:
DoScriptText(SAY_ELF_SUMMON2, m_creature, player);
// Spawn two Haal'eshi Windwalker
DoSpawnCreature(16966, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
DoSpawnCreature(16966, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
break;
case 27:
DoScriptText(SAY_ELF_COMPLETE, m_creature, player);
// Award quest credit
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_ROAD_TO_FALCON_WATCH,m_creature);
break;
}
}
switch (i)
{
case 0:
DoScriptText(SAY_ELF_START, m_creature, player);
break;
case 9:
DoScriptText(SAY_ELF_SUMMON1, m_creature, player);
// Spawn two Haal'eshi Talonguard
DoSpawnCreature(16967, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
DoSpawnCreature(16967, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
break;
case 13:
DoScriptText(SAY_ELF_RESTING, m_creature, player);
// make the NPC kneel
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
break;
case 14:
DoScriptText(SAY_ELF_SUMMON2, m_creature, player);
// Spawn two Haal'eshi Windwalker
DoSpawnCreature(16966, -15, -15, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
DoSpawnCreature(16966, -17, -17, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
break;
case 27:
DoScriptText(SAY_ELF_COMPLETE, m_creature, player);
// Award quest credit
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->GroupEventHappens(QUEST_ROAD_TO_FALCON_WATCH,m_creature);
break;
}
}
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(1604);
}
void Reset()
{
if (!IsBeingEscorted)
m_creature->setFaction(1604);
}
void Aggro(Unit* who)
{
if (IsBeingEscorted)
DoScriptText(SAY_ELF_AGGRO, m_creature);
}
void Aggro(Unit* who)
{
if (IsBeingEscorted)
DoScriptText(SAY_ELF_AGGRO, m_creature);
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
void JustDied(Unit* killer)
{
if (!IsBeingEscorted)
return;
void JustDied(Unit* killer)
{
if (!IsBeingEscorted)
return;
if (PlayerGUID)
{
// If NPC dies, player fails the quest
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->FailQuest(QUEST_ROAD_TO_FALCON_WATCH);
}
}
if (PlayerGUID)
{
// If NPC dies, player fails the quest
Unit* player = Unit::GetUnit((*m_creature), PlayerGUID);
if (player && player->GetTypeId() == TYPEID_PLAYER)
((Player*)player)->FailQuest(QUEST_ROAD_TO_FALCON_WATCH);
}
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
void UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
};
CreatureAI* GetAI_npc_wounded_blood_elf(Creature *_Creature)
{
npc_wounded_blood_elfAI* welfAI = new npc_wounded_blood_elfAI(_Creature);
npc_wounded_blood_elfAI* welfAI = new npc_wounded_blood_elfAI(_Creature);
welfAI->AddWaypoint(0, -1137.72, 4272.10, 14.04, 5000);
welfAI->AddWaypoint(1, -1141.34, 4232.42, 14.63);
welfAI->AddWaypoint(2, -1133.47, 4220.88, 11.78);
welfAI->AddWaypoint(3, -1126.18, 4213.26, 13.51);
welfAI->AddWaypoint(4, -1100.12, 4204.32, 16.41);
welfAI->AddWaypoint(5, -1063.68, 4197.92, 15.51);
welfAI->AddWaypoint(6, -1027.28, 4194.36, 15.52);
welfAI->AddWaypoint(7, -995.68, 4189.59, 19.84);
welfAI->AddWaypoint(8, -970.90, 4188.60, 24.61);
welfAI->AddWaypoint(9, -961.93, 4193.34, 26.11, 15000); // Summon 1
welfAI->AddWaypoint(10, -935.52, 4210.99, 31.98);
welfAI->AddWaypoint(11, -913.42, 4218.27, 37.29);
welfAI->AddWaypoint(12, -896.53, 4207.73, 43.23);
welfAI->AddWaypoint(13, -868.49, 4194.77, 46.75, 30000);// Kneel and Rest Here
welfAI->AddWaypoint(14, -852.83, 4198.29, 47.28, 15000);// Summon 2
welfAI->AddWaypoint(15, -819.85, 4200.50, 46.37);
welfAI->AddWaypoint(16, -791.92, 4201.96, 44.19);
welfAI->AddWaypoint(17, -774.42, 4202.46, 47.41);
welfAI->AddWaypoint(18, -762.90, 4202.17, 48.81);
welfAI->AddWaypoint(19, -728.25, 4195.35, 50.68);
welfAI->AddWaypoint(20, -713.58, 4192.07, 53.98);
welfAI->AddWaypoint(21, -703.09, 4189.74, 56.96);
welfAI->AddWaypoint(22, -693.70, 4185.43, 57.06);
welfAI->AddWaypoint(23, -686.38, 4159.81, 60.26);
welfAI->AddWaypoint(24, -679.88, 4147.04, 64.20);
welfAI->AddWaypoint(25, -656.74, 4147.72, 64.11);
welfAI->AddWaypoint(26, -652.22, 4137.50, 64.58);
welfAI->AddWaypoint(27, -649.99, 4136.38, 64.63, 30000);// Award Quest Credit
welfAI->AddWaypoint(0, -1137.72, 4272.10, 14.04, 5000);
welfAI->AddWaypoint(1, -1141.34, 4232.42, 14.63);
welfAI->AddWaypoint(2, -1133.47, 4220.88, 11.78);
welfAI->AddWaypoint(3, -1126.18, 4213.26, 13.51);
welfAI->AddWaypoint(4, -1100.12, 4204.32, 16.41);
welfAI->AddWaypoint(5, -1063.68, 4197.92, 15.51);
welfAI->AddWaypoint(6, -1027.28, 4194.36, 15.52);
welfAI->AddWaypoint(7, -995.68, 4189.59, 19.84);
welfAI->AddWaypoint(8, -970.90, 4188.60, 24.61);
welfAI->AddWaypoint(9, -961.93, 4193.34, 26.11, 15000); // Summon 1
welfAI->AddWaypoint(10, -935.52, 4210.99, 31.98);
welfAI->AddWaypoint(11, -913.42, 4218.27, 37.29);
welfAI->AddWaypoint(12, -896.53, 4207.73, 43.23);
welfAI->AddWaypoint(13, -868.49, 4194.77, 46.75, 30000);// Kneel and Rest Here
welfAI->AddWaypoint(14, -852.83, 4198.29, 47.28, 15000);// Summon 2
welfAI->AddWaypoint(15, -819.85, 4200.50, 46.37);
welfAI->AddWaypoint(16, -791.92, 4201.96, 44.19);
welfAI->AddWaypoint(17, -774.42, 4202.46, 47.41);
welfAI->AddWaypoint(18, -762.90, 4202.17, 48.81);
welfAI->AddWaypoint(19, -728.25, 4195.35, 50.68);
welfAI->AddWaypoint(20, -713.58, 4192.07, 53.98);
welfAI->AddWaypoint(21, -703.09, 4189.74, 56.96);
welfAI->AddWaypoint(22, -693.70, 4185.43, 57.06);
welfAI->AddWaypoint(23, -686.38, 4159.81, 60.26);
welfAI->AddWaypoint(24, -679.88, 4147.04, 64.20);
welfAI->AddWaypoint(25, -656.74, 4147.72, 64.11);
welfAI->AddWaypoint(26, -652.22, 4137.50, 64.58);
welfAI->AddWaypoint(27, -649.99, 4136.38, 64.63, 30000);// Award Quest Credit
return (CreatureAI*)welfAI;
return (CreatureAI*)welfAI;
}
bool QuestAccept_npc_wounded_blood_elf(Player* player, Creature* creature, Quest const* quest)
{
if (quest->GetQuestId() == QUEST_ROAD_TO_FALCON_WATCH)
{
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
// Change faction so mobs attack
creature->setFaction(775);
}
if (quest->GetQuestId() == QUEST_ROAD_TO_FALCON_WATCH)
{
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
// Change faction so mobs attack
creature->setFaction(775);
}
return true;
return true;
}
/*######
@@ -406,7 +406,7 @@ void AddSC_hellfire_peninsula()
Script *newscript;
newscript = new Script;
newscript->Name = "npc_aeranas";
newscript->Name = "npc_aeranas";
newscript->GetAI = &GetAI_npc_aeranas;
newscript->RegisterSelf();
@@ -141,52 +141,52 @@ bool GossipSelect_npc_unrestrained_dragonhawk(Player *player, Creature *_Creatur
## npc_greengill_slave
######*/
#define ENRAGE 45111
#define ORB 45109
#define QUESTG 11541
#define DM 25060
#define ENRAGE 45111
#define ORB 45109
#define QUESTG 11541
#define DM 25060
struct TRINITY_DLL_DECL npc_greengill_slaveAI : public ScriptedAI
{
npc_greengill_slaveAI(Creature* c) : ScriptedAI(c) {Reset();}
npc_greengill_slaveAI(Creature* c) : ScriptedAI(c) {Reset();}
uint64 PlayerGUID;
uint64 PlayerGUID;
void Aggro(Unit* who){}
void Aggro(Unit* who){}
void Reset()
{
PlayerGUID = 0;
}
void Reset()
{
PlayerGUID = 0;
}
void SpellHit(Unit* caster, const SpellEntry* spell)
{
if(!caster)
void SpellHit(Unit* caster, const SpellEntry* spell)
{
if(!caster)
return;
if(caster->GetTypeId() == TYPEID_PLAYER && spell->Id == ORB && !m_creature->HasAura(ENRAGE, 0))
{
PlayerGUID = caster->GetGUID();
if(PlayerGUID)
if(caster->GetTypeId() == TYPEID_PLAYER && spell->Id == ORB && !m_creature->HasAura(ENRAGE, 0))
{
PlayerGUID = caster->GetGUID();
if(PlayerGUID)
{
Unit* plr = Unit::GetUnit((*m_creature), PlayerGUID);
if(plr && ((Player*)plr)->GetQuestStatus(QUESTG) == QUEST_STATUS_INCOMPLETE)
((Player*)plr)->KilledMonster(25086, m_creature->GetGUID());
}
DoCast(m_creature, ENRAGE);
Unit* Myrmidon = FindCreature(DM, 70, m_creature);
if(Myrmidon)
{
m_creature->AddThreat(Myrmidon, 100000.0f);
((Player*)plr)->KilledMonster(25086, m_creature->GetGUID());
}
DoCast(m_creature, ENRAGE);
Unit* Myrmidon = FindCreature(DM, 70, m_creature);
if(Myrmidon)
{
m_creature->AddThreat(Myrmidon, 100000.0f);
AttackStart(Myrmidon);
}
}
}
}
}
}
void UpdateAI(const uint32 diff)
{
DoMeleeAttackIfReady();
}
void UpdateAI(const uint32 diff)
{
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_greengill_slaveAI(Creature* _Creature)
@@ -215,8 +215,8 @@ void AddSC_isle_of_queldanas()
newscript->pGossipSelect = &GossipSelect_npc_unrestrained_dragonhawk;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_greengill_slave";
newscript->GetAI = &GetAI_npc_greengill_slaveAI;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_greengill_slave";
newscript->GetAI = &GetAI_npc_greengill_slaveAI;
newscript->RegisterSelf();
}
@@ -69,9 +69,9 @@ struct TRINITY_DLL_DECL boss_curatorAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
}
void JustDied(Unit *victim)
@@ -66,7 +66,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
void KilledUnit(Unit* Victim)
{
if(rand()%2)
return;
return;
switch(rand()%3)
{
@@ -117,7 +117,7 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
if (Holyfire_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_HOLYFIRE);
Holyfire_Timer = 8000 + rand()%17000; //Anywhere from 8 to 25 seconds, good luck having several of those in a row!
@@ -125,10 +125,10 @@ struct TRINITY_DLL_DECL boss_maiden_of_virtueAI : public ScriptedAI
if (Holywrath_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_HOLYWRATH);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_HOLYWRATH);
Holywrath_Timer = 20000+(rand()%10000); //20-30 secs sounds nice
Holywrath_Timer = 20000+(rand()%10000); //20-30 secs sounds nice
}else Holywrath_Timer -= diff;
@@ -58,7 +58,7 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
Attumen = 0;
Mount_Timer = 0;
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->SetVisibility(VISIBILITY_ON);
}
@@ -81,7 +81,7 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
if(Phase == 1 && (m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 95)
{
Phase = 2;
Creature *pAttumen = DoSpawnCreature(SUMMON_ATTUMEN, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
Creature *pAttumen = DoSpawnCreature(SUMMON_ATTUMEN, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000);
if(pAttumen)
{
Attumen = pAttumen->GetGUID();
@@ -89,9 +89,9 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
SetMidnight(pAttumen, m_creature->GetGUID());
switch(rand()%3)
{
case 0: DoScriptText(SAY_APPEAR1, pAttumen); break;
case 1: DoScriptText(SAY_APPEAR2, pAttumen); break;
case 2: DoScriptText(SAY_APPEAR3, pAttumen); break;
case 0: DoScriptText(SAY_APPEAR1, pAttumen); break;
case 1: DoScriptText(SAY_APPEAR2, pAttumen); break;
case 2: DoScriptText(SAY_APPEAR3, pAttumen); break;
}
}
}
@@ -102,27 +102,27 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
}
else if(Phase ==3)
{
if(Mount_Timer)
{
if(Mount_Timer <= diff)
{
Mount_Timer = 0;
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->GetMotionMaster()->MoveIdle();
if (Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen))
{
pAttumen->SetUInt32Value(UNIT_FIELD_DISPLAYID, MOUNTED_DISPLAYID);
pAttumen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if(pAttumen->getVictim())
{
pAttumen->GetMotionMaster()->MoveChase(pAttumen->getVictim());
pAttumen->SetUInt64Value(UNIT_FIELD_TARGET, pAttumen->getVictim()->GetGUID());
}
pAttumen->SetFloatValue(OBJECT_FIELD_SCALE_X,1);
}
} else Mount_Timer -= diff;
}
}
if(Mount_Timer)
{
if(Mount_Timer <= diff)
{
Mount_Timer = 0;
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->GetMotionMaster()->MoveIdle();
if (Unit *pAttumen = Unit::GetUnit(*m_creature, Attumen))
{
pAttumen->SetUInt32Value(UNIT_FIELD_DISPLAYID, MOUNTED_DISPLAYID);
pAttumen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if(pAttumen->getVictim())
{
pAttumen->GetMotionMaster()->MoveChase(pAttumen->getVictim());
pAttumen->SetUInt64Value(UNIT_FIELD_TARGET, pAttumen->getVictim()->GetGUID());
}
pAttumen->SetFloatValue(OBJECT_FIELD_SCALE_X,1);
}
} else Mount_Timer -= diff;
}
}
if(Phase != 3)
DoMeleeAttackIfReady();
@@ -130,7 +130,7 @@ struct TRINITY_DLL_DECL boss_midnightAI : public ScriptedAI
void Mount(Unit *pAttumen)
{
DoScriptText(SAY_MOUNT, pAttumen);
DoScriptText(SAY_MOUNT, pAttumen);
Phase = 3;
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pAttumen->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
@@ -194,36 +194,36 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_DEATH, m_creature);
if (Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight))
pMidnight->DealDamage(pMidnight, pMidnight->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
if (Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight))
pMidnight->DealDamage(pMidnight, pMidnight->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
void UpdateAI(const uint32 diff)
{
if(ResetTimer)
{
if(ResetTimer <= diff)
{
ResetTimer = 0;
Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight);
if(pMidnight)
{
pMidnight->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pMidnight->SetVisibility(VISIBILITY_ON);
}
Midnight = 0;
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
} else ResetTimer -= diff;
if(ResetTimer)
{
if(ResetTimer <= diff)
{
ResetTimer = 0;
Unit *pMidnight = Unit::GetUnit(*m_creature, Midnight);
if(pMidnight)
{
pMidnight->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
pMidnight->SetVisibility(VISIBILITY_ON);
}
Midnight = 0;
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
} else ResetTimer -= diff;
//Return since we have no target
if (!UpdateVictim())
@@ -234,7 +234,7 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
if(CleaveTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_SHADOWCLEAVE);
DoCast(m_creature->getVictim(), SPELL_SHADOWCLEAVE);
CleaveTimer = 10000 + (rand()%6)*1000;
} else CleaveTimer -= diff;
@@ -248,8 +248,8 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_RANDOM1, m_creature); break;
case 1: DoScriptText(SAY_RANDOM2, m_creature); break;
case 0: DoScriptText(SAY_RANDOM1, m_creature); break;
case 1: DoScriptText(SAY_RANDOM2, m_creature); break;
}
RandomYellTimer = 30000 + (rand()%31)*1000;
} else RandomYellTimer -= diff;
@@ -294,7 +294,7 @@ struct TRINITY_DLL_DECL boss_attumenAI : public ScriptedAI
void SpellHit(Unit *source, const SpellEntry *spell)
{
if(spell->Mechanic == MECHANIC_DISARM)
DoScriptText(SAY_DISARMED, m_creature);
DoScriptText(SAY_DISARMED, m_creature);
}
};
@@ -124,9 +124,9 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
{
switch (rand()%3)
{
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
case 2: DoScriptText(SAY_KILL_3, m_creature); break;
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
case 2: DoScriptText(SAY_KILL_3, m_creature); break;
}
}
@@ -139,22 +139,22 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
DeSpawnAdds();
//remove aura from spell Garrote when Moroes dies
Map *map = m_creature->GetMap();
if (map->IsDungeon())
{
Map::PlayerList const &PlayerList = map->GetPlayers();
//remove aura from spell Garrote when Moroes dies
Map *map = m_creature->GetMap();
if (map->IsDungeon())
{
Map::PlayerList const &PlayerList = map->GetPlayers();
if (PlayerList.isEmpty())
return;
if (PlayerList.isEmpty())
return;
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (i->getSource()->isAlive() && i->getSource()->HasAura(SPELL_GARROTE,0))
i->getSource()->RemoveAurasDueToSpell(SPELL_GARROTE);
}
}
}
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (i->getSource()->isAlive() && i->getSource()->HasAura(SPELL_GARROTE,0))
i->getSource()->RemoveAurasDueToSpell(SPELL_GARROTE);
}
}
}
uint8 CheckAdd(uint64 guid)
{
@@ -308,8 +308,8 @@ struct TRINITY_DLL_DECL boss_moroesAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SPECIAL_1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL_2, m_creature); break;
case 0: DoScriptText(SAY_SPECIAL_1, m_creature); break;
case 1: DoScriptText(SAY_SPECIAL_2, m_creature); break;
}
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
@@ -35,7 +35,7 @@ EndScriptData */
#define SPELL_SMOKING_BLAST 37057
#define SPELL_FIREBALL_BARRAGE 30282
#define SPELL_SEARING_CINDERS 30127
#define SPELL_SUMMON_SKELETON 30170
#define SPELL_SUMMON_SKELETON 30170
#define EMOTE_SUMMON "An ancient being awakens in the distance..."
#define YELL_AGGRO "What fools! I shall bring a quick end to your suffering!"
@@ -60,17 +60,17 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
{
boss_nightbaneAI(Creature* c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Intro = true;
Reset();
}
ScriptedInstance* pInstance;
ScriptedInstance* pInstance;
uint32 Phase;
bool RainBones;
bool Skeletons;
bool Skeletons;
uint32 BellowingRoarTimer;
uint32 CharredEarthTimer;
@@ -87,7 +87,7 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
bool Intro;
bool Flying;
bool Movement;
bool Movement;
uint32 WaitTimer;
uint32 MovePhase;
@@ -103,16 +103,16 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
SmokingBlastTimer = 20000;
FireballBarrageTimer = 13000;
SearingCindersTimer = 14000;
WaitTimer = 1000;
WaitTimer = 1000;
Phase =1;
Phase =1;
FlyCount = 0;
MovePhase = 0;
MovePhase = 0;
m_creature->SetSpeed(MOVE_RUN, 2.0f);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->setActive(true);
m_creature->setActive(true);
pInstance->SetData(DATA_NIGHTBANE_EVENT, 6);
if(pInstance->GetData(DATA_NIGHTBANE_EVENT) > 1)
@@ -121,10 +121,10 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
m_creature->RemoveCorpse();
}else pInstance->SetData(DATA_NIGHTBANE_EVENT, NOT_STARTED);
HandleTerraceDoors(true);
HandleTerraceDoors(true);
Flying = false;
Movement = false;
Movement = false;
if(!Intro)
{
@@ -133,22 +133,22 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
}
}
void HandleTerraceDoors(bool open)
void HandleTerraceDoors(bool open)
{
if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_1)))
if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_1)))
Door->SetGoState(open ? 0 : 1);
if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_2)))
if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_2)))
Door->SetGoState(open ? 0 : 1);
}
void Aggro(Unit *who)
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, IN_PROGRESS);
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, IN_PROGRESS);
HandleTerraceDoors(false);
DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
}
HandleTerraceDoors(false);
DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
}
void AttackStart(Unit* who)
{
@@ -156,13 +156,13 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
ScriptedAI::AttackStart(who);
}
void JustDied(Unit* killer)
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, DONE);
void JustDied(Unit* killer)
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, DONE);
HandleTerraceDoors(true);
}
HandleTerraceDoors(true);
}
void MoveInLineOfSight(Unit *who)
{
@@ -194,7 +194,7 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
{
if(id == 0)
{
DoTextEmote(EMOTE_BREATH, NULL, true);
DoTextEmote(EMOTE_BREATH, NULL, true);
Flying = false;
Phase = 2;
return;
@@ -211,7 +211,7 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
{
Flying = false;
Phase = 1;
Movement = true;
Movement = true;
return;
}
@@ -219,12 +219,12 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
}
}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature->getVictim());
}
void JustSummoned(Creature *summoned)
{
summoned->AI()->AttackStart(m_creature->getVictim());
}
void TakeOff()
void TakeOff()
{
DoYell(YELL_FLY_PHASE, LANG_UNIVERSAL, NULL);
@@ -234,14 +234,14 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
(*m_creature).GetMotionMaster()->Clear(false);
(*m_creature).GetMotionMaster()->MovePoint(0,IntroWay[2][0],IntroWay[2][1],IntroWay[2][2]);
Flying = true;
Flying = true;
FlyTimer = 45000+rand()%15000; //timer wrong between 45 and 60 seconds
++FlyCount;
RainofBonesTimer = 5000; //timer wrong (maybe)
RainBones = false;
Skeletons = false;
Skeletons = false;
}
void UpdateAI(const uint32 diff)
@@ -291,44 +291,44 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
// Phase 1 "GROUND FIGHT"
if(Phase == 1)
{
if(Movement)
{
DoStartMovement(m_creature->getVictim());
Movement = false;
}
if(Movement)
{
DoStartMovement(m_creature->getVictim());
Movement = false;
}
if (BellowingRoarTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_BELLOWING_ROAR);
BellowingRoarTimer = 30000+rand()%10000 ; //Timer
}else BellowingRoarTimer -= diff;
if (BellowingRoarTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_BELLOWING_ROAR);
BellowingRoarTimer = 30000+rand()%10000 ; //Timer
}else BellowingRoarTimer -= diff;
if (SmolderingBreathTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SMOLDERING_BREATH);
SmolderingBreathTimer = 20000;//timer
{
DoCast(m_creature->getVictim(),SPELL_SMOLDERING_BREATH);
SmolderingBreathTimer = 20000;//timer
}else SmolderingBreathTimer -= diff;
if (CharredEarthTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target,SPELL_CHARRED_EARTH);
CharredEarthTimer = 20000; //timer
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target,SPELL_CHARRED_EARTH);
CharredEarthTimer = 20000; //timer
}else CharredEarthTimer -= diff;
if (TailSweepTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (!m_creature->HasInArc( M_PI, target))
DoCast(target,SPELL_TAIL_SWEEP);
TailSweepTimer = 15000;//timer
}else TailSweepTimer -= diff;
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (!m_creature->HasInArc( M_PI, target))
DoCast(target,SPELL_TAIL_SWEEP);
TailSweepTimer = 15000;//timer
}else TailSweepTimer -= diff;
if (SearingCindersTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target,SPELL_SEARING_CINDERS);
SearingCindersTimer = 10000; //timer
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target,SPELL_SEARING_CINDERS);
SearingCindersTimer = 10000; //timer
}else SearingCindersTimer -= diff;
uint32 Prozent;
@@ -338,10 +338,10 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
TakeOff();
if (Prozent < 50 && FlyCount == 1) // secound take off 50%
TakeOff();
TakeOff();
if (Prozent < 25 && FlyCount == 2) // third take off 25%
TakeOff();
TakeOff();
DoMeleeAttackIfReady();
}
@@ -351,13 +351,13 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
{
if (!RainBones)
{
if (!Skeletons)
{
DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
Skeletons = true;
}
if (!Skeletons)
{
DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
Skeletons = true;
}
if (RainofBonesTimer < diff && !RainBones) // only once at the beginning of phase 2
{
@@ -368,8 +368,8 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
if (DistractingAshTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target,SPELL_DISTRACTING_ASH);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target,SPELL_DISTRACTING_ASH);
DistractingAshTimer = 2000;//timer wrong
}else DistractingAshTimer -= diff;
}
@@ -385,17 +385,17 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
if (FireballBarrageTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_FARTHEST, 0))
DoCast(target,SPELL_FIREBALL_BARRAGE);
FireballBarrageTimer = 20000; //Timer
if (Unit* target = SelectUnit(SELECT_TARGET_FARTHEST, 0))
DoCast(target,SPELL_FIREBALL_BARRAGE);
FireballBarrageTimer = 20000; //Timer
}else FireballBarrageTimer -= diff;
if (FlyTimer < diff) //landing
{
if(rand()%2 == 0)
DoYell(YELL_LAND_PHASE_1, LANG_UNIVERSAL, NULL);
else
DoYell(YELL_LAND_PHASE_2, LANG_UNIVERSAL, NULL);
if(rand()%2 == 0)
DoYell(YELL_LAND_PHASE_1, LANG_UNIVERSAL, NULL);
else
DoYell(YELL_LAND_PHASE_2, LANG_UNIVERSAL, NULL);
(*m_creature).GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MovePoint(3,IntroWay[3][0],IntroWay[3][1],IntroWay[3][2]);
@@ -416,6 +416,6 @@ void AddSC_boss_nightbane()
Script *newscript;
newscript = new Script;
newscript->Name="boss_nightbane";
newscript->GetAI = &GetAI_boss_nightbane;
newscript->GetAI = &GetAI_boss_nightbane;
newscript->RegisterSelf();
}
@@ -219,15 +219,15 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 2: DoScriptText(SAY_SLAY3, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
AxesCleanup();
ClearWeapons();
@@ -249,7 +249,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
void Aggro(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
{
@@ -392,8 +392,8 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
switch(rand()%2)
{
case 0: DoScriptText(SAY_SUMMON1, m_creature); break;
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
case 0: DoScriptText(SAY_SUMMON1, m_creature); break;
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
}
}
@@ -451,7 +451,7 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
m_creature->SetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, cinfo->mindmg);
m_creature->SetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, cinfo->maxdmg);
m_creature->SetAttackTime(OFF_ATTACK, (m_creature->GetAttackTime(BASE_ATTACK)*150)/100);
m_creature->SetAttackTime(OFF_ATTACK, (m_creature->GetAttackTime(BASE_ATTACK)*150)/100);
}
}
else if(phase == 2)
@@ -557,16 +557,16 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
{
if(SWPainTimer < diff)
{
Unit* target = NULL;
Unit* target = NULL;
if(phase == 1)
target = m_creature->getVictim(); // the tank
else //anyone but the tank
target = SelectUnit(SELECT_TARGET_RANDOM, 1);
if (target)
DoCast(target, SPELL_SW_PAIN);
if (target)
DoCast(target, SPELL_SW_PAIN);
SWPainTimer = 20000;
SWPainTimer = 20000;
}else SWPainTimer -= diff;
}
@@ -152,14 +152,14 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
case 0: DoScriptText(SAY_KILL1, m_creature); break;
case 1: DoScriptText(SAY_KILL2, m_creature); break;
}
}
void JustDied(Unit *victim)
{
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
{
@@ -174,9 +174,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
}
if(pInstance)
@@ -228,39 +228,39 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
return;
if(CloseDoorTimer)
{
if(CloseDoorTimer <= diff)
{
if(pInstance)
{
if(GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR)))
Door->SetGoState(1);
CloseDoorTimer = 0;
}
}else CloseDoorTimer -= diff;
}
{
if(CloseDoorTimer <= diff)
{
if(pInstance)
{
if(GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_GAMEOBJECT_LIBRARY_DOOR)))
Door->SetGoState(1);
CloseDoorTimer = 0;
}
}else CloseDoorTimer -= diff;
}
//Cooldowns for casts
if (ArcaneCooldown)
{
{
if (ArcaneCooldown >= diff)
ArcaneCooldown -= diff;
else ArcaneCooldown = 0;
}
}
if (FireCooldown)
{
{
if (FireCooldown >= diff)
FireCooldown -= diff;
else FireCooldown = 0;
}
}
if (FrostCooldown)
{
if (FrostCooldown >= diff)
{
if (FrostCooldown >= diff)
FrostCooldown -= diff;
else FrostCooldown = 0;
}
}
if(!Drinking && m_creature->GetMaxPower(POWER_MANA) && (m_creature->GetPower(POWER_MANA)*100 / m_creature->GetMaxPower(POWER_MANA)) < 20)
{
@@ -356,8 +356,8 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
DoCast(m_creature, SPELL_AOE_CS);
break;
case 1:
if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pUnit, SPELL_CHAINSOFICE);
if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pUnit, SPELL_CHAINSOFICE);
break;
}
SecondarySpellTimer = 5000 + (rand()%15000);
@@ -390,9 +390,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
case SUPER_AE:
if (rand()%2)
DoScriptText(SAY_EXPLOSION1, m_creature);
else
DoScriptText(SAY_EXPLOSION2, m_creature);
DoScriptText(SAY_EXPLOSION1, m_creature);
else
DoScriptText(SAY_EXPLOSION2, m_creature);
m_creature->CastSpell(m_creature, SPELL_BLINK_CENTER, true);
m_creature->CastSpell(m_creature, SPELL_PLAYERPULL, true);
@@ -402,9 +402,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
case SUPER_FLAME:
if (rand()%2)
DoScriptText(SAY_FLAMEWREATH1, m_creature);
else
DoScriptText(SAY_FLAMEWREATH2, m_creature);
DoScriptText(SAY_FLAMEWREATH1, m_creature);
else
DoScriptText(SAY_FLAMEWREATH2, m_creature);
FlameWreathTimer = 20000;
FlameWreathCheckTime = 500;
@@ -419,9 +419,9 @@ struct TRINITY_DLL_DECL boss_aranAI : public ScriptedAI
case SUPER_BLIZZARD:
if (rand()%2)
DoScriptText(SAY_BLIZZARD1, m_creature);
else
DoScriptText(SAY_BLIZZARD2, m_creature);
DoScriptText(SAY_BLIZZARD1, m_creature);
else
DoScriptText(SAY_BLIZZARD2, m_creature);
Creature* Spawn = NULL;
Spawn = DoSpawnCreature(CREATURE_ARAN_BLIZZARD, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 25000);
@@ -230,8 +230,8 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
@@ -298,8 +298,8 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
Chains->CastSpell(Chains, SPELL_DEMON_CHAINS, true);
switch(rand()%2)
{
case 0: DoScriptText(SAY_SACRIFICE1, m_creature); break;
case 1: DoScriptText(SAY_SACRIFICE2, m_creature); break;
case 0: DoScriptText(SAY_SACRIFICE1, m_creature); break;
case 1: DoScriptText(SAY_SACRIFICE2, m_creature); break;
}
SacrificeTimer = 30000;
}
@@ -325,8 +325,8 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
SummonedPortals = true;
switch(rand()%2)
{
case 0: DoScriptText(SAY_SUMMON1, m_creature); break;
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
case 0: DoScriptText(SAY_SUMMON1, m_creature); break;
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
}
}
uint32 random = rand()%2;
@@ -340,13 +340,13 @@ struct TRINITY_DLL_DECL boss_terestianAI : public ScriptedAI
}else SummonTimer -= diff;
if(!Berserk)
{
if(BerserkTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
Berserk = true;
}else BerserkTimer -= diff;
}
{
if(BerserkTimer < diff)
{
DoCast(m_creature, SPELL_BERSERK);
Berserk = true;
}else BerserkTimer -= diff;
}
DoMeleeAttackIfReady();
}
@@ -135,7 +135,7 @@ struct TRINITY_DLL_DECL boss_dorotheeAI : public ScriptedAI
void Aggro(Unit* who)
{
DoScriptText(SAY_DOROTHEE_AGGRO, m_creature);
DoScriptText(SAY_DOROTHEE_AGGRO, m_creature);
}
void SummonTito(); // See below
@@ -167,13 +167,13 @@ struct TRINITY_DLL_DECL boss_dorotheeAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!UpdateVictim())
return;
@@ -229,7 +229,7 @@ struct TRINITY_DLL_DECL mob_titoAI : public ScriptedAI
if(Dorothee && Dorothee->isAlive())
{
((boss_dorotheeAI*)Dorothee->AI())->TitoDied = true;
DoScriptText(SAY_DOROTHEE_TITO_DEATH, Dorothee);
DoScriptText(SAY_DOROTHEE_TITO_DEATH, Dorothee);
}
}
}
@@ -254,7 +254,7 @@ void boss_dorotheeAI::SummonTito()
Creature* Tito = DoSpawnCreature(CREATURE_TITO, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000);
if(Tito)
{
DoScriptText(SAY_DOROTHEE_SUMMON, m_creature);
DoScriptText(SAY_DOROTHEE_SUMMON, m_creature);
((mob_titoAI*)Tito->AI())->DorotheeGUID = m_creature->GetGUID();
Tito->AI()->AttackStart(m_creature->getVictim());
SummonedTito = true;
@@ -301,7 +301,7 @@ struct TRINITY_DLL_DECL boss_strawmanAI : public ScriptedAI
void Aggro(Unit* who)
{
DoScriptText(SAY_STRAWMAN_AGGRO, m_creature);
DoScriptText(SAY_STRAWMAN_AGGRO, m_creature);
}
void SpellHit(Unit* caster, const SpellEntry *Spell)
@@ -312,7 +312,7 @@ struct TRINITY_DLL_DECL boss_strawmanAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoScriptText(SAY_STRAWMAN_DEATH, m_creature);
DoScriptText(SAY_STRAWMAN_DEATH, m_creature);
if(pInstance)
SummonCroneIfReady(pInstance, m_creature);
@@ -320,19 +320,19 @@ struct TRINITY_DLL_DECL boss_strawmanAI : public ScriptedAI
void KilledUnit(Unit* victim)
{
DoScriptText(SAY_STRAWMAN_SLAY, m_creature);
DoScriptText(SAY_STRAWMAN_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!UpdateVictim())
return;
@@ -380,7 +380,7 @@ struct TRINITY_DLL_DECL boss_tinheadAI : public ScriptedAI
void Aggro(Unit* who)
{
DoScriptText(SAY_TINHEAD_AGGRO, m_creature);
DoScriptText(SAY_TINHEAD_AGGRO, m_creature);
}
void AttackStart(Unit* who)
@@ -401,7 +401,7 @@ struct TRINITY_DLL_DECL boss_tinheadAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoScriptText(SAY_TINHEAD_DEATH, m_creature);
DoScriptText(SAY_TINHEAD_DEATH, m_creature);
if(pInstance)
SummonCroneIfReady(pInstance, m_creature);
@@ -409,19 +409,19 @@ struct TRINITY_DLL_DECL boss_tinheadAI : public ScriptedAI
void KilledUnit(Unit* victim)
{
DoScriptText(SAY_TINHEAD_SLAY, m_creature);
DoScriptText(SAY_TINHEAD_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
{
{
if(AggroTimer < diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!UpdateVictim())
return;
@@ -488,12 +488,12 @@ struct TRINITY_DLL_DECL boss_roarAI : public ScriptedAI
void Aggro(Unit* who)
{
DoScriptText(SAY_ROAR_AGGRO, m_creature);
DoScriptText(SAY_ROAR_AGGRO, m_creature);
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_ROAR_DEATH, m_creature);
DoScriptText(SAY_ROAR_DEATH, m_creature);
if(pInstance)
SummonCroneIfReady(pInstance, m_creature);
@@ -501,19 +501,19 @@ struct TRINITY_DLL_DECL boss_roarAI : public ScriptedAI
void KilledUnit(Unit* victim)
{
DoScriptText(SAY_ROAR_SLAY, m_creature);
DoScriptText(SAY_ROAR_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
{
if(AggroTimer)
{
{
if(AggroTimer <= diff)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
AggroTimer = 0;
}else AggroTimer -= diff;
}
if(!UpdateVictim())
return;
@@ -563,11 +563,11 @@ struct TRINITY_DLL_DECL boss_croneAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_CRONE_AGGRO, m_creature); break;
case 1: DoScriptText(SAY_CRONE_AGGRO2, m_creature); break;
case 0: DoScriptText(SAY_CRONE_AGGRO, m_creature); break;
case 1: DoScriptText(SAY_CRONE_AGGRO2, m_creature); break;
}
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
}
void JustDied(Unit* killer)
@@ -1088,12 +1088,12 @@ struct TRINITY_DLL_DECL boss_romuloAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoScriptText(SAY_ROMULO_DEATH, m_creature);
DoScriptText(SAY_ROMULO_DEATH, m_creature);
}
void KilledUnit(Unit* victim)
{
DoScriptText(SAY_ROMULO_SLAY, m_creature);
DoScriptText(SAY_ROMULO_SLAY, m_creature);
}
void UpdateAI(const uint32 diff);
@@ -1106,7 +1106,7 @@ void boss_julianneAI::DamageTaken(Unit* done_by, uint32 &damage)
if(Phase == PHASE_JULIANNE)
{
DoScriptText(SAY_JULIANNE_DEATH01, m_creature);
DoScriptText(SAY_JULIANNE_DEATH01, m_creature);
m_creature->InterruptNonMeleeSpells(true);
DoCast(m_creature, SPELL_DRINK_POISON);
PretendToDie(m_creature);
@@ -1200,23 +1200,23 @@ void boss_romuloAI::DamageTaken(Unit* done_by, uint32 &damage)
void boss_julianneAI::UpdateAI(const uint32 diff)
{
if(EntryYellTimer)
{
if(EntryYellTimer < diff)
{
DoScriptText(SAY_JULIANNE_ENTER, m_creature);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
EntryYellTimer = 0;
}else EntryYellTimer -= diff;
}
{
if(EntryYellTimer < diff)
{
DoScriptText(SAY_JULIANNE_ENTER, m_creature);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
EntryYellTimer = 0;
}else EntryYellTimer -= diff;
}
if(AggroYellTimer)
{
if(AggroYellTimer < diff)
{
DoScriptText(SAY_JULIANNE_AGGRO, m_creature);
AggroYellTimer = 0;
}else AggroYellTimer -= diff;
}
{
if(AggroYellTimer < diff)
{
DoScriptText(SAY_JULIANNE_AGGRO, m_creature);
AggroYellTimer = 0;
}else AggroYellTimer -= diff;
}
if(Phase == PHASE_ROMULO && !SummonedRomulo)
{
@@ -1243,20 +1243,20 @@ void boss_julianneAI::UpdateAI(const uint32 diff)
return;
if(RomuloDead)
{
{
if(ResurrectTimer < diff)
{
Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID));
if(Romulo && ((boss_romuloAI*)Romulo->AI())->IsFakingDeath)
{
DoScriptText(SAY_JULIANNE_RESURRECT, m_creature);
Resurrect(Romulo);
((boss_romuloAI*)Romulo->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
RomuloDead = false;
}else ResurrectTimer -= diff;
}
{
Creature* Romulo = ((Creature*)Unit::GetUnit((*m_creature), RomuloGUID));
if(Romulo && ((boss_romuloAI*)Romulo->AI())->IsFakingDeath)
{
DoScriptText(SAY_JULIANNE_RESURRECT, m_creature);
Resurrect(Romulo);
((boss_romuloAI*)Romulo->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
RomuloDead = false;
}else ResurrectTimer -= diff;
}
if(BlindingPassionTimer < diff)
{
@@ -1299,20 +1299,20 @@ void boss_romuloAI::UpdateAI(const uint32 diff)
return;
if(JulianneDead)
{
{
if(ResurrectTimer < diff)
{
Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
if(Julianne && ((boss_julianneAI*)Julianne->AI())->IsFakingDeath)
{
DoScriptText(SAY_ROMULO_RESURRECT, m_creature);
Resurrect(Julianne);
((boss_julianneAI*)Julianne->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
JulianneDead = false;
}else ResurrectTimer -= diff;
}
{
Creature* Julianne = ((Creature*)Unit::GetUnit((*m_creature), JulianneGUID));
if(Julianne && ((boss_julianneAI*)Julianne->AI())->IsFakingDeath)
{
DoScriptText(SAY_ROMULO_RESURRECT, m_creature);
Resurrect(Julianne);
((boss_julianneAI*)Julianne->AI())->IsFakingDeath = false;
ResurrectTimer = 10000;
}
JulianneDead = false;
}else ResurrectTimer -= diff;
}
if(BackwardLungeTimer < diff)
{
@@ -31,8 +31,8 @@
#define DATA_GAMEOBJECT_GAME_DOOR 24
#define DATA_GAMEOBJECT_GAME_EXIT_DOOR 25
#define DATA_IMAGE_OF_MEDIVH 26
#define DATA_MASTERS_TERRACE_DOOR_1 27
#define DATA_MASTERS_TERRACE_DOOR_2 28
#define DATA_MASTERS_TERRACE_DOOR_1 27
#define DATA_MASTERS_TERRACE_DOOR_2 28
// Opera Performances
#define EVENT_OZ 1
@@ -60,9 +60,9 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
uint64 MassiveDoor; // Door at Netherspite
uint64 GamesmansDoor; // Door before Chess
uint64 GamesmansExitDoor; // Door after Chess
uint64 NetherspaceDoor; // Door at Malchezaar
uint64 MastersTerraceDoor[2];
uint64 ImageGUID;
uint64 NetherspaceDoor; // Door at Malchezaar
uint64 MastersTerraceDoor[2];
uint64 ImageGUID;
uint8 Nightbane;
bool CheckNightbane;
@@ -88,12 +88,12 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
GamesmansDoor = 0;
GamesmansExitDoor = 0;
NetherspaceDoor = 0;
MastersTerraceDoor[0]= 0;
MastersTerraceDoor[1]= 0;
ImageGUID = 0;
MastersTerraceDoor[0]= 0;
MastersTerraceDoor[1]= 0;
ImageGUID = 0;
Nightbane = 0;
CheckNightbane = false;
}
@@ -101,7 +101,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
{
for (uint8 i = 0; i < ENCOUNTERS; ++i)
if (Encounters[i] == IN_PROGRESS)
return true;
return true;
return false;
}
@@ -129,7 +129,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
}else return Encounters[11];
case DATA_OPERA_PERFORMANCE: return OperaEvent;
case DATA_OPERA_OZ_DEATHCOUNT: return OzDeathCount;
case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
}
return 0;
@@ -160,8 +160,8 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
case DATA_GAMEOBJECT_GAME_DOOR: return GamesmansDoor;
case DATA_GAMEOBJECT_GAME_EXIT_DOOR: return GamesmansExitDoor;
case DATA_GAMEOBJECT_NETHER_DOOR: return NetherspaceDoor;
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
}
return 0;
@@ -172,11 +172,11 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
switch (type)
{
case DATA_ATTUMEN_EVENT: Encounters[0] = data; break;
case DATA_MOROES_EVENT:
if (Encounters[1] == DONE)
break;
Encounters[1] = data;
break;
case DATA_MOROES_EVENT:
if (Encounters[1] == DONE)
break;
Encounters[1] = data;
break;
case DATA_MAIDENOFVIRTUE_EVENT: Encounters[2] = data; break;
case DATA_OPTIONAL_BOSS_EVENT: Encounters[3] = data; break;
case DATA_OPERA_EVENT: Encounters[4] = data; break;
@@ -186,7 +186,7 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
case DATA_NETHERSPITE_EVENT: Encounters[8] = data; break;
case DATA_CHESS_EVENT: Encounters[9] = data; break;
case DATA_MALCHEZZAR_EVENT: Encounters[10] = data; break;
case DATA_NIGHTBANE_EVENT:
case DATA_NIGHTBANE_EVENT:
if(data == 6)
{
Nightbane;
@@ -200,13 +200,13 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
SaveToDB();
}
void SetData64(uint32 identifier, uint64 data)
{
switch(identifier)
{
case DATA_IMAGE_OF_MEDIVH: ImageGUID = data;
}
}
void SetData64(uint32 identifier, uint64 data)
{
switch(identifier)
{
case DATA_IMAGE_OF_MEDIVH: ImageGUID = data;
}
}
void OnObjectCreate(GameObject* go)
{
@@ -220,8 +220,8 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance
case 184276: GamesmansDoor = go->GetGUID(); break;
case 184277: GamesmansExitDoor = go->GetGUID(); break;
case 185134: NetherspaceDoor = go->GetGUID(); break;
case 184274: MastersTerraceDoor[0] = go->GetGUID(); break;
case 184280: MastersTerraceDoor[1] = go->GetGUID(); break;
case 184274: MastersTerraceDoor[0] = go->GetGUID(); break;
case 184280: MastersTerraceDoor[1] = go->GetGUID(); break;
}
switch(OperaEvent)
@@ -49,31 +49,31 @@ EndContentData */
struct Dialogue
{
int32 textid;
uint32 timer;
uint32 timer;
};
static Dialogue OzDialogue[]=
{
{-1532103, 6000},
{-1532104, 18000},
{-1532105, 9000},
{-1532106, 15000}
{-1532103, 6000},
{-1532104, 18000},
{-1532105, 9000},
{-1532106, 15000}
};
static Dialogue HoodDialogue[]=
{
{-1532107, 6000},
{-1532108, 10000},
{-1532109, 14000},
{-1532110, 15000}
{-1532107, 6000},
{-1532108, 10000},
{-1532109, 14000},
{-1532110, 15000}
};
static Dialogue RAJDialogue[]=
{
{-1532111, 5000},
{-1532112, 7000},
{-1532113, 14000},
{-1532114, 14000}
{-1532111, 5000},
{-1532112, 7000},
{-1532113, 14000},
{-1532114, 14000}
};
// Entries and spawn locations for creatures in Oz event
@@ -166,7 +166,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
float x,y,z;
m_creature->GetPosition(x, y, z);
if (Creature* Spotlight = m_creature->SummonCreature(CREATURE_SPOTLIGHT, x, y, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 50000))
if (Creature* Spotlight = m_creature->SummonCreature(CREATURE_SPOTLIGHT, x, y, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 50000))
{
Spotlight->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Spotlight->CastSpell(Spotlight, SPELL_SPOTLIGHT, false);
@@ -177,7 +177,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
case 5:
if(pInstance)
{
if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
Door->SetGoState(1);
}
IsBeingEscorted = false;
@@ -194,21 +194,21 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
{
case EVENT_OZ:
if (OzDialogue[count].textid)
text = OzDialogue[count].textid;
text = OzDialogue[count].textid;
if(OzDialogue[count].timer)
TalkTimer = OzDialogue[count].timer;
break;
case EVENT_HOOD:
if (HoodDialogue[count].textid)
text = HoodDialogue[count].textid;
if (HoodDialogue[count].textid)
text = HoodDialogue[count].textid;
if(HoodDialogue[count].timer)
TalkTimer = HoodDialogue[count].timer;
break;
case EVENT_RAJ:
if (RAJDialogue[count].textid)
text = RAJDialogue[count].textid;
text = RAJDialogue[count].textid;
if(RAJDialogue[count].timer)
TalkTimer = RAJDialogue[count].timer;
break;
@@ -249,7 +249,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
if(PerformanceReady)
{
if(CurtainTimer)
{
{
if(CurtainTimer <= diff)
{
PrepareEncounter();
@@ -257,12 +257,12 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
if(!pInstance)
return;
if (GameObject* Curtain = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS)))
if (GameObject* Curtain = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_CURTAINS)))
Curtain->SetGoState(0);
CurtainTimer = 0;
}else CurtainTimer -= diff;
}
}
if(!RaidWiped)
{
@@ -310,7 +310,7 @@ struct TRINITY_DLL_DECL npc_barnesAI : public npc_escortAI
pInstance->SetData(DATA_OPERA_EVENT, IN_PROGRESS);
if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
if (GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GAMEOBJECT_STAGEDOORLEFT)))
Door->SetGoState(0);
m_creature->CastSpell(m_creature, SPELL_TUXEDO, true);
@@ -451,7 +451,7 @@ bool GossipSelect_npc_berthold(Player* player, Creature* _Creature, uint32 sende
#define SPELL_FIRE_BALL 30967
#define SPELL_UBER_FIREBALL 30971
#define SPELL_CONFLAGRATION_BLAST 30977
#define SPELL_MANA_SHIELD 31635
#define SPELL_MANA_SHIELD 31635
static float MedivPos[4] = {-11161.49,-1902.24,91.48,1.94};
static float ArcanagosPos[4] = {-11169.75,-1881.48,95.39,4.83};
@@ -473,11 +473,11 @@ struct TRINITY_DLL_DECL npc_image_of_medivhAI : public ScriptedAI
uint32 FireMedivhTimer;
uint32 FireArcanagosTimer;
bool EventStarted;
bool EventStarted;
void Reset()
{
ArcanagosGUID = 0;
ArcanagosGUID = 0;
if(pInstance && pInstance->GetData64(DATA_IMAGE_OF_MEDIVH) == 0)
{
@@ -551,7 +551,7 @@ struct TRINITY_DLL_DECL npc_image_of_medivhAI : public ScriptedAI
return 5000;
case 8:
FireMedivhTimer = 500;
DoCast(m_creature, SPELL_MANA_SHIELD);
DoCast(m_creature, SPELL_MANA_SHIELD);
return 10000;
case 9:
m_creature->TextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false);
@@ -565,34 +565,34 @@ struct TRINITY_DLL_DECL npc_image_of_medivhAI : public ScriptedAI
((Creature*)arca)->Yell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, NULL);
return 5000;
case 12:
arca->GetMotionMaster()->MovePoint(0, -11010.82,-1761.18, 156.47);
arca->setActive(true);
arca->InterruptNonMeleeSpells(true);
arca->SetSpeed(MOVE_FLIGHT, 2.0f);
arca->GetMotionMaster()->MovePoint(0, -11010.82,-1761.18, 156.47);
arca->setActive(true);
arca->InterruptNonMeleeSpells(true);
arca->SetSpeed(MOVE_FLIGHT, 2.0f);
return 10000;
case 13:
m_creature->Yell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, NULL);
return 10000;
case 14:
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->ClearInCombat();
case 14:
m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->ClearInCombat();
if(map->IsDungeon())
{
if(map->IsDungeon())
{
InstanceMap::PlayerList const &PlayerList = ((InstanceMap*)map)->GetPlayers();
for (InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if(i->getSource()->isAlive())
if(i->getSource()->isAlive())
{
if(i->getSource()->GetQuestStatus(9645) == QUEST_STATUS_INCOMPLETE)
i->getSource()->CompleteQuest(9645);
if(i->getSource()->GetQuestStatus(9645) == QUEST_STATUS_INCOMPLETE)
i->getSource()->CompleteQuest(9645);
}
}
}
return 50000;
case 15:
arca->DealDamage(arca,arca->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
return 5000;
return 50000;
case 15:
arca->DealDamage(arca,arca->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
return 5000;
default : return 9999999;
}
@@ -653,7 +653,7 @@ void AddSC_karazhan()
newscript->pGossipSelect = &GossipSelect_npc_berthold;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name = "npc_image_of_medivh";
newscript->GetAI = &GetAI_npc_image_of_medivh;
newscript->RegisterSelf();
@@ -42,7 +42,7 @@ EndScriptData */
#define SPELL_PHOENIX 44194 // Summons a phoenix (Doesn't work?)
#define SPELL_PHOENIX_BURN 44198 // A spell Phoenix uses to damage everything around
#define SPELL_PHOENIX_FIREBALL 44202 // Phoenix casts this in phase 2 and stops moving
#define SPELL_PHOENIX_FIREBALL 44202 // Phoenix casts this in phase 2 and stops moving
#define SPELL_FLAMESTRIKE1_NORMAL 44190 // Damage part
#define SPELL_FLAMESTRIKE1_HEROIC 46163 // Heroic damage part
@@ -73,9 +73,9 @@ float KaelLocations[6][2]=
{148.744659, 181.377426},//center
{140.823883, 195.403046},//phoenixpos1
{156.574188, 195.650482},//phoenixpos2
{149.813, 160.917},//spherepos1
{167.223, 173.594},//spherepos2
{130.68, 173.007},//spherepos3
{149.813, 160.917},//spherepos1
{167.223, 173.594},//spherepos2
{130.68, 173.007},//spherepos3
};
#define LOCATION_Z -16.727455
@@ -85,7 +85,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
Heroic = c->GetMap()->IsHeroic();
Heroic = c->GetMap()->IsHeroic();
}
ScriptedInstance* pInstance;
@@ -132,15 +132,15 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
Phase = 0;
if(pInstance)
{
if(m_creature->isDead())
pInstance->SetData(DATA_KAELTHAS_EVENT, DONE);
else
pInstance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED);
}
{
if(m_creature->isDead())
pInstance->SetData(DATA_KAELTHAS_EVENT, DONE);
else
pInstance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED);
}
}
void KilledUnit(Unit* victim)
void KilledUnit(Unit* victim)
{
if(victim && (victim->GetTypeId() == TYPEID_PLAYER))
{
@@ -152,13 +152,13 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
data << uint32(0);
victim->SendMessageToSet(&data, true);
}
}
}
void JustDied(Unit *killer)
{
RemoveGravityLapse();
RemoveGravityLapse();
DoScriptText(SAY_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_KAELTHAS_EVENT, DONE);
if(pInstance)
pInstance->SetData(DATA_KAELTHAS_EVENT, DONE);
}
void DamageTaken(Unit* done_by, uint32 &damage)
@@ -170,14 +170,14 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
void Aggro(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
pInstance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS);
if(pInstance)
pInstance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS);
}
void SetThreatList(Creature* SummonedUnit)
{
if(!SummonedUnit)
return;
return;
std::list<HostilReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
std::list<HostilReference*>::iterator i = m_threatlist.begin();
@@ -192,53 +192,53 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
}
}
void EnterEvadeMode()
{
RemoveGravityLapse();
m_creature->InterruptNonMeleeSpells(true);
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop();
m_creature->LoadCreaturesAddon();
void EnterEvadeMode()
{
RemoveGravityLapse();
m_creature->InterruptNonMeleeSpells(true);
m_creature->RemoveAllAuras();
m_creature->DeleteThreatList();
m_creature->CombatStop();
m_creature->LoadCreaturesAddon();
if( m_creature->isAlive() )
m_creature->GetMotionMaster()->MoveTargetedHome();
if( m_creature->isAlive() )
m_creature->GetMotionMaster()->MoveTargetedHome();
m_creature->SetLootRecipient(NULL);
m_creature->SetLootRecipient(NULL);
InCombat = false;
Reset();
}
InCombat = false;
Reset();
}
void TeleportPlayersToSelf()
{
float x,y,z;
float x,y,z;
m_creature->Relocate(KaelLocations[0][0], KaelLocations[0][1], LOCATION_Z, 0);
Map *map = m_creature->GetMap();
Map *map = m_creature->GetMap();
Map::PlayerList const &PlayerList = map->GetPlayers();
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (Player* i_pl = i->getSource())
if(i_pl->isAlive())
{
i_pl->CastSpell(i_pl, SPELL_TELEPORT_CENTER, true);
m_creature->GetNearPoint(m_creature,x,y,z,5,5,0);
i_pl->TeleportTo(m_creature->GetMapId(),x,y,LOCATION_Z,i_pl->GetOrientation());
}
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (Player* i_pl = i->getSource())
if(i_pl->isAlive())
{
i_pl->CastSpell(i_pl, SPELL_TELEPORT_CENTER, true);
m_creature->GetNearPoint(m_creature,x,y,z,5,5,0);
i_pl->TeleportTo(m_creature->GetMapId(),x,y,LOCATION_Z,i_pl->GetOrientation());
}
}
DoCast(m_creature, SPELL_TELEPORT_CENTER, true);
}
void CastGravityLapseKnockUp()
{
Map *map = m_creature->GetMap();
Map *map = m_creature->GetMap();
Map::PlayerList const &PlayerList = map->GetPlayers();
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (Player* i_pl = i->getSource())
if(i_pl->isAlive())
if(i_pl->isAlive())
// Knockback into the air
i_pl->CastSpell(i_pl, SPELL_GRAVITY_LAPSE_DOT, true, 0, 0, m_creature->GetGUID());
}
@@ -246,14 +246,14 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
void CastGravityLapseFly() // Use Fly Packet hack for now as players can't cast "fly" spells unless in map 530. Has to be done a while after they get knocked into the air...
{
Map *map = m_creature->GetMap();
Map::PlayerList const &PlayerList = map->GetPlayers();
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
Map *map = m_creature->GetMap();
Map::PlayerList const &PlayerList = map->GetPlayers();
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if (Player* i_pl = i->getSource())
{
if(i_pl->isAlive())
if(i_pl->isAlive())
{
// Also needs an exception in spell system.
i_pl->CastSpell(i_pl, SPELL_GRAVITY_LAPSE_FLY, true, 0, 0, m_creature->GetGUID());
@@ -263,7 +263,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
data.append(i_pl->GetPackGUID());
data << uint32(0);
i_pl->SendMessageToSet(&data, true);
i_pl->SetSpeed(MOVE_FLIGHT, 2.0f);
i_pl->SetSpeed(MOVE_FLIGHT, 2.0f);
}
}
}
@@ -271,11 +271,11 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
void RemoveGravityLapse()
{
Map *map = m_creature->GetMap();
Map *map = m_creature->GetMap();
Map::PlayerList const &PlayerList = map->GetPlayers();
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
Map::PlayerList::const_iterator i;
for (i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
if(Player* i_pl = i->getSource())
{
i_pl->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY);
@@ -300,14 +300,14 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{
// *Heroic mode only:
if(Heroic)
{
{
if(PyroblastTimer < diff)
{
DoCast(m_creature, SPELL_SHOCK_BARRIER, true);
DoCast(m_creature->getVictim(), SPELL_PYROBLAST);
PyroblastTimer = 60000;
}else PyroblastTimer -= diff;
}
{
DoCast(m_creature, SPELL_SHOCK_BARRIER, true);
DoCast(m_creature->getVictim(), SPELL_PYROBLAST);
PyroblastTimer = 60000;
}else PyroblastTimer -= diff;
}
if(FireballTimer < diff)
{
@@ -325,19 +325,19 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
{
Phoenix->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
SetThreatList(Phoenix);
Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1);
if(target)
{
Phoenix->AddThreat(target,1000);
Phoenix->Attack(target,true);
Phoenix->GetMotionMaster()->MoveChase(target);
}
else
{
Phoenix->AddThreat(m_creature->getVictim(),1000);
Phoenix->Attack(m_creature->getVictim(),true);
Phoenix->GetMotionMaster()->MoveChase(m_creature->getVictim());
}
Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1);
if(target)
{
Phoenix->AddThreat(target,1000);
Phoenix->Attack(target,true);
Phoenix->GetMotionMaster()->MoveChase(target);
}
else
{
Phoenix->AddThreat(m_creature->getVictim(),1000);
Phoenix->Attack(m_creature->getVictim(),true);
Phoenix->GetMotionMaster()->MoveChase(m_creature->getVictim());
}
}
DoScriptText(SAY_PHOENIX, m_creature);
@@ -347,13 +347,13 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
if(FlameStrikeTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
m_creature->InterruptNonMeleeSpells(false);
m_creature->InterruptNonMeleeSpells(false);
DoCast(target, SPELL_FLAMESTRIKE3, true);
DoScriptText(SAY_FLAMESTRIKE, m_creature);
DoScriptText(SAY_FLAMESTRIKE, m_creature);
FlameStrikeTimer = 20000 + rand()%5000;
FlameStrikeTimer = 20000 + rand()%5000;
}
}else FlameStrikeTimer -= diff;
@@ -374,7 +374,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
case 1:
{
m_creature->StopMoving();
m_creature->StopMoving();
if(GravityLapseTimer < diff)
{
switch(GravityLapsePhase)
@@ -382,7 +382,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
case 0:
if(FirstGravityLapse) // Different yells at 50%, and at every following Gravity Lapse
{
DoScriptText(SAY_GRAVITY_LAPSE, m_creature);
DoScriptText(SAY_GRAVITY_LAPSE, m_creature);
FirstGravityLapse = false;
if(pInstance)
{
@@ -393,9 +393,9 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
}
}else
{
DoScriptText(SAY_RECAST_GRAVITY, m_creature);
DoScriptText(SAY_RECAST_GRAVITY, m_creature);
}
m_creature->StopMoving();
m_creature->StopMoving();
DoCast(m_creature, SPELL_GRAVITY_LAPSE_INITIAL);
GravityLapseTimer = 2000 + diff;// Don't interrupt the visual spell
GravityLapsePhase = 1;
@@ -419,28 +419,28 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI
GravityLapsePhase = 4;
for(uint8 i = 0; i < 3; ++i)
{
Creature* Orb = m_creature->SummonCreature(CREATURE_ARCANE_SPHERE,KaelLocations[3+i][0],KaelLocations[3+i][1],LOCATION_Z,0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000);
if(Orb)
{
SetThreatList(Orb);
Unit *target = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,i);
if(target)
{
Orb->AddThreat(target,1000);
Orb->Attack(target,true);
Orb->GetMotionMaster()->MoveChase(target);
}
else
{
Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0);
if(ntarget)
{
Orb->AddThreat(ntarget,1000);
Orb->Attack(ntarget,true);
Orb->GetMotionMaster()->MoveChase(ntarget);
}
}
}
Creature* Orb = m_creature->SummonCreature(CREATURE_ARCANE_SPHERE,KaelLocations[3+i][0],KaelLocations[3+i][1],LOCATION_Z,0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000);
if(Orb)
{
SetThreatList(Orb);
Unit *target = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,i);
if(target)
{
Orb->AddThreat(target,1000);
Orb->Attack(target,true);
Orb->GetMotionMaster()->MoveChase(target);
}
else
{
Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0);
if(ntarget)
{
Orb->AddThreat(ntarget,1000);
Orb->Attack(ntarget,true);
Orb->GetMotionMaster()->MoveChase(ntarget);
}
}
}
}
DoCast(m_creature, SPELL_GRAVITY_LAPSE_CHANNEL);
break;
@@ -497,73 +497,73 @@ struct TRINITY_DLL_DECL mob_felkael_flamestrikeAI : public ScriptedAI
struct TRINITY_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI
{
mob_felkael_phoenixAI(Creature *c) : ScriptedAI(c)
{
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
uint32 BurnTimer;
uint32 CheckTimer;
uint8 phase;
ScriptedInstance* pInstance;
bool end;
uint32 CheckTimer;
uint8 phase;
ScriptedInstance* pInstance;
bool end;
void Reset()
{
m_creature->SetSpeed(MOVE_RUN, 0.5f);
m_creature->SetSpeed(MOVE_WALK, 0.5f);
m_creature->SetSpeed(MOVE_RUN, 0.5f);
m_creature->SetSpeed(MOVE_WALK, 0.5f);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
BurnTimer = 2000;
CheckTimer = 1000;
phase = 0;
end = false;
CheckTimer = 1000;
phase = 0;
end = false;
}
void Aggro(Unit* who) {}
void JustDied(Unit* slayer)
{
if (end)
return;
if (end)
return;
DoSpawnCreature(CREATURE_PHOENIX_EGG, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 45000);
}
void UpdateAI(const uint32 diff)
{
if(CheckTimer < diff)
if(CheckTimer < diff)
{
if (pInstance)
{
Creature *boss = ((Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL)));
if (boss)
{
phase = ((boss_felblood_kaelthasAI*)boss->AI())->Phase;
if(boss->isDead() || !boss->isInCombat())
{
end = true;
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self
}
}
}
{
Creature *boss = ((Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL)));
if (boss)
{
phase = ((boss_felblood_kaelthasAI*)boss->AI())->Phase;
if(boss->isDead() || !boss->isInCombat())
{
end = true;
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self
}
}
}
CheckTimer = 1000;
}else CheckTimer -= diff;
if (!UpdateVictim())
return;
if (BurnTimer < diff)
{
if(!phase)
{
DoCast(m_creature, SPELL_PHOENIX_BURN);
m_creature->DealDamage(m_creature, 1500, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self
}
else
{
m_creature->StopMoving();
DoCast(m_creature->getVictim(), SPELL_PHOENIX_FIREBALL);
}
BurnTimer = 2000;
}else BurnTimer -= diff;
if (BurnTimer < diff)
{
if(!phase)
{
DoCast(m_creature, SPELL_PHOENIX_BURN);
m_creature->DealDamage(m_creature, 1500, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self
}
else
{
m_creature->StopMoving();
DoCast(m_creature->getVictim(), SPELL_PHOENIX_FIREBALL);
}
BurnTimer = 2000;
}else BurnTimer -= diff;
//DoMeleeAttackIfReady();
}
@@ -572,13 +572,13 @@ struct TRINITY_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI
struct TRINITY_DLL_DECL mob_felkael_phoenix_eggAI : public Scripted_NoMovementAI
{
mob_felkael_phoenix_eggAI(Creature *c) : Scripted_NoMovementAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
uint32 HatchTimer;
ScriptedInstance* pInstance;
ScriptedInstance* pInstance;
void Reset() { HatchTimer = 15000; }
void Aggro(Unit* who) {}
@@ -588,43 +588,43 @@ struct TRINITY_DLL_DECL mob_felkael_phoenix_eggAI : public Scripted_NoMovementAI
if(HatchTimer < diff)
{
Creature *bird = DoSpawnCreature(CREATURE_PHOENIX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000);
if (bird)
{
Unit *boss = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL));
if (boss && boss->getVictim())
{
bird->AddThreat(boss->getVictim(),100);
bird->Attack(boss->getVictim(),true);
bird->GetMotionMaster()->MoveChase(boss->getVictim());
}
}
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}else HatchTimer -= diff;
Creature *bird = DoSpawnCreature(CREATURE_PHOENIX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000);
if (bird)
{
Unit *boss = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL));
if (boss && boss->getVictim())
{
bird->AddThreat(boss->getVictim(),100);
bird->Attack(boss->getVictim(),true);
bird->GetMotionMaster()->MoveChase(boss->getVictim());
}
}
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}else HatchTimer -= diff;
}
};
struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI
{
mob_arcane_sphereAI(Creature *c) : ScriptedAI(c)
{
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
uint32 DespawnTimer;
uint32 ChangeTargetTimer;
uint32 CheckTimer;
uint32 CheckTimer;
ScriptedInstance* pInstance;
ScriptedInstance* pInstance;
void Reset()
{
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
DespawnTimer = 30000;
ChangeTargetTimer = 5000;
CheckTimer = 1000;
m_creature->SetSpeed(MOVE_RUN, 0.5f);
m_creature->SetSpeed(MOVE_WALK, 0.5f);
CheckTimer = 1000;
m_creature->SetSpeed(MOVE_RUN, 0.5f);
m_creature->SetSpeed(MOVE_WALK, 0.5f);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->setFaction(14);
DoCast(m_creature, SPELL_ARCANE_SPHERE_PASSIVE, true);
@@ -636,9 +636,9 @@ struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI
{
if(!target)
return;
m_creature->AddThreat(target,100000);
m_creature->GetMotionMaster()->MoveChase(target);
m_creature->Attack(target,true);
m_creature->AddThreat(target,100000);
m_creature->GetMotionMaster()->MoveChase(target);
m_creature->Attack(target,true);
}
void UpdateAI(const uint32 diff)
@@ -648,28 +648,28 @@ struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI
else DespawnTimer -= diff;
if(!UpdateVictim())
ChangeTargetTimer = 0;
ChangeTargetTimer = 0;
if(ChangeTargetTimer < diff)
{
DoResetThreat();
DoResetThreat();
Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0);
if (ntarget)
StalkTarget(ntarget);
if (ntarget)
StalkTarget(ntarget);
ChangeTargetTimer = 10000;
}else ChangeTargetTimer -= diff;
if(CheckTimer < diff)
if(CheckTimer < diff)
{
if (pInstance)
{
Creature *boss = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL));
if(boss)
{
if(!((boss_felblood_kaelthasAI*)boss->AI())->Phase || boss->isDead())
DespawnTimer = 0;
}else DespawnTimer = 0;
}
{
Creature *boss = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL));
if(boss)
{
if(!((boss_felblood_kaelthasAI*)boss->AI())->Phase || boss->isDead())
DespawnTimer = 0;
}else DespawnTimer = 0;
}
CheckTimer = 1000;
}else CheckTimer -= diff;
}
@@ -678,30 +678,30 @@ struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI
bool GOHello_go_kael_orb(Player *player, GameObject* _GO)
{
ScriptedInstance* pInst = (ScriptedInstance*)_GO->GetInstanceData();
if (pInst && player)
{
Unit *kael = Unit::GetUnit((*_GO),pInst->GetData64(DATA_KAEL));
if (kael && kael->isDead())
player->TeleportTo(530, 12888, -6876, 9, 0.3);
}
if (pInst && player)
{
Unit *kael = Unit::GetUnit((*_GO),pInst->GetData64(DATA_KAEL));
if (kael && kael->isDead())
player->TeleportTo(530, 12888, -6876, 9, 0.3);
}
return true;
}
bool GOHello_go_movie_orb(Player *player, GameObject* _GO)
{
if (player)
{
WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4);
if (player)
{
WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4);
data << (uint32)164;
player->GetSession()->SendPacket(&data);
if (player->GetQuestStatus(11490) == QUEST_STATUS_INCOMPLETE)
{
Unit *qUnit = player->SummonCreature(25042,player->GetPositionX(),player->GetPositionY(),player->GetPositionZ()-10,0,TEMPSUMMON_CORPSE_DESPAWN,0);
if(qUnit)
player->DealDamage(qUnit, qUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
if (player->GetQuestStatus(11490) == QUEST_STATUS_INCOMPLETE)
{
Unit *qUnit = player->SummonCreature(25042,player->GetPositionX(),player->GetPositionY(),player->GetPositionZ()-10,0,TEMPSUMMON_CORPSE_DESPAWN,0);
if(qUnit)
player->DealDamage(qUnit, qUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
}
}
return true;
}
@@ -759,12 +759,12 @@ void AddSC_boss_felblood_kaelthas()
newscript->GetAI = &GetAI_mob_felkael_flamestrike;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="go_kael_orb";
newscript->pGOHello = &GOHello_go_kael_orb;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="go_movie_orb";
newscript->pGOHello = &GOHello_go_movie_orb;
newscript->RegisterSelf();
@@ -26,7 +26,7 @@ EndScriptData */
struct Speech
{
int32 id;
int32 id;
};
static Speech LackeyDeath[]=
@@ -39,10 +39,10 @@ static Speech LackeyDeath[]=
static Speech PlayerDeath[]=
{
{-1585017},
{-1585018},
{-1585019},
{-1585020},
{-1585017},
{-1585018},
{-1585019},
{-1585020},
{-1585021},
};
@@ -98,7 +98,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Adds.clear();
//SummonAdds();
//SummonAdds();
Reset();
Heroic = c->GetMap()->IsHeroic();
}
@@ -122,7 +122,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void Reset()
{
m_creature->SetCorpseDelay(60*60*1000);
m_creature->SetCorpseDelay(60*60*1000);
LackeysKilled = 0;
PlayersKilled = 0;
@@ -136,18 +136,18 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
CheckAdds();
if(pInstance)
{
pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 0);
if (m_creature->isDead())
pInstance->SetData(DATA_DELRISSA_EVENT, DONE);
else pInstance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED);
}else error_log(ERROR_INST_DATA);
if(pInstance)
{
pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 0);
if (m_creature->isDead())
pInstance->SetData(DATA_DELRISSA_EVENT, DONE);
else pInstance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED);
}else error_log(ERROR_INST_DATA);
}
void Aggro(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
DoScriptText(SAY_AGGRO, m_creature);
for(uint8 i = 0; i < Adds.size(); ++i)
if(Unit* pAdd = Unit::GetUnit(*m_creature, Adds[i]->guid))
@@ -156,8 +156,8 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void SummonAdds()
{
/*if (m_creature->isDead())
return;*/
/*if (m_creature->isDead())
return;*/
std::vector<uint32> AddList;
for(uint8 i = 0; i < 8; ++i)
AddList.push_back(AddEntry[i]);
@@ -178,35 +178,35 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void CheckAdds()
{
//if (m_creature->isDead())
// return;
//if (m_creature->isDead())
// return;
if(Adds.empty())
{
SummonAdds();
{
SummonAdds();
return;
}
}
for(uint8 i = 0; i < Adds.size(); ++i)
{
Creature* pAdd = ((Creature*)Unit::GetUnit(*m_creature, Adds[i]->guid));
if(pAdd && pAdd->isAlive())
{
pAdd->AI()->EnterEvadeMode();
pAdd->GetMotionMaster()->MovePoint(0,LackeyLocations[i][0], LackeyLocations[i][1], POS_Z);
pAdd->AI()->EnterEvadeMode();
pAdd->GetMotionMaster()->MovePoint(0,LackeyLocations[i][0], LackeyLocations[i][1], POS_Z);
}
if(!pAdd || (pAdd && pAdd->isDead()))
if(!pAdd || (pAdd && pAdd->isDead()))
{
if(pAdd)
pAdd->RemoveCorpse();//looks stupid if mob is alive but has a dead corpse in front of him :)
Creature* pAdd = m_creature->SummonCreature(Adds[i]->entry, LackeyLocations[i][0], LackeyLocations[i][1], POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
if(pAdd)
Adds[i]->guid = pAdd->GetGUID();
}
if(pAdd)
pAdd->RemoveCorpse();//looks stupid if mob is alive but has a dead corpse in front of him :)
Creature* pAdd = m_creature->SummonCreature(Adds[i]->entry, LackeyLocations[i][0], LackeyLocations[i][1], POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0);
if(pAdd)
Adds[i]->guid = pAdd->GetGUID();
}
}
}
void KilledUnit(Unit* victim)
{
if(victim->GetTypeId() != TYPEID_PLAYER || m_creature->isDead())
if(victim->GetTypeId() != TYPEID_PLAYER || m_creature->isDead())
return;
DoScriptText(PlayerDeath[PlayersKilled].id, m_creature);
@@ -216,18 +216,18 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI
void KilledLackey()
{
if(m_creature->isDead())//no sense to talk if dead..
return;
if(m_creature->isDead())//no sense to talk if dead..
return;
DoScriptText(LackeyDeath[LackeysKilled].id, m_creature);
if( LackeysKilled < 3 )
++LackeysKilled;
CheckLootable();
CheckLootable();
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
CheckLootable();
@@ -370,12 +370,12 @@ struct TRINITY_DLL_DECL boss_priestess_guestAI : public ScriptedAI
void Reset()
{
UsedPotion = false;
if(pInstance)
{
Creature *boss = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_DELRISSA)));
if (boss && boss->isDead())
boss->Respawn();
}
if(pInstance)
{
Creature *boss = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_DELRISSA)));
if (boss && boss->isDead())
boss->Respawn();
}
ResetThreatTimer = 5000 + rand()%15000; // These guys like to switch targets often, and are not meant to be tanked.
}
@@ -646,8 +646,8 @@ struct TRINITY_DLL_DECL boss_ellris_duskhallowAI : public boss_priestess_guestAI
Fear_Timer = 10000;
}else Fear_Timer -= diff;
if (m_creature->GetDistance(m_creature->getVictim()) <= 10)
m_creature->StopMoving();
if (m_creature->GetDistance(m_creature->getVictim()) <= 10)
m_creature->StopMoving();
//DoMeleeAttackIfReady();//should not melee, she's a warlock
}
};
@@ -755,7 +755,7 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI
if(Polymorph_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_POLYMORPH);
DoModifyThreatPercent(target,-100);
@@ -802,27 +802,27 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI
if(Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()))
//if in melee range
if (target->IsWithinDistInMap(m_creature, 5))
{
InMeleeRange = true;
break;
}
{
InMeleeRange = true;
break;
}
}
//if anybody is in melee range than escape by blink
if(InMeleeRange)
{
//DoCast(m_creature, SPELL_BLINK); //blink does not work on npcs
float x,y,z;
m_creature->GetPosition(x,y,z);
x = rand()%2 ? x+10+rand()%10 : x-10-rand()%10;
y = rand()%2 ? y+10+rand()%10 : y-10-rand()%10;
m_creature->Relocate(x,y,z);
m_creature->SendMonsterMove(x, y, m_creature->GetPositionZ(), 0,0,0);
}
{
//DoCast(m_creature, SPELL_BLINK); //blink does not work on npcs
float x,y,z;
m_creature->GetPosition(x,y,z);
x = rand()%2 ? x+10+rand()%10 : x-10-rand()%10;
y = rand()%2 ? y+10+rand()%10 : y-10-rand()%10;
m_creature->Relocate(x,y,z);
m_creature->SendMonsterMove(x, y, m_creature->GetPositionZ(), 0,0,0);
}
Blink_Timer = 8000;
}else Blink_Timer -= diff;
if (m_creature->GetDistance(m_creature->getVictim()) <= 10)
m_creature->StopMoving();
if (m_creature->GetDistance(m_creature->getVictim()) <= 10)
m_creature->StopMoving();
//DoMeleeAttackIfReady(); //mage type, no melee needed
}
@@ -968,8 +968,8 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
uint32 Multi_Shot_Timer;
uint32 Wing_Clip_Timer;
uint32 Freezing_Trap_Timer;
uint32 StopMoving;
bool Stopped;
uint32 StopMoving;
bool Stopped;
void Reset()
{
@@ -982,8 +982,8 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
Multi_Shot_Timer = 10000;
Wing_Clip_Timer = 4000;
Freezing_Trap_Timer = 15000;
StopMoving = 2000;
Stopped = false;
StopMoving = 2000;
Stopped = false;
boss_priestess_guestAI::Reset();
}
@@ -1054,16 +1054,16 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI
Shoot_Timer = 2500;
}else Shoot_Timer -= diff;
}
if(StopMoving < diff)
if(StopMoving < diff)
{
if(Stopped)
Stopped = false;
else
Stopped = true;
if(Stopped)
Stopped = false;
else
Stopped = true;
StopMoving = 2000+rand()%5000;
}else StopMoving -= diff;
if (Stopped)
m_creature->StopMoving();
if (Stopped)
m_creature->StopMoving();
}
};
@@ -1207,11 +1207,11 @@ struct TRINITY_DLL_DECL boss_zelfanAI : public boss_priestess_guestAI
if(Goblin_Dragon_Gun_Timer < diff)
{
if (m_creature->GetDistance(m_creature->getVictim()) <= 5)
{
Goblin_Dragon_Gun_Timer = 10000;
DoCast(m_creature->getVictim(), SPELL_GOBLIN_DRAGON_GUN);
}else Goblin_Dragon_Gun_Timer = 2000;
if (m_creature->GetDistance(m_creature->getVictim()) <= 5)
{
Goblin_Dragon_Gun_Timer = 10000;
DoCast(m_creature->getVictim(), SPELL_GOBLIN_DRAGON_GUN);
}else Goblin_Dragon_Gun_Timer = 2000;
}else Goblin_Dragon_Gun_Timer -= diff;
if(Rocket_Launch_Timer < diff)
@@ -68,7 +68,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
}
}
Reset();
Heroic = c->GetMap()->IsHeroic();
Heroic = c->GetMap()->IsHeroic();
}
ScriptedInstance* pInstance;
@@ -109,9 +109,9 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
Door->SetGoState(0); // Open the big encounter door. Close it in Aggro and open it only in JustDied(and here)
// Small door opened after event are expected to be closed by default
// Set Inst data for encounter
if (m_creature->isDead())
pInstance->SetData(DATA_SELIN_EVENT, DONE);
else pInstance->SetData(DATA_SELIN_EVENT, NOT_STARTED);
if (m_creature->isDead())
pInstance->SetData(DATA_SELIN_EVENT, DONE);
else pInstance->SetData(DATA_SELIN_EVENT, NOT_STARTED);
}else error_log(ERROR_INST_DATA);
DrainLifeTimer = 3000 + rand()%4000;
@@ -154,7 +154,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
if( CrystalChosen )
{
DoScriptText(SAY_ENERGY, m_creature);
DoScriptText(EMOTE_CRYSTAL, m_creature);
DoScriptText(EMOTE_CRYSTAL, m_creature);
CrystalChosen->CastSpell(CrystalChosen, SPELL_FEL_CRYSTAL_COSMETIC, true);
@@ -184,7 +184,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
void Aggro(Unit* who)
{
m_creature->SetPower(POWER_MANA, 0);
m_creature->SetPower(POWER_MANA, 0);
DoScriptText(SAY_AGGRO, m_creature);
if( pInstance )
@@ -199,8 +199,8 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
{
switch(rand()%2)
{
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
case 0: DoScriptText(SAY_KILL_1, m_creature); break;
case 1: DoScriptText(SAY_KILL_2, m_creature); break;
}
}
@@ -228,7 +228,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
if(!pInstance)
{
@@ -300,33 +300,33 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI
{
if( IsDraining )
{
if (CheckTimer < diff)
{
Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
if(CrystalChosen)
{
if(CrystalChosen->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MANA_RAGE)
{
m_creature->StopMoving();
}else{
IsDraining = false;
DrainingCrystal = false;
if (CheckTimer < diff)
{
Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
if(CrystalChosen)
{
if(CrystalChosen->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MANA_RAGE)
{
m_creature->StopMoving();
}else{
IsDraining = false;
DrainingCrystal = false;
DoScriptText(SAY_EMPOWERED, m_creature);
DoScriptText(SAY_EMPOWERED, m_creature);
Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
if( CrystalChosen && CrystalChosen->isAlive() )
// Use Deal Damage to kill it, not setDeathState.
CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
CrystalGUID = 0;
Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
if( CrystalChosen && CrystalChosen->isAlive() )
// Use Deal Damage to kill it, not setDeathState.
CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
CrystalGUID = 0;
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
}
}
CheckTimer = 1000;
}else CheckTimer -= diff;
}
m_creature->GetMotionMaster()->Clear();
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
}
}
CheckTimer = 1000;
}else CheckTimer -= diff;
}
}
DoMeleeAttackIfReady(); // No need to check if we are draining crystal here, as the spell has a stun.
}
@@ -349,7 +349,7 @@ struct TRINITY_DLL_DECL mob_fel_crystalAI : public ScriptedAI
void JustDied(Unit* killer)
{
m_creature->RemoveAurasDueToSpell(SPELL_MANA_RAGE);
m_creature->RemoveAurasDueToSpell(SPELL_MANA_RAGE);
if(ScriptedInstance* pInstance = ((ScriptedInstance*)m_creature->GetInstanceData()))
{
Creature* Selin = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_SELIN)));
@@ -360,7 +360,7 @@ struct TRINITY_DLL_DECL mob_fel_crystalAI : public ScriptedAI
// Set this to false if we are the creature that Selin is draining so his AI flows properly
((boss_selin_fireheartAI*)Selin->AI())->DrainingCrystal = false;
((boss_selin_fireheartAI*)Selin->AI())->IsDraining = false;
Selin->RemoveAurasDueToSpell(SPELL_MANA_RAGE);
Selin->RemoveAurasDueToSpell(SPELL_MANA_RAGE);
if(Selin->getVictim())
{
Selin->AI()->AttackStart(Selin->getVictim());
@@ -41,7 +41,7 @@ EndScriptData */
#define SPELL_SUMMON_PURE_ENERGY 44322 //not-working, this script summon this creatures without this spell
#define SPELL_OVERLOAD 44353
#define SPELL_ARCANE_SHOCK 44319
#define ASTRAL_FLARE_VISUAL 30237
#define ASTRAL_FLARE_VISUAL 30237
//Creatures
#define CREATURE_PURE_ENERGY 24745
@@ -76,16 +76,16 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
Enraged = false;
if(pInstance)
{
if (m_creature->isDead())
pInstance->SetData(DATA_VEXALLUS_EVENT, DONE);
else pInstance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED);
}
{
if (m_creature->isDead())
pInstance->SetData(DATA_VEXALLUS_EVENT, DONE);
else pInstance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED);
}
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_KILL, m_creature);
DoScriptText(SAY_KILL, m_creature);
}
void JustDied(Unit *victim)
@@ -124,8 +124,8 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
//used for check, when Vexallus cast adds 85%, 70%, 55%, 40%, 25%
if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < (100-(SpawnAddInterval*(AlreadySpawnedAmount+1))))
{
DoScriptText(SAY_ENERGY, m_creature);
DoScriptText(EMOTE_DISCHARGE_ENERGY, m_creature);
DoScriptText(SAY_ENERGY, m_creature);
DoScriptText(EMOTE_DISCHARGE_ENERGY, m_creature);
Creature* PureEnergyCreature = NULL;
PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, 10, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
Unit* target = NULL;
@@ -146,7 +146,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
if(ChainLightningTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CHAIN_LIGHTNING);
ChainLightningTimer = 10000;
}else ChainLightningTimer -= diff;
@@ -162,7 +162,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI
{
if(OverloadTimer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_OVERLOAD);
OverloadTimer = 2200;
}else OverloadTimer -= diff;
@@ -181,14 +181,14 @@ struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI
mob_pure_energyAI(Creature *c) : ScriptedAI(c) {Reset();}
uint32 EnergyBoltTimer;
uint32 VisualTimer;
uint32 VisualTimer;
void Reset()
{
EnergyBoltTimer = 1700;
VisualTimer = 1000;
m_creature->SetSpeed(MOVE_RUN, 0.5f);
m_creature->SetSpeed(MOVE_WALK, 0.5f);
VisualTimer = 1000;
m_creature->SetSpeed(MOVE_RUN, 0.5f);
m_creature->SetSpeed(MOVE_WALK, 0.5f);
}
void JustDied(Unit* slayer)
@@ -208,7 +208,7 @@ struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI
DoCast(m_creature->getVictim(), SPELL_ENERGY_BOLT);
EnergyBoltTimer = 1700;
}else EnergyBoltTimer -= diff;
if(VisualTimer < diff)
if(VisualTimer < diff)
{
DoCast(m_creature->getVictim(), ASTRAL_FLARE_VISUAL, true);
VisualTimer = 1000;
@@ -25,7 +25,7 @@
#define DATA_DELRISSA_DEATH_COUNT 15
#define DATA_KAEL 16
#define DATA_KAEL 16
#define ERROR_INST_DATA "SD2 Error: Instance Data not set properly for Magister's Terrace instance (map 585). Encounters will be buggy."
#endif
@@ -37,14 +37,14 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
{
instance_magisters_terrace(Map* map) : ScriptedInstance(map) {Initialize();}
uint32 DoorState[3];//0seline, 1vexallus, 2derlissa
uint32 DoorState[3];//0seline, 1vexallus, 2derlissa
uint32 Encounters[NUMBER_OF_ENCOUNTERS];
uint32 DelrissaDeathCount;
std::list<uint64> FelCrystals;
std::list<uint64>::iterator CrystalItr;
uint64 KaelGUID;
uint64 KaelGUID;
uint64 SelinGUID;
uint64 DelrissaGUID;
uint64 VexallusDoorGUID;
@@ -57,8 +57,8 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
void Initialize()
{
for(uint8 i = 0; i < 3; i++)
DoorState[i] = 1;//1 closed, 0 opened
for(uint8 i = 0; i < 3; i++)
DoorState[i] = 1;//1 closed, 0 opened
for(uint8 i = 0; i < NUMBER_OF_ENCOUNTERS; i++)
Encounters[i] = NOT_STARTED;
@@ -67,7 +67,7 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
DelrissaDeathCount = 0;
KaelGUID = 0;
KaelGUID = 0;
SelinGUID = 0;
DelrissaGUID = 0;
VexallusDoorGUID = 0;
@@ -107,29 +107,29 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
switch(identifier)
{
case DATA_SELIN_EVENT:
Encounters[0] = data;
if(data==DONE)
{
DoorState[0] = 0;
SaveToDB();
}
break;
Encounters[0] = data;
if(data==DONE)
{
DoorState[0] = 0;
SaveToDB();
}
break;
case DATA_VEXALLUS_EVENT:
Encounters[1] = data;
if(data==DONE)
{
DoorState[1] = 0;
SaveToDB();
}
break;
Encounters[1] = data;
if(data==DONE)
{
DoorState[1] = 0;
SaveToDB();
}
break;
case DATA_DELRISSA_EVENT:
Encounters[2] = data;
if(data==DONE)
{
DoorState[2] = 0;
SaveToDB();
}
break;
Encounters[2] = data;
if(data==DONE)
{
DoorState[2] = 0;
SaveToDB();
}
break;
case DATA_KAELTHAS_EVENT: Encounters[3] = data; break;
case DATA_DELRISSA_DEATH_COUNT:
@@ -138,7 +138,7 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
}
}
const char* Save()
const char* Save()
{
std::ostringstream ss;
ss << "S " << DoorState[0] << " " << DoorState[1] << " " << DoorState[2];
@@ -169,7 +169,7 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
case 24723: SelinGUID = creature->GetGUID(); break;
case 24560: DelrissaGUID = creature->GetGUID(); break;
case 24722: FelCrystals.push_back(creature->GetGUID()); break;
case 24664: KaelGUID = creature->GetGUID(); break;
case 24664: KaelGUID = creature->GetGUID(); break;
}
}
@@ -178,20 +178,20 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
switch(go->GetEntry())
{
case 187896:
VexallusDoorGUID = go->GetGUID();
go->SetGoState(DoorState[1]);
break;
VexallusDoorGUID = go->GetGUID();
go->SetGoState(DoorState[1]);
break;
//SunwellRaid Gate 02
case 187979:
SelinDoorGUID = go->GetGUID();
go->SetGoState(DoorState[0]);
break;
SelinDoorGUID = go->GetGUID();
go->SetGoState(DoorState[0]);
break;
//Assembly Chamber Door
case 188065: SelinEncounterDoorGUID = go->GetGUID(); break;
case 187770:
DelrissaDoorGUID = go->GetGUID();
go->SetGoState(DoorState[2]);
break;
DelrissaDoorGUID = go->GetGUID();
go->SetGoState(DoorState[2]);
break;
case 188165: KaelStatue[0] = go->GetGUID(); break;
case 188166: KaelStatue[1] = go->GetGUID(); break;
}
@@ -202,7 +202,7 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance
switch(identifier)
{
case DATA_SELIN: return SelinGUID;
case DATA_KAEL: return KaelGUID;
case DATA_KAEL: return KaelGUID;
case DATA_DELRISSA: return DelrissaGUID;
case DATA_VEXALLUS_DOOR: return VexallusDoorGUID;
case DATA_SELIN_DOOR: return SelinDoorGUID;
@@ -57,9 +57,9 @@ struct TRINITY_DLL_DECL boss_baron_geddonAI : public ScriptedAI
//If we are <2% hp cast Armageddom
if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 2)
{
m_creature->InterruptNonMeleeSpells(true);
m_creature->InterruptNonMeleeSpells(true);
DoCast(m_creature,SPELL_ARMAGEDDOM);
DoScriptText(EMOTE_SERVICE, m_creature);
DoScriptText(EMOTE_SERVICE, m_creature);
return;
}
@@ -74,7 +74,7 @@ struct TRINITY_DLL_DECL boss_baron_geddonAI : public ScriptedAI
if (IgniteMana_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_IGNITEMANA);
DoCast(target,SPELL_IGNITEMANA);
IgniteMana_Timer = 30000;
}else IgniteMana_Timer -= diff;
@@ -83,7 +83,7 @@ struct TRINITY_DLL_DECL boss_baron_geddonAI : public ScriptedAI
if (LivingBomb_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_LIVINGBOMB);
DoCast(target,SPELL_LIVINGBOMB);
LivingBomb_Timer = 35000;
}else LivingBomb_Timer -= diff;
@@ -43,7 +43,7 @@ struct TRINITY_DLL_DECL boss_golemaggAI : public ScriptedAI
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance *pInstance;
ScriptedInstance *pInstance;
uint32 Pyroblast_Timer;
uint32 EarthQuake_Timer;
@@ -79,7 +79,7 @@ struct TRINITY_DLL_DECL boss_golemaggAI : public ScriptedAI
if (Pyroblast_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_PYROBLAST);
DoCast(target,SPELL_PYROBLAST);
Pyroblast_Timer = 7000;
}else Pyroblast_Timer -= diff;
@@ -153,7 +153,7 @@ struct TRINITY_DLL_DECL mob_core_ragerAI : public ScriptedAI
if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 50 )
{
DoCast(m_creature,SPELL_AEGIS);
DoScriptText(EMOTE_AEGIS, m_creature);
DoScriptText(EMOTE_AEGIS, m_creature);
}
//Check_Timer
@@ -54,12 +54,12 @@ EndScriptData */
struct TRINITY_DLL_DECL boss_majordomoAI : public ScriptedAI
{
boss_majordomoAI(Creature *c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Reset();
}
ScriptedInstance* pInstance;
ScriptedInstance* pInstance;
uint32 MagicReflection_Timer;
uint32 DamageReflection_Timer;
@@ -77,12 +77,12 @@ struct TRINITY_DLL_DECL boss_majordomoAI : public ScriptedAI
if (rand()%5)
return;
DoScriptText(SAY_SLAY, m_creature);
DoScriptText(SAY_SLAY, m_creature);
}
void Aggro(Unit *who)
{
DoScriptText(SAY_AGGRO, m_creature);
DoScriptText(SAY_AGGRO, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -124,7 +124,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (rand()%5)
return;
DoScriptText(SAY_KILL, m_creature);
DoScriptText(SAY_KILL, m_creature);
}
void Aggro(Unit *who)
@@ -158,7 +158,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (rand()%2 == 0)
{
DoScriptText(SAY_WRATH, m_creature);
DoScriptText(SAY_WRATH, m_creature);
}
WrathOfRagnaros_Timer = 30000;
@@ -171,7 +171,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (rand()%2==0)
{
DoScriptText(SAY_HAND, m_creature);
DoScriptText(SAY_HAND, m_creature);
}
HandOfRagnaros_Timer = 25000;
@@ -217,7 +217,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (!HasSubmergedOnce)
{
DoScriptText(SAY_REINFORCEMENTS1, m_creature);
DoScriptText(SAY_REINFORCEMENTS1, m_creature);
// summon 10 elementals
Unit* target = NULL;
@@ -235,7 +235,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
}else
{
DoScriptText(SAY_REINFORCEMENTS2, m_creature);
DoScriptText(SAY_REINFORCEMENTS2, m_creature);
Unit* target = NULL;
for(int i = 0; i < 9;i++)
@@ -272,7 +272,7 @@ struct TRINITY_DLL_DECL boss_ragnarosAI : public Scripted_NoMovementAI
if (!HasYelledMagmaBurst)
{
//Say our dialog
DoScriptText(SAY_MAGMABURST, m_creature);
DoScriptText(SAY_MAGMABURST, m_creature);
HasYelledMagmaBurst = true;
}
@@ -40,15 +40,15 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_molten_core : public ScriptedInstance
{
instance_molten_core(Map *map) : ScriptedInstance(map) {Initialize();};
instance_molten_core(Map *map) : ScriptedInstance(map) {Initialize();};
uint64 Lucifron, Magmadar, Gehennas, Garr, Geddon, Shazzrah, Sulfuron, Golemagg, Domo, Ragnaros, FlamewakerPriest;
uint64 RuneKoro, RuneZeth, RuneMazj, RuneTheri, RuneBlaz, RuneKress, RuneMohn;
uint64 RuneKoro, RuneZeth, RuneMazj, RuneTheri, RuneBlaz, RuneKress, RuneMohn;
//If all Bosses are dead.
bool IsBossDied[9];
uint32 Encounter[ENCOUNTERS];
uint32 Encounter[ENCOUNTERS];
void Initialize()
{
@@ -64,13 +64,13 @@ struct TRINITY_DLL_DECL instance_molten_core : public ScriptedInstance
Ragnaros = 0;
FlamewakerPriest = 0;
RuneKoro = 0;
RuneZeth = 0;
RuneMazj = 0;
RuneTheri = 0;
RuneBlaz = 0;
RuneKress = 0;
RuneMohn = 0;
RuneKoro = 0;
RuneZeth = 0;
RuneMazj = 0;
RuneTheri = 0;
RuneBlaz = 0;
RuneKress = 0;
RuneMohn = 0;
IsBossDied[0] = false;
IsBossDied[1] = false;
@@ -84,7 +84,7 @@ struct TRINITY_DLL_DECL instance_molten_core : public ScriptedInstance
IsBossDied[8] = false;
for(uint8 i = 0; i < ENCOUNTERS; i++)
Encounter[i] = NOT_STARTED;
Encounter[i] = NOT_STARTED;
}
@@ -98,29 +98,29 @@ struct TRINITY_DLL_DECL instance_molten_core : public ScriptedInstance
void OnObjectCreate(GameObject *go)
{
switch(go->GetEntry())
{
case 176951: //Sulfuron
RuneKoro = go->GetGUID();
break;
case 176952: //Geddon
RuneZeth = go->GetGUID();
break;
case 176953: //Shazzrah
RuneMazj = go->GetGUID();
break;
case 176954: //Golemagg
RuneTheri = go->GetGUID();
break;
case 176955: //Garr
RuneBlaz = go->GetGUID();
break;
case 176956: //Magmadar
RuneKress = go->GetGUID();
break;
case 176957: //Gehennas
RuneMohn = go->GetGUID();
break;
}
{
case 176951: //Sulfuron
RuneKoro = go->GetGUID();
break;
case 176952: //Geddon
RuneZeth = go->GetGUID();
break;
case 176953: //Shazzrah
RuneMazj = go->GetGUID();
break;
case 176954: //Golemagg
RuneTheri = go->GetGUID();
break;
case 176955: //Garr
RuneBlaz = go->GetGUID();
break;
case 176956: //Magmadar
RuneKress = go->GetGUID();
break;
case 176957: //Gehennas
RuneMohn = go->GetGUID();
break;
}
}
@@ -243,11 +243,11 @@ struct TRINITY_DLL_DECL instance_molten_core : public ScriptedInstance
return 0;
}
void SetData(uint32 type, uint32 data)
{
if (type == DATA_GOLEMAGG_DEATH)
IsBossDied[7] = true;
}
void SetData(uint32 type, uint32 data)
{
if (type == DATA_GOLEMAGG_DEATH)
IsBossDied[7] = true;
}
};
InstanceData* GetInstance_instance_molten_core(Map *map)
@@ -275,9 +275,9 @@ public:
uint32 Event_Timer;
uint32 checkPlayer_Timer;
uint64 PlayerGUID;
uint64 PlayerGUID;
bool Event_onWait;
bool Event_onWait;
void Reset()
{
@@ -481,7 +481,7 @@ public:
case 0:
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2);
DoScriptText(CLINTAR_SPIRIT_SAY_GET_FINAL, m_creature, player);
player->CompleteQuest(10965);
player->CompleteQuest(10965);
Event_Timer = 1500;
Step = 1;
break;
@@ -563,7 +563,7 @@ void AddSC_moonglade()
newscript->pGossipSelect = &GossipSelect_npc_silva_filnaveth;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="npc_clintar_dreamwalker";
newscript->pQuestAccept = &QuestAccept_npc_clintar_dreamwalker;
newscript->RegisterSelf();
@@ -61,96 +61,96 @@ bool GossipSelect_npc_skorn_whitecloud(Player *player, Creature *_Creature, uint
struct TRINITY_DLL_DECL npc_kyle_frenziedAI : public ScriptedAI
{
npc_kyle_frenziedAI(Creature *c) : ScriptedAI(c) {Reset();}
npc_kyle_frenziedAI(Creature *c) : ScriptedAI(c) {Reset();}
int STATE;
uint32 wait;
uint64 player;
int STATE;
uint32 wait;
uint64 player;
void Reset()
{
STATE = 0;
m_creature->SetDefaultMovementType(WAYPOINT_MOTION_TYPE);
m_creature->GetMotionMaster()->Initialize();
}
void Aggro(Unit* who){}
void Reset()
{
STATE = 0;
m_creature->SetDefaultMovementType(WAYPOINT_MOTION_TYPE);
m_creature->GetMotionMaster()->Initialize();
}
void Aggro(Unit* who){}
void SpellHit(Unit *caster, const SpellEntry* spell)
{ // we can feed him without any quest
if(spell->Id == 42222 && caster->GetTypeId() == TYPEID_PLAYER && ((Player*)caster)->GetTeam() == HORDE)
{
STATE = 1;
player = caster->GetGUID();
float x, y, z, z2;
caster->GetPosition(x, y, z);
x = x + 3.7*cos(caster->GetOrientation());
y = y + 3.7*sin(caster->GetOrientation());
z2 = m_creature->GetBaseMap()->GetHeight(x,y,z,false);
z = (z2 <= INVALID_HEIGHT) ? z : z2;
m_creature->SetDefaultMovementType(IDLE_MOTION_TYPE); //there is other way to stop waypoint movement?
m_creature->GetMotionMaster()->Initialize();
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->GetMotionMaster()->MovePoint(0,x, y, z);
}
}
void SpellHit(Unit *caster, const SpellEntry* spell)
{ // we can feed him without any quest
if(spell->Id == 42222 && caster->GetTypeId() == TYPEID_PLAYER && ((Player*)caster)->GetTeam() == HORDE)
{
STATE = 1;
player = caster->GetGUID();
float x, y, z, z2;
caster->GetPosition(x, y, z);
x = x + 3.7*cos(caster->GetOrientation());
y = y + 3.7*sin(caster->GetOrientation());
z2 = m_creature->GetBaseMap()->GetHeight(x,y,z,false);
z = (z2 <= INVALID_HEIGHT) ? z : z2;
m_creature->SetDefaultMovementType(IDLE_MOTION_TYPE); //there is other way to stop waypoint movement?
m_creature->GetMotionMaster()->Initialize();
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->GetMotionMaster()->MovePoint(0,x, y, z);
}
}
void MovementInform(uint32 type, uint32 id)
{
if(type == POINT_MOTION_TYPE)
{
switch(STATE)
{
case 1:
{
Unit *plr = Unit::GetUnit((*m_creature),player);
if(plr)
m_creature->SetOrientation(m_creature->GetAngle(plr));
m_creature->HandleEmoteCommand(EMOTE_STATE_USESTANDING); //eat
WorldPacket data;
m_creature->BuildHeartBeatMsg(&data);
m_creature->SendMessageToSet(&data,true);
wait = 3000;
STATE = 2;
break;
}
case 4:
m_creature->setDeathState(JUST_DIED);
m_creature->Respawn();
break;
}
}
}
{
if(type == POINT_MOTION_TYPE)
{
switch(STATE)
{
case 1:
{
Unit *plr = Unit::GetUnit((*m_creature),player);
if(plr)
m_creature->SetOrientation(m_creature->GetAngle(plr));
m_creature->HandleEmoteCommand(EMOTE_STATE_USESTANDING); //eat
WorldPacket data;
m_creature->BuildHeartBeatMsg(&data);
m_creature->SendMessageToSet(&data,true);
wait = 3000;
STATE = 2;
break;
}
case 4:
m_creature->setDeathState(JUST_DIED);
m_creature->Respawn();
break;
}
}
}
void UpdateAI(const uint32 diff)
{
if (!STATE || STATE == 4)
return;
if(wait < diff)
{
switch(STATE)
{
case 2:
STATE = 3; wait = 7000;
m_creature->UpdateEntry(23622,HORDE);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
break;
case 3:
STATE = 4; //go home
Unit *plr = Unit::GetUnit((*m_creature),player);
if(plr && ((Player*)plr)->GetQuestStatus(11129) == QUEST_STATUS_INCOMPLETE)
((Player*)plr)->CompleteQuest(11129);
float x, y, z, z2, angle;
angle = m_creature->GetAngle(-2146, -430);
m_creature->GetPosition(x,y,z);
x = x + 40*cos(angle);
y = y + 40*sin(angle);
z2 = m_creature->GetBaseMap()->GetHeight(x,y,MAX_HEIGHT,false);
z = (z2 <= INVALID_HEIGHT) ? z : z2;
m_creature->GetMotionMaster()->MovePoint(0,x,y,z);
break;
}
}else wait -= diff;
}
void UpdateAI(const uint32 diff)
{
if (!STATE || STATE == 4)
return;
if(wait < diff)
{
switch(STATE)
{
case 2:
STATE = 3; wait = 7000;
m_creature->UpdateEntry(23622,HORDE);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_DANCE);
break;
case 3:
STATE = 4; //go home
Unit *plr = Unit::GetUnit((*m_creature),player);
if(plr && ((Player*)plr)->GetQuestStatus(11129) == QUEST_STATUS_INCOMPLETE)
((Player*)plr)->CompleteQuest(11129);
float x, y, z, z2, angle;
angle = m_creature->GetAngle(-2146, -430);
m_creature->GetPosition(x,y,z);
x = x + 40*cos(angle);
y = y + 40*sin(angle);
z2 = m_creature->GetBaseMap()->GetHeight(x,y,MAX_HEIGHT,false);
z = (z2 <= INVALID_HEIGHT) ? z : z2;
m_creature->GetMotionMaster()->MovePoint(0,x,y,z);
break;
}
}else wait -= diff;
}
};
CreatureAI* GetAI_npc_kyle_frenzied(Creature *_Creature)
@@ -168,7 +168,7 @@ void AddSC_mulgore()
newscript->pGossipSelect = &GossipSelect_npc_skorn_whitecloud;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name="npc_kyle_frenzied";
newscript->GetAI = &GetAI_npc_kyle_frenzied;
newscript->RegisterSelf();
@@ -75,24 +75,24 @@ struct TRINITY_DLL_DECL boss_anubrekhanAI : public ScriptedAI
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
}
}
void MoveInLineOfSight(Unit *who)
{
if (!HasTaunted && m_creature->IsWithinDistInMap(who, 60.0f))
{
if (!HasTaunted && m_creature->IsWithinDistInMap(who, 60.0f))
{
switch(rand()%5)
{
case 0: DoScriptText(SAY_GREET, m_creature); break;
case 1: DoScriptText(SAY_TAUNT1, m_creature); break;
case 2: DoScriptText(SAY_TAUNT2, m_creature); break;
case 3: DoScriptText(SAY_TAUNT3, m_creature); break;
case 4: DoScriptText(SAY_TAUNT4, m_creature); break;
case 0: DoScriptText(SAY_GREET, m_creature); break;
case 1: DoScriptText(SAY_TAUNT1, m_creature); break;
case 2: DoScriptText(SAY_TAUNT2, m_creature); break;
case 3: DoScriptText(SAY_TAUNT3, m_creature); break;
case 4: DoScriptText(SAY_TAUNT4, m_creature); break;
}
HasTaunted = true;
}
@@ -111,8 +111,8 @@ struct TRINITY_DLL_DECL boss_anubrekhanAI : public ScriptedAI
//Do NOT cast it when we are afflicted by locust swarm
if (!m_creature->HasAura(SPELL_LOCUSTSWARM,1))
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_IMPALE);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_IMPALE);
}
Impale_Timer = 15000;
@@ -59,22 +59,22 @@ struct TRINITY_DLL_DECL boss_faerlinaAI : public ScriptedAI
{
switch (rand()%4)
{
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
case 3: DoScriptText(SAY_AGGRO4, m_creature); break;
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
case 3: DoScriptText(SAY_AGGRO4, m_creature); break;
}
}
void MoveInLineOfSight(Unit *who)
{
if (!HasTaunted && m_creature->IsWithinDistInMap(who, 60.0f))
{
{
DoScriptText(SAY_GREET, m_creature);
HasTaunted = true;
}
ScriptedAI::MoveInLineOfSight(who);
ScriptedAI::MoveInLineOfSight(who);
}
void KilledUnit(Unit* victim)
@@ -88,7 +88,7 @@ struct TRINITY_DLL_DECL boss_faerlinaAI : public ScriptedAI
void JustDied(Unit* Killer)
{
DoScriptText(SAY_DEATH, m_creature);
DoScriptText(SAY_DEATH, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -106,8 +106,8 @@ struct TRINITY_DLL_DECL boss_faerlinaAI : public ScriptedAI
//RainOfFire_Timer
if (RainOfFire_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_RAINOFFIRE);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_RAINOFFIRE);
RainOfFire_Timer = 16000;
}else RainOfFire_Timer -= diff;
@@ -187,7 +187,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
GuardiansOfIcecrown_Timer = 5000; //5 seconds for summoning each Guardian of Icecrown in phase 3
for(int i=0; i<5; i++)
{
{
if(GuardiansOfIcecrown[i])
{
//delete creature
@@ -196,7 +196,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
pUnit->DealDamage(pUnit, pUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
GuardiansOfIcecrown[i] = 0;
}
}
}
Phase1_Timer = 310000; //Phase 1 lasts 5 minutes and 10 seconds
Phase2 = false;
@@ -205,10 +205,10 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
void KilledUnit()
{
if (rand()%2)
DoScriptText(SAY_SLAY1, m_creature);
else
DoScriptText(SAY_SLAY2, m_creature);
if (rand()%2)
DoScriptText(SAY_SLAY1, m_creature);
else
DoScriptText(SAY_SLAY2, m_creature);
}
void JustDied(Unit* Killer)
@@ -266,9 +266,9 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
{
switch(rand()%3)
{
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
}
}
@@ -299,7 +299,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
{
//DoCast(m_creature->getVictim(),SPELL_CHAINS_OF_KELTHUZAD);
//if(rand()%2 == 0)
//if(rand()%2 == 0)
//DoScriptText(SAY_CHAIN1, m_creature);
//else
//DoScriptText(SAY_CHAIN2, m_creature);
@@ -313,7 +313,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
DoCast(m_creature->getVictim(),SPELL_MANA_DETONATION);
if (rand()%2)
DoScriptText(SAY_SPECIAL1_MANA_DET, m_creature);
DoScriptText(SAY_SPECIAL1_MANA_DET, m_creature);
ManaDetonation_Timer = 20000;
}else ManaDetonation_Timer -= diff;
@@ -323,7 +323,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
DoCast(m_creature->getVictim(),SPELL_SHADOW_FISURE);
if (rand()%2)
DoScriptText(SAY_SPECIAL3_MANA_DET, m_creature);
DoScriptText(SAY_SPECIAL3_MANA_DET, m_creature);
ShadowFisure_Timer = 25000;
}else ShadowFisure_Timer -= diff;
@@ -334,7 +334,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
DoCast(m_creature->getVictim(),SPELL_FROST_BLAST);
if(rand()%2 == 0)
DoScriptText(SAY_FROST_BLAST, m_creature);
DoScriptText(SAY_FROST_BLAST, m_creature);
FrostBlast_Timer = (rand()%30+30)*1000;
}else FrostBlast_Timer -= diff;
@@ -342,7 +342,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public ScriptedAI
if(!Phase3 && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40)
{
Phase3 = true;
DoScriptText(SAY_REQUEST_AID, m_creature);
DoScriptText(SAY_REQUEST_AID, m_creature);
//here Lich King should respond to KelThuzad but I don't know which creature to make talk
//so for now just make Kelthuzad says it.
DoScriptText(SAY_ANSWER_REQUEST, m_creature);
@@ -68,9 +68,9 @@ struct TRINITY_DLL_DECL boss_nothAI : public ScriptedAI
{
switch (rand()%3)
{
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
}
}
@@ -78,16 +78,16 @@ struct TRINITY_DLL_DECL boss_nothAI : public ScriptedAI
{
switch (rand()%2)
{
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
case 0: DoScriptText(SAY_SLAY1, m_creature); break;
case 1: DoScriptText(SAY_SLAY2, m_creature); break;
}
}
void JustSummoned(Creature* summoned)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
summoned->AddThreat(target,0.0f);
}
void JustSummoned(Creature* summoned)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
summoned->AddThreat(target,0.0f);
}
void JustDied(Unit* Killer)
{
@@ -120,8 +120,8 @@ struct TRINITY_DLL_DECL boss_nothAI : public ScriptedAI
{
DoScriptText(SAY_SUMMON, m_creature);
for(uint8 i = 0; i < 6; i++)
m_creature->SummonCreature(C_PLAGUED_WARRIOR,2684.804,-3502.517,261.313,0,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,80000);
for(uint8 i = 0; i < 6; i++)
m_creature->SummonCreature(C_PLAGUED_WARRIOR,2684.804,-3502.517,261.313,0,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,80000);
Summon_Timer = 30500;
} else Summon_Timer -= diff;
@@ -88,15 +88,15 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
if(LifeDrain_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_LIFE_DRAIN);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_LIFE_DRAIN);
LifeDrain_Timer = 24000;
}else LifeDrain_Timer -= diff;
if(Blizzard_Timer < diff)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_BLIZZARD);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_BLIZZARD);
Blizzard_Timer = 20000;
}else Blizzard_Timer -= diff;
@@ -117,14 +117,14 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
landoff = false;
}else Fly_Timer -= diff;
}
}
}
if (phase == 2)
{
if(Icebolt_Timer < diff && Icebolt_Count < 5)
{
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_ICEBOLT);
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target,SPELL_ICEBOLT);
Icebolt_Count ++;
Icebolt_Timer = 4000;
}else Icebolt_Timer -= diff;
@@ -167,7 +167,7 @@ struct TRINITY_DLL_DECL boss_sapphironAI : public ScriptedAI
}
if (phase!=2)
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
};
@@ -356,323 +356,323 @@ bool GOHello_go_manaforge_control_console(Player *player, GameObject* _GO)
// Entries of Arcanist Ardonis, Commander Dawnforge, Pathaleon the Curators Image
int CreatureEntry[3][1] =
{
{19830}, // Ardonis
{19831}, // Dawnforge
{21504} // Pathaleon
{19830}, // Ardonis
{19831}, // Dawnforge
{21504} // Pathaleon
};
struct TRINITY_DLL_DECL npc_commander_dawnforgeAI : public ScriptedAI
{
npc_commander_dawnforgeAI(Creature *c) : ScriptedAI(c) { Reset (); }
npc_commander_dawnforgeAI(Creature *c) : ScriptedAI(c) { Reset (); }
uint64 playerGUID;
uint64 ardonisGUID;
uint64 pathaleonGUID;
uint64 playerGUID;
uint64 ardonisGUID;
uint64 pathaleonGUID;
uint32 Phase;
uint32 PhaseSubphase;
uint32 Phase_Timer;
bool isEvent;
uint32 Phase;
uint32 PhaseSubphase;
uint32 Phase_Timer;
bool isEvent;
float angle_dawnforge;
float angle_ardonis;
float angle_dawnforge;
float angle_ardonis;
void Reset()
{
playerGUID = 0;
ardonisGUID = 0;
pathaleonGUID = 0;
void Reset()
{
playerGUID = 0;
ardonisGUID = 0;
pathaleonGUID = 0;
Phase = 1;
PhaseSubphase = 0;
Phase_Timer = 4000;
isEvent = false;
}
Phase = 1;
PhaseSubphase = 0;
Phase_Timer = 4000;
isEvent = false;
}
void Aggro(Unit *who) { }
void Aggro(Unit *who) { }
//Select any creature in a grid
Creature* SelectCreatureInGrid(uint32 entry, float range)
{
Creature* pCreature = NULL;
//Select any creature in a grid
Creature* SelectCreatureInGrid(uint32 entry, float range)
{
Creature* pCreature = NULL;
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*m_creature, entry, true, range);
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*m_creature, entry, true, range);
Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(m_creature, pCreature, creature_check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
CellLock<GridReadGuard> cell_lock(cell, pair);
cell_lock->Visit(cell_lock, creature_searcher,*(m_creature->GetMap()));
CellLock<GridReadGuard> cell_lock(cell, pair);
cell_lock->Visit(cell_lock, creature_searcher,*(m_creature->GetMap()));
return pCreature;
}
return pCreature;
}
void JustSummoned(Creature *summoned)
{
pathaleonGUID = summoned->GetGUID();
}
void JustSummoned(Creature *summoned)
{
pathaleonGUID = summoned->GetGUID();
}
// Emote Ardonis and Pathaleon
void Turn_to_Pathaleons_Image()
{
Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID);
Unit *pathaleon = Unit::GetUnit(*m_creature,pathaleonGUID);
Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID);
// Emote Ardonis and Pathaleon
void Turn_to_Pathaleons_Image()
{
Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID);
Unit *pathaleon = Unit::GetUnit(*m_creature,pathaleonGUID);
Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID);
if (!ardonis || !pathaleon || !player)
return;
if (!ardonis || !pathaleon || !player)
return;
//Calculate the angle to Pathaleon
angle_dawnforge = m_creature->GetAngle(pathaleon->GetPositionX(), pathaleon->GetPositionY());
angle_ardonis = ardonis->GetAngle(pathaleon->GetPositionX(), pathaleon->GetPositionY());
//Calculate the angle to Pathaleon
angle_dawnforge = m_creature->GetAngle(pathaleon->GetPositionX(), pathaleon->GetPositionY());
angle_ardonis = ardonis->GetAngle(pathaleon->GetPositionX(), pathaleon->GetPositionY());
//Turn Dawnforge and update
m_creature->SetOrientation(angle_dawnforge);
m_creature->SendUpdateToPlayer(player);
//Turn Ardonis and update
ardonis->SetOrientation(angle_ardonis);
ardonis->SendUpdateToPlayer(player);
//Turn Dawnforge and update
m_creature->SetOrientation(angle_dawnforge);
m_creature->SendUpdateToPlayer(player);
//Turn Ardonis and update
ardonis->SetOrientation(angle_ardonis);
ardonis->SendUpdateToPlayer(player);
//Set them to kneel
//Set them to kneel
m_creature->SetStandState(UNIT_STAND_STATE_KNEEL);
ardonis->SetStandState(UNIT_STAND_STATE_KNEEL);
}
}
//Set them back to each other
void Turn_to_eachother()
{
if (Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID))
{
Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID);
//Set them back to each other
void Turn_to_eachother()
{
if (Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID))
{
Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID);
if (!player)
return;
if (!player)
return;
angle_dawnforge = m_creature->GetAngle(ardonis->GetPositionX(), ardonis->GetPositionY());
angle_ardonis = ardonis->GetAngle(m_creature->GetPositionX(), m_creature->GetPositionY());
angle_dawnforge = m_creature->GetAngle(ardonis->GetPositionX(), ardonis->GetPositionY());
angle_ardonis = ardonis->GetAngle(m_creature->GetPositionX(), m_creature->GetPositionY());
//Turn Dawnforge and update
m_creature->SetOrientation(angle_dawnforge);
m_creature->SendUpdateToPlayer(player);
//Turn Ardonis and update
ardonis->SetOrientation(angle_ardonis);
ardonis->SendUpdateToPlayer(player);
//Turn Dawnforge and update
m_creature->SetOrientation(angle_dawnforge);
m_creature->SendUpdateToPlayer(player);
//Turn Ardonis and update
ardonis->SetOrientation(angle_ardonis);
ardonis->SendUpdateToPlayer(player);
//Set state
//Set state
m_creature->SetStandState(UNIT_STAND_STATE_STAND);
ardonis->SetStandState(UNIT_STAND_STATE_STAND);
}
}
}
}
bool CanStartEvent(Player *player)
{
if (!isEvent)
{
Creature *ardonis = SelectCreatureInGrid(CreatureEntry[0][0], 10.0f);
if (!ardonis)
return false;
bool CanStartEvent(Player *player)
{
if (!isEvent)
{
Creature *ardonis = SelectCreatureInGrid(CreatureEntry[0][0], 10.0f);
if (!ardonis)
return false;
ardonisGUID = ardonis->GetGUID();
playerGUID = player->GetGUID();
ardonisGUID = ardonis->GetGUID();
playerGUID = player->GetGUID();
isEvent = true;
isEvent = true;
Turn_to_eachother();
return true;
}
Turn_to_eachother();
return true;
}
debug_log("TSCR: npc_commander_dawnforge event already in progress, need to wait.");
return false;
}
debug_log("TSCR: npc_commander_dawnforge event already in progress, need to wait.");
return false;
}
void UpdateAI(const uint32 diff)
{
//Is event even running?
if (!isEvent)
return;
void UpdateAI(const uint32 diff)
{
//Is event even running?
if (!isEvent)
return;
//Phase timing
if (Phase_Timer >= diff)
{
Phase_Timer -= diff;
return;
}
//Phase timing
if (Phase_Timer >= diff)
{
Phase_Timer -= diff;
return;
}
Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID);
Unit *pathaleon = Unit::GetUnit(*m_creature,pathaleonGUID);
Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID);
Unit *ardonis = Unit::GetUnit(*m_creature,ardonisGUID);
Unit *pathaleon = Unit::GetUnit(*m_creature,pathaleonGUID);
Player *player = (Player*)Unit::GetUnit(*m_creature,playerGUID);
if (!ardonis || !player)
{
Reset();
return;
}
if (!ardonis || !player)
{
Reset();
return;
}
if (Phase > 4 && !pathaleon)
{
Reset();
return;
}
if (Phase > 4 && !pathaleon)
{
Reset();
return;
}
//Phase 1 Dawnforge say
switch (Phase)
{
case 1:
DoScriptText(SAY_COMMANDER_DAWNFORGE_1, m_creature);
++Phase;
Phase_Timer = 16000;
break;
//Phase 2 Ardonis say
case 2:
DoScriptText(SAY_ARCANIST_ARDONIS_1, ardonis);
++Phase;
Phase_Timer = 16000;
break;
//Phase 3 Dawnforge say
case 3:
DoScriptText(SAY_COMMANDER_DAWNFORGE_2, m_creature);
++Phase;
Phase_Timer = 16000;
break;
//Phase 4 Pathaleon spawns up to phase 9
case 4:
//spawn pathaleon's image
m_creature->SummonCreature(CreatureEntry[2][0], 2325.851563, 2799.534668, 133.084229, 6.038996, TEMPSUMMON_TIMED_DESPAWN, 90000);
++Phase;
Phase_Timer = 500;
break;
//Phase 5 Pathaleon say
case 5:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_1, pathaleon);
++Phase;
Phase_Timer = 6000;
break;
//Phase 6
case 6:
switch(PhaseSubphase)
{
//Subphase 1: Turn Dawnforge and Ardonis
case 0:
Turn_to_Pathaleons_Image();
++PhaseSubphase;
Phase_Timer = 8000;
break;
//Subphase 2 Dawnforge say
case 1:
DoScriptText(SAY_COMMANDER_DAWNFORGE_3, m_creature);
PhaseSubphase = 0;
++Phase;
Phase_Timer = 8000;
break;
}
break;
//Phase 7 Pathaleons say 3 Sentence, every sentence need a subphase
case 7:
switch(PhaseSubphase)
{
//Subphase 1
case 0:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2, pathaleon);
++PhaseSubphase;
Phase_Timer = 12000;
break;
//Subphase 2
case 1:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2_1, pathaleon);
++PhaseSubphase;
Phase_Timer = 16000;
break;
//Subphase 3
case 2:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2_2, pathaleon);
PhaseSubphase = 0;
++Phase;
Phase_Timer = 10000;
break;
}
break;
//Phase 8 Dawnforge & Ardonis say
case 8:
DoScriptText(SAY_COMMANDER_DAWNFORGE_4, m_creature);
DoScriptText(SAY_ARCANIST_ARDONIS_2, ardonis);
++Phase;
Phase_Timer = 4000;
break;
//Phase 9 Pathaleons Despawn, Reset Dawnforge & Ardonis angle
case 9:
Turn_to_eachother();
//hide pathaleon, unit will despawn shortly
pathaleon->SetVisibility(VISIBILITY_OFF);
PhaseSubphase = 0;
++Phase;
Phase_Timer = 3000;
break;
//Phase 10 Dawnforge say
case 10:
DoScriptText(SAY_COMMANDER_DAWNFORGE_5, m_creature);
player->AreaExploredOrEventHappens(QUEST_INFO_GATHERING);
Reset();
break;
}
}
//Phase 1 Dawnforge say
switch (Phase)
{
case 1:
DoScriptText(SAY_COMMANDER_DAWNFORGE_1, m_creature);
++Phase;
Phase_Timer = 16000;
break;
//Phase 2 Ardonis say
case 2:
DoScriptText(SAY_ARCANIST_ARDONIS_1, ardonis);
++Phase;
Phase_Timer = 16000;
break;
//Phase 3 Dawnforge say
case 3:
DoScriptText(SAY_COMMANDER_DAWNFORGE_2, m_creature);
++Phase;
Phase_Timer = 16000;
break;
//Phase 4 Pathaleon spawns up to phase 9
case 4:
//spawn pathaleon's image
m_creature->SummonCreature(CreatureEntry[2][0], 2325.851563, 2799.534668, 133.084229, 6.038996, TEMPSUMMON_TIMED_DESPAWN, 90000);
++Phase;
Phase_Timer = 500;
break;
//Phase 5 Pathaleon say
case 5:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_1, pathaleon);
++Phase;
Phase_Timer = 6000;
break;
//Phase 6
case 6:
switch(PhaseSubphase)
{
//Subphase 1: Turn Dawnforge and Ardonis
case 0:
Turn_to_Pathaleons_Image();
++PhaseSubphase;
Phase_Timer = 8000;
break;
//Subphase 2 Dawnforge say
case 1:
DoScriptText(SAY_COMMANDER_DAWNFORGE_3, m_creature);
PhaseSubphase = 0;
++Phase;
Phase_Timer = 8000;
break;
}
break;
//Phase 7 Pathaleons say 3 Sentence, every sentence need a subphase
case 7:
switch(PhaseSubphase)
{
//Subphase 1
case 0:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2, pathaleon);
++PhaseSubphase;
Phase_Timer = 12000;
break;
//Subphase 2
case 1:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2_1, pathaleon);
++PhaseSubphase;
Phase_Timer = 16000;
break;
//Subphase 3
case 2:
DoScriptText(SAY_PATHALEON_CULATOR_IMAGE_2_2, pathaleon);
PhaseSubphase = 0;
++Phase;
Phase_Timer = 10000;
break;
}
break;
//Phase 8 Dawnforge & Ardonis say
case 8:
DoScriptText(SAY_COMMANDER_DAWNFORGE_4, m_creature);
DoScriptText(SAY_ARCANIST_ARDONIS_2, ardonis);
++Phase;
Phase_Timer = 4000;
break;
//Phase 9 Pathaleons Despawn, Reset Dawnforge & Ardonis angle
case 9:
Turn_to_eachother();
//hide pathaleon, unit will despawn shortly
pathaleon->SetVisibility(VISIBILITY_OFF);
PhaseSubphase = 0;
++Phase;
Phase_Timer = 3000;
break;
//Phase 10 Dawnforge say
case 10:
DoScriptText(SAY_COMMANDER_DAWNFORGE_5, m_creature);
player->AreaExploredOrEventHappens(QUEST_INFO_GATHERING);
Reset();
break;
}
}
};
CreatureAI* GetAI_npc_commander_dawnforge(Creature* _Creature)
{
return new npc_commander_dawnforgeAI(_Creature);
return new npc_commander_dawnforgeAI(_Creature);
}
Creature* SearchDawnforge(Player *source, uint32 entry, float range)
{
Creature* pCreature = NULL;
Creature* pCreature = NULL;
CellPair pair(Trinity::ComputeCellPair(source->GetPositionX(), source->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
CellPair pair(Trinity::ComputeCellPair(source->GetPositionX(), source->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*source, entry, true, range);
Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck creature_check(*source, entry, true, range);
Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(source, pCreature, creature_check);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck>, GridTypeMapContainer> creature_searcher(searcher);
CellLock<GridReadGuard> cell_lock(cell, pair);
cell_lock->Visit(cell_lock, creature_searcher,*(source->GetMap()));
CellLock<GridReadGuard> cell_lock(cell, pair);
cell_lock->Visit(cell_lock, creature_searcher,*(source->GetMap()));
return pCreature;
return pCreature;
}
bool AreaTrigger_at_commander_dawnforge(Player *player, AreaTriggerEntry *at)
{
//if player lost aura or not have at all, we should not try start event.
if (!player->HasAura(SPELL_SUNFURY_DISGUISE,0))
return false;
//if player lost aura or not have at all, we should not try start event.
if (!player->HasAura(SPELL_SUNFURY_DISGUISE,0))
return false;
if (player->isAlive() && player->GetQuestStatus(QUEST_INFO_GATHERING) == QUEST_STATUS_INCOMPLETE)
{
Creature* Dawnforge = SearchDawnforge(player, CreatureEntry[1][0], 30.0f);
if (player->isAlive() && player->GetQuestStatus(QUEST_INFO_GATHERING) == QUEST_STATUS_INCOMPLETE)
{
Creature* Dawnforge = SearchDawnforge(player, CreatureEntry[1][0], 30.0f);
if (!Dawnforge)
return false;
if (!Dawnforge)
return false;
if (((npc_commander_dawnforgeAI*)Dawnforge->AI())->CanStartEvent(player))
return true;
}
return false;
if (((npc_commander_dawnforgeAI*)Dawnforge->AI())->CanStartEvent(player))
return true;
}
return false;
}
/*######
## npc_protectorate_nether_drake
######*/
#define GOSSIP_ITEM "I'm ready to fly! Take me up, dragon!"
#define GOSSIP_ITEM "I'm ready to fly! Take me up, dragon!"
bool GossipHello_npc_protectorate_nether_drake(Player *player, Creature *_Creature)
{
@@ -705,43 +705,43 @@ bool GossipSelect_npc_protectorate_nether_drake(Player *player, Creature *_Creat
## npc_professor_dabiri
######*/
#define SPELL_PHASE_DISTRUPTOR 35780
#define GOSSIP_ITEM "I need a new phase distruptor, Professor"
#define SPELL_PHASE_DISTRUPTOR 35780
#define GOSSIP_ITEM "I need a new phase distruptor, Professor"
#define WHISPER_DABIRI -1000302
#define QUEST_DIMENSIUS 10439
#define QUEST_DIMENSIUS 10439
#define QUEST_ON_NETHERY_WINGS 10438
bool GossipHello_npc_professor_dabiri(Player *player, Creature *_Creature)
{
if (_Creature->isQuestGiver())
if (_Creature->isQuestGiver())
player->PrepareQuestMenu( _Creature->GetGUID() );
if(player->GetQuestStatus(QUEST_ON_NETHERY_WINGS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(29778, 1))
player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
if(player->GetQuestStatus(QUEST_ON_NETHERY_WINGS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(29778, 1))
player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
player->SEND_GOSSIP_MENU(_Creature->GetNpcTextId(), _Creature->GetGUID());
return true;
return true;
}
bool GossipSelect_npc_professor_dabiri(Player *player, Creature *_Creature, uint32 sender, uint32 action )
{
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
_Creature->CastSpell(player, SPELL_PHASE_DISTRUPTOR, false);
player->CLOSE_GOSSIP_MENU();
}
if (action == GOSSIP_ACTION_INFO_DEF+1)
{
_Creature->CastSpell(player, SPELL_PHASE_DISTRUPTOR, false);
player->CLOSE_GOSSIP_MENU();
}
return true;
return true;
}
bool QuestAccept_npc_professor_dabiri(Player *player, Creature *creature, Quest const *quest )
{
if(quest->GetQuestId() == QUEST_DIMENSIUS)
DoScriptText(WHISPER_DABIRI, creature, player);
if(quest->GetQuestId() == QUEST_DIMENSIUS)
DoScriptText(WHISPER_DABIRI, creature, player);
return true;
return true;
}
/*######
@@ -911,7 +911,7 @@ struct TRINITY_DLL_DECL npc_bessyAI : public npc_escortAI
bool Completed;
void JustDied(Unit* killer)
void JustDied(Unit* killer)
{
if (PlayerGUID)
{
@@ -928,12 +928,12 @@ struct TRINITY_DLL_DECL npc_bessyAI : public npc_escortAI
return;
switch(i)
{
{
case 3: //first spawn
m_creature->SummonCreature(SPAWN_FIRST, 2449.67, 2183.11, 96.85, 6.20, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
m_creature->SummonCreature(SPAWN_FIRST, 2449.53, 2184.43, 96.36, 6.27, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
m_creature->SummonCreature(SPAWN_FIRST, 2449.85, 2186.34, 97.57, 6.08, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
break;
break;
case 7:
m_creature->SummonCreature(SPAWN_SECOND, 2309.64, 2186.24, 92.25, 6.06, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
@@ -947,16 +947,16 @@ struct TRINITY_DLL_DECL npc_bessyAI : public npc_escortAI
Completed = true;
}
{Unit* Thadell = FindCreature(N_THADELL, 30, m_creature);
if(Thadell)
if(Thadell)
DoScriptText(SAY_THADELL_1, m_creature);}break;
case 13:
{Unit* Thadell = FindCreature(N_THADELL, 30, m_creature);
if(Thadell)
case 13:
{Unit* Thadell = FindCreature(N_THADELL, 30, m_creature);
if(Thadell)
DoScriptText(SAY_THADELL_2, m_creature, player);}break;
}
}
}
void JustSummoned(Creature* summoned)
void JustSummoned(Creature* summoned)
{
summoned->AI()->AttackStart(m_creature);
}
@@ -980,8 +980,8 @@ bool QuestAccept_npc_bessy(Player* player, Creature* creature, Quest const* ques
{
if (quest->GetQuestId() == Q_ALMABTRIEB)
{
creature->setFaction(113);
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
creature->setFaction(113);
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID());
}
return true;
@@ -1004,7 +1004,7 @@ CreatureAI* GetAI_npc_bessy(Creature *_Creature)
bessyAI->AddWaypoint(10, 2304.58, 2272.23, 96.67);
bessyAI->AddWaypoint(11, 2297.09, 2271.40, 95.16);
bessyAI->AddWaypoint(12, 2297.68, 2266.79, 95.07,4000);
bessyAI->AddWaypoint(13, 2297.67, 2266.76, 95.07,4000);
bessyAI->AddWaypoint(13, 2297.67, 2266.76, 95.07,4000);
return (CreatureAI*)bessyAI;
}
@@ -1027,15 +1027,15 @@ void AddSC_netherstorm()
newscript->GetAI = &GetAI_npc_manaforge_control_console;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_commander_dawnforge";
newscript->GetAI = &GetAI_npc_commander_dawnforge;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_commander_dawnforge";
newscript->GetAI = &GetAI_npc_commander_dawnforge;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "at_commander_dawnforge";
newscript->pAreaTrigger = &AreaTrigger_at_commander_dawnforge;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "at_commander_dawnforge";
newscript->pAreaTrigger = &AreaTrigger_at_commander_dawnforge;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_protectorate_nether_drake";
@@ -1043,12 +1043,12 @@ void AddSC_netherstorm()
newscript->pGossipSelect = &GossipSelect_npc_protectorate_nether_drake;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_professor_dabiri";
newscript->pGossipHello = &GossipHello_npc_professor_dabiri;
newscript = new Script;
newscript->Name = "npc_professor_dabiri";
newscript->pGossipHello = &GossipHello_npc_professor_dabiri;
newscript->pGossipSelect = &GossipSelect_npc_professor_dabiri;
newscript->pQuestAccept = &QuestAccept_npc_professor_dabiri;
newscript->RegisterSelf();
newscript->pQuestAccept = &QuestAccept_npc_professor_dabiri;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_veronia";
@@ -1061,7 +1061,7 @@ void AddSC_netherstorm()
newscript->GetAI = &GetAI_mob_phase_hunter;
newscript->RegisterSelf();
newscript = new Script;
newscript = new Script;
newscript->Name = "npc_bessy";
newscript->GetAI = &GetAI_npc_bessy;
newscript->pQuestAccept = &QuestAccept_npc_bessy;
@@ -40,7 +40,7 @@ EndScriptData */
#define SPELL_FIREBALL 18392
#define SPELL_BELLOWINGROAR 18431
#define SPELL_HEATED_GROUND 22191 //Wrong Spell
#define SPELL_HEATED_GROUND 22191 //Wrong Spell
#define SPELL_SUMMONWHELP 17646
@@ -76,10 +76,10 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
uint32 SummonWhelpsTimer;
uint32 BellowingRoarTimer;
uint32 WingBuffetTimer;
uint32 KnockAwayTimer;
uint32 FireballTimer;
uint32 KnockAwayTimer;
uint32 FireballTimer;
bool InitialSpawn;
bool InitialSpawn;
void Reset()
{
@@ -93,24 +93,24 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
SummonWhelpsTimer = 45000;
BellowingRoarTimer = 30000;
WingBuffetTimer = 17000;
KnockAwayTimer = 15000;
FireballTimer = 18000;
KnockAwayTimer = 15000;
FireballTimer = 18000;
InitialSpawn = true;
InitialSpawn = true;
m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
m_creature->ApplySpellImmune(1, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
m_creature->ApplySpellImmune(1, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
}
void Aggro(Unit* who)
void Aggro(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
DoZoneInCombat();
}
void JustDied(Unit* Killer)
void JustDied(Unit* Killer)
{
}
}
void KilledUnit(Unit *victim)
{
@@ -122,30 +122,30 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
if(!UpdateVictim())
return;
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 60) && (Phase == 1))
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 60) && (Phase == 1))
{
Phase = 2;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
Phase = 2;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->SetHover(true);
m_creature->SetHover(true);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
DoScriptText(SAY_PHASE_2_TRANS, m_creature);
}
DoScriptText(SAY_PHASE_2_TRANS, m_creature);
}
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) && (Phase == 2))
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) && (Phase == 2))
{
Phase = 3;
Phase = 3;
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
m_creature->SetHover(false);
m_creature->GetMotionMaster()->MovePoint(0, -10.6155, -219.357, -87.7344);
DoStartMovement(m_creature->getVictim());
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->SetHover(false);
m_creature->GetMotionMaster()->MovePoint(0, -10.6155, -219.357, -87.7344);
DoStartMovement(m_creature->getVictim());
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
DoScriptText(SAY_PHASE_3_TRANS, m_creature);
}
}
if(Phase == 1 || Phase == 3)
if(Phase == 1 || Phase == 3)
{
if(FlameBreathTimer < diff)
{
@@ -174,75 +174,75 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
WingBuffetTimer = 7000 + ((rand()%8)*1000);
}else WingBuffetTimer -= diff;
if(KnockAwayTimer < diff)
{
if(rand() <= 30)
{
DoCast(m_creature->getVictim(), SPELL_KNOCK_AWAY);
}
KnockAwayTimer = 15000;
}else KnockAwayTimer -= diff;
if(Phase == 3)
{
if(BellowingRoarTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_BELLOWINGROAR);
BellowingRoarTimer = 30000;
}else BellowingRoarTimer -= diff;
if(SummonWhelpsTimer < diff)
{
SummonWhelps(Phase);
SummonWhelpsTimer = 45000;
}else SummonWhelpsTimer -= diff;
}
DoMeleeAttackIfReady();
}
if(Phase == 2)
{
if(InitialSpawn)
{
InitialSpawn = false;
for(uint32 i = 0; i < 10; ++i)
{
uint32 random = rand()%4;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
if(EngulfingFlamesTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_ENGULFINGFLAMES);
m_creature->HandleEmoteCommand(ANIM_FLY);
EngulfingFlamesTimer = 10000;
}
else EngulfingFlamesTimer -= diff;
if(FireballTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL);
FireballTimer = 18000;
}
else FireballTimer -= diff;
if(MovementTimer < diff)
if(KnockAwayTimer < diff)
{
if(rand()%100 < 30)
{
DoScriptText(EMOTE_BREATH, m_creature);
DoCast(m_creature->getVictim(), SPELL_DEEPBREATH);
}
else ChangePosition();
if(rand() <= 30)
{
DoCast(m_creature->getVictim(), SPELL_KNOCK_AWAY);
}
KnockAwayTimer = 15000;
}else KnockAwayTimer -= diff;
if(Phase == 3)
{
if(BellowingRoarTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_BELLOWINGROAR);
BellowingRoarTimer = 30000;
}else BellowingRoarTimer -= diff;
if(SummonWhelpsTimer < diff)
{
SummonWhelps(Phase);
SummonWhelpsTimer = 45000;
}else SummonWhelpsTimer -= diff;
}
DoMeleeAttackIfReady();
}
if(Phase == 2)
{
if(InitialSpawn)
{
InitialSpawn = false;
for(uint32 i = 0; i < 10; ++i)
{
uint32 random = rand()%4;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
if(EngulfingFlamesTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_ENGULFINGFLAMES);
m_creature->HandleEmoteCommand(ANIM_FLY);
EngulfingFlamesTimer = 10000;
}
else EngulfingFlamesTimer -= diff;
if(FireballTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL);
FireballTimer = 18000;
}
else FireballTimer -= diff;
if(MovementTimer < diff)
{
if(rand()%100 < 30)
{
DoScriptText(EMOTE_BREATH, m_creature);
DoCast(m_creature->getVictim(), SPELL_DEEPBREATH);
}
else ChangePosition();
MovementTimer = 25000;
}else MovementTimer -= diff;
@@ -253,46 +253,46 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
SummonWhelpsTimer = 45000;
}
else SummonWhelpsTimer -= diff;
}
}
else SummonWhelpsTimer -= diff;
}
}
void ChangePosition()
{
uint32 random = rand() % 4;
if(random<4){
m_creature->GetMotionMaster()->MovePoint(0, MovementLocations[random][0], MovementLocations[random][1], MovementLocations[random][2]);}
}
void ChangePosition()
{
uint32 random = rand() % 4;
if(random<4){
m_creature->GetMotionMaster()->MovePoint(0, MovementLocations[random][0], MovementLocations[random][1], MovementLocations[random][2]);}
}
void SummonWhelps(uint32 Phase)
{
if(Phase == 2)
{
uint32 max = rand()%10;
for(uint32 i = 0; i < max; ++i)
{
uint32 random = rand()%3;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
void SummonWhelps(uint32 Phase)
{
if(Phase == 2)
{
uint32 max = rand()%10;
for(uint32 i = 0; i < max; ++i)
{
uint32 random = rand()%3;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
if(Phase == 3)
{
uint32 max = rand() % 10 +1;
if(max < 5)
{
for(uint32 i = 0; i < max; ++i)
{
uint32 random = rand()%4;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
}
}
if(Phase == 3)
{
uint32 max = rand() % 10 +1;
if(max < 5)
{
for(uint32 i = 0; i < max; ++i)
{
uint32 random = rand()%4;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
}
}
};
CreatureAI* GetAI_boss_onyxiaAI(Creature *_Creature)
@@ -307,4 +307,4 @@ void AddSC_boss_onyxia()
newscript->Name="boss_onyxia";
newscript->GetAI = &GetAI_boss_onyxiaAI;
newscript->RegisterSelf();
}
}
@@ -201,4 +201,4 @@ void AddSC_razorfen_kraul()
newscript->GetAI = &GetAI_npc_willix;
newscript->pQuestAccept = &QuestAccept_npc_willix;
newscript->RegisterSelf();
}
}
@@ -54,7 +54,7 @@ struct TRINITY_DLL_DECL boss_moamAI : public ScriptedAI
void Aggro(Unit *who)
{
DoScriptText(EMOTE_AGGRO, m_creature);
DoScriptText(EMOTE_AGGRO, m_creature);
pTarget = who;
}
@@ -67,7 +67,7 @@ struct TRINITY_DLL_DECL boss_moamAI : public ScriptedAI
//if (j==1 && m_creature->GetMana()*100 / m_creature->GetMaxMana() == 100 && !m_creature->IsNonMeleeSpellCasted(false))
{
DoCast(m_creature->getVictim(),SPELL_ARCANEERUPTION);
DoScriptText(EMOTE_MANA_FULL, m_creature);
DoScriptText(EMOTE_MANA_FULL, m_creature);
}
//If we are <50%HP cast MANA FIEND (Summon Mana) and Sleep

Some files were not shown because too many files have changed in this diff Show More