Merge remote-tracking branch 'origin/master' into 4.3.4

This commit is contained in:
DDuarte committed 2014-09-01 19:13:29 +01:00
commit c19fcec814
56 files changed
+1665 -1098

No files matched your search

@@ -76,6 +76,7 @@ Object::Object() : m_PackGUID(sizeof(uint64)+1)
{
m_objectTypeId = TYPEID_OBJECT;
m_objectType = TYPEMASK_OBJECT;
m_updateFlag = UPDATEFLAG_NONE;
m_uint32Values = NULL;
m_valuesCount = 0;
+11 -7
View File
@@ -7355,13 +7355,13 @@ void ObjectMgr::LoadNPCSpellClickSpells()
SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spellid);
if (!spellinfo)
{
TC_LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown spellid %u. Skipping entry.", spellid);
TC_LOG_ERROR("sql.sql", "Table npc_spellclick_spells creature: %u references unknown spellid %u. Skipping entry.", npc_entry, spellid);
continue;
}
uint8 userType = fields[3].GetUInt16();
if (userType >= SPELL_CLICK_USER_MAX)
TC_LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown user type %u. Skipping entry.", uint32(userType));
TC_LOG_ERROR("sql.sql", "Table npc_spellclick_spells creature: %u references unknown user type %u. Skipping entry.", npc_entry, uint32(userType));
uint8 castFlags = fields[2].GetUInt8();
SpellClickInfo info;
@@ -7423,7 +7423,7 @@ void ObjectMgr::DeleteCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_
cell_guids.corpses.erase(player_guid);
}
void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string const& table, bool starter, bool go)
void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReverse* reverseMap, std::string const& table, bool starter, bool go)
{
uint32 oldMSTime = getMSTime();
@@ -7456,7 +7456,11 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string const&
}
if (!poolId || !starter)
{
map.insert(QuestRelations::value_type(id, quest));
if (reverseMap)
reverseMap->insert(QuestRelationsReverse::value_type(quest, id));
}
else if (starter)
poolRelationMap->insert(PooledQuestRelation::value_type(quest, id));
@@ -7468,7 +7472,7 @@ void ObjectMgr::LoadQuestRelationsHelper(QuestRelations& map, std::string const&
void ObjectMgr::LoadGameobjectQuestStarters()
{
LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
LoadQuestRelationsHelper(_goQuestRelations, nullptr, "gameobject_queststarter", true, true);
for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
{
@@ -7482,7 +7486,7 @@ void ObjectMgr::LoadGameobjectQuestStarters()
void ObjectMgr::LoadGameobjectQuestEnders()
{
LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
LoadQuestRelationsHelper(_goQuestInvolvedRelations, &_goQuestInvolvedRelationsReverse, "gameobject_questender", false, true);
for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
{
@@ -7496,7 +7500,7 @@ void ObjectMgr::LoadGameobjectQuestEnders()
void ObjectMgr::LoadCreatureQuestStarters()
{
LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
LoadQuestRelationsHelper(_creatureQuestRelations, nullptr, "creature_queststarter", true, false);
for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
{
@@ -7510,7 +7514,7 @@ void ObjectMgr::LoadCreatureQuestStarters()
void ObjectMgr::LoadCreatureQuestEnders()
{
LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, &_creatureQuestInvolvedRelationsReverse, "creature_questender", false, false);
for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
{
+16 -2
View File
@@ -518,8 +518,10 @@ typedef std::unordered_map<int32, TrinityStringLocale> TrinityStringLocaleContai
typedef std::unordered_map<uint32, GossipMenuItemsLocale> GossipMenuItemsLocaleContainer;
typedef std::unordered_map<uint32, PointOfInterestLocale> PointOfInterestLocaleContainer;
typedef std::multimap<uint32, uint32> QuestRelations;
typedef std::multimap<uint32, uint32> QuestRelations; // unit/go -> quest
typedef std::multimap<uint32, uint32> QuestRelationsReverse; // quest -> unit/go
typedef std::pair<QuestRelations::const_iterator, QuestRelations::const_iterator> QuestRelationBounds;
typedef std::pair<QuestRelationsReverse::const_iterator, QuestRelationsReverse::const_iterator> QuestRelationReverseBounds;
struct PetLevelInfo
{
@@ -952,6 +954,11 @@ class ObjectMgr
return _goQuestInvolvedRelations.equal_range(go_entry);
}
QuestRelationReverseBounds GetGOQuestInvolvedRelationReverseBounds(uint32 questId)
{
return _goQuestInvolvedRelationsReverse.equal_range(questId);
}
QuestRelations* GetCreatureQuestRelationMap()
{
return &_creatureQuestRelations;
@@ -967,6 +974,11 @@ class ObjectMgr
return _creatureQuestInvolvedRelations.equal_range(creature_entry);
}
QuestRelationReverseBounds GetCreatureQuestInvolvedRelationReverseBounds(uint32 questId)
{
return _creatureQuestInvolvedRelationsReverse.equal_range(questId);
}
void LoadEventScripts();
void LoadSpellScripts();
void LoadWaypointScripts();
@@ -1397,8 +1409,10 @@ class ObjectMgr
QuestRelations _goQuestRelations;
QuestRelations _goQuestInvolvedRelations;
QuestRelationsReverse _goQuestInvolvedRelationsReverse;
QuestRelations _creatureQuestRelations;
QuestRelations _creatureQuestInvolvedRelations;
QuestRelationsReverse _creatureQuestInvolvedRelationsReverse;
//character reserved names
typedef std::set<std::wstring> ReservedNamesContainer;
@@ -1426,7 +1440,7 @@ class ObjectMgr
private:
void LoadScripts(ScriptsType type);
void CheckScripts(ScriptsType type, std::set<int32>& ids);
void LoadQuestRelationsHelper(QuestRelations& map, std::string const& table, bool starter, bool go);
void LoadQuestRelationsHelper(QuestRelations& map, QuestRelationsReverse* reverseMap, std::string const& table, bool starter, bool go);
void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count);
MailLevelRewardContainer _mailLevelRewardStore;
+1
View File
@@ -1016,6 +1016,7 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntry const** effe
Totem[i] = _totem ? _totem->Totem[i] : 0;
ChainEntry = NULL;
ExplicitTargetMask = 0;
}
SpellInfo::~SpellInfo()
+1 -1
View File
@@ -245,7 +245,7 @@ public:
return false;
}
if (!groupSource->IsFull())
if (groupSource->IsFull())
{
handler->PSendSysMessage(LANG_GROUP_FULL);
handler->SetSentErrorMessage(true);
+26 -14
View File
@@ -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
@@ -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)
@@ -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);
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
@@ -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);
}
@@ -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();
}
+1 -1
View File
@@ -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
+1 -111
View File
@@ -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);
}
+10 -2
View File
@@ -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();
+10 -2
View File
@@ -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);
+11 -2
View File
@@ -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);
+30 -6
View File
@@ -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
+83 -30
View File
@@ -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);
}