diff options
author | DDuarte <dnpd.dd@gmail.com> | 2014-09-01 19:13:29 +0100 |
---|---|---|
committer | DDuarte <dnpd.dd@gmail.com> | 2014-09-01 19:13:29 +0100 |
commit | c19fcec81486493cf997f1266bfc3e1713d12051 (patch) | |
tree | 211f96fd898e0e5a2b6028fbec0ea138c146076d /src | |
parent | b6493c01ef4bbf445a841231d935f7fca3f01b76 (diff) | |
parent | 5ca5a75d21ba6f79c9c83d1e1b6a84da88f65dc0 (diff) |
Merge remote-tracking branch 'origin/master' into 4.3.4
Diffstat (limited to 'src')
54 files changed, 1596 insertions, 1088 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 4fc84906df8..7e7aacd942a 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -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; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index f16ab30567f..bbbecd1d474 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -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) { diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index f9f5269e485..89f1f8f204c 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -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; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 4b6e4dc2ee7..49e84d26d60 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -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() diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 477eb3649b7..470eb27bad2 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -245,7 +245,7 @@ public: return false; } - if (!groupSource->IsFull()) + if (groupSource->IsFull()) { handler->PSendSysMessage(LANG_GROUP_FULL); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 43afea1b381..14a68d1fdae 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -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; + char* delayStr = strtok((char*)args, " "); + if (!delayStr || !isNumeric(delayStr)) + return false; + + char* exitCodeStr = nullptr; - if (!std::regex_match(args, cm, regex)) + if (strlen(args) > 255) return false; - std::string delayStr = cm[1]; - std::string exitCodeStr = cm[2]; - std::string reason = cm[3]; + 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.c_str()); + 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; } diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp index 6f8b93bbdba..a9fc95fdb14 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 52a05f6c0a3..8bc969e9020 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -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(); } diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp index 4ecb57177a6..49c5a61b7d0 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp index 9e4fc5838ad..e422975bd1a 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp index 076607a5672..1eabfb67f57 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 907aaed3a0d..51ca327738b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -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 { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - - EventPhase = 0; - Event_Timer = 1000; - - MobCount = 0; - MobDeath_Timer = 0; + Initialize(); - for (uint8 i = 0; i < MAX_NPC_AMOUNT; ++i) - RingMobGUID[i] = 0; - - RingBossGUID = 0; - - CanWalk = false; + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } /// @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) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp index 83464c12230..77a8c68d28e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp @@ -157,12 +157,18 @@ class boss_doomrel : public CreatureScript { boss_doomrelAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); _instance = creature->GetInstanceScript(); } - void Reset() override + void Initialize() { _voidwalkers = false; + } + + void Reset() override + { + Initialize(); me->setFaction(FACTION_FRIEND); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp index ed62e26075c..ea92aa91b69 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp @@ -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); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp index d5f7a4ce34b..b85cf4611ac 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp index 23593442e86..bc1bdca1f61 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp @@ -46,15 +46,23 @@ 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 Reset() override + void Initialize() { - _Reset(); frenzy40 = false; frenzy15 = false; } + void Reset() override + { + _Reset(); + Initialize(); + } + void EnterCombat(Unit* /*who*/) override { _EnterCombat(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp index cc6911b5da7..4b4633d54ca 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index efe0a0e2a78..1a97f668558 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index bba98839fef..2793a6a0510 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -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 Reset() override + void Initialize() { SpawnedAdds = 0; + } + + void Reset() override + { + 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; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 8d4a84197b1..b83cc4694ab 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -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); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index 6e55f9d41fb..49e6faa340b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp index 2a1309dc097..a268890c25d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp index f9757997731..c8b33e48852 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 6eafb41a8fa..4a0e22b1ba8 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -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); } diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp index ffb3c02d101..b0222413513 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp @@ -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); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp index 9fe21313f71..f469bf6deb1 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp @@ -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); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index 5d1e5451ab1..bbddf0aa5f5 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -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); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 6ff1faf35b6..5b4f25aea44 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -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(); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp index ac24f868670..a928413fea0 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp @@ -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(); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index af9f8b72abf..9084a6b0371 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -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); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index 518c4eacbd9..c09b349f143 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -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); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 6a89adca967..c66f2b335c4 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -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 { } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 911d4e35797..d27caea573e 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -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); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index 19ec8da7fc9..ce8223c90cf 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index c89950b7de3..c37829e26d5 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -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) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index 7944011c7a0..1aafb32cef9 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -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 { } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 40dedcf6d93..cc2af3dcea5 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -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(); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index 28f4800b6cf..a20f595183f 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -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) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 1f0a58c4cf2..03ca73fed1f 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 8e3743ad5e2..08e3de1941a 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -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); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp index 8e619864201..c6a91e3ff33 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp @@ -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, - - // 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 + // 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. + }; enum Spells @@ -48,175 +42,189 @@ 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, }; -class SkarvaldChargePredicate +enum Events { - public: - SkarvaldChargePredicate(Unit* unit) : me(unit) { } - - bool operator() (WorldObject* object) const - { - return object->GetDistance2d(me) >= 5.0f && object->GetDistance2d(me) <= 30.0f; - } + // 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 +}; - private: - Unit* me; +enum Actions +{ + ACTION_OTHER_JUST_DIED = 1, + ACTION_DESPAWN_SUMMONS = 2 // Only needed to clear off the ghosts when the second boss dies. }; -class boss_skarvald_the_constructor : public CreatureScript +class SkarvaldChargePredicate { public: - boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { } + SkarvaldChargePredicate(Unit* unit) : _me(unit) { } - struct boss_skarvald_the_constructorAI : public BossAI + bool operator() (WorldObject* target) const { - boss_skarvald_the_constructorAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { } + return target->GetDistance2d(_me) >= 5.0f && target->GetDistance2d(_me) <= 30.0f; + } - bool ghost; - uint32 Charge_Timer; - uint32 StoneStrike_Timer; - uint32 Response_Timer; - uint32 Check_Timer; - bool Dalronn_isDead; - bool Enraged; + private: + Unit* _me; +}; - void Reset() override - { - Charge_Timer = 5000; - StoneStrike_Timer = 10000; - Dalronn_isDead = false; - Response_Timer = 0; - Check_Timer = 5000; - Enraged = false; +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; + } - ghost = me->GetEntry() == NPC_SKARVALD_GHOST; - if (!ghost) - _Reset(); - } + 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 + 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()) { - if (!ghost) - { - _EnterCombat(); - Talk(YELL_SKARVALD_AGGRO); - } + 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); } - - void DamageTaken(Unit* /*attacker*/, uint32& damage) override + else { - if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage)) - { - Enraged = true; - DoCast(me, SPELL_ENRAGE); - } + Talk(SAY_DEATH); + otherBoss->AI()->DoAction(ACTION_DESPAWN_SUMMONS); + _JustDied(); } + } + } - void DoAction(int32 /*actionId*/) - { + 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); + } - void JustDied(Unit* killer) override + protected: + uint32 OtherBossData; + bool IsInGhostForm; +}; + +class boss_skarvald_the_constructor : public CreatureScript +{ + public: + boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { } + + struct boss_skarvald_the_constructorAI : public generic_boss_controllerAI + { + boss_skarvald_the_constructorAI(Creature* creature) : generic_boss_controllerAI(creature) { - 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); - } - } - } + OtherBossData = DATA_DALRONN; + Enraged = false; } - void KilledUnit(Unit* who) override + void Reset() override { - if (!ghost && who->GetTypeId() == TYPEID_PLAYER) - Talk(YELL_SKARVALD_KILL); + Enraged = false; + generic_boss_controllerAI::Reset(); } - void UpdateAI(uint32 diff) override + void EnterCombat(Unit* who) override { - if (!UpdateVictim()) - return; + generic_boss_controllerAI::EnterCombat(who); - 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 (!IsInGhostForm) + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SKARVALD_CHARGE, 5000); + events.ScheduleEvent(EVENT_STONE_STRIKE, 10000); + } - if (Charge_Timer <= diff) + void ExecuteEvent(uint32 eventId) override + { + switch (eventId) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me))) - DoCast(target, SPELL_CHARGE); - Charge_Timer = 5000 + rand32() % 5000; + 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; } - else - Charge_Timer -= diff; + } - if (StoneStrike_Timer <= diff) + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (!Enraged && !IsInGhostForm && me->HealthBelowPctDamaged(15, damage)) { - DoCastVictim(SPELL_STONE_STRIKE); - StoneStrike_Timer = 5000 + rand32() % 5000; + Enraged = true; + DoCast(me, SPELL_ENRAGE); } - 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); - } - } - } - } + if (!IsInGhostForm) + events.ScheduleEvent(EVENT_DELAYED_AGGRO_SAY, 5000); - void KilledUnit(Unit* who) override - { - if (!ghost && who->GetTypeId() == TYPEID_PLAYER) - Talk(YELL_DALRONN_KILL); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 10000); } - void UpdateAI(uint32 diff) override + void ExecuteEvent(uint32 eventId) override { - if (!UpdateVictim()) - return; - - if (AggroYell_Timer) + switch (eventId) { - 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)) + case EVENT_SHADOW_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.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)) + 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); - Debilitate_Timer = 5000 + rand32() % 5000; - } - } - else - Debilitate_Timer -= diff; - - 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_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; } - - DoMeleeAttackIfReady(); } }; diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp deleted file mode 100644 index 9cb7505c015..00000000000 --- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_tailonking_ikiss.cpp +++ /dev/null @@ -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(); -} diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp new file mode 100644 index 00000000000..22914ca9094 --- /dev/null +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp @@ -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(); +} diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt index 0c69a236ef8..ffc9b514abf 100644 --- a/src/server/scripts/Outland/CMakeLists.txt +++ b/src/server/scripts/Outland/CMakeLists.txt @@ -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 diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp index f32d2516ee0..a8a99d757e7 100644 --- a/src/server/scripts/Outland/zone_nagrand.cpp +++ b/src/server/scripts/Outland/zone_nagrand.cpp @@ -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(); diff --git a/src/server/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp index b9736c523c3..c7627d1aa04 100644 --- a/src/server/scripts/Outland/zone_zangarmarsh.cpp +++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp @@ -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); } diff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp index 34da2a242f4..b24336cb33c 100644 --- a/src/server/scripts/Pet/pet_dk.cpp +++ b/src/server/scripts/Pet/pet_dk.cpp @@ -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(); diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index cfb4820c040..d0e950dec32 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -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 Reset() override + void Initialize() { _victimGUID = 0; + } + + void Reset() override + { + Initialize(); if (Unit* owner = me->GetOwner()) me->GetMotionMaster()->MoveFollow(owner, 0.0f, 0.0f); diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 8fd6cb54b0e..20412415fbe 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -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(); diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 950b4cd10e9..23e373312cb 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -170,13 +170,19 @@ class npc_dream_fog : public CreatureScript { npc_dream_fogAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); } - void Reset() override + void Initialize() { _roamTimer = 0; } + void Reset() override + { + Initialize(); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -247,11 +253,17 @@ class boss_ysondre : public CreatureScript { boss_ysondreAI(Creature* creature) : emerald_dragonAI(creature) { + Initialize(); } - void Reset() override + void Initialize() { _stage = 1; + } + + void Reset() override + { + 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 Reset() override + void Initialize() { _stage = 1; + } + + void Reset() override + { + 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 Reset() override + void Initialize() { _stage = 1; + } + + void Reset() override + { + 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 Reset() override + void Initialize() { - me->RemoveAurasDueToSpell(SPELL_SHADE); _stage = 1; - _shades = 0; _banished = false; _banishedTimer = 0; + } + + void Reset() override + { + me->RemoveAurasDueToSpell(SPELL_SHADE); + + Initialize(); emerald_dragonAI::Reset(); events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000); diff --git a/src/server/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp index a156a41fcef..bd953a285ab 100644 --- a/src/server/scripts/World/guards.cpp +++ b/src/server/scripts/World/guards.cpp @@ -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()) diff --git a/src/server/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp index a27a78a5338..eb6fbea170e 100644 --- a/src/server/scripts/World/mob_generic_creature.cpp +++ b/src/server/scripts/World/mob_generic_creature.cpp @@ -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 diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index aa289e82698..ea90c13f747 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -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,13 +1686,21 @@ class npc_wormhole : public CreatureScript struct npc_wormholeAI : public PassiveAI { - npc_wormholeAI(Creature* creature) : PassiveAI(creature) { } + npc_wormholeAI(Creature* creature) : PassiveAI(creature) + { + Initialize(); + } - void InitializeAI() override + void Initialize() { _showUnderground = urand(0, 100) == 0; // Guessed value, it is really rare though } + void InitializeAI() override + { + Initialize(); + } + uint32 GetData(uint32 type) const override { return (type == DATA_SHOW_UNDERGROUND && _showUnderground) ? 1 : 0; @@ -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); } diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp index 692939cf288..1d4a9c060ea 100644 --- a/src/tools/vmap4_extractor/model.cpp +++ b/src/tools/vmap4_extractor/model.cpp @@ -145,6 +145,7 @@ Vec3D fixCoordSystem2(Vec3D v) } ModelInstance::ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile) + : scale(0), flags(0) { float ff[3]; f.read(&id, 4); |