Merge remote-tracking branch 'origin/master' into 4.3.4
This commit is contained in:
commit
c19fcec814
56 files changed
+1665
-1098
No files matched your search
@@ -245,7 +245,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!groupSource->IsFull())
|
||||
if (groupSource->IsFull())
|
||||
{
|
||||
handler->PSendSysMessage(LANG_GROUP_FULL);
|
||||
handler->SetSentErrorMessage(true);
|
||||
|
||||
@@ -30,8 +30,6 @@ EndScriptData */
|
||||
#include "ScriptMgr.h"
|
||||
#include "SystemConfig.h"
|
||||
|
||||
#include <regex>
|
||||
|
||||
class server_commandscript : public CommandScript
|
||||
{
|
||||
public:
|
||||
@@ -296,9 +294,9 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
static bool ParseExitCode(std::string const& exitCodeStr, int32& exitCode)
|
||||
static bool ParseExitCode(char const* exitCodeStr, int32& exitCode)
|
||||
{
|
||||
exitCode = atoi(exitCodeStr.c_str());
|
||||
exitCode = atoi(exitCodeStr);
|
||||
|
||||
// Handle atoi() errors
|
||||
if (exitCode == 0 && (exitCodeStr[0] != '0' || exitCodeStr[1] != '\0'))
|
||||
@@ -319,28 +317,42 @@ private:
|
||||
return false;
|
||||
|
||||
// #delay [#exit_code] [reason]
|
||||
std::regex regex("([0-9]+) ([0-9]*) ?(.*)");
|
||||
std::cmatch cm;
|
||||
|
||||
if (!std::regex_match(args, cm, regex))
|
||||
char* delayStr = strtok((char*)args, " ");
|
||||
if (!delayStr || !isNumeric(delayStr))
|
||||
return false;
|
||||
|
||||
std::string delayStr = cm[1];
|
||||
std::string exitCodeStr = cm[2];
|
||||
std::string reason = cm[3];
|
||||
char* exitCodeStr = nullptr;
|
||||
|
||||
int32 delay = atoi(delayStr.c_str());
|
||||
if (strlen(args) > 255)
|
||||
return false;
|
||||
|
||||
char reason[255] = { 0 };
|
||||
|
||||
while (char* nextToken = strtok(nullptr, " "))
|
||||
{
|
||||
if (isNumeric(nextToken))
|
||||
exitCodeStr = nextToken;
|
||||
else
|
||||
{
|
||||
strcat(reason, nextToken);
|
||||
strcat(reason, " ");
|
||||
strcat(reason, strtok(nullptr, "\0"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int32 delay = atoi(delayStr);
|
||||
|
||||
// Prevent interpret wrong arg value as 0 secs shutdown time
|
||||
if ((delay == 0 && (delayStr[0] != '0' || delayStr[1] != '\0')) || delay < 0)
|
||||
return false;
|
||||
|
||||
int32 exitCode = defaultExitCode;
|
||||
if (exitCodeStr.length() > 0)
|
||||
if (exitCodeStr)
|
||||
if (!ParseExitCode(exitCodeStr, exitCode))
|
||||
return false;
|
||||
|
||||
sWorld->ShutdownServ(delay, shutdownMask, static_cast<uint8>(exitCode), reason);
|
||||
sWorld->ShutdownServ(delay, shutdownMask, static_cast<uint8>(exitCode), std::string(reason));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -84,10 +84,20 @@ class npc_av_marshal_or_warmaster : public CreatureScript
|
||||
|
||||
struct npc_av_marshal_or_warmasterAI : public ScriptedAI
|
||||
{
|
||||
npc_av_marshal_or_warmasterAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_av_marshal_or_warmasterAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_hasAura = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_CHARGE_TARGET, urand(2 * IN_MILLISECONDS, 12 * IN_MILLISECONDS));
|
||||
events.ScheduleEvent(EVENT_CLEAVE, urand(1 * IN_MILLISECONDS, 11 * IN_MILLISECONDS));
|
||||
@@ -95,8 +105,6 @@ class npc_av_marshal_or_warmaster : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
|
||||
events.ScheduleEvent(EVENT_ENRAGE, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
|
||||
events.ScheduleEvent(EVENT_CHECK_RESET, 5000);
|
||||
|
||||
_hasAura = false;
|
||||
}
|
||||
|
||||
void JustRespawned() override
|
||||
|
||||
@@ -110,7 +110,20 @@ public:
|
||||
|
||||
struct boss_balindaAI : public ScriptedAI
|
||||
{
|
||||
boss_balindaAI(Creature* creature) : ScriptedAI(creature), summons(me) { }
|
||||
boss_balindaAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
|
||||
coneOfColdTimer = 8 * IN_MILLISECONDS;
|
||||
fireBoltTimer = 1 * IN_MILLISECONDS;
|
||||
frostboltTimer = 4 * IN_MILLISECONDS;
|
||||
resetTimer = 5 * IN_MILLISECONDS;
|
||||
waterElementalTimer = 0;
|
||||
}
|
||||
|
||||
uint32 arcaneExplosionTimer;
|
||||
uint32 coneOfColdTimer;
|
||||
@@ -123,12 +136,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
|
||||
coneOfColdTimer = 8 * IN_MILLISECONDS;
|
||||
fireBoltTimer = 1 * IN_MILLISECONDS;
|
||||
frostboltTimer = 4 * IN_MILLISECONDS;
|
||||
resetTimer = 5 * IN_MILLISECONDS;
|
||||
waterElementalTimer = 0;
|
||||
Initialize();
|
||||
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
@@ -45,7 +45,20 @@ public:
|
||||
|
||||
struct boss_drektharAI : public ScriptedAI
|
||||
{
|
||||
boss_drektharAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_drektharAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
WhirlwindTimer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
Whirlwind2Timer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
KnockdownTimer = 12 * IN_MILLISECONDS;
|
||||
FrenzyTimer = 6 * IN_MILLISECONDS;
|
||||
ResetTimer = 5 * IN_MILLISECONDS;
|
||||
YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds
|
||||
}
|
||||
|
||||
uint32 WhirlwindTimer;
|
||||
uint32 Whirlwind2Timer;
|
||||
@@ -56,12 +69,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
WhirlwindTimer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
Whirlwind2Timer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
KnockdownTimer = 12 * IN_MILLISECONDS;
|
||||
FrenzyTimer = 6 * IN_MILLISECONDS;
|
||||
ResetTimer = 5 * IN_MILLISECONDS;
|
||||
YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
@@ -46,7 +46,20 @@ public:
|
||||
|
||||
struct boss_galvangarAI : public ScriptedAI
|
||||
{
|
||||
boss_galvangarAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_galvangarAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
CleaveTimer = urand(1 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
|
||||
FrighteningShoutTimer = urand(2 * IN_MILLISECONDS, 19 * IN_MILLISECONDS);
|
||||
Whirlwind1Timer = urand(1 * IN_MILLISECONDS, 13 * IN_MILLISECONDS);
|
||||
Whirlwind2Timer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
MortalStrikeTimer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
ResetTimer = 5 * IN_MILLISECONDS;
|
||||
}
|
||||
|
||||
uint32 CleaveTimer;
|
||||
uint32 FrighteningShoutTimer;
|
||||
@@ -57,12 +70,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
CleaveTimer = urand(1 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
|
||||
FrighteningShoutTimer = urand(2 * IN_MILLISECONDS, 19 * IN_MILLISECONDS);
|
||||
Whirlwind1Timer = urand(1 * IN_MILLISECONDS, 13 * IN_MILLISECONDS);
|
||||
Whirlwind2Timer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
MortalStrikeTimer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
|
||||
ResetTimer = 5 * IN_MILLISECONDS;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
@@ -42,7 +42,19 @@ public:
|
||||
|
||||
struct boss_vanndarAI : public ScriptedAI
|
||||
{
|
||||
boss_vanndarAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_vanndarAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
AvatarTimer = 3 * IN_MILLISECONDS;
|
||||
ThunderclapTimer = 4 * IN_MILLISECONDS;
|
||||
StormboltTimer = 6 * IN_MILLISECONDS;
|
||||
ResetTimer = 5 * IN_MILLISECONDS;
|
||||
YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
uint32 AvatarTimer;
|
||||
uint32 ThunderclapTimer;
|
||||
@@ -52,11 +64,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
AvatarTimer = 3 * IN_MILLISECONDS;
|
||||
ThunderclapTimer = 4 * IN_MILLISECONDS;
|
||||
StormboltTimer = 6 * IN_MILLISECONDS;
|
||||
ResetTimer = 5 * IN_MILLISECONDS;
|
||||
YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
+39
-19
@@ -124,10 +124,27 @@ public:
|
||||
{
|
||||
npc_grimstoneAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
MobSpawnId = rand32() % 6;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
EventPhase = 0;
|
||||
Event_Timer = 1000;
|
||||
|
||||
MobCount = 0;
|
||||
MobDeath_Timer = 0;
|
||||
|
||||
for (uint8 i = 0; i < MAX_NPC_AMOUNT; ++i)
|
||||
RingMobGUID[i] = 0;
|
||||
|
||||
RingBossGUID = 0;
|
||||
|
||||
CanWalk = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint8 EventPhase;
|
||||
@@ -144,20 +161,9 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
|
||||
EventPhase = 0;
|
||||
Event_Timer = 1000;
|
||||
|
||||
MobCount = 0;
|
||||
MobDeath_Timer = 0;
|
||||
|
||||
for (uint8 i = 0; i < MAX_NPC_AMOUNT; ++i)
|
||||
RingMobGUID[i] = 0;
|
||||
|
||||
RingBossGUID = 0;
|
||||
|
||||
CanWalk = false;
|
||||
}
|
||||
|
||||
/// @todo move them to center
|
||||
@@ -353,7 +359,17 @@ public:
|
||||
|
||||
struct npc_phalanxAI : public ScriptedAI
|
||||
{
|
||||
npc_phalanxAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_phalanxAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ThunderClap_Timer = 12000;
|
||||
FireballVolley_Timer = 0;
|
||||
MightyBlow_Timer = 15000;
|
||||
}
|
||||
|
||||
uint32 ThunderClap_Timer;
|
||||
uint32 FireballVolley_Timer;
|
||||
@@ -361,9 +377,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ThunderClap_Timer = 12000;
|
||||
FireballVolley_Timer = 0;
|
||||
MightyBlow_Timer = 15000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -1238,9 +1252,16 @@ public:
|
||||
{
|
||||
npc_rocknotAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
BreakKeg_Timer = 0;
|
||||
BreakDoor_Timer = 0;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 BreakKeg_Timer;
|
||||
@@ -1251,8 +1272,7 @@ public:
|
||||
if (HasEscortState(STATE_ESCORT_ESCORTING))
|
||||
return;
|
||||
|
||||
BreakKeg_Timer = 0;
|
||||
BreakDoor_Timer = 0;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void DoGo(uint32 id, uint32 state)
|
||||
|
||||
+7
-1
@@ -157,12 +157,18 @@ class boss_doomrel : public CreatureScript
|
||||
{
|
||||
boss_doomrelAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
_instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_voidwalkers = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_voidwalkers = false;
|
||||
Initialize();
|
||||
|
||||
me->setFaction(FACTION_FRIEND);
|
||||
|
||||
|
||||
@@ -53,13 +53,21 @@ public:
|
||||
|
||||
struct boss_gythAI : public BossAI
|
||||
{
|
||||
boss_gythAI(Creature* creature) : BossAI(creature, DATA_GYTH) { }
|
||||
boss_gythAI(Creature* creature) : BossAI(creature, DATA_GYTH)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SummonedRend = false;
|
||||
}
|
||||
|
||||
bool SummonedRend;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
SummonedRend = false;
|
||||
Initialize();
|
||||
if (instance->GetBossState(DATA_GYTH) == IN_PROGRESS)
|
||||
{
|
||||
instance->SetBossState(DATA_GYTH, DONE);
|
||||
|
||||
+10
-2
@@ -45,12 +45,20 @@ public:
|
||||
|
||||
struct boss_halyconAI : public BossAI
|
||||
{
|
||||
boss_halyconAI(Creature* creature) : BossAI(creature, DATA_HALYCON) { }
|
||||
boss_halyconAI(Creature* creature) : BossAI(creature, DATA_HALYCON)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Summoned = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Summoned = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
+11
-3
@@ -46,13 +46,21 @@ public:
|
||||
|
||||
struct boss_lord_valthalakAI : public BossAI
|
||||
{
|
||||
boss_lord_valthalakAI(Creature* creature) : BossAI(creature, DATA_LORD_VALTHALAK) { }
|
||||
boss_lord_valthalakAI(Creature* creature) : BossAI(creature, DATA_LORD_VALTHALAK)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
frenzy40 = false;
|
||||
frenzy15 = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
frenzy40 = false;
|
||||
frenzy15 = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
+10
-2
@@ -57,14 +57,22 @@ public:
|
||||
|
||||
struct boss_overlordwyrmthalakAI : public BossAI
|
||||
{
|
||||
boss_overlordwyrmthalakAI(Creature* creature) : BossAI(creature, DATA_OVERLORD_WYRMTHALAK) { }
|
||||
boss_overlordwyrmthalakAI(Creature* creature) : BossAI(creature, DATA_OVERLORD_WYRMTHALAK)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Summoned = false;
|
||||
}
|
||||
|
||||
bool Summoned;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Summoned = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
+9
-2
@@ -73,6 +73,8 @@ public:
|
||||
{
|
||||
boss_chromaggusAI(Creature* creature) : BossAI(creature, BOSS_CHROMAGGUS)
|
||||
{
|
||||
Initialize();
|
||||
|
||||
// Select the 2 breaths that we are going to use until despawned
|
||||
// 5 possiblities for the first breath, 4 for the second, 20 total possiblites
|
||||
// This way we don't end up casting 2 of the same breath
|
||||
@@ -173,12 +175,17 @@ public:
|
||||
EnterEvadeMode();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
CurrentVurln_Spell = 0; // We use this to store our last vulnerabilty spell so we can remove it later
|
||||
Enraged = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
|
||||
CurrentVurln_Spell = 0; // We use this to store our last vulnerabilty spell so we can remove it later
|
||||
Enraged = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
+20
-4
@@ -166,11 +166,19 @@ public:
|
||||
|
||||
struct boss_victor_nefariusAI : public BossAI
|
||||
{
|
||||
boss_victor_nefariusAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) { }
|
||||
boss_victor_nefariusAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SpawnedAdds = 0;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
SpawnedAdds = 0;
|
||||
Initialize();
|
||||
|
||||
if (me->GetMapId() == 469)
|
||||
{
|
||||
@@ -385,15 +393,23 @@ public:
|
||||
|
||||
struct boss_nefarianAI : public BossAI
|
||||
{
|
||||
boss_nefarianAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) { }
|
||||
boss_nefarianAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void Initialize()
|
||||
{
|
||||
Phase3 = false;
|
||||
canDespawn = false;
|
||||
DespawnTimer = 30000;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
{
|
||||
canDespawn = true;
|
||||
|
||||
+10
-2
@@ -68,13 +68,21 @@ public:
|
||||
|
||||
struct boss_razorgoreAI : public BossAI
|
||||
{
|
||||
boss_razorgoreAI(Creature* creature) : BossAI(creature, BOSS_RAZORGORE) { }
|
||||
boss_razorgoreAI(Creature* creature) : BossAI(creature, BOSS_RAZORGORE)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
secondPhase = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
|
||||
secondPhase = false;
|
||||
Initialize();
|
||||
instance->SetData(DATA_EGG_EVENT, NOT_STARTED);
|
||||
}
|
||||
|
||||
|
||||
+8
-3
@@ -70,19 +70,24 @@ public:
|
||||
{
|
||||
boss_vaelAI(Creature* creature) : BossAI(creature, BOSS_VAELASTRAZ)
|
||||
{
|
||||
Initialize();
|
||||
creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
creature->setFaction(35);
|
||||
creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
PlayerGUID = 0;
|
||||
HasYelled = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
|
||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
PlayerGUID = 0;
|
||||
|
||||
HasYelled = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
@@ -108,13 +108,21 @@ class npc_firesworn : public CreatureScript
|
||||
|
||||
struct npc_fireswornAI : public ScriptedAI
|
||||
{
|
||||
npc_fireswornAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_fireswornAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
immolateTimer = 4000; //These times are probably wrong
|
||||
}
|
||||
|
||||
uint32 immolateTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
immolateTimer = 4000; //These times are probably wrong
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
|
||||
@@ -131,12 +131,18 @@ class npc_core_rager : public CreatureScript
|
||||
{
|
||||
npc_core_ragerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
mangleTimer = 7 * IN_MILLISECONDS; // These times are probably wrong
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
mangleTimer = 7*IN_MILLISECONDS; // These times are probably wrong
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override
|
||||
|
||||
@@ -82,18 +82,24 @@ class boss_ragnaros : public CreatureScript
|
||||
{
|
||||
boss_ragnarosAI(Creature* creature) : BossAI(creature, BOSS_RAGNAROS)
|
||||
{
|
||||
Initialize();
|
||||
_introState = 0;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void Initialize()
|
||||
{
|
||||
BossAI::Reset();
|
||||
_emergeTimer = 90000;
|
||||
_hasYelledMagmaBurst = false;
|
||||
_hasSubmergedOnce = false;
|
||||
_isBanished = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
Initialize();
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -52,9 +52,22 @@ public:
|
||||
{
|
||||
boss_mr_smiteAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
uiTrashTimer = urand(5000, 9000);
|
||||
uiSlamTimer = 9000;
|
||||
uiNimbleReflexesTimer = urand(15500, 31600);
|
||||
|
||||
uiHealth = 0;
|
||||
|
||||
uiPhase = 0;
|
||||
uiTimer = 0;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 uiTrashTimer;
|
||||
@@ -68,14 +81,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
uiTrashTimer = urand(5000, 9000);
|
||||
uiSlamTimer = 9000;
|
||||
uiNimbleReflexesTimer = urand(15500, 31600);
|
||||
|
||||
uiHealth = 0;
|
||||
|
||||
uiPhase = 0;
|
||||
uiTimer = 0;
|
||||
Initialize();
|
||||
|
||||
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
|
||||
}
|
||||
|
||||
@@ -60,7 +60,19 @@ public:
|
||||
|
||||
struct boss_curatorAI : public ScriptedAI
|
||||
{
|
||||
boss_curatorAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_curatorAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
AddTimer = 10000;
|
||||
HatefulBoltTimer = 15000; //This time may be wrong
|
||||
BerserkTimer = 720000; //12 minutes
|
||||
Enraged = false;
|
||||
Evocating = false;
|
||||
}
|
||||
|
||||
uint32 AddTimer;
|
||||
uint32 HatefulBoltTimer;
|
||||
@@ -71,11 +83,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
AddTimer = 10000;
|
||||
HatefulBoltTimer = 15000; //This time may be wrong
|
||||
BerserkTimer = 720000; //12 minutes
|
||||
Enraged = false;
|
||||
Evocating = false;
|
||||
Initialize();
|
||||
|
||||
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ARCANE, true);
|
||||
}
|
||||
|
||||
@@ -62,13 +62,20 @@ public:
|
||||
{
|
||||
boss_attumenAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
|
||||
Phase = 1;
|
||||
|
||||
CleaveTimer = urand(10000, 15000);
|
||||
CurseTimer = 30000;
|
||||
RandomYellTimer = urand(30000, 60000); //Occasionally yell
|
||||
ChargeTimer = 20000;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ResetTimer = 0;
|
||||
Midnight = 0;
|
||||
}
|
||||
|
||||
uint64 Midnight;
|
||||
@@ -81,8 +88,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ResetTimer = 0;
|
||||
Midnight = 0;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterEvadeMode() override
|
||||
@@ -127,7 +133,17 @@ public:
|
||||
|
||||
struct boss_midnightAI : public ScriptedAI
|
||||
{
|
||||
boss_midnightAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_midnightAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Phase = 1;
|
||||
Attumen = 0;
|
||||
Mount_Timer = 0;
|
||||
}
|
||||
|
||||
uint64 Attumen;
|
||||
uint8 Phase;
|
||||
@@ -135,9 +151,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Phase = 1;
|
||||
Attumen = 0;
|
||||
Mount_Timer = 0;
|
||||
Initialize();
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetVisible(true);
|
||||
|
||||
@@ -105,12 +105,25 @@ public:
|
||||
{
|
||||
boss_moroesAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
memset(AddId, 0, sizeof(AddId));
|
||||
memset(AddGUID, 0, sizeof(AddGUID));
|
||||
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Vanish_Timer = 30000;
|
||||
Blind_Timer = 35000;
|
||||
Gouge_Timer = 23000;
|
||||
Wait_Timer = 0;
|
||||
CheckAdds_Timer = 5000;
|
||||
|
||||
Enrage = false;
|
||||
InVanish = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint64 AddGUID[4];
|
||||
@@ -127,14 +140,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Vanish_Timer = 30000;
|
||||
Blind_Timer = 35000;
|
||||
Gouge_Timer = 23000;
|
||||
Wait_Timer = 0;
|
||||
CheckAdds_Timer = 5000;
|
||||
|
||||
Enrage = false;
|
||||
InVanish = false;
|
||||
Initialize();
|
||||
if (me->IsAlive())
|
||||
SpawnAdds();
|
||||
|
||||
@@ -391,7 +397,17 @@ public:
|
||||
struct boss_baroness_dorothea_millstipeAI : public boss_moroes_guestAI
|
||||
{
|
||||
//Shadow Priest
|
||||
boss_baroness_dorothea_millstipeAI(Creature* creature) : boss_moroes_guestAI(creature) { }
|
||||
boss_baroness_dorothea_millstipeAI(Creature* creature) : boss_moroes_guestAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ManaBurn_Timer = 7000;
|
||||
MindFlay_Timer = 1000;
|
||||
ShadowWordPain_Timer = 6000;
|
||||
}
|
||||
|
||||
uint32 ManaBurn_Timer;
|
||||
uint32 MindFlay_Timer;
|
||||
@@ -399,9 +415,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ManaBurn_Timer = 7000;
|
||||
MindFlay_Timer = 1000;
|
||||
ShadowWordPain_Timer = 6000;
|
||||
Initialize();
|
||||
|
||||
DoCast(me, SPELL_SHADOWFORM, true);
|
||||
|
||||
@@ -454,7 +468,17 @@ public:
|
||||
struct boss_baron_rafe_dreugerAI : public boss_moroes_guestAI
|
||||
{
|
||||
//Retr Pally
|
||||
boss_baron_rafe_dreugerAI(Creature* creature) : boss_moroes_guestAI(creature){ }
|
||||
boss_baron_rafe_dreugerAI(Creature* creature) : boss_moroes_guestAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
HammerOfJustice_Timer = 1000;
|
||||
SealOfCommand_Timer = 7000;
|
||||
JudgementOfCommand_Timer = SealOfCommand_Timer + 29000;
|
||||
}
|
||||
|
||||
uint32 HammerOfJustice_Timer;
|
||||
uint32 SealOfCommand_Timer;
|
||||
@@ -462,9 +486,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
HammerOfJustice_Timer = 1000;
|
||||
SealOfCommand_Timer = 7000;
|
||||
JudgementOfCommand_Timer = SealOfCommand_Timer + 29000;
|
||||
Initialize();
|
||||
|
||||
boss_moroes_guestAI::Reset();
|
||||
}
|
||||
@@ -511,7 +533,18 @@ public:
|
||||
struct boss_lady_catriona_von_indiAI : public boss_moroes_guestAI
|
||||
{
|
||||
//Holy Priest
|
||||
boss_lady_catriona_von_indiAI(Creature* creature) : boss_moroes_guestAI(creature) { }
|
||||
boss_lady_catriona_von_indiAI(Creature* creature) : boss_moroes_guestAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
DispelMagic_Timer = 11000;
|
||||
GreaterHeal_Timer = 1500;
|
||||
HolyFire_Timer = 5000;
|
||||
PowerWordShield_Timer = 1000;
|
||||
}
|
||||
|
||||
uint32 DispelMagic_Timer;
|
||||
uint32 GreaterHeal_Timer;
|
||||
@@ -520,10 +553,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
DispelMagic_Timer = 11000;
|
||||
GreaterHeal_Timer = 1500;
|
||||
HolyFire_Timer = 5000;
|
||||
PowerWordShield_Timer = 1000;
|
||||
Initialize();
|
||||
|
||||
AcquireGUID();
|
||||
|
||||
@@ -581,7 +611,18 @@ public:
|
||||
struct boss_lady_keira_berrybuckAI : public boss_moroes_guestAI
|
||||
{
|
||||
//Holy Pally
|
||||
boss_lady_keira_berrybuckAI(Creature* creature) : boss_moroes_guestAI(creature) { }
|
||||
boss_lady_keira_berrybuckAI(Creature* creature) : boss_moroes_guestAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Cleanse_Timer = 13000;
|
||||
GreaterBless_Timer = 1000;
|
||||
HolyLight_Timer = 7000;
|
||||
DivineShield_Timer = 31000;
|
||||
}
|
||||
|
||||
uint32 Cleanse_Timer;
|
||||
uint32 GreaterBless_Timer;
|
||||
@@ -590,10 +631,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Cleanse_Timer = 13000;
|
||||
GreaterBless_Timer = 1000;
|
||||
HolyLight_Timer = 7000;
|
||||
DivineShield_Timer = 31000;
|
||||
Initialize();
|
||||
|
||||
AcquireGUID();
|
||||
|
||||
@@ -655,7 +693,17 @@ public:
|
||||
struct boss_lord_robin_darisAI : public boss_moroes_guestAI
|
||||
{
|
||||
//Arms Warr
|
||||
boss_lord_robin_darisAI(Creature* creature) : boss_moroes_guestAI(creature) { }
|
||||
boss_lord_robin_darisAI(Creature* creature) : boss_moroes_guestAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Hamstring_Timer = 7000;
|
||||
MortalStrike_Timer = 10000;
|
||||
WhirlWind_Timer = 21000;
|
||||
}
|
||||
|
||||
uint32 Hamstring_Timer;
|
||||
uint32 MortalStrike_Timer;
|
||||
@@ -663,9 +711,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Hamstring_Timer = 7000;
|
||||
MortalStrike_Timer = 10000;
|
||||
WhirlWind_Timer = 21000;
|
||||
Initialize();
|
||||
|
||||
boss_moroes_guestAI::Reset();
|
||||
}
|
||||
@@ -711,7 +757,18 @@ public:
|
||||
struct boss_lord_crispin_ferenceAI : public boss_moroes_guestAI
|
||||
{
|
||||
//Arms Warr
|
||||
boss_lord_crispin_ferenceAI(Creature* creature) : boss_moroes_guestAI(creature) { }
|
||||
boss_lord_crispin_ferenceAI(Creature* creature) : boss_moroes_guestAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Disarm_Timer = 6000;
|
||||
HeroicStrike_Timer = 10000;
|
||||
ShieldBash_Timer = 8000;
|
||||
ShieldWall_Timer = 4000;
|
||||
}
|
||||
|
||||
uint32 Disarm_Timer;
|
||||
uint32 HeroicStrike_Timer;
|
||||
@@ -720,10 +777,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Disarm_Timer = 6000;
|
||||
HeroicStrike_Timer = 10000;
|
||||
ShieldBash_Timer = 8000;
|
||||
ShieldWall_Timer = 4000;
|
||||
Initialize();
|
||||
|
||||
boss_moroes_guestAI::Reset();
|
||||
}
|
||||
|
||||
@@ -78,6 +78,7 @@ public:
|
||||
{
|
||||
boss_netherspiteAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
|
||||
for (int i=0; i<3; ++i)
|
||||
@@ -86,6 +87,19 @@ public:
|
||||
BeamTarget[i] = 0;
|
||||
BeamerGUID[i] = 0;
|
||||
}
|
||||
|
||||
PortalPhase = false;
|
||||
PhaseTimer = 0;
|
||||
EmpowermentTimer = 0;
|
||||
PortalTimer = 0;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Berserk = false;
|
||||
NetherInfusionTimer = 540000;
|
||||
VoidZoneTimer = 15000;
|
||||
NetherbreathTimer = 3000;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
@@ -129,10 +143,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Berserk = false;
|
||||
NetherInfusionTimer = 540000;
|
||||
VoidZoneTimer = 15000;
|
||||
NetherbreathTimer = 3000;
|
||||
Initialize();
|
||||
|
||||
HandleDoors(true);
|
||||
DestroyPortals();
|
||||
|
||||
@@ -78,10 +78,32 @@ public:
|
||||
{
|
||||
boss_nightbaneAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
Intro = true;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
BellowingRoarTimer = 30000;
|
||||
CharredEarthTimer = 15000;
|
||||
DistractingAshTimer = 20000;
|
||||
SmolderingBreathTimer = 10000;
|
||||
TailSweepTimer = 12000;
|
||||
RainofBonesTimer = 10000;
|
||||
SmokingBlastTimer = 20000;
|
||||
FireballBarrageTimer = 13000;
|
||||
SearingCindersTimer = 14000;
|
||||
WaitTimer = 1000;
|
||||
|
||||
Phase = 1;
|
||||
FlyCount = 0;
|
||||
MovePhase = 0;
|
||||
|
||||
Flying = false;
|
||||
Movement = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 Phase;
|
||||
@@ -111,20 +133,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BellowingRoarTimer = 30000;
|
||||
CharredEarthTimer = 15000;
|
||||
DistractingAshTimer = 20000;
|
||||
SmolderingBreathTimer = 10000;
|
||||
TailSweepTimer = 12000;
|
||||
RainofBonesTimer = 10000;
|
||||
SmokingBlastTimer = 20000;
|
||||
FireballBarrageTimer = 13000;
|
||||
SearingCindersTimer = 14000;
|
||||
WaitTimer = 1000;
|
||||
|
||||
Phase =1;
|
||||
FlyCount = 0;
|
||||
MovePhase = 0;
|
||||
Initialize();
|
||||
|
||||
me->SetSpeed(MOVE_RUN, 2.0f);
|
||||
me->SetDisableGravity(true);
|
||||
@@ -138,9 +147,6 @@ public:
|
||||
|
||||
HandleTerraceDoors(true);
|
||||
|
||||
Flying = false;
|
||||
Movement = false;
|
||||
|
||||
if (!Intro)
|
||||
{
|
||||
me->SetHomePosition(IntroWay[7][0], IntroWay[7][1], IntroWay[7][2], 0);
|
||||
|
||||
@@ -186,10 +186,33 @@ public:
|
||||
{
|
||||
boss_malchezaarAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
|
||||
instance = creature->GetInstanceScript();
|
||||
memset(axes, 0, sizeof(axes));
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
EnfeebleTimer = 30000;
|
||||
EnfeebleResetTimer = 38000;
|
||||
ShadowNovaTimer = 35500;
|
||||
SWPainTimer = 20000;
|
||||
AmplifyDamageTimer = 5000;
|
||||
Cleave_Timer = 8000;
|
||||
InfernalTimer = 40000;
|
||||
InfernalCleanupTimer = 47000;
|
||||
AxesTargetSwitchTimer = urand(7500, 20000);
|
||||
SunderArmorTimer = urand(5000, 10000);
|
||||
phase = 1;
|
||||
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
enfeeble_targets[i] = 0;
|
||||
enfeeble_health[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
uint32 EnfeebleTimer;
|
||||
uint32 EnfeebleResetTimer;
|
||||
@@ -218,27 +241,11 @@ public:
|
||||
InfernalCleanup();
|
||||
positions.clear();
|
||||
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
enfeeble_targets[i] = 0;
|
||||
enfeeble_health[i] = 0;
|
||||
}
|
||||
Initialize();
|
||||
|
||||
for (uint8 i = 0; i < TOTAL_INFERNAL_POINTS; ++i)
|
||||
positions.push_back(&InfernalPoints[i]);
|
||||
|
||||
EnfeebleTimer = 30000;
|
||||
EnfeebleResetTimer = 38000;
|
||||
ShadowNovaTimer = 35500;
|
||||
SWPainTimer = 20000;
|
||||
AmplifyDamageTimer = 5000;
|
||||
Cleave_Timer = 8000;
|
||||
InfernalTimer = 40000;
|
||||
InfernalCleanupTimer = 47000;
|
||||
AxesTargetSwitchTimer = urand(7500, 20000);
|
||||
SunderArmorTimer = urand(5000, 10000);
|
||||
phase = 1;
|
||||
|
||||
instance->HandleGameObject(instance->GetData64(DATA_GO_NETHER_DOOR), true);
|
||||
}
|
||||
|
||||
|
||||
@@ -93,9 +93,35 @@ public:
|
||||
{
|
||||
boss_aranAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SecondarySpellTimer = 5000;
|
||||
NormalCastTimer = 0;
|
||||
SuperCastTimer = 35000;
|
||||
BerserkTimer = 720000;
|
||||
CloseDoorTimer = 15000;
|
||||
|
||||
LastSuperSpell = rand32() % 3;
|
||||
|
||||
FlameWreathTimer = 0;
|
||||
FlameWreathCheckTime = 0;
|
||||
|
||||
CurrentNormalSpell = 0;
|
||||
ArcaneCooldown = 0;
|
||||
FireCooldown = 0;
|
||||
FrostCooldown = 0;
|
||||
|
||||
DrinkInterruptTimer = 10000;
|
||||
|
||||
ElementalsSpawned = false;
|
||||
Drinking = false;
|
||||
DrinkInturrupted = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 SecondarySpellTimer;
|
||||
@@ -125,27 +151,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
SecondarySpellTimer = 5000;
|
||||
NormalCastTimer = 0;
|
||||
SuperCastTimer = 35000;
|
||||
BerserkTimer = 720000;
|
||||
CloseDoorTimer = 15000;
|
||||
|
||||
LastSuperSpell = rand32() % 3;
|
||||
|
||||
FlameWreathTimer = 0;
|
||||
FlameWreathCheckTime = 0;
|
||||
|
||||
CurrentNormalSpell = 0;
|
||||
ArcaneCooldown = 0;
|
||||
FireCooldown = 0;
|
||||
FrostCooldown = 0;
|
||||
|
||||
DrinkInterruptTimer = 10000;
|
||||
|
||||
ElementalsSpawned = false;
|
||||
Drinking = false;
|
||||
DrinkInturrupted = false;
|
||||
Initialize();
|
||||
|
||||
// Not in progress
|
||||
instance->SetData(TYPE_ARAN, NOT_STARTED);
|
||||
@@ -362,6 +368,10 @@ public:
|
||||
Available[0] = SUPER_FLAME;
|
||||
Available[1] = SUPER_AE;
|
||||
break;
|
||||
default:
|
||||
Available[0] = 0;
|
||||
Available[1] = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
LastSuperSpell = Available[urand(0, 1)];
|
||||
@@ -508,13 +518,21 @@ public:
|
||||
|
||||
struct water_elementalAI : public ScriptedAI
|
||||
{
|
||||
water_elementalAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
water_elementalAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
CastTimer = 2000 + (rand32() % 3000);
|
||||
}
|
||||
|
||||
uint32 CastTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
CastTimer = 2000 + (rand32() % 3000);
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
|
||||
@@ -78,16 +78,22 @@ public:
|
||||
{
|
||||
npc_kilrekAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
AmplifyTimer = 2000;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 AmplifyTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
AmplifyTimer = 2000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
@@ -130,13 +136,21 @@ public:
|
||||
|
||||
struct npc_demon_chainAI : public ScriptedAI
|
||||
{
|
||||
npc_demon_chainAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_demon_chainAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SacrificeGUID = 0;
|
||||
}
|
||||
|
||||
uint64 SacrificeGUID;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
SacrificeGUID = 0;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
@@ -202,13 +216,21 @@ public:
|
||||
|
||||
struct npc_fiendish_impAI : public ScriptedAI
|
||||
{
|
||||
npc_fiendish_impAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_fiendish_impAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
FireboltTimer = 2000;
|
||||
}
|
||||
|
||||
uint32 FireboltTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
FireboltTimer = 2000;
|
||||
Initialize();
|
||||
|
||||
me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
|
||||
}
|
||||
@@ -246,11 +268,24 @@ public:
|
||||
{
|
||||
boss_terestianAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
for (uint8 i = 0; i < 2; ++i)
|
||||
PortalGUID[i] = 0;
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
PortalsCount = 0;
|
||||
SacrificeTimer = 30000;
|
||||
ShadowboltTimer = 5000;
|
||||
SummonTimer = 10000;
|
||||
BerserkTimer = 600000;
|
||||
|
||||
SummonedPortals = false;
|
||||
Berserk = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint64 PortalGUID[2];
|
||||
@@ -280,14 +315,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
PortalsCount = 0;
|
||||
SacrificeTimer = 30000;
|
||||
ShadowboltTimer = 5000;
|
||||
SummonTimer = 10000;
|
||||
BerserkTimer = 600000;
|
||||
|
||||
SummonedPortals = false;
|
||||
Berserk = false;
|
||||
Initialize();
|
||||
|
||||
instance->SetData(TYPE_TERESTIAN, NOT_STARTED);
|
||||
|
||||
|
||||
@@ -125,9 +125,22 @@ public:
|
||||
{
|
||||
boss_dorotheeAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
AggroTimer = 500;
|
||||
|
||||
WaterBoltTimer = 5000;
|
||||
FearTimer = 15000;
|
||||
SummonTitoTimer = 47500;
|
||||
|
||||
SummonedTito = false;
|
||||
TitoDied = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 AggroTimer;
|
||||
@@ -141,14 +154,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
AggroTimer = 500;
|
||||
|
||||
WaterBoltTimer = 5000;
|
||||
FearTimer = 15000;
|
||||
SummonTitoTimer = 47500;
|
||||
|
||||
SummonedTito = false;
|
||||
TitoDied = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -237,15 +243,23 @@ public:
|
||||
|
||||
struct npc_titoAI : public ScriptedAI
|
||||
{
|
||||
npc_titoAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_titoAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
DorotheeGUID = 0;
|
||||
YipTimer = 10000;
|
||||
}
|
||||
|
||||
uint64 DorotheeGUID;
|
||||
uint32 YipTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
DorotheeGUID = 0;
|
||||
YipTimer = 10000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
@@ -305,9 +319,17 @@ public:
|
||||
{
|
||||
boss_strawmanAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
AggroTimer = 13000;
|
||||
BrainBashTimer = 5000;
|
||||
BrainWipeTimer = 7000;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 AggroTimer;
|
||||
@@ -316,9 +338,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
AggroTimer = 13000;
|
||||
BrainBashTimer = 5000;
|
||||
BrainWipeTimer = 7000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) override
|
||||
@@ -419,9 +439,19 @@ public:
|
||||
{
|
||||
boss_tinheadAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
AggroTimer = 15000;
|
||||
CleaveTimer = 5000;
|
||||
RustTimer = 30000;
|
||||
|
||||
RustCount = 0;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 AggroTimer;
|
||||
@@ -432,11 +462,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
AggroTimer = 15000;
|
||||
CleaveTimer = 5000;
|
||||
RustTimer = 30000;
|
||||
|
||||
RustCount = 0;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -528,9 +554,18 @@ public:
|
||||
{
|
||||
boss_roarAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
AggroTimer = 20000;
|
||||
MangleTimer = 5000;
|
||||
ShredTimer = 10000;
|
||||
ScreamTimer = 15000;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 AggroTimer;
|
||||
@@ -540,10 +575,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
AggroTimer = 20000;
|
||||
MangleTimer = 5000;
|
||||
ShredTimer = 10000;
|
||||
ScreamTimer = 15000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
@@ -636,9 +668,16 @@ public:
|
||||
{
|
||||
boss_croneAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
CycloneTimer = 30000;
|
||||
ChainLightningTimer = 10000;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 CycloneTimer;
|
||||
@@ -646,8 +685,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
CycloneTimer = 30000;
|
||||
ChainLightningTimer = 10000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
@@ -717,13 +755,21 @@ public:
|
||||
|
||||
struct npc_cycloneAI : public ScriptedAI
|
||||
{
|
||||
npc_cycloneAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_cycloneAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
MoveTimer = 1000;
|
||||
}
|
||||
|
||||
uint32 MoveTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
MoveTimer = 1000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
@@ -812,9 +858,22 @@ public:
|
||||
{
|
||||
boss_bigbadwolfAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ChaseTimer = 30000;
|
||||
FearTimer = urand(25000, 35000);
|
||||
SwipeTimer = 5000;
|
||||
|
||||
HoodGUID = 0;
|
||||
TempThreat = 0;
|
||||
|
||||
IsChasing = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 ChaseTimer;
|
||||
@@ -828,14 +887,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ChaseTimer = 30000;
|
||||
FearTimer = urand(25000, 35000);
|
||||
SwipeTimer = 5000;
|
||||
|
||||
HoodGUID = 0;
|
||||
TempThreat = 0;
|
||||
|
||||
IsChasing = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -1011,12 +1063,30 @@ public:
|
||||
{
|
||||
boss_julianneAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
EntryYellTimer = 1000;
|
||||
AggroYellTimer = 10000;
|
||||
IsFakingDeath = false;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
RomuloGUID = 0;
|
||||
Phase = PHASE_JULIANNE;
|
||||
|
||||
BlindingPassionTimer = 30000;
|
||||
DevotionTimer = 15000;
|
||||
EternalAffectionTimer = 25000;
|
||||
PowerfulAttractionTimer = 5000;
|
||||
SummonRomuloTimer = 10000;
|
||||
DrinkPoisonTimer = 0;
|
||||
ResurrectSelfTimer = 0;
|
||||
|
||||
SummonedRomulo = false;
|
||||
RomuloDead = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 EntryYellTimer;
|
||||
@@ -1041,25 +1111,12 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
RomuloGUID = 0;
|
||||
Phase = PHASE_JULIANNE;
|
||||
|
||||
BlindingPassionTimer = 30000;
|
||||
DevotionTimer = 15000;
|
||||
EternalAffectionTimer = 25000;
|
||||
PowerfulAttractionTimer = 5000;
|
||||
SummonRomuloTimer = 10000;
|
||||
DrinkPoisonTimer = 0;
|
||||
ResurrectSelfTimer = 0;
|
||||
|
||||
Initialize();
|
||||
if (IsFakingDeath)
|
||||
{
|
||||
Resurrect(me);
|
||||
IsFakingDeath = false;
|
||||
}
|
||||
|
||||
SummonedRomulo = false;
|
||||
RomuloDead = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
@@ -1131,11 +1188,27 @@ public:
|
||||
{
|
||||
boss_romuloAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
EntryYellTimer = 8000;
|
||||
AggroYellTimer = 15000;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
JulianneGUID = 0;
|
||||
Phase = PHASE_ROMULO;
|
||||
|
||||
BackwardLungeTimer = 15000;
|
||||
DaringTimer = 20000;
|
||||
DeadlySwatheTimer = 25000;
|
||||
PoisonThrustTimer = 10000;
|
||||
ResurrectTimer = 10000;
|
||||
|
||||
IsFakingDeath = false;
|
||||
JulianneDead = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint64 JulianneGUID;
|
||||
@@ -1154,17 +1227,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
JulianneGUID = 0;
|
||||
Phase = PHASE_ROMULO;
|
||||
|
||||
BackwardLungeTimer = 15000;
|
||||
DaringTimer = 20000;
|
||||
DeadlySwatheTimer = 25000;
|
||||
PoisonThrustTimer = 10000;
|
||||
ResurrectTimer = 10000;
|
||||
|
||||
IsFakingDeath = false;
|
||||
JulianneDead = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
|
||||
@@ -131,11 +131,23 @@ public:
|
||||
{
|
||||
npc_barnesAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
RaidWiped = false;
|
||||
m_uiEventId = 0;
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
m_uiSpotlightGUID = 0;
|
||||
|
||||
TalkCount = 0;
|
||||
TalkTimer = 2000;
|
||||
WipeTimer = 5000;
|
||||
|
||||
PerformanceReady = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint64 m_uiSpotlightGUID;
|
||||
@@ -150,13 +162,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
m_uiSpotlightGUID = 0;
|
||||
|
||||
TalkCount = 0;
|
||||
TalkTimer = 2000;
|
||||
WipeTimer = 5000;
|
||||
|
||||
PerformanceReady = false;
|
||||
Initialize();
|
||||
|
||||
m_uiEventId = instance->GetData(DATA_OPERA_PERFORMANCE);
|
||||
}
|
||||
@@ -476,9 +482,20 @@ public:
|
||||
{
|
||||
npc_image_of_medivhAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
Step = 0;
|
||||
FireArcanagosTimer = 0;
|
||||
FireMedivhTimer = 0;
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ArcanagosGUID = 0;
|
||||
EventStarted = false;
|
||||
YellTimer = 0;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint64 ArcanagosGUID;
|
||||
@@ -492,9 +509,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ArcanagosGUID = 0;
|
||||
EventStarted = false;
|
||||
YellTimer = 0;
|
||||
Initialize();
|
||||
|
||||
if (instance->GetData64(DATA_IMAGE_OF_MEDIVH) == 0)
|
||||
{
|
||||
|
||||
@@ -103,9 +103,29 @@ public:
|
||||
{
|
||||
boss_felblood_kaelthasAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
/// @todo Timers
|
||||
FireballTimer = 0;
|
||||
PhoenixTimer = 10000;
|
||||
FlameStrikeTimer = 25000;
|
||||
CombatPulseTimer = 0;
|
||||
|
||||
PyroblastTimer = 60000;
|
||||
|
||||
GravityLapseTimer = 0;
|
||||
GravityLapsePhase = 0;
|
||||
|
||||
FirstGravityLapse = true;
|
||||
HasTaunted = false;
|
||||
|
||||
Phase = 0;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint32 FireballTimer;
|
||||
@@ -134,21 +154,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
/// @todo Timers
|
||||
FireballTimer = 0;
|
||||
PhoenixTimer = 10000;
|
||||
FlameStrikeTimer = 25000;
|
||||
CombatPulseTimer = 0;
|
||||
|
||||
PyroblastTimer = 60000;
|
||||
|
||||
GravityLapseTimer = 0;
|
||||
GravityLapsePhase = 0;
|
||||
|
||||
FirstGravityLapse = true;
|
||||
HasTaunted = false;
|
||||
|
||||
Phase = 0;
|
||||
Initialize();
|
||||
|
||||
instance->SetBossState(DATA_KAELTHAS, NOT_STARTED);
|
||||
}
|
||||
@@ -439,13 +445,19 @@ public:
|
||||
{
|
||||
npc_felkael_flamestrikeAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
FlameStrikeTimer = 5000;
|
||||
}
|
||||
|
||||
uint32 FlameStrikeTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
FlameStrikeTimer = 5000;
|
||||
Initialize();
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->setFaction(14);
|
||||
@@ -481,9 +493,18 @@ public:
|
||||
{
|
||||
npc_felkael_phoenixAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
BurnTimer = 2000;
|
||||
Death_Timer = 3000;
|
||||
Rebirth = false;
|
||||
FakeDeath = false;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
uint32 BurnTimer;
|
||||
uint32 Death_Timer;
|
||||
@@ -495,10 +516,7 @@ public:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetDisableGravity(true);
|
||||
DoCast(me, SPELL_PHOENIX_BURN, true);
|
||||
BurnTimer = 2000;
|
||||
Death_Timer = 3000;
|
||||
Rebirth = false;
|
||||
FakeDeath = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
@@ -592,13 +610,21 @@ public:
|
||||
|
||||
struct npc_felkael_phoenix_eggAI : public ScriptedAI
|
||||
{
|
||||
npc_felkael_phoenix_eggAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_felkael_phoenix_eggAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
HatchTimer = 10000;
|
||||
}
|
||||
|
||||
uint32 HatchTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
HatchTimer = 10000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
|
||||
@@ -117,11 +117,24 @@ public:
|
||||
{
|
||||
boss_priestess_delrissaAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
memset(&m_auiLackeyGUID, 0, sizeof(m_auiLackeyGUID));
|
||||
LackeyEntryList.clear();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
PlayersKilled = 0;
|
||||
|
||||
HealTimer = 15000;
|
||||
RenewTimer = 10000;
|
||||
ShieldTimer = 2000;
|
||||
SWPainTimer = 5000;
|
||||
DispelTimer = 7500;
|
||||
ResetTimer = 5000;
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
std::vector<uint32> LackeyEntryList;
|
||||
@@ -138,14 +151,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
PlayersKilled = 0;
|
||||
|
||||
HealTimer = 15000;
|
||||
RenewTimer = 10000;
|
||||
ShieldTimer = 2000;
|
||||
SWPainTimer = 5000;
|
||||
DispelTimer = 7500;
|
||||
ResetTimer = 5000;
|
||||
Initialize();
|
||||
|
||||
InitializeLackeys();
|
||||
}
|
||||
@@ -353,11 +359,23 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI
|
||||
{
|
||||
boss_priestess_lackey_commonAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
memset(&m_auiLackeyGUIDs, 0, sizeof(m_auiLackeyGUIDs));
|
||||
AcquireGUIDs();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
UsedPotion = false;
|
||||
|
||||
// These guys does not follow normal threat system rules
|
||||
// For later development, some alternative threat system should be made
|
||||
// We do not know what this system is based upon, but one theory is class (healers=high threat, dps=medium, etc)
|
||||
// We reset their threat frequently as an alternative until such a system exist
|
||||
ResetThreatTimer = urand(5000, 20000);
|
||||
}
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
uint64 m_auiLackeyGUIDs[MAX_ACTIVE_LACKEY];
|
||||
@@ -367,13 +385,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
UsedPotion = false;
|
||||
|
||||
// These guys does not follow normal threat system rules
|
||||
// For later development, some alternative threat system should be made
|
||||
// We do not know what this system is based upon, but one theory is class (healers=high threat, dps=medium, etc)
|
||||
// We reset their threat frequently as an alternative until such a system exist
|
||||
ResetThreatTimer = urand(5000, 20000);
|
||||
Initialize();
|
||||
|
||||
// in case she is not alive and Reset was for some reason called, respawn her (most likely party wipe after killing her)
|
||||
if (Creature* pDelrissa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DELRISSA)))
|
||||
@@ -493,7 +505,20 @@ public:
|
||||
struct boss_kagani_nightstrikeAI : public boss_priestess_lackey_commonAI
|
||||
{
|
||||
//Rogue
|
||||
boss_kagani_nightstrikeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) { }
|
||||
boss_kagani_nightstrikeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Gouge_Timer = 5500;
|
||||
Kick_Timer = 7000;
|
||||
Vanish_Timer = 2000;
|
||||
Eviscerate_Timer = 6000;
|
||||
Wait_Timer = 5000;
|
||||
InVanish = false;
|
||||
}
|
||||
|
||||
uint32 Gouge_Timer;
|
||||
uint32 Kick_Timer;
|
||||
@@ -504,12 +529,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Gouge_Timer = 5500;
|
||||
Kick_Timer = 7000;
|
||||
Vanish_Timer = 2000;
|
||||
Eviscerate_Timer = 6000;
|
||||
Wait_Timer = 5000;
|
||||
InVanish = false;
|
||||
Initialize();
|
||||
me->SetVisible(true);
|
||||
|
||||
boss_priestess_lackey_commonAI::Reset();
|
||||
@@ -597,7 +617,19 @@ public:
|
||||
struct boss_ellris_duskhallowAI : public boss_priestess_lackey_commonAI
|
||||
{
|
||||
//Warlock
|
||||
boss_ellris_duskhallowAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) { }
|
||||
boss_ellris_duskhallowAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Immolate_Timer = 6000;
|
||||
Shadow_Bolt_Timer = 3000;
|
||||
Seed_of_Corruption_Timer = 2000;
|
||||
Curse_of_Agony_Timer = 1000;
|
||||
Fear_Timer = 10000;
|
||||
}
|
||||
|
||||
uint32 Immolate_Timer;
|
||||
uint32 Shadow_Bolt_Timer;
|
||||
@@ -607,11 +639,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Immolate_Timer = 6000;
|
||||
Shadow_Bolt_Timer = 3000;
|
||||
Seed_of_Corruption_Timer = 2000;
|
||||
Curse_of_Agony_Timer = 1000;
|
||||
Fear_Timer = 10000;
|
||||
Initialize();
|
||||
|
||||
boss_priestess_lackey_commonAI::Reset();
|
||||
}
|
||||
@@ -688,15 +716,23 @@ public:
|
||||
struct boss_eramas_brightblazeAI : public boss_priestess_lackey_commonAI
|
||||
{
|
||||
//Monk
|
||||
boss_eramas_brightblazeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) { }
|
||||
boss_eramas_brightblazeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Knockdown_Timer = 6000;
|
||||
Snap_Kick_Timer = 4500;
|
||||
}
|
||||
|
||||
uint32 Knockdown_Timer;
|
||||
uint32 Snap_Kick_Timer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Knockdown_Timer = 6000;
|
||||
Snap_Kick_Timer = 4500;
|
||||
Initialize();
|
||||
|
||||
boss_priestess_lackey_commonAI::Reset();
|
||||
}
|
||||
@@ -749,7 +785,24 @@ public:
|
||||
struct boss_yazzaiAI : public boss_priestess_lackey_commonAI
|
||||
{
|
||||
//Mage
|
||||
boss_yazzaiAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) { }
|
||||
boss_yazzaiAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
HasIceBlocked = false;
|
||||
|
||||
Polymorph_Timer = 1000;
|
||||
Ice_Block_Timer = 20000;
|
||||
Wait_Timer = 10000;
|
||||
Blizzard_Timer = 8000;
|
||||
Ice_Lance_Timer = 12000;
|
||||
Cone_of_Cold_Timer = 10000;
|
||||
Frostbolt_Timer = 3000;
|
||||
Blink_Timer = 8000;
|
||||
}
|
||||
|
||||
bool HasIceBlocked;
|
||||
|
||||
@@ -764,16 +817,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
HasIceBlocked = false;
|
||||
|
||||
Polymorph_Timer = 1000;
|
||||
Ice_Block_Timer = 20000;
|
||||
Wait_Timer = 10000;
|
||||
Blizzard_Timer = 8000;
|
||||
Ice_Lance_Timer = 12000;
|
||||
Cone_of_Cold_Timer = 10000;
|
||||
Frostbolt_Timer = 3000;
|
||||
Blink_Timer = 8000;
|
||||
Initialize();
|
||||
|
||||
boss_priestess_lackey_commonAI::Reset();
|
||||
}
|
||||
@@ -879,7 +923,20 @@ public:
|
||||
struct boss_warlord_salarisAI : public boss_priestess_lackey_commonAI
|
||||
{
|
||||
//Warrior
|
||||
boss_warlord_salarisAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) { }
|
||||
boss_warlord_salarisAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Intercept_Stun_Timer = 500;
|
||||
Disarm_Timer = 6000;
|
||||
Piercing_Howl_Timer = 10000;
|
||||
Frightening_Shout_Timer = 18000;
|
||||
Hamstring_Timer = 4500;
|
||||
Mortal_Strike_Timer = 8000;
|
||||
}
|
||||
|
||||
uint32 Intercept_Stun_Timer;
|
||||
uint32 Disarm_Timer;
|
||||
@@ -890,12 +947,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Intercept_Stun_Timer = 500;
|
||||
Disarm_Timer = 6000;
|
||||
Piercing_Howl_Timer = 10000;
|
||||
Frightening_Shout_Timer = 18000;
|
||||
Hamstring_Timer = 4500;
|
||||
Mortal_Strike_Timer = 8000;
|
||||
Initialize();
|
||||
|
||||
boss_priestess_lackey_commonAI::Reset();
|
||||
}
|
||||
@@ -1001,9 +1053,20 @@ public:
|
||||
//Hunter
|
||||
boss_garaxxasAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
m_uiPetGUID = 0;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Aimed_Shot_Timer = 6000;
|
||||
Shoot_Timer = 2500;
|
||||
Concussive_Shot_Timer = 8000;
|
||||
Multi_Shot_Timer = 10000;
|
||||
Wing_Clip_Timer = 4000;
|
||||
Freezing_Trap_Timer = 15000;
|
||||
}
|
||||
|
||||
uint64 m_uiPetGUID;
|
||||
|
||||
uint32 Aimed_Shot_Timer;
|
||||
@@ -1015,12 +1078,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Aimed_Shot_Timer = 6000;
|
||||
Shoot_Timer = 2500;
|
||||
Concussive_Shot_Timer = 8000;
|
||||
Multi_Shot_Timer = 10000;
|
||||
Wing_Clip_Timer = 4000;
|
||||
Freezing_Trap_Timer = 15000;
|
||||
Initialize();
|
||||
|
||||
Unit* pPet = ObjectAccessor::GetUnit(*me, m_uiPetGUID);
|
||||
if (!pPet)
|
||||
@@ -1110,7 +1168,20 @@ public:
|
||||
struct boss_apokoAI : public boss_priestess_lackey_commonAI
|
||||
{
|
||||
//Shaman
|
||||
boss_apokoAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) { }
|
||||
boss_apokoAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Totem_Timer = 2000;
|
||||
Totem_Amount = 1;
|
||||
War_Stomp_Timer = 10000;
|
||||
Purge_Timer = 8000;
|
||||
Healing_Wave_Timer = 5000;
|
||||
Frost_Shock_Timer = 7000;
|
||||
}
|
||||
|
||||
uint32 Totem_Timer;
|
||||
uint8 Totem_Amount;
|
||||
@@ -1121,12 +1192,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Totem_Timer = 2000;
|
||||
Totem_Amount = 1;
|
||||
War_Stomp_Timer = 10000;
|
||||
Purge_Timer = 8000;
|
||||
Healing_Wave_Timer = 5000;
|
||||
Frost_Shock_Timer = 7000;
|
||||
Initialize();
|
||||
|
||||
boss_priestess_lackey_commonAI::Reset();
|
||||
}
|
||||
@@ -1199,7 +1265,19 @@ public:
|
||||
struct boss_zelfanAI : public boss_priestess_lackey_commonAI
|
||||
{
|
||||
//Engineer
|
||||
boss_zelfanAI(Creature* creature) : boss_priestess_lackey_commonAI(creature) { }
|
||||
boss_zelfanAI(Creature* creature) : boss_priestess_lackey_commonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Goblin_Dragon_Gun_Timer = 20000;
|
||||
Rocket_Launch_Timer = 7000;
|
||||
Recombobulate_Timer = 4000;
|
||||
High_Explosive_Sheep_Timer = 10000;
|
||||
Fel_Iron_Bomb_Timer = 15000;
|
||||
}
|
||||
|
||||
uint32 Goblin_Dragon_Gun_Timer;
|
||||
uint32 Rocket_Launch_Timer;
|
||||
@@ -1209,11 +1287,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Goblin_Dragon_Gun_Timer = 20000;
|
||||
Rocket_Launch_Timer = 7000;
|
||||
Recombobulate_Timer = 4000;
|
||||
High_Explosive_Sheep_Timer = 10000;
|
||||
Fel_Iron_Bomb_Timer = 15000;
|
||||
Initialize();
|
||||
|
||||
boss_priestess_lackey_commonAI::Reset();
|
||||
}
|
||||
|
||||
@@ -115,13 +115,21 @@ public:
|
||||
|
||||
struct npc_kalecgosAI : public ScriptedAI
|
||||
{
|
||||
npc_kalecgosAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_kalecgosAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
m_uiTransformTimer = 0;
|
||||
}
|
||||
|
||||
uint32 m_uiTransformTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
m_uiTransformTimer = 0;
|
||||
Initialize();
|
||||
|
||||
// we must assume he appear as dragon somewhere outside the platform of orb, and then move directly to here
|
||||
if (me->GetEntry() != NPC_KAEL)
|
||||
|
||||
@@ -102,9 +102,21 @@ public:
|
||||
{
|
||||
npc_unworthy_initiateAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if (!me->GetCurrentEquipmentId())
|
||||
me->SetCurrentEquipmentId(me->GetOriginalEquipmentId());
|
||||
|
||||
playerGUID = 0;
|
||||
wait_timer = 0;
|
||||
anchorX = 0.f;
|
||||
anchorY = 0.f;
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
anchorGUID = 0;
|
||||
phase = PHASE_CHAINED;
|
||||
}
|
||||
|
||||
uint64 playerGUID;
|
||||
@@ -117,8 +129,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
anchorGUID = 0;
|
||||
phase = PHASE_CHAINED;
|
||||
Initialize();
|
||||
events.Reset();
|
||||
me->setFaction(7);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
|
||||
@@ -516,7 +527,15 @@ public:
|
||||
{
|
||||
npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
m_uiDuelerGUID = 0;
|
||||
m_uiDuelTimer = 5000;
|
||||
m_bIsDuelInProgress = false;
|
||||
lose = false;
|
||||
}
|
||||
|
||||
bool lose;
|
||||
@@ -526,15 +545,11 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
lose = false;
|
||||
Initialize();
|
||||
|
||||
me->RestoreFaction();
|
||||
CombatAI::Reset();
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15);
|
||||
|
||||
m_uiDuelerGUID = 0;
|
||||
m_uiDuelTimer = 5000;
|
||||
m_bIsDuelInProgress = false;
|
||||
}
|
||||
|
||||
void SpellHit(Unit* pCaster, const SpellInfo* pSpell) override
|
||||
@@ -630,9 +645,12 @@ class npc_dark_rider_of_acherus : public CreatureScript
|
||||
|
||||
struct npc_dark_rider_of_acherusAI : public ScriptedAI
|
||||
{
|
||||
npc_dark_rider_of_acherusAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_dark_rider_of_acherusAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void Initialize()
|
||||
{
|
||||
PhaseTimer = 4000;
|
||||
Phase = 0;
|
||||
@@ -640,6 +658,11 @@ class npc_dark_rider_of_acherus : public CreatureScript
|
||||
TargetGUID = 0;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!Intro || !TargetGUID)
|
||||
@@ -1067,18 +1090,24 @@ class npc_scarlet_miner : public CreatureScript
|
||||
{
|
||||
npc_scarlet_minerAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
carGUID = 0;
|
||||
IntroTimer = 0;
|
||||
IntroPhase = 0;
|
||||
}
|
||||
|
||||
uint32 IntroTimer;
|
||||
uint32 IntroPhase;
|
||||
uint64 carGUID;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
carGUID = 0;
|
||||
IntroTimer = 0;
|
||||
IntroPhase = 0;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void IsSummonedBy(Unit* summoner) override
|
||||
|
||||
@@ -51,7 +51,17 @@ public:
|
||||
|
||||
struct npc_crusade_persuadedAI : public ScriptedAI
|
||||
{
|
||||
npc_crusade_persuadedAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_crusade_persuadedAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
speechTimer = 0;
|
||||
speechCounter = 0;
|
||||
playerGUID = 0;
|
||||
}
|
||||
|
||||
uint32 speechTimer;
|
||||
uint32 speechCounter;
|
||||
@@ -59,9 +69,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
speechTimer = 0;
|
||||
speechCounter = 0;
|
||||
playerGUID = 0;
|
||||
Initialize();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RestoreFaction();
|
||||
}
|
||||
@@ -207,16 +215,22 @@ public:
|
||||
{
|
||||
npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
wave = 0;
|
||||
waveTimer = 3000;
|
||||
valrothGUID = 0;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
if (!HasEscortState(STATE_ESCORT_ESCORTING))
|
||||
{
|
||||
wave = 0;
|
||||
waveTimer = 3000;
|
||||
valrothGUID = 0;
|
||||
Initialize();
|
||||
me->LoadEquipment(0, true);
|
||||
me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
|
||||
me->RemoveAurasDueToSpell(SPELL_KOLTIRA_TRANSFORM);
|
||||
@@ -467,7 +481,17 @@ public:
|
||||
|
||||
struct npc_high_inquisitor_valrothAI : public ScriptedAI
|
||||
{
|
||||
npc_high_inquisitor_valrothAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_high_inquisitor_valrothAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
uiRenew_timer = 1000;
|
||||
uiInquisitor_Penance_timer = 2000;
|
||||
uiValroth_Smite_timer = 1000;
|
||||
}
|
||||
|
||||
uint32 uiRenew_timer;
|
||||
uint32 uiInquisitor_Penance_timer;
|
||||
@@ -475,9 +499,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
uiRenew_timer = 1000;
|
||||
uiInquisitor_Penance_timer = 2000;
|
||||
uiValroth_Smite_timer = 1000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who) override
|
||||
@@ -603,7 +625,17 @@ public:
|
||||
|
||||
struct npc_a_special_surpriseAI : public ScriptedAI
|
||||
{
|
||||
npc_a_special_surpriseAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_a_special_surpriseAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ExecuteSpeech_Timer = 0;
|
||||
ExecuteSpeech_Counter = 0;
|
||||
PlayerGUID = 0;
|
||||
}
|
||||
|
||||
uint32 ExecuteSpeech_Timer;
|
||||
uint32 ExecuteSpeech_Counter;
|
||||
@@ -611,9 +643,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ExecuteSpeech_Timer = 0;
|
||||
ExecuteSpeech_Counter = 0;
|
||||
PlayerGUID = 0;
|
||||
Initialize();
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
/* ScriptData
|
||||
SDName: Boss_Skarvald_Dalronn
|
||||
SD%Complete: 95
|
||||
SDComment: Needs adjustments to blizzlike timers, Yell Text + Sound to DB
|
||||
SDComment: Needs adjustments to blizzlike timers
|
||||
SDCategory: Utgarde Keep
|
||||
EndScriptData */
|
||||
|
||||
@@ -26,21 +26,15 @@ EndScriptData */
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_keep.h"
|
||||
|
||||
enum Yells
|
||||
enum Texts
|
||||
{
|
||||
// signed for 24200, but used by 24200, 27390
|
||||
YELL_SKARVALD_AGGRO = 0,
|
||||
YELL_SKARVALD_DAL_DIED = 1,
|
||||
YELL_SKARVALD_SKA_DIEDFIRST = 2,
|
||||
YELL_SKARVALD_KILL = 3,
|
||||
YELL_SKARVALD_DAL_DIEDFIRST = 4,
|
||||
// Texts are common for both bosses and their ghosts.
|
||||
SAY_AGGRO = 0,
|
||||
SAY_DEATH = 1, // Said once both bosses are dead.
|
||||
SAY_DIED_FIRST = 2, // Said by the first boss that dies.
|
||||
SAY_KILL = 3,
|
||||
SAY_DEATH_RESPONSE = 4 // Said by the boss alive after the first one dies.
|
||||
|
||||
// signed for 24201, but used by 24201, 27389
|
||||
YELL_DALRONN_AGGRO = 0,
|
||||
YELL_DALRONN_SKA_DIED = 1,
|
||||
YELL_DALRONN_DAL_DIEDFIRST = 2,
|
||||
YELL_DALRONN_KILL = 3,
|
||||
YELL_DALRONN_SKA_DIEDFIRST = 4
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -48,28 +42,128 @@ enum Spells
|
||||
// Spells of Skarvald and his Ghost
|
||||
SPELL_CHARGE = 43651,
|
||||
SPELL_STONE_STRIKE = 48583,
|
||||
SPELL_SUMMON_SKARVALD_GHOST = 48613,
|
||||
SPELL_ENRAGE = 48193,
|
||||
SPELL_SUMMON_SKARVALD_GHOST = 48613,
|
||||
|
||||
// Spells of Dalronn and his Ghost
|
||||
SPELL_SHADOW_BOLT = 43649,
|
||||
H_SPELL_SHADOW_BOLT = 59575,
|
||||
H_SPELL_SUMMON_SKELETONS = 52611,
|
||||
SPELL_SUMMON_SKELETONS = 52611,
|
||||
SPELL_DEBILITATE = 43650,
|
||||
SPELL_SUMMON_DALRONN_GHOST = 48612,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
// Skarvald the Constructor
|
||||
EVENT_SKARVALD_CHARGE = 1,
|
||||
EVENT_STONE_STRIKE,
|
||||
|
||||
// Dalronn the Controller
|
||||
EVENT_SHADOW_BOLT,
|
||||
EVENT_DEBILITATE,
|
||||
EVENT_SUMMON_SKELETONS,
|
||||
EVENT_DELAYED_AGGRO_SAY, // Dalronn's SAY_AGGRO is delayed so it doesn't overlap Skarvald's one.
|
||||
|
||||
// Common event to both bosses.
|
||||
// Delays SAY_DEATH_RESPONSE so it doesn't overlap with the SAY_DIED_FIRST from the boss that has just died.
|
||||
EVENT_DEATH_RESPONSE
|
||||
};
|
||||
|
||||
enum Actions
|
||||
{
|
||||
ACTION_OTHER_JUST_DIED = 1,
|
||||
ACTION_DESPAWN_SUMMONS = 2 // Only needed to clear off the ghosts when the second boss dies.
|
||||
};
|
||||
|
||||
class SkarvaldChargePredicate
|
||||
{
|
||||
public:
|
||||
SkarvaldChargePredicate(Unit* unit) : me(unit) { }
|
||||
public:
|
||||
SkarvaldChargePredicate(Unit* unit) : _me(unit) { }
|
||||
|
||||
bool operator() (WorldObject* object) const
|
||||
{
|
||||
return object->GetDistance2d(me) >= 5.0f && object->GetDistance2d(me) <= 30.0f;
|
||||
}
|
||||
bool operator() (WorldObject* target) const
|
||||
{
|
||||
return target->GetDistance2d(_me) >= 5.0f && target->GetDistance2d(_me) <= 30.0f;
|
||||
}
|
||||
|
||||
private:
|
||||
Unit* me;
|
||||
Unit* _me;
|
||||
};
|
||||
|
||||
struct generic_boss_controllerAI : public BossAI
|
||||
{
|
||||
generic_boss_controllerAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN)
|
||||
{
|
||||
OtherBossData = 0;
|
||||
IsInGhostForm = me->GetEntry() == NPC_SKARVALD_GHOST || me->GetEntry() == NPC_DALRONN_GHOST;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
if (IsInGhostForm)
|
||||
{
|
||||
// Call this here since ghosts aren't set in combat as they spawn.
|
||||
DoZoneInCombat(me, 50.0f);
|
||||
}
|
||||
else
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
if (!IsInGhostForm)
|
||||
_EnterCombat();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
if (Creature* otherBoss = ObjectAccessor::GetCreature(*me, instance->GetData64(OtherBossData)))
|
||||
{
|
||||
if (otherBoss->IsAlive())
|
||||
{
|
||||
Talk(SAY_DIED_FIRST);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
||||
otherBoss->AI()->DoAction(ACTION_OTHER_JUST_DIED);
|
||||
DoCast(me, OtherBossData == DATA_DALRONN ? SPELL_SUMMON_SKARVALD_GHOST : SPELL_SUMMON_DALRONN_GHOST, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
otherBoss->AI()->DoAction(ACTION_DESPAWN_SUMMONS);
|
||||
_JustDied();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 actionId) override
|
||||
{
|
||||
switch (actionId)
|
||||
{
|
||||
case ACTION_OTHER_JUST_DIED:
|
||||
events.ScheduleEvent(EVENT_DEATH_RESPONSE, 2000);
|
||||
break;
|
||||
case ACTION_DESPAWN_SUMMONS:
|
||||
summons.DespawnAll();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
if (eventId == EVENT_DEATH_RESPONSE)
|
||||
Talk(SAY_DEATH_RESPONSE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (!IsInGhostForm && who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
protected:
|
||||
uint32 OtherBossData;
|
||||
bool IsInGhostForm;
|
||||
};
|
||||
|
||||
class boss_skarvald_the_constructor : public CreatureScript
|
||||
@@ -77,146 +171,60 @@ class boss_skarvald_the_constructor : public CreatureScript
|
||||
public:
|
||||
boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { }
|
||||
|
||||
struct boss_skarvald_the_constructorAI : public BossAI
|
||||
struct boss_skarvald_the_constructorAI : public generic_boss_controllerAI
|
||||
{
|
||||
boss_skarvald_the_constructorAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { }
|
||||
|
||||
bool ghost;
|
||||
uint32 Charge_Timer;
|
||||
uint32 StoneStrike_Timer;
|
||||
uint32 Response_Timer;
|
||||
uint32 Check_Timer;
|
||||
bool Dalronn_isDead;
|
||||
bool Enraged;
|
||||
boss_skarvald_the_constructorAI(Creature* creature) : generic_boss_controllerAI(creature)
|
||||
{
|
||||
OtherBossData = DATA_DALRONN;
|
||||
Enraged = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Charge_Timer = 5000;
|
||||
StoneStrike_Timer = 10000;
|
||||
Dalronn_isDead = false;
|
||||
Response_Timer = 0;
|
||||
Check_Timer = 5000;
|
||||
Enraged = false;
|
||||
|
||||
ghost = me->GetEntry() == NPC_SKARVALD_GHOST;
|
||||
if (!ghost)
|
||||
_Reset();
|
||||
generic_boss_controllerAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
void EnterCombat(Unit* who) override
|
||||
{
|
||||
if (!ghost)
|
||||
generic_boss_controllerAI::EnterCombat(who);
|
||||
|
||||
if (!IsInGhostForm)
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SKARVALD_CHARGE, 5000);
|
||||
events.ScheduleEvent(EVENT_STONE_STRIKE, 10000);
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(YELL_SKARVALD_AGGRO);
|
||||
case EVENT_SKARVALD_CHARGE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me)))
|
||||
DoCast(target, SPELL_CHARGE);
|
||||
events.ScheduleEvent(EVENT_CHARGE, urand(5000, 10000));
|
||||
break;
|
||||
case EVENT_STONE_STRIKE:
|
||||
DoCastVictim(SPELL_STONE_STRIKE);
|
||||
events.ScheduleEvent(EVENT_STONE_STRIKE, urand(5000, 10000));
|
||||
break;
|
||||
default:
|
||||
generic_boss_controllerAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage))
|
||||
if (!Enraged && !IsInGhostForm && me->HealthBelowPctDamaged(15, damage))
|
||||
{
|
||||
Enraged = true;
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 /*actionId*/)
|
||||
{
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
if (!ghost)
|
||||
{
|
||||
if (Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN)))
|
||||
{
|
||||
if (dalronn->IsAlive())
|
||||
{
|
||||
Talk(YELL_SKARVALD_SKA_DIEDFIRST);
|
||||
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
||||
|
||||
//DoCast(me, SPELL_SUMMON_SKARVALD_GHOST, true);
|
||||
if (Creature* temp = me->SummonCreature(NPC_SKARVALD_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000))
|
||||
{
|
||||
temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
temp->AI()->AttackStart(killer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dalronn->AI()->DoAction(0);
|
||||
_JustDied();
|
||||
Talk(YELL_SKARVALD_DAL_DIED);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (!ghost && who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(YELL_SKARVALD_KILL);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (!ghost)
|
||||
{
|
||||
if (Check_Timer)
|
||||
{
|
||||
if (Check_Timer <= diff)
|
||||
{
|
||||
Check_Timer = 5000;
|
||||
Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN));
|
||||
if (dalronn && dalronn->isDead())
|
||||
{
|
||||
Dalronn_isDead = true;
|
||||
Response_Timer = 2000;
|
||||
Check_Timer = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
Check_Timer -= diff;
|
||||
}
|
||||
if (Response_Timer && Dalronn_isDead)
|
||||
{
|
||||
if (Response_Timer <= diff)
|
||||
{
|
||||
Talk(YELL_SKARVALD_DAL_DIEDFIRST);
|
||||
|
||||
Response_Timer = 0;
|
||||
}
|
||||
else
|
||||
Response_Timer -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
if (Charge_Timer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me)))
|
||||
DoCast(target, SPELL_CHARGE);
|
||||
Charge_Timer = 5000 + rand32() % 5000;
|
||||
}
|
||||
else
|
||||
Charge_Timer -= diff;
|
||||
|
||||
if (StoneStrike_Timer <= diff)
|
||||
{
|
||||
DoCastVictim(SPELL_STONE_STRIKE);
|
||||
StoneStrike_Timer = 5000 + rand32() % 5000;
|
||||
}
|
||||
else
|
||||
StoneStrike_Timer -= diff;
|
||||
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
bool Enraged;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
@@ -230,171 +238,52 @@ class boss_dalronn_the_controller : public CreatureScript
|
||||
public:
|
||||
boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { }
|
||||
|
||||
struct boss_dalronn_the_controllerAI : public BossAI
|
||||
struct boss_dalronn_the_controllerAI : public generic_boss_controllerAI
|
||||
{
|
||||
boss_dalronn_the_controllerAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { }
|
||||
|
||||
bool ghost;
|
||||
uint32 ShadowBolt_Timer;
|
||||
uint32 Debilitate_Timer;
|
||||
uint32 Summon_Timer;
|
||||
|
||||
uint32 Response_Timer;
|
||||
uint32 Check_Timer;
|
||||
uint32 AggroYell_Timer;
|
||||
bool Skarvald_isDead;
|
||||
|
||||
void Reset() override
|
||||
boss_dalronn_the_controllerAI(Creature* creature) : generic_boss_controllerAI(creature)
|
||||
{
|
||||
ShadowBolt_Timer = 1000;
|
||||
Debilitate_Timer = 5000;
|
||||
Summon_Timer = 10000;
|
||||
Check_Timer = 5000;
|
||||
Skarvald_isDead = false;
|
||||
Response_Timer = 0;
|
||||
AggroYell_Timer = 0;
|
||||
|
||||
ghost = me->GetEntry() == NPC_DALRONN_GHOST;
|
||||
if (!ghost)
|
||||
_Reset();
|
||||
OtherBossData = DATA_SKARVALD;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
void EnterCombat(Unit* who) override
|
||||
{
|
||||
if (!ghost)
|
||||
{
|
||||
_EnterCombat();
|
||||
AggroYell_Timer = 5000;
|
||||
}
|
||||
}
|
||||
generic_boss_controllerAI::EnterCombat(who);
|
||||
|
||||
void DoAction(int32 /*actionId*/)
|
||||
{
|
||||
summons.DespawnAll();
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 1000);
|
||||
events.ScheduleEvent(EVENT_DEBILITATE, 5000);
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
if (!ghost)
|
||||
{
|
||||
if (Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD)))
|
||||
{
|
||||
if (skarvald->IsAlive())
|
||||
{
|
||||
Talk(YELL_DALRONN_DAL_DIEDFIRST);
|
||||
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
|
||||
|
||||
//DoCast(me, SPELL_SUMMON_DALRONN_GHOST, true);
|
||||
if (Creature* temp = me->SummonCreature(NPC_DALRONN_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000))
|
||||
{
|
||||
temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
temp->AI()->AttackStart(killer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
skarvald->AI()->DoAction(0);
|
||||
_JustDied();
|
||||
Talk(YELL_DALRONN_SKA_DIED);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (!ghost && who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(YELL_DALRONN_KILL);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (AggroYell_Timer)
|
||||
{
|
||||
if (AggroYell_Timer <= diff)
|
||||
{
|
||||
Talk(YELL_DALRONN_AGGRO);
|
||||
|
||||
AggroYell_Timer = 0;
|
||||
}
|
||||
else
|
||||
AggroYell_Timer -= diff;
|
||||
}
|
||||
|
||||
if (!ghost)
|
||||
{
|
||||
if (Check_Timer)
|
||||
{
|
||||
if (Check_Timer <= diff)
|
||||
{
|
||||
Check_Timer = 5000;
|
||||
Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD));
|
||||
if (skarvald && skarvald->isDead())
|
||||
{
|
||||
Skarvald_isDead = true;
|
||||
Response_Timer = 2000;
|
||||
Check_Timer = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
Check_Timer -= diff;
|
||||
}
|
||||
|
||||
if (Response_Timer && Skarvald_isDead)
|
||||
{
|
||||
if (Response_Timer <= diff)
|
||||
{
|
||||
Talk(YELL_DALRONN_SKA_DIEDFIRST);
|
||||
Response_Timer = 0;
|
||||
}
|
||||
else
|
||||
Response_Timer -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
if (ShadowBolt_Timer <= diff)
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCast(false))
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_SHADOW_BOLT);
|
||||
ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells
|
||||
}
|
||||
}
|
||||
else
|
||||
ShadowBolt_Timer -= diff;
|
||||
|
||||
if (Debilitate_Timer <= diff)
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCast(false))
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_DEBILITATE);
|
||||
Debilitate_Timer = 5000 + rand32() % 5000;
|
||||
}
|
||||
}
|
||||
else
|
||||
Debilitate_Timer -= diff;
|
||||
if (!IsInGhostForm)
|
||||
events.ScheduleEvent(EVENT_DELAYED_AGGRO_SAY, 5000);
|
||||
|
||||
if (IsHeroic())
|
||||
{
|
||||
if (Summon_Timer <= diff)
|
||||
{
|
||||
if (!me->IsNonMeleeSpellCast(false))
|
||||
{
|
||||
DoCast(me, H_SPELL_SUMMON_SKELETONS);
|
||||
Summon_Timer = (rand32() % 10000) + 20000;
|
||||
}
|
||||
}
|
||||
else
|
||||
Summon_Timer -= diff;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 10000);
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_BOLT:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
|
||||
DoCast(target, SPELL_SHADOW_BOLT);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2100); //give a 100ms pause to try cast other spells
|
||||
break;
|
||||
case EVENT_DEBILITATE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
DoCast(target, SPELL_DEBILITATE);
|
||||
events.ScheduleEvent(EVENT_DEBILITATE, urand(5000, 10000));
|
||||
break;
|
||||
case EVENT_SUMMON_SKELETONS:
|
||||
DoCast(me, SPELL_SUMMON_SKELETONS);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SKELETONS, urand(10000, 30000));
|
||||
break;
|
||||
case EVENT_DELAYED_AGGRO_SAY:
|
||||
Talk(SAY_AGGRO);
|
||||
break;
|
||||
default:
|
||||
generic_boss_controllerAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,212 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
||||
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Talon_King_Ikiss
|
||||
SD%Complete: 80
|
||||
SDComment: Heroic supported. Some details missing, but most are spell related.
|
||||
SDCategory: Auchindoun, Sethekk Halls
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "sethekk_halls.h"
|
||||
|
||||
enum Says
|
||||
{
|
||||
SAY_INTRO = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_SLAY = 2,
|
||||
SAY_DEATH = 3,
|
||||
EMOTE_ARCANE_EXP = 4
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_BLINK = 38194,
|
||||
SPELL_BLINK_TELEPORT = 38203,
|
||||
SPELL_MANA_SHIELD = 38151,
|
||||
SPELL_ARCANE_BUBBLE = 9438,
|
||||
H_SPELL_SLOW = 35032,
|
||||
SPELL_POLYMORPH = 38245,
|
||||
H_SPELL_POLYMORPH = 43309,
|
||||
SPELL_ARCANE_VOLLEY = 35059,
|
||||
H_SPELL_ARCANE_VOLLEY = 40424,
|
||||
SPELL_ARCANE_EXPLOSION = 38197,
|
||||
H_SPELL_ARCANE_EXPLOSION = 40425
|
||||
};
|
||||
|
||||
class boss_talon_king_ikiss : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_talon_king_ikiss() : CreatureScript("boss_talon_king_ikiss") { }
|
||||
|
||||
struct boss_talon_king_ikissAI : public BossAI
|
||||
{
|
||||
boss_talon_king_ikissAI(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
ArcaneVolley_Timer = 5000;
|
||||
Sheep_Timer = 8000;
|
||||
Blink_Timer = 35000;
|
||||
Slow_Timer = 15000 + rand32() % 15000;
|
||||
Blink = false;
|
||||
Intro = false;
|
||||
ManaShield = false;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!me->GetVictim() && me->CanCreatureAttack(who))
|
||||
{
|
||||
if (!Intro && me->IsWithinDistInMap(who, 100))
|
||||
{
|
||||
Intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
if (!me->CanFly() && me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
|
||||
return;
|
||||
|
||||
float attackRadius = me->GetAttackDistance(who);
|
||||
if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
|
||||
{
|
||||
//who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
|
||||
AttackStart(who);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (Blink)
|
||||
{
|
||||
DoCast(me, SPELL_ARCANE_EXPLOSION);
|
||||
DoCast(me, SPELL_ARCANE_BUBBLE, true);
|
||||
Blink = false;
|
||||
}
|
||||
|
||||
if (ArcaneVolley_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_ARCANE_VOLLEY);
|
||||
ArcaneVolley_Timer = 7000 + rand32() % 5000;
|
||||
} else ArcaneVolley_Timer -= diff;
|
||||
|
||||
if (Sheep_Timer <= diff)
|
||||
{
|
||||
Unit* target;
|
||||
|
||||
//second top aggro target in normal, random target in heroic correct?
|
||||
if (IsHeroic())
|
||||
target = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
else
|
||||
target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
|
||||
|
||||
if (target)
|
||||
DoCast(target, SPELL_POLYMORPH);
|
||||
Sheep_Timer = 15000 + rand32() % 2500;
|
||||
} else Sheep_Timer -= diff;
|
||||
|
||||
//may not be correct time to cast
|
||||
if (!ManaShield && HealthBelowPct(20))
|
||||
{
|
||||
DoCast(me, SPELL_MANA_SHIELD);
|
||||
ManaShield = true;
|
||||
}
|
||||
|
||||
if (IsHeroic())
|
||||
{
|
||||
if (Slow_Timer <= diff)
|
||||
{
|
||||
DoCast(me, H_SPELL_SLOW);
|
||||
Slow_Timer = 15000 + rand32() % 25000;
|
||||
} else Slow_Timer -= diff;
|
||||
}
|
||||
|
||||
if (Blink_Timer <= diff)
|
||||
{
|
||||
Talk(EMOTE_ARCANE_EXP);
|
||||
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
|
||||
//Spell doesn't work, but we use for visual effect at least
|
||||
DoCast(target, SPELL_BLINK);
|
||||
|
||||
float X = target->GetPositionX();
|
||||
float Y = target->GetPositionY();
|
||||
float Z = target->GetPositionZ();
|
||||
|
||||
DoTeleportTo(X, Y, Z);
|
||||
|
||||
DoCast(target, SPELL_BLINK_TELEPORT);
|
||||
Blink = true;
|
||||
}
|
||||
Blink_Timer = 35000 + rand32() % 5000;
|
||||
} else Blink_Timer -= diff;
|
||||
|
||||
if (!Blink)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
uint32 ArcaneVolley_Timer;
|
||||
uint32 Sheep_Timer;
|
||||
uint32 Blink_Timer;
|
||||
uint32 Slow_Timer;
|
||||
|
||||
bool ManaShield;
|
||||
bool Blink;
|
||||
bool Intro;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetSethekkHallsAI<boss_talon_king_ikissAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_talon_king_ikiss()
|
||||
{
|
||||
new boss_talon_king_ikiss();
|
||||
}
|
||||
@@ -0,0 +1,211 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellScript.h"
|
||||
#include "sethekk_halls.h"
|
||||
|
||||
enum Says
|
||||
{
|
||||
SAY_INTRO = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_SLAY = 2,
|
||||
SAY_DEATH = 3,
|
||||
EMOTE_ARCANE_EXPLOSION = 4
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_BLINK = 38194,
|
||||
SPELL_BLINK_TELEPORT = 38203,
|
||||
SPELL_MANA_SHIELD = 38151,
|
||||
SPELL_ARCANE_BUBBLE = 9438,
|
||||
SPELL_SLOW = 35032,
|
||||
SPELL_POLYMORPH = 38245,
|
||||
SPELL_ARCANE_VOLLEY = 35059,
|
||||
SPELL_ARCANE_EXPLOSION = 38197,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_POLYMORPH = 1,
|
||||
EVENT_BLINK,
|
||||
EVENT_SLOW,
|
||||
EVENT_ARCANE_VOLLEY,
|
||||
EVENT_ARCANE_EXPLOSION
|
||||
};
|
||||
|
||||
class boss_talon_king_ikiss : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_talon_king_ikiss() : CreatureScript("boss_talon_king_ikiss") { }
|
||||
|
||||
struct boss_talon_king_ikissAI : public BossAI
|
||||
{
|
||||
boss_talon_king_ikissAI(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS)
|
||||
{
|
||||
Intro = false;
|
||||
ManaShield = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Intro = false;
|
||||
ManaShield = false;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!Intro && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f))
|
||||
{
|
||||
Intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 5000);
|
||||
events.ScheduleEvent(EVENT_POLYMORPH, 8000);
|
||||
events.ScheduleEvent(EVENT_BLINK, 35000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SLOW, urand(15000, 30000));
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_POLYMORPH:
|
||||
// Second top aggro in normal, random target in heroic.
|
||||
if (IsHeroic())
|
||||
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_POLYMORPH);
|
||||
else
|
||||
DoCast(SelectTarget(SELECT_TARGET_TOPAGGRO, 1), SPELL_POLYMORPH);
|
||||
events.ScheduleEvent(EVENT_POLYMORPH, urand(15000, 17500));
|
||||
break;
|
||||
case EVENT_ARCANE_VOLLEY:
|
||||
DoCast(me, SPELL_ARCANE_VOLLEY);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, urand(7000, 12000));
|
||||
break;
|
||||
case EVENT_SLOW:
|
||||
DoCast(me, SPELL_SLOW);
|
||||
events.ScheduleEvent(EVENT_SLOW, urand(15000, 40000));
|
||||
break;
|
||||
case EVENT_BLINK:
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
Talk(EMOTE_ARCANE_EXPLOSION);
|
||||
DoCastAOE(SPELL_BLINK);
|
||||
events.ScheduleEvent(EVENT_BLINK, urand(35000, 40000));
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 1000);
|
||||
break;
|
||||
case EVENT_ARCANE_EXPLOSION:
|
||||
DoCast(me, SPELL_ARCANE_EXPLOSION);
|
||||
DoCast(me, SPELL_ARCANE_BUBBLE, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*who*/, uint32& damage) override
|
||||
{
|
||||
if (!ManaShield && me->HealthBelowPctDamaged(20, damage))
|
||||
{
|
||||
DoCast(me, SPELL_MANA_SHIELD);
|
||||
ManaShield = true;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
private:
|
||||
bool ManaShield;
|
||||
bool Intro;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetSethekkHallsAI<boss_talon_king_ikissAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
// 38194 - Blink
|
||||
class spell_talon_king_ikiss_blink : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_talon_king_ikiss_blink() : SpellScriptLoader("spell_talon_king_ikiss_blink") { }
|
||||
|
||||
class spell_talon_king_ikiss_blink_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_talon_king_ikiss_blink_SpellScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_BLINK_TELEPORT))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
|
||||
targets.clear();
|
||||
targets.push_back(target);
|
||||
}
|
||||
|
||||
void HandleDummyHitTarget(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetCaster(), SPELL_BLINK_TELEPORT, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_talon_king_ikiss_blink_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_talon_king_ikiss_blink_SpellScript::HandleDummyHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_talon_king_ikiss_blink_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_talon_king_ikiss()
|
||||
{
|
||||
new boss_talon_king_ikiss();
|
||||
new spell_talon_king_ikiss_blink();
|
||||
}
|
||||
@@ -88,7 +88,7 @@ set(scripts_STAT_SRCS
|
||||
Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp
|
||||
Outland/Auchindoun/ManaTombs/mana_tombs.h
|
||||
Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
|
||||
Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp
|
||||
Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
|
||||
Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
|
||||
Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
|
||||
Outland/Auchindoun/SethekkHalls/sethekk_halls.h
|
||||
|
||||
@@ -19,12 +19,11 @@
|
||||
/* ScriptData
|
||||
SDName: Nagrand
|
||||
SD%Complete: 90
|
||||
SDComment: Quest support: 9868, 9874, 10044, 10172, 10085. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text)
|
||||
SDComment: Quest support: 9868, 9874, 10085. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text)
|
||||
SDCategory: Nagrand
|
||||
EndScriptData */
|
||||
|
||||
/* ContentData
|
||||
npc_greatmother_geyah
|
||||
npc_maghar_captive
|
||||
npc_creditmarker_visit_with_ancestors
|
||||
EndContentData */
|
||||
@@ -36,114 +35,6 @@ EndContentData */
|
||||
#include "SpellInfo.h"
|
||||
|
||||
/*######
|
||||
## npc_greatmother_geyah
|
||||
######*/
|
||||
|
||||
#define GOSSIP_HGG1 "Hello, Greatmother. Garrosh told me that you wanted to speak with me."
|
||||
#define GOSSIP_HGG2 "Garrosh is beyond redemption, Greatmother. I fear that in helping the Mag'har, I have convinced Garrosh that he is unfit to lead."
|
||||
|
||||
#define GOSSIP_SGG1 "You raised all of the orcs here, Greatmother?"
|
||||
#define GOSSIP_SGG2 "Do you believe that?"
|
||||
#define GOSSIP_SGG3 "What can be done? I have tried many different things. I have done my best to help the people of Nagrand. Each time I have approached Garrosh, he has dismissed me."
|
||||
#define GOSSIP_SGG4 "Left? How can you choose to leave?"
|
||||
#define GOSSIP_SGG5 "What is this duty?"
|
||||
#define GOSSIP_SGG6 "Is there anything I can do for you, Greatmother?"
|
||||
#define GOSSIP_SGG7 "I have done all that I could, Greatmother. I thank you for your kind words."
|
||||
#define GOSSIP_SGG8 "Greatmother, you are the mother of Durotan?"
|
||||
#define GOSSIP_SGG9 "Greatmother, I never had the honor. Durotan died long before my time, but his heroics are known to all on my world. The orcs of Azeroth reside in a place known as Durotar, named after your son. And ... (You take a moment to breathe and think through what you are about to tell the Greatmother.)"
|
||||
#define GOSSIP_SGG10 "It is my Warchief, Greatmother. The leader of my people. From my world. He ... He is the son of Durotan. He is your grandchild."
|
||||
#define GOSSIP_SGG11 "I will return to Azeroth at once, Greatmother."
|
||||
|
||||
//all the textId's for the below is unknown, but i do believe the gossip item texts are proper.
|
||||
class npc_greatmother_geyah : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_greatmother_geyah() : CreatureScript("npc_greatmother_geyah") { }
|
||||
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
|
||||
{
|
||||
player->PlayerTalkClass->ClearMenus();
|
||||
switch (action)
|
||||
{
|
||||
case GOSSIP_ACTION_INFO_DEF + 1:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 2:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 3:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 4:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 5:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 6:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 7:
|
||||
player->AreaExploredOrEventHappens(10044);
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 10:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 11:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 12:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 13:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 14:
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
break;
|
||||
case GOSSIP_ACTION_INFO_DEF + 15:
|
||||
player->AreaExploredOrEventHappens(10172);
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature) override
|
||||
{
|
||||
if (creature->IsQuestGiver())
|
||||
player->PrepareQuestMenu(creature->GetGUID());
|
||||
|
||||
if (player->GetQuestStatus(10044) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HGG1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
}
|
||||
else if (player->GetQuestStatus(10172) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HGG2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
}
|
||||
else
|
||||
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/*#####
|
||||
## npc_maghar_captive
|
||||
#####*/
|
||||
|
||||
@@ -714,7 +605,6 @@ class go_warmaul_prison : public GameObjectScript
|
||||
|
||||
void AddSC_nagrand()
|
||||
{
|
||||
new npc_greatmother_geyah();
|
||||
new npc_maghar_captive();
|
||||
new npc_creditmarker_visit_with_ancestors();
|
||||
new npc_corki();
|
||||
|
||||
@@ -178,6 +178,12 @@ public:
|
||||
npc_cooshcooshAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
m_uiNormFaction = creature->getFaction();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
LightningBolt_Timer = 2000;
|
||||
}
|
||||
|
||||
uint32 m_uiNormFaction;
|
||||
@@ -185,7 +191,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
LightningBolt_Timer = 2000;
|
||||
Initialize();
|
||||
if (me->getFaction() != m_uiNormFaction)
|
||||
me->setFaction(m_uiNormFaction);
|
||||
}
|
||||
|
||||
@@ -43,12 +43,20 @@ class npc_pet_dk_ebon_gargoyle : public CreatureScript
|
||||
|
||||
struct npc_pet_dk_ebon_gargoyleAI : CasterAI
|
||||
{
|
||||
npc_pet_dk_ebon_gargoyleAI(Creature* creature) : CasterAI(creature) { }
|
||||
npc_pet_dk_ebon_gargoyleAI(Creature* creature) : CasterAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
void Initialize()
|
||||
{
|
||||
// Not needed to be despawned now
|
||||
_despawnTimer = 0;
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
Initialize();
|
||||
|
||||
CasterAI::InitializeAI();
|
||||
uint64 ownerGuid = me->GetOwnerGUID();
|
||||
|
||||
@@ -39,11 +39,19 @@ class npc_pet_gen_mojo : public CreatureScript
|
||||
|
||||
struct npc_pet_gen_mojoAI : public ScriptedAI
|
||||
{
|
||||
npc_pet_gen_mojoAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_pet_gen_mojoAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_victimGUID = 0;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_victimGUID = 0;
|
||||
Initialize();
|
||||
|
||||
if (Unit* owner = me->GetOwner())
|
||||
me->GetMotionMaster()->MoveFollow(owner, 0.0f, 0.0f);
|
||||
|
||||
@@ -42,13 +42,22 @@ class npc_pet_hunter_snake_trap : public CreatureScript
|
||||
|
||||
struct npc_pet_hunter_snake_trapAI : public ScriptedAI
|
||||
{
|
||||
npc_pet_hunter_snake_trapAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_pet_hunter_snake_trapAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_spellTimer = 0;
|
||||
_isViper = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_spellTimer = 0;
|
||||
Initialize();
|
||||
|
||||
CreatureTemplate const* Info = me->GetCreatureTemplate();
|
||||
|
||||
|
||||
@@ -170,11 +170,17 @@ class npc_dream_fog : public CreatureScript
|
||||
{
|
||||
npc_dream_fogAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_roamTimer = 0;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_roamTimer = 0;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -247,11 +253,17 @@ class boss_ysondre : public CreatureScript
|
||||
{
|
||||
boss_ysondreAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_stage = 1;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_stage = 1;
|
||||
Initialize();
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 12000);
|
||||
}
|
||||
@@ -335,11 +347,17 @@ class boss_lethon : public CreatureScript
|
||||
{
|
||||
boss_lethonAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_stage = 1;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_stage = 1;
|
||||
Initialize();
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_WHIRL, 10000);
|
||||
}
|
||||
@@ -457,11 +475,17 @@ class boss_emeriss : public CreatureScript
|
||||
{
|
||||
boss_emerissAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_stage = 1;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_stage = 1;
|
||||
Initialize();
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 12000);
|
||||
}
|
||||
@@ -549,16 +573,22 @@ class boss_taerar : public CreatureScript
|
||||
{
|
||||
boss_taerarAI(Creature* creature) : emerald_dragonAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_stage = 1;
|
||||
_shades = 0;
|
||||
_banished = false;
|
||||
_banishedTimer = 0;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_SHADE);
|
||||
_stage = 1;
|
||||
|
||||
_shades = 0;
|
||||
_banished = false;
|
||||
_banishedTimer = 0;
|
||||
|
||||
Initialize();
|
||||
|
||||
emerald_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000);
|
||||
|
||||
@@ -54,14 +54,22 @@ public:
|
||||
|
||||
struct guard_genericAI : public GuardAI
|
||||
{
|
||||
guard_genericAI(Creature* creature) : GuardAI(creature) { }
|
||||
guard_genericAI(Creature* creature) : GuardAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void Initialize()
|
||||
{
|
||||
globalCooldown = 0;
|
||||
buffTimer = 0;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who) override
|
||||
{
|
||||
if (me->GetEntry() == NPC_CENARION_HOLD_INFANTRY)
|
||||
@@ -263,9 +271,12 @@ public:
|
||||
|
||||
struct guard_shattrath_scryerAI : public GuardAI
|
||||
{
|
||||
guard_shattrath_scryerAI(Creature* creature) : GuardAI(creature) { }
|
||||
guard_shattrath_scryerAI(Creature* creature) : GuardAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void Initialize()
|
||||
{
|
||||
banishTimer = 5000;
|
||||
exileTimer = 8500;
|
||||
@@ -273,6 +284,11 @@ public:
|
||||
canTeleport = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
@@ -328,9 +344,12 @@ public:
|
||||
|
||||
struct guard_shattrath_aldorAI : public GuardAI
|
||||
{
|
||||
guard_shattrath_aldorAI(Creature* creature) : GuardAI(creature) { }
|
||||
guard_shattrath_aldorAI(Creature* creature) : GuardAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
void Initialize()
|
||||
{
|
||||
banishTimer = 5000;
|
||||
exileTimer = 8500;
|
||||
@@ -338,6 +357,11 @@ public:
|
||||
canTeleport = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
|
||||
@@ -36,7 +36,17 @@ public:
|
||||
|
||||
struct generic_creatureAI : public ScriptedAI
|
||||
{
|
||||
generic_creatureAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
generic_creatureAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
GlobalCooldown = 0;
|
||||
BuffTimer = 0; //Rebuff as soon as we can
|
||||
IsSelfRooted = false;
|
||||
}
|
||||
|
||||
uint32 GlobalCooldown; //This variable acts like the global cooldown that players have (1.5 seconds)
|
||||
uint32 BuffTimer; //This variable keeps track of buffs
|
||||
@@ -44,9 +54,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
GlobalCooldown = 0;
|
||||
BuffTimer = 0; //Rebuff as soon as we can
|
||||
IsSelfRooted = false;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who) override
|
||||
|
||||
@@ -329,13 +329,21 @@ public:
|
||||
|
||||
struct npc_chicken_cluckAI : public ScriptedAI
|
||||
{
|
||||
npc_chicken_cluckAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_chicken_cluckAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ResetFlagTimer = 120000;
|
||||
}
|
||||
|
||||
uint32 ResetFlagTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ResetFlagTimer = 120000;
|
||||
Initialize();
|
||||
me->setFaction(FACTION_CHICKEN);
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
|
||||
}
|
||||
@@ -424,15 +432,23 @@ public:
|
||||
|
||||
struct npc_dancing_flamesAI : public ScriptedAI
|
||||
{
|
||||
npc_dancing_flamesAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_dancing_flamesAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
Active = true;
|
||||
CanIteract = 3500;
|
||||
}
|
||||
|
||||
bool Active;
|
||||
uint32 CanIteract;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Active = true;
|
||||
CanIteract = 3500;
|
||||
Initialize();
|
||||
DoCast(me, SPELL_BRAZIER, true);
|
||||
DoCast(me, SPELL_FIERY_AURA, false);
|
||||
float x, y, z;
|
||||
@@ -569,7 +585,25 @@ public:
|
||||
|
||||
struct npc_doctorAI : public ScriptedAI
|
||||
{
|
||||
npc_doctorAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_doctorAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
PlayerGUID = 0;
|
||||
|
||||
SummonPatientTimer = 10000;
|
||||
SummonPatientCount = 0;
|
||||
PatientDiedCount = 0;
|
||||
PatientSavedCount = 0;
|
||||
|
||||
Patients.clear();
|
||||
Coordinates.clear();
|
||||
|
||||
Event = false;
|
||||
}
|
||||
|
||||
uint64 PlayerGUID;
|
||||
|
||||
@@ -585,18 +619,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
PlayerGUID = 0;
|
||||
|
||||
SummonPatientTimer = 10000;
|
||||
SummonPatientCount = 0;
|
||||
PatientDiedCount = 0;
|
||||
PatientSavedCount = 0;
|
||||
|
||||
Patients.clear();
|
||||
Coordinates.clear();
|
||||
|
||||
Event = false;
|
||||
|
||||
Initialize();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
@@ -714,15 +737,23 @@ public:
|
||||
|
||||
struct npc_injured_patientAI : public ScriptedAI
|
||||
{
|
||||
npc_injured_patientAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_injured_patientAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
DoctorGUID = 0;
|
||||
Coord = NULL;
|
||||
}
|
||||
|
||||
uint64 DoctorGUID;
|
||||
Location* Coord;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
DoctorGUID = 0;
|
||||
Coord = NULL;
|
||||
Initialize();
|
||||
|
||||
//no select
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
@@ -1447,14 +1478,20 @@ public:
|
||||
{
|
||||
npc_tonk_mineAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
ExplosionTimer = 3000;
|
||||
}
|
||||
|
||||
uint32 ExplosionTimer;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
ExplosionTimer = 3000;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override { }
|
||||
@@ -1649,11 +1686,19 @@ class npc_wormhole : public CreatureScript
|
||||
|
||||
struct npc_wormholeAI : public PassiveAI
|
||||
{
|
||||
npc_wormholeAI(Creature* creature) : PassiveAI(creature) { }
|
||||
npc_wormholeAI(Creature* creature) : PassiveAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
_showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though
|
||||
Initialize();
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const override
|
||||
@@ -2303,7 +2348,19 @@ public:
|
||||
|
||||
struct npc_spring_rabbitAI : public ScriptedAI
|
||||
{
|
||||
npc_spring_rabbitAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
npc_spring_rabbitAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
inLove = false;
|
||||
rabbitGUID = 0;
|
||||
jumpTimer = urand(5000, 10000);
|
||||
bunnyTimer = urand(10000, 20000);
|
||||
searchTimer = urand(5000, 10000);
|
||||
}
|
||||
|
||||
bool inLove;
|
||||
uint32 jumpTimer;
|
||||
@@ -2313,11 +2370,7 @@ public:
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
inLove = false;
|
||||
rabbitGUID = 0;
|
||||
jumpTimer = urand(5000, 10000);
|
||||
bunnyTimer = urand(10000, 20000);
|
||||
searchTimer = urand(5000, 10000);
|
||||
Initialize();
|
||||
if (Unit* owner = me->GetOwner())
|
||||
me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user