diff options
Diffstat (limited to 'src/server')
472 files changed, 6745 insertions, 7535 deletions
diff --git a/src/server/apps/authserver/Main.cpp b/src/server/apps/authserver/Main.cpp index b5fbb319a4..5295685de4 100644 --- a/src/server/apps/authserver/Main.cpp +++ b/src/server/apps/authserver/Main.cpp @@ -278,7 +278,8 @@ variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile) ("help,h", "print usage message") ("version,v", "print version build info") ("dry-run,d", "Dry run") - ("config,c", value<fs::path>(&configFile)->default_value(fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_REALM_CONFIG))), "use <arg> as configuration file"); + ("config,c", value<fs::path>(&configFile)->default_value(fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_REALM_CONFIG))), "use <arg> as configuration file") + ("config-policy", value<std::string>()->value_name("policy"), "override config severity policy (e.g. default=skip,critical_option=fatal)"); variables_map variablesMap; diff --git a/src/server/apps/worldserver/Main.cpp b/src/server/apps/worldserver/Main.cpp index bdc2f860f7..56d26bcae5 100644 --- a/src/server/apps/worldserver/Main.cpp +++ b/src/server/apps/worldserver/Main.cpp @@ -423,7 +423,7 @@ bool StartDB() MySQL::Library_Init(); // Load databases - DatabaseLoader loader("server.worldserver", DatabaseLoader::DATABASE_NONE, AC_MODULES_LIST); + DatabaseLoader loader("server.worldserver", DatabaseLoader::DATABASE_MASK_ALL, AC_MODULES_LIST); loader .AddDatabase(LoginDatabase, "Login") .AddDatabase(CharacterDatabase, "Character") @@ -433,7 +433,7 @@ bool StartDB() return false; ///- Get the realm Id from the configuration file - realm.Id.Realm = sConfigMgr->GetOption<uint32>("RealmID", 0); + realm.Id.Realm = sConfigMgr->GetOption<uint32>("RealmID", 1); if (!realm.Id.Realm) { LOG_ERROR("server.worldserver", "Realm ID not defined in configuration file"); @@ -710,7 +710,8 @@ variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile, [ ("help,h", "print usage message") ("version,v", "print version build info") ("dry-run,d", "Dry run") - ("config,c", value<fs::path>(&configFile)->default_value(fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_CORE_CONFIG))), "use <arg> as configuration file"); + ("config,c", value<fs::path>(&configFile)->default_value(fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_CORE_CONFIG))), "use <arg> as configuration file") + ("config-policy", value<std::string>()->value_name("policy"), "override config severity policy (e.g. default=skip,critical_option=fatal)"); #if AC_PLATFORM == AC_PLATFORM_WINDOWS options_description win("Windows platform specific options"); diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 89863ac4f9..07945f07f3 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -2351,6 +2351,18 @@ Rate.Reputation.LowLevel.Quest = 1 Rate.Reputation.RecruitAFriendBonus = 0.1 # +# Rate.Reputation.Gain.WSG +# Rate.Reputation.Gain.AB +# Rate.Reputation.Gain.AV +# Description: Reputation bonus rate for WSG, AB and AV battlegrounds. +# This is applied IN ADDITION to the global Rate.Reputation.Gain. +# Default: 1 + +Rate.Reputation.Gain.WSG = 1 +Rate.Reputation.Gain.AB = 1 +Rate.Reputation.Gain.AV = 1 + +# ################################################################################################### ################################################################################################### diff --git a/src/server/database/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp index 5ad77d35d6..32bbb107f5 100644 --- a/src/server/database/Database/DatabaseLoader.cpp +++ b/src/server/database/Database/DatabaseLoader.cpp @@ -24,6 +24,24 @@ #include <errmsg.h> #include <mysqld_error.h> #include <thread> +#include <string_view> +namespace +{ + std::string const EMPTY_DATABASE_INFO; + std::string const LOGIN_DATABASE_INFO_DEFAULT = "127.0.0.1;3306;acore;acore;acore_auth"; + std::string const WORLD_DATABASE_INFO_DEFAULT = "127.0.0.1;3306;acore;acore;acore_world"; + std::string const CHARACTER_DATABASE_INFO_DEFAULT = "127.0.0.1;3306;acore;acore;acore_characters"; + std::string const& GetDefaultDatabaseInfo(std::string_view name) + { + if (name == "Login") + return LOGIN_DATABASE_INFO_DEFAULT; + if (name == "World") + return WORLD_DATABASE_INFO_DEFAULT; + if (name == "Character") + return CHARACTER_DATABASE_INFO_DEFAULT; + return EMPTY_DATABASE_INFO; + } +} DatabaseLoader::DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask, std::string_view modulesList) : _logger(logger), @@ -38,7 +56,8 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool<T>& pool, std::st _open.push([this, name, updatesEnabledForThis, &pool]() -> bool { - std::string const dbString = sConfigMgr->GetOption<std::string>(name + "DatabaseInfo", ""); + std::string const& defaultDatabaseInfo = GetDefaultDatabaseInfo(name); + std::string const dbString = sConfigMgr->GetOption<std::string>(name + "DatabaseInfo", defaultDatabaseInfo); if (dbString.empty()) { LOG_ERROR(_logger, "Database {} not specified in configuration file!", name); diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 442b48bcb8..d32fddd8c1 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -496,17 +496,13 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos if (ssl == "ssl") args.emplace_back("--ssl-mode=REQUIRED"); - // Execute sql file - args.emplace_back("-e"); - args.emplace_back(Acore::StringFormat("BEGIN; SOURCE {}; COMMIT;", path.generic_string())); - // Database if (!database.empty()) args.emplace_back(database); // Invokes a mysql process which doesn't leak credentials to logs int const ret = Acore::StartProcess(DBUpdaterUtil::GetCorrectedMySQLExecutable(), args, - "sql.updates", "", true); + "sql.updates", path.generic_string(), true); if (ret != EXIT_SUCCESS) { diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp index 13609a9b56..0e932e56df 100644 --- a/src/server/game/AI/CoreAI/CombatAI.cpp +++ b/src/server/game/AI/CoreAI/CombatAI.cpp @@ -80,7 +80,7 @@ void CombatAI::JustEngagedWith(Unit* who) if (AISpellInfo[*i].condition == AICOND_AGGRO) me->CastSpell(who, *i, false); else if (AISpellInfo[*i].condition == AICOND_COMBAT) - events.ScheduleEvent(*i, AISpellInfo[*i].cooldown + rand() % AISpellInfo[*i].cooldown); + events.ScheduleEvent(*i, Milliseconds(AISpellInfo[*i].cooldown + rand() % AISpellInfo[*i].cooldown)); } } @@ -97,7 +97,7 @@ void CombatAI::UpdateAI(uint32 diff) if (uint32 spellId = events.ExecuteEvent()) { DoCast(spellId); - events.ScheduleEvent(spellId, AISpellInfo[spellId].cooldown + rand() % AISpellInfo[spellId].cooldown); + events.ScheduleEvent(spellId, Milliseconds(AISpellInfo[spellId].cooldown + rand() % AISpellInfo[spellId].cooldown)); } else DoMeleeAttackIfReady(); @@ -143,7 +143,7 @@ void CasterAI::JustEngagedWith(Unit* who) DoCast(spells[spell]); cooldown += me->GetCurrentSpellCastTime(*itr); } - events.ScheduleEvent(*itr, cooldown); + events.ScheduleEvent(*itr, Milliseconds(cooldown)); } } } @@ -168,7 +168,7 @@ void CasterAI::UpdateAI(uint32 diff) { DoCast(spellId); uint32 casttime = me->GetCurrentSpellCastTime(spellId); - events.ScheduleEvent(spellId, (casttime ? casttime : 500) + GetAISpellInfo(spellId)->realCooldown); + events.ScheduleEvent(spellId, Milliseconds((casttime ? casttime : 500) + GetAISpellInfo(spellId)->realCooldown)); } } diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index b366d3c2bd..80e034cf46 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -46,7 +46,7 @@ public: // Pass parameters between AI virtual void DoAction(int32 /*param = 0 */) {} - virtual void SetGUID(ObjectGuid /*guid*/, int32 /*id = 0 */) {} + virtual void SetGUID(ObjectGuid const& /*guid*/, int32 /*id = 0 */) {} virtual ObjectGuid GetGUID(int32 /*id = 0 */) const { return ObjectGuid::Empty; } static int32 Permissible(GameObject const* go); diff --git a/src/server/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp index 79b9045930..054758764e 100644 --- a/src/server/game/AI/CoreAI/TotemAI.cpp +++ b/src/server/game/AI/CoreAI/TotemAI.cpp @@ -135,6 +135,6 @@ void TotemAI::AttackStart(Unit* /*victim*/) data << me->GetGUID(); data << me->GetPositionX(); data << me->GetPositionY(); - me->GetOwner()->ToPlayer()->GetSession()->SendPacket(&data); + me->GetOwner()->ToPlayer()->SendDirectMessage(&data); } } diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 17533d4e4c..71cfe8d5b0 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -217,7 +217,7 @@ public: virtual void DoAction(int32 /*param*/) {} virtual uint32 GetData(uint32 /*id = 0*/) const { return 0; } virtual void SetData(uint32 /*id*/, uint32 /*value*/) {} - virtual void SetGUID(ObjectGuid /*guid*/, int32 /*id*/ = 0) {} + virtual void SetGUID(ObjectGuid const& /*guid*/, int32 /*id*/ = 0) {} virtual ObjectGuid GetGUID(int32 /*id*/ = 0) const { return ObjectGuid::Empty; } // Select the best target (in <targetType> order) from the threat list that fulfill the following: diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 12698c35dc..dce728c142 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -50,9 +50,9 @@ AISpellInfoType* GetAISpellInfo(uint32 i) { return &CreatureAI::AISpellInfo[i]; * @param WorldObject target The target of the speech, in case it has elements such as $n, where the target's name will be referrenced. * @param Milliseconds delay Delay until the creature says the text line. Creatures will talk immediately by default. */ -void CreatureAI::Talk(uint8 id, WorldObject const* target /*= nullptr*/, Milliseconds delay /*= 0s*/) +void CreatureAI::Talk(uint8 id, WorldObject const* target /*= nullptr*/, Milliseconds delay /*= 0ms*/) { - if (delay > Seconds::zero()) + if (delay > 0ms) { ObjectGuid targetGuid; @@ -182,7 +182,7 @@ void CreatureAI::MoveInLineOfSight(Unit* who) if (me->IsMoveInLineOfSightDisabled()) if (me->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET || // nothing more to do, return !who->IsInCombat() || // if not in combat, nothing more to do - !me->IsWithinDist(who, ATTACK_DISTANCE, true, false)) // if in combat and in dist - neutral to all can actually assist other creatures + !me->IsWithinDist(who, ATTACK_DISTANCE, true, false, false)) // if in combat and in dist - neutral to all can actually assist other creatures return; if (me->HasReactState(REACT_AGGRESSIVE) && me->CanStartAttack(who)) diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index cadd3b9f4c..72686bf6ab 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -94,7 +94,7 @@ public: EVADE_REASON_OTHER }; - void Talk(uint8 id, WorldObject const* whisperTarget = nullptr, Milliseconds delay = 0s); + void Talk(uint8 id, WorldObject const* whisperTarget = nullptr, Milliseconds delay = 0ms); void Talk(uint8 id, Milliseconds delay) { Talk(id, nullptr, delay); } WorldObject* GetSummoner() const; diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 30373f2f65..ca354f0938 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -68,7 +68,7 @@ void SummonList::DespawnEntry(uint32 entry) } } -void SummonList::DespawnAll(uint32 delay /*= 0*/) +void SummonList::DespawnAll(Milliseconds delay /*= 0ms*/) { while (!storage_.empty()) { @@ -325,13 +325,13 @@ void ScriptedAI::ScheduleTimedEvent(Milliseconds timerMin, Milliseconds timerMax return; } - scheduler.Schedule(timerMin == 0s ? timerMax : timerMin, timerMax, [exec, repeatMin, repeatMax, uniqueId](TaskContext context) + scheduler.Schedule(timerMin == 0ms ? timerMax : timerMin, timerMax, [exec, repeatMin, repeatMax, uniqueId](TaskContext context) { exec(); if (!uniqueId) { - repeatMax > 0s ? context.Repeat(repeatMin, repeatMax) : context.Repeat(repeatMin); + repeatMax > 0ms ? context.Repeat(repeatMin, repeatMax) : context.Repeat(repeatMin); } }); @@ -566,7 +566,7 @@ Player* ScriptedAI::SelectTargetFromPlayerList(float maxdist, uint32 excludeAura std::vector<Player*> tList; for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) { - if (!me->IsWithinDistInMap(itr->GetSource(), maxdist, true, false) || !itr->GetSource()->IsAlive() || itr->GetSource()->IsGameMaster()) + if (!me->IsWithinDistInMap(itr->GetSource(), maxdist, true, false, false) || !itr->GetSource()->IsAlive() || itr->GetSource()->IsGameMaster()) continue; if (excludeAura && itr->GetSource()->HasAura(excludeAura)) continue; @@ -654,7 +654,7 @@ void BossAI::_JustEngagedWith() ScheduleTasks(); if (callForHelpRange) { - ScheduleTimedEvent(0s, [&] + ScheduleTimedEvent(0ms, [&] { me->CallForHelp(callForHelpRange); }, 2s); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index f3d9e11a51..c5c71af9ff 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -88,7 +88,7 @@ public: void Summon(Creature const* summon) { storage_.push_back(summon->GetGUID()); } void Despawn(Creature const* summon) { storage_.remove(summon->GetGUID()); } void DespawnEntry(uint32 entry); - void DespawnAll(uint32 delay = 0); + void DespawnAll(Milliseconds delay = 0ms); bool IsAnyCreatureAlive() const; bool IsAnyCreatureWithEntryAlive(uint32 entry) const; bool IsAnyCreatureInCombat() const; @@ -355,11 +355,11 @@ struct ScriptedAI : public CreatureAI void ClearUniqueTimedEventsDone() { _uniqueTimedEvents.clear(); } // Schedules a timed event using task scheduler. - void ScheduleTimedEvent(Milliseconds timerMin, Milliseconds timerMax, std::function<void()> exec, Milliseconds repeatMin, Milliseconds repeatMax = 0s, uint32 uniqueId = 0); - void ScheduleTimedEvent(Milliseconds timerMax, std::function<void()> exec, Milliseconds repeatMin, Milliseconds repeatMax = 0s, uint32 uniqueId = 0) { ScheduleTimedEvent(0s, timerMax, exec, repeatMin, repeatMax, uniqueId); }; + void ScheduleTimedEvent(Milliseconds timerMin, Milliseconds timerMax, std::function<void()> exec, Milliseconds repeatMin, Milliseconds repeatMax = 0ms, uint32 uniqueId = 0); + void ScheduleTimedEvent(Milliseconds timerMax, std::function<void()> exec, Milliseconds repeatMin, Milliseconds repeatMax = 0ms, uint32 uniqueId = 0) { ScheduleTimedEvent(0ms, timerMax, exec, repeatMin, repeatMax, uniqueId); }; // Schedules a timed event using task scheduler that never repeats. Requires an unique non-zero ID. - void ScheduleUniqueTimedEvent(Milliseconds timer, std::function<void()> exec, uint32 uniqueId) { ScheduleTimedEvent(0s, timer, exec, 0s, 0s, uniqueId); }; + void ScheduleUniqueTimedEvent(Milliseconds timer, std::function<void()> exec, uint32 uniqueId) { ScheduleTimedEvent(0ms, timer, exec, 0ms, 0ms, uniqueId); }; bool HealthBelowPct(uint32 pct) const { return me->HealthBelowPct(pct); } bool HealthAbovePct(uint32 pct) const { return me->HealthAbovePct(pct); } @@ -463,7 +463,7 @@ enum HealthCheckStatus struct HealthCheckEventData { - HealthCheckEventData(uint8 healthPct, std::function<void()> exec, uint8 status = HEALTH_CHECK_SCHEDULED, bool allowedWhileCasting = true, Milliseconds Delay = 0s) : _healthPct(healthPct), _exec(exec), _status(status), _allowedWhileCasting(allowedWhileCasting), _delay(Delay) { }; + HealthCheckEventData(uint8 healthPct, std::function<void()> exec, uint8 status = HEALTH_CHECK_SCHEDULED, bool allowedWhileCasting = true, Milliseconds Delay = 0ms) : _healthPct(healthPct), _exec(exec), _status(status), _allowedWhileCasting(allowedWhileCasting), _delay(Delay) { }; uint8 _healthPct; std::function<void()> _exec; diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index ddabc130fb..85fbf8a906 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -33,7 +33,6 @@ npc_escortAI::npc_escortAI(Creature* creature) : ScriptedAI(creature), MaxPlayerDistance(DEFAULT_MAX_PLAYER_DISTANCE), m_pQuestForEscort(nullptr), m_bIsActiveAttacker(true), - m_bIsRunning(false), m_bCanInstantRespawn(false), m_bCanReturnToStart(false), DespawnAtEnd(true), @@ -186,9 +185,8 @@ void npc_escortAI::JustRespawned() void npc_escortAI::ReturnToLastPoint() { float x, y, z, o; - me->SetWalk(false); me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(POINT_LAST_POINT, x, y, z); + me->GetMotionMaster()->MovePoint(POINT_LAST_POINT, x, y, z, FORCED_MOVEMENT_RUN); } void npc_escortAI::EnterEvadeMode(EvadeReason /*why*/) @@ -220,10 +218,10 @@ bool npc_escortAI::IsPlayerOrGroupInRange() { for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next()) if (Player* member = groupRef->GetSource()) - if (me->IsWithinDistInMap(member, GetMaxPlayerDistance(), true, false)) + if (me->IsWithinDistInMap(member, GetMaxPlayerDistance(), true, false, false)) return true; } - else if (me->IsWithinDistInMap(player, GetMaxPlayerDistance(), true, false)) + else if (me->IsWithinDistInMap(player, GetMaxPlayerDistance(), true, false, false)) return true; } @@ -329,7 +327,6 @@ void npc_escortAI::MovementInform(uint32 moveType, uint32 pointId) { LOG_DEBUG("scripts.ai", "EscortAI has returned to original position before combat"); - me->SetWalk(!m_bIsRunning); RemoveEscortState(STATE_ESCORT_RETURNING); if (!m_uiWPWaitTimer) @@ -418,28 +415,8 @@ void npc_escortAI::FillPointMovementListForCreature() } } -void npc_escortAI::SetRun(bool on) -{ - if (on) - { - if (!m_bIsRunning) - me->SetWalk(false); - else - LOG_DEBUG("scripts.ai", "EscortAI attempt to set run mode, but is already running."); - } - else - { - if (m_bIsRunning) - me->SetWalk(true); - else - LOG_DEBUG("scripts.ai", "EscortAI attempt to set walk mode, but is already walking."); - } - - m_bIsRunning = on; -} - //TODO: get rid of this many variables passed in function. -void npc_escortAI::Start(bool isActiveAttacker /* = true*/, bool run /* = false */, ObjectGuid playerGUID /* = ObjectGuid::Empty */, Quest const* quest /* = nullptr */, bool instantRespawn /* = false */, bool canLoopPath /* = false */, bool resetWaypoints /* = true */) +void npc_escortAI::Start(bool isActiveAttacker /* = true*/, ObjectGuid playerGUID /* = ObjectGuid::Empty */, Quest const* quest /* = nullptr */, bool instantRespawn /* = false */, bool canLoopPath /* = false */, bool resetWaypoints /* = true */) { if (me->GetVictim()) { @@ -469,7 +446,6 @@ void npc_escortAI::Start(bool isActiveAttacker /* = true*/, bool run /* = false //set variables m_bIsActiveAttacker = isActiveAttacker; - m_bIsRunning = run; m_uiPlayerGUID = playerGUID; m_pQuestForEscort = quest; @@ -495,17 +471,11 @@ void npc_escortAI::Start(bool isActiveAttacker /* = true*/, bool run /* = false me->SetImmuneToNPC(false); } - LOG_DEBUG("scripts.ai", "EscortAI started with {} waypoints. ActiveAttacker = {}, Run = {}, PlayerGUID = {}", - uint64(WaypointList.size()), m_bIsActiveAttacker, m_bIsRunning, m_uiPlayerGUID.ToString()); + LOG_DEBUG("scripts.ai", "EscortAI started with {} waypoints. ActiveAttacker = {}, PlayerGUID = {}", + uint64(WaypointList.size()), m_bIsActiveAttacker, m_uiPlayerGUID.ToString()); CurrentWP = WaypointList.begin(); - //Set initial speed - if (m_bIsRunning) - me->SetWalk(false); - else - me->SetWalk(true); - AddEscortState(STATE_ESCORT_ESCORTING); if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_ACTIVE) == ESCORT_MOTION_TYPE) me->GetMotionMaster()->MovementExpired(); diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h index 1332837ff9..32b51126d2 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h @@ -90,9 +90,8 @@ public: virtual void WaypointReached(uint32 pointId) = 0; virtual void WaypointStart(uint32 /*pointId*/) {} - void Start(bool isActiveAttacker = true, bool run = false, ObjectGuid playerGUID = ObjectGuid::Empty, Quest const* quest = nullptr, bool instantRespawn = false, bool canLoopPath = false, bool resetWaypoints = true); + void Start(bool isActiveAttacker = true, ObjectGuid playerGUID = ObjectGuid::Empty, Quest const* quest = nullptr, bool instantRespawn = false, bool canLoopPath = false, bool resetWaypoints = true); - void SetRun(bool on = true); void SetEscortPaused(bool on); bool HasEscortState(uint32 escortState) { return (m_uiEscortState & escortState); } @@ -130,7 +129,6 @@ private: std::list<Escort_Waypoint>::iterator CurrentWP; bool m_bIsActiveAttacker; //obsolete, determined by faction. - bool m_bIsRunning; //all creatures are walking by default (has flag MOVEMENTFLAG_WALK) bool m_bCanInstantRespawn; //if creature should respawn instantly after escort over (if not, database respawntime are used) bool m_bCanReturnToStart; //if creature can walk same path (loop) without despawn. Not for regular escort quests. bool DespawnAtEnd; diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index 019bb58b5d..c43f81ff4f 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -202,7 +202,7 @@ void FollowerAI::UpdateAI(uint32 uiDiff) { Player* member = groupRef->GetSource(); - if (member && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE, true, false)) + if (member && me->IsWithinDistInMap(member, MAX_PLAYER_DISTANCE, true, false, false)) { bIsMaxRangeExceeded = false; break; @@ -211,7 +211,7 @@ void FollowerAI::UpdateAI(uint32 uiDiff) } else { - if (me->IsWithinDistInMap(player, MAX_PLAYER_DISTANCE, true, false)) + if (me->IsWithinDistInMap(player, MAX_PLAYER_DISTANCE, true, false, false)) bIsMaxRangeExceeded = false; } } diff --git a/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp b/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp index 120a75582d..12d5a63685 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp @@ -42,7 +42,7 @@ void AddGossipItemFor(Player* player, uint32 gossipMenuID, uint32 gossipMenuItem player->PlayerTalkClass->GetGossipMenu().AddMenuItem(gossipMenuID, gossipMenuItemID, sender, action, boxMoney); } -void SendGossipMenuFor(Player* player, uint32 npcTextID, ObjectGuid const guid) +void SendGossipMenuFor(Player* player, uint32 npcTextID, ObjectGuid const& guid) { player->PlayerTalkClass->SendGossipMenu(npcTextID, guid); } diff --git a/src/server/game/AI/ScriptedAI/ScriptedGossip.h b/src/server/game/AI/ScriptedAI/ScriptedGossip.h index eee8411480..b88aea5c4c 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedGossip.h +++ b/src/server/game/AI/ScriptedAI/ScriptedGossip.h @@ -94,7 +94,7 @@ void AddGossipItemFor(Player* player, uint32 icon, std::string const& text, uint void AddGossipItemFor(Player* player, uint32 gossipMenuID, uint32 gossipMenuItemID, uint32 sender, uint32 action, uint32 boxMoney = 0); // Send menu text -void SendGossipMenuFor(Player* player, uint32 npcTextID, ObjectGuid const guid); +void SendGossipMenuFor(Player* player, uint32 npcTextID, ObjectGuid const& guid); void SendGossipMenuFor(Player* player, uint32 npcTextID, Creature const* creature); // Close menu diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index cb4067e0c8..198c7adb43 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -43,15 +43,14 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c) mCanRepeatPath = false; - // spawn in run mode - // Xinef: spawn in run mode and set mRun to run... this overrides SetWalk EVERYWHERE - mRun = true; mEvadeDisabled = false; mCanAutoAttack = true; mForcedPaused = false; + mForcedMovement = FORCED_MOVEMENT_NONE; + mEscortQuestID = 0; mDespawnTime = 0; @@ -109,20 +108,20 @@ void SmartAI::UpdateDespawn(const uint32 diff) mDespawnTime -= diff; } -WayPoint* SmartAI::GetNextWayPoint() +WaypointData const* SmartAI::GetNextWayPoint() { if (!mWayPoints || mWayPoints->empty()) return nullptr; mCurrentWPID++; - WPPath::const_iterator itr = mWayPoints->find(mCurrentWPID); + auto itr = mWayPoints->find(mCurrentWPID); if (itr != mWayPoints->end()) { - mLastWP = (*itr).second; + mLastWP = &(*itr).second; if (mLastWP->id != mCurrentWPID) LOG_ERROR("scripts.ai.sai", "SmartAI::GetNextWayPoint: Got not expected waypoint id {}, expected {}", mLastWP->id, mCurrentWPID); - return (*itr).second; + return &(*itr).second; } return nullptr; } @@ -139,12 +138,15 @@ void SmartAI::GenerateWayPointArray(Movement::PointsArray* points) points->clear(); points->push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); uint32 wpCounter = mCurrentWPID; - WPPath::const_iterator itr; - while ((itr = mWayPoints->find(wpCounter++)) != mWayPoints->end()) + auto itr = mWayPoints->find(wpCounter++); + do { - WayPoint* wp = (*itr).second; - points->push_back(G3D::Vector3(wp->x, wp->y, wp->z)); + WaypointData const& wp = (*itr).second; + points->push_back(G3D::Vector3(wp.x, wp.y, wp.z)); + + itr = mWayPoints->find(wpCounter++); } + while (itr != mWayPoints->end()); } else { @@ -153,15 +155,15 @@ void SmartAI::GenerateWayPointArray(Movement::PointsArray* points) std::vector<G3D::Vector3> pVector; // xinef: first point in vector is unit real position pVector.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); + uint32 wpCounter = mCurrentWPID; + uint32 length = (mWayPoints->size() - mCurrentWPID) * size; uint32 cnt = 0; - uint32 wpCounter = mCurrentWPID; - WPPath::const_iterator itr; - while ((itr = mWayPoints->find(wpCounter++)) != mWayPoints->end() && cnt++ <= length) + for (auto itr = mWayPoints->find(wpCounter); itr != mWayPoints->end() && cnt++ <= length; ++itr) { - WayPoint* wp = (*itr).second; - pVector.push_back(G3D::Vector3(wp->x, wp->y, wp->z)); + WaypointData const& wp = (*itr).second; + pVector.push_back(G3D::Vector3(wp.x, wp.y, wp.z)); } if (pVector.size() > 2) // more than source + dest @@ -190,25 +192,25 @@ void SmartAI::GenerateWayPointArray(Movement::PointsArray* points) } } -void SmartAI::StartPath(bool run, uint32 path, bool repeat, Unit* invoker) +void SmartAI::StartPath(ForcedMovement forcedMovement, uint32 path, bool repeat, Unit* invoker, PathSource pathSource) { if (HasEscortState(SMART_ESCORT_ESCORTING)) StopPath(); if (path) { - if (!LoadPath(path)) + if (!LoadPath(path, pathSource)) return; } if (!mWayPoints || mWayPoints->empty()) return; - if (WayPoint* wp = GetNextWayPoint()) + if (WaypointData const* wp = GetNextWayPoint()) { AddEscortState(SMART_ESCORT_ESCORTING); mCanRepeatPath = repeat; - SetRun(run); + mForcedMovement = forcedMovement; if (invoker && invoker->IsPlayer()) { @@ -219,21 +221,38 @@ void SmartAI::StartPath(bool run, uint32 path, bool repeat, Unit* invoker) Movement::PointsArray pathPoints; GenerateWayPointArray(&pathPoints); - me->GetMotionMaster()->MoveSplinePath(&pathPoints); - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_START, nullptr, wp->id, GetScript()->GetPathId()); + me->GetMotionMaster()->MoveSplinePath(&pathPoints, mForcedMovement); + GetScript()->ProcessEventsFor(SMART_EVENT_ESCORT_START, nullptr, wp->id, GetScript()->GetPathId()); } } -bool SmartAI::LoadPath(uint32 entry) +bool SmartAI::LoadPath(uint32 entry, PathSource pathSource) { if (HasEscortState(SMART_ESCORT_ESCORTING)) return false; - mWayPoints = sSmartWaypointMgr->GetPath(entry); - if (!mWayPoints) + switch (pathSource) { - GetScript()->SetPathId(0); - return false; + case PathSource::SMART_WAYPOINT_MGR: + { + mWayPoints = sSmartWaypointMgr->GetPath(entry); + if (!mWayPoints) + { + GetScript()->SetPathId(0); + return false; + } + break; + } + case PathSource::WAYPOINT_MGR: + { + mWayPoints = sWaypointMgr->GetPath(entry); + if (!mWayPoints) + { + GetScript()->SetPathId(0); + return false; + } + break; + } } GetScript()->SetPathId(entry); @@ -256,7 +275,6 @@ void SmartAI::PausePath(uint32 delay, bool forced) if (forced && !mWPReached) { mForcedPaused = forced; - SetRun(mRun); if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_ACTIVE) == ESCORT_MOTION_TYPE) me->GetMotionMaster()->MovementExpired(); @@ -264,12 +282,12 @@ void SmartAI::PausePath(uint32 delay, bool forced) me->GetMotionMaster()->MoveIdle();//force stop auto waypoint = mWayPoints->find(mCurrentWPID); - if (waypoint->second->o.has_value()) + if (waypoint->second.orientation.has_value()) { - me->SetFacingTo(waypoint->second->o.has_value()); + me->SetFacingTo(*waypoint->second.orientation); } } - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_PAUSED, nullptr, mCurrentWPID, GetScript()->GetPathId()); + GetScript()->ProcessEventsFor(SMART_EVENT_ESCORT_PAUSED, nullptr, mCurrentWPID, GetScript()->GetPathId()); } void SmartAI::StopPath(uint32 DespawnTime, uint32 quest, bool fail) @@ -287,7 +305,7 @@ void SmartAI::StopPath(uint32 DespawnTime, uint32 quest, bool fail) me->StopMoving(); me->GetMotionMaster()->MoveIdle(); - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_STOPPED, nullptr, mCurrentWPID, GetScript()->GetPathId()); + GetScript()->ProcessEventsFor(SMART_EVENT_ESCORT_STOPPED, nullptr, mCurrentWPID, GetScript()->GetPathId()); EndPath(fail); } @@ -356,13 +374,13 @@ void SmartAI::EndPath(bool fail) return; } - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_ENDED, nullptr, mCurrentWPID, GetScript()->GetPathId()); + GetScript()->ProcessEventsFor(SMART_EVENT_ESCORT_ENDED, nullptr, mCurrentWPID, GetScript()->GetPathId()); mCurrentWPID = 0; if (mCanRepeatPath) { if (IsAIControlled()) - StartPath(mRun, GetScript()->GetPathId(), true); + StartPath(mForcedMovement, GetScript()->GetPathId(), true); } else GetScript()->SetPathId(0); @@ -373,14 +391,12 @@ void SmartAI::EndPath(bool fail) void SmartAI::ResumePath() { - SetRun(mRun); - if (mLastWP) { Movement::PointsArray pathPoints; GenerateWayPointArray(&pathPoints); - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + me->GetMotionMaster()->MoveSplinePath(&pathPoints, mForcedMovement); } } @@ -389,10 +405,9 @@ void SmartAI::ReturnToLastOOCPos() if (!IsAIControlled()) return; - me->SetWalk(false); float x, y, z, o; me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(SMART_ESCORT_LAST_OOC_POINT, x, y, z); + me->GetMotionMaster()->MovePoint(SMART_ESCORT_LAST_OOC_POINT, x, y, z, FORCED_MOVEMENT_RUN); } void SmartAI::UpdatePath(const uint32 diff) @@ -410,7 +425,7 @@ void SmartAI::UpdatePath(const uint32 diff) // Xinef: allow to properly hook out of range despawn action, which in most cases should perform the same operation as dying GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, me); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); return; } mEscortInvokerCheckTimer = 1000; @@ -425,7 +440,7 @@ void SmartAI::UpdatePath(const uint32 diff) { if (!me->IsInCombat() && !HasEscortState(SMART_ESCORT_RETURNING) && (mWPReached || mForcedPaused)) { - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_RESUMED, nullptr, mCurrentWPID, GetScript()->GetPathId()); + GetScript()->ProcessEventsFor(SMART_EVENT_ESCORT_RESUMED, nullptr, mCurrentWPID, GetScript()->GetPathId()); RemoveEscortState(SMART_ESCORT_PAUSED); if (mForcedPaused)// if paused between 2 wps resend movement { @@ -469,7 +484,6 @@ void SmartAI::UpdatePath(const uint32 diff) EndPath(); else if (GetNextWayPoint()) { - SetRun(mRun); // xinef: if we have reached waypoint, and there is no working spline movement it means our splitted array has ended, make new one if (me->movespline->Finalized()) ResumePath(); @@ -605,7 +619,7 @@ void SmartAI::MovepointReached(uint32 id) } mWPReached = true; - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_REACHED, nullptr, mCurrentWPID); + GetScript()->ProcessEventsFor(SMART_EVENT_ESCORT_REACHED, nullptr, mCurrentWPID); if (mLastWP) { @@ -629,7 +643,6 @@ void SmartAI::MovepointReached(uint32 id) EndPath(); else if (GetNextWayPoint()) { - SetRun(mRun); // xinef: if we have reached waypoint, and there is no working spline movement it means our splitted array has ended, make new one if (me->movespline->Finalized()) ResumePath(); @@ -643,7 +656,7 @@ void SmartAI::MovementInform(uint32 MovementType, uint32 Data) me->ClearUnitState(UNIT_STATE_EVADE); if (MovementType == WAYPOINT_MOTION_TYPE) - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_DATA_REACHED, nullptr, Data + 1); // Data + 1 to align smart_scripts and waypoint_data Id rows + GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_REACHED, nullptr, Data); // data now corresponds to columns GetScript()->ProcessEventsFor(SMART_EVENT_MOVEMENTINFORM, nullptr, MovementType, Data); if (!HasEscortState(SMART_ESCORT_ESCORTING)) @@ -675,7 +688,6 @@ void SmartAI::EnterEvadeMode(EvadeReason /*why*/) GetScript()->ProcessEventsFor(SMART_EVENT_EVADE); //must be after aura clear so we can cast spells from db - SetRun(mRun); if (HasEscortState(SMART_ESCORT_ESCORTING)) { AddEscortState(SMART_ESCORT_RETURNING); @@ -794,7 +806,7 @@ void SmartAI::JustReachedHome() GetScript()->ProcessEventsFor(SMART_EVENT_REACHED_HOME); if (!UpdateVictim() && me->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE && me->GetWaypointPath()) - me->GetMotionMaster()->MovePath(me->GetWaypointPath(), true); + me->GetMotionMaster()->MoveWaypoint(me->GetWaypointPath(), true); } mJustReset = false; @@ -850,7 +862,6 @@ void SmartAI::AttackStart(Unit* who) { if (!me->HasUnitState(UNIT_STATE_NO_COMBAT_MOVEMENT)) { - SetRun(mRun); MovementGeneratorType type = me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_ACTIVE); if (type == ESCORT_MOTION_TYPE || type == POINT_MOTION_TYPE) { @@ -952,9 +963,7 @@ void SmartAI::OnCharmed(bool /* apply */) if (!charmed && !me->IsInEvadeMode()) { if (mCanRepeatPath) - StartPath(mRun, GetScript()->GetPathId(), true); - else - me->SetWalk(!mRun); + StartPath(mForcedMovement, GetScript()->GetPathId(), true); if (Unit* charmer = me->GetCharmer()) AttackStart(charmer); @@ -993,7 +1002,7 @@ void SmartAI::SetData(uint32 id, uint32 value, WorldObject* invoker) GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, unit, id, value, false, nullptr, gob); } -void SmartAI::SetGUID(ObjectGuid /*guid*/, int32 /*id*/) +void SmartAI::SetGUID(ObjectGuid const& /*guid*/, int32 /*id*/) { } @@ -1002,12 +1011,6 @@ ObjectGuid SmartAI::GetGUID(int32 /*id*/) const return ObjectGuid::Empty; } -void SmartAI::SetRun(bool run) -{ - me->SetWalk(!run); - mRun = run; -} - void SmartAI::SetFly(bool fly) { // xinef: set proper flag! @@ -1108,7 +1111,6 @@ void SmartAI::SetFollow(Unit* target, float dist, float angle, uint32 credit, ui mFollowArrivedEntry = end; mFollowArrivedAlive = !aliveState; // negate - 0 is alive mFollowCreditType = creditType; - SetRun(mRun); me->GetMotionMaster()->MoveFollow(target, mFollowDist, mFollowAngle); } @@ -1167,7 +1169,7 @@ void SmartAI::OnSpellClick(Unit* clicker, bool& /*result*/) void SmartAI::PathEndReached(uint32 /*pathId*/) { - GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_DATA_ENDED, nullptr, 0, me->GetWaypointPath()); + GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_ENDED, nullptr, 0, me->GetWaypointPath()); me->LoadPath(0); } diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 5bd9fcd8b3..3551f681de 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -52,13 +52,13 @@ public: bool IsAIControlled() const; // Start moving to the desired MovePoint - void StartPath(bool run = false, uint32 path = 0, bool repeat = false, Unit* invoker = nullptr); - bool LoadPath(uint32 entry); + void StartPath(ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE, uint32 path = 0, bool repeat = false, Unit* invoker = nullptr, PathSource pathSource = PathSource::SMART_WAYPOINT_MGR); + bool LoadPath(uint32 entry, PathSource pathSource); void PausePath(uint32 delay, bool forced = false); void StopPath(uint32 DespawnTime = 0, uint32 quest = 0, bool fail = false); void EndPath(bool fail = false); void ResumePath(); - WayPoint* GetNextWayPoint(); + WaypointData const* GetNextWayPoint(); void GenerateWayPointArray(Movement::PointsArray* points); bool HasEscortState(uint32 uiEscortState) { return (mEscortState & uiEscortState); } void AddEscortState(uint32 uiEscortState) { mEscortState |= uiEscortState; } @@ -164,7 +164,7 @@ public: void SetData(uint32 id, uint32 value, WorldObject* invoker); // Used in scripts to share variables - void SetGUID(ObjectGuid guid, int32 id = 0) override; + void SetGUID(ObjectGuid const& guid, int32 id = 0) override; // Used in scripts to share variables ObjectGuid GetGUID(int32 id = 0) const override; @@ -175,9 +175,6 @@ public: // Called at movepoint reached void MovepointReached(uint32 id); - // Makes the creature run/walk - void SetRun(bool run = true); - void SetFly(bool fly = true); void SetSwim(bool swim = true); @@ -230,21 +227,21 @@ private: void ReturnToLastOOCPos(); void UpdatePath(const uint32 diff); SmartScript mScript; - WPPath* mWayPoints; + WaypointPath const* mWayPoints; uint32 mEscortState; uint32 mCurrentWPID; bool mWPReached; bool mOOCReached; uint32 mWPPauseTimer; - WayPoint* mLastWP; + WaypointData const* mLastWP; uint32 mEscortNPCFlags; uint32 GetWPCount() { return mWayPoints ? mWayPoints->size() : 0; } bool mCanRepeatPath; - bool mRun; bool mEvadeDisabled; bool mCanAutoAttack; bool mForcedPaused; uint32 mInvincibilityHpLevel; + ForcedMovement mForcedMovement; bool AssistPlayerInCombatAgainst(Unit* who); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 1a64641e95..0991290b2b 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1683,10 +1683,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (IsCreature(target)) { - if (IsSmart(target->ToCreature())) - CAST_AI(SmartAI, target->ToCreature()->AI())->SetRun(e.action.setRun.run); - else - target->ToCreature()->SetWalk(e.action.setRun.run ? false : true); // Xinef: reversed + target->ToCreature()->SetWalk(e.action.setRun.run ? false : true); } } @@ -1726,12 +1723,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset, e.action.setCounter.subtract); break; } - case SMART_ACTION_WP_START: + case SMART_ACTION_ESCORT_START: { if (!IsSmart()) break; - bool run = e.action.wpStart.run != 0; + ForcedMovement forcedMovement = static_cast<ForcedMovement>(e.action.wpStart.forcedMovement); uint32 entry = e.action.wpStart.pathID; bool repeat = e.action.wpStart.repeat != 0; @@ -1745,7 +1742,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } me->SetReactState((ReactStates)e.action.wpStart.reactState); - CAST_AI(SmartAI, me->AI())->StartPath(run, entry, repeat, unit); + CAST_AI(SmartAI, me->AI())->StartPath(forcedMovement, entry, repeat, unit); uint32 quest = e.action.wpStart.quest; uint32 DespawnTime = e.action.wpStart.despawnTime; @@ -1753,16 +1750,16 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u CAST_AI(SmartAI, me->AI())->SetDespawnTime(DespawnTime); break; } - case SMART_ACTION_WP_PAUSE: + case SMART_ACTION_ESCORT_PAUSE: { if (!IsSmart()) break; uint32 delay = e.action.wpPause.delay; - CAST_AI(SmartAI, me->AI())->PausePath(delay, e.GetEventType() == SMART_EVENT_WAYPOINT_REACHED ? false : true); + CAST_AI(SmartAI, me->AI())->PausePath(delay, e.GetEventType() == SMART_EVENT_ESCORT_REACHED ? false : true); break; } - case SMART_ACTION_WP_STOP: + case SMART_ACTION_ESCORT_STOP: { if (!IsSmart()) break; @@ -1773,7 +1770,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u CAST_AI(SmartAI, me->AI())->StopPath(DespawnTime, quest, fail); break; } - case SMART_ACTION_WP_RESUME: + case SMART_ACTION_ESCORT_RESUME: { if (!IsSmart()) break; @@ -1854,8 +1851,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (TransportBase* trans = me->GetDirectTransport()) trans->CalculatePassengerPosition(dest.x, dest.y, dest.z); - me->GetMotionMaster()->MovePoint(e.action.moveToPos.pointId, dest.x, dest.y, dest.z, true, isForced, - isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE, e.target.o); + me->GetMotionMaster()->MovePoint(e.action.moveToPos.pointId, dest.x, dest.y, dest.z, FORCED_MOVEMENT_NONE, + 0.f, e.target.o, true, isForced, isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE); break; } @@ -1871,9 +1868,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u randomPoint.m_positionX, randomPoint.m_positionY, randomPoint.m_positionZ, - true, - isForced, - isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE + FORCED_MOVEMENT_NONE, + 0.f, 0.f, true, isForced, isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE ); } @@ -1897,7 +1893,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u else if (e.action.moveToPos.ContactDistance) target->GetNearPoint(me, x, y, z, e.action.moveToPos.ContactDistance, 0, target->GetAngle(me)); - me->GetMotionMaster()->MovePoint(e.action.moveToPos.pointId, x + e.target.x, y + e.target.y, z + e.target.z, true, isForced, isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE); + me->GetMotionMaster()->MovePoint(e.action.moveToPos.pointId, x + e.target.x, y + e.target.y, z + e.target.z, FORCED_MOVEMENT_NONE, + 0.f, 0.f, true, isForced, isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE); break; } @@ -1914,7 +1911,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u SAIBool isForced = !e.action.moveToPosTarget.disableForceDestination; Creature* ctarget = target->ToCreature(); - ctarget->GetMotionMaster()->MovePoint(e.action.moveToPosTarget.pointId, e.target.x, e.target.y, e.target.z, true, isForced, isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE); + ctarget->GetMotionMaster()->MovePoint(e.action.moveToPosTarget.pointId, e.target.x, e.target.y, e.target.z, FORCED_MOVEMENT_NONE, + 0.f, 0.f, true, isForced, isControlled ? MOTION_SLOT_CONTROLLED : MOTION_SLOT_ACTIVE); } } @@ -2521,21 +2519,19 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { for (uint32 wp = e.action.startClosestWaypoint.pathId1; wp <= e.action.startClosestWaypoint.pathId2; ++wp) { - WPPath* path = sSmartWaypointMgr->GetPath(wp); + WaypointPath* path = sSmartWaypointMgr->GetPath(wp); if (!path || path->empty()) continue; auto itrWp = path->find(1); if (itrWp != path->end()) { - if (WayPoint* wpData = itrWp->second) + WaypointData& wpData = itrWp->second; + float distToThisPath = creature->GetExactDistSq(wpData.x, wpData.y, wpData.z); + if (distToThisPath < distanceToClosest) { - float distToThisPath = creature->GetExactDistSq(wpData->x, wpData->y, wpData->z); - if (distToThisPath < distanceToClosest) - { - distanceToClosest = distToThisPath; - closestWpId = wp; - } + distanceToClosest = distToThisPath; + closestWpId = wp; } } } @@ -2543,9 +2539,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (closestWpId) { bool repeat = e.action.startClosestWaypoint.repeat; - bool run = e.action.startClosestWaypoint.run; + ForcedMovement forcedMovement = static_cast<ForcedMovement>(e.action.startClosestWaypoint.forcedMovement); - CAST_AI(SmartAI, creature->AI())->StartPath(repeat, closestWpId, run); + CAST_AI(SmartAI, creature->AI())->StartPath(forcedMovement, closestWpId, repeat); } } } @@ -3223,7 +3219,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } break; } - case SMART_ACTION_WAYPOINT_DATA_START: + case SMART_ACTION_WAYPOINT_START: { if (e.action.wpData.pathId) { @@ -3232,7 +3228,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (IsCreature(target)) { target->ToCreature()->LoadPath(e.action.wpData.pathId); - target->ToCreature()->GetMotionMaster()->MovePath(e.action.wpData.pathId, e.action.wpData.repeat); + target->ToCreature()->GetMotionMaster()->MoveWaypoint(e.action.wpData.pathId, e.action.wpData.repeat, e.action.wpData.pathSource); } } } @@ -3249,7 +3245,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { uint32 path = urand(e.action.wpDataRandom.pathId1, e.action.wpDataRandom.pathId2); target->ToCreature()->LoadPath(path); - target->ToCreature()->GetMotionMaster()->MovePath(path, e.action.wpDataRandom.repeat); + target->ToCreature()->GetMotionMaster()->MoveWaypoint(path, e.action.wpDataRandom.repeat); } } } @@ -4400,22 +4396,24 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui { if ((e.event.movementInform.type && var0 != e.event.movementInform.type) || (e.event.movementInform.id && var1 != e.event.movementInform.id)) return; + if (e.event.movementInform.pathId != 0 && e.event.movementInform.pathId != me->GetWaypointPath()) + return; ProcessAction(e, unit, var0, var1); break; } case SMART_EVENT_TRANSPORT_RELOCATE: - case SMART_EVENT_WAYPOINT_START: + case SMART_EVENT_ESCORT_START: { if (e.event.waypoint.pathID && var0 != e.event.waypoint.pathID) return; ProcessAction(e, unit, var0); break; } - case SMART_EVENT_WAYPOINT_REACHED: - case SMART_EVENT_WAYPOINT_RESUMED: - case SMART_EVENT_WAYPOINT_PAUSED: - case SMART_EVENT_WAYPOINT_STOPPED: - case SMART_EVENT_WAYPOINT_ENDED: + case SMART_EVENT_ESCORT_REACHED: + case SMART_EVENT_ESCORT_RESUMED: + case SMART_EVENT_ESCORT_PAUSED: + case SMART_EVENT_ESCORT_STOPPED: + case SMART_EVENT_ESCORT_ENDED: { if (!me || (e.event.waypoint.pointID && var0 != e.event.waypoint.pointID) || (e.event.waypoint.pathID && GetPathId() != e.event.waypoint.pathID)) return; @@ -4809,8 +4807,8 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui RecalcTimer(e, 1200, 1200); break; } - case SMART_EVENT_WAYPOINT_DATA_REACHED: - case SMART_EVENT_WAYPOINT_DATA_ENDED: + case SMART_EVENT_WAYPOINT_REACHED: + case SMART_EVENT_WAYPOINT_ENDED: { if (!me || (e.event.wpData.pointId && var0 != e.event.wpData.pointId) || (e.event.wpData.pathId && me->GetWaypointPath() != e.event.wpData.pathId)) return; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 6db3e4cb2d..ac5ba3d559 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -48,12 +48,9 @@ void SmartWaypointMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); - for (std::unordered_map<uint32, WPPath*>::iterator itr = waypoint_map.begin(); itr != waypoint_map.end(); ++itr) + for (auto itr : waypoint_map) { - for (WPPath::iterator pathItr = itr->second->begin(); pathItr != itr->second->end(); ++pathItr) - delete pathItr->second; - - delete itr->second; + delete itr.second; } waypoint_map.clear(); @@ -88,7 +85,7 @@ void SmartWaypointMgr::LoadFromDB() if (last_entry != entry) { - waypoint_map[entry] = new WPPath(); + waypoint_map[entry] = new WaypointPath(); last_id = 1; count++; } @@ -97,7 +94,15 @@ void SmartWaypointMgr::LoadFromDB() LOG_ERROR("sql.sql", "SmartWaypointMgr::LoadFromDB: Path entry {}, unexpected point id {}, expected {}.", entry, id, last_id); last_id++; - (*waypoint_map[entry])[id] = new WayPoint(id, x, y, z, o, delay); + WaypointData data; + data.id = id; + data.x = x; + data.y = y; + data.z = z; + data.orientation = o; + data.delay = delay; + data.move_type = WAYPOINT_MOVE_TYPE_MAX; + (*waypoint_map[entry]).emplace(id, data); last_entry = entry; total++; @@ -109,12 +114,9 @@ void SmartWaypointMgr::LoadFromDB() SmartWaypointMgr::~SmartWaypointMgr() { - for (std::unordered_map<uint32, WPPath*>::iterator itr = waypoint_map.begin(); itr != waypoint_map.end(); ++itr) + for (auto itr : waypoint_map) { - for (WPPath::iterator pathItr = itr->second->begin(); pathItr != itr->second->end(); ++pathItr) - delete pathItr->second; - - delete itr->second; + delete itr.second; } } @@ -555,6 +557,7 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) case SMART_TARGET_RANDOM_POINT: case SMART_TARGET_ROLE_SELECTION: case SMART_TARGET_LOOT_RECIPIENTS: + case SMART_TARGET_VEHICLE_PASSENGER: case SMART_EVENT_SUMMONED_UNIT_DIES: case SMART_EVENT_SUMMONED_UNIT_EVADE: case SMART_TARGET_PLAYER_RANGE: @@ -624,8 +627,8 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) case SMART_EVENT_CORPSE_REMOVED: return NO_PARAMS; case SMART_EVENT_AI_INIT: return NO_PARAMS; case SMART_EVENT_DATA_SET: return sizeof(SmartEvent::dataSet); - case SMART_EVENT_WAYPOINT_START: return sizeof(SmartEvent::waypoint); - case SMART_EVENT_WAYPOINT_REACHED: return sizeof(SmartEvent::waypoint); + case SMART_EVENT_ESCORT_START: return sizeof(SmartEvent::waypoint); + case SMART_EVENT_ESCORT_REACHED: return sizeof(SmartEvent::waypoint); case SMART_EVENT_TRANSPORT_ADDPLAYER: return NO_PARAMS; case SMART_EVENT_TRANSPORT_ADDCREATURE: return sizeof(SmartEvent::transportAddCreature); case SMART_EVENT_TRANSPORT_REMOVE_PLAYER: return NO_PARAMS; @@ -640,10 +643,10 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) case SMART_EVENT_TEXT_OVER: return sizeof(SmartEvent::textOver); case SMART_EVENT_RECEIVE_HEAL: return sizeof(SmartEvent::minMaxRepeat); case SMART_EVENT_JUST_SUMMONED: return NO_PARAMS; - case SMART_EVENT_WAYPOINT_PAUSED: return sizeof(SmartEvent::waypoint); - case SMART_EVENT_WAYPOINT_RESUMED: return sizeof(SmartEvent::waypoint); - case SMART_EVENT_WAYPOINT_STOPPED: return sizeof(SmartEvent::waypoint); - case SMART_EVENT_WAYPOINT_ENDED: return sizeof(SmartEvent::waypoint); + case SMART_EVENT_ESCORT_PAUSED: return sizeof(SmartEvent::waypoint); + case SMART_EVENT_ESCORT_RESUMED: return sizeof(SmartEvent::waypoint); + case SMART_EVENT_ESCORT_STOPPED: return sizeof(SmartEvent::waypoint); + case SMART_EVENT_ESCORT_ENDED: return sizeof(SmartEvent::waypoint); case SMART_EVENT_TIMED_EVENT_TRIGGERED: return sizeof(SmartEvent::timedEvent); case SMART_EVENT_UPDATE: return sizeof(SmartEvent::minMaxRepeat); case SMART_EVENT_LINK: return NO_PARAMS; @@ -676,8 +679,8 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) case SMART_EVENT_AREA_CASTING: return sizeof(SmartEvent::minMaxRepeat); case SMART_EVENT_AREA_RANGE: return sizeof(SmartEvent::minMaxRepeat); case SMART_EVENT_SUMMONED_UNIT_EVADE: return sizeof(SmartEvent::summoned); - case SMART_EVENT_WAYPOINT_DATA_REACHED: return sizeof(SmartEvent::wpData); - case SMART_EVENT_WAYPOINT_DATA_ENDED: return sizeof(SmartEvent::wpData); + case SMART_EVENT_WAYPOINT_REACHED: return sizeof(SmartEvent::wpData); + case SMART_EVENT_WAYPOINT_ENDED: return sizeof(SmartEvent::wpData); default: LOG_WARN("sql.sql", "SmartAIMgr: entryorguid {} source_type {} id {} action_type {} is using an event {} with no unused params specified in SmartAIMgr::CheckUnusedEventParams(), please report this.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetEventType()); @@ -764,9 +767,9 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_SUMMON_GO: return sizeof(SmartAction::summonGO); case SMART_ACTION_KILL_UNIT: return NO_PARAMS; case SMART_ACTION_ACTIVATE_TAXI: return sizeof(SmartAction::taxi); - case SMART_ACTION_WP_START: return sizeof(SmartAction::wpStart); - case SMART_ACTION_WP_PAUSE: return sizeof(SmartAction::wpPause); - case SMART_ACTION_WP_STOP: return sizeof(SmartAction::wpStop); + case SMART_ACTION_ESCORT_START: return sizeof(SmartAction::wpStart); + case SMART_ACTION_ESCORT_PAUSE: return sizeof(SmartAction::wpPause); + case SMART_ACTION_ESCORT_STOP: return sizeof(SmartAction::wpStop); case SMART_ACTION_ADD_ITEM: return sizeof(SmartAction::item); case SMART_ACTION_REMOVE_ITEM: return sizeof(SmartAction::item); case SMART_ACTION_INSTALL_AI_TEMPLATE: return sizeof(SmartAction::installTtemplate); @@ -776,7 +779,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_TELEPORT: return sizeof(SmartAction::teleport); case SMART_ACTION_SET_COUNTER: return sizeof(SmartAction::setCounter); case SMART_ACTION_STORE_TARGET_LIST: return sizeof(SmartAction::storeTargets); - case SMART_ACTION_WP_RESUME: return NO_PARAMS; + case SMART_ACTION_ESCORT_RESUME: return NO_PARAMS; case SMART_ACTION_SET_ORIENTATION: return sizeof(SmartAction::orientation); case SMART_ACTION_CREATE_TIMED_EVENT: return sizeof(SmartAction::timeEvent); case SMART_ACTION_PLAYMOVIE: return sizeof(SmartAction::movie); @@ -866,6 +869,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_ZONE_UNDER_ATTACK: return NO_PARAMS; case SMART_ACTION_LOAD_GRID: return NO_PARAMS; case SMART_ACTION_MUSIC: return sizeof(SmartAction::music); + case SMART_ACTION_DO_ACTION: return sizeof(SmartAction::doAction); case SMART_ACTION_SET_GUID: return sizeof(SmartAction::setGuid); case SMART_ACTION_SCRIPTED_SPAWN: return sizeof(SmartAction::scriptSpawn); case SMART_ACTION_SET_SCALE: return sizeof(SmartAction::setScale); @@ -873,7 +877,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_PLAY_SPELL_VISUAL: return sizeof(SmartAction::spellVisual); case SMART_ACTION_FOLLOW_GROUP: return sizeof(SmartAction::followGroup); case SMART_ACTION_SET_ORIENTATION_TARGET: return sizeof(SmartAction::orientationTarget); - case SMART_ACTION_WAYPOINT_DATA_START: return sizeof(SmartAction::wpData); + case SMART_ACTION_WAYPOINT_START: return sizeof(SmartAction::wpData); case SMART_ACTION_WAYPOINT_DATA_RANDOM: return sizeof(SmartAction::wpDataRandom); case SMART_ACTION_MOVEMENT_STOP: return NO_PARAMS; case SMART_ACTION_MOVEMENT_PAUSE: return sizeof(SmartAction::move); @@ -1414,19 +1418,19 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_EVENT_QUEST_REWARDED: case SMART_EVENT_QUEST_FAIL: case SMART_EVENT_JUST_SUMMONED: - case SMART_EVENT_WAYPOINT_START: - case SMART_EVENT_WAYPOINT_REACHED: - case SMART_EVENT_WAYPOINT_PAUSED: - case SMART_EVENT_WAYPOINT_RESUMED: - case SMART_EVENT_WAYPOINT_STOPPED: - case SMART_EVENT_WAYPOINT_ENDED: + case SMART_EVENT_ESCORT_START: + case SMART_EVENT_ESCORT_REACHED: + case SMART_EVENT_ESCORT_PAUSED: + case SMART_EVENT_ESCORT_RESUMED: + case SMART_EVENT_ESCORT_STOPPED: + case SMART_EVENT_ESCORT_ENDED: case SMART_EVENT_GOSSIP_SELECT: case SMART_EVENT_GOSSIP_HELLO: case SMART_EVENT_JUST_CREATED: case SMART_EVENT_FOLLOW_COMPLETED: case SMART_EVENT_ON_SPELLCLICK: - case SMART_EVENT_WAYPOINT_DATA_REACHED: - case SMART_EVENT_WAYPOINT_DATA_ENDED: + case SMART_EVENT_WAYPOINT_REACHED: + case SMART_EVENT_WAYPOINT_ENDED: break; default: LOG_ERROR("sql.sql", "SmartAIMgr: Not handled event_type({}), Entry {} SourceType {} Event {} Action {}, skipped.", e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); @@ -1562,11 +1566,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); return false; } - if (e.action.startClosestWaypoint.repeat > 1 || e.action.startClosestWaypoint.run > 1) + if (e.action.startClosestWaypoint.repeat > 1 || e.action.startClosestWaypoint.forcedMovement >= FORCED_MOVEMENT_MAX) { - LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invalid run ({}) or repeat ({}) parameter, must be 0 or 1.", + LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invalid forcedMovement ({}) or repeat ({}) parameter, must be 0 or 1.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), - e.action.startClosestWaypoint.repeat, e.action.startClosestWaypoint.run); + e.action.startClosestWaypoint.repeat, e.action.startClosestWaypoint.forcedMovement); return false; } break; @@ -1719,11 +1723,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; } break; - case SMART_ACTION_WP_STOP: + case SMART_ACTION_ESCORT_STOP: if (e.action.wpStop.quest && !IsQuestValid(e, e.action.wpStop.quest)) return false; return IsSAIBoolValid(e, e.action.wpStop.fail); - case SMART_ACTION_WP_START: + case SMART_ACTION_ESCORT_START: { if (!sSmartWaypointMgr->GetPath(e.action.wpStart.pathID)) { @@ -1743,8 +1747,13 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; } - return IsSAIBoolValid(e, e.action.wpStart.run) && - IsSAIBoolValid(e, e.action.wpStart.repeat); + if (e.action.wpStart.forcedMovement >= FORCED_MOVEMENT_MAX) + { + LOG_ERROR("sql.sql", "SmartAIMgr: Creature {} Event {} Action {} uses invalid forcedMovement {}, skipped.", e.entryOrGuid, e.event_id, e.GetActionType(), e.action.wpStart.forcedMovement); + return false; + } + + return IsSAIBoolValid(e, e.action.wpStart.repeat); } case SMART_ACTION_CREATE_TIMED_EVENT: { @@ -1933,7 +1942,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_STORE_TARGET_LIST: case SMART_ACTION_COMBAT_STOP: case SMART_ACTION_DIE: - case SMART_ACTION_WP_RESUME: + case SMART_ACTION_ESCORT_RESUME: case SMART_ACTION_KILL_UNIT: case SMART_ACTION_SET_INVINCIBILITY_HP_LEVEL: case SMART_ACTION_RESET_GOBJECT: @@ -1943,7 +1952,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_SET_INST_DATA64: case SMART_ACTION_SET_DATA: case SMART_ACTION_MOVE_FORWARD: - case SMART_ACTION_WP_PAUSE: + case SMART_ACTION_ESCORT_PAUSE: case SMART_ACTION_SET_FLY: case SMART_ACTION_FORCE_DESPAWN: case SMART_ACTION_SET_INGAME_PHASE_MASK: @@ -2013,7 +2022,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_PLAY_SPELL_VISUAL: case SMART_ACTION_FOLLOW_GROUP: case SMART_ACTION_SET_ORIENTATION_TARGET: - case SMART_ACTION_WAYPOINT_DATA_START: + case SMART_ACTION_WAYPOINT_START: case SMART_ACTION_WAYPOINT_DATA_RANDOM: case SMART_ACTION_MOVEMENT_STOP: case SMART_ACTION_MOVEMENT_PAUSE: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 47b0d47961..3c6fd40048 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -26,29 +26,10 @@ #include "Optional.h" #include "SpellMgr.h" #include <limits> +#include "WaypointMgr.h" typedef uint32 SAIBool; -struct WayPoint -{ - WayPoint(uint32 _id, float _x, float _y, float _z, Optional<float> _o, uint32 _delay) - { - id = _id; - x = _x; - y = _y; - z = _z; - o = _o; - delay = _delay; - } - - uint32 id; - float x; - float y; - float z; - std::optional<float> o; - uint32 delay; -}; - enum eSmartAI { SMART_EVENT_PARAM_COUNT = 4, @@ -149,13 +130,13 @@ enum SMART_EVENT SMART_EVENT_SPELLHIT_TARGET = 31, // SpellID, School, CooldownMin, CooldownMax SMART_EVENT_DAMAGED = 32, // MinDmg, MaxDmg, CooldownMin, CooldownMax SMART_EVENT_DAMAGED_TARGET = 33, // MinDmg, MaxDmg, CooldownMin, CooldownMax - SMART_EVENT_MOVEMENTINFORM = 34, // MovementType(any), PointID + SMART_EVENT_MOVEMENTINFORM = 34, // MovementType(any), PointID, PathId(0 - any) SMART_EVENT_SUMMON_DESPAWNED = 35, // Entry, CooldownMin, CooldownMax SMART_EVENT_CORPSE_REMOVED = 36, // NONE SMART_EVENT_AI_INIT = 37, // NONE SMART_EVENT_DATA_SET = 38, // Id, Value, CooldownMin, CooldownMax - SMART_EVENT_WAYPOINT_START = 39, // PointId(0any), pathID(0any) - SMART_EVENT_WAYPOINT_REACHED = 40, // PointId(0any), pathID(0any) + SMART_EVENT_ESCORT_START = 39, // PointId(0any), pathID(0any) + SMART_EVENT_ESCORT_REACHED = 40, // PointId(0any), pathID(0any) SMART_EVENT_TRANSPORT_ADDPLAYER = 41, // NONE SMART_EVENT_TRANSPORT_ADDCREATURE = 42, // Entry (0 any) SMART_EVENT_TRANSPORT_REMOVE_PLAYER = 43, // NONE @@ -170,10 +151,10 @@ enum SMART_EVENT SMART_EVENT_TEXT_OVER = 52, // GroupId from creature_text, creature entry who talks (0 any) SMART_EVENT_RECEIVE_HEAL = 53, // MinHeal, MaxHeal, CooldownMin, CooldownMax SMART_EVENT_JUST_SUMMONED = 54, // none - SMART_EVENT_WAYPOINT_PAUSED = 55, // PointId(0any), pathID(0any) - SMART_EVENT_WAYPOINT_RESUMED = 56, // PointId(0any), pathID(0any) - SMART_EVENT_WAYPOINT_STOPPED = 57, // PointId(0any), pathID(0any) - SMART_EVENT_WAYPOINT_ENDED = 58, // PointId(0any), pathID(0any) + SMART_EVENT_ESCORT_PAUSED = 55, // PointId(0any), pathID(0any) + SMART_EVENT_ESCORT_RESUMED = 56, // PointId(0any), pathID(0any) + SMART_EVENT_ESCORT_STOPPED = 57, // PointId(0any), pathID(0any) + SMART_EVENT_ESCORT_ENDED = 58, // PointId(0any), pathID(0any) SMART_EVENT_TIMED_EVENT_TRIGGERED = 59, // id SMART_EVENT_UPDATE = 60, // InitialMin, InitialMax, RepeatMin, RepeatMax SMART_EVENT_LINK = 61, // INTERNAL USAGE, no params, used to link together multiple events, does not use any extra resources to iterate event lists needlessly @@ -213,8 +194,8 @@ enum SMART_EVENT SMART_EVENT_AREA_CASTING = 105, // min, max, repeatMin, repeatMax, rangeMin, rangeMax SMART_EVENT_AREA_RANGE = 106, // min, max, repeatMin, repeatMax, rangeMin, rangeMax SMART_EVENT_SUMMONED_UNIT_EVADE = 107, // CreatureId(0 all), CooldownMin, CooldownMax - SMART_EVENT_WAYPOINT_DATA_REACHED = 108, // PointId (0: any), pathId (0: any) - SMART_EVENT_WAYPOINT_DATA_ENDED = 109, // PointId (0: any), pathId (0: any) + SMART_EVENT_WAYPOINT_REACHED = 108, // PointId (0: any), pathId (0: any) + SMART_EVENT_WAYPOINT_ENDED = 109, // PointId (0: any), pathId (0: any) SMART_EVENT_IS_IN_MELEE_RANGE = 110, // min, max, repeatMin, repeatMax, dist, invert (0: false, 1: true) SMART_EVENT_AC_END = 111 @@ -356,6 +337,7 @@ struct SmartEvent { uint32 type; uint32 id; + uint32 pathId; } movementInform; struct @@ -608,9 +590,9 @@ enum SMART_ACTION SMART_ACTION_SUMMON_GO = 50, // GameObjectID, DespawnTime, targetSummon, summonType (0 time or summoner dies/1 time) SMART_ACTION_KILL_UNIT = 51, // SMART_ACTION_ACTIVATE_TAXI = 52, // TaxiID - SMART_ACTION_WP_START = 53, // run/walk, pathID, canRepeat, quest, despawntime, reactState - SMART_ACTION_WP_PAUSE = 54, // time - SMART_ACTION_WP_STOP = 55, // despawnTime, quest, fail? + SMART_ACTION_ESCORT_START = 53, // run/walk, pathID, canRepeat, quest, despawntime, reactState + SMART_ACTION_ESCORT_PAUSE = 54, // time + SMART_ACTION_ESCORT_STOP = 55, // despawnTime, quest, fail? SMART_ACTION_ADD_ITEM = 56, // itemID, count SMART_ACTION_REMOVE_ITEM = 57, // itemID, count SMART_ACTION_INSTALL_AI_TEMPLATE = 58, // AITemplateID @@ -620,7 +602,7 @@ enum SMART_ACTION SMART_ACTION_TELEPORT = 62, // mapID, SMART_ACTION_SET_COUNTER = 63, // id, value, reset (0/1) SMART_ACTION_STORE_TARGET_LIST = 64, // varID, - SMART_ACTION_WP_RESUME = 65, // none + SMART_ACTION_ESCORT_RESUME = 65, // none SMART_ACTION_SET_ORIENTATION = 66, // quick change, random orientation? (0/1), turnAngle SMART_ACTION_CREATE_TIMED_EVENT = 67, // id, InitialMin, InitialMax, RepeatMin(only if it repeats), RepeatMax(only if it repeats), chance SMART_ACTION_PLAYMOVIE = 68, // entry @@ -732,7 +714,7 @@ enum SMART_ACTION SMART_ACTION_PLAY_SPELL_VISUAL = 229, // visualId, visualIdImpact SMART_ACTION_FOLLOW_GROUP = 230, // followState, followType, dist SMART_ACTION_SET_ORIENTATION_TARGET = 231, // type, target_type, target_param1, target_param2, target_param3, target_param4 - SMART_ACTION_WAYPOINT_DATA_START = 232, // pathId, repeat + SMART_ACTION_WAYPOINT_START = 232, // pathId, repeat, pathSource SMART_ACTION_WAYPOINT_DATA_RANDOM = 233, // pathId1, pathId2, repeat SMART_ACTION_MOVEMENT_STOP = 234, // SMART_ACTION_MOVEMENT_PAUSE = 235, // timer @@ -1041,7 +1023,7 @@ struct SmartAction struct { - SAIBool run; + uint32 forcedMovement; uint32 pathID; SAIBool repeat; uint32 quest; @@ -1295,7 +1277,7 @@ struct SmartAction uint32 pathId1; uint32 pathId2; uint32 repeat; - uint32 run; + uint32 forcedMovement; } startClosestWaypoint; struct @@ -1482,6 +1464,7 @@ struct SmartAction { uint32 pathId; SAIBool repeat; + PathSource pathSource; } wpData; struct @@ -1853,8 +1836,8 @@ const uint32 SmartAIEventMask[SMART_EVENT_AC_END][2] = {SMART_EVENT_CORPSE_REMOVED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_AI_INIT, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_DATA_SET, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, - {SMART_EVENT_WAYPOINT_START, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_WAYPOINT_REACHED, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_ESCORT_START, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_ESCORT_REACHED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_TRANSPORT_ADDPLAYER, SMART_SCRIPT_TYPE_MASK_TRANSPORT }, {SMART_EVENT_TRANSPORT_ADDCREATURE, SMART_SCRIPT_TYPE_MASK_TRANSPORT }, {SMART_EVENT_TRANSPORT_REMOVE_PLAYER, SMART_SCRIPT_TYPE_MASK_TRANSPORT }, @@ -1869,10 +1852,10 @@ const uint32 SmartAIEventMask[SMART_EVENT_AC_END][2] = {SMART_EVENT_TEXT_OVER, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_RECEIVE_HEAL, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_JUST_SUMMONED, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_WAYPOINT_PAUSED, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_WAYPOINT_RESUMED, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_WAYPOINT_STOPPED, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_WAYPOINT_ENDED, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_ESCORT_PAUSED, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_ESCORT_RESUMED, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_ESCORT_STOPPED, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_ESCORT_ENDED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_TIMED_EVENT_TRIGGERED, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_UPDATE, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_LINK, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_EVENT + SMART_SCRIPT_TYPE_MASK_GOSSIP + SMART_SCRIPT_TYPE_MASK_QUEST + SMART_SCRIPT_TYPE_MASK_SPELL + SMART_SCRIPT_TYPE_MASK_TRANSPORT + SMART_SCRIPT_TYPE_MASK_INSTANCE }, @@ -1922,8 +1905,8 @@ const uint32 SmartAIEventMask[SMART_EVENT_AC_END][2] = {SMART_EVENT_AREA_CASTING, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_AREA_RANGE, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_SUMMONED_UNIT_EVADE, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, - {SMART_EVENT_WAYPOINT_DATA_REACHED, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_WAYPOINT_DATA_ENDED, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_WAYPOINT_REACHED, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_EVENT_WAYPOINT_ENDED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_IS_IN_MELEE_RANGE, SMART_SCRIPT_TYPE_MASK_CREATURE }, }; @@ -2010,8 +1993,6 @@ public: static constexpr uint32 DEFAULT_PRIORITY = std::numeric_limits<uint32>::max(); }; -typedef std::unordered_map<uint32, WayPoint*> WPPath; - typedef std::vector<WorldObject*> ObjectVector; class ObjectGuidVector @@ -2059,7 +2040,7 @@ public: void LoadFromDB(); - WPPath* GetPath(uint32 id) + WaypointPath* GetPath(uint32 id) { if (waypoint_map.find(id) != waypoint_map.end()) return waypoint_map[id]; @@ -2067,7 +2048,7 @@ public: } private: - std::unordered_map<uint32, WPPath*> waypoint_map; + std::unordered_map<uint32, WaypointPath*> waypoint_map; }; // all events for a single entry diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index f96775eb44..9c26fd6e91 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2378,7 +2378,7 @@ void AchievementMgr::SendAllAchievementData() const { WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, _completedAchievements.size() * 8 + 4 + _criteriaProgress.size() * 38 + 4); BuildAllDataPacket(&data); - GetPlayer()->GetSession()->SendPacket(&data); + GetPlayer()->SendDirectMessage(&data); } void AchievementMgr::SendRespondInspectAchievements(Player* player) const @@ -2386,7 +2386,7 @@ void AchievementMgr::SendRespondInspectAchievements(Player* player) const WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 9 + _completedAchievements.size() * 8 + 4 + _criteriaProgress.size() * 38 + 4); data << GetPlayer()->GetPackGUID(); BuildAllDataPacket(&data); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } /** diff --git a/src/server/game/ArenaSpectator/ArenaSpectator.cpp b/src/server/game/ArenaSpectator/ArenaSpectator.cpp index e1f0c76027..7c0f4a7b04 100644 --- a/src/server/game/ArenaSpectator/ArenaSpectator.cpp +++ b/src/server/game/ArenaSpectator/ArenaSpectator.cpp @@ -306,7 +306,7 @@ AC_GAME_API void ArenaSpectator::SendPacketTo(Player const* player, std::string& { WorldPacket data; CreatePacket(data, message); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } template<> diff --git a/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp b/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp index 0d50d7eafa..9b8a9a1dc8 100644 --- a/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseSearcher.cpp @@ -354,7 +354,7 @@ void AuctionHouseSearcher::Update() { Player* player = ObjectAccessor::FindConnectedPlayer(response->playerGuid); if (player) - player->GetSession()->SendPacket(&response->packet); + player->SendDirectMessage(&response->packet); delete response; } diff --git a/src/server/game/Autobroadcast/AutobroadcastMgr.cpp b/src/server/game/Autobroadcast/AutobroadcastMgr.cpp index f41e27bb01..9d323c1650 100644 --- a/src/server/game/Autobroadcast/AutobroadcastMgr.cpp +++ b/src/server/game/Autobroadcast/AutobroadcastMgr.cpp @@ -203,6 +203,6 @@ void AutobroadcastMgr::SendNotificationAnnouncement(uint8 textId) data << localizedMessage; // Send packet to the player - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); }); } diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index f74aebff2f..360fe9f69b 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -458,7 +458,7 @@ void Battlefield::BroadcastPacketToZone(WorldPacket const* data) const for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team) for (GuidUnorderedSet::const_iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(*itr)) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } void Battlefield::BroadcastPacketToQueue(WorldPacket const* data) const @@ -466,7 +466,7 @@ void Battlefield::BroadcastPacketToQueue(WorldPacket const* data) const for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team) for (GuidUnorderedSet::const_iterator itr = m_PlayersInQueue[team].begin(); itr != m_PlayersInQueue[team].end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(*itr)) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } void Battlefield::BroadcastPacketToWar(WorldPacket const* data) const @@ -474,7 +474,7 @@ void Battlefield::BroadcastPacketToWar(WorldPacket const* data) const for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team) for (GuidUnorderedSet::const_iterator itr = m_PlayersInWar[team].begin(); itr != m_PlayersInWar[team].end(); ++itr) if (Player* player = ObjectAccessor::FindPlayer(*itr)) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } void Battlefield::SendWarning(uint8 id, WorldObject const* target /*= nullptr*/) @@ -663,7 +663,7 @@ void Battlefield::SendAreaSpiritHealerQueryOpcode(Player* player, const ObjectGu data << guid << time; ASSERT(player); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } // ---------------------- @@ -855,7 +855,7 @@ GameObject* Battlefield::SpawnGameObject(uint32 entry, float x, float y, float z return go; } -Creature* Battlefield::GetCreature(ObjectGuid const guid) +Creature* Battlefield::GetCreature(ObjectGuid const& guid) { if (!m_Map) return nullptr; @@ -863,7 +863,7 @@ Creature* Battlefield::GetCreature(ObjectGuid const guid) return m_Map->GetCreature(guid); } -GameObject* Battlefield::GetGameObject(ObjectGuid const guid) +GameObject* Battlefield::GetGameObject(ObjectGuid const& guid) { if (!m_Map) return nullptr; diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index ab00697c33..c4f94f0714 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -146,6 +146,7 @@ class BfGraveyard { public: BfGraveyard(Battlefield* Bf); + virtual ~BfGraveyard() = default; // Method to changing who controls the graveyard void GiveControlTo(TeamId team); @@ -302,8 +303,8 @@ public: Creature* SpawnCreature(uint32 entry, Position pos, TeamId teamId); GameObject* SpawnGameObject(uint32 entry, float x, float y, float z, float o); - Creature* GetCreature(ObjectGuid const guid); - GameObject* GetGameObject(ObjectGuid const guid); + Creature* GetCreature(ObjectGuid const& guid); + GameObject* GetGameObject(ObjectGuid const& guid); // Script-methods diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index c0a4f55362..89eef49ae5 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -415,7 +415,7 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer) { for (GuidUnorderedSet::const_iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr) if (Creature* creature = GetCreature(*itr)) - creature->DespawnOrUnsummon(1); + creature->DespawnOrUnsummon(1ms); m_vehicles[team].clear(); } diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 753fc9d481..2e0132f1c2 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -162,7 +162,7 @@ bool ArenaTeam::AddMember(ObjectGuid playerGuid) // Feed data to the struct ArenaTeamMember newMember; - //newMember.Name = playerName; + newMember.Name = playerName; newMember.Guid = playerGuid; newMember.Class = playerClass; newMember.SeasonGames = 0; @@ -249,7 +249,7 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result) newMember.WeekWins = fields[3].Get<uint16>(); newMember.SeasonGames = fields[4].Get<uint16>(); newMember.SeasonWins = fields[5].Get<uint16>(); - //newMember.Name = fields[6].Get<std::string>(); + newMember.Name = fields[6].Get<std::string>(); newMember.Class = fields[7].Get<uint8>(); newMember.PersonalRating = fields[8].Get<uint16>(); newMember.MatchMakerRating = fields[9].Get<uint16>() > 0 ? fields[9].Get<uint16>() : sWorld->getIntConfig(CONFIG_ARENA_START_MATCHMAKER_RATING); @@ -349,7 +349,7 @@ void ArenaTeam::DelMember(ObjectGuid guid, bool cleanDb) playerMember->RemoveBattlegroundQueueId(bgQueue); sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, nullptr, playerMember->GetBattlegroundQueueIndex(bgQueue), STATUS_NONE, 0, 0, 0, TEAM_NEUTRAL); queue.RemovePlayer(playerMember->GetGUID(), true); - playerMember->GetSession()->SendPacket(&data); + playerMember->SendDirectMessage(&data); } } } @@ -567,7 +567,7 @@ void ArenaTeam::BroadcastPacket(WorldPacket* packet) { for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) if (Player* player = ObjectAccessor::FindConnectedPlayer(itr->Guid)) - player->GetSession()->SendPacket(packet); + player->SendDirectMessage(packet); } void ArenaTeam::BroadcastEvent(ArenaTeamEvents event, ObjectGuid guid, uint8 strCount, std::string const& str1, std::string const& str2, std::string const& str3) diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 7ddd4e87e2..b004f11680 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -608,7 +608,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) { WorldPacket status; sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, player->GetCurrentBattlegroundQueueSlot(), STATUS_IN_PROGRESS, 0, GetStartTime(), GetArenaType(), player->GetBgTeamId()); - player->GetSession()->SendPacket(&status); + player->SendDirectMessage(&status); player->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION); player->ResetAllPowers(); @@ -652,7 +652,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) data << t->GetGUID(); data << uint32(t->GetZoneId()); data << uint32(15 * IN_MILLISECONDS); - p->GetSession()->SendPacket(&data); + p->SendDirectMessage(&data); } m_ToBeTeleported.clear(); } @@ -713,14 +713,14 @@ Position const* Battleground::GetTeamStartPosition(TeamId teamId) const void Battleground::SendPacketToAll(WorldPacket const* packet) { for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) - itr->second->GetSession()->SendPacket(packet); + itr->second->SendDirectMessage(packet); } void Battleground::SendPacketToTeam(TeamId teamId, WorldPacket const* packet, Player* sender, bool self) { for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) if (itr->second->GetBgTeamId() == teamId && (self || sender != itr->second)) - itr->second->GetSession()->SendPacket(packet); + itr->second->SendDirectMessage(packet); } void Battleground::SendChatMessage(Creature* source, uint8 textId, WorldObject* target /*= nullptr*/) @@ -937,7 +937,7 @@ void Battleground::EndBattleground(PvPTeamId winnerTeamId) BlockMovement(player); - player->GetSession()->SendPacket(&pvpLogData); + player->SendDirectMessage(&pvpLogData); if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE)) { @@ -964,7 +964,7 @@ void Battleground::EndBattleground(PvPTeamId winnerTeamId) WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetCurrentBattlegroundQueueSlot(), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType(), player->GetBgTeamId()); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, player->GetMapId()); } @@ -1062,7 +1062,7 @@ void Battleground::RemovePlayerAtLeave(Player* player) WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetCurrentBattlegroundQueueSlot(), STATUS_NONE, 0, 0, 0, TEAM_NEUTRAL); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetBgTypeID(), GetArenaType()); @@ -1178,16 +1178,19 @@ void Battleground::AddPlayer(Player* player) sBattlegroundMgr->BuildPlayerJoinedBattlegroundPacket(&data, player); SendPacketToTeam(teamId, &data, player, false); - player->RemoveAurasByType(SPELL_AURA_MOUNTED); - // add arena specific auras if (isArena()) { // restore pets health before remove - if (Pet* pet = player->GetPet()) + Pet* pet = player->GetPet(); + if (pet) if (pet->IsAlive()) pet->SetHealth(pet->GetMaxHealth()); + player->RemoveArenaAuras(); + if (pet) + pet->RemoveArenaAuras(); + player->RemoveArenaSpellCooldowns(true); player->RemoveArenaEnchantments(TEMP_ENCHANTMENT_SLOT); player->DestroyConjuredItems(true); player->UnsummonPetTemporaryIfAny(); @@ -1338,7 +1341,7 @@ bool Battleground::HasFreeSlots() const void Battleground::SpectatorsSendPacket(WorldPacket& data) { for (SpectatorList::const_iterator itr = m_Spectators.begin(); itr != m_Spectators.end(); ++itr) - (*itr)->GetSession()->SendPacket(&data); + (*itr)->SendDirectMessage(&data); } void Battleground::ReadyMarkerClicked(Player* p) @@ -1810,10 +1813,10 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player) BlockMovement(player); BuildPvPLogDataPacket(data); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetCurrentBattlegroundQueueSlot(), STATUS_IN_PROGRESS, GetEndTime(), GetStartTime(), GetArenaType(), player->GetBgTeamId()); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } uint32 Battleground::GetAlivePlayersCountByTeam(TeamId teamId) const diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index f447a47d41..c40ec2c9e0 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -670,7 +670,7 @@ void BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(Player* player, Battlegrou if (time_ == uint32(-1)) time_ = 0; data << guid << time_; - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } bool BattlegroundMgr::IsArenaType(BattlegroundTypeId bgTypeId) diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 81832437b8..a70a21b59f 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -366,7 +366,7 @@ void BattlegroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount) void BattlegroundQueue::AddEvent(BasicEvent* Event, uint64 e_time) { - m_events.AddEvent(Event, m_events.CalculateTime(e_time)); + m_events.AddEventAtOffset(Event, Milliseconds(e_time)); } bool BattlegroundQueue::IsPlayerInvitedToRatedArena(ObjectGuid pl_guid) @@ -1274,7 +1274,7 @@ void BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg, // send status packet WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME, 0, ginfo->ArenaType, TEAM_NEUTRAL, bg->isRated()); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); // pussywizard: if (bg->isArena() && bg->isRated()) @@ -1312,7 +1312,7 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) // send remaining time in queue WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, m_ArenaType, TEAM_NEUTRAL, bg->isRated(), m_BgTypeId); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp index 10c0956e5d..ab12f3634a 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp @@ -101,7 +101,7 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff) uint8 controlledPoints = _controlledPoints[teamId]; if (controlledPoints == 0) { - _bgEvents.ScheduleEvent(eventId, 3000); + _bgEvents.ScheduleEvent(eventId, 3s); break; } @@ -115,7 +115,7 @@ void BattlegroundAB::PostUpdateImpl(uint32 diff) if (honorRewards < uint8(m_TeamScores[teamId] / _honorTics)) RewardHonorToTeam(GetBonusHonorFromKill(1), teamId); if (reputationRewards < uint8(m_TeamScores[teamId] / _reputationTics)) - RewardReputationToTeam(teamId == TEAM_ALLIANCE ? 509 : 510, 10, teamId); + RewardReputationToTeam(teamId == TEAM_ALLIANCE ? 509 : 510, uint32(10 * _abReputationRate), teamId); if (information < uint8(m_TeamScores[teamId] / BG_AB_WARNING_NEAR_VICTORY_SCORE)) { if (teamId == TEAM_ALLIANCE) @@ -170,8 +170,8 @@ void BattlegroundAB::StartingEventOpenDoors() DoorOpen(BG_AB_OBJECT_GATE_A); DoorOpen(BG_AB_OBJECT_GATE_H); StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, BG_AB_EVENT_START_BATTLE); - _bgEvents.ScheduleEvent(BG_AB_EVENT_ALLIANCE_TICK, 3000); - _bgEvents.ScheduleEvent(BG_AB_EVENT_HORDE_TICK, 3000); + _bgEvents.ScheduleEvent(BG_AB_EVENT_ALLIANCE_TICK, 3s); + _bgEvents.ScheduleEvent(BG_AB_EVENT_HORDE_TICK, 3s); } void BattlegroundAB::AddPlayer(Player* player) @@ -421,6 +421,7 @@ bool BattlegroundAB::SetupBattleground() { _honorTics = BattlegroundMgr::IsBGWeekend(GetBgTypeID(true)) ? BG_AB_HONOR_TICK_WEEKEND : BG_AB_HONOR_TICK_NORMAL; _reputationTics = BattlegroundMgr::IsBGWeekend(GetBgTypeID(true)) ? BG_AB_REP_TICK_WEEKEND : BG_AB_REP_TICK_NORMAL; + _abReputationRate = sWorld->getRate(RATE_REPUTATION_GAIN_AB); for (uint32 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index a250c9f16e..9c3bf400c2 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -170,12 +170,11 @@ enum BG_AB_Misc BG_AB_WARNING_NEAR_VICTORY_SCORE = 1400, BG_AB_MAX_TEAM_SCORE = 1600, - - BG_AB_FLAG_CAPTURING_TIME = 60000, - BG_AB_BANNER_UPDATE_TIME = 2000 }; +constexpr Milliseconds BG_AB_FLAG_CAPTURING_TIME = 60s; +constexpr Milliseconds BG_AB_BANNER_UPDATE_TIME = 2s; -const uint32 BG_AB_TickIntervals[BG_AB_DYNAMIC_NODES_COUNT + 1] = {0, 12000, 9000, 6000, 3000, 1000}; +const Milliseconds BG_AB_TickIntervals[BG_AB_DYNAMIC_NODES_COUNT + 1] = {0ms, 12s, 9s, 6s, 3s, 1s}; const uint32 BG_AB_TickPoints[BG_AB_DYNAMIC_NODES_COUNT + 1] = {0, 10, 10, 10, 10, 30}; const uint32 BG_AB_GraveyardIds[BG_AB_ALL_NODES_COUNT] = {895, 894, 893, 897, 896, 898, 899}; @@ -299,6 +298,7 @@ private: EventMap _bgEvents; uint32 _honorTics; uint32 _reputationTics; + float _abReputationRate; uint8 _controlledPoints[PVP_TEAMS_COUNT] {}; bool _teamScores500Disadvantage[PVP_TEAMS_COUNT] {}; uint32 _configurableMaxTeamScore; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp index 5b6a8b335f..b65daf5d9e 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp @@ -194,21 +194,21 @@ void BattlegroundAV::HandleQuestComplete(uint32 questid, Player* player) case AV_QUEST_A_COMMANDER1: case AV_QUEST_H_COMMANDER1: m_Team_QuestStatus[teamId][1]++; - RewardReputationToTeam(teamId, 1, teamId); + RewardReputationToTeam(teamId, uint32(1 * _avReputationRate), teamId); if (m_Team_QuestStatus[teamId][1] == 30) LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid); break; case AV_QUEST_A_COMMANDER2: case AV_QUEST_H_COMMANDER2: m_Team_QuestStatus[teamId][2]++; - RewardReputationToTeam(teamId, 1, teamId); + RewardReputationToTeam(teamId, uint32(1 * _avReputationRate), teamId); if (m_Team_QuestStatus[teamId][2] == 60) LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid); break; case AV_QUEST_A_COMMANDER3: case AV_QUEST_H_COMMANDER3: m_Team_QuestStatus[teamId][3]++; - RewardReputationToTeam(teamId, 1, teamId); + RewardReputationToTeam(teamId, uint32(1 * _avReputationRate), teamId); if (m_Team_QuestStatus[teamId][3] == 120) LOG_DEBUG("bg.battleground", "BG_AV Quest {} completed (need to implement some events here", questid); break; @@ -316,21 +316,21 @@ Creature* BattlegroundAV::AddAVCreature(uint16 cinfoid, uint16 type) type -= AV_CPLACE_MAX; cinfoid = uint16(BG_AV_StaticCreaturePos[type][4]); creature = AddCreature(BG_AV_StaticCreatureInfo[cinfoid], - type + AV_CPLACE_MAX, - BG_AV_StaticCreaturePos[type][0], - BG_AV_StaticCreaturePos[type][1], - BG_AV_StaticCreaturePos[type][2], - BG_AV_StaticCreaturePos[type][3]); + type + AV_CPLACE_MAX, + BG_AV_StaticCreaturePos[type][0], + BG_AV_StaticCreaturePos[type][1], + BG_AV_StaticCreaturePos[type][2], + BG_AV_StaticCreaturePos[type][3]); isStatic = true; } else { creature = AddCreature(BG_AV_CreatureInfo[cinfoid], - type, - BG_AV_CreaturePos[type][0], - BG_AV_CreaturePos[type][1], - BG_AV_CreaturePos[type][2], - BG_AV_CreaturePos[type][3]); + type, + BG_AV_CreaturePos[type][0], + BG_AV_CreaturePos[type][1], + BG_AV_CreaturePos[type][2], + BG_AV_CreaturePos[type][3]); } if (!creature) return nullptr; @@ -344,7 +344,7 @@ Creature* BattlegroundAV::AddAVCreature(uint16 cinfoid, uint16 type) (cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3)))) { if (!isStatic && ((cinfoid >= AV_NPC_A_GRAVEDEFENSE0 && cinfoid <= AV_NPC_A_GRAVEDEFENSE3) - || (cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3))) + || (cinfoid >= AV_NPC_H_GRAVEDEFENSE0 && cinfoid <= AV_NPC_H_GRAVEDEFENSE3))) { CreatureData& data = sObjectMgr->NewOrExistCreatureData(creature->GetSpawnId()); data.wander_distance = 5; @@ -814,11 +814,11 @@ void BattlegroundAV::PopulateNode(BG_AV_Nodes node) if (!trigger) { trigger = AddCreature(WORLD_TRIGGER, - node + 302, - BG_AV_CreaturePos[node + 302][0], - BG_AV_CreaturePos[node + 302][1], - BG_AV_CreaturePos[node + 302][2], - BG_AV_CreaturePos[node + 302][3]); + node + 302, + BG_AV_CreaturePos[node + 302][0], + BG_AV_CreaturePos[node + 302][1], + BG_AV_CreaturePos[node + 302][2], + BG_AV_CreaturePos[node + 302][3]); } //add bonus honor aura trigger creature when node is accupied @@ -1240,25 +1240,28 @@ GraveyardStruct const* BattlegroundAV::GetClosestGraveyard(Player* player) bool BattlegroundAV::SetupBattleground() { + _avReputationRate = sWorld->getRate(RATE_REPUTATION_GAIN_AV); + if (sBattlegroundMgr->IsBGWeekend(GetBgTypeID(true))) { - _reputationTower = 18; - _reputationCaptain = 185; - _reputationBoss = 525; - _reputationPerOwnedGraveyard = 18; - _reputationSurvivingCaptain = 175; - _reputationSurvivingTower = 18; - _reputationPerOwnedMine = 36; + _reputationTower = uint32(18 * _avReputationRate); + _reputationCaptain = uint32(185 * _avReputationRate); + _reputationBoss = uint32(525 * _avReputationRate); + _reputationPerOwnedGraveyard = uint32(18 * _avReputationRate); + _reputationSurvivingCaptain = uint32(175 * _avReputationRate); + _reputationSurvivingTower = uint32(18 * _avReputationRate); + _reputationPerOwnedMine = uint32(36 * _avReputationRate); } else { - _reputationTower = 12; - _reputationCaptain = 125; - _reputationBoss = sWorld->getIntConfig(CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH); - _reputationPerOwnedGraveyard = 12; - _reputationSurvivingCaptain = 125; - _reputationSurvivingTower = 12; - _reputationPerOwnedMine = 24; + _reputationTower = uint32(12 * _avReputationRate); + _reputationCaptain = uint32(125 * _avReputationRate); + // Special case: This value comes from another config setting, but we still apply our multiplier + _reputationBoss = uint32(sWorld->getIntConfig(CONFIG_BATTLEGROUND_ALTERAC_REP_ONBOSSDEATH) * _avReputationRate); + _reputationPerOwnedGraveyard = uint32(12 * _avReputationRate); + _reputationSurvivingCaptain = uint32(125 * _avReputationRate); + _reputationSurvivingTower = uint32(12 * _avReputationRate); + _reputationPerOwnedMine = uint32(24 * _avReputationRate); } // Create starting objects diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index a058f1d98c..c8a0fd8cd2 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -1846,6 +1846,7 @@ private: uint32 _reputationSurvivingCaptain = 0; // 125, 175 uint32 _reputationSurvivingTower = 0; // 12, 18 uint32 _reputationPerOwnedMine = 0; // 24, 36 + float _avReputationRate; bool m_IsInformedNearVictory[2] {}; }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index ed636bcf5e..e646dd2e11 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -68,7 +68,7 @@ void BattlegroundEY::PostUpdateImpl(uint32 diff) AddPoints(TEAM_ALLIANCE, BG_EY_TickPoints[_ownedPointsCount[TEAM_ALLIANCE] - 1]); if (_ownedPointsCount[TEAM_HORDE] > 0) AddPoints(TEAM_HORDE, BG_EY_TickPoints[_ownedPointsCount[TEAM_HORDE] - 1]); - _bgEvents.ScheduleEvent(BG_EY_EVENT_ADD_POINTS, BG_EY_FPOINTS_TICK_TIME - (GameTime::GetGameTimeMS().count() % BG_EY_FPOINTS_TICK_TIME)); + _bgEvents.ScheduleEvent(BG_EY_EVENT_ADD_POINTS, BG_EY_FPOINTS_TICK_TIME - (GameTime::GetGameTimeMS() % BG_EY_FPOINTS_TICK_TIME)); break; case BG_EY_EVENT_FLAG_ON_GROUND: RespawnFlagAfterDrop(); @@ -78,7 +78,7 @@ void BattlegroundEY::PostUpdateImpl(uint32 diff) break; case BG_EY_EVENT_CHECK_CPOINTS: UpdatePointsState(); - _bgEvents.ScheduleEvent(BG_EY_EVENT_CHECK_CPOINTS, BG_EY_FPOINTS_CHECK_TIME - (GameTime::GetGameTimeMS().count() % BG_EY_FPOINTS_CHECK_TIME)); + _bgEvents.ScheduleEvent(BG_EY_EVENT_CHECK_CPOINTS, BG_EY_FPOINTS_CHECK_TIME - (GameTime::GetGameTimeMS() % BG_EY_FPOINTS_CHECK_TIME)); break; } } @@ -106,8 +106,8 @@ void BattlegroundEY::StartingEventOpenDoors() // Achievement: Flurry StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, BG_EY_EVENT_START_BATTLE); - _bgEvents.ScheduleEvent(BG_EY_EVENT_ADD_POINTS, 0); - _bgEvents.ScheduleEvent(BG_EY_EVENT_CHECK_CPOINTS, 0); + _bgEvents.ScheduleEvent(BG_EY_EVENT_ADD_POINTS, 0ms); + _bgEvents.ScheduleEvent(BG_EY_EVENT_CHECK_CPOINTS, 0ms); } void BattlegroundEY::AddPoints(TeamId teamId, uint32 points) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index 1cdf29992b..50a46ce411 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -31,13 +31,10 @@ enum BG_EY_Events BG_EY_EVENT_CHECK_CPOINTS = 4 }; -enum BG_EY_Timers -{ - BG_EY_FLAG_RESPAWN_TIME = 10 * IN_MILLISECONDS, - BG_EY_FLAG_ON_GROUND_TIME = 10 * IN_MILLISECONDS, - BG_EY_FPOINTS_CHECK_TIME = 2 * IN_MILLISECONDS, - BG_EY_FPOINTS_TICK_TIME = 2 * IN_MILLISECONDS -}; +constexpr Milliseconds BG_EY_FLAG_RESPAWN_TIME = 10s; +constexpr Milliseconds BG_EY_FLAG_ON_GROUND_TIME = 10s; +constexpr Milliseconds BG_EY_FPOINTS_CHECK_TIME = 2s; +constexpr Milliseconds BG_EY_FPOINTS_TICK_TIME = 2s; enum BG_EY_ProgressBarConsts { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index d02e6c03b7..f3dcaf3972 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -307,7 +307,7 @@ void BattlegroundSA::StartShips() WorldPacket pkt; GetBGObject(i)->BuildValuesUpdateBlockForPlayer(&data, itr->second); data.BuildPacket(pkt); - itr->second->GetSession()->SendPacket(&pkt); + itr->second->SendDirectMessage(&pkt); } } ShipsStarted = true; @@ -1141,7 +1141,7 @@ void BattlegroundSA::SendTransportInit(Player* player) GetBGObject(BG_SA_BOAT_TWO)->BuildCreateUpdateBlockForPlayer(&transData, player); WorldPacket packet; transData.BuildPacket(packet); - player->GetSession()->SendPacket(&packet); + player->SendDirectMessage(&packet); } } @@ -1156,7 +1156,7 @@ void BattlegroundSA::SendTransportsRemove(Player* player) GetBGObject(BG_SA_BOAT_TWO)->BuildOutOfRangeUpdateBlock(&transData); WorldPacket packet; transData.BuildPacket(packet); - player->GetSession()->SendPacket(&packet); + player->SendDirectMessage(&packet); } } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 272f07fbad..0c450b4833 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -63,7 +63,7 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff) { case BG_WS_EVENT_UPDATE_GAME_TIME: UpdateWorldState(WORLD_STATE_BATTLEGROUND_WS_STATE_TIMER, GetMatchTime()); - _bgEvents.ScheduleEvent(BG_WS_EVENT_UPDATE_GAME_TIME, ((BG_WS_TOTAL_GAME_TIME - GetStartTime()) % (MINUTE * IN_MILLISECONDS)) + 1); + _bgEvents.ScheduleEvent(BG_WS_EVENT_UPDATE_GAME_TIME, Milliseconds(((BG_WS_TOTAL_GAME_TIME - GetStartTime()) % (MINUTE * IN_MILLISECONDS)) + 1)); break; case BG_WS_EVENT_NO_TIME_LEFT: if (GetTeamScore(TEAM_ALLIANCE) == GetTeamScore(TEAM_HORDE)) @@ -137,8 +137,8 @@ void BattlegroundWS::StartingEventOpenDoors() StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, WS_EVENT_START_BATTLE); UpdateWorldState(WORLD_STATE_BATTLEGROUND_WS_STATE_TIMER_ACTIVE, 1); - _bgEvents.ScheduleEvent(BG_WS_EVENT_UPDATE_GAME_TIME, 0); - _bgEvents.ScheduleEvent(BG_WS_EVENT_NO_TIME_LEFT, BG_WS_TOTAL_GAME_TIME - 2 * MINUTE * IN_MILLISECONDS); // 27 - 2 = 25 minutes + _bgEvents.ScheduleEvent(BG_WS_EVENT_UPDATE_GAME_TIME, 0ms); + _bgEvents.ScheduleEvent(BG_WS_EVENT_NO_TIME_LEFT, Milliseconds(BG_WS_TOTAL_GAME_TIME - 2 * MINUTE * IN_MILLISECONDS)); // 27 - 2 = 25 minutes _bgEvents.ScheduleEvent(BG_WS_EVENT_DESPAWN_DOORS, BG_WS_DOOR_DESPAWN_TIME); } @@ -229,7 +229,7 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player) EndBattleground(GetTeamScore(TEAM_HORDE) == _configurableMaxTeamScore ? TEAM_HORDE : TEAM_ALLIANCE); } else - _bgEvents.ScheduleEvent(BG_WS_EVENT_RESPAWN_BOTH_FLAGS, BG_WS_FLAG_RESPAWN_TIME); + _bgEvents.ScheduleEvent(BG_WS_EVENT_RESPAWN_BOTH_FLAGS, Milliseconds(BG_WS_FLAG_RESPAWN_TIME)); _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10); _bgEvents.CancelEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15); @@ -426,15 +426,17 @@ void BattlegroundWS::HandleAreaTrigger(Player* player, uint32 trigger) bool BattlegroundWS::SetupBattleground() { + _wsReputationRate = sWorld->getRate(RATE_REPUTATION_GAIN_WSG); + if (sBattlegroundMgr->IsBGWeekend(GetBgTypeID(true))) { - _reputationCapture = 45; + _reputationCapture = uint32(45 * _wsReputationRate); _honorWinKills = 3; _honorEndKills = 4; } else { - _reputationCapture = 35; + _reputationCapture = uint32(35 * _wsReputationRate); _honorWinKills = 1; _honorEndKills = 2; } @@ -578,10 +580,10 @@ uint32 BattlegroundWS::GetAssaultSpellId() const { if ((!GetFlagPickerGUID(TEAM_ALLIANCE) && GetFlagState(TEAM_ALLIANCE) != BG_WS_FLAG_STATE_ON_GROUND) || (!GetFlagPickerGUID(TEAM_HORDE) && GetFlagState(TEAM_HORDE) != BG_WS_FLAG_STATE_ON_GROUND) || - _bgEvents.GetNextEventTime(BG_WS_EVENT_BOTH_FLAGS_KEPT10) > 0) + _bgEvents.HasTimeUntilEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT10)) return 0; - return _bgEvents.GetNextEventTime(BG_WS_EVENT_BOTH_FLAGS_KEPT15) > 0 ? BG_WS_SPELL_FOCUSED_ASSAULT : BG_WS_SPELL_BRUTAL_ASSAULT; + return _bgEvents.HasTimeUntilEvent(BG_WS_EVENT_BOTH_FLAGS_KEPT15) ? BG_WS_SPELL_FOCUSED_ASSAULT : BG_WS_SPELL_BRUTAL_ASSAULT; } void BattlegroundWS::RemoveAssaultAuras() diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index 61fa2516ed..25df45ab6c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -39,12 +39,12 @@ enum BG_WS_TimerOrScore BG_WS_MAX_TEAM_SCORE = 3, BG_WS_TOTAL_GAME_TIME = 27 * MINUTE * IN_MILLISECONDS, - BG_WS_FLAG_RESPAWN_TIME = 23 * IN_MILLISECONDS, - BG_WS_FLAG_DROP_TIME = 10 * IN_MILLISECONDS, - BG_WS_SPELL_FORCE_TIME = 10 * MINUTE * IN_MILLISECONDS, - BG_WS_SPELL_BRUTAL_TIME = 15 * MINUTE * IN_MILLISECONDS, - BG_WS_DOOR_DESPAWN_TIME = 5 * IN_MILLISECONDS + BG_WS_FLAG_RESPAWN_TIME = 23 * IN_MILLISECONDS }; +constexpr Milliseconds BG_WS_FLAG_DROP_TIME = 10s; +constexpr Milliseconds BG_WS_SPELL_FORCE_TIME = 600s; +constexpr Milliseconds BG_WS_SPELL_BRUTAL_TIME = 900s; +constexpr Milliseconds BG_WS_DOOR_DESPAWN_TIME = 5s; enum BG_WS_BroadcastTexts { @@ -258,6 +258,7 @@ private: ObjectGuid _droppedFlagGUID[2]; uint8 _flagState[2]; TeamId _lastFlagCaptureTeam; + float _wsReputationRate; uint32 _reputationCapture; uint32 _honorWinKills; uint32 _honorEndKills; diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index b072230304..e17b435891 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -908,26 +908,26 @@ void Channel::SendToAll(WorldPacket* data, ObjectGuid guid) { for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) if (!guid || !i->second.plrPtr->GetSocial()->HasIgnore(guid)) - i->second.plrPtr->GetSession()->SendPacket(data); + i->second.plrPtr->SendDirectMessage(data); } void Channel::SendToAllButOne(WorldPacket* data, ObjectGuid who) { for (PlayerContainer::const_iterator i = playersStore.begin(); i != playersStore.end(); ++i) if (i->first != who) - i->second.plrPtr->GetSession()->SendPacket(data); + i->second.plrPtr->SendDirectMessage(data); } void Channel::SendToOne(WorldPacket* data, ObjectGuid who) { if (Player* player = ObjectAccessor::FindConnectedPlayer(who)) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } void Channel::SendToAllWatching(WorldPacket* data) { for (PlayersWatchingContainer::const_iterator i = playersWatchingStore.begin(); i != playersWatchingStore.end(); ++i) - (*i)->GetSession()->SendPacket(data); + (*i)->SendDirectMessage(data); } bool Channel::ShouldAnnouncePlayer(Player const* player) const diff --git a/src/server/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp index 99f613b89e..7b38d43c52 100644 --- a/src/server/game/Chat/Channels/ChannelMgr.cpp +++ b/src/server/game/Chat/Channels/ChannelMgr.cpp @@ -150,7 +150,7 @@ Channel* ChannelMgr::GetChannel(std::string const& name, Player* player, bool pk { WorldPacket data; MakeNotOnPacket(&data, name); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } return nullptr; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 2449fada7a..2d116909ae 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -961,7 +961,7 @@ namespace lfg RBCacheMap::iterator itr = RBCacheStore[player->GetTeamId()].find(dungeonId); if (itr != RBCacheStore[player->GetTeamId()].end()) { - player->GetSession()->SendPacket(&(itr->second)); + player->SendDirectMessage(&(itr->second)); return; } // send empty packet if cache not found @@ -973,7 +973,7 @@ namespace lfg data << (uint32)0; data << (uint32)0; data << (uint32)0; - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void LFGMgr::UpdateRaidBrowser(uint32 diff) @@ -1220,7 +1220,7 @@ namespace lfg for (RBSearchersMap::const_iterator sitr = RBSearchersStore[team].begin(); sitr != RBSearchersStore[team].end(); ++sitr) if (sitr->second == dungeonId) if (Player* p = ObjectAccessor::FindConnectedPlayer(sitr->first)) - p->GetSession()->SendPacket(&differencePacket); + p->SendDirectMessage(&differencePacket); break; // one dungeon updated in one LFGMgr::UpdateRaidBrowser } @@ -1508,7 +1508,7 @@ namespace lfg lockMap.clear(); } - uint8 LFGMgr::CheckGroupRoles(LfgRolesMap& groles, bool removeLeaderFlag /*= true*/) + uint8 LFGMgr::CheckGroupRoles(LfgRolesMap& groles) { if (groles.empty()) return 0; @@ -1517,21 +1517,18 @@ namespace lfg uint8 tank = 0; uint8 healer = 0; - if (removeLeaderFlag) - for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it) - it->second &= ~PLAYER_ROLE_LEADER; - for (LfgRolesMap::iterator it = groles.begin(); it != groles.end(); ++it) { - if (it->second == PLAYER_ROLE_NONE) + uint8 const role = it->second & ~PLAYER_ROLE_LEADER; + if (role == PLAYER_ROLE_NONE) return 0; - if (it->second & PLAYER_ROLE_DAMAGE) + if (role & PLAYER_ROLE_DAMAGE) { - if (it->second != PLAYER_ROLE_DAMAGE) + if (role != PLAYER_ROLE_DAMAGE) { it->second -= PLAYER_ROLE_DAMAGE; - if (uint8 x = CheckGroupRoles(groles, false)) + if (uint8 x = CheckGroupRoles(groles)) return x; it->second += PLAYER_ROLE_DAMAGE; } @@ -1541,12 +1538,12 @@ namespace lfg damage++; } - if (it->second & PLAYER_ROLE_HEALER) + if (role & PLAYER_ROLE_HEALER) { - if (it->second != PLAYER_ROLE_HEALER) + if (role != PLAYER_ROLE_HEALER) { it->second -= PLAYER_ROLE_HEALER; - if (uint8 x = CheckGroupRoles(groles, false)) + if (uint8 x = CheckGroupRoles(groles)) return x; it->second += PLAYER_ROLE_HEALER; } @@ -1556,12 +1553,12 @@ namespace lfg healer++; } - if (it->second & PLAYER_ROLE_TANK) + if (role & PLAYER_ROLE_TANK) { - if (it->second != PLAYER_ROLE_TANK) + if (role != PLAYER_ROLE_TANK) { it->second -= PLAYER_ROLE_TANK; - if (uint8 x = CheckGroupRoles(groles, false)) + if (uint8 x = CheckGroupRoles(groles)) return x; it->second += PLAYER_ROLE_TANK; } diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 0eb27e71c0..235689bcaf 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -568,7 +568,7 @@ namespace lfg /// Checks if all players are queued bool AllQueued(Lfg5Guids const& check); /// Checks if given roles match, modifies given roles map with new roles - static uint8 CheckGroupRoles(LfgRolesMap& groles, bool removeLeaderFlag = true); + static uint8 CheckGroupRoles(LfgRolesMap& groles); /// Checks if given players are ignoring each other static bool HasIgnore(ObjectGuid guid1, ObjectGuid guid2); /// Sends queue status to player diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 249ac7adb9..1971a3dc7a 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -121,7 +121,7 @@ void Corpse::DeleteFromDB(CharacterDatabaseTransaction trans) DeleteFromDB(GetOwnerGUID(), trans); } -void Corpse::DeleteFromDB(ObjectGuid const ownerGuid, CharacterDatabaseTransaction trans) +void Corpse::DeleteFromDB(ObjectGuid const& ownerGuid, CharacterDatabaseTransaction trans) { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CORPSE); stmt->SetData(0, ownerGuid.GetCounter()); diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h index e74f2c9439..9027a608a8 100644 --- a/src/server/game/Entities/Corpse/Corpse.h +++ b/src/server/game/Entities/Corpse/Corpse.h @@ -63,7 +63,7 @@ public: bool LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields); void DeleteFromDB(CharacterDatabaseTransaction trans); - static void DeleteFromDB(ObjectGuid const ownerGuid, CharacterDatabaseTransaction trans); + static void DeleteFromDB(ObjectGuid const& ownerGuid, CharacterDatabaseTransaction trans); [[nodiscard]] ObjectGuid GetOwnerGUID() const { return GetGuidValue(CORPSE_FIELD_OWNER); } diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 877cfee68a..f092428332 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -251,7 +251,7 @@ CreatureBaseStats const* CreatureBaseStats::GetBaseStats(uint8 level, uint8 unit bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { - m_owner.DespawnOrUnsummon(0s, m_respawnTimer); // since we are here, we are not TempSummon as object type cannot change during runtime + m_owner.DespawnOrUnsummon(0ms, m_respawnTimer); // since we are here, we are not TempSummon as object type cannot change during runtime return true; } @@ -771,7 +771,7 @@ void Creature::Update(uint32 diff) } Unit* owner = GetCharmerOrOwner(); - if (IsCharmed() && !IsWithinDistInMap(owner, GetMap()->GetVisibilityRange(), true, false)) + if (IsCharmed() && !IsWithinDistInMap(owner, GetMap()->GetVisibilityRange(), true, false, false)) { RemoveCharmAuras(); } @@ -1944,7 +1944,7 @@ bool Creature::CanStartAttack(Unit const* who) const if (!_IsTargetAcceptable(who)) return false; - if (IsNeutralToAll() || !IsWithinDistInMap(who, GetAggroRange(who) + m_CombatDistance, true, false)) // pussywizard: +m_combatDistance for turrets and similar + if (IsNeutralToAll() || !IsWithinDistInMap(who, GetAggroRange(who) + m_CombatDistance, true, false, false)) // pussywizard: +m_combatDistance for turrets and similar return false; if (!CanCreatureAttack(who)) @@ -1999,7 +1999,7 @@ void Creature::setDeathState(DeathState state, bool despawn) bool needsFalling = !despawn && (IsFlying() || IsHovering()) && !IsUnderWater(); SetHover(false); - SetDisableGravity(false, false, false); + SetDisableGravity(false); if (needsFalling) GetMotionMaster()->MoveFall(0, true); @@ -2159,12 +2159,12 @@ void Creature::Respawn(bool force) } } -void Creature::ForcedDespawn(uint32 timeMSToDespawn, Seconds forceRespawnTimer) +void Creature::ForcedDespawn(Milliseconds timeMSToDespawn, Seconds forceRespawnTimer) { - if (timeMSToDespawn) + if (timeMSToDespawn > 0ms) { ForcedDespawnDelayEvent* pEvent = new ForcedDespawnDelayEvent(*this, forceRespawnTimer); - m_Events.AddEvent(pEvent, m_Events.CalculateTime(timeMSToDespawn)); + m_Events.AddEventAtOffset(pEvent, timeMSToDespawn); return; } @@ -2174,17 +2174,17 @@ void Creature::ForcedDespawn(uint32 timeMSToDespawn, Seconds forceRespawnTimer) // Xinef: Set new respawn time, ignore corpse decay time... RemoveCorpse(true); - if (forceRespawnTimer > Seconds::zero()) + if (forceRespawnTimer > 0s) if (GetMap()) GetMap()->ScheduleCreatureRespawn(GetGUID(), forceRespawnTimer); } -void Creature::DespawnOrUnsummon(Milliseconds msTimeToDespawn /*= 0*/, Seconds forcedRespawnTimer) +void Creature::DespawnOrUnsummon(Milliseconds msTimeToDespawn /*= 0ms*/, Seconds forcedRespawnTimer /*= 0s*/) { if (TempSummon* summon = this->ToTempSummon()) - summon->UnSummon(msTimeToDespawn.count()); + summon->UnSummon(msTimeToDespawn); else - ForcedDespawn(msTimeToDespawn.count(), forcedRespawnTimer); + ForcedDespawn(msTimeToDespawn, forcedRespawnTimer); } void Creature::DespawnOnEvade(Seconds respawnDelay) @@ -2204,7 +2204,7 @@ void Creature::DespawnOnEvade(Seconds respawnDelay) return; } - DespawnOrUnsummon(Milliseconds(0), respawnDelay); + DespawnOrUnsummon(0ms, respawnDelay); } void Creature::InitializeReactState() @@ -2464,7 +2464,7 @@ void Creature::CallAssistance(Unit* target /*= nullptr*/) e->AddAssistant((*assistList.begin())->GetGUID()); assistList.pop_front(); } - m_Events.AddEvent(e, m_Events.CalculateTime(sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY))); + m_Events.AddEventAtOffset(e, Milliseconds(sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY))); } } } @@ -3230,47 +3230,6 @@ bool Creature::SetWalk(bool enable) return true; } -/** - * @brief Enable or disable the creature's fly mode by adding or removing: MOVEMENTFLAG_FLYING. Infom also the client - */ -bool Creature::SetDisableGravity(bool disable, bool packetOnly /*= false*/, bool updateAnimationTier /*= true*/) -{ - //! It's possible only a packet is sent but moveflags are not updated - //! Need more research on this - if (!packetOnly && !Unit::SetDisableGravity(disable)) - return false; - - if (m_movedByPlayer) - { - WorldPacket data(disable ? SMSG_MOVE_GRAVITY_DISABLE : SMSG_MOVE_GRAVITY_ENABLE, 12); - data << GetPackGUID(); - data << m_movedByPlayer->ToPlayer()->GetSession()->GetOrderCounter(); // movement counter - m_movedByPlayer->ToPlayer()->SendDirectMessage(&data); - m_movedByPlayer->ToPlayer()->GetSession()->IncrementOrderCounter(); - - data.Initialize(MSG_MOVE_GRAVITY_CHNG, 64); - data << GetPackGUID(); - BuildMovementPacket(&data); - m_movedByPlayer->ToPlayer()->SendMessageToSet(&data, false); - return true; - } - - if (updateAnimationTier && IsAlive() && !HasUnitState(UNIT_STATE_ROOT) && !IsRooted()) - { - if (IsLevitating()) - SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_FLY); - else if (IsHovering()) - SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_HOVER); - else - SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_BYTE1_FLAG_GROUND); - } - - WorldPacket data(disable ? SMSG_SPLINE_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE, 9); - data << GetPackGUID(); - SendMessageToSet(&data, false); - return true; -} - bool Creature::SetSwim(bool enable) { if (!Unit::SetSwim(enable)) @@ -3385,19 +3344,23 @@ void Creature::UpdateMovementFlags() if (GetMovementTemplate().IsFlightAllowed() && isInAir && !IsFalling()) { - if (GetMovementTemplate().Flight == CreatureFlightMovementType::CanFly) + if (GetMovementTemplate().Flight == CreatureFlightMovementType::CanFly && !m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY)) SetCanFly(true); - else + else if (!IsLevitating()) SetDisableGravity(true); - if (!HasHoverAura()) + if (!HasHoverAura() && IsHovering()) SetHover(false); } else { - SetCanFly(false); - SetDisableGravity(false); - if (IsAlive() && (CanHover() || HasHoverAura())) + if (m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY)) + SetCanFly(false); + + if (IsLevitating()) + SetDisableGravity(false); + + if (IsAlive() && (GetMovementTemplate().Ground == CreatureGroundMovementType::Hover || HasHoverAura()) && !IsHovering()) SetHover(true); } @@ -3713,6 +3676,33 @@ bool Creature::CanGeneratePickPocketLoot() const return (lootPickPocketRestoreTime == 0 || lootPickPocketRestoreTime < GameTime::GetGameTime().count()); } +void Creature::SetTextRepeatId(uint8 textGroup, uint8 id) +{ + CreatureTextRepeatIds& repeats = m_textRepeat[textGroup]; + if (std::find(repeats.begin(), repeats.end(), id) == repeats.end()) + repeats.push_back(id); + else + LOG_ERROR("sql.sql", "CreatureTextMgr: TextGroup {} for Creature({}) {}, id {} already added", uint32(textGroup), GetName(), GetGUID().ToString(), uint32(id)); +} + +CreatureTextRepeatIds const& Creature::GetTextRepeatGroup(uint8 textGroup) +{ + static CreatureTextRepeatIds const emptyIds; + + CreatureTextRepeatGroup::const_iterator groupItr = m_textRepeat.find(textGroup); + if (groupItr != m_textRepeat.end()) + return groupItr->second; + + return emptyIds; +} + +void Creature::ClearTextRepeatGroup(uint8 textGroup) +{ + CreatureTextRepeatGroup::iterator groupItr = m_textRepeat.find(textGroup); + if (groupItr != m_textRepeat.end()) + groupItr->second.clear(); +} + void Creature::SetRespawnTime(uint32 respawn) { m_respawnTime = respawn ? GameTime::GetGameTime().count() + respawn : 0; @@ -3735,7 +3725,7 @@ void Creature::ModifyThreatPercentTemp(Unit* victim, int32 percent, Milliseconds } TemporaryThreatModifierEvent* pEvent = new TemporaryThreatModifierEvent(*this, victim->GetGUID(), currentThreat); - m_Events.AddEvent(pEvent, m_Events.CalculateTime(duration.count())); + m_Events.AddEventAtOffset(pEvent, duration); } } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index e5ebcd45a4..b5d93cd3ba 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -39,6 +39,10 @@ class CreatureGroup; #define MAX_VENDOR_ITEMS 150 // Limitation in 3.x.x item count in SMSG_LIST_INVENTORY +//used for handling non-repeatable random texts +typedef std::vector<uint8> CreatureTextRepeatIds; +typedef std::unordered_map<uint8, CreatureTextRepeatIds> CreatureTextRepeatGroup; + class Creature : public Unit, public GridObject<Creature>, public MovableMapObject, public UpdatableMapObject { public: @@ -79,7 +83,7 @@ public: [[nodiscard]] bool CanWalk() const { return GetMovementTemplate().IsGroundAllowed(); } [[nodiscard]] bool CanSwim() const override; [[nodiscard]] bool CanEnterWater() const override; - [[nodiscard]] bool CanFly() const override { return GetMovementTemplate().IsFlightAllowed() || IsFlying(); } + [[nodiscard]] bool CanFly() const override { return GetMovementTemplate().IsFlightAllowed() || IsFlying(); } [[nodiscard]] bool CanHover() const { return GetMovementTemplate().Ground == CreatureGroundMovementType::Hover || IsHovering(); } [[nodiscard]] bool IsRooted() const { return GetMovementTemplate().IsRooted(); } @@ -141,7 +145,6 @@ public: [[nodiscard]] CreatureAI* AI() const { return (CreatureAI*)i_AI; } bool SetWalk(bool enable) override; - bool SetDisableGravity(bool disable, bool packetOnly = false, bool updateAnimationTier = true) override; bool SetSwim(bool enable) override; bool HasSpellFocus(Spell const* focusSpell = nullptr) const; @@ -279,8 +282,7 @@ public: void RemoveCorpse(bool setSpawnTime = true, bool skipVisibility = false); - void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer); - void DespawnOrUnsummon(uint32 msTimeToDespawn = 0) { DespawnOrUnsummon(Milliseconds(msTimeToDespawn), 0s); }; + void DespawnOrUnsummon(Milliseconds msTimeToDespawn = 0ms, Seconds forcedRespawnTimer = 0s); void DespawnOnEvade(Seconds respawnDelay = 20s); [[nodiscard]] time_t const& GetRespawnTime() const { return m_respawnTime; } @@ -388,6 +390,10 @@ public: void UpdateLeashExtensionTime(); uint8 GetLeashTimer() const; + CreatureTextRepeatIds const& GetTextRepeatGroup(uint8 textGroup); + void SetTextRepeatId(uint8 textGroup, uint8 id); + void ClearTextRepeatGroup(uint8 textGroup); + bool IsFreeToMove(); static constexpr uint32 MOVE_CIRCLE_CHECK_INTERVAL = 3000; static constexpr uint32 MOVE_BACKWARDS_CHECK_INTERVAL = 2000; @@ -498,7 +504,7 @@ protected: bool IsAlwaysDetectableFor(WorldObject const* seer) const override; private: - void ForcedDespawn(uint32 timeMSToDespawn = 0, Seconds forcedRespawnTimer = 0s); + void ForcedDespawn(Milliseconds timeMSToDespawn = 0ms, Seconds forcedRespawnTimer = 0s); [[nodiscard]] bool CanPeriodicallyCallForAssistance() const; @@ -519,6 +525,8 @@ private: Spell const* _focusSpell; ///> Locks the target during spell cast for proper facing + CreatureTextRepeatGroup m_textRepeat; + bool _isMissingSwimmingFlagOutOfCombat; uint32 m_assistanceTimer; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 4ca6cda4ab..be52166987 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -99,18 +99,18 @@ enum class CreatureFlightMovementType : uint8 enum class CreatureChaseMovementType : uint8 { - Run, - CanWalk, - AlwaysWalk, + Run = 0, + CanWalk = 1, + AlwaysWalk = 2, Max }; enum class CreatureRandomMovementType : uint8 { - Walk, - CanRun, - AlwaysRun, + Walk = 0, + CanRun = 1, + AlwaysRun = 2, Max }; diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 0b0c17a1ed..76170ff7ee 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -284,13 +284,12 @@ void TempSummon::SetTempSummonType(TempSummonType type) m_type = type; } -void TempSummon::UnSummon(uint32 msTime) +void TempSummon::UnSummon(Milliseconds msTime) { - if (msTime) + if (msTime > 0ms) { ForcedUnsummonDelayEvent* pEvent = new ForcedUnsummonDelayEvent(*this); - - m_Events.AddEvent(pEvent, m_Events.CalculateTime(msTime)); + m_Events.AddEventAtOffset(pEvent, msTime); return; } diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 72a1993270..f3a285c60d 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -44,7 +44,7 @@ public: void Update(uint32 time) override; virtual void InitStats(uint32 lifetime); virtual void InitSummon(); - virtual void UnSummon(uint32 msTime = 0); + virtual void UnSummon(Milliseconds msTime = 0ms); void UpdateObjectVisibilityOnCreate() override; void RemoveFromWorld() override; void SetTempSummonType(TempSummonType type); @@ -133,4 +133,5 @@ public: private: TempSummon& m_owner; }; + #endif diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index f258db1caf..50a6c0e61f 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -517,7 +517,7 @@ void GameObject::Update(uint32 diff) WorldPacket packet; BuildValuesUpdateBlockForPlayer(&udata, caster->ToPlayer()); udata.BuildPacket(packet); - caster->ToPlayer()->GetSession()->SendPacket(&packet); + caster->ToPlayer()->SendDirectMessage(&packet); SendCustomAnim(GetGoAnimProgress()); } @@ -637,7 +637,7 @@ void GameObject::Update(uint32 diff) caster->ToPlayer()->RemoveGameObject(this, false); WorldPacket data(SMSG_FISH_ESCAPED, 0); - caster->ToPlayer()->GetSession()->SendPacket(&data); + caster->ToPlayer()->SendDirectMessage(&data); } // can be delete m_lootState = GO_JUST_DEACTIVATED; @@ -929,7 +929,7 @@ void GameObject::AddUniqueUse(Player* player) m_unique_users.insert(player->GetGUID()); } -void GameObject::DespawnOrUnsummon(Milliseconds delay, Seconds forceRespawnTime) +void GameObject::DespawnOrUnsummon(Milliseconds delay /*= 0ms*/, Seconds forceRespawnTime /*= 0s*/) { if (delay > 0ms) { @@ -1466,7 +1466,7 @@ void GameObject::Use(Unit* user) // by default spell caster is user Unit* spellCaster = user; uint32 spellId = 0; - bool triggered = false; + uint32 triggeredFlags = TRIGGERED_NONE; if (Player* playerUser = user->ToPlayer()) { @@ -1486,6 +1486,10 @@ void GameObject::Use(Unit* user) m_cooldownTime = GameTime::GetGameTimeMS().count() + cooldown * IN_MILLISECONDS; } + if (user->IsPlayer() && GetGoType() != GAMEOBJECT_TYPE_TRAP) // workaround for GO casting + if (!m_goInfo->IsUsableMounted()) + user->RemoveAurasByType(SPELL_AURA_MOUNTED); + switch (GetGoType()) { case GAMEOBJECT_TYPE_DOOR: //0 @@ -1624,7 +1628,7 @@ void GameObject::Use(Unit* user) { WorldPacket data(SMSG_GAMEOBJECT_PAGETEXT, 8); data << GetGUID(); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } else if (info->goober.gossipID) { @@ -1731,34 +1735,40 @@ void GameObject::Use(Unit* user) uint32 zone, subzone; GetZoneAndAreaId(zone, subzone); - int32 zone_skill = sObjectMgr->GetFishingBaseSkillLevel(subzone); - if (!zone_skill) - zone_skill = sObjectMgr->GetFishingBaseSkillLevel(zone); + int32 zoneSkill = sObjectMgr->GetFishingBaseSkillLevel(subzone); + if (!zoneSkill) + zoneSkill = sObjectMgr->GetFishingBaseSkillLevel(zone); //provide error, no fishable zone or area should be 0 - if (!zone_skill) + if (!zoneSkill) LOG_ERROR("sql.sql", "Fishable areaId {} are not properly defined in `skill_fishing_base_level`.", subzone); - int32 skill = player->GetSkillValue(SKILL_FISHING); + // no miss skill is zone skill + 95 since at least patch 2.1 + int32 const noMissSkill = zoneSkill + 95; + + int32 const skill = player->GetSkillValue(SKILL_FISHING); int32 chance; - if (skill < zone_skill) + // fishing pool catches are 100% + //TODO: find reasonable value for fishing hole search + GameObject* fishingHole = LookupFishingHoleAround(20.0f + CONTACT_DISTANCE); + if (fishingHole) + chance = 100; + else if (skill < noMissSkill) { - chance = int32(pow((double)skill / zone_skill, 2) * 100); + chance = int32(pow((double)skill / noMissSkill, 2) * 100); if (chance < 1) chance = 1; } else chance = 100; - int32 roll = irand(1, 100); + int32 const roll = irand(1, 100); - LOG_DEBUG("entities.gameobject", "Fishing check (skill: {} zone min skill: {} chance {} roll: {}", skill, zone_skill, chance, roll); + LOG_DEBUG("entities.gameobject", "Fishing check (skill: {} zone min skill: {} no-miss skill: {} chance {} roll: {})", skill, zoneSkill, noMissSkill, chance, roll); - if (sScriptMgr->OnPlayerUpdateFishingSkill(player, skill, zone_skill, chance, roll)) - { + if (sScriptMgr->OnPlayerUpdateFishingSkill(player, skill, zoneSkill, chance, roll)) player->UpdateFishingSkill(); - } // but you will likely cause junk in areas that require a high fishing skill (not yet implemented) if (chance >= roll) { @@ -1768,11 +1778,10 @@ void GameObject::Use(Unit* user) SetOwnerGUID(player->GetGUID()); SetSpellId(0); // prevent removing unintended auras at Unit::RemoveGameObject - //TODO: find reasonable value for fishing hole search - GameObject* ok = LookupFishingHoleAround(20.0f + CONTACT_DISTANCE); - if (ok) + // fishing pool catch + if (fishingHole) { - ok->Use(player); + fishingHole->Use(player); SetLootState(GO_JUST_DEACTIVATED); } else @@ -1789,7 +1798,7 @@ void GameObject::Use(Unit* user) SetLootState(GO_JUST_DEACTIVATED); WorldPacket data(SMSG_FISH_NOT_HOOKED, 0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); break; } } @@ -1881,7 +1890,6 @@ void GameObject::Use(Unit* user) } } - user->RemoveAurasByType(SPELL_AURA_MOUNTED); spellId = info->spellcaster.spellId; break; } @@ -2026,7 +2034,7 @@ void GameObject::Use(Unit* user) player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET); WorldPacket data(SMSG_ENABLE_BARBER_SHOP, 0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->SetStandState(UNIT_STAND_STATE_SIT_LOW_CHAIR + info->barberChair.chairheight); return; @@ -2051,12 +2059,15 @@ void GameObject::Use(Unit* user) return; } + if (m_goInfo->IsUsableMounted()) + triggeredFlags |= TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE; + if (Player* player = user->ToPlayer()) sOutdoorPvPMgr->HandleCustomSpell(player, spellId, this); if (spellCaster) { - if ((spellCaster->CastSpell(user, spellInfo, triggered) == SPELL_CAST_OK) && GetGoType() == GAMEOBJECT_TYPE_SPELLCASTER) + if ((spellCaster->CastSpell(user, spellInfo, TriggerCastFlags(triggeredFlags)) == SPELL_CAST_OK) && GetGoType() == GAMEOBJECT_TYPE_SPELLCASTER) AddUse(); } else @@ -2300,7 +2311,7 @@ void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= nullptr*/ data << uint32(-change); // change < 0 triggers SPELL_BUILDING_HEAL combat log event // change >= 0 triggers SPELL_BUILDING_DAMAGE event data << uint32(spellId); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } GameObjectDestructibleState newState = GetDestructibleState(); @@ -3046,13 +3057,13 @@ SpellInfo const* GameObject::GetSpellForLock(Player const* player) const return nullptr; } -void GameObject::AddToSkillupList(ObjectGuid playerGuid) +void GameObject::AddToSkillupList(ObjectGuid const& playerGuid) { int32 timer = GetMap()->IsDungeon() ? -1 : 10 * MINUTE * IN_MILLISECONDS; m_SkillupList[playerGuid] = timer; } -bool GameObject::IsInSkillupList(ObjectGuid playerGuid) const +bool GameObject::IsInSkillupList(ObjectGuid const& playerGuid) const { for (auto const& itr : m_SkillupList) { diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 1b8ccd0477..13be19952b 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -231,8 +231,8 @@ public: void RemoveLootMode(uint16 lootMode) { m_LootMode &= ~lootMode; } void ResetLootMode() { m_LootMode = LOOT_MODE_DEFAULT; } - void AddToSkillupList(ObjectGuid playerGuid); - [[nodiscard]] bool IsInSkillupList(ObjectGuid playerGuid) const; + void AddToSkillupList(ObjectGuid const& playerGuid); + [[nodiscard]] bool IsInSkillupList(ObjectGuid const& playerGuid) const; void AddUniqueUse(Player* player); void AddUse() { ++m_usetimes; } @@ -414,7 +414,7 @@ private: void UpdatePackedRotation(); //! Object distance/size - overridden from Object::_IsWithinDist. Needs to take in account proper GO size. - bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool /*is3D*/, bool /*useBoundingRadius = true*/) const override + bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool /*is3D*/, bool /*incOwnRadius = true*/, bool /*incTargetRadius = true*/) const override { //! Following check does check 3d distance dist2compare += obj->GetObjectSize(); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 9b58746e95..36c45e5449 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1066,7 +1066,7 @@ void Item::SendUpdateSockets() for (uint32 i = SOCK_ENCHANTMENT_SLOT; i <= BONUS_ENCHANTMENT_SLOT; ++i) data << uint32(GetEnchantmentId(EnchantmentSlot(i))); - GetOwner()->GetSession()->SendPacket(&data); + GetOwner()->SendDirectMessage(&data); } // Though the client has the information in the item's data field, @@ -1081,7 +1081,7 @@ void Item::SendTimeUpdate(Player* owner) WorldPacket data(SMSG_ITEM_TIME_UPDATE, (8 + 4)); data << GetGUID(); data << uint32(duration); - owner->GetSession()->SendPacket(&data); + owner->SendDirectMessage(&data); } Item* Item::CreateItem(uint32 item, uint32 count, Player const* player, bool clone, uint32 randomPropertyId) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index a183d14672..142ff909b7 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -240,7 +240,7 @@ void Object::SendUpdateToPlayer(Player* player) BuildCreateUpdateBlockForPlayer(&upd, player); upd.BuildPacket(packet); - player->GetSession()->SendPacket(&packet); + player->SendDirectMessage(&packet); } void Object::BuildValuesUpdateBlockForPlayer(UpdateData* data, Player* target) @@ -272,7 +272,7 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const { WorldPacket data(SMSG_ARENA_UNIT_DESTROYED, 8); data << GetGUID(); - target->GetSession()->SendPacket(&data); + target->SendDirectMessage(&data); } } } @@ -282,7 +282,7 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const //! If the following bool is true, the client will call "void CGUnit_C::OnDeath()" for this object. //! OnDeath() does for eg trigger death animation and interrupts certain spells/missiles/auras/sounds... data << uint8(onDeath ? 1 : 0); - target->GetSession()->SendPacket(&data); + target->SendDirectMessage(&data); } [[nodiscard]] int32 Object::GetInt32Value(uint16 index) const @@ -1095,23 +1095,45 @@ void WorldObject::SetVisibilityDistanceOverride(VisibilityDistanceType type) if (type == GetVisibilityOverrideType()) return; - if (IsPlayer()) + if (!IsCreature() && !IsGameObject() && !IsDynamicObject()) return; - if (IsVisibilityOverridden()) - { - if (IsFarVisible()) - GetMap()->RemoveWorldObjectFromFarVisibleMap(this); - else if (IsZoneWideVisible()) - GetMap()->RemoveWorldObjectFromZoneWideVisibleMap(GetZoneId(), this); - } - - if (type == VisibilityDistanceType::Large || type == VisibilityDistanceType::Gigantic) - GetMap()->AddWorldObjectToFarVisibleMap(this); - else if (type == VisibilityDistanceType::Infinite) - GetMap()->AddWorldObjectToZoneWideVisibleMap(GetZoneId(), this); + // Important to remove from old visibility override containers first + RemoveFromMapVisibilityOverrideContainers(); + // Always update _visibilityDistanceOverrideType, even when not in world _visibilityDistanceOverrideType = type; + + // Finally, add to new visibility override containers + AddToMapVisibilityOverrideContainers(); +} + +void WorldObject::RemoveFromMapVisibilityOverrideContainers() +{ + if (!IsVisibilityOverridden()) + return; + + if (!IsInWorld()) + return; + + if (IsFarVisible()) + GetMap()->RemoveWorldObjectFromFarVisibleMap(this); + else if (IsZoneWideVisible()) + GetMap()->RemoveWorldObjectFromZoneWideVisibleMap(_zoneId, this); +} + +void WorldObject::AddToMapVisibilityOverrideContainers() +{ + if (!IsVisibilityOverridden()) + return; + + if (!IsInWorld()) + return; + + if (IsFarVisible()) + GetMap()->AddWorldObjectToFarVisibleMap(this); + else if (IsZoneWideVisible()) + GetMap()->AddWorldObjectToZoneWideVisibleMap(_zoneId, this); } void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/) @@ -1177,6 +1199,9 @@ void WorldObject::AddToWorld() Object::AddToWorld(); GetMap()->GetZoneAndAreaId(GetPhaseMask(), _zoneId, _areaId, GetPositionX(), GetPositionY(), GetPositionZ()); GetMap()->AddObjectToPendingUpdateList(this); + + if (IsZoneWideVisible()) + GetMap()->AddWorldObjectToZoneWideVisibleMap(_zoneId, this); } void WorldObject::RemoveFromWorld() @@ -1184,8 +1209,7 @@ void WorldObject::RemoveFromWorld() if (!IsInWorld()) return; - if (IsZoneWideVisible()) - GetMap()->RemoveWorldObjectFromZoneWideVisibleMap(GetZoneId(), this); + RemoveFromMapVisibilityOverrideContainers(); DestroyForVisiblePlayers(); @@ -1208,10 +1232,14 @@ float WorldObject::GetDistanceZ(WorldObject const* obj) const return (dist > 0 ? dist : 0); } -bool WorldObject::_IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool useBoundingRadius) const +bool WorldObject::_IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius, bool incTargetRadius) const { - float sizefactor = useBoundingRadius ? GetObjectSize() + obj->GetObjectSize() : 0.0f; - float maxdist = dist2compare + sizefactor; + float maxdist = dist2compare; + if (incOwnRadius) + maxdist += GetObjectSize(); + + if (incTargetRadius) + maxdist += obj->GetObjectSize(); if (m_transport && obj->GetTransport() && obj->GetTransport()->GetGUID() == m_transport->GetGUID()) { @@ -1318,14 +1346,14 @@ bool WorldObject::IsWithinDist2d(const Position* pos, float dist) const } // use only if you will sure about placing both object at same map -bool WorldObject::IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool useBoundingRadius) const +bool WorldObject::IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius, bool incTargetRadius) const { - return obj && _IsWithinDist(obj, dist2compare, is3D, useBoundingRadius); + return obj && _IsWithinDist(obj, dist2compare, is3D, incOwnRadius, incTargetRadius); } -bool WorldObject::IsWithinDistInMap(WorldObject const* obj, float dist2compare, bool is3D, bool useBoundingRadius) const +bool WorldObject::IsWithinDistInMap(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius, bool incTargetRadius) const { - return obj && IsInMap(obj) && InSamePhase(obj) && _IsWithinDist(obj, dist2compare, is3D, useBoundingRadius); + return obj && IsInMap(obj) && InSamePhase(obj) && _IsWithinDist(obj, dist2compare, is3D, incOwnRadius, incTargetRadius); } bool WorldObject::IsWithinLOS(float ox, float oy, float oz, VMAP::ModelIgnoreFlags ignoreFlags, LineOfSightChecks checks) const @@ -1752,6 +1780,8 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo WorldObject const* viewpoint = this; if (Player const* thisPlayer = ToPlayer()) { + viewpoint = thisPlayer->GetSeer(); + if (Creature const* creature = obj->ToCreature()) { if (TempSummon const* tempSummon = creature->ToTempSummon()) @@ -1791,13 +1821,8 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo return false; } - if (thisPlayer->GetViewpoint()) - viewpoint = thisPlayer->GetViewpoint(); - if (thisPlayer->GetFarSightDistance() && !thisPlayer->isInFront(obj)) - { return false; - } } // Xinef: check reversely obj vs viewpoint, object could be a gameObject which overrides _IsWithinDist function to include gameobject size @@ -2044,7 +2069,7 @@ void WorldObject::SendPlayMusic(uint32 Music, bool OnlySelf) WorldPacket data(SMSG_PLAY_MUSIC, 4); data << Music; if (OnlySelf && IsPlayer()) - this->ToPlayer()->GetSession()->SendPacket(&data); + ToPlayer()->SendDirectMessage(&data); else SendMessageToSet(&data, true); // ToSelf ignored in this case } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 23784c9c63..ae1ddbc171 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -41,7 +41,7 @@ #include "UpdateFields.h" -class ElunaEventProcessor; +class ALEEventProcessor; enum TempSummonType { @@ -541,8 +541,8 @@ public: [[nodiscard]] bool IsWithinDist2d(float x, float y, float dist) const; bool IsWithinDist2d(const Position* pos, float dist) const; // use only if you will sure about placing both object at same map - bool IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D = true, bool useBoundingRadius = true) const; - bool IsWithinDistInMap(WorldObject const* obj, float dist2compare, bool is3D = true, bool useBoundingRadius = true) const; + bool IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D = true, bool incOwnRadius = true, bool incTargetRadius = true) const; + bool IsWithinDistInMap(WorldObject const* obj, float dist2compare, bool is3D = true, bool incOwnRadius = true, bool incTargetRadius = true) const; [[nodiscard]] bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags = VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks = LINEOFSIGHT_ALL_CHECKS) const; [[nodiscard]] bool IsWithinLOSInMap(WorldObject const* obj, VMAP::ModelIgnoreFlags ignoreFlags = VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks = LINEOFSIGHT_ALL_CHECKS, Optional<float> collisionHeight = { }, Optional<float> combatReach = { }) const; [[nodiscard]] Position GetHitSpherePointFor(Position const& dest, Optional<float> collisionHeight = { }, Optional<float> combatReach = { }) const; @@ -727,7 +727,7 @@ public: ObjectVisibilityContainer const& GetObjectVisibilityContainer() const { return _objectVisibilityContainer; } // Event handler - ElunaEventProcessor* elunaEvents; + ALEEventProcessor* ALEEvents; EventProcessor m_Events; protected: @@ -770,7 +770,7 @@ private: uint16 m_notifyflags; uint16 m_executed_notifies; - virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool useBoundingRadius = true) const; + virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius = true, bool incTargetRadius = true) const; bool CanNeverSee(WorldObject const* obj) const; virtual bool CanAlwaysSee(WorldObject const* /*obj*/) const { return false; } @@ -780,6 +780,9 @@ private: //bool CanDetectStealthOf(WorldObject const* obj) const; bool CanDetectStealthOf(WorldObject const* obj, bool checkAlert = false) const; + void RemoveFromMapVisibilityOverrideContainers(); + void AddToMapVisibilityOverrideContainers(); + GuidUnorderedSet _allowedLooters; ObjectVisibilityContainer _objectVisibilityContainer; diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index a8d99fe80e..5a3deff9e2 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -269,7 +269,7 @@ class PackedGuid explicit PackedGuid(ObjectGuid guid) : _packedGuid(PACKED_GUID_MIN_BUFFER_SIZE) { _packedGuid.appendPackGUID(guid.GetRawValue()); } void Set(uint64 guid) { _packedGuid.wpos(0); _packedGuid.appendPackGUID(guid); } - void Set(ObjectGuid guid) { _packedGuid.wpos(0); _packedGuid.appendPackGUID(guid.GetRawValue()); } + void Set(ObjectGuid const& guid) { _packedGuid.wpos(0); _packedGuid.appendPackGUID(guid.GetRawValue()); } [[nodiscard]] std::size_t size() const { return _packedGuid.size(); } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index dc33162260..45c23fe941 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -692,7 +692,7 @@ void Pet::Update(uint32 diff) } } - if (m_duration > 0s) + if (m_duration > 0ms) { if (m_duration > _diff) m_duration -= _diff; @@ -708,7 +708,7 @@ void Pet::Update(uint32 diff) if (getPowerType() == POWER_FOCUS) { m_petRegenTimer -= _diff; - if (m_petRegenTimer <= 0s) + if (m_petRegenTimer <= 0ms) { m_petRegenTimer += PET_FOCUS_REGEN_INTERVAL; Regenerate(POWER_FOCUS); @@ -1026,7 +1026,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) Unit* owner = GetOwner(); if (!owner) // just to be sure, asynchronous now { - DespawnOrUnsummon(1000); + DespawnOrUnsummon(1s); return false; } @@ -1512,7 +1512,7 @@ void Pet::_LoadSpellCooldowns(PreparedQueryResult result) if (!cooldowns.empty() && GetOwner()) { BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, cooldowns); - GetOwner()->GetSession()->SendPacket(&data); + GetOwner()->SendDirectMessage(&data); } } } diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index e737bab11f..9190202d4f 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -52,7 +52,7 @@ public: PetType getPetType() const { return m_petType; } void setPetType(PetType type) { m_petType = type; } bool isControlled() const { return getPetType() == SUMMON_PET || getPetType() == HUNTER_PET; } - bool isTemporarySummoned() const { return m_duration > 0s; } + bool isTemporarySummoned() const { return m_duration > 0ms; } bool IsPermanentPetFor(Player* owner) const; // pet have tab in character windows and set UNIT_FIELD_PETNUMBER diff --git a/src/server/game/Entities/Pet/PetDefines.h b/src/server/game/Entities/Pet/PetDefines.h index 6bb873258e..5e4fcd48c6 100644 --- a/src/server/game/Entities/Pet/PetDefines.h +++ b/src/server/game/Entities/Pet/PetDefines.h @@ -23,6 +23,7 @@ #include <array> #include <string> #include <vector> +#include <numbers> enum ReactStates : uint8; @@ -75,10 +76,10 @@ enum ActionFeedback FEEDBACK_CANT_ATT_TARGET = 3 }; -enum PetTalk +enum PetAction : int32 { - PET_TALK_SPECIAL_SPELL = 0, - PET_TALK_ATTACK = 1 + PET_ACTION_SPECIAL_SPELL = 0, + PET_ACTION_ATTACK = 1 }; enum PetLoadState @@ -202,8 +203,10 @@ enum PetScalingSpells SPELL_RISEN_GHOUL_SELF_STUN = 47466, }; -#define PET_FOLLOW_DIST 1.0f -#define PET_FOLLOW_ANGLE (M_PI/2) +constexpr float PET_FOLLOW_DIST = 2.0f; +constexpr float PET_FOLLOW_ANGLE = std::numbers::pi_v<float> / 2; +constexpr float MINI_PET_SUMMON_ANGLE = std::numbers::pi_v<float> / 4; +constexpr float MINI_PET_FOLLOW_ANGLE = std::numbers::pi_v<float>; class PetStable { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 05c93ca7e1..943f3e53c9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -78,6 +78,7 @@ #include "TicketMgr.h" #include "Tokenize.h" #include "Transport.h" +#include "Unit.h" #include "UpdateData.h" #include "Util.h" #include "Vehicle.h" @@ -90,6 +91,7 @@ #include "WorldStateDefines.h" #include "WorldStatePackets.h" #include <cmath> +#include <queue> /// @todo: this import is not necessary for compilation and marked as unused by the IDE // however, for some reasons removing it would cause a damn linking issue @@ -416,6 +418,8 @@ Player::Player(WorldSession* session): Unit(), m_mover(this) GetObjectVisibilityContainer().InitForPlayer(); sScriptMgr->OnConstructPlayer(this); + + _expectingChangeTransport = false; } Player::~Player() @@ -1339,7 +1343,7 @@ void Player::SendTeleportAckPacket() data << GetPackGUID(); data << GetSession()->GetOrderCounter(); // movement counter BuildMovementPacket(&data); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); GetSession()->IncrementOrderCounter(); } @@ -1530,17 +1534,6 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati CombatStop(); - // remove arena spell coldowns/buffs now to also remove pet's cooldowns before it's temporarily unsummoned - if (mEntry->IsBattleArena() && (HasPendingSpectatorForBG(0) || !HasPendingSpectatorForBG(GetBattlegroundId()))) - { - // KEEP THIS ORDER! - RemoveArenaAuras(); - if (pet) - pet->RemoveArenaAuras(); - - RemoveArenaSpellCooldowns(true); - } - // remove pet on map change if (pet) UnsummonPetTemporaryIfAny(); @@ -1557,6 +1550,8 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati //remove auras before removing from map... RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CHANGE_MAP | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_TURNING); + SetMapChangeOrderCounter(); + if (!GetSession()->PlayerLogout()) { // send transfer packets @@ -1565,24 +1560,13 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (m_transport) data << m_transport->GetEntry() << GetMapId(); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } // remove from old map now if (oldmap) oldmap->RemovePlayerFromMap(this, false); - // xinef: do this before setting fall information! - if (IsMounted() && (!GetMap()->GetEntry()->IsDungeon() && !GetMap()->GetEntry()->IsBattlegroundOrArena()) && !m_transport) - { - AuraEffectList const& auras = GetAuraEffectsByType(SPELL_AURA_MOUNTED); - if (!auras.empty()) - { - SetMountBlockId((*auras.begin())->GetId()); - RemoveAurasByType(SPELL_AURA_MOUNTED); - } - } - teleportStore_dest = WorldLocation(mapid, x, y, z, orientation); SetFallInformation(GameTime::GetGameTime().count(), z); // if the player is saved before worldportack (at logout for example) @@ -1598,7 +1582,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati else data << teleportStore_dest.PositionXYZOStream(); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); SendSavedInstances(); } @@ -2087,7 +2071,7 @@ bool Player::CanInteractWithQuestGiver(Object* questGiver) return false; } -Creature* Player::GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask) +Creature* Player::GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflagmask) { // unit checks if (!guid) @@ -2144,7 +2128,7 @@ Creature* Player::GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask) return creature; } -GameObject* Player::GetGameObjectIfCanInteractWith(ObjectGuid guid, GameobjectTypes type) const +GameObject* Player::GetGameObjectIfCanInteractWith(ObjectGuid const& guid, GameobjectTypes type) const { if (GameObject* go = GetMap()->GetGameObject(guid)) { @@ -2380,7 +2364,7 @@ void Player::SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool re } data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus? - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) @@ -2500,6 +2484,7 @@ void Player::GiveLevel(uint8 level) m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset _ApplyAllLevelScaleItemMods(false); + _RemoveAllAuraStatMods(); SetLevel(level); @@ -2522,6 +2507,7 @@ void Player::GiveLevel(uint8 level) UpdateSkillsToMaxSkillsForLevel(); _ApplyAllLevelScaleItemMods(true); + _ApplyAllAuraStatMods(); if (!isDead()) { @@ -2855,7 +2841,7 @@ void Player::SendInitialSpells() data << uint32(itr->second.category ? cooldown : 0); // category cooldown } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::RemoveMail(uint32 id) @@ -2884,7 +2870,7 @@ void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResp data << (uint32) item_guid; // item guid low? data << (uint32) item_count; // item count? } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendNewMail() @@ -2892,7 +2878,7 @@ void Player::SendNewMail() // deliver undelivered mail WorldPacket data(SMSG_RECEIVED_MAIL, 4); data << (uint32) 0; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::AddNewMailDeliverTime(time_t deliver_time) @@ -3050,13 +3036,13 @@ void Player::SendLearnPacket(uint32 spellId, bool learn) WorldPacket data(SMSG_LEARNED_SPELL, 6); data << uint32(spellId); data << uint16(0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } else { WorldPacket data(SMSG_REMOVED_SPELL, 4); data << uint32(spellId); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } } @@ -3088,7 +3074,7 @@ bool Player::addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4); data << uint32(nextSpellInfo->Id); data << uint32(spellInfo->Id); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } return false; } @@ -4429,12 +4415,6 @@ void Player::SetMovement(PlayerMovementType pType) const PackedGuid& guid = GetPackGUID(); switch (pType) { - case MOVE_ROOT: - data.Initialize(SMSG_FORCE_MOVE_ROOT, guid.size() + 4); - break; - case MOVE_UNROOT: - data.Initialize(SMSG_FORCE_MOVE_UNROOT, guid.size() + 4); - break; case MOVE_WATER_WALK: data.Initialize(SMSG_MOVE_WATER_WALK, guid.size() + 4); break; @@ -4447,7 +4427,7 @@ void Player::SetMovement(PlayerMovementType pType) } data << guid; data << GetSession()->GetOrderCounter(); // movement counter - GetSession()->SendPacket(&data); + SendDirectMessage(&data); GetSession()->IncrementOrderCounter(); } @@ -4459,7 +4439,7 @@ void Player::BuildPlayerRepop() { WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size()); data << GetPackGUID(); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); if (getRace(true) == RACE_NIGHTELF) { CastSpell(this, 20584, true); @@ -4488,10 +4468,10 @@ void Player::BuildPlayerRepop() SetHealth(1); // convert player body to ghost SetMovement(MOVE_WATER_WALK); SetWaterWalking(true); - if (!GetSession()->isLogingOut()) - { - SetMovement(MOVE_UNROOT); - } + + if (!IsImmobilizedState()) + SendMoveRoot(false); + RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related int32 corpseReclaimDelay = CalculateCorpseReclaimDelay(); if (corpseReclaimDelay >= 0) @@ -4514,7 +4494,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) data << float(0); data << float(0); data << float(0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); // speed change, land walk @@ -4528,7 +4508,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) setDeathState(DeathState::Alive); SetMovement(MOVE_LAND_WALK); - SetMovement(MOVE_UNROOT); + SendMoveRoot(false); SetWaterWalking(false); m_deathTimer = 0; @@ -4592,7 +4572,7 @@ void Player::KillPlayer() if (IsFlying() && !GetTransport()) GetMotionMaster()->MoveFall(); - SetMovement(MOVE_ROOT); + SendMoveRoot(true); StopMirrorTimers(); //disable timers(bars) @@ -4619,7 +4599,7 @@ void Player::KillPlayer() //UpdateObjectVisibility(); // pussywizard: not needed } -void Player::OfflineResurrect(ObjectGuid const guid, CharacterDatabaseTransaction trans) +void Player::OfflineResurrect(ObjectGuid const& guid, CharacterDatabaseTransaction trans) { Corpse::DeleteFromDB(guid, trans); CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG); @@ -5001,7 +4981,7 @@ void Player::RepopAtGraveyard() data << ClosestGrave->x; data << ClosestGrave->y; data << ClosestGrave->z; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } } else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY())) @@ -5611,7 +5591,7 @@ void Player::SendActionButtons(uint32 state) const } } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG("entities.player", "Action Buttons for {} spec {} Sent", GetGUID().ToString(), m_activeSpec); } @@ -6238,7 +6218,7 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool awar // Xinef: non quest case, quest honor obtain is send in quest reward packet if (uVictim || groupsize > 0) - GetSession()->SendPacket(&data); + SendDirectMessage(&data); // add honor points ModifyHonorPoints(honor); @@ -6431,7 +6411,7 @@ void Player::CheckDuelDistance(time_t currTime) duel->OutOfBoundsTime = currTime + 10; WorldPacket data(SMSG_DUEL_OUTOFBOUNDS, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } } else @@ -6441,7 +6421,7 @@ void Player::CheckDuelDistance(time_t currTime) duel->OutOfBoundsTime = 0; WorldPacket data(SMSG_DUEL_INBOUNDS, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } else if (currTime >= duel->OutOfBoundsTime) DuelComplete(DUEL_FLED); @@ -6616,13 +6596,13 @@ void Player::_ApplyItemMods(Item* item, uint8 slot, bool apply) LOG_DEBUG("entities.player", "applying mods for item {} ", item->GetGUID().ToString()); - uint8 attacktype = Player::GetAttackBySlot(slot); + WeaponAttackType attacktype = Player::GetAttackBySlot(slot); if (item->HasSocket()) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items CorrectMetaGemEnchants(slot, apply); if (attacktype < MAX_ATTACK) - _ApplyWeaponDependentAuraMods(item, WeaponAttackType(attacktype), apply); + _ApplyWeaponDependentAuraMods(item, attacktype, apply); _ApplyItemBonuses(proto, slot, apply); @@ -6909,7 +6889,7 @@ void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply if (proto->ArcaneRes) HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply); - uint8 attType = Player::GetAttackBySlot(slot); + WeaponAttackType attType = Player::GetAttackBySlot(slot); if (attType != MAX_ATTACK) { _ApplyWeaponDamage(slot, proto, ssv, apply); @@ -6956,7 +6936,7 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr; } - uint8 attType = Player::GetAttackBySlot(slot); + WeaponAttackType attType = Player::GetAttackBySlot(slot); if (!IsInFeralForm() && apply && !CanUseAttackType(attType)) { return; @@ -6987,12 +6967,12 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt if (minDamage > 0.f) { - SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, minDamage, i); + SetBaseWeaponDamage(attType, MINDAMAGE, minDamage, i); } if (maxDamage > 0.f) { - SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, maxDamage, i); + SetBaseWeaponDamage(attType, MAXDAMAGE, maxDamage, i); } } } @@ -7001,8 +6981,8 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt { for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, 0.f, i); - SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, 0.f, i); + SetBaseWeaponDamage(attType, MINDAMAGE, 0.f, i); + SetBaseWeaponDamage(attType, MAXDAMAGE, 0.f, i); } if (attType == BASE_ATTACK) @@ -7026,8 +7006,8 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt if (IsInFeralForm()) return; - if (CanModifyStats() && (GetWeaponDamageRange(WeaponAttackType(attType), MAXDAMAGE) || proto->Delay)) - UpdateDamagePhysical(WeaponAttackType(attType)); + if (CanModifyStats() && (GetWeaponDamageRange(attType, MAXDAMAGE) || proto->Delay)) + UpdateDamagePhysical(attType); } void Player::CastAllObtainSpells() @@ -7620,9 +7600,9 @@ void Player::_RemoveAllItemMods() if (!proto) continue; - uint32 attacktype = Player::GetAttackBySlot(i); + WeaponAttackType attacktype = Player::GetAttackBySlot(i); if (attacktype < MAX_ATTACK) - _ApplyWeaponDependentAuraMods(m_items[i], WeaponAttackType(attacktype), false); + _ApplyWeaponDependentAuraMods(m_items[i], attacktype, false); _ApplyItemBonuses(proto, i, false); @@ -7649,9 +7629,9 @@ void Player::_ApplyAllItemMods() if (!proto) continue; - uint32 attacktype = Player::GetAttackBySlot(i); + WeaponAttackType attacktype = Player::GetAttackBySlot(i); if (attacktype < MAX_ATTACK) - _ApplyWeaponDependentAuraMods(m_items[i], WeaponAttackType(attacktype), true); + _ApplyWeaponDependentAuraMods(m_items[i], attacktype, true); _ApplyItemBonuses(proto, i, true); @@ -7804,7 +7784,7 @@ void Player::SendQuestGiverStatusMultiple() }); data.put<uint32>(0, count); // write real count - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } /* If in a battleground a player dies, and an enemy removes the insignia, the player's bones is lootable @@ -8251,14 +8231,14 @@ void Player::SendLootError(ObjectGuid guid, LootError error) void Player::SendNotifyLootMoneyRemoved() { WorldPacket data(SMSG_LOOT_CLEAR_MONEY, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendNotifyLootItemRemoved(uint8 lootSlot) { WorldPacket data(SMSG_LOOT_REMOVED, 1); data << uint8(lootSlot); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } // TODO - InitWorldStates should NOT always send the same states @@ -8963,7 +8943,7 @@ void Player::SetBindPoint(ObjectGuid guid) { WorldPacket data(SMSG_BINDER_CONFIRM, 8); data << guid; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendTalentWipeConfirm(ObjectGuid guid) @@ -8972,7 +8952,7 @@ void Player::SendTalentWipeConfirm(ObjectGuid guid) data << guid; uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : resetTalentsCost(); data << cost; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::ResetPetTalents() @@ -9017,7 +8997,7 @@ Pet* Player::GetPet() const return nullptr; } -Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration /*= 0s*/, uint32 healthPct /*= 0*/) +Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration /*= 0ms*/, uint32 healthPct /*= 0*/) { PetStable& petStable = GetOrInitPetStable(); @@ -9038,7 +9018,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy ++itr; } - if (duration > 0s) + if (duration > 0ms) pet->SetDuration(duration); // Generate a new name for the newly summoned ghoul @@ -9132,7 +9112,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy } } - if (duration > 0s) + if (duration > 0ms) pet->SetDuration(duration); if (NeedSendSpectatorData() && pet->GetCreatureTemplate()->family) @@ -9235,7 +9215,7 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) { WorldPacket data(SMSG_PET_SPELLS, 8); data << uint64(0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); if (GetGroup()) SetGroupUpdateFlag(GROUP_UPDATE_PET); @@ -9522,14 +9502,14 @@ void Player::Whisper(std::string_view text, Language language, Player* target, b WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, language, this, this, _text); - target->GetSession()->SendPacket(&data); + target->SendDirectMessage(&data); // rest stuff shouldn't happen in case of addon message if (isAddonMessage) return; ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster()) { @@ -9638,7 +9618,7 @@ void Player::PetSpellInitialize() data << uint32(category ? cooldown : 0); // category cooldown } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::PossessSpellInitialize() @@ -9666,7 +9646,7 @@ void Player::PossessSpellInitialize() data << uint8(0); // spells count data << uint8(0); // cooldowns count - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::VehicleSpellInitialize() @@ -9741,7 +9721,7 @@ void Player::VehicleSpellInitialize() data << uint32(category ? cooldown : 0); // category cooldown } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::CharmSpellInitialize() @@ -9795,14 +9775,14 @@ void Player::CharmSpellInitialize() data << uint8(0); // cooldowns count - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendRemoveControlBar() { WorldPacket data(SMSG_PET_SPELLS, 8); data << uint64(0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } bool Player::HasSpellMod(SpellModifier* mod, Spell* spell) @@ -10152,7 +10132,7 @@ void Player::SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) { WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4); data << uint8(itemClass) << uint32(itemSubclassMask); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::RemovePetitionsAndSigns(ObjectGuid guid, uint32 type) @@ -10604,7 +10584,7 @@ void Player::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) if (!cooldowns.empty()) { BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, cooldowns); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } } @@ -10724,7 +10704,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c data << uint32(vendorslot + 1); // numbered from 1 at client data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF); data << uint32(count); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); SendNewItem(it, pProto->BuyCount * count, true, false, false); if (!bStore) @@ -11141,7 +11121,7 @@ void Player::ModifySpellCooldown(uint32 spellId, int32 cooldown) data << uint32(spellId); // Spell ID data << GetGUID(); // Player GUID data << int32(cooldown); // Cooldown mod in milliseconds - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendCooldownEvent(SpellInfo const* spellInfo, uint32 itemId /*= 0*/, Spell* spell /*= nullptr*/, bool setCooldown /*= true*/) @@ -11617,7 +11597,7 @@ void Player::SendInitialPacketsBeforeAddToMap() data << m_homebindX << m_homebindY << m_homebindZ; data << (uint32) m_homebindMapId; data << (uint32) m_homebindAreaId; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); // SMSG_SET_PROFICIENCY // SMSG_SET_PCT_SPELL_MODIFIER @@ -11630,13 +11610,13 @@ void Player::SendInitialPacketsBeforeAddToMap() data.Initialize(SMSG_INSTANCE_DIFFICULTY, 4 + 4); data << uint32(GetMap()->GetDifficulty()); data << uint32(GetMap()->GetEntry()->IsDynamicDifficultyMap() && GetMap()->IsHeroic()); // Raid dynamic difficulty - GetSession()->SendPacket(&data); + SendDirectMessage(&data); SendInitialSpells(); data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4); data << uint32(0); // count, for (count) uint32; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); SendInitialActionButtons(); m_reputationMgr->SendInitialReputations(); @@ -11648,7 +11628,7 @@ void Player::SendInitialPacketsBeforeAddToMap() data.AppendPackedTime(GameTime::GetGameTime().count()); data << float(0.01666667f); // game speed data << uint32(0); // added in 3.1.2 - GetSession()->SendPacket(&data); + SendDirectMessage(&data); GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS @@ -11701,16 +11681,13 @@ void Player::SendInitialPacketsAfterAddToMap() GetZoneAndAreaId(newzone, newarea); UpdateZone(newzone, newarea); // also call SendInitWorldStates(); - if (HasStunAura()) - SetMovement(MOVE_ROOT); - WorldPacket setCompoundState(SMSG_MULTIPLE_MOVES, 100); setCompoundState << uint32(0); // size placeholder // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied. if (IsImmobilizedState()) { - auto const counter = GetSession()->GetOrderCounter(); + uint32 const counter = GetSession()->GetOrderCounter(); setCompoundState << uint8(2 + GetPackGUID().size() + 4); setCompoundState << uint16(SMSG_FORCE_MOVE_ROOT); setCompoundState << GetPackGUID(); @@ -11720,7 +11697,7 @@ void Player::SendInitialPacketsAfterAddToMap() if (HasAuraType(SPELL_AURA_FEATHER_FALL)) { - auto const counter = GetSession()->GetOrderCounter(); + uint32 const counter = GetSession()->GetOrderCounter(); setCompoundState << uint8(2 + GetPackGUID().size() + 4); setCompoundState << uint16(SMSG_MOVE_FEATHER_FALL); setCompoundState << GetPackGUID(); @@ -11730,7 +11707,7 @@ void Player::SendInitialPacketsAfterAddToMap() if (HasAuraType(SPELL_AURA_WATER_WALK)) { - auto const counter = GetSession()->GetOrderCounter(); + uint32 const counter = GetSession()->GetOrderCounter(); setCompoundState << uint8(2 + GetPackGUID().size() + 4); setCompoundState << uint16(SMSG_MOVE_WATER_WALK); setCompoundState << GetPackGUID(); @@ -11740,7 +11717,7 @@ void Player::SendInitialPacketsAfterAddToMap() if (HasAuraType(SPELL_AURA_HOVER)) { - auto const counter = GetSession()->GetOrderCounter(); + uint32 const counter = GetSession()->GetOrderCounter(); setCompoundState << uint8(2 + GetPackGUID().size() + 4); setCompoundState << uint16(SMSG_MOVE_SET_HOVER); setCompoundState << GetPackGUID(); @@ -11803,7 +11780,7 @@ void Player::SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 default: break; } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap) @@ -11838,7 +11815,7 @@ void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint3 data << uint8(bind && bind->perm); // is locked data << uint8(bind && bind->extended); // is extended, ignored if prev field is 0 } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::ApplyEquipCooldown(Item* pItem) @@ -11885,7 +11862,7 @@ void Player::ApplyEquipCooldown(Item* pItem) WorldPacket data(SMSG_ITEM_COOLDOWN, 12); data << pItem->GetGUID(); data << uint32(spellData.SpellId); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } } @@ -12157,7 +12134,7 @@ void Player::GetAurasForTarget(Unit* target, bool force /*= false*/) auraApp->BuildUpdatePacket(data, false); } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SetDailyQuestStatus(uint32 quest_id) @@ -12927,7 +12904,7 @@ void Player::SetClientControl(Unit* target, bool allowMove, bool packetOnly /*= WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, target->GetPackGUID().size() + 1); data << target->GetPackGUID(); data << uint8((allowMove && !target->HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED)) ? 1 : 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); // We want to set the packet only if (packetOnly) @@ -13048,7 +13025,7 @@ void Player::SendCorpseReclaimDelay(uint32 delay) { WorldPacket data(SMSG_CORPSE_RECLAIM_DELAY, 4); data << uint32(delay); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } Player* Player::GetNextRandomRaidMember(float radius) @@ -13275,7 +13252,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply) SetSeer(this); //WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0); - //GetSession()->SendPacket(&data); + //SendDirectMessage(&data); } } @@ -13431,7 +13408,7 @@ void Player::SetTitle(CharTitlesEntry const* title, bool lost) WorldPacket data(SMSG_TITLE_EARNED, 4 + 4); data << uint32(title->bit_index); data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost - GetSession()->SendPacket(&data); + SendDirectMessage(&data); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK); } @@ -13491,7 +13468,7 @@ void Player::ConvertRune(uint8 index, RuneType newType) WorldPacket data(SMSG_CONVERT_RUNE, 2); data << uint8(index); data << uint8(newType); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::ResyncRunes(uint8 count) @@ -13503,14 +13480,14 @@ void Player::ResyncRunes(uint8 count) data << uint8(GetCurrentRune(i)); // rune type data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255) } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::AddRunePower(uint8 index) { WorldPacket data(SMSG_ADD_RUNE_POWER, 4); data << uint32(1 << index); // mask (0x00-0x3F probably) - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } static RuneType runeSlotTypes[MAX_RUNES] = @@ -14371,6 +14348,73 @@ bool Player::CanSeeSpellClickOn(Creature const* c) const return false; } +/** + * @brief Checks if any vendor option is available in the gossip menu tree for a given creature. + * + * @param menuId The starting gossip menu ID to check. + * @param creature Pointer to the creature whose gossip menus are being checked. + * @return true if a vendor option is available in any accessible menu; false otherwise. + */ +bool Player::AnyVendorOptionAvailable(uint32 menuId, Creature const* creature) const +{ + { + GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId); + if (menuItemBounds.first == menuItemBounds.second) + return true; + } + + std::set<uint32> visitedMenus; + std::queue<uint32> menusToCheck; + menusToCheck.push(menuId); + + while (!menusToCheck.empty()) + { + uint32 const currentMenuId = menusToCheck.front(); + menusToCheck.pop(); + + if (visitedMenus.find(currentMenuId) != visitedMenus.end()) + continue; + + visitedMenus.insert(currentMenuId); + + GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(currentMenuId); + + if (menuItemBounds.first == menuItemBounds.second && currentMenuId != 0) + continue; + + for (auto itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr) + { + if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), itr->second.Conditions)) + continue; + + if (itr->second.OptionType == GOSSIP_OPTION_VENDOR) + return true; + else if (itr->second.ActionMenuID) + { + GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(itr->second.ActionMenuID); + bool menuAccessible = false; + + if (menuBounds.first == menuBounds.second) + menuAccessible = true; + else + { + for (auto menuItr = menuBounds.first; menuItr != menuBounds.second; ++menuItr) + if (sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), menuItr->second.Conditions)) + { + menuAccessible = true; + break; + } + } + + if (menuAccessible) + menusToCheck.push(itr->second.ActionMenuID); + } + } + } + + return false; +} + bool Player::CanSeeVendor(Creature const* creature) const { if (!creature->HasNpcFlag(UNIT_NPC_FLAG_VENDOR)) @@ -14378,9 +14422,11 @@ bool Player::CanSeeVendor(Creature const* creature) const ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), 0); if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), conditions)) - { return false; - } + + uint32 const menuId = creature->GetCreatureTemplate()->GossipMenuId; + if (!AnyVendorOptionAvailable(menuId, creature)) + return false; return true; } @@ -14499,7 +14545,7 @@ void Player::SendTalentsInfoData(bool pet) BuildPetTalentsInfoData(&data); else BuildPlayerTalentsInfoData(&data); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::BuildEnchantmentsInfoData(WorldPacket* data) @@ -14572,7 +14618,7 @@ void Player::SendEquipmentSetList() ++count; // client have limit but it checked at loading and set } data.put<uint32>(count_pos, count); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset) @@ -14610,7 +14656,7 @@ void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset) WorldPacket data(SMSG_EQUIPMENT_SET_SAVED, 4 + 1); data << uint32(index); data.appendPackGUID(eqslot.Guid); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } eqslot.state = old_state == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED; @@ -15421,7 +15467,7 @@ void Player::SendDuelCountdown(uint32 counter) { WorldPacket data(SMSG_DUEL_COUNTDOWN, 4); data << uint32(counter); // seconds - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SetIsSpectator(bool on) @@ -15625,7 +15671,7 @@ void Player::SendRefundInfo(Item* item) } data << uint32(0); data << uint32(GetTotalPlayedTime() - item->GetPlayedTime()); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } bool Player::AddItem(uint32 itemId, uint32 count) @@ -15673,7 +15719,7 @@ void Player::RefundItem(Item* item) WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4); data << item->GetGUID(); // Guid data << uint32(10); // Error! - GetSession()->SendPacket(&data); + SendDirectMessage(&data); return; } @@ -15714,7 +15760,7 @@ void Player::RefundItem(Item* item) WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4); data << item->GetGUID(); // Guid data << uint32(10); // Error! - GetSession()->SendPacket(&data); + SendDirectMessage(&data); return; } @@ -15729,7 +15775,7 @@ void Player::RefundItem(Item* item) data << uint32(iece->reqitem[i]); data << uint32(iece->reqitemcount[i]); } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem @@ -15971,24 +16017,6 @@ bool Player::IsInWhisperWhiteList(ObjectGuid guid) return false; } -bool Player::SetDisableGravity(bool disable, bool packetOnly /*= false*/, bool /*updateAnimationTier = true*/) -{ - if (!packetOnly && !Unit::SetDisableGravity(disable)) - return false; - - WorldPacket data(disable ? SMSG_MOVE_GRAVITY_DISABLE : SMSG_MOVE_GRAVITY_ENABLE, 12); - data << GetPackGUID(); - data << GetSession()->GetOrderCounter(); // movement counter - SendDirectMessage(&data); - GetSession()->IncrementOrderCounter(); - - data.Initialize(MSG_MOVE_GRAVITY_CHNG, 64); - data << GetPackGUID(); - BuildMovementPacket(&data); - SendMessageToSet(&data, false); - return true; -} - Guild* Player::GetGuild() const { uint32 guildId = GetGuildId(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 74c89cc96d..a95f44b2a8 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -41,6 +41,7 @@ #include "TradeData.h" #include "Unit.h" #include "WorldSession.h" +#include <set> #include <string> #include <vector> @@ -448,8 +449,6 @@ typedef std::list<Item*> ItemDurationList; enum PlayerMovementType { - MOVE_ROOT = 1, - MOVE_UNROOT = 2, MOVE_WATER_WALK = 3, MOVE_LAND_WALK = 4 }; @@ -1129,8 +1128,8 @@ public: void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap); bool CanInteractWithQuestGiver(Object* questGiver); - Creature* GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask); - [[nodiscard]] GameObject* GetGameObjectIfCanInteractWith(ObjectGuid guid, GameobjectTypes type) const; + Creature* GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflagmask); + [[nodiscard]] GameObject* GetGameObjectIfCanInteractWith(ObjectGuid const& guid, GameobjectTypes type) const; void ToggleAFK(); void ToggleDND(); @@ -1156,6 +1155,7 @@ public: void SetCommentator(bool on) { ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_COMMENTATOR2, on); } [[nodiscard]] bool IsDeveloper() const { return HasPlayerFlag(PLAYER_FLAGS_DEVELOPER); } void SetDeveloper(bool on) { ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_DEVELOPER, on); } + void SetBeastMaster(bool on) { if (on) SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); else RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); } [[nodiscard]] bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; } void SetAcceptWhispers(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; } [[nodiscard]] bool IsGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; } @@ -1210,7 +1210,7 @@ public: [[nodiscard]] PetStable const* GetPetStable() const { return m_petStable.get(); } [[nodiscard]] Pet* GetPet() const; - Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration = 0s, uint32 healthPct = 0); + Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration = 0ms, uint32 healthPct = 0); void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false); bool CanPetResurrect(); bool IsExistPet(); @@ -1257,7 +1257,7 @@ public: bool HasWeapon(WeaponAttackType type) const override { return GetWeaponForAttack(type, false); } bool HasWeaponForAttack(WeaponAttackType type) const override { return (Unit::HasWeaponForAttack(type) && GetWeaponForAttack(type, true)); } [[nodiscard]] Item* GetShield(bool useable = false) const; - static uint8 GetAttackBySlot(uint8 slot); // MAX_ATTACK if not weapon slot + static WeaponAttackType GetAttackBySlot(uint8 slot); // MAX_ATTACK if not weapon slot std::vector<Item*>& GetItemUpdateQueue() { return m_itemUpdateQueue; } static bool IsInventoryPos(uint16 pos) { return IsInventoryPos(pos >> 8, pos & 255); } static bool IsInventoryPos(uint8 bag, uint8 slot); @@ -2033,7 +2033,7 @@ public: Corpse* CreateCorpse(); void RemoveCorpse(); void KillPlayer(); - static void OfflineResurrect(ObjectGuid const guid, CharacterDatabaseTransaction trans); + static void OfflineResurrect(ObjectGuid const& guid, CharacterDatabaseTransaction trans); [[nodiscard]] bool HasCorpse() const { return _corpseLocation.GetMapId() != MAPID_INVALID; } [[nodiscard]] WorldLocation GetCorpseLocation() const { return _corpseLocation; } uint32 GetResurrectionSpellId(); @@ -2351,6 +2351,7 @@ public: void SetMover(Unit* target); void SetSeer(WorldObject* target) { m_seer = target; } + WorldObject* GetSeer() const { return m_seer; } void SetViewpoint(WorldObject* target, bool apply); [[nodiscard]] WorldObject* GetViewpoint() const; void StopCastingCharm(Aura* except = nullptr); @@ -2549,7 +2550,9 @@ public: //bool isActiveObject() const { return true; } bool CanSeeSpellClickOn(Creature const* creature) const; [[nodiscard]] bool CanSeeVendor(Creature const* creature) const; - +private: + [[nodiscard]] bool AnyVendorOptionAvailable(uint32 menuId, Creature const* creature) const; +public: [[nodiscard]] uint32 GetChampioningFaction() const { return m_ChampioningFaction; } void SetChampioningFaction(uint32 faction) { m_ChampioningFaction = faction; } Spell* m_spellModTakingSpell; @@ -2563,8 +2566,6 @@ public: bool IsInWhisperWhiteList(ObjectGuid guid); void RemoveFromWhisperWhiteList(ObjectGuid guid) { WhisperList.remove(guid); } - bool SetDisableGravity(bool disable, bool packetOnly = false, bool updateAnimationTier = true) override; - [[nodiscard]] bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); } [[nodiscard]] bool CanEnterWater() const override { return true; } bool IsFreeFlying() const { return HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || HasAuraType(SPELL_AURA_FLY); } @@ -2632,6 +2633,15 @@ public: std::string GetDebugInfo() const override; + bool IsExpectingChangeTransport() const { return _expectingChangeTransport; } + void SetExpectingChangeTransport(bool state) { _expectingChangeTransport = state; } + + uint32 GetPendingFlightChange() const { return _pendingFlightChangeCounter; } + void SetPendingFlightChange(uint32 counter) { _pendingFlightChangeCounter = counter; } + + void SetMapChangeOrderCounter() { _mapChangeOrderCounter = GetSession()->GetOrderCounter(); } + uint32 GetMapChangeOrderCounter() { return _mapChangeOrderCounter; } + /*********************************************************/ /*** SPELL QUEUE SYSTEM ***/ /*********************************************************/ @@ -3012,6 +3022,10 @@ private: PlayerSettingMap m_charSettingsMap; Seconds m_creationTime; + + bool _expectingChangeTransport; + uint32 _pendingFlightChangeCounter; + uint32 _mapChangeOrderCounter; }; void AddItemsSetItem(Player* player, Item* item); diff --git a/src/server/game/Entities/Player/PlayerMisc.cpp b/src/server/game/Entities/Player/PlayerMisc.cpp index 715e20fec5..9c0bf56184 100644 --- a/src/server/game/Entities/Player/PlayerMisc.cpp +++ b/src/server/game/Entities/Player/PlayerMisc.cpp @@ -78,7 +78,7 @@ bool Player::CanSpeak() const void Player::SendAttackSwingNotInRange() { WorldPacket data(SMSG_ATTACKSWING_NOTINRANGE, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid) @@ -128,25 +128,25 @@ void Player::Customize(CharacterCustomizeInfo const* customizeInfo, CharacterDat void Player::SendAttackSwingDeadTarget() { WorldPacket data(SMSG_ATTACKSWING_DEADTARGET, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendAttackSwingCantAttack() { WorldPacket data(SMSG_ATTACKSWING_CANT_ATTACK, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendAttackSwingCancelAttack() { WorldPacket data(SMSG_CANCEL_COMBAT, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendAttackSwingBadFacingAttack() { WorldPacket data(SMSG_ATTACKSWING_BADFACING, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendAutoRepeatCancel(Unit* target) @@ -161,7 +161,7 @@ void Player::SendExplorationExperience(uint32 Area, uint32 Experience) WorldPacket data(SMSG_EXPLORATION_EXPERIENCE, 8); data << uint32(Area); data << uint32(Experience); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendDungeonDifficulty(bool IsInGroup) @@ -171,7 +171,7 @@ void Player::SendDungeonDifficulty(bool IsInGroup) data << (uint32)GetDungeonDifficulty(); data << uint32(val); data << uint32(IsInGroup); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty) @@ -181,14 +181,14 @@ void Player::SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty) data << uint32(forcedDifficulty == -1 ? GetRaidDifficulty() : forcedDifficulty); data << uint32(val); data << uint32(IsInGroup); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendResetFailedNotify(uint32 mapid) { WorldPacket data(SMSG_RESET_FAILED_NOTIFY, 4); data << uint32(mapid); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } /// Reset all solo instances and optionally send a message on success for each @@ -327,7 +327,7 @@ void Player::SendResetInstanceSuccess(uint32 MapId) { WorldPacket data(SMSG_INSTANCE_RESET, 4); data << uint32(MapId); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) @@ -340,7 +340,7 @@ void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) WorldPacket data(SMSG_INSTANCE_RESET_FAILED, 4); data << uint32(reason); data << uint32(MapId); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } /*********************************************************/ diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index 9f663ff2fa..0b016d03fc 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -740,9 +740,9 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, if (log_slot < MAX_QUEST_LOG_SIZE) SetQuestSlot(log_slot, 0); - bool rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest(); + bool const rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest() && !(quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly()); - // Not give XP in case already completed once repeatable quest + // Repeatable quests (not time-based reset ones) should not give XP on subsequent completions uint32 XP = rewarded ? 0 : CalculateQuestRewardXP(quest); sScriptMgr->OnPlayerQuestComputeXP(this, quest, XP); @@ -990,7 +990,7 @@ bool Player::SatisfyQuestLog(bool msg) if (msg) { WorldPacket data(SMSG_QUESTLOG_FULL, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL"); } return false; @@ -2349,7 +2349,7 @@ void Player::SendQuestComplete(uint32 quest_id) { WorldPacket data(SMSG_QUESTUPDATE_COMPLETE, 4); data << uint32(quest_id); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = {}", quest_id); } } @@ -2376,7 +2376,7 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest))); data << uint32(quest->GetBonusTalents()); // bonus talents data << uint32(quest->GetRewArenaPoints()); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendQuestFailed(uint32 questId, InventoryResult reason) @@ -2386,7 +2386,7 @@ void Player::SendQuestFailed(uint32 questId, InventoryResult reason) WorldPacket data(SMSG_QUESTGIVER_QUEST_FAILED, 4 + 4); data << uint32(questId); data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message) - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED"); } } @@ -2397,7 +2397,7 @@ void Player::SendQuestTimerFailed(uint32 quest_id) { WorldPacket data(SMSG_QUESTUPDATE_FAILEDTIMER, 4); data << uint32(quest_id); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER"); } } @@ -2406,7 +2406,7 @@ void Player::SendCanTakeQuestResponse(uint32 msg) const { WorldPacket data(SMSG_QUESTGIVER_QUEST_INVALID, 4); data << uint32(msg); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_INVALID"); } @@ -2426,7 +2426,7 @@ void Player::SendQuestConfirmAccept(const Quest* quest, Player* pReceiver) data << uint32(quest->GetQuestId()); data << quest->GetTitle(); data << GetGUID(); - pReceiver->GetSession()->SendPacket(&data); + pReceiver->SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT"); } @@ -2439,7 +2439,7 @@ void Player::SendPushToPartyResponse(Player const* player, uint8 msg) const WorldPacket data(MSG_QUEST_PUSH_RESULT, (8 + 1)); data << player->GetGUID(); data << uint8(msg); // valid values: 0-8 - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT"); } } @@ -2450,7 +2450,7 @@ void Player::SendQuestUpdateAddItem(Quest const* /*quest*/, uint32 /*item_idx*/, LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM"); //data << quest->RequiredItemId[item_idx]; //data << count; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendQuestUpdateAddCreatureOrGo(Quest const* quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count) @@ -2469,7 +2469,7 @@ void Player::SendQuestUpdateAddCreatureOrGo(Quest const* quest, ObjectGuid guid, data << uint32(old_count + add_count); data << uint32(quest->RequiredNpcOrGoCount[ creatureOrGO_idx ]); data << guid; - GetSession()->SendPacket(&data); + SendDirectMessage(&data); uint16 log_slot = FindQuestSlot(quest->GetQuestId()); if (log_slot < MAX_QUEST_LOG_SIZE) @@ -2485,7 +2485,7 @@ void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 old_count, uint data << uint32(quest->GetQuestId()); data << uint32(old_count + add_count); data << uint32(quest->GetPlayersSlain()); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); uint16 log_slot = FindQuestSlot(quest->GetQuestId()); if (log_slot < MAX_QUEST_LOG_SIZE) diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index d45533ad63..80f6a068e4 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -51,6 +51,7 @@ #include "QuestDef.h" #include "ReputationMgr.h" #include "ScriptMgr.h" +#include "ScriptObjectFwd.h" #include "SocialMgr.h" #include "Spell.h" #include "SpellAuraEffects.h" @@ -539,7 +540,7 @@ Item* Player::GetShield(bool useable) const return item; } -uint8 Player::GetAttackBySlot(uint8 slot) +WeaponAttackType Player::GetAttackBySlot(uint8 slot) { switch (slot) { @@ -1847,8 +1848,13 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16& dest, Item* pItem, bool return EQUIP_ERR_NOT_DURING_ARENA_MATCH; } - if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0) - return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err + if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC)) + { + uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119; + uint32 startRecoveryTime = sSpellMgr->GetSpellInfo(cooldownSpell)->StartRecoveryTime; + if (m_weaponChangeTimer != 0 && m_weaponChangeTimer != startRecoveryTime) + return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err + } if (IsNonMeleeSpellCast(false)) return EQUIP_ERR_CANT_DO_RIGHT_NOW; @@ -2757,7 +2763,7 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) WorldPacket data; BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_INCLUDE_GCD, cooldownSpell, 0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } } } @@ -4051,7 +4057,7 @@ void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint break; } } - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param) @@ -4063,7 +4069,7 @@ void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 if (param > 0) data << uint32(param); data << uint8(msg); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, uint32 param) @@ -4075,7 +4081,7 @@ void Player::SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, if (param > 0) data << uint32(param); data << uint8(msg); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } void Player::TradeCancel(bool sendback, TradeStatus status /*= TRADE_STATUS_TRADE_CANCELED*/) @@ -4770,7 +4776,7 @@ void Player::SendNewItem(Item* item, uint32 count, bool received, bool created, if (broadcast && GetGroup()) GetGroup()->BroadcastPacket(&data, true); else - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } /*********************************************************/ @@ -6520,7 +6526,7 @@ void Player::BindToInstance() WorldPacket data(SMSG_INSTANCE_SAVE_CREATED, 4); data << uint32(0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); sInstanceSaveMgr->PlayerBindToInstance(this->GetGUID(), mapSave, true, this); } @@ -6555,7 +6561,7 @@ void Player::SendRaidInfo() } } data.put<uint32>(p_counter, counter); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } /* @@ -6582,7 +6588,7 @@ void Player::SendSavedInstances() //Send opcode 811. true or false means, whether you have current raid/heroic instances data.Initialize(SMSG_UPDATE_INSTANCE_OWNERSHIP); data << uint32(hasBeenSaved); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); if (!hasBeenSaved) return; @@ -6596,7 +6602,7 @@ void Player::SendSavedInstances() { data.Initialize(SMSG_UPDATE_LAST_INSTANCE); data << uint32(itr->second.save->GetMapId()); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } } } @@ -6833,7 +6839,7 @@ bool Player::Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map || missingPlayerItems.size() || missingPlayerQuests.size() || missingPlayerAchievements.size() || missingLeaderItems.size() || missingLeaderQuests.size() || missingLeaderAchievements.size()) { - if (!sScriptMgr->OnPlayerNotAvoidSatisfy(partyLeader, ar, target_map, report)) + if (!sScriptMgr->OnPlayerNotAvoidSatisfy(this, ar, target_map, report)) return true; if (report) diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index d3798a083f..df5153a1cb 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -1401,7 +1401,7 @@ void Player::UpdateHomebindTime(uint32 time) WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4); data << uint32(0); data << uint32(0); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); } // instance is valid, reset homebind timer m_HomebindTimer = 0; @@ -1424,7 +1424,7 @@ void Player::UpdateHomebindTime(uint32 time) WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4); data << uint32(m_HomebindTimer); data << uint32(1); - GetSession()->SendPacket(&data); + SendDirectMessage(&data); LOG_DEBUG( "maps", "PLAYER: Player '{}' ({}) will be teleported to homebind in 60 " @@ -1771,7 +1771,7 @@ void Player::UpdateTriggerVisibility() WorldPacket packet; udata.BuildPacket(packet); - GetSession()->SendPacket(&packet); + SendDirectMessage(&packet); } void Player::UpdateForQuestWorldObjects() @@ -1824,7 +1824,7 @@ void Player::UpdateForQuestWorldObjects() WorldPacket packet; udata.BuildPacket(packet); - GetSession()->SendPacket(&packet); + SendDirectMessage(&packet); } void Player::UpdateTitansGrip() @@ -1968,10 +1968,7 @@ void Player::UpdateCharmedAI() Unit* target = GetVictim(); if (target) - { SetInFront(target); - SendMovementFlagUpdate(true); - } if (HasUnitState(UNIT_STATE_CASTING)) return; diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index d5b5fdf59a..77830c8e56 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -37,7 +37,7 @@ uint32 PlayerSocial::GetNumberOfSocialsWithFlag(SocialFlag flag) const return counter; } -bool PlayerSocial::AddToSocialList(ObjectGuid friendGuid, SocialFlag flag) +bool PlayerSocial::AddToSocialList(ObjectGuid const& friendGuid, SocialFlag flag) { // check client limits if (GetNumberOfSocialsWithFlag(flag) >= (((flag & SOCIAL_FLAG_FRIEND) != 0) ? SOCIALMGR_FRIEND_LIMIT : SOCIALMGR_IGNORE_LIMIT)) @@ -71,7 +71,7 @@ bool PlayerSocial::AddToSocialList(ObjectGuid friendGuid, SocialFlag flag) return true; } -void PlayerSocial::RemoveFromSocialList(ObjectGuid friendGuid, SocialFlag flag) +void PlayerSocial::RemoveFromSocialList(ObjectGuid const& friendGuid, SocialFlag flag) { auto itr = m_playerSocialMap.find(friendGuid); if (itr == m_playerSocialMap.end()) // not exist @@ -102,7 +102,7 @@ void PlayerSocial::RemoveFromSocialList(ObjectGuid friendGuid, SocialFlag flag) } } -void PlayerSocial::SetFriendNote(ObjectGuid friendGuid, std::string note) +void PlayerSocial::SetFriendNote(ObjectGuid const& friendGuid, std::string note) { auto itr = m_playerSocialMap.find(friendGuid); if (itr == m_playerSocialMap.end()) // not exist @@ -172,11 +172,11 @@ void PlayerSocial::SendSocialList(Player* player, uint32 flags) } data.put<uint32>(countPos, totalCount); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_CONTACT_LIST"); } -bool PlayerSocial::_checkContact(ObjectGuid guid, SocialFlag flags) const +bool PlayerSocial::_checkContact(ObjectGuid const& guid, SocialFlag flags) const { auto const& itr = m_playerSocialMap.find(guid); if (itr != m_playerSocialMap.end()) @@ -185,12 +185,12 @@ bool PlayerSocial::_checkContact(ObjectGuid guid, SocialFlag flags) const return false; } -bool PlayerSocial::HasFriend(ObjectGuid friend_guid) const +bool PlayerSocial::HasFriend(ObjectGuid const& friend_guid) const { return _checkContact(friend_guid, SOCIAL_FLAG_FRIEND); } -bool PlayerSocial::HasIgnore(ObjectGuid ignore_guid) const +bool PlayerSocial::HasIgnore(ObjectGuid const& ignore_guid) const { return _checkContact(ignore_guid, SOCIAL_FLAG_IGNORED); } @@ -209,7 +209,7 @@ SocialMgr* SocialMgr::instance() return &instance; } -void SocialMgr::GetFriendInfo(Player* player, ObjectGuid friendGUID, FriendInfo& friendInfo) +void SocialMgr::GetFriendInfo(Player* player, ObjectGuid const& friendGUID, FriendInfo& friendInfo) { if (!player) return; @@ -247,14 +247,14 @@ void SocialMgr::GetFriendInfo(Player* player, ObjectGuid friendGUID, FriendInfo& } } -void SocialMgr::MakeFriendStatusPacket(FriendsResult result, ObjectGuid guid, WorldPacket* data) +void SocialMgr::MakeFriendStatusPacket(FriendsResult result, ObjectGuid const& guid, WorldPacket* data) { data->Initialize(SMSG_FRIEND_STATUS, 9); *data << uint8(result); *data << guid; } -void SocialMgr::SendFriendStatus(Player* player, FriendsResult result, ObjectGuid friendGuid, bool broadcast) +void SocialMgr::SendFriendStatus(Player* player, FriendsResult result, ObjectGuid const& friendGuid, bool broadcast) { FriendInfo fi; GetFriendInfo(player, friendGuid, fi); @@ -288,7 +288,7 @@ void SocialMgr::SendFriendStatus(Player* player, FriendsResult result, ObjectGui if (broadcast) BroadcastToFriendListers(player, &data); else - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket* packet) @@ -311,12 +311,12 @@ void SocialMgr::BroadcastToFriendListers(Player* player, WorldPacket* packet) // PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // MODERATOR, GAME MASTER, ADMINISTRATOR can see all if (pFriend && (!AccountMgr::IsPlayerAccount(pFriend->GetSession()->GetSecurity()) || ((pFriend->GetTeamId() == teamId || allowTwoSideWhoList) && security <= gmLevelInWhoList)) && player->IsVisibleGloballyFor(pFriend)) - pFriend->GetSession()->SendPacket(packet); + pFriend->SendDirectMessage(packet); } } } -PlayerSocial* SocialMgr::LoadFromDB(PreparedQueryResult result, ObjectGuid guid) +PlayerSocial* SocialMgr::LoadFromDB(PreparedQueryResult result, ObjectGuid const& guid) { PlayerSocial* social = &m_socialMap[guid]; social->SetPlayerGUID(guid); diff --git a/src/server/game/Entities/Player/SocialMgr.h b/src/server/game/Entities/Player/SocialMgr.h index a35187b6fb..5995f05e9f 100644 --- a/src/server/game/Entities/Player/SocialMgr.h +++ b/src/server/game/Entities/Player/SocialMgr.h @@ -104,19 +104,19 @@ class PlayerSocial public: PlayerSocial(); // adding/removing - bool AddToSocialList(ObjectGuid friend_guid, SocialFlag flag); - void RemoveFromSocialList(ObjectGuid friend_guid, SocialFlag flag); - void SetFriendNote(ObjectGuid friendGuid, std::string note); + bool AddToSocialList(ObjectGuid const& friend_guid, SocialFlag flag); + void RemoveFromSocialList(ObjectGuid const& friend_guid, SocialFlag flag); + void SetFriendNote(ObjectGuid const& friendGuid, std::string note); // Packet send's void SendSocialList(Player* player, uint32 flags); // Misc - bool HasFriend(ObjectGuid friend_guid) const; - bool HasIgnore(ObjectGuid ignore_guid) const; - ObjectGuid GetPlayerGUID() const { return m_playerGUID; } - void SetPlayerGUID(ObjectGuid guid) { m_playerGUID = guid; } + bool HasFriend(ObjectGuid const& friend_guid) const; + bool HasIgnore(ObjectGuid const& ignore_guid) const; + ObjectGuid const& GetPlayerGUID() const { return m_playerGUID; } + void SetPlayerGUID(ObjectGuid const& guid) { m_playerGUID = guid; } uint32 GetNumberOfSocialsWithFlag(SocialFlag flag) const; private: - bool _checkContact(ObjectGuid guid, SocialFlag flags) const; + bool _checkContact(ObjectGuid const& guid, SocialFlag flags) const; typedef std::map<ObjectGuid, FriendInfo> PlayerSocialMap; PlayerSocialMap m_playerSocialMap; ObjectGuid m_playerGUID; @@ -131,14 +131,14 @@ class SocialMgr public: static SocialMgr* instance(); // Misc - void RemovePlayerSocial(ObjectGuid guid) { m_socialMap.erase(guid); } - static void GetFriendInfo(Player* player, ObjectGuid friendGUID, FriendInfo& friendInfo); + void RemovePlayerSocial(ObjectGuid const& guid) { m_socialMap.erase(guid); } + static void GetFriendInfo(Player* player, ObjectGuid const& friendGUID, FriendInfo& friendInfo); // Packet management - void MakeFriendStatusPacket(FriendsResult result, ObjectGuid friend_guid, WorldPacket* data); - void SendFriendStatus(Player* player, FriendsResult result, ObjectGuid friend_guid, bool broadcast); + void MakeFriendStatusPacket(FriendsResult result, ObjectGuid const& friend_guid, WorldPacket* data); + void SendFriendStatus(Player* player, FriendsResult result, ObjectGuid const& friend_guid, bool broadcast); void BroadcastToFriendListers(Player* player, WorldPacket* packet); // Loading - PlayerSocial* LoadFromDB(PreparedQueryResult result, ObjectGuid guid); + PlayerSocial* LoadFromDB(PreparedQueryResult result, ObjectGuid const& guid); private: typedef std::map<ObjectGuid, PlayerSocial> SocialMap; SocialMap m_socialMap; diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index db4fae0e62..3bf8a55174 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -119,11 +119,11 @@ void Totem::InitSummon() } } -void Totem::UnSummon(uint32 msTime) +void Totem::UnSummon(Milliseconds msTime) { - if (msTime) + if (msTime > 0ms) { - m_Events.AddEvent(new ForcedUnsummonDelayEvent(*this), m_Events.CalculateTime(msTime)); + m_Events.AddEventAtOffset(new ForcedUnsummonDelayEvent(*this), msTime); return; } diff --git a/src/server/game/Entities/Totem/Totem.h b/src/server/game/Entities/Totem/Totem.h index 5265435d53..27ccc12bb3 100644 --- a/src/server/game/Entities/Totem/Totem.h +++ b/src/server/game/Entities/Totem/Totem.h @@ -55,7 +55,7 @@ public: void Update(uint32 time) override; void InitStats(uint32 duration) override; void InitSummon() override; - void UnSummon(uint32 msTime = 0) override; + void UnSummon(Milliseconds msTime = 0ms) override; uint32 GetSpell(uint8 slot = 0) const { return m_spells[slot]; } uint32 GetTotemDuration() const { return m_duration; } void SetTotemDuration(uint32 duration) { m_duration = duration; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index addcf5b2b8..cf1bb05206 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -50,6 +50,7 @@ #include "PassiveAI.h" #include "Pet.h" #include "PetAI.h" +#include "PetPackets.h" #include "Player.h" #include "ReputationMgr.h" #include "ScriptMgr.h" @@ -1086,12 +1087,10 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD))) victim->ToCreature()->UpdateLeashExtensionTime(); - if (attacker) + if (attacker && attacker != victim) { if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker)) - { victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS)); - } victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto); } @@ -8180,7 +8179,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID()) return false; - WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot())); + WeaponAttackType attType = player->GetAttackBySlot(castItem->GetSlot()); if ((attType != BASE_ATTACK && attType != OFF_ATTACK) || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK) || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)) @@ -8371,7 +8370,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped()) return false; - WeaponAttackType attType = WeaponAttackType(Player::GetAttackBySlot(castItem->GetSlot())); + WeaponAttackType attType = Player::GetAttackBySlot(castItem->GetSlot()); if ((attType != BASE_ATTACK && attType != OFF_ATTACK) || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK) || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)) @@ -9289,28 +9288,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg { switch (auraSpellInfo->Id) { - // Soul Preserver - case 60510: - { - switch (getClass()) - { - case CLASS_DRUID: - trigger_spell_id = 60512; - break; - case CLASS_PALADIN: - trigger_spell_id = 60513; - break; - case CLASS_PRIEST: - trigger_spell_id = 60514; - break; - case CLASS_SHAMAN: - trigger_spell_id = 60515; - break; - } - - target = this; - break; - } case 37657: // Lightning Capacitor case 54841: // Thunder Capacitor case 67712: // Item - Coliseum 25 Normal Caster Trinket @@ -10986,7 +10963,11 @@ void Unit::SetCharm(Unit* charm, bool apply) charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); } else + { charm->m_ControlledByPlayer = false; + if (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED)) + charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); + } // PvP, FFAPvP charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1)); @@ -11095,7 +11076,7 @@ int32 Unit::DealHeal(Unit* healer, Unit* victim, uint32 addhealth) return gain; } -bool RedirectSpellEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) +bool RedirectSpellEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { if (Unit* auraOwner = ObjectAccessor::GetUnit(_self, _auraOwnerGUID)) { @@ -13585,7 +13566,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) SendMessageToSet(&data, true); data.Initialize(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); // mounts can also have accessories GetVehicleKit()->InstallAllAccessories(false); @@ -13613,7 +13594,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) data << GetPackGUID(); data << player->GetSession()->GetOrderCounter(); // movement counter data << player->GetCollisionHeight(); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->GetSession()->IncrementOrderCounter(); } @@ -13634,7 +13615,7 @@ void Unit::Dismount() data << GetPackGUID(); data << player->GetSession()->GetOrderCounter(); // movement counter data << player->GetCollisionHeight(); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->GetSession()->IncrementOrderCounter(); } @@ -14546,116 +14527,55 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) propagateSpeedChange(); - WorldPacket data; - if (!forced) + SpeedOpcodePair const& speedOpcodes = SetSpeed2Opc_table[mtype]; + + if (forced && IsClientControlled()) { - switch (mtype) - { - case MOVE_WALK: - data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_RUN: - data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_RUN_BACK: - data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_SWIM: - data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_SWIM_BACK: - data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_TURN_RATE: - data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_FLIGHT: - data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_FLIGHT_BACK: - data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - case MOVE_PITCH_RATE: - data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4); - break; - default: - LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype); - return; - } + Player* player = const_cast<Player*>(GetClientControlling()); + uint32 const counter = player->GetSession()->GetOrderCounter(); + + // register forced speed changes for WorldSession::HandleForceSpeedChangeAck + // and do it only for real sent packets and use run for run/mounted as client expected + ++player->m_forced_speed_changes[mtype]; + + WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::PC)], 18); + data << GetPackGUID(); + data << counter; + if (mtype == MOVE_RUN) + data << uint8(0); // new 2.1.0 + data << GetSpeed(mtype); + player->GetSession()->SendPacket(&data); + player->GetSession()->IncrementOrderCounter(); + } + else if (forced) + { + WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::NPC)], 12); data << GetPackGUID(); - BuildMovementPacket(&data); data << float(GetSpeed(mtype)); SendMessageToSet(&data, true); } - else + + if (IsPlayer()) { - if (IsPlayer()) + // Xinef: update speed of pet also + if (!IsInCombat()) { - // register forced speed changes for WorldSession::HandleForceSpeedChangeAck - // and do it only for real sent packets and use run for run/mounted as client expected - ++ToPlayer()->m_forced_speed_changes[mtype]; + Unit* pet = ToPlayer()->GetPet(); + if (!pet) + pet = GetCharm(); - // Xinef: update speed of pet also - if (!IsInCombat()) - { - Unit* pet = ToPlayer()->GetPet(); - if (!pet) - pet = GetCharm(); + // xinef: do not affect vehicles and possesed pets + if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle())) + pet = nullptr; - // xinef: do not affect vehicles and possesed pets - if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle())) - pet = nullptr; + if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE) + pet->UpdateSpeed(mtype, forced); - if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE) - pet->UpdateSpeed(mtype, forced); - if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID())) - critter->UpdateSpeed(mtype, forced); - } - ToPlayer()->SetCanTeleport(true); + if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID())) + critter->UpdateSpeed(mtype, forced); } - - switch (mtype) - { - case MOVE_WALK: - data.Initialize(SMSG_FORCE_WALK_SPEED_CHANGE, 16); - break; - case MOVE_RUN: - data.Initialize(SMSG_FORCE_RUN_SPEED_CHANGE, 17); - break; - case MOVE_RUN_BACK: - data.Initialize(SMSG_FORCE_RUN_BACK_SPEED_CHANGE, 16); - break; - case MOVE_SWIM: - data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, 16); - break; - case MOVE_SWIM_BACK: - data.Initialize(SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, 16); - break; - case MOVE_TURN_RATE: - data.Initialize(SMSG_FORCE_TURN_RATE_CHANGE, 16); - break; - case MOVE_FLIGHT: - data.Initialize(SMSG_FORCE_FLIGHT_SPEED_CHANGE, 16); - break; - case MOVE_FLIGHT_BACK: - data.Initialize(SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, 16); - break; - case MOVE_PITCH_RATE: - data.Initialize(SMSG_FORCE_PITCH_RATE_CHANGE, 16); - break; - default: - LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype); - return; - } - data << GetPackGUID(); - data << (IsPlayer() ? ToPlayer()->GetSession()->GetOrderCounter() : uint32(0)); // movement counter - if (mtype == MOVE_RUN) - data << uint8(0); // new 2.1.0 - data << float(GetSpeed(mtype)); - SendMessageToSet(&data, true); - if (IsPlayer()) // TODO: Resolve this mess - ToPlayer()->GetSession()->IncrementOrderCounter(); + ToPlayer()->SetCanTeleport(true); } } @@ -16696,7 +16616,7 @@ Player* Unit::GetSpellModOwner() const } ///----------Pet responses methods----------------- -void Unit::SendPetActionFeedback(uint8 msg) +void Unit::SendPetActionFeedback(uint8 msg) const { Unit* owner = GetOwner(); if (!owner || !owner->IsPlayer()) @@ -16704,22 +16624,21 @@ void Unit::SendPetActionFeedback(uint8 msg) WorldPacket data(SMSG_PET_ACTION_FEEDBACK, 1); data << uint8(msg); - owner->ToPlayer()->GetSession()->SendPacket(&data); + owner->ToPlayer()->SendDirectMessage(&data); } -void Unit::SendPetTalk(uint32 pettalk) +void Unit::SendPetActionSound(PetAction action) const { - Unit* owner = GetOwner(); - if (!owner || !owner->IsPlayer()) - return; + SendMessageToSet(WorldPackets::Pet::PetActionSound(GetGUID(), static_cast<int32>(action)).Write(), false); +} - WorldPacket data(SMSG_PET_ACTION_SOUND, 8 + 4); - data << GetGUID(); - data << uint32(pettalk); - owner->ToPlayer()->GetSession()->SendPacket(&data); +void Unit::SendPetDismissSound() const +{ + if (CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId())) + SendMessageToSet(WorldPackets::Pet::PetDismissSound(static_cast<int32>(displayInfo->ModelId), GetPosition()).Write(), false); } -void Unit::SendPetAIReaction(ObjectGuid guid) +void Unit::SendPetAIReaction(ObjectGuid guid) const { Unit* owner = GetOwner(); if (!owner || !owner->IsPlayer()) @@ -16728,7 +16647,7 @@ void Unit::SendPetAIReaction(ObjectGuid guid) WorldPacket data(SMSG_AI_REACTION, 8 + 4); data << guid; data << uint32(AI_REACTION_HOSTILE); - owner->ToPlayer()->GetSession()->SendPacket(&data); + owner->ToPlayer()->SendDirectMessage(&data); } ///----------End of Pet responses methods---------- @@ -16794,6 +16713,13 @@ void Unit::StopMovingOnCurrentPos() void Unit::SendMovementFlagUpdate(bool self /* = false */) { + if (IsRooted()) + { + // each case where this occurs has to be examined and reported and dealt with. + LOG_ERROR("Unit", "Attempted sending heartbeat with root flag for guid {}", GetGUID().ToString()); + return; + } + WorldPacket data; BuildHeartBeatMsg(&data); SendMessageToSet(&data, self); @@ -16834,7 +16760,7 @@ void Unit::SetStandState(uint8 state) { WorldPacket data(SMSG_STANDSTATE_UPDATE, 1); data << (uint8)state; - ToPlayer()->GetSession()->SendPacket(&data); + ToPlayer()->SendDirectMessage(&data); } } @@ -18315,73 +18241,65 @@ void Unit::SetStunned(bool apply) } } -void Unit::SetRooted(bool apply, bool isStun) +void Unit::SetRooted(bool apply, bool stun, bool logout) { + const uint32 state = (stun ? (logout ? UNIT_STATE_LOGOUT_TIMER : UNIT_STATE_STUNNED) : UNIT_STATE_ROOT); + if (apply) { - // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a) - // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before - // setting MOVEMENTFLAG_ROOT - RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING); + AddUnitState(state); - if (IsFalling()) - { - AddUnitMovementFlag(MOVEMENTFLAG_PENDING_ROOT); - } - else - { - AddUnitMovementFlag(MOVEMENTFLAG_ROOT); - } + SendMoveRoot(true); + } + else + { + ClearUnitState(state); - // Creature specific - if (!IsPlayer()) - { - if (isStun && movespline->Finalized()) - { - StopMovingOnCurrentPos(); - } - else - { - StopMoving(); - } - } + // Prevent giving ability to move if more immobilizers are active + if (!IsImmobilizedState()) + SendMoveRoot(false); + } +} - if (m_movedByPlayer) +void Unit::SendMoveRoot(bool apply) +{ + const Player* client = GetClientControlling(); + + // Apply flags in-place when unit currently is not controlled by a player + if (!client) + { + if (apply) { - WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4); - data << GetPackGUID(); - data << m_movedByPlayer->ToPlayer()->GetSession()->GetOrderCounter(); // movement counter - m_movedByPlayer->ToPlayer()->SendDirectMessage(&data); - m_movedByPlayer->ToPlayer()->GetSession()->IncrementOrderCounter(); + m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_MASK_MOVING_FLY); + m_movementInfo.AddMovementFlag(MOVEMENTFLAG_ROOT); + if (!client) + StopMoving(); } else - { - WorldPacket data(SMSG_SPLINE_MOVE_ROOT, GetPackGUID().size()); - data << GetPackGUID(); - SendMessageToSet(&data, true); - } + m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_ROOT); } + + if (!IsInWorld()) + return; + + const PackedGuid& guid = GetPackGUID(); + // Wrath+ spline root: when unit is currently not controlled by a player + if (!client) + { + WorldPacket data(apply ? SMSG_SPLINE_MOVE_ROOT : SMSG_SPLINE_MOVE_UNROOT, guid.size()); + data << guid; + SendMessageToSet(&data, true); + } + // Wrath+ force root: when unit is controlled by a player else { - RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT | MOVEMENTFLAG_PENDING_ROOT); + uint32 const counter = client->GetSession()->GetOrderCounter(); - if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect - { - if (m_movedByPlayer) - { - WorldPacket data(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4); - data << GetPackGUID(); - data << m_movedByPlayer->ToPlayer()->GetSession()->GetOrderCounter(); // movement counter - m_movedByPlayer->ToPlayer()->SendDirectMessage(&data); - m_movedByPlayer->ToPlayer()->GetSession()->IncrementOrderCounter(); - } - else - { - WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, GetPackGUID().size()); - data << GetPackGUID(); - SendMessageToSet(&data, true); - } - } + WorldPacket data(apply ? SMSG_FORCE_MOVE_ROOT : SMSG_FORCE_MOVE_UNROOT, guid.size() + 4); + data << guid; + data << counter; + client->GetSession()->SendPacket(&data); + client->GetSession()->IncrementOrderCounter(); } } @@ -19283,7 +19201,7 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ) data << float(speedXY); // Horizontal speed data << float(-speedZ); // Z Movement speed (vertical) - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->GetSession()->IncrementOrderCounter(); player->SetCanKnockback(true); @@ -19383,7 +19301,7 @@ void Unit::JumpTo(float speedXY, float speedZ, bool forward) data << float(speedXY); // Horizontal speed data << float(-speedZ); // Z Movement speed (vertical) - ToPlayer()->GetSession()->SendPacket(&data); + ToPlayer()->SendDirectMessage(&data); } } @@ -19541,7 +19459,7 @@ void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* a bg->EventPlayerDroppedFlag(player); WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } ASSERT(!m_vehicle); @@ -19604,7 +19522,7 @@ void Unit::ExitVehicle(Position const* /*exitPosition*/) } } -bool VehicleDespawnEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) +bool VehicleDespawnEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { Position pos = _self; _self.MovePositionToFirstCollision(pos, 20.0f, M_PI); @@ -19635,6 +19553,9 @@ void Unit::_ExitVehicle(Position const* exitPosition) if (!vehicleBase) return; + if (IsPlayer()) + ToPlayer()->SetExpectingChangeTransport(true); + SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT Position pos; @@ -19711,7 +19632,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) else if (vehicleBase->IsCreature()) { vehicle->Uninstall(); - vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000)); + vehicleBase->m_Events.AddEventAtOffset(new VehicleDespawnEvent(*vehicleBase, 2s), 2s); } // xinef: ugly hack, no appripriate hook later to cast spell @@ -19731,7 +19652,7 @@ void Unit::_ExitVehicle(Position const* exitPosition) setDeathState(DeathState::JustDied); // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon else - ToTempSummon()->UnSummon(2000); // Approximation + ToTempSummon()->UnSummon(2s); // Approximation } if (player) @@ -20118,7 +20039,7 @@ class AuraMunchingQueue : public BasicEvent public: AuraMunchingQueue(Unit& owner, ObjectGuid targetGUID, int32 basePoints, uint32 spellId, AuraEffect* aurEff, AuraType auraType) : _owner(owner), _targetGUID(targetGUID), _basePoints(basePoints), _spellId(spellId), _aurEff(aurEff), _auraType(auraType) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override + bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override { if (_owner.IsInWorld() && _owner.FindMap()) if (Unit* target = ObjectAccessor::GetUnit(_owner, _targetGUID)) @@ -20147,24 +20068,6 @@ private: AuraType _auraType; }; -class ResetToHomeOrientation : public BasicEvent -{ -public: - ResetToHomeOrientation(Creature& self) : _self(self) { } - - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override - { - if (_self.IsInWorld() && _self.FindMap() && _self.IsAlive() && !_self.IsInCombat()) - { - _self.SetFacingTo(_self.GetHomePosition().GetOrientation()); - } - - return true; - } -private: - Creature& _self; -}; - void Unit::CastDelayedSpellWithPeriodicAmount(Unit* caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex) { AuraEffect* aurEff = nullptr; @@ -20390,7 +20293,7 @@ void Unit::SetFacingTo(float ori) init.Launch(); } -void Unit::SetFacingToObject(WorldObject* object) +void Unit::SetFacingToObject(WorldObject* object, Milliseconds timed /*= 0ms*/) { // never face when already moving if (!IsStopped()) @@ -20401,24 +20304,20 @@ void Unit::SetFacingToObject(WorldObject* object) init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ()); init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming init.Launch(); -} - -void Unit::SetTimedFacingToObject(WorldObject* object, uint32 time) -{ - // never face when already moving - if (!IsStopped() || !time) - return; - - /// @todo figure out under what conditions creature will move towards object instead of facing it where it currently is. - Movement::MoveSplineInit init(this); - init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ()); - init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming - init.Launch(); - if (Creature* c = ToCreature()) - c->m_Events.AddEvent(new ResetToHomeOrientation(*c), c->m_Events.CalculateTime(time)); - else - LOG_ERROR("entities.unit", "Unit::SetTimedFacingToObject called on non-creature unit {}. This should never happen.", GetEntry()); + if (timed > 0ms) + { + if (Creature* c = ToCreature()) + { + c->m_Events.AddEventAtOffset([c]() + { + if (c->IsInWorld() && c->FindMap() && c->IsAlive() && !c->IsInCombat()) + c->SetFacingTo(c->GetHomePosition().GetOrientation()); + }, timed); + } + else + LOG_ERROR("entities.unit", "Unit::SetFacingToObject called on non-creature unit {}. This should never happen.", GetEntry()); + } } bool Unit::SetWalk(bool enable) @@ -20435,22 +20334,39 @@ bool Unit::SetWalk(bool enable) return true; } -bool Unit::SetDisableGravity(bool disable, bool /*packetOnly = false*/, bool /*updateAnimationTier = true*/) +void Unit::SetDisableGravity(bool enable) { - if (disable == IsLevitating()) - return false; + bool isClientControlled = IsClientControlled(); - if (disable) + if (!isClientControlled) { - AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); - RemoveUnitMovementFlag(MOVEMENTFLAG_FALLING); + if (enable) + m_movementInfo.AddMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + else + m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); } - else + + if (!IsInWorld()) // is sent on add to map + return; + + if (isClientControlled) { - RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + if (Player const* player = GetClientControlling()) + { + uint32 const counter = player->GetSession()->GetOrderCounter(); + + WorldPacket data(enable ? SMSG_MOVE_GRAVITY_DISABLE : SMSG_MOVE_GRAVITY_ENABLE, GetPackGUID().size() + 4); + data << GetPackGUID(); + data << counter; + player->GetSession()->SendPacket(&data); + player->GetSession()->IncrementOrderCounter(); + return; + } } - return true; + WorldPacket data(enable ? SMSG_SPLINE_MOVE_GRAVITY_DISABLE : SMSG_SPLINE_MOVE_GRAVITY_ENABLE, 9); + data << GetPackGUID(); + SendMessageToSet(&data, true); } bool Unit::SetSwim(bool enable) @@ -20497,12 +20413,13 @@ void Unit::SetCanFly(bool enable) { if (Player const* player = GetClientControlling()) { - auto const counter = player->GetSession()->GetOrderCounter(); + uint32 const counter = player->GetSession()->GetOrderCounter(); + const_cast<Player*>(player)->SetPendingFlightChange(counter); WorldPacket data(enable ? SMSG_MOVE_SET_CAN_FLY : SMSG_MOVE_UNSET_CAN_FLY, GetPackGUID().size() + 4); data << GetPackGUID(); data << counter; - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->GetSession()->IncrementOrderCounter(); return; } @@ -20532,13 +20449,13 @@ void Unit::SetFeatherFall(bool enable) { if (Player const* player = GetClientControlling()) { - auto const counter = player->GetSession()->GetOrderCounter(); + uint32 const counter = player->GetSession()->GetOrderCounter(); WorldPacket data(enable ? SMSG_MOVE_FEATHER_FALL : SMSG_MOVE_NORMAL_FALL, GetPackGUID().size() + 4); data << GetPackGUID(); data << counter; - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->GetSession()->IncrementOrderCounter(); // start fall from current height @@ -20592,11 +20509,11 @@ void Unit::SetHover(bool enable) { WorldPacket data(enable ? SMSG_MOVE_SET_HOVER : SMSG_MOVE_UNSET_HOVER, GetPackGUID().size() + 4); - auto const counter = player->GetSession()->GetOrderCounter(); + uint32 const counter = player->GetSession()->GetOrderCounter(); data << GetPackGUID(); data << counter; - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->GetSession()->IncrementOrderCounter(); return; } @@ -20626,12 +20543,12 @@ void Unit::SetWaterWalking(bool enable) { if (Player const* player = GetClientControlling()) { - auto const counter = player->GetSession()->GetOrderCounter(); + uint32 const counter = player->GetSession()->GetOrderCounter(); WorldPacket data(enable ? SMSG_MOVE_WATER_WALK : SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4); data << GetPackGUID(); data << counter; - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->GetSession()->IncrementOrderCounter(); return; } @@ -20821,7 +20738,10 @@ void Unit::PatchValuesUpdate(ByteBuffer& valuesUpdateBuf, BuildValuesCachePosPoi appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK; if (!target->CanSeeVendor(creature)) + { + appendValue &= ~UNIT_NPC_FLAG_REPAIR; appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK; + } if (!creature->IsValidTrainerForPlayer(target, &appendValue)) appendValue &= ~UNIT_NPC_FLAG_TRAINER; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 726addd949..b50e486ba6 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -26,6 +26,7 @@ #include "ItemTemplate.h" #include "MotionMaster.h" #include "Object.h" +#include "PetDefines.h" #include "SharedDefines.h" #include "SpellAuraDefines.h" #include "SpellDefines.h" @@ -623,6 +624,28 @@ typedef std::unordered_map<uint32, uint32> PacketCooldowns; struct SpellProcEventEntry; // used only privately +enum class SpeedOpcodeIndex : uint32 +{ + PC, + NPC, + ACK_RESPONSE, + MAX +}; + +typedef const Opcodes SpeedOpcodePair[static_cast<size_t>(SpeedOpcodeIndex::MAX)]; +SpeedOpcodePair SetSpeed2Opc_table[MAX_MOVE_TYPE] = +{ + {SMSG_FORCE_WALK_SPEED_CHANGE, SMSG_SPLINE_SET_WALK_SPEED, MSG_MOVE_SET_WALK_SPEED}, + {SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_SPLINE_SET_RUN_SPEED, MSG_MOVE_SET_RUN_SPEED}, + {SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_SPLINE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_BACK_SPEED}, + {SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_SPLINE_SET_SWIM_SPEED, MSG_MOVE_SET_SWIM_SPEED}, + {SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_SPLINE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED}, + {SMSG_FORCE_TURN_RATE_CHANGE, SMSG_SPLINE_SET_TURN_RATE, MSG_MOVE_SET_TURN_RATE}, + {SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_SPLINE_SET_FLIGHT_SPEED, MSG_MOVE_SET_FLIGHT_SPEED}, + {SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_SPLINE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_BACK_SPEED}, + {SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_SPLINE_SET_PITCH_RATE, MSG_MOVE_SET_PITCH_RATE}, +}; + class Unit : public WorldObject { public: @@ -944,7 +967,7 @@ public: inline bool HasMainhandWeaponForAttack() const { return HasWeaponForAttack(BASE_ATTACK); } inline bool HasOffhandWeaponForAttack() const { return HasWeaponForAttack(OFF_ATTACK); } inline bool HasRangedWeaponForAttack() const { return HasWeaponForAttack(RANGED_ATTACK); } - [[nodiscard]] bool CanUseAttackType(uint8 attacktype) const + [[nodiscard]] bool CanUseAttackType(WeaponAttackType attacktype) const { switch (attacktype) { @@ -1677,12 +1700,10 @@ public: void propagateSpeedChange() { GetMotionMaster()->propagateSpeedChange(); } void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf = SPLINEFLAG_WALK_MODE); // pussywizard: need to just send packet, with no movement/spline - void MonsterMoveWithSpeed(float x, float y, float z, float speed); - //void SetFacing(float ori, WorldObject* obj = nullptr); - //void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = nullptr); + void MonsterMoveWithSpeed(float x, float y, float z, float speed); // Not to be used outside of cinematics virtual bool SetWalk(bool enable); - virtual bool SetDisableGravity(bool disable, bool packetOnly = false, bool updateAnimationTier = true); + void SetDisableGravity(bool disable); virtual bool SetSwim(bool enable); void SetCanFly(bool enable); void SetWaterWalking(bool enable); @@ -1921,8 +1942,8 @@ public: void SetInFront(WorldObject const* target); void SetFacingTo(float ori); - void SetFacingToObject(WorldObject* object); - void SetTimedFacingToObject(WorldObject* object, uint32 time); // Reset to home orientation after given time + // <timed>Reset to home orientation after given time + void SetFacingToObject(WorldObject* object, Milliseconds timed = 0ms); bool isInAccessiblePlaceFor(Creature const* c) const; bool isInFrontInMap(Unit const* target, float distance, float arc = M_PI) const; @@ -1964,9 +1985,10 @@ public: void SendPlaySpellVisual(uint32 id); void SendPlaySpellImpact(ObjectGuid guid, uint32 id); - void SendPetActionFeedback (uint8 msg); - void SendPetTalk (uint32 pettalk); - void SendPetAIReaction(ObjectGuid guid); + void SendPetActionFeedback(uint8 msg) const; + void SendPetActionSound(PetAction action) const; + void SendPetDismissSound() const; + void SendPetAIReaction(ObjectGuid guid) const; void SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo); @@ -2066,7 +2088,8 @@ protected: void SetFeared(bool apply, Unit* fearedBy = nullptr, bool isFear = false); void SetConfused(bool apply); void SetStunned(bool apply); - void SetRooted(bool apply, bool isStun = false); + void SetRooted(bool apply, bool stun = false, bool logout = false); + void SendMoveRoot(bool state); //----------- Protected variables ----------// UnitAI* i_AI; diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index 1875a96aae..72d19e7ebb 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -197,7 +197,9 @@ enum UnitState UNIT_STATE_IGNORE_PATHFINDING = 0x10000000, // do not use pathfinding in any MovementGenerator UNIT_STATE_NO_ENVIRONMENT_UPD = 0x20000000, - UNIT_STATE_NO_COMBAT_MOVEMENT = 0x40000000, // serverside only - should not be changed outside the core and should be placed at the end + // serverside region + UNIT_STATE_NO_COMBAT_MOVEMENT = 0x40000000, // should not be changed outside the core and should be placed at the end + UNIT_STATE_LOGOUT_TIMER = 0x80000000, // Unit is logging out UNIT_STATE_ALL_STATE_SUPPORTED = UNIT_STATE_DIED | UNIT_STATE_MELEE_ATTACKING | UNIT_STATE_STUNNED | UNIT_STATE_ROAMING | UNIT_STATE_CHASE | UNIT_STATE_FLEEING | UNIT_STATE_IN_FLIGHT | UNIT_STATE_FOLLOW | UNIT_STATE_ROOT | UNIT_STATE_CONFUSED diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index b0752ecd2d..65ef2bdec1 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -423,7 +423,9 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId) if (_me->IsInWorld()) { unit->SendClearTarget(); // SMSG_BREAK_TARGET - unit->SetControlled(true, UNIT_STATE_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures) + unit->SetControlled(true, UNIT_STATE_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures) + if (unit->IsPlayer()) + unit->ToPlayer()->SetExpectingChangeTransport(true); // also adds MOVEMENTFLAG_ROOT Movement::MoveSplineInit init(unit); init.DisableTransportPathTransformations(); diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 3d5115e7f0..efc2d7aac3 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -100,12 +100,12 @@ private: class VehicleDespawnEvent : public BasicEvent { public: - VehicleDespawnEvent(Unit& self, uint32 duration) : _self(self), _duration(duration) { } + VehicleDespawnEvent(Unit& self, Milliseconds duration) : _self(self), _duration(duration) { } bool Execute(uint64 e_time, uint32 p_time) override; protected: Unit& _self; - uint32 _duration; + Milliseconds _duration; }; #endif diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index f9a4cb01e3..22a9d39b15 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -112,7 +112,7 @@ namespace PlayerNameMapHolder } // namespace PlayerNameMapHolder -WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, ObjectGuid const guid) +WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, ObjectGuid const& guid) { switch (guid.GetHigh()) { @@ -138,7 +138,7 @@ WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, ObjectGuid con return nullptr; } -Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const& p, ObjectGuid const guid, uint32 typemask) +Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const& p, ObjectGuid const& guid, uint32 typemask) { switch (guid.GetHigh()) { @@ -176,27 +176,27 @@ Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const& p, ObjectGuid con return nullptr; } -Corpse* ObjectAccessor::GetCorpse(WorldObject const& u, ObjectGuid const guid) +Corpse* ObjectAccessor::GetCorpse(WorldObject const& u, ObjectGuid const& guid) { return u.GetMap()->GetCorpse(guid); } -GameObject* ObjectAccessor::GetGameObject(WorldObject const& u, ObjectGuid const guid) +GameObject* ObjectAccessor::GetGameObject(WorldObject const& u, ObjectGuid const& guid) { return u.GetMap()->GetGameObject(guid); } -Transport* ObjectAccessor::GetTransport(WorldObject const& u, ObjectGuid const guid) +Transport* ObjectAccessor::GetTransport(WorldObject const& u, ObjectGuid const& guid) { return u.GetMap()->GetTransport(guid); } -DynamicObject* ObjectAccessor::GetDynamicObject(WorldObject const& u, ObjectGuid const guid) +DynamicObject* ObjectAccessor::GetDynamicObject(WorldObject const& u, ObjectGuid const& guid) { return u.GetMap()->GetDynamicObject(guid); } -Unit* ObjectAccessor::GetUnit(WorldObject const& u, ObjectGuid const guid) +Unit* ObjectAccessor::GetUnit(WorldObject const& u, ObjectGuid const& guid) { if (guid.IsPlayer()) return GetPlayer(u, guid); @@ -207,17 +207,17 @@ Unit* ObjectAccessor::GetUnit(WorldObject const& u, ObjectGuid const guid) return GetCreature(u, guid); } -Creature* ObjectAccessor::GetCreature(WorldObject const& u, ObjectGuid const guid) +Creature* ObjectAccessor::GetCreature(WorldObject const& u, ObjectGuid const& guid) { return u.GetMap()->GetCreature(guid); } -Pet* ObjectAccessor::GetPet(WorldObject const& u, ObjectGuid const guid) +Pet* ObjectAccessor::GetPet(WorldObject const& u, ObjectGuid const& guid) { return u.GetMap()->GetPet(guid); } -Player* ObjectAccessor::GetPlayer(Map const* m, ObjectGuid const guid) +Player* ObjectAccessor::GetPlayer(Map const* m, ObjectGuid const& guid) { if (Player * player = HashMapHolder<Player>::Find(guid)) if (player->IsInWorld() && player->GetMap() == m) @@ -226,12 +226,12 @@ Player* ObjectAccessor::GetPlayer(Map const* m, ObjectGuid const guid) return nullptr; } -Player* ObjectAccessor::GetPlayer(WorldObject const& u, ObjectGuid const guid) +Player* ObjectAccessor::GetPlayer(WorldObject const& u, ObjectGuid const& guid) { return GetPlayer(u.GetMap(), guid); } -Creature* ObjectAccessor::GetCreatureOrPetOrVehicle(WorldObject const& u, ObjectGuid const guid) +Creature* ObjectAccessor::GetCreatureOrPetOrVehicle(WorldObject const& u, ObjectGuid const& guid) { if (guid.IsPet()) return GetPet(u, guid); diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 2fbe70bf5b..2a78eee0d1 100644 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -60,18 +60,18 @@ public: namespace ObjectAccessor { // these functions return objects only if in map of specified object - WorldObject* GetWorldObject(WorldObject const&, ObjectGuid const guid); - Object* GetObjectByTypeMask(WorldObject const&, ObjectGuid const guid, uint32 typemask); - Corpse* GetCorpse(WorldObject const& u, ObjectGuid const guid); - GameObject* GetGameObject(WorldObject const& u, ObjectGuid const guid); - Transport* GetTransport(WorldObject const& u, ObjectGuid const guid); - DynamicObject* GetDynamicObject(WorldObject const& u, ObjectGuid const guid); - Unit* GetUnit(WorldObject const&, ObjectGuid const guid); - Creature* GetCreature(WorldObject const& u, ObjectGuid const guid); - Pet* GetPet(WorldObject const&, ObjectGuid const guid); - Player* GetPlayer(Map const*, ObjectGuid const guid); - Player* GetPlayer(WorldObject const&, ObjectGuid const guid); - Creature* GetCreatureOrPetOrVehicle(WorldObject const&, ObjectGuid const); + WorldObject* GetWorldObject(WorldObject const&, ObjectGuid const& guid); + Object* GetObjectByTypeMask(WorldObject const&, ObjectGuid const& guid, uint32 typemask); + Corpse* GetCorpse(WorldObject const& u, ObjectGuid const& guid); + GameObject* GetGameObject(WorldObject const& u, ObjectGuid const& guid); + Transport* GetTransport(WorldObject const& u, ObjectGuid const& guid); + DynamicObject* GetDynamicObject(WorldObject const& u, ObjectGuid const& guid); + Unit* GetUnit(WorldObject const&, ObjectGuid const& guid); + Creature* GetCreature(WorldObject const& u, ObjectGuid const& guid); + Pet* GetPet(WorldObject const&, ObjectGuid const& guid); + Player* GetPlayer(Map const*, ObjectGuid const& guid); + Player* GetPlayer(WorldObject const&, ObjectGuid const& guid); + Creature* GetCreatureOrPetOrVehicle(WorldObject const&, ObjectGuid const&); // these functions return objects if found in whole world // ACCESS LIKE THAT IS NOT THREAD SAFE diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index c532f5fe7e..ff904bb177 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1122,8 +1122,22 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) if (!cInfo->Models.size()) LOG_ERROR("sql.sql", "Creature (Entry: {}) does not have any existing display id in creature_template_model.", cInfo->Entry); - else if (std::accumulate(cInfo->Models.begin(), cInfo->Models.end(), 0.0f, [](float sum, CreatureModel const& model) { return sum + model.Probability; }) <= 0.0f) - LOG_ERROR("sql.sql", "Creature (Entry: {}) has zero total chance for all models in creature_template_model.", cInfo->Entry); + else + { + float const totalProbability = std::accumulate(cInfo->Models.begin(), cInfo->Models.end(), 0.0f, [](float sum, CreatureModel const& model) { return sum + model.Probability; }); + + if (totalProbability <= 0.0f) + { // There are many cases in official data of all models having a probability of 0. Believe to be treated equivalent to equal chance ONLY if all are zeroed + if (totalProbability == 0.0f) + LOG_DEBUG("sql.sql", "Creature (Entry: {}) has zero total chance for all models in creature_template_model. Setting all to 1.0.", cInfo->Entry); + else // Custom, likely bad data + LOG_ERROR("sql.sql", "Creature (Entry: {}) has less than zero total chance for all models in creature_template_model. Setting all to 1.0.", cInfo->Entry); + + auto& models = const_cast<CreatureTemplate*>(cInfo)->Models; + for (auto& model : models) + model.Probability = 1.0f; + } + } if (!cInfo->unit_class || ((1 << (cInfo->unit_class - 1)) & CLASSMASK_ALL_CREATURES) == 0) { diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index 5dd717f321..890c6de2b0 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -83,7 +83,7 @@ void VisibleNotifier::SendToSelf() WorldPacket packet; i_data.BuildPacket(packet); - i_player.GetSession()->SendPacket(&packet); + i_player.SendDirectMessage(&packet); for (std::vector<Unit*>::const_iterator it = i_visibleNow.begin(); it != i_visibleNow.end(); ++it) i_player.GetInitialVisiblePackets(*it); diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index d35e8600c1..d08645acdc 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -126,7 +126,7 @@ namespace Acore if (!player->HaveAtClient(i_source)) return; - player->GetSession()->SendPacket(i_message); + player->SendDirectMessage(i_message); } }; @@ -151,7 +151,7 @@ namespace Acore if (player == i_source || !player->HaveAtClient(i_source) || player->IsFriendlyTo(i_source)) return; - player->GetSession()->SendPacket(i_message); + player->SendDirectMessage(i_message); } }; @@ -1092,10 +1092,9 @@ namespace Acore { return false; } - } - if (i_funit->_IsValidAttackTarget(u, _spellInfo, i_obj->IsDynamicObject() ? i_obj : nullptr) && i_obj->IsWithinDistInMap(u, i_range,true,false)) + if (i_funit->_IsValidAttackTarget(u, _spellInfo, i_obj->IsDynamicObject() ? i_obj : nullptr) && i_obj->IsWithinDistInMap(u, i_range,true,false, true)) return true; @@ -1192,7 +1191,7 @@ namespace Acore } bool operator()(Unit* u) { - if (!me->IsWithinDistInMap(u, m_range, true, false)) + if (!me->IsWithinDistInMap(u, m_range, true, false, false)) return false; if (!me->IsValidAttackTarget(u)) @@ -1218,7 +1217,7 @@ namespace Acore explicit NearestHostileUnitInAttackDistanceCheck(Creature const* creature, float dist) : me(creature), m_range(dist) {} bool operator()(Unit* u) { - if (!me->IsWithinDistInMap(u, m_range, true, false)) + if (!me->IsWithinDistInMap(u, m_range, true, false, false)) return false; if (!me->CanStartAttack(u)) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index b4b2331e11..de21a537f3 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -580,14 +580,14 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R if (method == GROUP_REMOVEMETHOD_KICK || method == GROUP_REMOVEMETHOD_KICK_LFG) { data.Initialize(SMSG_GROUP_UNINVITE, 0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } // Do we really need to send this opcode? data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8); data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0); data << m_guid << uint32(m_counter) << uint32(0) << uint64(0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } // Remove player from group in DB @@ -799,7 +799,7 @@ void Group::Disband(bool hideDestroy /* = false */) if (!hideDestroy) { data.Initialize(SMSG_GROUP_DESTROYED, 0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } //we already removed player from group and in player->GetGroup() is his original group, send update @@ -812,7 +812,7 @@ void Group::Disband(bool hideDestroy /* = false */) data.Initialize(SMSG_GROUP_LIST, 1 + 1 + 1 + 1 + 8 + 4 + 4 + 8); data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0); data << m_guid << uint32(m_counter) << uint32(0) << uint64(0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } } RollId.clear(); @@ -870,7 +870,7 @@ void Group::SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r) continue; if (itr->second == NOT_EMITED_YET) - p->GetSession()->SendPacket(&data); + p->SendDirectMessage(&data); } } @@ -893,7 +893,7 @@ void Group::SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, voteMask &= ~ROLL_FLAG_TYPE_NEED; data << uint8(voteMask); // roll type mask - p->GetSession()->SendPacket(&data); + p->SendDirectMessage(&data); } void Group::SendLootRoll(ObjectGuid sourceGuid, ObjectGuid targetGuid, uint8 rollNumber, uint8 rollType, Roll const& roll, bool autoPass) @@ -916,7 +916,7 @@ void Group::SendLootRoll(ObjectGuid sourceGuid, ObjectGuid targetGuid, uint8 rol continue; if (itr->second != NOT_VALID) - p->GetSession()->SendPacket(&data); + p->SendDirectMessage(&data); } } @@ -939,7 +939,7 @@ void Group::SendLootRollWon(ObjectGuid sourceGuid, ObjectGuid targetGuid, uint8 continue; if (itr->second != NOT_VALID) - p->GetSession()->SendPacket(&data); + p->SendDirectMessage(&data); } } @@ -959,7 +959,7 @@ void Group::SendLootAllPassed(Roll const& roll) continue; if (itr->second != NOT_VALID) - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } } @@ -1353,7 +1353,7 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) for (Player* looter : looters) { - looter->GetSession()->SendPacket(&data); + looter->SendDirectMessage(&data); } } @@ -1735,7 +1735,7 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot) data << uint8(m_raidDifficulty >= RAID_DIFFICULTY_10MAN_HEROIC); // 3.3 Dynamic Raid Difficulty - 0 normal/1 heroic } - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void Group::UpdatePlayerOutOfRange(Player* player) @@ -1750,7 +1750,7 @@ void Group::UpdatePlayerOutOfRange(Player* player) { Player* member = itr->GetSource(); if (member && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(player), false))) - member->GetSession()->SendPacket(&data); + member->SendDirectMessage(&data); } } @@ -1763,7 +1763,7 @@ void Group::BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRai continue; if (group == -1 || itr->getSubGroup() == group) - player->GetSession()->SendPacket(packet); + player->SendDirectMessage(packet); } } @@ -1774,7 +1774,7 @@ void Group::BroadcastReadyCheck(WorldPacket const* packet) Player* player = itr->GetSource(); if (player) if (IsLeader(player->GetGUID()) || IsAssistant(player->GetGUID())) - player->GetSession()->SendPacket(packet); + player->SendDirectMessage(packet); } } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index a39c14b6b8..bd9bbafc66 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2123,7 +2123,7 @@ void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::strin for (auto const& [guid, member] : m_members) if (Player* player = member.FindPlayer()) if (_HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID())) - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } } @@ -2132,14 +2132,14 @@ void Guild::BroadcastPacketToRank(WorldPacket const* packet, uint8 rankId) const for (auto const& [guid, member] : m_members) if (member.IsRank(rankId)) if (Player* player = member.FindPlayer()) - player->GetSession()->SendPacket(packet); + player->SendDirectMessage(packet); } void Guild::BroadcastPacket(WorldPacket const* packet) const { for (auto const& [guid, member] : m_members) if (Player* player = member.FindPlayer()) - player->GetSession()->SendPacket(packet); + player->SendDirectMessage(packet); } void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank) diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp index e982f61fc4..4f293487c2 100644 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Handlers/ArenaTeamHandler.cpp @@ -160,7 +160,7 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket& recvData) WorldPacket data(SMSG_ARENA_TEAM_INVITE, (8 + 10)); data << GetPlayer()->GetName(); data << arenaTeam->GetName(); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); LOG_DEBUG("network", "WORLD: Sent SMSG_ARENA_TEAM_INVITE"); } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index c66ea7361d..51e532343a 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -265,7 +265,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) { WorldPacket data; sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->GetSession()->SendPacket(&data); + member->SendDirectMessage(&data); }); return; @@ -283,10 +283,10 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) // send status packet sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, member->AddBattlegroundQueueId(bgQueueTypeId), STATUS_WAIT_QUEUE, avgWaitTime, 0, 0, TEAM_NEUTRAL); - member->GetSession()->SendPacket(&data); + member->SendDirectMessage(&data); sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->GetSession()->SendPacket(&data); + member->SendDirectMessage(&data); sScriptMgr->OnPlayerJoinBG(member); }); @@ -879,7 +879,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) if (err <= 0) { sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->GetSession()->SendPacket(&data); + member->SendDirectMessage(&data); continue; } @@ -887,10 +887,10 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) // send status packet sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bgt, queueSlot, STATUS_WAIT_QUEUE, avgWaitTime, 0, arenatype, TEAM_NEUTRAL, isRated); - member->GetSession()->SendPacket(&data); + member->SendDirectMessage(&data); sBattlegroundMgr->BuildGroupJoinedBattlegroundPacket(&data, err); - member->GetSession()->SendPacket(&data); + member->SendDirectMessage(&data); LOG_DEBUG("bg.battleground", "Battleground: player joined queue for arena as group bg queue type {} bg type {}: {}, NAME {}", bgQueueTypeId, bgTypeId, member->GetGUID().ToString(), member->GetName()); diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 53cccbf4e0..6bb531636f 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -35,6 +35,7 @@ Copied events should probably have a new owner #include "ArenaTeamMgr.h" #include "CalendarMgr.h" +#include "CalendarPackets.h" #include "DatabaseEnv.h" #include "DisableMgr.h" #include "GameEventMgr.h" @@ -184,43 +185,31 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/) SendPacket(&data); } -void WorldSession::HandleCalendarGetEvent(WorldPacket& recvData) +void WorldSession::HandleCalendarGetEvent(WorldPackets::Calendar::GetEvent& packet) { - uint64 eventId; - recvData >> eventId; + LOG_DEBUG("network", "CMSG_CALENDAR_GET_EVENT. Player [{}] Event [{}]", _player->GetGUID().ToString(), packet.EventId); - LOG_DEBUG("network", "CMSG_CALENDAR_GET_EVENT. Player [{}] Event [{}]", _player->GetGUID().ToString(), eventId); - - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(packet.EventId)) sCalendarMgr->SendCalendarEvent(_player->GetGUID(), *calendarEvent, CALENDAR_SENDTYPE_GET); else sCalendarMgr->SendCalendarCommandResult(_player->GetGUID(), CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarGuildFilter(WorldPacket& recvData) +void WorldSession::HandleCalendarGuildFilter(WorldPackets::Calendar::GuildFilter& packet) { LOG_DEBUG("network", "CMSG_CALENDAR_GUILD_FILTER [{}]", _player->GetGUID().ToString()); - uint32 minLevel; - uint32 maxLevel; - uint32 minRank; - - recvData >> minLevel >> maxLevel >> minRank; - if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) - guild->MassInviteToEvent(this, minLevel, maxLevel, minRank); + guild->MassInviteToEvent(this, packet.MinimumLevel, packet.MaximumLevel, packet.MinimumRank); - LOG_DEBUG("network", "CMSG_CALENDAR_GUILD_FILTER: Min level [{}], Max level [{}], Min rank [{}]", minLevel, maxLevel, minRank); + LOG_DEBUG("network", "CMSG_CALENDAR_GUILD_FILTER: Min level [{}], Max level [{}], Min rank [{}]", packet.MinimumLevel, packet.MaximumLevel, packet.MinimumRank); } -void WorldSession::HandleCalendarArenaTeam(WorldPacket& recvData) +void WorldSession::HandleCalendarArenaTeam(WorldPackets::Calendar::ArenaTeam& packet) { LOG_DEBUG("network", "CMSG_CALENDAR_ARENA_TEAM [{}]", _player->GetGUID().ToString()); - uint32 arenaTeamId; - recvData >> arenaTeamId; - - if (ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(arenaTeamId)) + if (ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(packet.ArenaTeamId)) team->MassInviteToEvent(this); } @@ -763,14 +752,11 @@ void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket& recvData) sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarComplain(WorldPacket& recvData) +void WorldSession::HandleCalendarComplain(WorldPackets::Calendar::CalendarComplain& packet) { ObjectGuid guid = _player->GetGUID(); - uint64 eventId; - ObjectGuid complainGUID; - recvData >> eventId >> complainGUID; - LOG_DEBUG("network", "CMSG_CALENDAR_COMPLAIN [{}] EventId [{}] guid [{}]", guid.ToString(), eventId, complainGUID.ToString()); + LOG_DEBUG("network", "CMSG_CALENDAR_COMPLAIN [{}] EventId [{}] guid [{}]", guid.ToString(), packet.EventId, packet.ComplainGuid.ToString()); // what to do with complains? } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 1bb8ac6ed2..fa83cf3179 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1164,8 +1164,17 @@ void WorldSession::HandlePlayerLoginToCharInWorld(Player* pCurrChar) SendPacket(&data); // Xinef: fix possible problem with flag UNIT_FLAG_STUNNED added during logout - if (!pCurrChar->HasUnitState(UNIT_STATE_STUNNED)) + if (pCurrChar->HasUnitState(UNIT_STATE_LOGOUT_TIMER)) + { + pCurrChar->SetRooted(false, true, true); pCurrChar->RemoveUnitFlag(UNIT_FLAG_STUNNED); + } + + if (pCurrChar->GetPendingFlightChange() <= pCurrChar->GetMapChangeOrderCounter()) + { + if (!pCurrChar->HasIncreaseMountedFlightSpeedAura() && !pCurrChar->HasFlyAura()) + pCurrChar->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_CAN_FLY); + } pCurrChar->SendInitialPacketsBeforeAddToMap(); @@ -1754,9 +1763,21 @@ void WorldSession::HandleEquipmentSetSave(WorldPacket& recvData) std::string name; recvData >> name; + if (name.length() > 16) // Client limitation + { + LOG_ERROR("entities.player.cheat", "Character GUID {} tried to create equipment set {} with too long a name!", _player->GetGUID().ToString(), setGuid); + return; + } + std::string iconName; recvData >> iconName; + if (iconName.length() > 100) // DB limitation + { + LOG_ERROR("entities.player.cheat", "Character GUID {} tried to create equipment set {} with too long an icon name!", _player->GetGUID().ToString(), setGuid); + return; + } + EquipmentSet eqSet; eqSet.Guid = setGuid; diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 04337cd9c8..90e68057ae 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -803,7 +803,7 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) WorldPacket data; ChatHandler::BuildChatPacket(data, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void WorldSession::HandleChannelDeclineInvite(WorldPacket& recvPacket) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index c8f14779be..5fc1bdffd3 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -149,7 +149,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) data << uint32(0); // unk data << uint8(0); // count data << uint32(0); // unk - invitedPlayer->GetSession()->SendPacket(&data); + invitedPlayer->SendDirectMessage(&data); } return; @@ -209,7 +209,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) data << uint32(0); // unk data << uint8(0); // count data << uint32(0); // unk - invitedPlayer->GetSession()->SendPacket(&data); + invitedPlayer->SendDirectMessage(&data); SendPartyResult(PARTY_OP_INVITE, membername, ERR_PARTY_RESULT_OK); } @@ -292,7 +292,7 @@ void WorldSession::HandleGroupDeclineOpcode(WorldPacket& /*recvData*/) // report WorldPacket data(SMSG_GROUP_DECLINE, GetPlayer()->GetName().length()); data << GetPlayer()->GetName(); - leader->GetSession()->SendPacket(&data); + leader->SendDirectMessage(&data); } void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index f1b00066b5..0dca019cf0 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -206,7 +206,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); data << uint32(goldPerPlayer); data << uint8(playersNear.size() > 1 ? 0 : 1); // Controls the text displayed in chat. 0 is "Your share is..." and 1 is "You loot..." - (*i)->GetSession()->SendPacket(&data); + (*i)->SendDirectMessage(&data); } } else diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 64673eb3eb..a1c09fb47d 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -468,7 +468,7 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequ GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT); } - GetPlayer()->SetRooted(true); + GetPlayer()->SetRooted(true, true, true); GetPlayer()->SetUnitFlag(UNIT_FLAG_STUNNED); } @@ -492,7 +492,7 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCance // not remove flags if can't free move - its not set in Logout request code. if (GetPlayer()->CanFreeMove()) { - GetPlayer()->SetRooted(false); + GetPlayer()->SetRooted(false, true, true); GetPlayer()->SetStandState(UNIT_STAND_STATE_STAND); GetPlayer()->RemoveUnitFlag(UNIT_FLAG_STUNNED); @@ -1138,45 +1138,18 @@ void WorldSession::HandleWhoisOpcode(WorldPacket& recv_data) LOG_DEBUG("network", "Received whois command from player {} for character {}", GetPlayer()->GetName(), charname); } -void WorldSession::HandleComplainOpcode(WorldPacket& recv_data) +void WorldSession::HandleComplainOpcode(WorldPackets::Misc::Complain& packet) { LOG_DEBUG("network", "WORLD: CMSG_COMPLAIN"); - uint8 spam_type; // 0 - mail, 1 - chat - ObjectGuid spammer_guid; - uint32 unk1 = 0; - uint32 unk2 = 0; - uint32 unk3 = 0; - uint32 unk4 = 0; - std::string description = ""; - recv_data >> spam_type; // unk 0x01 const, may be spam type (mail/chat) - recv_data >> spammer_guid; // player guid - switch (spam_type) - { - case 0: - recv_data >> unk1; // const 0 - recv_data >> unk2; // probably mail id - recv_data >> unk3; // const 0 - break; - case 1: - recv_data >> unk1; // probably language - recv_data >> unk2; // message type? - recv_data >> unk3; // probably channel id - recv_data >> unk4; // unk random value - recv_data >> description; // spam description string (messagetype, channel name, player name, message) - break; - } - // NOTE: all chat messages from this spammer automatically ignored by spam reporter until logout in case chat spam. // if it's mail spam - ALL mails from this spammer automatically removed by client // Complaint Received message - WorldPacket data(SMSG_COMPLAIN_RESULT, 1); - data << uint8(0); - SendPacket(&data); + SendPacket(WorldPackets::Misc::ComplainResult().Write()); LOG_DEBUG("network", "REPORT SPAM: type {}, {}, unk1 {}, unk2 {}, unk3 {}, unk4 {}, message {}", - spam_type, spammer_guid.ToString(), unk1, unk2, unk3, unk4, description); + packet.SpamType, packet.SpammerGuid.ToString(), packet.Unk1, packet.Unk2, packet.Unk3, packet.Unk4, packet.Description); } void WorldSession::HandleRealmSplitOpcode(WorldPacket& recv_data) @@ -1517,6 +1490,8 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) { LOG_DEBUG("network", "WORLD: {}", GetOpcodeNameForLogging((Opcodes)recv_data.GetOpcode())); + Opcodes opcode = (Opcodes)recv_data.GetOpcode(); + ObjectGuid guid; uint32 counter; uint32 isApplied; @@ -1534,7 +1509,8 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) movementInfo.guid = guid; ReadMovementInfo(recv_data, &movementInfo); - recv_data >> isApplied; + if (opcode != CMSG_MOVE_GRAVITY_DISABLE_ACK && opcode != CMSG_MOVE_GRAVITY_ENABLE_ACK) + recv_data >> isApplied; sScriptMgr->AnticheatSetCanFlybyServer(_player, movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY)); @@ -1543,6 +1519,19 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) mover->m_movementInfo.flags = movementInfo.GetMovementFlags(); + // old map - async processing, ignore + if (counter <= _player->GetMapChangeOrderCounter()) + return; + + if (!ProcessMovementInfo(movementInfo, mover, plrMover, recv_data)) + { + recv_data.rfinish(); // prevent warnings spam + return; + } + + if (_player->GetPendingFlightChange() == counter && opcode == CMSG_MOVE_SET_CAN_FLY_ACK) + _player->SetPendingFlightChange(false); + Opcodes response; switch (recv_data.GetOpcode()) @@ -1551,17 +1540,12 @@ void WorldSession::HandleMoveFlagChangeOpcode(WorldPacket& recv_data) case CMSG_MOVE_FEATHER_FALL_ACK: response = MSG_MOVE_FEATHER_FALL; break; case CMSG_MOVE_WATER_WALK_ACK: response = MSG_MOVE_WATER_WALK; break; case CMSG_MOVE_SET_CAN_FLY_ACK: response = MSG_MOVE_UPDATE_CAN_FLY; break; + case CMSG_MOVE_GRAVITY_DISABLE_ACK: response = MSG_MOVE_GRAVITY_CHNG; break; + case CMSG_MOVE_GRAVITY_ENABLE_ACK: response = MSG_MOVE_GRAVITY_CHNG; break; default: return; } - if (!ProcessMovementInfo(movementInfo, mover, plrMover, recv_data)) - { - recv_data.rfinish(); // prevent warnings spam - return; - } - WorldPacket data(response, 8); - data << guid.WriteAsPacked(); WriteMovementInfo(&data, &movementInfo); _player->m_mover->SendMessageToSet(&data, _player); } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index c738365b53..1be5903bff 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -105,6 +105,13 @@ void WorldSession::HandleMoveWorldportAck() GetPlayer()->UpdatePositionData(); GetPlayer()->SendInitialPacketsBeforeAddToMap(); + + if (GetPlayer()->GetPendingFlightChange() <= GetPlayer()->GetMapChangeOrderCounter()) + { + if (!GetPlayer()->HasIncreaseMountedFlightSpeedAura() && !GetPlayer()->HasFlyAura()) + GetPlayer()->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_CAN_FLY); + } + if (!GetPlayer()->GetMap()->AddPlayerToMap(GetPlayer())) { LOG_ERROR("network.opcode", "WORLD: failed to teleport player {} ({}) to map {} because of unknown reason!", @@ -376,9 +383,11 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) return; } + if (opcode == CMSG_MOVE_FALL_RESET || opcode == CMSG_MOVE_CHNG_TRANSPORT) + return; + /* process position-change */ WorldPacket data(opcode, recvData.size()); - movementInfo.guid = mover->GetGUID(); WriteMovementInfo(&data, &movementInfo); mover->SendMessageToSet(&data, _player); } @@ -517,7 +526,10 @@ bool WorldSession::VerifyMovementInfo(MovementInfo const& movementInfo, Player* } if (!mover->movespline->Finalized()) - return false; + { + if (!mover->movespline->isBoarding() || (opcode != CMSG_FORCE_MOVE_UNROOT_ACK && opcode != CMSG_FORCE_MOVE_ROOT_ACK)) + return false; + } // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE if (mover->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) @@ -655,26 +667,43 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket& recvData) /* extract packet */ ObjectGuid guid; - uint32 unk1; + uint32 counter; + MovementInfo movementInfo; float newspeed; recvData >> guid.ReadAsPacked(); + recvData >> counter; // counter or moveEvent + movementInfo.guid = guid; + ReadMovementInfo(recvData, &movementInfo); + recvData >> newspeed; + + Unit* mover = _player->m_mover; // pussywizard: special check, only player mover allowed here - if (guid != _player->m_mover->GetGUID() || guid != _player->GetGUID()) + if (guid != mover->GetGUID() || guid != _player->GetGUID()) { recvData.rfinish(); // prevent warnings spam return; } - // continue parse packet - recvData >> unk1; // counter or moveEvent + // old map - async processing, ignore + if (counter <= _player->GetMapChangeOrderCounter()) + return; - MovementInfo movementInfo; - movementInfo.guid = guid; - ReadMovementInfo(recvData, &movementInfo); + if (!ProcessMovementInfo(movementInfo, mover, _player, recvData)) + { + recvData.rfinish(); // prevent warnings spam + return; + } - recvData >> newspeed; + if (opcode == CMSG_MOVE_SET_COLLISION_HGT_ACK) + { + WorldPacket data(MSG_MOVE_SET_COLLISION_HGT, 18); + WriteMovementInfo(&data, &movementInfo); + data << newspeed; // new collision height + mover->SendMessageToSet(&data, _player); + return; + } // client ACK send one packet for mounted/run case and need skip all except last from its // in other cases anti-cheat check can be fail in false case @@ -685,42 +714,15 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket& recvData) switch (opcode) { - case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: - move_type = MOVE_WALK; - force_move_type = MOVE_WALK; - break; - case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: - move_type = MOVE_RUN; - force_move_type = MOVE_RUN; - break; - case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: - move_type = MOVE_RUN_BACK; - force_move_type = MOVE_RUN_BACK; - break; - case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: - move_type = MOVE_SWIM; - force_move_type = MOVE_SWIM; - break; - case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: - move_type = MOVE_SWIM_BACK; - force_move_type = MOVE_SWIM_BACK; - break; - case CMSG_FORCE_TURN_RATE_CHANGE_ACK: - move_type = MOVE_TURN_RATE; - force_move_type = MOVE_TURN_RATE; - break; - case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: - move_type = MOVE_FLIGHT; - force_move_type = MOVE_FLIGHT; - break; - case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: - move_type = MOVE_FLIGHT_BACK; - force_move_type = MOVE_FLIGHT_BACK; - break; - case CMSG_FORCE_PITCH_RATE_CHANGE_ACK: - move_type = MOVE_PITCH_RATE; - force_move_type = MOVE_PITCH_RATE; - break; + case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; + case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; + case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; + case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; + case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; + case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; + case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; + case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; + case CMSG_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break; default: LOG_ERROR("network.opcode", "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: {}", opcode); return; @@ -728,6 +730,12 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket& recvData) sScriptMgr->AnticheatSetUnderACKmount(_player); + SpeedOpcodePair const& speedOpcodes = SetSpeed2Opc_table[move_type]; + WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::ACK_RESPONSE)], 18); + WriteMovementInfo(&data, &movementInfo); + data << newspeed; + mover->SendMessageToSet(&data, _player); + // skip all forced speed changes except last and unexpected // in run/mounted case used one ACK and it must be skipped.m_forced_speed_changes[MOVE_RUN} store both. if (_player->m_forced_speed_changes[force_move_type] > 0) @@ -967,79 +975,44 @@ void WorldSession::ComputeNewClockDelta() void WorldSession::HandleMoveRootAck(WorldPacket& recvData) { - ObjectGuid guid; - recvData >> guid.ReadAsPacked(); - - Unit* mover = _player->m_mover; - if (!mover || guid != mover->GetGUID()) - { - recvData.rfinish(); // prevent warnings spam - return; - } - - uint32 movementCounter; - recvData >> movementCounter; + Opcodes opcode = (Opcodes)recvData.GetOpcode(); + LOG_DEBUG("network", "WORLD: {}", GetOpcodeNameForLogging(opcode)); + ObjectGuid guid; + uint32 counter; MovementInfo movementInfo; + recvData >> guid.ReadAsPacked(); + recvData >> counter; movementInfo.guid = guid; ReadMovementInfo(recvData, &movementInfo); - /* process position-change */ - int64 movementTime = (int64) movementInfo.time + _timeSyncClockDelta; - if (_timeSyncClockDelta == 0 || movementTime < 0 || movementTime > 0xFFFFFFFF) - { - LOG_INFO("misc", "The computed movement time using clockDelta is erronous. Using fallback instead"); - movementInfo.time = getMSTime(); - } - else - { - movementInfo.time = (uint32)movementTime; - } - - movementInfo.guid = mover->GetGUID(); - mover->m_movementInfo = movementInfo; - mover->UpdatePosition(movementInfo.pos); - -} - -void WorldSession::HandleMoveUnRootAck(WorldPacket& recvData) -{ - ObjectGuid guid; - recvData >> guid.ReadAsPacked(); - Unit* mover = _player->m_mover; - if (!mover || guid != mover->GetGUID()) - { - recvData.rfinish(); // prevent warnings spam - return; - } - uint32 movementCounter; - recvData >> movementCounter; - - MovementInfo movementInfo; - movementInfo.guid = guid; - ReadMovementInfo(recvData, &movementInfo); + if (mover->GetGUID() != guid) + return; - /* process position-change */ - int64 movementTime = (int64) movementInfo.time + _timeSyncClockDelta; - if (_timeSyncClockDelta == 0 || movementTime < 0 || movementTime > 0xFFFFFFFF) + if (opcode == CMSG_FORCE_MOVE_UNROOT_ACK) // unroot case { - LOG_INFO("misc", "The computed movement time using clockDelta is erronous. Using fallback instead"); - movementInfo.time = getMSTime(); + if (!mover->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ROOT)) + return; } - else + else // root case { - movementInfo.time = (uint32)movementTime; + if (mover->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ROOT)) + return; } - if (G3D::fuzzyEq(movementInfo.fallTime, 0.f)) - { - movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FALLING); - } + // old map - async processing, ignore + if (counter <= _player->GetMapChangeOrderCounter()) + return; - movementInfo.guid = mover->GetGUID(); - mover->m_movementInfo = movementInfo; - mover->UpdatePosition(movementInfo.pos); + if (!ProcessMovementInfo(movementInfo, mover, _player, recvData)) + return; + + if (_player->IsExpectingChangeTransport()) + return; + WorldPacket data(opcode == CMSG_FORCE_MOVE_UNROOT_ACK ? MSG_MOVE_UNROOT : MSG_MOVE_ROOT); + WriteMovementInfo(&data, &movementInfo); + mover->SendMessageToSet(&data, _player); } diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 38b66926e5..5234684c7e 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -262,8 +262,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe pet->ToCreature()->AI()->AttackStart(TargetUnit); //10% chance to play special pet attack talk, else growl - if (pet->IsPet() && ((Pet*)pet)->getPetType() == SUMMON_PET && pet != TargetUnit && urand(0, 100) < 10) - pet->SendPetTalk((uint32)PET_TALK_ATTACK); + if (pet->IsPet() && pet->ToPet()->getPetType() == SUMMON_PET && pet != TargetUnit && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_ATTACK); else { // 90% chance for pet and 100% chance for charmed creature @@ -297,8 +297,11 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe if (pet->ToPet()->getPetType() == HUNTER_PET) GetPlayer()->RemovePet(pet->ToPet(), PET_SAVE_AS_DELETED); else + { + pet->SendPetDismissSound(); //dismissing a summoned pet is like killing them (this prevents returning a soulshard...) pet->setDeathState(DeathState::Corpse); + } } else if (pet->HasUnitTypeMask(UNIT_MASK_MINION | UNIT_MASK_SUMMON | UNIT_MASK_GUARDIAN | UNIT_MASK_CONTROLLABLE_GUARDIAN)) { @@ -413,8 +416,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe //10% chance to play special pet attack talk, else growl //actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell - if (pet->IsPet() && (((Pet*)pet)->getPetType() == SUMMON_PET) && (pet != unit_target) && (urand(0, 100) < 10)) - pet->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL); + if (pet->IsPet() && (pet->ToPet()->getPetType() == SUMMON_PET) && (pet != unit_target) && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_SPECIAL_SPELL); else { pet->SendPetAIReaction(guid1); @@ -509,8 +512,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe pet->ToCreature()->AI()->AttackStart(TargetUnit); - if (pet->IsPet() && ((Pet*)pet)->getPetType() == SUMMON_PET && pet != TargetUnit && urand(0, 100) < 10) - pet->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL); + if (pet->IsPet() && pet->ToPet()->getPetType() == SUMMON_PET && pet != TargetUnit && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_SPECIAL_SPELL); else pet->SendPetAIReaction(guid1); } @@ -558,8 +561,8 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe pet->GetMotionMaster()->MoveFollow(unit_target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI); - if (pet->IsPet() && ((Pet*)pet)->getPetType() == SUMMON_PET && pet != unit_target && urand(0, 100) < 10) - pet->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL); + if (pet->IsPet() && pet->ToPet()->getPetType() == SUMMON_PET && pet != unit_target && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_SPECIAL_SPELL); else { pet->SendPetAIReaction(guid1); @@ -1059,8 +1062,8 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) { // 10% chance to play special pet attack talk, else growl // actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell - if (pet->getPetType() == SUMMON_PET && (urand(0, 100) < 10)) - pet->SendPetTalk(PET_TALK_SPECIAL_SPELL); + if (pet->getPetType() == SUMMON_PET && roll_chance_i(10)) + pet->SendPetActionSound(PET_ACTION_SPECIAL_SPELL); else pet->SendPetAIReaction(guid); } diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp index 7ff2091d40..2dd6cf4bea 100644 --- a/src/server/game/Handlers/PetitionsHandler.cpp +++ b/src/server/game/Handlers/PetitionsHandler.cpp @@ -494,7 +494,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recvData) // update for owner if online if (Player* owner = ObjectAccessor::FindConnectedPlayer(petition->ownerGuid)) - owner->GetSession()->SendPacket(&data); + owner->SendDirectMessage(&data); return; } @@ -527,7 +527,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recvData) // update for owner if online if (Player* owner = ObjectAccessor::FindConnectedPlayer(petition->ownerGuid)) - owner->GetSession()->SendPacket(&data); + owner->SendDirectMessage(&data); } void WorldSession::HandlePetitionDeclineOpcode(WorldPacket& recvData) @@ -547,7 +547,7 @@ void WorldSession::HandlePetitionDeclineOpcode(WorldPacket& recvData) { WorldPacket data(MSG_PETITION_DECLINE, 8); data << _player->GetGUID(); - owner->GetSession()->SendPacket(&data); + owner->SendDirectMessage(&data); } } @@ -639,7 +639,7 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket& recvData) data << uint32(0); // there 0 ... } - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 80063d6382..f8d6d57d6e 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -625,7 +625,7 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket) WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 4 + 1); data << _player->GetGUID(); data << uint8(msg); // valid values: 0-8 - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); _player->SetDivider(); } } diff --git a/src/server/game/Handlers/ReferAFriendHandler.cpp b/src/server/game/Handlers/ReferAFriendHandler.cpp index e616d7b47b..1b2f07cb38 100644 --- a/src/server/game/Handlers/ReferAFriendHandler.cpp +++ b/src/server/game/Handlers/ReferAFriendHandler.cpp @@ -60,7 +60,7 @@ void WorldSession::HandleGrantLevel(WorldPacket& recvData) WorldPacket data2(SMSG_PROPOSE_LEVEL_GRANT, 8); data2 << _player->GetPackGUID(); - target->GetSession()->SendPacket(&data2); + target->SendDirectMessage(&data2); } void WorldSession::HandleAcceptGrantLevel(WorldPacket& recvData) diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index 8a76a2bd63..03a5ba89cf 100644 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -198,54 +198,70 @@ void WorldSession::HandleActivateTaxiExpressOpcode(WorldPacket& recvData) void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& recvData) { - ObjectGuid guid; // used only for proper packet read - recvData >> guid.ReadAsPacked(); - - MovementInfo movementInfo; // used only for proper packet read - movementInfo.guid = guid; - ReadMovementInfo(recvData, &movementInfo); + ObjectGuid guid; // used only for proper packet read + MovementInfo movementInfo; // used only for proper packet read + uint32 movementCounter; // spline counter - recvData.read_skip<uint32>(); // spline id + Unit* mover = _player->m_mover; - // in taxi flight packet received in 2 case: - // 1) end taxi path in far (multi-node) flight - // 2) switch from one map to other in case multim-map taxi path - // we need process only (1) + recvData >> guid.ReadAsPacked(); + ReadMovementInfo(recvData, &movementInfo); + recvData >> movementCounter; - uint32 curDest = GetPlayer()->m_taxi.GetTaxiDestination(); - if (curDest) + if (_player->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_TAXI_FLIGHT)) // taxi spline case { - TaxiNodesEntry const* curDestNode = sTaxiNodesStore.LookupEntry(curDest); + // in taxi flight packet received in 2 case: + // 1) end taxi path in far (multi-node) flight + // 2) switch from one map to other in case multim-map taxi path + // we need process only (1) - // far teleport case - if (curDestNode && curDestNode->map_id != GetPlayer()->GetMapId() && GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE) + uint32 curDest = GetPlayer()->m_taxi.GetTaxiDestination(); + if (curDest) { - if (FlightPathMovementGenerator* flight = dynamic_cast<FlightPathMovementGenerator*>(GetPlayer()->GetMotionMaster()->top())) - { - // short preparations to continue flight - flight->SetCurrentNodeAfterTeleport(); - TaxiPathNodeEntry const* node = flight->GetPath()[flight->GetCurrentNode()]; - flight->SkipCurrentNode(); + TaxiNodesEntry const* curDestNode = sTaxiNodesStore.LookupEntry(curDest); - GetPlayer()->TeleportTo(curDestNode->map_id, node->x, node->y, node->z, GetPlayer()->GetOrientation(), TELE_TO_NOT_LEAVE_TAXI); + // far teleport case + if (curDestNode && curDestNode->map_id != GetPlayer()->GetMapId() && GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE) + { + if (FlightPathMovementGenerator* flight = dynamic_cast<FlightPathMovementGenerator*>(GetPlayer()->GetMotionMaster()->top())) + { + // short preparations to continue flight + flight->SetCurrentNodeAfterTeleport(); + TaxiPathNodeEntry const* node = flight->GetPath()[flight->GetCurrentNode()]; + flight->SkipCurrentNode(); + + GetPlayer()->TeleportTo(curDestNode->map_id, node->x, node->y, node->z, GetPlayer()->GetOrientation(), TELE_TO_NOT_LEAVE_TAXI); + } } + + return; } + // at this point only 1 node is expected (final destination) + if (GetPlayer()->m_taxi.GetPath().size() != 1) + { + return; + } + + GetPlayer()->CleanupAfterTaxiFlight(); + GetPlayer()->SetFallInformation(GameTime::GetGameTime().count(), GetPlayer()->GetPositionZ()); + if (GetPlayer()->pvpInfo.IsHostile) + { + GetPlayer()->CastSpell(GetPlayer(), 2479, true); + } return; } - // at this point only 1 node is expected (final destination) - if (GetPlayer()->m_taxi.GetPath().size() != 1) - { + if (mover->GetGUID() != guid) return; - } - GetPlayer()->CleanupAfterTaxiFlight(); - GetPlayer()->SetFallInformation(GameTime::GetGameTime().count(), GetPlayer()->GetPositionZ()); - if (GetPlayer()->pvpInfo.IsHostile) - { - GetPlayer()->CastSpell(GetPlayer(), 2479, true); - } + if (!_player->IsExpectingChangeTransport() || !mover->movespline || mover->movespline->GetId() != movementCounter) + return; + + _player->SetExpectingChangeTransport(false); + WorldPacket data(_player->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_ROOT) ? MSG_MOVE_ROOT : MSG_MOVE_UNROOT, recvData.size()); + WriteMovementInfo(&data, &movementInfo); + mover->SendMessageToSet(&data, _player); } void WorldSession::HandleActivateTaxiOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index ce316965ef..08a4f6cac6 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -646,7 +646,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) WorldPacket data(SMSG_TRADE_STATUS, 12); data << uint32(TRADE_STATUS_BEGIN_TRADE); data << _player->GetGUID(); - pOther->GetSession()->SendPacket(&data); + pOther->SendDirectMessage(&data); } void WorldSession::HandleSetTradeGoldOpcode(WorldPacket& recvPacket) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index de0e4a9bd6..3508fb015c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -417,12 +417,12 @@ void Map::UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone) if (oldZone != MAP_INVALID_ZONE) { uint32& oldZoneCount = _zonePlayerCountMap[oldZone]; - if (!oldZoneCount) - LOG_ERROR("maps", "A player left zone {} (went to {}) - but there were no players in the zone!", oldZone, newZone); - else + if (oldZoneCount) --oldZoneCount; } - ++_zonePlayerCountMap[newZone]; + + if (newZone != MAP_INVALID_ZONE) + ++_zonePlayerCountMap[newZone]; } void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) @@ -696,8 +696,8 @@ struct ResetNotifier void Map::RemovePlayerFromMap(Player* player, bool remove) { - // Before leaving map, update zone/area for stats - player->UpdateZone(MAP_INVALID_ZONE, 0); + UpdatePlayerZoneStats(player->GetZoneId(), MAP_INVALID_ZONE); + player->getHostileRefMgr().deleteReferences(true); // pussywizard: multithreading crashfix player->RemoveFromWorld(); @@ -725,8 +725,6 @@ void Map::RemoveFromMap(T* obj, bool remove) obj->RemoveFromWorld(); obj->RemoveFromGrid(); - if (obj->IsFarVisible()) - RemoveWorldObjectFromFarVisibleMap(obj); obj->ResetMap(); @@ -1693,7 +1691,7 @@ void Map::SendInitTransports(Player* player) WorldPacket packet; transData.BuildPacket(packet); - player->GetSession()->SendPacket(&packet); + player->SendDirectMessage(&packet); } void Map::SendRemoveTransports(Player* player) @@ -1712,7 +1710,7 @@ void Map::SendRemoveTransports(Player* player) WorldPacket packet; transData.BuildPacket(packet); - player->GetSession()->SendPacket(&packet); + player->SendDirectMessage(&packet); } void Map::SendObjectUpdates() @@ -1732,7 +1730,7 @@ void Map::SendObjectUpdates() for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter) { iter->second.BuildPacket(packet); - iter->first->GetSession()->SendPacket(&packet); + iter->first->SendDirectMessage(&packet); packet.clear(); // clean the string } } @@ -1852,7 +1850,7 @@ uint32 Map::GetPlayersCountExceptGMs() const void Map::SendToPlayers(WorldPacket const* data) const { for (MapRefMgr::const_iterator itr = m_mapRefMgr.begin(); itr != m_mapRefMgr.end(); ++itr) - itr->GetSource()->GetSession()->SendPacket(data); + itr->GetSource()->SendDirectMessage(data); } template bool Map::AddToMap(Corpse*, bool); @@ -2057,7 +2055,7 @@ bool InstanceMap::AddPlayerToMap(Player* player) data << uint32(60000); data << uint32(instance_data ? instance_data->GetCompletedEncounterMask() : 0); data << uint8(0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); player->SetPendingBind(mapSave->GetInstanceId(), 60000); } } @@ -2120,7 +2118,7 @@ void InstanceMap::CreateInstanceScript(bool load, std::string data, uint32 compl if (instance_data) isOtherAI = true; - // if Eluna AI was fetched succesfully we should not call CreateInstanceData nor set the unused scriptID + // if ALE AI was fetched succesfully we should not call CreateInstanceData nor set the unused scriptID if (!isOtherAI) { InstanceTemplate const* mInstance = sObjectMgr->GetInstanceTemplate(GetId()); @@ -2134,7 +2132,7 @@ void InstanceMap::CreateInstanceScript(bool load, std::string data, uint32 compl if (!instance_data) return; - // use mangos behavior if we are dealing with Eluna AI + // use mangos behavior if we are dealing with ALE AI // initialize should then be called only if load is false if (!isOtherAI || !load) { @@ -2229,7 +2227,7 @@ void InstanceMap::PermBindAllPlayers() { WorldPacket data(SMSG_INSTANCE_SAVE_CREATED, 4); data << uint32(0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); sInstanceSaveMgr->PlayerBindToInstance(player->GetGUID(), save, true, player); } @@ -2358,27 +2356,27 @@ void BattlegroundMap::RemoveAllPlayers() player->TeleportTo(player->GetEntryPoint()); } -Corpse* Map::GetCorpse(ObjectGuid const guid) +Corpse* Map::GetCorpse(ObjectGuid const& guid) { return _objectsStore.Find<Corpse>(guid); } -Creature* Map::GetCreature(ObjectGuid const guid) +Creature* Map::GetCreature(ObjectGuid const& guid) { return _objectsStore.Find<Creature>(guid); } -GameObject* Map::GetGameObject(ObjectGuid const guid) +GameObject* Map::GetGameObject(ObjectGuid const& guid) { return _objectsStore.Find<GameObject>(guid); } -Pet* Map::GetPet(ObjectGuid const guid) +Pet* Map::GetPet(ObjectGuid const& guid) { return dynamic_cast<Pet*>(_objectsStore.Find<Creature>(guid)); } -Transport* Map::GetTransport(ObjectGuid guid) +Transport* Map::GetTransport(ObjectGuid const& guid) { if (guid.GetHigh() != HighGuid::Mo_Transport && guid.GetHigh() != HighGuid::Transport) return nullptr; @@ -2387,7 +2385,7 @@ Transport* Map::GetTransport(ObjectGuid guid) return go ? go->ToTransport() : nullptr; } -DynamicObject* Map::GetDynamicObject(ObjectGuid guid) +DynamicObject* Map::GetDynamicObject(ObjectGuid const& guid) { return _objectsStore.Find<DynamicObject>(guid); } @@ -2679,7 +2677,7 @@ void Map::RemoveCorpse(Corpse* corpse) _corpseBones.erase(corpse); } -Corpse* Map::ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia /*= false*/) +Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*= false*/) { Corpse* corpse = GetCorpseByPlayer(ownerGuid); if (!corpse) diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 20551da8a0..c820b9c291 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -338,12 +338,12 @@ public: GameObject* SummonGameObject(uint32 entry, Position const& pos, float rotation0 = 0.0f, float rotation1 = 0.0f, float rotation2 = 0.0f, float rotation3 = 0.0f, uint32 respawnTime = 100, bool checkTransport = true); void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = nullptr); - Corpse* GetCorpse(ObjectGuid const guid); - Creature* GetCreature(ObjectGuid const guid); - GameObject* GetGameObject(ObjectGuid const guid); - Transport* GetTransport(ObjectGuid const guid); - DynamicObject* GetDynamicObject(ObjectGuid const guid); - Pet* GetPet(ObjectGuid const guid); + Corpse* GetCorpse(ObjectGuid const& guid); + Creature* GetCreature(ObjectGuid const& guid); + GameObject* GetGameObject(ObjectGuid const& guid); + Transport* GetTransport(ObjectGuid const& guid); + DynamicObject* GetDynamicObject(ObjectGuid const& guid); + Pet* GetPet(ObjectGuid const& guid); MapStoredObjectTypesContainer& GetObjectsStore() { return _objectsStore; } @@ -438,7 +438,7 @@ public: void DeleteCorpseData(); void AddCorpse(Corpse* corpse); void RemoveCorpse(Corpse* corpse); - Corpse* ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia = false); + Corpse* ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia = false); void RemoveOldCorpses(); static void DeleteRespawnTimesInDB(uint16 mapId, uint32 instanceId); @@ -514,6 +514,14 @@ public: void RemoveWorldObjectFromZoneWideVisibleMap(uint32 zoneId, WorldObject* obj); ZoneWideVisibleWorldObjectsSet const* GetZoneWideVisibleWorldObjectsForZone(uint32 zoneId) const; + [[nodiscard]] uint32 GetPlayerCountInZone(uint32 zoneId) const + { + if (auto const& it = _zonePlayerCountMap.find(zoneId); it != _zonePlayerCountMap.end()) + return it->second; + + return 0; + }; + private: template<class T> void InitializeObject(T* obj); diff --git a/src/server/game/Maps/MapMgr.cpp b/src/server/game/Maps/MapMgr.cpp index e113c93d27..dd8614a654 100644 --- a/src/server/game/Maps/MapMgr.cpp +++ b/src/server/game/Maps/MapMgr.cpp @@ -205,7 +205,7 @@ Map::EnterState MapMgr::PlayerCannotEnter(uint32 mapid, Player* player, bool log if (!corpseMap) { WorldPacket data(SMSG_CORPSE_NOT_IN_INSTANCE, 0); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); LOG_DEBUG("maps", "MAP: Player '{}' does not have a corpse in instance '{}' and cannot enter.", player->GetName(), mapName); return Map::CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE; } diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index f065ccf56a..a024a02b97 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -448,31 +448,45 @@ void TransportMgr::SpawnContinentTransports() LOG_INFO("server.loading", ">> Spawned {} continent motion transports in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); } + // Preloads Deeprun Tram to fix issues with Subway carts syncronization + /// @todo: This is a temporary workaround. Consider removing TransportMgr::PreloadGridsFromQuery() as part of fix. + /** + Takenbacon: "In the long run the most likely ideal fix would be to always spawn all transport types (and thus loading their grid) on map creation" + See https://github.com/azerothcore/azerothcore-wotlk/pull/23009 for more details. + */ + PreloadGridsFromQuery("SELECT map, position_x, position_y FROM gameobject g JOIN gameobject_template t ON g.id = t.entry WHERE t.type = 11 AND g.map = 369", count); + if (sWorld->getBoolConfig(CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING)) { // pussywizard: preload grids for continent static transports - QueryResult result2 = WorldDatabase.Query("SELECT map, position_x, position_y FROM gameobject g JOIN gameobject_template t ON g.id = t.entry WHERE t.type = 11"); + PreloadGridsFromQuery("SELECT map, position_x, position_y FROM gameobject g JOIN gameobject_template t ON g.id = t.entry WHERE t.type = 11 AND g.map != 369", count); + LOG_INFO("server.loading", ">> Preloaded grids for {} continent static transports in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); + } +} - if (result2) +void TransportMgr::PreloadGridsFromQuery(std::string const& query, uint32& count) +{ + if (QueryResult result = WorldDatabase.Query(query)) + { + do { - do - { - Field* fields = result2->Fetch(); - uint16 mapId = fields[0].Get<uint16>(); - float x = fields[1].Get<float>(); - float y = fields[2].Get<float>(); + Field* fields = result->Fetch(); + uint16 mapId = fields[0].Get<uint16>(); + float x = fields[1].Get<float>(); + float y = fields[2].Get<float>(); - MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); - if (mapEntry && !mapEntry->Instanceable()) + if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId)) + { + if (!mapEntry->Instanceable()) + { if (Map* map = sMapMgr->CreateBaseMap(mapId)) { map->LoadGrid(x, y); ++count; } - } while (result2->NextRow()); - } - - LOG_INFO("server.loading", ">> Preloaded grids for {} continent static transports in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); + } + } + } while (result->NextRow()); } } diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 9767ab3359..6f712657e0 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -158,6 +158,8 @@ private: TransportInstanceMap _instanceTransports; TransportAnimationContainer _transportAnimations; + + void PreloadGridsFromQuery(std::string const& query, uint32& count); }; #define sTransportMgr TransportMgr::instance() diff --git a/src/server/game/Miscellaneous/Formulas.cpp b/src/server/game/Miscellaneous/Formulas.cpp index 76c6c292d8..66bc53b8ff 100644 --- a/src/server/game/Miscellaneous/Formulas.cpp +++ b/src/server/game/Miscellaneous/Formulas.cpp @@ -84,14 +84,9 @@ uint32 Acore::XP::Gain(Player* player, Unit* unit, bool isBattleGround /*= false if (gain && creature) { if (creature->isElite()) - { - // Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus. - if (unit->GetMap() && unit->GetMap()->IsDungeon()) - xpMod *= 2.75f; - else - xpMod *= 2.0f; - } + xpMod *= 2.0f; + // Instanced mobs (particularly bosses) oftentimes have higher bonuses, especially in later content levels xpMod *= creature->GetCreatureTemplate()->ModExperience; } diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 5658e4147d..5061f873ce 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -978,7 +978,8 @@ enum AcoreStrings LANG_GUILD_INFO_EXTRA_INFO = 1183, LANG_GUILD_INFO_RANKS = 1184, LANG_GUILD_INFO_RANKS_LIST = 1185, - // Room for more level 3 1186-1198 not used + LANG_COMMAND_BEASTMASTER_MODE = 1186, + // Room for more level 3 1187-1198 not used // Debug commands LANG_DO_NOT_USE_6X_DEBUG_AREATRIGGER_LEFT = 1999, diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 2b2aba6ef9..d33de51872 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -32,6 +32,7 @@ #include "TargetedMovementGenerator.h" #include "WaypointMgr.h" #include "WaypointMovementGenerator.h" +#include "SmartScriptMgr.h" inline MovementGenerator* GetIdleMovementGenerator() { @@ -387,6 +388,7 @@ void MotionMaster::MoveBackwards(Unit* target, float dist) Movement::MoveSplineInit init(_owner); init.MoveTo(point.x, point.y, point.z, false); + init.SetWalk(true); init.SetFacing(target); init.SetOrientationInversed(); init.Launch(); @@ -469,7 +471,7 @@ void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlo * * For transition movement between the ground and the air, use MoveLand or MoveTakeoff instead. */ -void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generatePath, bool forceDestination, MovementSlot slot, float orientation /* = 0.0f*/) +void MotionMaster::MovePoint(uint32 id, float x, float y, float z, ForcedMovement forcedMovement, float speed, float orientation, bool generatePath, bool forceDestination, MovementSlot slot) { if (_owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) return; @@ -477,16 +479,16 @@ void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generate if (_owner->IsPlayer()) { LOG_DEBUG("movement.motionmaster", "Player ({}) targeted point (Id: {} X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), id, x, y, z); - Mutate(new PointMovementGenerator<Player>(id, x, y, z, 0.0f, orientation, nullptr, generatePath, forceDestination), slot); + Mutate(new PointMovementGenerator<Player>(id, x, y, z, forcedMovement, speed, orientation, nullptr, generatePath, forceDestination), slot); } else { LOG_DEBUG("movement.motionmaster", "Creature ({}) targeted point (ID: {} X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), id, x, y, z); - Mutate(new PointMovementGenerator<Creature>(id, x, y, z, 0.0f, orientation, nullptr, generatePath, forceDestination), slot); + Mutate(new PointMovementGenerator<Creature>(id, x, y, z, forcedMovement, speed, orientation, nullptr, generatePath, forceDestination), slot); } } -void MotionMaster::MoveSplinePath(Movement::PointsArray* path) +void MotionMaster::MoveSplinePath(Movement::PointsArray* path, ForcedMovement forcedMovement) { // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE if (_owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) @@ -494,27 +496,43 @@ void MotionMaster::MoveSplinePath(Movement::PointsArray* path) if (_owner->IsPlayer()) { - Mutate(new EscortMovementGenerator<Player>(path), MOTION_SLOT_ACTIVE); + Mutate(new EscortMovementGenerator<Player>(forcedMovement, path), MOTION_SLOT_ACTIVE); } else { - Mutate(new EscortMovementGenerator<Creature>(path), MOTION_SLOT_ACTIVE); + Mutate(new EscortMovementGenerator<Creature>(forcedMovement, path), MOTION_SLOT_ACTIVE); } } -void MotionMaster::MoveSplinePath(uint32 path_id) +void MotionMaster::MovePath(uint32 path_id, ForcedMovement forcedMovement, PathSource pathSource) { - // convert the path id to a Movement::PointsArray* - Movement::PointsArray* points = new Movement::PointsArray(); - WaypointPath const* path = sWaypointMgr->GetPath(path_id); - for (uint8 i = 0; i < path->size(); ++i) + WaypointPath const* path; + switch (pathSource) + { + default: + case PathSource::WAYPOINT_MGR: + path = sWaypointMgr->GetPath(path_id); + break; + case PathSource::SMART_WAYPOINT_MGR: + path = sSmartWaypointMgr->GetPath(path_id); + break; + } + + if (path == nullptr) + { + LOG_ERROR("sql.sql", "WaypointMovementGenerator::LoadPath: creature {} ({}) doesn't have waypoint path id: {} pathSource: {}", + _owner->GetName(), _owner->GetGUID().ToString(), path_id, pathSource); + return; + } + + Movement::PointsArray points; + for (auto& point : *path) { - WaypointData const* node = path->at(i); - points->push_back(G3D::Vector3(node->x, node->y, node->z)); + points.push_back(G3D::Vector3(point.second.x, point.second.y, point.second.z)); } // pass the new PointsArray* to the appropriate MoveSplinePath function - MoveSplinePath(points); + MoveSplinePath(&points, forcedMovement); } /** @@ -539,8 +557,8 @@ void MotionMaster::MoveLand(uint32 id, Position const& pos, float speed /* = 0.0 } init.SetAnimation(Movement::ToGround); - init.Launch(); - Mutate(new EffectMovementGenerator(id), MOTION_SLOT_ACTIVE); + + Mutate(new EffectMovementGenerator(init, id), MOTION_SLOT_ACTIVE); } /** @@ -569,16 +587,12 @@ void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, float speed /* = init.MoveTo(x, y, z); if (speed > 0.0f) - { init.SetVelocity(speed); - } if (!skipAnimation) - { init.SetAnimation(Movement::ToFly); - } - init.Launch(); - Mutate(new EffectMovementGenerator(id), MOTION_SLOT_ACTIVE); + + Mutate(new EffectMovementGenerator(init, id), MOTION_SLOT_ACTIVE); } /** @@ -612,8 +626,8 @@ void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, floa init.SetParabolic(max_height, 0); init.SetOrientationFixed(true); init.SetVelocity(speedXY); - init.Launch(); - Mutate(new EffectMovementGenerator(0), MOTION_SLOT_CONTROLLED); + + Mutate(new EffectMovementGenerator(init, 0), MOTION_SLOT_CONTROLLED); } /** @@ -652,8 +666,8 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee init.SetVelocity(speedXY); if (target) init.SetFacing(target); - init.Launch(); - Mutate(new EffectMovementGenerator(id), MOTION_SLOT_CONTROLLED); + + Mutate(new EffectMovementGenerator(init, id), MOTION_SLOT_CONTROLLED); } /** @@ -695,8 +709,8 @@ void MotionMaster::MoveFall(uint32 id /*=0*/, bool addFlagForNPC) Movement::MoveSplineInit init(_owner); init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz + _owner->GetHoverHeight()); init.SetFall(); - init.Launch(); - Mutate(new EffectMovementGenerator(id), MOTION_SLOT_CONTROLLED); + + Mutate(new EffectMovementGenerator(init, id), MOTION_SLOT_CONTROLLED); } /** @@ -713,12 +727,12 @@ void MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id, if (_owner->IsPlayer()) { LOG_DEBUG("movement.motionmaster", "Player ({}) charge point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z); - Mutate(new PointMovementGenerator<Player>(id, x, y, z, speed, orientation, path, generatePath, generatePath, targetGUID), MOTION_SLOT_CONTROLLED); + Mutate(new PointMovementGenerator<Player>(id, x, y, z, FORCED_MOVEMENT_NONE, speed, orientation, path, generatePath, generatePath, targetGUID), MOTION_SLOT_CONTROLLED); } else { LOG_DEBUG("movement.motionmaster", "Creature ({}) charge point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z); - Mutate(new PointMovementGenerator<Creature>(id, x, y, z, speed, orientation, path, generatePath, generatePath, targetGUID), MOTION_SLOT_CONTROLLED); + Mutate(new PointMovementGenerator<Creature>(id, x, y, z, FORCED_MOVEMENT_NONE, speed, orientation, path, generatePath, generatePath, targetGUID), MOTION_SLOT_CONTROLLED); } } @@ -884,7 +898,7 @@ void MotionMaster::Mutate(MovementGenerator* m, MovementSlot slot) /** * @brief Move the unit following a specific path. Doesn't work with UNIT_FLAG_DISABLE_MOVE */ -void MotionMaster::MovePath(uint32 path_id, bool repeatable) +void MotionMaster::MoveWaypoint(uint32 path_id, bool repeatable, PathSource pathSource) { if (!path_id) return; @@ -892,20 +906,7 @@ void MotionMaster::MovePath(uint32 path_id, bool repeatable) if (_owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE)) return; - //We set waypoint movement as new default movement generator - // clear ALL movement generators (including default) - /*while (!empty()) - { - MovementGenerator *curr = top(); - curr->Finalize(*_owner); - pop(); - if (!isStatic(curr)) - delete curr; - }*/ - - //_owner->IsPlayer() ? - //Mutate(new WaypointMovementGenerator<Player>(path_id, repeatable)): - Mutate(new WaypointMovementGenerator<Creature>(path_id, repeatable), MOTION_SLOT_IDLE); + Mutate(new WaypointMovementGenerator<Creature>(path_id, pathSource, repeatable), MOTION_SLOT_IDLE); LOG_DEBUG("movement.motionmaster", "{} ({}) start moving over path(Id:{}, repeatable: {})", _owner->IsPlayer() ? "Player" : "Creature", _owner->GetGUID().ToString(), path_id, repeatable ? "YES" : "NO"); diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 0fcf5abae8..319da8d579 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -80,6 +80,21 @@ enum RotateDirection ROTATE_DIRECTION_RIGHT }; +enum ForcedMovement +{ + FORCED_MOVEMENT_NONE = 0, + FORCED_MOVEMENT_WALK = 1, + FORCED_MOVEMENT_RUN = 2, + + FORCED_MOVEMENT_MAX +}; + +enum class PathSource +{ + WAYPOINT_MGR = 0, + SMART_WAYPOINT_MGR = 1, +}; + struct ChaseRange { ChaseRange(float range); @@ -210,11 +225,11 @@ public: void MoveForwards(Unit* target, float dist); void MoveConfused(); void MoveFleeing(Unit* enemy, uint32 time = 0); - void MovePoint(uint32 id, const Position& pos, bool generatePath = true, bool forceDestination = true) - { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath, forceDestination, MOTION_SLOT_ACTIVE, pos.GetOrientation()); } - void MovePoint(uint32 id, float x, float y, float z, bool generatePath = true, bool forceDestination = true, MovementSlot slot = MOTION_SLOT_ACTIVE, float orientation = 0.0f); - void MoveSplinePath(Movement::PointsArray* path); - void MoveSplinePath(uint32 path_id); + void MovePoint(uint32 id, const Position& pos, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE, float speed = 0.f, bool generatePath = true, bool forceDestination = true) + { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, forcedMovement, speed, pos.GetOrientation(), generatePath, forceDestination, MOTION_SLOT_ACTIVE); } + void MovePoint(uint32 id, float x, float y, float z, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE, float speed = 0.f, float orientation = 0.0f, bool generatePath = true, bool forceDestination = true, MovementSlot slot = MOTION_SLOT_ACTIVE); + void MoveSplinePath(Movement::PointsArray* path, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE); + void MovePath(uint32 path_id, ForcedMovement forcedMovement = FORCED_MOVEMENT_NONE, PathSource pathSource = PathSource::WAYPOINT_MGR); // These two movement types should only be used with creatures having landing/takeoff animations void MoveLand(uint32 id, Position const& pos, float speed = 0.0f); @@ -235,7 +250,7 @@ public: void MoveSeekAssistanceDistract(uint32 timer); void MoveTaxiFlight(uint32 path, uint32 pathnode); void MoveDistract(uint32 time); - void MovePath(uint32 path_id, bool repeatable); + void MoveWaypoint(uint32 path_id, bool repeatable, PathSource pathSource = PathSource::WAYPOINT_MGR); void MoveRotate(uint32 time, RotateDirection direction); [[nodiscard]] MovementGeneratorType GetCurrentMovementGeneratorType() const; diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp index 6d3d1007c8..e650ed63ae 100644 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp @@ -146,6 +146,7 @@ bool ConfusedMovementGenerator<T>::DoUpdate(T* unit, uint32 diff) float z = i_waypoints[i_nextMove][2]; Movement::MoveSplineInit init(unit); init.MoveTo(x, y, z, true); + init.SetWalk(true); init.Launch(); } } diff --git a/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.cpp index 14133dbe26..3fcfa93d3e 100644 --- a/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.cpp @@ -36,6 +36,11 @@ void EscortMovementGenerator<T>::DoInitialize(T* unit) else if (m_precomputedPath.size()) init.MovebyPath(m_precomputedPath); + if (_forcedMovement == FORCED_MOVEMENT_WALK) + init.SetWalk(true); + else if (_forcedMovement == FORCED_MOVEMENT_RUN) + init.SetWalk(false); + init.Launch(); _splineId = unit->movespline->GetId(); @@ -79,6 +84,11 @@ bool EscortMovementGenerator<T>::DoUpdate(T* unit, uint32 /*diff*/) init.MoveTo(m_precomputedPath[1].x, m_precomputedPath[1].y, m_precomputedPath[1].z, true); } + if (_forcedMovement == FORCED_MOVEMENT_WALK) + init.SetWalk(true); + else if (_forcedMovement == FORCED_MOVEMENT_RUN) + init.SetWalk(false); + init.Launch(); // Xinef: Override spline Id on recalculate launch _splineId = unit->movespline->GetId(); diff --git a/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.h b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.h index edb410b8a8..7a175ed8fe 100644 --- a/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.h @@ -24,7 +24,7 @@ template<class T> class EscortMovementGenerator : public MovementGeneratorMedium< T, EscortMovementGenerator<T> > { public: - EscortMovementGenerator(Movement::PointsArray* _path = nullptr) : i_recalculateSpeed(false) + EscortMovementGenerator(ForcedMovement forcedMovement, Movement::PointsArray* _path = nullptr) : i_recalculateSpeed(false), _forcedMovement(forcedMovement) { if (_path) m_precomputedPath = *_path; @@ -46,6 +46,7 @@ private: Movement::PointsArray m_precomputedPath; uint32 _splineId; + ForcedMovement _forcedMovement; }; #endif diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index be1667e5bc..60cf4f41e3 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -31,8 +31,6 @@ void HomeMovementGenerator<Creature>::DoFinalize(Creature* owner) owner->ClearUnitState(UNIT_STATE_EVADE); if (arrived) { - // Xinef: npc run by default - //owner->SetWalk(true); owner->LoadCreaturesAddon(true); owner->AI()->JustReachedHome(); } diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp index fdce942480..ab8f850099 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp @@ -84,6 +84,11 @@ void PointMovementGenerator<T>::DoInitialize(T* unit) if (speed > 0.0f) init.SetVelocity(speed); + if (_forcedMovement == FORCED_MOVEMENT_WALK) + init.SetWalk(true); + else if (_forcedMovement == FORCED_MOVEMENT_RUN) + init.SetWalk(false); + if (i_orientation > 0.0f) { init.SetFacing(i_orientation); @@ -142,6 +147,11 @@ bool PointMovementGenerator<T>::DoUpdate(T* unit, uint32 /*diff*/) if (speed > 0.0f) // Default value for point motion type is 0.0, if 0.0 spline will use GetSpeed on unit init.SetVelocity(speed); + if (_forcedMovement == FORCED_MOVEMENT_WALK) + init.SetWalk(true); + else if (_forcedMovement == FORCED_MOVEMENT_RUN) + init.SetWalk(false); + if (i_orientation > 0.0f) { init.SetFacing(i_orientation); @@ -228,6 +238,11 @@ bool EffectMovementGenerator::Update(Unit* unit, uint32) return !unit->movespline->Finalized(); } +void EffectMovementGenerator::Initialize(Unit*) +{ + i_spline.Launch(); +} + void EffectMovementGenerator::Finalize(Unit* unit) { if (!unit->IsCreature()) diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h index f19e04d422..f9941e9b8c 100644 --- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h @@ -20,15 +20,16 @@ #include "Creature.h" #include "MovementGenerator.h" +#include "MoveSplineInit.h" template<class T> class PointMovementGenerator : public MovementGeneratorMedium< T, PointMovementGenerator<T> > { public: - PointMovementGenerator(uint32 _id, float _x, float _y, float _z, float _speed = 0.0f, float orientation = 0.0f, const Movement::PointsArray* _path = nullptr, - bool generatePath = false, bool forceDestination = false, ObjectGuid chargeTargetGUID = ObjectGuid::Empty) - : id(_id), i_x(_x), i_y(_y), i_z(_z), speed(_speed), i_orientation(orientation), _generatePath(generatePath), _forceDestination(forceDestination), - _chargeTargetGUID(chargeTargetGUID) + PointMovementGenerator(uint32 _id, float _x, float _y, float _z, ForcedMovement forcedMovement, float _speed = 0.0f, float orientation = 0.0f, const Movement::PointsArray* _path = nullptr, + bool generatePath = false, bool forceDestination = false, ObjectGuid chargeTargetGUID = ObjectGuid::Empty, bool reverseOrientation = false, ObjectGuid facingTargetGuid = ObjectGuid()) + : id(_id), i_x(_x), i_y(_y), i_z(_z), speed(_speed), i_orientation(orientation), _generatePath(generatePath), _forceDestination(forceDestination), _reverseOrientation(reverseOrientation), + _chargeTargetGUID(chargeTargetGUID), _forcedMovement(forcedMovement), _facingTargetGuid(facingTargetGuid) { if (_path) m_precomputedPath = *_path; @@ -55,14 +56,17 @@ private: Movement::PointsArray m_precomputedPath; bool _generatePath; bool _forceDestination; + bool _reverseOrientation; ObjectGuid _chargeTargetGUID; + ForcedMovement _forcedMovement; + ObjectGuid _facingTargetGuid; }; class AssistanceMovementGenerator : public PointMovementGenerator<Creature> { public: AssistanceMovementGenerator(float _x, float _y, float _z) : - PointMovementGenerator<Creature>(0, _x, _y, _z) {} + PointMovementGenerator<Creature>(0, _x, _y, _z, FORCED_MOVEMENT_NONE) {} MovementGeneratorType GetMovementGeneratorType() { return ASSISTANCE_MOTION_TYPE; } void Finalize(Unit*); @@ -72,14 +76,15 @@ public: class EffectMovementGenerator : public MovementGenerator { public: - explicit EffectMovementGenerator(uint32 Id) : m_Id(Id) {} - void Initialize(Unit*) override {} + explicit EffectMovementGenerator(Movement::MoveSplineInit& spline, uint32 Id) : m_Id(Id), i_spline(spline) {} + void Initialize(Unit*) override; void Finalize(Unit*) override; void Reset(Unit*) override {} bool Update(Unit*, uint32) override; MovementGeneratorType GetMovementGeneratorType() override { return EFFECT_MOTION_TYPE; } private: uint32 m_Id; + Movement::MoveSplineInit i_spline; }; #endif diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 5d904d31ac..239117d4ad 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -51,7 +51,21 @@ void RandomMovementGenerator<Creature>::_setRandomLocation(Creature* creature) creature->AddUnitState(UNIT_STATE_ROAMING_MOVE); Movement::MoveSplineInit init(creature); init.MoveTo(_currDestPosition.GetPositionX(), _currDestPosition.GetPositionY(), _currDestPosition.GetPositionZ()); - init.SetWalk(true); + + bool walk = true; + switch (creature->GetMovementTemplate().GetRandom()) + { + case CreatureRandomMovementType::CanRun: + walk = creature->IsWalking(); + break; + case CreatureRandomMovementType::AlwaysRun: + walk = false; + break; + default: + break; + } + + init.SetWalk(walk); init.Launch(); if (creature->GetFormation() && creature->GetFormation()->GetLeader() == creature) creature->GetFormation()->LeaderMoveTo(_currDestPosition.GetPositionX(), _currDestPosition.GetPositionY(), _currDestPosition.GetPositionZ(), 0); @@ -270,7 +284,6 @@ template<> void RandomMovementGenerator<Creature>::DoFinalize(Creature* creature) { creature->ClearUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE); - creature->SetWalk(false); } template<> diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 4dfc688282..b6adb3010e 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -113,7 +113,7 @@ bool ChaseMovementGenerator<T>::DispatchSplineToPosition(T* owner, float x, floa } owner->StopMoving(); - return true; + return false; } if (cutPath) @@ -134,7 +134,7 @@ bool ChaseMovementGenerator<T>::DispatchSplineToPosition(T* owner, float x, floa init.SetWalk(walk); init.Launch(); - return false; + return true; } template<class T> @@ -219,18 +219,21 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff) { i_recheckDistance.Reset(400); // Sniffed value - if (i_recalculateTravel && PositionOkay(owner, target, _movingTowards ? maxTarget : Optional<float>(), angle)) + if (m_currentMode != CHASE_MODE_DISTANCING) { - if ((owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase) || _range) + if (i_recalculateTravel && PositionOkay(owner, target, _movingTowards ? maxTarget : Optional<float>(), angle)) { - i_recalculateTravel = false; - i_path = nullptr; - if (cOwner) - cOwner->SetCannotReachTarget(); - owner->StopMoving(); - owner->SetInFront(target); - MovementInform(owner); - return true; + if ((owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase) || _range) + { + i_recalculateTravel = false; + i_path = nullptr; + if (cOwner) + cOwner->SetCannotReachTarget(); + owner->StopMoving(); + owner->SetInFront(target); + MovementInform(owner); + return true; + } } } } @@ -262,6 +265,9 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff) i_leashExtensionTimer.Reset(cOwner->GetAttackTime(BASE_ATTACK)); } + if (m_currentMode == CHASE_MODE_DISTANCING) + return true; + // if the target moved, we have to consider whether to adjust if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase || !owner->IsWithinLOSInMap(target)) { @@ -365,7 +371,6 @@ void ChaseMovementGenerator<Creature>::DoInitialize(Creature* owner) _lastTargetPosition.reset(); i_recheckDistance.Reset(0); i_leashExtensionTimer.Reset(owner->GetAttackTime(BASE_ATTACK)); - owner->SetWalk(false); owner->AddUnitState(UNIT_STATE_CHASE); } diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index be3c0d57f1..a894c8d068 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -28,13 +28,26 @@ #include "Spell.h" #include "Transport.h" #include "World.h" +#include "SmartScriptMgr.h" void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) { - if (!path_id) - path_id = creature->GetWaypointPath(); + switch (i_pathSource) + { + case PathSource::WAYPOINT_MGR: + { + if (!path_id) + path_id = creature->GetWaypointPath(); - i_path = sWaypointMgr->GetPath(path_id); + i_path = sWaypointMgr->GetPath(path_id); + break; + } + case PathSource::SMART_WAYPOINT_MGR: + { + i_path = sSmartWaypointMgr->GetPath(path_id); + break; + } + } if (!i_path) { @@ -44,6 +57,8 @@ void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) return; } + i_currentNode = i_path->begin()->first; + StartMoveNow(creature); } @@ -56,7 +71,6 @@ void WaypointMovementGenerator<Creature>::DoInitialize(Creature* creature) void WaypointMovementGenerator<Creature>::DoFinalize(Creature* creature) { creature->ClearUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE); - creature->SetWalk(false); } void WaypointMovementGenerator<Creature>::DoReset(Creature* creature) @@ -79,22 +93,24 @@ void WaypointMovementGenerator<Creature>::OnArrived(Creature* creature) creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); m_isArrivalDone = true; - if (i_path->at(i_currentNode)->event_id && urand(0, 99) < i_path->at(i_currentNode)->event_chance) + auto currentNodeItr = i_path->find(i_currentNode); + + if (currentNodeItr->second.event_id && urand(0, 99) < currentNodeItr->second.event_chance) { LOG_DEBUG("maps.script", "Creature movement start script {} at point {} for {}.", - i_path->at(i_currentNode)->event_id, i_currentNode, creature->GetGUID().ToString()); + currentNodeItr->second.event_id, i_currentNode, creature->GetGUID().ToString()); creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); - creature->GetMap()->ScriptsStart(sWaypointScripts, i_path->at(i_currentNode)->event_id, creature, nullptr); + creature->GetMap()->ScriptsStart(sWaypointScripts, currentNodeItr->second.event_id, creature, nullptr); } // Inform script MovementInform(creature); creature->UpdateWaypointID(i_currentNode); - if (i_path->at(i_currentNode)->delay) + if (currentNodeItr->second.delay) { creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); - Stop(i_path->at(i_currentNode)->delay); + Stop(currentNodeItr->second.delay); } } @@ -114,12 +130,11 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) if (m_isArrivalDone) { - // Xinef: not true... update this at every waypoint! - //if ((i_currentNode == i_path->size() - 1) && !repeating) // If that's our last waypoint { - float x = i_path->at(i_currentNode)->x; - float y = i_path->at(i_currentNode)->y; - float z = i_path->at(i_currentNode)->z; + auto currentNodeItr = i_path->find(i_currentNode); + float x = currentNodeItr->second.x; + float y = currentNodeItr->second.y; + float z = currentNodeItr->second.z; float o = creature->GetOrientation(); if (!transportPath) @@ -140,14 +155,17 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) } // Xinef: moved the upper IF here - if ((i_currentNode == i_path->size() - 1) && !repeating) // If that's our last waypoint + uint32 lastPoint = i_path->rbegin()->first; + if ((i_currentNode == lastPoint) && !repeating) // If that's our last waypoint { creature->AI()->PathEndReached(path_id); creature->GetMotionMaster()->Initialize(); return false; } - i_currentNode = (i_currentNode + 1) % i_path->size(); + ++i_currentNode; + if (lastPoint < i_currentNode) + i_currentNode = i_path->begin()->first; } // xinef: do not initialize motion if we got stunned in movementinform @@ -156,13 +174,14 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) return true; } - WaypointData const* node = i_path->at(i_currentNode); + auto currentNodeItr = i_path->find(i_currentNode); + WaypointData const& node = currentNodeItr->second; m_isArrivalDone = false; creature->AddUnitState(UNIT_STATE_ROAMING_MOVE); - Movement::Location formationDest(node->x, node->y, node->z, 0.0f); + Movement::Location formationDest(node.x, node.y, node.z, 0.0f); Movement::MoveSplineInit init(creature); //! If creature is on transport, we assume waypoints set in DB are already transport offsets @@ -173,16 +192,16 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) trans->CalculatePassengerPosition(formationDest.x, formationDest.y, formationDest.z, &formationDest.orientation); } - float z = node->z; - creature->UpdateAllowedPositionZ(node->x, node->y, z); + float z = node.z; + creature->UpdateAllowedPositionZ(node.x, node.y, z); //! Do not use formationDest here, MoveTo requires transport offsets due to DisableTransportPathTransformations() call //! but formationDest contains global coordinates - init.MoveTo(node->x, node->y, z, true, true); + init.MoveTo(node.x, node.y, z, true, true); - if (node->orientation.has_value() && node->delay > 0) - init.SetFacing(*node->orientation); + if (node.orientation.has_value() && node.delay > 0) + init.SetFacing(*node.orientation); - switch (node->move_type) + switch (node.move_type) { case WAYPOINT_MOVE_TYPE_LAND: init.SetAnimation(Movement::ToGround); @@ -204,7 +223,7 @@ bool WaypointMovementGenerator<Creature>::StartMove(Creature* creature) //Call for creature group update if (creature->GetFormation() && creature->GetFormation()->GetLeader() == creature) - creature->GetFormation()->LeaderMoveTo(formationDest.x, formationDest.y, formationDest.z, node->move_type); + creature->GetFormation()->LeaderMoveTo(formationDest.x, formationDest.y, formationDest.z, node.move_type); return true; } @@ -240,13 +259,7 @@ bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 di } else { - bool finished = creature->movespline->Finalized(); - // xinef: code to detect pre-empetively if we should start movement to next waypoint - // xinef: do not start pre-empetive movement if current node has delay or we are ending waypoint movement - //if (!finished && !i_path->at(i_currentNode)->delay && ((i_currentNode != i_path->size() - 1) || repeating)) - // finished = (creature->movespline->_Spline().length(creature->movespline->_currentSplineIdx() + 1) - creature->movespline->timePassed()) < 200; - - if (finished) + if (creature->movespline->Finalized()) { OnArrived(creature); return StartMove(creature); diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 3161894a2b..babc16cb48 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -54,8 +54,8 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium< Crea public PathMovementBase<Creature, WaypointPath const*> { public: - WaypointMovementGenerator(uint32 _path_id = 0, bool _repeating = true, bool _stalled = false) - : PathMovementBase((WaypointPath const*)nullptr), i_nextMoveTime(0), m_isArrivalDone(false), path_id(_path_id), repeating(_repeating), stalled(_stalled) {} + WaypointMovementGenerator(uint32 _path_id = 0, PathSource pathSource = PathSource::WAYPOINT_MGR, bool _repeating = true, bool _stalled = false) + : PathMovementBase((WaypointPath const*)nullptr), i_nextMoveTime(0), m_isArrivalDone(false), path_id(_path_id), repeating(_repeating), stalled(_stalled), i_pathSource(pathSource) {} ~WaypointMovementGenerator() { i_path = nullptr; } void DoInitialize(Creature*); void DoFinalize(Creature*); @@ -96,6 +96,7 @@ private: uint32 path_id; bool repeating; bool stalled; + PathSource i_pathSource; }; /** FlightPathMovementGenerator generates movement of the player for the paths diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h index 5ebe5f5aa5..eaba1d53f8 100644 --- a/src/server/game/Movement/Spline/MoveSpline.h +++ b/src/server/game/Movement/Spline/MoveSpline.h @@ -117,6 +117,7 @@ namespace Movement [[nodiscard]] bool isCyclic() const { return splineflags.cyclic; } [[nodiscard]] bool isFalling() const { return splineflags.falling; } [[nodiscard]] bool isWalking() const { return splineflags.walkmode; } + [[nodiscard]] bool isBoarding() const { return splineflags.transportEnter || splineflags.transportExit; } [[nodiscard]] Vector3 FinalDestination() const { return Initialized() ? spline.getPoint(spline.last()) : Vector3(); } [[nodiscard]] Vector3 CurrentDestination() const { return Initialized() ? spline.getPoint(point_Idx + 1) : Vector3(); } [[nodiscard]] int32 currentPathIdx() const; diff --git a/src/server/game/Movement/Waypoints/WaypointMgr.cpp b/src/server/game/Movement/Waypoints/WaypointMgr.cpp index 7a2596fbf7..076fb39d54 100644 --- a/src/server/game/Movement/Waypoints/WaypointMgr.cpp +++ b/src/server/game/Movement/Waypoints/WaypointMgr.cpp @@ -30,9 +30,6 @@ WaypointMgr::~WaypointMgr() { for (WaypointPathContainer::iterator itr = _waypointStore.begin(); itr != _waypointStore.end(); ++itr) { - for (WaypointPath::const_iterator it = itr->second.begin(); it != itr->second.end(); ++it) - delete *it; - itr->second.clear(); } @@ -64,7 +61,7 @@ void WaypointMgr::Load() do { Field* fields = result->Fetch(); - WaypointData* wp = new WaypointData(); + WaypointData data; uint32 pathId = fields[0].Get<uint32>(); WaypointPath& path = _waypointStore[pathId]; @@ -79,28 +76,40 @@ void WaypointMgr::Load() Acore::NormalizeMapCoord(x); Acore::NormalizeMapCoord(y); - wp->id = fields[1].Get<uint32>(); - wp->x = x; - wp->y = y; - wp->z = z; - wp->orientation = o; - wp->move_type = fields[6].Get<uint32>(); + data.id = fields[1].Get<uint32>(); + data.x = x; + data.y = y; + data.z = z; + data.orientation = o; + data.move_type = fields[6].Get<uint32>(); - if (wp->move_type >= WAYPOINT_MOVE_TYPE_MAX) + if (data.move_type >= WAYPOINT_MOVE_TYPE_MAX) { //LOG_ERROR("sql.sql", "Waypoint {} in waypoint_data has invalid move_type, ignoring", wp->id); - delete wp; continue; } - wp->delay = fields[7].Get<uint32>(); - wp->event_id = fields[8].Get<uint32>(); - wp->event_chance = fields[9].Get<int16>(); + data.delay = fields[7].Get<uint32>(); + data.event_id = fields[8].Get<uint32>(); + data.event_chance = fields[9].Get<int16>(); - path.push_back(wp); + path.emplace(data.id, data); ++count; } while (result->NextRow()); + for (auto itr = _waypointStore.begin(); itr != _waypointStore.end(); ) + { + uint32 first = itr->second.begin()->first; + uint32 last = itr->second.rbegin()->first; + if (last - first + 1 != itr->second.size()) + { + LOG_ERROR("sql.sql", "Waypoint {} in waypoint_data has non-contiguous pointids, skipping", itr->first); + itr = _waypointStore.erase(itr); + } + else + ++itr; + } + LOG_INFO("server.loading", ">> Loaded {} waypoints in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); LOG_INFO("server.loading", " "); } @@ -110,9 +119,6 @@ void WaypointMgr::ReloadPath(uint32 id) WaypointPathContainer::iterator itr = _waypointStore.find(id); if (itr != _waypointStore.end()) { - for (WaypointPath::const_iterator it = itr->second.begin(); it != itr->second.end(); ++it) - delete *it; - _waypointStore.erase(itr); } @@ -130,7 +136,7 @@ void WaypointMgr::ReloadPath(uint32 id) do { Field* fields = result->Fetch(); - WaypointData* wp = new WaypointData(); + WaypointData data; float x = fields[1].Get<float>(); float y = fields[2].Get<float>(); @@ -142,24 +148,23 @@ void WaypointMgr::ReloadPath(uint32 id) Acore::NormalizeMapCoord(x); Acore::NormalizeMapCoord(y); - wp->id = fields[0].Get<uint32>(); - wp->x = x; - wp->y = y; - wp->z = z; - wp->orientation = o; - wp->move_type = fields[5].Get<uint32>(); + data.id = fields[0].Get<uint32>(); + data.x = x; + data.y = y; + data.z = z; + data.orientation = o; + data.move_type = fields[5].Get<uint32>(); - if (wp->move_type >= WAYPOINT_MOVE_TYPE_MAX) + if (data.move_type >= WAYPOINT_MOVE_TYPE_MAX) { //LOG_ERROR("sql.sql", "Waypoint {} in waypoint_data has invalid move_type, ignoring", wp->id); - delete wp; continue; } - wp->delay = fields[6].Get<uint32>(); - wp->event_id = fields[7].Get<uint32>(); - wp->event_chance = fields[8].Get<uint8>(); + data.delay = fields[6].Get<uint32>(); + data.event_id = fields[7].Get<uint32>(); + data.event_chance = fields[8].Get<uint8>(); - path.push_back(wp); + path.emplace(data.id, data); } while (result->NextRow()); } diff --git a/src/server/game/Movement/Waypoints/WaypointMgr.h b/src/server/game/Movement/Waypoints/WaypointMgr.h index ea588a28c5..6e97ab3449 100644 --- a/src/server/game/Movement/Waypoints/WaypointMgr.h +++ b/src/server/game/Movement/Waypoints/WaypointMgr.h @@ -22,6 +22,7 @@ #include <optional> #include <unordered_map> #include <vector> +#include <map> enum WaypointMoveType { @@ -39,12 +40,12 @@ struct WaypointData float x, y, z; std::optional<float> orientation; uint32 delay; - uint32 event_id; - uint32 move_type; - uint8 event_chance; + uint32 event_id = 0; + uint32 move_type = 0; + uint8 event_chance = 0; }; -typedef std::vector<WaypointData*> WaypointPath; +typedef std::map<uint32, WaypointData> WaypointPath; typedef std::unordered_map<uint32, WaypointPath> WaypointPathContainer; class WaypointMgr diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 330d99c3f6..ae7e476bb9 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -635,7 +635,7 @@ void OutdoorPvP::BroadcastPacket(WorldPacket& data) const for (auto const& playerSet : _players) for (auto itr : playerSet) if (Player* const player = ObjectAccessor::FindPlayer(itr)) - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void OutdoorPvP::RegisterZone(uint32 zoneId) diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 76e945a9c5..70ef8e4fdf 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -442,7 +442,7 @@ void Map::ScriptsProcess() if (step.script->MoveTo.TravelTime != 0) { float speed = unit->GetDistance(step.script->MoveTo.DestX, step.script->MoveTo.DestY, step.script->MoveTo.DestZ) / ((float)step.script->MoveTo.TravelTime * 0.001f); - unit->MonsterMoveWithSpeed(step.script->MoveTo.DestX, step.script->MoveTo.DestY, step.script->MoveTo.DestZ, speed); + unit->GetMotionMaster()->MovePoint(0, step.script->MoveTo.DestX, step.script->MoveTo.DestY, step.script->MoveTo.DestZ, FORCED_MOVEMENT_NONE, speed); } else unit->NearTeleportTo(step.script->MoveTo.DestX, step.script->MoveTo.DestY, step.script->MoveTo.DestZ, unit->GetOrientation()); @@ -757,7 +757,7 @@ void Map::ScriptsProcess() case SCRIPT_COMMAND_DESPAWN_SELF: // Target or source must be Creature. if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script, true)) - cSource->DespawnOrUnsummon(step.script->DespawnSelf.DespawnDelay); + cSource->DespawnOrUnsummon(Milliseconds(step.script->DespawnSelf.DespawnDelay)); break; case SCRIPT_COMMAND_LOAD_PATH: @@ -767,7 +767,7 @@ void Map::ScriptsProcess() if (!sWaypointMgr->GetPath(step.script->LoadPath.PathID)) LOG_ERROR("maps.script", "{} source object has an invalid path ({}), skipping.", step.script->GetDebugInfo(), step.script->LoadPath.PathID); else - unit->GetMotionMaster()->MovePath(step.script->LoadPath.PathID, step.script->LoadPath.IsRepeatable); + unit->GetMotionMaster()->MoveWaypoint(step.script->LoadPath.PathID, step.script->LoadPath.IsRepeatable); } break; @@ -880,7 +880,6 @@ void Map::ScriptsProcess() if (!cSource->IsAlive()) return; - cSource->GetMotionMaster()->MovementExpired(); cSource->GetMotionMaster()->MoveIdle(); switch (step.script->Movement.MovementType) @@ -889,7 +888,7 @@ void Map::ScriptsProcess() cSource->GetMotionMaster()->MoveRandom((float)step.script->Movement.MovementDistance); break; case WAYPOINT_MOTION_TYPE: - cSource->GetMotionMaster()->MovePath(step.script->Movement.Path, false); + cSource->GetMotionMaster()->MoveWaypoint(step.script->Movement.Path, false); break; } } diff --git a/src/server/game/Scripting/ScriptDefines/ElunaScript.cpp b/src/server/game/Scripting/ScriptDefines/ALEScript.cpp index fbaa7af765..5597a2be06 100644 --- a/src/server/game/Scripting/ScriptDefines/ElunaScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ALEScript.cpp @@ -15,12 +15,12 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "ElunaScript.h" +#include "ALEScript.h" #include "ScriptMgr.h" -ElunaScript::ElunaScript(const char* name) : ScriptObject(name) +ALEScript::ALEScript(const char* name) : ScriptObject(name) { - ScriptRegistry<ElunaScript>::AddScript(this); + ScriptRegistry<ALEScript>::AddScript(this); } -template class AC_GAME_API ScriptRegistry<ElunaScript>; +template class AC_GAME_API ScriptRegistry<ALEScript>; diff --git a/src/server/game/Scripting/ScriptDefines/ElunaScript.h b/src/server/game/Scripting/ScriptDefines/ALEScript.h index da028a7baf..ce1f4a0f40 100644 --- a/src/server/game/Scripting/ScriptDefines/ElunaScript.h +++ b/src/server/game/Scripting/ScriptDefines/ALEScript.h @@ -15,15 +15,15 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef SCRIPT_OBJECT_ELUNA_SCRIPT_H_ -#define SCRIPT_OBJECT_ELUNA_SCRIPT_H_ +#ifndef SCRIPT_OBJECT_ALE_SCRIPT_H_ +#define SCRIPT_OBJECT_ALE_SCRIPT_H_ #include "ScriptObject.h" -class ElunaScript : public ScriptObject +class ALEScript : public ScriptObject { protected: - ElunaScript(const char* name); + ALEScript(const char* name); public: /** diff --git a/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h b/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h index 9196c32845..085bde5732 100644 --- a/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h +++ b/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h @@ -39,7 +39,7 @@ #include "CreatureScript.h" #include "DatabaseScript.h" #include "DynamicObjectScript.h" -#include "ElunaScript.h" +#include "ALEScript.h" #include "FormulaScript.h" #include "GameEventScript.h" #include "GameObjectScript.h" diff --git a/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp b/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp index 6d3429606f..cb49812abc 100644 --- a/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AreaTriggerScript.cpp @@ -16,7 +16,7 @@ */ #include "AreaTriggerScript.h" -#include "ElunaScript.h" +#include "ALEScript.h" #include "Player.h" #include "ScriptMgr.h" #include "ScriptMgrMacros.h" @@ -26,7 +26,7 @@ bool ScriptMgr::OnAreaTrigger(Player* player, AreaTrigger const* trigger) ASSERT(player); ASSERT(trigger); - auto ret = IsValidBoolScript<ElunaScript>([&](ElunaScript* script) + auto ret = IsValidBoolScript<ALEScript>([&](ALEScript* script) { return script->CanAreaTrigger(player, trigger); }); diff --git a/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp b/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp index 5232ae0ca4..e1929daabe 100644 --- a/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WeatherScript.cpp @@ -16,7 +16,7 @@ */ #include "WeatherScript.h" -#include "ElunaScript.h" +#include "ALEScript.h" #include "ScriptMgr.h" #include "ScriptMgrMacros.h" @@ -24,7 +24,7 @@ void ScriptMgr::OnWeatherChange(Weather* weather, WeatherState state, float grad { ASSERT(weather); - ExecuteScript<ElunaScript>([&](ElunaScript* script) + ExecuteScript<ALEScript>([&](ALEScript* script) { script->OnWeatherChange(weather, state, grade); }); diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 3a78145cab..2fc4b86b50 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -127,7 +127,7 @@ void ScriptMgr::Unload() SCR_CLEAR<CreatureScript>(); SCR_CLEAR<DatabaseScript>(); SCR_CLEAR<DynamicObjectScript>(); - SCR_CLEAR<ElunaScript>(); + SCR_CLEAR<ALEScript>(); SCR_CLEAR<FormulaScript>(); SCR_CLEAR<GameEventScript>(); SCR_CLEAR<GameObjectScript>(); diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 498dafb907..c618303b42 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -19,6 +19,7 @@ #define AllPackets_h__ #include "BankPackets.h" +#include "CalendarPackets.h" #include "CharacterPackets.h" #include "ChatPackets.h" #include "CombatLogPackets.h" diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp new file mode 100644 index 0000000000..5710c0ff0d --- /dev/null +++ b/src/server/game/Server/Packets/CalendarPackets.cpp @@ -0,0 +1,41 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 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 Affero 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 "CalendarPackets.h" + +void WorldPackets::Calendar::GetEvent::Read() +{ + _worldPacket >> EventId; +} + +void WorldPackets::Calendar::GuildFilter::Read() +{ + _worldPacket >> MinimumLevel; + _worldPacket >> MaximumLevel; + _worldPacket >> MinimumRank; +} + +void WorldPackets::Calendar::ArenaTeam::Read() +{ + _worldPacket >> ArenaTeamId; +} + +void WorldPackets::Calendar::CalendarComplain::Read() +{ + _worldPacket >> EventId; + _worldPacket >> ComplainGuid; +} diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h new file mode 100644 index 0000000000..cfba1f1464 --- /dev/null +++ b/src/server/game/Server/Packets/CalendarPackets.h @@ -0,0 +1,73 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 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 Affero 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/>. + */ + +#ifndef CalendarPackets_h__ +#define CalendarPackets_h__ + +#include "Guild.h" +#include "Packet.h" + +namespace WorldPackets +{ + namespace Calendar + { + class GetEvent final : public ClientPacket + { + public: + GetEvent(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_GET_EVENT, std::move(packet)) {} + + void Read() override; + + uint64 EventId = 0; + }; + + class GuildFilter final : public ClientPacket + { + public: + GuildFilter(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_GUILD_FILTER, std::move(packet)) {} + + void Read() override; + + uint32 MinimumLevel = 1; + uint32 MaximumLevel = 1; + uint32 MinimumRank = GR_GUILDMASTER; + }; + + class ArenaTeam final : public ClientPacket + { + public: + ArenaTeam(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_ARENA_TEAM, std::move(packet)) {} + + void Read() override; + + uint32 ArenaTeamId = 0; + }; + + class CalendarComplain final : public ClientPacket + { + public: + CalendarComplain(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_COMPLAIN, std::move(packet)) {} + + void Read() override; + + uint64 EventId = 0; + ObjectGuid ComplainGuid; + }; + } +} + +#endif // CalendarPackets_h__ diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 1098453813..4ff462fe0b 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -140,3 +140,31 @@ WorldPacket const* WorldPackets::Misc::UITime::Write() return &_worldPacket; } + +void WorldPackets::Misc::Complain::Read() +{ + _worldPacket >> SpamType; // 0 - mail, 1 - chat + _worldPacket >> SpammerGuid; + switch (SpamType) + { + case 0: + _worldPacket >> Unk1; // const 0 + _worldPacket >> Unk2; // probably mail id + _worldPacket >> Unk3; // const 0 + break; + case 1: + _worldPacket >> Unk1; // probably language + _worldPacket >> Unk2; // message type? + _worldPacket >> Unk3; // probably channel id + _worldPacket >> Unk4; // unk random value + _worldPacket >> Description; // spam description string (messagetype, channel name, player name, message) + break; + } +} + +WorldPacket const* WorldPackets::Misc::ComplainResult::Write() +{ + _worldPacket << Unk; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 7453ad7fc4..0c9f66f959 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -210,6 +210,32 @@ namespace WorldPackets uint32 Time = 0; }; + + class Complain final : public ClientPacket + { + public: + Complain(WorldPacket&& packet) : ClientPacket(CMSG_COMPLAIN, std::move(packet)) {} + + void Read() override; + + uint8 SpamType = 0; // 0 - mail, 1 - chat + ObjectGuid SpammerGuid; + uint32 Unk1 = 0; + uint32 Unk2 = 0; + uint32 Unk3 = 0; + uint32 Unk4 = 0; + std::string Description = ""; + }; + + class ComplainResult final : public ServerPacket + { + public: + ComplainResult() : ServerPacket(SMSG_COMPLAIN_RESULT, 1) {} + + WorldPacket const* Write() override; + + uint8 Unk = 0; + }; } } diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp index 8028bce25c..860c4d4b7a 100644 --- a/src/server/game/Server/Packets/PetPackets.cpp +++ b/src/server/game/Server/Packets/PetPackets.cpp @@ -50,3 +50,19 @@ WorldPacket const* WorldPackets::Pet::PetUnlearnedSpell::Write() _worldPacket << uint32(SpellID); return &_worldPacket; } + +WorldPacket const* WorldPackets::Pet::PetActionSound::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << int32(Action); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Pet::PetDismissSound::Write() +{ + _worldPacket << int32(ModelId); + _worldPacket << float(ModelPosition.x); + _worldPacket << float(ModelPosition.y); + _worldPacket << float(ModelPosition.z); + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h index cbb96db700..f11f88e5b0 100644 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -20,6 +20,7 @@ #include "ObjectGuid.h" #include "Packet.h" +#include "G3D/Vector3.h" namespace WorldPackets { @@ -94,6 +95,30 @@ namespace WorldPackets void Read() override { } }; + + class PetActionSound final : public ServerPacket + { + public: + PetActionSound(ObjectGuid unitGUID, int32 action) + : ServerPacket(SMSG_PET_ACTION_SOUND, 8 + 4), UnitGUID(unitGUID), Action(action) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + int32 Action = 0; + }; + + class PetDismissSound final : public ServerPacket + { + public: + PetDismissSound(int32 modelId, G3D::Vector3 modelPosition) + : ServerPacket(SMSG_PET_DISMISS_SOUND, 4 + 12), ModelId(modelId), ModelPosition(modelPosition) { } + + WorldPacket const* Write() override; + + int32 ModelId = 0; + G3D::Vector3 ModelPosition; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 11b0a90057..84cbe96ede 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -363,7 +363,7 @@ void OpcodeTable::Initialize() /*0x0E8*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_MOVE_ROOT, STATUS_NEVER); /*0x0E9*/ DEFINE_HANDLER(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); /*0x0EA*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_MOVE_UNROOT, STATUS_NEVER); - /*0x0EB*/ DEFINE_HANDLER(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck ); + /*0x0EB*/ DEFINE_HANDLER(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck ); /*0x0EC*/ DEFINE_HANDLER(MSG_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x0ED*/ DEFINE_HANDLER(MSG_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x0EE*/ DEFINE_HANDLER(MSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes ); @@ -374,7 +374,7 @@ void OpcodeTable::Initialize() /*0x0F3*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_NORMAL_FALL, STATUS_NEVER); /*0x0F4*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVER, STATUS_NEVER); /*0x0F5*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER); - /*0x0F6*/ DEFINE_HANDLER(CMSG_MOVE_HOVER_ACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveFlagChangeOpcode ); + /*0x0F6*/ DEFINE_HANDLER(CMSG_MOVE_HOVER_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveFlagChangeOpcode ); /*0x0F7*/ DEFINE_SERVER_OPCODE_HANDLER(MSG_MOVE_HOVER, STATUS_NEVER); /*0x0F8*/ DEFINE_HANDLER(CMSG_TRIGGER_CINEMATIC_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x0F9*/ DEFINE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -1245,7 +1245,7 @@ void OpcodeTable::Initialize() /*0x45A*/ DEFINE_HANDLER(MSG_MOVE_SET_PITCH_RATE_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x45B*/ DEFINE_HANDLER(MSG_MOVE_SET_PITCH_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x45C*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_PITCH_RATE_CHANGE, STATUS_NEVER); - /*0x45D*/ DEFINE_HANDLER(CMSG_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + /*0x45D*/ DEFINE_HANDLER(CMSG_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); /*0x45E*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_SET_PITCH_RATE, STATUS_NEVER); /*0x45F*/ DEFINE_HANDLER(CMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x460*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_NEVER); @@ -1359,9 +1359,9 @@ void OpcodeTable::Initialize() /*0x4CC*/ DEFINE_HANDLER(CMSG_END_BATTLEFIELD_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x4CD*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_NEVER); /*0x4CE*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_NEVER); - /*0x4CF*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + /*0x4CF*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveFlagChangeOpcode ); /*0x4D0*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_ENABLE, STATUS_NEVER); - /*0x4D1*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_ENABLE_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + /*0x4D1*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_ENABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveFlagChangeOpcode ); /*0x4D2*/ DEFINE_SERVER_OPCODE_HANDLER(MSG_MOVE_GRAVITY_CHNG, STATUS_NEVER); /*0x4D3*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_DISABLE, STATUS_NEVER); /*0x4D4*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_ENABLE, STATUS_NEVER); @@ -1431,7 +1431,7 @@ void OpcodeTable::Initialize() /*0x514*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_ALL_COMBAT_LOG, STATUS_NEVER); /*0x515*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_LFG_DUNGEON_FINDER, STATUS_NEVER); /*0x516*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HGT, STATUS_NEVER); - /*0x517*/ DEFINE_HANDLER(CMSG_MOVE_SET_COLLISION_HGT_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + /*0x517*/ DEFINE_HANDLER(CMSG_MOVE_SET_COLLISION_HGT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck ); /*0x518*/ DEFINE_HANDLER(MSG_MOVE_SET_COLLISION_HGT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x519*/ DEFINE_HANDLER(CMSG_CLEAR_RANDOM_BG_WIN_TIME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x51A*/ DEFINE_HANDLER(CMSG_CLEAR_HOLIDAY_BG_WIN_TIME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 412d1a9f63..5ac8895c68 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1510,3 +1510,9 @@ void WorldSession::InitializeSessionCallback(CharacterDatabaseQueryHolder const& SendClientCacheVersion(clientCacheVersion); SendTutorialsData(); } + +void WorldSession::SetPacketLogging(bool state) +{ + if (m_Socket) + m_Socket->SetPacketLogging(state); +} diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8f0a8fd59d..feacafb69f 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -150,6 +150,7 @@ namespace WorldPackets { class MinimapPingClient; class RandomRollClient; + class Complain; } namespace Pet @@ -189,6 +190,14 @@ namespace WorldPackets class ItemRefundInfo; class ItemRefund; } + + namespace Calendar + { + class GetEvent; + class GuildFilter; + class ArenaTeam; + class CalendarComplain; + } } enum AccountDataType @@ -619,7 +628,6 @@ public: // opcodes handlers void HandlePlayedTime(WorldPackets::Character::PlayedTimeClient& packet); // new - void HandleMoveUnRootAck(WorldPacket& recvPacket); void HandleMoveRootAck(WorldPacket& recvPacket); // new inspect @@ -1036,7 +1044,7 @@ public: // opcodes handlers void HandleAreaSpiritHealerQueueOpcode(WorldPacket& recvData); void HandleCancelMountAuraOpcode(WorldPacket& recvData); void HandleSelfResOpcode(WorldPacket& recvData); - void HandleComplainOpcode(WorldPacket& recvData); + void HandleComplainOpcode(WorldPackets::Misc::Complain& packet); void HandleRequestPetInfo(WorldPackets::Pet::RequestPetInfo& packet); // Socket gem @@ -1073,9 +1081,9 @@ public: // opcodes handlers // Calendar void HandleCalendarGetCalendar(WorldPacket& recvData); - void HandleCalendarGetEvent(WorldPacket& recvData); - void HandleCalendarGuildFilter(WorldPacket& recvData); - void HandleCalendarArenaTeam(WorldPacket& recvData); + void HandleCalendarGetEvent(WorldPackets::Calendar::GetEvent& packet); + void HandleCalendarGuildFilter(WorldPackets::Calendar::GuildFilter& packet); + void HandleCalendarArenaTeam(WorldPackets::Calendar::ArenaTeam& packet); void HandleCalendarAddEvent(WorldPacket& recvData); void HandleCalendarUpdateEvent(WorldPacket& recvData); void HandleCalendarRemoveEvent(WorldPacket& recvData); @@ -1085,7 +1093,7 @@ public: // opcodes handlers void HandleCalendarEventRemoveInvite(WorldPacket& recvData); void HandleCalendarEventStatus(WorldPacket& recvData); void HandleCalendarEventModeratorStatus(WorldPacket& recvData); - void HandleCalendarComplain(WorldPacket& recvData); + void HandleCalendarComplain(WorldPackets::Calendar::CalendarComplain& packet); void HandleCalendarGetNumPending(WorldPacket& recvData); void HandleCalendarEventSignup(WorldPacket& recvData); @@ -1130,6 +1138,8 @@ public: // opcodes handlers void InitializeSession(); void InitializeSessionCallback(CharacterDatabaseQueryHolder const& realmHolder, uint32 clientCacheVersion); + void SetPacketLogging(bool state); + private: void ProcessQueryCallbacks(); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 51705d18e0..0641744e8d 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -117,7 +117,7 @@ void EncryptableAndCompressiblePacket::CompressIfNeeded() } WorldSocket::WorldSocket(tcp::socket&& socket) - : Socket(std::move(socket)), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _sendBufferSize(4096) + : Socket(std::move(socket)), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _sendBufferSize(4096), _loggingPackets(false) { Acore::Crypto::GetRandomBytes(_authSeed); _headerBuffer.Resize(sizeof(ClientPktHeader)); @@ -406,7 +406,7 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() WorldPacket packet(opcode, std::move(_packetBuffer)); WorldPacket* packetToQueue; - if (sPacketLog->CanLogPacket()) + if (sPacketLog->CanLogPacket() && IsLoggingPackets()) sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort()); std::unique_lock<std::mutex> sessionGuard(_worldSessionLock, std::defer_lock); @@ -520,7 +520,7 @@ void WorldSocket::SendPacket(WorldPacket const& packet) if (!IsOpen()) return; - if (sPacketLog->CanLogPacket()) + if (sPacketLog->CanLogPacket() && IsLoggingPackets()) sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort()); _bufferQueue.Enqueue(new EncryptableAndCompressiblePacket(packet, _authCrypt.IsInitialized())); diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index aa65dfa093..56313fd407 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -85,6 +85,9 @@ public: void SetSendBufferSize(std::size_t sendBufferSize) { _sendBufferSize = sendBufferSize; } + bool IsLoggingPackets() const { return _loggingPackets; } + void SetPacketLogging(bool state) { _loggingPackets = state; } + protected: void OnClose() override; void ReadHandler() override; @@ -133,6 +136,8 @@ private: QueryCallbackProcessor _queryProcessor; std::string _ipCountry; + + bool _loggingPackets; }; #endif diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index eb470bd9e3..91d1f92835 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -3002,12 +3002,12 @@ void AuraEffect::HandleAuraModDisarm(AuraApplication const* aurApp, uint8 mode, { if (Item* pItem = target->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) { - uint8 attacktype = Player::GetAttackBySlot(slot); + WeaponAttackType attacktype = Player::GetAttackBySlot(slot); if (attacktype < MAX_ATTACK) { target->ToPlayer()->_ApplyWeaponDamage(slot, pItem->GetTemplate(), nullptr, !apply); - target->ToPlayer()->_ApplyWeaponDependentAuraMods(pItem, WeaponAttackType(attacktype), !apply); + target->ToPlayer()->_ApplyWeaponDependentAuraMods(pItem, attacktype, !apply); } } } @@ -6177,7 +6177,7 @@ void AuraEffect::HandleAuraSetVehicle(AuraApplication const* aurApp, uint8 mode, if (apply) { data.Initialize(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0); - target->ToPlayer()->GetSession()->SendPacket(&data); + target->ToPlayer()->SendDirectMessage(&data); } } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4ae8bfca43..5c7407633a 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2392,7 +2392,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= targetInfo.reflectResult = SPELL_MISS_PARRY; // Increase time interval for reflected spells by 1.5 - m_caster->m_Events.AddEvent(new ReflectEvent(m_caster, targetInfo.targetGUID, m_spellInfo), m_caster->m_Events.CalculateTime(targetInfo.timeDelay)); + m_caster->m_Events.AddEventAtOffset(new ReflectEvent(m_caster, targetInfo.targetGUID, m_spellInfo), Milliseconds(targetInfo.timeDelay)); targetInfo.timeDelay += targetInfo.timeDelay >> 1; m_spellFlags |= SPELL_FLAG_REFLECTED; @@ -3439,7 +3439,7 @@ SpellCastResult Spell::prepare(SpellCastTargets const* targets, AuraEffect const // create and add update event for this spell _spellEvent = new SpellEvent(this); - m_caster->m_Events.AddEvent(_spellEvent, m_caster->m_Events.CalculateTime(1)); + m_caster->m_Events.AddEventAtOffset(_spellEvent, 1ms); if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, m_caster)) { @@ -4612,7 +4612,7 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas WorldPacket data(SMSG_CAST_FAILED, 1 + 4 + 1); WriteCastResultInfo(data, caster, spellInfo, castCount, result, customError); - caster->GetSession()->SendPacket(&data); + caster->SendDirectMessage(&data); } void Spell::SendCastResult(SpellCastResult result) @@ -4649,7 +4649,7 @@ void Spell::SendPetCastResult(SpellCastResult result) WorldPacket data(SMSG_PET_CAST_FAILED, 1 + 4 + 1); WriteCastResultInfo(data, player, m_spellInfo, m_cast_count, result, m_customError); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void Spell::SendSpellStart() @@ -5184,7 +5184,7 @@ void Spell::SendResurrectRequest(Player* target) // override delay sent with SMSG_CORPSE_RECLAIM_DELAY, set instant resurrection for spells with this attribute if (m_spellInfo->HasAttribute(SPELL_ATTR3_NO_RES_TIMER)) data << uint32(0); - target->GetSession()->SendPacket(&data); + target->SendDirectMessage(&data); } void Spell::TakeCastItem() @@ -8166,7 +8166,7 @@ bool SpellEvent::IsDeletable() const return m_Spell->IsDeletable(); } -bool ReflectEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) +bool ReflectEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { Unit* target = ObjectAccessor::GetUnit(*_caster, _targetGUID); if (target && _caster->IsInMap(target)) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d8dcba2d5b..7e44054907 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2429,8 +2429,14 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) } break; } - case SUMMON_TYPE_JEEVES: case SUMMON_TYPE_MINIPET: + // For companions, recalculate the position to ensure they spawn at the intended π/4 angle. + destTarget->Relocate(m_originalCaster->GetNearPosition( + m_originalCaster->GetDistance2d(destTarget->GetPositionX(), destTarget->GetPositionY()), + MINI_PET_SUMMON_ANGLE + )); + [[fallthrough]]; + case SUMMON_TYPE_JEEVES: { summon = m_caster->GetMap()->SummonCreature(entry, *destTarget, properties, duration, m_originalCaster, m_spellInfo->Id, 0, personalSpawn); if (!summon || !summon->HasUnitTypeMask(UNIT_MASK_MINION)) @@ -2446,8 +2452,9 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) //summon->AI()->EnterEvadeMode(); if (properties->Type != SUMMON_TYPE_JEEVES) { + summon->SetFacingToObject(m_originalCaster); summon->GetMotionMaster()->Clear(false); - summon->GetMotionMaster()->MoveFollow(m_originalCaster, PET_FOLLOW_DIST, summon->GetFollowAngle(), MOTION_SLOT_ACTIVE); + summon->GetMotionMaster()->MoveFollow(m_originalCaster, PET_FOLLOW_DIST, MINI_PET_FOLLOW_ANGLE, MOTION_SLOT_ACTIVE); } break; } @@ -4155,8 +4162,8 @@ void Spell::EffectDuel(SpellEffIndex effIndex) WorldPacket data(SMSG_DUEL_REQUESTED, 8 + 8); data << pGameObj->GetGUID(); data << caster->GetGUID(); - caster->GetSession()->SendPacket(&data); - target->GetSession()->SendPacket(&data); + caster->SendDirectMessage(&data); + target->SendDirectMessage(&data); // create duel-info bool isMounted = (GetSpellInfo()->Id == 62875); @@ -4238,7 +4245,7 @@ void Spell::EffectSummonPlayer(SpellEffIndex /*effIndex*/) data << m_caster->GetGUID(); // summoner guid data << uint32(m_caster->GetZoneId()); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY * IN_MILLISECONDS); // auto decline after msecs - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } void Spell::EffectActivateObject(SpellEffIndex effIndex) @@ -5206,7 +5213,7 @@ void Spell::EffectResurrectPet(SpellEffIndex /*effIndex*/) { // Position passed to SummonPet is irrelevant with current implementation, // pet will be relocated without using these coords in Pet::LoadPetFromDB - player->SummonPet(0, 0.0f, 0.0f, 0.0f, 0.0f, SUMMON_PET, 0s, damage); + player->SummonPet(0, 0.0f, 0.0f, 0.0f, 0.0f, SUMMON_PET, 0ms, damage); return; } @@ -6338,5 +6345,5 @@ void Spell::EffectSummonRaFFriend(SpellEffIndex /*effIndex*/) data << m_caster->GetGUID(); data << uint32(m_caster->GetZoneId()); data << uint32(MAX_PLAYER_SUMMON_DELAY * IN_MILLISECONDS); // auto decline after msecs - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 64a25a2b4a..9c16e15d22 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1824,7 +1824,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta { if (Player const* player = unitTarget->ToPlayer()) { - if (player->GetWeaponForAttack(WeaponAttackType(BASE_ATTACK + i), true)) + if (player->GetWeaponForAttack(WeaponAttackType(i), true)) { valid = true; break; diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 9873af3253..77057e7988 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -5151,6 +5151,18 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT; }); + // Earth Shield + ApplySpellFix({ 55599, 58981 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx5 |= SPELL_ATTR5_LIMIT_N; + }); + + // Acid Splash + ApplySpellFix({ 52446, 59363 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index c471c78154..4dea787d86 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -83,7 +83,7 @@ void CreatureTextMgr::LoadCreatureTexts() uint32 oldMSTime = getMSTime(); mTextMap.clear(); // for reload case - mTextRepeatMap.clear(); //reset all currently used temp texts + //all currently used temp texts are NOT reset WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_TEXT); PreparedQueryResult result = WorldDatabase.Query(stmt); @@ -218,7 +218,7 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject } CreatureTextGroup const& textGroupContainer = itr->second; //has all texts in the group - CreatureTextRepeatIds repeatGroup = GetRepeatGroup(source, textGroup);//has all textIDs from the group that were already said + CreatureTextRepeatIds repeatGroup = source->GetTextRepeatGroup(textGroup);//has all textIDs from the group that were already said CreatureTextGroup tempGroup;//will use this to talk after sorting repeatGroup for (CreatureTextGroup::const_iterator giter = textGroupContainer.begin(); giter != textGroupContainer.end(); ++giter) @@ -227,52 +227,14 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject if (tempGroup.empty()) { - CreatureTextRepeatMap::iterator mapItr = mTextRepeatMap.find(source->GetGUID()); - if (mapItr != mTextRepeatMap.end()) - { - CreatureTextRepeatGroup::iterator groupItr = mapItr->second.find(textGroup); - groupItr->second.clear(); - } - + source->ClearTextRepeatGroup(textGroup); tempGroup = textGroupContainer; } - uint8 count = 0; - float lastChance = -1; - bool isEqualChanced = true; - - float totalChance = 0; - - for (CreatureTextGroup::const_iterator iter = tempGroup.begin(); iter != tempGroup.end(); ++iter) - { - if (lastChance >= 0 && lastChance != iter->probability) - isEqualChanced = false; - - lastChance = iter->probability; - totalChance += iter->probability; - ++count; - } - - int32 offset = -1; - if (!isEqualChanced) + auto iter = Acore::Containers::SelectRandomWeightedContainerElement(tempGroup, [](CreatureTextEntry const& t) -> double { - for (CreatureTextGroup::const_iterator iter = tempGroup.begin(); iter != tempGroup.end(); ++iter) - { - uint32 chance = uint32(iter->probability); - uint32 r = urand(0, 100); - ++offset; - if (r <= chance) - break; - } - } - - uint32 pos = 0; - if (isEqualChanced || offset < 0) - pos = urand(0, count - 1); - else if (offset >= 0) - pos = offset; - - CreatureTextGroup::const_iterator iter = tempGroup.begin() + pos; + return t.probability; + }); ChatMsg finalType = (msgType == CHAT_MSG_ADDON) ? iter->type : msgType; Language finalLang = (language == LANG_ADDON) ? iter->lang : language; @@ -301,9 +263,8 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject CreatureTextBuilder builder(finalSource, finalSource->getGender(), finalType, iter->group, iter->id, finalLang, target); SendChatPacket(finalSource, builder, finalType, target, range, teamId, gmOnly); } - if (isEqualChanced || (!isEqualChanced && totalChance == 100.0f)) - SetRepeatId(source, textGroup, iter->id); + source->SetTextRepeatId(textGroup, iter->id); return iter->duration; } @@ -348,7 +309,7 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* if (!target || !target->IsPlayer()) return; - target->ToPlayer()->GetSession()->SendPacket(data); + target->ToPlayer()->SendDirectMessage(data); return; } break; @@ -365,7 +326,7 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* Map::PlayerList const& players = source->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (itr->GetSource()->GetAreaId() == areaId && (teamId == TEAM_NEUTRAL || itr->GetSource()->GetTeamId() == teamId) && (!gmOnly || itr->GetSource()->IsGameMaster())) - itr->GetSource()->GetSession()->SendPacket(data); + itr->GetSource()->SendDirectMessage(data); return; } case TEXT_RANGE_ZONE: @@ -374,7 +335,7 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* Map::PlayerList const& players = source->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (itr->GetSource()->GetZoneId() == zoneId && (teamId == TEAM_NEUTRAL || itr->GetSource()->GetTeamId() == teamId) && (!gmOnly || itr->GetSource()->IsGameMaster())) - itr->GetSource()->GetSession()->SendPacket(data); + itr->GetSource()->SendDirectMessage(data); return; } case TEXT_RANGE_MAP: @@ -382,7 +343,7 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* Map::PlayerList const& players = source->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if ((teamId == TEAM_NEUTRAL || itr->GetSource()->GetTeamId() == teamId) && (!gmOnly || itr->GetSource()->IsGameMaster())) - itr->GetSource()->GetSession()->SendPacket(data); + itr->GetSource()->SendDirectMessage(data); return; } case TEXT_RANGE_WORLD: @@ -391,7 +352,7 @@ void CreatureTextMgr::SendNonChatPacket(WorldObject* source, WorldPacket const* for (WorldSessionMgr::SessionMap::const_iterator itr = sessionMap.begin(); itr != sessionMap.end(); ++itr) if (Player* player = itr->second->GetPlayer()) if ((teamId == TEAM_NEUTRAL || player->GetTeamId() == teamId) && (!gmOnly || player->IsGameMaster())) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); return; } case TEXT_RANGE_NORMAL: @@ -410,34 +371,6 @@ void CreatureTextMgr::SendEmote(Unit* source, uint32 emote) source->HandleEmoteCommand(emote); } -void CreatureTextMgr::SetRepeatId(Creature* source, uint8 textGroup, uint8 id) -{ - if (!source) - return; - - CreatureTextRepeatIds& repeats = mTextRepeatMap[source->GetGUID()][textGroup]; - if (std::find(repeats.begin(), repeats.end(), id) == repeats.end()) - repeats.push_back(id); - else - LOG_ERROR("sql.sql", "CreatureTextMgr: TextGroup {} for Creature {} ({}), id {} already added", - uint32(textGroup), source->GetName(), source->GetGUID().ToString(), uint32(id)); -} - -CreatureTextRepeatIds CreatureTextMgr::GetRepeatGroup(Creature* source, uint8 textGroup) -{ - ASSERT(source);//should never happen - CreatureTextRepeatIds ids; - - CreatureTextRepeatMap::const_iterator mapItr = mTextRepeatMap.find(source->GetGUID()); - if (mapItr != mTextRepeatMap.end()) - { - CreatureTextRepeatGroup::const_iterator groupItr = (*mapItr).second.find(textGroup); - if (groupItr != mapItr->second.end()) - ids = groupItr->second; - } - return ids; -} - bool CreatureTextMgr::TextExist(uint32 sourceEntry, uint8 textGroup) { if (!sourceEntry) diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index d84d91c8dd..569de95867 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -77,11 +77,6 @@ typedef std::unordered_map<uint32, CreatureTextHolder> CreatureTextMap; // a typedef std::map<CreatureTextId, CreatureTextLocale> LocaleCreatureTextMap; -//used for handling non-repeatable random texts -typedef std::vector<uint8> CreatureTextRepeatIds; -typedef std::unordered_map<uint8, CreatureTextRepeatIds> CreatureTextRepeatGroup; -typedef std::unordered_map<ObjectGuid, CreatureTextRepeatGroup> CreatureTextRepeatMap;//guid based - class CreatureTextMgr { CreatureTextMgr() { } @@ -105,14 +100,10 @@ public: template<class Builder> void SendChatPacket(WorldObject* source, Builder const& builder, ChatMsg msgType, WorldObject const* target = nullptr, CreatureTextRange range = TEXT_RANGE_NORMAL, TeamId teamId = TEAM_NEUTRAL, bool gmOnly = false) const; private: - CreatureTextRepeatIds GetRepeatGroup(Creature* source, uint8 textGroup); - void SetRepeatId(Creature* source, uint8 textGroup, uint8 id); - void SendNonChatPacket(WorldObject* source, WorldPacket const* data, ChatMsg msgType, WorldObject const* target, CreatureTextRange range, TeamId teamId, bool gmOnly) const; float GetRangeForChatType(ChatMsg msgType) const; CreatureTextMap mTextMap; - CreatureTextRepeatMap mTextRepeatMap; LocaleCreatureTextMap mLocaleTextMap; }; diff --git a/src/server/game/Time/UpdateTime.cpp b/src/server/game/Time/UpdateTime.cpp index 3b584a6155..cebb105df0 100644 --- a/src/server/game/Time/UpdateTime.cpp +++ b/src/server/game/Time/UpdateTime.cpp @@ -162,7 +162,7 @@ void WorldUpdateTime::SetRecordUpdateTimeInterval(Milliseconds t) void WorldUpdateTime::RecordUpdateTime(Milliseconds gameTimeMs, uint32 diff, uint32 sessionCount) { - if (_recordUpdateTimeInverval > 0s && diff > _recordUpdateTimeMin.count()) + if (_recordUpdateTimeInverval > 0ms && diff > _recordUpdateTimeMin.count()) { if (GetMSTimeDiff(_lastRecordTime, gameTimeMs) > _recordUpdateTimeInverval) { diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index eedd61eaf4..7ee1b6f6d7 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -85,6 +85,9 @@ void WorldConfig::BuildConfigCache() SetConfigValue<float>(RATE_BUYVALUE_ITEM_HEIRLOOM, "Rate.BuyValue.Item.Heirloom", 1.0f); SetConfigValue<float>(RATE_REPUTATION_GAIN, "Rate.Reputation.Gain", 1.0f); + SetConfigValue<float>(RATE_REPUTATION_GAIN_AB, "Rate.Reputation.Gain.AB", 1.0f); + SetConfigValue<float>(RATE_REPUTATION_GAIN_AV, "Rate.Reputation.Gain.AV", 1.0f); + SetConfigValue<float>(RATE_REPUTATION_GAIN_WSG, "Rate.Reputation.Gain.WSG", 1.0f); SetConfigValue<float>(RATE_REPUTATION_LOWLEVEL_KILL, "Rate.Reputation.LowLevel.Kill", 1.0f); SetConfigValue<float>(RATE_REPUTATION_LOWLEVEL_QUEST, "Rate.Reputation.LowLevel.Quest", 1.0f); SetConfigValue<float>(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, "Rate.Reputation.RecruitAFriendBonus", 0.1f); diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index ce089b65a3..f076d0b293 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -437,6 +437,9 @@ enum ServerConfigs RATE_XP_PET_NEXT_LEVEL, RATE_REPAIRCOST, RATE_REPUTATION_GAIN, + RATE_REPUTATION_GAIN_AB, + RATE_REPUTATION_GAIN_AV, + RATE_REPUTATION_GAIN_WSG, RATE_REPUTATION_LOWLEVEL_KILL, RATE_REPUTATION_LOWLEVEL_QUEST, RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, diff --git a/src/server/game/World/WorldState.cpp b/src/server/game/World/WorldState.cpp index ebb11b8bfe..d715950d24 100644 --- a/src/server/game/World/WorldState.cpp +++ b/src/server/game/World/WorldState.cpp @@ -852,7 +852,7 @@ void WorldState::HandleSunsReachSubPhaseTransition(int32 subPhaseMask, bool init if (!initial) { std::lock_guard<std::mutex> guard(m_sunsReachData.m_sunsReachReclamationMutex); - for (ObjectGuid& guid : m_sunsReachData.m_sunsReachReclamationPlayers) + for (ObjectGuid const& guid : m_sunsReachData.m_sunsReachReclamationPlayers) if (Player* player = ObjectAccessor::FindPlayer(guid)) { if (start) @@ -1778,7 +1778,7 @@ bool WorldState::SummonPallid(Map* map, ScourgeInvasionData::CityAttack& zone, c else pathID = spawnLoc == 0 ? PATH_STORMWIND_KEEP : PATH_STORMWIND_TRADE_DISTRICT; - pallid->GetMotionMaster()->MovePath(pathID, false); + pallid->GetMotionMaster()->MoveWaypoint(pathID, false); sWorldState->SetPallidGuid(zone.zoneId, pallid->GetGUID()); } diff --git a/src/server/scripts/Commands/cs_arena.cpp b/src/server/scripts/Commands/cs_arena.cpp index 69fa60e562..fe65d83984 100644 --- a/src/server/scripts/Commands/cs_arena.cpp +++ b/src/server/scripts/Commands/cs_arena.cpp @@ -51,7 +51,7 @@ public: { "rename", HandleArenaRenameCommand, SEC_ADMINISTRATOR, Console::Yes }, { "captain", HandleArenaCaptainCommand, SEC_ADMINISTRATOR, Console::No }, { "info", HandleArenaInfoCommand, SEC_GAMEMASTER, Console::Yes }, - { "lookup", HandleArenaLookupCommand, SEC_GAMEMASTER, Console::No }, + { "lookup", HandleArenaLookupCommand, SEC_GAMEMASTER, Console::Yes }, { "season", arenaSeasonCommandTable } }; @@ -209,7 +209,7 @@ public: handler->PSendSysMessage(LANG_ARENA_INFO_HEADER, arena->GetName(), arena->GetId(), arena->GetRating(), arena->GetType(), arena->GetType()); for (auto const& itr : arena->GetMembers()) - handler->PSendSysMessage(LANG_ARENA_INFO_MEMBERS, itr.Name, itr.Guid.ToString(), itr.PersonalRating, (arena->GetCaptain() == itr.Guid ? "- Captain" : "")); + handler->PSendSysMessage(LANG_ARENA_INFO_MEMBERS, itr.Name, itr.Guid.GetCounter(), itr.PersonalRating, (arena->GetCaptain() == itr.Guid ? "Captain" : "")); return true; } @@ -224,17 +224,17 @@ public: { if (StringContainsStringI(team->GetName(), needle)) { - if (handler->GetSession()) - { - handler->PSendSysMessage(LANG_ARENA_LOOKUP, team->GetName(), team->GetId(), team->GetType(), team->GetType()); - found = true; - continue; - } + handler->PSendSysMessage(LANG_ARENA_LOOKUP, team->GetName(), team->GetId(), team->GetType(), team->GetType()); + found = true; + continue; } } if (!found) - handler->PSendSysMessage(LANG_ARENA_ERROR_NAME_NOT_FOUND, std::string(needle)); + { + handler->SendErrorMessage(LANG_ARENA_ERROR_NAME_NOT_FOUND, std::string(needle)); + return false; + } return true; } diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 40bb89b93b..c2891c0d01 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -100,7 +100,8 @@ public: { "dummy", HandleDebugDummyCommand, SEC_ADMINISTRATOR, Console::No }, { "mapdata", HandleDebugMapDataCommand, SEC_ADMINISTRATOR, Console::No }, { "boundary", HandleDebugBoundaryCommand, SEC_ADMINISTRATOR, Console::No }, - { "visibilitydata", HandleDebugVisibilityDataCommand, SEC_ADMINISTRATOR, Console::No } + { "visibilitydata", HandleDebugVisibilityDataCommand, SEC_ADMINISTRATOR, Console::No }, + { "zonestats", HandleDebugZoneStatsCommand, SEC_MODERATOR, Console::Yes} }; static ChatCommandTable commandTable = { @@ -432,7 +433,7 @@ public: } data.hexlike(); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); handler->PSendSysMessage(LANG_COMMAND_OPCODESENT, data.GetOpcode(), unit->GetName()); return true; } @@ -1434,6 +1435,31 @@ public: handler->PSendSysMessage("Zone wide visible objects in zone: {}", zoneWideVisibleObjectsInZone); return true; } + + static bool HandleDebugZoneStatsCommand(ChatHandler* handler, Optional<PlayerIdentifier> playerTarget) + { + if (!playerTarget) + playerTarget = PlayerIdentifier::FromTargetOrSelf(handler); + + if (!playerTarget) + { + handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND); + return false; + } + + Player* player = playerTarget->GetConnectedPlayer(); + + if (!player) + { + handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND); + return false; + } + + uint32 zoneId = player->GetZoneId(); + AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(zoneId); + handler->PSendSysMessage("Player count in zone {} ({}): {}.", zoneId, (zoneEntry ? zoneEntry->area_name[LOCALE_enUS] : "<unknown>"), player->GetMap()->GetPlayerCountInZone(zoneId)); + return true; + } }; void AddSC_debug_commandscript() diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 69fec5a027..3680aea36a 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -100,8 +100,8 @@ public: } else { - canFly = handler->GetSession()->GetPlayer()->CanFly(); - target->SetCanFly(!canFly); + canFly = !handler->GetSession()->GetPlayer()->CanFly(); + target->SetCanFly(canFly); } handler->PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, handler->GetNameLink(target), canFly ? "on" : "off"); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 4ca8b5b37f..ca5cff3dd5 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -193,7 +193,9 @@ public: { "skirmish", HandleSkirmishCommand, SEC_ADMINISTRATOR, Console::No }, { "mailbox", HandleMailBoxCommand, SEC_MODERATOR, Console::No }, { "string", HandleStringCommand, SEC_GAMEMASTER, Console::No }, - { "opendoor", HandleOpenDoorCommand, SEC_GAMEMASTER, Console::No } + { "opendoor", HandleOpenDoorCommand, SEC_GAMEMASTER, Console::No }, + { "bm", HandleBMCommand, SEC_GAMEMASTER, Console::No }, + { "packetlog", HandlePacketLog, SEC_GAMEMASTER, Console::No } }; return commandTable; @@ -485,7 +487,7 @@ public: uint32 queueSlot = 0; WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType(), teamId); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); // Remove from LFG queues sLFGMgr->LeaveAllLfgQueues(player->GetGUID(), false); @@ -504,6 +506,7 @@ public: if (!session) { + handler->SendErrorMessage(LANG_USE_BOL); return false; } @@ -537,9 +540,6 @@ public: SetCommentatorMod(false); return true; } - - handler->SendErrorMessage(LANG_USE_BOL); - return false; } static bool HandleDevCommand(ChatHandler* handler, Optional<bool> enableArg) @@ -548,6 +548,7 @@ public: if (!session) { + handler->SendErrorMessage(LANG_USE_BOL); return false; } @@ -582,9 +583,6 @@ public: SetDevMod(false); return true; } - - handler->SendErrorMessage(LANG_USE_BOL); - return false; } static bool HandleGPSCommand(ChatHandler* handler, Optional<PlayerIdentifier> target) @@ -3069,6 +3067,75 @@ public: handler->SendErrorMessage(LANG_CMD_NO_DOOR_FOUND, range ? *range : 5.0f); return false; } + + static bool HandleBMCommand(ChatHandler* handler, Optional<bool> enableArg) + { + WorldSession* session = handler->GetSession(); + + if (!session) + return false; + + auto SetBMMod = [&](bool enable) + { + char const* enabled = "ON"; + char const* disabled = "OFF"; + handler->SendNotification(LANG_COMMAND_BEASTMASTER_MODE, enable ? enabled : disabled); + + session->GetPlayer()->SetBeastMaster(enable); + }; + + if (!enableArg) + { + if (!AccountMgr::IsPlayerAccount(session->GetSecurity()) && session->GetPlayer()->IsDeveloper()) + SetBMMod(true); + else + SetBMMod(false); + + return true; + } + + if (*enableArg) + { + SetBMMod(true); + return true; + } + else + { + SetBMMod(false); + return true; + } + + handler->SendErrorMessage(LANG_USE_BOL); + return false; + } + + static bool HandlePacketLog(ChatHandler* handler, Optional<bool> enableArg) + { + WorldSession* session = handler->GetSession(); + + if (!session) + return false; + + if (enableArg) + { + if (*enableArg) + { + session->SetPacketLogging(true); + handler->SendNotification(LANG_ON); + return true; + } + else + { + session->SetPacketLogging(false); + handler->SendNotification(LANG_OFF); + return true; + } + } + + handler->SendErrorMessage(LANG_USE_BOL); + return false; + } + }; void AddSC_misc_commandscript() diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp index 20b9fadff5..75813a6a3f 100644 --- a/src/server/scripts/Commands/cs_mmaps.cpp +++ b/src/server/scripts/Commands/cs_mmaps.cpp @@ -29,6 +29,7 @@ #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "MMapFactory.h" +#include "MMapMgr.h" #include "Map.h" #include "PathGenerator.h" #include "Player.h" @@ -136,6 +137,40 @@ public: GridCoord const gridCoord = Acore::ComputeGridCoord(player->GetPositionX(), player->GetPositionY()); handler->PSendSysMessage("{}{}{}.mmtile", player->GetMapId(), gridCoord.x_coord, gridCoord.y_coord); + + std::string fileName = Acore::StringFormat(MMAP::TILE_FILE_NAME_FORMAT, sConfigMgr->GetOption<std::string>("DataDir", "."), player->GetMapId(), gridCoord.x_coord, gridCoord.y_coord); + FILE* file = fopen(fileName.c_str(), "rb"); + if (!file) + { + LOG_DEBUG("maps", "MMAP:loadMap: Could not open mmtile file '{}'", fileName); + return false; + } + + // read header + MmapTileHeader fileHeader; + if (fread(&fileHeader, sizeof(MmapTileHeader), 1, file) != 1 || fileHeader.mmapMagic != MMAP_MAGIC) + { + LOG_ERROR("maps", "MMAP:loadMap: Bad header in mmap {:03}{:02}{:02}.mmtile", player->GetMapId(), gridCoord.x_coord, gridCoord.y_coord); + fclose(file); + return false; + } + fclose(file); + handler->PSendSysMessage("Recast config used:"); + handler->PSendSysMessage("- walkableSlopeAngle: {}", fileHeader.recastConfig.walkableSlopeAngle); + + const float cellHeight = fileHeader.recastConfig.cellSizeVertical; + handler->PSendSysMessage("- walkableHeight: {} ({} units)", fileHeader.recastConfig.walkableHeight * cellHeight, fileHeader.recastConfig.walkableHeight); + handler->PSendSysMessage("- walkableClimb: {} ({} units)", fileHeader.recastConfig.walkableClimb * cellHeight, fileHeader.recastConfig.walkableClimb); + handler->PSendSysMessage("- walkableRadius: {} ({} units)", fileHeader.recastConfig.walkableRadius * cellHeight, fileHeader.recastConfig.walkableRadius); + + handler->PSendSysMessage("- maxSimplificationError: {}", fileHeader.recastConfig.maxSimplificationError); + handler->PSendSysMessage("- vertexPerMapEdge: {}", fileHeader.recastConfig.vertexPerMapEdge); + handler->PSendSysMessage("- vertexPerTileEdge: {}", fileHeader.recastConfig.vertexPerTileEdge); + handler->PSendSysMessage("- tilesPerMapEdge: {}", fileHeader.recastConfig.tilesPerMapEdge); + handler->PSendSysMessage("- baseUnitDim: {}", fileHeader.recastConfig.baseUnitDim); + handler->PSendSysMessage("- cellSizeHorizontal: {}", fileHeader.recastConfig.cellSizeHorizontal); + handler->PSendSysMessage("- cellSizeVertical: {}", fileHeader.recastConfig.cellSizeVertical); + handler->PSendSysMessage("gridloc [{}, {}]", gridCoord.x_coord, gridCoord.y_coord); // calculate navmesh tile location diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 733f88a7a6..20ffbe0e5c 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -328,7 +328,7 @@ public: data << uint8(op); data << uint16(val); data << uint16(mark ? *mark : 65535); - target->GetSession()->SendPacket(&data); + target->SendDirectMessage(&data); return true; } @@ -417,10 +417,10 @@ public: if (CheckModifySpeed(handler, target, allSpeed, 0.1f, 50.0f)) { NotifyModification(handler, target, LANG_YOU_CHANGE_ASPEED, LANG_YOURS_ASPEED_CHANGED, allSpeed); - target->SetSpeed(MOVE_WALK, allSpeed); - target->SetSpeed(MOVE_RUN, allSpeed); - target->SetSpeed(MOVE_SWIM, allSpeed); - target->SetSpeed(MOVE_FLIGHT, allSpeed); + target->SetSpeed(MOVE_WALK, allSpeed, true); + target->SetSpeed(MOVE_RUN, allSpeed, true); + target->SetSpeed(MOVE_SWIM, allSpeed, true); + target->SetSpeed(MOVE_FLIGHT, allSpeed, true); return true; } diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index 84d5db8cbc..5e2a6b8711 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -146,7 +146,7 @@ public: { WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); data << uint32(GMTICKET_RESPONSE_TICKET_DELETED); - submitter->GetSession()->SendPacket(&data); + submitter->SendDirectMessage(&data); ChatHandler(submitter->GetSession()).SendSysMessage(LANG_TICKET_CLOSED); } return true; @@ -259,7 +259,7 @@ public: // Force abandon ticket WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); data << uint32(GMTICKET_RESPONSE_TICKET_DELETED); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } return true; @@ -467,12 +467,18 @@ public: static bool HandleGMTicketResponseAppendCommand(ChatHandler* handler, uint32 ticketId, Tail res) { - return TicketResponseAppend(ticketId, false, handler, res.data()); + if (res.empty()) + return false; + else + return TicketResponseAppend(ticketId, false, handler, res.data()); } static bool HandleGMTicketResponseAppendLnCommand(ChatHandler* handler, uint32 ticketId, Tail res) { - return TicketResponseAppend(ticketId, true, handler, res.data()); + if (res.empty()) + return false; + else + return TicketResponseAppend(ticketId, true, handler, res.data()); } static bool HandleGMTicketResponseDeleteCommand(ChatHandler* handler, uint32 ticketId) diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp index bd71099346..0b534612b8 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp @@ -213,7 +213,7 @@ public: ScriptedAI::EnterEvadeMode(); return; } - events.ScheduleEvent(EVENT_CHECK_RESET, 5000); + events.ScheduleEvent(EVENT_CHECK_RESET, 5s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 214b923550..6d4c64c1d5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -27,12 +27,13 @@ enum IronhandData { - IRONHAND_FLAMES_TIMER = 16000, - IRONHAND_FLAMES_TIMER_RAND = 3000, IRONHAND_N_GROUPS = 3, SPELL_GOUT_OF_FLAMES = 15529 }; +constexpr Milliseconds IRONHAND_FLAMES_TIMER = 16s; +constexpr Milliseconds IRONHAND_FLAMES_TIMER_RAND = 3s; + class go_shadowforge_brazier : public GameObjectScript { public: @@ -110,7 +111,7 @@ public: { case SPELL_GOUT_OF_FLAMES: DoCast(SPELL_GOUT_OF_FLAMES); - events.RescheduleEvent(SPELL_GOUT_OF_FLAMES, urand(IRONHAND_FLAMES_TIMER - IRONHAND_FLAMES_TIMER_RAND, IRONHAND_FLAMES_TIMER + IRONHAND_FLAMES_TIMER_RAND)); + events.RescheduleEvent(SPELL_GOUT_OF_FLAMES, IRONHAND_FLAMES_TIMER - IRONHAND_FLAMES_TIMER_RAND, IRONHAND_FLAMES_TIMER + IRONHAND_FLAMES_TIMER_RAND); break; default: break; @@ -358,7 +359,8 @@ public: case 0: Talk(SAY_TEXT5); HandleGameObject(DATA_ARENA4, false); - Start(false, false); + me->SetWalk(true); + Start(false); eventTimer = 0; break; case 1: @@ -603,7 +605,10 @@ public: creature->CastSpell(creature, SPELL_DRUNKEN_RAGE, false); if (npc_escortAI* escortAI = CAST_AI(npc_rocknot::npc_rocknotAI, creature->AI())) - escortAI->Start(false, false); + { + creature->SetWalk(true); + escortAI->Start(false); + } } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp index dadfb58c60..df52818e42 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp @@ -28,14 +28,11 @@ enum Spells SPELL_ENVELOPING_WEB = 15471 }; -enum Timers -{ - TIMER_SHADOWBOLT = 7000, - TIMER_CURSE_TONGUES = 24000, - TIMER_CURSE_WEAKNESS = 12000, - TIMER_DEMON_ARMOR = 3000, // virtually only cast once - TIMER_ENVELOPING_WEB = 16000 -}; +constexpr Milliseconds TIMER_SHADOWBOLT = 7s; +constexpr Milliseconds TIMER_CURSE_TONGUES = 24s; +constexpr Milliseconds TIMER_CURSE_WEAKNESS = 12s; +constexpr Milliseconds TIMER_DEMON_ARMOR = 3s; //virtually only cast once +constexpr Milliseconds TIMER_ENVELOPING_WEB = 16s; class boss_anubshiah : public CreatureScript { @@ -54,11 +51,11 @@ public: void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(SPELL_SHADOWBOLT, 0.2 * (int)TIMER_SHADOWBOLT); - events.ScheduleEvent(SPELL_CURSE_TONGUES, 0.2 * (int)TIMER_CURSE_TONGUES); - events.ScheduleEvent(SPELL_CURSE_WEAKNESS, 0.2 * (int)TIMER_CURSE_WEAKNESS); - events.ScheduleEvent(SPELL_DEMON_ARMOR, 0.2 * (int)TIMER_DEMON_ARMOR); - events.ScheduleEvent(SPELL_ENVELOPING_WEB, 0.2 * (int)TIMER_ENVELOPING_WEB); + events.ScheduleEvent(SPELL_SHADOWBOLT, TIMER_SHADOWBOLT / 5); + events.ScheduleEvent(SPELL_CURSE_TONGUES, TIMER_CURSE_TONGUES / 5); + events.ScheduleEvent(SPELL_CURSE_WEAKNESS, TIMER_CURSE_WEAKNESS / 5); + events.ScheduleEvent(SPELL_DEMON_ARMOR, TIMER_DEMON_ARMOR / 5); + events.ScheduleEvent(SPELL_ENVELOPING_WEB, TIMER_ENVELOPING_WEB / 5); } void UpdateAI(uint32 diff) override @@ -80,21 +77,21 @@ public: { case SPELL_SHADOWBOLT: DoCastVictim(SPELL_SHADOWBOLT); - events.ScheduleEvent(SPELL_SHADOWBOLT, urand(TIMER_SHADOWBOLT - 2000, TIMER_SHADOWBOLT + 2000)); + events.ScheduleEvent(SPELL_SHADOWBOLT, TIMER_SHADOWBOLT - 2s, TIMER_SHADOWBOLT + 2s); break; case SPELL_CURSE_TONGUES: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) { DoCast(target, SPELL_CURSE_TONGUES); } - events.ScheduleEvent(SPELL_CURSE_TONGUES, urand(TIMER_CURSE_TONGUES - 2000, TIMER_CURSE_TONGUES + 2000)); + events.ScheduleEvent(SPELL_CURSE_TONGUES, TIMER_CURSE_TONGUES - 2s, TIMER_CURSE_TONGUES + 2s); break; case SPELL_CURSE_WEAKNESS: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) { DoCast(target, SPELL_CURSE_WEAKNESS); } - events.ScheduleEvent(SPELL_CURSE_WEAKNESS, urand(TIMER_CURSE_WEAKNESS - 2000, TIMER_CURSE_WEAKNESS + 2000)); + events.ScheduleEvent(SPELL_CURSE_WEAKNESS, TIMER_CURSE_WEAKNESS - 2s, TIMER_CURSE_WEAKNESS + 2s); break; case SPELL_DEMON_ARMOR: DoCast(me, SPELL_DEMON_ARMOR); @@ -103,7 +100,7 @@ public: case SPELL_ENVELOPING_WEB: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) DoCast(target, SPELL_ENVELOPING_WEB); - events.ScheduleEvent(SPELL_ENVELOPING_WEB, urand(TIMER_ENVELOPING_WEB - 2000, TIMER_ENVELOPING_WEB + 2000)); + events.ScheduleEvent(SPELL_ENVELOPING_WEB, TIMER_ENVELOPING_WEB - 2s, TIMER_ENVELOPING_WEB + 2s); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_eviscerator.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_eviscerator.cpp index 5d12ea5ac1..dfebbcf111 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_eviscerator.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_eviscerator.cpp @@ -26,12 +26,9 @@ enum Spells SPELL_SHIELD = 7121 }; -enum Timers -{ - TIMER_SHADOWBOLT_VOLLEY = 7000, - TIMER_REND = 20000, - TIMER_SHIELD = 12000 -}; +constexpr Milliseconds TIMER_SHADOWBOLT_VOLLEY = 7s; +constexpr Milliseconds TIMER_REND = 20s; +constexpr Milliseconds TIMER_SHIELD = 12s; class boss_eviscerator : public CreatureScript { @@ -52,9 +49,9 @@ public: void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(SPELL_SHADOWBOLT_VOLLEY, 0.2 * (int)TIMER_SHADOWBOLT_VOLLEY); - events.ScheduleEvent(SPELL_REND, 0.2 * (int) TIMER_REND); - events.ScheduleEvent(SPELL_SHIELD, 0.2 * (int) TIMER_SHIELD); + events.ScheduleEvent(SPELL_SHADOWBOLT_VOLLEY, TIMER_SHADOWBOLT_VOLLEY / 5); + events.ScheduleEvent(SPELL_REND, TIMER_REND / 5); + events.ScheduleEvent(SPELL_SHIELD, TIMER_SHIELD / 5); } void DamageTaken(Unit* /* doneBy */, uint32& /* damage */, DamageEffectType /* damagetype */, SpellSchoolMask damageSchoolMask) override @@ -86,11 +83,11 @@ public: { case SPELL_SHADOWBOLT_VOLLEY: DoCastVictim(SPELL_SHADOWBOLT_VOLLEY); - events.ScheduleEvent(SPELL_SHADOWBOLT_VOLLEY, urand(TIMER_SHADOWBOLT_VOLLEY - 2000, TIMER_SHADOWBOLT_VOLLEY + 2000)); + events.ScheduleEvent(SPELL_SHADOWBOLT_VOLLEY, TIMER_SHADOWBOLT_VOLLEY - 2s, TIMER_SHADOWBOLT_VOLLEY + 2s); break; case SPELL_REND: DoCastVictim(SPELL_REND); - events.ScheduleEvent(SPELL_REND, urand(TIMER_REND - 2000, TIMER_REND + 2000)); + events.ScheduleEvent(SPELL_REND, TIMER_REND - 2s, TIMER_REND + 2s); break; case SPELL_SHIELD: SpellShieldReady = true; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp index 6621829836..4947301136 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp @@ -26,12 +26,9 @@ enum Spells SPELL_BLOODLUST = 21049 }; -enum Timers -{ - TIMER_WHIRLWIND = 12000, - TIMER_MORTAL = 22000, - TIMER_BLOODLUST = 30000 -}; +constexpr Milliseconds TIMER_WHIRLWIND = 12s; +constexpr Milliseconds TIMER_MORTAL = 22s; +constexpr Milliseconds TIMER_BLOODLUST = 30s; class boss_gorosh_the_dervish : public CreatureScript { @@ -47,14 +44,14 @@ public: { boss_gorosh_the_dervishAI(Creature* creature) : BossAI(creature, DATA_GOROSH) { } - uint32 nextWhirlwindTime; + Milliseconds nextWhirlwindTime; void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(SPELL_WHIRLWIND, 0.2 * (int) TIMER_WHIRLWIND); - events.ScheduleEvent(SPELL_MORTALSTRIKE, 0.2 * (int) TIMER_MORTAL); - events.ScheduleEvent(SPELL_BLOODLUST, 0.2 * (int) TIMER_BLOODLUST); + events.ScheduleEvent(SPELL_WHIRLWIND, TIMER_WHIRLWIND / 5); + events.ScheduleEvent(SPELL_MORTALSTRIKE, TIMER_MORTAL / 5); + events.ScheduleEvent(SPELL_BLOODLUST, TIMER_BLOODLUST / 5); } void UpdateAI(uint32 diff) override @@ -78,22 +75,22 @@ public: if (me->GetDistance2d(me->GetVictim()) < 10.0f) { DoCastVictim(SPELL_WHIRLWIND); - nextWhirlwindTime = urand(TIMER_WHIRLWIND - 2000, TIMER_WHIRLWIND + 2000); + nextWhirlwindTime = randtime(TIMER_WHIRLWIND - 2s, TIMER_WHIRLWIND + 2s); } else { // reschedule sooner - nextWhirlwindTime = 0.3 * urand(TIMER_WHIRLWIND - 2000, TIMER_WHIRLWIND + 2000); + nextWhirlwindTime = randtime(TIMER_WHIRLWIND - 2s, TIMER_WHIRLWIND + 2s) / 3; } events.ScheduleEvent(SPELL_WHIRLWIND, nextWhirlwindTime); break; case SPELL_MORTALSTRIKE: DoCastVictim(SPELL_MORTALSTRIKE); - events.ScheduleEvent(SPELL_MORTALSTRIKE, urand(TIMER_MORTAL - 2000, TIMER_MORTAL + 2000)); + events.ScheduleEvent(SPELL_MORTALSTRIKE, TIMER_MORTAL - 2s, TIMER_MORTAL + 2s); break; case SPELL_BLOODLUST: DoCastSelf(SPELL_BLOODLUST); - events.ScheduleEvent(SPELL_BLOODLUST, urand(TIMER_BLOODLUST - 2000, TIMER_BLOODLUST + 2000)); + events.ScheduleEvent(SPELL_BLOODLUST, TIMER_BLOODLUST - 2s, TIMER_BLOODLUST + 2s); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp index cbe77cd858..c9176385d2 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp @@ -26,11 +26,8 @@ enum Grizzle EMOTE_FRENZY_KILL = 0 }; -enum Timer -{ - TIMER_GROUNDTREMOR = 10000, - TIMER_FRENZY = 15000 -}; +constexpr Milliseconds TIMER_GROUNDTREMOR = 10s; +constexpr Milliseconds TIMER_FRENZY = 15s; class boss_grizzle : public CreatureScript { @@ -46,13 +43,13 @@ public: { boss_grizzleAI(Creature* creature) : BossAI(creature, DATA_GRIZZLE) {} - uint32 nextTremorTime; + Milliseconds nextTremorTime; void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(SPELL_GROUNDTREMOR, 0.2 * (int) TIMER_GROUNDTREMOR); - events.ScheduleEvent(SPELL_FRENZY, 0.2 * (int) TIMER_FRENZY); + events.ScheduleEvent(SPELL_GROUNDTREMOR, TIMER_GROUNDTREMOR / 5); + events.ScheduleEvent(SPELL_FRENZY, TIMER_FRENZY / 5); } void UpdateAI(uint32 diff) override @@ -77,17 +74,17 @@ public: if (me->GetDistance2d(me->GetVictim()) < 10.0f) { DoCastVictim(SPELL_GROUNDTREMOR); - nextTremorTime = urand(TIMER_GROUNDTREMOR - 2000, TIMER_GROUNDTREMOR + 2000); + nextTremorTime = randtime(TIMER_GROUNDTREMOR - 2s, TIMER_GROUNDTREMOR + 2s); } else { - nextTremorTime = 0.3*urand(TIMER_GROUNDTREMOR - 2000, TIMER_GROUNDTREMOR + 2000); + nextTremorTime = randtime(TIMER_GROUNDTREMOR - 2s, TIMER_GROUNDTREMOR + 2s) / 3; } events.ScheduleEvent(SPELL_GROUNDTREMOR, nextTremorTime); break; case SPELL_FRENZY: DoCastSelf(SPELL_FRENZY); - events.ScheduleEvent(SPELL_FRENZY, urand(TIMER_FRENZY - 2000, TIMER_FRENZY + 2000)); + events.ScheduleEvent(SPELL_FRENZY, TIMER_FRENZY - 2s, TIMER_FRENZY + 2s); Talk(EMOTE_FRENZY_KILL); break; default: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_hedrum.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_hedrum.cpp index 6861d1b895..8b2dfaaba6 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_hedrum.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_hedrum.cpp @@ -26,12 +26,9 @@ enum Spells SPELL_WEB_EXPLOSION = 15474 }; -enum Timers -{ - TIMER_PARALYZING = 20000, - TIMER_BANEFUL = 24000, - TIMER_WEB_EXPLOSION = 20000 -}; +constexpr Milliseconds TIMER_PARALYZING = 20s; +constexpr Milliseconds TIMER_BANEFUL = 24s; +constexpr Milliseconds TIMER_WEB_EXPLOSION = 20s; class boss_hedrum : public CreatureScript { @@ -50,9 +47,9 @@ public: void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(SPELL_PARALYZING, 0.2 * (int) TIMER_PARALYZING); - events.ScheduleEvent(SPELL_BANEFUL, 0.2 * (int) TIMER_BANEFUL); - events.ScheduleEvent(SPELL_WEB_EXPLOSION, 0.2 * (int) TIMER_WEB_EXPLOSION); + events.ScheduleEvent(SPELL_PARALYZING, TIMER_PARALYZING / 5); + events.ScheduleEvent(SPELL_BANEFUL, TIMER_BANEFUL / 5); + events.ScheduleEvent(SPELL_WEB_EXPLOSION, TIMER_WEB_EXPLOSION / 5); } void UpdateAI(uint32 diff) override @@ -74,18 +71,18 @@ public: { case SPELL_PARALYZING: DoCastVictim(SPELL_PARALYZING); - events.ScheduleEvent(SPELL_PARALYZING, urand(TIMER_PARALYZING - 2000, TIMER_PARALYZING + 2000)); + events.ScheduleEvent(SPELL_PARALYZING, TIMER_PARALYZING - 2s, TIMER_PARALYZING + 2s); break; case SPELL_BANEFUL: DoCastVictim(SPELL_BANEFUL); - events.ScheduleEvent(SPELL_BANEFUL, urand(TIMER_BANEFUL - 2000, TIMER_BANEFUL + 2000)); + events.ScheduleEvent(SPELL_BANEFUL, TIMER_BANEFUL - 2s, TIMER_BANEFUL + 2s); break; case SPELL_WEB_EXPLOSION: if (me->GetDistance2d(me->GetVictim()) < 100.0f) { DoCast(SPELL_WEB_EXPLOSION); } - events.ScheduleEvent(SPELL_WEB_EXPLOSION, urand(TIMER_WEB_EXPLOSION - 2000, TIMER_WEB_EXPLOSION + 2000)); + events.ScheduleEvent(SPELL_WEB_EXPLOSION, TIMER_WEB_EXPLOSION - 2s, TIMER_WEB_EXPLOSION + 2s); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp index 5d27104936..a408472a07 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp @@ -28,14 +28,11 @@ enum Spells SPELL_WORDPAIN = 15654, }; -enum SpellTimers -{ - TIMER_HEAL = 12000, - TIMER_MINDBLAST = 16000, - TIMER_RENEW = 12000, - TIMER_SHADOWBOLT = 16000, - TIMER_WORDPAIN = 12000, -}; +constexpr Milliseconds TIMER_HEAL = 12s; +constexpr Milliseconds TIMER_MINDBLAST = 16s; +constexpr Milliseconds TIMER_RENEW = 12s; +constexpr Milliseconds TIMER_SHADOWBOLT = 16s; +constexpr Milliseconds TIMER_WORDPAIN = 12s; struct boss_moira_bronzebeardAI : public BossAI { @@ -44,9 +41,9 @@ struct boss_moira_bronzebeardAI : public BossAI void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(SPELL_MINDBLAST, 0.5 * (int) TIMER_MINDBLAST); - events.ScheduleEvent(SPELL_HEAL, 0.5 * (int) TIMER_HEAL); - events.ScheduleEvent(SPELL_RENEW, 0.5 * (int) TIMER_RENEW); + events.ScheduleEvent(SPELL_MINDBLAST, TIMER_MINDBLAST / 2); + events.ScheduleEvent(SPELL_HEAL, TIMER_HEAL / 2); + events.ScheduleEvent(SPELL_RENEW, TIMER_RENEW / 2); } void UpdateAI(uint32 diff) override @@ -67,7 +64,7 @@ struct boss_moira_bronzebeardAI : public BossAI { case SPELL_MINDBLAST: DoCastVictim(SPELL_MINDBLAST); - events.ScheduleEvent(SPELL_MINDBLAST, urand(TIMER_MINDBLAST - 2000, TIMER_MINDBLAST + 2000)); + events.ScheduleEvent(SPELL_MINDBLAST, TIMER_MINDBLAST - 2s, TIMER_MINDBLAST + 2s); break; case SPELL_HEAL: CastOnEmperorIfPossible(SPELL_HEAL, TIMER_HEAL); @@ -82,7 +79,7 @@ struct boss_moira_bronzebeardAI : public BossAI DoMeleeAttackIfReady(); } - void CastOnEmperorIfPossible(uint32 spell, uint32 timer) + void CastOnEmperorIfPossible(uint32 spell, Milliseconds timer) { Creature* emperor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EMPEROR)); if (emperor && emperor->HealthBelowPct(90)) @@ -93,7 +90,7 @@ struct boss_moira_bronzebeardAI : public BossAI { DoCastSelf(spell); } - events.ScheduleEvent(spell, urand(timer - 2000, timer + 2000)); + events.ScheduleEvent(spell, timer - 2s, timer + 2s); } }; @@ -107,10 +104,10 @@ struct boss_high_priestess_thaurissanAI : public boss_moira_bronzebeardAI { _JustEngagedWith(); Talk(0); - events.ScheduleEvent(SPELL_WORDPAIN, 0.5 * (int)TIMER_WORDPAIN); - events.ScheduleEvent(SPELL_HEAL, 0.5 * (int) TIMER_HEAL); - events.ScheduleEvent(SPELL_RENEW, 0.5 * (int) TIMER_RENEW); - events.ScheduleEvent(SPELL_SHADOWBOLT, 0.5 * (int) TIMER_SHADOWBOLT); + events.ScheduleEvent(SPELL_WORDPAIN, TIMER_WORDPAIN / 2); + events.ScheduleEvent(SPELL_HEAL, TIMER_HEAL / 2); + events.ScheduleEvent(SPELL_RENEW, TIMER_RENEW / 2); + events.ScheduleEvent(SPELL_SHADOWBOLT, TIMER_SHADOWBOLT / 2); } void UpdateAI(uint32 diff) override @@ -131,7 +128,7 @@ struct boss_high_priestess_thaurissanAI : public boss_moira_bronzebeardAI { case SPELL_WORDPAIN: DoCastVictim(SPELL_WORDPAIN); - events.ScheduleEvent(SPELL_WORDPAIN, urand(TIMER_WORDPAIN - 2000, TIMER_WORDPAIN + 2000)); + events.ScheduleEvent(SPELL_WORDPAIN, TIMER_WORDPAIN - 2s, TIMER_WORDPAIN + 2s); break; case SPELL_HEAL: CastOnEmperorIfPossible(SPELL_HEAL, TIMER_HEAL); @@ -141,7 +138,7 @@ struct boss_high_priestess_thaurissanAI : public boss_moira_bronzebeardAI break; case SPELL_SHADOWBOLT: DoCastVictim(SPELL_SHADOWBOLT); - events.ScheduleEvent(SPELL_SHADOWBOLT, urand(TIMER_SHADOWBOLT - 2000, TIMER_SHADOWBOLT + 2000)); + events.ScheduleEvent(SPELL_SHADOWBOLT, TIMER_SHADOWBOLT - 2s, TIMER_SHADOWBOLT + 2s); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_okthor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_okthor.cpp index c5168332ae..1da1d30b0a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_okthor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_okthor.cpp @@ -27,13 +27,10 @@ enum Spells SPELL_SLOW = 19137 }; -enum Timers -{ - TIMER_ARCANE_BOLT = 7000, - TIMER_ARCANE_EXPLOSION = 24000, - TIMER_POLYMORPH = 12000, - TIMER_SLOW = 15000 -}; +constexpr Milliseconds TIMER_ARCANE_BOLT = 7s; +constexpr Milliseconds TIMER_ARCANE_EXPLOSION = 24s; +constexpr Milliseconds TIMER_POLYMORPH = 12s; +constexpr Milliseconds TIMER_SLOW = 15s; class boss_okthor : public CreatureScript { @@ -49,15 +46,15 @@ public: { boss_okthorAI(Creature* creature) : BossAI(creature, DATA_OKTHOR) {} - uint32 nextArcaneExplosionTime; + Milliseconds nextArcaneExplosionTime; void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(SPELL_ARCANE_BOLT, 0.2 * (int) TIMER_ARCANE_BOLT); - events.ScheduleEvent(SPELL_ARCANE_EXPLOSION, 0.2 * (int) TIMER_ARCANE_EXPLOSION); - events.ScheduleEvent(SPELL_POLYMORPH, 0.2 * (int) TIMER_POLYMORPH); - events.ScheduleEvent(SPELL_SLOW, 500); + events.ScheduleEvent(SPELL_ARCANE_BOLT, TIMER_ARCANE_BOLT / 5); + events.ScheduleEvent(SPELL_ARCANE_EXPLOSION, TIMER_ARCANE_EXPLOSION / 5); + events.ScheduleEvent(SPELL_POLYMORPH, TIMER_POLYMORPH / 5); + events.ScheduleEvent(SPELL_SLOW, 500ms); } void UpdateAI(uint32 diff) override @@ -82,17 +79,17 @@ public: { DoCast(target, SPELL_ARCANE_BOLT); } - events.ScheduleEvent(SPELL_ARCANE_BOLT, urand(TIMER_ARCANE_BOLT - 2000, TIMER_ARCANE_BOLT + 2000)); + events.ScheduleEvent(SPELL_ARCANE_BOLT, TIMER_ARCANE_BOLT - 2s, TIMER_ARCANE_BOLT + 2s); break; case SPELL_ARCANE_EXPLOSION: if (me->GetDistance2d(me->GetVictim()) < 50.0f) { DoCast(SPELL_ARCANE_EXPLOSION); - nextArcaneExplosionTime = urand(TIMER_ARCANE_EXPLOSION - 2000, TIMER_ARCANE_EXPLOSION + 2000); + nextArcaneExplosionTime = randtime(TIMER_ARCANE_EXPLOSION - 2s, TIMER_ARCANE_EXPLOSION + 2s); } else { - nextArcaneExplosionTime = 0.3*urand(TIMER_ARCANE_EXPLOSION - 2000, TIMER_ARCANE_EXPLOSION + 2000); + nextArcaneExplosionTime = randtime(TIMER_ARCANE_EXPLOSION - 2s, TIMER_ARCANE_EXPLOSION + 2s) / 3; } events.ScheduleEvent(SPELL_ARCANE_EXPLOSION, nextArcaneExplosionTime); break; @@ -101,7 +98,7 @@ public: { DoCast(target, SPELL_POLYMORPH); } - events.ScheduleEvent(SPELL_POLYMORPH, urand(TIMER_POLYMORPH - 2000, TIMER_POLYMORPH + 2000)); + events.ScheduleEvent(SPELL_POLYMORPH, TIMER_POLYMORPH - 2s, TIMER_POLYMORPH + 2s); break; case SPELL_SLOW: if (me->GetDistance2d(me->GetVictim()) < 50.0f) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp index 243d6e71c5..fd18069ca9 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp @@ -606,7 +606,7 @@ public: if (Creature* argelmach = instance->GetCreature(ArgelmachGUID)) { argelmach->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT); - argelmach->m_Events.AddEvent(new RestoreAttack(argelmach), argelmach->m_Events.CalculateTime(3000)); + argelmach->m_Events.AddEventAtOffset(new RestoreAttack(argelmach), 3s); for (ObjectGuid const& argelmachAddGUID : ArgelmachAdds) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp index 2beaacff3d..f7bf1b5a55 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp @@ -96,7 +96,7 @@ public: void IsSummonedBy(WorldObject* /*summoner*/) override { - events.ScheduleEvent(EVENT_SUMMONED_1, 1000); + events.ScheduleEvent(EVENT_SUMMONED_1, 1s); } void JustSummoned(Creature* summon) override @@ -128,7 +128,7 @@ public: events.ScheduleEvent(EVENT_SUMMONED_2, 2s); break; case EVENT_SUMMONED_2: - me->GetMotionMaster()->MovePath(GYTH_PATH_1, false); + me->GetMotionMaster()->MoveWaypoint(GYTH_PATH_1, false); break; default: break; 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 66ecf747ec..d88c390b10 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp @@ -71,7 +71,7 @@ public: void IsSummonedBy(WorldObject* /*summoner*/) override { - StartTalking(TALK_SUMMON, 8 * IN_MILLISECONDS); + StartTalking(TALK_SUMMON, 8s); } void JustEngagedWith(Unit* who) override @@ -92,7 +92,7 @@ public: instance->SetData(DATA_LORD_VALTHALAK, DONE); } - void StartTalking(uint32 talkGroupId, uint32 timer) + void StartTalking(uint32 talkGroupId, Milliseconds timer) { me->SetReactState(REACT_PASSIVE); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); @@ -123,7 +123,7 @@ public: events.CancelEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN); - StartTalking(TALK_40_HP, 5 * IN_MILLISECONDS); + StartTalking(TALK_40_HP, 5s); } if (!frenzy15 && me->HealthBelowPctDamaged(15, damage)) @@ -132,7 +132,7 @@ public: events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 12s, 19s, 0, EVENT_PHASE_FIGHT); - StartTalking(TALK_15_HP, 5 * IN_MILLISECONDS); + StartTalking(TALK_15_HP, 5s); } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mor_grayhoof.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mor_grayhoof.cpp index c416371cd6..72ce757443 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mor_grayhoof.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mor_grayhoof.cpp @@ -53,7 +53,7 @@ enum Spells SPELL_FAERIE_DRAGON_FORM = 27546, SPELL_ARCANE_EXPLOSION = 22271, SPELL_REFLECTION = 27564, - SPELL_CHAIN_LIGHTING = 27567, + SPELL_CHAIN_LIGHTNING = 27567, SPELL_SLEEP = 20663 // Guessed }; @@ -68,7 +68,7 @@ enum Phases std::vector<uint32> catSpells = { SPELL_SHRED, SPELL_RAKE, SPELL_FEROCIOUS_BITE }; std::vector<uint32> humanSpells = { SPELL_HURRICANE, SPELL_MOONFIRE, SPELL_SHOCK, SPELL_HEALING_TOUCH, SPELL_REJUVENATION }; std::vector<uint32> bearSpells = { SPELL_DEMORALIZING_ROAR, SPELL_MAUL, SPELL_SWIPE }; -std::vector<uint32> faerieSpells = { SPELL_ARCANE_EXPLOSION, SPELL_REFLECTION, SPELL_CHAIN_LIGHTING, SPELL_SLEEP }; +std::vector<uint32> faerieSpells = { SPELL_ARCANE_EXPLOSION, SPELL_REFLECTION, SPELL_CHAIN_LIGHTNING, SPELL_SLEEP }; struct boss_mor_grayhoof : public BossAI { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp index 45e6502eb8..45af53d9bc 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp @@ -77,7 +77,9 @@ struct boss_quartermaster_zigris : public BossAI { if (me->IsWithinMeleeRange(me->GetVictim())) { - me->GetMotionMaster()->MoveBackwards(me->GetVictim(), 10.0f); + float x, y, z; + me->GetNearPoint(me->GetVictim(), x, y, z, me->GetVictim()->GetBoundaryRadius(), 10.0f, me->GetAngle(me->GetVictim())); + me->GetMotionMaster()->MovePoint(0, x, y, z, FORCED_MOVEMENT_RUN); // TODO: Implement generic distancing on npc on target root } } } @@ -108,11 +110,11 @@ struct boss_quartermaster_zigris : public BossAI if (me->IsWithinMeleeRange(me->GetVictim())) { DoCastVictim(SPELL_HOOKEDNET); - events.RepeatEvent(16000); + events.Repeat(16s); } else { - events.RepeatEvent(3000); + events.Repeat(3s); } break; case EVENT_SHOOT: @@ -128,7 +130,7 @@ struct boss_quartermaster_zigris : public BossAI me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->GetVictim()); } - events.RepeatEvent(2000); + events.Repeat(2s); break; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp index 6383681943..d1dbc4ff9e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp @@ -222,7 +222,7 @@ public: if (GameObject* portcullis = me->FindNearestGameObject(GO_DR_PORTCULLIS, 50.0f)) waveDoorGUID = portcullis->GetGUID(); - events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0ms); events.ScheduleEvent(EVENT_START_1, 1s); } } @@ -234,7 +234,7 @@ public: { switch (id) { - case 5: + case 6: events.ScheduleEvent(EVENT_TELEPORT_1, 2s); break; } @@ -264,7 +264,7 @@ public: events.ScheduleEvent(EVENT_START_2, 4s); break; case EVENT_START_2: - events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0ms); if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->HandleEmoteCommand(EMOTE_ONESHOT_POINT); events.ScheduleEvent(EVENT_START_3, 4s); @@ -314,14 +314,14 @@ public: events.ScheduleEvent(EVENT_SPAWN_WAVE, 3s); break; case EVENT_WAVES_TEXT_2: - events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0ms); if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_3); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4s); events.ScheduleEvent(EVENT_SPAWN_WAVE, 3s); break; case EVENT_WAVES_TEXT_3: - events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0ms); if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_4); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4s); @@ -334,14 +334,14 @@ public: events.ScheduleEvent(EVENT_SPAWN_WAVE, 3s); break; case EVENT_WAVES_TEXT_5: - events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0ms); if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_5); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4s); events.ScheduleEvent(EVENT_SPAWN_WAVE, 3s); break; case EVENT_WAVES_COMPLETE_TEXT_1: - events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0ms); if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_6); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4s); @@ -362,10 +362,10 @@ public: break; case EVENT_PATH_NEFARIUS: if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) - victor->GetMotionMaster()->MovePath(NEFARIUS_PATH_1, true); + victor->GetMotionMaster()->MoveWaypoint(NEFARIUS_PATH_1, true); break; case EVENT_PATH_REND: - me->GetMotionMaster()->MovePath(REND_PATH_1, false); + me->GetMotionMaster()->MoveWaypoint(REND_PATH_1, false); break; case EVENT_TELEPORT_1: me->NearTeleportTo(194.2993f, -474.0814f, 121.4505f, -0.01225555f); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp index 84d3c07acc..fe9d0a981e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp @@ -110,7 +110,7 @@ public: if (_beastReached) { - me->GetMotionMaster()->MovePath(BEAST_MOVEMENT_ID, true); + me->GetMotionMaster()->MoveWaypoint(BEAST_MOVEMENT_ID, true); } } @@ -157,8 +157,8 @@ public: orc->AI()->Talk(SAY_BLACKHAND_DOOMED); } - orc->m_Events.AddEvent(new OrcMoveEvent(orc), me->m_Events.CalculateTime(3 * IN_MILLISECONDS)); - orc->m_Events.AddEvent(new OrcDeathEvent(orc), me->m_Events.CalculateTime(9 * IN_MILLISECONDS)); + orc->m_Events.AddEventAtOffset(new OrcMoveEvent(orc), 3s); + orc->m_Events.AddEventAtOffset(new OrcDeathEvent(orc), 9s); } } } @@ -169,7 +169,7 @@ public: if (!_beastReached) { _beastReached = true; - me->GetMotionMaster()->MovePath(BEAST_MOVEMENT_ID, true); + me->GetMotionMaster()->MoveWaypoint(BEAST_MOVEMENT_ID, true); // There is a chance player logged in between areatriggers (realm crash or restart) // executing part of script which happens when player enters boss room @@ -227,7 +227,7 @@ public: case EVENT_FIREBALL: DoCastVictim(SPELL_FIREBALL); events.ScheduleEvent(EVENT_FIREBALL, 8s, 21s); - if (events.GetNextEventTime(EVENT_FIREBLAST) < 3 * IN_MILLISECONDS) + if (events.GetTimeUntilEvent(EVENT_FIREBLAST) < 3s) { events.RescheduleEvent(EVENT_FIREBLAST, 3s); } @@ -235,7 +235,7 @@ public: case EVENT_FIREBLAST: DoCastVictim(SPELL_FIREBLAST); events.ScheduleEvent(EVENT_FIREBLAST, 5s, 8s); - if (events.GetNextEventTime(EVENT_FIREBALL) < 3 * IN_MILLISECONDS) + if (events.GetTimeUntilEvent(EVENT_FIREBALL) < 3s) { events.RescheduleEvent(EVENT_FIREBALL, 3s); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp index 55ac1f26e0..33f37d0833 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp @@ -98,31 +98,31 @@ public: { case EVENT_SNAP_KICK: DoCastVictim(SPELL_SNAPKICK); - events.RepeatEvent(6 * IN_MILLISECONDS); + events.Repeat(6s); break; case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE); - events.RepeatEvent(12 * IN_MILLISECONDS); + events.Repeat(12s); break; case EVENT_UPPERCUT: DoCastVictim(SPELL_UPPERCUT); - events.RepeatEvent(14 * IN_MILLISECONDS); + events.Repeat(14s); break; case EVENT_MORTAL_STRIKE: DoCastVictim(SPELL_MORTALSTRIKE); - events.RepeatEvent(10 * IN_MILLISECONDS); + events.Repeat(10s); break; case EVENT_PUMMEL: DoCastVictim(SPELL_PUMMEL); - events.RepeatEvent(16 * IN_MILLISECONDS); + events.Repeat(16s); break; case EVENT_THROW_AXE: DoCastRandomTarget(SPELL_THROWAXE); - events.RepeatEvent(8 * IN_MILLISECONDS); + events.Repeat(8s); break; case EVENT_THRASH: DoCastSelf(SPELL_THRASH); - events.RepeatEvent(10 * IN_MILLISECONDS); + events.Repeat(10s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index d9508f0b5a..8c5af306e5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -39,10 +39,7 @@ enum EventIds EVENT_SOLAKAR_WAVE = 3 }; -enum Timers -{ - TIMER_SOLAKAR_WAVE = 30000 -}; +constexpr Milliseconds TIMER_SOLAKAR_WAVE = 30s; enum SolakarWaves { @@ -1049,7 +1046,7 @@ public: break; case EVENT_VAEL_3_DESPAWN: DoCast(me, SPELL_VAELASTRASZ_SPAWN); - me->DespawnOrUnsummon(1500); + me->DespawnOrUnsummon(1500ms); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index cf39b53a1f..fc8368f1b5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -118,7 +118,7 @@ public: return !victim->HasAura(SPELL_TIMELAPSE); } - void SetGUID(ObjectGuid guid, int32 id) override + void SetGUID(ObjectGuid const& guid, int32 id) override { if (id == GUID_LEVER_USER) { @@ -244,7 +244,7 @@ class go_chromaggus_lever : public GameObjectScript if (Creature* creature = _instance->GetCreature(DATA_CHROMAGGUS)) { creature->SetHomePosition(homePos); - creature->GetMotionMaster()->MovePath(creature->GetEntry() * 10, false); + creature->GetMotionMaster()->MoveWaypoint(creature->GetEntry() * 10, false); creature->AI()->SetGUID(player->GetGUID(), GUID_LEVER_USER); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp index 12fab34d17..9252546f05 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp @@ -44,7 +44,7 @@ public: void MovementInform(uint32 type, uint32 id) override { - if (type != WAYPOINT_MOTION_TYPE || id != 12) + if (type != WAYPOINT_MOTION_TYPE || id != 13) { return; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 614976c5ae..c1760cc5ca 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -343,7 +343,7 @@ public: nefarian->setActive(true); nefarian->SetCanFly(true); nefarian->SetDisableGravity(true); - nefarian->GetMotionMaster()->MovePath(NEFARIAN_PATH, false); + nefarian->GetMotionMaster()->MoveWaypoint(NEFARIAN_PATH, false); } events.Reset(); @@ -406,7 +406,7 @@ public: switch (eventId) { case EVENT_PATH_2: - me->GetMotionMaster()->MovePath(NEFARIUS_PATH_2, false); + me->GetMotionMaster()->MoveWaypoint(NEFARIUS_PATH_2, false); events.ScheduleEvent(EVENT_CHAOS_1, 7s); break; case EVENT_CHAOS_1: @@ -435,10 +435,10 @@ public: break; case EVENT_SUCCESS_2: DoCast(me, SPELL_VAELASTRASZZ_SPAWN); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); break; case EVENT_PATH_3: - me->GetMotionMaster()->MovePath(NEFARIUS_PATH_3, false); + me->GetMotionMaster()->MoveWaypoint(NEFARIUS_PATH_3, false); break; case EVENT_START_EVENT: BeginEvent(); @@ -592,12 +592,12 @@ struct boss_nefarian : public BossAI return; } - if (id == 3) + if (id == 4) { Talk(SAY_INTRO); } - if (id == 5) + if (id == 6) { DoCastAOE(SPELL_SHADOWFLAME_INITIAL); Talk(SAY_SHADOWFLAME); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 4b82654fb6..de984f635e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -152,7 +152,7 @@ public: } } - void SetGUID(ObjectGuid const guid, int32 /*id*/) override + void SetGUID(ObjectGuid const& guid, int32 /*id*/) override { _charmerGUID = guid; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index de8d3ef6c7..15f0f63f17 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -345,7 +345,7 @@ public: { case NPC_BLACKWING_DRAGON: --addsCount[0]; - if (EggEvent != DONE && _events.GetTimeUntilEvent(EVENT_RAZOR_SPAWN) == Milliseconds::max()) + if (EggEvent != DONE && !_events.HasTimeUntilEvent(EVENT_RAZOR_SPAWN)) { _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 1s); } @@ -353,7 +353,7 @@ public: case NPC_BLACKWING_LEGIONAIRE: case NPC_BLACKWING_MAGE: --addsCount[1]; - if (EggEvent != DONE && _events.GetTimeUntilEvent(EVENT_RAZOR_SPAWN) == Milliseconds::max()) + if (EggEvent != DONE && !_events.HasTimeUntilEvent(EVENT_RAZOR_SPAWN)) { _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 1s); } @@ -413,7 +413,7 @@ public: if (spawnMoreAdds) { - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 15000); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 15s); } } break; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp index 9f6823b3b1..0bf59bb34f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp @@ -91,7 +91,7 @@ public: case EVENT_INFERNO: { DoCastAOE(SPELL_INFERNO); - events.RepeatEvent(urand(21000, 26000)); + events.Repeat(21s, 26s); break; } case EVENT_IGNITE_MANA: @@ -101,7 +101,7 @@ public: DoCast(target, SPELL_IGNITE_MANA); } - events.RepeatEvent(urand(27000, 32000)); + events.Repeat(27s, 32s); break; } case EVENT_LIVING_BOMB: @@ -111,7 +111,7 @@ public: DoCast(target, SPELL_LIVING_BOMB); } - events.RepeatEvent(urand(11000, 16000)); + events.Repeat(11s, 16s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp index 3682a67fd1..9b6ec713a5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp @@ -111,13 +111,13 @@ public: case EVENT_ANTIMAGIC_PULSE: { DoCastSelf(SPELL_ANTIMAGIC_PULSE); - events.RepeatEvent(20000); + events.Repeat(20s); break; } case EVENT_MAGMA_SHACKLES: { DoCastSelf(SPELL_MAGMA_SHACKLES); - events.RepeatEvent(15000); + events.Repeat(15s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp index a358bec9d5..80a2bc1e82 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp @@ -58,7 +58,7 @@ public: case EVENT_GEHENNAS_CURSE: { DoCastVictim(SPELL_GEHENNAS_CURSE); - events.RepeatEvent(urand(25000, 30000)); + events.Repeat(25s, 30s); break; } case EVENT_RAIN_OF_FIRE: @@ -67,7 +67,7 @@ public: { DoCast(target, SPELL_RAIN_OF_FIRE, true); } - events.RepeatEvent(6000); + events.Repeat(6s); break; } case EVENT_SHADOW_BOLT: @@ -88,7 +88,7 @@ public: DoCastVictim(SPELL_SHADOW_BOLT_VICTIM); } - events.RepeatEvent(5000); + events.Repeat(5s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp index 384b818974..1ddbabeefd 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp @@ -57,19 +57,19 @@ public: case EVENT_IMPENDING_DOOM: { DoCastVictim(SPELL_IMPENDING_DOOM); - events.RepeatEvent(20000); + events.Repeat(20s); break; } case EVENT_LUCIFRON_CURSE: { DoCastVictim(SPELL_LUCIFRON_CURSE); - events.RepeatEvent(20000); + events.Repeat(20s); break; } case EVENT_SHADOW_SHOCK: { DoCastVictim(SPELL_SHADOW_SHOCK); - events.RepeatEvent(5000); + events.Repeat(5s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp index 978cf2f80a..460abdbd16 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp @@ -73,13 +73,13 @@ public: { Talk(EMOTE_FRENZY); DoCastSelf(SPELL_FRENZY); - events.RepeatEvent(urand(15000, 20000)); + events.Repeat(15s, 20s); break; } case EVENT_PANIC: { DoCastVictim(SPELL_PANIC); - events.RepeatEvent(urand(31000, 38000)); + events.Repeat(31s, 38s); break; } case EVENT_LAVA_BOMB: @@ -89,7 +89,7 @@ public: DoCast(target, SPELL_LAVA_BOMB); } - events.RepeatEvent(urand(12000, 15000)); + events.Repeat(12s, 15s); break; } case EVENT_LAVA_BOMB_RANGED: @@ -104,7 +104,7 @@ public: { DoCast(targets.front() , SPELL_LAVA_BOMB_RANGED); } - events.RepeatEvent(urand(12000, 15000)); + events.Repeat(12s, 15s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index ce586774f5..769a43deb6 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -348,7 +348,7 @@ public: { DoCastSelf(SPELL_DAMAGE_REFLECTION); } - events.RepeatEvent(30000); + events.Repeat(30s); break; } case EVENT_TELEPORT_RANDOM: @@ -359,14 +359,14 @@ public: DoCast(target, SPELL_TELEPORT_RANDOM); } - events.RepeatEvent(30000); + events.Repeat(30s); break; } case EVENT_TELEPORT_TARGET: { DoCastSelf(SPELL_HATE_TO_ZERO, true); DoCastAOE(SPELL_TELEPORT_TARGET); - events.RepeatEvent(30000); + events.Repeat(30s); break; } } @@ -430,7 +430,7 @@ public: Talk(SAY_RAG_SUM_2); // Next event will get triggered in MovementInform me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_RAGNAROS_SUMMON, MajordomoMoveRagPos, true, false); + me->GetMotionMaster()->MovePoint(POINT_RAGNAROS_SUMMON, MajordomoMoveRagPos, FORCED_MOVEMENT_NONE, 0.f, true, false); break; } case EVENT_RAGNAROS_SUMMON_2: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 84dfa53781..6cde45bdd4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -183,13 +183,13 @@ public: } } - void SetGUID(ObjectGuid guid, int32 index) override + void SetGUID(ObjectGuid const& guid, int32 index) override { if (index == GO_LAVA_BURST) { if (_lavaBurstGUIDS.empty()) { - extraEvents.ScheduleEvent(EVENT_LAVA_BURST_TRIGGER, 1); + extraEvents.ScheduleEvent(EVENT_LAVA_BURST_TRIGGER, 1ms); } _lavaBurstGUIDS.insert(guid); @@ -309,7 +309,7 @@ public: } _lavaBurstGUIDS.erase(lavaBurstGUID); - extraEvents.RepeatEvent(1000); + extraEvents.Repeat(1s); } else { @@ -350,7 +350,7 @@ public: { Talk(SAY_WRATH); } - events.RepeatEvent(25000); + events.Repeat(25s); break; } case EVENT_HAND_OF_RAGNAROS: @@ -362,7 +362,7 @@ public: _isKnockbackEmoteAllowed = false; extraEvents.RescheduleEvent(EVENT_RESET_KNOCKBACK_EMOTE, 5s); } - events.RepeatEvent(20000); + events.Repeat(20s); break; } case EVENT_LAVA_BURST: @@ -401,7 +401,7 @@ public: extraEvents.RescheduleEvent(EVENT_RESET_KNOCKBACK_EMOTE, 5s); } } - events.RepeatEvent(urand(11000, 30000)); + events.Repeat(11s, 30s); break; } case EVENT_SUBMERGE: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp index fc135b2817..08203f4439 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp @@ -67,7 +67,7 @@ public: case EVENT_ARCANE_EXPLOSION: { DoCastVictim(SPELL_ARCANE_EXPLOSION); - events.RepeatEvent(urand(4000, 5000)); + events.Repeat(4s, 5s); break; } case EVENT_SHAZZRAH_CURSE: @@ -76,26 +76,26 @@ public: { DoCast(target, SPELL_SHAZZRAH_CURSE); } - events.RepeatEvent(urand(23000, 26000)); + events.Repeat(23s, 26s); break; } case EVENT_MAGIC_GROUNDING: { DoCastSelf(SPELL_MAGIC_GROUNDING); - events.RepeatEvent(urand(7000, 9000)); + events.Repeat(7s, 9s); break; } case EVENT_COUNTERSPELL: { DoCastAOE(SPELL_COUNTERSPELL); - events.RepeatEvent(urand(15000, 18000)); + events.Repeat(15s, 18s); break; } case EVENT_SHAZZRAH_GATE: { DoCastAOE(SPELL_SHAZZRAH_GATE_DUMMY); events.RescheduleEvent(EVENT_ARCANE_EXPLOSION, 3s, 6s); - events.RepeatEvent(45000); + events.Repeat(45s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp index 942a22f619..739a82d665 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp @@ -72,7 +72,7 @@ public: case EVENT_DEMORALIZING_SHOUT: { DoCastVictim(SPELL_DEMORALIZING_SHOUT); - events.RepeatEvent(urand(12000, 18000)); + events.Repeat(12s, 18s); break; } case EVENT_INSPIRE: @@ -84,19 +84,19 @@ public: } DoCastSelf(SPELL_INSPIRE); - events.RepeatEvent(urand(13000, 20000)); + events.Repeat(13s, 20s); break; } case EVENT_KNOCKDOWN: { DoCastVictim(SPELL_KNOCKDOWN); - events.RepeatEvent(urand(10000, 20000)); + events.Repeat(10s, 20s); break; } case EVENT_FLAMESPEAR: { DoCastRandomTarget(SPELL_FLAMESPEAR); - events.RepeatEvent(urand(12000, 16000)); + events.Repeat(12s, 16s); break; } } @@ -133,7 +133,7 @@ public: events.ScheduleEvent(EVENT_DARK_STRIKE, 4s, 7s); events.ScheduleEvent(EVENT_DARK_MENDING, 15s, 30s); events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 2s, 4s); - events.ScheduleEvent(EVENT_IMMOLATE, 3500ms, 6000ms); + events.ScheduleEvent(EVENT_IMMOLATE, 3500ms, 6s); } void UpdateAI(uint32 diff) override @@ -157,7 +157,7 @@ public: case EVENT_DARK_STRIKE: { DoCastVictim(SPELL_DARK_STRIKE); - events.RepeatEvent(urand(4000, 7000)); + events.Repeat(4s, 7s); break; } case EVENT_DARK_MENDING: @@ -169,7 +169,7 @@ public: DoCast(target, SPELL_DARK_MENDING); } } - events.RepeatEvent(urand(15000, 20000)); + events.Repeat(15s, 20s); break; } case EVENT_SHADOW_WORD_PAIN: @@ -178,7 +178,7 @@ public: { DoCast(target, SPELL_SHADOW_WORD_PAIN); } - events.RepeatEvent(urand(2500, 5000)); + events.Repeat(2500ms, 5s); break; } case EVENT_IMMOLATE: @@ -187,7 +187,7 @@ public: { DoCast(target, SPELL_IMMOLATE); } - events.RepeatEvent(urand(5000, 7000)); + events.Repeat(5s, 7s); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp index 9d1d0033e2..73afa5f049 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.cpp @@ -199,7 +199,7 @@ class spell_mc_play_dead_aura : public AuraScript else { Unit::Kill(creatureTarget, creatureTarget); - creatureTarget->DespawnOrUnsummon(14000); + creatureTarget->DespawnOrUnsummon(14s); } } diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp index 44c7b68395..d52d5bb34a 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp @@ -90,7 +90,7 @@ public: if (me->HealthBelowPct(67) && !health67) { me->CastSpell(me, SPELL_SMITE_STOMP, false); - events.DelayEvents(10000); + events.DelayEvents(10s); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(EQUIP_TWO_SWORDS, 1.859f, -780.72f, 9.831f); Talk(SAY_SWAP1); @@ -105,7 +105,7 @@ public: if (me->HealthBelowPct(34) && !health34) { me->CastSpell(me, SPELL_SMITE_STOMP, false); - events.DelayEvents(10000); + events.DelayEvents(10s); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MovePoint(EQUIP_MACE, 1.859f, -780.72f, 9.831f); Talk(SAY_SWAP2); diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp index e4125d70d0..bfc418d000 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp @@ -131,7 +131,7 @@ public: uint32 checkTimer; ObjectGuid playerGUID; - void SetGUID(ObjectGuid guid, int32) override + void SetGUID(ObjectGuid const& guid, int32) override { playerGUID = guid; } @@ -146,7 +146,7 @@ public: { if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID)) player->GroupEventHappens(QUEST_A_FINE_MESS, me); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index 70bcad38e2..e62ad33e53 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -183,7 +183,7 @@ struct boss_nightbane : public BossAI me->GetMotionMaster()->MoveTakeoff(POINT_INTRO_TAKE_OFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10.0f, 13.99879f); }).Schedule(4s, [this](TaskContext /*context*/) { - me->GetMotionMaster()->MovePath(me->GetEntry()*10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry()*10, false); }); } } @@ -400,7 +400,7 @@ struct boss_nightbane : public BossAI { scheduler.Schedule(0s, [this](TaskContext /*context*/) { - me->GetMotionMaster()->MovePath(me->GetEntry()*10+1, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry()*10+1, false); }); } break; 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 f804a28785..15e175dde7 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -151,7 +151,7 @@ struct boss_shade_of_aran : public BossAI return me->GetDistance2d(roomCenter.GetPositionX(), roomCenter.GetPositionY()) < 45.0f; } - void SetGUID(ObjectGuid guid, int32 id) override + void SetGUID(ObjectGuid const& guid, int32 id) override { if (id == ACTION_ATIESH_REACT && !_atieshReaction) { diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_tenris_mirkblood.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_tenris_mirkblood.cpp index bed3364478..07eb7da114 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_tenris_mirkblood.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_tenris_mirkblood.cpp @@ -123,6 +123,15 @@ struct boss_tenris_mirkblood : public BossAI return; DoCast(victim, SPELL_SUMMON_SANGUINE_SPIRIT_ON_KILL); + + if (!_mirrorTarget) + return; + + if (victim == _mirrorTarget) + { + me->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR0); + me->RemoveAurasDueToSpell(SPELL_BLOOD_MIRROR1); + } } void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damageType, SpellSchoolMask damageSchoolMask) override @@ -281,8 +290,8 @@ public: bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_MIRKBLOOD) != DONE) - if (Creature* mirkblood = instance->GetCreature(DATA_MIRKBLOOD)) + if (Creature* mirkblood = instance->GetCreature(DATA_MIRKBLOOD)) + if (mirkblood->IsAlive() && !mirkblood->IsInCombat()) mirkblood->AI()->Talk(SAY_APPROACH, player); return false; @@ -297,8 +306,8 @@ public: bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) - if (instance->GetBossState(DATA_MIRKBLOOD) != DONE) - if (Creature* mirkblood = instance->GetCreature(DATA_MIRKBLOOD)) + if (Creature* mirkblood = instance->GetCreature(DATA_MIRKBLOOD)) + if (mirkblood->IsAlive() && mirkblood->IsImmuneToPC()) mirkblood->SetImmuneToPC(false); return false; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 3b5092fab2..fa32df8185 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -88,7 +88,7 @@ struct npc_kilrek : public ScriptedAI DoCast(Terestian, SPELL_BROKEN_PACT, true); } } - me->DespawnOrUnsummon(15000); + me->DespawnOrUnsummon(15s); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index cf45992a8e..84bd98bc66 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -170,7 +170,8 @@ public: if (m_uiEventId == EVENT_OZ) instance->SetData(DATA_OPERA_OZ_DEATHCOUNT, IN_PROGRESS); - Start(false, false); + me->SetWalk(true); + Start(false); } void JustEngagedWith(Unit* /*who*/) override { } @@ -523,9 +524,9 @@ public: } } - me->DespawnOrUnsummon(100); + me->DespawnOrUnsummon(100ms); if (Creature* arca = ObjectAccessor::GetCreature((*me), ArcanagosGUID)) - arca->DespawnOrUnsummon(100); + arca->DespawnOrUnsummon(100ms); return 5000; default: diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index 8feeadedcb..91c2e40b03 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -138,7 +138,7 @@ struct boss_felblood_kaelthas : public BossAI ScheduleTimedEvent(0ms, [&]{ DoCastVictim(SPELL_FIREBALL); - }, 3000ms, 4500ms); + }, 3s, 4500ms); ScheduleTimedEvent(15s, [&]{ Talk(SAY_PHOENIX); DoCastSelf(SPELL_PHOENIX); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index 66edbda08a..e5535991f5 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -95,7 +95,7 @@ struct boss_selin_fireheart : public BossAI BossAI::JustEngagedWith(who); ScheduleTimedEvent(2500ms, [&]{ DoCastRandomTarget(SPELL_DRAIN_LIFE); - }, 10000ms); + }, 10s); ScheduleTimedEvent(2s, [&]{ me->RemoveAuraFromStack(SPELL_MANA_RAGE_TRIGGER); DoCastAOE(SPELL_FEL_EXPLOSION); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp index 403782eed0..0e04c702c8 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp @@ -141,7 +141,7 @@ struct boss_vexallus : public BossAI void SummonedCreatureDies(Creature* summon, Unit* killer) override { summons.Despawn(summon); - summon->DespawnOrUnsummon(1); + summon->DespawnOrUnsummon(1ms); if (killer) killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true, 0, 0, summon->GetGUID()); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index eacc695482..521743897d 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -80,7 +80,7 @@ public: { if (Creature* kalecgos = instance->SummonCreature(NPC_KALECGOS, KalecgosSpawnPos)) { - kalecgos->GetMotionMaster()->MovePath(PATH_KALECGOS_FLIGHT, false); + kalecgos->GetMotionMaster()->MoveWaypoint(PATH_KALECGOS_FLIGHT, false); kalecgos->AI()->Talk(SAY_KALECGOS_SPAWN); } }); diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 4747e77658..8c51346655 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -230,7 +230,7 @@ public: me->RemoveAllAuras(); me->CastSpell(attacker, SPELL_DUEL_VICTORY, true); me->RestoreFaction(); - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); } } } @@ -396,7 +396,7 @@ public: AttackStart(attacker); } - void SetGUID(ObjectGuid guid, int32) override + void SetGUID(ObjectGuid const& guid, int32) override { gothikGUID = guid; events.ScheduleEvent(EVENT_GHOUL_MOVE_TO_PIT, 3s); @@ -407,7 +407,7 @@ public: { if (type == POINT_MOTION_TYPE && point == 1) { - me->DespawnOrUnsummon(1500); + me->DespawnOrUnsummon(1500ms); me->CastSpell(me, SPELL_GHOUL_SUBMERGE, true); } } @@ -438,7 +438,7 @@ public: if (owner->GetVictim()) AttackStart(owner->GetVictim()); - events.RepeatEvent(1000); + events.Repeat(1s); return; } @@ -502,49 +502,6 @@ public: }; }; -class npc_scarlet_cannon : public CreatureScript -{ -public: - npc_scarlet_cannon() : CreatureScript("npc_scarlet_cannon") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_scarlet_cannonAI(creature); - } - - struct npc_scarlet_cannonAI : public VehicleAI - { - npc_scarlet_cannonAI(Creature* creature) : VehicleAI(creature) { summonAttackers = 0; } - - uint32 summonAttackers; - void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool apply) override - { - summonAttackers = apply ? 8000 : 0; - } - - void UpdateAI(uint32 diff) override - { - VehicleAI::UpdateAI(diff); - - if (summonAttackers) - { - summonAttackers += diff; - if (summonAttackers >= 15000) - { - for (uint8 i = 0; i < 15; ++i) - if (Creature* summon = me->SummonCreature(28834 /*NPC_SCARLET_FLEET_DEFENDER*/, 2192.56f + irand(-10, 10), -6147.90f + irand(-10, 10), 5.2f, 4.7f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 45000)) - { - summon->SetHomePosition(me->GetHomePosition()); - summon->AI()->AttackStart(me); - } - - summonAttackers = 1; - } - } - } - }; -}; - /*###### ##Quest 12848 ######*/ @@ -760,22 +717,22 @@ public: { case EVENT_ICY_TOUCH: DoCastVictim(SPELL_ICY_TOUCH); - events.DelayEvents(1000, GCD_CAST); + events.DelayEvents(1s, GCD_CAST); events.ScheduleEvent(EVENT_ICY_TOUCH, 5s, GCD_CAST); break; case EVENT_PLAGUE_STRIKE: DoCastVictim(SPELL_PLAGUE_STRIKE); - events.DelayEvents(1000, GCD_CAST); + events.DelayEvents(1s, GCD_CAST); events.ScheduleEvent(EVENT_PLAGUE_STRIKE, 5s, GCD_CAST); break; case EVENT_BLOOD_STRIKE: DoCastVictim(SPELL_BLOOD_STRIKE); - events.DelayEvents(1000, GCD_CAST); + events.DelayEvents(1s, GCD_CAST); events.ScheduleEvent(EVENT_BLOOD_STRIKE, 5s, GCD_CAST); break; case EVENT_DEATH_COIL: DoCastVictim(SPELL_DEATH_COIL); - events.DelayEvents(1000, GCD_CAST); + events.DelayEvents(1s, GCD_CAST); events.ScheduleEvent(EVENT_DEATH_COIL, 5s, GCD_CAST); break; } @@ -806,7 +763,7 @@ public: ObjectGuid prisonerGUID; - void SetGUID(ObjectGuid guid, int32 /*id*/) override + void SetGUID(ObjectGuid const& guid, int32 /*id*/) override { if (!prisonerGUID) prisonerGUID = guid; @@ -835,252 +792,6 @@ public: } }; -/*#### -## npc_scarlet_miner_cart -####*/ - -enum Spells_SM -{ - SPELL_CART_CHECK = 54173, - SPELL_CART_DRAG = 52465 -}; - -class npc_scarlet_miner_cart : public CreatureScript -{ -public: - npc_scarlet_miner_cart() : CreatureScript("npc_scarlet_miner_cart") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_scarlet_miner_cartAI(creature); - } - - struct npc_scarlet_miner_cartAI : public PassiveAI - { - npc_scarlet_miner_cartAI(Creature* creature) : PassiveAI(creature) - { - me->SetImmuneToAll(true); - me->SetFaction(FACTION_FRIENDLY); - me->SetDisplayFromModel(0); // Modelid2 is a horse. - } - - ObjectGuid minerGUID; - - void SetGUID(ObjectGuid guid, int32 /*id*/) override - { - minerGUID = guid; - } - - void DoAction(int32 /*param*/) override - { - if (Creature* miner = ObjectAccessor::GetCreature(*me, minerGUID)) - { - me->SetWalk(false); - - //Not 100% correct, but movement is smooth. Sometimes miner walks faster - //than normal, this speed is fast enough to keep up at those times. - me->SetSpeed(MOVE_RUN, 1.25f); - - me->GetMotionMaster()->MoveFollow(miner, 1.0f, 0); - me->ReplaceAllUnitFlags(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToAll(true); - me->SetFaction(FACTION_FRIENDLY); - } - } - - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override - { - who->SetVisible(!apply); - if (!apply) - if (Creature* miner = ObjectAccessor::GetCreature(*me, minerGUID)) - miner->DisappearAndDie(); - } - }; -}; - -/*#### -## npc_scarlet_miner -####*/ - -enum Says_SM -{ - SAY_SCARLET_MINER_0 = 0, - SAY_SCARLET_MINER_1 = 1 -}; - -class npc_scarlet_miner : public CreatureScript -{ -public: - npc_scarlet_miner() : CreatureScript("npc_scarlet_miner") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_scarlet_minerAI(creature); - } - - struct npc_scarlet_minerAI : public npc_escortAI - { - npc_scarlet_minerAI(Creature* creature) : npc_escortAI(creature) - { - me->SetReactState(REACT_PASSIVE); - } - - uint32 IntroTimer; - uint32 IntroPhase; - ObjectGuid carGUID; - - void Reset() override - { - carGUID.Clear(); - IntroTimer = 0; - IntroPhase = 0; - } - - void InitWaypoint() - { - AddWaypoint(1, 2389.03f, -5902.74f, 109.014f, 5000); - AddWaypoint(2, 2341.812012f, -5900.484863f, 102.619743f); - AddWaypoint(3, 2308.34f, -5904.2f, 91.1099f); - AddWaypoint(4, 2300.69f, -5912.99f, 86.1572f); - AddWaypoint(5, 2294.142090f, -5927.274414f, 75.316849f); - AddWaypoint(6, 2286.984375f, -5944.955566f, 63.714966f); - AddWaypoint(7, 2280.001709f, -5961.186035f, 54.228283f); - AddWaypoint(8, 2259.389648f, -5974.197754f, 42.359348f); - AddWaypoint(9, 2242.882812f, -5984.642578f, 32.827850f); - AddWaypoint(10, 2239.79f, -5989.31f, 30.4453f); - AddWaypoint(11, 2236.52f, -5994.28f, 27.4829f); - AddWaypoint(12, 2232.61f, -6000.23f, 23.1281f); - AddWaypoint(13, 2228.69f, -6006.46f, 17.6638f); - AddWaypoint(14, 2225.2f, -6012.39f, 12.9487f); - AddWaypoint(15, 2217.265625f, -6028.959473f, 7.675705f); - AddWaypoint(16, 2202.595947f, -6061.325684f, 5.882018f); - AddWaypoint(17, 2188.974609f, -6080.866699f, 3.370027f); - - if (urand(0, 1)) - { - AddWaypoint(18, 2176.483887f, -6110.407227f, 1.855181f); - AddWaypoint(19, 2172.516602f, -6146.752441f, 1.074235f); - AddWaypoint(20, 2138.918457f, -6158.920898f, 1.342926f); - AddWaypoint(21, 2129.866699f, -6174.107910f, 4.380779f); - AddWaypoint(22, 2125.250001f, -6181.230001f, 9.91997f); - AddWaypoint(23, 2117.709473f, -6193.830078f, 13.3542f, 10000); - } - else - { - AddWaypoint(18, 2184.190186f, -6166.447266f, 0.968877f); - AddWaypoint(19, 2234.265625f, -6163.741211f, 0.916021f); - AddWaypoint(20, 2268.071777f, -6158.750977f, 1.822252f); - AddWaypoint(21, 2270.028320f, -6176.505859f, 6.340538f); - AddWaypoint(22, 2270.350001f, -6182.410001f, 10.42431f); - AddWaypoint(23, 2271.739014f, -6195.401855f, 13.3542f, 10000); - } - } - - void InitCartQuest(Player* who) - { - carGUID = who->GetVehicleBase()->GetGUID(); - InitWaypoint(); - Start(false, false, who->GetGUID()); - SetDespawnAtFar(false); - } - - void WaypointReached(uint32 waypointId) override - { - switch (waypointId) - { - case 1: - if (Unit* car = ObjectAccessor::GetCreature(*me, carGUID)) - { - me->SetFacingToObject(car); - // xinef: add some flags - car->ReplaceAllUnitFlags(UNIT_FLAG_NON_ATTACKABLE); - car->SetImmuneToAll(true); - car->SetFaction(FACTION_FRIENDLY); - } - Talk(SAY_SCARLET_MINER_0); - SetRun(true); - IntroTimer = 4000; - IntroPhase = 1; - break; - case 23: - if (Creature* car = ObjectAccessor::GetCreature(*me, carGUID)) - { - car->SetPosition(car->GetPositionX(), car->GetPositionY(), me->GetPositionZ() + 1, car->GetOrientation()); - car->StopMovingOnCurrentPos(); - me->SetFacingToObject(car); - car->RemoveAura(SPELL_CART_DRAG); - } - Talk(SAY_SCARLET_MINER_1); - break; - default: - break; - } - } - - void UpdateAI(uint32 diff) override - { - if (IntroPhase) - { - if (IntroTimer <= diff) - { - if (IntroPhase == 1) - { - if (Creature* car = ObjectAccessor::GetCreature(*me, carGUID)) - DoCast(car, SPELL_CART_DRAG); - IntroTimer = 800; - IntroPhase = 2; - } - else - { - if (Creature* car = ObjectAccessor::GetCreature(*me, carGUID)) - car->AI()->DoAction(0); - IntroPhase = 0; - } - } - else IntroTimer -= diff; - } - npc_escortAI::UpdateAI(diff); - } - }; -}; - -/*###### -## go_inconspicuous_mine_car -######*/ - -enum Spells_Cart -{ - SPELL_CART_SUMM = 52463 -}; - -class go_inconspicuous_mine_car : public GameObjectScript -{ -public: - go_inconspicuous_mine_car() : GameObjectScript("go_inconspicuous_mine_car") { } - - bool OnGossipHello(Player* player, GameObject* /*go*/) override - { - if (player->GetQuestStatus(12701) == QUEST_STATUS_INCOMPLETE) - { - // Hack Why Trinity Dont Support Custom Summon Location - if (Creature* miner = player->SummonCreature(28841, 2383.869629f, -5900.312500f, 107.996086f, player->GetOrientation(), TEMPSUMMON_DEAD_DESPAWN, 1)) - { - player->CastSpell(player, SPELL_CART_SUMM, true); - if (Creature* car = player->GetVehicleCreatureBase()) - { - if (car->GetEntry() == 28817) - { - car->AI()->SetGUID(miner->GetGUID()); - CAST_AI(npc_scarlet_miner::npc_scarlet_minerAI, miner->AI())->InitCartQuest(player); - } - } - } - } - - return true; - } -}; - class spell_death_knight_initiate_visual : public SpellScript { PrepareSpellScript(spell_death_knight_initiate_visual); @@ -1218,13 +929,9 @@ void AddSC_the_scarlet_enclave_c1() RegisterSpellScript(spell_q12698_the_gift_that_keeps_on_giving); new npc_scarlet_ghoul(); new npc_dkc1_gothik(); - new npc_scarlet_cannon(); new npc_unworthy_initiate(); new npc_unworthy_initiate_anchor(); new go_acherus_soul_prison(); - new npc_scarlet_miner(); - new npc_scarlet_miner_cart(); - new go_inconspicuous_mine_car(); RegisterSpellScript(spell_death_knight_initiate_visual); RegisterSpellScript(spell_lich_king_whisper); RegisterSpellScript(spell_lich_king_vo_blocker); diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 9c71aad73a..45cbf8d9a6 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -64,12 +64,12 @@ enum Koltira //NPC_DEATH_KNIGHT_MOUNT = 29201, MODEL_DEATH_KNIGHT_MOUNT = 25278, - POINT_STAND_UP = 0, - POINT_BOX = 1, - POINT_ANTI_MAGIC_ZONE = 2, + POINT_STAND_UP = 1, + POINT_BOX = 2, + POINT_ANTI_MAGIC_ZONE = 3, - POINT_MOUNT = 0, - POINT_DESPAWN = 1 + POINT_MOUNT = 1, + POINT_DESPAWN = 2 }; class npc_koltira_deathweaver : public CreatureScript @@ -106,7 +106,7 @@ public: Talk(SAY_BREAKOUT0); me->m_Events.AddEventAtOffset([&] { - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); }, 5s); } @@ -167,13 +167,13 @@ public: } if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1640.6724f, -6032.0527f, 134.82213f, 4.654973506927490234f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath(NPC_CRIMSON_ACOLYTE * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint(NPC_CRIMSON_ACOLYTE * 10, false); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1641.0055f, -6031.893f, 134.82211f, 0.401425719261169433f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 1) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 1) * 10, false); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1639.7053f, -6031.7373f, 134.82213f, 2.443460941314697265f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 2) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 2) * 10, false); break; case 1: Talk(SAY_BREAKOUT4); @@ -182,13 +182,13 @@ public: valroth->AI()->Talk(SAY_VALROTH_WAVE2); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1640.7958f, -6030.307f, 134.82211f, 4.65355682373046875f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 3) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 3) * 10, false); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1641.7305f, -6030.751f, 134.82211f, 6.143558979034423828f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 4) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 4) * 10, false); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1639.4657f, -6030.404f, 134.82211f, 4.502949237823486328f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 5) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 5) * 10, false); break; case 2: Talk(SAY_BREAKOUT5); @@ -197,16 +197,16 @@ public: valroth->AI()->Talk(SAY_VALROTH_WAVE3); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1641.3405f, -6031.436f, 134.82211f, 4.612849712371826171f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 6) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 6) * 10, false); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1642.0404f, -6030.3843f, 134.82211f, 1.378810048103332519f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 7) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 7) * 10, false); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1640.1162f, -6029.7817f, 134.82211f, 5.707226753234863281f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 8) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 8) * 10, false); if (Creature* acolyte = me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1640.9948f, -6029.8027f, 134.82211f, 1.605702877044677734f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - acolyte->GetMotionMaster()->MovePath((NPC_CRIMSON_ACOLYTE + 9) * 10, false); + acolyte->GetMotionMaster()->MoveWaypoint((NPC_CRIMSON_ACOLYTE + 9) * 10, false); break; case 3: Talk(SAY_BREAKOUT6); @@ -223,7 +223,7 @@ public: { valroth->AI()->Talk(SAY_VALROTH_AGGRO); valroth->SetReactState(REACT_AGGRESSIVE); - valroth->GetMotionMaster()->MovePath(NPC_HIGH_INQUISITOR_VALROTH * 10, false); + valroth->GetMotionMaster()->MoveWaypoint(NPC_HIGH_INQUISITOR_VALROTH * 10, false); } return; default: @@ -262,7 +262,7 @@ public: SetInvincibility(true); me->SetReactState(REACT_PASSIVE); me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC); - me->GetMotionMaster()->MovePath((me->GetEntry() + 1) * 10, false); + me->GetMotionMaster()->MoveWaypoint((me->GetEntry() + 1) * 10, false); }); } } @@ -610,10 +610,10 @@ public: // Start waypoint movement using WaypointMovementGenerator if (uint32 pathId = me->GetWaypointPath()) { - me->GetMotionMaster()->MovePath(pathId, true); // true = repeatable + me->GetMotionMaster()->MoveWaypoint(pathId, true); // true = repeatable } // Schedule the first ritual after 20-30s - events.ScheduleEvent(EVENT_START_RITUAL, urand(20000, 30000)); + events.ScheduleEvent(EVENT_START_RITUAL, 20s, 30s); } void UpdateAI(uint32 diff) override @@ -628,7 +628,7 @@ public: { if (isOnRitual) // Already performing ritual { - events.ScheduleEvent(EVENT_START_RITUAL, urand(5000, 10000)); + events.ScheduleEvent(EVENT_START_RITUAL, 5s, 10s); break; } @@ -655,7 +655,7 @@ public: if (!nearestCorpse) { // No corpse found nearby: try again later - events.ScheduleEvent(EVENT_START_RITUAL, urand(5000, 10000)); + events.ScheduleEvent(EVENT_START_RITUAL, 5s, 10s); break; } // Start ritual @@ -702,7 +702,7 @@ public: // Resume paused waypoint movement me->ResumeMovement(); // Schedule next ritual in 20-30s - events.ScheduleEvent(EVENT_START_RITUAL, urand(20000, 30000)); + events.ScheduleEvent(EVENT_START_RITUAL, 20s, 30s); break; } } @@ -723,9 +723,9 @@ public: me->SetFacingToObject(geist); geistGUID = geist->GetGUID(); // Geist found: schedule Ghoulplosion at +3s, then raising at +6s, then resume at +9s - events.ScheduleEvent(EVENT_GHOULPLOSION, 3000); - events.ScheduleEvent(EVENT_RAISE_GHOUL, 6000); - events.ScheduleEvent(EVENT_RESUME_WP, 9000); + events.ScheduleEvent(EVENT_GHOULPLOSION, 3s); + events.ScheduleEvent(EVENT_RAISE_GHOUL, 6s); + events.ScheduleEvent(EVENT_RESUME_WP, 9s); } else { @@ -737,8 +737,8 @@ public: me->SetFacingToObject(corpse); } - events.ScheduleEvent(EVENT_RAISE_GHOUL, 3000); - events.ScheduleEvent(EVENT_RESUME_WP, 6000); + events.ScheduleEvent(EVENT_RAISE_GHOUL, 3s); + events.ScheduleEvent(EVENT_RESUME_WP, 6s); } } } @@ -797,10 +797,10 @@ public: // Start waypoint movement using WaypointMovementGenerator if (uint32 pathId = me->GetWaypointPath()) { - me->GetMotionMaster()->MovePath(pathId, true); // true = repeatable + me->GetMotionMaster()->MoveWaypoint(pathId, true); // true = repeatable } // Schedule the first ritual after 50-60s - events.ScheduleEvent(EVENT_START_RITUAL, urand(50000, 60000)); + events.ScheduleEvent(EVENT_START_RITUAL, 50s, 60s); } void UpdateAI(uint32 diff) override { @@ -814,7 +814,7 @@ public: { if (isOnRitual) // Already performing ritual { - events.ScheduleEvent(EVENT_START_RITUAL, urand(5000, 10000)); + events.ScheduleEvent(EVENT_START_RITUAL, 5s, 10s); break; } @@ -841,7 +841,7 @@ public: } if (!nearestCorpse) { - events.ScheduleEvent(EVENT_START_RITUAL, urand(5000, 10000)); + events.ScheduleEvent(EVENT_START_RITUAL, 5s, 10s); break; } // Start ritual @@ -894,7 +894,7 @@ public: // Resume paused waypoint movement me->ResumeMovement(); // Schedule next ritual in 50-60s - events.ScheduleEvent(EVENT_START_RITUAL, urand(50000, 60000)); + events.ScheduleEvent(EVENT_START_RITUAL, 50s, 60s); break; } } @@ -923,15 +923,15 @@ public: me->SetFacingToObject(geist); geistGUID = geist->GetGUID(); // Geist present: Ghoulplosion in 3s (with SAY_GEIST), raise in 6s, resume in 9s - events.ScheduleEvent(EVENT_GHOULPLOSION, 3000); - events.ScheduleEvent(EVENT_RAISE_DEAD, 6000); - events.ScheduleEvent(EVENT_RESUME_WP, 9000); + events.ScheduleEvent(EVENT_GHOULPLOSION, 3s); + events.ScheduleEvent(EVENT_RAISE_DEAD, 6s); + events.ScheduleEvent(EVENT_RESUME_WP, 9s); } else { // No Geist: raise in 3s, resume in 6s - events.ScheduleEvent(EVENT_RAISE_DEAD, 3000); - events.ScheduleEvent(EVENT_RESUME_WP, 6000); + events.ScheduleEvent(EVENT_RAISE_DEAD, 3s); + events.ScheduleEvent(EVENT_RESUME_WP, 6s); } } } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index bfd1d01b9c..9e481aee9d 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -473,7 +473,7 @@ public: if (battleStarted != ENCOUNTER_STATE_FIGHT) return; - me->m_Events.AddEvent(new DelayedSummonEvent(me, creature->GetEntry(), *creature), me->m_Events.CalculateTime(3000)); + me->m_Events.AddEventAtOffset(new DelayedSummonEvent(me, creature->GetEntry(), *creature), 3s); if (creature->GetEntry() >= NPC_RAMPAGING_ABOMINATION) { --scourgeRemaining; @@ -504,7 +504,7 @@ public: tirion->AI()->Talk(SAY_LIGHT_OF_DAWN25, 4s); tirion->m_Events.AddEventAtOffset([&, tirion] { - tirion->GetMotionMaster()->MovePath(NPC_HIGHLORD_TIRION_FORDRING * 10, false); + tirion->GetMotionMaster()->MoveWaypoint(NPC_HIGHLORD_TIRION_FORDRING * 10, false); }, 14s); events.Reset(); @@ -526,11 +526,11 @@ public: if (battleStarted != ENCOUNTER_STATE_FIGHT) return; - events.RescheduleEvent(EVENT_SPELL_ANTI_MAGIC_ZONE, 15000); - events.RescheduleEvent(EVENT_SPELL_DEATH_STRIKE, 8000); - events.RescheduleEvent(EVENT_SPELL_DEATH_EMBRACE, 5000); - events.RescheduleEvent(EVENT_SPELL_UNHOLY_BLIGHT, 10000); - events.RescheduleEvent(EVENT_SPELL_DARION_MOD_DAMAGE, 500); + events.RescheduleEvent(EVENT_SPELL_ANTI_MAGIC_ZONE, 15s); + events.RescheduleEvent(EVENT_SPELL_DEATH_STRIKE, 8s); + events.RescheduleEvent(EVENT_SPELL_DEATH_EMBRACE, 5s); + events.RescheduleEvent(EVENT_SPELL_UNHOLY_BLIGHT, 10s); + events.RescheduleEvent(EVENT_SPELL_DARION_MOD_DAMAGE, 500ms); } void Reset() override @@ -660,14 +660,14 @@ public: { Position pos = LightOfDawnPos[first]; summon->SetHomePosition(pos); - summon->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, false); + summon->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, true, false); } first = first == 0 ? 1 : 0; } Position pos = LightOfDawnPos[first]; me->SetHomePosition(pos); me->SetWalk(false); - me->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true, true); + me->GetMotionMaster()->MovePoint(1, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, true, true); DoCastSelf(SPELL_THE_MIGHT_OF_MOGRAINE, true); break; } @@ -691,8 +691,8 @@ public: { orbaz->SetReactState(REACT_PASSIVE); orbaz->AI()->Talk(EMOTE_LIGHT_OF_DAWN04); - orbaz->GetMotionMaster()->MovePoint(2, LightOfDawnPos[2], true, true); - orbaz->DespawnOrUnsummon(7000); + orbaz->GetMotionMaster()->MovePoint(2, LightOfDawnPos[2], FORCED_MOVEMENT_NONE, 0.f, true, true); + orbaz->DespawnOrUnsummon(7s); } for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) @@ -839,7 +839,7 @@ public: alex->AI()->Talk(SAY_LIGHT_OF_DAWN41); if (Creature* darion = GetEntryFromSummons(NPC_DARION_MOGRAINE)) - darion->DespawnOrUnsummon(3000); + darion->DespawnOrUnsummon(3s); break; case EVENT_OUTRO_SCENE_19: if (Creature* alex = GetEntryFromSummons(NPC_HIGHLORD_ALEXANDROS_MOGRAINE)) @@ -886,7 +886,7 @@ public: case EVENT_OUTRO_SCENE_23: if (Creature* alex = GetEntryFromSummons(NPC_HIGHLORD_ALEXANDROS_MOGRAINE)) { - alex->DespawnOrUnsummon(5000); + alex->DespawnOrUnsummon(5s); alex->SetVisible(false); } break; @@ -1055,13 +1055,13 @@ public: if (Creature* lk = GetEntryFromSummons(NPC_THE_LICH_KING)) { lk->CastSpell(lk, SPELL_EXIT_TELEPORT_VISUAL, true); - lk->DespawnOrUnsummon(1500); + lk->DespawnOrUnsummon(1500ms); } if (Creature* tirion = GetEntryFromSummons(NPC_HIGHLORD_TIRION_FORDRING)) { float o = me->GetAngle(tirion); - tirion->GetMotionMaster()->MovePoint(4, me->GetPositionX() + 2.0f * cos(o), me->GetPositionY() + 2.0f * std::sin(o), me->GetPositionZ(), false); + tirion->GetMotionMaster()->MovePoint(4, me->GetPositionX() + 2.0f * cos(o), me->GetPositionY() + 2.0f * std::sin(o), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); tirion->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); tirion->SetFaction(FACTION_FRIENDLY); } @@ -1145,7 +1145,7 @@ public: } case EVENT_OUTRO_SCENE_61: summons.DespawnAll(); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); events.Reset(); return; } @@ -1269,7 +1269,7 @@ class spell_chapter5_return_to_capital : public SpellScript if (creature) { creature->PauseMovement(5000); - creature->SetTimedFacingToObject(player, 30000); + creature->SetFacingToObject(player, 30s); if (roll_chance_i(30)) { diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp index 8b585920c9..3392b3a953 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp @@ -36,16 +36,13 @@ enum BossData GANDLING_ROOM_TO_USE }; -enum Timers -{ - TIMER_ARCANE_MIN = 8000, - TIMER_ARCANE_MAX = 14000, - TIMER_CURSE_MIN = 20000, - TIMER_CURSE_MAX = 30000, - TIMER_SHIELD_MIN = 30000, - TIMER_SHIELD_MAX = 40000, - TIMER_PORTAL = 25000 -}; +constexpr Milliseconds TIMER_ARCANE_MIN = 8s; +constexpr Milliseconds TIMER_ARCANE_MAX = 14s; +constexpr Milliseconds TIMER_CURSE_MIN = 20s; +//constexpr Milliseconds TIMER_CURSE_MAX = 30s; +constexpr Milliseconds TIMER_SHIELD_MIN = 30s; +//constexpr Milliseconds TIMER_SHIELD_MAX = 40s; +constexpr Milliseconds TIMER_PORTAL = 25s; enum IdPortalSpells { @@ -335,18 +332,18 @@ public: { case SPELL_ARCANE_MISSILES: DoCastVictim(SPELL_ARCANE_MISSILES); - events.ScheduleEvent(SPELL_ARCANE_MISSILES, urand(TIMER_ARCANE_MIN, TIMER_ARCANE_MAX)); + events.ScheduleEvent(SPELL_ARCANE_MISSILES, TIMER_ARCANE_MIN, TIMER_ARCANE_MAX); break; case SPELL_CURSE_DARKMASTER: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) { DoCast(target, SPELL_CURSE_DARKMASTER); } - events.ScheduleEvent(SPELL_ARCANE_MISSILES, urand(TIMER_ARCANE_MIN, TIMER_ARCANE_MAX)); + events.ScheduleEvent(SPELL_ARCANE_MISSILES, TIMER_ARCANE_MIN, TIMER_ARCANE_MAX); break; case SPELL_SHADOW_SHIELD: DoCastSelf(SPELL_SHADOW_SHIELD); - events.ScheduleEvent(SPELL_ARCANE_MISSILES, urand(TIMER_ARCANE_MIN, TIMER_ARCANE_MAX)); + events.ScheduleEvent(SPELL_ARCANE_MISSILES, TIMER_ARCANE_MIN, TIMER_ARCANE_MAX); break; case SPELL_SHADOW_PORTAL: diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index b58ad2de39..3169ee1bb5 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -56,7 +56,7 @@ enum Events enum Misc { WEAPON_KIRTONOS_STAFF = 11365, - POINT_KIRTONOS_LAND = 13, + POINT_KIRTONOS_LAND = 14, KIRTONOS_PATH = 105061, EMOTE_SUMMONED = 0 @@ -103,7 +103,7 @@ public: void EnterEvadeMode(EvadeReason /*why*/) override { instance->SetData(DATA_KIRTONOS_THE_HERALD, FAIL); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void MovementInform(uint32 type, uint32 id) override @@ -139,7 +139,7 @@ public: switch (events2.ExecuteEvent()) { case INTRO_1: - me->GetMotionMaster()->MovePath(KIRTONOS_PATH, false); + me->GetMotionMaster()->MoveWaypoint(KIRTONOS_PATH, false); Talk(EMOTE_SUMMONED); break; case INTRO_2: diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp index 5363fac88e..253608fd51 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp @@ -399,17 +399,17 @@ public: { case 1: me->CastSpell(me, BONE_ARMOR_SPELL, false); - events.RepeatEvent(60000); + events.Repeat(60s); break; case 2: if (Unit* target = SelectUnitCasting()) { me->CastSpell(target, COUNTER_SPELL, false); - events.RepeatEvent(urand(10000, 20000)); + events.Repeat(10s, 20s); } else { - events.RepeatEvent(400); + events.Repeat(400ms); } break; case 3: @@ -417,11 +417,11 @@ public: { me->CastSpell(target, DRAIN_MANA_SPELL, false); } - events.RepeatEvent(urand(13000, 20000)); + events.Repeat(13s, 20s); break; case 4: me->CastSpell(me->GetVictim(), SHADOWBOLT_VOLLEY_SPELL, true); - events.RepeatEvent(urand(11000, 17000)); + events.Repeat(11s, 17s); break; } diff --git a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp index 9435fd1943..affaef9dcf 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp @@ -135,14 +135,14 @@ public: if (_slaughterProgress == 2) { for (uint32 i = 0; i < 33; ++i) - events.ScheduleEvent(EVENT_SPAWN_MINDLESS, 5000 + i * 210); + events.ScheduleEvent(EVENT_SPAWN_MINDLESS, Milliseconds(5000 + i * 210)); if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) if (GameObject* gate = baron->FindNearestGameObject(GO_SLAUGHTER_GATE_SIDE, 200.0f)) gate->SetGoState(GO_STATE_ACTIVE); } if (_slaughterProgress == 3) { - events.ScheduleEvent(EVENT_SPAWN_BLACK_GUARD, 20000); + events.ScheduleEvent(EVENT_SPAWN_BLACK_GUARD, 20s); } if (_slaughterProgress == 4) { @@ -296,7 +296,7 @@ public: _baronRunProgress = DATA_BARON_RUN_GATE; _baronRunTime = 45; DoCastSpellOnPlayers(SPELL_BARON_ULTIMATUM); - events.ScheduleEvent(EVENT_BARON_TIME, 60000); + events.ScheduleEvent(EVENT_BARON_TIME, 60s); if (Creature* baron = instance->GetCreature(_baronRivendareGUID)) baron->AI()->Talk(SAY_BARON_INIT_YELL); @@ -379,12 +379,12 @@ public: data >> _barthilasrunProgress; if (_baronRunTime) { - events.ScheduleEvent(EVENT_BARON_TIME, 60000); + events.ScheduleEvent(EVENT_BARON_TIME, 60s); } if (_slaughterProgress > 0 && _slaughterProgress < 4) { - events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 5000); + events.ScheduleEvent(EVENT_FORCE_SLAUGHTER_EVENT, 5s); } } @@ -455,20 +455,20 @@ public: if (i == 0) { // set timer to reset the trap - events.ScheduleEvent(EVENT_GATE1_TRAP, 30 * MINUTE * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_GATE1_TRAP, 1800s); // set timer to reopen gates - events.ScheduleEvent(EVENT_GATE1_DELAY, 20 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_GATE1_DELAY, 20s); // set timer to spawn the plagued critters - events.ScheduleEvent(EVENT_GATE1_CRITTER_DELAY, 2 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_GATE1_CRITTER_DELAY, 2s); } else if (i == 1) { // set timer to reset the trap - events.ScheduleEvent(EVENT_GATE2_TRAP, 30 * MINUTE * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_GATE2_TRAP, 1800s); // set timer to reopen gates - events.ScheduleEvent(EVENT_GATE2_DELAY, 20 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_GATE2_DELAY, 20s); // set timer to spawn the plagued critters - events.ScheduleEvent(EVENT_GATE2_CRITTER_DELAY, 2 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_GATE2_CRITTER_DELAY, 2s); } } } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp index e7937c6226..1df2bc3955 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp @@ -196,10 +196,10 @@ struct npc_madrigosa : public NullCreatureAI me->RemoveDynamicFlag(UNIT_DYNFLAG_DEAD); me->SendMovementFlagUpdate(); - events.ScheduleEvent(EVENT_MAD_1, 2000); + events.ScheduleEvent(EVENT_MAD_1, 2s); } else if (param == ACTION_SPAWN_FELMYST) - events.ScheduleEvent(EVENT_SPAWN_FELMYST, 60000); + events.ScheduleEvent(EVENT_SPAWN_FELMYST, 60s); } void UpdateAI(uint32 diff) override @@ -217,27 +217,27 @@ struct npc_madrigosa : public NullCreatureAI } me->GetMotionMaster()->MoveTakeoff(1, 1477.94f, 643.22f, 21.21f); me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); - events.ScheduleEvent(EVENT_MAD_2, 4000); + events.ScheduleEvent(EVENT_MAD_2, 4s); break; case EVENT_MAD_2: Talk(SAY_MAD_1); me->CastSpell(me, SPELL_MADRIGOSA_FREEZE, false); - events.ScheduleEvent(EVENT_MAD_2_1, 1000); + events.ScheduleEvent(EVENT_MAD_2_1, 1s); break; case EVENT_MAD_2_1: me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); me->SetDisableGravity(false); me->CastSpell(me, SPELL_MADRIGOSA_FROST_BREATH, false); - events.ScheduleEvent(EVENT_MAD_3, 7000); + events.ScheduleEvent(EVENT_MAD_3, 7s); break; case EVENT_MAD_3: Talk(SAY_MAD_2); - events.ScheduleEvent(EVENT_MAD_4, 7000); + events.ScheduleEvent(EVENT_MAD_4, 7s); break; case EVENT_MAD_4: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) brutallus->AI()->Talk(YELL_INTRO); - events.ScheduleEvent(EVENT_MAD_5, 5000); + events.ScheduleEvent(EVENT_MAD_5, 5s); break; case EVENT_MAD_5: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) @@ -245,7 +245,7 @@ struct npc_madrigosa : public NullCreatureAI brutallus->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK1H); } - events.ScheduleEvent(EVENT_MAD_6, 10000); + events.ScheduleEvent(EVENT_MAD_6, 10s); break; case EVENT_MAD_6: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) @@ -255,21 +255,21 @@ struct npc_madrigosa : public NullCreatureAI } me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); me->SetDisableGravity(true); - events.ScheduleEvent(EVENT_MAD_7, 4000); + events.ScheduleEvent(EVENT_MAD_7, 4s); break; case EVENT_MAD_7: Talk(SAY_MAD_3); me->CastSpell(me, SPELL_MADRIGOSA_FROST_BLAST, false); - events.ScheduleEvent(EVENT_MAD_8, 3000); - events.ScheduleEvent(EVENT_MAD_8, 5000); - events.ScheduleEvent(EVENT_MAD_8_1, 6000); - events.ScheduleEvent(EVENT_MAD_8, 6500); - events.ScheduleEvent(EVENT_MAD_8, 7500); - events.ScheduleEvent(EVENT_MAD_8, 8500); - events.ScheduleEvent(EVENT_MAD_8, 9500); - events.ScheduleEvent(EVENT_MAD_9, 11000); - events.ScheduleEvent(EVENT_MAD_8, 12000); - events.ScheduleEvent(EVENT_MAD_8, 14000); + events.ScheduleEvent(EVENT_MAD_8, 3s); + events.ScheduleEvent(EVENT_MAD_8, 5s); + events.ScheduleEvent(EVENT_MAD_8_1, 6s); + events.ScheduleEvent(EVENT_MAD_8, 6500ms); + events.ScheduleEvent(EVENT_MAD_8, 7500ms); + events.ScheduleEvent(EVENT_MAD_8, 8500ms); + events.ScheduleEvent(EVENT_MAD_8, 9500ms); + events.ScheduleEvent(EVENT_MAD_9, 11s); + events.ScheduleEvent(EVENT_MAD_8, 12s); + events.ScheduleEvent(EVENT_MAD_8, 14s); break; case EVENT_MAD_8: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) @@ -286,27 +286,27 @@ struct npc_madrigosa : public NullCreatureAI brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_FEL_FIREBALL, false); brutallus->AI()->Talk(YELL_INTRO_BREAK_ICE); } - events.ScheduleEvent(EVENT_MAD_11, 6000); + events.ScheduleEvent(EVENT_MAD_11, 6s); break; //case EVENT_MAD_10: case EVENT_MAD_11: me->SetDisableGravity(false); me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); - events.ScheduleEvent(EVENT_MAD_13, 2500); + events.ScheduleEvent(EVENT_MAD_13, 2500ms); break; case EVENT_MAD_13: Talk(SAY_MAD_4); me->RemoveAllAuras(); me->CastSpell(me, SPELL_MADRIGOSA_ENCAPSULATE, false); - events.ScheduleEvent(EVENT_MAD_14, 2000); + events.ScheduleEvent(EVENT_MAD_14, 2s); break; case EVENT_MAD_14: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) { brutallus->SetDisableGravity(true); - brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY() - 30.0f, brutallus->GetPositionZ() + 15.0f, false, true); + brutallus->GetMotionMaster()->MovePoint(0, brutallus->GetPositionX(), brutallus->GetPositionY() - 30.0f, brutallus->GetPositionZ() + 15.0f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false, true); } - events.ScheduleEvent(EVENT_MAD_15, 10000); + events.ScheduleEvent(EVENT_MAD_15, 10s); break; case EVENT_MAD_15: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) @@ -316,28 +316,28 @@ struct npc_madrigosa : public NullCreatureAI brutallus->GetMotionMaster()->MoveFall(); brutallus->AI()->Talk(YELL_INTRO_CHARGE); } - events.ScheduleEvent(EVENT_MAD_16, 1400); + events.ScheduleEvent(EVENT_MAD_16, 1400ms); break; case EVENT_MAD_16: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) brutallus->CastSpell(me, SPELL_BRUTALLUS_CHARGE, true); - events.ScheduleEvent(EVENT_MAD_17, 1200); + events.ScheduleEvent(EVENT_MAD_17, 1200ms); break; case EVENT_MAD_17: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) brutallus->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H); - events.ScheduleEvent(EVENT_MAD_18, 500); + events.ScheduleEvent(EVENT_MAD_18, 500ms); break; case EVENT_MAD_18: Talk(SAY_MAD_5); me->SetDynamicFlag(UNIT_DYNFLAG_DEAD); me->SetStandState(UNIT_STAND_STATE_DEAD); - events.ScheduleEvent(EVENT_MAD_19, 6000); + events.ScheduleEvent(EVENT_MAD_19, 6s); break; case EVENT_MAD_19: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) brutallus->AI()->Talk(YELL_INTRO_KILL_MADRIGOSA); - events.ScheduleEvent(EVENT_MAD_20, 7000); + events.ScheduleEvent(EVENT_MAD_20, 7s); break; case EVENT_MAD_20: me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); @@ -347,7 +347,7 @@ struct npc_madrigosa : public NullCreatureAI brutallus->AI()->Talk(YELL_INTRO_TAUNT); brutallus->CastSpell(brutallus, SPELL_BRUTALLUS_BREAK_ICE, false); } - events.ScheduleEvent(EVENT_MAD_21, 4000); + events.ScheduleEvent(EVENT_MAD_21, 4s); break; case EVENT_MAD_21: if (Creature* brutallus = instance->GetCreature(DATA_BRUTALLUS)) @@ -360,7 +360,7 @@ struct npc_madrigosa : public NullCreatureAI break; case EVENT_SPAWN_FELMYST: DoCastAOE(SPELL_SUMMON_FELBLAZE, true); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); break; } } @@ -382,7 +382,7 @@ class spell_madrigosa_activate_barrier : public SpellScript WorldPacket pkt; go->BuildValuesUpdateBlockForPlayer(&data, player); data.BuildPacket(pkt); - player->GetSession()->SendPacket(&pkt); + player->SendDirectMessage(&pkt); }); } } @@ -409,7 +409,7 @@ class spell_madrigosa_deactivate_barrier : public SpellScript WorldPacket pkt; go->BuildValuesUpdateBlockForPlayer(&data, player); data.BuildPacket(pkt); - player->GetSession()->SendPacket(&pkt); + player->SendDirectMessage(&pkt); }); } } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index c9b0ad3f12..75ee7dd055 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -157,7 +157,7 @@ struct boss_felmyst : public BossAI me->SetCanFly(true); me->SetDisableGravity(true); me->SendMovementFlagUpdate(); - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, true); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, true); } } @@ -205,7 +205,7 @@ struct boss_felmyst : public BossAI // Summon Kalecgos (human form of kalecgos fight) if (Creature* kalec = me->SummonCreature(NPC_KALECGOS_FELMYST, 1573.1461f, 755.20245f, 99.524956f, 3.595378f)) - kalec->GetMotionMaster()->MovePoint(POINT_KALECGOS, 1474.2347f, 624.0703f, 29.32589f, false, true); + kalec->GetMotionMaster()->MovePoint(POINT_KALECGOS, 1474.2347f, 624.0703f, 29.32589f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false, true); } void ScheduleGroundAbilities() @@ -312,25 +312,26 @@ struct boss_felmyst : public BossAI ++_strafeCount; _currentLane = urand(0, 2); if (isRightSide) - me->GetMotionMaster()->MovePoint(POINT_LANE, RightSideLanes[_currentLane], false); + me->GetMotionMaster()->MovePoint(POINT_LANE, RightSideLanes[_currentLane], FORCED_MOVEMENT_NONE, 0.f, false); else - me->GetMotionMaster()->MovePoint(POINT_LANE, LeftSideLanes[_currentLane], false); + me->GetMotionMaster()->MovePoint(POINT_LANE, LeftSideLanes[_currentLane], FORCED_MOVEMENT_NONE, 0.f, false); }, 5s); break; case POINT_LANE: Talk(EMOTE_BREATH); - me->m_Events.AddEventAtOffset([&] { + me->m_Events.AddEventAtOffset([this]() + { for (uint8 i = 0; i < 16; ++i) - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(i*250)); + me->m_Events.AddEventAtOffset(new CorruptTriggers(me, _currentLane), Milliseconds(i * 250)); }, 5s); me->m_Events.AddEventAtOffset([&] { DoCastSelf(SPELL_FELMYST_SPEED_BURST, true); if (me->FindNearestCreature(NPC_WORLD_TRIGGER_RIGHT, 30.0f)) - me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END, LeftSideLanes[_currentLane], false); + me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END, LeftSideLanes[_currentLane], FORCED_MOVEMENT_NONE, 0.f, false); else - me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END, RightSideLanes[_currentLane], false); + me->GetMotionMaster()->MovePoint(POINT_AIR_BREATH_END, RightSideLanes[_currentLane], FORCED_MOVEMENT_NONE, 0.f, false); }, 5s); break; case POINT_AIR_BREATH_END: @@ -338,9 +339,9 @@ struct boss_felmyst : public BossAI me->m_Events.AddEventAtOffset([&] { if (me->FindNearestCreature(NPC_WORLD_TRIGGER_RIGHT, 30.0f)) - me->GetMotionMaster()->MovePoint(POINT_AIR_UP, RightSide, false); + me->GetMotionMaster()->MovePoint(POINT_AIR_UP, RightSide, FORCED_MOVEMENT_NONE, 0.f, false); else - me->GetMotionMaster()->MovePoint(POINT_AIR_UP, LeftSide, false); + me->GetMotionMaster()->MovePoint(POINT_AIR_UP, LeftSide, FORCED_MOVEMENT_NONE, 0.f, false); }, 2s); break; } @@ -362,7 +363,7 @@ struct boss_felmyst : public BossAI me->m_Events.AddEventAtOffset([&] { me->SetImmuneToPC(false); - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, true); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, true); }, 8500ms); }); } @@ -425,7 +426,7 @@ struct npc_demonic_vapor_trail : public NullCreatureAI void Reset() override { me->CastSpell(me, SPELL_DEMONIC_VAPOR_TRAIL_PERIODIC, true); - me->DespawnOrUnsummon(20000); + me->DespawnOrUnsummon(20s); } void SpellHitTarget(Unit* /*unit*/, SpellInfo const* spellInfo) override diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 221f15a236..af4a14d7d8 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -387,7 +387,7 @@ struct boss_kiljaeden : public BossAI { anveena->RemoveAllAuras(); anveena->CastSpell(anveena, SPELL_SACRIFICE_OF_ANVEENA, true); - anveena->DespawnOrUnsummon(1500); + anveena->DespawnOrUnsummon(1500ms); DoCastSelf(SPELL_CUSTOM_08_STATE, true); me->SetUnitFlag(UNIT_FLAG_PACIFIED); scheduler.CancelAll(); @@ -554,8 +554,8 @@ struct boss_kiljaeden : public BossAI summon->SetDisableGravity(true); summon->CastSpell(summon, SPELL_ARMAGEDDON_VISUAL, true); summon->SetPosition(summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ() + 20.0f, 0.0f); - summon->m_Events.AddEvent(new CastArmageddon(summon), summon->m_Events.CalculateTime(6000)); - summon->DespawnOrUnsummon(urand(8000, 10000)); + summon->m_Events.AddEventAtOffset(new CastArmageddon(summon), 6s); + summon->DespawnOrUnsummon(randtime(8s, 10s)); } } @@ -719,7 +719,7 @@ struct npc_kalecgos_kj : public NullCreatureAI me->SetCanFly(false); me->SetDisableGravity(false); me->CastSpell(me, SPELL_TELEPORT_AND_TRANSFORM, true); - events.ScheduleEvent(EVENT_SCENE_01, 35000); + events.ScheduleEvent(EVENT_SCENE_01, 35s); } } @@ -729,25 +729,18 @@ struct npc_kalecgos_kj : public NullCreatureAI if (summon->GetEntry() == NPC_SHATTERED_SUN_RIFTWAKER) { summon->CastSpell(summon, SPELL_TELEPORT_VISUAL, true); - Movement::MoveSplineInit init(summon); + if (summons.size() == 1) - { - init.MoveTo(1727.08f, 656.82f, 28.37f, false, true); - init.SetFacing(5.14f); - } + summon->GetMotionMaster()->MovePoint(0, 1727.08f, 656.82f, 28.37f, FORCED_MOVEMENT_NONE, 0.f, 5.14f, false, true); else - { - init.MoveTo(1738.84f, 627.32f, 28.26f, false, true); - init.SetFacing(2.0f); - } - init.Launch(); + summon->GetMotionMaster()->MovePoint(0, 1738.84f, 627.32f, 28.26f, FORCED_MOVEMENT_NONE, 0.f, 2.0f, false, true); } else if (summon->GetEntry() == NPC_SHATTRATH_PORTAL_DUMMY) { if (Creature* riftwaker = summon->FindNearestCreature(NPC_SHATTERED_SUN_RIFTWAKER, 10.0f)) riftwaker->CastSpell(summon, SPELL_OPEN_PORTAL_FROM_SHATTRATH, false); summon->SetWalk(true); - summon->GetMotionMaster()->MovePoint(0, summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ() + 30.0f, false, true); + summon->GetMotionMaster()->MovePoint(0, summon->GetPositionX(), summon->GetPositionY(), summon->GetPositionZ() + 30.0f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false, true); } else if (summon->GetEntry() == NPC_INERT_PORTAL) summon->CastSpell(summon, SPELL_BOSS_ARCANE_PORTAL_STATE, true); @@ -762,7 +755,7 @@ struct npc_kalecgos_kj : public NullCreatureAI { summon->CastSpell(summon, SPELL_TELEPORT_VISUAL, true); summon->SetWalk(true); - summon->GetMotionMaster()->MovePoint(0, 1710.15f, 639.23f, 27.311f, false, true); + summon->GetMotionMaster()->MovePoint(0, 1710.15f, 639.23f, 27.311f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false, true); } else if (summon->GetEntry() == NPC_THE_CORE_OF_ENTROPIUS) summon->GetMotionMaster()->MovePoint(0, summon->GetPositionX(), summon->GetPositionY(), 30.0f); @@ -775,69 +768,69 @@ struct npc_kalecgos_kj : public NullCreatureAI { case EVENT_SCENE_01: Talk(SAY_KALECGOS_GOODBYE); - events.ScheduleEvent(eventId + 1, 15000); + events.ScheduleEvent(eventId + 1, 15s); break; case EVENT_SCENE_02: me->SummonCreature(NPC_SHATTERED_SUN_RIFTWAKER, 1688.42f, 641.82f, 27.60f, 0.67f); me->SummonCreature(NPC_SHATTERED_SUN_RIFTWAKER, 1712.58f, 616.29f, 27.78f, 0.76f); - events.ScheduleEvent(eventId + 1, 6000); + events.ScheduleEvent(eventId + 1, 6s); break; case EVENT_SCENE_03: me->SummonCreature(NPC_SHATTRATH_PORTAL_DUMMY, 1727.08f + cos(5.14f), 656.82f + std::sin(5.14f), 28.37f + 2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 10000); me->SummonCreature(NPC_SHATTRATH_PORTAL_DUMMY, 1738.84f + cos(2.0f), 627.32f + std::sin(2.0f), 28.26f + 2.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 10000); - events.ScheduleEvent(eventId + 1, 11000); + events.ScheduleEvent(eventId + 1, 11s); break; case EVENT_SCENE_04: me->SummonCreature(NPC_INERT_PORTAL, 1734.96f, 642.43f, 28.06f, 3.49f); - events.ScheduleEvent(eventId + 1, 4000); + events.ScheduleEvent(eventId + 1, 4s); break; case EVENT_SCENE_05: if (Creature* first = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f, 640.49f, 28.06f, 3.49f)) { - first->m_Events.AddEvent(new MoveDelayed(first, 1718.70f, 607.78f, 28.06f, 2.323f), first->m_Events.CalculateTime(5000)); - first->m_Events.AddEvent(new FixOrientation(first), first->m_Events.CalculateTime(12000)); + first->m_Events.AddEventAtOffset(new MoveDelayed(first, 1718.70f, 607.78f, 28.06f, 2.323f), 5s); + first->m_Events.AddEventAtOffset(new FixOrientation(first), 12s); for (uint8 i = 0; i < 9; ++i) if (Creature* follower = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f + 5 * cos(i * 2.0f * M_PI / 9), 640.49f + 5 * std::sin(i * 2.0f * M_PI / 9), 28.06f, 3.49f)) follower->GetMotionMaster()->MoveFollow(first, 3.0f, follower->GetAngle(first)); } - events.ScheduleEvent(eventId + 1, 10000); + events.ScheduleEvent(eventId + 1, 10s); break; case EVENT_SCENE_06: if (Creature* first = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f, 640.49f, 28.06f, 3.49f)) { - first->m_Events.AddEvent(new MoveDelayed(first, 1678.69f, 649.27f, 28.06f, 5.46f), first->m_Events.CalculateTime(5000)); - first->m_Events.AddEvent(new FixOrientation(first), first->m_Events.CalculateTime(14500)); + first->m_Events.AddEventAtOffset(new MoveDelayed(first, 1678.69f, 649.27f, 28.06f, 5.46f), 5s); + first->m_Events.AddEventAtOffset(new FixOrientation(first), 14500ms); for (uint8 i = 0; i < 9; ++i) if (Creature* follower = me->SummonCreature(NPC_SHATTERED_SUN_SOLDIER, 1729.48f + 5 * cos(i * 2.0f * M_PI / 9), 640.49f + 5 * std::sin(i * 2.0f * M_PI / 9), 28.06f, 3.49f)) follower->GetMotionMaster()->MoveFollow(first, 3.0f, follower->GetAngle(first)); } - events.ScheduleEvent(eventId + 1, 12000); + events.ScheduleEvent(eventId + 1, 12s); break; case EVENT_SCENE_07: me->SummonCreature(NPC_LADY_LIADRIN, 1719.87f, 644.265f, 28.06f, 3.83f); me->SummonCreature(NPC_PROPHET_VELEN, 1717.97f, 646.44f, 28.06f, 3.94f); - events.ScheduleEvent(eventId + 1, 7000); + events.ScheduleEvent(eventId + 1, 7s); break; case EVENT_SCENE_08: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_01); - events.ScheduleEvent(eventId + 1, 25000); + events.ScheduleEvent(eventId + 1, 25s); break; case EVENT_SCENE_09: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_02); - events.ScheduleEvent(eventId + 1, 14500); + events.ScheduleEvent(eventId + 1, 14500ms); break; case EVENT_SCENE_10: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_03); - events.ScheduleEvent(eventId + 1, 12500); + events.ScheduleEvent(eventId + 1, 12500ms); break; case EVENT_SCENE_11: me->SummonCreature(NPC_THE_CORE_OF_ENTROPIUS, 1698.86f, 628.73f, 92.83f, 0.0f); if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->CastSpell(velen, SPELL_CALL_ENTROPIUS, false); - events.ScheduleEvent(eventId + 1, 8000); + events.ScheduleEvent(eventId + 1, 8s); break; case EVENT_SCENE_12: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) @@ -845,32 +838,32 @@ struct npc_kalecgos_kj : public NullCreatureAI velen->InterruptNonMeleeSpells(false); velen->AI()->Talk(SAY_VELEN_04); } - events.ScheduleEvent(eventId + 1, 20000); + events.ScheduleEvent(eventId + 1, 20s); break; case EVENT_SCENE_13: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->GetMotionMaster()->MovePoint(0, 1711.28f, 637.29f, 27.29f); - events.ScheduleEvent(eventId + 1, 6000); + events.ScheduleEvent(eventId + 1, 6s); break; case EVENT_SCENE_14: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->AI()->Talk(SAY_LIADRIN_01); - events.ScheduleEvent(eventId + 1, 10000); + events.ScheduleEvent(eventId + 1, 10s); break; case EVENT_SCENE_15: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_05); - events.ScheduleEvent(eventId + 1, 14000); + events.ScheduleEvent(eventId + 1, 14s); break; case EVENT_SCENE_16: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->AI()->Talk(SAY_LIADRIN_02); - events.ScheduleEvent(eventId + 1, 2000); + events.ScheduleEvent(eventId + 1, 2s); break; case EVENT_SCENE_17: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_06); - events.ScheduleEvent(eventId + 1, 3000); + events.ScheduleEvent(eventId + 1, 3s); break; case EVENT_SCENE_18: if (Creature* core = summons.GetCreatureWithEntry(NPC_THE_CORE_OF_ENTROPIUS)) @@ -878,7 +871,7 @@ struct npc_kalecgos_kj : public NullCreatureAI core->RemoveAllAuras(); core->CastSpell(core, SPELL_BLAZE_TO_LIGHT, true); } - events.ScheduleEvent(eventId + 1, 8000); + events.ScheduleEvent(eventId + 1, 8s); break; case EVENT_SCENE_19: if (Creature* core = summons.GetCreatureWithEntry(NPC_THE_CORE_OF_ENTROPIUS)) @@ -886,42 +879,42 @@ struct npc_kalecgos_kj : public NullCreatureAI core->SetObjectScale(0.75f); core->GetMotionMaster()->MovePoint(0, core->GetPositionX(), core->GetPositionY(), 28.0f); } - events.ScheduleEvent(eventId + 1, 2000); + events.ScheduleEvent(eventId + 1, 2s); break; case EVENT_SCENE_20: if (Creature* core = summons.GetCreatureWithEntry(NPC_THE_CORE_OF_ENTROPIUS)) core->CastSpell(core, SPELL_SUNWELL_IGNITION, true); - events.ScheduleEvent(eventId + 1, 3000); + events.ScheduleEvent(eventId + 1, 3s); break; case EVENT_SCENE_21: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_07); - events.ScheduleEvent(eventId + 1, 15000); + events.ScheduleEvent(eventId + 1, 15s); break; case EVENT_SCENE_22: if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->AI()->Talk(SAY_LIADRIN_03); - events.ScheduleEvent(eventId + 1, 20000); + events.ScheduleEvent(eventId + 1, 20s); break; case EVENT_SCENE_23: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_08); if (Creature* liadrin = summons.GetCreatureWithEntry(NPC_LADY_LIADRIN)) liadrin->SetStandState(UNIT_STAND_STATE_KNEEL); - events.ScheduleEvent(eventId + 1, 8000); + events.ScheduleEvent(eventId + 1, 8s); break; case EVENT_SCENE_24: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) velen->AI()->Talk(SAY_VELEN_09); - events.ScheduleEvent(eventId + 1, 5000); + events.ScheduleEvent(eventId + 1, 5s); break; case EVENT_SCENE_25: if (Creature* velen = summons.GetCreatureWithEntry(NPC_PROPHET_VELEN)) { velen->GetMotionMaster()->MovePoint(0, 1739.38f, 643.79f, 28.06f); - velen->DespawnOrUnsummon(5000); + velen->DespawnOrUnsummon(5s); } - events.ScheduleEvent(eventId + 1, 3000); + events.ScheduleEvent(eventId + 1, 3s); break; case EVENT_SCENE_26: for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) @@ -929,9 +922,9 @@ struct npc_kalecgos_kj : public NullCreatureAI if (summon->GetEntry() == NPC_SHATTERED_SUN_SOLDIER) { summon->GetMotionMaster()->MovePoint(0, 1739.38f, 643.79f, 28.06f); - summon->DespawnOrUnsummon(summon->GetExactDist2d(1734.96f, 642.43f) * 100); + summon->DespawnOrUnsummon(Milliseconds(uint32(summon->GetExactDist2d(1734.96f, 642.43f) * 100))); } - events.ScheduleEvent(eventId + 1, 7000); + events.ScheduleEvent(eventId + 1, 7s); break; case EVENT_SCENE_27: me->setActive(false); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 863954f0ff..d2cc53486d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -274,7 +274,7 @@ struct npc_singularity : public NullCreatureAI void Reset() override { - me->DespawnOrUnsummon(18000); + me->DespawnOrUnsummon(18s); me->m_Events.AddEventAtOffset([&] { DoCastSelf(SPELL_BLACK_HOLE_SUMMON_VISUAL, true); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 065192bf74..863f4a2449 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -161,72 +161,72 @@ static PlayerAbilityStruct PlayerAbility[13][3] = // 0 UNK class (should never be set) { // Warrior as fallback behavior if for some reason UNK class - { SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6000ms } + { SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10s }, + { SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10s }, + { SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6s } }, // 1 warrior - { { SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6000ms } + { { SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10s }, + { SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10s }, + { SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6s } }, // 2 paladin - { { SPELL_PA_CONSECRATION, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_PA_HOLY_LIGHT, ABILITY_TARGET_HEAL, 10000ms }, - { SPELL_PA_AVENGING_WRATH, ABILITY_TARGET_SELF, 10000ms } + { { SPELL_PA_CONSECRATION, ABILITY_TARGET_SELF, 10s }, + { SPELL_PA_HOLY_LIGHT, ABILITY_TARGET_HEAL, 10s }, + { SPELL_PA_AVENGING_WRATH, ABILITY_TARGET_SELF, 10s } }, // 3 hunter - { { SPELL_HU_EXPLOSIVE_TRAP, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_HU_FREEZING_TRAP, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_HU_SNAKE_TRAP, ABILITY_TARGET_SELF, 10000ms } + { { SPELL_HU_EXPLOSIVE_TRAP, ABILITY_TARGET_SELF, 10s }, + { SPELL_HU_FREEZING_TRAP, ABILITY_TARGET_SELF, 10s }, + { SPELL_HU_SNAKE_TRAP, ABILITY_TARGET_SELF, 10s } }, // 4 rogue - { { SPELL_RO_WOUND_POISON, ABILITY_TARGET_VICTIM, 3000ms }, - { SPELL_RO_SLICE_DICE, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_RO_BLIND, ABILITY_TARGET_ENEMY, 10000ms } + { { SPELL_RO_WOUND_POISON, ABILITY_TARGET_VICTIM, 3s }, + { SPELL_RO_SLICE_DICE, ABILITY_TARGET_SELF, 10s }, + { SPELL_RO_BLIND, ABILITY_TARGET_ENEMY, 10s } }, // 5 priest - { { SPELL_PR_PAIN_SUPP, ABILITY_TARGET_HEAL, 10000ms }, - { SPELL_PR_HEAL, ABILITY_TARGET_HEAL, 10000ms }, - { SPELL_PR_PSYCHIC_SCREAM, ABILITY_TARGET_SELF, 10000ms } + { { SPELL_PR_PAIN_SUPP, ABILITY_TARGET_HEAL, 10s }, + { SPELL_PR_HEAL, ABILITY_TARGET_HEAL, 10s }, + { SPELL_PR_PSYCHIC_SCREAM, ABILITY_TARGET_SELF, 10s } }, // 6 death knight { - { SPELL_DK_PLAGUE_STRIKE, ABILITY_TARGET_ENEMY, 2000ms }, - { SPELL_DK_DEATH_AND_DECAY, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_DK_BLOOD_WORMS, ABILITY_TARGET_ENEMY, 5000ms } + { SPELL_DK_PLAGUE_STRIKE, ABILITY_TARGET_ENEMY, 2s }, + { SPELL_DK_DEATH_AND_DECAY, ABILITY_TARGET_SELF, 10s }, + { SPELL_DK_BLOOD_WORMS, ABILITY_TARGET_ENEMY, 5s } }, // 7 shaman - { { SPELL_SH_FIRE_NOVA, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_SH_HEALING_WAVE, ABILITY_TARGET_HEAL, 10000ms }, - { SPELL_SH_CHAIN_LIGHT, ABILITY_TARGET_ENEMY, 8000ms } + { { SPELL_SH_FIRE_NOVA, ABILITY_TARGET_SELF, 10s }, + { SPELL_SH_HEALING_WAVE, ABILITY_TARGET_HEAL, 10s }, + { SPELL_SH_CHAIN_LIGHT, ABILITY_TARGET_ENEMY, 8s } }, // 8 mage - { { SPELL_MG_FIREBALL, ABILITY_TARGET_ENEMY, 5000ms }, - { SPELL_MG_FROSTBOLT, ABILITY_TARGET_ENEMY, 5000ms }, - { SPELL_MG_ICE_LANCE, ABILITY_TARGET_SPECIAL, 2000ms } + { { SPELL_MG_FIREBALL, ABILITY_TARGET_ENEMY, 5s }, + { SPELL_MG_FROSTBOLT, ABILITY_TARGET_ENEMY, 5s }, + { SPELL_MG_ICE_LANCE, ABILITY_TARGET_SPECIAL, 2s } }, // 9 warlock - { { SPELL_WL_CURSE_OF_DOOM, ABILITY_TARGET_ENEMY, 10000ms }, - { SPELL_WL_RAIN_OF_FIRE, ABILITY_TARGET_ENEMY, 10000ms }, - { SPELL_WL_UNSTABLE_AFFL, ABILITY_TARGET_ENEMY, 10000ms } + { { SPELL_WL_CURSE_OF_DOOM, ABILITY_TARGET_ENEMY, 10s }, + { SPELL_WL_RAIN_OF_FIRE, ABILITY_TARGET_ENEMY, 10s }, + { SPELL_WL_UNSTABLE_AFFL, ABILITY_TARGET_ENEMY, 10s } }, // 10 UNK class (should never be set) { // Warrior as fallback behavior if for some reason UNK class - { SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6000ms } + { SPELL_WR_SPELL_REFLECT, ABILITY_TARGET_SELF, 10s }, + { SPELL_WR_WHIRLWIND, ABILITY_TARGET_SELF, 10s }, + { SPELL_WR_MORTAL_STRIKE, ABILITY_TARGET_VICTIM, 6s } }, // 11 druid - { { SPELL_DR_LIFEBLOOM, ABILITY_TARGET_HEAL, 10000ms }, - { SPELL_DR_THORNS, ABILITY_TARGET_SELF, 10000ms }, - { SPELL_DR_MOONFIRE, ABILITY_TARGET_ENEMY, 8000ms } + { { SPELL_DR_LIFEBLOOM, ABILITY_TARGET_HEAL, 10s }, + { SPELL_DR_THORNS, ABILITY_TARGET_SELF, 10s }, + { SPELL_DR_MOONFIRE, ABILITY_TARGET_ENEMY, 8s } }, // MISC shadow priest - { { SPELL_PR_MIND_CONTROL, ABILITY_TARGET_ENEMY, 15000ms }, - { SPELL_PR_MIND_BLAST, ABILITY_TARGET_ENEMY, 5000ms }, - { SPELL_PR_SW_DEATH, ABILITY_TARGET_ENEMY, 10000ms } + { { SPELL_PR_MIND_CONTROL, ABILITY_TARGET_ENEMY, 15s }, + { SPELL_PR_MIND_BLAST, ABILITY_TARGET_ENEMY, 5s }, + { SPELL_PR_SW_DEATH, ABILITY_TARGET_ENEMY, 10s } } }; @@ -244,7 +244,7 @@ struct boss_hexlord_malacrass : public BossAI { BossAI::Reset(); _currentClass = CLASS_NONE; - _classAbilityTimer = 10000ms; + _classAbilityTimer = 10s; _timeUntilNextDrainPower = 0ms; SpawnAdds(); ScheduleHealthCheckEvent(80, [&] { diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 22c405ed62..91cbfb02a0 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -127,7 +127,7 @@ struct boss_nalorakk : public BossAI { _introScheduler.CancelGroup(GROUP_CHECK_DEAD); _waveList.clear(); - me->GetMotionMaster()->MovePath(me->GetEntry()*100+1, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry()*100+1, false); Talk(SAY_RUN_AWAY); _introScheduler.Schedule(5s, [this](TaskContext) { @@ -153,7 +153,7 @@ struct boss_nalorakk : public BossAI _introScheduler.CancelGroup(GROUP_CHECK_DEAD); _waveList.clear(); Talk(SAY_RUN_AWAY); - me->GetMotionMaster()->MovePath(me->GetEntry()*100+2, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry()*100+2, false); _introScheduler.Schedule(6s, [this](TaskContext) { me->SetFacingTo(1.54f); @@ -176,7 +176,7 @@ struct boss_nalorakk : public BossAI _introScheduler.CancelGroup(GROUP_CHECK_DEAD); _waveList.clear(); Talk(SAY_RUN_AWAY); - me->GetMotionMaster()->MovePath(me->GetEntry() * 100 + 3, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 100 + 3, false); _introScheduler.Schedule(6s, [this](TaskContext) { me->SetFacingTo(1.54f); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp index b33a057db3..7add91965c 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp @@ -285,10 +285,7 @@ struct boss_zuljin : public BossAI instance->SetBossState(DATA_ZULJIN, DONE); Talk(SAY_DEATH); summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE); - - me->m_Events.AddEventAtOffset( [this] { - summons.DespawnAll(); - }, 3s); + summons.DespawnAll(3s); } void SpawnAdds() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index 6dd4a8c9e2..efff4f78b3 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -78,7 +78,7 @@ struct npc_forest_frog : public ScriptedAI void MovementInform(uint32 type, uint32 data) override { if (type == POINT_MOTION_TYPE && data == POINT_DESPAWN) - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } void UpdateAI(uint32 diff) override @@ -103,7 +103,7 @@ struct npc_forest_frog : public ScriptedAI Talk(SAY_THANKS_FREED, player); eventTimer = 2; - events.ScheduleEvent(eventTimer, urand(4000, 5000)); + events.ScheduleEvent(eventTimer, 4s, 5s); break; case 2: if (me->GetEntry() != NPC_GUNTER && me->GetEntry() != NPC_KYREN) // vendors don't kneel? @@ -140,7 +140,7 @@ struct npc_forest_frog : public ScriptedAI break; } eventTimer = 3; - events.ScheduleEvent(eventTimer, urand(6000, 7000)); + events.ScheduleEvent(eventTimer, 6s, 7s); break; case 3: me->SetStandState(EMOTE_ONESHOT_NONE); @@ -152,9 +152,9 @@ struct npc_forest_frog : public ScriptedAI eventTimer = 4; if (me->GetEntry() == NPC_GUNTER || me->GetEntry() == NPC_KYREN) - events.ScheduleEvent(eventTimer, 5 * MINUTE * IN_MILLISECONDS); // vendors wait for 5 minutes before running away and despawning + events.ScheduleEvent(eventTimer, 300s); // vendors wait for 5 minutes before running away and despawning else - events.ScheduleEvent(eventTimer, 6000); + events.ScheduleEvent(eventTimer, 6s); break; case 4: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); @@ -165,7 +165,7 @@ struct npc_forest_frog : public ScriptedAI Talk(SAY_GOODBYE, player); eventTimer = 5; - events.ScheduleEvent(eventTimer, 2000); + events.ScheduleEvent(eventTimer, 2s); break; case 5: @@ -205,7 +205,7 @@ struct npc_forest_frog : public ScriptedAI // start generic rp eventTimer = 1; - events.ScheduleEvent(eventTimer, 3000); + events.ScheduleEvent(eventTimer, 3s); me->UpdateEntry(cEntry); @@ -400,7 +400,7 @@ struct npc_harrison_jones : public ScriptedAI Talk(SAY_HARRISON_0); scheduler.Schedule(2s, [this](TaskContext /*task*/) { - me->GetMotionMaster()->MovePath(HARRISON_MOVE_1, false); + me->GetMotionMaster()->MoveWaypoint(HARRISON_MOVE_1, false); }); } } @@ -448,7 +448,7 @@ struct npc_harrison_jones : public ScriptedAI // Players are Now Saved to instance at SPECIAL (Player should be notified?) scheduler.Schedule(500ms, [this](TaskContext /*task*/) { - me->GetMotionMaster()->MovePath(HARRISON_MOVE_2, false); + me->GetMotionMaster()->MoveWaypoint(HARRISON_MOVE_2, false); }); } } @@ -486,7 +486,7 @@ struct npc_harrison_jones : public ScriptedAI void MovementInform(uint32 type, uint32 id) override { // at gong - if (type == WAYPOINT_MOTION_TYPE && id == 2 && _phase == PHASE_GONG) + if (type == WAYPOINT_MOTION_TYPE && id == 3 && _phase == PHASE_GONG) { if (GameObject* gong = _instance->GetGameObject(DATA_STRANGE_GONG)) me->SetFacingToObject(gong); @@ -503,13 +503,13 @@ struct npc_harrison_jones : public ScriptedAI }); } // to the massive gate - else if (type == WAYPOINT_MOTION_TYPE && id == 1 && _phase == PHASE_GATE_CLOSED) + else if (type == WAYPOINT_MOTION_TYPE && id == 2 && _phase == PHASE_GATE_CLOSED) { me->SetEntry(NPC_HARRISON_JONES_1); Talk(SAY_HARRISON_2); } // at massive gate - else if (type == WAYPOINT_MOTION_TYPE && id == 2 && _phase == PHASE_GATE_CLOSED) + else if (type == WAYPOINT_MOTION_TYPE && id == 3 && _phase == PHASE_GATE_CLOSED) { me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); Talk(SAY_HARRISON_3); @@ -521,7 +521,7 @@ struct npc_harrison_jones : public ScriptedAI { DoCastSelf(SPELL_STEALTH); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - me->GetMotionMaster()->MovePath(HARRISON_MOVE_3, false); + me->GetMotionMaster()->MoveWaypoint(HARRISON_MOVE_3, false); }); } } @@ -592,14 +592,14 @@ struct npc_amanishi_lookout : public NullCreatureAI Talk(SAY_INVADERS); me->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_PC); me->SetUnitFlag(UNIT_FLAG_RENAME); - me->GetMotionMaster()->MovePath(PATH_LOOKOUT, false); + me->GetMotionMaster()->MoveWaypoint(PATH_LOOKOUT, false); } } void MovementInform(uint32 type, uint32 id) override { // at boss - if (type == WAYPOINT_MOTION_TYPE && id == 8) // should despawn with waypoint script + if (type == WAYPOINT_MOTION_TYPE && id == 9) // should despawn with waypoint script me->DespawnOrUnsummon(0s, 0s); } private: diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp index 5cabaf62c4..4b90e0ea21 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp @@ -330,7 +330,7 @@ public: if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetGuidData(NPC_ARLOKK))) me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ()); - _events.ScheduleEvent(EVENT_ATTACK, 6000); + _events.ScheduleEvent(EVENT_ATTACK, 6s); } void JustEngagedWith(Unit* /*who*/) override @@ -355,7 +355,7 @@ public: if (arlokk->IsAlive()) arlokk->GetAI()->SetData(_sideData, 0); } - me->DespawnOrUnsummon(4000); + me->DespawnOrUnsummon(4s); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp index 1b8d13bbf7..6975e98a1f 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp @@ -41,7 +41,7 @@ struct boss_gahzranka : public BossAI void IsSummonedBy(WorldObject* /*summoner*/) override { - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); } void JustEngagedWith(Unit* /*who*/) override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp index c750fd59c6..0b4bddc3d8 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp @@ -140,7 +140,7 @@ struct boss_jeklik : public BossAI me->SetDisableGravity(true); DoCastSelf(SPELL_BAT_FORM, true); - me->GetMotionMaster()->MovePath(PATH_JEKLIK_INTRO, false); + me->GetMotionMaster()->MoveWaypoint(PATH_JEKLIK_INTRO, false); } void PathEndReached(uint32 pathId) override @@ -295,7 +295,7 @@ struct npc_batrider : public CreatureAI me->SetSpeed(MOVE_WALK, 5.0f, true); me->SetCanFly(true); - me->GetMotionMaster()->MoveSplinePath(PATH_BATRIDER_LOOP); + me->GetMotionMaster()->MovePath(PATH_BATRIDER_LOOP); } else { @@ -375,7 +375,7 @@ struct npc_batrider : public CreatureAI if (!me->isMoving()) { me->SetCanFly(true); - me->GetMotionMaster()->MoveSplinePath(PATH_BATRIDER_LOOP); + me->GetMotionMaster()->MovePath(PATH_BATRIDER_LOOP); } } else if (_mode == BATRIDER_MODE_TRASH) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index e02c69e0f3..251e76ad57 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -80,7 +80,7 @@ enum Misc MODEL_OHGAN_MOUNT = 15271, PATH_MANDOKIR = 492861, - POINT_MANDOKIR_END = 24, + POINT_MANDOKIR_END = 25, CHAINED_SPIRIT_COUNT = 20, ACTION_CHARGE = 1 }; @@ -156,7 +156,7 @@ public: killCount = 0; if (me->GetPositionZ() > 140.0f) { - events.ScheduleEvent(EVENT_CHECK_START, 1000); + events.ScheduleEvent(EVENT_CHECK_START, 1s); if (Creature* speaker = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_VILEBRANCH_SPEAKER))) { if (!speaker->IsAlive()) @@ -250,7 +250,7 @@ public: } } - void SetGUID(ObjectGuid const guid, int32 type) override + void SetGUID(ObjectGuid const& guid, int32 type) override { if (type == ACTION_CHARGE) { @@ -564,7 +564,7 @@ public: RevivePlayer(victim, reviveGUID); } - void SetGUID(ObjectGuid const guid, int32 /*type = 0 */) override + void SetGUID(ObjectGuid const& guid, int32 /*type = 0 */) override { reviveGUID = guid; } @@ -612,7 +612,7 @@ public: revivePlayerGUID.Clear(); } - void SetGUID(ObjectGuid const guid, int32 /*id*/) override + void SetGUID(ObjectGuid const& guid, int32 /*id*/) override { revivePlayerGUID = guid; } @@ -641,7 +641,7 @@ public: { DoCast(target, SPELL_REVIVE); } - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } diff --git a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp index 376e746677..dea0884b75 100644 --- a/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp @@ -78,7 +78,7 @@ public: break; case 11: Talk(SAY_PROGRESS_6, player); - SetRun(); + me->SetWalk(false); break; case 19: Talk(SAY_PROGRESS_7, player); @@ -106,7 +106,8 @@ public: if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) { Talk(SAY_PROGRESS_1, player); - npc_escortAI::Start(false, false, player->GetGUID(), quest); + me->SetWalk(true); + Start(false, player->GetGUID(), quest); me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); } } diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp index d7d06ac3f4..14a1aa6b78 100644 --- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp +++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp @@ -64,7 +64,7 @@ struct boss_twilight_corrupter : public ScriptedAI { if (creature->IsAlive() && me->GetGUID() != creature->GetGUID()) { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); break; } } diff --git a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp index c90d2d78b7..5357b8e14f 100644 --- a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp @@ -93,7 +93,7 @@ public: _faction = faction; } - void SetGUID(ObjectGuid guid, int32) override + void SetGUID(ObjectGuid const& guid, int32) override { _playerGUID = guid; me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE); @@ -207,7 +207,7 @@ public: EnterEvadeMode(); return; } - events.RepeatEvent(2000); + events.Repeat(2s); break; } case EVENT_SUMMON_ARCHERS: @@ -217,7 +217,7 @@ public: _spoken = false; SummonPeasants(); _spoken = false; - events.RepeatEvent(60 * IN_MILLISECONDS); + events.Repeat(60s); break; } } @@ -262,7 +262,7 @@ public: if (Unit* creature = summon->GetSummonerUnit()) creature->GetAI()->DoAction(1); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void JustDied(Unit*) override diff --git a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp index 45184f8384..ef651b4c69 100644 --- a/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_elwynn_forest.cpp @@ -112,11 +112,11 @@ struct npc_cameron : public ScriptedAI if (Creature* children = ObjectAccessor::GetCreature(*me, _childrenGUIDs[i])) { children->SetWalk(true); - children->GetMotionMaster()->MovePoint(0, MovePosPositions[i], true, MovePosPositions[i].GetOrientation()); + children->GetMotionMaster()->MovePoint(0, MovePosPositions[i]); } } me->SetWalk(true); - me->GetMotionMaster()->MovePoint(0, MovePosPositions.back(), true, MovePosPositions.back().GetOrientation()); + me->GetMotionMaster()->MovePoint(0, MovePosPositions.back()); } void PathEndReached(uint32 pathId) override @@ -182,13 +182,13 @@ struct npc_cameron : public ScriptedAI switch (eventId) { case EVENT_WP_START_GOLDSHIRE: - me->GetMotionMaster()->MovePath(GOLDSHIRE_PATH, false); + me->GetMotionMaster()->MoveWaypoint(GOLDSHIRE_PATH, false); break; case EVENT_WP_START_WOODS: - me->GetMotionMaster()->MovePath(WOODS_PATH, false); + me->GetMotionMaster()->MoveWaypoint(WOODS_PATH, false); break; case EVENT_WP_START_HOUSE: - me->GetMotionMaster()->MovePath(HOUSE_PATH, false); + me->GetMotionMaster()->MoveWaypoint(HOUSE_PATH, false); break; case EVENT_WP_START_LISA: for (uint32 i = 0; i < _childrenGUIDs.size(); ++i) @@ -197,7 +197,7 @@ struct npc_cameron : public ScriptedAI { if (lisa->GetEntry() == NPC_LISA) { - lisa->GetMotionMaster()->MovePath(LISA_PATH, false); + lisa->GetMotionMaster()->MoveWaypoint(LISA_PATH, false); break; } } @@ -233,7 +233,7 @@ struct npc_cameron : public ScriptedAI child->SearchFormation(); // Start movement - me->GetMotionMaster()->MovePath(STORMWIND_PATH, false); + me->GetMotionMaster()->MoveWaypoint(STORMWIND_PATH, false); break; } @@ -386,7 +386,7 @@ struct npc_eastvale_peasent : public ScriptedAI me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->CastSpell(me, SPELL_TRANSFORM_PEASENT_WITH_WOOD); me->SetSpeed(MOVE_WALK, 1.0f); - me->GetMotionMaster()->MovePath(_path, false); + me->GetMotionMaster()->MoveWaypoint(_path, false); } } @@ -418,7 +418,7 @@ struct npc_eastvale_peasent : public ScriptedAI switch (eventId) { case EVENT_MOVETORAELEN: - me->GetMotionMaster()->MovePath(_path + 1, false); + me->GetMotionMaster()->MoveWaypoint(_path + 1, false); break; case EVENT_TALKTORAELEN1: if (Creature* realen = me->FindNearestCreature(NPC_SUPERVISOR_RAELEN, 2.0f, true)) @@ -492,7 +492,7 @@ struct npc_eastvale_peasent : public ScriptedAI case EVENT_PATHBACK: if (Creature* realen = ObjectAccessor::GetCreature(*me, _realenGUID)) realen->AI()->SetData(1, 1); - me->GetMotionMaster()->MovePath(_path + 2, false); + me->GetMotionMaster()->MoveWaypoint(_path + 2, false); break; } } diff --git a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp index cd3612d4eb..cc3f0104b9 100644 --- a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp +++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp @@ -60,7 +60,7 @@ struct npc_partygoer_pather : public ScriptedAI switch (eventId) { case EVENT_PATH: - me->GetMotionMaster()->MovePath(_path, false); + me->GetMotionMaster()->MoveWaypoint(_path, false); break; case EVENT_RANDOM_ACTION_PATHER: { @@ -139,7 +139,7 @@ struct npc_partygoer : public ScriptedAI void Reset() override { - _events.ScheduleEvent(EVENT_RANDOM_ACTION, urand(1000, 20000)); + _events.ScheduleEvent(EVENT_RANDOM_ACTION, 1s, 20s); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp index da2cb493e4..b570c1d181 100644 --- a/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp @@ -113,7 +113,8 @@ struct npc_ranger_lilatha : public npc_escortAI if (quest->GetQuestId() == QUEST_ESCAPE_FROM_THE_CATACOMBS) { me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - npc_escortAI::Start(true, false, player->GetGUID()); + me->SetWalk(true); + Start(true, player->GetGUID()); } } }; @@ -148,13 +149,13 @@ struct npc_sentinel_leader : public ScriptedAI { switch (id) { - case 1: - case 4: - case 7: + case 2: + case 5: case 8: - case 13: + case 9: case 14: - case 17: + case 15: + case 18: Creature* SentinelSpy = me->FindNearestCreature(NPC_SENTINEL_SPY, 2.0f, true); if (SentinelSpy) { @@ -281,10 +282,10 @@ struct npc_sentinel_infiltrator : public ScriptedAI case PATH_ONE: switch (id) { - case 5: - case 8: - case 14: - case 18: + case 6: + case 9: + case 15: + case 19: Creature* SentinelInfiltrator = me->FindNearestCreature(NPC_SENTINEL_INFILTRATOR, 3.5f, true); if (SentinelInfiltrator) { @@ -298,10 +299,10 @@ struct npc_sentinel_infiltrator : public ScriptedAI case PATH_TWO: switch (id) { - case 5: - case 7: - case 14: - case 17: + case 6: + case 8: + case 15: + case 18: Creature* SentinelInfiltrator = me->FindNearestCreature(NPC_SENTINEL_INFILTRATOR, 3.5f, true); if (SentinelInfiltrator) { diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp index 4659c2b79a..f48aa5c06c 100644 --- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp @@ -132,7 +132,8 @@ public: if (GameObject* go = me->FindNearestGameObject(GO_RINJI_CAGE, INTERACTION_DISTANCE)) go->UseDoorOrButton(); - npc_escortAI::Start(false, false, player->GetGUID(), quest); + me->SetWalk(true); + Start(false, player->GetGUID(), quest); } } @@ -156,7 +157,7 @@ public: case 17: Talk(SAY_RIN_COMPLETE, player); player->GroupEventHappens(QUEST_RINJI_TRAPPED, me); - SetRun(); + me->SetWalk(false); postEventCount = 1; break; } diff --git a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp index be0caf53d1..15192af962 100644 --- a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp +++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp @@ -136,25 +136,25 @@ public: if (Creature* c = me->FindNearestCreature(NPC_THALORIEN_REMAINS, 100.0f, true)) c->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); events.Reset(); - events.ScheduleEvent(EVENT_CHECK_PLAYER, 5000); - events.ScheduleEvent(EVENT_SUMMON_SOLDIERS, 0); - events.ScheduleEvent(EVENT_TALK_INTRO_0, 3000); - events.ScheduleEvent(EVENT_TALK_INTRO_1, 8000); - events.ScheduleEvent(EVENT_TALK_INTRO_2, 15000); - events.ScheduleEvent(EVENT_TALK_INTRO_3, 22000); - events.ScheduleEvent(EVENT_SALUTE, 24000); - events.ScheduleEvent(EVENT_SOLDIERS_RUN_AWAY, 30000); - events.ScheduleEvent(EVENT_GO_FIGHTPOINT, 31000); - events.ScheduleEvent(EVENT_TALK_SPAWN_0, 38000); - events.ScheduleEvent(EVENT_SUMMON_MORLEN, 44000); - events.ScheduleEvent(EVENT_TALK_SPAWN_1, 47000); - events.ScheduleEvent(EVENT_TALK_MORLEN_0, 52000); - events.ScheduleEvent(EVENT_TALK_MORLEN_1, 58000); - events.ScheduleEvent(EVENT_SPAWN_WAVE_1, 61000); - - events.ScheduleEvent(EVENT_SPELL_BLADESTORM, urand(6000, 15000)); - events.ScheduleEvent(EVENT_SPELL_MORTAL_STRIKE, urand(3000, 7000)); - events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, urand(4000, 10000)); + events.ScheduleEvent(EVENT_CHECK_PLAYER, 5s); + events.ScheduleEvent(EVENT_SUMMON_SOLDIERS, 0ms); + events.ScheduleEvent(EVENT_TALK_INTRO_0, 3s); + events.ScheduleEvent(EVENT_TALK_INTRO_1, 8s); + events.ScheduleEvent(EVENT_TALK_INTRO_2, 15s); + events.ScheduleEvent(EVENT_TALK_INTRO_3, 22s); + events.ScheduleEvent(EVENT_SALUTE, 24s); + events.ScheduleEvent(EVENT_SOLDIERS_RUN_AWAY, 30s); + events.ScheduleEvent(EVENT_GO_FIGHTPOINT, 31s); + events.ScheduleEvent(EVENT_TALK_SPAWN_0, 38s); + events.ScheduleEvent(EVENT_SUMMON_MORLEN, 44s); + events.ScheduleEvent(EVENT_TALK_SPAWN_1, 47s); + events.ScheduleEvent(EVENT_TALK_MORLEN_0, 52s); + events.ScheduleEvent(EVENT_TALK_MORLEN_1, 58s); + events.ScheduleEvent(EVENT_SPAWN_WAVE_1, 61s); + + events.ScheduleEvent(EVENT_SPELL_BLADESTORM, 6s, 15s); + events.ScheduleEvent(EVENT_SPELL_MORTAL_STRIKE, 3s, 7s); + events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, 4s, 10s); } void JustSummoned(Creature* summon) override @@ -172,10 +172,10 @@ public: me->RemoveAurasDueToSpell(67541); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); me->GetMotionMaster()->MoveCharge(11779.30f, -7065.43f, 24.92f, me->GetSpeed(MOVE_RUN), EVENT_CHARGE); - events.ScheduleEvent(EVENT_OUTRO_0, 0); - events.ScheduleEvent(EVENT_OUTRO_1, 5000); - events.ScheduleEvent(EVENT_OUTRO_2, 12000); - events.ScheduleEvent(EVENT_OUTRO_3, 19000); + events.ScheduleEvent(EVENT_OUTRO_0, 0ms); + events.ScheduleEvent(EVENT_OUTRO_1, 5s); + events.ScheduleEvent(EVENT_OUTRO_2, 12s); + events.ScheduleEvent(EVENT_OUTRO_3, 19s); } else if (summons.size() == 1) { @@ -184,13 +184,13 @@ public: switch (summon->GetEntry()) { case NPC_SCOURGE_ZOMBIE: - events.ScheduleEvent(EVENT_SPAWN_WAVE_2, 3000); + events.ScheduleEvent(EVENT_SPAWN_WAVE_2, 3s); break; case NPC_GHOUL_INVADER: - events.ScheduleEvent(EVENT_SPAWN_WAVE_3, 3000); + events.ScheduleEvent(EVENT_SPAWN_WAVE_3, 3s); break; case NPC_CRYPT_RAIDER: - events.ScheduleEvent(EVENT_SUMMONS_ATTACK, 3000); + events.ScheduleEvent(EVENT_SUMMONS_ATTACK, 3s); break; } } @@ -227,7 +227,7 @@ public: if (Player* p = ObjectAccessor::GetPlayer(*me, playerGUID)) if (p->GetExactDist(me) <= 50.0f) { - events.RepeatEvent(5000); + events.Repeat(5s); break; } me->setActive(false); @@ -266,7 +266,7 @@ public: { if (!summons.empty()) { - events.RepeatEvent(5000); + events.Repeat(5s); return; } else @@ -350,7 +350,7 @@ public: break; } } - events.ScheduleEvent(EVENT_SUMMONS_ATTACK, 3000); + events.ScheduleEvent(EVENT_SUMMONS_ATTACK, 3s); break; case EVENT_SUMMONS_ATTACK: for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) @@ -370,13 +370,13 @@ public: case EVENT_OUTRO_3: Talk(SAY_OUTRO_0 + (evId - EVENT_OUTRO_0)); if (evId == EVENT_OUTRO_3) - events.ScheduleEvent(EVENT_OUTRO_KNEEL, 6000); + events.ScheduleEvent(EVENT_OUTRO_KNEEL, 6s); break; case EVENT_OUTRO_KNEEL: if (Player* p = ObjectAccessor::GetPlayer(*me, playerGUID)) p->KilledMonsterCredit(NPC_THALORIEN_KILL_CREDIT); me->SetStandState(UNIT_STAND_STATE_KNEEL); - events.ScheduleEvent(EVENT_DISAPPEAR, 6000); + events.ScheduleEvent(EVENT_DISAPPEAR, 6s); break; case EVENT_DISAPPEAR: me->SetVisible(false); @@ -390,17 +390,17 @@ public: case EVENT_SPELL_BLADESTORM: if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) me->CastSpell(me->GetVictim(), 67541, false); - events.RepeatEvent(urand(25000, 35000)); + events.Repeat(25s, 35s); break; case EVENT_SPELL_MORTAL_STRIKE: if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) me->CastSpell(me->GetVictim(), 67542, false); - events.RepeatEvent(urand(7000, 12000)); + events.Repeat(7s, 12s); break; case EVENT_SPELL_HEROIC_STRIKE: if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) me->CastSpell(me->GetVictim(), 57846, false); - events.RepeatEvent(urand(5000, 10000)); + events.Repeat(5s, 10s); break; } @@ -410,7 +410,7 @@ public: void MovementInform(uint32 type, uint32 id) override { if (type == POINT_MOTION_TYPE && id == EVENT_CHARGE) - events.ScheduleEvent(EVENT_SET_FACING, 0); + events.ScheduleEvent(EVENT_SET_FACING, 0ms); } void EnterEvadeMode(EvadeReason why) override @@ -504,19 +504,19 @@ public: me->SummonCreature(NPC_SUNWELL_VISUAL_BUNNY, 1688.24f, 621.769f, 29.1745f, 0.523177f, TEMPSUMMON_MANUAL_DESPAWN); me->setActive(true); events.Reset(); - events.ScheduleEvent(1, 1000); // guard talk - events.ScheduleEvent(2, 4000); // theron talk - events.ScheduleEvent(3, 10000); // npcs walk - events.ScheduleEvent(4, 17000); // rommath talk - events.ScheduleEvent(5, 20000); // theron talk - events.ScheduleEvent(6, 28000); // theron talk - events.ScheduleEvent(7, 37000); // rommath talk - events.ScheduleEvent(8, 44000); // rommath talk - events.ScheduleEvent(9, 52000); // rommath talk - events.ScheduleEvent(10, 60000); // auric talk - events.ScheduleEvent(11, 66000); // auric talk - events.ScheduleEvent(12, 76000); // rommath talk - events.ScheduleEvent(13, 80000); // move home + events.ScheduleEvent(1, 1s); // guard talk + events.ScheduleEvent(2, 4s); // theron talk + events.ScheduleEvent(3, 10s); // npcs walk + events.ScheduleEvent(4, 17s); // rommath talk + events.ScheduleEvent(5, 20s); // theron talk + events.ScheduleEvent(6, 28s); // theron talk + events.ScheduleEvent(7, 37s); // rommath talk + events.ScheduleEvent(8, 44s); // rommath talk + events.ScheduleEvent(9, 52s); // rommath talk + events.ScheduleEvent(10, 60s); // auric talk + events.ScheduleEvent(11, 66s); // auric talk + events.ScheduleEvent(12, 76s); // rommath talk + events.ScheduleEvent(13, 80s); // move home } } @@ -539,16 +539,16 @@ public: break; case 3: me->SetWalk(true); - me->GetMotionMaster()->MovePath(me->GetEntry() * 100, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 100, false); if (Creature* c = me->FindNearestCreature(NPC_THERON, 60.0f, true)) { c->SetWalk(true); - c->GetMotionMaster()->MovePath(c->GetEntry() * 100, false); + c->GetMotionMaster()->MoveWaypoint(c->GetEntry() * 100, false); } if (Creature* c = me->FindNearestCreature(NPC_AURIC, 60.0f, true)) { c->SetWalk(true); - c->GetMotionMaster()->MovePath(c->GetEntry() * 100, false); + c->GetMotionMaster()->MoveWaypoint(c->GetEntry() * 100, false); } break; case 4: @@ -586,7 +586,7 @@ public: case 13: me->setActive(false); if (Creature* c = me->FindNearestCreature(NPC_SUNWELL_VISUAL_BUNNY, 60.0f, true)) - c->DespawnOrUnsummon(1); + c->DespawnOrUnsummon(1ms); if (GameObject* go = me->FindNearestGameObject(GO_QUEL_DELAR, 60.0f)) go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); me->SetWalk(true); @@ -610,61 +610,6 @@ public: }; }; -/*###### THEIR: ######*/ - -/*###### -## npc_greengill_slave -######*/ - -#define ENRAGE 45111 -#define ORB 45109 -#define QUESTG 11541 -#define DM 25060 - -class npc_greengill_slave : public CreatureScript -{ -public: - npc_greengill_slave() : CreatureScript("npc_greengill_slave") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_greengill_slaveAI(creature); - } - - struct npc_greengill_slaveAI : public ScriptedAI - { - npc_greengill_slaveAI(Creature* creature) : ScriptedAI(creature) { } - - void JustEngagedWith(Unit* /*who*/) override { } - - void SpellHit(Unit* caster, SpellInfo const* spellInfo) override - { - Player* player = caster->ToPlayer(); - if (!player) - return; - - if (spellInfo->Id == ORB && !me->HasAura(ENRAGE)) - { - if (player->GetQuestStatus(QUESTG) == QUEST_STATUS_INCOMPLETE) - DoCast(player, 45110, true); - - DoCast(me, ENRAGE); - - if (Creature* Myrmidon = me->FindNearestCreature(DM, 70)) - { - me->AddThreat(Myrmidon, 100000.0f); - AttackStart(Myrmidon); - } - } - } - - void UpdateAI(uint32 /*diff*/) override - { - DoMeleeAttackIfReady(); - } - }; -}; - // 45396, 45398 - Weapon Coating Enchant class spell_gen_weapon_coating_enchant : public AuraScript { @@ -690,6 +635,5 @@ void AddSC_isle_of_queldanas() new npc_bh_thalorien_dawnseeker(); RegisterSpellScript(spell_bh_cleanse_quel_delar); new npc_grand_magister_rommath(); - new npc_greengill_slave(); RegisterSpellScript(spell_gen_weapon_coating_enchant); } diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp index bbf1037521..f176916a74 100644 --- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp @@ -61,7 +61,8 @@ public: if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION) { Talk(SAY_CORPORAL_1, player); - npc_escortAI::Start(true, false, player->GetGUID(), quest); + me->SetWalk(true); + Start(true, player->GetGUID(), quest); me->SetImmuneToNPC(false); me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); } diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index 5709c14b87..6ab4e712c4 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -111,7 +111,10 @@ public: creature->AI()->Talk(SAY_QUESTACCEPT, player); if (npc_escortAI* pEscortAI = CAST_AI(npc_deathstalker_erland::npc_deathstalker_erlandAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + { + creature->SetWalk(true); + pEscortAI->Start(true, player->GetGUID()); + } } return true; @@ -328,7 +331,7 @@ public: { HasEnded = false; TalkRNG = urand(0,1); - events.ScheduleEvent(EVENT_APPA_INTRO, 2000); + events.ScheduleEvent(EVENT_APPA_INTRO, 2s); summons.DespawnAll(); } @@ -387,31 +390,31 @@ public: case EVENT_APPA_INTRO: Talk(SAY_APPA_INTRO); SummonCrowd(); - events.ScheduleEvent(EVENT_APPA_SAY_1, 3000); + events.ScheduleEvent(EVENT_APPA_SAY_1, 3s); break; case EVENT_APPA_SAY_1: Talk(TalkRNG ? SAY_APPA_OPTION_1_1 : SAY_APPA_OPTION_2_1); - events.ScheduleEvent(EVENT_APPA_SAY_2, 5000); + events.ScheduleEvent(EVENT_APPA_SAY_2, 5s); break; case EVENT_APPA_SAY_2: Talk(TalkRNG ? SAY_APPA_OPTION_1_2 : SAY_APPA_OPTION_2_2); - events.ScheduleEvent(EVENT_APPA_SAY_3, 5000); + events.ScheduleEvent(EVENT_APPA_SAY_3, 5s); break; case EVENT_APPA_SAY_3: Talk(TalkRNG ? SAY_APPA_OPTION_1_3 : SAY_APPA_OPTION_2_3); - events.ScheduleEvent(EVENT_APPA_SAY_4, 5000); + events.ScheduleEvent(EVENT_APPA_SAY_4, 5s); break; case EVENT_APPA_SAY_4: Talk(TalkRNG ? SAY_APPA_OPTION_1_4 : SAY_APPA_OPTION_2_4); - events.ScheduleEvent(EVENT_APPA_OUTRO, 5000); + events.ScheduleEvent(EVENT_APPA_OUTRO, 5s); break; case EVENT_APPA_OUTRO: Talk(SAY_APPA_OUTRO); - events.ScheduleEvent(EVENT_APPA_OUTRO_CROWD, 3000); + events.ScheduleEvent(EVENT_APPA_OUTRO_CROWD, 3s); break; case EVENT_APPA_OUTRO_CROWD: EmoteCrowd(); - events.ScheduleEvent(EVENT_APPA_OUTRO_END, 5000); + events.ScheduleEvent(EVENT_APPA_OUTRO_END, 5s); break; case EVENT_APPA_OUTRO_END: // Despawn for Apparition is handled via Areatrigger SAI (5m) summons.DespawnAll(); diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index cbf88ba9a5..6adf8cdf1f 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -406,7 +406,8 @@ public: { if (Player* player = GetPlayerForEscort()) { - CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID()); + pLescovar->SetWalk(true); + CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, player->GetGUID()); CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->SetMaxPlayerDistance(200.0f); } } @@ -448,7 +449,8 @@ public: { if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true)) { - CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID()); + pSpybot->SetWalk(true); + CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, player->GetGUID()); CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f); } return true; diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index dcfd61342c..a7218f9b1c 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -118,7 +118,7 @@ public: _events.ScheduleEvent(EVENT_MULTI_SHOT, 10s); } - void SetGUID(ObjectGuid guid, int32 type) override + void SetGUID(ObjectGuid const& guid, int32 type) override { if (type == GUID_EVENT_INVOKER) { @@ -142,7 +142,7 @@ public: { summoned->SetDisableGravity(true); float speed = summoned->GetDistance(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ() + 15.0f) / (1000.0f * 0.001f); - summoned->MonsterMoveWithSpeed(summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ() + 15.0f, speed); + summoned->GetMotionMaster()->MovePoint(0, summoned->GetPositionX(), summoned->GetPositionY(), me->GetPositionZ() + 15.0f, FORCED_MOVEMENT_NONE, speed); summoned->CastSpell(summoned, SPELL_RIBBON_OF_SOULS, false); } } @@ -270,8 +270,7 @@ public: if (EventMoveTimer <= diff) { me->SetDisableGravity(true); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetDistance(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW) / (5000 * 0.001f)); - me->SetPosition(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, me->GetOrientation()); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW, FORCED_MOVEMENT_NONE, me->GetDistance(me->GetPositionX(), me->GetPositionY(), HIGHBORNE_LOC_Y_NEW) / (5000 * 0.001f)); EventMove = false; } else EventMoveTimer -= diff; @@ -917,7 +916,7 @@ public: if (auto ai = CAST_AI(npc_varian_wrynn::npc_varian_wrynnAI, creature->AI())) { - ai->Start(true, true, player->GetGUID()); + ai->Start(true, player->GetGUID()); if (Creature* jaina = GetClosestCreatureWithEntry(creature, NPC_JAINA, 50.0f)) ai->jainaGUID = jaina->GetGUID(); else @@ -1218,27 +1217,27 @@ public: { case 0: if (Unit* temp = me->SummonCreature(NPC_DOCTOR, AllianceSpawn[4].x - rand32() % 5, AllianceSpawn[4].y - rand32() % 5, AllianceSpawn[4].z, TEMPSUMMON_DEAD_DESPAWN)) - temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case 1: if (Unit* temp = me->SummonCreature(NPC_CHEMIST, AllianceSpawn[4].x - rand32() % 5, AllianceSpawn[4].y - rand32() % 5, AllianceSpawn[4].z, TEMPSUMMON_DEAD_DESPAWN)) - temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case 2: if (Unit* temp = me->SummonCreature(NPC_BETRAYER, AllianceSpawn[4].x - rand32() % 5, AllianceSpawn[4].y - rand32() % 5, AllianceSpawn[4].z, TEMPSUMMON_DEAD_DESPAWN)) - temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case 3: if (Unit* temp = me->SummonCreature(NPC_DOCTOR, AllianceSpawn[5].x - rand32() % 5, AllianceSpawn[5].y - rand32() % 5, AllianceSpawn[5].z, TEMPSUMMON_DEAD_DESPAWN)) - temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case 4: if (Unit* temp = me->SummonCreature(NPC_CHEMIST, AllianceSpawn[5].x - rand32() % 5, AllianceSpawn[5].y - rand32() % 5, AllianceSpawn[5].z, TEMPSUMMON_DEAD_DESPAWN)) - temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case 5: if (Unit* temp = me->SummonCreature(NPC_BETRAYER, AllianceSpawn[5].x - rand32() % 5, AllianceSpawn[5].y - rand32() % 5, AllianceSpawn[5].z, TEMPSUMMON_DEAD_DESPAWN)) - temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; } } @@ -1246,7 +1245,7 @@ public: case 5: for (uint8 i = 0; i < WAVE_MAXCOUNT; ++i) if (Unit* temp = me->SummonCreature(NPC_GUARDIAN, AllianceSpawn[6].x - rand32() % 5, AllianceSpawn[6].y - rand32() % 5, AllianceSpawn[6].z, TEMPSUMMON_DEAD_DESPAWN)) - temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), false); + temp->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case 6: if (Unit* temp = me->SummonCreature(NPC_BLIGHTWORM, AllianceSpawn[7].x, AllianceSpawn[7].y, AllianceSpawn[7].z, TEMPSUMMON_MANUAL_DESPAWN)) @@ -1322,22 +1321,22 @@ public: if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) { allianceGuardsGUID.push_back(temp->GetGUID()); - temp->GetMotionMaster()->MovePath(NPC_SW_SOLDIER * 10, false); + temp->GetMotionMaster()->MoveWaypoint(NPC_SW_SOLDIER * 10, false); } if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) { allianceGuardsGUID.push_back(temp->GetGUID()); - temp->GetMotionMaster()->MovePath((NPC_SW_SOLDIER * 10) + 1, false); + temp->GetMotionMaster()->MoveWaypoint((NPC_SW_SOLDIER * 10) + 1, false); } if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) { allianceGuardsGUID.push_back(temp->GetGUID()); - temp->GetMotionMaster()->MovePath((NPC_SW_SOLDIER * 10) + 2, false); + temp->GetMotionMaster()->MoveWaypoint((NPC_SW_SOLDIER * 10) + 2, false); } if (Unit* temp = me->SummonCreature(NPC_SW_SOLDIER, AllianceSpawn[8].x, AllianceSpawn[8].y, AllianceSpawn[8].z, 0, TEMPSUMMON_TIMED_DESPAWN, 90000)) { allianceGuardsGUID.push_back(temp->GetGUID()); - temp->GetMotionMaster()->MovePath((NPC_SW_SOLDIER * 10) + 3, false); + temp->GetMotionMaster()->MoveWaypoint((NPC_SW_SOLDIER * 10) + 3, false); } break; case 8: @@ -1349,7 +1348,7 @@ public: case 10: if (Unit* temp = me->SummonCreature(NPC_DREADLORD, AllianceSpawn[11].x, AllianceSpawn[11].y, AllianceSpawn[11].z, TEMPSUMMON_DEAD_DESPAWN)) { - temp->GetMotionMaster()->MovePath(NPC_DREADLORD * 10, false); + temp->GetMotionMaster()->MoveWaypoint(NPC_DREADLORD * 10, false); temp->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); temp->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true); } @@ -1537,7 +1536,7 @@ public: case 8: if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) { - jaina->GetMotionMaster()->MovePath(NPC_JAINA * 10, false); + jaina->GetMotionMaster()->MoveWaypoint(NPC_JAINA * 10, false); jaina->setActive(true); } bStepping = false; @@ -1614,7 +1613,7 @@ public: break; case 22: Talk(WRYNN_SAY_SEWERS_4); - SetRun(false); + me->SetWalk(true); if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) { jaina->GetMotionMaster()->Clear(); @@ -1665,7 +1664,7 @@ public: JumpToNextStep(3 * IN_MILLISECONDS); break; case 31: - SetRun(true); + me->SetWalk(false); if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) jaina->GetMotionMaster()->MoveFollow(me, 1, 0); SetEscortPaused(false); @@ -1727,7 +1726,7 @@ public: if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) { jaina->GetMotionMaster()->Clear(); - jaina->GetMotionMaster()->MovePoint(0, AllianceWP[7].x, AllianceWP[7].y, AllianceWP[7].z, false); + jaina->GetMotionMaster()->MovePoint(0, AllianceWP[7].x, AllianceWP[7].y, AllianceWP[7].z, FORCED_MOVEMENT_NONE, 0.f, 0.f, false); } JumpToNextStep(5 * IN_MILLISECONDS); break; @@ -1789,7 +1788,7 @@ public: break; case 54: Talk(WRYNN_SAY_APO_7); - SetRun(false); + me->SetWalk(true); JumpToNextStep(4 * IN_MILLISECONDS); break; case 55: @@ -1845,7 +1844,7 @@ public: JumpToNextStep(1.5 * IN_MILLISECONDS); break; case 65: - SetRun(true); + me->SetWalk(false); SetEscortPaused(false); JumpToNextStep(0.25 * IN_MILLISECONDS); break; @@ -2236,7 +2235,8 @@ public: if (Creature* sylvannas = GetClosestCreatureWithEntry(creature, NPC_SYLVANAS, 50.0f)) { thrall_ai->sylvanasfollowGUID = sylvannas->GetGUID(); - thrall_ai->Start(true, true, player->GetGUID()); + creature->SetWalk(false); + thrall_ai->Start(true, player->GetGUID()); thrall_ai->SetDespawnAtEnd(false); thrall_ai->SetDespawnAtFar(false); } @@ -2477,7 +2477,7 @@ public: for (std::list<Creature*>::iterator itr = ThroneList.begin(); itr != ThroneList.end(); itr++) (*itr)->DespawnOrUnsummon(); SetEscortPaused(false); - SetRun(false); + me->SetWalk(true); break; } default: @@ -2537,9 +2537,9 @@ public: { case 0: // Vortex if (Creature* whirlwind1 = me->SummonCreature(NPC_VORTEX, ThrallSpawn[0].x, ThrallSpawn[0].y, ThrallSpawn[0].z, ThrallSpawn[0].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30 * IN_MILLISECONDS)) - whirlwind1->GetMotionMaster()->MovePath(NPC_WHIRLWIND * 10, false); + whirlwind1->GetMotionMaster()->MoveWaypoint(NPC_WHIRLWIND * 10, false); if (Creature* whirlwind2 = me->SummonCreature(NPC_VORTEX, ThrallSpawn[0].x, ThrallSpawn[0].y, ThrallSpawn[0].z, ThrallSpawn[0].o, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30 * IN_MILLISECONDS)) - whirlwind2->GetMotionMaster()->MovePath(NPC_WHIRLWIND * 100, false); + whirlwind2->GetMotionMaster()->MoveWaypoint(NPC_WHIRLWIND * 100, false); break; case 1: // BATTLING_COURTYARD Initial Spawn @@ -2762,7 +2762,7 @@ public: { hordeGuardsGUID.push_back(temp->GetGUID()); temp->AI()->Talk(SAY_FOR_THE_HORDE); - temp->GetMotionMaster()->MovePath(NPC_WARSONG_BATTLEGUARD * 100, false); + temp->GetMotionMaster()->MoveWaypoint(NPC_WARSONG_BATTLEGUARD * 100, false); } break; // Valimathras Room Preparation @@ -2972,10 +2972,10 @@ public: SetEscortPaused(false); bStepping = false; JumpToNextStep(0); - SetRun(true); + me->SetWalk(false); if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) { - sylvanas->GetMotionMaster()->MovePath(NPC_SYLVANAS * 100, false); + sylvanas->GetMotionMaster()->MoveWaypoint(NPC_SYLVANAS * 100, false); sylvanas->setActive(true); } break; @@ -3005,9 +3005,9 @@ public: for (std::list<Creature*>::iterator itr = PlagueList.begin(); itr != PlagueList.end(); itr++) (*itr)->DespawnOrUnsummon(); SetEscortPaused(false); - SetRun(false); + me->SetWalk(true); if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) - sylvanas->GetMotionMaster()->MovePath(NPC_SYLVANAS * 1000, false); + sylvanas->GetMotionMaster()->MoveWaypoint(NPC_SYLVANAS * 1000, false); JumpToNextStep(3 * IN_MILLISECONDS); break; } @@ -3054,10 +3054,10 @@ public: if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) { valimathras->GetMotionMaster()->MovePoint(0, 1804.559f, 235.504f, 62.753f); - valimathras->DespawnOrUnsummon(3 * IN_MILLISECONDS); + valimathras->DespawnOrUnsummon(3s); } if (Creature* valimathrasportal = ObjectAccessor::GetCreature(*me, ValimathrasPortalGUID)) - valimathrasportal->DespawnOrUnsummon(6 * IN_MILLISECONDS); + valimathrasportal->DespawnOrUnsummon(6s); JumpToNextStep(1 * IN_MILLISECONDS); break; case 26: @@ -3077,7 +3077,7 @@ public: FollowThrall(); SetEscortPaused(false); bStepping = false; - SetRun(true); + me->SetWalk(false); Talk(THRALL_SAY_COURTYARD_4); UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_FOR_UNDERCITY_START_H, 0); UpdateWorldState(me->GetMap(), WORLD_STATE_BATTLE_FOR_UNDERCITY_COURTYARD_FIGHT_H, 1); @@ -3182,7 +3182,7 @@ public: SpawnWave(6); SetEscortPaused(false); bStepping = false; - SetRun(false); + me->SetWalk(true); JumpToNextStep(0 * IN_MILLISECONDS); break; } @@ -3226,7 +3226,7 @@ public: FollowThrall(); SetEscortPaused(false); bStepping = false; - SetRun(false); + me->SetWalk(true); JumpToNextStep(0 * IN_MILLISECONDS); break; // Top of Undercity Discussion @@ -3266,7 +3266,7 @@ public: FollowThrall(); SetEscortPaused(false); bStepping = false; - SetRun(false); + me->SetWalk(true); JumpToNextStep(0 * IN_MILLISECONDS); break; case 63: @@ -3284,7 +3284,7 @@ public: FollowThrall(); SetEscortPaused(false); bStepping = false; - SetRun(false); + me->SetWalk(true); JumpToNextStep(0 * IN_MILLISECONDS); break; case 67: @@ -3299,7 +3299,7 @@ public: FollowThrall(); SetEscortPaused(false); bStepping = false; - SetRun(false); + me->SetWalk(true); JumpToNextStep(0 * IN_MILLISECONDS); break; // KHANOK - Valimathtas Intro @@ -3332,10 +3332,10 @@ public: if (Creature* valimathras = ObjectAccessor::GetCreature(*me, ValimathrasGUID)) { valimathras->GetMotionMaster()->MovePoint(0, 1596.642f, 429.811f, -46.3429f); - valimathras->DespawnOrUnsummon(3 * IN_MILLISECONDS); + valimathras->DespawnOrUnsummon(3s); } if (Creature* valimathrasportal = ObjectAccessor::GetCreature(*me, ValimathrasPortalGUID)) - valimathrasportal->DespawnOrUnsummon(3 * IN_MILLISECONDS); + valimathrasportal->DespawnOrUnsummon(3s); JumpToNextStep(2 * IN_MILLISECONDS); break; // KHANOK - Trashspawn @@ -3475,7 +3475,7 @@ public: FollowThrall(); SetEscortPaused(false); bStepping = false; - SetRun(false); + me->SetWalk(true); JumpToNextStep(0 * IN_MILLISECONDS); break; case 109: @@ -3491,7 +3491,7 @@ public: FollowThrall(); SetEscortPaused(false); bStepping = false; - SetRun(true); + me->SetWalk(false); JumpToNextStep(0 * IN_MILLISECONDS); break; case 112: @@ -3662,7 +3662,7 @@ public: case 143: if (Creature* sylvanas = ObjectAccessor::GetCreature(*me, sylvanasfollowGUID)) { - sylvanas->GetMotionMaster()->MovePoint(0, 1289.48f, 314.33f, -57.32f, true); + sylvanas->GetMotionMaster()->MovePoint(0, 1289.48f, 314.33f, -57.32f); sylvanas->CastSpell(sylvanas, SPELL_LEAP_TO_PLATFORM); } JumpToNextStep(10 * IN_MILLISECONDS); @@ -3706,7 +3706,7 @@ public: wrynn->SetImmuneToAll(true); wrynn->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); wrynn->SetReactState(REACT_PASSIVE); - wrynn->GetMotionMaster()->MovePoint(0, 1302.543f, 359.472f, -67.295f, true); + wrynn->GetMotionMaster()->MovePoint(0, 1302.543f, 359.472f, -67.295f); } if (Creature* jaina = me->SummonCreature(NPC_JAINA, 1308.862f, 381.809f, -66.044243f, TEMPSUMMON_MANUAL_DESPAWN)) { @@ -3807,7 +3807,7 @@ public: { SaurfangGUID = saurfang->GetGUID(); saurfang->SetWalk(true); - saurfang->GetMotionMaster()->MovePoint(0, 1300.862f, 353.670f, -66.187f, true); + saurfang->GetMotionMaster()->MovePoint(0, 1300.862f, 353.670f, -66.187f); } JumpToNextStep(7 * IN_MILLISECONDS); break; @@ -3865,8 +3865,8 @@ public: me->GetCreatureListWithEntryInGrid(HelperList, NPC_OVERLORD_SAURFANG, 100.0f); if (!HelperList.empty()) for (std::list<Creature*>::iterator itr = HelperList.begin(); itr != HelperList.end(); itr++) - (*itr)->DespawnOrUnsummon(120 * IN_MILLISECONDS); - me->DespawnOrUnsummon(120 * IN_MILLISECONDS); + (*itr)->DespawnOrUnsummon(120s); + me->DespawnOrUnsummon(120s); bStepping = false; JumpToNextStep(0 * IN_MILLISECONDS); break; diff --git a/src/server/scripts/EasternKingdoms/zone_westfall.cpp b/src/server/scripts/EasternKingdoms/zone_westfall.cpp index 6d54a0cc26..de9afc5afe 100644 --- a/src/server/scripts/EasternKingdoms/zone_westfall.cpp +++ b/src/server/scripts/EasternKingdoms/zone_westfall.cpp @@ -56,9 +56,8 @@ public: if (quest->GetQuestId() == QUEST_TOME_VALOR) { creature->AI()->Talk(SAY_DS_START); - if (npc_escortAI* pEscortAI = CAST_AI(npc_daphne_stilwell::npc_daphne_stilwellAI, creature->AI())) - pEscortAI->Start(true, true, player->GetGUID()); + pEscortAI->Start(true, player->GetGUID()); } return true; @@ -117,7 +116,7 @@ public: me->SummonCreature(NPC_DEFIAS_RAIDER, -11438.14f, 1607.6f, 70.94f, 4.38f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; case 10: - SetRun(false); + me->SetWalk(true); break; case 11: Talk(SAY_DS_PROLOGUE); diff --git a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp index 9118411816..054e170434 100644 --- a/src/server/scripts/EasternKingdoms/zone_wetlands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp @@ -62,7 +62,7 @@ public: case 2: if (me->HasStealthAura()) me->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); - SetRun(); + me->SetWalk(false); me->SetFaction(FACTION_ENEMY); break; } @@ -109,7 +109,7 @@ public: me->GetThreatMgr().ClearAllThreat(); me->CombatStop(true); - SetRun(false); + me->SetWalk(true); } } } @@ -138,7 +138,10 @@ public: pSlim->CastSpell(pSlim, SPELL_STEALTH, true); if (npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI* pEscortAI = CAST_AI(npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI, pSlim->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); + { + pSlim->SetWalk(true); + pEscortAI->Start(false, player->GetGUID(), quest); + } } return false; } diff --git a/src/server/scripts/Events/brewfest.cpp b/src/server/scripts/Events/brewfest.cpp index e0b01c49f9..c743ed2456 100644 --- a/src/server/scripts/Events/brewfest.cpp +++ b/src/server/scripts/Events/brewfest.cpp @@ -367,10 +367,10 @@ struct npc_dark_iron_attack_generator : public ScriptedAI if (AllowStart()) { PrepareEvent(); - events.RepeatEvent(300000); + events.Repeat(300s); return; } - events.RepeatEvent(2000); + events.Repeat(2s); break; } case EVENT_SPAWN_MOLE_MACHINE: @@ -393,7 +393,7 @@ struct npc_dark_iron_attack_generator : public ScriptedAI if (Creature* cr = me->SummonCreature(NPC_MOLE_MACHINE_TRIGGER, x, y, 398.11f, 0.0f)) cr->CastSpell(cr, SPELL_SPAWN_MOLE_MACHINE, true); } - events.RepeatEvent(3000); + events.Repeat(3s); break; } case EVENT_PRE_FINISH_ATTACK: @@ -410,7 +410,7 @@ struct npc_dark_iron_attack_generator : public ScriptedAI } case EVENT_BARTENDER_SAY: { - events.RepeatEvent(12000); + events.Repeat(12s); Creature* sayer = GetRandomBartender(); if (!sayer) return; @@ -603,7 +603,7 @@ struct npc_dark_iron_attack_mole_machine : public ScriptedAI { me->SummonCreature(NPC_DARK_IRON_GUZZLER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 6000); summonTimer = 0; - me->DespawnOrUnsummon(3000); + me->DespawnOrUnsummon(3s); } } } @@ -1714,12 +1714,12 @@ struct npc_coren_direbrew : public ScriptedAI case EVENT_SUMMON_MOLE_MACHINE: { me->CastCustomSpell(SPELL_MOLE_MACHINE_TARGET_PICKER, SPELLVALUE_MAX_TARGETS, 1, nullptr, true); - _events.RepeatEvent(15 * IN_MILLISECONDS); + _events.Repeat(15s); break; } case EVENT_DIREBREW_DISARM: DoCastSelf(SPELL_DIREBREW_DISARM_PRE_CAST, true); - _events.RepeatEvent(20 * IN_MILLISECONDS); + _events.Repeat(20s); break; default: break; @@ -1743,7 +1743,7 @@ struct npc_coren_direbrew_sisters : public ScriptedAI { npc_coren_direbrew_sisters(Creature* creature) : ScriptedAI(creature) { } - void SetGUID(ObjectGuid guid, int32 id) override + void SetGUID(ObjectGuid const& guid, int32 id) override { if (id == DATA_TARGET_GUID) { diff --git a/src/server/scripts/Events/hallows_end.cpp b/src/server/scripts/Events/hallows_end.cpp index 06d649291a..f9bf2a2c09 100644 --- a/src/server/scripts/Events/hallows_end.cpp +++ b/src/server/scripts/Events/hallows_end.cpp @@ -428,7 +428,7 @@ struct npc_costumed_orphan_matron : public ScriptedAI GetInitXYZ(x, y, z, o, path); if (Creature* cr = me->SummonCreature(NPC_SHADE_OF_HORSEMAN, x, y, z, o, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000)) { - cr->GetMotionMaster()->MovePath(path, true); + cr->GetMotionMaster()->MoveWaypoint(path, true); cr->AI()->DoAction(path); horseGUID = cr->GetGUID(); } @@ -697,7 +697,7 @@ struct npc_hallows_end_soh : public ScriptedAI void EnterEvadeMode(EvadeReason /* why */) override { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } uint32 GetData(uint32 /*type*/) const override @@ -763,7 +763,7 @@ struct npc_hallows_end_soh : public ScriptedAI } CastFires(false); - events.RepeatEvent(15000); + events.Repeat(15s); break; } case 4: @@ -848,7 +848,7 @@ struct npc_hallows_end_soh : public ScriptedAI if (Unit* c = ObjectAccessor::GetUnit(*me, guid)) c->RemoveAllAuras(); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } else { @@ -868,7 +868,7 @@ struct npc_hallows_end_soh : public ScriptedAI me->RemoveAllAuras(); me->SetCanFly(false); me->SetDisableGravity(false); - events.ScheduleEvent(4, 2000); + events.ScheduleEvent(4, 2s); } } @@ -1029,7 +1029,7 @@ struct boss_headless_horseman : public ScriptedAI std::list<Creature*> unitList; me->GetCreaturesWithEntryInRange(unitList, 100.0f, NPC_PUMPKIN_FIEND); for (std::list<Creature*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr) - (*itr)->ToCreature()->DespawnOrUnsummon(500); + (*itr)->ToCreature()->DespawnOrUnsummon(500ms); Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (!players.IsEmpty() && players.begin()->GetSource() && players.begin()->GetSource()->GetGroup()) @@ -1085,9 +1085,9 @@ struct boss_headless_horseman : public ScriptedAI { if (type == WAYPOINT_MOTION_TYPE) { - if (point == 0) + if (point == 1) me->CastSpell(me, SPELL_HEAD_VISUAL, true); - else if (point == 11) + else if (point == 12) { me->ReplaceAllUnitFlags(UNIT_FLAG_NONE); me->StopMoving(); @@ -1191,7 +1191,7 @@ struct boss_headless_horseman : public ScriptedAI break; case 3: me->SetDisableGravity(true); - me->GetMotionMaster()->MovePath(236820, false); + me->GetMotionMaster()->MoveWaypoint(236820, false); me->CastSpell(me, SPELL_SHAKE_CAMERA_SMALL, true); player->Say(TALK_PLAYER_FELT_DEATH); Talk(TALK_ENTRANCE); @@ -1202,7 +1202,7 @@ struct boss_headless_horseman : public ScriptedAI talkCount = 0; return; // pop and return, skip repeat } - events.RepeatEvent(2000); + events.Repeat(2s); break; } case EVENT_HORSEMAN_FOLLOW: @@ -1218,7 +1218,7 @@ struct boss_headless_horseman : public ScriptedAI case EVENT_HORSEMAN_CLEAVE: { me->CastSpell(me->GetVictim(), SPELL_HORSEMAN_CLEAVE, false); - events.RepeatEvent(8000); + events.Repeat(8s); break; } case EVENT_HORSEMAN_WHIRLWIND: @@ -1226,11 +1226,11 @@ struct boss_headless_horseman : public ScriptedAI if (me->HasAuraEffect(SPELL_HORSEMAN_WHIRLWIND, EFFECT_0)) { me->RemoveAura(SPELL_HORSEMAN_WHIRLWIND); - events.RepeatEvent(15000); + events.Repeat(15s); break; } me->CastSpell(me, SPELL_HORSEMAN_WHIRLWIND, true); - events.RepeatEvent(6000); + events.Repeat(6s); break; } case EVENT_HORSEMAN_CHECK_HEALTH: @@ -1241,7 +1241,7 @@ struct boss_headless_horseman : public ScriptedAI return; } - events.RepeatEvent(1000); + events.Repeat(1s); break; } case EVENT_HORSEMAN_CONFLAGRATION: @@ -1253,21 +1253,21 @@ struct boss_headless_horseman : public ScriptedAI Talk(TALK_CONFLAGRATION); } - events.RepeatEvent(12500); + events.Repeat(12500ms); break; } case EVENT_SUMMON_PUMPKIN: { if (talkCount < 4) { - events.RepeatEvent(1); + events.Repeat(1ms); talkCount++; me->CastSpell(me, SPELL_SUMMON_PUMPKIN, false); } else { Talk(TALK_SPROUTING_PUMPKINS); - events.RepeatEvent(15000); + events.Repeat(15s); talkCount = 0; } diff --git a/src/server/scripts/Events/love_in_air.cpp b/src/server/scripts/Events/love_in_air.cpp index 6c5a2aedb0..6a22e8e839 100644 --- a/src/server/scripts/Events/love_in_air.cpp +++ b/src/server/scripts/Events/love_in_air.cpp @@ -247,7 +247,7 @@ struct npc_love_in_air_snivel_real : public ScriptedAI if (Unit* owner = me->ToTempSummon()->GetSummonerUnit()) me->CastSpell(owner, SPELL_SNIVEL_GUN, true); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } } diff --git a/src/server/scripts/Events/winter_veil.cpp b/src/server/scripts/Events/winter_veil.cpp index 6a66ed29e6..a1a53a0422 100644 --- a/src/server/scripts/Events/winter_veil.cpp +++ b/src/server/scripts/Events/winter_veil.cpp @@ -192,7 +192,7 @@ class spell_winter_veil_racer_slam_hit : public SpellScript return; target->CastSpell(target->GetPositionX() + irand(-10, 10), target->GetPositionY() + irand(-10, 10), target->GetPositionZ(), SPELL_RACER_DEATH_VISUAL, true); - target->DespawnOrUnsummon(3000); + target->DespawnOrUnsummon(3s); target->CastSpell(target, SPELL_RACER_FLAMES, true); caster->CastSpell(caster, SPELL_RACER_KILL_COUNTER, true); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index 69eaa77eab..02a718379c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -97,7 +97,7 @@ public: Talk(SAY_ONSPAWN, 1200ms); if (action == DATA_ANETHERON) - me->GetMotionMaster()->MovePath(urand(ALLIANCE_BASE_CHARGE_1, ALLIANCE_BASE_CHARGE_3), false); + me->GetMotionMaster()->MoveWaypoint(urand(ALLIANCE_BASE_CHARGE_1, ALLIANCE_BASE_CHARGE_3), false); } void PathEndReached(uint32 pathId) override @@ -109,7 +109,7 @@ public: case ALLIANCE_BASE_CHARGE_3: me->m_Events.AddEventAtOffset([this]() { - me->GetMotionMaster()->MovePath(urand(ALLIANCE_BASE_PATROL_1, ALLIANCE_BASE_PATROL_3), true); + me->GetMotionMaster()->MoveWaypoint(urand(ALLIANCE_BASE_PATROL_1, ALLIANCE_BASE_PATROL_3), true); }, 1s); break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 3d15d6cf7c..7b1ccf257b 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -297,7 +297,7 @@ struct boss_archimonde : public BossAI } } }, 5s); - ScheduleTimedEvent(5000ms, [&] + ScheduleTimedEvent(5s, [&] { bool noPlayersInRange = true; if (Map* map = me->GetMap()) @@ -335,7 +335,7 @@ struct boss_archimonde : public BossAI Talk(SAY_SLAY); } - void SetGUID(ObjectGuid guid, int32 type) override + void SetGUID(ObjectGuid const& guid, int32 type) override { if (type == GUID_GAIN_SOUL_CHARGE_PLAYER) { diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index 82f86f1b58..fa931454fc 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -86,7 +86,7 @@ public: Talk(SAY_ONSPAWN, 1200ms); if (action == DATA_AZGALOR) - me->GetMotionMaster()->MovePath(HORDE_BOSS_PATH, false); + me->GetMotionMaster()->MoveWaypoint(HORDE_BOSS_PATH, false); } void KilledUnit(Unit * victim) override @@ -110,7 +110,7 @@ public: if (Creature* archi = instance->GetCreature(DATA_ARCHIMONDE)) { archi->AI()->DoAction(ACTION_BECOME_ACTIVE_AND_CHANNEL); - archi->AI()->Talk(SAY_ARCHIMONDE_INTRO, 25000ms); + archi->AI()->Talk(SAY_ARCHIMONDE_INTRO, 25s); } BossAI::JustDied(killer); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index 42ad0d907d..991b8214f6 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -94,9 +94,9 @@ public: Milliseconds GetMarkRepeatTimer() { ++_markCounter; - Milliseconds timer = 45000ms - (5000ms * _markCounter); - if (timer <= 10000ms) - return 10000ms; + Milliseconds timer = 45s - (5s * _markCounter); + if (timer <= 10s) + return 10s; else return timer; } @@ -106,7 +106,7 @@ public: Talk(SAY_ONSPAWN, 1200ms); if (action == DATA_KAZROGAL) - me->GetMotionMaster()->MovePath(HORDE_BOSS_PATH, false); + me->GetMotionMaster()->MoveWaypoint(HORDE_BOSS_PATH, false); } void KilledUnit(Unit * victim) override diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp index 39bce4e6ee..887a34570f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp @@ -101,7 +101,7 @@ public: Talk(SAY_ONSPAWN, 1200ms); if (action == DATA_WINTERCHILL) - me->GetMotionMaster()->MovePath(urand(ALLIANCE_BASE_CHARGE_1, ALLIANCE_BASE_CHARGE_3), false); + me->GetMotionMaster()->MoveWaypoint(urand(ALLIANCE_BASE_CHARGE_1, ALLIANCE_BASE_CHARGE_3), false); } void PathEndReached(uint32 pathId) override @@ -113,7 +113,7 @@ public: case ALLIANCE_BASE_CHARGE_3: me->m_Events.AddEventAtOffset([this]() { - me->GetMotionMaster()->MovePath(urand(ALLIANCE_BASE_PATROL_1, ALLIANCE_BASE_PATROL_3), true); + me->GetMotionMaster()->MoveWaypoint(urand(ALLIANCE_BASE_PATROL_1, ALLIANCE_BASE_PATROL_3), true); }, 1s); break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index 01b12a9ef8..1ec84feb5f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -188,7 +188,7 @@ public: else { creature->AI()->Talk(SAY_SUCCESS); - creature->GetMotionMaster()->MovePath(JAINA_RETREAT_PATH, false); + creature->GetMotionMaster()->MoveWaypoint(JAINA_RETREAT_PATH, false); } } return true; @@ -493,15 +493,15 @@ struct npc_hyjal_ground_trash : public ScriptedAI case DATA_WINTERCHILL: case DATA_ANETHERON: case DATA_ALLIANCE_RETREAT: - me->GetMotionMaster()->MovePath(urand(ALLIANCE_BASE_CHARGE_1, ALLIANCE_BASE_CHARGE_3), false); + me->GetMotionMaster()->MoveWaypoint(urand(ALLIANCE_BASE_CHARGE_1, ALLIANCE_BASE_CHARGE_3), false); break; case DATA_KAZROGAL: case DATA_AZGALOR: case DATA_HORDE_RETREAT: - me->GetMotionMaster()->MovePath(urand(HORDE_BASE_CHARGE_1, HORDE_BASE_CHARGE_3), false); + me->GetMotionMaster()->MoveWaypoint(urand(HORDE_BASE_CHARGE_1, HORDE_BASE_CHARGE_3), false); break; case DATA_ARCHIMONDE: - me->GetMotionMaster()->MovePath(urand(NIGHT_ELF_BASE_CHARGE_1, NIGHT_ELF_BASE_CHARGE_3), false); + me->GetMotionMaster()->MoveWaypoint(urand(NIGHT_ELF_BASE_CHARGE_1, NIGHT_ELF_BASE_CHARGE_3), false); break; } } @@ -517,7 +517,7 @@ struct npc_hyjal_ground_trash : public ScriptedAI case ALLIANCE_BASE_CHARGE_3: me->m_Events.AddEventAtOffset([this]() { - me->GetMotionMaster()->MovePath(urand(ALLIANCE_BASE_PATROL_1, ALLIANCE_BASE_PATROL_3), true); + me->GetMotionMaster()->MoveWaypoint(urand(ALLIANCE_BASE_PATROL_1, ALLIANCE_BASE_PATROL_3), true); }, 1s); break; case HORDE_BASE_CHARGE_1: @@ -525,7 +525,7 @@ struct npc_hyjal_ground_trash : public ScriptedAI case HORDE_BASE_CHARGE_3: me->m_Events.AddEventAtOffset([this]() { - me->GetMotionMaster()->MovePath(urand(HORDE_BASE_PATROL_1, HORDE_BASE_PATROL_3), true); + me->GetMotionMaster()->MoveWaypoint(urand(HORDE_BASE_PATROL_1, HORDE_BASE_PATROL_3), true); }, 1s); break; case NIGHT_ELF_BASE_CHARGE_1: @@ -616,9 +616,9 @@ struct npc_hyjal_gargoyle : public ScriptedAI case DATA_AZGALOR: case DATA_HORDE_RETREAT: if (me->GetPositionX() < 5500.f) - me->GetMotionMaster()->MovePath(urand(GARGOYLE_PATH_FORTRESS_1, GARGOYLE_PATH_FORTRESS_3), false); + me->GetMotionMaster()->MoveWaypoint(urand(GARGOYLE_PATH_FORTRESS_1, GARGOYLE_PATH_FORTRESS_3), false); else - me->GetMotionMaster()->MovePath(urand(GARGOYLE_PATH_TROLL_CAMP_1, GARGOYLE_PATH_TROLL_CAMP_3), false); + me->GetMotionMaster()->MoveWaypoint(urand(GARGOYLE_PATH_TROLL_CAMP_1, GARGOYLE_PATH_TROLL_CAMP_3), false); break; default: break; @@ -687,9 +687,9 @@ struct npc_hyjal_frost_wyrm : public ScriptedAI case DATA_AZGALOR: case DATA_HORDE_RETREAT: if (me->GetPositionX() < 5500.f) - me->GetMotionMaster()->MovePath(FROST_WYRM_FORTRESS, false); + me->GetMotionMaster()->MoveWaypoint(FROST_WYRM_FORTRESS, false); else - me->GetMotionMaster()->MovePath(FROST_WYRM_TROLL_CAMP, false); + me->GetMotionMaster()->MoveWaypoint(FROST_WYRM_TROLL_CAMP, false); break; default: break; @@ -702,7 +702,7 @@ struct npc_hyjal_frost_wyrm : public ScriptedAI { me->m_Events.AddEventAtOffset([this]() { - me->GetMotionMaster()->MovePath(FROST_WYRM_FORTRESS_PATROL, true); + me->GetMotionMaster()->MoveWaypoint(FROST_WYRM_FORTRESS_PATROL, true); }, 1s); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 1803000b92..5a120eaa07 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -53,16 +53,16 @@ ObjectData const creatureData[] = Milliseconds hyjalWaveTimers[4][MAX_WAVES_STANDARD] { - { 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 190000ms, 0ms }, // Winterchill - { 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 190000ms, 0ms }, // Anetheron - { 130000ms, 155000ms, 130000ms, 155000ms, 130000ms, 130000ms, 155000ms, 225000ms, 0ms }, // Kaz'rogal - { 130000ms, 190000ms, 190000ms, 190000ms, 130000ms, 155000ms, 190000ms, 225000ms, 0ms } // Azgalor + { 130s, 130s, 130s, 130s, 130s, 130s, 130s, 190s, 0ms }, // Winterchill + { 130s, 130s, 130s, 130s, 130s, 130s, 130s, 190s, 0ms }, // Anetheron + { 130s, 155s, 130s, 155s, 130s, 130s, 155s, 225s, 0ms }, // Kaz'rogal + { 130s, 190s, 190s, 190s, 130s, 155s, 190s, 225s, 0ms } // Azgalor }; Milliseconds hyjalRetreatTimers[2][MAX_WAVES_RETREAT] { - { 10000ms, 6000ms , 0ms }, // Alliance - { 10000ms, 40000ms, 0ms } // Horde + { 10s, 6s , 0ms }, // Alliance + { 10s, 40s, 0ms } // Horde }; Milliseconds hyjalNightElfWaveTimers[1][MAX_WAVES_NIGHT_ELF] @@ -295,7 +295,7 @@ public: } // Despawn all alliance NPCs - scheduler.Schedule(21000ms, [this](TaskContext) + scheduler.Schedule(21s, [this](TaskContext) { for (ObjectGuid const& guid : _baseAlliance) if (Creature* creature = instance->GetCreature(guid)) @@ -343,7 +343,7 @@ public: } } - scheduler.Schedule(21000ms, [this](TaskContext) + scheduler.Schedule(21s, [this](TaskContext) { for (ObjectGuid const& guid : _baseHorde) if (Creature* creature = instance->GetCreature(guid)) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp index f429e5a474..439817bc4d 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp @@ -18,17 +18,16 @@ #include "CreatureScript.h" #include "ScriptedCreature.h" #include "SpellInfo.h" +#include "SpellMgr.h" #include "culling_of_stratholme.h" enum Spells { SPELL_CURSE_OF_EXERTION = 52772, - SPELL_WOUNDING_STRIKE_N = 52771, - SPELL_WOUNDING_STRIKE_H = 58830, + SPELL_WOUNDING_STRIKE = 52771, SPELL_TIME_STOP = 58848, SPELL_TIME_WARP = 52766, - SPELL_TIME_STEP_N = 52737, - SPELL_TIME_STEP_H = 58829, + SPELL_TIME_STEP = 52737, }; enum Events @@ -77,17 +76,17 @@ public: { Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9000); - events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3000); - events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25000); + events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9s); + events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3s); + events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25s); if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20000); + events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20s); } void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override { - if (spellInfo->Id == SPELL_TIME_STEP_H || spellInfo->Id == SPELL_TIME_STEP_N) + if (spellInfo->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_TIME_STEP, me)) { if (target == me) return; @@ -98,7 +97,7 @@ public: return; } warps++; - me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true); + me->CastSpell(target, SPELL_TIME_STEP, true); } } @@ -116,23 +115,23 @@ public: case EVENT_SPELL_CURSE_OF_EXERTION: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) me->CastSpell(target, SPELL_CURSE_OF_EXERTION, false); - events.RepeatEvent(9000); + events.Repeat(9s); break; case EVENT_SPELL_WOUNDING_STRIKE: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_WOUNDING_STRIKE_N, SPELL_WOUNDING_STRIKE_H), false); - events.RepeatEvent(6000); + me->CastSpell(me->GetVictim(), SPELL_WOUNDING_STRIKE, false); + events.Repeat(6s); break; case EVENT_SPELL_TIME_STOP: me->CastSpell(me, SPELL_TIME_STOP, false); - events.RepeatEvent(20000); + events.Repeat(20s); break; case EVENT_SPELL_TIME_WARP: Talk(SAY_TIME_WARP); me->CastSpell(me, SPELL_TIME_WARP, false); if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) - me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true); + me->CastSpell(target, SPELL_TIME_STEP, true); - events.RepeatEvent(25000); + events.Repeat(25s); break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp index 7ec0d095c3..854b43b389 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp @@ -67,7 +67,7 @@ public: summons.DespawnAll(); if (InstanceScript* pInstance = me->GetInstanceScript()) if (pInstance->GetData(DATA_GUARDIANTIME_EVENT) == 0) - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); me->SummonCreature(NPC_TIME_RIFT, 2337.6f, 1270.0f, 132.95f, 2.79f); me->SummonCreature(NPC_GUARDIAN_OF_TIME, 2319.3f, 1267.7f, 132.8f, 1.0f); @@ -79,8 +79,8 @@ public: void JustEngagedWith(Unit* /*who*/) override { me->InterruptNonMeleeSpells(false); - events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8000); - events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12000); + events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8s); + events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12s); Talk(SAY_AGGRO); } @@ -93,11 +93,11 @@ public: { if (cr->GetEntry() == NPC_TIME_RIFT) { - cr->DespawnOrUnsummon(1000); + cr->DespawnOrUnsummon(1s); } else { - cr->DespawnOrUnsummon(5000); + cr->DespawnOrUnsummon(5s); cr->RemoveAllAuras(); cr->AI()->Talk(SAY_THANKS); } @@ -120,7 +120,7 @@ public: { Talk(SAY_FAIL); summons.DespawnAll(); - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); } } @@ -147,12 +147,12 @@ public: { case EVENT_SPELL_VOID_STRIKE: me->CastSpell(me->GetVictim(), SPELL_VOID_STRIKE, false); - events.RepeatEvent(8000); + events.Repeat(8s); break; case EVENT_SPELL_CORRUPTING_BLIGHT: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) me->CastSpell(target, SPELL_CORRUPTING_BLIGHT, false); - events.RepeatEvent(12000); + events.Repeat(12s); break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp index 065224bdc3..eefb3f71b6 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -22,12 +22,9 @@ enum Spells { - SPELL_CARRION_SWARM_N = 52720, - SPELL_CARRION_SWARM_H = 58852, - SPELL_MIND_BLAST_N = 52722, - SPELL_MIND_BLAST_H = 58850, - SPELL_SLEEP_N = 52721, - SPELL_SLEEP_H = 58849, + SPELL_CARRION_SWARM = 52720, + SPELL_MIND_BLAST = 52722, + SPELL_SLEEP = 52721, SPELL_VAMPIRIC_TOUCH = 52723, }; @@ -80,17 +77,17 @@ public: if (finished) { Talk(SAY_OUTRO); - me->DespawnOrUnsummon(20000); + me->DespawnOrUnsummon(20s); } } void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6000); - events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11000); - events.ScheduleEvent(EVENT_SPELL_SLEEP, 20000); - events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15000); + events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6s); + events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11s); + events.ScheduleEvent(EVENT_SPELL_SLEEP, 20s); + events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15s); } void JustDied(Unit* /*killer*/) override @@ -145,23 +142,23 @@ public: switch (events.ExecuteEvent()) { case EVENT_SPELL_CARRION_SWARM: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CARRION_SWARM_N, SPELL_CARRION_SWARM_H), false); - events.RepeatEvent(7000); + me->CastSpell(me->GetVictim(), SPELL_CARRION_SWARM, false); + events.Repeat(7s); break; case EVENT_SPELL_MIND_BLAST: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) - me->CastSpell(target, DUNGEON_MODE(SPELL_MIND_BLAST_N, SPELL_MIND_BLAST_H), false); - events.RepeatEvent(6000); + me->CastSpell(target, SPELL_MIND_BLAST, false); + events.Repeat(6s); break; case EVENT_SPELL_SLEEP: Talk(SAY_SLEEP); if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) - me->CastSpell(target, DUNGEON_MODE(SPELL_SLEEP_N, SPELL_SLEEP_H), false); - events.RepeatEvent(17000); + me->CastSpell(target, SPELL_SLEEP, false); + events.Repeat(17s); break; case EVENT_SPELL_VAMPIRIC_TOUCH: me->CastSpell(me, SPELL_VAMPIRIC_TOUCH, true); - events.RepeatEvent(30000); + events.Repeat(30s); break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp index 8a87485c1e..e1ec2ec439 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp @@ -21,10 +21,8 @@ enum Spells { - SPELL_CONSTRICTING_CHAINS_N = 52696, - SPELL_CONSTRICTING_CHAINS_H = 58823, - SPELL_DISEASE_EXPULSION_N = 52666, - SPELL_DISEASE_EXPULSION_H = 58824, + SPELL_CONSTRICTING_CHAINS = 52696, + SPELL_DISEASE_EXPULSION = 52666, SPELL_FRENZY = 58841, }; @@ -66,9 +64,9 @@ public: void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15000); - events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4000); - events.RescheduleEvent(EVENT_SPELL_FRENZY, 20000); + events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15s); + events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4s); + events.RescheduleEvent(EVENT_SPELL_FRENZY, 20s); } void JustDied(Unit* /*killer*/) override @@ -97,17 +95,17 @@ public: switch (events.ExecuteEvent()) { case EVENT_SPELL_DISEASE_EXPULSION: - me->CastSpell(me, DUNGEON_MODE(SPELL_DISEASE_EXPULSION_N, SPELL_DISEASE_EXPULSION_H), false); - events.RepeatEvent(6000); + me->CastSpell(me, SPELL_DISEASE_EXPULSION, false); + events.Repeat(6s); break; case EVENT_SPELL_FRENZY: me->CastSpell(me, SPELL_FRENZY, false); - events.RepeatEvent(20000); + events.Repeat(20s); break; case EVENT_SPELL_CONSTRICTING_CHAINS: if (Unit* pTarget = SelectTarget(SelectTargetMethod::MinThreat, 0, 50.0f, true)) - me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false); - events.RepeatEvent(14000); + me->CastSpell(pTarget, SPELL_CONSTRICTING_CHAINS, false); + events.Repeat(14s); break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp index f0228eec2a..545645d8c7 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp @@ -23,14 +23,12 @@ enum Spells { - SPELL_SHADOW_BOLT_N = 57725, - SPELL_SHADOW_BOLT_H = 58827, + SPELL_SHADOW_BOLT = 57725, SPELL_STEAL_FLESH_CHANNEL = 52708, SPELL_STEAL_FLESH_TARGET = 52711, SPELL_STEAL_FLESH_CASTER = 52712, SPELL_SUMMON_GHOULS = 52451, - SPELL_EXPLODE_GHOUL_N = 52480, - SPELL_EXPLODE_GHOUL_H = 58825, + SPELL_EXPLODE_GHOUL = 52480, SPELL_CURSE_OF_TWISTED_FAITH = 58845, }; @@ -84,12 +82,12 @@ public: void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 7000); - events.ScheduleEvent(EVENT_SPELL_STEAL_FLESH, 11000); - events.ScheduleEvent(EVENT_SPELL_SUMMON_GHOULS, 16000); - events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 22000); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 7s); + events.ScheduleEvent(EVENT_SPELL_STEAL_FLESH, 11s); + events.ScheduleEvent(EVENT_SPELL_SUMMON_GHOULS, 16s); + events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 22s); if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_CURSE, 25000); + events.ScheduleEvent(EVENT_SPELL_CURSE, 25s); } void JustDied(Unit* /*killer*/) override @@ -112,7 +110,7 @@ public: if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr))) if (cr->IsAlive()) { - me->CastSpell(cr, DUNGEON_MODE(SPELL_EXPLODE_GHOUL_N, SPELL_EXPLODE_GHOUL_H), false); + me->CastSpell(cr, SPELL_EXPLODE_GHOUL, false); return; } } @@ -129,30 +127,30 @@ public: switch (events.ExecuteEvent()) { case EVENT_SPELL_SHADOW_BOLT: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false); - events.RepeatEvent(10000); + me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); + events.Repeat(10s); break; case EVENT_SPELL_STEAL_FLESH: if (!urand(0, 2)) Talk(SAY_STEAL_FLESH); me->CastSpell(me->GetVictim(), SPELL_STEAL_FLESH_CHANNEL, false); - events.RepeatEvent(12000); + events.Repeat(12s); break; case EVENT_SPELL_SUMMON_GHOULS: if (!urand(0, 2)) Talk(SAY_SUMMON_GHOULS); me->CastSpell(me, SPELL_SUMMON_GHOULS, false); - events.RepeatEvent(10000); + events.Repeat(10s); break; case EVENT_EXPLODE_GHOUL: if (!urand(0, 2)) Talk(SAY_EXPLODE_GHOUL); ExplodeGhoul(); - events.RepeatEvent(15000); + events.Repeat(15s); break; case EVENT_SPELL_CURSE: me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_TWISTED_FAITH, false); - events.RepeatEvent(30000); + events.Repeat(30s); break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 32ec43e808..0403df2f58 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -141,8 +141,7 @@ enum Spells { // Combat spells SPELL_ARTHAS_AURA = 52442, - SPELL_ARTHAS_EXORCISM_N = 52445, - SPELL_ARTHAS_EXORCISM_H = 58822, + SPELL_ARTHAS_EXORCISM = 52445, SPELL_ARTHAS_HOLY_LIGHT = 52444, // Visuals @@ -385,7 +384,7 @@ public: uint8 timeRiftId; Creature* GetEventNpc(uint32 entry); - void ScheduleNextEvent(uint32 currentEvent, uint32 time); + void ScheduleNextEvent(uint32 currentEvent, Milliseconds time); void SummonNextWave(); void ReorderInstance(uint32 data); void JustEngagedWith(Unit* /*who*/) override ; @@ -418,13 +417,13 @@ public: { // Event eventInRun = true; - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE1, 0); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE1, 0ms); } else if (param == ACTION_START_CITY) { Talk(SAY_PHASE201); - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE2, 12000); - SetRun(false); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE2, 12s); + me->SetWalk(true); eventInRun = true; me->SummonCreature(NPC_CITY_MAN, EventPos[EVENT_SRC_TOWN_CITYMAN1]); @@ -434,14 +433,14 @@ public: { waveGroupId = 10; eventInRun = true; - SetRun(true); - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE2 + 9, 10000); + me->SetWalk(false); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE2 + 9, 10s); } else if (param == ACTION_START_TOWN_HALL) { Talk(SAY_PHASE301); SetEscortPaused(false); - SetRun(false); + me->SetWalk(true); if (Creature* cr = me->SummonCreature(NPC_CITY_MAN3, EventPos[EVENT_SRC_HALL_CITYMAN1])) { @@ -460,13 +459,13 @@ public: { Talk(SAY_PHASE401); SetEscortPaused(false); - SetRun(false); + me->SetWalk(true); } else if (param == ACTION_START_LAST_CITY) { Talk(SAY_PHASE404); SetEscortPaused(false); - SetRun(true); + me->SetWalk(false); } else if (param == ACTION_START_MALGANIS) { @@ -480,13 +479,13 @@ public: } Talk(SAY_PHASE501); SetEscortPaused(false); - SetRun(true); + me->SetWalk(false); } else if (param == ACTION_KILLED_MALGANIS) { EnterEvadeMode(); eventInRun = true; - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE5 + 1, 22000); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE5 + 1, 22s); me->SetFacingTo(1.84f); if (!me->GetMap()->GetPlayers().IsEmpty()) @@ -533,7 +532,7 @@ public: break; // After intro, in front of bridge case 3: - SetRun(true); + me->SetWalk(false); Talk(SAY_PHASE118); summons.DespawnAll(); // uther, jaina and horses break; @@ -547,7 +546,7 @@ public: if (Creature* stalker = me->SummonCreature(NPC_INVIS_TARGET, 2026.469f, 1287.088f, 143.596f, 1.37f, TEMPSUMMON_TIMED_DESPAWN, 14000)) { me->SetFacingToObject(stalker); - stalker->DespawnOrUnsummon(500); + stalker->DespawnOrUnsummon(500ms); } break; // Reached first cityman @@ -574,12 +573,12 @@ public: if (pInstance) pInstance->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_REACHED_TOWN_HALL); me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); - SetRun(false); + me->SetWalk(true); SetEscortPaused(true); break; // Inside Town Hall first scene pos case 22: - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE3, 0); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE3, 0ms); eventInRun = true; SetEscortPaused(true); break; @@ -600,7 +599,7 @@ public: break; // Town Hall, upper floor third fight case 31: - SetRun(false); + me->SetWalk(true); SpawnTimeRift(); SpawnTimeRift(); Talk(SAY_PHASE312); @@ -616,14 +615,14 @@ public: break; // Reached book shelf case 36: - SetRun(true); + me->SetWalk(false); if (pInstance) if (GameObject* pGate = pInstance->instance->GetGameObject(pInstance->GetGuidData(DATA_SHKAF_GATE))) pGate->SetGoState(GO_STATE_ACTIVE); break; // Behind secred passage case 45: - SetRun(true); + me->SetWalk(false); me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); SetEscortPaused(true); if (pInstance) @@ -631,11 +630,11 @@ public: break; // Some walk talk case 47: - SetRun(false); + me->SetWalk(true); Talk(SAY_PHASE405); break; case 48: - SetRun(true); + me->SetWalk(false); Talk(SAY_PHASE406); break; case 53: @@ -652,7 +651,7 @@ public: // Infront of malganis case 55: Talk(SAY_PHASE502); - actionEvents.ScheduleEvent(EVENT_ACTION_PHASE5, 7000); + actionEvents.ScheduleEvent(EVENT_ACTION_PHASE5, 7s); SetEscortPaused(true); eventInRun = true; break; @@ -674,44 +673,45 @@ public: switch (uint32 currentEvent = actionEvents.ExecuteEvent()) { case EVENT_ACTION_PHASE1: - SetRun(false); + me->SetWalk(true); me->SummonCreature(NPC_JAINA, EventPos[EVENT_SRC_JAINA], TEMPSUMMON_DEAD_DESPAWN, 180000); if (Creature* uther = me->SummonCreature(NPC_UTHER, EventPos[EVENT_SRC_UTHER], TEMPSUMMON_DEAD_DESPAWN, 180000)) { - uther->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_UTHER], false); + uther->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_UTHER], FORCED_MOVEMENT_NONE, 0.f, false); uther->SetTarget(me->GetGUID()); me->SetTarget(uther->GetGUID()); } for (int i = 0; i < 3; ++i) if (Creature* horse = me->SummonCreature(NPC_HORSE_ESCORT, EventPos[EVENT_SRC_HORSE1 + i], TEMPSUMMON_DEAD_DESPAWN, 180000)) - horse->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_HORSE1 + i], false); + horse->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_HORSE1 + i], FORCED_MOVEMENT_NONE, 0.f, false); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE1+1: // Start Event - Start(true, false); + me->SetWalk(true); + Start(true); SetDespawnAtEnd(false); SetDespawnAtFar(false); - ScheduleNextEvent(currentEvent, 9000); + ScheduleNextEvent(currentEvent, 9s); break; // After waypoint 0 case EVENT_ACTION_PHASE1+2: Talk(SAY_PHASE101); - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE1+3: if (Creature* uther = GetEventNpc(NPC_UTHER)) uther->AI()->Talk(SAY_PHASE102); - ScheduleNextEvent(currentEvent, 8000); + ScheduleNextEvent(currentEvent, 8s); break; case EVENT_ACTION_PHASE1+4: SetEscortPaused(false); eventInRun = false; Talk(SAY_PHASE103); - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; // After waypoint 1 case EVENT_ACTION_PHASE1+5: @@ -719,92 +719,92 @@ public: jaina->SetTarget(me->GetGUID()); Talk(SAY_PHASE104); - ScheduleNextEvent(currentEvent, 10000); + ScheduleNextEvent(currentEvent, 10s); break; case EVENT_ACTION_PHASE1+6: if (Creature* uther = GetEventNpc(NPC_UTHER)) uther->AI()->Talk(SAY_PHASE105); - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; case EVENT_ACTION_PHASE1+7: Talk(SAY_PHASE106); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE1+8: if (Creature* uther = GetEventNpc(NPC_UTHER)) uther->AI()->Talk(SAY_PHASE107); - ScheduleNextEvent(currentEvent, 6000); + ScheduleNextEvent(currentEvent, 6s); break; case EVENT_ACTION_PHASE1+9: Talk(SAY_PHASE108); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE1+10: if (Creature* uther = GetEventNpc(NPC_UTHER)) uther->AI()->Talk(SAY_PHASE109); - ScheduleNextEvent(currentEvent, 8000); + ScheduleNextEvent(currentEvent, 8s); break; case EVENT_ACTION_PHASE1+11: Talk(SAY_PHASE110); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE1+12: if (Creature* uther = GetEventNpc(NPC_UTHER)) uther->AI()->Talk(SAY_PHASE111); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE1+13: Talk(SAY_PHASE112); - ScheduleNextEvent(currentEvent, 11000); + ScheduleNextEvent(currentEvent, 11s); break; case EVENT_ACTION_PHASE1+14: if (Creature* jaina = GetEventNpc(NPC_JAINA)) jaina->AI()->Talk(SAY_PHASE113); - ScheduleNextEvent(currentEvent, 2500); + ScheduleNextEvent(currentEvent, 2500ms); break; case EVENT_ACTION_PHASE1+15: Talk(SAY_PHASE114); - ScheduleNextEvent(currentEvent, 9000); + ScheduleNextEvent(currentEvent, 9s); break; case EVENT_ACTION_PHASE1+16: if (Creature* uther = GetEventNpc(NPC_UTHER)) uther->AI()->Talk(SAY_PHASE115); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE1+17: for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) { Creature* summon = ObjectAccessor::GetCreature(*me, *i); if (summon && summon->GetEntry() == NPC_HORSE_ESCORT) - summon->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], false); + summon->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], FORCED_MOVEMENT_NONE, 0.f, false); } - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; case EVENT_ACTION_PHASE1+18: if (Creature* uther = GetEventNpc(NPC_UTHER)) { uther->SetTarget(); uther->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - uther->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], false); + uther->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], FORCED_MOVEMENT_NONE, 0.f, false); } - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; case EVENT_ACTION_PHASE1+19: if (Creature* jaina = GetEventNpc(NPC_JAINA)) { jaina->SetTarget(); jaina->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - jaina->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], false); + jaina->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], FORCED_MOVEMENT_NONE, 0.f, false); } Talk(SAY_PHASE116); - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE1+20: if (Creature* jaina = GetEventNpc(NPC_JAINA)) @@ -813,16 +813,16 @@ public: jaina->AI()->Talk(SAY_PHASE117); } - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE1+21: if (Creature* jaina = GetEventNpc(NPC_JAINA)) { jaina->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - jaina->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], false); + jaina->GetMotionMaster()->MovePoint(0, EventPos[EVENT_POS_RETREAT], FORCED_MOVEMENT_NONE, 0.f, false); } summons.DespawnEntry(NPC_HORSE_ESCORT); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE1+22: SetEscortPaused(false); @@ -836,7 +836,7 @@ public: me->SetTarget(); SetEscortPaused(false); eventInRun = false; - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; // After waypoint 9 case EVENT_ACTION_PHASE2+1: @@ -848,23 +848,23 @@ public: cityman->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_CITYMAN]); } - ScheduleNextEvent(currentEvent, 9000); + ScheduleNextEvent(currentEvent, 9s); break; case EVENT_ACTION_PHASE2+2: Talk(SAY_PHASE203); SetEscortPaused(false); eventInRun = false; - ScheduleNextEvent(currentEvent, 1500); + ScheduleNextEvent(currentEvent, 1500ms); break; // After waypoint 11 case EVENT_ACTION_PHASE2+3: if (Creature* stalker = me->SummonCreature(NPC_INVIS_TARGET, 2081.447f, 1287.770f, 141.3241f, 1.37f, TEMPSUMMON_TIMED_DESPAWN, 10000)) { me->SetFacingToObject(stalker); - stalker->DespawnOrUnsummon(500); + stalker->DespawnOrUnsummon(500ms); } Talk(SAY_PHASE205); - ScheduleNextEvent(currentEvent, 4000); + ScheduleNextEvent(currentEvent, 4s); break; case EVENT_ACTION_PHASE2+4: if (Creature* malganis = me->SummonCreature(NPC_MAL_GANIS, EventPos[EVENT_SRC_MALGANIS], TEMPSUMMON_TIMED_DESPAWN, 60000)) @@ -889,13 +889,13 @@ public: unitList.clear(); } - ScheduleNextEvent(currentEvent, 12000); + ScheduleNextEvent(currentEvent, 12s); break; case EVENT_ACTION_PHASE2+5: if (Creature* malganis = GetEventNpc(NPC_MAL_GANIS)) malganis->AI()->Talk(SAY_PHASE207); - ScheduleNextEvent(currentEvent, 15000); + ScheduleNextEvent(currentEvent, 15s); break; case EVENT_ACTION_PHASE2+6: if (Creature* malganis = GetEventNpc(NPC_MAL_GANIS)) @@ -906,7 +906,7 @@ public: } Talk(SAY_PHASE208); - ScheduleNextEvent(currentEvent, 11000); + ScheduleNextEvent(currentEvent, 11s); break; case EVENT_ACTION_PHASE2+7: summons.DespawnEntry(NPC_MAL_GANIS); @@ -914,7 +914,7 @@ public: summons.DespawnEntry(NPC_CITY_MAN2); Talk(SAY_PHASE209); me->SetReactState(REACT_DEFENSIVE); - ScheduleNextEvent(currentEvent, 20000); + ScheduleNextEvent(currentEvent, 20s); if (pInstance) pInstance->SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_FINISHED_CITY_INTRO); break; @@ -941,36 +941,36 @@ public: cr->SetTarget(me->GetGUID()); if (Creature* cr = GetEventNpc(NPC_CITY_MAN)) cr->SetTarget(me->GetGUID()); - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; case EVENT_ACTION_PHASE3+1: me->SetReactState(REACT_AGGRESSIVE); if (Creature* cr = GetEventNpc(NPC_CITY_MAN3)) cr->AI()->Talk(SAY_PHASE302); - ScheduleNextEvent(currentEvent, 7000); + ScheduleNextEvent(currentEvent, 7s); break; case EVENT_ACTION_PHASE3+2: Talk(SAY_PHASE303); SetEscortPaused(false); eventInRun = false; - ScheduleNextEvent(currentEvent, 0); + ScheduleNextEvent(currentEvent, 0ms); break; // After waypoint 23 case EVENT_ACTION_PHASE3+3: - SetRun(true); + me->SetWalk(false); if (Creature* cr = GetEventNpc(NPC_CITY_MAN3)) me->CastSpell(cr, SPELL_ARTHAS_CRUSADER_STRIKE, true); - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE3+4: Talk(SAY_PHASE304); - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE3+5: if (Creature* cr = GetEventNpc(NPC_CITY_MAN3)) cr->AI()->Talk(SAY_PHASE305); - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; // Trio citizen transformation right as we enter Town Hall case EVENT_ACTION_PHASE3+6: @@ -981,7 +981,7 @@ public: cr->SetImmuneToAll(true); cr->SetReactState(REACT_PASSIVE); } - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE3+7: if (Creature* cr = GetEventNpc(NPC_CITY_MAN4)) @@ -991,7 +991,7 @@ public: cr->SetImmuneToAll(true); cr->SetReactState(REACT_PASSIVE); } - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE3+8: if (Creature* cr = GetEventNpc(NPC_CITY_MAN3)) @@ -1016,35 +1016,35 @@ public: cr->SetInCombatWithZone(); cr->AddThreat(me, 0.0f); } - ScheduleNextEvent(currentEvent, 2000); + ScheduleNextEvent(currentEvent, 2s); break; case EVENT_ACTION_PHASE3+9: // Arthas is fighting infinites in town hall if (me->IsInCombat()) { - actionEvents.RepeatEvent(1000); + actionEvents.Repeat(1s); return; } summons.DespawnAll(); Talk(SAY_PHASE305_1); me->SetFacingTo(0.0f); - ScheduleNextEvent(currentEvent, 5000); + ScheduleNextEvent(currentEvent, 5s); break; case EVENT_ACTION_PHASE3+10: Talk(SAY_PHASE306); - ScheduleNextEvent(currentEvent, 5000); + ScheduleNextEvent(currentEvent, 5s); break; case EVENT_ACTION_PHASE3+11: SetEscortPaused(false); eventInRun = false; - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; case EVENT_ACTION_PHASE3+12: // Arthas is fighting first chronos if (me->IsInCombat()) { - actionEvents.RepeatEvent(1000); + actionEvents.Repeat(1s); return; } @@ -1052,13 +1052,13 @@ public: SetEscortPaused(false); Talk(SAY_PHASE308); me->SetFacingTo(M_PI); - ScheduleNextEvent(currentEvent, 0); + ScheduleNextEvent(currentEvent, 0ms); break; case EVENT_ACTION_PHASE3+13: // Arthas is fighting second chronos if (me->IsInCombat()) { - actionEvents.RepeatEvent(1000); + actionEvents.Repeat(1s); return; } @@ -1066,18 +1066,18 @@ public: SetEscortPaused(false); Talk(SAY_PHASE311); me->SetFacingTo(M_PI * 3 / 2); - ScheduleNextEvent(currentEvent, 0); + ScheduleNextEvent(currentEvent, 0ms); break; case EVENT_ACTION_PHASE3+14: // Arthas is fighting third chronos if (me->IsInCombat()) { - actionEvents.RepeatEvent(1000); + actionEvents.Repeat(1s); return; } me->SetFacingTo(M_PI / 2); - ScheduleNextEvent(currentEvent, 8000); + ScheduleNextEvent(currentEvent, 8s); break; case EVENT_ACTION_PHASE3+15: Talk(SAY_PHASE313); @@ -1090,17 +1090,17 @@ public: cr->GetMotionMaster()->MovePoint(0, EventPos[EVENT_DST_EPOCH]); } - ScheduleNextEvent(currentEvent, 3000); + ScheduleNextEvent(currentEvent, 3s); break; case EVENT_ACTION_PHASE3+16: if (Creature* cr = GetEventNpc(NPC_EPOCH)) cr->AI()->Talk(SAY_PHASE314); - ScheduleNextEvent(currentEvent, 14000); + ScheduleNextEvent(currentEvent, 14s); break; case EVENT_ACTION_PHASE3+17: Talk(SAY_PHASE315); - ScheduleNextEvent(currentEvent, 7000); + ScheduleNextEvent(currentEvent, 7s); break; case EVENT_ACTION_PHASE3+18: if (Creature* cr = GetEventNpc(NPC_EPOCH)) @@ -1111,13 +1111,13 @@ public: cr->AddThreat(me, 0.0f); cr->SetInCombatWithZone(); } - ScheduleNextEvent(currentEvent, 1000); + ScheduleNextEvent(currentEvent, 1s); break; case EVENT_ACTION_PHASE3+19: // Arthas is fighting epoch chronos if (me->IsInCombat()) { - actionEvents.RepeatEvent(1000); + actionEvents.Repeat(1s); return; } @@ -1143,7 +1143,7 @@ public: Talk(SAY_PHASE503); SetEscortPaused(false); eventInRun = false; - ScheduleNextEvent(currentEvent, 5000); + ScheduleNextEvent(currentEvent, 5s); break; case EVENT_ACTION_PHASE5+2: me->SetFacingTo(5.28f); @@ -1154,18 +1154,9 @@ public: if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(DATA_EXIT_GATE))) go->SetGoState(GO_STATE_ACTIVE); - if (!me->GetMap()->GetPlayers().IsEmpty()) - { - if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource()) - { - if (GameObject* chest = player->SummonGameObject(DUNGEON_MODE(GO_MALGANIS_CHEST_N, GO_MALGANIS_CHEST_H), 2288.35f, 1498.73f, 128.414f, -0.994837f, 0, 0, 0, 0, 0)) - { - chest->SetLootRecipient(me->GetMap()); - } - } - } + pInstance->instance->SummonGameObject(DUNGEON_MODE(GO_MALGANIS_CHEST_N, GO_MALGANIS_CHEST_H), 2288.35f, 1498.73f, 128.414f, -0.994837f, 0, 0, 0, 0, 7 * DAY * IN_MILLISECONDS); } - ScheduleNextEvent(currentEvent, 10000); + ScheduleNextEvent(currentEvent, 10s); break; case EVENT_ACTION_PHASE5+3: eventInRun = false; @@ -1186,15 +1177,15 @@ public: { case EVENT_COMBAT_EXORCISM: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_ARTHAS_EXORCISM_N, SPELL_ARTHAS_EXORCISM_H), false); + me->CastSpell(target, SPELL_ARTHAS_EXORCISM, false); - combatEvents.RepeatEvent(7300); + combatEvents.Repeat(7300ms); break; case EVENT_COMBAT_HEALTH_CHECK: if (HealthBelowPct(40)) me->CastSpell(me, SPELL_ARTHAS_HOLY_LIGHT, false); - combatEvents.RepeatEvent(1000); + combatEvents.Repeat(1s); break; } @@ -1219,7 +1210,7 @@ Creature* npc_arthas::npc_arthasAI::GetEventNpc(uint32 entry) return nullptr; } -void npc_arthas::npc_arthasAI::ScheduleNextEvent(uint32 currentEvent, uint32 time) +void npc_arthas::npc_arthasAI::ScheduleNextEvent(uint32 currentEvent, Milliseconds time) { actionEvents.ScheduleEvent(currentEvent + 1, time); } @@ -1245,13 +1236,14 @@ void npc_arthas::npc_arthasAI::JustEngagedWith(Unit* /*who*/) DoCast(me, SPELL_ARTHAS_AURA); // Fight - combatEvents.ScheduleEvent(EVENT_COMBAT_EXORCISM, 2000); - combatEvents.ScheduleEvent(EVENT_COMBAT_HEALTH_CHECK, 2000); + combatEvents.ScheduleEvent(EVENT_COMBAT_EXORCISM, 2s); + combatEvents.ScheduleEvent(EVENT_COMBAT_HEALTH_CHECK, 2s); } void npc_arthas::npc_arthasAI::ReorderInstance(uint32 data) { - Start(true, true); + me->SetWalk(false); + Start(true); SetEscortPaused(true); SetDespawnAtEnd(false); @@ -1270,7 +1262,7 @@ void npc_arthas::npc_arthasAI::ReorderInstance(uint32 data) if (data == COS_PROGRESS_FINISHED_CITY_INTRO) { eventInRun = true; - actionEvents.RescheduleEvent(EVENT_ACTION_PHASE2 + 8, 10000); + actionEvents.RescheduleEvent(EVENT_ACTION_PHASE2 + 8, 10s); } else if (data == COS_PROGRESS_KILLED_MEATHOOK) { @@ -1352,7 +1344,7 @@ void npc_arthas::npc_arthasAI::SpawnTimeRift() if (Creature* cr = me->SummonCreature(/*entry*/(uint32)RiftAndSpawnsLocations[timeRiftId][i][0], RiftAndSpawnsLocations[timeRiftId][0][1], RiftAndSpawnsLocations[timeRiftId][0][2], RiftAndSpawnsLocations[timeRiftId][0][3], RiftAndSpawnsLocations[timeRiftId][0][4])) { if (cr->GetEntry() == NPC_TIME_RIFT) - cr->DespawnOrUnsummon(10000); + cr->DespawnOrUnsummon(10s); else // x, y, z (0 is entry) { // first infinite @@ -1547,7 +1539,7 @@ public: if (me->GetDistance(2400, 1200, 135) > 20.0f && data >= COS_PROGRESS_FINISHED_CITY_INTRO) { if (data >= COS_PROGRESS_KILLED_SALRAMM) - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); else InfectMe(3000); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp index 961ec2c7b9..dbb18cf283 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp @@ -307,7 +307,7 @@ public: if (Creature* cr = instance->SummonCreature(NPC_CHROMIE_MIDDLE, pos)) { cr->SetVisible(false); - cr->DespawnOrUnsummon(1000); + cr->DespawnOrUnsummon(1s); sCreatureTextMgr->SendChat(cr, textId, player, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp index 16ad3de36f..98b15dd76b 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp @@ -48,7 +48,7 @@ struct boss_lieutenant_drake : public BossAI { runSecondPath = false; pathId = me->GetEntry() * 10; - me->GetMotionMaster()->MovePath(pathId, false); + me->GetMotionMaster()->MoveWaypoint(pathId, false); } void JustEngagedWith(Unit* /*who*/) override @@ -114,10 +114,10 @@ struct boss_lieutenant_drake : public BossAI { switch (point) { - case 7: + case 8: Talk(SAY_ENTER); break; - case 10: + case 11: pathId = (me->GetEntry() * 10) + 1; runSecondPath = true; break; @@ -132,7 +132,7 @@ struct boss_lieutenant_drake : public BossAI if (runSecondPath) { runSecondPath = false; - me->GetMotionMaster()->MovePath(pathId, true); + me->GetMotionMaster()->MoveWaypoint(pathId, true); } if (!UpdateVictim()) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp index 6cb2b46da7..0afbb1e500 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp @@ -79,11 +79,11 @@ public: if (_encounterProgress == ENCOUNTER_PROGRESS_NONE) return; - _events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 0); - _events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 0); + _events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 0ms); + _events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 0ms); if (_encounterProgress == ENCOUNTER_PROGRESS_BARRELS) - _events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 0); + _events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 0ms); else SetData(DATA_THRALL_REPOSITION, 2); } @@ -138,7 +138,7 @@ public: { case DATA_THRALL_REPOSITION: if (data > 1) - _events.ScheduleEvent(EVENT_THRALL_REPOSITION, data == 2 ? 0 : 10000); + _events.ScheduleEvent(EVENT_THRALL_REPOSITION, data == 2 ? 0ms : 10s); else if (Creature* thrall = instance->GetCreature(_thrallGUID)) Reposition(thrall); return; @@ -157,9 +157,9 @@ public: DoUpdateWorldState(WORLD_STATE_OLD_HILLSBRAD_BARRELS_PLANTED, ++_barrelCount); if (_barrelCount == 5) { - _events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4000); - _events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12000); - _events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18000); + _events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4s); + _events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12s); + _events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18s); } break; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 8745dc128c..1f15ef140b 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -258,8 +258,8 @@ public: switch (param) { case ENCOUNTER_PROGRESS_BARRELS: - events.ScheduleEvent(EVENT_OPEN_DOORS, 0); - events.ScheduleEvent(EVENT_START_WP, 3000); + events.ScheduleEvent(EVENT_OPEN_DOORS, 0ms); + events.ScheduleEvent(EVENT_START_WP, 3s); break; case ENCOUNTER_PROGRESS_THRALL_ARMORED: case ENCOUNTER_PROGRESS_AMBUSHES_1: @@ -268,27 +268,27 @@ public: SetEscortPaused(false); break; case ENCOUNTER_PROGRESS_TARETHA_MEET: - events.ScheduleEvent(EVENT_SUMMON_CHRONO, 0); - events.ScheduleEvent(EVENT_THRALL_TALK_2, 6000); - events.ScheduleEvent(EVENT_TARETHA_FALL, 11000); - events.ScheduleEvent(EVENT_THRALL_TALK_3, 15000); - events.ScheduleEvent(EVENT_THRALL_MOVE_DOWN, 17000); + events.ScheduleEvent(EVENT_SUMMON_CHRONO, 0ms); + events.ScheduleEvent(EVENT_THRALL_TALK_2, 6s); + events.ScheduleEvent(EVENT_TARETHA_FALL, 11s); + events.ScheduleEvent(EVENT_THRALL_TALK_3, 15s); + events.ScheduleEvent(EVENT_THRALL_MOVE_DOWN, 17s); break; case NPC_TARETHA: - events.ScheduleEvent(EVENT_THRALL_FACE_TARETHA, 0); - events.ScheduleEvent(EVENT_THRALL_TALK_4, 4000); - events.ScheduleEvent(EVENT_TARETHA_TALK_1, 13000); - events.ScheduleEvent(EVENT_THRALL_TALK_5, 17000); - events.ScheduleEvent(EVENT_SUMMON_EROZION, 17500); - events.ScheduleEvent(EVENT_EROZION_TALK_1, 18000); - events.ScheduleEvent(EVENT_EROZION_ACTION_1, 24000); - events.ScheduleEvent(EVENT_EROZION_TALK_2, 29000); - events.ScheduleEvent(EVENT_EROZION_TALK_3, 40000); - events.ScheduleEvent(EVENT_EROZION_ACTION_2, 46000); - events.ScheduleEvent(EVENT_THRALL_TALK_6, 48000); - events.ScheduleEvent(EVENT_THRALL_RUN_AWAY, 51000); - events.ScheduleEvent(EVENT_TARETHA_TALK_2, 53000); - events.ScheduleEvent(EVENT_EROZION_FLAGS, 56000); + events.ScheduleEvent(EVENT_THRALL_FACE_TARETHA, 0ms); + events.ScheduleEvent(EVENT_THRALL_TALK_4, 4s); + events.ScheduleEvent(EVENT_TARETHA_TALK_1, 13s); + events.ScheduleEvent(EVENT_THRALL_TALK_5, 17s); + events.ScheduleEvent(EVENT_SUMMON_EROZION, 17500ms); + events.ScheduleEvent(EVENT_EROZION_TALK_1, 18s); + events.ScheduleEvent(EVENT_EROZION_ACTION_1, 24s); + events.ScheduleEvent(EVENT_EROZION_TALK_2, 29s); + events.ScheduleEvent(EVENT_EROZION_TALK_3, 40s); + events.ScheduleEvent(EVENT_EROZION_ACTION_2, 46s); + events.ScheduleEvent(EVENT_THRALL_TALK_6, 48s); + events.ScheduleEvent(EVENT_THRALL_RUN_AWAY, 51s); + events.ScheduleEvent(EVENT_TARETHA_TALK_2, 53s); + events.ScheduleEvent(EVENT_EROZION_FLAGS, 56s); break; } } @@ -311,23 +311,23 @@ public: Talk(SAY_START_EVENT_PART1); break; case 8: - events.ScheduleEvent(EVENT_SET_FACING, 500); - events.ScheduleEvent(EVENT_ARMORER_SAY, 700); - events.ScheduleEvent(EVENT_THRALL_EMOTE, 1300); + events.ScheduleEvent(EVENT_SET_FACING, 500ms); + events.ScheduleEvent(EVENT_ARMORER_SAY, 700ms); + events.ScheduleEvent(EVENT_THRALL_EMOTE, 1300ms); break; case 9: - SetRun(false); - events.ScheduleEvent(EVENT_KILL_ARMORER, 500); - events.ScheduleEvent(EVENT_TALK_KILL_ARMORER, 3000); + me->SetWalk(true); + events.ScheduleEvent(EVENT_KILL_ARMORER, 500ms); + events.ScheduleEvent(EVENT_TALK_KILL_ARMORER, 3s); break; case 10: - SetRun(true); - events.ScheduleEvent(EVENT_DRESSING_KNEEL, 500); - events.ScheduleEvent(EVENT_DRESSING_ARMOR, 3000); - events.ScheduleEvent(EVENT_DRESSING_STAND, 4000); - events.ScheduleEvent(EVENT_DRESSING_AXE, 7000); - events.ScheduleEvent(EVENT_DRESSING_SHIELD, 9000); - events.ScheduleEvent(EVENT_DRESSING_TALK, 12000); + me->SetWalk(false); + events.ScheduleEvent(EVENT_DRESSING_KNEEL, 500ms); + events.ScheduleEvent(EVENT_DRESSING_ARMOR, 3s); + events.ScheduleEvent(EVENT_DRESSING_STAND, 4s); + events.ScheduleEvent(EVENT_DRESSING_AXE, 7s); + events.ScheduleEvent(EVENT_DRESSING_SHIELD, 9s); + events.ScheduleEvent(EVENT_DRESSING_TALK, 12s); break; case 18: if (Creature* warden = me->SummonCreature(NPC_DURNHOLDE_WARDEN, 2149.4634f, 104.97559f, 73.632385f, 1.9065f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS)) @@ -362,8 +362,8 @@ public: Talk(SAY_SKARLOC_MEET); break; case 30: - events.ScheduleEvent(EVENT_ENTER_MOUNT, 3000); - events.ScheduleEvent(EVENT_TALK_START_RIDE, 7000); + events.ScheduleEvent(EVENT_ENTER_MOUNT, 3s); + events.ScheduleEvent(EVENT_TALK_START_RIDE, 7s); break; case 59: instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_TARREN_MILL); @@ -374,7 +374,7 @@ public: } UnMountSelf(); _mounted = false; - SetRun(false); + me->SetWalk(true); me->SetFacingTo(6.0388f); break; case 60: @@ -382,32 +382,32 @@ public: if (Creature* horse = me->FindNearestCreature(NPC_SKARLOC_MOUNT, 10.0f)) { horse->GetMotionMaster()->MovePoint(0, 2501.15f, 572.14f, 54.13f); - horse->DespawnOrUnsummon(30 * IN_MILLISECONDS); + horse->DespawnOrUnsummon(30s); } Talk(SAY_EMOTE_HORSE); SetEscortPaused(true); - SetRun(true); + me->SetWalk(false); me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); me->SetFacingTo(4.1364f); break; case 64: - SetRun(false); + me->SetWalk(true); break; case 67: - events.ScheduleEvent(EVENT_LOOK_1, 1200); - events.ScheduleEvent(EVENT_MOVE_AROUND, 3500); - events.ScheduleEvent(EVENT_LOOK_2, 5000); - events.ScheduleEvent(EVENT_SUMMON_GUARDS, 5100); - events.ScheduleEvent(EVENT_LOOK_3, 7000); - events.ScheduleEvent(EVENT_SUMMON_TALK1, 12000); - events.ScheduleEvent(EVENT_LOOK_4, 17000); - events.ScheduleEvent(EVENT_SUMMON_TALK2, 19000); - events.ScheduleEvent(EVENT_GUARDS_MOVING, 21000); + events.ScheduleEvent(EVENT_LOOK_1, 1200ms); + events.ScheduleEvent(EVENT_MOVE_AROUND, 3500ms); + events.ScheduleEvent(EVENT_LOOK_2, 5s); + events.ScheduleEvent(EVENT_SUMMON_GUARDS, 5100ms); + events.ScheduleEvent(EVENT_LOOK_3, 7s); + events.ScheduleEvent(EVENT_SUMMON_TALK1, 12s); + events.ScheduleEvent(EVENT_LOOK_4, 17s); + events.ScheduleEvent(EVENT_SUMMON_TALK2, 19s); + events.ScheduleEvent(EVENT_GUARDS_MOVING, 21s); break; case 82: - events.ScheduleEvent(EVENT_LOOK_5, 500); - events.ScheduleEvent(EVENT_SUMMON_GUARDS_2, 1000); - events.ScheduleEvent(EVENT_SUMMON_TALK3, 1500); + events.ScheduleEvent(EVENT_LOOK_5, 500ms); + events.ScheduleEvent(EVENT_SUMMON_GUARDS_2, 1s); + events.ScheduleEvent(EVENT_SUMMON_TALK3, 1500ms); break; case 91: me->SummonCreature(NPC_TM_PROTECTOR, 2652.71f, 660.31f, 61.93f, 1.67f, TEMPSUMMON_MANUAL_DESPAWN); @@ -418,26 +418,26 @@ public: summon->AI()->Talk(SAY_LOOKOUT_INN); break; case 92: - SetRun(false); + me->SetWalk(true); break; case 94: summons.DespawnAll(); SetEscortPaused(true); - SetRun(true); + me->SetWalk(false); instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_TARETHA_MEET); if (Creature* Taretha = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TARETHA_GUID))) { Taretha->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); Taretha->AI()->Talk(SAY_TARETHA_ESCAPED); } - events.ScheduleEvent(EVENT_THRALL_TALK, 4000); + events.ScheduleEvent(EVENT_THRALL_TALK, 4s); break; case 101: SetEscortPaused(true); - events.ScheduleEvent(EVENT_EPOCH_INTRO, 500); - events.ScheduleEvent(EVENT_SUMMON_INFINITES, 1500); - events.ScheduleEvent(EVENT_TRANSFORM, 8000); - events.ScheduleEvent(EVENT_START_WAVE_1, 25000); + events.ScheduleEvent(EVENT_EPOCH_INTRO, 500ms); + events.ScheduleEvent(EVENT_SUMMON_INFINITES, 1500ms); + events.ScheduleEvent(EVENT_TRANSFORM, 8s); + events.ScheduleEvent(EVENT_START_WAVE_1, 25s); break; case 103: instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_FINISHED); @@ -473,9 +473,9 @@ public: void JustEngagedWith(Unit*) override { combatEvents.Reset(); - combatEvents.ScheduleEvent(EVENT_CHECK_HEALTH, 500); - combatEvents.ScheduleEvent(EVENT_SPELL_SHIELD_BLOCK, 8000); - combatEvents.ScheduleEvent(EVENT_SPELL_STRIKE, 2000); + combatEvents.ScheduleEvent(EVENT_CHECK_HEALTH, 500ms); + combatEvents.ScheduleEvent(EVENT_SPELL_SHIELD_BLOCK, 8s); + combatEvents.ScheduleEvent(EVENT_SPELL_STRIKE, 2s); if (roll_chance_i(50)) Talk(SAY_RANDOM_AGGRO); @@ -566,7 +566,8 @@ public: me->SummonCreature(NPC_DURNHOLDE_MAGE, 2108.4856f, 189.93457f, 66.30494f, 2.6878f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS); break; case EVENT_START_WP: - Start(true, true); + me->SetWalk(false); + Start(true); SetDespawnAtEnd(false); break; case EVENT_SET_FACING: @@ -663,7 +664,7 @@ public: me->SetFacingTo(2.0071f); break; case EVENT_SUMMON_GUARDS: - SetRun(true); + me->SetWalk(false); me->SummonCreature(NPC_TM_PROTECTOR, 2501.5708f, 699.38086f, 55.64138f, 3.8571f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS); me->SummonCreature(NPC_TM_LOOKOUT, 2500.7002f, 698.26746f, 55.618248f, 3.7350f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS); if (Creature* guardsman = me->SummonCreature(NPC_TM_GUARDSMAN, 2500.0908f, 699.9389f, 55.629555f, 4.2935f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS)) @@ -766,7 +767,7 @@ public: summons.DoAction(ACTION_SET_IMMUNE_FLAG); break; case EVENT_START_WAVE_1: - events.ScheduleEvent(EVENT_CHECK_WAVE_1, 500); + events.ScheduleEvent(EVENT_CHECK_WAVE_1, 500ms); summons.DoAction(ACTION_REMOVE_IMMUNE_FLAG); summons.DoAction(ACTION_START_COMBAT); break; @@ -777,10 +778,10 @@ public: me->SummonCreature(NPC_INFINITE_SLAYER, 2599.57f, 677.0f, 55.975f, 0.05f, TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_INFINITE_DEFILER, 2592.57f, 680.0f, 55.975f, 0.05f, TEMPSUMMON_MANUAL_DESPAWN); summons.DoAction(ACTION_START_COMBAT); - events.ScheduleEvent(EVENT_CHECK_WAVE_2, 500); + events.ScheduleEvent(EVENT_CHECK_WAVE_2, 500ms); break; } - events.ScheduleEvent(EVENT_CHECK_WAVE_1, 500); + events.ScheduleEvent(EVENT_CHECK_WAVE_1, 500ms); break; case EVENT_CHECK_WAVE_2: if (summons.size() == 1) @@ -790,26 +791,26 @@ public: me->SummonCreature(NPC_INFINITE_SABOTEUR, 2638.62f, 705.43f, 55.965f, 4.46f, TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(NPC_INFINITE_DEFILER, 2642.62f, 705.43f, 55.965f, 4.46f, TEMPSUMMON_MANUAL_DESPAWN); summons.DoAction(ACTION_START_COMBAT); - events.ScheduleEvent(EVENT_CHECK_WAVE_3, 500); + events.ScheduleEvent(EVENT_CHECK_WAVE_3, 500ms); break; } - events.ScheduleEvent(EVENT_CHECK_WAVE_2, 500); + events.ScheduleEvent(EVENT_CHECK_WAVE_2, 500ms); break; case EVENT_CHECK_WAVE_3: if (summons.size() == 1) { me->SetHomePosition(2634.79f, 672.964f, 54.8577f, 1.33f); me->GetMotionMaster()->MoveTargetedHome(); - events.ScheduleEvent(EVENT_CALL_EPOCH, 8000); + events.ScheduleEvent(EVENT_CALL_EPOCH, 8s); break; } - events.ScheduleEvent(EVENT_CHECK_WAVE_3, 500); + events.ScheduleEvent(EVENT_CHECK_WAVE_3, 500ms); break; case EVENT_CALL_EPOCH: if (Creature* epoch = summons.GetCreatureWithEntry(NPC_EPOCH_HUNTER)) { epoch->SetImmuneToAll(false); - epoch->GetMotionMaster()->MovePoint(0, *me, false, true); + epoch->GetMotionMaster()->MovePoint(0, *me, FORCED_MOVEMENT_NONE, 0.f, false, true); } break; case EVENT_THRALL_FACE_TARETHA: @@ -905,15 +906,15 @@ public: Talk(SAY_RANDOM_LOW_HP); break; } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 500ms); break; case EVENT_SPELL_STRIKE: me->CastSpell(me->GetVictim(), SPELL_STRIKE, false); - events.ScheduleEvent(EVENT_SPELL_STRIKE, 6000); + events.ScheduleEvent(EVENT_SPELL_STRIKE, 6s); break; case EVENT_SPELL_SHIELD_BLOCK: me->CastSpell(me, SPELL_SHIELD_BLOCK, false); - events.ScheduleEvent(EVENT_SPELL_SHIELD_BLOCK, 6000); + events.ScheduleEvent(EVENT_SPELL_SHIELD_BLOCK, 6s); break; } @@ -922,7 +923,8 @@ public: void ReorderInstance(uint32 data) { - Start(true, true); + me->SetWalk(false); + Start(true); SetEscortPaused(true); SetDespawnAtEnd(false); @@ -1008,14 +1010,15 @@ public: { me->SetStandState(UNIT_STAND_STATE_STAND); me->RemoveAllAuras(); - Start(false, true); + me->SetWalk(false); + Start(false); } void WaypointReached(uint32 waypointId) override { if (waypointId == 7) { - SetRun(false); + me->SetWalk(true); Talk(SAY_TARETHA_FREE); me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); if (Creature* thrall = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THRALL_GUID))) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp index 21f51ca788..bde93d5144 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp @@ -143,7 +143,7 @@ public: case NPC_INFINITE_EXECUTIONER_2: case NPC_INFINITE_VANQUISHER: case NPC_INFINITE_VANQUISHER_2: - creature->DespawnOrUnsummon(1); + creature->DespawnOrUnsummon(1ms); break; default: break; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp index f80ed1b288..a513a41b74 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp @@ -109,7 +109,7 @@ struct npc_medivh_bm : public ScriptedAI { if (summon->GetEntry() == NPC_DP_CRYSTAL_STALKER) { - summon->DespawnOrUnsummon(25000); + summon->DespawnOrUnsummon(25s); summon->CastSpell(summon, RAND(SPELL_BANISH_PURPLE, SPELL_BANISH_GREEN), true); summon->GetMotionMaster()->MoveSplinePath(&_airArray); } @@ -118,7 +118,7 @@ struct npc_medivh_bm : public ScriptedAI summon->CastSpell(summon, SPELL_BLACK_CRYSTAL, true); Movement::MoveSplineInit init(summon); init.MovebyPath(_groundArray); - init.SetCyclic(); + init.SetCyclic(); // TODO: Add support for cyclic paths in motion master init.Launch(); } } @@ -137,13 +137,13 @@ struct npc_medivh_bm : public ScriptedAI me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false); - events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 500); - events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 500); - events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500); - events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 2000); - events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 4000); - events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 6000); - events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 8000); + events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 500ms); + events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 500ms); + events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500ms); + events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 2s); + events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 4s); + events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 6s); + events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 8s); } } @@ -154,7 +154,7 @@ struct npc_medivh_bm : public ScriptedAI if (param == ACTION_OUTRO) { events.Reset(); - events.ScheduleEvent(EVENT_OUTRO_1, 4000); + events.ScheduleEvent(EVENT_OUTRO_1, 4s); me->InterruptNonMeleeSpells(true); me->SummonGameObject(GO_DARK_PORTAL, -2086.0f, 7125.6215f, 30.5f, 6.148f, 0.0f, 0.0f, 0.0f, 0.0f, 0); @@ -180,43 +180,43 @@ struct npc_medivh_bm : public ScriptedAI Talk(eventId + 1); break; } - events.ScheduleEvent(eventId, 500); + events.ScheduleEvent(eventId, 500ms); break; case EVENT_SUMMON_CRYSTAL: me->SummonCreature(NPC_DP_EMITTER_STALKER, me->GetPositionX() + 8.0f, me->GetPositionY(), me->GetPositionZ()); break; case EVENT_SUMMON_FLYING_CRYSTAL: me->CastSpell(me, SPELL_PORTAL_CRYSTALS, true); - events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 1000); + events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 1s); break; case EVENT_OUTRO_1: me->SetFacingTo(6.21f); Talk(SAY_MEDIVH_WIN); - events.ScheduleEvent(EVENT_OUTRO_2, 17000); + events.ScheduleEvent(EVENT_OUTRO_2, 17s); break; case EVENT_OUTRO_2: me->SetFacingTo(3.07f); - events.ScheduleEvent(EVENT_OUTRO_3, 2000); + events.ScheduleEvent(EVENT_OUTRO_3, 2s); break; case EVENT_OUTRO_3: - SummonOrcs(-2046.158f, -3.0f, 37000, 30000, true); - events.ScheduleEvent(EVENT_OUTRO_4, 2000); + SummonOrcs(-2046.158f, -3.0f, 37s, 30s, true); + events.ScheduleEvent(EVENT_OUTRO_4, 2s); break; case EVENT_OUTRO_4: - SummonOrcs(-2055.97f, -2.0f, 33000, 28000, false); - events.ScheduleEvent(EVENT_OUTRO_5, 2000); + SummonOrcs(-2055.97f, -2.0f, 33s, 28s, false); + events.ScheduleEvent(EVENT_OUTRO_5, 2s); break; case EVENT_OUTRO_5: - SummonOrcs(-2064.0f, -1.5f, 29000, 26000, false); - events.ScheduleEvent(EVENT_OUTRO_6, 2000); + SummonOrcs(-2064.0f, -1.5f, 29s, 26s, false); + events.ScheduleEvent(EVENT_OUTRO_6, 2s); break; case EVENT_OUTRO_6: - SummonOrcs(-2074.35f, -0.1f, 26000, 24000, false); - events.ScheduleEvent(EVENT_OUTRO_7, 7000); + SummonOrcs(-2074.35f, -0.1f, 26s, 24s, false); + events.ScheduleEvent(EVENT_OUTRO_7, 7s); break; case EVENT_OUTRO_7: Talk(SAY_MEDIVH_ORCS_ENTER); - events.ScheduleEvent(EVENT_OUTRO_8, 7000); + events.ScheduleEvent(EVENT_OUTRO_8, 7s); break; case EVENT_OUTRO_8: if (Creature* cr = me->FindNearestCreature(NPC_SHADOW_COUNCIL_ENFORCER, 20.0f)) @@ -228,15 +228,15 @@ struct npc_medivh_bm : public ScriptedAI } } - void SummonOrcs(float x, float y, uint32 duration, uint32 homeTime, bool first) + void SummonOrcs(float x, float y, Milliseconds duration, Milliseconds homeTime, bool first) { for (uint8 i = 0; i < 6; ++i) { if (Creature* cr = me->SummonCreature(NPC_SHADOW_COUNCIL_ENFORCER, -2091.731f, 7133.083f - 3.0f * i, 34.589f, 0.0f)) { cr->GetMotionMaster()->MovePoint(0, (first && i == 3) ? x + 2.0f : x, cr->GetPositionY() + y, cr->GetMapHeight(x, cr->GetPositionY() + y, cr->GetPositionZ(), true)); - cr->m_Events.AddEvent(new NpcRunToHome(*cr), cr->m_Events.CalculateTime(homeTime + urand(0, 2000))); - cr->DespawnOrUnsummon(duration + urand(0, 2000)); + cr->m_Events.AddEventAtOffset(new NpcRunToHome(*cr), homeTime + randtime(0ms, 2s)); + cr->DespawnOrUnsummon(duration + randtime(0ms, 2s)); } } } @@ -355,7 +355,7 @@ struct npc_time_rift : public NullCreatureAI { if (creature->GetGUID() == _riftKeeperGUID) { - me->DespawnOrUnsummon(0); + me->DespawnOrUnsummon(0ms); } } @@ -368,7 +368,7 @@ struct npc_time_rift : public NullCreatureAI if (!_instance->GetCreature(DATA_AEONUS)) { DoSelectSummon(); - events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000); + events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15s); } break; case EVENT_SUMMON_BOSS: diff --git a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp index 398bc8764d..bd741c2486 100644 --- a/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp +++ b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp @@ -58,7 +58,7 @@ public: case NPC_HIGHBORNE_SUMMONER: if (_pylonsState == ALL_PYLONS_OFF) { - creature->DespawnOrUnsummon(5000); + creature->DespawnOrUnsummon(5s); } else { diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 3564bc8804..f51446e467 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -138,16 +138,16 @@ public: switch (ph) { case PHASE_GROUNDED: - events.ScheduleEvent(EVENT_SPELL_WINGBUFFET, urand(10000, 20000)); - events.ScheduleEvent(EVENT_SPELL_FLAMEBREATH, urand(10000, 20000)); - events.ScheduleEvent(EVENT_SPELL_TAILSWEEP, urand(15000, 20000)); - events.ScheduleEvent(EVENT_SPELL_CLEAVE, urand(2000, 5000)); + events.ScheduleEvent(EVENT_SPELL_WINGBUFFET, 10s, 20s); + events.ScheduleEvent(EVENT_SPELL_FLAMEBREATH, 10s, 20s); + events.ScheduleEvent(EVENT_SPELL_TAILSWEEP, 15s, 20s); + events.ScheduleEvent(EVENT_SPELL_CLEAVE, 2s, 5s); break; case PHASE_AIRPHASE: - events.ScheduleEvent(EVENT_START_PHASE_2, 0); + events.ScheduleEvent(EVENT_START_PHASE_2, 0ms); break; case PHASE_LANDED: - events.ScheduleEvent(EVENT_START_PHASE_3, 5000); + events.ScheduleEvent(EVENT_START_PHASE_3, 5s); break; } } @@ -237,7 +237,7 @@ public: me->SetFacingTo(OnyxiaMoveData[id].o); me->SetSpeed(MOVE_RUN, 1.6f, false); CurrentWP = id; - events.ScheduleEvent(EVENT_SPELL_FIREBALL_FIRST, 1000); + events.ScheduleEvent(EVENT_SPELL_FIREBALL_FIRST, 1s); } } else @@ -246,21 +246,21 @@ public: { case 10: me->SetFacingTo(OnyxiaMoveData[0].o); - events.ScheduleEvent(EVENT_LIFTOFF, 0); + events.ScheduleEvent(EVENT_LIFTOFF, 0ms); break; case 11: me->SetFacingTo(OnyxiaMoveData[1].o); - events.ScheduleEvent(EVENT_FLY_S_TO_N, 0); + events.ScheduleEvent(EVENT_FLY_S_TO_N, 0ms); break; case 12: me->SetFacingTo(OnyxiaMoveData[1].o); - events.ScheduleEvent(EVENT_LAND, 0); + events.ScheduleEvent(EVENT_LAND, 0ms); break; case 13: me->SetCanFly(false); me->SetDisableGravity(false); me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run, false); - events.ScheduleEvent(EVENT_PHASE_3_ATTACK, 0); + events.ScheduleEvent(EVENT_PHASE_3_ATTACK, 0ms); break; } } @@ -326,25 +326,25 @@ public: case EVENT_SPELL_WINGBUFFET: { DoCastAOE(SPELL_WINGBUFFET); - events.RepeatEvent(urand(15000, 30000)); + events.Repeat(15s, 30s); break; } case EVENT_SPELL_FLAMEBREATH: { DoCastAOE(SPELL_FLAMEBREATH); - events.RepeatEvent(urand(10000, 20000)); + events.Repeat(10s, 20s); break; } case EVENT_SPELL_TAILSWEEP: { DoCastAOE(SPELL_TAILSWEEP); - events.RepeatEvent(urand(15000, 20000)); + events.Repeat(15s, 20s); break; } case EVENT_SPELL_CLEAVE: { DoCastVictim(SPELL_CLEAVE); - events.RepeatEvent(urand(2000, 5000)); + events.Repeat(2s, 5s); break; } case EVENT_START_PHASE_2: @@ -369,7 +369,7 @@ public: me->GetMotionMaster()->MoveTakeoff(11, OnyxiaMoveData[1].x + 1.0f, OnyxiaMoveData[1].y, OnyxiaMoveData[1].z, 12.0f); bManyWhelpsAvailable = true; - events.RescheduleEvent(EVENT_END_MANY_WHELPS_TIME, 10000); + events.RescheduleEvent(EVENT_END_MANY_WHELPS_TIME, 10s); break; } case EVENT_END_MANY_WHELPS_TIME: @@ -381,20 +381,20 @@ public: me->GetMotionMaster()->MovePoint(5, OnyxiaMoveData[5].x, OnyxiaMoveData[5].y, OnyxiaMoveData[5].z); whelpSpam = true; - events.ScheduleEvent(EVENT_WHELP_SPAM, 90000); - events.ScheduleEvent(EVENT_SUMMON_LAIR_GUARD, 30000); + events.ScheduleEvent(EVENT_WHELP_SPAM, 90s); + events.ScheduleEvent(EVENT_SUMMON_LAIR_GUARD, 30s); break; } case EVENT_SUMMON_LAIR_GUARD: { me->CastSpell(-101.654f, -214.491f, -80.70f, SPELL_SUMMON_LAIR_GUARD, true); - events.RepeatEvent(30000); + events.Repeat(30s); break; } case EVENT_WHELP_SPAM: { whelpSpam = true; - events.RepeatEvent(90000); + events.Repeat(90s); break; } case EVENT_LAND: @@ -413,7 +413,7 @@ public: DoCast(v, SPELL_FIREBALL); } - events.ScheduleEvent(EVENT_SPELL_FIREBALL_SECOND, 4000); + events.ScheduleEvent(EVENT_SPELL_FIREBALL_SECOND, 4s); break; } case EVENT_SPELL_FIREBALL_SECOND: @@ -427,15 +427,15 @@ public: uint8 rand = urand(0, 99); if (rand < 33) { - events.ScheduleEvent(EVENT_PHASE_2_STEP_CW, 4000); + events.ScheduleEvent(EVENT_PHASE_2_STEP_CW, 4s); } else if (rand < 66) { - events.ScheduleEvent(EVENT_PHASE_2_STEP_ACW, 4000); + events.ScheduleEvent(EVENT_PHASE_2_STEP_ACW, 4s); } else { - events.ScheduleEvent(EVENT_PHASE_2_STEP_ACROSS, 4000); + events.ScheduleEvent(EVENT_PHASE_2_STEP_ACROSS, 4s); } break; } @@ -464,7 +464,7 @@ public: Talk(EMOTE_BREATH); me->SetFacingTo(OnyxiaMoveData[CurrentWP].o); DoCastAOE(OnyxiaMoveData[CurrentWP].spellId); - events.ScheduleEvent(EVENT_SPELL_BREATH, 8250); + events.ScheduleEvent(EVENT_SPELL_BREATH, 8250ms); break; } case EVENT_SPELL_BREATH: @@ -491,20 +491,20 @@ public: DoCastAOE(SPELL_BELLOWINGROAR); - events.ScheduleEvent(EVENT_ERUPTION, 0); - events.ScheduleEvent(EVENT_SPELL_WINGBUFFET, urand(10000, 20000)); - events.ScheduleEvent(EVENT_SPELL_FLAMEBREATH, urand(10000, 20000)); - events.ScheduleEvent(EVENT_SPELL_TAILSWEEP, urand(15000, 20000)); - events.ScheduleEvent(EVENT_SPELL_CLEAVE, urand(2000, 5000)); - events.ScheduleEvent(EVENT_SPELL_BELLOWINGROAR, 15000); - events.ScheduleEvent(EVENT_SUMMON_WHELP, 10000); + events.ScheduleEvent(EVENT_ERUPTION, 0ms); + events.ScheduleEvent(EVENT_SPELL_WINGBUFFET, 10s, 20s); + events.ScheduleEvent(EVENT_SPELL_FLAMEBREATH, 10s, 20s); + events.ScheduleEvent(EVENT_SPELL_TAILSWEEP, 15s, 20s); + events.ScheduleEvent(EVENT_SPELL_CLEAVE, 2s, 5s); + events.ScheduleEvent(EVENT_SPELL_BELLOWINGROAR, 15s); + events.ScheduleEvent(EVENT_SUMMON_WHELP, 10s); break; } case EVENT_SPELL_BELLOWINGROAR: { DoCastAOE(SPELL_BELLOWINGROAR); - events.RepeatEvent(22000); - events.ScheduleEvent(EVENT_ERUPTION, 0); + events.Repeat(22s); + events.ScheduleEvent(EVENT_ERUPTION, 0ms); break; } case EVENT_ERUPTION: @@ -521,7 +521,7 @@ public: float dist = rand_norm() * 4.0f; me->CastSpell(-33.18f + cos(angle) * dist, -258.80f + std::sin(angle) * dist, -89.0f, 17646, true); me->CastSpell(-32.535f + cos(angle) * dist, -170.190f + std::sin(angle) * dist, -89.0f, 17646, true); - events.RepeatEvent(30000); + events.Repeat(30s); break; } } @@ -555,8 +555,8 @@ public: void JustEngagedWith(Unit* /*who*/) override { events.Reset(); - events.ScheduleEvent(EVENT_OLG_SPELL_BLASTNOVA, 15000); - events.ScheduleEvent(EVENT_OLG_SPELL_IGNITEWEAPON, 10000); + events.ScheduleEvent(EVENT_OLG_SPELL_BLASTNOVA, 15s); + events.ScheduleEvent(EVENT_OLG_SPELL_IGNITEWEAPON, 10s); } void UpdateAI(uint32 diff) override @@ -577,17 +577,17 @@ public: { case EVENT_OLG_SPELL_BLASTNOVA: DoCastAOE(SPELL_OLG_BLASTNOVA); - events.RepeatEvent(15000); + events.Repeat(15s); break; case EVENT_OLG_SPELL_IGNITEWEAPON: if (me->HasUnitFlag(UNIT_FLAG_DISARMED)) { - events.RepeatEvent(5000); + events.Repeat(5s); } else { DoCastSelf(SPELL_OLG_IGNITEWEAPON); - events.RepeatEvent(urand(18000, 21000)); + events.Repeat(18s, 21s); } break; } diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index 2dfebf46b5..5506a4595b 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -51,7 +51,7 @@ enum Belnistrasz EVENT_FROST_NOVA = 6, PATH_ESCORT = 871710, - POINT_REACH_IDOL = 17, + POINT_REACH_IDOL = 18, QUEST_EXTINGUISHING_THE_IDOL = 3525, @@ -115,7 +115,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); } void sQuestAccept(Player* /*player*/, Quest const* quest) override @@ -126,7 +126,7 @@ public: Talk(SAY_QUEST_ACCEPTED); me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER); me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); - me->GetMotionMaster()->MovePath(PATH_ESCORT, false); + me->GetMotionMaster()->MoveWaypoint(PATH_ESCORT, false); } } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp index d36cf4718b..6d9e71f56d 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp @@ -70,7 +70,7 @@ enum Emotes enum Points { POINT_AIR = 0, - POINT_GROUND = 2, + POINT_GROUND = 3, POINT_PARALYZE = 2 }; @@ -92,7 +92,7 @@ struct boss_ayamiss : public BossAI me->SetReactState(REACT_PASSIVE); me->SetCanFly(false); me->SetDisableGravity(false); - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); DoResetThreatList(); scheduler.CancelGroup(GROUP_AIR); }); @@ -291,7 +291,7 @@ class spell_ayamiss_swarmer_teleport_trigger : public SpellScript uint32 pathId = data.pathId; caster->m_Events.AddEventAtOffset([caster, pathId]() { - caster->GetMotionMaster()->MovePath(pathId, false); + caster->GetMotionMaster()->MoveWaypoint(pathId, false); }, 1s); } @@ -361,7 +361,7 @@ public: void HandleScript(SpellEffIndex /*effIndex*/) { GetCaster()->ToCreature()->GetMotionMaster()->Clear(); - GetCaster()->ToCreature()->GetMotionMaster()->MovePath(_pathId, false); + GetCaster()->ToCreature()->GetMotionMaster()->MoveWaypoint(_pathId, false); } void Register() override diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp index fa7c560488..9c5669d50e 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp @@ -231,7 +231,7 @@ struct npc_buru_egg : public ScriptedAI } } - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); } void UpdateAI(uint32 /*diff*/) override { } diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp index 7b56c464d1..083b9895f3 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp @@ -154,7 +154,7 @@ struct boss_ossirian : public BossAI } } - void SetGUID(ObjectGuid guid, int32 action) override + void SetGUID(ObjectGuid const& guid, int32 action) override { if (action == ACTION_TRIGGER_WEAKNESS && guid != _firstCrystalGUID) { @@ -188,7 +188,7 @@ struct boss_ossirian : public BossAI { if (Creature* vortex = me->SummonCreature(NPC_SAND_VORTEX, pos)) { - vortex->GetMotionMaster()->MovePath(pathIds.front(), true); + vortex->GetMotionMaster()->MoveWaypoint(pathIds.front(), true); pathIds.reverse(); } } @@ -317,7 +317,7 @@ public: { go_ossirian_crystalAI(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { } - void SetGUID(ObjectGuid guid, int32 type) override + void SetGUID(ObjectGuid const& guid, int32 type) override { if (type == GUID_TRIGGER_PAIR) { diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp index 319bb5e2ac..fb921d71e4 100644 --- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp +++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp @@ -209,7 +209,7 @@ struct npc_general_andorov : public npc_escortAI _initialAttackTimer = 5 * IN_MILLISECONDS; _paused = false; - Start(false, true); + Start(false); me->SetImmuneToNPC(true); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index f7ec9c8380..241a049397 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -204,7 +204,7 @@ public: if (me->GetEntry() == NPC_VEM) { - me->GetMotionMaster()->MovePath(VEM_WAYPOINT_PATH, true); + me->GetMotionMaster()->MoveWaypoint(VEM_WAYPOINT_PATH, true); } } @@ -310,7 +310,7 @@ public: me->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE); DoFinalSpell(); Talk(EMOTE_DEVOURED); - me->DespawnOrUnsummon(3000); + me->DespawnOrUnsummon(3s); return; } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp index 43d7411743..40019ccc03 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp @@ -170,7 +170,7 @@ struct boss_ouro : public BossAI } } - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } void CastGroundRupture() @@ -273,7 +273,7 @@ struct boss_ouro : public BossAI if (me->GetThreatMgr().GetThreatList().empty()) { DoCastSelf(SPELL_OURO_SUBMERGE_VISUAL); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); instance->SetBossState(DATA_OURO, FAIL); if (GameObject* base = me->FindNearestGameObject(GO_SANDWORM_BASE, 200.f)) base->DespawnOrUnsummon(); @@ -334,7 +334,7 @@ struct npc_dirt_mound : ScriptedAI scheduler.Schedule(30s, [this](TaskContext /*context*/) { DoCastSelf(SPELL_SUMMON_SCARABS, true); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); }) .Schedule(100ms, [this](TaskContext context) { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index eab24db58e..cdad23d67c 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -418,7 +418,7 @@ public: if (Creature* mastersEye = instance->GetCreature(DATA_MASTERS_EYE)) { mastersEye->AI()->Talk(EMOTE_MASTERS_EYE_AT, player); - mastersEye->DespawnOrUnsummon(11000); + mastersEye->DespawnOrUnsummon(11s); mastersEye->m_Events.AddEventAtOffset([mastersEye, player]() { mastersEye->SetFacingToObject(player); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index a254356892..6f642d152c 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -175,7 +175,7 @@ struct boss_viscidus : public BossAI { DoCastSelf(SPELL_EXPLODE_TRIGGER, true); }) - .Schedule(3000ms, [this](TaskContext /*context*/) + .Schedule(3s, [this](TaskContext /*context*/) { DoCastSelf(SPELL_INVIS_SELF, true); me->SetAuraStack(SPELL_VISCIDUS_SHRINKS, me, 20); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp index 2cc53521d4..ca26d56cc8 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp @@ -393,10 +393,10 @@ struct npc_obsidian_nullifier : public ScriptedAI context.Repeat(6s); }) - .Schedule(6000ms, 8400ms, [this](TaskContext context) + .Schedule(6s, 8400ms, [this](TaskContext context) { DoCastVictim(SPELL_CLEAVE, true); - context.Repeat(6000ms, 8400ms); + context.Repeat(6s, 8400ms); }); } @@ -447,7 +447,7 @@ struct npc_ahnqiraji_critter : public ScriptedAI } } - context.Repeat(3500ms, 4000ms); + context.Repeat(3500ms, 4s); }); } @@ -474,7 +474,7 @@ struct npc_ahnqiraji_critter : public ScriptedAI { if (me->GetEntry() == NPC_QIRAJI_SCORPION) { - me->DespawnOrUnsummon(5 * IN_MILLISECONDS); + me->DespawnOrUnsummon(5s); } } diff --git a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp index 397e7b611e..0ec6a82de6 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp @@ -437,7 +437,7 @@ public: { if (Creature* add = instance->GetCreature(*addsAtBase.begin())) { - add->GetMotionMaster()->MovePath(PATH_ADDS, false); + add->GetMotionMaster()->MoveWaypoint(PATH_ADDS, false); movedadds.push_back(add->GetGUID()); } diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index bd6543ffbe..f24a4592bd 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -176,25 +176,25 @@ public: if (Creature* weegli = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_WEEGLI))) { weegli->CastSpell(weegli, SPELL_BLYS_BAND_ESCAPE); - weegli->DespawnOrUnsummon(10000); + weegli->DespawnOrUnsummon(10s); } if (Creature* raven = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_RAVEN))) { raven->CastSpell(raven, SPELL_BLYS_BAND_ESCAPE); - raven->DespawnOrUnsummon(10000); + raven->DespawnOrUnsummon(10s); } if (Creature* oro = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_ORO))) { oro->CastSpell(oro, SPELL_BLYS_BAND_ESCAPE); - oro->DespawnOrUnsummon(10000); + oro->DespawnOrUnsummon(10s); } if (Creature* murta = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_MURTA))) { murta->CastSpell(murta, SPELL_BLYS_BAND_ESCAPE); - murta->DespawnOrUnsummon(10000); + murta->DespawnOrUnsummon(10s); } DoCastSelf(SPELL_BLYS_BAND_ESCAPE); - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); Porthome_Timer = 156000; //set timer back so that the event doesn't keep triggering } else @@ -436,7 +436,7 @@ public: case 1: me->GetMotionMaster()->MovePoint(2, 1871.18f, 1100.f, 8.88f); Talk(SAY_WEEGLI_OUT_OF_HERE); - me->DespawnOrUnsummon(8000); + me->DespawnOrUnsummon(8s); instance->SetData(DATA_PYRAMID, PYRAMID_GATES_DESTROYED); destroyingDoor = false; break; diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp index 1e80e0982f..8186c7f364 100644 --- a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp +++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp @@ -74,7 +74,6 @@ void AddSC_instance_wailing_caverns(); //Wailing caverns void AddSC_zulfarrak(); void AddSC_instance_zulfarrak(); //Zul'Farrak instance script void AddSC_ashenvale(); -void AddSC_azshara(); void AddSC_azuremyst_isle(); void AddSC_bloodmyst_isle(); void AddSC_boss_azuregos(); @@ -157,7 +156,6 @@ void AddKalimdorScripts() AddSC_zulfarrak(); AddSC_instance_zulfarrak(); //Zul'Farrak instance script AddSC_ashenvale(); - AddSC_azshara(); AddSC_azuremyst_isle(); AddSC_bloodmyst_isle(); AddSC_boss_azuregos(); diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index e7131c5fd8..d11c837787 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -121,7 +121,8 @@ public: { Talk(SAY_MUG_START1); me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - npc_escortAI::Start(true, false, player->GetGUID()); + me->SetWalk(true); + Start(true, player->GetGUID()); } } diff --git a/src/server/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp deleted file mode 100644 index 1a10cec1db..0000000000 --- a/src/server/scripts/Kalimdor/zone_azshara.cpp +++ /dev/null @@ -1,361 +0,0 @@ -/* - * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by the - * Free Software Foundation; either version 3 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 Affero 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 "CreatureScript.h" -#include "Player.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" - -/*#### -# npc_rizzle_sprysprocket -####*/ - -enum RizzleSprysprocketData -{ - QUEST_CHASING_THE_MOONSTONE = 10994, - - NPC_DEPTH_CHARGE = 23025, - - SPELL_RIZZLE_BLACKJACK = 39865, - SPELL_RIZZLE_ESCAPE = 39871, - SPELL_RIZZLE_FROST_GRENADE = 40525, - SPELL_DEPTH_CHARGE_TRAP = 38576, - SPELL_PERIODIC_DEPTH_CHARGE = 39912, - SPELL_GIVE_SOUTHFURY_MOONSTONE = 39886, - - SAY_RIZZLE_START = 0, - SAY_RIZZLE_GRENADE = 1, - SAY_RIZZLE_FINAL = 2, - MSG_ESCAPE_NOTICE = 3, - GOSSIP_GET_MOONSTONE = 21893 - -}; - -Position const WPs[58] = -{ - {3691.97f, -3962.41f, 35.9118f, 3.67f}, - {3675.02f, -3960.49f, 35.9118f, 3.67f}, - {3653.19f, -3958.33f, 33.9118f, 3.59f}, - {3621.12f, -3958.51f, 29.9118f, 3.48f}, - {3604.86f, -3963, 29.9118f, 3.48f}, - {3569.94f, -3970.25f, 29.9118f, 3.44f}, - {3541.03f, -3975.64f, 29.9118f, 3.41f}, - {3510.84f, -3978.71f, 29.9118f, 3.41f}, - {3472.7f, -3997.07f, 29.9118f, 3.35f}, - {3439.15f, -4014.55f, 29.9118f, 3.29f}, - {3412.8f, -4025.87f, 29.9118f, 3.25f}, - {3384.95f, -4038.04f, 29.9118f, 3.24f}, - {3346.77f, -4052.93f, 29.9118f, 3.22f}, - {3299.56f, -4071.59f, 29.9118f, 3.20f}, - {3261.22f, -4080.38f, 30.9118f, 3.19f}, - {3220.68f, -4083.09f, 31.9118f, 3.18f}, - {3187.11f, -4070.45f, 33.9118f, 3.16f}, - {3162.78f, -4062.75f, 33.9118f, 3.15f}, - {3136.09f, -4050.32f, 33.9118f, 3.07f}, - {3119.47f, -4044.51f, 36.0363f, 3.07f}, - {3098.95f, -4019.8f, 33.9118f, 3.07f}, - {3073.07f, -4011.42f, 33.9118f, 3.07f}, - {3051.71f, -3993.37f, 33.9118f, 3.02f}, - {3027.52f, -3978.6f, 33.9118f, 3.00f}, - {3003.78f, -3960.14f, 33.9118f, 2.98f}, - {2977.99f, -3941.98f, 31.9118f, 2.96f}, - {2964.57f, -3932.07f, 30.9118f, 2.96f}, - {2947.9f, -3921.31f, 29.9118f, 2.96f}, - {2924.91f, -3910.8f, 29.9118f, 2.94f}, - {2903.04f, -3896.42f, 29.9118f, 2.93f}, - {2884.75f, -3874.03f, 29.9118f, 2.90f}, - {2868.19f, -3851.48f, 29.9118f, 2.82f}, - {2854.62f, -3819.72f, 29.9118f, 2.80f}, - {2825.53f, -3790.4f, 29.9118f, 2.744f}, - {2804.31f, -3773.05f, 29.9118f, 2.71f}, - {2769.78f, -3763.57f, 29.9118f, 2.70f}, - {2727.23f, -3745.92f, 30.9118f, 2.69f}, - {2680.12f, -3737.49f, 30.9118f, 2.67f}, - {2647.62f, -3739.94f, 30.9118f, 2.66f}, - {2616.6f, -3745.75f, 30.9118f, 2.64f}, - {2589.38f, -3731.97f, 30.9118f, 2.61f}, - {2562.94f, -3722.35f, 31.9118f, 2.56f}, - {2521.05f, -3716.6f, 31.9118f, 2.55f}, - {2485.26f, -3706.67f, 31.9118f, 2.51f}, - {2458.93f, -3696.67f, 31.9118f, 2.51f}, - {2432, -3692.03f, 31.9118f, 2.46f}, - {2399.59f, -3681.97f, 31.9118f, 2.45f}, - {2357.75f, -3666.6f, 31.9118f, 2.44f}, - {2311.99f, -3656.88f, 31.9118f, 2.94f}, - {2263.41f, -3649.55f, 31.9118f, 3.02f}, - {2209.05f, -3641.76f, 31.9118f, 2.99f}, - {2164.83f, -3637.64f, 31.9118f, 3.15f}, - {2122.42f, -3639, 31.9118f, 3.21f}, - {2075.73f, -3643.59f, 31.9118f, 3.22f}, - {2033.59f, -3649.52f, 31.9118f, 3.42f}, - {1985.22f, -3662.99f, 31.9118f, 3.42f}, - {1927.09f, -3679.56f, 33.9118f, 3.42f}, - {1873.57f, -3695.32f, 33.9118f, 3.44f} -}; - -class npc_rizzle_sprysprocket : public CreatureScript -{ -public: - npc_rizzle_sprysprocket() : CreatureScript("npc_rizzle_sprysprocket") { } - - struct npc_rizzle_sprysprocketAI : public ScriptedAI - { - npc_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - SpellEscapeTimer = 1300; - TeleportTimer = 3500; - CheckTimer = 10000; - GrenadeTimer = 30000; - MustDieTimer = 3000; - CurrWP = 0; - - PlayerGUID.Clear(); - - MustDie = false; - Escape = false; - ContinueWP = false; - Reached = false; - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void AttackStart(Unit* who) override - { - if (!who || PlayerGUID) - return; - - Player* player = who->ToPlayer(); - - if (player && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) - { - PlayerGUID = who->GetGUID(); - Talk(SAY_RIZZLE_START); - DoCast(who, SPELL_RIZZLE_BLACKJACK, false); - return; - } - } - - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) override - { - CloseGossipMenuFor(player); - me->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); - MustDieTimer = 3000; - MustDie = true; - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type != POINT_MOTION_TYPE) - return; - - if (id == 57) - { - me->DespawnOrUnsummon(); - return; - } - - ++CurrWP; - ContinueWP = true; - } - - void UpdateAI(uint32 diff) override - { - if (MustDie) - { - if (MustDieTimer <= diff) - { - me->DespawnOrUnsummon(); - return; - } - else MustDieTimer -= diff; - } - - if (!Escape) - { - if (!PlayerGUID) - return; - - if (SpellEscapeTimer <= diff) - { - DoCast(me, SPELL_RIZZLE_ESCAPE, false); - SpellEscapeTimer = 10000; - } - else SpellEscapeTimer -= diff; - - if (TeleportTimer <= diff) - { - // temp solution - unit can't be teleported by core using spelleffect 5, only players - me->NearTeleportTo(3706.39f, -3969.15f, 35.9118f, me->GetOrientation()); - - //begin swimming and summon depth charges - Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); - if (!player) - return; - - Talk(MSG_ESCAPE_NOTICE, player); - DoCast(me, SPELL_PERIODIC_DEPTH_CHARGE); - me->SetHover(true); - me->SetSwim(true); - me->SetSpeed(MOVE_RUN, 0.85f, true); - me->GetMotionMaster()->MovementExpired(); - me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); - Escape = true; - } - else TeleportTimer -= diff; - - return; - } - - if (ContinueWP) - { - me->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP]); - ContinueWP = false; - } - - if (GrenadeTimer <= diff) - { - if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID)) - { - Talk(SAY_RIZZLE_GRENADE, player); - DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); - } - GrenadeTimer = 30000; - } - else GrenadeTimer -= diff; - - if (CheckTimer <= diff) - { - Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID); - if (!player) - { - me->DespawnOrUnsummon(); - return; - } - - if (me->IsWithinDist(player, 10) && me->GetPositionX() > player->GetPositionX() && !Reached) - { - Talk(SAY_RIZZLE_FINAL); - me->ReplaceAllNpcFlags(NPCFlags(1)); - me->SetFaction(FACTION_FRIENDLY); - me->GetMotionMaster()->MoveIdle(); - me->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE); - Reached = true; - } - - CheckTimer = 1000; - } - else CheckTimer -= diff; - } - - private: - ObjectGuid PlayerGUID; - uint32 SpellEscapeTimer; - uint32 TeleportTimer; - uint32 CheckTimer; - uint32 GrenadeTimer; - uint32 MustDieTimer; - uint32 CurrWP; - bool MustDie; - bool Escape; - bool ContinueWP; - bool Reached; - }; - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) != QUEST_STATUS_INCOMPLETE) - return true; - - AddGossipItemFor(player, GOSSIP_GET_MOONSTONE, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 10811, creature->GetGUID()); - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_rizzle_sprysprocketAI(creature); - } -}; - -/*#### -# npc_depth_charge -####*/ -class npc_depth_charge : public CreatureScript -{ -public: - npc_depth_charge() : CreatureScript("npc_depth_charge") { } - - struct npc_depth_chargeAI : public ScriptedAI - { - npc_depth_chargeAI(Creature* creature) : ScriptedAI(creature) { } - - bool WeMustDie; - uint32 WeMustDieTimer; - - void Reset() override - { - me->SetHover(true); - me->SetSwim(true); - me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - WeMustDie = false; - WeMustDieTimer = 1000; - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void AttackStart(Unit* /*who*/) override { } - - void MoveInLineOfSight(Unit* who) override - { - if (!who) - return; - - if (who->IsPlayer() && me->IsWithinDistInMap(who, 5)) - { - DoCast(who, SPELL_DEPTH_CHARGE_TRAP); - WeMustDie = true; - return; - } - } - - void UpdateAI(uint32 diff) override - { - if (WeMustDie) - { - if (WeMustDieTimer <= diff) - me->DespawnOrUnsummon(); - else - WeMustDieTimer -= diff; - } - return; - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_depth_chargeAI(creature); - } -}; - -void AddSC_azshara() -{ - new npc_rizzle_sprysprocket(); - new npc_depth_charge(); -} diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 7069cd3815..41c22086eb 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -258,7 +258,7 @@ public: case 28: player->GroupEventHappens(QUEST_A_CRY_FOR_HELP, me); _events.ScheduleEvent(EVENT_TALK_END, 2s); - SetRun(true); + me->SetWalk(false); break; case 29: if (Creature* cowlen = me->FindNearestCreature(NPC_COWLEN, 50.0f, true)) @@ -289,7 +289,8 @@ public: case EVENT_START_ESCORT: if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) { - npc_escortAI::Start(true, false, player->GetGUID()); + me->SetWalk(true); + Start(true, player->GetGUID()); } _events.ScheduleEvent(EVENT_STAND, 2s); break; diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp index 359a18c575..01761599ec 100644 --- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp @@ -24,7 +24,7 @@ ######*/ //possible creatures to be spawned -uint32 const possibleSpawns[32] = {17322, 17661, 17496, 17522, 17340, 17352, 17333, 17524, 17654, 17348, 17339, 17345, 17359, 17353, 17336, 17550, 17330, 17701, 17321, 17325, 17320, 17683, 17342, 17715, 17334, 17341, 17338, 17337, 17346, 17344, 17327}; +uint32 const possibleSpawns[32] = {17322, 17661, 17496, 17522, 17340, 17352, 17333, 17524, 17654, 17348, 17339, 17345, 17353, 17336, 17550, 17330, 17701, 17321, 17325, 17320, 17683, 17342, 17715, 17334, 17341, 17338, 17337, 17346, 17344, 17327}; enum WebbedCreature { diff --git a/src/server/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp index c3a76fc638..a9e76721e2 100644 --- a/src/server/scripts/Kalimdor/zone_darkshore.cpp +++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp @@ -397,7 +397,10 @@ public: if (quest->GetQuestId() == QUEST_ABSENT_MINDED_PT2) { if (npc_escortAI* pEscortAI = CAST_AI(npc_prospector_remtravel::npc_prospector_remtravelAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID()); + { + creature->SetWalk(true); + pEscortAI->Start(false, player->GetGUID()); + } creature->SetFaction(FACTION_ESCORTEE_A_NEUTRAL_PASSIVE); } @@ -463,7 +466,7 @@ public: _events.Reset(); _events.ScheduleEvent(EVENT_CHECK_FOLLOWING, 1s); player->KilledMonsterCredit(NPC_CAPTURED_RABID_THISTLE_BEAR); - me->DespawnOrUnsummon(240000); + me->DespawnOrUnsummon(240s); } } } @@ -552,7 +555,7 @@ public: } } - void SetGUID(ObjectGuid /*guid*/, int32 type) override + void SetGUID(ObjectGuid const& /*guid*/, int32 type) override { if (type == GUID_SCRIPT_INVOKER && _scriptRunning == false) { diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 396ee22955..3b65c2aa14 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -42,9 +42,6 @@ enum Caravan MAX_CARAVAN_SUMMONS = 3, - TIME_SHOP_STOP = 10 * MINUTE * IN_MILLISECONDS, - TIME_HIRE_STOP = 4 * MINUTE * IN_MILLISECONDS, - // Ambush NPC_KOLKAR_WAYLAYER = 12976, NPC_KOLKAR_AMBUSHER = 12977, @@ -53,6 +50,9 @@ enum Caravan NPC_NETHER = 4684, }; +constexpr Milliseconds TIME_SHOP_STOP = 600s; +constexpr Milliseconds TIME_HIRE_STOP = 240s; + class npc_cork_gizelton : public CreatureScript { public: @@ -129,7 +129,7 @@ public: ImmuneFlagSet(false, _faction); } - void SetGUID(ObjectGuid playerGUID, int32 faction) override + void SetGUID(ObjectGuid const& playerGUID, int32 faction) override { _playerGUID = playerGUID; _faction = faction; @@ -264,14 +264,14 @@ public: { // Finished north path case 52: - me->SummonCreature(NPC_VENDOR_TRON, -694.61f, 1460.7f, 90.794f, 2.4f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP + 15 * IN_MILLISECONDS); + me->SummonCreature(NPC_VENDOR_TRON, -694.61f, 1460.7f, 90.794f, 2.4f, TEMPSUMMON_TIMED_DESPAWN, 600000 + 15 * IN_MILLISECONDS); SetEscortPaused(true); events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP); CheckCaravan(); break; // Finished south path case 193: - me->SummonCreature(NPC_SUPER_SELLER, -1905.5f, 2463.3f, 61.52f, 5.87f, TEMPSUMMON_TIMED_DESPAWN, TIME_SHOP_STOP + 15 * IN_MILLISECONDS); + me->SummonCreature(NPC_SUPER_SELLER, -1905.5f, 2463.3f, 61.52f, 5.87f, TEMPSUMMON_TIMED_DESPAWN, 600000 + 15 * IN_MILLISECONDS); SetEscortPaused(true); events.ScheduleEvent(EVENT_RESUME_PATH, TIME_SHOP_STOP); CheckCaravan(); @@ -396,7 +396,7 @@ public: case EVENT_RESTART_ESCORT: CheckCaravan(); SetDespawnAtEnd(false); - Start(true, true, ObjectGuid::Empty, 0, false, false, true); + Start(true, ObjectGuid::Empty, 0, false, false, true); break; } @@ -474,7 +474,7 @@ public: else if (spell->Id == SPELL_KODO_KOMBO_GOSSIP) { me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); - me->DespawnOrUnsummon(60000); + me->DespawnOrUnsummon(60s); } } }; diff --git a/src/server/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp index 2bf7903188..a91261929b 100644 --- a/src/server/scripts/Kalimdor/zone_moonglade.cpp +++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp @@ -384,7 +384,8 @@ public: AddWaypoint(i, Clintar_spirit_WP[i][0], Clintar_spirit_WP[i][1], Clintar_spirit_WP[i][2], (uint32)Clintar_spirit_WP[i][4]); } PlayerGUID = player->GetGUID(); - Start(true, false, PlayerGUID); + me->SetWalk(true); + Start(true, PlayerGUID); } return; } diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 9a06054bbc..7bfd005ebd 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -1145,7 +1145,7 @@ public: } } - me->DespawnOrUnsummon(5000ms, respawnTimer); // Despawn in 5 Seconds for respawnTimer value + me->DespawnOrUnsummon(5s, respawnTimer); // Despawn in 5 Seconds for respawnTimer value me->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); CloseGossipMenuFor(player); return false; @@ -1174,7 +1174,7 @@ public: summons->SetLootRecipient(player); summons->CastSpell(summons, SPELL_SPAWN_IN, false); summons->AI()->Talk(SAY_ON_SPAWN_IN, player); - summons->m_Events.AddEvent(new DelayedWindstoneSummonEvent(summons, player->GetGUID()), summons->m_Events.CalculateTime(5200)); + summons->m_Events.AddEventAtOffset(new DelayedWindstoneSummonEvent(summons, player->GetGUID()), 5200ms); _creatureGuid = summons->GetGUID(); } } diff --git a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp index 6f8323126f..238c12efef 100644 --- a/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp +++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp @@ -137,7 +137,10 @@ public: if (quest->GetQuestId() == QUEST_PROTECT_KAYA) { if (npc_escortAI* pEscortAI = CAST_AI(npc_kaya_flathoof::npc_kaya_flathoofAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + { + creature->SetWalk(true); + pEscortAI->Start(true, player->GetGUID()); + } creature->AI()->Talk(SAY_START); creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index 88c7eb7e4d..ec4912fb63 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -260,7 +260,8 @@ public: float Radius = 10.0f; if (me->IsWithinDistInMap(who, Radius)) { - Start(false, false, who->GetGUID()); + me->SetWalk(true); + Start(false, who->GetGUID()); } } } diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index 2624709fc6..9ace889ba5 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -55,7 +55,10 @@ public: creature->AI()->Talk(SAY_GIL_START, player); if (npc_giltharesAI* pEscortAI = CAST_AI(npc_gilthares::npc_giltharesAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); + { + creature->SetWalk(true); + pEscortAI->Start(false, player->GetGUID(), quest); + } } return true; } @@ -300,11 +303,11 @@ public: for (uint8 i = 0; i < 6; ++i) // unsummon challengers if (AffrayChallenger[i]) if (Creature* creature = ObjectAccessor::GetCreature((*me), AffrayChallenger[i])) - creature->DespawnOrUnsummon(1); + creature->DespawnOrUnsummon(1ms); if (BigWill) // unsummon bigWill if (Creature* creature = ObjectAccessor::GetCreature((*me), BigWill)) - creature->DespawnOrUnsummon(1); + creature->DespawnOrUnsummon(1ms); } void MoveInLineOfSight(Unit* who) override @@ -499,7 +502,7 @@ public: Talk(SAY_STARTUP1); break; case 9: - SetRun(false); + me->SetWalk(true); break; case 17: if (Creature* temp = me->SummonCreature(NPC_MERCENARY, 1128.489f, -3037.611f, 92.701f, 1.472f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000)) @@ -528,7 +531,7 @@ public: break; case 18: Talk(SAY_PROGRESS_1, player); - SetRun(); + me->SetWalk(false); break; } } @@ -594,7 +597,10 @@ public: creature->SetFaction(FACTION_RATCHET); creature->AI()->Talk(SAY_START); if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + { + creature->SetWalk(true); + pEscortAI->Start(true, player->GetGUID()); + } } return true; } diff --git a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp index 2a80cd90ee..ee2efa9b60 100644 --- a/src/server/scripts/Kalimdor/zone_thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp @@ -66,7 +66,10 @@ public: creature->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_ACTIVE); //guessed if (npc_lakota_windsongAI* pEscortAI = CAST_AI(npc_lakota_windsong::npc_lakota_windsongAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); + { + creature->SetWalk(true); + pEscortAI->Start(false, player->GetGUID(), quest); + } } return true; } @@ -148,7 +151,10 @@ public: creature->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_ACTIVE); // guessed if (npc_paoka_swiftmountainAI* pEscortAI = CAST_AI(npc_paoka_swiftmountain::npc_paoka_swiftmountainAI, creature->AI())) - pEscortAI->Start(false, false, player->GetGUID(), quest); + { + creature->SetWalk(true); + pEscortAI->Start(false, player->GetGUID(), quest); + } } return true; } diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp index 131baf8686..83484446aa 100644 --- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp @@ -48,7 +48,8 @@ public: { if (quest->GetQuestId() == QUEST_CHASING_AME) { - CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); + creature->SetWalk(true); + CAST_AI(npc_escortAI, (creature->AI()))->Start(false, player->GetGUID()); creature->AI()->Talk(SAY_READY, player); creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); // Change faction so mobs attack diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp index d1e516fe08..26d9d5737a 100644 --- a/src/server/scripts/Kalimdor/zone_winterspring.cpp +++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp @@ -286,7 +286,10 @@ public: creature->SetFaction(FACTION_ESCORT_A_NEUTRAL_PASSIVE); if (npc_ranshallaAI* escortAI = dynamic_cast<npc_ranshallaAI*>(creature->AI())) - escortAI->Start(false, false, player->GetGUID(), quest); + { + creature->SetWalk(true); + escortAI->Start(false, player->GetGUID(), quest); + } return true; } @@ -486,7 +489,7 @@ public: if (Creature* guard = me->GetMap()->GetCreature(_guardEluneGUID)) { guard->GetMotionMaster()->MovePoint(0, wingThicketLocations[2].m_positionX, wingThicketLocations[2].m_positionY, wingThicketLocations[2].m_positionZ); - guard->DespawnOrUnsummon(4000); + guard->DespawnOrUnsummon(4s); } break; case SAY_PRIESTESS_ALTAR_20: @@ -494,7 +497,7 @@ public: if (Creature* priestess = me->GetMap()->GetCreature(_firstPriestessGUID)) { priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[0].m_positionX, wingThicketLocations[0].m_positionY, wingThicketLocations[0].m_positionZ); - priestess->DespawnOrUnsummon(4000); + priestess->DespawnOrUnsummon(4s); } break; case SAY_PRIESTESS_ALTAR_21: @@ -502,7 +505,7 @@ public: if (Creature* priestess = me->GetMap()->GetCreature(_secondPriestessGUID)) { priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[1].m_positionX, wingThicketLocations[1].m_positionY, wingThicketLocations[1].m_positionZ); - priestess->DespawnOrUnsummon(4000); + priestess->DespawnOrUnsummon(4s); } break; case DATA_EVENT_END: @@ -526,7 +529,7 @@ public: player->GroupEventHappens(QUEST_GUARDIANS_ALTAR, me); Talk(SAY_RANSHALLA_END_2, player); } - me->DespawnOrUnsummon(4000); + me->DespawnOrUnsummon(4s); break; } } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index 39f15f6ab6..90222743e4 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -28,7 +28,7 @@ enum ANData { DATA_KRIKTHIR = 0, DATA_HADRONOX = 1, - DATA_ANUBARAK_EVENT = 2, + DATA_ANUBARAK = 2, MAX_ENCOUNTERS = 3 }; @@ -41,6 +41,8 @@ enum ANIds NPC_SKITTERING_INFECTIOR = 28736, NPC_KRIKTHIR_THE_GATEWATCHER = 28684, NPC_HADRONOX = 28921, + NPC_ANUBARAK = 29120, + NPC_ANUB_AR_CHAMPION = 29062, NPC_ANUB_AR_NECROMANCER = 29063, NPC_ANUB_AR_CRYPTFIEND = 29064, @@ -59,4 +61,6 @@ inline AI* GetAzjolNerubAI(T* obj) return GetInstanceAI<AI>(obj, AzjolNerubScriptName); } +#define RegisterAzjolNerubCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAzjolNerubAI) + #endif diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index 3cdb5967fd..ec4dd204c5 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -55,223 +55,347 @@ enum Yells enum Misc { ACHIEV_TIMED_START_EVENT = 20381, +}; - EVENT_CARRION_BEETELS = 1, +enum Events +{ + EVENT_CARRION_BEETLES = 1, EVENT_LEECHING_SWARM = 2, EVENT_IMPALE = 3, EVENT_POUND = 4, - EVENT_CLOSE_DOORS = 5, - EVENT_EMERGE = 6, - EVENT_SUMMON_VENOMANCER = 7, - EVENT_SUMMON_DARTER = 8, - EVENT_SUMMON_GUARDIAN = 9, - EVENT_SUMMON_ASSASSINS = 10, - EVENT_ENABLE_ROTATE = 11, + EVENT_ENABLE_ROTATE = 5, + EVENT_CLOSE_DOORS = 6, + EVENT_EMERGE = 7, + EVENT_SUMMON_GUARDIAN = 8, + EVENT_SUMMON_VENOMANCER = 9, + EVENT_SUMMON_DARTER = 10, + EVENT_SUMMON_ASSASSINS = 11, EVENT_KILL_TALK = 12 }; -enum ANAnubarakNpcs +enum CreatureIds { + NPC_WORLD_TRIGGER = 22515, NPC_ANUBAR_GUARDIAN = 29216, - NPC_ANUBAR_VENOMANCER = 29217 + NPC_ANUBAR_VENOMANCER = 29217, +}; + +enum Phases : uint8 +{ + PHASE_EMERGED = 1, + PHASE_SUBMERGED +}; + +enum SubPhase : uint8 +{ + SUBMERGE_NONE = 0, + SUBMERGE_75 = 1, + SUBMERGE_50 = 2, + SUBMERGE_25 = 3, +}; + +enum SummonGroups +{ + SUMMON_GROUP_WORLD_TRIGGER_GUARDIAN = 1, + SUMMON_GROUP_WORLD_TRIGGER_BALCONY = 2 }; -class boss_anub_arak : public CreatureScript +struct boss_anub_arak : public BossAI { - public: - boss_anub_arak() : CreatureScript("boss_anub_arak") { } + explicit boss_anub_arak(Creature* creature) : BossAI(creature, DATA_ANUBARAK), _intro(false), + _submergePhase(SUBMERGE_NONE), _remainingLargeSummonsBeforeEmerge(0), _balconySummons(me) + { + me->m_SightDistance = 120.0f; + } + + void Reset() override + { + BossAI::Reset(); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + _remainingLargeSummonsBeforeEmerge = 0; + _submergePhase = SUBMERGE_NONE; + + ScheduleHealthCheckEvent({ 75, 50, 25 }, [&]{ + events.Reset(); + Talk(SAY_SUBMERGE); + DoCastSelf(SPELL_CLEAR_ALL_DEBUFFS, true); + DoCastSelf(SPELL_SUBMERGE, false); + }, false); + } - struct boss_anub_arakAI : public BossAI + void SpellHitTarget(Unit* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_SUBMERGE) { - boss_anub_arakAI(Creature* creature) : BossAI(creature, DATA_ANUBARAK_EVENT) - { - me->m_SightDistance = 120.0f; - _intro = false; - _summonedMinions = false; - } + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->RemoveAurasDueToSpell(SPELL_LEECHING_SWARM); + DoCastSelf(SPELL_IMPALE_PERIODIC, true); - void EnterEvadeMode(EvadeReason why) override - { - me->DisableRotate(false); - BossAI::EnterEvadeMode(why); - } + ++_submergePhase; + ScheduleSubmerged(); + } + } - void MoveInLineOfSight(Unit* who) override - { - if (!_intro && who->IsPlayer()) - { - _intro = true; - Talk(SAY_INTRO); - } - BossAI::MoveInLineOfSight(who); - } + void ScheduleEmerged() + { + events.Reset(); + events.SetPhase(PHASE_EMERGED); + events.ScheduleEvent(EVENT_CARRION_BEETLES, 6500ms, 0, PHASE_EMERGED); + events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, 0, PHASE_EMERGED); + events.ScheduleEvent(EVENT_POUND, 15s, 0, PHASE_EMERGED); + }; + + void ScheduleSubmerged() + { + events.Reset(); + events.SetPhase(PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_EMERGE, 60s, 0, PHASE_SUBMERGED); - void JustDied(Unit* killer) override - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } + switch (_submergePhase) + { + case SUBMERGE_75: + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED); + + _remainingLargeSummonsBeforeEmerge = IsHeroic() ? 2 : 1; + + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED); + break; + case SUBMERGE_50: + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED); + + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, 0, PHASE_SUBMERGED); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, 0, PHASE_SUBMERGED); + + _remainingLargeSummonsBeforeEmerge = IsHeroic() ? 4 : 2; + + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED); + break; + case SUBMERGE_25: + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s, 0, PHASE_SUBMERGED); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 7s, 0, PHASE_SUBMERGED); + + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 24s, 0, PHASE_SUBMERGED); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 29s, 0, PHASE_SUBMERGED); + + _remainingLargeSummonsBeforeEmerge = IsHeroic() ? 4 : 2; + + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 4s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 4s, 0, PHASE_SUBMERGED); + + events.ScheduleEvent(EVENT_SUMMON_DARTER, 12s, 0, PHASE_SUBMERGED); + + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 24s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 26s, 0, PHASE_SUBMERGED); + + events.ScheduleEvent(EVENT_SUMMON_DARTER, 32s, 0, PHASE_SUBMERGED); + + events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 44s, 0, PHASE_SUBMERGED); + events.ScheduleEvent(EVENT_SUMMON_DARTER, 45s, 0, PHASE_SUBMERGED); + break; + default: + break; + } + } - void KilledUnit(Unit* /*victim*/) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6s); - } - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + + events.SetPhase(PHASE_EMERGED); + events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s); + ScheduleEmerged(); + + // set up world triggers + std::list<TempSummon*> summoned; + me->SummonCreatureGroup(SUMMON_GROUP_WORLD_TRIGGER_GUARDIAN, &summoned); + if (summoned.empty()) + { + EnterEvadeMode(EVADE_REASON_OTHER); + return; + } + TempSummon* guardianTrigger = summoned.front(); + _guardianTriggerGUID = guardianTrigger->GetGUID(); - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - if (!summon->IsTrigger()) - summon->SetInCombatWithZone(); - } + summoned.clear(); + _balconySummons.clear(); + me->SummonCreatureGroup(SUMMON_GROUP_WORLD_TRIGGER_BALCONY, &summoned); + if (summoned.empty()) + { + EnterEvadeMode(EVADE_REASON_OTHER); + return; + } + for (auto const& summon : summoned) + _balconySummons.Summon(summon); + } - void Reset() override - { - BossAI::Reset(); - _summonedMinions = false; - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - - ScheduleHealthCheckEvent({ 75, 50, 25 }, [&]{ - Talk(SAY_SUBMERGE); - _summonedMinions = false; - DoCastSelf(SPELL_CLEAR_ALL_DEBUFFS, true); - DoCastSelf(SPELL_SUBMERGE, false); - - me->m_Events.AddEventAtOffset([this] { - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - DoCastSelf(SPELL_IMPALE_PERIODIC, true); - }, 2s); - - events.Reset(); - events.ScheduleEvent(EVENT_EMERGE, 60s); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 2s); - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4s); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 15s); - events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 20s); - events.ScheduleEvent(EVENT_SUMMON_DARTER, 30s); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 35s); - }, false); - } + void EnterEvadeMode(EvadeReason why) override + { + me->DisableRotate(false); + BossAI::EnterEvadeMode(why); + summons.DespawnAll(); + } - void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override - { - if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) - return; + void MoveInLineOfSight(Unit* who) override + { + if (!_intro && who->IsPlayer()) + { + _intro = true; + Talk(SAY_INTRO); + } + BossAI::MoveInLineOfSight(who); + } - if (_summonedMinions && !summons.IsAnyCreatureWithEntryAlive(NPC_ANUBAR_GUARDIAN) && !summons.IsAnyCreatureWithEntryAlive(NPC_ANUBAR_VENOMANCER)) - { - events.Reset(); - events.ScheduleEvent(EVENT_EMERGE, 5s); - } - } + void JustDied(Unit* killer) override + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } - void JustEngagedWith(Unit* ) override - { - Talk(SAY_AGGRO); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + void KilledUnit(Unit* /*victim*/) override + { + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) + { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6s); + } + } - events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500ms); - events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s); - events.ScheduleEvent(EVENT_POUND, 15s); - events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s); - } + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) + return; - void SummonHelpers(float x, float y, float z, uint32 spellId) + switch (summon->GetEntry()) + { + case NPC_ANUBAR_GUARDIAN: + case NPC_ANUBAR_VENOMANCER: { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - me->SummonCreature(spellInfo->Effects[EFFECT_0].MiscValue, x, y, z, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); + --_remainingLargeSummonsBeforeEmerge; + if (_remainingLargeSummonsBeforeEmerge == 0) + { + events.Reset(); + events.ScheduleEvent(EVENT_EMERGE, 5s); + } + break; } + default: + break; + } + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void SummonedCreatureEvade(Creature* /*summon*/) override + { + EnterEvadeMode(EVADE_REASON_OTHER); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); - scheduler.Update(diff); + events.Update(diff); + scheduler.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - switch (events.ExecuteEvent()) + switch (events.ExecuteEvent()) + { + case EVENT_CLOSE_DOORS: + BossAI::_JustEngagedWith(); + break; + case EVENT_CARRION_BEETLES: + DoCastSelf(SPELL_CARRION_BEETLES); + events.ScheduleEvent(EVENT_CARRION_BEETLES, 25s, 0, PHASE_EMERGED); + break; + case EVENT_LEECHING_SWARM: + Talk(SAY_LOCUST); + DoCastSelf(SPELL_LEECHING_SWARM); + events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s, 0, PHASE_EMERGED); + break; + case EVENT_POUND: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) { - case EVENT_CLOSE_DOORS: - _JustEngagedWith(); - break; - case EVENT_CARRION_BEETELS: - me->CastSpell(me, SPELL_CARRION_BEETLES, false); - events.ScheduleEvent(EVENT_CARRION_BEETELS, 25s); - break; - case EVENT_LEECHING_SWARM: - Talk(SAY_LOCUST); - me->CastSpell(me, SPELL_LEECHING_SWARM, false); - events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s); - break; - case EVENT_POUND: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) - { - me->CastSpell(me, SPELL_SELF_ROOT, true); - me->DisableRotate(true); - me->SendMovementFlagUpdate(); - events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms); - me->CastSpell(target, SPELL_POUND, false); - } - events.ScheduleEvent(EVENT_POUND, 18s); - break; - case EVENT_ENABLE_ROTATE: - me->RemoveAurasDueToSpell(SPELL_SELF_ROOT); - me->DisableRotate(false); - break; - case EVENT_EMERGE: - me->CastSpell(me, SPELL_EMERGE, true); - me->RemoveAura(SPELL_SUBMERGE); - me->RemoveAura(SPELL_IMPALE_PERIODIC); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); - events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500ms); - events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s); - events.ScheduleEvent(EVENT_POUND, 15s); - break; - case EVENT_SUMMON_ASSASSINS: - SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_ASSASSIN); - SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_ASSASSIN); - break; - case EVENT_SUMMON_DARTER: - SummonHelpers(509.32f, 247.42f, 239.48f, SPELL_SUMMON_DARTER); - SummonHelpers(589.51f, 240.19f, 236.0f, SPELL_SUMMON_DARTER); - break; - case EVENT_SUMMON_GUARDIAN: - SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_GUARDIAN); - break; - case EVENT_SUMMON_VENOMANCER: - _summonedMinions = true; - SummonHelpers(550.34f, 316.00f, 234.30f, SPELL_SUMMON_VENOMANCER); - break; + DoCastSelf(SPELL_SELF_ROOT, true); + me->DisableRotate(true); + me->SendMovementFlagUpdate(); + events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms); + DoCast(target, SPELL_POUND); } + events.ScheduleEvent(EVENT_POUND, 18s); + break; + case EVENT_ENABLE_ROTATE: + me->RemoveAurasDueToSpell(SPELL_SELF_ROOT); + me->DisableRotate(false); + break; + case EVENT_EMERGE: + me->RemoveAurasDueToSpell(SPELL_SUBMERGE); + me->RemoveAurasDueToSpell(SPELL_IMPALE_PERIODIC); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + DoCastSelf(SPELL_EMERGE); + ScheduleEmerged(); + break; + case EVENT_SUMMON_GUARDIAN: + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _guardianTriggerGUID)) + trigger->CastSpell(trigger, SPELL_SUMMON_GUARDIAN, true, nullptr, nullptr, me->GetGUID()); + break; + case EVENT_SUMMON_VENOMANCER: + if (Creature* trigger = ObjectAccessor::GetCreature(*me, _guardianTriggerGUID)) + trigger->CastSpell(trigger, SPELL_SUMMON_VENOMANCER, true, nullptr, nullptr, me->GetGUID()); + break; + case EVENT_SUMMON_DARTER: + if (Creature* trigger = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(_balconySummons))) + trigger->CastSpell(trigger, SPELL_SUMMON_DARTER, true, nullptr, nullptr, me->GetGUID()); + break; + case EVENT_SUMMON_ASSASSINS: + if (Creature* trigger = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(_balconySummons))) + trigger->CastSpell(trigger, SPELL_SUMMON_ASSASSIN, true, nullptr, nullptr, me->GetGUID()); + if (Creature* trigger = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(_balconySummons))) + trigger->CastSpell(trigger, SPELL_SUMMON_ASSASSIN, true, nullptr, nullptr, me->GetGUID()); + break; + default: + break; + } - if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) - DoMeleeAttackIfReady(); - } + if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) + DoMeleeAttackIfReady(); + } - private: - bool _intro; - bool _summonedMinions; - }; + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override + { + if (me->HasAura(SPELL_SUBMERGE) && damage >= me->GetHealth()) + damage = me->GetHealth() - 1; - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<boss_anub_arakAI>(creature); - } + BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask); + } + + private: + bool _intro; + uint8 _submergePhase; + uint8 _remainingLargeSummonsBeforeEmerge; + ObjectGuid _guardianTriggerGUID; + SummonList _balconySummons; }; -class spell_azjol_nerub_carrion_beetels : public AuraScript +class spell_azjol_nerub_carrion_beetles : public AuraScript { - PrepareAuraScript(spell_azjol_nerub_carrion_beetels) + PrepareAuraScript(spell_azjol_nerub_carrion_beetles) - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { // Xinef: 2 each second GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SUMMON_CARRION_BEETLES, true); @@ -280,7 +404,7 @@ class spell_azjol_nerub_carrion_beetels : public AuraScript void Register() override { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_azjol_nerub_carrion_beetels::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_azjol_nerub_carrion_beetles::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; @@ -288,7 +412,7 @@ class spell_azjol_nerub_pound : public SpellScript { PrepareSpellScript(spell_azjol_nerub_pound); - void HandleApplyAura(SpellEffIndex /*effIndex*/) + void HandleApplyAura(SpellEffIndex /*effIndex*/) { if (Unit* unitTarget = GetHitUnit()) GetCaster()->CastSpell(unitTarget, SPELL_POUND_DAMAGE, true); @@ -320,8 +444,8 @@ class spell_azjol_nerub_impale_summon : public SpellScript void AddSC_boss_anub_arak() { - new boss_anub_arak(); - RegisterSpellScript(spell_azjol_nerub_carrion_beetels); + RegisterAzjolNerubCreatureAI(boss_anub_arak); + RegisterSpellScript(spell_azjol_nerub_carrion_beetles); RegisterSpellScript(spell_azjol_nerub_pound); RegisterSpellScript(spell_azjol_nerub_impale_summon); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index f3f9396ba0..37e2542a24 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -111,7 +111,7 @@ public: uint32 GetData(uint32 data) const override { if (data == me->GetEntry()) - return !me->isActiveObject() || events.GetNextEventTime(EVENT_HADRONOX_MOVE4) != 0; + return !me->isActiveObject() || events.HasTimeUntilEvent(EVENT_HADRONOX_MOVE4) ? 1 : 0; return 0; } @@ -121,11 +121,11 @@ public: // Xinef: cannot use pathfinding... if (summon->GetDistance(477.0f, 618.0f, 771.0f) < 5.0f) - summon->GetMotionMaster()->MovePath(3000012, false); + summon->GetMotionMaster()->MoveWaypoint(3000012, false); else if (summon->GetDistance(583.0f, 617.0f, 771.0f) < 5.0f) - summon->GetMotionMaster()->MovePath(3000013, false); + summon->GetMotionMaster()->MoveWaypoint(3000013, false); else if (summon->GetDistance(581.0f, 608.5f, 739.0f) < 5.0f) - summon->GetMotionMaster()->MovePath(3000014, false); + summon->GetMotionMaster()->MoveWaypoint(3000014, false); } void KilledUnit(Unit* victim) override @@ -258,7 +258,7 @@ public: { if (summon->GetEntry() != me->GetEntry()) { - summon->GetMotionMaster()->MovePoint(0, *me, false); + summon->GetMotionMaster()->MovePoint(0, *me, FORCED_MOVEMENT_NONE, 0.f, false); summon->GetMotionMaster()->MoveFollow(me, 0.1f, 0.0f + M_PI * 0.3f * summons.size()); } summons.Summon(summon); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 9d6616db97..ef6372c788 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -25,17 +25,18 @@ DoorData const doorData[] = { - { GO_KRIKTHIR_DOORS, DATA_KRIKTHIR, DOOR_TYPE_PASSAGE }, - { GO_ANUBARAK_DOORS1, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM }, - { GO_ANUBARAK_DOORS2, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM }, - { GO_ANUBARAK_DOORS3, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM }, - { 0, 0, DOOR_TYPE_ROOM } + { GO_KRIKTHIR_DOORS, DATA_KRIKTHIR, DOOR_TYPE_PASSAGE }, + { GO_ANUBARAK_DOORS1, DATA_ANUBARAK, DOOR_TYPE_ROOM }, + { GO_ANUBARAK_DOORS2, DATA_ANUBARAK, DOOR_TYPE_ROOM }, + { GO_ANUBARAK_DOORS3, DATA_ANUBARAK, DOOR_TYPE_ROOM }, + { 0, 0, DOOR_TYPE_ROOM } }; ObjectData const creatureData[] = { { NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR }, { NPC_HADRONOX, DATA_HADRONOX }, + { NPC_ANUBARAK, DATA_ANUBARAK }, { 0, 0 } }; @@ -53,7 +54,7 @@ BossBoundaryData const boundaries = { { DATA_KRIKTHIR, new RectangleBoundary(400.0f, 580.0f, 623.5f, 810.0f) }, { DATA_HADRONOX, new ZRangeBoundary(666.0f, 776.0f) }, - { DATA_ANUBARAK_EVENT, new CircleBoundary(Position(550.6178f, 253.5917f), 26.0f) } + { DATA_ANUBARAK, new CircleBoundary(Position(550.6178f, 253.5917f), 32.0f) } }; class instance_azjol_nerub : public InstanceMapScript diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp index fa1a998b0d..e1b0018ef7 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp @@ -77,51 +77,52 @@ enum Misc DATA_SET_INSANITY_PHASE = 1, }; -enum Events -{ - EVENT_HERALD_MIND_FLAY = 1, - EVENT_HERALD_SHADOW, - EVENT_HERALD_SHIVER, -}; - const std::array<uint32, MAX_INSANITY_TARGETS> InsanitySpells = { SPELL_INSANITY_PHASING_1, SPELL_INSANITY_PHASING_2, SPELL_INSANITY_PHASING_3, SPELL_INSANITY_PHASING_4, SPELL_INSANITY_PHASING_5 }; struct boss_volazj : public BossAI { boss_volazj(Creature* pCreature) : BossAI(pCreature, DATA_HERALD_VOLAZJ), - insanityTimes(0), insanityPhase(false) { } - void InitializeAI() override - { - BossAI::InitializeAI(); - // Visible for all players in insanity - me->SetPhaseMask((1 | 16 | 32 | 64 | 128 | 256), true); - } - void Reset() override { _Reset(); - insanityTimes = 0; insanityPhase = false; me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetControlled(false, UNIT_STATE_STUNNED); ResetPlayersPhaseMask(); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); + me->SetPhaseMask((1 | 16 | 32 | 64 | 128 | 256), true); + + ScheduleHealthCheckEvent({ 66, 33 }, [&]{ + scheduler.CancelAll(); + DoCastSelf(SPELL_INSANITY); + }, false); + } + + void ScheduleTasks() override + { + ScheduleTimedEvent(8s, [&] { + DoCastVictim(SPELL_MIND_FLAY); + }, 20s); + + ScheduleTimedEvent(5s, [&] { + DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY); + }, 5s); + + ScheduleTimedEvent(15s, [&] { + DoCastRandomTarget(SPELL_SHIVER); + }, 15s); } void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); - events.ScheduleEvent(EVENT_HERALD_MIND_FLAY, 8s); - events.ScheduleEvent(EVENT_HERALD_SHADOW, 5s); - events.ScheduleEvent(EVENT_HERALD_SHIVER, 15s); Talk(SAY_AGGRO); DoCastSelf(SPELL_WHISPER_AGGRO); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); - me->SetInCombatWithZone(); } void JustDied(Unit* /*killer*/) override @@ -184,36 +185,13 @@ struct boss_volazj : public BossAI } } - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override - { - // Do not perform insanity recast if boss is casting Insanity already - if (me->FindCurrentSpellBySpellId(SPELL_INSANITY)) - { - return; - } - - // First insanity - if (insanityTimes == 0 && me->HealthBelowPctDamaged(66, damage)) - { - DoCastSelf(SPELL_INSANITY, false); - ++insanityTimes; - } - // Second insanity - else if (insanityTimes == 1 && me->HealthBelowPctDamaged(33, damage)) - { - me->InterruptNonMeleeSpells(false); - DoCastSelf(SPELL_INSANITY, false); - ++insanityTimes; - } - } - void UpdateAI(uint32 diff) override { //Return since we have no target if (!UpdateVictim()) - { return; - } + + scheduler.Update(diff); if (insanityPhase) { @@ -226,53 +204,13 @@ struct boss_volazj : public BossAI me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetControlled(false, UNIT_STATE_STUNNED); me->RemoveAurasDueToSpell(INSANITY_VISUAL); - } - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - { - return; - } - - while (uint32 const eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_HERALD_MIND_FLAY: - { - DoCastVictim(SPELL_MIND_FLAY, false); - events.Repeat(20s); - break; - } - case EVENT_HERALD_SHADOW: - { - DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY, false); - events.Repeat(5s); - break; - } - case EVENT_HERALD_SHIVER: - { - if (Unit* pTarget = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) - { - DoCast(pTarget, SPELL_SHIVER, false); - } - - events.Repeat(15s); - break; - } - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - { - return; - } + ScheduleTasks(); } DoMeleeAttackIfReady(); } private: - uint8 insanityTimes; bool insanityPhase; // Indicates if boss enter to insanity phase uint32 GetPlrInsanityAuraId(uint32 phaseMask) const @@ -312,6 +250,7 @@ private: bool CheckPhaseMinions() { summons.RemoveNotExisting(); + if (summons.empty()) { ResetPlayersPhaseMask(); diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp index 574db03388..e5444781df 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp @@ -54,12 +54,9 @@ enum Spells // FIGHT SPELL_GIFT_OF_THE_HERALD = 56219, - SPELL_CYCLONE_STRIKE = 56855, // Self - SPELL_CYCLONE_STRIKE_H = 60030, - SPELL_LIGHTNING_BOLT = 56891, // 40Y - SPELL_LIGHTNING_BOLT_H = 60032, // 40Y - SPELL_THUNDERSHOCK = 56926, // 30Y - SPELL_THUNDERSHOCK_H = 60029 // 30Y + SPELL_CYCLONE_STRIKE = 56855, + SPELL_LIGHTNING_BOLT = 56891, + SPELL_THUNDERSHOCK = 56926, }; enum Events @@ -173,7 +170,7 @@ struct boss_jedoga_shadowseeker : public BossAI me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); me->SetDisableGravity(true); me->SetHover(true); - me->GetMotionMaster()->MovePoint(POINT_INITIAL, JedogaPosition[0], false); + me->GetMotionMaster()->MovePoint(POINT_INITIAL, JedogaPosition[0], FORCED_MOVEMENT_NONE, 0.f, false); _Reset(); events.SetPhase(PHASE_NORMAL); @@ -247,7 +244,7 @@ struct boss_jedoga_shadowseeker : public BossAI DespawnOOCSummons(); DoCastSelf(SPELL_HOVER_FALL); me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->MovePoint(POINT_DOWN, JedogaPosition[1], false); + me->GetMotionMaster()->MovePoint(POINT_DOWN, JedogaPosition[1], FORCED_MOVEMENT_NONE, 0.f, false); if (!combatSummonsSummoned) { @@ -397,7 +394,7 @@ struct boss_jedoga_shadowseeker : public BossAI volunteerWork = false; me->GetMotionMaster()->Clear(); DoCastSelf(SPELL_HOVER_FALL); - me->GetMotionMaster()->MovePoint(POINT_DOWN, JedogaPosition[1], false); + me->GetMotionMaster()->MovePoint(POINT_DOWN, JedogaPosition[1], FORCED_MOVEMENT_NONE, 0.f, false); } } break; @@ -461,7 +458,7 @@ struct boss_jedoga_shadowseeker : public BossAI // Normal phase case EVENT_JEDOGA_CYCLONE: { - DoCastSelf(DUNGEON_MODE(SPELL_CYCLONE_STRIKE, SPELL_CYCLONE_STRIKE_H), false); + DoCastSelf(SPELL_CYCLONE_STRIKE, false); events.Repeat(10s, 14s); break; } @@ -469,7 +466,7 @@ struct boss_jedoga_shadowseeker : public BossAI { if (Unit* pTarget = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) { - DoCast(pTarget, DUNGEON_MODE(SPELL_LIGHTNING_BOLT, SPELL_LIGHTNING_BOLT_H), false); + DoCast(pTarget, SPELL_LIGHTNING_BOLT, false); } events.Repeat(11s, 15s); break; @@ -478,7 +475,7 @@ struct boss_jedoga_shadowseeker : public BossAI { if (Unit* pTarget = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) { - DoCast(pTarget, DUNGEON_MODE(SPELL_THUNDERSHOCK, SPELL_THUNDERSHOCK_H), false); + DoCast(pTarget, SPELL_THUNDERSHOCK, false); } events.Repeat(16s, 22s); @@ -504,7 +501,7 @@ struct boss_jedoga_shadowseeker : public BossAI summons.DespawnEntry(NPC_JEDOGA_CONTROLLER); DoCastSelf(SPELL_HOVER_FALL); me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(POINT_DOWN, JedogaPosition[1], false); + me->GetMotionMaster()->MovePoint(POINT_DOWN, JedogaPosition[1], FORCED_MOVEMENT_NONE, 0.f, false); break; } case EVENT_JEDGA_START_RITUAL: @@ -663,7 +660,7 @@ struct npc_twilight_volunteer : public ScriptedAI me->GetMotionMaster()->Clear(); me->SetHomePosition(JedogaPosition[2]); me->SetWalk(true); - me->GetMotionMaster()->MovePoint(POINT_RITUAL, JedogaPosition[2], false); + me->GetMotionMaster()->MovePoint(POINT_RITUAL, JedogaPosition[2], FORCED_MOVEMENT_NONE, 0.f, false); if (Creature* jedoga = pInstance->GetCreature(DATA_JEDOGA_SHADOWSEEKER)) { diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp index de9d3e176e..46a330a74e 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp @@ -20,6 +20,7 @@ #include "Player.h" #include "ScriptedCreature.h" #include "SpellInfo.h" +#include "SpellMgr.h" #include "SpellScript.h" #include "SpellScriptLoader.h" #include "ahnkahet.h" @@ -38,11 +39,10 @@ enum Spells SPELL_BEAM_VISUAL = 60342, SPELL_VANISH = 55964, SPELL_SHADOWSTEP = 55966, - SPELL_HOVER_FALL = 60425 + SPELL_HOVER_FALL = 60425, + SPELL_EMBRACE_OF_THE_VAMPYR = 55959, }; -#define SPELL_EMBRACE_OF_THE_VAMPYR DUNGEON_MODE(55959, 59513) - enum Spheres { NPC_FLAME_SPHERE_1 = 30106, @@ -291,7 +291,7 @@ struct boss_taldaram : public BossAI { BossAI::DamageTaken(attacker, damage, damageType, school); - if (me->FindCurrentSpellBySpellId(SPELL_EMBRACE_OF_THE_VAMPYR)) + if (me->FindCurrentSpellBySpellId(sSpellMgr->GetSpellIdForDifficulty(SPELL_EMBRACE_OF_THE_VAMPYR, me))) { vanishDamage += damage; if (vanishDamage >= DUNGEON_MODE<uint32>(MAX_EMBRACE_DMG, MAX_EMBRACE_DMG_H)) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index e0c14e515f..8199369ad8 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -130,9 +130,9 @@ enum Misc ACTION_DRAKE_DIED = 3, // Movement points - POINT_FINAL_TENEBRON = 8, - POINT_FINAL_SHADRON = 4, - POINT_FINAL_VESPERON = 4, + POINT_FINAL_TENEBRON = 9, + POINT_FINAL_SHADRON = 5, + POINT_FINAL_VESPERON = 5, // Lava directions. Its used to identify to which side lava was moving by last time LAVA_LEFT_SIDE = 0, @@ -583,7 +583,7 @@ public: } } - events.RepeatEvent((below11PctReached ? urand(1400, 2000) : urand(5000, 20000))); + events.Repeat((below11PctReached ? randtime(1400ms, 2s) : randtime(5s, 20s))); break; } case EVENT_SARTHARION_BERSERK: @@ -1071,7 +1071,7 @@ public: Talk(SAY_TENEBRON_RESPOND); me->SetCanFly(true); me->SetSpeed(MOVE_FLIGHT, 3.0f); - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); } } @@ -1086,7 +1086,7 @@ public: Talk(SAY_TENEBRON_BREATH); } DoCastVictim(SPELL_SHADOW_BREATH, false); - events.RepeatEvent(17500); + events.Repeat(17500ms); break; } case EVENT_MINIBOSS_SHADOW_FISSURE: @@ -1095,7 +1095,7 @@ public: { DoCast(target, SPELL_SHADOW_FISSURE, false); } - events.RepeatEvent(22500); + events.Repeat(22500ms); break; } case EVENT_MINIBOSS_OPEN_PORTAL: @@ -1254,7 +1254,7 @@ public: Talk(SAY_SHADRON_RESPOND); me->SetCanFly(true); me->SetSpeed(MOVE_FLIGHT, 3.0f); - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); } } @@ -1270,7 +1270,7 @@ public: } DoCastVictim(SPELL_SHADOW_BREATH, false); - events.RepeatEvent(17500); + events.Repeat(17500ms); break; } case EVENT_MINIBOSS_SHADOW_FISSURE: @@ -1279,7 +1279,7 @@ public: { DoCast(target, SPELL_SHADOW_FISSURE, false); } - events.RepeatEvent(22500); + events.Repeat(22500ms); break; } case EVENT_MINIBOSS_OPEN_PORTAL: @@ -1370,7 +1370,7 @@ public: Talk(SAY_SHADRON_RESPOND); me->SetCanFly(true); me->SetSpeed(MOVE_FLIGHT, 3.0f); - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); } } @@ -1480,7 +1480,7 @@ public: { if (param == ACTION_SWITCH_PHASE) { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index 1e693b33a5..6d18a16023 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -152,7 +152,7 @@ public: if (action == ACTION_INTRO_BALTHARUS && !_introDone) { _introDone = true; - me->m_Events.AddEvent(new DelayedTalk(me, SAY_BALTHARUS_INTRO), me->m_Events.CalculateTime(6000)); + me->m_Events.AddEventAtOffset(new DelayedTalk(me, SAY_BALTHARUS_INTRO), 6s); } else if (action == ACTION_CLONE) { @@ -191,7 +191,7 @@ public: void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -204,7 +204,7 @@ public: summon->SetHealth(me->GetHealth()); summon->CastSpell(summon, SPELL_SPAWN_EFFECT, true); summon->SetReactState(REACT_PASSIVE); - summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(2000)); + summon->m_Events.AddEventAtOffset(new RestoreFight(summon), 2s); } void UpdateAI(uint32 diff) override @@ -379,7 +379,7 @@ public: // Xinef: after soft reset npc is no longer present if (me->GetInstanceScript()->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE) - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void DoAction(int32 action) override diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index ac9a9d7343..1707433e6c 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -136,7 +136,7 @@ public: void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -210,7 +210,8 @@ public: { _lavaGoutCount = 0; AddWaypoints(); - Start(true, true); + me->SetWalk(false); + Start(true); } void JustEngagedWith(Unit* /*who*/) override diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 6ff00560d0..affbf1cb2c 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -199,7 +199,7 @@ public: WorldPacket data(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, 4); data << uint32(ENCOUNTER_FRAME_REFRESH_FRAMES); - _owner->GetSession()->SendPacket(&data); + _owner->SendDirectMessage(&data); return true; } @@ -310,7 +310,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->IsPlayer() && events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (victim->IsPlayer() && !events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -335,7 +335,7 @@ public: void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) override { - if (events.GetNextEventTime(EVENT_CHECK_HEALTH) != 0) + if (events.HasTimeUntilEvent(EVENT_CHECK_HEALTH)) return; if (!attacker || !me->InSamePhase(attacker)) @@ -477,7 +477,7 @@ public: void KilledUnit(Unit* victim) override { - if (victim->IsPlayer() && _events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (victim->IsPlayer() && !_events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); _events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -598,7 +598,7 @@ public: void SetData(uint32 id, uint32 value) override { - if (_events.GetNextEventTime(EVENT_CHECK_CORPOREALITY) == 0) + if (!events.HasTimeUntilEvent(EVENT_CHECK_CORPOREALITY)) return; if (id == DATA_MATERIAL_DAMAGE_TAKEN) @@ -1120,7 +1120,7 @@ class spell_halion_twilight_realm_aura : public AuraScript target->RemoveAurasDueToSpell(SPELL_FIERY_COMBUSTION, ObjectGuid::Empty, 0, AURA_REMOVE_BY_ENEMY_SPELL); if (!GetTarget()->IsPlayer()) return; - GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); + GetTarget()->m_Events.AddEventAtOffset(new SendEncounterUnit(GetTarget()->ToPlayer()), 500ms); } void Register() override @@ -1153,7 +1153,7 @@ class spell_halion_leave_twilight_realm_aura : public AuraScript if (!GetTarget()->IsPlayer()) return; - GetTarget()->m_Events.AddEvent(new SendEncounterUnit(GetTarget()->ToPlayer()), GetTarget()->m_Events.CalculateTime(500)); + GetTarget()->m_Events.AddEventAtOffset(new SendEncounterUnit(GetTarget()->ToPlayer()), 500ms); } void Register() override @@ -1322,7 +1322,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } }; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp index 5396265952..7b6aa9e8f5 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp @@ -121,7 +121,7 @@ public: void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -144,7 +144,7 @@ public: me->SetReactState(REACT_PASSIVE); me->AttackStop(); me->SetDisableGravity(true); - me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 6.0f, false); + me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 6.0f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false); events.ScheduleEvent(EVENT_FLIGHT, 50s); events.DelayEvents(15s); events.ScheduleEvent(EVENT_AIR_MOVEMENT, 2s); @@ -163,10 +163,10 @@ public: events.ScheduleEvent(EVENT_FLAME_BREATH, 20s, 30s); break; case EVENT_AIR_MOVEMENT: - me->GetMotionMaster()->MovePoint(POINT_FLIGHT, 3155.51f, 683.844f, 95.0f, false); + me->GetMotionMaster()->MovePoint(POINT_FLIGHT, 3155.51f, 683.844f, 95.0f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case EVENT_LAND_BACK: - me->GetMotionMaster()->MovePoint(POINT_LAND, 3151.07f, 636.443f, 80.0f, false); + me->GetMotionMaster()->MovePoint(POINT_LAND, 3151.07f, 636.443f, 80.0f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false); break; case EVENT_LAND_GROUND: me->SetReactState(REACT_AGGRESSIVE); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 47f6266c65..f8fadd8faf 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -45,12 +45,9 @@ enum EadricEvents enum PaletressSpells { - SPELL_SMITE_N = 66536, - SPELL_SMITE_H = 67674, - SPELL_HOLY_FIRE_N = 66538, - SPELL_HOLY_FIRE_H = 67676, - SPELL_RENEW_N = 66537, - SPELL_RENEW_H = 67675, + SPELL_SMITE = 66536, + SPELL_HOLY_FIRE = 66538, + SPELL_RENEW = 66537, SPELL_HOLY_NOVA = 66546, SPELL_SHIELD = 66515, @@ -58,21 +55,11 @@ enum PaletressSpells SPELL_SUMMON_MEMORY = 66545, //Memory - SPELL_OLD_WOUNDS_N = 66620, - SPELL_OLD_WOUNDS_H = 67679, - SPELL_SHADOWS_PAST_N = 66619, - SPELL_SHADOWS_PAST_H = 67678, - SPELL_WAKING_NIGHTMARE_N = 66552, - SPELL_WAKING_NIGHTMARE_H = 67677, + SPELL_OLD_WOUNDS = 66620, + SPELL_SHADOWS_PAST = 66619, + SPELL_WAKING_NIGHTMARE = 66552, }; -#define SPELL_SMITE DUNGEON_MODE(SPELL_SMITE_N, SPELL_SMITE_H) -#define SPELL_HOLY_FIRE DUNGEON_MODE(SPELL_HOLY_FIRE_N, SPELL_HOLY_FIRE_H) -#define SPELL_RENEW DUNGEON_MODE(SPELL_RENEW_N, SPELL_RENEW_H) -#define SPELL_OLD_WOUNDS DUNGEON_MODE(SPELL_OLD_WOUNDS_N, SPELL_OLD_WOUNDS_H) -#define SPELL_SHADOWS_PAST DUNGEON_MODE(SPELL_SHADOWS_PAST_N, SPELL_SHADOWS_PAST_H) -#define SPELL_WAKING_NIGHTMARE DUNGEON_MODE(SPELL_WAKING_NIGHTMARE_N, SPELL_WAKING_NIGHTMARE_H) - enum PaletressEvents { EVENT_SPELL_SMITE = 1, @@ -125,8 +112,8 @@ public: void JustEngagedWith(Unit* /*who*/) override { events.Reset(); - events.ScheduleEvent(EVENT_SPELL_RADIANCE, 16000); - events.ScheduleEvent(EVENT_SPELL_HAMMER_RIGHTEOUS, 25000); + events.ScheduleEvent(EVENT_SPELL_RADIANCE, 16s); + events.ScheduleEvent(EVENT_SPELL_HAMMER_RIGHTEOUS, 25s); Talk(SAY_EADRIC_AGGRO); me->CastSpell(me, SPELL_VENGEANCE, false); if (pInstance) @@ -409,7 +396,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->DespawnOrUnsummon(20000); + me->DespawnOrUnsummon(20s); if (pInstance) if (Creature* paletress = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_PALETRESS))) paletress->AI()->DoAction(1); @@ -477,29 +464,22 @@ enum ArgentSoldierSpells // monk SPELL_FLURRY_OF_BLOWS = 67233, SPELL_PUMMEL = 67235, - SPELL_DIVINE_SHIELD_H = 67251, - SPELL_FINAL_MEDITATION_H = 67255, + SPELL_DIVINE_SHIELD = 67251, + SPELL_FINAL_MEDITATION = 67255, // priestess - SPELL_HOLY_SMITE_N = 36176, - SPELL_HOLY_SMITE_H = 67289, + SPELL_HOLY_SMITE = 36176, SPELL_FOUNTAIN_OF_LIGHT = 67194, NPC_FOUNTAIN_OF_LIGHT = 35311, - SPELL_SHADOW_WORD_PAIN_N = 34941, - SPELL_SHADOW_WORD_PAIN_H = 34942, - SPELL_MIND_CONTROL_H = 67229, + SPELL_SHADOW_WORD_PAIN = 34941, + SPELL_MIND_CONTROL = 67229, // lightwielder - SPELL_BLAZING_LIGHT_N = 67247, - SPELL_BLAZING_LIGHT_H = 67290, + SPELL_BLAZING_LIGHT = 67247, SPELL_CLEAVE = 15284, - SPELL_UNBALANCING_STRIKE_H = 67237, + SPELL_UNBALANCING_STRIKE = 67237, }; -#define SPELL_HOLY_SMITE DUNGEON_MODE(SPELL_HOLY_SMITE_N, SPELL_HOLY_SMITE_H) -#define SPELL_SHADOW_WORD_PAIN DUNGEON_MODE(SPELL_SHADOW_WORD_PAIN_N, SPELL_SHADOW_WORD_PAIN_H) -#define SPELL_BLAZING_LIGHT DUNGEON_MODE(SPELL_BLAZING_LIGHT_N, SPELL_BLAZING_LIGHT_H) - enum ArgentSoldierEvents { EVENT_MONK_SPELL_FLURRY_OF_BLOWS = 1, @@ -507,10 +487,10 @@ enum ArgentSoldierEvents EVENT_PRIESTESS_SPELL_HOLY_SMITE, EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN, EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT, - EVENT_PRIESTESS_SPELL_MIND_CONTROL_H, + EVENT_PRIESTESS_SPELL_MIND_CONTROL, EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT, EVENT_LIGHTWIELDER_SPELL_CLEAVE, - EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H, + EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE, }; class npc_argent_soldier : public CreatureScript @@ -607,7 +587,8 @@ public: break; } - Start(false, true); + me->SetWalk(false); + Start(false); uiWaypoint = uiType; } @@ -618,8 +599,8 @@ public: bCheck = false; damage = me->GetHealth() - 1; events.DelayEvents(10s); - me->CastSpell(me, SPELL_DIVINE_SHIELD_H, true); - me->CastSpell((Unit*)nullptr, SPELL_FINAL_MEDITATION_H, true); + me->CastSpell(me, SPELL_DIVINE_SHIELD, true); + me->CastSpell((Unit*)nullptr, SPELL_FINAL_MEDITATION, true); } } @@ -638,13 +619,13 @@ public: events.RescheduleEvent(EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN, 3s, 6s); events.RescheduleEvent(EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT, 8s, 15s); if (IsHeroic()) - events.RescheduleEvent(EVENT_PRIESTESS_SPELL_MIND_CONTROL_H, 12s); + events.RescheduleEvent(EVENT_PRIESTESS_SPELL_MIND_CONTROL, 12s); break; case NPC_ARGENT_LIGHTWIELDER: events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT, 12s, 15s); events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_CLEAVE, 3s, 5s); if (IsHeroic()) - events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H, 8s, 12s); + events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE, 8s, 12s); break; } } @@ -690,9 +671,9 @@ public: me->CastSpell((Unit*)nullptr, SPELL_FOUNTAIN_OF_LIGHT, false); events.Repeat(35s, 45s); break; - case EVENT_PRIESTESS_SPELL_MIND_CONTROL_H: + case EVENT_PRIESTESS_SPELL_MIND_CONTROL: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - me->CastSpell(target, SPELL_MIND_CONTROL_H, false); + me->CastSpell(target, SPELL_MIND_CONTROL, false); events.Repeat(22s, 30s); break; @@ -710,9 +691,9 @@ public: me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); events.Repeat(6s, 8s); break; - case EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H: + case EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE: if (me->GetVictim()) - me->CastSpell(me->GetVictim(), SPELL_UNBALANCING_STRIKE_H, false); + me->CastSpell(me->GetVictim(), SPELL_UNBALANCING_STRIKE, false); events.Repeat(12s, 15s); break; } @@ -722,7 +703,7 @@ public: void JustDied(Unit* /*pKiller*/) override { - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); if (pInstance) pInstance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, 0); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index 47b89b1624..e1178e6763 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -18,7 +18,11 @@ #include "CreatureScript.h" #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" +#include "SharedDefines.h" +#include "Spell.h" #include "SpellInfo.h" +#include "SpellScript.h" +#include "SpellScriptLoader.h" #include "trial_of_the_champion.h" enum Spells @@ -30,49 +34,29 @@ enum Spells SPELL_BK_KILL_CREDIT = 68663, // phase 1 - SPELL_PLAGUE_STRIKE_N = 67724, - SPELL_PLAGUE_STRIKE_H = 67884, - SPELL_ICY_TOUCH_N = 67718, - SPELL_ICY_TOUCH_H = 67881, - SPELL_DEATH_RESPITE_N = 67745, - SPELL_DEATH_RESPITE_H = 68306, + SPELL_PLAGUE_STRIKE = 67724, + SPELL_ICY_TOUCH = 67718, + SPELL_DEATH_RESPITE = 67745, SPELL_DEATH_RESPITE_DUMMY = 66798, - SPELL_OBLITERATE_N = 67725, - SPELL_OBLITERATE_H = 67883, + SPELL_OBLITERATE = 67725, // phase 2 (+ abilities from phase 1 without death respite) - SPELL_ARMY_DEAD_N = 67761, - SPELL_ARMY_DEAD_H = 67874, - SPELL_DESECRATION_N = 67778, - SPELL_DESECRATION_H = 67877, + SPELL_ARMY_DEAD = 67761, + SPELL_DESECRATION = 67778, SPELL_DESECRATION_SUMMON = 67779, SPELL_BK_GHOUL_EXPLODE = 67751, // phase 3 - SPELL_DEATH_BITE_N = 67808, - SPELL_DEATH_BITE_H = 67875, - SPELL_MARKED_DEATH_N = 67823, - SPELL_MARKED_DEATH_H = 67882, + SPELL_DEATH_BITE = 67808, + SPELL_MARKED_DEATH = 67823, // ghouls - SPELL_CLAW_N = 67774, + SPELL_CLAW = 67774, SPELL_CLAW_H = 67879, - SPELL_EXPLODE_N = 67729, - SPELL_EXPLODE_H = 67886, - SPELL_LEAP_N = 67749, - SPELL_LEAP_H = 67880, + SPELL_EXPLODE = 67729, + SPELL_EXPLODE_H = 67886, + SPELL_LEAP = 67749, }; -#define SPELL_LEAP DUNGEON_MODE(SPELL_LEAP_N, SPELL_LEAP_H) -#define SPELL_EXPLODE DUNGEON_MODE(SPELL_EXPLODE_N, SPELL_EXPLODE_H) - -#define SPELL_PLAGUE_STRIKE DUNGEON_MODE(SPELL_PLAGUE_STRIKE_N, SPELL_PLAGUE_STRIKE_H) -#define SPELL_ICY_TOUCH DUNGEON_MODE(SPELL_ICY_TOUCH_N, SPELL_ICY_TOUCH_H) -#define SPELL_DEATH_RESPITE DUNGEON_MODE(SPELL_DEATH_RESPITE_N, SPELL_DEATH_RESPITE_H) -#define SPELL_OBLITERATE DUNGEON_MODE(SPELL_OBLITERATE_N, SPELL_OBLITERATE_H) -#define SPELL_ARMY_DEAD DUNGEON_MODE(SPELL_ARMY_DEAD_N, SPELL_ARMY_DEAD_H) -#define SPELL_DESECRATION DUNGEON_MODE(SPELL_DESECRATION_N, SPELL_DESECRATION_H) -#define SPELL_DEATH_BITE DUNGEON_MODE(SPELL_DEATH_BITE_N, SPELL_DEATH_BITE_H) -#define SPELL_MARKED_DEATH DUNGEON_MODE(SPELL_MARKED_DEATH_N, SPELL_MARKED_DEATH_H) enum Events { @@ -131,7 +115,7 @@ public: void EnterEvadeMode(EvadeReason why) override { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); ScriptedAI::EnterEvadeMode(why); } @@ -182,7 +166,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_ANNOUNCER_SAY_ZOMBIE, 2500ms); events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, 7s, 9s); - events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, 3500ms, 7000ms); + events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, 3500ms, 7s); events.ScheduleEvent(EVENT_SPELL_DEATH_RESPITE, 13s, 15s); events.ScheduleEvent(EVENT_SPELL_OBLITERATE, 11s, 19s); } @@ -214,7 +198,7 @@ public: events.Reset(); events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, 7s, 9s); - events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, 3500ms, 7000ms); + events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, 3500ms, 7s); events.ScheduleEvent(EVENT_SPELL_OBLITERATE, 11s, 19s); events.ScheduleEvent(EVENT_SPELL_DESECRATION, 2s, 3s); break; @@ -339,7 +323,7 @@ public: void Reset() override { - Start(false, true, ObjectGuid::Empty, nullptr); + Start(false, ObjectGuid::Empty, nullptr); SetDespawnAtEnd(true); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetImmuneToAll(true); @@ -420,27 +404,6 @@ public: } } - void SpellHitTarget(Unit* target, SpellInfo const* spell) override - { - switch (spell->Id) - { - case SPELL_CLAW_N: - case SPELL_CLAW_H: - DoResetThreatList(); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - { - me->AddThreat(target, 100.0f); - AttackStart(target); - } - break; - case SPELL_EXPLODE_H: - if (target && target->IsPlayer()) - if (pInstance) - pInstance->SetData(DATA_ACHIEV_IVE_HAD_WORSE, 0); - break; - } - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -467,7 +430,7 @@ public: break; case 2: // claw if (Unit* target = me->GetVictim()) - me->CastSpell(target, SPELL_CLAW_N, false); + me->CastSpell(target, SPELL_CLAW, false); events.Repeat(6s, 8s); break; } @@ -482,9 +445,51 @@ public: } }; +//67774,67879 +class spell_black_knight_ghoul_claw : public SpellScript +{ + PrepareSpellScript(spell_black_knight_ghoul_claw); + + void HandleSpellHit(SpellEffIndex /*effIndex*/) + { + if (Unit* caster = GetCaster()) + { + GetCaster()->GetThreatMgr().ResetAllThreat(); + if (Unit* target = caster->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + { + caster->AddThreat(target, 100.0f); + caster->GetAI()->AttackStart(target); + } + } + } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_black_knight_ghoul_claw::HandleSpellHit, EFFECT_0, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE); + } +}; + +//67886 +class spell_black_knight_ghoul_explode : public SpellScript +{ + PrepareSpellScript(spell_black_knight_ghoul_explode); + + void HandleSpellHit(SpellEffIndex /*effIndex*/) + { + if (GetHitUnit()->IsPlayer()) + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SetData(DATA_ACHIEV_IVE_HAD_WORSE, 0); + } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_black_knight_ghoul_explode::HandleSpellHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + void AddSC_boss_black_knight() { new boss_black_knight(); new npc_black_knight_skeletal_gryphon(); new npc_black_knight_ghoul(); + RegisterSpellScript(spell_black_knight_ghoul_claw); + RegisterSpellScript(spell_black_knight_ghoul_explode); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 649a60c6f2..93d599a7b4 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -56,38 +56,30 @@ enum MountSpells enum ChampionSpells { // Mage (Ambrose Boltspark, Eressea Dawnsinger) - SPELL_FIREBALL_N = 66042, - SPELL_FIREBALL_H = 68310, - SPELL_BLAST_WAVE_N = 66044, - SPELL_BLAST_WAVE_H = 68312, + SPELL_FIREBALL = 66042, + SPELL_BLAST_WAVE = 66044, SPELL_HASTE = 66045, - SPELL_POLYMORPH_N = 66043, - SPELL_POLYMORPH_H = 68311, + SPELL_POLYMORPH = 66043, // Shaman (Colosos, Runok Wildmane) - SPELL_CHAIN_LIGHTNING_N = 67529, - SPELL_CHAIN_LIGHTNING_H = 68319, + SPELL_CHAIN_LIGHTNING = 67529, SPELL_EARTH_SHIELD = 67530, - SPELL_HEALING_WAVE_N = 67528, - SPELL_HEALING_WAVE_H = 68318, + SPELL_HEALING_WAVE = 67528, SPELL_HEX_OF_MENDING = 67534, // Hunter (Jaelyne Evensong, Zul'tore) SPELL_DISENGAGE = 68339, SPELL_LIGHTNING_ARROWS = 66083, SPELL_MULTI_SHOT = 66081, - SPELL_SHOOT_N = 65868, - SPELL_SHOOT_H = 67988, + SPELL_SHOOT = 65868, // Rogue (Lana Stouthammer Evensong, Deathstalker Visceri) - SPELL_EVISCERATE_N = 67709, - SPELL_EVISCERATE_H = 68317, + SPELL_EVISCERATE = 67709, SPELL_FAN_OF_KNIVES = 67706, SPELL_POISON_BOTTLE = 67701, // Warrior (Marshal Jacob Alerius, Mokra the Skullcrusher) - SPELL_MORTAL_STRIKE_N = 68783, - SPELL_MORTAL_STRIKE_H = 68784, + SPELL_MORTAL_STRIKE = 68783, SPELL_BLADESTORM = 63784, SPELL_INTERCEPT = 67540, SPELL_ROLLING_THROW = 67546, // not implemented yet! @@ -98,15 +90,6 @@ enum Texts SAY_TRAMPLED = 0, }; -#define SPELL_FIREBALL DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H) -#define SPELL_BLAST_WAVE DUNGEON_MODE(SPELL_BLAST_WAVE_N, SPELL_BLAST_WAVE_H) -#define SPELL_POLYMORPH DUNGEON_MODE(SPELL_POLYMORPH_N, SPELL_POLYMORPH_H) -#define SPELL_CHAIN_LIGHTNING DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H) -#define SPELL_HEALING_WAVE DUNGEON_MODE(SPELL_HEALING_WAVE_N, SPELL_HEALING_WAVE_H) -#define SPELL_SHOOT DUNGEON_MODE(SPELL_SHOOT_N, SPELL_SHOOT_H) -#define SPELL_EVISCERATE DUNGEON_MODE(SPELL_EVISCERATE_N, SPELL_EVISCERATE_H) -#define SPELL_MORTAL_STRIKE DUNGEON_MODE(SPELL_MORTAL_STRIKE_N, SPELL_MORTAL_STRIKE_H) - enum MountEvents { EVENT_NONE = 0, @@ -213,7 +196,7 @@ public: data << uint32(VEHICLE_SPELL_RIDE_HARDCODED); data << uint8(SPELL_FAILED_CUSTOM_ERROR); data << uint32(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED); - clicker->ToPlayer()->GetSession()->SendPacket(&data); + clicker->ToPlayer()->SendDirectMessage(&data); return false; } }; @@ -246,10 +229,16 @@ public: events.Reset(); } + void MoveInLineOfSight(Unit* who) override + { + if (pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) >= INSTANCE_PROGRESS_GRAND_CHAMPIONS_REACHED_DEST) + ScriptedAI::MoveInLineOfSight(who); + } + void JustEngagedWith(Unit* /*who*/) override { events.Reset(); - events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4000ms); + events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4s); events.ScheduleEvent(EVENT_SHIELD_BREAKER, 5s, 8s); events.ScheduleEvent(EVENT_THRUST, 3s, 5s); me->CastSpell(me, SPELL_TRAMPLE_AURA, true); @@ -305,7 +294,7 @@ public: me->CastSpell(target, SPELL_MINIONS_CHARGE, false); } } - events.Repeat(4500ms, 6000ms); + events.Repeat(4500ms, 6s); } break; case EVENT_SHIELD_BREAKER: @@ -341,7 +330,7 @@ public: void JustDied(Unit* /*pKiller*/) override { me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); if (pInstance) pInstance->SetData(DATA_MOUNT_DIED, 0); } @@ -366,7 +355,7 @@ public: me->CastSpell(me, SPELL_BOSS_DEFEND_PERIODIC, true); events.Reset(); - events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4000ms); + events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4s); events.ScheduleEvent(EVENT_SHIELD_BREAKER, 5s, 8s); events.ScheduleEvent(EVENT_THRUST, 3s, 5s); @@ -410,6 +399,12 @@ public: } } + void MoveInLineOfSight(Unit* who) override + { + if (pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) >= INSTANCE_PROGRESS_GRAND_CHAMPIONS_REACHED_DEST) + npc_escortAI::MoveInLineOfSight(who); + } + void JustEngagedWith(Unit* /*who*/) override { if (pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) == INSTANCE_PROGRESS_CHAMPIONS_UNMOUNTED ) @@ -537,7 +532,7 @@ public: return; } - Start(false, true); + Start(false); } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override @@ -628,7 +623,7 @@ public: me->CastSpell(me, SPELL_BOSS_DEFEND_PERIODIC, true); me->SetRegeneratingHealth(true); events.Reset(); - events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4000ms); + events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4s); events.ScheduleEvent(EVENT_SHIELD_BREAKER, 5s, 8s); events.ScheduleEvent(EVENT_THRUST, 3s, 5s); me->SetReactState(REACT_AGGRESSIVE); @@ -754,7 +749,7 @@ public: me->CastSpell(target, SPELL_MINIONS_CHARGE, false); } } - events.Repeat(4500ms, 6000ms); + events.Repeat(4500ms, 6s); } break; case EVENT_SHIELD_BREAKER: diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp index 195d626a73..1f3cc4eaf4 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp @@ -23,7 +23,6 @@ #include "trial_of_the_champion.h" const Position SpawnPosition = {746.67f, 684.08f, 412.5f, 4.65f}; -#define CLEANUP_CHECK_INTERVAL 5000 /** * @todo: Missing dialog/RP (already populated in DB) && spawns (can use ToC25 locations?) for: @@ -88,7 +87,7 @@ public: VehicleList.clear(); CLEANED = false; events.Reset(); - events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0); + events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0ms); Counter = 0; temp1 = 0; temp2 = 0; @@ -268,7 +267,7 @@ public: if (DoNeedCleanup(player)) InstanceCleanup(); - events.RescheduleEvent(EVENT_CHECK_PLAYERS, CLEANUP_CHECK_INTERVAL); + events.RescheduleEvent(EVENT_CHECK_PLAYERS, 5s); } bool DoNeedCleanup(Player* ignoredPlayer = nullptr) @@ -443,7 +442,7 @@ public: Counter = 0; SaveToDB(); events.Reset(); - events.RescheduleEvent(EVENT_CHECK_PLAYERS, CLEANUP_CHECK_INTERVAL); + events.RescheduleEvent(EVENT_CHECK_PLAYERS, 5s); CLEANED = true; } @@ -785,7 +784,7 @@ public: { InstanceCleanup(); } - events.RepeatEvent(CLEANUP_CHECK_INTERVAL); + events.Repeat(5s); } break; case EVENT_SUMMON_GRAND_CHAMPION_1: @@ -812,7 +811,7 @@ public: while( number == temp1 || number == temp2 ); DoSummonGrandChampion(number, 2); HandleGameObject(GO_MainGateGUID, true); - events.ScheduleEvent(EVENT_CLOSE_GATE, 6000); + events.ScheduleEvent(EVENT_CLOSE_GATE, 6s); } break; case EVENT_CLOSE_GATE: @@ -1129,7 +1128,7 @@ public: if (Creature* boss = instance->GetCreature(NPC_ArgentChampionGUID)) { boss->GetMotionMaster()->MovePoint(0, SpawnPosition); - boss->DespawnOrUnsummon(3000); + boss->DespawnOrUnsummon(3s); } } break; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index e7762a71be..87c8b3ae8b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -19,6 +19,7 @@ #include "PassiveAI.h" #include "Player.h" #include "ScriptedCreature.h" +#include "SharedDefines.h" #include "SpellAuraEffects.h" #include "SpellScript.h" #include "SpellScriptLoader.h" @@ -161,7 +162,7 @@ public: events.Reset(); bIntro = false; bPhase3 = false; - me->ApplySpellImmune(0, IMMUNITY_ID, RAID_MODE(66193, 67855, 67856, 67857), true); + me->ApplySpellImmune(0, IMMUNITY_ID, sSpellMgr->GetSpellIdForDifficulty(SPELL_PERMAFROST, me), true); me->m_SightDistance = 90.0f; // for MoveInLineOfSight distance } @@ -501,8 +502,8 @@ public: void JustDied(Unit* /*killer*/) override { - me->CastSpell(me, RAID_MODE(SPELL_TRAITOR_KING_10, SPELL_TRAITOR_KING_25, SPELL_TRAITOR_KING_10, SPELL_TRAITOR_KING_25), true); - me->m_Events.AddEvent(new HideNpcEvent(*me), me->m_Events.CalculateTime(5000)); + me->CastSpell(me, SPELL_TRAITOR_KING, true); + me->m_Events.AddEventAtOffset(new HideNpcEvent(*me), 5s); } bool CanAIAttack(Unit const* target) const override @@ -574,7 +575,7 @@ public: if (spell->Id == SPELL_SPIKE_FAIL) { me->RemoveAllAuras(); - me->DespawnOrUnsummon(1500); + me->DespawnOrUnsummon(1500ms); } } @@ -655,7 +656,7 @@ public: me->NearTeleportTo(target->GetPositionX() + cos(o) * 5.0f, target->GetPositionY() + std::sin(o) * 5.0f, target->GetPositionZ() + 0.6f, target->GetOrientation()); AttackStart(target); me->GetMotionMaster()->MoveChase(target); - events.DelayEvents(3000); + events.DelayEvents(3s); } } @@ -679,7 +680,7 @@ public: events.Repeat(30s, 45s); break; case EVENT_SUBMERGE: - if (HealthBelowPct(80) && !me->HasAura(RAID_MODE(66193, 67855, 67856, 67857))) // not having permafrost - allow submerge + if (HealthBelowPct(80) && !me->HasAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_PERMAFROST, me))) // not having permafrost - allow submerge { me->GetMotionMaster()->MoveIdle(); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); @@ -710,7 +711,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->m_Events.AddEvent(new HideNpcEvent(*me), me->m_Events.CalculateTime(5000)); + me->m_Events.AddEventAtOffset(new HideNpcEvent(*me), 5s); } bool CanAIAttack(Unit const* target) const override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 0a44e0f9d1..4cc91611a8 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -119,7 +119,7 @@ struct boss_faction_championsAI : public ScriptedAI } /// @todo - Convert to std::chrono - void EventMapGCD(EventMap& e, uint32 delay, uint32 gcd = 0) + void EventMapGCD(EventMap& e, Milliseconds delay, uint32 gcd = 0) { e.DelayEventsToMax(delay, gcd); } @@ -316,43 +316,43 @@ public: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_LIFEBLOOM, 40.0f)) me->CastSpell(target, SPELL_LIFEBLOOM, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_NOURISH: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_NOURISH, 40.0f)) me->CastSpell(target, SPELL_NOURISH, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_REGROWTH: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_REGROWTH, 40.0f)) me->CastSpell(target, SPELL_REGROWTH, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_REJUVENATION: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_REJUVENATION, 40.0f)) me->CastSpell(target, SPELL_REJUVENATION, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_THORNS: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_THORNS, 30.0f)) me->CastSpell(target, SPELL_THORNS, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_TRANQUILITY: me->CastSpell(me, SPELL_TRANQUILITY, false); events.Repeat(2min, 3min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_BARKSKIN: if (HealthBelowPct(50)) { me->CastSpell(me, SPELL_BARKSKIN, false); events.Repeat(1min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -360,7 +360,7 @@ public: case EVENT_SPELL_NATURE_GRASP: me->CastSpell(me, SPELL_NATURE_GRASP, false); events.Repeat(1min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } @@ -445,19 +445,19 @@ public: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HEALING_WAVE, 40.0f)) me->CastSpell(target, SPELL_HEALING_WAVE, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_RIPTIDE: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_RIPTIDE, 40.0f)) me->CastSpell(target, SPELL_RIPTIDE, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_SPIRIT_CLEANSE: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_SPIRIT_CLEANSE, 40.0f)) me->CastSpell(target, SPELL_SPIRIT_CLEANSE, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_HEROISM_OR_BLOODLUST: if (me->GetEntry() == NPC_ALLIANCE_SHAMAN_RESTORATION ) @@ -465,25 +465,25 @@ public: else me->CastSpell((Unit*)nullptr, SPELL_BLOODLUST, true); events.Repeat(10min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_HEX: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true)) me->CastSpell(target, SPELL_HEX, false); events.Repeat(45s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_EARTH_SHIELD: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_EARTH_SHIELD, 40.0f)) me->CastSpell(target, SPELL_EARTH_SHIELD, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_EARTH_SHOCK: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_EARTH_SHOCK, false); events.Repeat(5s, 10s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } @@ -568,14 +568,14 @@ public: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HAND_OF_FREEDOM, 30.0f)) me->CastSpell(target, SPELL_HAND_OF_FREEDOM, false); events.Repeat(25s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_BUBBLE: if (HealthBelowPct(25)) { me->CastSpell(me, SPELL_BUBBLE, false); events.Repeat(5min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(10s); @@ -584,32 +584,32 @@ public: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_CLEANSE, 40.0f)) me->CastSpell(target, SPELL_CLEANSE, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_FLASH_OF_LIGHT: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_FLASH_OF_LIGHT, 40.0f)) me->CastSpell(target, SPELL_FLASH_OF_LIGHT, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_HOLY_LIGHT: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HOLY_LIGHT, 40.0f)) me->CastSpell(target, SPELL_HOLY_LIGHT, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_HOLY_SHOCK: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HOLY_SHOCK, 40.0f)) me->CastSpell(target, SPELL_HOLY_SHOCK, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_HAND_OF_PROTECTION: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_HAND_OF_PROTECTION, 40.0f)) { me->CastSpell(target, SPELL_HAND_OF_PROTECTION, false); events.Repeat(5min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(10s); @@ -619,7 +619,7 @@ public: { me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE, false); events.Repeat(40s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(10s); @@ -701,32 +701,32 @@ public: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_RENEW, 40.0f)) me->CastSpell(target, SPELL_RENEW, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_SHIELD: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_SHIELD, 40.0f)) me->CastSpell(target, SPELL_SHIELD, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_FLASH_HEAL: if (Creature* target = SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_FLASH_HEAL, 40.0f)) me->CastSpell(target, SPELL_FLASH_HEAL, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_DISPEL: if (Unit* target = (urand(0, 1) ? SelectTarget(SelectTargetMethod::MaxThreat, 0, 30.0f, true) : SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_DISPEL, 40.0f))) me->CastSpell(target, SPELL_DISPEL, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_MANA_BURN: if (Unit* target = SelectEnemyCaster(false, 30.0f)) { me->CastSpell(target, SPELL_MANA_BURN, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -736,7 +736,7 @@ public: { me->CastSpell((Unit*)nullptr, SPELL_PSYCHIC_SCREAM, false); events.Repeat(30s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -825,7 +825,7 @@ public: { me->CastSpell(target, SPELL_SILENCE, false); events.Repeat(45s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } else @@ -835,32 +835,32 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_VAMPIRIC_TOUCH, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_SW_PAIN: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_SW_PAIN, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_MIND_FLAY: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_MIND_FLAY, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_MIND_BLAST: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_MIND_BLAST, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_HORROR: if (me->GetVictim() && me->GetExactDist2d(me->GetVictim()) <= 30.0f ) { me->CastSpell(me->GetVictim(), SPELL_HORROR, false); events.Repeat(2min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(10s); @@ -870,7 +870,7 @@ public: { me->CastSpell(me, SPELL_DISPERSION, false); events.Repeat(3min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -879,14 +879,14 @@ public: if (Unit* target = (urand(0, 1) ? SelectTarget(SelectTargetMethod::MaxThreat, 0, 30.0f, true) : SelectTarget_MostHPLostFriendlyMissingBuff(SPELL_DISPEL, 40.0f))) me->CastSpell(target, SPELL_DISPEL, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_PSYCHIC_SCREAM: if (EnemiesInRange(8.0f) >= 3 ) { me->CastSpell((Unit*)nullptr, SPELL_PSYCHIC_SCREAM, false); events.Repeat(30s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -989,7 +989,7 @@ public: { me->CastSpell((Unit*)nullptr, SPELL_HELLFIRE, false); events.Repeat(30s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -998,43 +998,43 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_CORRUPTION, false); events.Repeat(10s, 20s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_CURSE_OF_AGONY: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_AGONY, false); events.Repeat(10s, 20s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_CURSE_OF_EXHAUSTION: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_EXHAUSTION, false); events.Repeat(10s, 20s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_FEAR: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true)) me->CastSpell(target, SPELL_FEAR, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_SEARING_PAIN: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_SEARING_PAIN, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_SHADOW_BOLT: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_UNSTABLE_AFFLICTION: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_UNSTABLE_AFFLICTION, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } @@ -1121,20 +1121,20 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_ARCANE_BARRAGE, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_ARCANE_BLAST: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_ARCANE_EXPLOSION: if (EnemiesInRange(9.0f) >= 3 ) { me->CastSpell((Unit*)nullptr, SPELL_ARCANE_EXPLOSION, false); events.Repeat(6s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1144,7 +1144,7 @@ public: { me->CastSpell((Unit*)nullptr, SPELL_FROST_NOVA, false); events.Repeat(15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); // blink disabled, movement not working } else @@ -1155,7 +1155,7 @@ public: { me->CastSpell(target, SPELL_COUNTERSPELL, false); events.Repeat(24s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1164,14 +1164,14 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_ICE_BLOCK: if (HealthBelowPct(25)) { me->CastSpell(me, SPELL_ICE_BLOCK, false); events.Repeat(5min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1180,7 +1180,7 @@ public: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) me->CastSpell(target, SPELL_POLYMORPH, false); events.Repeat(15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } @@ -1279,14 +1279,14 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_AIMED_SHOT, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_DETERRENCE: if (HealthBelowPct(25)) { me->CastSpell(me, SPELL_DETERRENCE, false); events.Repeat(90s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1296,7 +1296,7 @@ public: { me->CastSpell(me, SPELL_DISENGAGE, false); events.Repeat(20s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1305,31 +1305,31 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_EXPLOSIVE_SHOT, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_FROST_TRAP: me->CastSpell(me, SPELL_FROST_TRAP, false); events.Repeat(30s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_STEADY_SHOT: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_STEADY_SHOT, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_WING_CLIP: if (me->GetVictim() && me->GetDistance2d(me->GetVictim()) <= 5.0f ) me->CastSpell(me->GetVictim(), SPELL_WING_CLIP, false); events.Repeat(8s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_WYVERN_STING: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true)) { me->CastSpell(target, SPELL_WYVERN_STING, false); events.Repeat(1min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } events.Repeat(10s); @@ -1429,7 +1429,7 @@ public: { me->CastSpell(me, SPELL_BARKSKIN, false); events.Repeat(1min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1438,48 +1438,48 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_WRATH, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_MOONFIRE: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_MOONFIRE, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_STARFIRE: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_STARFIRE, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_INSECT_SWARM: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_INSECT_SWARM, false); events.Repeat(5s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_ENTANGLING_ROOTS: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) me->CastSpell(target, SPELL_ENTANGLING_ROOTS, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_FAERIE_FIRE: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_FAERIE_FIRE, false); events.Repeat(15s, 20s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_CYCLONE: if (Unit* target = SelectTarget(SelectTargetMethod::MaxDistance, 0, 20.0f, true)) me->CastSpell(target, SPELL_CYCLONE, false); events.Repeat(25s, 40s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_FORCE_OF_NATURE: me->CastSpell((Unit*)nullptr, SPELL_FORCE_OF_NATURE, false); events.Repeat(3min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } @@ -1583,7 +1583,7 @@ public: { me->CastSpell((Unit*)nullptr, SPELL_INTIMIDATING_SHOUT, false); events.Repeat(2min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1597,14 +1597,14 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); events.Repeat(6s, 8s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_CHARGE: if (me->GetVictim() && me->GetDistance2d(me->GetVictim()) > 8.0f && me->GetDistance2d(me->GetVictim()) < 25.0f ) { me->CastSpell(me->GetVictim(), SPELL_CHARGE, false); events.Repeat(10s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1614,7 +1614,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_DISARM, false); events.Repeat(1min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1629,7 +1629,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_OVERPOWER, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1644,7 +1644,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_SUNDER_ARMOR, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1659,7 +1659,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_SHATTERING_THROW, false); events.Repeat(5min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1674,7 +1674,7 @@ public: { me->CastSpell(me, SPELL_RETALIATION, false); events.Repeat(5min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1760,7 +1760,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_CHAINS_OF_ICE, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1770,7 +1770,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_DEATH_COIL, false); events.Repeat(5s, 8s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1785,7 +1785,7 @@ public: pos.Relocate(x, y, z); me->GetVictim()->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), 49575, true); events.Repeat(35s); - EventMapGCD(events, 2000); + EventMapGCD(events, 2s); } else events.Repeat(5s); @@ -1800,7 +1800,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_FROST_STRIKE, false); events.Repeat(6s, 10s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1810,7 +1810,7 @@ public: { me->CastSpell(me, SPELL_ICEBOUND_FORTITUDE, false); events.Repeat(1min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1820,7 +1820,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_ICY_TOUCH, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1830,7 +1830,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_STRANGULATE, false); events.Repeat(2min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1922,7 +1922,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_FAN_OF_KNIVES, false); events.Repeat(6s, 10s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1932,7 +1932,7 @@ public: { me->CastSpell(target, SPELL_BLIND, false); events.Repeat(2min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1942,7 +1942,7 @@ public: { me->CastSpell(me, SPELL_CLOAK, false); events.Repeat(90s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(6s); @@ -1954,7 +1954,7 @@ public: { me->CastSpell(me, SPELL_BLADE_FLURRY, false); events.Repeat(2min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } break; case EVENT_SPELL_SHADOWSTEP: @@ -1962,7 +1962,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_SHADOWSTEP, false); events.Repeat(30s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1977,7 +1977,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_HEMORRHAGE, false); events.Repeat(5s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -1992,7 +1992,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_EVISCERATE, false); events.Repeat(15s, 25s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2080,7 +2080,7 @@ public: { me->CastSpell(target, SPELL_EARTH_SHOCK_ENH, false); events.Repeat(6s, 8s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2095,7 +2095,7 @@ public: { me->CastSpell(target, SPELL_LAVA_LASH, false); events.Repeat(6s, 8s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2110,7 +2110,7 @@ public: { me->CastSpell(target, SPELL_STORMSTRIKE, false); events.Repeat(8s, 9s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2121,12 +2121,12 @@ public: else me->CastSpell((Unit*)nullptr, SPELL_BLOODLUST, true); events.Repeat(10min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SUMMON_TOTEM: me->CastSpell((Unit*)nullptr, RAND(SPELL_GROUNDING_TOTEM, SPELL_WINDFURY_TOTEM, SPELL_TREMOR_TOTEM), false); events.Repeat(30s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } @@ -2211,7 +2211,7 @@ public: case EVENT_SPELL_AVENGING_WRATH: me->CastSpell(me, SPELL_AVENGING_WRATH, false); events.Repeat(3min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_CRUSADER_STRIKE: if (me->HasUnitFlag(UNIT_FLAG_DISARMED)) @@ -2223,7 +2223,7 @@ public: { me->CastSpell(target, SPELL_CRUSADER_STRIKE, false); events.Repeat(6s, 8s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2233,7 +2233,7 @@ public: { me->CastSpell(me, SPELL_DIVINE_SHIELD, false); events.Repeat(5min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2248,7 +2248,7 @@ public: { me->CastSpell((Unit*)nullptr, SPELL_DIVINE_STORM, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2258,7 +2258,7 @@ public: { me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE_RET, false); events.Repeat(40s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2268,7 +2268,7 @@ public: { me->CastSpell(target, SPELL_HAND_OF_PROTECTION_RET, false); events.Repeat(5min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2278,7 +2278,7 @@ public: { me->CastSpell(target, SPELL_JUDGEMENT_OF_COMMAND, false); events.Repeat(10s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2288,7 +2288,7 @@ public: { me->CastSpell(target, SPELL_REPENTANCE, false); events.Repeat(1min); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); } else events.Repeat(5s); @@ -2357,13 +2357,13 @@ public: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_DEVOUR_MAGIC, false); events.Repeat(8s, 15s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; case EVENT_SPELL_SPELL_LOCK: if (me->GetVictim()) me->CastSpell(me->GetVictim(), SPELL_SPELL_LOCK, false); events.Repeat(24s); - EventMapGCD(events, 1500); + EventMapGCD(events, 1500ms); break; } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 67cd96d419..8e82e9cb49 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -353,7 +353,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); } void EnterEvadeMode(EvadeReason /*why*/) override @@ -434,7 +434,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); } void EnterEvadeMode(EvadeReason /*why*/) override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 9ad8b6230d..5e99f2353a 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -848,7 +848,7 @@ public: me->CastSpell(me, SPELL_STAGGERED_DAZE, true); me->CastSpell((Unit*)nullptr, SPELL_TRAMPLE, true); Talk(EMOTE_TRAMPLE_CRASH); - events.DelayEvents(15000); + events.DelayEvents(15s); } else { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 372081fe04..aa2028a222 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -384,7 +384,7 @@ struct boss_twin_valkyrAI : public ScriptedAI /* if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, essenceId)) me->CastSpell(target, me->GetEntry()==NPC_LIGHTBANE ? SPELL_LIGHT_TOUCH : SPELL_DARK_TOUCH, false); - events.RepeatEvent(urand(45000,50000)); + events.Repeat(45s,50s); */ GuidVector tList; @@ -458,7 +458,7 @@ struct boss_twin_valkyrAI : public ScriptedAI if ((SpecialMask & 0xF) == 0xF ) SpecialMask = 0; events.Repeat(45s); - events.DelayEventsToMax(15000, 1); // no touch of light/darkness during special abilities! + events.DelayEventsToMax(15s, 1); // no touch of light/darkness during special abilities! } break; case EVENT_REMOVE_DUAL_WIELD: @@ -710,7 +710,7 @@ public: return; if (urand(0, 2)) - me->DespawnOrUnsummon(0); + me->DespawnOrUnsummon(0ms); } void MoveToNextPoint() @@ -884,7 +884,7 @@ class spell_valkyr_ball_periodic_dummy_aura : public AuraScript creature->GetMotionMaster()->MoveIdle(); creature->CastSpell((Unit*)nullptr, creature->GetEntry() == NPC_CONCENTRATED_LIGHT ? SPELL_UNLEASHED_LIGHT : SPELL_UNLEASHED_DARK, false); creature->SetDisplayId(11686); - creature->DespawnOrUnsummon(1500); + creature->DespawnOrUnsummon(1500ms); } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 7dc9c0c591..ad3c4cdb44 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -175,7 +175,7 @@ public: bSwitcher = false; bNooneDied = true; events.Reset(); - events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0); + events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0ms); NPC_ChampionGUIDs.clear(); } @@ -295,22 +295,22 @@ public: switch (InstanceProgress) { case INSTANCE_PROGRESS_INITIAL: - events.RescheduleEvent(EVENT_SCENE_001, 0); + events.RescheduleEvent(EVENT_SCENE_001, 0ms); break; case INSTANCE_PROGRESS_INTRO_DONE: - events.RescheduleEvent(EVENT_SCENE_004, 0); + events.RescheduleEvent(EVENT_SCENE_004, 0ms); break; case INSTANCE_PROGRESS_BEASTS_DEAD: - events.RescheduleEvent(EVENT_SCENE_101, 0); + events.RescheduleEvent(EVENT_SCENE_101, 0ms); break; case INSTANCE_PROGRESS_JARAXXUS_DEAD: - events.RescheduleEvent(EVENT_SCENE_201, 0); + events.RescheduleEvent(EVENT_SCENE_201, 0ms); break; case INSTANCE_PROGRESS_FACTION_CHAMPIONS_DEAD: - events.RescheduleEvent(EVENT_SCENE_301, 0); + events.RescheduleEvent(EVENT_SCENE_301, 0ms); break; case INSTANCE_PROGRESS_VALKYR_DEAD: - events.RescheduleEvent(EVENT_SCENE_401, 0); + events.RescheduleEvent(EVENT_SCENE_401, 0ms); break; } break; @@ -331,7 +331,7 @@ public: if ((northrendBeastsMask & 7) == 7) SetData(TYPE_NORTHREND_BEASTS_ALL, DONE); else if ((northrendBeastsMask & 16) == 0) - events.RescheduleEvent(EVENT_SCENE_005, 2500); + events.RescheduleEvent(EVENT_SCENE_005, 2500ms); } break; case TYPE_JORMUNGAR: @@ -348,9 +348,9 @@ public: } if (Creature* c = instance->GetCreature(NPC_AcidmawGUID)) - c->DespawnOrUnsummon(10000); + c->DespawnOrUnsummon(10s); if (Creature* c = instance->GetCreature(NPC_DreadscaleGUID)) - c->DespawnOrUnsummon(10000); + c->DespawnOrUnsummon(10s); if (AchievementTimer + 10 >= GameTime::GetGameTime().count()) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_JORMUNGAR_ACHIEV); AchievementTimer = 0; @@ -363,7 +363,7 @@ public: else if ((northrendBeastsMask & 32) == 0) { Counter = 0; - events.RescheduleEvent(EVENT_SCENE_006, 2500); + events.RescheduleEvent(EVENT_SCENE_006, 2500ms); } } else // first one died, start timer for achievement @@ -390,7 +390,7 @@ public: InstanceProgress = INSTANCE_PROGRESS_BEASTS_DEAD; HandleGameObject(GO_EnterGateGUID, true); events.CancelEvent(EVENT_NORTHREND_BEASTS_ENRAGE); - events.RescheduleEvent(EVENT_SCENE_BEASTS_DONE, 2500); + events.RescheduleEvent(EVENT_SCENE_BEASTS_DONE, 2500ms); SaveToDB(); } break; @@ -402,7 +402,7 @@ public: { HandleGameObject(GO_EnterGateGUID, true); InstanceProgress = INSTANCE_PROGRESS_JARAXXUS_DEAD; - events.RescheduleEvent(EVENT_SCENE_110, 2500); + events.RescheduleEvent(EVENT_SCENE_110, 2500ms); SaveToDB(); } break; @@ -416,11 +416,11 @@ public: Counter = 0; EncounterStatus = NOT_STARTED; InstanceProgress = INSTANCE_PROGRESS_FACTION_CHAMPIONS_DEAD; - events.RescheduleEvent(EVENT_SCENE_FACTION_CHAMPIONS_DEAD, 2500); + events.RescheduleEvent(EVENT_SCENE_FACTION_CHAMPIONS_DEAD, 2500ms); for (ObjectGuid const& guid : NPC_ChampionGUIDs) if (Creature* c = instance->GetCreature(guid)) - c->DespawnOrUnsummon(15000); + c->DespawnOrUnsummon(15s); NPC_ChampionGUIDs.clear(); if (Creature* c = instance->GetCreature(NPC_TirionGUID)) @@ -491,7 +491,7 @@ public: InstanceProgress = INSTANCE_PROGRESS_VALKYR_DEAD; DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, 34497, 1); // Lightbane DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, 34496, 1); // Darkbane - events.RescheduleEvent(EVENT_SCENE_VALKYR_DEAD, 2500); + events.RescheduleEvent(EVENT_SCENE_VALKYR_DEAD, 2500ms); HandleGameObject(GO_EnterGateGUID, true); SaveToDB(); } @@ -516,7 +516,7 @@ public: c->UpdatePosition(Locs[LOC_TIRION_FINAL], true); c->StopMovingOnCurrentPos(); c->SetFacingTo(Locs[LOC_TIRION_FINAL].GetOrientation()); - events.RescheduleEvent(EVENT_SCENE_501, 20000); + events.RescheduleEvent(EVENT_SCENE_501, 20s); } if (GameObject* floor = instance->GetGameObject(GO_FloorGUID)) floor->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING, nullptr, true); @@ -591,7 +591,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_0_01); - events.RescheduleEvent(EVENT_SCENE_002, 22000); + events.RescheduleEvent(EVENT_SCENE_002, 22s); } break; case EVENT_SCENE_002: @@ -599,7 +599,7 @@ public: if (Creature* c = instance->GetCreature(NPC_VarianGUID)) c->AI()->Talk(SAY_STAGE_0_03a); - events.RescheduleEvent(EVENT_SCENE_003, 5000); + events.RescheduleEvent(EVENT_SCENE_003, 5s); } break; case EVENT_SCENE_003: @@ -607,7 +607,7 @@ public: if (Creature* c = instance->GetCreature(NPC_GarroshGUID)) c->AI()->Talk(SAY_STAGE_0_03h); - events.RescheduleEvent(EVENT_SCENE_004, 8000); + events.RescheduleEvent(EVENT_SCENE_004, 8s); } break; case EVENT_SCENE_004: @@ -620,12 +620,12 @@ public: HandleGameObject(GO_MainGateGUID, true); HandleGameObject(GO_EnterGateGUID, false); - events.RescheduleEvent(EVENT_SUMMON_GORMOK, 1000); + events.RescheduleEvent(EVENT_SUMMON_GORMOK, 1s); if (instance->IsHeroic()) { - events.RescheduleEvent(EVENT_SCENE_005, 150000); - events.RescheduleEvent(EVENT_SCENE_006, 340000); - events.RescheduleEvent(EVENT_NORTHREND_BEASTS_ENRAGE, 520000); + events.RescheduleEvent(EVENT_SCENE_005, 150s); + events.RescheduleEvent(EVENT_SCENE_006, 340s); + events.RescheduleEvent(EVENT_NORTHREND_BEASTS_ENRAGE, 520s); } } break; @@ -650,8 +650,8 @@ public: if (Creature* gormok = c->SummonCreature(NPC_GORMOK, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY(), Locs[LOC_BEHIND_GATE].GetPositionZ(), Locs[LOC_BEHIND_GATE].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000)) gormok->GetMotionMaster()->MovePoint(0, Locs[LOC_GATE_FRONT].GetPositionX(), Locs[LOC_GATE_FRONT].GetPositionY(), Locs[LOC_GATE_FRONT].GetPositionZ()); - events.RescheduleEvent(EVENT_GORMOK_ATTACK, 10000); - events.RescheduleEvent(EVENT_CLOSE_GATE, 6000); + events.RescheduleEvent(EVENT_GORMOK_ATTACK, 10s); + events.RescheduleEvent(EVENT_CLOSE_GATE, 6s); } break; case EVENT_GORMOK_ATTACK: @@ -676,8 +676,8 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_0_04); - events.RescheduleEvent(EVENT_OPEN_GATE, 3000); - events.RescheduleEvent(EVENT_SUMMON_ACIDMAW_AND_DREADSCALE, 4000); + events.RescheduleEvent(EVENT_OPEN_GATE, 3s); + events.RescheduleEvent(EVENT_SUMMON_ACIDMAW_AND_DREADSCALE, 4s); break; } case EVENT_SUMMON_ACIDMAW_AND_DREADSCALE: @@ -690,7 +690,7 @@ public: acidmaw->AddAura(53421, acidmaw); } - events.RescheduleEvent(EVENT_SCENE_005_2, 4000); + events.RescheduleEvent(EVENT_SCENE_005_2, 4s); break; } @@ -699,7 +699,7 @@ public: if (Creature* dreadscale = instance->GetCreature(NPC_DreadscaleGUID)) dreadscale->GetMotionMaster()->MovePoint(0, Locs[LOC_DREADSCALE].GetPositionX(), Locs[LOC_DREADSCALE].GetPositionY(), Locs[LOC_DREADSCALE].GetPositionZ()); - events.RescheduleEvent(EVENT_ACIDMAW_AND_DREADSCALE_ATTACK, 7000); + events.RescheduleEvent(EVENT_ACIDMAW_AND_DREADSCALE_ATTACK, 7s); break; } case EVENT_ACIDMAW_AND_DREADSCALE_ATTACK: @@ -737,8 +737,8 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_0_05); - events.RescheduleEvent(EVENT_OPEN_GATE, 2000); - events.RescheduleEvent(EVENT_SUMMON_ICEHOWL, 3000); + events.RescheduleEvent(EVENT_OPEN_GATE, 2s); + events.RescheduleEvent(EVENT_SUMMON_ICEHOWL, 3s); break; } case EVENT_SUMMON_ICEHOWL: @@ -747,8 +747,8 @@ public: if (Creature* icehowl = c->SummonCreature(NPC_ICEHOWL, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY(), Locs[LOC_BEHIND_GATE].GetPositionZ(), Locs[LOC_BEHIND_GATE].GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 630000000)) icehowl->GetMotionMaster()->MovePoint(0, Locs[LOC_GATE_FRONT].GetPositionX(), Locs[LOC_GATE_FRONT].GetPositionY(), Locs[LOC_GATE_FRONT].GetPositionZ()); - events.RescheduleEvent(EVENT_ICEHOWL_ATTACK, 10000); - events.RescheduleEvent(EVENT_CLOSE_GATE, 6000); + events.RescheduleEvent(EVENT_ICEHOWL_ATTACK, 10s); + events.RescheduleEvent(EVENT_CLOSE_GATE, 6s); break; } case EVENT_ICEHOWL_ATTACK: @@ -785,7 +785,7 @@ public: fizzlebang->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); fizzlebang->GetMotionMaster()->MovePoint(0, Locs[LOC_BEHIND_GATE].GetPositionX(), Locs[LOC_BEHIND_GATE].GetPositionY() - 65.0f, Locs[LOC_BEHIND_GATE].GetPositionZ() - 1.0f); } - events.RescheduleEvent(EVENT_SCENE_102, 20000); + events.RescheduleEvent(EVENT_SCENE_102, 20s); // move Icehowl to side, can't remove corpse because of loot! if (Creature* icehowl = instance->GetCreature(NPC_IcehowlGUID)) @@ -803,7 +803,7 @@ public: if (Creature* c = instance->GetCreature(NPC_FizzlebangGUID)) c->AI()->Talk(SAY_STAGE_1_02); - events.RescheduleEvent(EVENT_SCENE_103, 11000); + events.RescheduleEvent(EVENT_SCENE_103, 11s); break; } case EVENT_SCENE_103: @@ -816,7 +816,7 @@ public: NPC_PurpleGroundGUID = trigger->GetGUID(); } - events.RescheduleEvent(EVENT_SCENE_104, 5000); + events.RescheduleEvent(EVENT_SCENE_104, 5s); break; } case EVENT_SCENE_104: @@ -833,7 +833,7 @@ public: c->HandleEmoteCommand(EMOTE_STATE_SPELL_PRECAST); } - events.RescheduleEvent(EVENT_SUMMON_JARAXXUS, 5000); + events.RescheduleEvent(EVENT_SUMMON_JARAXXUS, 5s); break; } case EVENT_SUMMON_JARAXXUS: @@ -846,7 +846,7 @@ public: c->AI()->Talk(SAY_STAGE_1_04); } - events.RescheduleEvent(EVENT_SCENE_105, 3000); + events.RescheduleEvent(EVENT_SCENE_105, 3s); break; } case EVENT_SCENE_105: @@ -860,7 +860,7 @@ public: c->DespawnOrUnsummon(); NPC_PortalGUID.Clear(); - events.RescheduleEvent(EVENT_SCENE_106, 10000); + events.RescheduleEvent(EVENT_SCENE_106, 10s); break; } case EVENT_SCENE_106: @@ -868,7 +868,7 @@ public: if (Creature* c = instance->GetCreature(NPC_JaraxxusGUID)) c->AI()->Talk(SAY_STAGE_1_05); - events.RescheduleEvent(EVENT_SCENE_107, 5000); + events.RescheduleEvent(EVENT_SCENE_107, 5s); break; } case EVENT_SCENE_107: @@ -876,7 +876,7 @@ public: if (Creature* c = instance->GetCreature(NPC_FizzlebangGUID)) c->AI()->Talk(SAY_STAGE_1_06); - events.RescheduleEvent(EVENT_SCENE_108, 800); + events.RescheduleEvent(EVENT_SCENE_108, 800ms); break; } case EVENT_SCENE_108: @@ -891,7 +891,7 @@ public: } } - events.RescheduleEvent(EVENT_SCENE_109, 5000); + events.RescheduleEvent(EVENT_SCENE_109, 5s); break; } case EVENT_SCENE_109: @@ -901,7 +901,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_1_07); - events.RescheduleEvent(EVENT_JARAXXUS_ATTACK, 6000); + events.RescheduleEvent(EVENT_JARAXXUS_ATTACK, 6s); break; } case EVENT_JARAXXUS_ATTACK: @@ -925,7 +925,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_1_08); - events.RescheduleEvent(EVENT_SCENE_111, 18000); + events.RescheduleEvent(EVENT_SCENE_111, 18s); break; } case EVENT_SCENE_111: @@ -933,7 +933,7 @@ public: if (Creature* c = instance->GetCreature(NPC_GarroshGUID)) c->AI()->Talk(SAY_STAGE_1_09); - events.RescheduleEvent(EVENT_SCENE_112, 9000); + events.RescheduleEvent(EVENT_SCENE_112, 9s); break; } case EVENT_SCENE_112: @@ -941,7 +941,7 @@ public: if (Creature* c = instance->GetCreature(NPC_VarianGUID)) c->AI()->Talk(SAY_STAGE_1_10); - events.RescheduleEvent(EVENT_SCENE_113, 5000); + events.RescheduleEvent(EVENT_SCENE_113, 5s); break; } case EVENT_SCENE_113: @@ -965,7 +965,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_2_01); - events.RescheduleEvent(EVENT_SCENE_202, 9000); + events.RescheduleEvent(EVENT_SCENE_202, 9s); break; } case EVENT_SCENE_202: @@ -974,13 +974,13 @@ public: { if (Creature* c = instance->GetCreature(NPC_GarroshGUID)) c->AI()->Talk(SAY_STAGE_2_02h); - events.RescheduleEvent(EVENT_SCENE_203, 15000); + events.RescheduleEvent(EVENT_SCENE_203, 15s); } else { if (Creature* c = instance->GetCreature(NPC_VarianGUID)) c->AI()->Talk(SAY_STAGE_2_02a); - events.RescheduleEvent(EVENT_SCENE_203, 18000); + events.RescheduleEvent(EVENT_SCENE_203, 18s); } break; } @@ -989,7 +989,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_2_03); - events.RescheduleEvent(EVENT_SCENE_204, 5000); + events.RescheduleEvent(EVENT_SCENE_204, 5s); break; } case EVENT_SCENE_204: @@ -998,16 +998,16 @@ public: { if (Creature* c = instance->GetCreature(NPC_GarroshGUID)) c->AI()->Talk(SAY_STAGE_2_04h); - events.RescheduleEvent(EVENT_SCENE_205, 6000); + events.RescheduleEvent(EVENT_SCENE_205, 6s); } else { if (Creature* c = instance->GetCreature(NPC_VarianGUID)) c->AI()->Talk(SAY_STAGE_2_04a); - events.RescheduleEvent(EVENT_SCENE_205, 5000); + events.RescheduleEvent(EVENT_SCENE_205, 5s); } - events.RescheduleEvent(EVENT_SUMMON_CHAMPIONS, 2500); + events.RescheduleEvent(EVENT_SUMMON_CHAMPIONS, 2500ms); break; } case EVENT_SCENE_205: @@ -1089,7 +1089,7 @@ public: } HandleGameObject(GO_EnterGateGUID, false); - events.RescheduleEvent(EVENT_CHAMPIONS_ATTACK, 4000); + events.RescheduleEvent(EVENT_CHAMPIONS_ATTACK, 4s); break; } case EVENT_CHAMPIONS_ATTACK: @@ -1122,7 +1122,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_3_01); - events.RescheduleEvent(EVENT_SCENE_302, 13000); + events.RescheduleEvent(EVENT_SCENE_302, 13s); break; } case EVENT_SCENE_302: @@ -1130,7 +1130,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_3_02); - events.RescheduleEvent(EVENT_SCENE_303, 3000); + events.RescheduleEvent(EVENT_SCENE_303, 3s); break; } case EVENT_SCENE_303: @@ -1145,7 +1145,7 @@ public: t->GetMotionMaster()->MovePoint(0, Locs[LOC_VALKYR_DEST_LEFT].GetPositionX(), Locs[LOC_VALKYR_DEST_LEFT].GetPositionY(), Locs[LOC_VALKYR_DEST_LEFT].GetPositionZ()); } - events.RescheduleEvent(EVENT_SCENE_304, 6250); + events.RescheduleEvent(EVENT_SCENE_304, 6250ms); break; } case EVENT_SCENE_304: @@ -1157,7 +1157,7 @@ public: if (Creature* c = instance->GetCreature(NPC_DarkbaneGUID)) c->GetMotionMaster()->MovePoint(0, Locs[LOC_VALKYR_DEST_2_LEFT].GetPositionX(), Locs[LOC_VALKYR_DEST_2_LEFT].GetPositionY(), Locs[LOC_VALKYR_DEST_2_LEFT].GetPositionZ()); - events.RescheduleEvent(EVENT_VALKYRIES_ATTACK, 3250); + events.RescheduleEvent(EVENT_VALKYRIES_ATTACK, 3250ms); break; } case EVENT_VALKYRIES_ATTACK: @@ -1189,7 +1189,7 @@ public: if (Creature* c = instance->GetCreature(GetTeamIdInInstance() == TEAM_ALLIANCE ? NPC_VarianGUID : NPC_GarroshGUID)) c->AI()->Talk((GetTeamIdInInstance() == TEAM_ALLIANCE ? SAY_STAGE_3_03a : SAY_STAGE_3_03h)); - events.RescheduleEvent(EVENT_SCENE_401, 60000); + events.RescheduleEvent(EVENT_SCENE_401, 60s); break; } case EVENT_SCENE_401: @@ -1197,7 +1197,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_4_01); - events.RescheduleEvent(EVENT_SCENE_402, 20000); + events.RescheduleEvent(EVENT_SCENE_402, 20s); break; } case EVENT_SCENE_402: @@ -1214,7 +1214,7 @@ public: t->SetVisible(false); } - events.RescheduleEvent(EVENT_SCENE_403, 2000); + events.RescheduleEvent(EVENT_SCENE_403, 2s); break; } case EVENT_SCENE_403: @@ -1226,7 +1226,7 @@ public: t->CastSpell(t, 51807, true); } - events.RescheduleEvent(EVENT_SCENE_404, 2000); + events.RescheduleEvent(EVENT_SCENE_404, 2s); break; } case EVENT_SCENE_404: @@ -1238,7 +1238,7 @@ public: c->GetMotionMaster()->MovePoint(0, Locs[LOC_ARTHAS]); } - events.RescheduleEvent(EVENT_SCENE_405, 3000); + events.RescheduleEvent(EVENT_SCENE_405, 3s); break; } case EVENT_SCENE_405: @@ -1246,7 +1246,7 @@ public: if (Creature* c = instance->GetCreature(NPC_TirionGUID)) c->AI()->Talk(SAY_STAGE_4_03); - events.RescheduleEvent(EVENT_SCENE_406, 7000); + events.RescheduleEvent(EVENT_SCENE_406, 7s); break; } case EVENT_SCENE_406: @@ -1257,8 +1257,8 @@ public: c->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); } - events.RescheduleEvent(EVENT_SCENE_406_2, 2500); - events.RescheduleEvent(EVENT_SCENE_407, 12000); + events.RescheduleEvent(EVENT_SCENE_406_2, 2500ms); + events.RescheduleEvent(EVENT_SCENE_407, 12s); break; } case EVENT_SCENE_406_2: @@ -1276,7 +1276,7 @@ public: if (Creature* c = instance->GetCreature(NPC_LichKingGUID)) c->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - events.RescheduleEvent(EVENT_SCENE_408, 4000); + events.RescheduleEvent(EVENT_SCENE_408, 4s); break; } case EVENT_SCENE_408: @@ -1286,7 +1286,7 @@ public: c->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); } - events.RescheduleEvent(EVENT_SCENE_409, 1500); + events.RescheduleEvent(EVENT_SCENE_409, 1500ms); break; } case EVENT_SCENE_409: @@ -1305,7 +1305,7 @@ public: SpawnAnubArak(); } - events.RescheduleEvent(EVENT_SCENE_410, 2000); + events.RescheduleEvent(EVENT_SCENE_410, 2s); break; } case EVENT_SCENE_410: @@ -1314,7 +1314,7 @@ public: { c->SetVisible(true); c->AI()->Talk(SAY_STAGE_4_05); - c->DespawnOrUnsummon(0); + c->DespawnOrUnsummon(0ms); } break; @@ -1328,7 +1328,7 @@ public: c->SummonGameObject(195682, 668.15f, 134.57f, 142.12f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 630000000); } - events.RescheduleEvent(EVENT_SCENE_502, 20000); + events.RescheduleEvent(EVENT_SCENE_502, 20s); break; } case EVENT_SCENE_502: diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index edc742da4b..8b107342b6 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -351,8 +351,7 @@ enum EventSpells SPELL_JORMUNGAR_ACHIEV = 68523, SPELL_FACTION_CHAMPIONS_KILL_CREDIT = 68184, SPELL_RESILIENCE_WILL_FIX_IT_CREDIT = 68620, - SPELL_TRAITOR_KING_10 = 68186, - SPELL_TRAITOR_KING_25 = 68515, + SPELL_TRAITOR_KING = 68186, SPELL_PORTAL_TO_DALARAN = 53142, }; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index b4bbcfc560..a1e01ee32b 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -167,7 +167,7 @@ public: void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp index ac241e409e..94e9f2dfab 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp @@ -104,7 +104,7 @@ public: void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index 1de17ba57b..78defb7061 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -102,7 +102,7 @@ public: void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -214,7 +214,7 @@ class spell_trollgore_corpse_explode_aura : public AuraScript void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Creature* target = GetTarget()->ToCreature()) - target->DespawnOrUnsummon(1); + target->DespawnOrUnsummon(1ms); } void Register() override diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index a8f22adf87..e5190c5ed0 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -89,7 +89,7 @@ class spell_dtk_raise_dead_aura : public AuraScript void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1); + GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1ms); GetUnitOwner()->SummonCreature(NPC_RISEN_DRAKKARI_WARRIOR, *GetUnitOwner()); } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index c8d14deaa9..80d04808df 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -115,7 +115,7 @@ public: me->GetMotionMaster()->MoveIdle(); me->CastSpell(me, SPELL_TELEPORT, false); events.CancelEvent(EVENT_SPELL_CORRUPT_SOUL); - events.DelayEvents(6000); + events.DelayEvents(6s); events.RescheduleEvent(EVENT_SPELL_FEAR, 8s, 14s); } } @@ -242,7 +242,7 @@ public: { me->GetMotionMaster()->MoveIdle(); me->CastSpell(b, SPELL_CONSUME_SOUL, true); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); return; } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index b848dd2850..c4160dd523 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -225,14 +225,14 @@ public: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) me->CastSpell(target, SPELL_WELL_OF_SOULS, false); events.Repeat(25s, 30s); - events.DelayEventsToMax(4000, 0); + events.DelayEventsToMax(4s, 0); break; case EVENT_SPELL_UNLEASHED_SOULS: me->CastSpell(me, SPELL_UNLEASHED_SOULS, false); Talk(SAY_FACE_UNLEASH_SOUL); Talk(EMOTE_UNLEASH_SOUL); events.Repeat(30s, 40s); - events.DelayEventsToMax(5000, 0); + events.DelayEventsToMax(5s, 0); me->setAttackTimer(BASE_ATTACK, 5500); break; case EVENT_SPELL_WAILING_SOULS: @@ -241,7 +241,7 @@ public: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) me->CastCustomSpell(SPELL_WAILING_SOULS_TARGETING, SPELLVALUE_MAX_TARGETS, 1, target, false); events.Repeat(80s); - events.DelayEventsToMax(20000, 0); + events.DelayEventsToMax(20s, 0); break; } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp index a3e7c184ad..c2eb0864b9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp @@ -140,7 +140,7 @@ public: { for (int8 i = 0; outroPositions[i].entry[GetTeamIdInInstance()] != 0; ++i) if (Creature* summon = instance->SummonCreature(outroPositions[i].entry[GetTeamIdInInstance()], outroPositions[i].startPosition)) - summon->GetMotionMaster()->MovePath(outroPositions[i].pathId, false); + summon->GetMotionMaster()->MoveWaypoint(outroPositions[i].pathId, false); } } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp index d5e01c2da0..ba89cbbebf 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp @@ -18,6 +18,7 @@ #include "CreatureScript.h" #include "halls_of_reflection.h" #include "ScriptedCreature.h" +#include "SpellMgr.h" enum Yells { @@ -44,7 +45,7 @@ enum Events EVENT_UNROOT, }; -const uint32 hopelessnessId[3][2] = { {72395, 72390}, {72396, 72391}, {72397, 72393} }; +const uint32 hopelessnessId[3] = { 72395, 72396, 72397 }; class boss_falric : public CreatureScript { @@ -131,7 +132,7 @@ public: Talk(SAY_DEFILING_HORROR); me->CastSpell((Unit*)nullptr, SPELL_DEFILING_HORROR, false); me->SetControlled(true, UNIT_STATE_ROOT); - events.DelayEventsToMax(5000, 0); + events.DelayEventsToMax(5s, 0); events.ScheduleEvent(EVENT_UNROOT, 4s); events.ScheduleEvent(EVENT_DEFILING_HORROR, 20s); break; @@ -143,8 +144,9 @@ public: if ((uiHopelessnessCount == 0 && HealthBelowPct(67)) || (uiHopelessnessCount == 1 && HealthBelowPct(34)) || (uiHopelessnessCount == 2 && HealthBelowPct(11))) { if (uiHopelessnessCount) - me->RemoveOwnedAura(hopelessnessId[uiHopelessnessCount - 1][DUNGEON_MODE(0, 1)]); - me->CastSpell((Unit*)nullptr, hopelessnessId[uiHopelessnessCount][DUNGEON_MODE(0, 1)], true); + me->RemoveOwnedAura(sSpellMgr->GetSpellIdForDifficulty(hopelessnessId[uiHopelessnessCount - 1], me)); + + me->CastSpell((Unit*)nullptr, hopelessnessId[uiHopelessnessCount], true); ++uiHopelessnessCount; } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index c4b0bdcc7d..db638f0a06 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -571,7 +571,7 @@ public: pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true); pLichKing->SetVisible(true); - pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveMidlelThronePos, false); + pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveMidlelThronePos, FORCED_MOVEMENT_NONE, 0.f, false); } @@ -618,7 +618,7 @@ public: if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) { pLichKing->SetVisible(true); - pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos, false); + pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos, FORCED_MOVEMENT_NONE, 0.f, false); } events.ScheduleEvent(EVENT_INTRO_LK_2_1, 1s); break; @@ -658,7 +658,7 @@ public: pLichKing->SendMovementFlagUpdate(); pLichKing->CastSpell(pLichKing, SPELL_FROSTMOURNE_EQUIP, false); pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), false); - events.ScheduleEvent(EVENT_INTRO_LK_4_3, 1750); + events.ScheduleEvent(EVENT_INTRO_LK_4_3, 1750ms); } events.ScheduleEvent(EVENT_INTRO_LK_5, 6s); break; @@ -709,7 +709,7 @@ public: case EVENT_INTRO_LK_5_2: if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) { - pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); + pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, FORCED_MOVEMENT_NONE, 0.f, false); } break; @@ -763,11 +763,11 @@ public: { Talk(SAY_SYLVANAS_INTRO_END); me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); - me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); + me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, FORCED_MOVEMENT_NONE, 0.f, false); } if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) { - pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk1, false); + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk1, FORCED_MOVEMENT_NONE, 0.f, false); } events.ScheduleEvent(EVENT_INTRO_LK_10, 1s + 500ms); break; @@ -775,7 +775,7 @@ public: case EVENT_INTRO_LK_10: if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) { - pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk2, false); + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk2, FORCED_MOVEMENT_NONE, 0.f, false); } events.ScheduleEvent(EVENT_INTRO_LK_11, 2s); @@ -784,7 +784,7 @@ public: case EVENT_INTRO_LK_11: if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) { - pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk3, false); + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk3, FORCED_MOVEMENT_NONE, 0.f, false); } events.ScheduleEvent(EVENT_INTRO_LK_12, 5s + 500ms); break; @@ -796,7 +796,7 @@ public: } if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) { - pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLkFinal, false); + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLkFinal, FORCED_MOVEMENT_NONE, 0.f, false); } events.ScheduleEvent(EVENT_INTRO_LK_13, 2s); break; @@ -1153,7 +1153,7 @@ public: ScriptedAI::EnterEvadeMode(why); if (me->IsSummon()) - me->ToTempSummon()->DespawnOrUnsummon(1); + me->ToTempSummon()->DespawnOrUnsummon(1ms); } }; }; @@ -1732,7 +1732,7 @@ public: { ++reqKillCount; - if (events.GetNextEventTime(EVENT_DECREASE_REQ_COUNT_BY_100)) + if (events.HasTimeUntilEvent(EVENT_DECREASE_REQ_COUNT_BY_100)) events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10s); summons.Summon(s); s->SetHomePosition(PathWaypoints[WP_STOP[currentWall + 1]]); diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index 5b1e99ab34..a22b42a61e 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -38,7 +38,7 @@ public: _owner.GetMotionMaster()->Clear(); _owner.SetVisible(true); _owner.NearTeleportTo(5300.53f, 1987.80f, 707.70f, 3.89f); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 2), _owner.m_Events.CalculateTime(1000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, 2), 1s); break; case 2: _owner.AI()->Talk(SAY_BATTERED_HILT_HALT); @@ -52,12 +52,12 @@ public: { quel->AI()->Talk(EMOTE_QUEL_SPAWN); } - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 4), _owner.m_Events.CalculateTime(3500)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, 4), 3500ms); break; case 4: _owner.SetWalk(false); _owner.GetMotionMaster()->MovePoint(0, 5337.53f, 1981.21f, 709.32f); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 5), _owner.m_Events.CalculateTime(6000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, 5), 6s); break; case 5: _owner.SetFacingTo(2.82f); @@ -66,7 +66,7 @@ public: case 6: if (InstanceScript* instance = _owner.GetInstanceScript()) instance->SetData(DATA_BATTERED_HILT, 6); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 7), _owner.m_Events.CalculateTime(2000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, 7), 2s); break; case 7: if (InstanceScript* instance = _owner.GetInstanceScript()) @@ -77,7 +77,7 @@ public: { quel->AI()->Talk(EMOTE_QUEL_PREPARE); } - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, 8), _owner.m_Events.CalculateTime(4000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, 8), 4s); break; case 8: _owner.SetReactState(REACT_AGGRESSIVE); @@ -87,23 +87,23 @@ public: break; case 9: _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO1); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(11000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, _eventId + 1), 11s); break; case 10: _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO2); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(7500)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, _eventId + 1), 7500ms); break; case 11: _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO3); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(8000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, _eventId + 1), 8s); break; case 12: _owner.AI()->Talk(SAY_BATTERED_HILT_OUTRO4); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(5000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, _eventId + 1), 5s); break; case 13: _owner.CastSpell((Unit*)nullptr, 73036, true); - _owner.m_Events.AddEvent(new UtherBatteredHiltEvent(_owner, _eventId + 1), _owner.m_Events.CalculateTime(3000)); + _owner.m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(_owner, _eventId + 1), 3s); break; case 14: { @@ -594,7 +594,7 @@ public: if (Creature* c = instance->GetCreature(NPC_AltarBunnyGUID)) c->CastSpell(c, 70720, true); if (Creature* c = instance->GetCreature(NPC_UtherGUID)) - c->m_Events.AddEvent(new UtherBatteredHiltEvent(*c, 1), c->m_Events.CalculateTime(3000)); + c->m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(*c, 1), 3s); break; case 3: if ((BatteredHiltStatus & BHSF_STARTED) == 0 || (BatteredHiltStatus & BHSF_THROWN)) @@ -602,7 +602,7 @@ public: BatteredHiltStatus |= BHSF_THROWN; if (Creature* c = instance->GetCreature(NPC_UtherGUID)) { - c->m_Events.AddEvent(new UtherBatteredHiltEvent(*c, 3), c->m_Events.CalculateTime(5500)); + c->m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(*c, 3), 5500ms); } break; case 4: @@ -614,7 +614,7 @@ public: break; case 5: if (Creature* c = instance->GetCreature(NPC_UtherGUID)) - c->m_Events.AddEvent(new UtherBatteredHiltEvent(*c, 6), c->m_Events.CalculateTime(3000)); + c->m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(*c, 6), 3s); break; case 6: if (Creature* c = instance->GetCreature(NPC_QuelDelarGUID)) @@ -726,7 +726,7 @@ public: c->SetStandState(UNIT_STAND_STATE_STAND); c->SetWalk(false); c->GetMotionMaster()->MovePoint(0, 5313.92f, 1989.36f, 707.70f); - c->m_Events.AddEvent(new UtherBatteredHiltEvent(*c, 9), c->m_Events.CalculateTime(7000)); + c->m_Events.AddEventAtOffset(new UtherBatteredHiltEvent(*c, 9), 7s); } } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 8d60280251..3b145dc891 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -19,7 +19,9 @@ #include "CreatureScript.h" #include "Player.h" #include "ScriptedCreature.h" +#include "SharedDefines.h" #include "SpellAuras.h" +#include "SpellMgr.h" #include "SpellScript.h" #include "SpellScriptLoader.h" #include "pit_of_saron.h" @@ -54,11 +56,11 @@ enum Spells SPELL_CHILLING_WAVE = 68778, SPELL_DEEP_FREEZE = 70381, -}; -#define SPELL_FORGE_BLADE RAID_MODE(68774, 70334) -#define SPELL_FORGE_MACE RAID_MODE(68785, 70335) -#define SPELL_SARONITE_TRIGGERED RAID_MODE(68789, 70851) + SPELL_FORGE_BLADE = 68774, + SPELL_FORGE_MACE = 68785, + SPELL_SARONITE_TRIGGERED = 68789, +}; enum Events { @@ -112,7 +114,7 @@ public: Talk(SAY_AGGRO); DoZoneInCombat(); - events.RescheduleEvent(EVENT_SPELL_THROW_SARONITE, 5000ms, 7500ms); + events.RescheduleEvent(EVENT_SPELL_THROW_SARONITE, 5s, 7500ms); if (pInstance) pInstance->SetData(DATA_GARFROST, IN_PROGRESS); @@ -154,21 +156,45 @@ public: if (phase == 1) { me->SetControlled(true, UNIT_STATE_ROOT); - me->CastSpell(me, SPELL_FORGE_BLADE, false); + if (me->CastSpell(me, SPELL_FORGE_BLADE, false) == SPELL_CAST_OK) + { + events.RescheduleEvent(EVENT_SPELL_CHILLING_WAVE, 10s); + SetEquipmentSlots(false, EQUIP_ID_SWORD); + me->SetReactState(REACT_AGGRESSIVE); + me->SetControlled(false, UNIT_STATE_ROOT); + me->DisableRotate(false); + if (me->GetVictim()) + { + AttackStart(me->GetVictim()); + me->SetTarget(me->GetVictim()->GetGUID()); + } + } Talk(SAY_HP_66); } else if (phase == 2) { me->SetControlled(true, UNIT_STATE_ROOT); - me->RemoveAurasDueToSpell(SPELL_FORGE_BLADE); - me->CastSpell(me, SPELL_FORGE_MACE, false); + me->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_FORGE_BLADE, me)); + if (me->CastSpell(me, SPELL_FORGE_MACE, false) == SPELL_CAST_OK) + { + events.RescheduleEvent(EVENT_SPELL_DEEP_FREEZE, 10s); + SetEquipmentSlots(false, EQUIP_ID_MACE); + me->SetReactState(REACT_AGGRESSIVE); + me->SetControlled(false, UNIT_STATE_ROOT); + me->DisableRotate(false); + if (me->GetVictim()) + { + AttackStart(me->GetVictim()); + me->SetTarget(me->GetVictim()->GetGUID()); + } + } Talk(SAY_HP_33); } } void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) override { - if (spell->Id == uint32(SPELL_SARONITE_TRIGGERED)) + if (spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_SARONITE_TRIGGERED, me)) { if (bCanSayBoulderHit) { @@ -176,32 +202,6 @@ public: Talk(SAY_BOULDER_HIT); } } - if (spell->Id == uint32(SPELL_FORGE_BLADE)) - { - events.RescheduleEvent(EVENT_SPELL_CHILLING_WAVE, 10000); - SetEquipmentSlots(false, EQUIP_ID_SWORD); - me->SetReactState(REACT_AGGRESSIVE); - me->SetControlled(false, UNIT_STATE_ROOT); - me->DisableRotate(false); - if (me->GetVictim()) - { - AttackStart(me->GetVictim()); - me->SetTarget(me->GetVictim()->GetGUID()); - } - } - else if (spell->Id == uint32(SPELL_FORGE_MACE)) - { - events.RescheduleEvent(EVENT_SPELL_DEEP_FREEZE, 10s); - SetEquipmentSlots(false, EQUIP_ID_MACE); - me->SetReactState(REACT_AGGRESSIVE); - me->SetControlled(false, UNIT_STATE_ROOT); - me->DisableRotate(false); - if (me->GetVictim()) - { - AttackStart(me->GetVictim()); - me->SetTarget(me->GetVictim()->GetGUID()); - } - } } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index c5d341dc9f..6bf24b4ab6 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -298,7 +298,7 @@ public: if (a == 1) { me->setActive(true); - events.RescheduleEvent(20, 0); + events.RescheduleEvent(20, 0ms); } } @@ -369,7 +369,7 @@ public: if (pInstance) { if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_TYRANNUS_EVENT_GUID))) - c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE + 10, false); + c->GetMotionMaster()->MoveWaypoint(PATH_BEGIN_VALUE + 10, false); if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_LEADER_FIRST_GUID))) c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_2 : SAY_SYLVANAS_KRICK_2); } @@ -404,7 +404,7 @@ public: case 8: Talk(SAY_OUTRO_KRICK_4); - events.RescheduleEvent(9, 1500); + events.RescheduleEvent(9, 1500ms); break; case 9: if (pInstance) @@ -430,7 +430,7 @@ public: if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_TYRANNUS_EVENT_GUID))) c->AI()->Talk(SAY_TYRANNUS_KRICK_2); - events.RescheduleEvent(11, 9000); + events.RescheduleEvent(11, 9s); break; case 11: if (pInstance) @@ -440,7 +440,7 @@ public: if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_LEADER_FIRST_GUID))) { c->AI()->Talk(c->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_KRICK_3 : SAY_SYLVANAS_KRICK_3); - c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE + 11, false); + c->GetMotionMaster()->MoveWaypoint(PATH_BEGIN_VALUE + 11, false); } } me->setActive(false); @@ -506,7 +506,7 @@ class spell_exploding_orb_auto_grow_aura : public AuraScript target->RemoveAurasDueToSpell(SPELL_AUTO_GROW); target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB_VISUAL); if (target->IsCreature()) - target->ToCreature()->DespawnOrUnsummon(2000); + target->ToCreature()->DespawnOrUnsummon(2s); } } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 1ea12a8314..007e52c576 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -108,7 +108,7 @@ public: { c->RemoveAura(46598); c->GetMotionMaster()->Clear(); - c->GetMotionMaster()->MovePath(PATH_BEGIN_VALUE + 18, true); + c->GetMotionMaster()->MoveWaypoint(PATH_BEGIN_VALUE + 18, true); } me->SetHomePosition(exitPos); me->GetMotionMaster()->MoveJump(exitPos, 10.0f, 2.0f); @@ -161,7 +161,7 @@ public: events.RescheduleEvent(EVENT_SPELL_UNHOLY_POWER, 1s); break; } - events.RepeatEvent(3000); + events.Repeat(3s); break; case EVENT_SPELL_UNHOLY_POWER: Talk(SAY_DARK_MIGHT); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index a83777d45f..e8a2d9253a 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -341,7 +341,7 @@ public: Unit::Kill(c, c, false); } - c->DespawnOrUnsummon(10000); + c->DespawnOrUnsummon(10s); } pInstance->SetData(DATA_INSTANCE_PROGRESS, INSTANCE_PROGRESS_FINISHED_INTRO); } @@ -551,7 +551,7 @@ public: while (FBSData[i].entry) { if (Creature* c = me->SummonCreature(FBSData[i].entry, 688.69f + i * 1.8f, FBSSpawnPos.GetPositionY() + (float)irand(-2, 2), FBSSpawnPos.GetPositionZ(), 3 * M_PI / 2)) - c->GetMotionMaster()->MovePath(FBSData[i].pathId, false); + c->GetMotionMaster()->MoveWaypoint(FBSData[i].pathId, false); ++i; } events.RescheduleEvent(2, 3s); @@ -674,14 +674,14 @@ public: switch (events.ExecuteEvent()) { case 1: - me->GetMotionMaster()->MovePoint(2, PTSTyrannusWaitPos1, false); + me->GetMotionMaster()->MovePoint(2, PTSTyrannusWaitPos1, FORCED_MOVEMENT_NONE, 0.f, false); break; case 2: me->SetFacingTo(PTSTyrannusWaitPos1.GetOrientation()); me->setActive(false); break; case 3: - me->GetMotionMaster()->MovePoint(3, PTSTyrannusWaitPos2, false); + me->GetMotionMaster()->MovePoint(3, PTSTyrannusWaitPos2, FORCED_MOVEMENT_NONE, 0.f, false); break; case 4: me->SetFacingTo(PTSTyrannusWaitPos2.GetOrientation()); @@ -690,7 +690,7 @@ public: me->GetMotionMaster()->MoveTakeoff(10, me->GetPositionX() + 2.0f * cos(me->GetOrientation()), me->GetPositionY() + 2.0f * std::sin(me->GetOrientation()), me->GetPositionZ() + 30.0f, 7.0f); break; case 6: - me->GetMotionMaster()->MovePoint(4, PTSTyrannusWaitPos3, false); + me->GetMotionMaster()->MovePoint(4, PTSTyrannusWaitPos3, FORCED_MOVEMENT_NONE, 0.f, false); break; case 30: { @@ -1082,7 +1082,7 @@ public: s->AddThreat(c, 0.0f); } } - events.RescheduleEvent(10, 3000); + events.RescheduleEvent(10, 3s); break; } @@ -1200,16 +1200,16 @@ public: switch (id) { - case 0: + case 1: Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_JAINA_OUTRO_2 : SAY_SYLVANAS_OUTRO_2); break; - case 1: + case 2: if (me->GetEntry() == NPC_JAINA_PART2) { Talk(SAY_JAINA_OUTRO_3); } break; - case 6: + case 7: me->SetNpcFlag(UNIT_NPC_FLAG_QUESTGIVER); if (GameObject* g = me->FindNearestGameObject(GO_HOR_PORTCULLIS, 50.0f)) g->SetGoState(GO_STATE_ACTIVE); @@ -1284,7 +1284,7 @@ public: events.RescheduleEvent(8, 2s); break; case 8: - me->GetMotionMaster()->MovePath(me->GetEntry() == NPC_JAINA_PART2 ? PATH_BEGIN_VALUE + 16 : PATH_BEGIN_VALUE + 17, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() == NPC_JAINA_PART2 ? PATH_BEGIN_VALUE + 16 : PATH_BEGIN_VALUE + 17, false); break; case 10: if (Creature* x = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_MARTIN_OR_GORKUN_GUID))) @@ -1355,7 +1355,7 @@ public: } } if (minDist < 200.0f * 200.0f) - _owner.GetMotionMaster()->MovePoint(0, slaveFreePos[pointId], true, false); + _owner.GetMotionMaster()->MovePoint(0, slaveFreePos[pointId], FORCED_MOVEMENT_NONE, 0.f, true, false); return true; } @@ -1381,9 +1381,9 @@ class spell_pos_slave_trigger_closest : public SpellScript target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); if (Creature* c = target->ToCreature()) { - c->DespawnOrUnsummon(7000); + c->DespawnOrUnsummon(7s); c->AI()->Talk(0, p); - c->m_Events.AddEvent(new SlaveRunEvent(*c), c->m_Events.CalculateTime(3000)); + c->m_Events.AddEventAtOffset(new SlaveRunEvent(*c), 3s); } } } @@ -1406,7 +1406,7 @@ class spell_pos_rimefang_frost_nova : public SpellScript { Unit::Kill(caster, target); if (target->IsCreature()) - target->ToCreature()->DespawnOrUnsummon(30000); + target->ToCreature()->DespawnOrUnsummon(30s); } } diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 18a30b7dbc..7e1a25d7d8 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -125,17 +125,18 @@ public: void Reset() override { BossAI::Reset(); - for (uint8 i = 0; i < 5; i++) - me->SummonCreature(NPC_LIVING_MOJO, mojoPosition[i].GetPositionX(), mojoPosition[i].GetPositionY(), mojoPosition[i].GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 0); - - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - } - - void InitializeAI() override - { - BossAI::InitializeAI(); - me->CastSpell(me, SPELL_FREEZE_ANIM, true); + if (!me->IsInEvadeMode()) + { + me->CastSpell(me, SPELL_FREEZE_ANIM, true); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + for (const auto & i : mojoPosition) + me->SummonCreature(NPC_LIVING_MOJO, i.GetPositionX(), i.GetPositionY(), i.GetPositionZ(), 0, TEMPSUMMON_MANUAL_DESPAWN, 0); + } + else + { + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + } } void JustReachedHome() override @@ -144,9 +145,9 @@ public: me->CastSpell(me, SPELL_FREEZE_ANIM, true); } - void JustEngagedWith(Unit* who) override + void ScheduleTasks() override { - BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_COLOSSUS_START_FIGHT, 1s); events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s); events.ScheduleEvent(EVENT_COLOSSUS_MORTAL_STRIKE, 7s); events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1s); @@ -159,8 +160,8 @@ public: { summon->SetRegeneratingHealth(false); summon->SetReactState(REACT_PASSIVE); - summon->m_Events.AddEvent(new RestoreFight(summon), summon->m_Events.CalculateTime(3000)); - if (events.GetNextEventTime(EVENT_COLOSSUS_HEALTH_2) == 0) + summon->m_Events.AddEventAtOffset(new RestoreFight(summon), 3s); + if (!events.HasTimeUntilEvent(EVENT_COLOSSUS_HEALTH_2)) { summon->SetHealth(summon->GetMaxHealth() / 2); summon->LowerPlayerDamageReq(summon->GetMaxHealth() / 2); @@ -183,6 +184,7 @@ public: summons.Despawn(summon); if (summon->GetEntry() == NPC_DRAKKARI_ELEMENTAL) { + me->SetHealth(me->GetMaxHealth() / 2); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM); if (me->GetVictim()) @@ -231,7 +233,7 @@ public: events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1s); break; case EVENT_COLOSSUS_HEALTH_2: - if (me->HealthBelowPct(21)) + if (me->HealthBelowPct(2)) { me->CastSpell(me, SPELL_EMERGE, false); me->CastSpell(me, SPELL_EMERGE_SUMMON, true); @@ -301,12 +303,12 @@ public: switch (events.ExecuteEvent()) { case EVENT_ELEMENTAL_HEALTH: - if (me->HealthBelowPct(51)) + if (me->HealthBelowPct(56)) { me->CastSpell(me, SPELL_FACE_ME, true); me->CastSpell(me, SPELL_SURGE_VISUAL, true); me->CastSpell(me, SPELL_MERGE, false); - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); events.Reset(); break; } @@ -315,7 +317,7 @@ public: case EVENT_ELEMENTAL_SURGE: Talk(SAY_SURGE); me->CastSpell(me, SPELL_SURGE_VISUAL, true); - me->CastSpell(me->GetVictim(), SPELL_SURGE, false); + DoCastRandomTarget(SPELL_SURGE, 0, 40, true, false, true); events.ScheduleEvent(EVENT_ELEMENTAL_SURGE, 15s); break; case EVENT_ELEMENTAL_VOLLEY: @@ -380,7 +382,7 @@ public: { me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->MoveCharge(1672.96f, 743.488f, 143.338f, 7.0f, POINT_MERGE); - me->DespawnOrUnsummon(1200); + me->DespawnOrUnsummon(1200ms); } } diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp index 5a4dbcd2cb..17d923c5e1 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp @@ -17,6 +17,7 @@ #include "CreatureScript.h" #include "ScriptedCreature.h" +#include "SpellInfo.h" #include "gundrak.h" enum Spells @@ -57,7 +58,7 @@ public: void InitializeAI() override { BossAI::InitializeAI(); - me->GetMotionMaster()->MovePoint(POINT_START, 1638.55f, 919.76f, 104.95f, false); + me->GetMotionMaster()->MovePoint(POINT_START, 1638.55f, 919.76f, 104.95f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false); me->SetHomePosition(1642.712f, 934.646f, 107.205f, 0.767f); me->SetReactState(REACT_PASSIVE); } @@ -71,6 +72,15 @@ public: } } + void SpellHitTarget(Unit* target, SpellInfo const* spell) override + { + if (spell->Id == SPELL_ECK_SPRING) + { + me->GetThreatMgr().ResetAllThreat(); + me->AddThreat(target, 1.0f); + } + } + void Reset() override { BossAI::Reset(); @@ -81,8 +91,8 @@ public: BossAI::JustEngagedWith(who); events.ScheduleEvent(EVENT_ECK_BERSERK, 60s, 90s); events.ScheduleEvent(EVENT_ECK_BITE, 5s); - events.ScheduleEvent(EVENT_ECK_SPIT, 10s); - events.ScheduleEvent(EVENT_ECK_SPRING, 8s); + events.ScheduleEvent(EVENT_ECK_SPIT, 10s, 37s); + events.ScheduleEvent(EVENT_ECK_SPRING, 10s, 24s); } void JustDied(Unit* killer) override @@ -120,17 +130,14 @@ public: break; case EVENT_ECK_SPIT: me->CastSpell(me->GetVictim(), SPELL_ECK_SPIT, false); - events.ScheduleEvent(EVENT_ECK_SPIT, 10s); + events.ScheduleEvent(EVENT_ECK_SPIT, 11s, 24s); break; case EVENT_ECK_SPRING: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true, false)) { - me->GetThreatMgr().ResetAllThreat(); - me->AddThreat(target, 500.0f); me->CastSpell(target, SPELL_ECK_SPRING, false); } - - events.ScheduleEvent(EVENT_ECK_SPRING, 5s, 10s); + events.ScheduleEvent(EVENT_ECK_SPRING, 10s, 24s); break; } diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp index 2a56ce8873..50f1e59198 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp @@ -49,175 +49,124 @@ enum Yells enum Events { - EVENT_STAMPEDE = 1, - EVENT_WHIRLING_SLASH = 2, - EVENT_PUNCTURE = 3, - EVENT_ENRAGE = 4, - EVENT_IMPALING_CHARGE = 5, - EVENT_UNSUMMON_RHINO = 6, - EVENT_STOMP = 7, - EVENT_KILL_TALK = 8 + EVENT_KILL_TALK = 1 }; -class boss_gal_darah : public CreatureScript +struct boss_gal_darah : public BossAI { -public: - boss_gal_darah() : CreatureScript("boss_gal_darah") { } + boss_gal_darah(Creature* creature) : BossAI(creature, DATA_GAL_DARAH) { } - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetGundrakAI<boss_gal_darahAI>(creature); + BossAI::Reset(); + DoCastSelf(SPELL_START_VISUAL); + impaledList.clear(); + _stampedeVictim.Clear(); } - struct boss_gal_darahAI : public BossAI + void JustReachedHome() override { - boss_gal_darahAI(Creature* creature) : BossAI(creature, DATA_GAL_DARAH) - { - } - - uint8 phaseCounter; - GuidSet impaledList; - - void Reset() override - { - BossAI::Reset(); - impaledList.clear(); - phaseCounter = 0; - } + BossAI::JustReachedHome(); + DoCastSelf(SPELL_START_VISUAL); + } - void InitializeAI() override + void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_TRANSFORM_TO_RHINO) { - BossAI::InitializeAI(); - me->CastSpell(me, SPELL_START_VISUAL, false); + ScheduleTimedEvent(8s, 11s, [&] { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) + { + DoCast(target, SPELL_IMPALING_CHARGE); + impaledList.insert(target->GetGUID()); + } + }, 16s, 17s); + + ScheduleTimedEvent(6s, 8s, [&] { + DoCastSelf(SPELL_ENRAGE); + }, 16s, 17s); + + ScheduleTimedEvent(7s, 10s, [&] { + DoCastAOE(SPELL_STOMP); + }, 10s, 12s); + + me->m_Events.AddEventAtOffset([&] { + scheduler.CancelAll(); + DoCastSelf(SPELL_TRANSFORM_TO_TROLL); + }, 32s); } - - void JustReachedHome() override + else if (spellInfo->Id == SPELL_TRANSFORM_TO_TROLL) { - BossAI::JustReachedHome(); - me->CastSpell(me, SPELL_START_VISUAL, false); + ScheduleEvents(); } + } - void ScheduleEvents(bool troll) - { - events.Reset(); - if (troll) - { - events.RescheduleEvent(EVENT_STAMPEDE, 10s); - events.RescheduleEvent(EVENT_WHIRLING_SLASH, 21s); - } - else + void ScheduleEvents() + { + ScheduleTimedEvent(10s, [&] { + Talk(SAY_SUMMON_RHINO); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) { - events.RescheduleEvent(EVENT_PUNCTURE, 10s); - events.RescheduleEvent(EVENT_ENRAGE, 15s); - events.RescheduleEvent(EVENT_IMPALING_CHARGE, 21s); - events.RescheduleEvent(EVENT_STOMP, 5s); + _stampedeVictim = target->GetGUID(); + DoCast(target, SPELL_STAMPEDE); } - } + }, 15s); - void JustEngagedWith(Unit* who) override - { - Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); - - ScheduleEvents(true); - me->RemoveAurasDueToSpell(SPELL_START_VISUAL); - me->InterruptNonMeleeSpells(true); - } + ScheduleTimedEvent(10s, 16s, [&] { + DoCastVictim(SPELL_PUNCTURE); + }, 15s, 18s); - void JustSummoned(Creature* summon) override - { - uint32 despawnTime = 0; - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 60.0f, true)) - { - summon->CastSpell(target, SPELL_STAMPEDE_DMG, true); - despawnTime = (summon->GetDistance(target) / 40.0f * 1000) + 500; - } + ScheduleTimedEvent(11s, 19s, [&] { + DoCastAOE(SPELL_WHIRLING_SLASH); + }, 17s, 19s); - summon->DespawnOrUnsummon(despawnTime); - } + me->m_Events.AddEventAtOffset([&] { + scheduler.CancelAll(); + DoCastSelf(SPELL_TRANSFORM_TO_RHINO); + }, 32s); + } - uint32 GetData(uint32 /*type*/) const override - { - return impaledList.size(); - } + void JustEngagedWith(Unit* who) override + { + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); - void JustDied(Unit* killer) override - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } + ScheduleEvents(); + me->RemoveAurasDueToSpell(SPELL_START_VISUAL); + me->InterruptNonMeleeSpells(true); + } - void KilledUnit(Unit*) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6s); - } - } + void JustSummoned(Creature* summon) override + { + if (Unit* target = ObjectAccessor::GetUnit(*me, _stampedeVictim)) + summon->CastSpell(target, SPELL_STAMPEDE_DMG, true); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + summons.Summon(summon); + } - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_CHARGING)) - return; + uint32 GetData(uint32 /*type*/) const override + { + return impaledList.size(); + } - switch (events.ExecuteEvent()) - { - case EVENT_STAMPEDE: - Talk(SAY_SUMMON_RHINO); - me->CastSpell(me->GetVictim(), SPELL_STAMPEDE, false); - events.ScheduleEvent(EVENT_STAMPEDE, 15s); - break; - case EVENT_WHIRLING_SLASH: - if (++phaseCounter >= 3) - { - ScheduleEvents(false); - me->CastSpell(me, SPELL_TRANSFORM_TO_RHINO, false); - Talk(SAY_TRANSFORM_1); - phaseCounter = 0; - return; - } - events.ScheduleEvent(EVENT_WHIRLING_SLASH, 21s); - me->CastSpell(me, SPELL_WHIRLING_SLASH, false); - break; - case EVENT_PUNCTURE: - me->CastSpell(me->GetVictim(), SPELL_PUNCTURE, false); - events.ScheduleEvent(EVENT_PUNCTURE, 8s); - break; - case EVENT_ENRAGE: - me->CastSpell(me, SPELL_ENRAGE, false); - events.ScheduleEvent(EVENT_ENRAGE, 20s); - break; - case EVENT_STOMP: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true)) - me->CastSpell(target, SPELL_STOMP, false); - events.ScheduleEvent(EVENT_STOMP, 20s); - break; - case EVENT_IMPALING_CHARGE: - if (++phaseCounter >= 3) - { - ScheduleEvents(true); - me->CastSpell(me, SPELL_TRANSFORM_TO_TROLL, false); - Talk(SAY_TRANSFORM_2); - phaseCounter = 0; - return; - } - events.ScheduleEvent(EVENT_IMPALING_CHARGE, 21s); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true, false)) - { - me->CastSpell(target, SPELL_IMPALING_CHARGE, false); - impaledList.insert(target->GetGUID()); - } - break; - } + void JustDied(Unit* killer) override + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } - DoMeleeAttackIfReady(); + void KilledUnit(Unit*) override + { + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) + { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6s); } - }; + } + +private: + GuidSet impaledList; + ObjectGuid _stampedeVictim; }; class spell_galdarah_impaling_charge : public SpellScript @@ -265,9 +214,7 @@ class spell_galdarah_transform : public SpellScript class achievement_share_the_love : public AchievementCriteriaScript { public: - achievement_share_the_love() : AchievementCriteriaScript("achievement_share_the_love") - { - } + achievement_share_the_love() : AchievementCriteriaScript("achievement_share_the_love") { } bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { @@ -280,7 +227,7 @@ public: void AddSC_boss_gal_darah() { - new boss_gal_darah(); + RegisterGundrakCreatureAI(boss_gal_darah); RegisterSpellScript(spell_galdarah_impaling_charge); RegisterSpellScript(spell_galdarah_transform); new achievement_share_the_love(); diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp index e0be1dd9d9..a9b989e6e4 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp @@ -92,12 +92,18 @@ public: BossAI::JustEngagedWith(who); me->CastSpell(me, SPELL_MOJO_FRENZY, true); - events.ScheduleEvent(EVENT_GROUND_TREMOR, 18s); - events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10s); + events.ScheduleEvent(EVENT_GROUND_TREMOR, 13s, 30s); + events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 8s, 38s); events.ScheduleEvent(EVENT_DETERMINED_STAB, 20s); events.ScheduleEvent(EVENT_TRANSFORMATION, 12s); } + void EnterEvadeMode(EvadeReason why) override + { + summons.DespawnAll(); + BossAI::EnterEvadeMode(why); + } + void SpellHitTarget(Unit* /*caster*/, SpellInfo const* spellInfo) override { if (spellInfo->Id == SPELL_TRANSFORMATION) @@ -113,12 +119,13 @@ public: { Talk(SAY_DEATH); Talk(EMOTE_ALTAR); + BossAI::JustDied(killer); } void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_SLAY); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -144,29 +151,52 @@ public: if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_GROUND_TREMOR: - if (roll_chance_i(50)) - Talk(SAY_QUAKE); - me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_QUAKE : SPELL_GROUND_TREMOR, false); - events.ScheduleEvent(EVENT_GROUND_TREMOR, 10s); - break; - case EVENT_NUMBLING_SHOUT: - me->CastSpell(me, me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_NUMBING_ROAR : SPELL_NUMBING_SHOUT, false); - events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10s); - break; - case EVENT_DETERMINED_STAB: - me->CastSpell(me->GetVictim(), me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_DETERMINED_GORE : SPELL_DETERMINED_STAB, false); - events.ScheduleEvent(EVENT_DETERMINED_STAB, 8s); - break; - case EVENT_TRANSFORMATION: - Talk(EMOTE_TRANSFORM); - Talk(SAY_TRANSFORM); - me->CastSpell(me, SPELL_TRANSFORMATION, false); - me->CastSpell(me, SPELL_SUMMON_PHANTOM_TRANSFORM, true); - events.ScheduleEvent(EVENT_TRANSFORMATION, 10s); - break; + switch (eventId) + { + case EVENT_GROUND_TREMOR: + if (roll_chance_i(50)) + Talk(SAY_QUAKE); + + if (me->GetDisplayId() != me->GetNativeDisplayId()) + { + me->CastSpell(me, SPELL_QUAKE, false); + events.ScheduleEvent(EVENT_GROUND_TREMOR, 16s, 63s); + } + else + { + me->CastSpell(me, SPELL_GROUND_TREMOR, false); + events.ScheduleEvent(EVENT_GROUND_TREMOR, 13s, 27s); + } + return; + + case EVENT_NUMBLING_SHOUT: + if (me->GetDisplayId() != me->GetNativeDisplayId()) + { + me->CastSpell(me, SPELL_NUMBING_ROAR, false); + events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 8s, 54s); + } + else + { + me->CastSpell(me, SPELL_NUMBING_SHOUT, false); + events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 6s, 27s); + } + return; + + case EVENT_DETERMINED_STAB: + me->CastSpell(me->GetVictim(), me->GetDisplayId() != me->GetNativeDisplayId() ? SPELL_DETERMINED_GORE : SPELL_DETERMINED_STAB, false); + events.ScheduleEvent(EVENT_DETERMINED_STAB, 8s); + return; + + case EVENT_TRANSFORMATION: + Talk(EMOTE_TRANSFORM); + Talk(SAY_TRANSFORM); + me->CastSpell(me, SPELL_TRANSFORMATION, false); + me->CastSpell(me, SPELL_SUMMON_PHANTOM_TRANSFORM, true); + events.ScheduleEvent(EVENT_TRANSFORMATION, 10s); + return; + } } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp index 5bf51b7c91..0229bab9e8 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp @@ -137,7 +137,7 @@ public: void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_SLAY); events.ScheduleEvent(EVENT_KILL_TALK, 6s); diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h index 8d38819eab..7e0ffa41a0 100644 --- a/src/server/scripts/Northrend/Gundrak/gundrak.h +++ b/src/server/scripts/Northrend/Gundrak/gundrak.h @@ -30,16 +30,21 @@ enum Data DATA_MOORABI = 1, DATA_DRAKKARI_COLOSSUS = 2, DATA_GAL_DARAH = 3, - DATA_ECK_THE_FEROCIOUS_INIT = 4, - DATA_ECK_THE_FEROCIOUS = 5, - MAX_ENCOUNTERS = 6 + DATA_ECK_THE_FEROCIOUS = 4, + MAX_ENCOUNTERS = 5 }; enum Creatures { + NPC_RUINS_DWELLER = 29920, NPC_ECK_THE_FEROCIOUS = 29932 }; +enum GDTexts +{ + EMOTE_SUMMON_ECK = 0 +}; + enum GameObjects { GO_ALTAR_OF_SLAD_RAN = 192518, @@ -66,4 +71,6 @@ inline AI* GetGundrakAI(T* obj) return GetInstanceAI<AI>(obj, GundrakScriptName); } +#define RegisterGundrakCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetGundrakAI) + #endif diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp index f8a87b2530..422303298e 100644 --- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp +++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp @@ -15,6 +15,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "CreatureGroups.h" #include "InstanceMapScript.h" #include "ScriptedCreature.h" #include "gundrak.h" @@ -137,13 +138,6 @@ public: { switch (type) { - case NPC_ECK_THE_FEROCIOUS: - if (GetBossState(DATA_ECK_THE_FEROCIOUS_INIT) != DONE) - { - SetBossState(DATA_ECK_THE_FEROCIOUS_INIT, NOT_STARTED); - SetBossState(DATA_ECK_THE_FEROCIOUS_INIT, DONE); - } - break; case GO_ALTAR_OF_SLAD_RAN: if (GameObject* statue = instance->GetGameObject(_bridgeGUIDs[0])) statue->SetGoState(GO_STATE_READY); @@ -194,19 +188,36 @@ public: if (GameObject* altar = instance->GetGameObject(_drakkariAltarGUID)) altar->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); break; - case DATA_ECK_THE_FEROCIOUS_INIT: - { - Position pos = {1624.70f, 891.43f, 95.08f, 1.2f}; - if (instance->IsHeroic()) - instance->SummonCreature(NPC_ECK_THE_FEROCIOUS, pos); - break; - } } return true; } + void OnUnitDeath(Unit* unit) override + { + if (!instance->IsHeroic() || !unit->EntryEquals(NPC_RUINS_DWELLER) || IsBossDone(DATA_ECK_THE_FEROCIOUS)) + return; + + if (Creature* dweller = unit->ToCreature()) + if (CreatureGroup* formation = dweller->GetFormation()) + { + scheduler.CancelAll(); + scheduler.Schedule(1s, [this, dweller, formation](TaskContext /*context*/) + { + if (!formation->IsAnyMemberAlive()) + { + if (dweller) + dweller->AI()->Talk(EMOTE_SUMMON_ECK); + + instance->SummonCreature(NPC_ECK_THE_FEROCIOUS, { 1624.70f, 891.43f, 95.08f, 1.2f }); + } + }); + } + } + void Update(uint32 diff) override { + scheduler.Update(diff); + if (!_activateTimer) return; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 7f18b8474c..f349760291 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -375,7 +375,7 @@ public: me->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); me->SetReactState(REACT_AGGRESSIVE); me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why - me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); + me->m_Events.AddEventAtOffset(new StandUpEvent(*me), 1s); DoAction(ACTION_REMOVE_INVOCATION); me->SetHealth(1); break; @@ -645,7 +645,7 @@ public: me->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); me->SetReactState(REACT_AGGRESSIVE); me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why - me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); + me->m_Events.AddEventAtOffset(new StandUpEvent(*me), 1s); DoAction(ACTION_REMOVE_INVOCATION); me->SetHealth(1); break; @@ -889,7 +889,7 @@ public: summon->CastSpell(summon, SPELL_KINETIC_BOMB, true, nullptr, nullptr, me->GetGUID()); break; case NPC_SHOCK_VORTEX: - summon->m_Events.AddEvent(new ShockVortexExplodeEvent(*summon), summon->m_Events.CalculateTime(4500)); + summon->m_Events.AddEventAtOffset(new ShockVortexExplodeEvent(*summon), 4500ms); break; default: break; @@ -939,7 +939,7 @@ public: me->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH); me->SetReactState(REACT_AGGRESSIVE); me->ForceValuesUpdateAtIndex(UNIT_NPC_FLAGS); // was in sniff. don't ask why - me->m_Events.AddEvent(new StandUpEvent(*me), me->m_Events.CalculateTime(1000)); + me->m_Events.AddEventAtOffset(new StandUpEvent(*me), 1s); me->SetHealth(me->GetMaxHealth()); DoAction(ACTION_CAST_INVOCATION); break; @@ -1213,7 +1213,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void UpdateAI(uint32 diff) override @@ -1287,13 +1287,13 @@ public: me->SetControlled(true, UNIT_STATE_ROOT); me->StopMoving(); me->CastSpell(me, SPELL_FLAMES, true); - me->DespawnOrUnsummon(999); + me->DespawnOrUnsummon(999ms); me->CastSpell(me, SPELL_FLAME_SPHERE_DEATH_EFFECT, true); _exploded = true; } } - void SetGUID(ObjectGuid guid, int32 /*type*/) override + void SetGUID(ObjectGuid const& guid, int32 /*type*/) override { _chaseGUID = guid; } @@ -1331,7 +1331,7 @@ public: me->SetInCombatWithZone(); return; } - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void DamageDealt(Unit* target, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override @@ -1424,7 +1424,7 @@ public: case EVENT_BOMB_DESPAWN: me->RemoveAllAuras(); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(exploded ? 5000 : 0); + me->DespawnOrUnsummon(exploded ? 5s : 0ms); break; case EVENT_CONTINUE_FALLING: me->GetMotionMaster()->MovementExpired(false); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index 5deccbc0b1..5994776980 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -533,7 +533,7 @@ public: return _bloodboltedPlayers.count(guid) != 0; } - void SetGUID(ObjectGuid guid, int32 type = 0) override + void SetGUID(ObjectGuid const& guid, int32 type = 0) override { switch (type) { diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index f0172727b4..4ae1a2e36a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -118,9 +118,6 @@ enum Spells SPELL_ACHIEVEMENT = 72928, }; -// Helper to get id of the aura on different modes (HasAura(baseId) wont work) -#define BOILING_BLOOD_HELPER RAID_MODE<int32>(72385, 72441, 72442, 72443) - enum EventTypes { EVENT_INTRO_ALLIANCE_1 = 1, @@ -583,14 +580,14 @@ public: { me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY); me->SetDisableGravity(false); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 10.0f); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 539.2917f, FORCED_MOVEMENT_NONE, 10.0f); for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) (*itr)->AI()->DoAction(ACTION_DESPAWN); /*Talk(SAY_OUTRO_HORDE_1); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_1, 10000); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 18000); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 24000);*/ + _events.ScheduleEvent(EVENT_OUTRO_HORDE_1, 10s); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_2, 18s); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_3, 24s);*/ } break; case ACTION_EVADE: @@ -651,8 +648,8 @@ public: deathbringer->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); deathbringer->setDeathState(DeathState::Alive); } - _events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 1000); - _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 4000); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_4, 1s); + _events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 4s); break; case POINT_FINAL: if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_DEATHBRINGER_SAURFANG))) @@ -845,7 +842,7 @@ public: { me->RemoveAurasDueToSpell(SPELL_GRIP_OF_AGONY); me->SetDisableGravity(false); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 539.2917f, 10.0f); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 539.2917f, FORCED_MOVEMENT_NONE, 10.0f); for (std::list<Creature*>::iterator itr = _guardList.begin(); itr != _guardList.end(); ++itr) (*itr)->AI()->DoAction(ACTION_DESPAWN); @@ -1030,7 +1027,7 @@ public: me->GetMotionMaster()->MoveCharge(chargePos[_index].GetPositionX(), chargePos[_index].GetPositionY(), chargePos[_index].GetPositionZ(), 13.0f, POINT_CHARGE); } else if (action == ACTION_DESPAWN) - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } private: diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 923b9a341f..ff86ed409d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -19,7 +19,10 @@ #include "CreatureScript.h" #include "ObjectMgr.h" #include "ScriptedCreature.h" +#include "SharedDefines.h" #include "SpellAuras.h" +#include "SpellInfo.h" +#include "SpellScript.h" #include "SpellScriptLoader.h" #include "icecrown_citadel.h" #include "SpellAuraEffects.h" @@ -57,10 +60,6 @@ enum Spells SPELL_PLAGUE_STENCH = 71805, }; -// Used for HasAura checks -#define PUNGENT_BLIGHT_HELPER RAID_MODE<uint32>(69195, 71219, 73031, 73032) -#define INOCULATED_HELPER RAID_MODE<uint32>(69291, 72101, 72102, 72103) - uint32 const gaseousBlight[3] = {69157, 69162, 69164}; uint32 const gaseousBlightVisual[3] = {69126, 69152, 69154}; @@ -168,19 +167,6 @@ public: Talk(SAY_KILL); } - void SpellHitTarget(Unit* target, SpellInfo const* spell) override - { - if (spell->Id == PUNGENT_BLIGHT_HELPER) - target->RemoveAurasDueToSpell(INOCULATED_HELPER); - else if (Player* p = target->ToPlayer()) - { - // Gaseous Blight damage - if (((spell->Id == 69159 || spell->Id == 70136 || spell->Id == 69161 || spell->Id == 70139 || spell->Id == 69163 || spell->Id == 70469) && p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_10) == QUEST_STATUS_INCOMPLETE) || - ((spell->Id == 70135 || spell->Id == 70138 || spell->Id == 70468 || spell->Id == 70137 || spell->Id == 70140 || spell->Id == 70470) && p->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_25) == QUEST_STATUS_INCOMPLETE)) - p->CastSpell(p, SPELL_ORANGE_BLIGHT_RESIDUE, true); - } - } - void RemoveBlight() { if (Creature* gasDummy = ObjectAccessor::GetCreature(*me, _gasDummyGUID)) @@ -233,7 +219,7 @@ public: Talk(EMOTE_GAS_SPORE); me->CastCustomSpell(SPELL_GAS_SPORE, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 3, 2, 3), me); events.ScheduleEvent(EVENT_GAS_SPORE, 40s, 45s); - events.DelayEventsToMax(20000, 1); // delay EVENT_VILE_GAS + events.DelayEventsToMax(20s, 1); // delay EVENT_VILE_GAS break; case EVENT_VILE_GAS: { @@ -313,8 +299,15 @@ class spell_festergut_pungent_blight : public SpellScript professor->AI()->DoAction(ACTION_FESTERGUT_GAS); } + void HandleHit(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + target->RemoveAurasDueToSpell(sSpellMgr->GetSpellIdForDifficulty(SPELL_INOCULATED, GetCaster())); + } + void Register() override { + OnEffectHitTarget += SpellEffectFn(spell_festergut_pungent_blight::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); OnEffectHitTarget += SpellEffectFn(spell_festergut_pungent_blight::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -378,6 +371,34 @@ class spell_festergut_gastric_bloat : public SpellScript } }; +class spell_festergut_gaseous_blight : public SpellScript +{ + PrepareSpellScript(spell_festergut_gaseous_blight); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_ORANGE_BLIGHT_RESIDUE }); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* p = GetHitUnit()->ToPlayer()) + { + if (Map* map = GetCaster()->GetMap()) + { + uint32 questId = map->Is25ManRaid() ? QUEST_RESIDUE_RENDEZVOUS_25 : QUEST_RESIDUE_RENDEZVOUS_10; + if (p->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE) + p->CastSpell(p, SPELL_ORANGE_BLIGHT_RESIDUE, true); + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_festergut_gaseous_blight::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + class achievement_flu_shot_shortage : public AchievementCriteriaScript { public: @@ -468,6 +489,7 @@ void AddSC_boss_festergut() RegisterSpellScript(spell_festergut_pungent_blight); RegisterSpellScript(spell_festergut_blighted_spores_aura); RegisterSpellScript(spell_festergut_gastric_bloat); + RegisterSpellScript(spell_festergut_gaseous_blight); new achievement_flu_shot_shortage(); new npc_stinky_icc(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 51969299bc..b61bdc3178 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -373,7 +373,7 @@ class BattleExperienceEvent : public BasicEvent { public: static uint32 const ExperiencedSpells[5]; - static uint32 const ExperiencedTimes[5]; + static Milliseconds const ExperiencedTimes[5]; BattleExperienceEvent(Creature* creature) : _creature(creature), _level(0) { } @@ -388,7 +388,8 @@ public: _creature->CastSpell(_creature, ExperiencedSpells[_level], true); if (_level < (_creature->GetMap()->IsHeroic() ? 4 : 3)) { - _creature->m_Events.AddEvent(this, timer + ExperiencedTimes[_level]); + Milliseconds nextExperienceEventTime = Milliseconds(timer) + ExperiencedTimes[_level]; + _creature->m_Events.AddEventAtOffset(this, nextExperienceEventTime); return false; } @@ -401,7 +402,7 @@ private: }; uint32 const BattleExperienceEvent::ExperiencedSpells[5] = { 0, SPELL_EXPERIENCED, SPELL_VETERAN, SPELL_ELITE, SPELL_ADDS_BERSERK }; -uint32 const BattleExperienceEvent::ExperiencedTimes[5] = { 100000, 70000, 60000, 90000, 0 }; +Milliseconds const BattleExperienceEvent::ExperiencedTimes[5] = { 100s, 70s, 60s, 90s, 0ms }; class PassengerController { @@ -503,7 +504,7 @@ public: float x, y, z, o; _dest.GetPosition(x, y, z, o); _owner->GetTransport()->CalculatePassengerPosition(x, y, z, &o); - _owner->GetMotionMaster()->MovePoint(EVENT_CHARGE_PREPATH, x, y, z, false); + _owner->GetMotionMaster()->MovePoint(EVENT_CHARGE_PREPATH, x, y, z, FORCED_MOVEMENT_NONE, 0.f, false); return true; } @@ -668,14 +669,14 @@ public: continue; Creature* c = (*itr)->ToCreature(); if (c->GetEntry() == NPC_SKYBREAKER_MARINE || c->GetEntry() == NPC_SKYBREAKER_SERGEANT || c->GetEntry() == NPC_KOR_KRON_REAVER || c->GetEntry() == NPC_KOR_KRON_SERGEANT) - c->DespawnOrUnsummon(1); + c->DespawnOrUnsummon(1ms); } } } else { uint32 teleportSpellId = _teamIdInInstance == TEAM_HORDE ? SPELL_TELEPORT_PLAYERS_ON_RESET_H : SPELL_TELEPORT_PLAYERS_ON_RESET_A; - me->m_Events.AddEvent(new ResetEncounterEvent(me, teleportSpellId, _instance->GetGuidData(DATA_ENEMY_GUNSHIP)), me->m_Events.CalculateTime(8000)); + me->m_Events.AddEventAtOffset(new ResetEncounterEvent(me, teleportSpellId, _instance->GetGuidData(DATA_ENEMY_GUNSHIP)), 8s); } } @@ -703,7 +704,7 @@ public: } } - void SetGUID(ObjectGuid guid, int32 id/* = 0*/) override + void SetGUID(ObjectGuid const& guid, int32 id/* = 0*/) override { if (id != ACTION_SHIP_VISITS_ENEMY && id != ACTION_SHIP_VISITS_SELF) return; @@ -847,7 +848,7 @@ public: { time_t now = GameTime::GetGameTime().count(); if (_firstMageCooldown > now) - _events.ScheduleEvent(EVENT_SUMMON_MAGE, (_firstMageCooldown - now) * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_SUMMON_MAGE, Seconds(_firstMageCooldown - now)); else _events.ScheduleEvent(EVENT_SUMMON_MAGE, 1ms); } @@ -880,7 +881,7 @@ public: init.DisableTransportPathTransformations(); init.MovebyPath(path, 0); init.Launch(); - me->DespawnOrUnsummon(18000); + me->DespawnOrUnsummon(18s); } } @@ -915,7 +916,7 @@ public: { float x, y, z, o; me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + me->GetMotionMaster()->MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.f, false); } } else @@ -1072,7 +1073,7 @@ public: { float x, y, z, o; me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + me->GetMotionMaster()->MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.f, false); } } } @@ -1183,7 +1184,7 @@ public: { time_t now = GameTime::GetGameTime().count(); if (_firstMageCooldown > now) - _events.ScheduleEvent(EVENT_SUMMON_MAGE, (_firstMageCooldown - now) * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_SUMMON_MAGE, Seconds(_firstMageCooldown - now)); else _events.ScheduleEvent(EVENT_SUMMON_MAGE, 1ms); } @@ -1216,7 +1217,7 @@ public: init.DisableTransportPathTransformations(); init.MovebyPath(path, 0); init.Launch(); - me->DespawnOrUnsummon(18000); + me->DespawnOrUnsummon(18s); } } @@ -1251,7 +1252,7 @@ public: { float x, y, z, o; me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + me->GetMotionMaster()->MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.f, false); } } else @@ -1411,7 +1412,7 @@ public: { float x, y, z, o; me->GetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(0, x, y, z, false); + me->GetMotionMaster()->MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.f, false); } } } @@ -1518,7 +1519,7 @@ struct gunship_npc_AI : public ScriptedAI me->SetTransportHomePosition(Slot->TargetPosition); me->GetTransport()->CalculatePassengerPosition(x, y, z, &o); me->SetHomePosition(x, y, z, o); - me->GetMotionMaster()->MovePoint(EVENT_CHARGE_PREPATH, x, y, z, false); + me->GetMotionMaster()->MovePoint(EVENT_CHARGE_PREPATH, x, y, z, FORCED_MOVEMENT_NONE, 0.f, false); } } @@ -1544,7 +1545,7 @@ struct gunship_npc_AI : public ScriptedAI if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH && Slot) { me->SetFacingTo(Slot->TargetPosition.GetOrientation()); - me->m_Events.AddEvent(new BattleExperienceEvent(me), me->m_Events.CalculateTime(BattleExperienceEvent::ExperiencedTimes[0])); + me->m_Events.AddEventAtOffset(new BattleExperienceEvent(me), BattleExperienceEvent::ExperiencedTimes[0]); me->CastSpell(me, SPELL_BATTLE_EXPERIENCE, true); me->SetReactState(REACT_AGGRESSIVE); } @@ -1579,7 +1580,7 @@ struct npc_gunship_boarding_addAI : public ScriptedAI { SetSlotInfo(data); me->SetReactState(REACT_PASSIVE); - me->m_Events.AddEvent(new DelayedMovementEvent(me, Slot->TargetPosition), me->m_Events.CalculateTime(3000 * (Index - SLOT_MARINE_1))); + me->m_Events.AddEventAtOffset(new DelayedMovementEvent(me, Slot->TargetPosition), Milliseconds(3000 * (Index - SLOT_MARINE_1))); } } @@ -1608,7 +1609,7 @@ struct npc_gunship_boarding_addAI : public ScriptedAI if (type == POINT_MOTION_TYPE && pointId == EVENT_CHARGE_PREPATH && Slot) { me->SetFacingTo(Slot->TargetPosition.GetOrientation()); - me->m_Events.AddEvent(new BattleExperienceEvent(me), me->m_Events.CalculateTime(BattleExperienceEvent::ExperiencedTimes[0])); + me->m_Events.AddEventAtOffset(new BattleExperienceEvent(me), BattleExperienceEvent::ExperiencedTimes[0]); me->CastSpell(me, SPELL_BATTLE_EXPERIENCE, true); me->SetReactState(REACT_AGGRESSIVE); @@ -2271,7 +2272,7 @@ class spell_igb_overheat_aura : public AuraScript WorldPacket data(SMSG_CLIENT_CONTROL_UPDATE, GetUnitOwner()->GetPackGUID().size() + 1); data << GetUnitOwner()->GetPackGUID(); data << uint8(value); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 54b279510d..a29cc2cc6b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -482,7 +482,7 @@ public: minrange = summon->GetExactDist(p); } - summon->ToTempSummon()->DespawnOrUnsummon(30000); + summon->ToTempSummon()->DespawnOrUnsummon(30s); } else { @@ -522,7 +522,7 @@ public: darnavan->GetMotionMaster()->MoveIdle(); darnavan->StopMoving(); darnavan->SetReactState(REACT_PASSIVE); - darnavan->m_Events.AddEvent(new DaranavanMoveEvent(*darnavan), darnavan->m_Events.CalculateTime(10000)); + darnavan->m_Events.AddEventAtOffset(new DaranavanMoveEvent(*darnavan), 10s); darnavan->AI()->Talk(SAY_DARNAVAN_RESCUED); if (Player* owner = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) { @@ -949,7 +949,7 @@ public: me->GetMotionMaster()->MovementExpired(); me->StopMoving(); me->SetControlled(true, UNIT_STATE_STUNNED); - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); break; default: break; @@ -977,7 +977,7 @@ public: if (!me->GetVictim() || me->GetVictim()->GetGUID() != targetGUID) { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); return; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 7faa41fd27..53a73a8fe0 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -206,8 +206,8 @@ public: if (Aura* pStorm = me->GetAura(SPELL_BONE_STORM)) pStorm->SetDuration(int32(_boneStormDuration)); events.ScheduleEvent(EVENT_BONE_STORM_MOVE, 0ms); - events.ScheduleEvent(EVENT_END_BONE_STORM, _boneStormDuration + 1); - } + events.ScheduleEvent(EVENT_END_BONE_STORM, Milliseconds(_boneStormDuration + 1)); + } break; case EVENT_BONE_STORM_MOVE: { @@ -397,7 +397,7 @@ public: trapped->NearTeleportTo(exitPos.GetPositionX(), exitPos.GetPositionY(), exitPos.GetPositionZ(), exitPos.GetOrientation(), false); } - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void JustDied(Unit* /*killer*/) override @@ -429,7 +429,7 @@ public: summonerUnit->SetPetGUID(petGUID); summonerUnit->GetMotionMaster()->Clear(); summonerUnit->StopMoving(); - events.ScheduleEvent(1, 8000); + events.ScheduleEvent(1, 8s); hasTrappedUnit = true; } } @@ -451,13 +451,13 @@ public: } else { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); return; } } else { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); return; } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index cb93c1bf6b..cdcc909606 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -352,7 +352,7 @@ public: { if (summon->GetEntry() != 38308 && summon->GetEntry() != 38309 && (!me->IsInCombat() || me->IsInEvadeMode())) { - summon->DespawnOrUnsummon(1); + summon->DespawnOrUnsummon(1ms); return; } @@ -566,14 +566,14 @@ public: { SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_CREATE_CONCOCTION); me->CastSpell(me, SPELL_CREATE_CONCOCTION, false); - events.ScheduleEvent(EVENT_PHASE_TRANSITION, sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 2250); + events.ScheduleEvent(EVENT_PHASE_TRANSITION, Milliseconds(sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 2250)); break; } case 3: { SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_GUZZLE_POTIONS); me->CastSpell(me, SPELL_GUZZLE_POTIONS, false); - events.ScheduleEvent(EVENT_PHASE_TRANSITION, sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 2250); + events.ScheduleEvent(EVENT_PHASE_TRANSITION, Milliseconds(sSpellMgr->GetSpellForDifficultyFromSpell(spell, me)->CalcCastTime() + 2250)); break; } default: @@ -670,8 +670,8 @@ public: void ChangePhase() { - uint32 heroicDelay = (IsHeroic() ? 25000 : 0); - events.DelayEvents(24000 + heroicDelay, EVENT_GROUP_ABILITIES); + Milliseconds heroicDelay = (IsHeroic() ? 25s : 0ms); + events.DelayEvents(24s + heroicDelay, EVENT_GROUP_ABILITIES); me->AttackStop(); if (!IsHeroic()) { @@ -715,8 +715,8 @@ public: { case 1: _phase = 2; - events.ScheduleEvent(EVENT_MALLEABLE_GOO, urand(25000, 28000) + heroicDelay, EVENT_GROUP_ABILITIES); - events.ScheduleEvent(EVENT_CHOKING_GAS_BOMB, urand(35000, 40000) + heroicDelay, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_MALLEABLE_GOO, randtime(25s, 28s) + heroicDelay, EVENT_GROUP_ABILITIES); + events.ScheduleEvent(EVENT_CHOKING_GAS_BOMB, randtime(35s, 40s) + heroicDelay, EVENT_GROUP_ABILITIES); break; case 2: _phase = 3; @@ -745,7 +745,7 @@ public: ObjectGuid targetGUID; - void SetGUID(ObjectGuid guid, int32 type) override + void SetGUID(ObjectGuid const& guid, int32 type) override { if (type == -1) targetGUID = guid; @@ -757,7 +757,7 @@ public: if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) { if (!professor->IsInCombat()) - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); else professor->AI()->JustSummoned(me); } @@ -1056,7 +1056,7 @@ class spell_putricide_ooze_channel : public SpellScript if (targets.empty()) { FinishCast(SPELL_FAILED_NO_VALID_TARGETS); - GetCaster()->ToCreature()->DespawnOrUnsummon(1); // despawn next update + GetCaster()->ToCreature()->DespawnOrUnsummon(1ms); // despawn next update return; } @@ -1491,7 +1491,7 @@ class spell_putricide_eat_ooze : public SpellScript { target->RemoveAurasDueToSpell(SPELL_GROW_STACKER); target->RemoveAura(grow); - target->DespawnOrUnsummon(1); + target->DespawnOrUnsummon(1ms); } else grow->ModStackAmount(-4); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index e9e7acfbd4..58509fe5d8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -72,8 +72,6 @@ enum Spells SPELL_AWAKEN_PLAGUED_ZOMBIES = 71159, }; -#define MUTATED_INFECTION RAID_MODE<int32>(69674, 71224, 73022, 73023) - enum Events { EVENT_NONE, @@ -131,13 +129,13 @@ public: { } - uint32 infectionCooldown; + Milliseconds infectionCooldown; ObjectGuid _oozeFloodDummyGUIDs[4][2]; uint8 _oozeFloodStage; void Reset() override { - infectionCooldown = 14000; + infectionCooldown = 14s; for (uint8 i = 0; i < 4; ++i) for (uint8 j = 0; j < 2; ++j) @@ -193,7 +191,7 @@ public: void JustDied(Unit* /*killer*/) override { - instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION); + instance->DoRemoveAurasDueToSpellOnPlayers(sSpellMgr->GetSpellIdForDifficulty(SPELL_MUTATED_INFECTION, me)); _JustDied(); Talk(SAY_DEATH); if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) @@ -211,7 +209,7 @@ public: if (me->IsAlive() && me->IsInCombat() && !me->IsInEvadeMode()) summons.Summon(summon); else - summon->DespawnOrUnsummon(1); + summon->DespawnOrUnsummon(1ms); } void KilledUnit(Unit* victim) override @@ -283,14 +281,14 @@ public: DoCastSelf(SPELL_SLIME_SPRAY); } } - events.DelayEvents(1); + events.DelayEvents(1ms); events.ScheduleEvent(EVENT_SLIME_SPRAY, 20s); events.ScheduleEvent(EVENT_UNROOT, 0ms); break; case EVENT_HASTEN_INFECTIONS: - if (infectionCooldown >= 8000) + if (infectionCooldown >= 8s) { - infectionCooldown -= 2000; + infectionCooldown -= 2s; events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90s); } break; @@ -373,7 +371,7 @@ public: { if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ROTFACE))) rotface->AI()->SummonedCreatureDespawn(me); - me->DespawnOrUnsummon(0); + me->DespawnOrUnsummon(0ms); } void UpdateAI(uint32 diff) override @@ -798,7 +796,7 @@ class spell_rotface_unstable_ooze_explosion_suicide_aura : public AuraScript target->SetVisible(false); target->RemoveAllAuras(); //target->ToCreature()->DespawnOrUnsummon(); - target->ToCreature()->DespawnOrUnsummon(60000); + target->ToCreature()->DespawnOrUnsummon(60s); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 884cda64a8..2237cf87f6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -384,7 +384,7 @@ public: me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->SetSpeed(MOVE_RUN, 4.28571f); float moveTime = me->GetExactDist(&SindragosaFlyInPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); - me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SindragosaLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); + me->m_Events.AddEventAtOffset(new FrostwyrmLandEvent(*me, SindragosaLandPos), Milliseconds(uint32(moveTime) + 250)); me->GetMotionMaster()->MovePoint(POINT_FROSTWYRM_FLY_IN, SindragosaFlyInPos); if (!instance->GetData(DATA_SINDRAGOSA_INTRO)) @@ -478,7 +478,7 @@ public: { summons.Summon(summon); if (summon->GetEntry() == NPC_FROST_BOMB) - summon->m_Events.AddEvent(new FrostBombExplosion(summon, me->GetGUID()), summon->m_Events.CalculateTime(5500)); + summon->m_Events.AddEventAtOffset(new FrostBombExplosion(summon, me->GetGUID()), 5500ms); } void SummonedCreatureDespawn(Creature* summon) override @@ -523,7 +523,7 @@ public: me->SetControlled(true, UNIT_STATE_ROOT); me->SendMovementFlagUpdate(); me->CastSpell(me->GetVictim(), SPELL_TAIL_SMASH, false); - events.DelayEventsToMax(1, 0); + events.DelayEventsToMax(1ms, 0); events.ScheduleEvent(EVENT_UNROOT, 0ms); events.ScheduleEvent(EVENT_TAIL_SMASH, 22s, 27s, EVENT_GROUP_LAND_PHASE); break; @@ -532,7 +532,7 @@ public: me->SetControlled(true, UNIT_STATE_ROOT); me->SendMovementFlagUpdate(); me->CastSpell(me->GetVictim(), _isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, false); - events.DelayEventsToMax(1, 0); + events.DelayEventsToMax(1ms, 0); events.ScheduleEvent(EVENT_UNROOT, 0ms); events.ScheduleEvent(EVENT_FROST_BREATH, 20s, 25s, EVENT_GROUP_LAND_PHASE); break; @@ -547,11 +547,10 @@ public: break; case EVENT_ICY_GRIP: me->CastSpell((Unit*)nullptr, SPELL_ICY_GRIP, false); - events.DelayEventsToMax(1001, 0); + events.DelayEventsToMax(1001ms, 0); events.ScheduleEvent(EVENT_BLISTERING_COLD, 1s, EVENT_GROUP_LAND_PHASE); - if (uint32 evTime = events.GetNextEventTime(EVENT_ICE_TOMB)) - if (events.GetTimer() > evTime || evTime - events.GetTimer() < 7000) - events.RescheduleEvent(EVENT_ICE_TOMB, 7s); + if (events.GetTimeUntilEvent(EVENT_ICE_TOMB) < 7s) + events.RescheduleEvent(EVENT_ICE_TOMB, 7s); break; case EVENT_BLISTERING_COLD: Talk(EMOTE_WARN_BLISTERING_COLD); @@ -652,9 +651,8 @@ public: Talk(EMOTE_WARN_FROZEN_ORB, target); me->CastSpell(target, SPELL_ICE_TOMB_DUMMY, true); me->CastSpell(target, SPELL_FROST_BEACON, true); - if (uint32 evTime = events.GetNextEventTime(EVENT_ICY_GRIP)) - if (events.GetTimer() > evTime || evTime - events.GetTimer() < 8000) - events.RescheduleEvent(EVENT_ICY_GRIP, 8s, EVENT_GROUP_LAND_PHASE); + if (events.GetTimeUntilEvent(EVENT_ICY_GRIP) < 8s) + events.RescheduleEvent(EVENT_ICY_GRIP, 8s, EVENT_GROUP_LAND_PHASE); } events.ScheduleEvent(EVENT_ICE_TOMB, 18s, 22s); break; @@ -700,7 +698,7 @@ public: uint32 _existenceCheckTimer; uint16 _asphyxiationTimer; - void SetGUID(ObjectGuid guid, int32 type) override + void SetGUID(ObjectGuid const& guid, int32 type) override { if (type == DATA_TRAPPED_PLAYER) _trappedPlayerGUID = guid; @@ -722,7 +720,7 @@ public: player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_DAMAGE); player->RemoveAurasDueToSpell(SPELL_ASPHYXIATION); player->RemoveAurasDueToSpell(SPELL_ICE_TOMB_UNTARGETABLE); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); } } @@ -1081,7 +1079,7 @@ class spell_sindragosa_ice_tomb_trap_aura : public AuraScript void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Unit* c = GetCaster()) - GetTarget()->m_Events.AddEvent(new IceTombSummonEvent(GetTarget(), c->GetGUID()), GetTarget()->m_Events.CalculateTime(500)); + GetTarget()->m_Events.AddEventAtOffset(new IceTombSummonEvent(GetTarget(), c->GetGUID()), 500ms); } void ExtraRemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -1247,7 +1245,7 @@ public: me->setActive(true); me->SetImmuneToPC(true); float moveTime = me->GetExactDist(&SpinestalkerFlyPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); - me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, SpinestalkerLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); + me->m_Events.AddEventAtOffset(new FrostwyrmLandEvent(*me, SpinestalkerLandPos), Milliseconds(uint32(moveTime) + 250)); me->SetDefaultMovementType(IDLE_MOTION_TYPE); me->GetMotionMaster()->MoveIdle(); me->StopMoving(); @@ -1378,7 +1376,7 @@ public: me->setActive(true); me->SetImmuneToPC(true); float moveTime = me->GetExactDist(&RimefangFlyPos) / (me->GetSpeed(MOVE_RUN) * 0.001f); - me->m_Events.AddEvent(new FrostwyrmLandEvent(*me, RimefangLandPos), me->m_Events.CalculateTime(uint64(moveTime) + 250)); + me->m_Events.AddEventAtOffset(new FrostwyrmLandEvent(*me, RimefangLandPos), Milliseconds(uint32(moveTime) + 250)); me->SetDefaultMovementType(IDLE_MOTION_TYPE); me->GetMotionMaster()->MoveIdle(); me->StopMoving(); @@ -1451,8 +1449,8 @@ public: else destZ = me->GetPositionZ() + 25.0f; me->GetMotionMaster()->MoveTakeoff(0, me->GetPositionX(), me->GetPositionY(), destZ, me->GetSpeed(MOVE_RUN)); float moveTime = std::fabs(destZ - me->GetPositionZ()) / (me->GetSpeed(MOVE_RUN) * 0.001f); - _events.ScheduleEvent(EVENT_ICY_BLAST, uint32(moveTime) + urand(60000, 70000)); - _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, uint32(moveTime) + 250); + _events.Repeat(Milliseconds(uint32(moveTime) + urand(60000, 70000))); + _events.ScheduleEvent(EVENT_ICY_BLAST_CAST, Milliseconds(uint32(moveTime) + 250)); break; } case EVENT_ICY_BLAST_CAST: diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index d746989103..3d7225cd39 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -141,7 +141,6 @@ enum Spells SPELL_SOUL_REAPER = 69409, // instant SPELL_SOUL_REAPER_BUFF = 69410, SPELL_SUMMON_VALKYR = 69037, // instant - SPELL_SUMMON_VALKYR_PERIODIC = 74361, SPELL_WINGS_OF_THE_DAMNED = 74352, SPELL_VALKYR_TARGET_SEARCH = 69030, SPELL_HARVEST_SOUL_VALKYR = 68985, // vehicle aura used by Val'kyr Shadowguard and Strangulate Vehicle @@ -188,14 +187,6 @@ enum Spells SPELL_FRENZY = 28747, }; -#define NECROTIC_PLAGUE_LK RAID_MODE<uint32>(70337, 73912, 73913, 73914) -#define NECROTIC_PLAGUE_PLR RAID_MODE<uint32>(70338, 73785, 73786, 73787) -#define REMORSELESS_WINTER_1 RAID_MODE<uint32>(68981, 74270, 74271, 74272) -#define REMORSELESS_WINTER_2 RAID_MODE<uint32>(72259, 74273, 74274, 74275) -#define SUMMON_VALKYR RAID_MODE<uint32>(69037, 74361, 69037, 74361) -//#define HARVEST_SOUL RAID_MODE<uint32>(68980, 74325, 74296, 74297) -#define HARVESTED_SOUL_BUFF RAID_MODE<uint32>(72679, 74318, 74319, 74320) - enum Events { EVENT_NONE, @@ -375,7 +366,7 @@ void SendPacketToPlayers(WorldPacket const* data, Unit* source) for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (Player* player = itr->GetSource()) if (player->GetAreaId() == AREA_THE_FROZEN_THRONE) - player->GetSession()->SendPacket(data); + player->SendDirectMessage(data); } struct ShadowTrapLKTargetSelector @@ -552,7 +543,7 @@ public: if (--_counter) { - _owner->m_Events.AddEvent(this, _owner->m_Events.CalculateTime(3000)); + _owner->m_Events.AddEventAtOffset(this, 3s); return false; } @@ -826,12 +817,12 @@ public: me->SetDisableGravity(false); me->GetMotionMaster()->MoveFall(); if (Creature* frostmourne = me->FindNearestCreature(NPC_FROSTMOURNE_TRIGGER, 50.0f)) - frostmourne->DespawnOrUnsummon(1); + frostmourne->DespawnOrUnsummon(1ms); if (Creature* terenas = me->FindNearestCreature(NPC_TERENAS_MENETHIL_OUTRO, 50.0f)) - terenas->DespawnOrUnsummon(1); + terenas->DespawnOrUnsummon(1ms); - me->m_Events.AddEvent(new LichKingDeathEvent(*me), me->m_Events.CalculateTime(2500)); // die after spinning anim is over, so death anim is visible - me->m_Events.AddEvent(new LichKingMovieEvent(*me), me->m_Events.CalculateTime(11500)); + me->m_Events.AddEventAtOffset(new LichKingDeathEvent(*me), 2500ms); // die after spinning anim is over, so death anim is visible + me->m_Events.AddEventAtOffset(new LichKingMovieEvent(*me), 11500ms); } if (!_bFordringMustFallYell && me->GetHealth() < 500000) @@ -862,7 +853,7 @@ public: summon->CastSpell(summon, SPELL_RISEN_WITCH_DOCTOR_SPAWN, true); summon->SetReactState(REACT_PASSIVE); summon->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); - summon->m_Events.AddEvent(new StartMovementEvent(me, summon), summon->m_Events.CalculateTime(5000)); + summon->m_Events.AddEventAtOffset(new StartMovementEvent(me, summon), 5s); break; case NPC_RAGING_SPIRIT: summon->SetHomePosition(CenterPosition); @@ -872,7 +863,7 @@ public: summon->SetReactState(REACT_PASSIVE); summon->GetMotionMaster()->MoveRandom(10.0f); if (_phase == PHASE_THREE) - summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(15000)); + summon->m_Events.AddEventAtOffset(new VileSpiritActivateEvent(summon), 15s); break; } case NPC_STRANGULATE_VEHICLE: @@ -885,8 +876,8 @@ public: summon->StopMovingOnCurrentPos(); break; case NPC_VALKYR_SHADOWGUARD: - if (_phase == PHASE_THREE || events.GetNextEventTime(EVENT_QUAKE_2)) - summon->DespawnOrUnsummon(1); + if (_phase == PHASE_THREE || events.HasTimeUntilEvent(EVENT_QUAKE_2)) + summon->DespawnOrUnsummon(1ms); break; default: break; @@ -915,7 +906,7 @@ public: void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override { - if (spell->Id == HARVESTED_SOUL_BUFF && me->IsInCombat() && !IsHeroic() && _phase != PHASE_OUTRO && _lastTalkTimeBuff + 5 <= GameTime::GetGameTime().count()) + if (spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_HARVESTED_SOUL_LK_BUFF, me) && me->IsInCombat() && !IsHeroic() && _phase != PHASE_OUTRO && _lastTalkTimeBuff + 5 <= GameTime::GetGameTime().count()) { _lastTalkTimeBuff = GameTime::GetGameTime().count(); Talk(SAY_LK_FROSTMOURNE_KILL); @@ -924,7 +915,7 @@ public: void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) override { - if (spell->Id == REMORSELESS_WINTER_1 || spell->Id == REMORSELESS_WINTER_2) + if (spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_REMORSELESS_WINTER_1, me) || spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_REMORSELESS_WINTER_2, me)) { me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, LIGHT_SNOWSTORM, 5s); me->GetMap()->SetZoneWeather(AREA_THE_FROZEN_THRONE, WEATHER_STATE_LIGHT_SNOW, 0.5f); @@ -944,7 +935,7 @@ public: Talk(SAY_LK_REMORSELESS_WINTER); me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); me->CastSpell(me, SPELL_REMORSELESS_WINTER_1, false); - //events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, 15mins on movies + //events.DelayEvents(62500ms, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, 15mins on movies events.ScheduleEvent(EVENT_QUAKE, 62s + 500ms); events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 3500ms, EVENT_GROUP_ABILITIES); events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8s, EVENT_GROUP_ABILITIES); @@ -956,7 +947,7 @@ public: me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); me->CastSpell(me, SPELL_REMORSELESS_WINTER_2, false); summons.DespawnEntry(NPC_VALKYR_SHADOWGUARD); - //events.DelayEvents(62500, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, 15 mins on movies + //events.DelayEvents(62500ms, EVENT_GROUP_BERSERK); // delay berserk timer, its not ticking during phase transitions, 15 mins on movies events.ScheduleEvent(EVENT_QUAKE_2, 62s + 500ms); events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, 3500ms, EVENT_GROUP_ABILITIES); events.ScheduleEvent(EVENT_SUMMON_ICE_SPHERE, 8s, EVENT_GROUP_ABILITIES); @@ -1064,7 +1055,7 @@ public: events.ScheduleEvent(EVENT_INFEST, 22s + 500ms, EVENT_GROUP_ABILITIES); break; case EVENT_NECROTIC_PLAGUE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NecroticPlagueTargetCheck(me, NECROTIC_PLAGUE_LK, NECROTIC_PLAGUE_PLR))) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NecroticPlagueTargetCheck(me, sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE, me), sSpellMgr->GetSpellIdForDifficulty(SPELL_NECROTIC_PLAGUE_JUMP, me)))) { Talk(EMOTE_NECROTIC_PLAGUE_WARNING, target); me->CastSpell(target, SPELL_NECROTIC_PLAGUE, false); @@ -1081,11 +1072,11 @@ public: case EVENT_PAIN_AND_SUFFERING: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) { - //events.DelayEventsToMax(500, EVENT_GROUP_ABILITIES); + //events.DelayEventsToMax(500ms, EVENT_GROUP_ABILITIES); me->SetFacingTo(me->GetAngle(target)); me->CastSpell(target, SPELL_PAIN_AND_SUFFERING, false); } - events.ScheduleEvent(EVENT_PAIN_AND_SUFFERING, (IsHeroic() ? urand(1250, 1750) : urand(1750, 2250)), EVENT_GROUP_ABILITIES); + events.Repeat((IsHeroic() ? randtime(1250ms, 1750ms) : randtime(1750ms, 2250ms))); break; case EVENT_SUMMON_ICE_SPHERE: me->CastSpell((Unit*)nullptr, SPELL_SUMMON_ICE_SPHERE, false); @@ -1098,21 +1089,21 @@ public: break; case EVENT_DEFILE: { - uint32 evTime = events.GetNextEventTime(EVENT_SUMMON_VALKYR); + Milliseconds evTime = events.GetTimeUntilEvent(EVENT_SUMMON_VALKYR); // if defile (cast time 2sec) is less than 3 before valkyr appears // we've to decide - if (evTime && (events.GetTimer() > evTime || evTime - events.GetTimer() < 5000)) + if (evTime < 5s) { // if valkyr is less than 1.5 secs after defile (cast time 2 sec) then we've a sync issue, so // we need to cancel it (break) and schedule a defile to be casted 5 or 4 seconds after valkyr - if (events.GetTimer() > evTime || evTime - events.GetTimer() < 3500) + if (evTime < 3500ms) { - uint32 t = events.GetTimer() > evTime ? 0 : evTime - events.GetTimer(); - events.ScheduleEvent(EVENT_DEFILE, t + (Is25ManRaid() ? 5000 : 4000), EVENT_GROUP_ABILITIES); + Milliseconds t = evTime > 0ms ? evTime : 0ms; + events.ScheduleEvent(EVENT_DEFILE, t + (Is25ManRaid() ? 5s : 4s), EVENT_GROUP_ABILITIES); break; } - // if valkyr is coming between 1.5 and 3 seconds after defile then we've to + // if valkyr is coming within 2,5 seconds after defile then we've to // delay valkyr just a bit events.RescheduleEvent(EVENT_SUMMON_VALKYR, 5s, EVENT_GROUP_ABILITIES); } @@ -1145,17 +1136,14 @@ public: { me->GetMap()->SetZoneMusic(AREA_THE_FROZEN_THRONE, MUSIC_SPECIAL); Talk(SAY_LK_SUMMON_VALKYR); - me->CastSpell((Unit*)nullptr, SUMMON_VALKYR, false); + me->CastSpell((Unit*)nullptr, SPELL_SUMMON_VALKYR, false); events.ScheduleEvent(EVENT_SUMMON_VALKYR, 45s, EVENT_GROUP_ABILITIES); // schedule a defile (or reschedule it) if next defile event // doesn't exist ( now > next defile ) or defile is coming too soon - uint32 minTime = (Is25ManRaid() ? 5000 : 4000); - if (uint32 evTime = events.GetNextEventTime(EVENT_DEFILE)) - if (events.GetTimer() > evTime || evTime - events.GetTimer() < minTime) - { - events.RescheduleEvent(EVENT_DEFILE, minTime, EVENT_GROUP_ABILITIES); - } + Milliseconds minTime = (Is25ManRaid() ? 5s : 4s); + if (events.GetTimeUntilEvent(EVENT_DEFILE) < minTime) + events.RescheduleEvent(EVENT_DEFILE, minTime, EVENT_GROUP_ABILITIES); } break; case EVENT_VILE_SPIRITS: @@ -1180,7 +1168,7 @@ public: me->SetReactState(REACT_PASSIVE); me->AttackStop(); events.ScheduleEvent(EVENT_START_ATTACK, 55s); - events.DelayEvents(52500, EVENT_GROUP_VILE_SPIRITS); + events.DelayEvents(52500ms, EVENT_GROUP_VILE_SPIRITS); events.CancelEvent(EVENT_DEFILE); events.CancelEvent(EVENT_SOUL_REAPER); events.ScheduleEvent(EVENT_FROSTMOURNE_HEROIC, 6s, EVENT_GROUP_ABILITIES); @@ -1192,7 +1180,7 @@ public: if (summon->GetEntry() == NPC_VILE_SPIRIT) { summon->m_Events.KillAllEvents(true); - summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(55000)); + summon->m_Events.AddEventAtOffset(new VileSpiritActivateEvent(summon), 55s); summon->GetMotionMaster()->Clear(true); summon->StopMoving(); summon->SetReactState(REACT_PASSIVE); @@ -1216,7 +1204,7 @@ public: { spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_1, true); // summons bombs randomly spawner->CastSpell(spawner, SPELL_SUMMON_SPIRIT_BOMB_2, true); // summons bombs on players - spawner->m_Events.AddEvent(new TriggerWickedSpirit(spawner), spawner->m_Events.CalculateTime(3000)); + spawner->m_Events.AddEventAtOffset(new TriggerWickedSpirit(spawner), 3s); terenas->SetImmuneToAll(true); // to avoid being healed by player trinket procs. terenas' health doesn't matter on heroic } } @@ -1508,9 +1496,9 @@ public: theLichKing->GetMotionMaster()->MovePoint(0, CenterPosition); uint32 travelTime = 1000 * theLichKing->GetExactDist(&CenterPosition) / theLichKing->GetSpeed(MOVE_WALK) + 1000; - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_4, 1 + travelTime); - _events.ScheduleEvent(EVENT_OUTRO_LK_RAISE_DEAD, 1000 + travelTime); - _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_5, 29000 + travelTime); + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_4, Milliseconds(1 + travelTime)); + _events.ScheduleEvent(EVENT_OUTRO_LK_RAISE_DEAD, Milliseconds(1000 + travelTime)); + _events.ScheduleEvent(EVENT_OUTRO_LK_TALK_5, Milliseconds(29000 + travelTime)); } break; case EVENT_OUTRO_LK_TALK_4: @@ -2081,7 +2069,7 @@ class spell_the_lich_king_shadow_trap_periodic : public SpellScript if (Aura* a = GetCaster()->GetAura(SPELL_SHADOW_TRAP_AURA)) a->SetDuration(0); if (GetCaster()->IsCreature()) - GetCaster()->ToCreature()->DespawnOrUnsummon(3000); + GetCaster()->ToCreature()->DespawnOrUnsummon(3s); } void Register() override @@ -2137,7 +2125,7 @@ public: { me->RemoveAllAuras(); me->CastSpell(me, SPELL_ICE_BURST, true); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); targetGUID.Clear(); timer = 9999; me->InterruptNonMeleeSpells(true); @@ -2241,7 +2229,7 @@ public: if (Player* plr = ScriptedAI::SelectTargetFromPlayerList(100.0f, 0, true)) plr->CastSpell(me, SPELL_RAGING_SPIRIT_VISUAL_CLONE, true); else - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } } @@ -2355,8 +2343,7 @@ class spell_the_lich_king_defile : public SpellScript { targets.remove_if(VehicleCheck()); targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 10.0f * GetCaster()->GetFloatValue(OBJECT_FIELD_SCALE_X), true)); - uint32 strangulatedAura[4] = {68980, 74325, 74296, 74297}; - targets.remove_if(Acore::UnitAuraCheck(true, strangulatedAura[GetCaster()->GetMap()->GetDifficulty()])); + targets.remove_if(Acore::UnitAuraCheck(true, sSpellMgr->GetSpellIdForDifficulty(SPELL_HARVEST_SOUL, GetCaster()))); } void ChangeDamageAndGrow() @@ -2452,7 +2439,7 @@ public: if (IsHeroic()) GoSiphon(); else - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override @@ -2522,7 +2509,7 @@ public: if (IsHeroic()) GoSiphon(); else - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } break; case POINT_START_SIPHON: @@ -2539,7 +2526,7 @@ public: } } - void SetGUID(ObjectGuid guid, int32 /* = 0*/) override + void SetGUID(ObjectGuid const& guid, int32 /* = 0*/) override { _grabbedPlayer = guid; } @@ -2568,8 +2555,8 @@ public: me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD); me->SetCanFly(false); me->SetDisableGravity(false); - me->GetMotionMaster()->MovePoint(POINT_DROP_PLAYER, _destPoint, false); - me->SetDisableGravity(true, true); + me->GetMotionMaster()->MovePoint(POINT_DROP_PLAYER, _destPoint, FORCED_MOVEMENT_NONE, 0.f, false); + me->SetDisableGravity(true); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); break; case EVENT_MOVE_TO_SIPHON_POS: @@ -2620,7 +2607,7 @@ public: me->GetMotionMaster()->Clear(); me->StopMovingOnCurrentPos(); - _events.ScheduleEvent(EVENT_MOVE_TO_DROP_POS, 0); + _events.ScheduleEvent(EVENT_MOVE_TO_DROP_POS, 0ms); } }; @@ -2735,7 +2722,7 @@ class spell_the_lich_king_valkyr_target_search : public SpellScript if (Unit* target = GetHitUnit()) { GetCaster()->GetMotionMaster()->MoveCharge(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 4.0f, 42.0f, EVENT_CHARGE); - GetCaster()->SetDisableGravity(true, true); + GetCaster()->SetDisableGravity(true); } } @@ -2886,7 +2873,7 @@ class spell_the_lich_king_vile_spirit_damage_target_search : public SpellScript c->GetMotionMaster()->Clear(true); c->StopMoving(); c->CastSpell((Unit*)nullptr, SPELL_SPIRIT_BURST, true); - c->DespawnOrUnsummon(3000); + c->DespawnOrUnsummon(3s); c->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); } } @@ -3002,7 +2989,7 @@ public: _events.Reset(); me->RemoveAllAuras(); - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_THE_LICH_KING))) lichKing->AI()->SummonedCreatureDespawn(me); @@ -3053,7 +3040,7 @@ public: case EVENT_DESPAWN_SELF: if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_THE_LICH_KING))) lichKing->AI()->SummonedCreatureDespawn(me); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); break; default: break; @@ -3101,7 +3088,7 @@ public: { _events.Reset(); me->CastSpell((Unit*)nullptr, SPELL_RESTORE_SOUL, false); - me->DespawnOrUnsummon(3000); + me->DespawnOrUnsummon(3s); } break; } @@ -3121,14 +3108,14 @@ public: if (Creature* warden = me->FindNearestCreature(NPC_SPIRIT_WARDEN, 20.0f)) { warden->CastSpell((Unit*)nullptr, SPELL_DESTROY_SOUL, false); - warden->DespawnOrUnsummon(2000); + warden->DespawnOrUnsummon(2s); } me->CastSpell(me, SPELL_TERENAS_LOSES_INSIDE, false); me->SetDisplayId(16946); me->SetReactState(REACT_PASSIVE); me->AttackStop(); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); } } } @@ -3417,7 +3404,7 @@ public: npc_lk_spirit_bombAI(Creature* creature) : NullCreatureAI(creature) { me->SetReactState(REACT_PASSIVE); - me->DespawnOrUnsummon(45000); // for safety + me->DespawnOrUnsummon(45s); // for safety timer = 0; } @@ -3450,7 +3437,7 @@ public: timer = 0; me->RemoveAllAuras(); me->CastSpell((Unit*)nullptr, SPELL_EXPLOSION, false); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } else timer -= diff; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 75bdea092b..fce8465d4d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -52,8 +52,8 @@ enum Spells SPELL_NIGHTMARE_PORTAL_VISUAL_PRE = 71986, SPELL_NIGHTMARE_CLOUD = 71970, SPELL_NIGHTMARE_CLOUD_VISUAL = 71939, - SPELL_PRE_SUMMON_DREAM_PORTAL = 72224, - SPELL_PRE_SUMMON_NIGHTMARE_PORTAL = 72480, + SPELL_PRE_SUMMON_DREAM_PORTAL = 72224, // normal + SPELL_PRE_SUMMON_NIGHTMARE_PORTAL = 72480, // heroic SPELL_SUMMON_DREAM_PORTAL = 71305, SPELL_SUMMON_NIGHTMARE_PORTAL = 71987, SPELL_DREAMWALKERS_RAGE = 71189, @@ -94,16 +94,13 @@ enum Spells SPELL_GUT_SPRAY = 70633, SPELL_ROT_WORM_SPAWNER = 70675, - // Dream Cloud + // Dream Cloud (normal) SPELL_EMERALD_VIGOR = 70873, - // Nightmare Cloud + // Nightmare Cloud (heroic) SPELL_TWISTED_NIGHTMARE = 71941, }; -#define SUMMON_PORTAL RAID_MODE<uint32>(SPELL_PRE_SUMMON_DREAM_PORTAL, SPELL_PRE_SUMMON_DREAM_PORTAL, SPELL_PRE_SUMMON_NIGHTMARE_PORTAL, SPELL_PRE_SUMMON_NIGHTMARE_PORTAL) -#define EMERALD_VIGOR RAID_MODE<uint32>(SPELL_EMERALD_VIGOR, SPELL_EMERALD_VIGOR, SPELL_TWISTED_NIGHTMARE, SPELL_TWISTED_NIGHTMARE) - enum Events { // Valithria Dreamwalker @@ -177,14 +174,14 @@ private: class DelayedCastEvent : public BasicEvent { public: - DelayedCastEvent(Creature* trigger, uint32 spellId, ObjectGuid originalCaster, uint32 despawnTime) : _trigger(trigger), _originalCaster(originalCaster), _spellId(spellId), _despawnTime(despawnTime) + DelayedCastEvent(Creature* trigger, uint32 spellId, ObjectGuid originalCaster, Milliseconds despawnTime) : _trigger(trigger), _originalCaster(originalCaster), _spellId(spellId), _despawnTime(despawnTime) { } bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _trigger->CastSpell(_trigger, _spellId, false, nullptr, nullptr, _originalCaster); - if (_despawnTime) + if (_despawnTime > 0ms) _trigger->DespawnOrUnsummon(_despawnTime); return true; } @@ -193,7 +190,7 @@ private: Creature* _trigger; ObjectGuid _originalCaster; uint32 _spellId; - uint32 _despawnTime; + Milliseconds _despawnTime; }; class AuraRemoveEvent : public BasicEvent @@ -406,7 +403,7 @@ public: // this display id was found in sniff instead of the one on aura me->SetDisplayId(11686); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(4000); + me->DespawnOrUnsummon(4s); if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST, false); _instance->SetData(DATA_WEEKLY_QUEST_ID, 0); // show hidden npc if necessary @@ -417,13 +414,13 @@ public: { if (summon->GetEntry() == NPC_DREAM_PORTAL_PRE_EFFECT) { - summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_DREAM_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000)); - summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_DREAM_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000)); + summon->m_Events.AddEventAtOffset(new DelayedCastEvent(summon, SPELL_SUMMON_DREAM_PORTAL, me->GetGUID(), 6s), 15s); + summon->m_Events.AddEventAtOffset(new AuraRemoveEvent(summon, SPELL_DREAM_PORTAL_VISUAL_PRE), 15s); } else if (summon->GetEntry() == NPC_NIGHTMARE_PORTAL_PRE_EFFECT) { - summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_SUMMON_NIGHTMARE_PORTAL, me->GetGUID(), 6000), summon->m_Events.CalculateTime(15000)); - summon->m_Events.AddEvent(new AuraRemoveEvent(summon, SPELL_NIGHTMARE_PORTAL_VISUAL_PRE), summon->m_Events.CalculateTime(15000)); + summon->m_Events.AddEventAtOffset(new DelayedCastEvent(summon, SPELL_SUMMON_NIGHTMARE_PORTAL, me->GetGUID(), 6s), 15s); + summon->m_Events.AddEventAtOffset(new AuraRemoveEvent(summon, SPELL_NIGHTMARE_PORTAL_VISUAL_PRE), 15s); } } @@ -462,7 +459,7 @@ public: if (!IsHeroic()) Talk(SAY_VALITHRIA_DREAM_PORTAL); for (uint32 i = 0; i < _portalCount; ++i) - me->CastSpell(me, SUMMON_PORTAL, false); + me->CastSpell(me, SPELL_PRE_SUMMON_DREAM_PORTAL, false); _events.ScheduleEvent(EVENT_DREAM_PORTAL, 45s, 48s); break; case EVENT_DREAM_SLIP: @@ -579,7 +576,7 @@ public: void DoAction(int32 action) override { if (action == ACTION_DEATH) - me->m_Events.AddEvent(new ValithriaDespawner(me), me->m_Events.CalculateTime(5000)); + me->m_Events.AddEventAtOffset(new ValithriaDespawner(me), 5s); else if (action == ACTION_ENTER_COMBAT) { if (!me->IsInCombat()) @@ -750,9 +747,9 @@ public: void JustSummoned(Creature* summon) override { if (summon->GetEntry() == NPC_COLUMN_OF_FROST) - summon->m_Events.AddEvent(new DelayedCastEvent(summon, SPELL_COLUMN_OF_FROST_DAMAGE, ObjectGuid::Empty, 8000), summon->m_Events.CalculateTime(2000)); + summon->m_Events.AddEventAtOffset(new DelayedCastEvent(summon, SPELL_COLUMN_OF_FROST_DAMAGE, ObjectGuid::Empty, 8s), 2s); else if (summon->GetEntry() == NPC_MANA_VOID) - summon->DespawnOrUnsummon(36000); + summon->DespawnOrUnsummon(36s); } void UpdateAI(uint32 diff) override @@ -885,8 +882,8 @@ public: me->GetMotionMaster()->Clear(false); me->GetMotionMaster()->MoveIdle(); // must use originalCaster the same for all clouds to allow stacking - me->CastSpell(me, EMERALD_VIGOR, false, nullptr, nullptr, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); - me->DespawnOrUnsummon(1000); + me->CastSpell(me, SPELL_EMERALD_VIGOR, false, nullptr, nullptr, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER)); + me->DespawnOrUnsummon(1s); break; default: break; @@ -1054,7 +1051,7 @@ public: timer = 0; me->SetDisplayId(11686); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); } else timer -= diff; @@ -1096,7 +1093,7 @@ public: void JustSummoned(Creature* summon) override { if (me->GetInstanceScript() && me->GetInstanceScript()->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) - summon->DespawnOrUnsummon(1); + summon->DespawnOrUnsummon(1ms); else if (Unit* target = SelectTargetFromPlayerList(200.0f)) summon->AI()->AttackStart(target); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 5c6e308310..e4f745aae0 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -533,13 +533,13 @@ public: case EVENT_SAURFANG_RUN: if (Creature* factionNPC = ObjectAccessor::GetCreature(*me, _factionNPC)) { - factionNPC->GetMotionMaster()->MovePath(factionNPC->GetSpawnId() * 10, false); - factionNPC->DespawnOrUnsummon(46500); + factionNPC->GetMotionMaster()->MoveWaypoint(factionNPC->GetSpawnId() * 10, false); + factionNPC->DespawnOrUnsummon(46500ms); std::list<Creature*> followers; factionNPC->GetCreaturesWithEntryInRange(followers, 30, _instance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? NPC_KOR_KRON_GENERAL : NPC_ALLIANCE_COMMANDER); for (Creature* follower : followers) { - follower->DespawnOrUnsummon(46500); + follower->DespawnOrUnsummon(46500ms); } } me->setActive(false); @@ -679,7 +679,7 @@ public: { case 1000: case 11000: - _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, uint32(action)); + _events.ScheduleEvent(EVENT_ACTIVATE_TRAP, Milliseconds(action)); break; default: break; @@ -772,7 +772,7 @@ public: } } - void SetGUID(ObjectGuid guid, int32 type/* = 0*/) override + void SetGUID(ObjectGuid const& guid, int32 type/* = 0*/) override { if (type == ACTION_VRYKUL_DEATH) { @@ -934,7 +934,7 @@ public: case EVENT_START_PATHING: me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->SetImmuneToAll(false); - Start(true, true); + Start(true); break; case EVENT_SCOURGE_STRIKE: DoCastVictim(SPELL_SCOURGE_STRIKE); @@ -1016,15 +1016,15 @@ public: if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CROK_SCOURGEBANE))) // _isEventDone = true, setActive(false) crok->AI()->DoAction(ACTION_RESET_EVENT); - uint64 delay = 6000; + Milliseconds delay = 6s; for (uint32 i = 0; i < 4; ++i) if (Creature* crusader = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CAPTAIN_ARNATH + i))) if (crusader->IsAlive()) { if (crusader->GetEntry() == crusader->GetCreatureData()->id1) { - crusader->m_Events.AddEvent(new CaptainSurviveTalk(*crusader), crusader->m_Events.CalculateTime(delay)); - delay += 6000; + crusader->m_Events.AddEventAtOffset(new CaptainSurviveTalk(*crusader), delay); + delay += 6s; } else Unit::Kill(crusader, crusader); @@ -1810,7 +1810,7 @@ public: { _vehicleCheckTimer = 500; if (!me->GetVehicle()) - me->DespawnOrUnsummon(100); + me->DespawnOrUnsummon(100ms); } else _vehicleCheckTimer -= diff; @@ -2151,7 +2151,7 @@ class spell_svalna_remove_spear : public SpellScript { if (Unit* vehicle = target->GetVehicleBase()) vehicle->RemoveAurasDueToSpell(SPELL_IMPALING_SPEAR); - target->DespawnOrUnsummon(1); + target->DespawnOrUnsummon(1ms); } } @@ -2796,38 +2796,38 @@ class SeveredEssenceSpellInfo public: uint8 Class; uint32 id; - uint32 cooldown_ms; + Milliseconds cooldown_ms; uint8 targetType; float range; }; SeveredEssenceSpellInfo sesi_spells[] = { - {CLASS_SHAMAN, 71938, 5000, 1, 0.0f}, - {CLASS_PALADIN, 57767, 8000, 2, 30.0f}, - {CLASS_WARLOCK, 71937, 10000, 1, 0.0f}, - {CLASS_DEATH_KNIGHT, 49576, 15000, 1, 30.0f}, - {CLASS_ROGUE, 71933, 8000, 1, 0.0f}, - {CLASS_MAGE, 71928, 4000, 1, 40.0f}, - {CLASS_PALADIN, 71930, 5000, 2, 40.0f}, - {CLASS_ROGUE, 71955, 40000, 1, 30.0f}, - {CLASS_PRIEST, 71931, 5000, 2, 40.0f}, - {CLASS_SHAMAN, 71934, 7000, 1, 0.0f}, - {CLASS_DRUID, 71925, 5000, 1, 0.0f}, - {CLASS_DEATH_KNIGHT, 71951, 8000, 1, 0.0f}, - {CLASS_DEATH_KNIGHT, 71924, 8000, 1, 0.0f}, - {CLASS_WARLOCK, 71965, 20000, 0, 0.0f}, - {CLASS_PRIEST, 71932, 8000, 2, 40.0f}, - {CLASS_DRUID, 71926, 10000, 1, 0.0f}, - {CLASS_WARLOCK, 71936, 9000, 1, 0.0f}, - {CLASS_ROGUE, 57640, 3000, 1, 0.0f}, - {CLASS_WARRIOR, 71961, 5000, 1, 0.0f}, - {CLASS_MAGE, 71929, 10000, 1, 0.0f}, - {CLASS_WARRIOR, 53395, 5000, 1, 0.0f}, - {CLASS_WARRIOR, 71552, 5000, 1, 0.0f}, - {CLASS_HUNTER, 36984, 7000, 1, 0.0f}, - {CLASS_HUNTER, 29576, 5000, 1, 0.0f}, - {0, 0, 0, 0, 0.0f}, + { CLASS_SHAMAN, 71938, 5s, 1, 0.0f }, + { CLASS_PALADIN, 57767, 8s, 2, 30.0f }, + { CLASS_WARLOCK, 71937, 10s, 1, 0.0f }, + { CLASS_DEATH_KNIGHT, 49576, 15s, 1, 30.0f }, + { CLASS_ROGUE, 71933, 8s, 1, 0.0f }, + { CLASS_MAGE, 71928, 4s, 1, 40.0f }, + { CLASS_PALADIN, 71930, 5s, 2, 40.0f }, + { CLASS_ROGUE, 71955, 40s, 1, 30.0f }, + { CLASS_PRIEST, 71931, 5s, 2, 40.0f }, + { CLASS_SHAMAN, 71934, 7s, 1, 0.0f }, + { CLASS_DRUID, 71925, 5s, 1, 0.0f }, + { CLASS_DEATH_KNIGHT, 71951, 8s, 1, 0.0f }, + { CLASS_DEATH_KNIGHT, 71924, 8s, 1, 0.0f }, + { CLASS_WARLOCK, 71965, 20s, 0, 0.0f }, + { CLASS_PRIEST, 71932, 8s, 2, 40.0f }, + { CLASS_DRUID, 71926, 10s, 1, 0.0f }, + { CLASS_WARLOCK, 71936, 9s, 1, 0.0f }, + { CLASS_ROGUE, 57640, 3s, 1, 0.0f }, + { CLASS_WARRIOR, 71961, 5s, 1, 0.0f }, + { CLASS_MAGE, 71929, 10s, 1, 0.0f }, + { CLASS_WARRIOR, 53395, 5s, 1, 0.0f }, + { CLASS_WARRIOR, 71552, 5s, 1, 0.0f }, + { CLASS_HUNTER, 36984, 7s, 1, 0.0f }, + { CLASS_HUNTER, 29576, 5s, 1, 0.0f }, + { 0, 0, 0ms, 0, 0.0f } }; class npc_icc_severed_essence : public CreatureScript @@ -2862,7 +2862,7 @@ public: if (sesi_spells[i].id) { if (Class == sesi_spells[i].Class) - events.ScheduleEvent(i + 1, sesi_spells[i].cooldown_ms / 4); + events.ScheduleEvent(i + 1, Milliseconds(sesi_spells[i].cooldown_ms / 4)); } else break; @@ -2895,7 +2895,7 @@ public: if (target) me->CastSpell(target, sesi_spells[e - 1].id, TRIGGERED_IGNORE_SHAPESHIFT); - events.RepeatEvent(sesi_spells[e - 1].cooldown_ms); + events.Repeat(sesi_spells[e - 1].cooldown_ms); } if (Class == CLASS_HUNTER) @@ -3337,7 +3337,7 @@ public: void ScheduleBroodlings() { for (uint8 i = 0; i < 30; ++i) - events.ScheduleEvent(EVENT_SUMMON_BROODLING, 10000 + i * 350); + events.ScheduleEvent(EVENT_SUMMON_BROODLING, Milliseconds(10000 + i * 350)); } void SummonBroodling() @@ -3347,7 +3347,7 @@ public: if (Creature* broodling = me->SummonCreature(NPC_NERUBAR_BROODLING, me->GetPositionX() + cos(o) * dist, me->GetPositionY() + std::sin(o) * dist, 250.0f, Position::NormalizeOrientation(o - M_PI))) { broodling->CastSpell(broodling, SPELL_WEB_BEAM2, false); - broodling->GetMotionMaster()->MovePoint(POINT_ENTER_COMBAT, broodling->GetPositionX(), broodling->GetPositionY(), 213.03f, false); + broodling->GetMotionMaster()->MovePoint(POINT_ENTER_COMBAT, broodling->GetPositionX(), broodling->GetPositionY(), 213.03f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false); } } @@ -3521,7 +3521,7 @@ public: me->CastSpell(me, SPELL_GIANT_INSECT_SWARM, true); for (uint8 i = 0; i < 60; ++i) - events.ScheduleEvent(EVENT_GAUNTLET_PHASE1, i * 1000); + events.ScheduleEvent(EVENT_GAUNTLET_PHASE1, Seconds(i)); events.ScheduleEvent(EVENT_GAUNTLET_PHASE2, 1min); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 394225e21a..7929a51ab6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -268,7 +268,7 @@ public: if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE) SpawnGunship(); - if (GetBossState(DATA_SINDRAGOSA) != DONE && IsSindragosaIntroDone && !GetCreature(DATA_SINDRAGOSA) && Events.GetTimeUntilEvent(EVENT_RESPAWN_SINDRAGOSA) == Milliseconds::max()) + if (GetBossState(DATA_SINDRAGOSA) != DONE && IsSindragosaIntroDone && !GetCreature(DATA_SINDRAGOSA) && !Events.HasTimeUntilEvent(EVENT_RESPAWN_SINDRAGOSA)) { Events.ScheduleEvent(EVENT_RESPAWN_SINDRAGOSA, 30s); } @@ -499,7 +499,7 @@ public: break; case NPC_INFILTRATOR_MINCHAR_BQ: if (BloodQuickeningState == DONE) - creature->DespawnOrUnsummon(1); + creature->DespawnOrUnsummon(1ms); break; case NPC_MINCHAR_BEAM_STALKER: if (BloodQuickeningState != DONE) @@ -513,7 +513,7 @@ public: spellId = BLOOD_BEAM_VISUAL_LLEG; else spellId = BLOOD_BEAM_VISUAL_RLEG; - creature->m_Events.AddEvent(new DelayedCastMincharEvent(creature, spellId), creature->m_Events.CalculateTime(1000)); + creature->m_Events.AddEventAtOffset(new DelayedCastMincharEvent(creature, spellId), 1s); } break; case NPC_SKYBREAKER_DECKHAND: @@ -608,7 +608,7 @@ public: std::string name2("Kor'kron "); if (!creature->GetTransport() && creature->GetPositionZ() <= 205.0f && creature->GetExactDist2d(-439.0f, 2210.0f) <= 150.0f && (creature->GetEntry() == 37544 || creature->GetEntry() == 37545 || creature->GetName().compare(0, name1.length(), name1) == 0 || creature->GetName().compare(0, name2.length(), name2) == 0)) if (!creature->GetLootRecipient()) - creature->m_Events.AddEvent(new RespawnEvent(*creature), creature->m_Events.CalculateTime(3000)); + creature->m_Events.AddEventAtOffset(new RespawnEvent(*creature), 3s); switch (creature->GetEntry()) { @@ -661,7 +661,7 @@ public: { c->CastSpell(c, VOID_ZONE_VISUAL, true); unit->SummonCreature(NPC_RISEN_DEATHSPEAKER_SERVANT, *unit, TEMPSUMMON_MANUAL_DESPAWN); - unit->ToCreature()->DespawnOrUnsummon(3000); + unit->ToCreature()->DespawnOrUnsummon(3s); } break; default: @@ -1742,7 +1742,7 @@ public: { sindragosa->setActive(true); sindragosa->SetDisableGravity(true); - sindragosa->GetMotionMaster()->MovePath(NPC_SINDRAGOSA * 10, true); + sindragosa->GetMotionMaster()->MoveWaypoint(NPC_SINDRAGOSA * 10, true); if (TempSummon* summon = sindragosa->ToTempSummon()) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp index b8cc1d9c2a..276bb77a2b 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp @@ -35,10 +35,8 @@ enum GuardSays enum Spells { - SPELL_IMPALE_10 = 28783, - SPELL_IMPALE_25 = 56090, - SPELL_LOCUST_SWARM_10 = 28785, - SPELL_LOCUST_SWARM_25 = 54021, + SPELL_IMPALE = 28783, + SPELL_LOCUST_SWARM = 28785, SPELL_SUMMON_CORPSE_SCRABS_5 = 29105, SPELL_SUMMON_CORPSE_SCRABS_10 = 28864, SPELL_BERSERK = 26662 @@ -138,12 +136,12 @@ public: } ScheduleTimedEvent(15s, [&] { - DoCastRandomTarget(RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25)); + DoCastRandomTarget(SPELL_IMPALE); }, 20s); ScheduleTimedEvent(70s, 2min, [&] { Talk(EMOTE_LOCUST); - DoCastSelf(RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25)); + DoCastSelf(SPELL_LOCUST_SWARM); me->m_Events.AddEventAtOffset([&] { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index 9ab1fcde0f..4a7a16ee72 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -18,6 +18,7 @@ #include "CreatureScript.h" #include "ScriptedCreature.h" #include "SpellInfo.h" +#include "SpellMgr.h" #include "naxxramas.h" enum Yells @@ -37,7 +38,6 @@ enum Spells SPELL_RAIN_OF_FIRE = 28794, SPELL_FRENZY = 28798, SPELL_WIDOWS_EMBRACE = 28732, - SPELL_MINION_WIDOWS_EMBRACE = 54097 }; enum Groups @@ -143,7 +143,7 @@ public: void SpellHit(Unit* caster, SpellInfo const* spell) override { - if (spell->Id == RAID_MODE(SPELL_WIDOWS_EMBRACE, SPELL_MINION_WIDOWS_EMBRACE)) + if (spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_WIDOWS_EMBRACE, me)) { Talk(EMOTE_WIDOWS_EMBRACE); scheduler.RescheduleGroup(GROUP_FRENZY, 1min); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 6439f45add..6f1405ea74 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -33,23 +33,17 @@ enum Spells SPELL_MARK_OF_ZELIEK = 28835, SPELL_MARK_DAMAGE = 28836, // Korth'azz - SPELL_KORTHAZZ_METEOR_10 = 28884, - SPELL_KORTHAZZ_METEOR_25 = 57467, + SPELL_KORTHAZZ_METEOR = 28884, // Blaumeux - SPELL_BLAUMEUX_SHADOW_BOLT_10 = 57374, - SPELL_BLAUMEUX_SHADOW_BOLT_25 = 57464, - SPELL_BLAUMEUX_VOID_ZONE_10 = 28863, - SPELL_BLAUMEUX_VOID_ZONE_25 = 57463, + SPELL_BLAUMEUX_SHADOW_BOLT = 57374, + SPELL_BLAUMEUX_VOID_ZONE = 28863, SPELL_BLAUMEUX_UNYIELDING_PAIN = 57381, // Zeliek - SPELL_ZELIEK_HOLY_WRATH_10 = 28883, - SPELL_ZELIEK_HOLY_WRATH_25 = 57466, - SPELL_ZELIEK_HOLY_BOLT_10 = 57376, - SPELL_ZELIEK_HOLY_BOLT_25 = 57465, + SPELL_ZELIEK_HOLY_WRATH = 28883, + SPELL_ZELIEK_HOLY_BOLT = 57376, SPELL_ZELIEK_CONDEMNATION = 57377, // Rivendare - SPELL_RIVENDARE_UNHOLY_SHADOW_10 = 28882, - SPELL_RIVENDARE_UNHOLY_SHADOW_25 = 57369 + SPELL_RIVENDARE_UNHOLY_SHADOW = 28882, }; enum Events @@ -87,15 +81,13 @@ enum FourHorsemen const uint32 TABLE_SPELL_MARK[4] = {SPELL_MARK_OF_ZELIEK, SPELL_MARK_OF_BLAUMEUX, SPELL_MARK_OF_RIVENDARE, SPELL_MARK_OF_KORTHAZZ}; // PRIMARY SPELL -const uint32 TABLE_SPELL_PRIMARY_10[4] = {SPELL_ZELIEK_HOLY_BOLT_10, SPELL_BLAUMEUX_SHADOW_BOLT_10, SPELL_RIVENDARE_UNHOLY_SHADOW_10, SPELL_KORTHAZZ_METEOR_10}; -const uint32 TABLE_SPELL_PRIMARY_25[4] = {SPELL_ZELIEK_HOLY_BOLT_25, SPELL_BLAUMEUX_SHADOW_BOLT_25, SPELL_RIVENDARE_UNHOLY_SHADOW_25, SPELL_KORTHAZZ_METEOR_25}; +const uint32 TABLE_SPELL_PRIMARY[4] = {SPELL_ZELIEK_HOLY_BOLT, SPELL_BLAUMEUX_SHADOW_BOLT, SPELL_RIVENDARE_UNHOLY_SHADOW, SPELL_KORTHAZZ_METEOR}; // PUNISH const uint32 TABLE_SPELL_PUNISH[4] = {SPELL_ZELIEK_CONDEMNATION, SPELL_BLAUMEUX_UNYIELDING_PAIN, 0, 0}; // SECONDARY SPELL -const uint32 TABLE_SPELL_SECONDARY_10[4] = {SPELL_ZELIEK_HOLY_WRATH_10, SPELL_BLAUMEUX_VOID_ZONE_10, 0, 0}; -const uint32 TABLE_SPELL_SECONDARY_25[4] = {SPELL_ZELIEK_HOLY_WRATH_25, SPELL_BLAUMEUX_VOID_ZONE_25, 0, 0}; +const uint32 TABLE_SPELL_SECONDARY[4] = {SPELL_ZELIEK_HOLY_WRATH, SPELL_BLAUMEUX_VOID_ZONE, 0, 0}; const Position WaypointPositions[12] = { @@ -308,11 +300,11 @@ public: return; case EVENT_PRIMARY_SPELL: Talk(SAY_TAUNT); - me->CastSpell(me->GetVictim(), RAID_MODE(TABLE_SPELL_PRIMARY_10[horsemanId], TABLE_SPELL_PRIMARY_25[horsemanId]), false); + me->CastSpell(me->GetVictim(), TABLE_SPELL_PRIMARY[horsemanId], false); events.Repeat(15s); return; case EVENT_SECONDARY_SPELL: - me->CastSpell(me->GetVictim(), RAID_MODE(TABLE_SPELL_SECONDARY_10[horsemanId], TABLE_SPELL_SECONDARY_25[horsemanId]), false); + me->CastSpell(me->GetVictim(), TABLE_SPELL_SECONDARY[horsemanId], false); events.Repeat(15s); return; } @@ -328,7 +320,7 @@ public: } if (me->IsWithinDistInMap(me->GetVictim(), 45.0f) && me->IsValidAttackTarget(me->GetVictim())) { - DoCastVictim(RAID_MODE(TABLE_SPELL_PRIMARY_10[horsemanId], TABLE_SPELL_PRIMARY_25[horsemanId])); + DoCastVictim(TABLE_SPELL_PRIMARY[horsemanId]); } else if (!me->IsWithinDistInMap(me->GetVictim(), 45.0f) || !me->IsValidAttackTarget(me->GetVictim())) { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index 30b678a876..41beeb9069 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -25,10 +25,8 @@ enum Spells { SPELL_MORTAL_WOUND = 25646, - SPELL_ENRAGE_10 = 28371, - SPELL_ENRAGE_25 = 54427, - SPELL_DECIMATE_10 = 28374, - SPELL_DECIMATE_25 = 54426, + SPELL_ENRAGE = 28371, + SPELL_DECIMATE = 28374, SPELL_DECIMATE_DAMAGE = 28375, SPELL_BERSERK = 26662, SPELL_INFECTED_WOUND = 29306, @@ -115,7 +113,7 @@ public: me->SetInCombatWithZone(); events.ScheduleEvent(EVENT_MORTAL_WOUND, 10s); events.ScheduleEvent(EVENT_ENRAGE, 22s); - events.ScheduleEvent(EVENT_DECIMATE, RAID_MODE(110000, 90000)); + events.ScheduleEvent(EVENT_DECIMATE, RAID_MODE(110s, 90s)); events.ScheduleEvent(EVENT_BERSERK, 6min); events.ScheduleEvent(EVENT_SUMMON_ZOMBIE, 10s); events.ScheduleEvent(EVENT_CAN_EAT_ZOMBIE, 1s); @@ -184,7 +182,7 @@ public: break; case EVENT_ENRAGE: Talk(EMOTE_ENRAGE); - me->CastSpell(me, RAID_MODE(SPELL_ENRAGE_10, SPELL_ENRAGE_25), true); + me->CastSpell(me, SPELL_ENRAGE, true); events.Repeat(22s); break; case EVENT_MORTAL_WOUND: @@ -193,8 +191,8 @@ public: break; case EVENT_DECIMATE: Talk(EMOTE_DECIMATE); - me->CastSpell(me, RAID_MODE(SPELL_DECIMATE_10, SPELL_DECIMATE_25), false); - events.RepeatEvent(RAID_MODE(110000, 90000)); + me->CastSpell(me, SPELL_DECIMATE, false); + events.Repeat(RAID_MODE(110s, 90s)); break; case EVENT_SUMMON_ZOMBIE: { @@ -218,7 +216,7 @@ public: break; } case EVENT_CAN_EAT_ZOMBIE: - events.RepeatEvent(1000); + events.Repeat(1s); if (me->GetVictim()->GetEntry() == NPC_ZOMBIE_CHOW && me->IsWithinMeleeRange(me->GetVictim())) { me->CastCustomSpell(SPELL_CHOW_SEARCHER, SPELLVALUE_RADIUS_MOD, 20000, me, true); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 939f0bf194..f071424563 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -41,8 +41,7 @@ enum Spells { // Gothik SPELL_HARVEST_SOUL = 28679, - SPELL_SHADOW_BOLT_10 = 29317, - SPELL_SHADOW_BOLT_25 = 56405, + SPELL_SHADOW_BOLT = 29317, // Teleport spells SPELL_TELEPORT_DEAD = 28025, SPELL_TELEPORT_LIVE = 28026, @@ -267,7 +266,7 @@ public: std::vector<Player*> tList; for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) { - if (!me->IsWithinDistInMap(itr->GetSource(), 200.0f, true, false) || !itr->GetSource()->IsAlive() || itr->GetSource()->IsGameMaster()) + if (!me->IsWithinDistInMap(itr->GetSource(), 200.0f, true, false, false) || !itr->GetSource()->IsAlive() || itr->GetSource()->IsGameMaster()) { continue; } @@ -400,7 +399,7 @@ public: Talk(SAY_INTRO_4); break; case EVENT_SHADOW_BOLT: - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_SHADOW_BOLT_10, SPELL_SHADOW_BOLT_25), false); + me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); events.Repeat(1s); break; case EVENT_HARVEST_SOUL: @@ -440,7 +439,7 @@ public: if (gothikWaves[waveCount][0]) { SummonHelpers(gothikWaves[waveCount][0]); - events.RepeatEvent(gothikWaves[waveCount][1]); + events.Repeat(Milliseconds(gothikWaves[waveCount][1])); } else { @@ -522,7 +521,7 @@ public: events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 3s); break; case NPC_DEAD_RIDER: - events.ScheduleEvent(EVENT_DRAIN_LIFE, 2000ms, 3500ms); + events.ScheduleEvent(EVENT_DRAIN_LIFE, 2s, 3500ms); events.ScheduleEvent(EVENT_UNHOLY_FRENZY, 5s, 9s); break; case NPC_DEAD_HORSE: diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 9a88b24a7b..60c0f0f9cf 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -29,10 +29,8 @@ enum Spells SPELL_POISON_CLOUD = 28240, SPELL_MUTATING_INJECTION = 28169, SPELL_MUTATING_EXPLOSION = 28206, - SPELL_SLIME_SPRAY_10 = 28157, - SPELL_SLIME_SPRAY_25 = 54364, - SPELL_POISON_CLOUD_DAMAGE_AURA_10 = 28158, - SPELL_POISON_CLOUD_DAMAGE_AURA_25 = 54362, + SPELL_SLIME_SPRAY = 28157, + SPELL_POISON_CLOUD_DAMAGE_AURA = 28158, SPELL_BERSERK = 26662, SPELL_BOMBARD_SLIME = 28280 }; @@ -102,15 +100,7 @@ public: events.ScheduleEvent(EVENT_POISON_CLOUD, 15s); events.ScheduleEvent(EVENT_MUTATING_INJECTION, 20s); events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s); - events.ScheduleEvent(EVENT_BERSERK, RAID_MODE(720000, 540000)); - } - - void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25) && target->IsPlayer()) - { - me->SummonCreature(NPC_FALLOUT_SLIME, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); - } + events.ScheduleEvent(EVENT_BERSERK, RAID_MODE(720s, 540s)); } void JustSummoned(Creature* cr) override @@ -169,7 +159,7 @@ public: break; case EVENT_SLIME_SPRAY: Talk(EMOTE_SLIME); - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25), false); + me->CastSpell(me->GetVictim(), SPELL_SLIME_SPRAY, false); events.Repeat(20s); break; case EVENT_MUTATING_INJECTION: @@ -177,7 +167,7 @@ public: { me->CastSpell(target, SPELL_MUTATING_INJECTION, false); } - events.RepeatEvent(6000 + uint32(120 * me->GetHealthPct())); + events.Repeat(Milliseconds(6000 + uint32(120 * me->GetHealthPct()))); break; } DoMeleeAttackIfReady(); @@ -223,7 +213,7 @@ public: auraVisualTimer += diff; if (auraVisualTimer >= 1000) { - me->CastSpell(me, (me->GetMap()->Is25ManRaid() ? SPELL_POISON_CLOUD_DAMAGE_AURA_25 : SPELL_POISON_CLOUD_DAMAGE_AURA_10), true); + me->CastSpell(me, SPELL_POISON_CLOUD_DAMAGE_AURA, true); auraVisualTimer = 0; } } @@ -291,10 +281,27 @@ class spell_grobbulus_mutating_injection_aura : public AuraScript } }; +class spell_grobbulus_slime_spray : public SpellScript +{ + PrepareSpellScript(spell_grobbulus_slime_spray); + + void HandleHit() + { + if (Unit* target = GetHitUnit()) + GetCaster()->SummonCreature(NPC_FALLOUT_SLIME, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); + } + + void Register() override + { + OnHit += SpellHitFn(spell_grobbulus_slime_spray::HandleHit); + } +}; + void AddSC_boss_grobbulus() { new boss_grobbulus(); new boss_grobbulus_poison_cloud(); RegisterSpellScript(spell_grobbulus_mutating_injection_aura); RegisterSpellScript(spell_grobbulus_poison); + RegisterSpellScript(spell_grobbulus_slime_spray); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index de73995e96..8ee7fe3cf8 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -34,8 +34,7 @@ enum Says enum Spells { SPELL_SPELL_DISRUPTION = 29310, - SPELL_DECREPIT_FEVER_10 = 29998, - SPELL_DECREPIT_FEVER_25 = 55011, + SPELL_DECREPIT_FEVER = 29998, SPELL_PLAGUE_CLOUD = 29350, SPELL_TELEPORT_SELF = 30211 }; @@ -168,7 +167,7 @@ public: events.Repeat(10s); break; case EVENT_DECEPIT_FEVER: - me->CastSpell(me, RAID_MODE(SPELL_DECREPIT_FEVER_10, SPELL_DECREPIT_FEVER_25), false); + me->CastSpell(me, SPELL_DECREPIT_FEVER, false); events.Repeat(22s, 25s); break; case EVENT_PLAGUE_CLOUD: diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 57866c7b00..43c0df905b 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -43,10 +43,8 @@ enum Yells enum Spells { // Kel'Thzuad - SPELL_FROST_BOLT_SINGLE_10 = 28478, - SPELL_FROST_BOLT_SINGLE_25 = 55802, - SPELL_FROST_BOLT_MULTI_10 = 28479, - SPELL_FROST_BOLT_MULTI_25 = 55807, + SPELL_FROST_BOLT_SINGLE = 28478, + SPELL_FROST_BOLT_MULTI = 28479, SPELL_SHADOW_FISURE = 27810, SPELL_VOID_BLAST = 27812, SPELL_DETONATE_MANA = 27819, @@ -367,11 +365,11 @@ public: me->CastSpell(me, SPELL_BERSERK, true); break; case EVENT_FROST_BOLT_SINGLE: - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_FROST_BOLT_SINGLE_10, SPELL_FROST_BOLT_SINGLE_25), false); + me->CastSpell(me->GetVictim(), SPELL_FROST_BOLT_SINGLE, false); events.Repeat(2s, 10s); break; case EVENT_FROST_BOLT_MULTI: - me->CastSpell(me, RAID_MODE(SPELL_FROST_BOLT_MULTI_10, SPELL_FROST_BOLT_MULTI_25), false); + me->CastSpell(me, SPELL_FROST_BOLT_MULTI, false); events.Repeat(15s, 30s); break; case EVENT_SHADOW_FISSURE: @@ -451,7 +449,7 @@ public: cr->AI()->Talk(SAY_ANSWER_REQUEST); for (uint8 i = 0 ; i < RAID_MODE(2, 4); ++i) - events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, 10000 + (i * 5000)); + events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, Milliseconds(10000 + (i * 5000))); break; } @@ -507,7 +505,7 @@ public: { if (!me->IsInCombat()) { - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); } } if (param == ACTION_GUARDIANS_OFF) diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp index fe8d1589e2..0ae3ab26d6 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp @@ -23,10 +23,8 @@ enum Spells { SPELL_NECROTIC_AURA = 55593, SPELL_SUMMON_SPORE = 29234, - SPELL_DEATHBLOOM_10 = 29865, - SPELL_DEATHBLOOM_25 = 55053, - SPELL_INEVITABLE_DOOM_10 = 29204, - SPELL_INEVITABLE_DOOM_25 = 55052, + SPELL_DEATHBLOOM = 29865, + SPELL_INEVITABLE_DOOM = 29204, SPELL_BERSERK = 26662 }; @@ -134,11 +132,11 @@ public: events.Repeat(20s); break; case EVENT_DEATHBLOOM: - me->CastSpell(me, RAID_MODE(SPELL_DEATHBLOOM_10, SPELL_DEATHBLOOM_25), false); + me->CastSpell(me, SPELL_DEATHBLOOM, false); events.Repeat(30s); break; case EVENT_INEVITABLE_DOOM: - me->CastSpell(me, RAID_MODE(SPELL_INEVITABLE_DOOM_10, SPELL_INEVITABLE_DOOM_25), false); + me->CastSpell(me, SPELL_INEVITABLE_DOOM, false); doomCounter++; events.Repeat(doomCounter < 6 ? 30s : 15s); break; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index 76bf91ccb0..1b2dd9f871 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -26,14 +26,10 @@ enum Spells { - SPELL_WEB_SPRAY_10 = 29484, - SPELL_WEB_SPRAY_25 = 54125, - SPELL_POISON_SHOCK_10 = 28741, - SPELL_POISON_SHOCK_25 = 54122, - SPELL_NECROTIC_POISON_10 = 54121, - SPELL_NECROTIC_POISON_25 = 28776, - SPELL_FRENZY_10 = 54123, - SPELL_FRENZY_25 = 54124, + SPELL_WEB_SPRAY = 29484, + SPELL_POISON_SHOCK = 28741, + SPELL_NECROTIC_POISON = 54121, + SPELL_FRENZY = 54123, SPELL_WEB_WRAP_STUN = 28622, SPELL_WEB_WRAP_SUMMON = 28627, SPELL_WEB_WRAP_KILL_WEBS = 52512, @@ -231,15 +227,15 @@ public: { case EVENT_WEB_SPRAY: Talk(EMOTE_WEB_SPRAY); - me->CastSpell(me, RAID_MODE(SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25), true); + me->CastSpell(me, SPELL_WEB_SPRAY, true); events.Repeat(40s); break; case EVENT_POISON_SHOCK: - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_POISON_SHOCK_10, SPELL_POISON_SHOCK_25), false); + me->CastSpell(me->GetVictim(), SPELL_POISON_SHOCK, false); events.Repeat(10s); break; case EVENT_NECROTIC_POISON: - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_NECROTIC_POISON_10, SPELL_NECROTIC_POISON_25), false); + me->CastSpell(me->GetVictim(), SPELL_NECROTIC_POISON, false); events.Repeat(30s); break; case EVENT_SUMMON_SPIDERLINGS: @@ -253,7 +249,7 @@ public: case EVENT_HEALTH_CHECK: if (me->GetHealthPct() < 30) { - me->CastSpell(me, RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25), true); + me->CastSpell(me, SPELL_FRENZY, true); break; } events.Repeat(1s); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 79045abcfd..d494649ffa 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -34,10 +34,8 @@ enum Says enum Spells { - SPELL_CURSE_OF_THE_PLAGUEBRINGER_10 = 29213, - SPELL_CURSE_OF_THE_PLAGUEBRINGER_25 = 54835, - SPELL_CRIPPLE_10 = 29212, - SPELL_CRIPPLE_25 = 54814, + SPELL_CURSE_OF_THE_PLAGUEBRINGER = 29213, + SPELL_CRIPPLE = 29212, SPELL_SUMMON_PLAGUED_WARRIORS = 29237, SPELL_TELEPORT = 29216, SPELL_TELEPORT_BACK = 29231, @@ -207,7 +205,7 @@ public: case EVENT_CURSE: if (events.GetPhaseMask() == 0) { - me->CastCustomSpell(RAID_MODE(SPELL_CURSE_OF_THE_PLAGUEBRINGER_10, SPELL_CURSE_OF_THE_PLAGUEBRINGER_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false); + me->CastCustomSpell(SPELL_CURSE_OF_THE_PLAGUEBRINGER, SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false); } events.Repeat(25s); break; @@ -228,7 +226,7 @@ public: break; case EVENT_BLINK: DoResetThreatList(); - me->CastSpell(me, RAID_MODE(SPELL_CRIPPLE_10, SPELL_CRIPPLE_25), false); + me->CastSpell(me, SPELL_CRIPPLE, false); me->CastSpell(me, SPELL_BLINK, true); Talk(EMOTE_BLINK); events.Repeat(30s); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index 3342c9a236..bd88d28896 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -30,8 +30,7 @@ enum Yells enum Spells { - SPELL_HATEFUL_STRIKE_10 = 41926, - SPELL_HATEFUL_STRIKE_25 = 59192, + SPELL_HATEFUL_STRIKE = 41926, SPELL_FRENZY = 28131, SPELL_BERSERK = 26662, SPELL_SLIME_BOLT = 32309 @@ -155,7 +154,7 @@ public: } if (finalTarget) { - me->CastSpell(finalTarget, RAID_MODE(SPELL_HATEFUL_STRIKE_10, SPELL_HATEFUL_STRIKE_25), false); + me->CastSpell(finalTarget, SPELL_HATEFUL_STRIKE, false); } events.Repeat(1s); break; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp index 14f3342454..7e5eb48a58 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp @@ -34,8 +34,7 @@ enum Says enum Spells { SPELL_UNBALANCING_STRIKE = 26613, - SPELL_DISRUPTING_SHOUT_10 = 55543, - SPELL_DISRUPTING_SHOUT_25 = 29107, + SPELL_DISRUPTING_SHOUT = 55543, SPELL_JAGGED_KNIFE = 55550, SPELL_HOPELESS = 29125, SPELL_TAUNT = 29060 @@ -267,7 +266,7 @@ public: events.Repeat(20s); break; case EVENT_DISRUPTING_SHOUT: - me->CastSpell(me, RAID_MODE(SPELL_DISRUPTING_SHOUT_10, SPELL_DISRUPTING_SHOUT_25), false); + me->CastSpell(me, SPELL_DISRUPTING_SHOUT, false); events.Repeat(15s); break; case EVENT_JAGGED_KNIFE: diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 98717dcbb1..2204ba3f12 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -33,14 +33,11 @@ enum Yells enum Spells { // Fight - SPELL_FROST_AURA_10 = 28531, - SPELL_FROST_AURA_25 = 55799, + SPELL_FROST_AURA = 28531, SPELL_CLEAVE = 19983, - SPELL_TAIL_SWEEP_10 = 55697, - SPELL_TAIL_SWEEP_25 = 55696, + SPELL_TAIL_SWEEP = 55697, SPELL_SUMMON_BLIZZARD = 28560, - SPELL_LIFE_DRAIN_10 = 28542, - SPELL_LIFE_DRAIN_25 = 55665, + SPELL_LIFE_DRAIN = 28542, SPELL_BERSERK = 26662, // Ice block @@ -160,7 +157,7 @@ public: { BossAI::JustEngagedWith(who); EnterCombatSelfFunction(); - me->CastSpell(me, RAID_MODE(SPELL_FROST_AURA_10, SPELL_FROST_AURA_25), true); + me->CastSpell(me, SPELL_FROST_AURA, true); events.ScheduleEvent(EVENT_BERSERK, 15min); events.ScheduleEvent(EVENT_CLEAVE, 5s); events.ScheduleEvent(EVENT_TAIL_SWEEP, 10s); @@ -258,11 +255,11 @@ public: events.Repeat(10s); return; case EVENT_TAIL_SWEEP: - me->CastSpell(me, RAID_MODE(SPELL_TAIL_SWEEP_10, SPELL_TAIL_SWEEP_25), false); + me->CastSpell(me, SPELL_TAIL_SWEEP, false); events.Repeat(10s); return; case EVENT_LIFE_DRAIN: - me->CastCustomSpell(RAID_MODE(SPELL_LIFE_DRAIN_10, SPELL_LIFE_DRAIN_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5), me, false); + me->CastCustomSpell(SPELL_LIFE_DRAIN, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5), me, false); events.Repeat(24s); return; case EVENT_BLIZZARD: @@ -280,7 +277,7 @@ public: { cr->GetMotionMaster()->MoveRandom(40); } - events.RepeatEvent(RAID_MODE(8000, 6500)); + events.Repeat(RAID_MODE(8000ms, 6500ms)); return; } case EVENT_FLIGHT_START: @@ -349,7 +346,7 @@ public: blockList.push_back((*itr)->GetGUID()); currentTarget = (*itr)->GetGUID(); --iceboltCount; - events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, (me->GetExactDist(*itr) / 13.0f)*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, Seconds(uint32(me->GetExactDist(*itr) / 13.0f))); } else { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index cf953363d4..cf7a1591ec 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -59,20 +59,17 @@ enum Spells SPELL_SHOCK_VISUAL = 28159, // Stalagg - SPELL_POWER_SURGE_10 = 54529, - SPELL_POWER_SURGE_25 = 28134, + SPELL_POWER_SURGE = 54529, SPELL_STALAGG_CHAIN = 28096, // Feugen - SPELL_STATIC_FIELD_10 = 28135, - SPELL_STATIC_FIELD_25 = 54528, + SPELL_STATIC_FIELD = 28135, SPELL_FEUGEN_CHAIN = 28111, // Thaddius SPELL_POLARITY_SHIFT = 28089, SPELL_BALL_LIGHTNING = 28299, - SPELL_CHAIN_LIGHTNING_10 = 28167, - SPELL_CHAIN_LIGHTNING_25 = 54531, + SPELL_CHAIN_LIGHTNING = 28167, SPELL_BERSERK = 27680, SPELL_THADDIUS_VISUAL_LIGHTNING = 28136, SPELL_THADDIUS_SPAWN_STUN = 28160, @@ -308,16 +305,17 @@ public: me->SetReactState(REACT_AGGRESSIVE); me->SetControlled(false, UNIT_STATE_STUNNED); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->SetControlled(false, UNIT_STATE_ROOT); events.ScheduleEvent(EVENT_THADDIUS_CHAIN_LIGHTNING, 14s); events.ScheduleEvent(EVENT_THADDIUS_BERSERK, 6min); - events.ScheduleEvent(EVENT_THADDIUS_POLARITY_SHIFT, 30s); + events.ScheduleEvent(EVENT_THADDIUS_POLARITY_SHIFT, 20s); events.ScheduleEvent(EVENT_ALLOW_BALL_LIGHTNING, 5s); return; case EVENT_THADDIUS_BERSERK: me->CastSpell(me, SPELL_BERSERK, true); break; case EVENT_THADDIUS_CHAIN_LIGHTNING: - me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_CHAIN_LIGHTNING_10, SPELL_CHAIN_LIGHTNING_25), false); + me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false); events.Repeat(15s); break; case EVENT_THADDIUS_POLARITY_SHIFT: @@ -497,11 +495,11 @@ public: switch (events.ExecuteEvent()) { case EVENT_MINION_POWER_SURGE: - me->CastSpell(me, RAID_MODE(SPELL_POWER_SURGE_10, SPELL_POWER_SURGE_25), false); + me->CastSpell(me, SPELL_POWER_SURGE, false); events.Repeat(19s); break; case EVENT_MINION_STATIC_FIELD: - me->CastSpell(me, RAID_MODE(SPELL_STATIC_FIELD_10, SPELL_STATIC_FIELD_25), false); + me->CastSpell(me, SPELL_STATIC_FIELD, false); events.Repeat(3s); break; case EVENT_MINION_MAGNETIC_PULL: diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 894ee59604..002566c6e1 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -745,7 +745,7 @@ public: if (Creature* cr = me->SummonCreature(NPC_LIVING_POISON, entry.Start, TEMPSUMMON_TIMED_DESPAWN, entry.DespawnTime)) { cr->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); - cr->GetMotionMaster()->MovePoint(0, entry.End, false); + cr->GetMotionMaster()->MovePoint(0, entry.End, FORCED_MOVEMENT_NONE, 0.f, false); } _events.Repeat(5s); diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index eb39ef71b6..e06d19cf34 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -57,10 +57,8 @@ enum MovementInformPoints enum MalygosSpells { SPELL_BERSERK = 64238, - SPELL_ARCANE_BREATH_N = 56272, - SPELL_ARCANE_BREATH_H = 60072, - SPELL_ARCANE_STORM_N = 61693, - SPELL_ARCANE_STORM_H = 61694, + SPELL_ARCANE_BREATH = 56272, + SPELL_ARCANE_STORM = 61693, SPELL_VORTEX_VISUAL = 55873, SPELL_VORTEX_CONTROL_VEHICLE = 56263, @@ -80,8 +78,7 @@ enum MalygosSpells SPELL_DESTROY_PLATFORM_VISUAL = 59084, SPELL_ARCANE_PULSE = 57432, - SPELL_PH3_SURGE_OF_POWER_N = 57407, - SPELL_PH3_SURGE_OF_POWER_H = 60936, + SPELL_PH3_SURGE_OF_POWER = 57407, SPELL_STATIC_FIELD_MAIN = 57430, SPELL_STATIC_FIELD_SUMMON = 57431, @@ -89,10 +86,6 @@ enum MalygosSpells SPELL_STATIC_FIELD_DAMAGE = 57429, }; -#define SPELL_ARCANE_BREATH DUNGEON_MODE(SPELL_ARCANE_BREATH_N, SPELL_ARCANE_BREATH_H) -#define SPELL_ARCANE_STORM DUNGEON_MODE(SPELL_ARCANE_STORM_N, SPELL_ARCANE_STORM_H) -#define SPELL_PH3_SURGE_OF_POWER DUNGEON_MODE(SPELL_PH3_SURGE_OF_POWER_N, SPELL_PH3_SURGE_OF_POWER_H) - enum MalygosEvents { EVENT_INTRO_MOVE_CENTER = 1, @@ -471,7 +464,7 @@ public: me->SetDisableGravity(true); me->GetMotionMaster()->MoveTakeoff(MI_POINT_VORTEX_TAKEOFF, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ() + 20.0f, 7.0f); - events.DelayEvents(25000, 1); // don't delay berserk (group 0) + events.DelayEvents(25s, 1); // don't delay berserk (group 0) } break; case EVENT_VORTEX_FLY_TO_CENTER: @@ -521,16 +514,14 @@ public: } //pPlayer->ClearUnitState(UNIT_STATE_ONVEHICLE); - Movement::MoveSplineInit init(pPlayer); + Movement::MoveSplineInit init(pPlayer); // TODO: has to be removed and handled with vehicle exit and vehicle enter code init.MoveTo(CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ()); init.SetFacing(pPlayer->GetOrientation()); init.SetTransportExit(); init.Launch(); pPlayer->SetUnitMovementFlags(MOVEMENTFLAG_NONE); - pPlayer->SetDisableGravity(true, true); - - sScriptMgr->AnticheatSetCanFlybyServer(pPlayer, true); + pPlayer->SetDisableGravity(true); WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8); data << pPlayer->GetPackGUID(); @@ -674,7 +665,7 @@ public: case EVENT_CHECK_TRASH_DEAD: { if (me->FindNearestCreature(NPC_SCION_OF_ETERNITY, 250.0f, true) || me->FindNearestCreature(NPC_NEXUS_LORD, 250.0f, true)) - events.RepeatEvent(3000); + events.Repeat(3s); else { me->SendMeleeAttackStop(); @@ -727,7 +718,7 @@ public: { c->SetFaction(pPlayer->GetFaction()); //pPlayer->CastCustomSpell(60683, SPELLVALUE_BASE_POINT0, 1, c, true); - c->m_Events.AddEvent(new EoEDrakeEnterVehicleEvent(*c, pPlayer->GetGUID()), c->m_Events.CalculateTime(500)); + c->m_Events.AddEventAtOffset(new EoEDrakeEnterVehicleEvent(*c, pPlayer->GetGUID()), 500ms); AttackStart(c); } } @@ -803,10 +794,10 @@ public: { case NPC_ARCANE_OVERLOAD: summon->CastSpell(summon, SPELL_ARCANE_OVERLOAD_DMG, true); - summon->DespawnOrUnsummon(45000); + summon->DespawnOrUnsummon(45s); break; case NPC_STATIC_FIELD: - summon->DespawnOrUnsummon(20000); + summon->DespawnOrUnsummon(20s); break; } } @@ -898,9 +889,9 @@ public: { Player* plr = pass->ToPlayer(); float speed = plr->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()) / (1.0f * 0.001f); - plr->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed); + plr->SetDisableGravity(false); // packet only would lead to issues elsewhere + plr->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed); plr->RemoveAura(SPELL_FREEZE_ANIM); - plr->SetDisableGravity(false, true); plr->SetGuidValue(PLAYER_FARSIGHT, ObjectGuid::Empty); sScriptMgr->AnticheatSetCanFlybyServer(plr, false); @@ -941,10 +932,7 @@ public: if (!bUpdatedFlying && timer) { bUpdatedFlying = true; - plr->SetDisableGravity(true, true); - - sScriptMgr->AnticheatSetCanFlybyServer(plr, true); - sScriptMgr->AnticheatSetUnderACKmount(plr); + plr->SetDisableGravity(true); } plr->SendMonsterMove(me->GetPositionX() + dist * cos(arcangle), me->GetPositionY() + dist * std::sin(arcangle), me->GetPositionZ(), VORTEX_DEFAULT_DIFF * 2, SPLINEFLAG_FLYING); @@ -998,7 +986,7 @@ public: MoveTimer = 0; me->GetMotionMaster()->MoveIdle(); me->DisableSpline(); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.05f, 7.0f); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.05f, FORCED_MOVEMENT_NONE, 7.0f); break; } } @@ -1013,12 +1001,11 @@ public: MoveTimer = 0; me->GetMotionMaster()->MoveIdle(); me->DisableSpline(); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ(), 100.0f); - me->SetPosition(me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ(), me->GetOrientation()); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), CenterPos.GetPositionZ(), FORCED_MOVEMENT_NONE, 100.0f); me->ReplaceAllUnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); me->RemoveAura(SPELL_POWER_SPARK_VISUAL); me->CastSpell(me, SPELL_POWER_SPARK_GROUND_BUFF, true); - me->DespawnOrUnsummon(60000); + me->DespawnOrUnsummon(60s); } } } @@ -1221,8 +1208,9 @@ public: if (Vehicle* v = me->GetVehicle()) v->RemoveAllPassengers(); - if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, me); + if (killer) + if (Player* player = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, me); } void MoveInLineOfSight(Unit* /*who*/) override {} @@ -1459,14 +1447,14 @@ public: else if (pass && pass->IsPlayer() && me->IsAlive()) { me->SetDisplayId(11686); // prevents nasty falling animation at despawn - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } } void JustDied(Unit* /*killer*/) override { me->SetDisplayId(11686); // prevents nasty falling animation at despawn - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } }; }; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h index b61b1d7cb7..83e1a845cb 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h @@ -71,15 +71,12 @@ enum eSpells SPELL_TELEPORT_VISUAL = 52096, SPELL_SCION_ARCANE_BARRAGE = 56397, - SPELL_ARCANE_SHOCK_N = 57058, - SPELL_ARCANE_SHOCK_H = 60073, + SPELL_ARCANE_SHOCK = 57058, SPELL_HASTE = 57060, SPELL_ALEXSTRASZA_GIFT = 61028, }; -#define SPELL_ARCANE_SHOCK DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H) - enum eAchiev { ACHIEV_CRITERIA_DENYIN_THE_SCION_10 = 7573, diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index 4f4b09b758..48e220df36 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -29,7 +29,7 @@ bool EoEDrakeEnterVehicleEvent::Execute(uint64 /*eventTime*/, uint32 /*updateTim p->CastCustomSpell(60683, SPELLVALUE_BASE_POINT0, 1, &_owner, true); return true; } - _owner.DespawnOrUnsummon(1); + _owner.DespawnOrUnsummon(1ms); return true; } @@ -89,7 +89,7 @@ public: c->SetCanFly(true); c->SetFaction(pPlayer->GetFaction()); //pPlayer->CastCustomSpell(60683, SPELLVALUE_BASE_POINT0, 1, c, true); - c->m_Events.AddEvent(new EoEDrakeEnterVehicleEvent(*c, pPlayer->GetGUID()), c->m_Events.CalculateTime(500)); + c->m_Events.AddEventAtOffset(new EoEDrakeEnterVehicleEvent(*c, pPlayer->GetGUID()), 500ms); } } } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp index 397f9ec8bb..717e7954f0 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp @@ -94,7 +94,7 @@ struct boss_anomalus : public BossAI { if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD)) { - events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000); + events.DelayEvents(Milliseconds(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000)); me->RemoveAura(SPELL_RIFT_SHIELD); me->InterruptNonMeleeSpells(false); } @@ -114,7 +114,6 @@ struct boss_anomalus : public BossAI BossAI::JustEngagedWith(who); activeRifts = 0; - events.SetTimer(45000); events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s); events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s); events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); @@ -164,7 +163,7 @@ struct boss_anomalus : public BossAI Talk(EMOTE_RIFT); me->CastSpell(me, SPELL_CREATE_RIFT, false); //Once we hit 51% hp mark, after each rift we spawn an empowered - events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); + events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); break; case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED: Talk(SAY_RIFT); @@ -172,7 +171,7 @@ struct boss_anomalus : public BossAI me->CastSpell(me, SPELL_CREATE_RIFT, false); me->CastSpell(me, SPELL_RIFT_SHIELD, true); - me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000)); + me->m_Events.AddEventAtOffset(new ChargeRifts(me), 1s); events.DelayEvents(46s); //As we just spawned an empowered spawn a normal one events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index a367d60592..eb4842098a 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -75,7 +75,7 @@ struct boss_keristrasza : public BossAI me->CastSpell(me, SPELL_INTENSE_COLD, true); events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s); - events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); + events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20s, 11s)); events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s); events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s); @@ -89,7 +89,7 @@ struct boss_keristrasza : public BossAI void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_SLAY); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -174,7 +174,7 @@ struct boss_keristrasza : public BossAI me->CastSpell(me, SPELL_CRYSTALIZE, false); else if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false); - events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); + events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20s, 11s)); break; } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index 90781cfbc7..e41c190aeb 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -132,7 +132,7 @@ struct boss_magus_telestra : public BossAI void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -150,7 +150,7 @@ struct boss_magus_telestra : public BossAI if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature()) { events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s); - caster->ToCreature()->DespawnOrUnsummon(1000); + caster->ToCreature()->DespawnOrUnsummon(1s); if (++copiesDied >= 3) { diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index 82b36095db..982750c2bd 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -93,7 +93,7 @@ struct boss_ormorok : public BossAI void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_KILL); events.ScheduleEvent(EVENT_KILL_TALK, 6s); diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp index 3781b4799d..a05ca6dc14 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp @@ -22,8 +22,7 @@ enum Spells { SPELL_MAGIC_PULL = 51336, - SPELL_THUNDERING_STOMP_N = 50774, - SPELL_THUNDERING_STOMP_H = 59370, + SPELL_THUNDERING_STOMP = 50774, SPELL_UNSTABLE_SPHERE_PASSIVE = 50756, SPELL_UNSTABLE_SPHERE_PULSE = 50757, @@ -44,8 +43,6 @@ enum Events EVENT_SUMMON_x4 = 4, }; -#define SPELL_THUNDERING_STOMP DUNGEON_MODE(SPELL_THUNDERING_STOMP_N, SPELL_THUNDERING_STOMP_H) - enum Yells { SAY_AGGRO = 0, diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp index 4b491b156d..5f9f71dc89 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp @@ -22,10 +22,8 @@ enum Spells { - SPELL_ARCANE_BARRAGE_N = 50804, - SPELL_ARCANE_BARRAGE_H = 59381, - SPELL_ARCANE_VOLLEY_N = 51153, - SPELL_ARCANE_VOLLEY_H = 59382, + SPELL_ARCANE_BARRAGE = 50804, + SPELL_ARCANE_VOLLEY = 51153, SPELL_ENRAGED_ASSAULT = 51170, SPELL_PLANAR_ANOMALIES = 57959, SPELL_PLANAR_SHIFT = 51162, @@ -38,9 +36,6 @@ enum Spells SPELL_DRAKE_STOP_TIME = 49838, }; -#define SPELL_ARCANE_BARRAGE DUNGEON_MODE(SPELL_ARCANE_BARRAGE_N, SPELL_ARCANE_BARRAGE_H) -#define SPELL_ARCANE_VOLLEY DUNGEON_MODE(SPELL_ARCANE_VOLLEY_N, SPELL_ARCANE_VOLLEY_H) - enum VarosNPCs { NPC_LEY_GUARDIAN_WHELP = 28276, @@ -208,7 +203,7 @@ public: break; case EVENT_SUMMON_WHELPS: for( uint8 i = 0; i < 5; ++i ) - events.ScheduleEvent(EVENT_SUMMON_SINGLE_WHELP, urand(0, 8000)); + events.ScheduleEvent(EVENT_SUMMON_SINGLE_WHELP, 0ms, 8s); events.Repeat(40s); break; case EVENT_SUMMON_SINGLE_WHELP: diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp index 6793cc0505..2ead69d977 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp @@ -29,15 +29,10 @@ enum Spells SPELL_TELEPORT = 51112, SPELL_FROSTBOMB = 51103, - SPELL_TIME_BOMB_N = 51121, - SPELL_TIME_BOMB_H = 59376, - SPELL_EMPOWERED_ARCANE_EXPLOSION_N = 51110, - SPELL_EMPOWERED_ARCANE_EXPLOSION_H = 59377, + SPELL_TIME_BOMB = 51121, + SPELL_EMPOWERED_ARCANE_EXPLOSION = 51110, }; -#define SPELL_EMPOWERED_ARCANE_EXPLOSION DUNGEON_MODE(SPELL_EMPOWERED_ARCANE_EXPLOSION_N, SPELL_EMPOWERED_ARCANE_EXPLOSION_H) -//#define SPELL_TIME_BOMB DUNGEON_MODE(SPELL_TIME_BOMB_N, SPELL_TIME_BOMB_H) - enum UromNPCs { NPC_PHANTASMAL_CLOUDSCRAPER = 27645, @@ -298,9 +293,9 @@ public: //At this point we are still in casting state so we need to clear it for DoCastAOE not to fail me->ClearUnitState(UNIT_STATE_CASTING); - DoCastAOE(DUNGEON_MODE(SPELL_EMPOWERED_ARCANE_EXPLOSION_N, SPELL_EMPOWERED_ARCANE_EXPLOSION_H)); + DoCastAOE(SPELL_EMPOWERED_ARCANE_EXPLOSION); me->AddUnitState(UNIT_STATE_CASTING); - events.RescheduleEvent(EVENT_TELE_BACK, DUNGEON_MODE(9000, 7000)); + events.RescheduleEvent(EVENT_TELE_BACK, DUNGEON_MODE(9s, 7s)); default: break; } @@ -347,7 +342,7 @@ public: break; case EVENT_TIME_BOMB: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - DoCast(target, DUNGEON_MODE(SPELL_TIME_BOMB_N, SPELL_TIME_BOMB_H)); + DoCast(target, SPELL_TIME_BOMB); events.Repeat(20s, 25s); break; case EVENT_TELEPORT_TO_CENTER: diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index be7191ca09..71d4450864 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -23,13 +23,10 @@ enum Spells { SPELL_CORE_AURA_PASSIVE = 50798, - SPELL_AMPLIFY_MAGIC_N = 51054, - SPELL_AMPLIFY_MAGIC_H = 59371, + SPELL_AMPLIFY_MAGIC = 51054, - SPELL_ENERGIZE_CORES_N = 50785, - SPELL_ENERGIZE_CORES_H = 59372, - SPELL_ENERGIZE_CORES_THIN_N = 61407, - SPELL_ENERGIZE_CORES_THIN_H = 62136, + SPELL_ENERGIZE_CORES = 50785, + SPELL_ENERGIZE_CORES_THIN = 61407, SPELL_ENERGIZE_CORES_TRIGGER_1 = 54069, SPELL_ENERGIZE_CORES_TRIGGER_2 = 56251, @@ -63,10 +60,6 @@ enum Events EVENT_ENERGIZE_CORES_DAMAGE = 7, }; -#define SPELL_AMPLIFY_MAGIC DUNGEON_MODE(SPELL_AMPLIFY_MAGIC_N, SPELL_AMPLIFY_MAGIC_H) -#define SPELL_ENERGIZE_CORES DUNGEON_MODE(SPELL_ENERGIZE_CORES_N, SPELL_ENERGIZE_CORES_H) -#define SPELL_ENERGIZE_CORES_THIN DUNGEON_MODE(SPELL_ENERGIZE_CORES_THIN_N, SPELL_ENERGIZE_CORES_THIN_H) - enum Says { SAY_AGGRO = 0, diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 01cdb73fb3..4fd9d715df 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -38,7 +38,6 @@ enum Drakes // Centrifuge Constructs SPELL_EMPOWERING_BLOWS = 50044, - H_SPELL_EMPOWERING_BLOWS = 59213, SPELL_AMBER_SHOCK_CHARGE = 49836, SPELL_RUBY_EVASIVE_CHARGES = 50241, @@ -387,7 +386,7 @@ public: } else { - me->DespawnOrUnsummon(2050); + me->DespawnOrUnsummon(2050ms); me->SetOrientation(2.5f); me->SetSpeedRate(MOVE_FLIGHT, 1.0f); Position pos = me->GetPosition(); @@ -444,7 +443,7 @@ public: } else { - me->DespawnOrUnsummon(2050); + me->DespawnOrUnsummon(2050ms); me->SetOrientation(2.5f); me->SetSpeedRate(MOVE_FLIGHT, 1.0f); Position pos = me->GetPosition(); @@ -461,7 +460,7 @@ public: { if (despawnTimer >= 5000) { - me->DespawnOrUnsummon(2050); + me->DespawnOrUnsummon(2050ms); me->SetOrientation(2.5f); Position pos = me->GetPosition(); Position offset = { 10.0f, 10.0f, 12.0f, 0.0f }; @@ -490,7 +489,7 @@ public: void JustEngagedWith(Unit* /*who*/) override { - DoCast(IsHeroic() ? H_SPELL_EMPOWERING_BLOWS : SPELL_EMPOWERING_BLOWS); + DoCast(SPELL_EMPOWERING_BLOWS); } void UpdateAI(uint32 /*diff*/) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 9435ba6491..10cbd2cd5d 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -49,8 +49,7 @@ enum BjarngrimSpells // STORMFORGED LIEUTENANT SPELL_ARC_WELD = 59085, - SPELL_RENEW_STEEL_N = 52774, - SPELL_RENEW_STEEL_H = 59160, + SPELL_RENEW_STEEL = 52774, }; enum BjarngrimOther @@ -91,6 +90,9 @@ enum BjarngrimEvents // STORMFORGED LIEUTENANT EVENT_ARC_WELD = 41, EVENT_RENEW_STEEL = 42, + + // CHARGE UP + EVENT_CHARGE_UP = 51, }; enum Yells @@ -106,334 +108,343 @@ enum Yells EMOTE_BERSEKER_STANCE = 8, }; -class boss_bjarngrim : public CreatureScript +struct boss_bjarngrim : public npc_escortAI { -public: - boss_bjarngrim() : CreatureScript("boss_bjarngrim") { } + boss_bjarngrim(Creature* creature) : npc_escortAI(creature), summons(creature) + { + m_pInstance = creature->GetInstanceScript(); + InitializeWaypoints(); + me->SetWalk(true); + Start(true, ObjectGuid::Empty, nullptr, false, true); + } - CreatureAI* GetAI(Creature* creature) const override + void InitializeWaypoints() { - return GetHallsOfLightningAI<boss_bjarngrimAI>(creature); + AddWaypoint(1, 1262.0f, -26.9f, 33.5f, 10000); + AddWaypoint(2, 1262.18f, 99.3f, 33.5f, 10000); + AddWaypoint(3, 1262.0f, -26.9f, 33.5f, 0); + AddWaypoint(4, 1332.0f, -26.6f, 40.18f, 10000); + AddWaypoint(5, 1395.092f, 36.6425f, 50.038f, 10000); + AddWaypoint(6, 1332.0f, -26.6f, 40.18f, 0); + AddWaypoint(7, 1262.0f, -26.9f, 33.5f, 0); } - struct boss_bjarngrimAI : public npc_escortAI + void Reset() override { - boss_bjarngrimAI(Creature* creature) : npc_escortAI(creature), summons(creature) - { - m_pInstance = creature->GetInstanceScript(); - - // Init waypoints - AddWaypoint(1, 1262.18f, 99.3f, 33.5f, 0); - AddWaypoint(2, 1281.6f, 99.5f, 33.5f, 0); - AddWaypoint(3, 1311.7f, 99.4f, 40.1f, 0); - AddWaypoint(4, 1332.5f, 99.7f, 40.18f, 0); - AddWaypoint(5, 1311.7f, 99.4f, 40.1f, 0); - AddWaypoint(6, 1281.6f, 99.5f, 33.5f, 0); - AddWaypoint(7, 1262.18f, 99.3f, 33.5f, 0); - AddWaypoint(8, 1262, -26.9f, 33.5f, 0); - AddWaypoint(9, 1281.2f, -26.8f, 33.5f, 0); - AddWaypoint(10, 1311.3f, -26.9f, 40.03f, 0); - AddWaypoint(11, 1332, -26.6f, 40.18f, 0); - AddWaypoint(12, 1311.3f, -26.9f, 40.03f, 0); - AddWaypoint(13, 1281.2f, -26.8f, 33.5f, 0); - AddWaypoint(14, 1262, -26.9f, 33.5f, 0); - - Start(true, false, ObjectGuid::Empty, nullptr, false, true); - } + events.Reset(); + summons.DespawnAll(); - InstanceScript* m_pInstance; - EventMap events; - SummonList summons; - uint8 m_uiStance; + for (uint8 i = 0; i < 2; ++i) + if (Creature* dwarf = me->SummonCreature(NPC_STORMFORGED_LIEUTENANT, me->GetPositionX() + urand(4, 12), me->GetPositionY() + urand(4, 12), me->GetPositionZ())) + { + float angle = i == 0 ? 2.5f : 3.78f; + dwarf->GetMotionMaster()->MoveFollow(me, 3, angle); + summons.Summon(dwarf); + } - void Reset() override - { - events.Reset(); - summons.DespawnAll(); - - for (uint8 i = 0; i < 2; ++i) - if (Creature* dwarf = me->SummonCreature(NPC_STORMFORGED_LIEUTENANT, me->GetPositionX() + urand(4, 12), me->GetPositionY() + urand(4, 12), me->GetPositionZ())) - { - dwarf->GetMotionMaster()->MoveFollow(me, 3, rand_norm() * 2 * 3.14f); - summons.Summon(dwarf); - } - - me->RemoveAllAuras(); - me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true); - RollStance(0, STANCE_DEFENSIVE); - - if (m_pInstance) - m_pInstance->SetData(TYPE_BJARNGRIM, NOT_STARTED); - } + me->RemoveAllAuras(); - void JustEngagedWith(Unit*) override - { - me->SetInCombatWithZone(); - Talk(SAY_AGGRO); + if (m_pInstance) + m_pInstance->SetBossState(DATA_BJARNGRIM, NOT_STARTED); - events.ScheduleEvent(EVENT_BJARNGRIM_CHANGE_STANCE, 20s, 0); + DoCastSelf(SPELL_BATTLE_STANCE, true); + SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE); + } - // DEFENSIVE STANCE - events.ScheduleEvent(EVENT_BJARNGRIM_REFLECTION, 8s, STANCE_DEFENSIVE); - events.ScheduleEvent(EVENT_BJARNGRIM_PUMMEL, 5s, STANCE_DEFENSIVE); - events.ScheduleEvent(EVENT_BJARNGRIM_KNOCK, 16s, STANCE_DEFENSIVE); - events.ScheduleEvent(EVENT_BJARNGRIM_IRONFORM, 12s, STANCE_DEFENSIVE); + void JustEngagedWith(Unit*) override + { + me->SetInCombatWithZone(); + Talk(SAY_AGGRO); - // BERSERKER STANCE - events.ScheduleEvent(EVENT_BJARNGRIM_MORTAL_STRIKE, 24s, STANCE_BERSERKER); - events.ScheduleEvent(EVENT_BJARNGRIM_WHIRLWIND, 26s, STANCE_BERSERKER); + RollStance(STANCE_BATTLE); - // BATTLE STANCE - events.ScheduleEvent(EVENT_BJARNGRIM_INTERCEPT, 23s, STANCE_BATTLE); - events.ScheduleEvent(EVENT_BJARNGRIM_CLEAVE, 25s, STANCE_BATTLE); - events.ScheduleEvent(EVENT_BJARNGRIM_SLAM, 30s, STANCE_BATTLE); + events.ScheduleEvent(EVENT_BJARNGRIM_CHANGE_STANCE, 20s, 0); - if (m_pInstance) - { - m_pInstance->SetData(TYPE_BJARNGRIM, IN_PROGRESS); - m_pInstance->SetData(DATA_BJARNGRIM_ACHIEVEMENT, me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE)); - } - } + // DEFENSIVE STANCE + events.ScheduleEvent(EVENT_BJARNGRIM_REFLECTION, 8s, STANCE_DEFENSIVE); + events.ScheduleEvent(EVENT_BJARNGRIM_KNOCK, 16s, STANCE_DEFENSIVE); + events.ScheduleEvent(EVENT_BJARNGRIM_IRONFORM, 12s, STANCE_DEFENSIVE); - void KilledUnit(Unit* victim) override - { - if (!victim->IsPlayer()) - return; + // BERSERKER STANCE + events.ScheduleEvent(EVENT_BJARNGRIM_INTERCEPT, 23s, STANCE_BERSERKER); + events.ScheduleEvent(EVENT_BJARNGRIM_CLEAVE, 25s, STANCE_BERSERKER); + events.ScheduleEvent(EVENT_BJARNGRIM_WHIRLWIND, 26s, STANCE_BERSERKER); - Talk(SAY_SLAY); - } + // BATTLE STANCE + events.ScheduleEvent(EVENT_BJARNGRIM_PUMMEL, 5s, STANCE_BATTLE); + events.ScheduleEvent(EVENT_BJARNGRIM_MORTAL_STRIKE, 24s, STANCE_BATTLE); + events.ScheduleEvent(EVENT_BJARNGRIM_SLAM, 30s, STANCE_BATTLE); - void JustDied(Unit*) override + if (m_pInstance) { - Talk(SAY_DEATH); - - if (m_pInstance) - m_pInstance->SetData(TYPE_BJARNGRIM, DONE); + m_pInstance->SetBossState(DATA_BJARNGRIM, IN_PROGRESS); + m_pInstance->SetData(DATA_BJARNGRIM_ACHIEVEMENT, me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE)); } + } - void RemoveStanceAura(uint8 stance) - { - switch (stance) - { - case STANCE_DEFENSIVE: - me->RemoveAura(SPELL_DEFENSIVE_STANCE); - me->RemoveAura(SPELL_DEFENSIVE_AURA); - break; - case STANCE_BERSERKER: - me->RemoveAura(SPELL_BERSERKER_STANCE); - me->RemoveAura(SPELL_BERSERKER_AURA); - break; - case STANCE_BATTLE: - me->RemoveAura(SPELL_BATTLE_STANCE); - me->RemoveAura(SPELL_BATTLE_AURA); - break; - } - } + void KilledUnit(Unit* victim) override + { + if (!victim->IsPlayer()) + return; - void RollStance(uint8 stance, uint8 force = 0) + Talk(SAY_SLAY); + } + + void JustDied(Unit*) override + { + Talk(SAY_DEATH); + + if (m_pInstance) + m_pInstance->SetBossState(DATA_BJARNGRIM, DONE); + } + + void RemoveStanceAura(uint8 stance) + { + switch (stance) { - if (urand(0, 1)) - stance = (++stance == 4 ? 1 : stance); - else - stance = (--stance == 0 ? 3 : stance); + case STANCE_DEFENSIVE: + me->RemoveAura(SPELL_DEFENSIVE_STANCE); + me->RemoveAura(SPELL_DEFENSIVE_AURA); + break; + case STANCE_BERSERKER: + me->RemoveAura(SPELL_BERSERKER_STANCE); + me->RemoveAura(SPELL_BERSERKER_AURA); + break; + case STANCE_BATTLE: + me->RemoveAura(SPELL_BATTLE_STANCE); + me->RemoveAura(SPELL_BATTLE_AURA); + break; + } + } - if (force) - stance = force; + void RollStance(uint8 stance, uint8 force = 0) + { + if (urand(0, 1)) + stance = (++stance == 4 ? 1 : stance); + else + stance = (--stance == 0 ? 3 : stance); - switch (stance) - { - case STANCE_DEFENSIVE: - Talk(SAY_DEFENSIVE_STANCE); + if (force) + stance = force; - me->CastSpell(me, SPELL_DEFENSIVE_STANCE, true); - me->CastSpell(me, SPELL_DEFENSIVE_AURA, true); + switch (stance) + { + case STANCE_DEFENSIVE: + Talk(SAY_DEFENSIVE_STANCE); - events.DelayEvents(20000, STANCE_BERSERKER); - events.DelayEvents(20000, STANCE_BATTLE); + DoCastSelf(SPELL_DEFENSIVE_STANCE, true); + DoCastSelf(SPELL_DEFENSIVE_AURA, true); - SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE); - break; - case STANCE_BERSERKER: - Talk(SAY_BERSERKER_STANCE); + events.DelayEvents(20s, STANCE_BERSERKER); + events.DelayEvents(20s, STANCE_BATTLE); - me->CastSpell(me, SPELL_BERSERKER_STANCE, true); - me->CastSpell(me, SPELL_BERSERKER_AURA, true); + SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE); + break; + case STANCE_BERSERKER: + Talk(SAY_BERSERKER_STANCE); - events.DelayEvents(20000, STANCE_DEFENSIVE); - events.DelayEvents(20000, STANCE_BATTLE); + DoCastSelf(SPELL_BERSERKER_STANCE, true); + DoCastSelf(SPELL_BERSERKER_AURA, true); - SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE); - break; - case STANCE_BATTLE: - Talk(SAY_BATTLE_STANCE); + events.DelayEvents(20s, STANCE_DEFENSIVE); + events.DelayEvents(20s, STANCE_BATTLE); - me->CastSpell(me, SPELL_BATTLE_STANCE, true); - me->CastSpell(me, SPELL_BATTLE_AURA, true); + SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE); + break; + case STANCE_BATTLE: + Talk(SAY_BATTLE_STANCE); - events.DelayEvents(20000, STANCE_BERSERKER); - events.DelayEvents(20000, STANCE_DEFENSIVE); + DoCastSelf(SPELL_BATTLE_STANCE, true); + DoCastSelf(SPELL_BATTLE_AURA, true); - SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); - break; - } + events.DelayEvents(20s, STANCE_BERSERKER); + events.DelayEvents(20s, STANCE_DEFENSIVE); - m_uiStance = stance; + SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); + break; } - void WaypointReached(uint32 Point) override + m_uiStance = stance; + } + + void WaypointReached(uint32 Point) override + { + if (Point == 1) { - if (Point == 1 || Point == 8) - me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true); - else if (Point == 7 || Point == 14) - me->RemoveAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE); + events.CancelEvent(EVENT_CHARGE_UP); + events.ScheduleEvent(EVENT_CHARGE_UP, 2500ms, 0); } - - void UpdateEscortAI(uint32 diff) override + else if (Point == 2) { - if (!me->IsInCombat()) - return; + events.CancelEvent(EVENT_CHARGE_UP); + } + else if (Point == 3) + { + me->RemoveAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE); + } + else if (Point == 4) + { + events.CancelEvent(EVENT_CHARGE_UP); + events.ScheduleEvent(EVENT_CHARGE_UP, 2500ms, 0); + } + else if (Point == 5) + { + events.CancelEvent(EVENT_CHARGE_UP); + } + else if (Point == 6) + { + me->RemoveAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE); + } + } + + void UpdateEscortAI(uint32 diff) override + { + events.Update(diff); - // Return since we have no target - if (!UpdateVictim()) + if (uint32 eventId = events.ExecuteEvent()) + { + if (eventId == EVENT_CHARGE_UP) { - Reset(); + me->CastSpell(me, SPELL_CHARGE_UP, true); + me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true); return; } + } - events.Update(diff); + if (!me->IsInCombat()) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + // Return since we have no target + if (!UpdateVictim()) + { + Reset(); + return; + } - switch (events.ExecuteEvent()) - { - case EVENT_BJARNGRIM_CHANGE_STANCE: - // roll new stance - RemoveStanceAura(m_uiStance); - RollStance(m_uiStance); - events.Repeat(20s); - break; - - /////////////////////////////////////////////////////// - ///// DEFENSIVE STANCE - /////////////////////////////////////////////////////// - case EVENT_BJARNGRIM_REFLECTION: - me->CastSpell(me, SPELL_BJARNGRIM_REFLETION, true); - events.Repeat(8s, 9s); - break; - case EVENT_BJARNGRIM_PUMMEL: - me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false); - events.Repeat(10s, 11s); - break; - case EVENT_BJARNGRIM_KNOCK: - me->CastSpell(me, SPELL_KNOCK_AWAY, false); - events.Repeat(20s, 21s); - break; - case EVENT_BJARNGRIM_IRONFORM: - me->CastSpell(me, SPELL_IRONFORM, true); - events.Repeat(18s, 23s); - break; - - /////////////////////////////////////////////////////// - ///// BERSERKER STANCE - /////////////////////////////////////////////////////// - case EVENT_BJARNGRIM_MORTAL_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); - events.Repeat(10s); - break; - case EVENT_BJARNGRIM_WHIRLWIND: - me->CastSpell(me, SPELL_WHIRLWIND, true); - events.Repeat(25s); - break; - - /////////////////////////////////////////////////////// - ///// BATTLE STANCE - /////////////////////////////////////////////////////// - case EVENT_BJARNGRIM_INTERCEPT: - if (Unit* target = SelectTarget(SelectTargetMethod::Random)) - me->CastSpell(target, SPELL_INTERCEPT, true); - - events.Repeat(30s); - break; - case EVENT_BJARNGRIM_CLEAVE: - me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); - events.Repeat(25s); - break; - case EVENT_BJARNGRIM_SLAM: - me->CastSpell(me->GetVictim(), SPELL_SLAM, false); - events.Repeat(10s, 12s); - break; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); + switch (events.ExecuteEvent()) + { + case EVENT_BJARNGRIM_CHANGE_STANCE: + // roll new stance + RemoveStanceAura(m_uiStance); + RollStance(m_uiStance); + events.Repeat(20s); + break; + + case EVENT_CHARGE_UP: + DoCastSelf(SPELL_CHARGE_UP, true); + DoCastSelf(SPELL_TEMPORARY_ELECTRICAL_CHARGE, true); + break; + + // DEFENSIVE STANCE + case EVENT_BJARNGRIM_REFLECTION: + DoCastSelf(SPELL_BJARNGRIM_REFLETION, true); + events.Repeat(8s, 9s); + break; + case EVENT_BJARNGRIM_PUMMEL: + DoCastVictim(SPELL_PUMMEL); + events.Repeat(10s, 11s); + break; + case EVENT_BJARNGRIM_KNOCK: + DoCastAOE(SPELL_KNOCK_AWAY); + events.Repeat(20s, 21s); + break; + case EVENT_BJARNGRIM_IRONFORM: + DoCastSelf(SPELL_IRONFORM, true); + events.Repeat(18s, 23s); + break; + + // BERSERKER STANCE + case EVENT_BJARNGRIM_MORTAL_STRIKE: + DoCastVictim(SPELL_MORTAL_STRIKE); + events.Repeat(10s); + break; + case EVENT_BJARNGRIM_WHIRLWIND: + DoCastSelf(SPELL_WHIRLWIND, true); + events.Repeat(25s); + break; + + // BATTLE STANCE + case EVENT_BJARNGRIM_INTERCEPT: + DoCastRandomTarget(SPELL_INTERCEPT, 0, 40.0f, false, true); + events.Repeat(30s); + break; + case EVENT_BJARNGRIM_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.Repeat(25s); + break; + case EVENT_BJARNGRIM_SLAM: + DoCastVictim(SPELL_SLAM); + events.Repeat(10s, 12s); + break; } - }; + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* m_pInstance; + EventMap events; + SummonList summons; + uint8 m_uiStance; }; -class npc_stormforged_lieutenant : public CreatureScript +struct npc_stormforged_lieutenant : public ScriptedAI { -public: - npc_stormforged_lieutenant() : CreatureScript("npc_stormforged_lieutenant") { } + npc_stormforged_lieutenant(Creature* creature) : ScriptedAI(creature) { } - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetHallsOfLightningAI<npc_stormforged_lieutenantAI>(creature); + if (me->IsSummon()) + BjarngrimGUID = me->ToTempSummon()->GetSummonerGUID(); + else + BjarngrimGUID.Clear(); } - struct npc_stormforged_lieutenantAI : public ScriptedAI + void JustEngagedWith(Unit*) override { - npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature) { } + events.ScheduleEvent(EVENT_ARC_WELD, 2s); + events.ScheduleEvent(EVENT_RENEW_STEEL, 10s, 11s); + } - EventMap events; - ObjectGuid BjarngrimGUID; + void UpdateAI(uint32 diff) override + { + //Return since we have no target + if (!UpdateVictim()) + return; - void Reset() override - { - if (me->IsSummon()) - BjarngrimGUID = me->ToTempSummon()->GetSummonerGUID(); - else - BjarngrimGUID.Clear(); - } + events.Update(diff); - void JustEngagedWith(Unit*) override - { - events.ScheduleEvent(EVENT_ARC_WELD, 2s); - events.ScheduleEvent(EVENT_RENEW_STEEL, 10s, 11s); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + switch (events.ExecuteEvent()) { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_ARC_WELD: + me->CastSpell(me->GetVictim(), SPELL_ARC_WELD, true); + events.Repeat(20s); + break; + case EVENT_RENEW_STEEL: + if (Creature* bjarngrim = ObjectAccessor::GetCreature(*me, BjarngrimGUID)) + if (bjarngrim->IsAlive()) + me->CastSpell(bjarngrim, SPELL_RENEW_STEEL, true); + + events.Repeat(10s, 14s); + break; + } - switch (events.ExecuteEvent()) - { - case EVENT_ARC_WELD: - me->CastSpell(me->GetVictim(), SPELL_ARC_WELD, true); - events.Repeat(20s); - break; - case EVENT_RENEW_STEEL: - if (Creature* bjarngrim = ObjectAccessor::GetCreature(*me, BjarngrimGUID)) - if (bjarngrim->IsAlive()) - me->CastSpell(bjarngrim, me->GetMap()->IsHeroic() ? SPELL_RENEW_STEEL_H : SPELL_RENEW_STEEL_N, true); - - events.Repeat(10s, 14s); - break; - } + DoMeleeAttackIfReady(); + } - DoMeleeAttackIfReady(); - } - }; + private: + EventMap events; + ObjectGuid BjarngrimGUID; }; void AddSC_boss_bjarngrim() { - new boss_bjarngrim(); - new npc_stormforged_lieutenant(); + RegisterHallOfLightningCreatureAI(boss_bjarngrim); + RegisterHallOfLightningCreatureAI(npc_stormforged_lieutenant); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index 752ef36a30..6a72e570c8 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -25,10 +25,8 @@ enum IonarSpells { - SPELL_BALL_LIGHTNING_N = 52780, - SPELL_BALL_LIGHTNING_H = 59800, - SPELL_STATIC_OVERLOAD_N = 52658, - SPELL_STATIC_OVERLOAD_H = 59795, + SPELL_BALL_LIGHTNING = 52780, + SPELL_STATIC_OVERLOAD = 52658, SPELL_STATIC_OVERLOAD_KNOCK = 53337, SPELL_DISPERSE = 52770, @@ -36,8 +34,7 @@ enum IonarSpells SPELL_SPARK_DESPAWN = 52776, //Spark of Ionar - SPELL_SPARK_VISUAL_TRIGGER_N = 52667, - SPELL_SPARK_VISUAL_TRIGGER_H = 59833, + SPELL_SPARK_VISUAL_TRIGGER = 52667, SPELL_RANDOM_LIGHTNING = 52663, }; @@ -66,213 +63,191 @@ enum IonarEvents EVENT_CHECK_HEALTH = 3, EVENT_CALL_SPARKS = 4, EVENT_RESTORE = 5, + EVENT_CHANGE_TARGET = 6, }; -class boss_ionar : public CreatureScript +struct boss_ionar : public BossAI { -public: - boss_ionar() : CreatureScript("boss_ionar") { } + boss_ionar(Creature* creature) : BossAI(creature, DATA_IONAR) { } - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetHallsOfLightningAI<boss_ionarAI>(creature); + _Reset(); + me->SetVisible(true); + + ScheduleHealthCheckEvent(50, [&] { + DoCastSelf(SPELL_DISPERSE); + }); } - struct boss_ionarAI : public ScriptedAI + void ScheduleEvents(bool spark) { - boss_ionarAI(Creature* creature) : ScriptedAI(creature), summons(creature) - { - m_pInstance = creature->GetInstanceScript(); - } - - InstanceScript* m_pInstance; - EventMap events; - SummonList summons; - uint8 HealthCheck; - - void Reset() override - { - HealthCheck = 50; - events.Reset(); - summons.DespawnAll(); - - me->SetVisible(true); - - if (m_pInstance) - m_pInstance->SetData(TYPE_IONAR, NOT_STARTED); - } - - void ScheduleEvents(bool spark) - { - events.SetPhase(1); - if (!spark) - events.RescheduleEvent(EVENT_CHECK_HEALTH, 1s, 0, 1); + events.SetPhase(1); + if (!spark) + events.RescheduleEvent(EVENT_CHECK_HEALTH, 1s, 0, 1); - events.RescheduleEvent(EVENT_BALL_LIGHTNING, 10s, 0, 1); - events.RescheduleEvent(EVENT_STATIC_OVERLOAD, 5s, 0, 1); - } - - void JustEngagedWith(Unit*) override - { - me->SetInCombatWithZone(); - Talk(SAY_AGGRO); - - if (m_pInstance) - m_pInstance->SetData(TYPE_IONAR, IN_PROGRESS); - - ScheduleEvents(false); - } + events.RescheduleEvent(EVENT_BALL_LIGHTNING, 7s, 11s, 0, 1); + events.RescheduleEvent(EVENT_STATIC_OVERLOAD, 6s, 12s, 0, 1); + } - void JustDied(Unit*) override - { - Talk(SAY_DEATH); + void JustEngagedWith(Unit*) override + { + _JustEngagedWith(); + Talk(SAY_AGGRO); + ScheduleEvents(false); + } - summons.DespawnAll(); + void JustDied(Unit*) override + { + _JustDied(); + Talk(SAY_DEATH); + } - if (m_pInstance) - m_pInstance->SetData(TYPE_IONAR, DONE); - } + void KilledUnit(Unit* victim) override + { + if (!victim->IsPlayer()) + return; - void KilledUnit(Unit* victim) override - { - if (!victim->IsPlayer()) - return; + Talk(SAY_SLAY); + } - Talk(SAY_SLAY); - } + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + if (spell->Id == SPELL_DISPERSE) + Split(); + } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override - { - if (spell->Id == SPELL_DISPERSE) - Split(); - } + void Split() + { + Talk(SAY_SPLIT); - void Split() + for (uint8 i = 0; i < 5; ++i) { - Talk(SAY_SPLIT); - - Creature* spark; - for (uint8 i = 0; i < 5; ++i) + if (Creature* spark = me->SummonCreature(NPC_SPARK_OF_IONAR, me->GetPosition(), TEMPSUMMON_TIMED_DESPAWN, 20000)) { - if ((spark = me->SummonCreature(NPC_SPARK_OF_IONAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 20000))) - { - summons.Summon(spark); - spark->CastSpell(spark, me->GetMap()->IsHeroic() ? SPELL_SPARK_VISUAL_TRIGGER_H : SPELL_SPARK_VISUAL_TRIGGER_N, true); - spark->CastSpell(spark, SPELL_RANDOM_LIGHTNING, true); - spark->SetUnitFlag(UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - spark->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0); + spark->CastSpell(spark, SPELL_SPARK_VISUAL_TRIGGER, true); + spark->CastSpell(spark, SPELL_RANDOM_LIGHTNING, true); + spark->SetUnitFlag(UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + spark->SetHomePosition(me->GetPosition()); - if (Player* tgt = SelectTargetFromPlayerList(100)) - spark->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); - } + if (Player* tgt = SelectTargetFromPlayerList(100)) + spark->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); } - - me->SetVisible(false); - me->SetControlled(true, UNIT_STATE_STUNNED); - - events.SetPhase(2); - events.ScheduleEvent(EVENT_CALL_SPARKS, 15s, 0, 2); } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); + me->SetVisible(false); + me->SetControlled(true, UNIT_STATE_STUNNED); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + events.SetPhase(2); + events.ScheduleEvent(EVENT_CALL_SPARKS, 20s, 0, 2); + } - switch (events.ExecuteEvent()) - { - case EVENT_BALL_LIGHTNING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random)) - me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_BALL_LIGHTNING_H : SPELL_BALL_LIGHTNING_N, false); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Repeat(10s, 11s); - break; - case EVENT_STATIC_OVERLOAD: - if (Unit* target = SelectTarget(SelectTargetMethod::Random)) - me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_STATIC_OVERLOAD_H : SPELL_STATIC_OVERLOAD_N, false); + events.Update(diff); - events.Repeat(5s, 6s); - break; - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(HealthCheck)) - me->CastSpell(me, SPELL_DISPERSE, false); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - events.Repeat(1s); - return; - case EVENT_CALL_SPARKS: - { - EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); - summons.DoAction(ACTION_CALLBACK, pred); - events.ScheduleEvent(EVENT_RESTORE, 2s, 0, 2); - return; - } - case EVENT_RESTORE: + switch (events.ExecuteEvent()) + { + case EVENT_BALL_LIGHTNING: + DoCastRandomTarget(SPELL_BALL_LIGHTNING, 1, 0.0f, false); + events.Repeat(8s, 18s); + break; + case EVENT_STATIC_OVERLOAD: + DoCastRandomTarget(SPELL_STATIC_OVERLOAD); + events.Repeat(9s, 14s); + break; + case EVENT_CALL_SPARKS: + { EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); - summons.DoAction(ACTION_SPARK_DESPAWN, pred); - - me->SetVisible(true); - me->SetControlled(false, UNIT_STATE_STUNNED); - ScheduleEvents(true); + summons.DoAction(ACTION_CALLBACK, pred); + events.ScheduleEvent(EVENT_RESTORE, 5s, 0, 2); return; - } + } + case EVENT_RESTORE: + EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); + summons.DoAction(ACTION_SPARK_DESPAWN, pred); - DoMeleeAttackIfReady(); + me->SetVisible(true); + me->SetControlled(false, UNIT_STATE_STUNNED); + ScheduleEvents(true); + return; } - }; + + DoMeleeAttackIfReady(); + } }; -class npc_spark_of_ionar : public CreatureScript +struct npc_spark_of_ionar : public ScriptedAI { -public: - npc_spark_of_ionar() : CreatureScript("npc_spark_of_ionar") { } + npc_spark_of_ionar(Creature* creature) : ScriptedAI(creature) { } - CreatureAI* GetAI(Creature* creature) const override + void MoveInLineOfSight(Unit*) override { } + void AttackStart(Unit* /*who*/) override { } + + void Reset() override { - return GetHallsOfLightningAI<npc_spark_of_ionarAI>(creature); + returning = false; + _events.ScheduleEvent(EVENT_CHANGE_TARGET, 3s); } - struct npc_spark_of_ionarAI : public ScriptedAI + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { - npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature) { } - - bool returning; + damage = 0; + } - void MoveInLineOfSight(Unit*) override { } - void UpdateAI(uint32) override { } - void AttackStart(Unit* /*who*/) override { } + void UpdateAI(uint32 diff) override + { + if (returning) + return; - void Reset() override { returning = false; } + _events.Update(diff); - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override + while (uint32 eventId = _events.ExecuteEvent()) { - damage = 0; + switch (eventId) + { + case EVENT_CHANGE_TARGET: + if (Player* tgt = SelectTargetFromPlayerList(100)) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); + } + _events.Repeat(3s); + break; + } } + } - void DoAction(int32 param) override + void DoAction(int32 param) override + { + if (param == ACTION_CALLBACK) { - if (param == ACTION_CALLBACK) - { - me->SetSpeed(MOVE_RUN, 2.5f); - me->GetThreatMgr().ClearAllThreat(); - me->CombatStop(true); - me->GetMotionMaster()->MoveTargetedHome(); - returning = true; - } - else if (param == ACTION_SPARK_DESPAWN) - { - me->GetMotionMaster()->MoveIdle(); + _events.Reset(); + me->SetSpeed(MOVE_RUN, 2.5f); + me->GetThreatMgr().ClearAllThreat(); + me->CombatStop(true); + me->GetMotionMaster()->MoveTargetedHome(); + returning = true; + } + else if (param == ACTION_SPARK_DESPAWN) + { + me->GetMotionMaster()->MoveIdle(); - me->RemoveAllAuras(); - me->CastSpell(me, SPELL_SPARK_DESPAWN, true); - me->DespawnOrUnsummon(1000); - } + me->RemoveAllAuras(); + me->CastSpell(me, SPELL_SPARK_DESPAWN, true); + me->DespawnOrUnsummon(1s); } - }; + } + + private: + EventMap _events; + bool returning; }; // 52658, 59795 - Static Overload @@ -291,7 +266,8 @@ class spell_ionar_static_overload : public AuraScript return; if (Unit* target = GetTarget()) - target->CastSpell(target, SPELL_STATIC_OVERLOAD_KNOCK, true); + if (target->GetMap() && !target->GetMap()->IsHeroic()) + target->CastSpell(target, SPELL_STATIC_OVERLOAD_KNOCK, true); } void Register() override @@ -302,7 +278,7 @@ class spell_ionar_static_overload : public AuraScript void AddSC_boss_ionar() { - new boss_ionar(); - new npc_spark_of_ionar(); + RegisterHallOfLightningCreatureAI(boss_ionar); + RegisterHallOfLightningCreatureAI(npc_spark_of_ionar); RegisterSpellScript(spell_ionar_static_overload); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index 75c4c06d20..361c232865 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -25,13 +25,11 @@ enum LokenSpells { SPELL_ARC_LIGHTNING = 52921, - SPELL_LIGHTNING_NOVA_N = 52960, - SPELL_LIGHTNING_NOVA_H = 59835, + SPELL_LIGHTNING_NOVA = 52960, SPELL_LIGHTNING_NOVA_VISUAL = 56502, SPELL_LIGHTNING_NOVA_THUNDERS = 52663, - SPELL_PULSING_SHOCKWAVE_N = 52961, - SPELL_PULSING_SHOCKWAVE_H = 59836, + SPELL_PULSING_SHOCKWAVE = 52961, // Achievement ACHIEVEMENT_TIMELY_DEATH = 20384 @@ -60,198 +58,112 @@ enum LokenEvents EVENT_AURA_REMOVE = 5 }; -class boss_loken : public CreatureScript +struct boss_loken : public BossAI { -public: - boss_loken() : CreatureScript("boss_loken") { } + boss_loken(Creature* creature) : BossAI(creature, DATA_LOKEN), _introDone(false) { } - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetHallsOfLightningAI<boss_lokenAI>(creature); + _Reset(); + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH); + + me->RemoveAllAuras(); + + ScheduleHealthCheckEvent(75, [&] { + Talk(SAY_75HEALTH); + }); + + ScheduleHealthCheckEvent(50, [&] { + Talk(SAY_50HEALTH); + }); + + ScheduleHealthCheckEvent(25, [&] { + Talk(SAY_25HEALTH); + }); } - struct boss_lokenAI : public ScriptedAI + void MoveInLineOfSight(Unit* who) override { - boss_lokenAI(Creature* creature) : ScriptedAI(creature) - { - m_pInstance = creature->GetInstanceScript(); - if (m_pInstance) - isActive = m_pInstance->GetData(TYPE_LOKEN_INTRO); - } + BossAI::MoveInLineOfSight(who); + + if (_introDone || !who->IsPlayer() || !me->IsWithinDistInMap(who, 40.0f)) + return; - InstanceScript* m_pInstance; - EventMap events; + Talk(SAY_INTRO_1); + Talk(SAY_INTRO_2, 10s); + _introDone = true; + } - bool isActive; - uint32 IntroTimer; - uint8 HealthCheck; + void JustEngagedWith(Unit*) override + { + me->m_Events.KillAllEvents(false); + _JustEngagedWith(); + Talk(SAY_AGGRO); - void MoveInLineOfSight(Unit*) override { } + events.ScheduleEvent(EVENT_ARC_LIGHTNING, 10s); + events.ScheduleEvent(EVENT_SHOCKWAVE, 3s); + events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 15s); - void Reset() override - { - events.Reset(); - if (m_pInstance) - { - m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH); - m_pInstance->SetData(TYPE_LOKEN, NOT_STARTED); - } - - HealthCheck = 75; - IntroTimer = 0; - me->RemoveAllAuras(); - - if (!isActive) - { - me->SetControlled(true, UNIT_STATE_STUNNED); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - } - else - { - me->SetControlled(false, UNIT_STATE_STUNNED); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - } - } + if (IsHeroic()) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH); + } - void JustEngagedWith(Unit*) override - { - me->SetInCombatWithZone(); - Talk(SAY_AGGRO); + void JustDied(Unit*) override + { + _JustDied(); + Talk(SAY_DEATH); + } - events.ScheduleEvent(EVENT_ARC_LIGHTNING, 10s); - events.ScheduleEvent(EVENT_SHOCKWAVE, 3s); - events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 15s); + void KilledUnit(Unit* victim) override + { + if (!victim->IsPlayer()) + return; - if (m_pInstance) - { - m_pInstance->SetData(TYPE_LOKEN, IN_PROGRESS); + Talk(SAY_SLAY); + } - if (me->GetMap()->IsHeroic()) - m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH); - } - } + void UpdateAI(uint32 diff) override + { + //Return since we have no target + if (!UpdateVictim()) + return; - void JustDied(Unit*) override - { - Talk(SAY_DEATH); + events.Update(diff); - if (m_pInstance) - m_pInstance->SetData(TYPE_LOKEN, DONE); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void LokenSpeach(bool hp) + switch (events.ExecuteEvent()) { - if (hp) - { - switch (HealthCheck) - { - case 75: - Talk(SAY_75HEALTH); - break; - case 50: - Talk(SAY_50HEALTH); - break; - case 25: - Talk(SAY_25HEALTH); - break; - } - } - else + case EVENT_LIGHTNING_NOVA: Talk(SAY_NOVA); + events.Repeat(15s); + me->CastSpell(me, SPELL_LIGHTNING_NOVA_VISUAL, true); + me->CastSpell(me, SPELL_LIGHTNING_NOVA_THUNDERS, true); + + events.DelayEvents(5s); + events.ScheduleEvent(EVENT_AURA_REMOVE, me->GetMap()->IsHeroic() ? 4s : 5s); + + me->CastSpell(me, SPELL_LIGHTNING_NOVA, false); + break; + case EVENT_SHOCKWAVE: + me->CastSpell(me, SPELL_PULSING_SHOCKWAVE, false); + break; + case EVENT_ARC_LIGHTNING: + if (Unit* target = SelectTargetFromPlayerList(100, SPELL_ARC_LIGHTNING)) + me->CastSpell(target, SPELL_ARC_LIGHTNING, false); + + events.Repeat(12s); + break; + case EVENT_AURA_REMOVE: + me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS); + break; } - void KilledUnit(Unit* victim) override - { - if (!victim->IsPlayer()) - return; - - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) override - { - if (!isActive) - { - IntroTimer += diff; - if (IntroTimer > 5000 && IntroTimer < 10000) - { - if (SelectTargetFromPlayerList(60)) - { - Talk(SAY_INTRO_1); - IntroTimer = 10000; - } - else - IntroTimer = 0; - } - - if (IntroTimer >= 30000 && IntroTimer < 40000) - { - Talk(SAY_INTRO_2); - IntroTimer = 40000; - } - if (IntroTimer >= 60000) - { - isActive = true; - if (m_pInstance) - m_pInstance->SetData(TYPE_LOKEN_INTRO, 1); - - me->SetControlled(false, UNIT_STATE_STUNNED); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - - if (Player* target = SelectTargetFromPlayerList(80)) - AttackStart(target); - } - - return; - } - - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(HealthCheck)) - { - LokenSpeach(true); - HealthCheck -= 25; - } - - events.Repeat(1s); - break; - case EVENT_LIGHTNING_NOVA: - events.Repeat(15s); - me->CastSpell(me, SPELL_LIGHTNING_NOVA_VISUAL, true); - me->CastSpell(me, SPELL_LIGHTNING_NOVA_THUNDERS, true); - - events.DelayEvents(5s); - events.ScheduleEvent(EVENT_AURA_REMOVE, me->GetMap()->IsHeroic() ? 4s : 5s); - - me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_LIGHTNING_NOVA_H : SPELL_LIGHTNING_NOVA_N, false); - break; - case EVENT_SHOCKWAVE: - me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_PULSING_SHOCKWAVE_H : SPELL_PULSING_SHOCKWAVE_N, false); - break; - case EVENT_ARC_LIGHTNING: - if (Unit* target = SelectTargetFromPlayerList(100, SPELL_ARC_LIGHTNING)) - me->CastSpell(target, SPELL_ARC_LIGHTNING, false); - - events.Repeat(12s); - break; - case EVENT_AURA_REMOVE: - me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } + private: + bool _introDone; }; class spell_loken_pulsing_shockwave : public SpellScript @@ -276,6 +188,6 @@ class spell_loken_pulsing_shockwave : public SpellScript void AddSC_boss_loken() { - new boss_loken(); + RegisterHallOfLightningCreatureAI(boss_loken); RegisterSpellScript(spell_loken_pulsing_shockwave); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index c64594b114..7e7e800b9a 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -23,19 +23,16 @@ enum VolkahnSpells { // Volkhan - SPELL_HEAT_N = 52387, - SPELL_HEAT_H = 59528, - SPELL_SHATTERING_STOMP_N = 52237, - SPELL_SHATTERING_STOMP_H = 59529, + SPELL_HEAT = 52387, + SPELL_SHATTERING_STOMP = 52237, SPELL_TEMPER = 52238, SPELL_SUMMON_MOLTEN_GOLEM = 52405, //Molten Golem SPELL_BLAST_WAVE = 23113, - SPELL_IMMOLATION_STRIKE_N = 52433, - SPELL_IMMOLATION_STRIKE_H = 59530, - SPELL_SHATTER_N = 52429, - SPELL_SHATTER_H = 59527, + SPELL_COOL_DOWN = 52443, + SPELL_IMMOLATION_STRIKE = 52433, + SPELL_SHATTER = 52429, }; enum VolkhanOther @@ -63,8 +60,8 @@ enum VolkhanEvents EVENT_MOVE_TO_ANVIL = 5, // Molten Golem - EVENT_BLAST = 11, - EVENT_IMMOLATION = 12, + EVENT_IMMOLATION_STRIKE = 12, + EVENT_CHANGE_TARGET = 13, }; enum Yells @@ -78,506 +75,316 @@ enum Yells EMOTE_SHATTER = 6, }; -class boss_volkhan : public CreatureScript +struct boss_volkhan : public BossAI { -public: - boss_volkhan() : CreatureScript("boss_volkhan") { } + boss_volkhan(Creature* creature) : BossAI(creature, DATA_VOLKHAN), summons(creature) { } - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetHallsOfLightningAI<boss_volkhanAI>(creature); + _Reset(); + x = y = z = PointID = ShatteredCount = 0; + shatteredStompCast = false; + me->SetSpeed(MOVE_RUN, 1.2f, true); + me->SetReactState(REACT_AGGRESSIVE); + instance->SetData(DATA_VOLKHAN_ACHIEVEMENT, true); } - struct boss_volkhanAI : public ScriptedAI + void JustEngagedWith(Unit*) override { - boss_volkhanAI(Creature* creature) : ScriptedAI(creature), summons(creature) - { - m_pInstance = creature->GetInstanceScript(); - } + _JustEngagedWith(); + me->SetInCombatWithZone(); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, randtime(9s, 14s)); + events.ScheduleEvent(EVENT_HEAT, randtime(18s, 38s)); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s); + events.ScheduleEvent(EVENT_POSITION, 4s); + } - InstanceScript* m_pInstance; - EventMap events; - SummonList summons; - uint8 HealthCheck; - float x, y, z; - uint8 PointID; - uint8 ShatteredCount; + void JustDied(Unit*) override + { + _JustDied(); + Talk(SAY_DEATH); + } - void Reset() override + void GetNextPos() + { + if (me->GetPositionY() < -180) { - x = y = z = PointID = ShatteredCount = 0; - HealthCheck = 100; - events.Reset(); - summons.DespawnAll(); - me->SetSpeed(MOVE_RUN, 1.2f, true); - me->SetReactState(REACT_AGGRESSIVE); + if (me->GetPositionX() > 1330) + x = 1355; + else + x = 1308; - if (m_pInstance) - { - m_pInstance->SetData(TYPE_VOLKHAN, NOT_STARTED); - m_pInstance->SetData(DATA_VOLKHAN_ACHIEVEMENT, true); - } + y = -178; + z = 52.5f; } - - void JustEngagedWith(Unit*) override + else if (me->GetPositionY() < -145) { - me->SetInCombatWithZone(); - Talk(SAY_AGGRO); - - if (m_pInstance) - m_pInstance->SetData(TYPE_VOLKHAN, IN_PROGRESS); + if (me->GetPositionX() > 1330) + x = 1355; + else + x = 1308; - ScheduleEvents(false); + y = -137; + z = 52.5f; } - - void JustDied(Unit*) override + else if (me->GetPositionY() < -130) { - Talk(SAY_DEATH); - - summons.DespawnAll(); + if (me->GetPositionX() > 1330) + x = 1343; + else + x = 1320; - if (m_pInstance) - m_pInstance->SetData(TYPE_VOLKHAN, DONE); + y = -123; + z = 56.7f; } - - void GetNextPos() + else { - if (me->GetPositionY() < -180) - { - if (me->GetPositionX() > 1330) - x = 1355; - else - x = 1308; - - y = -178; - z = 52.5f; - } - else if (me->GetPositionY() < -145) - { - if (me->GetPositionX() > 1330) - x = 1355; - else - x = 1308; - - y = -137; - z = 52.5f; - } - else if (me->GetPositionY() < -130) - { - if (me->GetPositionX() > 1330) - x = 1343; - else - x = 1320; - - y = -123; - z = 56.7f; - } - else - { - PointID = POINT_ANVIL; - x = 1327; - y = -96; - z = 56.7f; - } + PointID = POINT_ANVIL; + x = 1327; + y = -96; + z = 56.7f; } + } - void KilledUnit(Unit* victim) override - { - if (!victim->IsPlayer()) - return; - - Talk(SAY_SLAY); - } + void KilledUnit(Unit* victim) override + { + if (!victim->IsPlayer()) + return; - void ScheduleEvents(bool anvil) - { - events.SetPhase(1); - events.RescheduleEvent(EVENT_HEAT, 8s, 0, 1); - events.RescheduleEvent(EVENT_SHATTER, 10s, 0, 1); - events.RescheduleEvent(EVENT_CHECK_HEALTH, anvil ? 1s : 6s, 0, 1); - events.RescheduleEvent(EVENT_POSITION, 4s, 0, 1); - } + Talk(SAY_SLAY); + } - void JustSummoned(Creature* summon) override + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + if (summon->GetEntry() == NPC_MOLTEN_GOLEM) { - summons.Summon(summon); - if (summon->GetEntry() == NPC_MOLTEN_GOLEM) - { - summon->SetFaction(me->GetFaction()); + summon->SetFaction(me->GetFaction()); - if (Unit* target = SelectTarget(SelectTargetMethod::Random)) - summon->AI()->AttackStart(target); - } + if (Unit* target = SelectTarget(SelectTargetMethod::Random)) + summon->AI()->AttackStart(target); } + } - void DoAction(int32 param) override + void DoAction(int32 param) override + { + if (param == ACTION_DESTROYED) { - if (param == ACTION_DESTROYED) - { - ShatteredCount++; - if (ShatteredCount > 4) - m_pInstance->SetData(DATA_VOLKHAN_ACHIEVEMENT, false); - } + ShatteredCount++; + if (ShatteredCount > 4) + instance->SetData(DATA_VOLKHAN_ACHIEVEMENT, false); } + } - void MovementInform(uint32 type, uint32 id) override + bool HasActiveGolem() + { + for (ObjectGuid const& guid : summons) { - if (type != POINT_MOTION_TYPE) - return; - - if (id == POINT_ANVIL) + if (Creature* golem = ObjectAccessor::GetCreature(*me, guid)) { - me->SetSpeed(MOVE_RUN, 1.2f, true); - me->SetReactState(REACT_AGGRESSIVE); - me->CastSpell(me, SPELL_TEMPER, false); - PointID = 0; - ScheduleEvents(true); - - // update orientation at server - me->SetOrientation(2.19f); - - // and client - WorldPacket data; - me->BuildHeartBeatMsg(&data); - me->SendMessageToSet(&data, false); - me->SetControlled(true, UNIT_STATE_ROOT); + if (golem->GetEntry() == NPC_MOLTEN_GOLEM && golem->IsAlive()) + return true; } - else - events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0ms, 0, 2); } + return false; + } - void SpellHitTarget(Unit* /*who*/, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == SPELL_TEMPER) - { - me->CastSpell(me, SPELL_SUMMON_MOLTEN_GOLEM, true); - me->CastSpell(me, SPELL_SUMMON_MOLTEN_GOLEM, true); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - me->SetControlled(false, UNIT_STATE_ROOT); - } - } + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE) + return; - void GoToAnvil() + if (id == POINT_ANVIL) { - events.SetPhase(2); - HealthCheck -= 20; - me->SetSpeed(MOVE_RUN, 4.0f, true); - me->SetReactState(REACT_PASSIVE); - - Talk(SAY_FORGE); + me->SetSpeed(MOVE_RUN, 1.2f, true); + DoCastSelf(SPELL_TEMPER); + PointID = 0; - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) - me->GetMotionMaster()->MovementExpired(); + // update orientation at server + me->SetOrientation(2.19f); - events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0ms, 0, 2); + // and client + me->SendMovementFlagUpdate(false); + me->SetControlled(true, UNIT_STATE_ROOT); } + else + me->GetMotionMaster()->MovePoint(PointID, x, y, z); + } - void UpdateAI(uint32 diff) override + void SpellHitTarget(Unit* /*who*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_TEMPER) { - //Return since we have no target - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_HEAT: - me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_HEAT_H : SPELL_HEAT_N, true); - events.Repeat(8s); - break; - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(HealthCheck)) - GoToAnvil(); - - events.Repeat(1s); - return; - case EVENT_SHATTER: - { - events.Repeat(10s); - summons.DoAction(ACTION_SHATTER); - break; - } - case EVENT_MOVE_TO_ANVIL: - GetNextPos(); - me->GetMotionMaster()->MovePoint(PointID, x, y, z); - return; - case EVENT_POSITION: - if (me->GetDistance(1331.9f, -106, 56) > 95) - EnterEvadeMode(); - else - events.Repeat(4s); - - return; - } + DoCastSelf(SPELL_SUMMON_MOLTEN_GOLEM, true); + DoCastSelf(SPELL_SUMMON_MOLTEN_GOLEM, true); + me->SetControlled(false, UNIT_STATE_ROOT); + me->SetReactState(REACT_AGGRESSIVE); + if (me->GetVictim()) + me->GetMotionMaster()->MoveChase(me->GetVictim()); - DoMeleeAttackIfReady(); + events.RescheduleEvent(EVENT_HEAT, randtime(9s, 24s)); } - }; -}; - -class npc_molten_golem : public CreatureScript -{ -public: - npc_molten_golem() : CreatureScript("npc_molten_golem") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfLightningAI<npc_molten_golemAI>(creature); } - struct npc_molten_golemAI : public ScriptedAI + void GoToAnvil() { - npc_molten_golemAI(Creature* creature) : ScriptedAI(creature) - { - m_pInstance = creature->GetInstanceScript(); - } - - EventMap events; - InstanceScript* m_pInstance; + me->SetSpeed(MOVE_RUN, 4.0f, true); + me->SetReactState(REACT_PASSIVE); - void Reset() override - { - events.Reset(); - events.ScheduleEvent(EVENT_BLAST, 7s); - events.ScheduleEvent(EVENT_IMMOLATION, 3s); - } + Talk(SAY_FORGE); - void DamageTaken(Unit*, uint32& uiDamage, DamageEffectType, SpellSchoolMask) override - { - if (me->GetEntry() == NPC_BRITTLE_GOLEM) - { - uiDamage = 0; - return; - } - - if (uiDamage >= me->GetHealth()) - { - me->UpdateEntry(NPC_BRITTLE_GOLEM, 0, false); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); - me->SetHealth(me->GetMaxHealth()); - me->RemoveAllAuras(); - me->AttackStop(); - uiDamage = 0; + if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) + me->GetMotionMaster()->MovementExpired(); - if (me->IsNonMeleeSpellCast(false)) - me->InterruptNonMeleeSpells(false); + GetNextPos(); + me->GetMotionMaster()->MovePoint(PointID, x, y, z); + } - me->SetControlled(true, UNIT_STATE_STUNNED); - } - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void DoAction(int32 param) override - { - if (me->GetEntry() == NPC_BRITTLE_GOLEM && param == ACTION_SHATTER) - { - if (Creature* volkhan = ObjectAccessor::GetCreature(*me, m_pInstance->GetGuidData(TYPE_VOLKHAN))) - volkhan->AI()->DoAction(ACTION_DESTROYED); + events.Update(diff); - me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_SHATTER_H : SPELL_SHATTER_N, true); - me->DespawnOrUnsummon(500); - } - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + switch (events.ExecuteEvent()) { - //Return since we have no target or if we are frozen - if (!UpdateVictim() || me->GetEntry() == NPC_BRITTLE_GOLEM) + case EVENT_HEAT: + if (HasActiveGolem()) + { + DoCastSelf(SPELL_HEAT); + events.Repeat(randtime(9s, 24s)); + } + break; + case EVENT_CHECK_HEALTH: + if (!shatteredStompCast && HealthBelowPct(25)) + { + shatteredStompCast = true; + DoCastAOE(SPELL_SHATTERING_STOMP); + Talk(SAY_STOMP); + summons.DoAction(ACTION_SHATTER); + } + events.Repeat(1s); return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) + case EVENT_MOVE_TO_ANVIL: + GoToAnvil(); + events.Repeat(randtime(30s, 36s)); + return; + case EVENT_POSITION: + if (me->GetDistance(1331.9f, -106, 56) > 95) + EnterEvadeMode(); + else + events.Repeat(4s); return; - - switch (events.ExecuteEvent()) - { - case EVENT_BLAST: - me->CastSpell(me, SPELL_BLAST_WAVE, false); - events.Repeat(14s); - break; - case EVENT_IMMOLATION: - me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_IMMOLATION_STRIKE_H : SPELL_IMMOLATION_STRIKE_N, false); - events.Repeat(5s); - break; - } - - DoMeleeAttackIfReady(); } - }; -}; -enum monumentSpells -{ - SPELL_FREEZE_ANIM = 16245, - SPELL_AWAKEN = 52875, - - SPELL_PIERCING_HOWL = 23600, - SPELL_PENETRATING_STRIKE = 52890, - SPELL_FRIGHTENING_SHOUT = 19134, - SPELL_BLADE_TURNING_N = 52891, - SPELL_BLADE_TURNING_H = 59173, - - SPELL_DEADLY_THROW_N = 52885, - SPELL_DEADLY_THROW_H = 59180, - SPELL_DEFLECTION_N = 52879, - SPELL_DEFLECTION_H = 59181, - SPELL_THROW_N = 52904, - SPELL_THROW_H = 59179, -}; - -enum monumentEvents -{ - EVENT_PIERCING_HOWL = 1, - EVENT_PENETRATING_STRIKE = 2, - EVENT_FRIGHTENING_SHOUT = 3, - EVENT_BLADE_TURNING = 4, - - EVENT_DEADLY_THROW = 11, - EVENT_DEFLECTION = 12, - EVENT_THROW = 13, + DoMeleeAttackIfReady(); + } - EVENT_UNFREEZE = 20, + private: + EventMap events; + SummonList summons; + float x, y, z; + uint8 PointID; + uint8 ShatteredCount; + bool shatteredStompCast; }; -class npc_hol_monument : public CreatureScript +struct npc_molten_golem : public ScriptedAI { -public: - npc_hol_monument() : CreatureScript("npc_hol_monument") {} + npc_molten_golem(Creature* creature) : ScriptedAI(creature) + { + m_pInstance = creature->GetInstanceScript(); + } - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetHallsOfLightningAI<npc_hol_monumentAI>(creature); + events.Reset(); + events.ScheduleEvent(EVENT_IMMOLATION_STRIKE, 3s); + events.ScheduleEvent(EVENT_CHANGE_TARGET, 5s); + DoCastSelf(SPELL_COOL_DOWN, true); } - struct npc_hol_monumentAI : public ScriptedAI + void DamageTaken(Unit*, uint32& uiDamage, DamageEffectType, SpellSchoolMask) override { - npc_hol_monumentAI(Creature* creature) : ScriptedAI(creature) + if (me->GetEntry() == NPC_BRITTLE_GOLEM) { - _attackGUID.Clear(); - _isActive = urand(0, 1); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->CastSpell(me, SPELL_FREEZE_ANIM, true); + uiDamage = 0; + return; } - EventMap events; - bool _isActive; - ObjectGuid _attackGUID; - - void Reset() override + if (uiDamage >= me->GetHealth()) { - } + if (me->GetMap()->IsHeroic()) + DoCastSelf(SPELL_BLAST_WAVE, true); - void MoveInLineOfSight(Unit* who) override - { - if (_attackGUID) - ScriptedAI::MoveInLineOfSight(who); - else if (_isActive && who->IsPlayer()) - { - if ((who->GetPositionX() < me->GetPositionX() || who->GetPositionY() < -220.0f) && me->GetDistance2d(who) < 40) - { - _isActive = false; - _attackGUID = who->GetGUID(); - events.Reset(); - events.RescheduleEvent(EVENT_UNFREEZE, 5s); - } - } - } + me->UpdateEntry(NPC_BRITTLE_GOLEM, 0, false); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); + me->SetHealth(me->GetMaxHealth()); + me->RemoveAllAuras(); + me->AttackStop(); + uiDamage = 0; - void JustEngagedWith(Unit*) override - { - events.Reset(); - if (me->GetEntry() == 28961) // NPC_TITANIUM_SIEGEBREAKER - { - events.ScheduleEvent(EVENT_PIERCING_HOWL, 10s, 25s); - events.ScheduleEvent(EVENT_PENETRATING_STRIKE, 5s, 10s); - events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 20s, 28s); - events.ScheduleEvent(EVENT_BLADE_TURNING, 12s); - } - else - { - events.ScheduleEvent(EVENT_THROW, 10s, 25s); - events.ScheduleEvent(EVENT_DEADLY_THROW, 15s, 30s); - events.ScheduleEvent(EVENT_DEFLECTION, 15s); - } - } + if (me->IsNonMeleeSpellCast(false)) + me->InterruptNonMeleeSpells(false); - void AttackStart(Unit* who) override - { - if (!_attackGUID || !_isActive) - return; - ScriptedAI::AttackStart(who); + me->SetControlled(true, UNIT_STATE_STUNNED); } + } - void UpdateAI(uint32 diff) override + void DoAction(int32 param) override + { + if (me->GetEntry() == NPC_BRITTLE_GOLEM && param == ACTION_SHATTER) { - if (!_isActive && !_attackGUID) - return; + if (Creature* volkhan = m_pInstance->GetCreature(DATA_VOLKHAN)) + volkhan->AI()->DoAction(ACTION_DESTROYED); - events.Update(diff); - uint32 eventId = events.ExecuteEvent(); - - if (eventId == EVENT_UNFREEZE) - { - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->CastSpell(me, SPELL_AWAKEN, true); - me->RemoveAllAuras(); - _isActive = true; - if (Unit* target = ObjectAccessor::GetUnit(*me, _attackGUID)) - AttackStart(target); - return; - } + me->CastSpell(me, SPELL_SHATTER, true); + me->DespawnOrUnsummon(500ms); + } + } - //Return since we have no target or if we are disabled from fight - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + //Return since we have no target or if we are frozen + if (!UpdateVictim() || me->GetEntry() == NPC_BRITTLE_GOLEM) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + events.Update(diff); - switch (eventId) - { - case EVENT_PIERCING_HOWL: - me->CastSpell(me->GetVictim(), SPELL_PIERCING_HOWL, false); - events.Repeat(10s, 25s); - break; - case EVENT_PENETRATING_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_PENETRATING_STRIKE, false); - events.Repeat(5s, 10s); - break; - case EVENT_FRIGHTENING_SHOUT: - me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); - events.Repeat(20s, 28s); - break; - case EVENT_BLADE_TURNING: - me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_BLADE_TURNING_H : SPELL_BLADE_TURNING_N, false); - events.Repeat(12s); - break; - case EVENT_THROW: - me->CastSpell(SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0), me->GetMap()->IsHeroic() ? SPELL_THROW_H : SPELL_THROW_N, true); - events.Repeat(10s, 25s); - break; - case EVENT_DEADLY_THROW: - me->CastSpell(SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0), me->GetMap()->IsHeroic() ? SPELL_DEADLY_THROW_H : SPELL_DEADLY_THROW_N, true); - events.Repeat(15s, 30s); - break; - case EVENT_DEFLECTION: - me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_DEFLECTION_H : SPELL_DEFLECTION_N, false); - events.Repeat(15s); - break; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); + switch (events.ExecuteEvent()) + { + case EVENT_IMMOLATION_STRIKE: + if (SelectTarget(SelectTargetMethod::MaxThreat, 0, 0.0f, true, true, -SPELL_IMMOLATION_STRIKE)) + DoCastVictim(SPELL_IMMOLATION_STRIKE); + events.Repeat(5s); + break; + case EVENT_CHANGE_TARGET: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) + { + me->GetThreatMgr().ResetAllThreat(); + me->AddThreat(target, 30000.0f); + AttackStart(target); + } + break; } - }; + + DoMeleeAttackIfReady(); + } +private: + EventMap events; + InstanceScript* m_pInstance; }; void AddSC_boss_volkhan() { - new boss_volkhan(); - new npc_molten_golem(); - new npc_hol_monument(); + RegisterHallOfLightningCreatureAI(boss_volkhan); + RegisterHallOfLightningCreatureAI(npc_molten_golem); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h index dac5813097..99b3fecb81 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h @@ -24,34 +24,41 @@ #define HallsOfLightningScriptName "instance_halls_of_lightning" -enum HoLEvents +enum HoLBossIds { - TYPE_BJARNGRIM = 0, - TYPE_IONAR = 1, - TYPE_LOKEN = 2, - TYPE_VOLKHAN = 3, - TYPE_LOKEN_INTRO = 4, - MAX_ENCOUNTER = 5, + DATA_BJARNGRIM = 0, + DATA_IONAR = 1, + DATA_LOKEN = 2, + DATA_VOLKHAN = 3, + MAX_ENCOUNTERS +}; + +enum HoLDataTypes +{ + // GameObject data + DATA_LOKEN_THRONE = 0, + // Achievement data DATA_BJARNGRIM_ACHIEVEMENT = 10, DATA_VOLKHAN_ACHIEVEMENT = 11, }; enum HoLNPCs { - NPC_BJARNGRIM = 28586, - NPC_VOLKHAN = 28587, - NPC_IONAR = 28546, - NPC_LOKEN = 28923, + NPC_TITANIUM_THUNDERER = 28965, + NPC_TITANIUM_SIEGEBREAKER = 28961 }; enum HoLGOs { - GO_BJARNGRIM_DOOR = 191416, //_doors10 - GO_VOLKHAN_DOOR = 191325, //_doors07 - GO_IONAR_DOOR = 191326, //_doors05 - GO_LOKEN_DOOR = 191324, //_doors02 - GO_LOKEN_THRONE = 192654, + GO_VOLKHAN_DOOR = 191325, + GO_IONAR_DOOR = 191326, + GO_LOKEN_THRONE = 192654 +}; + +enum HoLActions +{ + ACTION_ACTIVATE_TITANIUM_VRYKUL, }; template <class AI, class T> @@ -60,4 +67,6 @@ inline AI* GetHallsOfLightningAI(T* obj) return GetInstanceAI<AI>(obj, HallsOfLightningScriptName); } +#define RegisterHallOfLightningCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetHallsOfLightningAI) + #endif diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index 75954ab046..1341f31c06 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -15,206 +15,121 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "AreaTriggerScript.h" #include "CreatureScript.h" #include "InstanceMapScript.h" +#include "Player.h" #include "ScriptedCreature.h" #include "halls_of_lightning.h" +DoorData const doorData[] = +{ + { GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE }, + { GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE }, + { 0, 0, DOOR_TYPE_ROOM } +}; + +ObjectData const gameObjectData[] = +{ + { GO_LOKEN_THRONE, DATA_LOKEN_THRONE }, + { 0, 0 } +}; + class instance_halls_of_lightning : public InstanceMapScript { public: instance_halls_of_lightning() : InstanceMapScript("instance_halls_of_lightning", MAP_HALLS_OF_LIGHTNING) { } - InstanceScript* GetInstanceScript(InstanceMap* pMap) const override - { - return new instance_halls_of_lightning_InstanceMapScript(pMap); - } - struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript { - instance_halls_of_lightning_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { Initialize(); }; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - ObjectGuid m_uiGeneralBjarngrimGUID; - ObjectGuid m_uiIonarGUID; - ObjectGuid m_uiLokenGUID; - ObjectGuid m_uiVolkhanGUID; - - ObjectGuid m_uiBjarngrimDoorGUID; - ObjectGuid m_uiVolkhanDoorGUID; - ObjectGuid m_uiIonarDoorGUID; - ObjectGuid m_uiLokenDoorGUID; - ObjectGuid m_uiLokenGlobeGUID; - - bool volkhanAchievement; - bool bjarngrimAchievement; - - void Initialize() override + instance_halls_of_lightning_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { SetHeaders(DataHeader); - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - volkhanAchievement = false; - bjarngrimAchievement = false; - } - - bool IsEncounterInProgress() const override - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - { - if (m_auiEncounter[i] == IN_PROGRESS && i != TYPE_LOKEN_INTRO) - { - return true; - } - } - return false; - } - - void OnCreatureCreate(Creature* pCreature) override - { - switch (pCreature->GetEntry()) - { - case NPC_BJARNGRIM: - m_uiGeneralBjarngrimGUID = pCreature->GetGUID(); - break; - case NPC_VOLKHAN: - m_uiVolkhanGUID = pCreature->GetGUID(); - break; - case NPC_IONAR: - m_uiIonarGUID = pCreature->GetGUID(); - break; - case NPC_LOKEN: - m_uiLokenGUID = pCreature->GetGUID(); - break; - } - } - - void OnGameObjectCreate(GameObject* pGo) override - { - switch (pGo->GetEntry()) - { - case GO_BJARNGRIM_DOOR: - m_uiBjarngrimDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_BJARNGRIM] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - - break; - case GO_VOLKHAN_DOOR: - m_uiVolkhanDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_VOLKHAN] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - - break; - case GO_IONAR_DOOR: - m_uiIonarDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_IONAR] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - - break; - case GO_LOKEN_DOOR: - m_uiLokenDoorGUID = pGo->GetGUID(); - if (m_auiEncounter[TYPE_LOKEN] == DONE) - pGo->SetGoState(GO_STATE_ACTIVE); - - break; - case GO_LOKEN_THRONE: - m_uiLokenGlobeGUID = pGo->GetGUID(); - break; - } - } + SetBossNumber(MAX_ENCOUNTERS); + LoadDoorData(doorData); + LoadObjectData(nullptr, gameObjectData); + _volkhanAchievement = false; + _bjarngrimAchievement = false; + }; bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) override { switch (criteria_id) { case 7321: //Shatter Resistant (2042) - return volkhanAchievement; + return _volkhanAchievement; case 6835: // Lightning Struck (1834) - return bjarngrimAchievement; + return _bjarngrimAchievement; } return false; } void SetData(uint32 uiType, uint32 uiData) override { - m_auiEncounter[uiType] = uiData; - if (uiType == TYPE_LOKEN_INTRO) - SaveToDB(); - // Achievements if (uiType == DATA_BJARNGRIM_ACHIEVEMENT) - bjarngrimAchievement = (bool)uiData; + _bjarngrimAchievement = (bool)uiData; else if (uiType == DATA_VOLKHAN_ACHIEVEMENT) - volkhanAchievement = (bool)uiData; + _volkhanAchievement = (bool)uiData; + } - if (uiData != DONE) - return; + private: + bool _volkhanAchievement; + bool _bjarngrimAchievement; + }; - switch (uiType) - { - case TYPE_BJARNGRIM: - HandleGameObject(m_uiBjarngrimDoorGUID, true); - break; - case TYPE_VOLKHAN: - HandleGameObject(m_uiVolkhanDoorGUID, true); - break; - case TYPE_IONAR: - HandleGameObject(m_uiIonarDoorGUID, true); - break; - case TYPE_LOKEN: - HandleGameObject(m_uiLokenDoorGUID, true); - //Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder - if (GameObject* pGlobe = instance->GetGameObject(m_uiLokenGlobeGUID)) - pGlobe->SetGoState(GO_STATE_ACTIVE); - - break; - } + InstanceScript* GetInstanceScript(InstanceMap* pMap) const override + { + return new instance_halls_of_lightning_InstanceMapScript(pMap); + } +}; - SaveToDB(); - } +enum TitaniumHallwaySpells +{ + SPELL_FREEZE_ANIM = 16245, + SPELL_AWAKEN = 52875, +}; - void ReadSaveDataMore(std::istringstream& data) override - { - data >> m_auiEncounter[0]; - data >> m_auiEncounter[1]; - data >> m_auiEncounter[2]; - data >> m_auiEncounter[3]; - } +class at_hol_hall_of_watchers : public OnlyOnceAreaTriggerScript +{ +public: + at_hol_hall_of_watchers() : OnlyOnceAreaTriggerScript("at_hol_hall_of_watchers") {} - void WriteSaveDataMore(std::ostringstream& data) override + bool _OnTrigger(Player* player, const AreaTrigger* /*at*/) override + { + std::list<Creature*> creatures; + player->GetCreatureListWithEntryInGrid(creatures, { NPC_TITANIUM_SIEGEBREAKER, NPC_TITANIUM_THUNDERER }, 50.0f); + creatures.remove_if([&](Creature const* creature) -> bool { - data << m_auiEncounter[0] << ' ' - << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' - << m_auiEncounter[3] << ' '; - } + return !player->IsWithinLOSInMap(creature) || !creature->HasAura(SPELL_FREEZE_ANIM); + }); - uint32 GetData(uint32 uiType) const override - { - return m_auiEncounter[uiType]; - } + if (creatures.empty()) + return false; - ObjectGuid GetGuidData(uint32 uiData) const override - { - switch (uiData) - { - case TYPE_BJARNGRIM: - return m_uiGeneralBjarngrimGUID; - case TYPE_VOLKHAN: - return m_uiVolkhanGUID; - case TYPE_IONAR: - return m_uiIonarGUID; - case TYPE_LOKEN: - return m_uiLokenGUID; - } + Acore::Containers::RandomResize(creatures, urand(2, 4)); + + ObjectGuid target = player->GetGUID(); - return ObjectGuid::Empty; + for (Creature* creature : creatures) + { + creature->SetHomePosition(player->GetPosition()); + creature->AI()->DoCastSelf(SPELL_AWAKEN); + creature->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + + creature->m_Events.AddEventAtOffset([creature, target] { + creature->AI()->DoAction(ACTION_ACTIVATE_TITANIUM_VRYKUL); + if (Player* targetPlayer = ObjectAccessor::GetPlayer(*creature, target)) + creature->AI()->AttackStart(targetPlayer); + }, 5s); } - }; + + return false; + } }; void AddSC_instance_halls_of_lightning() { new instance_halls_of_lightning(); + new at_hol_hall_of_watchers(); } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index bc40837a70..f2a76412ce 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -24,16 +24,13 @@ enum spells { - GROUND_SPIKE_H = 59750, - BOULDER_TOSS = 50843, - BOULDER_TOSS_H = 59742, - SHATTER = 50810, - SHATTER_H = 61546, - STOMP = 50868, - STOMP_H = 59744, - GROUND_SLAM = 50827, - GROUND_SLAM_STONED_EFFECT = 50812, - SPELL_SHATTER_EFFECT = 50811, + SPELL_GROUND_SPIKE = 59750, + SPELL_BOULDER_TOSS = 50843, + SPELL_SHATTER = 50810, + SPELL_STOMP = 50868, + SPELL_GROUND_SLAM = 50827, + SPELL_GROUND_SLAM_STONED_EFFECT = 50812, + SPELL_SHATTER_EFFECT = 50811, }; enum events @@ -105,7 +102,7 @@ public: Map::PlayerList const& players = map->GetPlayers(); for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (itr->GetSource()->IsAlive()) - itr->GetSource()->RemoveAura(GROUND_SLAM_STONED_EFFECT); + itr->GetSource()->RemoveAura(SPELL_GROUND_SLAM_STONED_EFFECT); } } @@ -123,37 +120,38 @@ public: { case EVENT_BOULDER: { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(BOULDER_TOSS, BOULDER_TOSS_H), false); - + DoCastRandomTarget(SPELL_BOULDER_TOSS, 0, 50.0f); events.Repeat(5s, 7s); break; } case EVENT_GROUND_SPIKE: { - me->CastSpell(me->GetVictim(), GROUND_SPIKE_H, false); // current enemy target + DoCastRandomTarget(SPELL_GROUND_SPIKE, 0, 50.0f); events.Repeat(8s, 11s); break; } case EVENT_STOMP: { - me->CastSpell(me, DUNGEON_MODE(STOMP, STOMP_H), false); + me->CastSpell(me, SPELL_STOMP, false); events.Repeat(13s, 18s); break; } case EVENT_GROUND_SLAM: { events.Repeat(10s, 13s); - me->CastSpell(me->GetVictim(), GROUND_SLAM, true); + me->CastSpell(me->GetVictim(), SPELL_GROUND_SLAM, true); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); events.DelayEvents(10s); events.RescheduleEvent(EVENT_SHATTER, 8s); break; } case EVENT_SHATTER: { - me->CastSpell((Unit*)nullptr, DUNGEON_MODE(SHATTER, SHATTER_H), false); + me->CastSpell((Unit*)nullptr, SPELL_SHATTER, false); Talk(SAY_SHATTER); events.RescheduleEvent(EVENT_REMOVE_STONED, 1500ms); + me->SetReactState(REACT_AGGRESSIVE); break; } case EVENT_REMOVE_STONED: @@ -193,7 +191,7 @@ class spell_krystallus_shatter : public SpellScript { if (Unit* target = GetHitUnit()) { - target->RemoveAurasDueToSpell(GROUND_SLAM_STONED_EFFECT); + target->RemoveAurasDueToSpell(SPELL_GROUND_SLAM_STONED_EFFECT); target->CastSpell((Unit*)nullptr, SPELL_SHATTER_EFFECT, true); } } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index 814daf759a..40bf8449d0 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -21,13 +21,10 @@ enum spells { - PARTING_SORROW = 59723, - PILLAR_OF_WOE = 50761, - PILLAR_OF_WOE_H = 59727, - SHOCK_OF_SORROW = 50760, - SHOCK_OF_SORROW_H = 59726, - STORM_OF_GRIEF = 50752, - STORM_OF_GRIEF_H = 59772, + SPELL_PARTING_SORROW = 59723, + SPELL_PILLAR_OF_WOE = 50761, + SPELL_SHOCK_OF_SORROW = 50760, + SPELL_STORM_OF_GRIEF = 50752, ACHIEVEMENT_GOOD_GRIEF = 20383, }; @@ -80,10 +77,11 @@ public: void JustEngagedWith(Unit* /*who*/) override { - events.ScheduleEvent(EVENT_STORM, 5s); - events.ScheduleEvent(EVENT_SHOCK, 26s, 32s); - events.ScheduleEvent(EVENT_PILLAR, 12s, 20s); - events.ScheduleEvent(EVENT_PARTING, 8s); + events.ScheduleEvent(EVENT_STORM, 6s, 10s); + events.ScheduleEvent(EVENT_SHOCK, 14s, 29s); + events.ScheduleEvent(EVENT_PILLAR, 7s, 15s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_PARTING, 27s, 45s); Talk(SAY_AGGRO); if (pInstance) @@ -107,32 +105,45 @@ public: { case EVENT_STORM: { - me->CastSpell(me->GetVictim(), DUNGEON_MODE(STORM_OF_GRIEF, STORM_OF_GRIEF_H), true); - events.Repeat(10s); + me->CastSpell(me->GetVictim(), SPELL_STORM_OF_GRIEF, true); + events.Repeat(16s, 20s); break; } case EVENT_SHOCK: { - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SHOCK_OF_SORROW, SHOCK_OF_SORROW_H), false); + me->CastSpell(me->GetVictim(), SPELL_SHOCK_OF_SORROW, false); Talk(SAY_STUN); - events.Repeat(16s, 22s); + events.Repeat(19s, 33s); break; } case EVENT_PILLAR: { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(PILLAR_OF_WOE, PILLAR_OF_WOE_H), false); + me->CastSpell(target, SPELL_PILLAR_OF_WOE, false); - events.Repeat(12s, 20s); + events.Repeat(8s, 31s); break; } case EVENT_PARTING: { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0)) - me->CastSpell(target, PARTING_SORROW, false); - - events.Repeat(6s, 16s); + Unit* target = nullptr; + std::list<Unit*> targetList; + + SelectTargetList(targetList, 10, SelectTargetMethod::Random, 0, 50.0f, true); + for (Unit* possibleTarget : targetList) + { + if (possibleTarget && possibleTarget->IsPlayer() && possibleTarget->getPowerType() == POWER_MANA) + { + target = possibleTarget; + break; + } + } + + if (target) + me->CastSpell(target, SPELL_PARTING_SORROW, false); + + events.Repeat(27s, 45s); break; } } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index d51461f6a6..f5ceede61c 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -25,25 +25,18 @@ enum Spells // SJONNIR SPELL_FRENZY = 28747, //at 20% hp SPELL_CHAIN_LIGHTNING = 50830, - SPELL_CHAIN_LIGHTNING_H = 59844, SPELL_LIGHTNING_SHIELD = 50831, - SPELL_LIGHTNING_SHIELD_H = 59845, SPELL_STATIC_CHARGE = 50834, - SPELL_STATIC_CHARGE_H = 59846, SPELL_LIGHTNING_RING = 50840, - SPELL_LIGHTNING_RING_H = 59848, // IRON SLUDGE SPELL_TOXIC_VOLLEY = 50838, - SPELL_TOXIC_VOLLEY_H = 59853, // FORGED IRON DWARF SPELL_LIGHTNING_TETHER = 50895, - SPELL_LIGHTNING_TETHER_H = 59851, // FORGED IRON TROGG SPELL_LIGHTNING_SHOCK = 50900, - SPELL_LIGHTNING_SHOCK_H = 59852, }; enum Npc @@ -241,14 +234,14 @@ public: } case EVENT_SHIELD: { - me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_SHIELD, SPELL_LIGHTNING_SHIELD_H), false); + me->CastSpell(me, SPELL_LIGHTNING_SHIELD, false); events.Repeat(14s, 19s); break; } case EVENT_CHAIN_LIGHTNING: { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING, SPELL_CHAIN_LIGHTNING_H), false); + me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false); events.Repeat(6s, 12s); break; @@ -256,14 +249,14 @@ public: case EVENT_STATIC_CHARGE: { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_STATIC_CHARGE, SPELL_STATIC_CHARGE_H), false); + me->CastSpell(target, SPELL_STATIC_CHARGE, false); events.Repeat(20s); break; } case EVENT_LIGHTNING_RING: { - me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_RING, SPELL_LIGHTNING_RING_H), false); + me->CastSpell(me, SPELL_LIGHTNING_RING, false); events.Repeat(25s, 31s); events.DelayEvents(10s); // Channel duration break; @@ -399,7 +392,7 @@ public: if (!UpdateVictim()) return; - DoSpellAttackIfReady((me->GetEntry() == NPC_FORGED_IRON_DWARF) ? DUNGEON_MODE(SPELL_LIGHTNING_TETHER, SPELL_LIGHTNING_TETHER_H) : DUNGEON_MODE(SPELL_LIGHTNING_SHOCK, SPELL_LIGHTNING_SHOCK_H)); + DoSpellAttackIfReady((me->GetEntry() == NPC_FORGED_IRON_DWARF) ? SPELL_LIGHTNING_TETHER : SPELL_LIGHTNING_SHOCK); } }; }; @@ -426,7 +419,7 @@ public: void JustEngagedWith(Unit*) override { - events.ScheduleEvent(EVENT_TOXIC_VOLLEY, 5000); + events.ScheduleEvent(EVENT_TOXIC_VOLLEY, 5s); } void JustDied(Unit* /*killer*/) override { @@ -448,7 +441,7 @@ public: // Every 5 seconds case EVENT_TOXIC_VOLLEY: { - me->CastSpell(me, DUNGEON_MODE(SPELL_TOXIC_VOLLEY, SPELL_TOXIC_VOLLEY_H), false); + me->CastSpell(me, SPELL_TOXIC_VOLLEY, false); events.Repeat(5s); break; } diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp index 8202f673a7..e4305328f1 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp @@ -48,13 +48,10 @@ enum Misc { // BRANN EVENT SPELL_GLARE_OF_THE_TRIBUNAL = 50988, - SPELL_GLARE_OF_THE_TRIBUNAL_H = 59870, SPELL_DARK_MATTER_VISUAL = 51000, SPELL_DARK_MATTER_VISUAL_CHANNEL= 51001, SPELL_DARK_MATTER = 51012, - SPELL_DARK_MATTER_H = 59868, SPELL_SEARING_GAZE = 51136, - SPELL_SEARING_GAZE_H = 59867, // DARK RUNE PROTECTOR SPELL_DRP_CHARGE = 22120, @@ -62,14 +59,11 @@ enum Misc // DARK RUNE STORMCALLER SPELL_DRS_LIGHTING_BOLT = 12167, - SPELL_DRS_LIGHTING_BOLT_H = 59863, SPELL_DRS_SHADOW_WORD_PAIN = 15654, - SPELL_DRS_SHADOW_WORD_PAIN_H = 59864, // IRON GOLEM CUSTODIAN SPELL_IGC_CRUSH_ARMOR = 33661, SPELL_IGC_GROUND_SMASH = 12734, - SPELL_IGC_GROUND_SMASH_H = 59865, // QUESTS QUEST_HALLS_OF_STONE = 13207, @@ -391,11 +385,11 @@ public: switch (action) { case ACTION_START_ESCORT_EVENT: - Start(false, true, ObjectGuid::Empty, 0, true, false); + Start(false, ObjectGuid::Empty, 0, true, false); Talk(SAY_BRANN_ESCORT_START); me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); me->SetReactState(REACT_AGGRESSIVE); - me->SetRegeneratingHealth(false); + me->SetRegeneratingHealth(true); break; case ACTION_START_TRIBUNAL: { @@ -443,8 +437,8 @@ public: me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); me->SetOrientation(3.132660f); me->SendMovementFlagUpdate(); - events.ScheduleEvent(EVENT_SJONNIR_END_BRANN_YELL, 10000ms); - events.ScheduleEvent(EVENT_SJONNIR_END_BRANN_LAST_YELL, 22000ms); + events.ScheduleEvent(EVENT_SJONNIR_END_BRANN_YELL, 10s); + events.ScheduleEvent(EVENT_SJONNIR_END_BRANN_LAST_YELL, 22s); break; case ACTION_SJONNIR_WIPE_START: Reset(); @@ -456,7 +450,7 @@ public: door->SetGoState(GO_STATE_READY); break; case ACTION_OPEN_DOOR: - Start(false, true, ObjectGuid::Empty, 0, true, false); + Start(false, ObjectGuid::Empty, 0, true, false); SetNextWaypoint(34, false); SetEscortPaused(false); me->RemoveAura(58506); @@ -505,10 +499,10 @@ public: if (Creature* kaddrak = GetKaddrak()) { if (Player* plr = SelectTargetFromPlayerList(100.0f)) - kaddrak->CastSpell(plr, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, SPELL_GLARE_OF_THE_TRIBUNAL_H), true); + kaddrak->CastSpell(plr, SPELL_GLARE_OF_THE_TRIBUNAL, true); } - events.RescheduleEvent(EVENT_KADDRAK_SWITCH_EYE, 1000ms); + events.RescheduleEvent(EVENT_KADDRAK_SWITCH_EYE, 1s); events.Repeat(1500ms); break; } @@ -550,7 +544,7 @@ public: darkMatterTargetGUID = cr->GetGUID(); - events.RescheduleEvent(EVENT_DARK_MATTER_START, 5000ms); + events.RescheduleEvent(EVENT_DARK_MATTER_START, 5s); } } events.Repeat(30s); @@ -571,11 +565,11 @@ public: if (speed < tooFarAwaySpeed) speed = tooFarAwaySpeed; - darkMatterTarget->MonsterMoveWithSpeed(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), speed); + darkMatterTarget->GetMotionMaster()->MovePoint(0, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), FORCED_MOVEMENT_NONE, speed); if (darkMatterTarget->GetDistance(plr) < 15.0f) { - events.RescheduleEvent(EVENT_DARK_MATTER_END, 3000ms); + events.RescheduleEvent(EVENT_DARK_MATTER_END, 3s); } else if (darkMatterTarget->GetDistance(plr) < 30.0f) { @@ -593,8 +587,8 @@ public: { if (Creature* darkMatterTarget = ObjectAccessor::GetCreature(*me, darkMatterTargetGUID)) { - darkMatterTarget->CastSpell(darkMatterTarget, darkMatterTarget->GetMap()->IsHeroic() ? SPELL_DARK_MATTER_H : SPELL_DARK_MATTER, true); - darkMatterTarget->DespawnOrUnsummon(500); + darkMatterTarget->CastSpell(darkMatterTarget, SPELL_DARK_MATTER, true); + darkMatterTarget->DespawnOrUnsummon(500ms); } break; } @@ -612,7 +606,7 @@ public: { // summon another abedneum to create double beam, despawn just after trigger despawn me->SummonCreature(NPC_ABEDNEUM, 897.0f, 326.9f, 223.5f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000); - cr->CastSpell(cr, DUNGEON_MODE(SPELL_SEARING_GAZE, SPELL_SEARING_GAZE_H), true); + cr->CastSpell(cr, SPELL_SEARING_GAZE, true); } } events.Repeat(15s); @@ -622,15 +616,8 @@ public: { if (!canExecuteEvents) return; - uint32 Time = 40000 - (2500 * WaveNum); SummonCreatures(NPC_DARK_RUNE_PROTECTOR, 3, 0); - if (WaveNum > 2) - events.ScheduleEvent(EVENT_SUMMON_STORMCALLER, urand(10 - WaveNum, 15 - WaveNum) * 1000); - if (WaveNum > 5) - events.ScheduleEvent(EVENT_SUMMON_CUSTODIAN, urand(10 - WaveNum, 15 - WaveNum) * 1000); - - WaveNum++; - events.RepeatEvent(Time); + events.Repeat(IsHeroic() ? 23500ms : 32500ms); break; } case EVENT_SUMMON_STORMCALLER: @@ -639,7 +626,7 @@ public: return; SummonCreatures(NPC_DARK_RUNE_STORMCALLER, 2, 1); - + events.Repeat(IsHeroic() ? 32s : 41500ms); break; } case EVENT_SUMMON_CUSTODIAN: @@ -648,7 +635,7 @@ public: return; SummonCreatures(NPC_IRON_GOLEM_CUSTODIAN, 1, 1); - + events.Repeat(IsHeroic() ? 32s : 45s); break; } case EVENT_TRIBUNAL_END: @@ -842,17 +829,14 @@ void brann_bronzebeard::brann_bronzebeardAI::InitializeEvent() Creature* cr = nullptr; if ((cr = me->SummonCreature(NPC_KADDRAK, 923.7f, 326.9f, 219.5f, 2.1f, TEMPSUMMON_TIMED_DESPAWN, 580000))) { - cr->SetInCombatWithZone(); KaddrakGUID = cr->GetGUID(); } if ((cr = me->SummonCreature(NPC_MARNAK, 895.974f, 363.571f, 219.337f, 5.5f, TEMPSUMMON_TIMED_DESPAWN, 580000))) { - cr->SetInCombatWithZone(); MarnakGUID = cr->GetGUID(); } if ((cr = me->SummonCreature(NPC_ABEDNEUM, 892.25f, 331.25f, 223.86f, 0.6f, TEMPSUMMON_TIMED_DESPAWN, 580000))) { - cr->SetInCombatWithZone(); AbedneumGUID = cr->GetGUID(); } @@ -865,8 +849,9 @@ void brann_bronzebeard::brann_bronzebeardAI::InitializeEvent() events.ScheduleEvent(EVENT_MARNAK_VISUAL, 105s); events.ScheduleEvent(EVENT_ABEDNEUM_VISUAL, 207s); - // Fight - events.ScheduleEvent(EVENT_SUMMON_MONSTERS, 47s); + events.ScheduleEvent(EVENT_SUMMON_MONSTERS, 52s); + events.ScheduleEvent(EVENT_SUMMON_STORMCALLER, 122s); + events.ScheduleEvent(EVENT_SUMMON_CUSTODIAN, 228s); events.ScheduleEvent(EVENT_KADDRAK_HEAD, 47s); events.ScheduleEvent(EVENT_MARNAK_HEAD, 115s); events.ScheduleEvent(EVENT_ABEDNEUM_HEAD, 217s); @@ -931,10 +916,10 @@ void brann_bronzebeard::brann_bronzebeardAI::WaypointReached(uint32 id) SetEscortPaused(true); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); me->SendMovementFlagUpdate(); - events.ScheduleEvent(EVENT_DOOR_OPEN, 1500); + events.ScheduleEvent(EVENT_DOOR_OPEN, 1500ms); me->SetWalk(false); me->SetSpeed(MOVE_RUN, 1.0f, false); - events.ScheduleEvent(EVENT_RESUME_ESCORT, 3500); + events.ScheduleEvent(EVENT_RESUME_ESCORT, 3500ms); break; //Brann stops in front of Sjonnir and awaits the start of the battle. case 36: @@ -987,7 +972,6 @@ public: void JustEngagedWith(Unit*) override { - events.ScheduleEvent(EVENT_DRP_CHARGE, 10s); events.ScheduleEvent(EVENT_DRP_CLEAVE, 7s); } @@ -1002,14 +986,6 @@ public: switch (events.ExecuteEvent()) { - case EVENT_DRP_CHARGE: - { - if (Unit* tgt = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(tgt, SPELL_DRP_CHARGE, false); - - events.Repeat(10s); - break; - } case EVENT_DRP_CLEAVE: { me->CastSpell(me->GetVictim(), SPELL_DRP_CLEAVE, false); @@ -1018,6 +994,14 @@ public: } } + if (Unit* victim = me->GetVictim()) + { + if (!me->IsWithinMeleeRange(victim) && !me->HasUnitState(UNIT_STATE_CHARGING)) + { + me->CastSpell(victim, SPELL_DRP_CHARGE, false); + } + } + DoMeleeAttackIfReady(); } }; @@ -1062,13 +1046,13 @@ public: { case EVENT_DRS_LIGHTNING_BOLD: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_LIGHTING_BOLT_H : SPELL_DRS_LIGHTING_BOLT, false); + me->CastSpell(me->GetVictim(), SPELL_DRS_LIGHTING_BOLT, false); events.Repeat(5s); break; } case EVENT_DRS_SHADOW_WORD_PAIN: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_SHADOW_WORD_PAIN_H : SPELL_DRS_SHADOW_WORD_PAIN, false); + me->CastSpell(me->GetVictim(), SPELL_DRS_SHADOW_WORD_PAIN, false); events.Repeat(12s); break; } @@ -1101,7 +1085,7 @@ public: void JustEngagedWith(Unit*) override { events.ScheduleEvent(EVENT_IGC_CRUSH, 6s); - events.ScheduleEvent(EVENT_IGC_GROUND_SMASH, 4s); + events.ScheduleEvent(EVENT_IGC_GROUND_SMASH, 20s); } void UpdateAI(uint32 diff) override { @@ -1122,8 +1106,8 @@ public: } case EVENT_IGC_GROUND_SMASH: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_IGC_GROUND_SMASH_H : SPELL_IGC_GROUND_SMASH, false); - events.Repeat(5s); + me->CastSpell(me->GetVictim(), SPELL_IGC_GROUND_SMASH, false); + events.Repeat(20s, 40s); break; } } @@ -1139,13 +1123,13 @@ class spell_hos_dark_matter : public AuraScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_DARK_MATTER_H, SPELL_DARK_MATTER }); + return ValidateSpellInfo({ SPELL_DARK_MATTER }); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Unit* caster = GetCaster()) - caster->CastSpell(caster, caster->GetMap()->IsHeroic() ? SPELL_DARK_MATTER_H : SPELL_DARK_MATTER, true); + caster->CastSpell(caster, SPELL_DARK_MATTER, true); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index 4a9e61ff3e..dd6cd84b8c 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -45,7 +45,6 @@ public: ObjectGuid goSjonnirDoorGUID; ObjectGuid goLeftPipeGUID; ObjectGuid goRightPipeGUID; - ObjectGuid goTribunalDoorGUID; ObjectGuid SjonnirGUID; ObjectGuid BrannGUID; @@ -96,10 +95,6 @@ public: case GO_TRIBUNAL_CONSOLE: goTribunalConsoleGUID = go->GetGUID(); break; - case GO_TRIBUNAL_ACCESS_DOOR: - goTribunalDoorGUID = go->GetGUID(); - go->SetGoState(GO_STATE_READY); - break; case GO_SKY_FLOOR: goSkyRoomFloorGUID = go->GetGUID(); if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE) @@ -141,8 +136,6 @@ public: { case GO_TRIBUNAL_CONSOLE: return goTribunalConsoleGUID; - case GO_TRIBUNAL_ACCESS_DOOR: - return goTribunalDoorGUID; case GO_SJONNIR_CONSOLE: return goSjonnirConsoleGUID; case GO_SJONNIR_DOOR: @@ -208,10 +201,6 @@ public: isKrystalusDead = type == BOSS_KRYSTALLUS || isKrystalusDead; } - if (isMaidenOfGriefDead && isKrystalusDead) - if (GameObject* tribunalDoor = instance->GetGameObject(goTribunalDoorGUID)) - tribunalDoor->SetGoState(GO_STATE_ACTIVE); - if (type == BOSS_TRIBUNAL_OF_AGES && data == SPECIAL) { if (GameObject* pSkyRoomFloor = instance->GetGameObject(goSkyRoomFloorGUID)) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 9eec77e622..4d43d6f00c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -443,7 +443,7 @@ public: if (me->IsInCombat()) events.ScheduleEvent(EVENT_DESPAWN_ALGALON_4, 26s); events.ScheduleEvent(EVENT_DESPAWN_ALGALON_5, 32s); - me->DespawnOrUnsummon(39000); + me->DespawnOrUnsummon(39s); me->SetReactState(REACT_PASSIVE); me->AttackStop(); @@ -484,7 +484,7 @@ public: return; } - uint32 introDelay = 0; + Milliseconds introDelay = 0ms; me->setActive(true); me->SetInCombatWithZone(); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); @@ -495,27 +495,27 @@ public: if (!_firstPull) { events.ScheduleEvent(EVENT_START_COMBAT, 0ms); - introDelay = 8000; + introDelay = 8s; } else { summons.DespawnEntry(NPC_AZEROTH); _firstPull = false; Talk(SAY_ALGALON_START_TIMER); - introDelay = 22000; + introDelay = 22s; events.ScheduleEvent(EVENT_START_COMBAT, 14s); m_pInstance->SetData(DATA_DESPAWN_ALGALON, 0); } - events.ScheduleEvent(EVENT_REMOVE_UNNATTACKABLE, introDelay - 500); + events.ScheduleEvent(EVENT_REMOVE_UNNATTACKABLE, introDelay - 500ms); events.ScheduleEvent(EVENT_INTRO_TIMER_DONE, introDelay); - events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500 + introDelay); - events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500 + introDelay); - events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 16500 + introDelay); - events.ScheduleEvent(EVENT_COSMIC_SMASH, 25000 + introDelay); - events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 50500 + introDelay); - events.ScheduleEvent(EVENT_BIG_BANG, 90000 + introDelay); - events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360000 + introDelay); + events.ScheduleEvent(EVENT_QUANTUM_STRIKE, 3500ms + introDelay); + events.ScheduleEvent(EVENT_PHASE_PUNCH, 15500ms + introDelay); + events.ScheduleEvent(EVENT_SUMMON_COLLAPSING_STAR, 16500ms + introDelay); + events.ScheduleEvent(EVENT_COSMIC_SMASH, 25s + introDelay); + events.ScheduleEvent(EVENT_ACTIVATE_LIVING_CONSTELLATION, 50500ms + introDelay); + events.ScheduleEvent(EVENT_BIG_BANG, 90s + introDelay); + events.ScheduleEvent(EVENT_ASCEND_TO_THE_HEAVENS, 360s + introDelay); events.ScheduleEvent(EVENT_CHECK_HERALD_ITEMS, 5s); DoCheckHeraldOfTheTitans(); @@ -574,7 +574,7 @@ public: summon->SetHomePosition(x, y, z, o); summon->UpdatePosition(x, y, z, o, true); summon->StopMovingOnCurrentPos(); - summon->m_Events.AddEvent(new CosmicSmashDamageEvent(summon), summon->m_Events.CalculateTime(4000)); + summon->m_Events.AddEventAtOffset(new CosmicSmashDamageEvent(summon), 4s); break; } case NPC_UNLEASHED_DARK_MATTER: @@ -688,7 +688,7 @@ public: break; case EVENT_QUANTUM_STRIKE: me->CastSpell(me->GetVictim(), SPELL_QUANTUM_STRIKE, false); - events.Repeat(3000ms, 4500ms); + events.Repeat(3s, 4500ms); break; case EVENT_PHASE_PUNCH: me->CastSpell(me->GetVictim(), SPELL_PHASE_PUNCH, false); @@ -795,7 +795,7 @@ public: case EVENT_OUTRO_11: me->SetStandState(UNIT_STAND_STATE_STAND); me->CastSpell(me, SPELL_TELEPORT, false); - me->DespawnOrUnsummon(3000); + me->DespawnOrUnsummon(3s); break; case EVENT_DESPAWN_ALGALON_1: Talk(SAY_ALGALON_DESPAWN_1); @@ -812,7 +812,7 @@ public: case EVENT_DESPAWN_ALGALON_5: me->SetStandState(UNIT_STAND_STATE_STAND); me->CastSpell(me, SPELL_TELEPORT, false); - me->DespawnOrUnsummon(3000); + me->DespawnOrUnsummon(3s); break; case EVENT_CHECK_HERALD_ITEMS: if (!DoCheckHeraldOfTheTitans()) @@ -871,12 +871,12 @@ public: if (movementType != POINT_MOTION_TYPE) return; - uint32 delay = 1; + Milliseconds delay = 1ms; _currentPoint = pointId + 1; switch (pointId) { case 2: - delay = 8000; + delay = 8s; me->SetWalk(true); break; case 6: @@ -886,7 +886,7 @@ public: events.ScheduleEvent(EVENT_SUMMON_ALGALON, 7500ms); return; case 10: - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); return; case POINT_BRANN_OUTRO: case POINT_BRANN_OUTRO_END: @@ -1010,7 +1010,7 @@ public: break; case ACTION_BIG_BANG: events.SetPhase(PHASE_BIG_BANG); - events.DelayEvents(9500); + events.DelayEvents(9500ms); events.ScheduleEvent(EVENT_RESUME_UPDATING, 9500ms); break; } @@ -1025,10 +1025,10 @@ public: instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_ID_SUPERMASSIVE_START); caster->CastSpell((Unit*)nullptr, SPELL_BLACK_HOLE_CREDIT, TRIGGERED_FULL_MASK); - caster->ToCreature()->DespawnOrUnsummon(1); - me->DespawnOrUnsummon(1); + caster->ToCreature()->DespawnOrUnsummon(1ms); + me->DespawnOrUnsummon(1ms); if (Creature* voidZone = caster->FindNearestCreature(NPC_ALGALON_VOID_ZONE_VISUAL_STALKER, 10.0f)) - voidZone->DespawnOrUnsummon(1); + voidZone->DespawnOrUnsummon(1ms); } void UpdateAI(uint32 diff) override @@ -1146,7 +1146,7 @@ public: _locked = true; // Start Algalon event me->SetGameObjectFlag(GO_FLAG_IN_USE); - events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5000ms); + events.ScheduleEvent(EVENT_DESPAWN_CONSOLE, 5s); if (Creature* brann = me->SummonCreature(NPC_BRANN_BRONZBEARD_ALG, BrannIntroSpawnPos)) brann->AI()->DoAction(ACTION_START_INTRO); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index c56188547b..0ef24cb14b 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -31,55 +31,35 @@ enum AssemblySpells SPELL_BERSERK = 47008, // Steelbreaker - SPELL_HIGH_VOLTAGE_10 = 61890, - SPELL_HIGH_VOLTAGE_25 = 63498, - SPELL_FUSION_PUNCH_10 = 61903, - SPELL_FUSION_PUNCH_25 = 63493, - SPELL_STATIC_DISRUPTION_10 = 61911, - SPELL_STATIC_DISRUPTION_25 = 63495, - SPELL_OVERWHELMING_POWER_10 = 64637, - SPELL_OVERWHELMING_POWER_25 = 61888, + SPELL_HIGH_VOLTAGE = 61890, + SPELL_FUSION_PUNCH = 61903, + SPELL_STATIC_DISRUPTION = 61911, + SPELL_OVERWHELMING_POWER = 64637, SPELL_ELECTRICAL_CHARGE = 61902, // Runemaster Molgeim SPELL_SHIELD_OF_RUNES_BUFF = 62277, - SPELL_SHIELD_OF_RUNES_10 = 62274, - SPELL_SHIELD_OF_RUNES_25 = 63489, + SPELL_SHIELD_OF_RUNES = 62274, SPELL_RUNE_OF_POWER = 61973, - SPELL_RUNE_OF_DEATH_10 = 62269, - SPELL_RUNE_OF_DEATH_25 = 63490, + SPELL_RUNE_OF_DEATH = 62269, SPELL_RUNE_OF_SUMMONING = 62273, SPELL_RUNE_OF_SUMMONING_SUMMON = 62020, - SPELL_LIGHTNING_BLAST_10 = 62054, - SPELL_LIGHTNING_BLAST_25 = 63491, + SPELL_LIGHTNING_BLAST = 62054, CREATURE_LIGHTNING_ELEMENTAL = 32958, CREATURE_RUNE_OF_SUMMONING = 33051, SPELL_RUNE_OF_POWER_OOC_CHANNEL = 61975, // Stormcaller Brundir - SPELL_CHAIN_LIGHTNING_10 = 61879, - SPELL_CHAIN_LIGHTNING_25 = 63479, - SPELL_OVERLOAD_10 = 61869, - SPELL_OVERLOAD_25 = 63481, - SPELL_LIGHTNING_WHIRL_10 = 61915, - SPELL_LIGHTNING_WHIRL_25 = 63483, - SPELL_LIGHTNING_TENDRILS_10 = 61887, - SPELL_LIGHTNING_TENDRILS_25 = 63486, + SPELL_CHAIN_LIGHTNING = 61879, + SPELL_OVERLOAD = 61869, + SPELL_LIGHTNING_WHIRL = 61915, + SPELL_LIGHTNING_WHIRL_TRIGG = 61916, + SPELL_LIGHTNING_TENDRILS = 61887, + SPELL_LIGHTNING_TENDRILS_2 = 61883, SPELL_STORMSHIELD = 64187, SPELL_LIGHTNING_CHANNEL_PRE = 61942, -}; -#define SPELL_HIGH_VOLTAGE RAID_MODE(SPELL_HIGH_VOLTAGE_10, SPELL_HIGH_VOLTAGE_25) -#define SPELL_FUSION_PUNCH RAID_MODE(SPELL_FUSION_PUNCH_10, SPELL_FUSION_PUNCH_25) -#define SPELL_STATIC_DISRUPTION RAID_MODE(SPELL_STATIC_DISRUPTION_10, SPELL_STATIC_DISRUPTION_25) -#define SPELL_OVERWHELMING_POWER RAID_MODE(SPELL_OVERWHELMING_POWER_10, SPELL_OVERWHELMING_POWER_25) -#define SPELL_SHIELD_OF_RUNES RAID_MODE(SPELL_SHIELD_OF_RUNES_10, SPELL_SHIELD_OF_RUNES_25) -#define SPELL_RUNE_OF_DEATH RAID_MODE(SPELL_RUNE_OF_DEATH_10, SPELL_RUNE_OF_DEATH_25) -#define SPELL_LIGHTNING_BLAST RAID_MODE(SPELL_LIGHTNING_BLAST_10, SPELL_LIGHTNING_BLAST_25) -#define SPELL_CHAIN_LIGHTNING RAID_MODE(SPELL_CHAIN_LIGHTNING_10, SPELL_CHAIN_LIGHTNING_25) -#define SPELL_OVERLOAD RAID_MODE(SPELL_OVERLOAD_10, SPELL_OVERLOAD_25) -#define SPELL_LIGHTNING_WHIRL RAID_MODE(SPELL_LIGHTNING_WHIRL_10, SPELL_LIGHTNING_WHIRL_25) -#define SPELL_LIGHTNING_TENDRILS RAID_MODE(SPELL_LIGHTNING_TENDRILS_10, SPELL_LIGHTNING_TENDRILS_25) +}; enum eEnums { @@ -355,7 +335,7 @@ public: case EVENT_OVERWHELMING_POWER: Talk(SAY_STEELBREAKER_POWER); me->CastSpell(me->GetVictim(), SPELL_OVERWHELMING_POWER, true); - events.RepeatEvent(RAID_MODE(61000, 36000)); + events.Repeat(RAID_MODE(61s, 36s)); break; case EVENT_ENRAGE: Talk(SAY_STEELBREAKER_BERSERK); @@ -418,7 +398,7 @@ public: if (pInstance) pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); - me->m_Events.AddEvent(new CastRunesEvent(*me), me->m_Events.CalculateTime(8000)); + me->m_Events.AddEventAtOffset(new CastRunesEvent(*me), 8s); } void JustReachedHome() override @@ -579,7 +559,7 @@ public: if (Player* target = SelectTargetFromPlayerList(150)) me->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f); else - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void MovementInform(uint32 type, uint32 /*id*/) override @@ -588,7 +568,7 @@ public: { _boomed = true; me->CastSpell(me, SPELL_LIGHTNING_BLAST, true); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } }; @@ -720,7 +700,7 @@ public: void SpellHitTarget(Unit* /*target*/, SpellInfo const* spellInfo) override { - if (spellInfo->Id == SPELL_CHAIN_LIGHTNING || spellInfo->Id == uint32(RAID_MODE(61916, 63482))) // Lightning Whirl triggered + if (spellInfo->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_CHAIN_LIGHTNING, me) || spellInfo->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_LIGHTNING_WHIRL_TRIGG, me)) _stunnedAchievement = false; } @@ -797,7 +777,7 @@ public: me->SetUnitFlag(UNIT_FLAG_STUNNED); me->CastSpell(me, SPELL_LIGHTNING_TENDRILS, true); - me->CastSpell(me, 61883, true); + me->CastSpell(me, SPELL_LIGHTNING_TENDRILS_2, true); events.ScheduleEvent(EVENT_LIGHTNING_LAND, 16s); events.ScheduleEvent(EVENT_LIGHTNING_FLIGHT, 1s); break; @@ -805,7 +785,7 @@ public: case EVENT_LIGHTNING_LAND: { float speed = me->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()) / (1000.0f * 0.001f); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), FORCED_MOVEMENT_NONE, speed); events.ScheduleEvent(EVENT_LAND_LAND, 1s); break; } @@ -821,8 +801,8 @@ public: me->SetRegeneratingHealth(true); _flyTargetGUID.Clear(); - me->RemoveAura(SPELL_LIGHTNING_TENDRILS); - me->RemoveAura(61883); + me->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_LIGHTNING_TENDRILS, me)); + me->RemoveAura(SPELL_LIGHTNING_TENDRILS_2); DoResetThreatList(); events.CancelEvent(EVENT_LIGHTNING_FLIGHT); break; @@ -902,7 +882,7 @@ class spell_assembly_rune_of_summoning_aura : public AuraScript void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (TempSummon* summ = GetTarget()->ToTempSummon()) - summ->DespawnOrUnsummon(1); + summ->DespawnOrUnsummon(1ms); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index 1011167987..587e591258 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -28,40 +28,25 @@ enum AuriayaSpells { // BASIC SPELL_TERRIFYING_SCREECH = 64386, - SPELL_SENTINEL_BLAST_10 = 64389, - SPELL_SENTINEL_BLAST_25 = 64678, - SPELL_SONIC_SCREECH_10 = 64422, - SPELL_SONIC_SCREECH_25 = 64688, + SPELL_SENTINEL_BLAST = 64389, + SPELL_SONIC_SCREECH = 64422, SPELL_GUARDIAN_SWARM = 64396, SPELL_ENRAGE = 47008, SPELL_ACTIVATE_FERAL_DEFENDER = 64449, // Sanctum Sentry - SPELL_SAVAGE_POUNCE_10 = 64666, - SPELL_SAVAGE_POUNCE_25 = 64374, - SPELL_RIP_FLESH_10 = 64375, - SPELL_RIP_FLESH_25 = 64667, + SPELL_SAVAGE_POUNCE = 64666, + SPELL_RIP_FLESH = 64375, SPELL_STRENGTH_OF_THE_PACK = 64369, // Feral Defender SPELL_FERAL_ESSENCE = 64455, - SPELL_FERAL_POUNCE_10 = 64478, - SPELL_FERAL_POUNCE_25 = 64669, - SPELL_FERAL_RUSH_10 = 64496, - SPELL_FERAL_RUSH_25 = 64674, + SPELL_FERAL_POUNCE = 64478, + SPELL_FERAL_RUSH = 64496, //SPELL_SEEPING_FERAL_ESSENCE_SUMMON = 64457, - SPELL_SEEPING_FERAL_ESSENCE_10 = 64458, - SPELL_SEEPING_FERAL_ESSENCE_25 = 64676, + SPELL_SEEPING_FERAL_ESSENCE = 64458, }; -#define SPELL_SONIC_SCREECH RAID_MODE(SPELL_SONIC_SCREECH_10, SPELL_SONIC_SCREECH_25) -#define SPELL_SENTINEL_BLAST RAID_MODE(SPELL_SENTINEL_BLAST_10, SPELL_SENTINEL_BLAST_25) -#define SPELL_SAVAGE_POUNCE RAID_MODE(SPELL_SAVAGE_POUNCE_10, SPELL_SAVAGE_POUNCE_25) -#define SPELL_RIP_FLESH RAID_MODE(SPELL_RIP_FLESH_10, SPELL_RIP_FLESH_25) -#define SPELL_FERAL_POUNCE RAID_MODE(SPELL_FERAL_POUNCE_10, SPELL_FERAL_POUNCE_25) -#define SPELL_FERAL_RUSH RAID_MODE(SPELL_FERAL_RUSH_10, SPELL_FERAL_RUSH_25) -//#define SPELL_SEEPING_FERAL_ESSENCE RAID_MODE(SPELL_SEEPING_FERAL_ESSENCE_10, SPELL_SEEPING_FERAL_ESSENCE_25) - enum AuriayaNPC { NPC_FERAL_DEFENDER = 34035, @@ -255,7 +240,7 @@ public: case EVENT_SENTINEL_BLAST: me->CastSpell(me, SPELL_SENTINEL_BLAST, false); events.Repeat(35s); - events.DelayEvents(5000, 0); + events.DelayEvents(5s, 0); break; case EVENT_RESPAWN_FERAL_DEFENDER: { @@ -393,7 +378,7 @@ public: else { summons.DespawnAll(); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } if (_feralEssenceStack) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 77d1053fce..46f8e0bc40 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -381,8 +381,7 @@ public: { me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); TurnGates(true, false); - me->MonsterMoveWithSpeed(homePos.GetPositionX(), homePos.GetPositionY(), homePos.GetPositionZ(), 100.0f); - me->UpdatePosition(homePos); + me->GetMotionMaster()->MovePoint(0, homePos.GetPositionX(), homePos.GetPositionY(), homePos.GetPositionZ(), FORCED_MOVEMENT_NONE, 100.0f); _speakTimer = 60000; } else if (_speakTimer > 63500) @@ -748,7 +747,7 @@ public: _despawnTimer = 0; if (Vehicle* veh = me->GetVehicle()) if (veh->GetPassenger(0) == me || veh->GetPassenger(1) == me) - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } } @@ -1090,7 +1089,8 @@ public: { summons.DespawnAll(); _spellTimer = 0; - Start(false, false, ObjectGuid::Empty, nullptr, false, true); + me->SetWalk(true); + Start(false, ObjectGuid::Empty, nullptr, false, true); if (Aura* aur = me->AddAura(SPELL_FREYA_DUMMY_YELLOW, me)) { aur->SetMaxDuration(-1); @@ -1157,7 +1157,7 @@ public: _beamTimer = 0; _removeTimer = 1; - me->DespawnOrUnsummon(5 * IN_MILLISECONDS); + me->DespawnOrUnsummon(5s); } } if (_removeTimer) @@ -1364,7 +1364,7 @@ public: liquid->CastSpell(liquid, SPELL_DUST_CLOUD_IMPACT, true); } - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } } @@ -1416,7 +1416,7 @@ public: _startTimer -= diff; if (_startTimer <= 0) { - me->GetMotionMaster()->MovePath(3000000 + urand(0, 11), true); + me->GetMotionMaster()->MoveWaypoint(3000000 + urand(0, 11), true); _startTimer = 0; } } @@ -1750,7 +1750,7 @@ class spell_vehicle_grab_pyrite : public SpellScript target->CastSpell(seat, GetEffectValue()); if (target->IsCreature()) - target->ToCreature()->DespawnOrUnsummon(1300); + target->ToCreature()->DespawnOrUnsummon(1300ms); } } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index df194ce325..4b21752910 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -29,31 +29,23 @@ enum FreyaSpells SPELL_AUTO_GROW = 62559, SPELL_LIFEBINDER_PHERONOMES = 62619, SPELL_LIFEBINDER_VISUAL = 62579, - SPELL_LIFEBINDER_HEAL_10 = 62584, - SPELL_LIFEBINDER_HEAL_25 = 64185, + SPELL_LIFEBINDER_HEAL = 62584, // FREYA - SPELL_TOUCH_OF_EONAR_10 = 62528, - SPELL_TOUCH_OF_EONAR_25 = 62892, + SPELL_TOUCH_OF_EONAR = 62528, SPELL_ATTUNED_TO_NATURE = 62519, SPELL_SUMMON_LIFEBINDER = 62870, - SPELL_SUNBEAM_10 = 62623, - SPELL_SUNBEAM_25 = 62872, + SPELL_SUNBEAM = 62623, SPELL_NATURE_BOMB_FLIGHT = 64648, - SPELL_NATURE_BOMB_DAMAGE_10 = 64587, - SPELL_NATURE_BOMB_DAMAGE_25 = 64650, + SPELL_NATURE_BOMB_DAMAGE = 64587, SPELL_GREEN_BANISH_STATE = 32567, SPELL_BERSERK = 47008, // HARD MODE - SPELL_GROUND_TREMOR_FREYA_10 = 62437, - SPELL_GROUND_TREMOR_FREYA_25 = 62859, - SPELL_IRON_ROOTS_FREYA_10 = 62862, - SPELL_IRON_ROOTS_FREYA_25 = 62439, - SPELL_IRON_ROOTS_FREYA_DAMAGE_10 = 62861, - SPELL_IRON_ROOTS_FREYA_DAMAGE_25 = 62438, - SPELL_UNSTABLE_SUN_FREYA_DAMAGE_10 = 62451, - SPELL_UNSTABLE_SUN_FREYA_DAMAGE_25 = 62865, + SPELL_GROUND_TREMOR_FREYA = 62437, + SPELL_IRON_ROOTS_FREYA = 62862, + SPELL_IRON_ROOTS_FREYA_DAMAGE = 62861, + SPELL_UNSTABLE_SUN_FREYA_DAMAGE = 62451, SPELL_UNSTABLE_SUN_VISUAL = 62216, // ELDERS @@ -64,86 +56,49 @@ enum FreyaSpells // BRIGHTLEAF SPELL_BRIGHTLEAF_FLUX = 62239, - SPELL_SOLAR_FLARE_10 = 62240, - SPELL_SOLAR_FLARE_25 = 64087, + SPELL_SOLAR_FLARE = 62240, SPELL_UNSTABLE_SUN_BEAM_AURA = 62211, SPELL_PHOTOSYNTHESIS = 62209, - SPELL_UNSTABLE_SUN_DAMAGE_10 = 62217, - SPELL_UNSTABLE_SUN_DAMAGE_25 = 62922, + SPELL_UNSTABLE_SUN_DAMAGE = 62217, // IRONBRANCH - SPELL_IMPALE_10 = 62310, - SPELL_IMPALE_25 = 62928, - SPELL_IRON_ROOTS_10 = 62275, - SPELL_IRON_ROOTS_25 = 62929, - SPELL_IRON_ROOTS_DAMAGE_10 = 62283, - SPELL_IRON_ROOTS_DAMAGE_25 = 62930, - SPELL_THORN_SWARM_10 = 62285, - SPELL_THORN_SWARM_25 = 62931, + SPELL_IMPALE = 62310, + SPELL_IRON_ROOTS = 62275, + SPELL_IRON_ROOTS_DAMAGE = 62283, + SPELL_THORN_SWARM = 62285, // STONEBARK SPELL_FISTS_OF_STONE = 62344, - SPELL_GROUND_TREMOR_10 = 62325, - SPELL_GROUND_TREMOR_25 = 62932, - SPELL_PETRIFIED_BARK_10 = 62337, - SPELL_PETRIFIED_BARK_25 = 62933, + SPELL_GROUND_TREMOR = 62325, + SPELL_PETRIFIED_BARK = 62337, // SNAPLASHER - SPELL_HARDENED_BARK_10 = 62664, - SPELL_HARDENED_BARK_25 = 64191, + SPELL_HARDENED_BARK = 62664, // ANCIENT WATER SPIRIT - SPELL_TIDAL_WAVE_10 = 62653, - SPELL_TIDAL_WAVE_25 = 62935, - SPELL_TIDAL_WAVE_DAMAGE_10 = 62654, - SPELL_TIDAL_WAVE_DAMAGE_25 = 62936, + SPELL_TIDAL_WAVE = 62653, + SPELL_TIDAL_WAVE_DAMAGE = 62654, SPELL_TIDAL_WAVE_AURA = 62655, // STORM LASHER - SPELL_LIGHTNING_LASH_10 = 62648, - SPELL_LIGHTNING_LASH_25 = 62939, - SPELL_STORMBOLT_10 = 62649, - SPELL_STORMBOLT_25 = 62938, + SPELL_LIGHTNING_LASH = 62648, + SPELL_STORMBOLT = 62649, // ANCIENT CONSERVATOR SPELL_CONSERVATOR_GRIP = 62532, - SPELL_NATURE_FURY_10 = 62589, - SPELL_NATURE_FURY_25 = 63571, + SPELL_NATURE_FURY = 62589, SPELL_POTENT_PHEROMONES = 62541, SPELL_HEALTHY_SPORE_VISUAL = 62538, SPELL_HEALTHY_SPORE_SUMMON = 62566, // DETONATING LASHER - SPELL_DETONATE_10 = 62598, - SPELL_DETONATE_25 = 62937, + SPELL_DETONATE = 62598, SPELL_FLAME_LASH = 62608, // ACHIEVEMENT SPELL_DEFORESTATION_CREDIT = 65015, }; -#define SPELL_GROUND_TREMOR RAID_MODE(SPELL_GROUND_TREMOR_10, SPELL_GROUND_TREMOR_25) -#define SPELL_PETRIFIED_BARK RAID_MODE(SPELL_PETRIFIED_BARK_10, SPELL_PETRIFIED_BARK_25) -#define SPELL_IRON_ROOTS RAID_MODE(SPELL_IRON_ROOTS_10, SPELL_IRON_ROOTS_25) -#define SPELL_IMPALE RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25) -#define SPELL_THORN_SWARM RAID_MODE(SPELL_THORN_SWARM_10, SPELL_THORN_SWARM_25) -#define SPELL_UNSTABLE_SUN_DAMAGE RAID_MODE(SPELL_UNSTABLE_SUN_DAMAGE_10, SPELL_UNSTABLE_SUN_DAMAGE_25) -#define SPELL_SOLAR_FLARE RAID_MODE(SPELL_SOLAR_FLARE_10, SPELL_SOLAR_FLARE_25) -#define SPELL_TOUCH_OF_EONAR RAID_MODE(SPELL_TOUCH_OF_EONAR_10, SPELL_TOUCH_OF_EONAR_25) -#define SPELL_LIFEBINDER_HEAL RAID_MODE(SPELL_LIFEBINDER_HEAL_10, SPELL_LIFEBINDER_HEAL_25) -#define SPELL_TIDAL_WAVE RAID_MODE(SPELL_TIDAL_WAVE_10, SPELL_TIDAL_WAVE_25) -#define SPELL_TIDAL_WAVE_DAMAGE RAID_MODE(SPELL_TIDAL_WAVE_DAMAGE_10, SPELL_TIDAL_WAVE_DAMAGE_25) -#define SPELL_NATURE_FURY RAID_MODE(SPELL_NATURE_FURY_10, SPELL_NATURE_FURY_25) -#define SPELL_HARDENED_BARK RAID_MODE(SPELL_HARDENED_BARK_10, SPELL_HARDENED_BARK_25) -#define SPELL_DETONATE RAID_MODE(SPELL_DETONATE_10, SPELL_DETONATE_25) -//#define SPELL_NATURE_BOMB_DAMAGE RAID_MODE(SPELL_NATURE_BOMB_DAMAGE_10, SPELL_NATURE_BOMB_DAMAGE_25) -#define SPELL_SUNBEAM RAID_MODE(SPELL_SUNBEAM_10, SPELL_SUNBEAM_25) -#define SPELL_GROUND_TREMOR_FREYA RAID_MODE(SPELL_GROUND_TREMOR_FREYA_10, SPELL_GROUND_TREMOR_FREYA_25) -#define SPELL_IRON_ROOTS_FREYA RAID_MODE(SPELL_IRON_ROOTS_FREYA_10, SPELL_IRON_ROOTS_FREYA_25) -#define SPELL_UNSTABLE_SUN_FREYA_DAMAGE RAID_MODE(SPELL_UNSTABLE_SUN_FREYA_DAMAGE_10, SPELL_UNSTABLE_SUN_FREYA_DAMAGE_25) -#define SPELL_LIGHTNING_LASH RAID_MODE(SPELL_LIGHTNING_LASH_10, SPELL_LIGHTNING_LASH_25) -#define SPELL_STORMBOLT RAID_MODE(SPELL_STORMBOLT_10, SPELL_STORMBOLT_25) - enum FreyaEvents { // FREYA @@ -983,9 +938,9 @@ public: if (Unit* target = ObjectAccessor::GetUnit(*me, me->ToTempSummon()->GetSummonerGUID())) { if (me->GetEntry() == NPC_IRON_ROOT_TRIGGER) // Iron Branch spell - target->RemoveAura(target->GetMap()->Is25ManRaid() ? SPELL_IRON_ROOTS_DAMAGE_25 : SPELL_IRON_ROOTS_DAMAGE_10); + target->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_IRON_ROOTS_DAMAGE, me)); else - target->RemoveAura(target->GetMap()->Is25ManRaid() ? SPELL_IRON_ROOTS_FREYA_DAMAGE_25 : SPELL_IRON_ROOTS_FREYA_DAMAGE_10); + target->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_IRON_ROOTS_FREYA_DAMAGE, me)); } } }; @@ -1023,8 +978,8 @@ public: if (_healTimer >= 12000) { me->RemoveAurasDueToSpell(SPELL_AUTO_GROW); - me->CastSpell(me, me->GetMap()->Is25ManRaid() ? SPELL_LIFEBINDER_HEAL_25 : SPELL_LIFEBINDER_HEAL_10, true); - me->DespawnOrUnsummon(2000); + me->CastSpell(me, SPELL_LIFEBINDER_HEAL, true); + me->DespawnOrUnsummon(2s); _healTimer = 0; } } @@ -1063,7 +1018,7 @@ public: if (_despawnTimer >= 22000) { me->RemoveAurasDueToSpell(SPELL_AUTO_GROW); - me->DespawnOrUnsummon(2200); + me->DespawnOrUnsummon(2200ms); _despawnTimer = 0; } } @@ -1203,7 +1158,7 @@ public: if (Unit* target = SelectTargetFromPlayerList(80)) AttackStart(target); else - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); events.Repeat(10s); break; } @@ -1249,8 +1204,8 @@ public: _explodeTimer += diff; if (_explodeTimer >= 11000) { - me->CastSpell(me, me->GetMap()->Is25ManRaid() ? SPELL_NATURE_BOMB_DAMAGE_25 : SPELL_NATURE_BOMB_DAMAGE_10, false); - me->DespawnOrUnsummon(1000); + me->CastSpell(me, SPELL_NATURE_BOMB_DAMAGE, false); + me->DespawnOrUnsummon(1s); _explodeTimer = 0; } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index a4351a818e..cb7d6c5004 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -266,7 +266,7 @@ public: Talk(SAY_EMOTE_SURGE_OF_DARKNESS); me->CastSpell(me, SPELL_SURGE_OF_DARKNESS, false); events.Repeat(63s); - events.DelayEvents(10000, 1); + events.DelayEvents(10s, 1); break; case EVENT_SPELL_MARK_OF_THE_FACELESS: { @@ -312,8 +312,8 @@ public: sv->GetMotionMaster()->MoveCharge(1852.78f, 81.38f, 342.461f, 28.0f); } - events.DelayEvents(12000, 0); - events.DelayEvents(12000, 1); + events.DelayEvents(12s, 0); + events.DelayEvents(12s, 1); events.ScheduleEvent(EVENT_SARONITE_VAPORS_SWIRL, 6s); } } @@ -450,7 +450,7 @@ public: void JustDied(Unit* /*killer*/) override { - me->DespawnOrUnsummon(3000); + me->DespawnOrUnsummon(3s); if (pInstance) if (Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(TYPE_VEZAX))) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index b318a09207..6f037c289d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -58,8 +58,7 @@ enum HodirSpellData SPELL_ICE_SHARDS_BIG = 65370, SPELL_SNOWDRIFT = 62463, - SPELL_FROZEN_BLOWS_10 = 62478, - SPELL_FROZEN_BLOWS_25 = 63512, + SPELL_FROZEN_BLOWS = 62478, // Helpers: SPELL_PRIEST_DISPELL_MAGIC = 63499, @@ -70,9 +69,8 @@ enum HodirSpellData SPELL_DRUID_STARLIGHT_AREA_AURA = 62807, SPELL_SHAMAN_LAVA_BURST = 61924, - SPELL_SHAMAN_STORM_CLOUD_10 = 65123, - SPELL_SHAMAN_STORM_CLOUD_25 = 65133, - SPELL_SHAMAN_STORM_POWER_10 = 63711, + SPELL_SHAMAN_STORM_CLOUD = 65123, + SPELL_SHAMAN_STORM_POWER = 63711, SPELL_SHAMAN_STORM_POWER_25 = 65134, SPELL_MAGE_FIREBALL = 61909, @@ -153,9 +151,6 @@ enum HodirText TEXT_EMOTE_BLOW = 8, }; -#define SPELL_FROZEN_BLOWS RAID_MODE(SPELL_FROZEN_BLOWS_10, SPELL_FROZEN_BLOWS_25) -#define SPELL_SHAMAN_STORM_CLOUD RAID_MODE(SPELL_SHAMAN_STORM_CLOUD_10, SPELL_SHAMAN_STORM_CLOUD_25) - enum HodirSounds { SOUND_HODIR_AGGRO = 15552, @@ -483,7 +478,7 @@ public: { Talk(TEXT_EMOTE_BLOW); Talk(TEXT_STALACTITE); - me->CastSpell(me, Is25ManRaid()? SPELL_FROZEN_BLOWS_25 : SPELL_FROZEN_BLOWS_10, true); + me->CastSpell(me, SPELL_FROZEN_BLOWS, true); } break; case EVENT_FREEZE: @@ -704,18 +699,18 @@ public: if (Unit* s = me->ToTempSummon()->GetSummonerUnit()) { if ((s->IsPlayer() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) || (s->IsCreature() && !s->HasAura(SPELL_FLASH_FREEZE_TRAPPED_NPC))) - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); else if (s->IsPlayer()) if (InstanceScript* instanceScript = me->GetInstanceScript()) if (instanceScript->GetData(TYPE_HODIR) == NOT_STARTED) { s->CastSpell(s, SPELL_FLASH_FREEZE_INSTAKILL, true); - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); } } else { - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); } } } @@ -1008,8 +1003,9 @@ public: void SpellHitTarget(Unit* target, SpellInfo const* spell) override { - if (target && spell->Id == SPELL_SHAMAN_STORM_CLOUD) - if (Aura* a = target->GetAura(SPELL_SHAMAN_STORM_CLOUD, me->GetGUID())) + uint32 spellid = sSpellMgr->GetSpellIdForDifficulty(SPELL_SHAMAN_STORM_CLOUD, me); + if (target && spell->Id == spellid) + if (Aura* a = target->GetAura(spellid, me->GetGUID())) a->SetStackAmount(spell->StackAmount); } @@ -1044,10 +1040,13 @@ public: events.Repeat(2600ms); break; case EVENT_SHAMAN_STORM_CLOUD: - if (Player* target = ScriptedAI::SelectTargetFromPlayerList(35.0f, SPELL_SHAMAN_STORM_CLOUD)) - me->CastSpell(target, SPELL_SHAMAN_STORM_CLOUD, false); - events.Repeat(30s); - break; + { + uint32 spellid = sSpellMgr->GetSpellIdForDifficulty(SPELL_SHAMAN_STORM_CLOUD, me); + if (Player* target = ScriptedAI::SelectTargetFromPlayerList(35.0f, spellid)) + me->CastSpell(target, spellid, false); + events.Repeat(30s); + break; + } } } @@ -1403,7 +1402,7 @@ class spell_hodir_storm_power_aura : public AuraScript void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (Unit* caster = GetCaster()) - if (Aura* a = caster->GetAura(GetId() == SPELL_SHAMAN_STORM_POWER_10 ? SPELL_SHAMAN_STORM_CLOUD_10 : SPELL_SHAMAN_STORM_CLOUD_25)) + if (Aura* a = caster->GetAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_SHAMAN_STORM_CLOUD, caster))) a->ModStackAmount(-1); } @@ -1427,14 +1426,14 @@ class spell_hodir_storm_cloud_aura : public AuraScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_SHAMAN_STORM_CLOUD_10, SPELL_SHAMAN_STORM_POWER_10, SPELL_SHAMAN_STORM_POWER_25 }); + return ValidateSpellInfo({ SPELL_SHAMAN_STORM_POWER }); } void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { PreventDefaultAction(); if (Unit* target = GetTarget()) - target->CastSpell((Unit*)nullptr, (GetId() == SPELL_SHAMAN_STORM_CLOUD_10 ? SPELL_SHAMAN_STORM_POWER_10 : SPELL_SHAMAN_STORM_POWER_25), true); + target->CastSpell((Unit*)nullptr, (sSpellMgr->GetSpellIdForDifficulty(SPELL_SHAMAN_STORM_POWER, GetCaster())), true); } void Register() override @@ -1528,7 +1527,7 @@ public: bool OnCheck(Player* player, Unit* /*target*/, uint32 /*criteria_id*/) override { - return player && player->HasAllAuras(SPELL_MAGE_TOASTY_FIRE_AURA, SPELL_DRUID_STARLIGHT_AREA_AURA, SPELL_SHAMAN_STORM_POWER_10); + return player && player->HasAllAuras(SPELL_MAGE_TOASTY_FIRE_AURA, SPELL_DRUID_STARLIGHT_AREA_AURA, SPELL_SHAMAN_STORM_POWER); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index cda5a3629c..9b6b35b114 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -26,37 +26,33 @@ #include "SpellScriptLoader.h" #include "ulduar.h" -#define SPELL_FLAME_JETS_10 62680 -#define SPELL_FLAME_JETS_25 63472 -#define S_FLAME_JETS RAID_MODE(SPELL_FLAME_JETS_10, SPELL_FLAME_JETS_25) -#define SPELL_SCORCH_10 62546 -#define SPELL_SCORCH_25 63474 -#define S_SCORCH RAID_MODE(SPELL_SCORCH_10, SPELL_SCORCH_25) -#define SPELL_ACTIVATE_CONSTRUCT 62488 -#define SPELL_STRENGTH_OF_THE_CREATOR 64473 -#define SPELL_SLAG_POT_10 62717 -#define SPELL_SLAG_POT_25 63477 -#define S_SLAG_POT RAID_MODE(SPELL_SLAG_POT_10, SPELL_SLAG_POT_25) -#define SPELL_BERSERK 64238 -#define SPELL_GRAB 62707 -#define SPELL_GRAB_TRIGGERED 62708 -#define SPELL_GRAB_CONTROL_2 62711 - -#define SPELL_SCORCHED_GROUND_10 62548 -#define SPELL_SCORCHED_GROUND_25 63476 -#define S_SCORCHED_GROUND RAID_MODE(SPELL_SCORCHED_GROUND_10, SPELL_SCORCHED_GROUND_25) -#define SPELL_HEAT_AREA 62343 -#define SPELL_HEAT_BUFF 65667 -#define SPELL_MOLTEN 62373 -#define SPELL_BRITTLE_10 62382 -#define SPELL_BRITTLE_25 67114 -#define S_BRITTLE RAID_MODE(SPELL_BRITTLE_10, SPELL_BRITTLE_25) -#define SPELL_SHATTER 62383 - -#define BOSS_IGNIS 33118 -#define NPC_IRON_CONSTRUCT 33121 -#define NPC_SCORCHED_GROUND 33123 -#define NPC_WATER_TRIGGER 22515 +enum IgnisSpellData +{ + SPELL_FLAME_JETS = 62680, + SPELL_SCORCH = 62546, + SPELL_ACTIVATE_CONSTRUCT = 62488, + SPELL_STRENGTH_OF_THE_CREATOR = 64473, + SPELL_SLAG_POT = 62717, + SPELL_BERSERK = 64238, + SPELL_GRAB = 62707, + SPELL_GRAB_TRIGGERED = 62708, + SPELL_GRAB_CONTROL_2 = 62711, + + SPELL_SCORCHED_GROUND = 62548, + SPELL_HEAT_AREA = 62343, + SPELL_HEAT_BUFF = 65667, + SPELL_MOLTEN = 62373, + SPELL_BRITTLE = 62382, + SPELL_SHATTER = 62383, +}; + +enum IgnisNPCs +{ + BOSS_IGNIS = 33118, + NPC_IRON_CONSTRUCT = 33121, + NPC_SCORCHED_GROUND = 33123, + NPC_WATER_TRIGGER = 22515, +}; enum Texts { @@ -147,7 +143,7 @@ public: void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) override { - if (damage >= RAID_MODE(3000U, 5000U) && me->GetAura(S_BRITTLE)) + if (damage >= RAID_MODE(3000U, 5000U) && me->GetAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_BRITTLE, me))) { me->CastSpell(me, SPELL_SHATTER, true); Unit::Kill(attacker, me); @@ -177,7 +173,7 @@ public: if (me->FindNearestCreature(NPC_WATER_TRIGGER, 18.0f, true)) { me->RemoveAura(a); - me->CastSpell(me, S_BRITTLE, true); + me->CastSpell(me, SPELL_BRITTLE, true); } } else @@ -247,7 +243,7 @@ public: bShattered = false; lastShatterMSTime = 0; events.Reset(); - events.ScheduleEvent(EVENT_ACTIVATE_CONSTRUCT, RAID_MODE(40000, 30000)); + events.ScheduleEvent(EVENT_ACTIVATE_CONSTRUCT, RAID_MODE(40s, 30s)); events.ScheduleEvent(EVENT_SPELL_SCORCH, 10s); events.ScheduleEvent(EVENT_SPELL_FLAME_JETS, 32s); events.ScheduleEvent(EVENT_GRAB, 25s); @@ -312,7 +308,7 @@ public: if (caster && spell->Id == SPELL_GRAB_CONTROL_2) { //caster->ClearUnitState(UNIT_STATE_ONVEHICLE); - me->CastSpell(caster, S_SLAG_POT, true); + me->CastSpell(caster, SPELL_SLAG_POT, true); } } @@ -347,14 +343,14 @@ public: me->CastSpell(me, SPELL_BERSERK, true); break; } - events.RepeatEvent(RAID_MODE(40000, 30000)); + events.Repeat(RAID_MODE(40s, 30s)); break; case EVENT_SPELL_SCORCH: Talk(SAY_SCORCH); me->SetControlled(true, UNIT_STATE_ROOT); me->DisableRotate(true); me->SendMovementFlagUpdate(); - me->CastSpell(me->GetVictim(), S_SCORCH, false); + me->CastSpell(me->GetVictim(), SPELL_SCORCH, false); events.Repeat(20s); events.RescheduleEvent(EVENT_ENABLE_ROTATE, 3s); break; @@ -364,7 +360,7 @@ public: break; case EVENT_SPELL_FLAME_JETS: Talk(EMOTE_JETS); - me->CastSpell(me->GetVictim(), S_FLAME_JETS, false); + me->CastSpell(me->GetVictim(), SPELL_FLAME_JETS, false); events.Repeat(25s); break; case EVENT_GRAB: @@ -431,7 +427,7 @@ class spell_ignis_scorch_aura : public AuraScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_SCORCHED_GROUND_10, SPELL_SCORCHED_GROUND_25 }); + return ValidateSpellInfo({ SPELL_SCORCHED_GROUND }); } void HandleEffectPeriodic(AuraEffect const* aurEff) @@ -441,7 +437,7 @@ class spell_ignis_scorch_aura : public AuraScript if (Creature* summon = caster->SummonCreature(NPC_SCORCHED_GROUND, caster->GetPositionX() + 20.0f * cos(caster->GetOrientation()), caster->GetPositionY() + 20.0f * std::sin(caster->GetOrientation()), 361.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000)) { if (!summon->FindNearestCreature(NPC_WATER_TRIGGER, 25.0f, true)) // must be away from the water - summon->CastSpell(summon, (aurEff->GetId() == SPELL_SCORCH_10 ? SPELL_SCORCHED_GROUND_10 : SPELL_SCORCHED_GROUND_25), true); + summon->CastSpell(summon, SPELL_SCORCHED_GROUND, true); } } @@ -474,12 +470,10 @@ class spell_ignis_grab_initial : public SpellScript enum SlagPot { - SPELL_SLAG_POT_DAMAGE_1 = 65722, - SPELL_SLAG_POT_DAMAGE_2 = 65723, + SPELL_SLAG_POT_DAMAGE = 65722, SPELL_SCORCH_DAMAGE_1 = 62549, SPELL_SCORCH_DAMAGE_2 = 63475, - SPELL_SLAG_IMBUED_1 = 62836, - SPELL_SLAG_IMBUED_2 = 63536 + SPELL_SLAG_IMBUED = 62836, }; class spell_ignis_slag_pot_aura : public AuraScript @@ -490,12 +484,10 @@ class spell_ignis_slag_pot_aura : public AuraScript { return ValidateSpellInfo( { - SPELL_SLAG_POT_DAMAGE_1, - SPELL_SLAG_POT_DAMAGE_2, + SPELL_SLAG_POT_DAMAGE, SPELL_SCORCH_DAMAGE_1, SPELL_SCORCH_DAMAGE_2, - SPELL_SLAG_IMBUED_1, - SPELL_SLAG_IMBUED_2 + SPELL_SLAG_IMBUED }); } @@ -503,7 +495,7 @@ class spell_ignis_slag_pot_aura : public AuraScript { if (Unit* caster = GetCaster()) if (Unit* target = GetTarget()) - caster->CastSpell(target, (GetId() == SPELL_SLAG_POT_10 ? SPELL_SLAG_POT_DAMAGE_1 : SPELL_SLAG_POT_DAMAGE_2), true); + caster->CastSpell(target, SPELL_SLAG_POT_DAMAGE, true); } void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) @@ -522,7 +514,7 @@ class spell_ignis_slag_pot_aura : public AuraScript target->ApplySpellImmune(GetId(), IMMUNITY_ID, SPELL_SCORCH_DAMAGE_1, false); target->ApplySpellImmune(GetId(), IMMUNITY_ID, SPELL_SCORCH_DAMAGE_2, false); if (target->IsAlive()) - target->CastSpell(target, (GetId() == SPELL_SLAG_POT_10 ? SPELL_SLAG_IMBUED_1 : SPELL_SLAG_IMBUED_2), true); + target->CastSpell(target, SPELL_SLAG_IMBUED, true); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 34f5cf1555..ba2d626ca6 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -45,56 +45,33 @@ enum KologarnSpells SPELL_KOLOGARN_REDUCE_PARRY = 64651, // BASIC - SPELL_OVERHEAD_SMASH_10 = 63356, - SPELL_OVERHEAD_SMASH_25 = 64003, - SPELL_ONEARMED_OVERHEAD_SMASH_10 = 63573, - SPELL_ONEARMED_OVERHEAD_SMASH_25 = 64006, - SPELL_PETRIFYING_BREATH_10 = 62030, - SPELL_PETRIFYING_BREATH_25 = 63980, - SPELL_STONE_SHOUT_10 = 63716, - SPELL_STONE_SHOUT_25 = 64005, + SPELL_OVERHEAD_SMASH = 63356, + SPELL_ONEARMED_OVERHEAD_SMASH = 63573, + SPELL_PETRIFYING_BREATH = 62030, + SPELL_STONE_SHOUT = 63716, // EYEBEAM SPELL_FOCUSED_EYEBEAM_SUMMON = 63342, - SPELL_FOCUSED_EYEBEAM_10 = 63347, - SPELL_FOCUSED_EYEBEAM_25 = 63977, + SPELL_FOCUSED_EYEBEAM = 63347, SPELL_FOCUSED_EYEBEAM_RIGHT = 63702, SPELL_FOCUSED_EYEBEAM_LEFT = 63676, // ARMS - SPELL_ARM_DEAD_10 = 63629, - SPELL_ARM_DEAD_25 = 63979, - SPELL_RUBBLE_FALL_10 = 63821, - SPELL_RUBBLE_FALL_25 = 64001, + SPELL_ARM_DEAD = 63629, + SPELL_RUBBLE_FALL = 63821, SPELL_ARM_RESPAWN_VISUAL = 64753, // LEFT ARM - SPELL_ARM_SWEEP_10 = 63766, - SPELL_ARM_SWEEP_25 = 63983, + SPELL_ARM_SWEEP = 63766, // RIGHT ARM - SPELL_STONE_GRIP_10 = 62166, - SPELL_STONE_GRIP_25 = 63981, - SPELL_RIDE_RIGHT_ARM_10 = 62056, - SPELL_RIDE_RIGHT_ARM_25 = 63985, + SPELL_STONE_GRIP = 62166, + SPELL_RIDE_RIGHT_ARM = 62056, // RUBBLE TRASH - SPELL_RUBBLE_ATTACK_10 = 63818, - SPELL_RUBBLE_ATTACK_25 = 63978, + SPELL_RUBBLE_ATTACK = 63818, }; -#define SPELL_PETRIFYING_BREATH RAID_MODE(SPELL_PETRIFYING_BREATH_10, SPELL_PETRIFYING_BREATH_25) -#define SPELL_OVERHEAD_SMASH RAID_MODE(SPELL_OVERHEAD_SMASH_10, SPELL_OVERHEAD_SMASH_25) -#define SPELL_ONEARMED_OVERHEAD_SMASH RAID_MODE(SPELL_ONEARMED_OVERHEAD_SMASH_10, SPELL_ONEARMED_OVERHEAD_SMASH_25) -#define SPELL_ARM_DEAD RAID_MODE(SPELL_ARM_DEAD_10, SPELL_ARM_DEAD_25) -#define SPELL_ARM_SWEEP RAID_MODE(SPELL_ARM_SWEEP_10, SPELL_ARM_SWEEP_25) -#define SPELL_STONE_GRIP RAID_MODE(SPELL_STONE_GRIP_10, SPELL_STONE_GRIP_25) -#define SPELL_FOCUSED_EYEBEAM RAID_MODE(SPELL_FOCUSED_EYEBEAM_10, SPELL_FOCUSED_EYEBEAM_25) -#define SPELL_RUBBLE_FALL RAID_MODE(SPELL_RUBBLE_FALL_10, SPELL_RUBBLE_FALL_25) -#define SPELL_RUBBLE_ATTACK RAID_MODE(SPELL_RUBBLE_ATTACK_10, SPELL_RUBBLE_ATTACK_25) -#define SPELL_RIDE_RIGHT_ARM RAID_MODE(SPELL_RIDE_RIGHT_ARM_10, SPELL_RIDE_RIGHT_ARM_25) -#define SPELL_STONE_SHOUT RAID_MODE(SPELL_STONE_SHOUT_10, SPELL_STONE_SHOUT_25) - enum KologarnEvents { EVENT_SMASH = 1, @@ -339,9 +316,9 @@ public: go->SetLootRecipient(me); } if (Creature* arm = ObjectAccessor::GetCreature(*me, _left)) - arm->DespawnOrUnsummon(3000); // visual + arm->DespawnOrUnsummon(3s); // visual if (Creature* arm = ObjectAccessor::GetCreature(*me, _right)) - arm->DespawnOrUnsummon(3000); // visual + arm->DespawnOrUnsummon(3s); // visual me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetDisableGravity(true); } @@ -796,9 +773,7 @@ class spell_ulduar_stone_grip_cast_target : public SpellScript // Remove "main tank" and non-player targets targets.remove_if(StoneGripTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); // Maximum affected targets per difficulty mode - uint32 maxTargets = 1; - if (GetSpellInfo()->Id == SPELL_STONE_GRIP_25) - maxTargets = 3; + uint32 maxTargets = GetSpellInfo()->Id == SPELL_STONE_GRIP ? 1 : 3; // Return a random amount of targets based on maxTargets while (maxTargets < targets.size()) @@ -850,6 +825,7 @@ class spell_ulduar_squeezed_lifeless : public SpellScript } }; +// 63720, 64004 class spell_kologarn_stone_shout : public SpellScript { PrepareSpellScript(spell_kologarn_stone_shout); @@ -861,7 +837,6 @@ class spell_kologarn_stone_shout : public SpellScript void Register() override { - if (m_scriptSpellId != SPELL_STONE_SHOUT_10 && m_scriptSpellId != SPELL_STONE_SHOUT_25) OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kologarn_stone_shout::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; @@ -879,7 +854,6 @@ class spell_kologarn_stone_shout_aura : public AuraScript void Register() override { - if (m_scriptSpellId == SPELL_STONE_SHOUT_10 || m_scriptSpellId == SPELL_STONE_SHOUT_25) OnEffectPeriodic += AuraEffectPeriodicFn(spell_kologarn_stone_shout_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -945,7 +919,8 @@ void AddSC_boss_kologarn() RegisterSpellScript(spell_ulduar_stone_grip_aura); RegisterSpellScript(spell_ulduar_squeezed_lifeless); RegisterSpellScript(spell_kologarn_focused_eyebeam); - RegisterSpellAndAuraScriptPair(spell_kologarn_stone_shout, spell_kologarn_stone_shout_aura); + RegisterSpellScript(spell_kologarn_stone_shout); + RegisterSpellScript(spell_kologarn_stone_shout_aura); // Achievements new achievement_kologarn_looks_could_kill(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 9823a3d9ed..ef53103da8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -23,6 +23,7 @@ #include "PassiveAI.h" #include "Player.h" #include "ScriptedCreature.h" +#include "SharedDefines.h" #include "Spell.h" #include "SpellAuraEffects.h" #include "SpellScript.h" @@ -35,18 +36,15 @@ enum SpellData SPELL_BERSERK = 64238, // PHASE 1: - SPELL_NAPALM_SHELL_25 = 65026, - SPELL_NAPALM_SHELL_10 = 63666, + SPELL_NAPALM_SHELL = 63666, - SPELL_PLASMA_BLAST_25 = 64529, - SPELL_PLASMA_BLAST_10 = 62997, + SPELL_PLASMA_BLAST = 62997, SPELL_SHOCK_BLAST = 63631, SPELL_PROXIMITY_MINES = 63027, NPC_PROXIMITY_MINE = 34362, - SPELL_MINE_EXPLOSION_25 = 63009, - SPELL_MINE_EXPLOSION_10 = 66351, + SPELL_MINE_EXPLOSION = 66351, SPELL_SUMMON_PROXIMITY_MINE = 65347, // PHASE 2: @@ -57,17 +55,14 @@ enum SpellData NPC_ROCKET_STRIKE_N = 34047, SPELL_RAPID_BURST = 63382, - SPELL_RAPID_BURST_DAMAGE_25_1 = 64531, - SPELL_RAPID_BURST_DAMAGE_25_2 = 64532, - SPELL_RAPID_BURST_DAMAGE_10_1 = 63387, - SPELL_RAPID_BURST_DAMAGE_10_2 = 64019, + SPELL_RAPID_BURST_DAMAGE_1 = 63387, + SPELL_RAPID_BURST_DAMAGE_2 = 64019, SPELL_SUMMON_BURST_TARGET = 64840, SPELL_SPINNING_UP = 63414, // PHASE 3: - SPELL_PLASMA_BALL_25 = 64535, - SPELL_PLASMA_BALL_10 = 63689, + SPELL_PLASMA_BALL = 63689, SPELL_MAGNETIC_CORE = 64436, SPELL_SPINNING = 64438, @@ -80,10 +75,8 @@ enum SpellData SPELL_BEAM_BLUE = 63294, // PHASE 4: - SPELL_HAND_PULSE_10_R = 64352, - SPELL_HAND_PULSE_25_R = 64537, - SPELL_HAND_PULSE_10_L = 64348, - SPELL_HAND_PULSE_25_L = 64536, + SPELL_HAND_PULSE_R = 64352, + SPELL_HAND_PULSE_L = 64348, SPELL_SELF_REPAIR = 64383, SPELL_SLEEP_VISUAL_1 = 64393, @@ -219,14 +212,6 @@ enum EVENTS EVENT_EMERGENCY_BOT_ATTACK = 70, }; -#define SPELL_NAPALM_SHELL RAID_MODE(SPELL_NAPALM_SHELL_10, SPELL_NAPALM_SHELL_25) -#define SPELL_PLASMA_BLAST RAID_MODE(SPELL_PLASMA_BLAST_10, SPELL_PLASMA_BLAST_25) -#define SPELL_MINE_EXPLOSION RAID_MODE(SPELL_MINE_EXPLOSION_10, SPELL_MINE_EXPLOSION_25) -#define SPELL_PLASMA_BALL RAID_MODE(SPELL_PLASMA_BALL_10, SPELL_PLASMA_BALL_25) -#define SPELL_HAND_PULSE_R RAID_MODE(SPELL_HAND_PULSE_10_R, SPELL_HAND_PULSE_25_R) -#define SPELL_HAND_PULSE_L RAID_MODE(SPELL_HAND_PULSE_10_L, SPELL_HAND_PULSE_25_L) -#define SPELL_FROST_BOMB_EXPLOSION RAID_MODE(SPELL_FROST_BOMB_EXPLOSION_10, SPELL_FROST_BOMB_EXPLOSION_25) - enum Texts { // Mimiron @@ -378,8 +363,8 @@ public: events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, 3s); minutesTalkNum = Is25ManRaid() ? TALK_COMPUTER_TEN : TALK_COMPUTER_EIGHT; for (uint32 i = 0; i < uint32(TALK_COMPUTER_ZERO - minutesTalkNum - 1); ++i) - events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, (i + 1)*MINUTE * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, (TALK_COMPUTER_ZERO - minutesTalkNum)*MINUTE * IN_MILLISECONDS + 6000); + events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, Milliseconds((i + 1) * 60000)); + events.ScheduleEvent(EVENT_COMPUTER_SAY_MINUTES, Milliseconds((TALK_COMPUTER_ZERO - minutesTalkNum) * 60000)); } // ensure LMK2 is at proper position @@ -601,7 +586,7 @@ public: { me->EnterVehicle(VX001, 4); float speed = ACU->GetDistance(2737.75f, 2574.22f, 381.34f) / 2.0f; - ACU->MonsterMoveWithSpeed(2737.75f, 2574.22f, 381.34f, speed); + ACU->GetMotionMaster()->MovePoint(0, 2737.75f, 2574.22f, 381.34f, FORCED_MOVEMENT_NONE, speed); ACU->SetPosition(2737.75f, 2574.22f, 381.34f, M_PI); events.ScheduleEvent(EVENT_SAY_VX001_DEAD, 2s); break; @@ -740,17 +725,17 @@ public: LMK2->InterruptNonMeleeSpells(false); LMK2->AttackStop(); LMK2->AI()->SetData(1, 0); - LMK2->DespawnOrUnsummon(7000); + LMK2->DespawnOrUnsummon(7s); LMK2->SetReactState(REACT_PASSIVE); VX001->InterruptNonMeleeSpells(false); VX001->AttackStop(); VX001->AI()->SetData(1, 0); - VX001->DespawnOrUnsummon(7000); + VX001->DespawnOrUnsummon(7s); VX001->SetReactState(REACT_PASSIVE); ACU->InterruptNonMeleeSpells(false); ACU->AttackStop(); ACU->AI()->SetData(1, 0); - ACU->DespawnOrUnsummon(7000); + ACU->DespawnOrUnsummon(7s); ACU->SetReactState(REACT_PASSIVE); Position exitPos = me->GetPosition(); @@ -1221,7 +1206,7 @@ public: if (p->GetEntry() == NPC_LEVIATHAN_MKII_CANNON && !apply) { Unit::Kill(p, p); - p->ToCreature()->DespawnOrUnsummon(6000); + p->ToCreature()->DespawnOrUnsummon(6s); } } @@ -1343,7 +1328,7 @@ public: for (uint8 i = 0; i < 2; ++i) if (Unit* r = vk->GetPassenger(5 + i)) if (r->IsCreature()) - r->ToCreature()->DespawnOrUnsummon(1); + r->ToCreature()->DespawnOrUnsummon(1ms); } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override @@ -1555,7 +1540,7 @@ public: void PassengerBoarded(Unit* p, int8 /*seat*/, bool apply) override { if (p->GetEntry() == NPC_ROCKET_VISUAL && !apply) - p->ToCreature()->DespawnOrUnsummon(8000); + p->ToCreature()->DespawnOrUnsummon(8s); } void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override @@ -1681,8 +1666,7 @@ public: me->InterruptNonMeleeSpells(false); me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE); - me->MonsterMoveWithSpeed(2744.65f, 2569.46f, 381.34f, me->GetDistance(2744.65f, 2569.46f, 381.34f)); - me->UpdatePosition(2744.65f, 2569.46f, 381.34f, M_PI, false); + me->GetMotionMaster()->MovePoint(0, 2744.65f, 2569.46f, 381.34f); if (Creature* c = GetMimiron()) c->AI()->SetData(0, 3); @@ -1740,8 +1724,7 @@ public: } float speed = me->GetExactDist(x, y, 381.34f); - me->MonsterMoveWithSpeed(x, y, 381.34f, speed); - me->UpdatePosition(x, y, 381.34f, me->GetAngle(victim), false); + me->GetMotionMaster()->MovePoint(0, x, y, 381.34f, FORCED_MOVEMENT_NONE, speed); if (mc) { mc->AI()->SetData(0, 0); @@ -1793,14 +1776,12 @@ public: case EVENT_MAGNETIC_CORE_PULL_DOWN: me->CastSpell(me, SPELL_MAGNETIC_CORE, true); me->CastSpell(me, SPELL_SPINNING, true); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 365.34f, me->GetExactDist(me->GetPositionX(), me->GetPositionY(), 365.34f)); - me->UpdatePosition(me->GetPositionX(), me->GetPositionY(), 365.34f, me->GetOrientation(), false); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 365.34f, FORCED_MOVEMENT_NONE, me->GetExactDist(me->GetPositionX(), me->GetPositionY(), 365.34f)); events.ScheduleEvent(EVENT_MAGNETIC_CORE_FREE, 20s); break; case EVENT_MAGNETIC_CORE_FREE: me->RemoveAura(SPELL_SPINNING); - me->MonsterMoveWithSpeed(me->GetPositionX(), me->GetPositionY(), 381.34f, me->GetDistance(me->GetPositionX(), me->GetPositionY(), 381.34f)); - me->UpdatePosition(me->GetPositionX(), me->GetPositionY(), 381.34f, me->GetOrientation(), false); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 381.34f, FORCED_MOVEMENT_NONE, me->GetDistance(me->GetPositionX(), me->GetPositionY(), 381.34f)); events.ScheduleEvent(EVENT_MAGNETIC_CORE_REMOVE_IMMOBILIZE, 1s); break; case EVENT_MAGNETIC_CORE_REMOVE_IMMOBILIZE: @@ -1893,14 +1874,6 @@ public: void MoveInLineOfSight(Unit* /*who*/) override {} bool CanAIAttack(Unit const* /*target*/) const override { return false; } - void SpellHitTarget(Unit* target, SpellInfo const* spell) override - { - if (target && spell && target->IsPlayer() && spell->Id == SPELL_MINE_EXPLOSION) - if (InstanceScript* pInstance = me->GetInstanceScript()) - if (Creature* c = GetMimiron()) - c->AI()->SetData(0, 11); - } - // MoveInLineOfSight is checked every few yards, can't use it void UpdateAI(uint32 diff) override { @@ -1931,6 +1904,24 @@ public: }; }; +class spell_ulduar_mimiron_mine_explosion : public SpellScript +{ + PrepareSpellScript(spell_ulduar_mimiron_mine_explosion); + + void HandleDamage(SpellEffIndex /*effIndex*/) + { + if (GetHitPlayer()) + if (InstanceScript* pInstance = GetCaster()->GetInstanceScript()) + if (Creature* mimi = pInstance->GetCreature(TYPE_MIMIRON)) + mimi->AI()->SetData(0, 11); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_ulduar_mimiron_mine_explosion::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + class npc_ulduar_mimiron_rocket : public CreatureScript { public: @@ -1960,7 +1951,7 @@ public: void SetData(uint32 /*id*/, uint32 /*value*/) override { - me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 100.0f, false, true); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 100.0f, FORCED_MOVEMENT_NONE, 0.f, false, true); } void UpdateAI(uint32 /*diff*/) override @@ -2015,7 +2006,7 @@ public: if (despawnTimer <= diff) { despawnTimer = 60000; - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } else despawnTimer -= diff; @@ -2081,7 +2072,7 @@ public: bot->CastSpell(bot, SPELL_EMERGENCY_MODE, true); } - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); timer = 99999; } else @@ -2098,10 +2089,8 @@ class spell_mimiron_rapid_burst_aura : public AuraScript { return ValidateSpellInfo( { - SPELL_RAPID_BURST_DAMAGE_10_1, - SPELL_RAPID_BURST_DAMAGE_10_2, - SPELL_RAPID_BURST_DAMAGE_25_1, - SPELL_RAPID_BURST_DAMAGE_25_2 + SPELL_RAPID_BURST_DAMAGE_1, + SPELL_RAPID_BURST_DAMAGE_2, }); } @@ -2109,7 +2098,7 @@ class spell_mimiron_rapid_burst_aura : public AuraScript { if (Unit* caster = GetCaster()) { - uint32 id = (caster->GetMap()->Is25ManRaid() ? ((aurEff->GetTickNumber() % 2) ? SPELL_RAPID_BURST_DAMAGE_25_2 : SPELL_RAPID_BURST_DAMAGE_25_1) : ((aurEff->GetTickNumber() % 2) ? SPELL_RAPID_BURST_DAMAGE_10_2 : SPELL_RAPID_BURST_DAMAGE_10_1)); + uint32 id = (aurEff->GetTickNumber() % 2) ? SPELL_RAPID_BURST_DAMAGE_2 : SPELL_RAPID_BURST_DAMAGE_1; caster->CastSpell((Unit*)nullptr, id, true); } } @@ -2346,7 +2335,7 @@ public: CAST_AI(npc_ulduar_flames_initial::npc_ulduar_flames_initialAI, c->AI())->RemoveFlame(me->GetGUID()); me->RemoveAllAuras(); - me->DespawnOrUnsummon(2500); + me->DespawnOrUnsummon(2500ms); } break; case SPELL_VX001_FROST_BOMB: @@ -2502,6 +2491,7 @@ void AddSC_boss_mimiron() new npc_ulduar_bot_summon_trigger(); RegisterSpellScript(spell_mimiron_rapid_burst_aura); RegisterSpellScript(spell_mimiron_p3wx2_laser_barrage_aura); + RegisterSpellScript(spell_ulduar_mimiron_mine_explosion); new go_ulduar_do_not_push_this_button(); new npc_ulduar_flames_initial(); new npc_ulduar_flames_spread(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 8d9dae387f..2ece43eb78 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -30,12 +30,10 @@ enum Spells { // Razorscale - SPELL_FLAMEBUFFET_10 = 64016, - SPELL_FLAMEBUFFET_25 = 64023, + SPELL_FLAMEBUFFET = 64016, SPELL_FIREBALL = 63815, SPELL_WINGBUFFET = 62666, - SPELL_FLAMEBREATH_10 = 63317, - SPELL_FLAMEBREATH_25 = 64021, + SPELL_FLAMEBREATH = 63317, SPELL_FUSEARMOR = 64771, SPELL_FUSED_ARMOR = 64774, // Applied on 5th stack of SPELL_FUSEARMOR SPELL_DEVOURINGFLAME = 63236, @@ -50,25 +48,17 @@ enum Spells // Dark Rune Sentinel SPELL_WHIRLWIND = 63808, - SPELL_BATTLE_SHOUT_10 = 46763, - SPELL_BATTLE_SHOUT_25 = 64062, + SPELL_BATTLE_SHOUT = 46763, // Dark Rune Guardian SPELL_STORMSTRIKE_DMG = 65971, SPELL_STORMSTRIKE_DEBUFF = 64757, // Dark Rune Watcher - SPELL_LIGHTINGBOLT_10 = 63809, - SPELL_LIGHTINGBOLT_25 = 64696, - SPELL_CHAINLIGHTNING_10 = 64758, - SPELL_CHAINLIGHTNING_25 = 64759, + SPELL_LIGHTINGBOLT = 63809, + SPELL_CHAINLIGHTNING = 64758, }; -#define SPELL_FLAMEBUFFET RAID_MODE(SPELL_FLAMEBUFFET_10, SPELL_FLAMEBUFFET_25) -#define SPELL_FLAMEBREATH RAID_MODE(SPELL_FLAMEBREATH_10, SPELL_FLAMEBREATH_25) -#define SPELL_BATTLE_SHOUT RAID_MODE(SPELL_BATTLE_SHOUT_10, SPELL_BATTLE_SHOUT_25) -#define SPELL_LIGHTINGBOLT RAID_MODE(SPELL_LIGHTINGBOLT_10, SPELL_LIGHTINGBOLT_25) -#define SPELL_CHAINLIGHTNING RAID_MODE(SPELL_CHAINLIGHTNING_10, SPELL_CHAINLIGHTNING_25) #define REQ_CHAIN_COUNT RAID_MODE(2, 4) enum NPCs @@ -354,17 +344,7 @@ public: { me->StopMoving(); startPath = false; - if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath())) - { - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - for (uint8 i = 0; i < i_path->size(); ++i) - { - WaypointData const* node = i_path->at(i); - pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); - } - me->GetMotionMaster()->MoveSplinePath(&pathPoints); - } + me->GetMotionMaster()->MovePath(me->GetWaypointPath(), FORCED_MOVEMENT_NONE, PathSource::WAYPOINT_MGR); } if (!UpdateVictim()) @@ -683,7 +663,7 @@ public: { razorscale->AI()->AttackStart(player); razorscale->GetMotionMaster()->MoveIdle(); - razorscale->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_INIT, 588.0f, -178.0f, 490.0f, false, false); + razorscale->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_INIT, 588.0f, -178.0f, 490.0f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false, false); } } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index d2b1aee4c4..160e8d3d50 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -23,6 +23,7 @@ #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" #include "SpellAuraEffects.h" +#include "SpellMgr.h" #include "SpellScript.h" #include "SpellScriptLoader.h" #include "ulduar.h" @@ -34,8 +35,7 @@ enum ThorimSpells SPELL_SHEATH_OF_LIGHTNING = 62276, SPELL_STORMHAMMER = 62042, SPELL_BERSERK_FRIENDS = 62560, - SPELL_CHAIN_LIGHTNING_10 = 62131, - SPELL_CHAIN_LIGHTNING_25 = 64390, + SPELL_CHAIN_LIGHTNING = 62131, SPELL_UNBALANCING_STRIKE = 62130, SPELL_BERSERK = 26662, @@ -54,17 +54,13 @@ enum ThorimSpells SPELL_SIF_CHANNEL_HOLOGRAM = 64324, SPELL_FROSTBOLT = 62601, SPELL_FROSTBOLT_VALLEY = 62604, - SPELL_BLIZZARD_10 = 62577, - SPELL_BLIZZARD_25 = 62603, + SPELL_BLIZZARD = 62577, SPELL_FROST_NOVA = 62605, // DARK RUNE ACOLYTE - SPELL_GREATER_HEAL_10 = 62334, - SPELL_GREATER_HEAL_25 = 62442, - SPELL_HOLY_SMITE_10 = 62335, - SPELL_HOLY_SMITE_25 = 62443, - SPELL_RENEW_10 = 62333, - SPELL_RENEW_25 = 62441, + SPELL_GREATER_HEAL = 62334, + SPELL_HOLY_SMITE = 62335, + SPELL_RENEW = 62333, // CAPTURED MERCENARY SOLDIER SPELL_BARBED_SHOT = 62318, @@ -76,19 +72,15 @@ enum ThorimSpells SPELL_HEROIC_STRIKE = 62444, // JORMUNGAR BEHEMOTH - SPELL_ACID_BREATH_10 = 62315, - SPELL_ACID_BREATH_25 = 62415, - SPELL_SWEEP_10 = 62316, - SPELL_SWEEP_25 = 62417, + SPELL_ACID_BREATH = 62315, + SPELL_SWEEP = 62316, // IRON RING GUARD - SPELL_IMPALE_10 = 62331, - SPELL_IMPALE_25 = 62418, + SPELL_IMPALE = 62331, SPELL_WHIRLING_TRIP = 64151, // IRON HONOR GUARD - SPELL_SHIELD_SMASH_10 = 62332, - SPELL_SHIELD_SMASH_25 = 62420, + SPELL_SHIELD_SMASH = 62332, SPELL_CLEAVE = 42724, SPELL_HAMSTRING = 48639, @@ -97,12 +89,9 @@ enum ThorimSpells SPELL_RUNIC_STRIKE = 62322, // DARK RUNE EVOKER - SPELL_RUNIC_LIGHTNING_10 = 62327, - SPELL_RUNIC_LIGHTNING_25 = 62445, - SPELL_RUNIC_MENDING_10 = 62328, - SPELL_RUNIC_MENDING_25 = 62446, - SPELL_RUNIC_SHIELD_10 = 62321, - SPELL_RUNIC_SHIELD_25 = 62529, + SPELL_RUNIC_LIGHTNING = 62327, + SPELL_RUNIC_MENDING = 62328, + SPELL_RUNIC_SHIELD = 62321, // DARK RUNE CHAMPION SPELL_CHARGE = 32323, @@ -114,8 +103,7 @@ enum ThorimSpells SPELL_PUMMEL = 38313, // RUNIC COLOSSUS - SPELL_COLOSSUS_CHARGE_10 = 62613, - SPELL_COLOSSUS_CHARGE_25 = 62614, + SPELL_COLOSSUS_CHARGE = 62613, SPELL_RUNIC_BARRIER = 62338, SPELL_SMASH = 62339, SPELL_RUNIC_SMASH_LEFT = 62057, @@ -125,8 +113,7 @@ enum ThorimSpells // ANCIENT RUNE GIANT SPELL_RUNE_DETONATION = 62526, SPELL_RUNIC_FORTIFICATION = 62942, - SPELL_STOMP_10 = 62411, - SPELL_STOMP_25 = 62413, + SPELL_STOMP = 62411, // TRAPS SPELL_LIGHTNING_FIELD = 64972, @@ -134,20 +121,6 @@ enum ThorimSpells SPELL_PARALYTIC_FIELD_SECOND = 63540, }; -#define SPELL_GREATER_HEAL RAID_MODE(SPELL_GREATER_HEAL_10, SPELL_GREATER_HEAL_25) -#define SPELL_HOLY_SMITE RAID_MODE(SPELL_HOLY_SMITE_10, SPELL_HOLY_SMITE_25) -#define SPELL_RENEW RAID_MODE(SPELL_RENEW_10, SPELL_RENEW_25) -#define SPELL_ACID_BREATH RAID_MODE(SPELL_ACID_BREATH_10, SPELL_ACID_BREATH_25) -#define SPELL_SWEEP RAID_MODE(SPELL_SWEEP_10, SPELL_SWEEP_25) -#define SPELL_IMPALE RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25) -#define SPELL_COLOSSUS_CHARGE RAID_MODE(SPELL_COLOSSUS_CHARGE_10, SPELL_COLOSSUS_CHARGE_25) -#define SPELL_STOMP RAID_MODE(SPELL_STOMP_10, SPELL_STOMP_25) -#define SPELL_SHIELD_SMASH RAID_MODE(SPELL_SHIELD_SMASH_10, SPELL_SHIELD_SMASH_25) -#define SPELL_RUNIC_LIGHTNING RAID_MODE(SPELL_RUNIC_LIGHTNING_10, SPELL_RUNIC_LIGHTNING_25) -#define SPELL_RUNIC_MENDING RAID_MODE(SPELL_RUNIC_MENDING_10, SPELL_RUNIC_MENDING_25) -#define SPELL_RUNIC_SHIELD RAID_MODE(SPELL_RUNIC_SHIELD_10, SPELL_RUNIC_SHIELD_25) -#define SPELL_CHAIN_LIGHTNING RAID_MODE(SPELL_CHAIN_LIGHTNING_10, SPELL_CHAIN_LIGHTNING_25) - enum ThormNPCandGOs : uint32 { // ARENA INIT @@ -859,7 +832,7 @@ public: else if (param == ACTION_SIF_TRANSFORM) { me->CastSpell(me, SPELL_SIF_TRANSFORM, true); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); events.Reset(); _allowCast = false; } @@ -875,7 +848,7 @@ public: { case EVENT_SIF_FINISH_DOMINION: Talk(SAY_SIF_HM_MISSED); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); break; case EVENT_SIF_START_TALK: Talk(SAY_SIF_AGGRO); @@ -934,7 +907,7 @@ public: { InitWaypoint(); Reset(); - Start(false, true); + Start(false); } uint32 Timer; @@ -1020,7 +993,7 @@ public: { InitWaypoint(); Reset(); - Start(false, true); + Start(false); SetDespawnAtEnd(false); } @@ -1044,7 +1017,7 @@ public: { me->SetSpeed(MOVE_RUN, 1); me->SetSpeed(MOVE_WALK, 1); - me->CastSpell(me, RAID_MODE(SPELL_BLIZZARD_10, SPELL_BLIZZARD_25), true); + me->CastSpell(me, SPELL_BLIZZARD, true); } void WaypointReached(uint32 /*point*/) override @@ -1206,7 +1179,7 @@ public: events.Repeat(1600ms); break; case EVENT_DR_ACOLYTE_R: - if (HealthBelowPct(75) && !me->HasAura(SPELL_RENEW)) + if (HealthBelowPct(75) && !me->HasAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_RENEW, me))) me->CastSpell(me, SPELL_GREATER_HEAL, false); else if (Unit* target = DoSelectLowestHpFriendly(60.0f, 10)) me->CastSpell(target, SPELL_RENEW, false); @@ -1331,7 +1304,7 @@ public: events.Repeat(1600ms); break; case EVENT_DR_ACOLYTE_R: - if (HealthBelowPct(75) && !me->HasAura(SPELL_RENEW)) + if (HealthBelowPct(75) && !me->HasAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_RENEW, me))) me->CastSpell(me, SPELL_GREATER_HEAL, false); else if (Unit* target = DoSelectLowestHpFriendly(60.0f, 10)) me->CastSpell(target, SPELL_RENEW, false); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 750df991f1..ab7e276730 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -30,10 +30,8 @@ enum XT002Spells { // BASIC - SPELL_GRAVITY_BOMB_10 = 63024, - SPELL_GRAVITY_BOMB_25 = 64234, - SPELL_SEARING_LIGHT_10 = 63018, - SPELL_SEARING_LIGHT_25 = 65121, + SPELL_GRAVITY_BOMB = 63024, + SPELL_SEARING_LIGHT = 63018, SPELL_TYMPANIC_TANTARUM = 62776, SPELL_XT002_ENRAGE = 26662, @@ -48,27 +46,18 @@ enum XT002Spells SPELL_EXPOSED_HEART = 63849, SPELL_ENERGY_ORB = 62790, SPELL_ENERGY_ORB_TRIGGER = 62826, - SPELL_HEARTBREAK_10 = 65737, - SPELL_HEARTBREAK_25 = 64193, + SPELL_HEARTBREAK = 65737, // VOID ZONE - SPELL_VOID_ZONE_SUMMON_10 = 64203, - SPELL_VOID_ZONE_SUMMON_25 = 64235, - //SPELL_VOID_ZONE_SUMMON = RAID_MODE(SPELL_VOID_ZONE_SUMMON_10, SPELL_VOID_ZONE_SUMMON_25, SPELL_VOID_ZONE_SUMMON_10, SPELL_VOID_ZONE_SUMMON_25), + SPELL_VOID_ZONE_SUMMON = 64203, SPELL_VOID_ZONE_DAMAGE = 46262, // SPARK SPELL_SPARK_SUMMON = 64210, - SPELL_SPARK_DAMAGE_10 = 64227, - SPELL_SPARK_DAMAGE_25 = 64236, + SPELL_SPARK_DAMAGE = 64227, SPELL_SPARK_MELEE = 64230, }; -#define SPELL_GRAVITY_BOMB RAID_MODE(SPELL_GRAVITY_BOMB_10, SPELL_GRAVITY_BOMB_25) -#define SPELL_SEARING_LIGHT RAID_MODE(SPELL_SEARING_LIGHT_10, SPELL_SEARING_LIGHT_25) -#define SPELL_HEARTBREAK RAID_MODE(SPELL_HEARTBREAK_10, SPELL_HEARTBREAK_25) -#define SPELL_SPARK_DAMAGE RAID_MODE(SPELL_SPARK_DAMAGE_10, SPELL_SPARK_DAMAGE_25) - enum XT002Events { EVENT_HEALTH_CHECK = 1, @@ -611,7 +600,7 @@ public: if (!urand(0, 2)) pXT002->AI()->Talk(EMOTE_SCRAPBOT); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } } @@ -657,7 +646,7 @@ public: if (Unit* target = SelectTargetFromPlayerList(200)) AttackStart(target); else - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); } void UpdateAI(uint32 diff) override @@ -769,12 +758,12 @@ public: // so that can't be the issue // See BoomEvent class // Schedule 1s delayed - me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1 * IN_MILLISECONDS)); + me->m_Events.AddEventAtOffset(new BoomEvent(me), 1s); } void JustDied(Unit* /*killer*/) override { - me->m_Events.AddEvent(new BoomEvent(me), me->m_Events.CalculateTime(1 * IN_MILLISECONDS)); + me->m_Events.AddEventAtOffset(new BoomEvent(me), 1s); } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp index e2c684870c..b7dd602db3 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp @@ -24,6 +24,7 @@ #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" #include "SpellAuras.h" +#include "SpellMgr.h" #include "SpellScript.h" #include "SpellScriptLoader.h" #include "ulduar.h" @@ -102,8 +103,7 @@ enum YoggSpells // CONSTRICTOR TENTACLE SPELL_LUNGE = 64123, - SPELL_SQUEEZE_10 = 64125, - SPELL_SQUEEZE_25 = 64126, + SPELL_SQUEEZE = 64125, // CORRUPTOR TENTACLE SPELL_APATHY = 64156, @@ -142,15 +142,10 @@ enum YoggSpells SPELL_SIMPLE_TELEPORT = 64195, SPELL_EMPOWERED = 65294, SPELL_EMPOWERED_PASSIVE = 64161, - SPELL_DRAIN_LIFE_10 = 64159, - SPELL_DRAIN_LIFE_25 = 64160, + SPELL_DRAIN_LIFE = 64159, SPELL_RECENTLY_SPAWNED = 64497, }; -#define SPELL_PSYCHOSIS RAID_MODE(SPELL_SARA_PSYCHOSIS_10, SPELL_SARA_PSYCHOSIS_25) -#define SPELL_SQUEEZE RAID_MODE(SPELL_SQUEEZE_10, SPELL_SQUEEZE_25) -#define SPELL_DRAIN_LIFE RAID_MODE(SPELL_DRAIN_LIFE_10, SPELL_DRAIN_LIFE_25) - enum YoggEvents { EVENT_SARA_P1_DOORS_CLOSE = 1, @@ -696,11 +691,11 @@ public: yoggb->AI()->Talk(EMOTE_YOGG_SARON_BRAIN_SHATTERED); } - uint32 timer = events.GetNextEventTime(EVENT_SARA_P2_OPEN_PORTALS); - uint32 portalTime = (timer > events.GetTimer() ? timer - events.GetTimer() : 0); - events.DelayEvents(param + 100); + Milliseconds timer = events.GetTimeUntilEvent(EVENT_SARA_P2_OPEN_PORTALS); + Milliseconds portalTime = (timer > 0ms ? timer : 0ms); + events.DelayEvents(Milliseconds(param + 100)); events.RescheduleEvent(EVENT_SARA_P2_OPEN_PORTALS, portalTime, 0, EVENT_PHASE_TWO); - events.ScheduleEvent(EVENT_SARA_P2_REMOVE_STUN, param, 0, EVENT_PHASE_TWO); + events.ScheduleEvent(EVENT_SARA_P2_REMOVE_STUN, Milliseconds(param), 0, EVENT_PHASE_TWO); me->CastSpell(me, SPELL_SHATTERED_ILLUSION, true); } @@ -804,7 +799,7 @@ public: events.ScheduleEvent(EVENT_SARA_P1_SPELLS, 0ms, 1, EVENT_PHASE_ONE); break; case EVENT_SARA_P1_SUMMON: - events.RepeatEvent(20000 - (std::min(_summonedGuardiansCount, (uint8)5) * 2000)); + events.Repeat(Milliseconds(20000 - (std::min(_summonedGuardiansCount, (uint8)5) * 2000))); ++_summonedGuardiansCount; InformCloud(); break; @@ -824,14 +819,14 @@ public: } me->CastCustomSpell(spell, SPELLVALUE_MAX_TARGETS, 1, nullptr, false); - events.RepeatEvent(me->GetMap()->Is25ManRaid() ? urand(0, 3000) : 4000 + urand(0, 2000)); + events.Repeat(me->GetMap()->Is25ManRaid() ? randtime(0ms, 3s) : randtime(4s, 6s)); break; } case EVENT_SARA_P2_START: { EntryCheckPredicate pred(NPC_YOGG_SARON); summons.DoAction(ACTION_YOGG_SARON_APPEAR, pred); - events.RescheduleEvent(EVENT_SARA_P2_SPAWN_START_TENTACLES, 500, 0, EVENT_PHASE_TWO); + events.RescheduleEvent(EVENT_SARA_P2_SPAWN_START_TENTACLES, 500ms, 0, EVENT_PHASE_TWO); // Spawn Brain! me->SummonCreature(NPC_BRAIN_OF_YOGG_SARON, 1981.3f, -25.43f, 265); @@ -846,7 +841,7 @@ public: { Talk(SAY_SARA_PSYCHOSIS_HIT); } - me->CastCustomSpell(SPELL_PSYCHOSIS, SPELLVALUE_MAX_TARGETS, 1, me, false); + me->CastCustomSpell(SPELL_SARA_PSYCHOSIS_10, SPELLVALUE_MAX_TARGETS, 1, me, false); events.Repeat(3500ms); break; case EVENT_SARA_P2_DEATH_RAY: @@ -856,15 +851,15 @@ public: break; case EVENT_SARA_P2_SUMMON_T1: // CRUSHER SpawnTentacle(NPC_CRUSHER_TENTACLE); - events.RepeatEvent((50000 + urand(0, 10000)) * _summonSpeed); + events.Repeat(Milliseconds(uint32((50000 + urand(0, 10000)) * _summonSpeed))); break; case EVENT_SARA_P2_SUMMON_T2: // CONSTRICTOR SpawnTentacle(NPC_CONSTRICTOR_TENTACLE); - events.RepeatEvent((15000 + urand(0, 5000)) * _summonSpeed); + events.Repeat(Milliseconds(uint32((15000 + urand(0, 5000))* _summonSpeed))); break; case EVENT_SARA_P2_SUMMON_T3: // CORRUPTOR SpawnTentacle(NPC_CORRUPTOR_TENTACLE); - events.RepeatEvent((30000 + urand(0, 10000)) * _summonSpeed); + events.Repeat(Milliseconds(uint32((30000 + urand(0, 10000))* _summonSpeed))); break; case EVENT_SARA_P2_BRAIN_LINK: me->CastCustomSpell(SPELL_BRAIN_LINK, SPELLVALUE_MAX_TARGETS, 1, me, false); @@ -901,9 +896,9 @@ public: events.ScheduleEvent(EVENT_SARA_P2_DEATH_RAY, 15s, 0, EVENT_PHASE_TWO); events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T1, 50s, 60s, 0, EVENT_PHASE_TWO); events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T2, 15s, 20s, 0, EVENT_PHASE_TWO); - events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T3, 30000 + urand(0, 10000), 0, EVENT_PHASE_TWO); - events.ScheduleEvent(EVENT_SARA_P2_BRAIN_LINK, 0, 0, EVENT_PHASE_TWO); - events.ScheduleEvent(EVENT_SARA_P2_OPEN_PORTALS, 60000, 0, EVENT_PHASE_TWO); + events.ScheduleEvent(EVENT_SARA_P2_SUMMON_T3, 30s + randtime(0ms, 10s), 0, EVENT_PHASE_TWO); + events.ScheduleEvent(EVENT_SARA_P2_BRAIN_LINK, 0ms, 0, EVENT_PHASE_TWO); + events.ScheduleEvent(EVENT_SARA_P2_OPEN_PORTALS, 60s, 0, EVENT_PHASE_TWO); break; case EVENT_SARA_P1_BERSERK: if (me->GetInstanceScript()) @@ -937,7 +932,7 @@ public: { InitWaypoint(); Reset(); - Start(false, true, ObjectGuid::Empty, nullptr, false, true); + Start(false, ObjectGuid::Empty, nullptr, false, true); } uint32 _checkTimer; @@ -1167,20 +1162,20 @@ public: me->RemoveAura(SPELL_SHADOW_BARRIER); - events.ScheduleEvent(EVENT_YS_LUNATIC_GAZE, 7000); - events.ScheduleEvent(EVENT_YS_SHADOW_BEACON, 20000); - events.ScheduleEvent(EVENT_YS_SUMMON_GUARDIAN, 0); + events.ScheduleEvent(EVENT_YS_LUNATIC_GAZE, 7s); + events.ScheduleEvent(EVENT_YS_SHADOW_BEACON, 20s); + events.ScheduleEvent(EVENT_YS_SUMMON_GUARDIAN, 0ms); _thirdPhase = true; Talk(SAY_YOGG_SARON_PHASE_3); } else if (param == ACTION_YOGG_SARON_HARD_MODE) { - events.ScheduleEvent(EVENT_YS_DEAFENING_ROAR, 50000); + events.ScheduleEvent(EVENT_YS_DEAFENING_ROAR, 50s); } else if (param == ACTION_YOGG_SARON_SHADOW_BEACON) { - events.RescheduleEvent(EVENT_YS_SHADOW_BEACON, 40000); + events.RescheduleEvent(EVENT_YS_SHADOW_BEACON, 40s); } else if (param == ACTION_REMOVE_STUN) { @@ -1677,7 +1672,7 @@ public: { if (me->GetDistance(itr->GetSource()) > 10 || !itr->GetSource()->IsAlive() || itr->GetSource()->IsGameMaster()) continue; - if (itr->GetSource()->HasAura(SPELL_SQUEEZE) || itr->GetSource()->HasAura(SPELL_INSANE1)) + if (itr->GetSource()->HasAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_SQUEEZE, me)) || itr->GetSource()->HasAura(SPELL_INSANE1)) continue; if (count <= num || !target) @@ -1719,7 +1714,7 @@ public: void JustDied(Unit*) override { if (Unit* player = ObjectAccessor::GetUnit(*me, _playerGUID)) - player->RemoveAura(SPELL_SQUEEZE); + player->RemoveAura(sSpellMgr->GetSpellIdForDifficulty(SPELL_SQUEEZE, me)); } }; }; @@ -1807,7 +1802,7 @@ public: } me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_NONE); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } private: diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp index be980bd557..ff9e906924 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp @@ -79,7 +79,11 @@ enum UldSpells SPELL_SIMPLE_TELEPORT = 12980, SPELL_KEEPER_TELEPORT = 62940, SPELL_SNOW_MOUND_PARTICLES = 64615, - SPELL_ENERGY_SAP_10 = 64740 + SPELL_ENERGY_SAP_10 = 64740, + + // Arachnopod Destroyer + SPELL_FLAME_SPRAY = 64717, + SPELL_MACHINE_GUN = 64776, }; class npc_ulduar_keeper : public CreatureScript @@ -473,11 +477,11 @@ public: case 0: break; case 1: - me->CastSpell(me->GetVictim(), RAID_MODE(64717, 65241), false); + me->CastSpell(me->GetVictim(), SPELL_FLAME_SPRAY, false); events.Repeat(15s, 25s); break; case 2: - me->CastSpell(me->GetVictim(), RAID_MODE(64776, 65240), false); + me->CastSpell(me->GetVictim(), SPELL_MACHINE_GUN, false); events.Repeat(10s, 15s); break; case 3: diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 868f8000f0..50fd08dd3d 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -56,28 +56,17 @@ enum eSpells SPELL_RESURRECTION_HEAL = 42704, SPELL_INGVAR_TRANSFORM = 42796, - SPELL_STAGGERING_ROAR_N = 42708, - SPELL_STAGGERING_ROAR_H = 59708, + SPELL_STAGGERING_ROAR = 42708, SPELL_CLEAVE = 42724, - SPELL_SMASH_N = 42669, - SPELL_SMASH_H = 59706, - SPELL_ENRAGE_N = 42705, - SPELL_ENRAGE_H = 59707, - - SPELL_DREADFUL_ROAR_N = 42729, - SPELL_DREADFUL_ROAR_H = 59734, - SPELL_WOE_STRIKE_N = 42730, - SPELL_WOE_STRIKE_H = 59735, + SPELL_SMASH = 42669, + SPELL_ENRAGE = 42705, + + SPELL_DREADFUL_ROAR = 42729, + SPELL_WOE_STRIKE = 42730, SPELL_DARK_SMASH = 42723, SPELL_SHADOW_AXE = 42749, }; -#define SPELL_STAGGERING_ROAR DUNGEON_MODE(SPELL_STAGGERING_ROAR_N, SPELL_STAGGERING_ROAR_H) -#define SPELL_DREADFUL_ROAR DUNGEON_MODE(SPELL_DREADFUL_ROAR_N, SPELL_DREADFUL_ROAR_H) -#define SPELL_WOE_STRIKE DUNGEON_MODE(SPELL_WOE_STRIKE_N, SPELL_WOE_STRIKE_H) -#define SPELL_SMASH DUNGEON_MODE(SPELL_SMASH_N, SPELL_SMASH_H) -#define SPELL_ENRAGE DUNGEON_MODE(SPELL_ENRAGE_N, SPELL_ENRAGE_H) - enum eEvents { EVENT_START_RESURRECTION = 1, @@ -307,9 +296,6 @@ struct boss_ingvar_the_plunderer : public ScriptedAI case EVENT_SPELL_ROAR: Talk(EMOTE_ROAR); - me->_AddCreatureSpellCooldown(SPELL_STAGGERING_ROAR, 0, 0); - me->_AddCreatureSpellCooldown(SPELL_DREADFUL_ROAR, 0, 0); - if (me->GetDisplayId() == DISPLAYID_DEFAULT) me->CastSpell((Unit*)nullptr, SPELL_STAGGERING_ROAR, false); else diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index a3d0626fa1..b5910adc49 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -45,12 +45,9 @@ enum eSpells SPELL_FROST_TOMB_SUMMON = 42714, SPELL_FROST_TOMB_AURA = 48400, - SPELL_SHADOWBOLT_N = 43667, - SPELL_SHADOWBOLT_H = 59389, + SPELL_SHADOWBOLT = 43667, }; -#define SPELL_SHADOWBOLT DUNGEON_MODE(SPELL_SHADOWBOLT_N, SPELL_SHADOWBOLT_H) - struct npc_frost_tomb : public NullCreatureAI { npc_frost_tomb(Creature* c) : NullCreatureAI(c) @@ -80,7 +77,7 @@ struct npc_frost_tomb : public NullCreatureAI if (PrisonerGUID) if (Unit* p = ObjectAccessor::GetUnit(*me, PrisonerGUID)) p->RemoveAurasDueToSpell(SPELL_FROST_TOMB_AURA); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); } void UpdateAI(uint32 /*diff*/) override 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 6e3ea7f52f..4e8ca024d6 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp @@ -44,8 +44,7 @@ enum eSpells SPELL_ENRAGE = 48193, SPELL_SUMMON_SKARVALD_GHOST = 48613, // Dalronn - SPELL_SHADOW_BOLT_N = 43649, - SPELL_SHADOW_BOLT_H = 59575, + SPELL_SHADOW_BOLT = 43649, SPELL_DEBILITATE = 43650, SPELL_SUMMON_SKELETONS = 52611, SPELL_SUMMON_DALRONN_GHOST = 48612 @@ -353,7 +352,7 @@ struct boss_dalronn_the_controller : public ScriptedAI case EVENT_SHADOW_BOLT: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) { - me->CastSpell(target, DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false); + me->CastSpell(target, SPELL_SHADOW_BOLT, false); } events.Repeat(2s); break; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 62263725b5..48094eb270 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -95,7 +95,7 @@ enum EnslavedProtoDrake SPELL_FLAME_BREATH = 50653, SPELL_KNOCK_AWAY = 49722, - POINT_LAST = 5, + POINT_LAST = 6, }; const Position protodrakeCheckPos = {206.24f, -190.28f, 200.11f, 0.f}; @@ -111,8 +111,8 @@ struct npc_enslaved_proto_drake : public ScriptedAI { _events.Reset(); _events.ScheduleEvent(EVENT_REND, 2s, 3s); - _events.ScheduleEvent(EVENT_FLAME_BREATH, 5500ms, 7000ms); - _events.ScheduleEvent(EVENT_KNOCKAWAY, 3500ms, 6000ms); + _events.ScheduleEvent(EVENT_FLAME_BREATH, 5500ms, 7s); + _events.ScheduleEvent(EVENT_KNOCKAWAY, 3500ms, 6s); } void MovementInform(uint32 type, uint32 id) override @@ -139,7 +139,7 @@ struct npc_enslaved_proto_drake : public ScriptedAI _setData = true; me->SetCanFly(true); me->SetDisableGravity(true); - me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false); + me->GetMotionMaster()->MoveWaypoint(PATH_PROTODRAKE, false); } } @@ -167,7 +167,7 @@ struct npc_enslaved_proto_drake : public ScriptedAI break; case EVENT_KNOCKAWAY: DoCast(SPELL_KNOCK_AWAY); - _events.ScheduleEvent(EVENT_KNOCKAWAY, 7000ms, 8500ms); + _events.ScheduleEvent(EVENT_KNOCKAWAY, 7s, 8500ms); break; default: break; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp index 3229d8c96c..22e20f29a8 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp @@ -34,36 +34,28 @@ enum Misc // PALEHOOF SPELL_ARCING_SMASH = 48260, - SPELL_IMPALE_N = 48261, - SPELL_IMPALE_H = 59268, - SPELL_WITHERING_ROAR_N = 48256, - SPELL_WITHERING_ROAR_H = 59267, + SPELL_IMPALE = 48261, + SPELL_WITHERING_ROAR = 48256, SPELL_FREEZE = 16245, // Massive Jormungar SPELL_ACID_SPIT = 48132, - SPELL_ACID_SPLATTER_N = 48136, - SPELL_ACID_SPLATTER_H = 59272, - SPELL_POISON_BREATH_N = 48133, - SPELL_POISON_BREATH_H = 59271, + SPELL_ACID_SPLATTER = 48136, + SPELL_POISON_BREATH = 48133, NPC_JORMUNGAR_WORM = 27228, // Ferocious Rhino - SPELL_GORE_N = 48130, - SPELL_GORE_H = 59264, - SPELL_GRIEVOUS_WOUND_N = 48105, - SPELL_GRIEVOUS_WOUND_H = 59263, + SPELL_GORE = 48130, + SPELL_GRIEVOUS_WOUND = 48105, SPELL_STOMP = 48131, // Ravenous Furbolg - SPELL_CHAIN_LIGHTING_N = 48140, - SPELL_CHAIN_LIGHTING_H = 59273, + SPELL_CHAIN_LIGHTNING = 48140, SPELL_CRAZED = 48139, SPELL_TERRIFYING_ROAR = 48144, // Frenzied Worgen - SPELL_MORTAL_WOUND_N = 48137, - SPELL_MORTAL_WOUND_H = 59265, + SPELL_MORTAL_WOUND = 48137, SPELL_ENRAGE_1 = 48138, SPELL_ENRAGE_2 = 48142, @@ -296,14 +288,14 @@ public: } case EVENT_PALEHOOF_WITHERING_ROAR: { - me->CastSpell(me, IsHeroic() ? SPELL_WITHERING_ROAR_H : SPELL_WITHERING_ROAR_N, false); + me->CastSpell(me, SPELL_WITHERING_ROAR, false); events.Repeat(8s, 12s); break; } case EVENT_PALEHOOF_IMPALE: { if (Unit* tgt = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_IMPALE_H : SPELL_IMPALE_N, false); + me->CastSpell(tgt, SPELL_IMPALE, false); events.Repeat(8s, 12s); break; @@ -424,7 +416,7 @@ public: } case EVENT_JORMUNGAR_ACID_SPLATTER: { - me->CastSpell(me, IsHeroic() ? SPELL_ACID_SPLATTER_H : SPELL_ACID_SPLATTER_N, false); + me->CastSpell(me, SPELL_ACID_SPLATTER, false); // Aura summon wont work because of duration float x, y, z; @@ -443,7 +435,7 @@ public: case EVENT_JORMUNGAR_POISON_BREATH: { if (Unit* tgt = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_POISON_BREATH_H : SPELL_POISON_BREATH_N, false); + me->CastSpell(tgt, SPELL_POISON_BREATH, false); events.Repeat(8s, 12s); break; @@ -546,14 +538,14 @@ public: } case EVENT_RHINO_GORE: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_GORE_H : SPELL_GORE_N, false); + me->CastSpell(me->GetVictim(), SPELL_GORE, false); events.Repeat(13s, 17s); break; } case EVENT_RHINO_WOUND: { if (Unit* tgt = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_GRIEVOUS_WOUND_H : SPELL_GRIEVOUS_WOUND_N, false); + me->CastSpell(tgt, SPELL_GRIEVOUS_WOUND, false); events.Repeat(18s, 22s); break; @@ -650,7 +642,7 @@ public: { case EVENT_FURBOLG_CHAIN: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CHAIN_LIGHTING_H : SPELL_CHAIN_LIGHTING_N, false); + me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false); events.Repeat(4s, 7s); break; } @@ -758,7 +750,7 @@ public: { case EVENT_WORGEN_MORTAL: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_MORTAL_WOUND_H : SPELL_MORTAL_WOUND_N, false); + me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); events.Repeat(4s, 7s); break; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index cf6318747d..1c4c577a3a 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -38,16 +38,12 @@ enum Misc EMOTE_RANGE = 1, // SPELLS - SPELL_CRUSH_N = 50234, - SPELL_CRUSH_H = 59330, - SPELL_POISONED_SPEAR_N = 50255, - SPELL_POISONED_SPEAR_H = 59331, - SPELL_WHIRLWIND_N = 50228, - SPELL_WHIRLWIND_H = 50228, + SPELL_CRUSH = 50234, + SPELL_POISONED_SPEAR = 50255, + SPELL_WHIRLWIND = 50228, SPELL_FREEZING_CLOUD_VISUAL = 47592, - SPELL_FREEZING_CLOUD_N = 47579, - SPELL_FREEZING_CLOUD_H = 60020, + SPELL_FREEZING_CLOUD = 47579, SPELL_LAUNCH_HARPOON = 48642, @@ -181,6 +177,7 @@ public: else if (param == ACTION_PHASE2) { SecondPhase = true; + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); events.ScheduleEvent(EVENT_SKADI_CRUSH, 8s); events.ScheduleEvent(EVENT_SKADI_SPEAR, 10s); events.ScheduleEvent(EVENT_SKADI_WHIRLWIND, 15s); @@ -218,21 +215,21 @@ public: } case EVENT_SKADI_CRUSH: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CRUSH_H : SPELL_CRUSH_N, false); + me->CastSpell(me->GetVictim(), SPELL_CRUSH, false); events.Repeat(8s); break; } case EVENT_SKADI_SPEAR: { if (Unit* tgt = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(tgt, IsHeroic() ? SPELL_POISONED_SPEAR_H : SPELL_POISONED_SPEAR_N, false); + me->CastSpell(tgt, SPELL_POISONED_SPEAR, false); events.Repeat(10s); break; } case EVENT_SKADI_WHIRLWIND: { - me->CastSpell(me, IsHeroic() ? SPELL_WHIRLWIND_H : SPELL_WHIRLWIND_N, false); + me->CastSpell(me, SPELL_WHIRLWIND, false); events.Repeat(15s, 20s); events.DelayEvents(10s); break; @@ -322,7 +319,7 @@ public: void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override { if (spellInfo->Id == 47593) // SPELL_FREEZING_CLOUD_VISUAL trigger - target->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_FREEZING_CLOUD_H : SPELL_FREEZING_CLOUD_N, true); + target->CastSpell(target, SPELL_FREEZING_CLOUD, true); } void SpawnFlameTriggers(uint8 point) @@ -339,13 +336,13 @@ public: { Creature* cr; if ((cr = me->SummonCreature(NPC_BREATH_TRIGGER, 483, -484.9f, 105, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))) - cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FREEZING_CLOUD_H : SPELL_FREEZING_CLOUD_N, true); + cr->CastSpell(cr, SPELL_FREEZING_CLOUD, true); if ((cr = me->SummonCreature(NPC_BREATH_TRIGGER, 471.0f, -484.7f, 105, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))) - cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FREEZING_CLOUD_H : SPELL_FREEZING_CLOUD_N, true); + cr->CastSpell(cr, SPELL_FREEZING_CLOUD, true); for (uint8 j = 0; j < 7; j++) if ((cr = me->SummonCreature(NPC_BREATH_TRIGGER, 477.0f, -507.0f + (j * 3), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))) - cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FREEZING_CLOUD_H : SPELL_FREEZING_CLOUD_N, true); + cr->CastSpell(cr, SPELL_FREEZING_CLOUD, true); } } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 92fc069d45..485030dba2 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -47,8 +47,7 @@ enum Misc SPELL_BALL_OF_FLAME = 48246, SPELL_RITUAL_OF_THE_SWORD = 48276, SPELL_RITUAL_STRIKE = 48331, - SPELL_SINSTER_STRIKE_N = 15667, - SPELL_SINSTER_STRIKE_H = 59409, + SPELL_SINISTER_STRIKE = 15667, EQUIP_SWORD = 40343, // CHANNELERS @@ -157,7 +156,7 @@ public: me->SetImmuneToAll(true); Started = true; me->setActive(true); - events2.ScheduleEvent(EVENT_SVALA_START, 5000); + events2.ScheduleEvent(EVENT_SVALA_START, 5s); if (Creature* pArthas = me->SummonCreature(NPC_ARTHAS, 295.81f, -366.16f, 92.57f, 1.58f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 59000)) ArthasGUID = pArthas->GetGUID(); @@ -303,7 +302,7 @@ public: switch (events.ExecuteEvent()) { case EVENT_SORROWGRAVE_SS: - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SINSTER_STRIKE_H : SPELL_SINSTER_STRIKE_N, false); + me->CastSpell(me->GetVictim(), SPELL_SINISTER_STRIKE, false); events.ScheduleEvent(EVENT_SORROWGRAVE_SS, 3s, 5s); break; case EVENT_SORROWGRAVE_FLAMES: @@ -339,7 +338,7 @@ public: me->SetControlled(true, UNIT_STATE_ROOT); } - events.DelayEvents(25001); // +1 just to be sure + events.DelayEvents(25001ms); // +1 just to be sure events.ScheduleEvent(EVENT_SORROWGRAVE_RITUAL_SPELLS, 0ms); events.ScheduleEvent(EVENT_SORROWGRAVE_FINISH_RITUAL, 25s); return; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp index 0a1487f159..6c445644f5 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp @@ -32,16 +32,12 @@ enum Misc SAY_SUMMON_TORGYN = 6, // SPELLS - SPELL_BANE_N = 48294, - SPELL_BANE_H = 59301, + SPELL_BANE = 48294, SPELL_DARK_SLASH = 48292, - SPELL_FETID_ROT_N = 48291, - SPELL_FETID_ROT_H = 59300, + SPELL_FETID_ROT = 48291, SPELL_SCREAMS_OF_THE_DEAD = 51750, - SPELL_SPIRIT_BURST_N = 48529, // when Ranulf - SPELL_SPIRIT_BURST_H = 59305, // when Ranulf - SPELL_SPIRIT_STRIKE_N = 48423, // when Haldor - SPELL_SPIRIT_STRIKE_H = 59304, // when Haldor + SPELL_SPIRIT_BURST = 48529, // when Ranulf + SPELL_SPIRIT_STRIKE = 48423, // when Haldor SPELL_SUMMON_AVENGING_SPIRIT = 48592, SPELL_SUMMON_SPIRIT_FOUNT = 48386, @@ -49,8 +45,7 @@ enum Misc SPELL_CHANNEL_SPIRIT_TO_YMIRON = 48316, SPELL_CHANNEL_YMIRON_TO_SPIRIT = 48307, - SPELL_SPIRIT_FOUNT_N = 48380, - SPELL_SPIRIT_FOUNT_H = 59320, + SPELL_SPIRIT_FOUNT = 48380, SPELL_FLAMES = 39199, @@ -217,7 +212,7 @@ public: { if (me->GetHealth() < std::max(0.0f, float(me->GetMaxHealth() * (1.0f - (IsHeroic() ? 0.2f : 0.334f)*float(BoatNum + 1))))) { - events.DelayEvents(12000); + events.DelayEvents(12s); me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->InterruptNonMeleeSpells(true); me->CastSpell(me, SPELL_SCREAMS_OF_THE_DEAD, true); @@ -242,13 +237,13 @@ public: } case EVENT_YMIRON_BANE: { - me->CastSpell(me, IsHeroic() ? SPELL_BANE_H : SPELL_BANE_N, false); + me->CastSpell(me, SPELL_BANE, false); events.Repeat(20s, 25s); break; } case EVENT_YMIRON_FETID_ROT: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_FETID_ROT_H : SPELL_FETID_ROT_N, false); + me->CastSpell(me->GetVictim(), SPELL_FETID_ROT, false); events.Repeat(10s, 13s); break; } @@ -297,7 +292,7 @@ public: { summons.Summon(sf); sf->SetSpeed(MOVE_RUN, 0.4f); - sf->AddAura(IsHeroic() ? SPELL_SPIRIT_FOUNT_H : SPELL_SPIRIT_FOUNT_N, sf); + sf->AddAura(SPELL_SPIRIT_FOUNT, sf); sf->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); sf->GetMotionMaster()->MoveFollow(me->GetVictim(), 0, rand_norm()*M_PI * 2, MOTION_SLOT_ACTIVE, false, false); } @@ -305,13 +300,13 @@ public: } case EVENT_YMIRON_HALDOR_ABILITY: { - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SPIRIT_STRIKE_H : SPELL_SPIRIT_STRIKE_N, false); + me->CastSpell(me->GetVictim(), SPELL_SPIRIT_STRIKE, false); events.Repeat(5s); break; } case EVENT_YMIRON_RANULF_ABILITY: { - me->CastSpell(me, IsHeroic() ? SPELL_SPIRIT_BURST_H : SPELL_SPIRIT_BURST_N, false); + me->CastSpell(me, SPELL_SPIRIT_BURST, false); events.Repeat(10s); break; } diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp index 8e3d5372ed..333cb1f94f 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp @@ -27,14 +27,10 @@ enum Archavon SPELL_ROCK_SHARDS = 58678, SPELL_ROCK_SHARDS_LEFT_HAND_VISUAL = 58689, SPELL_ROCK_SHARDS_RIGHT_HAND_VISUAL = 58692, - SPELL_ROCK_SHARDS_DAMAGE_10 = 58695, - SPELL_ROCK_SHARDS_DAMAGE_25 = 60883, - SPELL_CRUSHING_LEAP_10 = 58960, - SPELL_CRUSHING_LEAP_25 = 60894, // Instant (10-80yr range) -- Leaps at an enemy, inflicting 8000 Physical damage, knocking all nearby enemies away, and creating a cloud of choking debris. - SPELL_STOMP_10 = 58663, - SPELL_STOMP_25 = 60880, - SPELL_IMPALE_10 = 58666, - SPELL_IMPALE_25 = 60882, // Lifts an enemy off the ground with a spiked fist, inflicting 47125 to 52875 Physical damage and 9425 to 10575 additional damage each second for 8 sec. + SPELL_ROCK_SHARDS_DAMAGE = 58695, + SPELL_CRUSHING_LEAP = 58960, + SPELL_STOMP = 58663, + SPELL_IMPALE = 58666, SPELL_BERSERK = 47008 }; @@ -145,7 +141,7 @@ class boss_archavon : public CreatureScript case EVENT_CHOKING_CLOUD: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, false, false)) { - DoCast(target, RAID_MODE(SPELL_CRUSHING_LEAP_10, SPELL_CRUSHING_LEAP_25), true); //10y ~ 80y, ignore range + DoCast(target, SPELL_CRUSHING_LEAP, true); //10y ~ 80y, ignore range } events.Repeat(30s); @@ -156,14 +152,14 @@ class boss_archavon : public CreatureScript snprintf(buffer, sizeof(buffer), "Archavon the Stone Watcher lunges for %s!", me->GetVictim()->GetName().c_str()); me->TextEmote(buffer); - DoCastVictim(RAID_MODE(SPELL_STOMP_10, SPELL_STOMP_25)); + DoCastVictim(SPELL_STOMP); events.Repeat(45s); events.ScheduleEvent(EVENT_IMPALE, 3s); break; } case EVENT_IMPALE: - DoCastVictim(RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25)); + DoCastVictim(SPELL_IMPALE); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK, true); @@ -205,17 +201,10 @@ class spell_archavon_rock_shards : public SpellScript return; } - Map* map = caster->GetMap(); - if (!map) - { - return; - } - caster->CastSpell(target, SPELL_ROCK_SHARDS_LEFT_HAND_VISUAL, true); caster->CastSpell(target, SPELL_ROCK_SHARDS_RIGHT_HAND_VISUAL, true); - uint32 spellId = map->Is25ManRaid() ? SPELL_ROCK_SHARDS_DAMAGE_25 : SPELL_ROCK_SHARDS_DAMAGE_10; - caster->CastSpell(target, spellId, true); + caster->CastSpell(target, SPELL_ROCK_SHARDS_DAMAGE, true); } void Register() override diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index bf8da40c88..f9cb293697 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -29,10 +29,8 @@ enum Spells SPELL_OVERCHARGE = 64218, SPELL_BERSERK = 26662, - SPELL_CHAIN_LIGHTNING_10 = 64213, - SPELL_CHAIN_LIGHTNING_25 = 64215, - SPELL_LIGHTNING_NOVA_10 = 64216, - SPELL_LIGHTNING_NOVA_25 = 65279, + SPELL_CHAIN_LIGHTNING = 64213, + SPELL_LIGHTNING_NOVA = 64216, }; enum Events @@ -171,11 +169,11 @@ public: { case EVENT_CHAIN_LIGHTNING: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, RAID_MODE(SPELL_CHAIN_LIGHTNING_10, SPELL_CHAIN_LIGHTNING_25), false); + me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false); events.Repeat(25s); break; case EVENT_LIGHTNING_NOVA: - me->CastSpell(me, RAID_MODE(SPELL_LIGHTNING_NOVA_10, SPELL_LIGHTNING_NOVA_25), false); + me->CastSpell(me, SPELL_LIGHTNING_NOVA, false); events.Repeat(40s); break; case EVENT_OVERCHARGE: diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 6ac9bdbf37..326ac6e7a0 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -344,7 +344,7 @@ public: if (Creature* pIchoron = pInstance->instance->GetCreature(pInstance->GetGuidData(DATA_ICHORON_GUID))) if (pIchoron->AI()) pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_KILLED); - me->DespawnOrUnsummon(2500); + me->DespawnOrUnsummon(2500ms); } void AttackStart(Unit* /*who*/) override {} diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index 27b354bee4..7cfab3ed2e 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -121,7 +121,7 @@ public: while (entry1 == entry2); me->CastSpell((Unit*)nullptr, entry2, true); } - events.RepeatEvent(45000); + events.Repeat(45s); events.RescheduleEvent(EVENT_SPELL_ARCANE_BUFFET, 5s); events.RescheduleEvent(EVENT_CHECK_DISTANCE, 6s); } @@ -135,7 +135,7 @@ public: if (me->GetDistance(c) < 3.0f) { c->CastSpell(me, SPELL_ARCANE_POWER, false); - c->DespawnOrUnsummon(8000); + c->DespawnOrUnsummon(8s); found = true; } if (found) diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index f7ec86e1b8..65263e655c 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -222,7 +222,7 @@ public: if (Creature* c = pInstance->instance->GetCreature(SummonedGUID)) c->DespawnOrUnsummon(); } - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); } void SummonedCreatureDespawn(Creature* pSummoned) override diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 8406b3527c..4fa7bb52ce 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -92,7 +92,7 @@ public: uiFirstBoss = 0; uiSecondBoss = 0; events.Reset(); - events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0); + events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0ms); GateHealth = 100; WaveCount = 0; PortalLocation = 0; @@ -666,7 +666,7 @@ public: EncounterStatus = NOT_STARTED; CLEANED = false; events.Reset(); - events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0); + events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0ms); data >> m_auiEncounter[0]; data >> m_auiEncounter[1]; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 1332cf6723..97fa245be4 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -205,7 +205,7 @@ public: break; case EVENT_SUMMON_SABOTEOUR: DoSummon(NPC_SABOTEOUR, me, 2.0f, 0, TEMPSUMMON_CORPSE_DESPAWN); - me->DespawnOrUnsummon(3000); + me->DespawnOrUnsummon(3s); break; } @@ -372,7 +372,7 @@ struct violet_hold_trashAI : public npc_escortAI break; } SetDespawnAtEnd(false); - Start(true, true); + Start(true); } npc_escortAI::UpdateAI(diff); @@ -422,73 +422,55 @@ struct violet_hold_trashAI : public npc_escortAI enum AzureInvaderSpells { - SPELL_CLEAVE = 15496, - SPELL_IMPALE_N = 58459, - SPELL_IMPALE_H = 59256, + SPELL_CLEAVE = 15496, + SPELL_IMPALE = 58459, SPELL_BRUTAL_STRIKE = 58460, - SPELL_SUNDER_ARMOR = 58461, + SPELL_SUNDER_ARMOR = 58461, }; -#define SPELL_IMPALE DUNGEON_MODE(SPELL_IMPALE_N, SPELL_IMPALE_H) enum AzureSpellbreakerSpells { - SPELL_ARCANE_BLAST_N = 58462, - SPELL_ARCANE_BLAST_H = 59257, - SPELL_SLOW = 25603, + SPELL_ARCANE_BLAST = 58462, + SPELL_SLOW = 25603, SPELL_CHAINS_OF_ICE = 58464, - SPELL_CONE_OF_COLD_N = 58463, - SPELL_CONE_OF_COLD_H = 59258 + SPELL_CONE_OF_COLD = 58463, }; -#define SPELL_ARCANE_BLAST DUNGEON_MODE(SPELL_ARCANE_BLAST_N, SPELL_ARCANE_BLAST_H) -#define SPELL_CONE_OF_COLD DUNGEON_MODE(SPELL_CONE_OF_COLD_N, SPELL_CONE_OF_COLD_H) enum AzureBinderSpells { - SPELL_ARCANE_BARRAGE_N = 58456, - SPELL_ARCANE_BARRAGE_H = 59248, - SPELL_ARCANE_EXPLOSION_N = 58455, - SPELL_ARCANE_EXPLOSION_H = 59245, - SPELL_FROST_NOVA_N = 58458, - SPELL_FROST_NOVA_H = 59253, - SPELL_FROSTBOLT_N = 58457, - SPELL_FROSTBOLT_H = 59251, + SPELL_ARCANE_BARRAGE = 58456, + SPELL_ARCANE_EXPLOSION = 58455, + SPELL_FROST_NOVA = 58458, + SPELL_FROSTBOLT = 58457, }; -#define SPELL_ARCANE_BARRAGE DUNGEON_MODE(SPELL_ARCANE_BARRAGE_N, SPELL_ARCANE_BARRAGE_H) -#define SPELL_ARCANE_EXPLOSION DUNGEON_MODE(SPELL_ARCANE_EXPLOSION_N, SPELL_ARCANE_EXPLOSION_H) -#define SPELL_FROST_NOVA DUNGEON_MODE(SPELL_FROST_NOVA_N, SPELL_FROST_NOVA_H) -#define SPELL_FROSTBOLT DUNGEON_MODE(SPELL_FROSTBOLT_N, SPELL_FROSTBOLT_H) enum AzureMageSlayerSpells { SPELL_ARCANE_EMPOWERMENT = 58469, - SPELL_SPELL_LOCK = 30849 + SPELL_SPELL_LOCK = 30849 }; enum AzureCaptainSpells { - SPELL_MORTAL_STRIKE = 32736, + SPELL_MORTAL_STRIKE = 32736, SPELL_WHIRLWIND_OF_STEEL = 41056 }; enum AzureSorcerorSpells { - SPELL_ARCANE_STREAM_N = 60181, - SPELL_ARCANE_STREAM_H = 60204, - SPELL_MANA_DETONATION_N = 60182, - SPELL_MANA_DETONATION_H = 60205 + SPELL_ARCANE_STREAM = 60181, + SPELL_MANA_DETONATION = 60182, }; -#define SPELL_ARCANE_STREAM DUNGEON_MODE(SPELL_ARCANE_STREAM_N, SPELL_ARCANE_STREAM_H) -#define SPELL_MANA_DETONATION DUNGEON_MODE(SPELL_MANA_DETONATION_N, SPELL_MANA_DETONATION_H) enum AzureRaiderSpells { - SPELL_CONCUSSION_BLOW = 52719, + SPELL_CONCUSSION_BLOW = 52719, SPELL_MAGIC_REFLECTION = 60158 }; enum AzureStalkerSpells { - SPELL_BACKSTAB = 58471, + SPELL_BACKSTAB = 58471, SPELL_TACTICAL_BLINK = 58470 }; @@ -1111,7 +1093,7 @@ public: break; } SetDespawnAtEnd(false); - Start(true, true); + Start(true); } if (bOpening) @@ -1136,7 +1118,7 @@ public: me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(11686); me->CastSpell(me, SPELL_TELEPORT_VISUAL, true); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } ++count; } @@ -1198,11 +1180,11 @@ struct npc_violet_hold_defense_system : public ScriptedAI { case EVENT_ARCANE_LIGHTNING: DoCastAOE(RAND(SPELL_ARCANE_LIGHTNING, SPELL_ARCANE_LIGHTNING_VISUAL)); - events.RepeatEvent(2000); + events.Repeat(2s); break; case EVENT_ARCANE_LIGHTNING_INSTAKILL: DoCastAOE(SPELL_ARCANE_LIGHTNING_INSTAKILL); - events.RepeatEvent(1000); + events.Repeat(1s); break; } } diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 8f352e8936..3ee7f22721 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -63,7 +63,7 @@ class spell_q11919_q11940_drake_hunt_aura : public AuraScript GetCaster()->CastSpell(GetCaster(), SPELL_DRAKE_HATCHLING_SUBDUED, true); owner->SetFaction(FACTION_FRIENDLY); owner->SetImmuneToAll(true); - owner->DespawnOrUnsummon(3 * MINUTE * IN_MILLISECONDS); + owner->DespawnOrUnsummon(180s); } void Register() override @@ -464,7 +464,10 @@ public: go->UseDoorOrButton(); if (npc_escortAI* pEscortAI = CAST_AI(npc_lurgglbr::npc_lurgglbrAI, creature->AI())) - pEscortAI->Start(true, false, player->GetGUID()); + { + creature->SetWalk(true); + pEscortAI->Start(true, player->GetGUID()); + } creature->SetFaction(player->GetTeamId() == TEAM_ALLIANCE ? FACTION_ESCORTEE_A_PASSIVE : FACTION_ESCORTEE_H_PASSIVE); return true; @@ -609,7 +612,7 @@ struct npc_beryl_sorcererAI : public CreatureAI AttackStart(who); } - _events.ScheduleEvent(EVENT_FROSTBOLT, 3000, 4000); + _events.ScheduleEvent(EVENT_FROSTBOLT, 3s, 4s); } void SpellHit(Unit* unit, SpellInfo const* spell) override @@ -914,7 +917,8 @@ public: creature->SetFaction(player->GetTeamId() == TEAM_ALLIANCE ? FACTION_ESCORTEE_A_PASSIVE : FACTION_ESCORTEE_H_PASSIVE); creature->SetStandState(UNIT_STAND_STATE_STAND); creature->AI()->Talk(SAY_1, player); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + creature->SetWalk(true); + CAST_AI(npc_escortAI, (creature->AI()))->Start(true, player->GetGUID()); } return true; } @@ -959,7 +963,7 @@ public: Talk(SAY_5); me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); player->GroupEventHappens(QUEST_ESCAPING_THE_MIST, me); - SetRun(true); + me->SetWalk(false); break; } } @@ -995,7 +999,7 @@ public: { creature->SetStandState(UNIT_STAND_STATE_STAND); creature->AI()->Talk(SAY_BONKER_2, player); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID()); + CAST_AI(npc_escortAI, (creature->AI()))->Start(true, player->GetGUID()); } return true; } @@ -1421,7 +1425,7 @@ public: _playerGUID.Clear(); } - void SetGUID(ObjectGuid guid, int32 /*action*/) override + void SetGUID(ObjectGuid const& guid, int32 /*action*/) override { if (_playerGUID) return; @@ -1431,7 +1435,7 @@ public: if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) me->SetFacingToObject(player); - _events.ScheduleEvent(EVENT_TALK, 1000); + _events.ScheduleEvent(EVENT_TALK, 1s); } void UpdateAI(uint32 diff) override @@ -1557,7 +1561,7 @@ public: void Reset() override { me->SetImmuneToAll(true); - _events.ScheduleEvent(EVENT_THASSARIAN_CAST, 1000); + _events.ScheduleEvent(EVENT_THASSARIAN_CAST, 1s); } void UpdateAI(uint32 diff) override @@ -1648,7 +1652,7 @@ public: void MovementInform(uint32 type, uint32 param) override { - if (type == WAYPOINT_MOTION_TYPE && param == 2) + if (type == WAYPOINT_MOTION_TYPE && param == 3) { me->SetWalk(false); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H); @@ -1684,7 +1688,7 @@ public: // Arthas load path if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) { - arthas->GetMotionMaster()->MovePath(PATH_ARTHAS, false); + arthas->GetMotionMaster()->MoveWaypoint(PATH_ARTHAS, false); } _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_3, 1s); break; @@ -1692,7 +1696,7 @@ public: // Talbot load path if (Creature* talbot = ObjectAccessor::GetCreature(*me, _talbotGUID)) { - talbot->GetMotionMaster()->MovePath(PATH_TALBOT, false); + talbot->GetMotionMaster()->MoveWaypoint(PATH_TALBOT, false); } _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_4, 20s); break; @@ -1726,7 +1730,7 @@ public: arlos->SetWalk(true); arlos->SetImmuneToAll(true); arlos->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER); - arlos->GetMotionMaster()->MovePath(PATH_ARLOS, false); + arlos->GetMotionMaster()->MoveWaypoint(PATH_ARLOS, false); } if (Creature* leryssa = me->SummonCreature(NPC_LERYSSA, 3751.0986f, 3614.9219f, 473.4048f, 4.5029f, TEMPSUMMON_CORPSE_TIMED_DESPAWN)) { @@ -1734,7 +1738,7 @@ public: leryssa->SetWalk(true); leryssa->SetImmuneToAll(true); leryssa->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - leryssa->GetMotionMaster()->MovePath(PATH_LERYSSA, false); + leryssa->GetMotionMaster()->MoveWaypoint(PATH_LERYSSA, false); } _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_7, 7s); break; @@ -1884,7 +1888,7 @@ public: if (Creature* leryssa = ObjectAccessor::GetCreature(*me, _leryssaGUID)) { leryssa->SetWalk(false); - leryssa->MonsterMoveWithSpeed(3726.751f, 3568.1633f, 477.44086f, leryssa->GetSpeed(MOVE_RUN)); + leryssa->GetMotionMaster()->MovePoint(0, 3726.751f, 3568.1633f, 477.44086f, FORCED_MOVEMENT_RUN); } _events.ScheduleEvent(EVENT_THASSARIAN_SCRIPT_23, 2s); break; @@ -1989,7 +1993,7 @@ public: _playerGUID = player->GetGUID(); CloseGossipMenuFor(player); me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - me->GetMotionMaster()->MovePath(PATH_THASSARIAN, false); + me->GetMotionMaster()->MoveWaypoint(PATH_THASSARIAN, false); } } @@ -2020,7 +2024,7 @@ public: void MovementInform(uint32 type, uint32 param) override { - if (type == WAYPOINT_MOTION_TYPE && param == 2) + if (type == WAYPOINT_MOTION_TYPE && param == 3) { if (me->IsSummon()) { diff --git a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp index a211b22028..c1829ccbd1 100644 --- a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp +++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp @@ -41,25 +41,7 @@ struct npc_preparations_for_war_vehicle : public NullCreatureAI void InitializeAI() override { - WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry()); - if (!path || path->empty()) - { - me->DespawnOrUnsummon(1); - return; - } - - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - - uint32 wpCounter = 1; - WPPath::const_iterator itr; - while ((itr = path->find(wpCounter++)) != path->end()) - { - WayPoint* wp = itr->second; - pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z)); - } - - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + me->GetMotionMaster()->MovePath(me->GetEntry(), FORCED_MOVEMENT_NONE, PathSource::SMART_WAYPOINT_MGR); NullCreatureAI::InitializeAI(); pointId = 0; @@ -108,7 +90,7 @@ struct npc_preparations_for_war_vehicle : public NullCreatureAI if (me->GetDistance2d(x, y) < 10.0f) { - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); if (Vehicle* vehicle = me->GetVehicleKit()) if (Unit* passenger = vehicle->GetPassenger(0)) { @@ -117,7 +99,7 @@ struct npc_preparations_for_war_vehicle : public NullCreatureAI } } else - me->GetMotionMaster()->MovePoint(0, x, y, z, false, false); + me->GetMotionMaster()->MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.f, 0.f, false, false); break; } } diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index d34530709d..e561a8e07a 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -592,7 +592,7 @@ struct npc_minigob_manabonk : public ScriptedAI case EVENT_MOVE: { Position pos = me->GetRandomNearPosition((urand(15, 40))); - me->GetMotionMaster()->MovePoint(0, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), true); + me->GetMotionMaster()->MovePoint(0, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); } events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 3s); events.ScheduleEvent(EVENT_DESPAWN, 4s); diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 52aac2193b..f7b1252a61 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -491,9 +491,9 @@ public: HideNozdormu(); if (Creature* cr = GetCopy()) cr->AI()->Talk(SAY_HOURGLASS_END_2, GetPlayer()); - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); if (GetCopy()) - GetCopy()->DespawnOrUnsummon(500); + GetCopy()->DespawnOrUnsummon(500ms); break; } } @@ -614,7 +614,7 @@ public: uint32 path = me->GetEntry() * 10 + urand(0, 4); if (me->GetPositionY() > -1150.0f) path += 5; - me->GetMotionMaster()->MovePath(path, false); + me->GetMotionMaster()->MoveWaypoint(path, false); } void MovementInform(uint32 type, uint32 point) override @@ -622,11 +622,11 @@ public: if (type != WAYPOINT_MOTION_TYPE) return; - if (point == 8) // max-1 + if (point == 9) { Talk(0); me->RemoveAllAuras(); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); if (TempSummon* summon = me->ToTempSummon()) if (Unit* owner = summon->GetSummonerUnit()) if (Player* player = owner->ToPlayer()) @@ -726,7 +726,7 @@ public: } case EVENT_TAKE_OFF: { - me->DespawnOrUnsummon(4050); + me->DespawnOrUnsummon(4050ms); me->SetOrientation(2.5f); me->SetSpeedRate(MOVE_FLIGHT, 1.0f); Position pos = me->GetPosition(); @@ -1055,12 +1055,12 @@ public: if (fromReset) { if (Creature* c = me->FindNearestCreature(NPC_SAC_LIGHTS_VENGEANCE, 150.0f, true)) - c->DespawnOrUnsummon(1); + c->DespawnOrUnsummon(1ms); if (Creature* c = me->FindNearestCreature(NPC_SAC_LIGHTS_VENGEANCE_VEH_1, 150.0f, true)) c->RemoveAllAuras(); } if (Creature* c = me->FindNearestCreature(NPC_SAC_LIGHTS_VENGEANCE_VEH_2, 150.0f, true)) - c->DespawnOrUnsummon(1); + c->DespawnOrUnsummon(1ms); if (GameObject* go = me->FindNearestGameObject(GO_SAC_LIGHTS_VENGEANCE_1, 150.0f)) go->Delete(); if (GameObject* go = me->FindNearestGameObject(GO_SAC_LIGHTS_VENGEANCE_2, 150.0f)) @@ -1093,9 +1093,9 @@ public: me->GetMotionMaster()->Clear(); } - void SetGUID(ObjectGuid guid, int32 /*id*/) override + void SetGUID(ObjectGuid const& guid, int32 /*id*/) override { - if (playerGUID || events.GetNextEventTime(998) || events.GetNextEventTime(2)) + if (playerGUID || events.HasTimeUntilEvent(998) || events.HasTimeUntilEvent(2)) return; me->setActive(true); @@ -1289,18 +1289,18 @@ public: { c->CastSpell(v, SPELL_SAC_KILL_VEGARD, true); v->SetDisplayId(11686); - v->DespawnOrUnsummon(1000); + v->DespawnOrUnsummon(1s); b->CastSpell(b, SPELL_SAC_HOLY_BOMB_EXPLOSION, true); b->CastSpell(b, SPELL_SAC_SUMMON_GO_2, true); if (Unit* vb = c->GetVehicleBase()) { if (Unit* pass = vb->GetVehicleKit()->GetPassenger(0)) if (pass->IsCreature()) - pass->ToCreature()->DespawnOrUnsummon(1); + pass->ToCreature()->DespawnOrUnsummon(1ms); vb->RemoveAllAuras(); - vb->ToCreature()->DespawnOrUnsummon(1); + vb->ToCreature()->DespawnOrUnsummon(1ms); } - c->ToCreature()->DespawnOrUnsummon(1); + c->ToCreature()->DespawnOrUnsummon(1ms); } } break; @@ -1325,7 +1325,7 @@ public: if (spell->Id == SPELL_SAC_REPEL_HAMMER && target->IsCreature()) { target->CastSpell((Unit*)nullptr, SPELL_SAC_THROW_HAMMER, true); - target->ToCreature()->DespawnOrUnsummon(1); + target->ToCreature()->DespawnOrUnsummon(1ms); if (Unit* c = target->GetVehicleBase()) c->RemoveAurasDueToSpell(SPELL_SAC_HOLY_ZONE_AURA); } @@ -1439,7 +1439,7 @@ public: { me->SetDisplayId(me->GetNativeDisplayId()); me->CastSpell(me, SPELL_SAC_EMERGE, true); - me->m_Events.AddEvent(new SACActivateEvent(me), me->m_Events.CalculateTime(4000)); + me->m_Events.AddEventAtOffset(new SACActivateEvent(me), 4s); } void Deactivate() @@ -1452,7 +1452,7 @@ public: void JustDied(Unit* /*killer*/) override { me->RemoveAurasDueToSpell(SPELL_SAC_GHOUL_AREA_AURA); - me->m_Events.AddEvent(new SACDeactivateEvent(me), me->m_Events.CalculateTime(4000)); + me->m_Events.AddEventAtOffset(new SACDeactivateEvent(me), 4s); } void JustRespawned() override @@ -1559,7 +1559,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(1); - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); if (Creature* c = me->FindNearestCreature(NPC_SAC_LICH_KING, 200.0f, true)) c->AI()->SetData(3, 3); } @@ -2062,7 +2062,7 @@ class spell_q12096_q12092_dummy : public SpellScript { tree->CastSpell(player, SPELL_CREATE_ITEM_BARK); tree->AI()->Talk(SAY_WALKER_FRIENDLY, player); - tree->DespawnOrUnsummon(1000); + tree->DespawnOrUnsummon(1s); } else if (roll == 0) // enemy version { @@ -2114,8 +2114,8 @@ public: void JustEngagedWith(Unit* who) override { - _events.ScheduleEvent(EVENT_HEMORRHAGE, urand(5000, 8000)); - _events.ScheduleEvent(EVENT_KIDNEY_SHOT, urand(12000, 15000)); + _events.ScheduleEvent(EVENT_HEMORRHAGE, 5s, 8s); + _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12s, 15s); if (Player* player = who->ToPlayer()) Talk (SAY_AGGRO, player); @@ -2321,7 +2321,7 @@ class spell_dragonblight_devour_ghoul_periodic : public AuraScript if (GetUnitOwner() && GetUnitOwner()->ToCreature()) { GetUnitOwner()->ExitVehicle(); - GetUnitOwner()->ToCreature()->DespawnOrUnsummon(2000); + GetUnitOwner()->ToCreature()->DespawnOrUnsummon(2s); } } diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index 1084acac01..81ae014d58 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -207,7 +207,7 @@ public: Mrfloppy->GetMotionMaster()->MoveFollow(creature, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); if (npc_escortAI* pEscortAI = CAST_AI(npc_emily::npc_emilyAI, (creature->AI()))) - pEscortAI->Start(true, false, player->GetGUID()); + pEscortAI->Start(true, player->GetGUID()); } return true; } @@ -589,78 +589,78 @@ public: case EVENT_WOUNDED_MOVE: if (me->GetPositionY() == -2835.11f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); - me->DespawnOrUnsummon(20000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(20s); } if (me->GetPositionY() == -2981.89f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); - me->DespawnOrUnsummon(18000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(18s); } if (me->GetPositionY() == -2934.44f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); - me->DespawnOrUnsummon(9000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(9s); } if (me->GetPositionY() == -3020.99f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); - me->DespawnOrUnsummon(22000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(22s); } if (me->GetPositionY() == -2964.73f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_2, false); - me->DespawnOrUnsummon(15000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_2, false); + me->DespawnOrUnsummon(15s); } if (me->GetPositionY() == -2940.50f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); - me->DespawnOrUnsummon(20000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(20s); } if (me->GetPositionY() == -2847.93f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); - me->DespawnOrUnsummon(30000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(30s); } if (me->GetPositionY() == -2835.31f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); - me->DespawnOrUnsummon(27000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(27s); } if (me->GetPositionY() == -2822.20f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); - me->DespawnOrUnsummon(25000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(25s); } if (me->GetPositionY() == -2846.31f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_1, false); - me->DespawnOrUnsummon(21000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_1, false); + me->DespawnOrUnsummon(21s); } if (me->GetPositionY() == -2897.23f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); - me->DespawnOrUnsummon(15000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(15s); } if (me->GetPositionY() == -2886.01f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); - me->DespawnOrUnsummon(25000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(25s); } if (me->GetPositionY() == -2906.89f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_3, false); - me->DespawnOrUnsummon(25000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_3, false); + me->DespawnOrUnsummon(25s); } if (me->GetPositionY() == -3048.94f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_2, false); - me->DespawnOrUnsummon(30000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_2, false); + me->DespawnOrUnsummon(30s); } if (me->GetPositionY() == -2961.08f) { - me->GetMotionMaster()->MovePath(WOUNDED_MOVE_2, false); - me->DespawnOrUnsummon(25000); + me->GetMotionMaster()->MoveWaypoint(WOUNDED_MOVE_2, false); + me->DespawnOrUnsummon(25s); } break; case EVENT_CLEAVE: @@ -871,7 +871,7 @@ public: { if (_following) if (!me->HasAura(SPELL_FROG_LOVE)) - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); _events.Update(diff); @@ -898,7 +898,7 @@ public: break; case EVENT_LAKEFROG_5: Talk(SAY_MAIDEN_1); - me->DespawnOrUnsummon(4000); + me->DespawnOrUnsummon(4s); break; default: break; diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 6022af4bca..ef005b6158 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -44,9 +44,9 @@ public: if (Creature* cow = me->FindNearestCreature(24797, 5.0f, true)) { me->CastSpell(me, 44460, true); - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); cow->CastSpell(cow, 44460, true); - cow->DespawnOrUnsummon(10000); + cow->DespawnOrUnsummon(10s); if (me->IsSummon()) if (Unit* owner = me->ToTempSummon()->GetSummonerUnit()) owner->CastSpell(owner, 44463, true); @@ -191,7 +191,8 @@ public: if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) { creature->SetFaction(player->GetTeamId() == TEAM_ALLIANCE ? FACTION_ESCORTEE_A_PASSIVE : FACTION_ESCORTEE_H_PASSIVE); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + creature->SetWalk(true); + CAST_AI(npc_escortAI, (creature->AI()))->Start(true, player->GetGUID()); } return true; } @@ -238,7 +239,7 @@ public: { case 1: me->SetReactState(REACT_AGGRESSIVE); - SetRun(true); + me->SetWalk(false); break; case 23: player->GroupEventHappens(QUEST_TRAIL_OF_FIRE, me); @@ -247,32 +248,32 @@ public: case 5: if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER, 10.0f)) Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false); - SetRun(false); + me->SetWalk(true); break; case 6: if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER, 10.0f)) Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false); - SetRun(true); + me->SetWalk(false); break; case 8: if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER, 10.0f)) Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false); - SetRun(false); + me->SetWalk(true); break; case 9: if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER, 10.0f)) Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false); break; case 10: - SetRun(true); + me->SetWalk(false); break; case 13: - SetRun(false); + me->SetWalk(true); break; case 14: if (Unit* Trigger = me->FindNearestCreature(NPC_HANES_FIRE_TRIGGER, 10.0f)) Trigger->CastSpell(Trigger, SPELL_COSMETIC_LOW_POLY_FIRE, false); - SetRun(true); + me->SetWalk(false); break; } } @@ -309,7 +310,7 @@ public: return; me->SetWalk(true); - Start(false, false, summonerGUID); + Start(false, summonerGUID); } void WaypointReached(uint32 waypointId) override diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 7db4f389ce..17e0e9589d 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -501,7 +501,7 @@ public: events.RescheduleEvent(EVENT_SOUL_COAX, 5s); } else - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); break; case EVENT_SOUL_COAX: Talk(SAY_ARETE_1); @@ -523,11 +523,8 @@ public: { soul->SetCanFly(true); soul->SetVisible(true); - Movement::MoveSplineInit init(soul); - init.MoveTo(soul->GetPositionX(), soul->GetPositionY(), soul->GetPositionZ() + 5.0f); - init.SetVelocity(1.0f); - init.Launch(); soul->CastSpell(soul, 64462, true); // Drown + soul->GetMotionMaster()->MovePoint(0, soul->GetPositionX(), soul->GetPositionY(), soul->GetPositionZ() + 5.0f, FORCED_MOVEMENT_NONE, 1.f); } events.ScheduleEvent(EVENT_SCENE_1, 6s); break; @@ -580,14 +577,14 @@ public: if (Creature* soul = ObjectAccessor::GetCreature(*me, _landgrenSoulGUID)) { soul->AI()->Talk(SAY_SOUL_4); - soul->DespawnOrUnsummon(2000); + soul->DespawnOrUnsummon(2s); } events.ScheduleEvent(EVENT_SCENE_10, 3s); break; case EVENT_SCENE_10: me->ReplaceAllNpcFlags(UNIT_NPC_FLAG_QUESTGIVER); Talk(SAY_ARETE_6); - me->DespawnOrUnsummon(60000); + me->DespawnOrUnsummon(60s); break; } } @@ -718,7 +715,8 @@ public: Talk(0); events.Reset(); summons.DespawnAll(); - Start(false, false); + me->SetWalk(true); + Start(false); int8 i = -1; std::list<Creature*> cList; @@ -796,7 +794,7 @@ public: summon->SetUInt32Value(UNIT_NPC_EMOTESTATE, param); break; case ACTION_SUMMON_DESPAWN: - summon->DespawnOrUnsummon(param); + summon->DespawnOrUnsummon(Milliseconds(param)); break; case ACTION_SUMMON_ORIENTATION: summon->SetFacingTo(param / 100.0f); @@ -1022,9 +1020,9 @@ public: { if (summon->GetEntry() == NPC_TIRION_LICH_KING) summon->CastSpell(summon, SPELL_LICH_KINGS_FURY, false); - summon->DespawnOrUnsummon(summon->GetEntry() == NPC_TIRION_LICH_KING ? 10000 : 4000); + summon->DespawnOrUnsummon(summon->GetEntry() == NPC_TIRION_LICH_KING ? 10s : 4s); } - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); break; } } @@ -1257,8 +1255,8 @@ public: player->CastSpell(player, SPELL_WAITING_FOR_A_BOMBER, true); player->CastSpell(player, SPELL_FLIGHT_ORDERS, true); - events.ScheduleEvent(EVENT_START_FLIGHT, 0); - events.ScheduleEvent(EVENT_TAKE_PASSENGER, 3000); + events.ScheduleEvent(EVENT_START_FLIGHT, 0ms); + events.ScheduleEvent(EVENT_TAKE_PASSENGER, 3s); me->SetCanFly(true); me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); me->SetSpeed(MOVE_FLIGHT, 0.1f); @@ -1310,29 +1308,11 @@ public: turret->HandleSpellClick(owner, 0); return; } - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); break; case EVENT_START_FLIGHT: { - WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry()); - if (!path || path->empty()) - { - me->DespawnOrUnsummon(1); - return; - } - - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - - uint32 wpCounter = 1; - WPPath::const_iterator itr; - while ((itr = path->find(wpCounter++)) != path->end()) - { - WayPoint* wp = itr->second; - pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z)); - } - - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + me->GetMotionMaster()->MovePath(me->GetEntry(), FORCED_MOVEMENT_NONE, PathSource::SMART_WAYPOINT_MGR); events.ScheduleEvent(EVENT_CHECK_PATH_REGEN_HEALTH_BURN_DAMAGE, 1min); events.ScheduleEvent(EVENT_SYNCHRONIZE_SHIELDS, 5s); break; @@ -1342,7 +1322,7 @@ public: // Check if path is finished if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != ESCORT_MOTION_TYPE) { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); return; } @@ -1381,7 +1361,7 @@ public: station->RemoveAurasDueToSpell(SPELL_INFRA_GREEN_SHIELD); } if (!playerPresent) - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } events.ScheduleEvent(EVENT_SYNCHRONIZE_SHIELDS, 1s); break; diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 100a90a869..329ab98c09 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -605,7 +605,8 @@ public: creature->GetMotionMaster()->MoveJumpTo(0, 0.4f, 0.4f); creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - pEscortAI->Start(false, false, player->GetGUID()); + creature->SetWalk(true); + pEscortAI->Start(false, player->GetGUID()); creature->AI()->Talk(SAY_WP_1); } } @@ -1147,17 +1148,7 @@ public: { if (apply && passenger->IsPlayer()) { - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - - WaypointPath const* i_path = sWaypointMgr->GetPath(NPC_PLANE); - for (uint8 i = 0; i < i_path->size(); ++i) - { - WaypointData const* node = i_path->at(i); - pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); - } - - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + me->GetMotionMaster()->MovePath(NPC_PLANE, FORCED_MOVEMENT_NONE, PathSource::WAYPOINT_MGR); } } diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index d43a29a5e9..5a50bee8a3 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -57,7 +57,7 @@ struct npc_frosthound : public npc_escortAI { me->SetFaction(who->GetFaction()); me->CastSpell(me, SPELL_SUMMON_PURSUERS_PERIODIC, true); - Start(false, true, who->GetGUID()); + Start(false, who->GetGUID()); Talk(TALK_EMOTE_FROSTHOUND_SNIFF, me); } } @@ -159,7 +159,7 @@ public: me->RemoveAllAurasExceptType(SPELL_AURA_MECHANIC_IMMUNITY); Talk(1); caster->ToPlayer()->KilledMonsterCredit(me->GetEntry()); - me->DespawnOrUnsummon(8000); + me->DespawnOrUnsummon(8s); me->GetMotionMaster()->MoveJump(8721.94f, -1955, 963, 70.0f, 30.0f); } } @@ -246,7 +246,7 @@ public: void RollPath() { me->SetEntry(NPC_TIME_LOST_PROTO_DRAKE); - Start(true, true, ObjectGuid::Empty, 0, false, true, true); + Start(true, ObjectGuid::Empty, 0, false, true, true); SetNextWaypoint(urand(0, 250), true); me->UpdateEntry(roll_chance_i(25) ? NPC_TIME_LOST_PROTO_DRAKE : NPC_VYRAGOSA, 0, false); } @@ -467,17 +467,7 @@ public: if (startPath) { startPath = false; - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - - WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath()); - for (uint8 i = 0; i < i_path->size(); ++i) - { - WaypointData const* node = i_path->at(i); - pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); - } - - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + me->GetMotionMaster()->MovePath(me->GetWaypointPath(), FORCED_MOVEMENT_NONE, PathSource::WAYPOINT_MGR); } if (setCharm) { @@ -849,17 +839,7 @@ public: { Talk(TEXT_EMOTE, passenger); - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - - WaypointPath const* i_path = sWaypointMgr->GetPath(NPC_DRAKE); - for (uint8 i = 0; i < i_path->size(); ++i) - { - WaypointData const* node = i_path->at(i); - pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); - } - - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + me->GetMotionMaster()->MovePath(NPC_DRAKE, FORCED_MOVEMENT_NONE, PathSource::WAYPOINT_MGR); } } else @@ -912,7 +892,10 @@ public: if (who->IsPlayer()) { if (apply) - Start(false, true, who->GetGUID()); + { + me->SetWalk(false); + Start(false, who->GetGUID()); + } } } @@ -970,7 +953,7 @@ public: }; if (who->IsPlayer()) - who->m_Events.AddEvent(new DelayedTransportPositionOffsets(who), who->m_Events.CalculateTime(500)); + who->m_Events.AddEventAtOffset(new DelayedTransportPositionOffsets(who), 500ms); return; } @@ -1084,15 +1067,7 @@ public: { if (apply) { - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetEntry() * 100); - for (uint8 i = 0; i < i_path->size(); ++i) - { - WaypointData const* node = i_path->at(i); - pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); - } - me->GetMotionMaster()->MoveSplinePath(&pathPoints); + me->GetMotionMaster()->MovePath(me->GetEntry() * 100, FORCED_MOVEMENT_NONE, PathSource::WAYPOINT_MGR); me->SetCanFly(true); me->SetDisableGravity(true); me->SetSpeed(MOVE_RUN, 6.0f); @@ -1149,13 +1124,13 @@ public: } else { - me->DespawnOrUnsummon(100); + me->DespawnOrUnsummon(100ms); } break; case 24: if (me->GetEntry() == NPC_PROPELLED_DEVICE_1) { - me->DespawnOrUnsummon(100); + me->DespawnOrUnsummon(100ms); } break; default: diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index cc42869104..276683cd62 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -184,7 +184,7 @@ public: data << spellId; data << uint8(SPELL_FAILED_CUSTOM_ERROR); data << uint32(SPELL_CUSTOM_ERROR_CANT_BUILD_MORE_VEHICLES); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } return true; } diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 8b36a31062..3a91af290b 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -591,7 +591,7 @@ public: // pointer check not needed DoCast(rageclaw, SPELL_FREE_RAGECLAW, true); _rageclawGUID.Clear(); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void SpellHit(Unit* caster, SpellInfo const* spell) override @@ -660,7 +660,7 @@ public: DoCast(me, SPELL_UNSHACKLED, true); Talk(SAY_RAGECLAW); me->GetMotionMaster()->MoveRandom(10); - me->DespawnOrUnsummon(10000); + me->DespawnOrUnsummon(10s); } } }; @@ -755,7 +755,7 @@ public: case EVENT_RECRUIT_2: me->SetWalk(true); me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + (cos(_heading) * 10), me->GetPositionY() + (std::sin(_heading) * 10), me->GetPositionZ()); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); break; default: break; diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp index 3b7a60e266..df5dd8c7d3 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -241,7 +241,7 @@ struct npc_stolen_soul : public ScriptedAI }); } - void SetGUID(ObjectGuid guid, int32 /*id*/) override + void SetGUID(ObjectGuid const& guid, int32 /*id*/) override { _targetGuid = guid; } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp index a9afd481c0..155dc6cb37 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp @@ -66,7 +66,7 @@ struct boss_ambassador_hellmaw : public BossAI } else { - me->GetMotionMaster()->MovePath(PATH_ID_START, false); + me->GetMotionMaster()->MoveWaypoint(PATH_ID_START, false); } } @@ -88,7 +88,7 @@ struct boss_ambassador_hellmaw : public BossAI DoPlaySoundToSet(me, SOUND_INTRO); isBanished = false; me->SetImmuneToAll(false); - me->GetMotionMaster()->MovePath(PATH_ID_START, false); + me->GetMotionMaster()->MoveWaypoint(PATH_ID_START, false); } void JustEngagedWith(Unit*) override @@ -142,7 +142,7 @@ struct boss_ambassador_hellmaw : public BossAI { me->m_Events.AddEventAtOffset([this]() { - me->GetMotionMaster()->MovePath(PATH_ID_PATHING, true); + me->GetMotionMaster()->MoveWaypoint(PATH_ID_PATHING, true); }, 20s); } } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp index 1717a518d0..76c3d86efd 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -111,7 +111,7 @@ struct boss_grandmaster_vorpil : public BossAI case 8: return 7200ms; case 9: - return 6000ms; + return 6s; default: return 4800ms; } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp index fcf8f38c5c..a4c40812fa 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp @@ -114,7 +114,7 @@ struct boss_murmur : public BossAI return true; } - void SetGUID(ObjectGuid guid, int32 index) override + void SetGUID(ObjectGuid const& guid, int32 index) override { if (index == GUID_MURMUR_NPCS) { diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index da92628e0f..c1c9723055 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -507,7 +507,7 @@ struct boss_illidan_stormrage : public BossAI Talk(SAY_ILLIDAN_EYE_BLAST); me->SummonCreature(NPC_ILLIDAN_DB_TARGET, eyeBeamPos[beamPosId], TEMPSUMMON_TIMED_DESPAWN, 30000); if (Creature* trigger = summons.GetCreatureWithEntry(NPC_ILLIDAN_DB_TARGET)) - trigger->GetMotionMaster()->MovePoint(0, eyeBeamPos[beamPosId + MAX_EYE_BEAM_POS], false, true); + trigger->GetMotionMaster()->MovePoint(0, eyeBeamPos[beamPosId + MAX_EYE_BEAM_POS], FORCED_MOVEMENT_NONE, 0.f, false, true); // Reposition me->m_Events.AddEventAtOffset([&] { @@ -515,7 +515,7 @@ struct boss_illidan_stormrage : public BossAI me->InterruptNonMeleeSpells(false); me->SetControlled(false, UNIT_STATE_ROOT); CycleBeamPos(beamPosId); - me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_HOVER, airHoverPos[beamPosId], false, true); + me->GetMotionMaster()->MovePoint(POINT_ILLIDAN_HOVER, airHoverPos[beamPosId], FORCED_MOVEMENT_NONE, 0.f, false, true); }, 20s, GROUP_PHASE_FLYING); }); // Check for Phase Transition @@ -794,7 +794,7 @@ struct npc_akama_illidan : public ScriptedAI if (instance->GetBossState(DATA_AKAMA_ILLIDAN) != DONE) { - me->GetMotionMaster()->MovePath(PATH_AKAMA_ILLIDARI_COUNCIL_2, false); + me->GetMotionMaster()->MoveWaypoint(PATH_AKAMA_ILLIDARI_COUNCIL_2, false); } else { @@ -811,7 +811,7 @@ struct npc_akama_illidan : public ScriptedAI { me->NearTeleportTo(AkamaIllidariCouncilTeleport); me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - me->GetMotionMaster()->MovePath(PATH_AKAMA_ILLIDARI_COUNCIL_1, false); + me->GetMotionMaster()->MoveWaypoint(PATH_AKAMA_ILLIDARI_COUNCIL_1, false); } break; case ACTION_AKAMA_MINIONS: @@ -904,7 +904,7 @@ struct npc_akama_illidan : public ScriptedAI else if (type == WAYPOINT_MOTION_TYPE) { if (me->GetCurrentWaypointID() == PATH_AKAMA_MINIONS) - if (id == 2) + if (id == 3) DoCastSelf(SPELL_AKAMA_TELEPORT); } } @@ -923,7 +923,7 @@ struct npc_akama_illidan : public ScriptedAI me->m_Events.AddEventAtOffset([&] { Talk(SAY_AKAMA_COUNCIL_2); me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); - }, 8000ms); // 7800ms + }, 8s); // 7800ms } break; // Reached Door @@ -974,7 +974,7 @@ struct npc_akama_illidan : public ScriptedAI Talk(SAY_AKAMA_SALUTE); }, 56955ms); // 6275ms me->m_Events.AddEventAtOffset([&] { - me->GetMotionMaster()->MovePath(PATH_AKAMA_ILLIDARI_COUNCIL_3, false); + me->GetMotionMaster()->MoveWaypoint(PATH_AKAMA_ILLIDARI_COUNCIL_3, false); }, 64030ms); // 7075ms } break; @@ -1013,7 +1013,7 @@ struct npc_akama_illidan : public ScriptedAI me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); }, 9530ms); // 2830ms me->m_Events.AddEventAtOffset([&] { - me->GetMotionMaster()->MovePath(PATH_AKAMA_MINIONS, false); + me->GetMotionMaster()->MoveWaypoint(PATH_AKAMA_MINIONS, false); }, 14400ms); // 4870ms } } @@ -1436,7 +1436,7 @@ class spell_illidan_parasitic_shadowfiend_trigger : public SpellScript { PreventHitDefaultEffect(effIndex); if (Creature* target = GetHitCreature()) - target->DespawnOrUnsummon(1); + target->DespawnOrUnsummon(1ms); } void Register() override @@ -1692,7 +1692,7 @@ class spell_illidan_cage_trap : public SpellScript if (GetCaster()->GetExactDist2d(target) < 4.0f) { target->AI()->DoAction(ACTION_ILLIDAN_CAGED); - GetCaster()->ToCreature()->DespawnOrUnsummon(1); + GetCaster()->ToCreature()->DespawnOrUnsummon(1ms); if (GameObject* gobject = GetCaster()->FindNearestGameObject(GO_CAGE_TRAP, 10.0f)) gobject->SetLootState(GO_JUST_DEACTIVATED); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 8c22b8d04e..880a39615d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -262,7 +262,7 @@ struct boss_illidari_council_memberAI : public ScriptedAI void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!events.HasTimeUntilEvent(EVENT_KILL_TALK)) { Talk(SAY_COUNCIL_SLAY); events.ScheduleEvent(EVENT_KILL_TALK, 6s); @@ -582,7 +582,7 @@ struct boss_veras_darkshadow : public boss_illidari_council_memberAI break; } - if (events.GetNextEventTime(EVENT_SPELL_VANISH_OUT) == 0) + if (!events.HasTimeUntilEvent(EVENT_SPELL_VANISH_OUT)) DoMeleeAttackIfReady(); } }; @@ -771,7 +771,7 @@ class spell_illidari_council_deadly_strike_aura : public AuraScript if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) { GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500))); + GetUnitOwner()->m_Events.AddEventAtOffset(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), randtime(1500ms, 3500ms)); } } diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 79d68ebfa0..9710a8382b 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -107,7 +107,7 @@ public: { summoner->GetAI()->DoAction(_action); _owner.SetStandState(UNIT_STAND_STATE_SUBMERGED); - _owner.DespawnOrUnsummon(200); + _owner.DespawnOrUnsummon(200ms); } return true; } @@ -284,7 +284,7 @@ public: if (type != POINT_MOTION_TYPE || id != POINT_GO_BACK) return; - me->m_Events.AddEvent(new SuckBackEvent(*me, ACTION_ESSENCE_OF_SUFFERING), me->m_Events.CalculateTime(1500)); + me->m_Events.AddEventAtOffset(new SuckBackEvent(*me, ACTION_ESSENCE_OF_SUFFERING), 1500ms); me->SetTarget(); me->SetFacingTo(M_PI / 2.0f); } @@ -301,7 +301,7 @@ public: Talk(SUFF_SAY_RECAP); me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); + me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), FORCED_MOVEMENT_NONE, 0.f, false); scheduler.CancelAll(); } } @@ -392,7 +392,7 @@ public: if (type != POINT_MOTION_TYPE || id != POINT_GO_BACK) return; - me->m_Events.AddEvent(new SuckBackEvent(*me, ACTION_ESSENCE_OF_DESIRE), me->m_Events.CalculateTime(1500)); + me->m_Events.AddEventAtOffset(new SuckBackEvent(*me, ACTION_ESSENCE_OF_DESIRE), 1500ms); me->SetTarget(); me->SetFacingTo(M_PI / 2.0f); } @@ -408,7 +408,7 @@ public: Talk(DESI_SAY_RECAP); me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), false); + me->GetMotionMaster()->MovePoint(POINT_GO_BACK, me->GetHomePosition(), FORCED_MOVEMENT_NONE, 0.f, false); scheduler.CancelAll(); } } diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 1cc778b25a..a8c18e4aa8 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -251,7 +251,7 @@ struct npc_akama_shade : public ScriptedAI { Talk(SAY_BROKEN_FREE_2); }, 3); - ScheduleUniqueTimedEvent(52000ms, [&] + ScheduleUniqueTimedEvent(52s, [&] { std::list<Creature*> brokens; me->GetCreatureListWithEntryInGrid(brokens, NPC_ASHTONGUE_BROKEN, 40.0f); @@ -391,7 +391,7 @@ struct npc_creature_generator_akama : public ScriptedAI void SummonedCreatureDies(Creature* summon, Unit*) override { spawnCounter--; - summon->DespawnOrUnsummon(10000); + summon->DespawnOrUnsummon(10s); summons.Despawn(summon); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp index 8ec98b72fb..319e588f72 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -139,7 +139,7 @@ struct boss_fathomlord_karathress : public BossAI if (Creature* olum = instance->GetCreature(DATA_SEER_OLUM)) { olum->SetWalk(true); - olum->GetMotionMaster()->MovePoint(0, olumWalk, false); + olum->GetMotionMaster()->MovePoint(0, olumWalk, FORCED_MOVEMENT_NONE, 0.f, false); olum->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); olum->SetNpcFlag(UNIT_NPC_FLAG_QUESTGIVER); } @@ -269,7 +269,7 @@ struct boss_fathomguard_sharkkis : public ScriptedAI { me->CastSpell(karathress, SPELL_POWER_OF_SHARKKIS, true); karathress->AI()->Talk(SAY_GAIN_ABILITY2); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } @@ -452,7 +452,7 @@ struct boss_fathomguard_tidalvess : public ScriptedAI { me->CastSpell(karathress, SPELL_POWER_OF_TIDALVESS, true); karathress->AI()->Talk(SAY_GAIN_ABILITY1); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } @@ -546,7 +546,7 @@ struct boss_fathomguard_caribdis : public ScriptedAI { me->CastSpell(karathress, SPELL_POWER_OF_CARIBDIS, true); karathress->AI()->Talk(SAY_GAIN_ABILITY3); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp index 060c627ee5..93d497d6eb 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp @@ -81,8 +81,8 @@ enum Misc enum WaterElementalPathIds { - PATH_CENTER = 5, - PATH_END = 12 + PATH_CENTER = 6, + PATH_END = 13 }; struct boss_hydross_the_unstable : public BossAI @@ -273,7 +273,7 @@ struct boss_hydross_the_unstable : public BossAI else if (summon->GetEntry() == NPC_TAINTED_HYDROSS_ELEMENTAL) { summon->setActive(true); - summon->GetMotionMaster()->MovePath(summon->GetEntry() * 10, false); + summon->GetMotionMaster()->MoveWaypoint(summon->GetEntry() * 10, false); } else { diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index d631825a7f..da30b3d031 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -93,7 +93,7 @@ struct boss_lady_vashj : public BossAI scheduler.CancelAll(); me->CastStop(); me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_HOME, me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY(), me->GetHomePosition().GetPositionZ(), true, true); + me->GetMotionMaster()->MovePoint(POINT_HOME, me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY(), me->GetHomePosition().GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, true, true); }); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp index 08bdae70af..9d25ba77d1 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -88,7 +88,7 @@ struct boss_the_lurker_below : public BossAI pool->SetRespawnTime(10); pool->SaveRespawnTime(10); } - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); } void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override @@ -129,7 +129,7 @@ struct boss_the_lurker_below : public BossAI { BossAI::JustEngagedWith(who); - SchedulerPhaseOne(38800ms, 91000ms); + SchedulerPhaseOne(38800ms, 91s); } void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override @@ -191,7 +191,7 @@ struct boss_the_lurker_below : public BossAI me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); scheduler.CancelAll(); - SchedulerPhaseOne(10000ms, 90750ms); + SchedulerPhaseOne(10s, 90750ms); }); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp index 1551d7c818..15b91e685e 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -234,7 +234,7 @@ class spell_serpentshrine_cavern_serpentshrine_parasite_trigger : public SpellSc { PreventHitDefaultEffect(effIndex); if (Creature* target = GetHitCreature()) - target->DespawnOrUnsummon(1); + target->DespawnOrUnsummon(1ms); } void Register() override diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp index 95bba3d499..9f837911cd 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp @@ -188,7 +188,7 @@ struct boss_ahune : public BossAI { BossAI::JustEngagedWith(who); events.ScheduleEvent(EVENT_INITIAL_EMERGE, 4ms); - events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3000); + events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3s); } void EnterEvadeMode(EvadeReason /*why*/) override @@ -318,7 +318,7 @@ struct npc_frozen_core : public ScriptedAI me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetImmuneToPC(false); me->RemoveAurasDueToSpell(SPELL_ICE_SPEAR_CONTROL_AURA); - _events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3000, 0, PHASE_TWO); + _events.ScheduleEvent(EVENT_SYNCH_HEALTH, 3s, 0, PHASE_TWO); } else if (action == ACTION_AHUNE_RESURFACE) { @@ -342,7 +342,7 @@ struct npc_frozen_core : public ScriptedAI DoCast(ahune, SPELL_SYNCH_HEALTH, true); else DoCastSelf(SPELL_SUICIDE); - _events.Repeat(3000ms, 3000ms); + _events.Repeat(3s, 3s); break; default: break; @@ -394,11 +394,11 @@ struct npc_ahune_bunny : public ScriptedAI _submerged = false; _events.Reset(); _events.SetPhase(PHASE_ONE); - _events.ScheduleEvent(EVENT_SUMMON_AHUNE, 10000); - _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 14000, 0, PHASE_ONE); - _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 22000, 0, PHASE_ONE); - _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 14000, 0, PHASE_ONE); - _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 108000, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_SUMMON_AHUNE, 10s); + _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 14s, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 22s, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 14s, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 108s, 0, PHASE_ONE); } else if (action == ACTION_STOP_EVENT) { @@ -430,9 +430,9 @@ struct npc_ahune_bunny : public ScriptedAI case EVENT_SUMMON_COLDWEAVE: DoCast(SPELL_SUMMON_COLDWEAVE); DoCast(SPELL_SUMMON_COLDWEAVE); - _events.Repeat(8000ms); + _events.Repeat(8s); if (_submerged) - _events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 4000, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_SUMMON_FROSTWIND, 4s, 0, PHASE_ONE); break; case EVENT_SUMMON_FROSTWIND: DoCast(SPELL_SUMMON_FROSTWIND); @@ -458,17 +458,17 @@ struct npc_ahune_bunny : public ScriptedAI ahune->AI()->DoAction(ACTION_AHUNE_RETREAT); _events.Reset(); _events.SetPhase(PHASE_TWO); - _events.ScheduleEvent(EVENT_CLOSE_OPENING, 25000, 0, PHASE_TWO); - _events.ScheduleEvent(EVENT_AHUNE_PHASE_ONE, 35000, 0, PHASE_TWO); + _events.ScheduleEvent(EVENT_CLOSE_OPENING, 25s, 0, PHASE_TWO); + _events.ScheduleEvent(EVENT_AHUNE_PHASE_ONE, 35s, 0, PHASE_TWO); break; case EVENT_AHUNE_PHASE_ONE: _submerged = true; _events.Reset(); _events.SetPhase(PHASE_ONE); - _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 8000, 0, PHASE_ONE); - _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 5000, 0, PHASE_ONE); - _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 5000, 0, PHASE_ONE); - _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 100000, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_SUMMON_COLDWEAVE, 8s, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_SUMMON_HAILSTONE, 5s, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_START_LOOKING_FOR_OPENING, 5s, 0, PHASE_ONE); + _events.ScheduleEvent(EVENT_AHUNE_PHASE_TWO, 100s, 0, PHASE_ONE); break; default: break; @@ -534,7 +534,7 @@ struct npc_earthen_ring_flamecaller : public ScriptedAI switch (spellInfo->Id) { case SPELL_SHAMANS_LOOK_FOR_OPENING: - _events.ScheduleEvent(EVENT_LOOKFOROPENING_0, 17000); + _events.ScheduleEvent(EVENT_LOOKFOROPENING_0, 17s); break; case SPELL_FOUND_OPENING: Talk(EMOTE_RETREAT); @@ -560,15 +560,15 @@ struct npc_earthen_ring_flamecaller : public ScriptedAI { case EVENT_LOOKFOROPENING_0: LookOpening(true, 0); - _events.ScheduleEvent(EVENT_LOOKFOROPENING_1, 26000); + _events.ScheduleEvent(EVENT_LOOKFOROPENING_1, 26s); break; case EVENT_LOOKFOROPENING_1: LookOpening(true, 1); - _events.ScheduleEvent(EVENT_LOOKFOROPENING_2, 25000); + _events.ScheduleEvent(EVENT_LOOKFOROPENING_2, 25s); break; case EVENT_LOOKFOROPENING_2: LookOpening(true, 2); - _events.ScheduleEvent(EVENT_STOP_LOOKING_FOR_OPENING, 27000); + _events.ScheduleEvent(EVENT_STOP_LOOKING_FOR_OPENING, 27s); break; case EVENT_STOP_LOOKING_FOR_OPENING: LookOpening(false, _mySpot); @@ -619,7 +619,7 @@ struct npc_ahune_ice_spear_bunny : public ScriptedAI _scheduler.Schedule(2500ms, [this](TaskContext /*task*/) { DoCastSelf(SPELL_ICE_SPEAR_DELAY); - me->DespawnOrUnsummon(3500); + me->DespawnOrUnsummon(3500ms); }); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp index 1486bf0bd6..f9dca0c401 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp @@ -23,8 +23,7 @@ enum Spells { SPELL_ENSNARING_MOSS = 31948, SPELL_FRENZY = 34970, - SPELL_GRIEVOUS_WOUND_N = 31956, - SPELL_GRIEVOUS_WOUND_H = 38801, + SPELL_GRIEVOUS_WOUND = 31956, SPELL_WATER_SPIT = 35008 }; @@ -53,7 +52,7 @@ struct boss_rokmar_the_crackler : public BossAI scheduler.Schedule(8s, [this] (TaskContext context) { - DoCastVictim(DUNGEON_MODE(SPELL_GRIEVOUS_WOUND_N, SPELL_GRIEVOUS_WOUND_H)); + DoCastVictim(SPELL_GRIEVOUS_WOUND); context.Repeat(20700ms); }).Schedule(15300ms, [this](TaskContext context) { diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.cpp index 741a8e78f5..c7e4525c8f 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.cpp @@ -31,7 +31,7 @@ public: { if (Creature* quagmirran = instance->GetCreature(DATA_QUAGMIRRAN)) { - quagmirran->GetMotionMaster()->MovePath(quagmirran->GetEntry() * 100, true); + quagmirran->GetMotionMaster()->MoveWaypoint(quagmirran->GetEntry() * 100, true); } } diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp index 0510e6b91e..5a9fe60fd2 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_ghazan.cpp @@ -86,13 +86,13 @@ struct boss_ghazan : public BossAI if (type == ACTION_MOVE_TO_PLATFORM && !_movedToPlatform) { _movedToPlatform = true; - me->GetMotionMaster()->MovePath((me->GetSpawnId() * 10) + 1, false); + me->GetMotionMaster()->MoveWaypoint((me->GetSpawnId() * 10) + 1, false); } } void MovementInform(uint32 type, uint32 pointId) override { - if (!_movedToPlatform || type != WAYPOINT_MOTION_TYPE || pointId != 19) + if (!_movedToPlatform || type != WAYPOINT_MOTION_TYPE || pointId != 20) { return; } diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp index 73beb4eb0b..a8b98b64c0 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp @@ -123,7 +123,7 @@ struct npc_underbog_mushroom : public ScriptedAI context.Schedule(4s, [this](TaskContext /*context*/) { me->RemoveAurasDueToSpell(SPELL_GROW); - me->DespawnOrUnsummon(2000); + me->DespawnOrUnsummon(2s); }); } else diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp index dfbdf0d915..355f2abad4 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp @@ -68,7 +68,7 @@ struct boss_gruul : public BossAI { _Reset(); _recentlySpoken = false; - _caveInTimer = 29000ms; + _caveInTimer = 29s; } void JustEngagedWith(Unit* /*who*/) override @@ -84,7 +84,7 @@ struct boss_gruul : public BossAI }).Schedule(_caveInTimer, [this](TaskContext context) { DoCastRandomTarget(SPELL_CAVE_IN); - if (_caveInTimer > 4000ms) + if (_caveInTimer > 4s) { _caveInTimer = _caveInTimer - 1500ms; } diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp index c6624521f4..c7397da3e2 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp @@ -146,7 +146,7 @@ struct boss_high_king_maulgar : public BossAI { DoCastVictim(SPELL_MIGHTY_BLOW); context.Repeat(16200ms, 19s); - }).Schedule(67000ms, [this](TaskContext context) + }).Schedule(67s, [this](TaskContext context) { scheduler.DelayAll(15s); DoCastSelf(SPELL_WHIRLWIND); diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index 26a0c780b7..864d18a9a1 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -102,7 +102,7 @@ struct boss_vazruden_the_herald : public BossAI if (summon->GetEntry() == NPC_HELLFIRE_SENTRY && summons.size() == 0) { Talk(SAY_INTRO); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, false); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, FORCED_MOVEMENT_NONE, 0.f, false); _JustEngagedWith(); } else if (summons.size() == 0) @@ -155,7 +155,7 @@ struct boss_nazan : public ScriptedAI void EnterEvadeMode(EvadeReason /*why*/) override { - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void JustEngagedWith(Unit*) override @@ -163,7 +163,7 @@ struct boss_nazan : public ScriptedAI _scheduler.CancelAll(); _scheduler.Schedule(5ms, GROUP_PHASE_1, [this](TaskContext context) { - me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], false); + me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], FORCED_MOVEMENT_NONE, 0.f, false); _scheduler.DelayAll(7s); context.Repeat(30s); }).Schedule(5s, GROUP_PHASE_1, [this](TaskContext context) @@ -193,7 +193,7 @@ struct boss_nazan : public ScriptedAI Talk(EMOTE_NAZAN); me->SetReactState(REACT_PASSIVE); me->InterruptNonMeleeSpells(true); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, FORCED_MOVEMENT_NONE, 0.f, false); } } @@ -262,7 +262,7 @@ struct boss_vazruden : public ScriptedAI void EnterEvadeMode(EvadeReason /*why*/) override { Talk(SAY_WIPE); - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); } void JustEngagedWith(Unit*) override diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index e37234663f..df645e4ecd 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -284,7 +284,7 @@ struct npc_target_trigger : public ScriptedAI _scheduler.Schedule(5s, [this](TaskContext /*context*/) { DoCastSelf(SPELL_DEBRIS_DAMAGE); - me->DespawnOrUnsummon(6000); + me->DespawnOrUnsummon(6s); }); } } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp index 77982ad4e7..457dc69e7c 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_porung.cpp @@ -43,7 +43,7 @@ enum Says enum Misc { - POINT_SCOUT_WP_END = 3, + POINT_SCOUT_WP_END = 4, SET_DATA_ARBITRARY_VALUE = 1, SET_DATA_ENCOUNTER_DONE = 2 @@ -100,7 +100,7 @@ struct npc_shattered_hand_scout : public ScriptedAI DoCastSelf(SPELL_CLEAR_ALL); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); Talk(SAY_INVADERS_BREACHED); - me->GetMotionMaster()->MovePath(me->GetEntry() * 10, false); + me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); _firstZealots.clear(); std::list<Creature*> creatureList; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index dab0d05907..327664c2bd 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -140,7 +140,7 @@ struct boss_alar : public BossAI _noQuillTimes = 0; _platformRoll = RAND(0, 1); _platform = _platformRoll ? 0 : 3; - me->GetMotionMaster()->MovePoint(POINT_QUILL, alarPoints[POINT_QUILL], false, true); + me->GetMotionMaster()->MovePoint(POINT_QUILL, alarPoints[POINT_QUILL], FORCED_MOVEMENT_NONE, 0.f, false, true); _platformMoveRepeatTimer = 16s; } else @@ -150,7 +150,7 @@ struct boss_alar : public BossAI me->SetOrientation(alarPoints[_platform].GetOrientation()); SpawnPhoenixes(1, me); } - me->GetMotionMaster()->MovePoint(POINT_PLATFORM, alarPoints[_platform], false, true); + me->GetMotionMaster()->MovePoint(POINT_PLATFORM, alarPoints[_platform], FORCED_MOVEMENT_NONE, 0.f, false, true); _platform = (_platform+1)%4; _platformMoveRepeatTimer = 30s; } @@ -258,7 +258,7 @@ struct boss_alar : public BossAI }, 30s); ScheduleTimedEvent(34s, [&] { - me->GetMotionMaster()->MovePoint(POINT_DIVE, alarPoints[POINT_DIVE], false, true); + me->GetMotionMaster()->MovePoint(POINT_DIVE, alarPoints[POINT_DIVE], FORCED_MOVEMENT_NONE, 0.f, false, true); scheduler.DelayAll(15s); }, 57s); @@ -355,17 +355,7 @@ struct boss_alar : public BossAI void ConstructWaypointsAndMove() { me->StopMoving(); - if (WaypointPath const* i_path = sWaypointMgr->GetPath(me->GetWaypointPath())) - { - Movement::PointsArray pathPoints; - pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); - for (uint8 i = 0; i < i_path->size(); ++i) - { - WaypointData const* node = i_path->at(i); - pathPoints.push_back(G3D::Vector3(node->x, node->y, node->z)); - } - me->GetMotionMaster()->MoveSplinePath(&pathPoints); - } + me->GetMotionMaster()->MovePath(me->GetWaypointPath(), FORCED_MOVEMENT_NONE, PathSource::WAYPOINT_MGR); } void UpdateAI(uint32 diff) override @@ -452,10 +442,10 @@ class spell_alar_flame_quills : public AuraScript // 24 spells in total for (uint8 i = 0; i < 21; ++i) - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_1 + i), GetUnitOwner()->m_Events.CalculateTime(i * 40)); - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 0), GetUnitOwner()->m_Events.CalculateTime(22 * 40)); - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 1), GetUnitOwner()->m_Events.CalculateTime(23 * 40)); - GetUnitOwner()->m_Events.AddEvent(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 2), GetUnitOwner()->m_Events.CalculateTime(24 * 40)); + GetUnitOwner()->m_Events.AddEventAtOffset(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_1 + i), Milliseconds(i * 40)); + GetUnitOwner()->m_Events.AddEventAtOffset(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 0), Milliseconds(22 * 40)); + GetUnitOwner()->m_Events.AddEventAtOffset(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 1), Milliseconds(23 * 40)); + GetUnitOwner()->m_Events.AddEventAtOffset(new CastQuill(GetUnitOwner(), SPELL_QUILL_MISSILE_2 + 2), Milliseconds(24 * 40)); } void Register() override diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 117712e48f..0280250238 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -269,7 +269,7 @@ struct boss_kaelthas : public BossAI void AttackStart(Unit* who) override { - if (_phase == PHASE_FINAL /* check is scheduled&& events.GetNextEventTime(EVENT_GRAVITY_LAPSE_END) == 0*/) + if (_phase == PHASE_FINAL /* check is scheduled&& !events.HasTimeUntilEvent(EVENT_GRAVITY_LAPSE_END)*/) BossAI::AttackStart(who); } @@ -347,7 +347,7 @@ struct boss_kaelthas : public BossAI } else if (point == POINT_AIR) { - me->SetDisableGravity(true, false, false); // updating AnimationTier will break drowning animation later + me->SetDisableGravity(true); // updating AnimationTier will break drowning animation later } else if (point == POINT_START_LAST_PHASE) { @@ -364,11 +364,11 @@ struct boss_kaelthas : public BossAI { DoCastVictim(SPELL_FIREBALL); }, 2400ms, 7500ms); - ScheduleTimedEvent(10000ms, [&] + ScheduleTimedEvent(10s, [&] { DoCastRandomTarget(SPELL_FLAME_STRIKE, 0, 100.0f); }, 30250ms, 50650ms); - ScheduleTimedEvent(50000ms, [&] + ScheduleTimedEvent(50s, [&] { Talk(SAY_SUMMON_PHOENIX); DoCastSelf(SPELL_PHOENIX); @@ -429,7 +429,7 @@ struct boss_kaelthas : public BossAI DoCastSelf(SPELL_KAEL_EXPLODES1, true); DoCastSelf(SPELL_KAEL_GAINING_POWER); }, EVENT_SCENE_2); - ScheduleUniqueTimedEvent(4000ms, [&] + ScheduleUniqueTimedEvent(4s, [&] { me->SetTarget(); for (uint8 i = 0; i < 2; ++i) @@ -440,7 +440,7 @@ struct boss_kaelthas : public BossAI me->GetMotionMaster()->MoveTakeoff(POINT_AIR, me->GetPositionX(), me->GetPositionY(), 75.0f, 2.99, true); // AnimType Movement::ToFly does not exist for Kael DoCastSelf(SPELL_GROW, true); }, EVENT_SCENE_3); - ScheduleUniqueTimedEvent(7000ms, [&] + ScheduleUniqueTimedEvent(7s, [&] { me->SetTarget(); DoCastSelf(SPELL_GROW, true); @@ -450,7 +450,7 @@ struct boss_kaelthas : public BossAI if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i + 2], TEMPSUMMON_TIMED_DESPAWN, 60000)) trigger->CastSpell(me, SPELL_NETHERBEAM1 + i, false); }, EVENT_SCENE_4); - ScheduleUniqueTimedEvent(10000ms, [&] + ScheduleUniqueTimedEvent(10s, [&] { me->SetTarget(); DoCastSelf(SPELL_GROW, true); @@ -460,7 +460,7 @@ struct boss_kaelthas : public BossAI if (Creature* trigger = me->SummonCreature(WORLD_TRIGGER, triggersPos[i + 4], TEMPSUMMON_TIMED_DESPAWN, 60000)) trigger->CastSpell(me, SPELL_NETHERBEAM1 + i, false); }, EVENT_SCENE_5); - ScheduleUniqueTimedEvent(14000ms, [&] + ScheduleUniqueTimedEvent(14s, [&] { DoCastSelf(SPELL_GROW, true); DoCastSelf(SPELL_KAEL_EXPLODES4, true); @@ -470,7 +470,7 @@ struct boss_kaelthas : public BossAI { SetRoomState(GO_STATE_ACTIVE); }, EVENT_SCENE_7); - ScheduleUniqueTimedEvent(19000ms, [&] + ScheduleUniqueTimedEvent(19s, [&] { summons.DespawnEntry(WORLD_TRIGGER); me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA1); @@ -478,7 +478,7 @@ struct boss_kaelthas : public BossAI me->RemoveAurasDueToSpell(SPELL_NETHERBEAM_AURA3); DoCastSelf(SPELL_KAEL_EXPLODES5, true); }, EVENT_SCENE_8); - ScheduleUniqueTimedEvent(22000ms, [&] + ScheduleUniqueTimedEvent(22s, [&] { DoCastSelf(SPELL_DARK_BANISH_STATE, true); DoCastSelf(SPELL_ARCANE_EXPLOSION_VISUAL, true); @@ -528,14 +528,14 @@ struct boss_kaelthas : public BossAI me->CastStop(); DoCastSelf(SPELL_KAEL_FULL_POWER); }, EVENT_SCENE_16); - ScheduleUniqueTimedEvent(32000ms, [&] + ScheduleUniqueTimedEvent(32s, [&] { DoCastSelf(SPELL_KAEL_PHASE_TWO, true); DoCastSelf(SPELL_PURE_NETHER_BEAM4, true); DoCastSelf(SPELL_PURE_NETHER_BEAM5, true); DoCastSelf(SPELL_PURE_NETHER_BEAM6, true); }, EVENT_SCENE_17); - ScheduleUniqueTimedEvent(36000ms, [&] + ScheduleUniqueTimedEvent(36s, [&] { summons.DespawnEntry(WORLD_TRIGGER); me->CastStop(); @@ -559,7 +559,7 @@ struct boss_kaelthas : public BossAI switch (kaelAction) { case ACTION_START_THALADRED: - attackStartTimer = 7000ms; + attackStartTimer = 7s; advisorNPCId = NPC_THALADRED; break; case ACTION_START_SANGUINAR: @@ -567,7 +567,7 @@ struct boss_kaelthas : public BossAI advisorNPCId = NPC_LORD_SANGUINAR; break; case ACTION_START_CAPERNIAN: - attackStartTimer = 9000ms; + attackStartTimer = 9s; advisorNPCId = NPC_CAPERNIAN; break; case ACTION_START_TELONICUS: @@ -655,18 +655,18 @@ struct boss_kaelthas : public BossAI me->AttackStop(); me->CastStop(); me->SetReactState(REACT_PASSIVE); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), true, true); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, me->GetHomePosition(), FORCED_MOVEMENT_NONE, 0.f, true, true); } }); - ScheduleTimedEvent(1000ms, [&] + ScheduleTimedEvent(1s, [&] { DoCastVictim(SPELL_FIREBALL); }, 2400ms, 7500ms); - ScheduleTimedEvent(15000ms, [&] + ScheduleTimedEvent(15s, [&] { DoCastRandomTarget(SPELL_FLAME_STRIKE, 0, 100.0f); }, 30250ms, 50650ms); - ScheduleTimedEvent(50000ms, [&] + ScheduleTimedEvent(50s, [&] { Talk(SAY_SUMMON_PHOENIX); DoCastSelf(SPELL_PHOENIX); @@ -855,7 +855,7 @@ struct npc_capernian : public advisor_baseAI DoCastVictim(SPELL_CAPERNIAN_FIREBALL); } }, 2500ms); - ScheduleTimedEvent(7000ms, 10000ms, [&]{ + ScheduleTimedEvent(7s, 10s, [&]{ DoCastRandomTarget(SPELL_CONFLAGRATION, 0, 30.0f); }, 18500ms, 20500ms); ScheduleTimedEvent(3s, [&]{ @@ -893,16 +893,16 @@ struct npc_thaladred : public advisor_baseAI me->AddThreat(target, 10000000.0f); Talk(EMOTE_THALADRED_FIXATE, target); } - }, 10000ms); - ScheduleTimedEvent(4000ms, 19350ms, [&] + }, 10s); + ScheduleTimedEvent(4s, 19350ms, [&] { DoCastVictim(SPELL_PSYCHIC_BLOW); }, 15700ms, 48900ms); - ScheduleTimedEvent(3000ms, 6050ms, [&] + ScheduleTimedEvent(3s, 6050ms, [&] { DoCastVictim(SPELL_REND); }, 15700ms, 48900ms); - ScheduleTimedEvent(3000ms, 6050ms, [&] + ScheduleTimedEvent(3s, 6050ms, [&] { if (Unit* victim = me->GetVictim()) { @@ -1013,7 +1013,7 @@ class spell_kaelthas_flame_strike : public AuraScript { GetUnitOwner()->RemoveAllAuras(); GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLAME_STRIKE_DAMAGE, true); - GetUnitOwner()->ToCreature()->DespawnOrUnsummon(2000); + GetUnitOwner()->ToCreature()->DespawnOrUnsummon(2s); } void Register() override @@ -1032,7 +1032,7 @@ public: bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override { if (_owner->IsBeingTeleportedNear()) - _owner->m_Events.AddEvent(new lapseTeleport(_owner), _owner->m_Events.CalculateTime(1)); + _owner->m_Events.AddEventAtOffset(new lapseTeleport(_owner), 1ms); else if (!_owner->IsBeingTeleported()) { _owner->CastSpell(_owner, SPELL_GRAVITY_LAPSE_KNOCKBACK, true); @@ -1062,7 +1062,7 @@ class spell_kaelthas_gravity_lapse : public SpellScript if (Player* target = GetHitPlayer()) { GetCaster()->CastSpell(target, _currentSpellId++, true); - target->m_Events.AddEvent(new lapseTeleport(target), target->m_Events.CalculateTime(1)); + target->m_Events.AddEventAtOffset(new lapseTeleport(target), 1ms); } } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index 1aa95aa7d3..8c992b8808 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -97,8 +97,8 @@ public: me->SetReactState(REACT_PASSIVE); me->SetImmuneToAll(true); events2.Reset(); - events2.ScheduleEvent(EVENT_TELEPORT_VISUAL, 0); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO1, 3000); + events2.ScheduleEvent(EVENT_TELEPORT_VISUAL, 0ms); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO1, 3s); } void Reset() override @@ -125,9 +125,9 @@ public: void JustEngagedWith(Unit*) override { - events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000); - events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 2000); + events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1s); + events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30s); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 2s); } void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override @@ -150,52 +150,52 @@ public: break; case EVENT_MILLHOUSE_INTRO1: Talk(SAY_INTRO_1); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO2, 18000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO2, 18s); break; case EVENT_MILLHOUSE_INTRO2: Talk(SAY_INTRO_2); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO3, 8000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO3, 8s); break; case EVENT_MILLHOUSE_INTRO3: Talk(SAY_INTRO_3); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO4, 6000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO4, 6s); break; case EVENT_MILLHOUSE_INTRO4: Talk(SAY_INTRO_4); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO5, 8000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO5, 8s); break; case EVENT_MILLHOUSE_INTRO5: Talk(SAY_WATER); me->CastSpell(me, SPELL_CONJURE_WATER, false); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO6, 7000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO6, 7s); break; case EVENT_MILLHOUSE_INTRO6: Talk(SAY_BUFFS); me->CastSpell(me, SPELL_ICE_ARMOR, false); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO7, 7000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO7, 7s); break; case EVENT_MILLHOUSE_INTRO7: Talk(SAY_DRINK); me->CastSpell(me, SPELL_ARCANE_INTELLECT, false); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO8, 7000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO8, 7s); break; case EVENT_MILLHOUSE_INTRO8: Talk(SAY_READY); me->GetMotionMaster()->MovePoint(1, 445.82f, -158.38f, 43.067f); - events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO9, 5000); + events2.ScheduleEvent(EVENT_MILLHOUSE_INTRO9, 5s); break; case EVENT_MILLHOUSE_INTRO9: me->SetFacingTo(M_PI * 1.5f); me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), M_PI * 1.5f); me->SetImmuneToAll(false); me->SetReactState(REACT_AGGRESSIVE); - events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000); + events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1s); break; case EVENT_SEARCH_FIGHT: if (!me->IsInCombat() && !me->IsInEvadeMode()) if (Unit* target = me->SelectNearbyTarget(nullptr, 30.0f)) AttackStart(target); - events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1000); + events2.ScheduleEvent(EVENT_SEARCH_FIGHT, 1s); break; } @@ -214,27 +214,27 @@ public: Talk(SAY_LOWHP); break; } - events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1000); + events.ScheduleEvent(EVENT_MILL_CHECK_HEALTH, 1s); break; case EVENT_MILL_PYROBLAST: Talk(SAY_PYRO); me->CastSpell(me->GetVictim(), SPELL_PYROBLAST, false); - events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30000); + events.ScheduleEvent(EVENT_MILL_PYROBLAST, 30s); break; case EVENT_MILL_BASE_SPELL: switch (RAND(SPELL_FIREBALL, SPELL_ARCANE_MISSILES, SPELL_FROSTBOLT)) { case SPELL_FIREBALL: me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4s); break; case SPELL_ARCANE_MISSILES: me->CastSpell(me->GetVictim(), SPELL_ARCANE_MISSILES, false); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 9000); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 9s); break; case SPELL_FROSTBOLT: me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, false); - events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4000); + events.ScheduleEvent(EVENT_MILL_BASE_SPELL, 4s); break; default: break; @@ -390,8 +390,8 @@ public: me->setActive(true); me->InterruptNonMeleeSpells(false); me->SetImmuneToAll(true); - events.ScheduleEvent(EVENT_WARDEN_INTRO1, 1500); - events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000); + events.ScheduleEvent(EVENT_WARDEN_INTRO1, 1500ms); + events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1s); instance->SetBossState(DATA_WARDEN_MELLICHAR, IN_PROGRESS); } damage = 0; @@ -410,13 +410,13 @@ public: switch (type) { case DATA_WARDEN_1: - events.ScheduleEvent(EVENT_WARDEN_INTRO8, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO8, 2s); break; case DATA_WARDEN_3: - events.ScheduleEvent(EVENT_WARDEN_INTRO19, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO19, 2s); break; case DATA_WARDEN_4: - events.ScheduleEvent(EVENT_WARDEN_INTRO24, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO24, 2s); break; } } @@ -432,35 +432,35 @@ public: CreatureAI::EnterEvadeMode(); return; } - events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1000); + events.ScheduleEvent(EVENT_WARDEN_CHECK_PLAYERS, 1s); break; case EVENT_WARDEN_INTRO1: Talk(YELL_INTRO1); me->SetFacingTo(M_PI / 2.0f); me->CastSpell(me, SPELL_BUBBLE_VISUAL, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO2, 1400); + events.ScheduleEvent(EVENT_WARDEN_INTRO2, 1400ms); break; case EVENT_WARDEN_INTRO2: instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false); - events.ScheduleEvent(EVENT_WARDEN_INTRO3, 20000); + events.ScheduleEvent(EVENT_WARDEN_INTRO3, 20s); break; case EVENT_WARDEN_INTRO3: Talk(YELL_INTRO2); - events.ScheduleEvent(EVENT_WARDEN_INTRO4, 5000); + events.ScheduleEvent(EVENT_WARDEN_INTRO4, 5s); break; case EVENT_WARDEN_INTRO4: me->SetFacingTo(0.5f); me->CastSpell((Unit*)nullptr, SPELL_TARGET_ALPHA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO5, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO5, 2s); break; case EVENT_WARDEN_INTRO5: instance->SetData(DATA_WARDEN_1, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO6, 3000); + events.ScheduleEvent(EVENT_WARDEN_INTRO6, 3s); break; case EVENT_WARDEN_INTRO6: me->SetFacingTo(M_PI * 1.5f); me->CastSpell((Unit*)nullptr, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO7, 5000); + events.ScheduleEvent(EVENT_WARDEN_INTRO7, 5s); break; case EVENT_WARDEN_INTRO7: me->SummonCreature(RAND(NPC_TRICKSTER, NPC_PH_HUNTER), 478.326f, -148.505f, 42.56f, 3.19f, TEMPSUMMON_MANUAL_DESPAWN); @@ -470,44 +470,44 @@ public: Talk(YELL_RELEASE1); me->InterruptNonMeleeSpells(false); me->SetFacingTo(2.6f); - events.ScheduleEvent(EVENT_WARDEN_INTRO10, 4000); + events.ScheduleEvent(EVENT_WARDEN_INTRO10, 4s); break; case EVENT_WARDEN_INTRO10: me->CastSpell((Unit*)nullptr, SPELL_TARGET_BETA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO11, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO11, 2s); break; case EVENT_WARDEN_INTRO11: Talk(YELL_RELEASE2A); instance->SetData(DATA_WARDEN_2, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO12, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO12, 2s); break; case EVENT_WARDEN_INTRO12: me->SetFacingTo(M_PI * 1.5f); me->CastSpell((Unit*)nullptr, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO13, 6000); + events.ScheduleEvent(EVENT_WARDEN_INTRO13, 6s); break; case EVENT_WARDEN_INTRO13: me->SummonCreature(NPC_MILLHOUSE, 413.292f, -148.378f, 42.56f, 6.27f, TEMPSUMMON_MANUAL_DESPAWN); - events.ScheduleEvent(EVENT_WARDEN_INTRO14, 14000); + events.ScheduleEvent(EVENT_WARDEN_INTRO14, 14s); break; case EVENT_WARDEN_INTRO14: Talk(YELL_RELEASE2B); me->InterruptNonMeleeSpells(false); me->SetFacingTo(3.3f); - events.ScheduleEvent(EVENT_WARDEN_INTRO15, 5000); + events.ScheduleEvent(EVENT_WARDEN_INTRO15, 5s); break; case EVENT_WARDEN_INTRO15: me->CastSpell((Unit*)nullptr, SPELL_TARGET_DELTA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO16, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO16, 2s); break; case EVENT_WARDEN_INTRO16: instance->SetData(DATA_WARDEN_3, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO17, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO17, 2s); break; case EVENT_WARDEN_INTRO17: me->SetFacingTo(M_PI * 1.5f); me->CastSpell((Unit*)nullptr, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO18, 6000); + events.ScheduleEvent(EVENT_WARDEN_INTRO18, 6s); break; case EVENT_WARDEN_INTRO18: me->SummonCreature(RAND(NPC_AKKIRIS, NPC_SULFURON), 420.179f, -174.396f, 42.58f, 0.02f, TEMPSUMMON_MANUAL_DESPAWN); @@ -517,20 +517,20 @@ public: Talk(YELL_RELEASE3); me->InterruptNonMeleeSpells(false); me->SetFacingTo(6.05f); - events.ScheduleEvent(EVENT_WARDEN_INTRO20, 4000); + events.ScheduleEvent(EVENT_WARDEN_INTRO20, 4s); break; case EVENT_WARDEN_INTRO20: me->CastSpell((Unit*)nullptr, SPELL_TARGET_GAMMA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO21, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO21, 2s); break; case EVENT_WARDEN_INTRO21: instance->SetData(DATA_WARDEN_4, IN_PROGRESS); - events.ScheduleEvent(EVENT_WARDEN_INTRO22, 2000); + events.ScheduleEvent(EVENT_WARDEN_INTRO22, 2s); break; case EVENT_WARDEN_INTRO22: me->SetFacingTo(M_PI * 1.5f); me->CastSpell((Unit*)nullptr, SPELL_TARGET_OMEGA, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO23, 6000); + events.ScheduleEvent(EVENT_WARDEN_INTRO23, 6s); break; case EVENT_WARDEN_INTRO23: me->SummonCreature(RAND(NPC_TW_DRAK, NPC_BL_DRAK), 471.795f, -174.58f, 42.58f, 3.06f, TEMPSUMMON_MANUAL_DESPAWN); @@ -540,7 +540,7 @@ public: instance->SetData(DATA_WARDEN_5, IN_PROGRESS); Talk(YELL_RELEASE4); me->InterruptNonMeleeSpells(false); - events.ScheduleEvent(EVENT_WARDEN_INTRO25, 8000); + events.ScheduleEvent(EVENT_WARDEN_INTRO25, 8s); break; case EVENT_WARDEN_INTRO25: if (Creature* cr = me->SummonCreature(NPC_HARBINGER_SKYRISS, 445.763f, -191.639f, 44.64f, 1.60f, TEMPSUMMON_MANUAL_DESPAWN)) @@ -548,22 +548,22 @@ public: cr->SetImmuneToAll(true); cr->CastSpell(cr, SPELL_TELEPORT_VISUAL, true); } - events.ScheduleEvent(EVENT_WARDEN_INTRO26, 1000); + events.ScheduleEvent(EVENT_WARDEN_INTRO26, 1s); break; case EVENT_WARDEN_INTRO26: if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) creature->AI()->Talk(SAY_HARBINGER_INTRO); - events.ScheduleEvent(EVENT_WARDEN_INTRO27, 23000); + events.ScheduleEvent(EVENT_WARDEN_INTRO27, 23s); break; case EVENT_WARDEN_INTRO27: Talk(YELL_WELCOME); - events.ScheduleEvent(EVENT_WARDEN_INTRO28, 5000); + events.ScheduleEvent(EVENT_WARDEN_INTRO28, 5s); break; case EVENT_WARDEN_INTRO28: instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), true); if (Creature* creature = summons.GetCreatureWithEntry(NPC_HARBINGER_SKYRISS)) creature->CastSpell((Unit*)nullptr, SPELL_MIND_REND, false); - events.ScheduleEvent(EVENT_WARDEN_INTRO29, 4000); + events.ScheduleEvent(EVENT_WARDEN_INTRO29, 4s); break; case EVENT_WARDEN_INTRO29: diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp index 799272204e..4d5329ac0b 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp @@ -165,7 +165,7 @@ struct boss_wrath_scryer_soccothrates : public BossAI if (!preFight && who->IsPlayer() && me->IsWithinDistInMap(who, 70.0f)) { Talk(SAY_SOCCOTHRATES_CONVO_1); - events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000); + events2.ScheduleEvent(EVENT_PREFIGHT_1, 2s); preFight = true; } } @@ -178,38 +178,38 @@ struct boss_wrath_scryer_soccothrates : public BossAI case EVENT_PREFIGHT_1: if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); - events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000); + events2.ScheduleEvent(EVENT_PREFIGHT_2, 3s); break; case EVENT_PREFIGHT_2: Talk(SAY_SOCCOTHRATES_CONVO_2); - events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000); + events2.ScheduleEvent(EVENT_PREFIGHT_3, 3s); break; case EVENT_PREFIGHT_3: if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); - events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000); + events2.ScheduleEvent(EVENT_PREFIGHT_4, 6s); break; case EVENT_PREFIGHT_4: Talk(SAY_SOCCOTHRATES_CONVO_3); - events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000); + events2.ScheduleEvent(EVENT_PREFIGHT_5, 2s); break; case EVENT_PREFIGHT_5: if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); - events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000); + events2.ScheduleEvent(EVENT_PREFIGHT_6, 3s); break; case EVENT_PREFIGHT_6: Talk(SAY_SOCCOTHRATES_CONVO_4); - events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000); + events2.ScheduleEvent(EVENT_PREFIGHT_7, 2s); break; case EVENT_PREFIGHT_7: if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); - events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000); + events2.ScheduleEvent(EVENT_PREFIGHT_8, 4s); break; case EVENT_PREFIGHT_8: me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); - events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000); + events2.ScheduleEvent(EVENT_PREFIGHT_9, 4s); break; case EVENT_PREFIGHT_9: if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 16e37a698d..f9f862fd3a 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -98,7 +98,7 @@ public: CannonGUID = caster->GetGUID(); PartyTime = true; - events.ScheduleEvent(EVENT_PARTY_TIMER, 3000); + events.ScheduleEvent(EVENT_PARTY_TIMER, 3s); } if (count >= 3) @@ -116,7 +116,7 @@ public: if (Creature* bunny = GetClosestCreatureWithEntry(me, NPC_EXPLOSION_BUNNY, 200.0f)) bunny->CastSpell(nullptr, SPELL_EXPLOSION, TRIGGERED_NONE); if (Creature* cannon = ObjectAccessor::GetCreature(*me, CannonGUID)) - cannon->DespawnOrUnsummon(5000); + cannon->DespawnOrUnsummon(5s); } me->SummonGameObject(GO_BIG_FIRE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 60); @@ -160,7 +160,7 @@ public: me->SummonCreature(NPC_HOUND, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); else me->SummonCreature(NPC_FEL_IMP, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); - events.ScheduleEvent(EVENT_PARTY_TIMER, 3000); + events.ScheduleEvent(EVENT_PARTY_TIMER, 3s); break; } } @@ -460,7 +460,7 @@ public: Talk(SAY_SPELL_INFLUENCE, who); /// @todo Move the below to updateAI and run if this statement == true DoCast(who, SPELL_DISPELLING_ANALYSIS, true); - bird->DespawnOrUnsummon(2000); + bird->DespawnOrUnsummon(2s); } } } @@ -577,18 +577,18 @@ public: if (!CheckPlayer()) ResetNode(); else - _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000); + _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2s); break; case EVENT_SIMON_SETUP_PRE_GAME: SetUpPreGame(); _events.CancelEvent(EVENT_SIMON_GAME_TICK); - _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1000); + _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1s); break; case EVENT_SIMON_PLAY_SEQUENCE: if (!playableSequence.empty()) { PlayNextColor(); - _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1500); + _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1500ms); } else { @@ -597,16 +597,16 @@ public: playerSequence.clear(); PrepareClusters(); gameTicks = 0; - _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000); + _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3s); } break; case EVENT_SIMON_GAME_TICK: DoCast(SPELL_AUDIBLE_GAME_TICK); if (gameTicks > gameLevel) - _events.ScheduleEvent(EVENT_SIMON_TOO_LONG_TIME, 500); + _events.ScheduleEvent(EVENT_SIMON_TOO_LONG_TIME, 500ms); else - _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000); + _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3s); gameTicks++; break; case EVENT_SIMON_RESET_CLUSTERS: @@ -633,7 +633,7 @@ public: if (gameLevel == 10) ResetNode(); else - _events.ScheduleEvent(EVENT_SIMON_SETUP_PRE_GAME, 1000); + _events.ScheduleEvent(EVENT_SIMON_SETUP_PRE_GAME, 1s); break; case ACTION_SIMON_CORRECT_FULL_SEQUENCE: gameLevel++; @@ -665,12 +665,12 @@ public: PlayColor(pressedColor); playerSequence.push_back(pressedColor); - _events.ScheduleEvent(EVENT_SIMON_RESET_CLUSTERS, 500); + _events.ScheduleEvent(EVENT_SIMON_RESET_CLUSTERS, 500ms); CheckPlayerSequence(); } // Used for getting involved player guid. Parameter id is used for defining if is a large(Monument) or small(Relic) node - void SetGUID(ObjectGuid guid, int32 id) override + void SetGUID(ObjectGuid const& guid, int32 id) override { me->SetCanFly(true); @@ -752,8 +752,8 @@ public: } _events.Reset(); - _events.ScheduleEvent(EVENT_SIMON_ROUND_FINISHED, 1000); - _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000); + _events.ScheduleEvent(EVENT_SIMON_ROUND_FINISHED, 1s); + _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2s); if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) relic->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); @@ -775,7 +775,7 @@ public: if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance)) relic->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } /* @@ -1086,7 +1086,7 @@ public: // Spell 37392 does not exist in dbc, manually spawning me->SummonCreature(NPC_OSCILLATING_FREQUENCY_SCANNER_TOP_BUNNY, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 50000); me->SummonGameObject(GO_OSCILLATING_FREQUENCY_SCANNER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 50); - me->DespawnOrUnsummon(50000); + me->DespawnOrUnsummon(50s); } timer = 500; diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index 66a12acc65..e9457b0e0f 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -171,7 +171,10 @@ public: npc_ancestral_wolfAI(Creature* creature) : npc_escortAI(creature) { if (creature->GetOwner() && creature->GetOwner()->IsPlayer()) - Start(false, false, creature->GetOwner()->GetGUID()); + { + creature->SetWalk(true); + Start(false, creature->GetOwner()->GetGUID()); + } creature->SetSpeed(MOVE_WALK, 1.5f); DoCast(SPELL_GUIDED_BY_THE_SPIRITS); Reset(); @@ -209,7 +212,7 @@ public: { ryga->SetWalk(true); ryga->SetSpeed(MOVE_WALK, 1.0f); - ryga->GetMotionMaster()->MovePoint(0, 515.877991f, 3885.67627f, 190.470535f, true); + ryga->GetMotionMaster()->MovePoint(0, 515.877991f, 3885.67627f, 190.470535f, FORCED_MOVEMENT_NONE, 0.f, true); Reset(); } } @@ -234,7 +237,7 @@ public: ryga->SetStandState(UNIT_STAND_STATE_STAND); ryga->SetWalk(true); ryga->SetSpeed(MOVE_WALK, 1.0f); - ryga->GetMotionMaster()->MovePoint(0, 504.59201f, 3882.12988f, 192.156006f, true); + ryga->GetMotionMaster()->MovePoint(0, 504.59201f, 3882.12988f, 192.156006f, FORCED_MOVEMENT_NONE, 0.f, true); Reset(); } } @@ -312,7 +315,8 @@ public: { me->SetReactState(REACT_AGGRESSIVE); me->SetFaction(FACTION_ESCORTEE_H_PASSIVE); - npc_escortAI::Start(true, false, player->GetGUID()); + me->SetWalk(true); + Start(true, player->GetGUID()); } } diff --git a/src/server/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp index d0c6df3803..5d815569ba 100644 --- a/src/server/scripts/Outland/zone_nagrand.cpp +++ b/src/server/scripts/Outland/zone_nagrand.cpp @@ -65,7 +65,8 @@ public: { creature->SetStandState(UNIT_STAND_STATE_STAND); creature->SetFaction(FACTION_ESCORTEE_H_NEUTRAL_ACTIVE); - EscortAI->Start(true, false, player->GetGUID(), quest); + creature->SetWalk(true); + EscortAI->Start(true, player->GetGUID(), quest); creature->AI()->Talk(SAY_MAG_START); creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0] + 2.5f, m_afAmbushA[1] - 2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); @@ -133,7 +134,7 @@ public: if (Player* player = GetPlayerForEscort()) player->GroupEventHappens(QUEST_TOTEM_KARDASH_H, me); - SetRun(); + me->SetWalk(false); break; } } @@ -303,10 +304,11 @@ public: uint32 HealTimer; uint32 FrostShockTimer; - void SetGUID(ObjectGuid guid, int32 /*questId*/) override + void SetGUID(ObjectGuid const& guid, int32 /*questId*/) override { me->SetStandState(UNIT_STAND_STATE_STAND); - Start(true, false, guid); + me->SetWalk(true); + Start(true, guid); Talk(SAY_KUR_START); me->SummonCreature(NPC_KUR_MURK_RAIDER, kurenaiAmbushA[0] + 2.5f, kurenaiAmbushA[1] - 2.5f, kurenaiAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 50000); @@ -361,7 +363,7 @@ public: if (Player* player = GetPlayerForEscort()) player->GroupEventHappens(QUEST_TOTEM_KARDASH_A, me); - SetRun(); + me->SetWalk(false); break; } } @@ -464,7 +466,7 @@ public: player->KilledMonsterCredit(NPC_MAGHAR_PRISONER); prisoner->AI()->Talk(SAY_FREE, player); - prisoner->DespawnOrUnsummon(6000); + prisoner->DespawnOrUnsummon(6s); } return true; diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp index ceb94b60e5..cc4f68aa24 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -99,11 +99,11 @@ public: npc_escortAI::MoveInLineOfSight(who); } - void SetGUID(ObjectGuid playerGUID, int32 type) override + void SetGUID(ObjectGuid const& playerGUID, int32 type) override { if (type == DATA_START_ENCOUNTER) { - Start(true, true, playerGUID); + Start(true, playerGUID); SetEscortPaused(true); started = true; @@ -126,7 +126,7 @@ public: me->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); Talk(SAY_SAEED_0); - events.ScheduleEvent(EVENT_START_WALK, 3000); + events.ScheduleEvent(EVENT_START_WALK, 3s); } else if (type == DATA_START_FIGHT) { @@ -178,7 +178,7 @@ public: SetEscortPaused(true); break; case 18: - events.ScheduleEvent(EVENT_START_FIGHT1, 0); + events.ScheduleEvent(EVENT_START_FIGHT1, 0ms); SetEscortPaused(true); break; case 19: @@ -227,7 +227,7 @@ public: break; case EVENT_START_FIGHT1: Talk(SAY_SAEED_3); - events.ScheduleEvent(EVENT_START_FIGHT2, 3000); + events.ScheduleEvent(EVENT_START_FIGHT2, 3s); break; case EVENT_START_FIGHT2: if (Creature* dimensius = me->FindNearestCreature(NPC_DIMENSIUS, 50.0f)) @@ -605,7 +605,8 @@ public: creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); creature->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); creature->AI()->Talk(SAY_BESSY_0); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + creature->SetWalk(true); + CAST_AI(npc_escortAI, (creature->AI()))->Start(true, player->GetGUID()); } return true; } @@ -771,7 +772,8 @@ public: if (npc_maxx_a_million_escortAI* pEscortAI = CAST_AI(npc_maxx_a_million_escort::npc_maxx_a_million_escortAI, creature->AI())) { creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_PASSIVE); - pEscortAI->Start(false, false, player->GetGUID()); + creature->SetWalk(true); + pEscortAI->Start(false, player->GetGUID()); } } return true; diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 3e78e17db5..5e31fb4f90 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -133,7 +133,7 @@ public: { ground = me->GetMapHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); SummonInfernal(); - events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, urand(1000, 3000)); + events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 1s, 3s); } void SetData(uint32 id, uint32 data) override @@ -161,7 +161,7 @@ public: if (Unit* infernal = ObjectAccessor::GetUnit(*me, infernalGUID)) if (infernal->GetDisplayId() == MODEL_INVISIBLE) me->CastSpell(infernal, SPELL_SUMMON_INFERNAL, true); - events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 12000); + events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 12s); break; } default: @@ -566,8 +566,8 @@ public: void JustEngagedWith(Unit* /*who*/) override { - events.ScheduleEvent(EVENT_KICK, urand(5000, 10000)); - events.ScheduleEvent(EVENT_SUNDER, urand(5000, 10000)); + events.ScheduleEvent(EVENT_KICK, 5s, 10s); + events.ScheduleEvent(EVENT_SUNDER, 5s, 10s); } void SpellHit(Unit* caster, SpellInfo const* spell) override @@ -582,7 +582,7 @@ public: Tapped = true; caster->GetClosePoint(x, y, z, me->GetObjectSize()); Talk(SAY_1); - events.ScheduleEvent(EVENT_WALK_TO_MUTTON, 0); + events.ScheduleEvent(EVENT_WALK_TO_MUTTON, 0ms); } } @@ -593,7 +593,7 @@ public: if (GameObject* food = me->FindNearestGameObject(DELICIOUS_MUTTON, 5.0f)) me->SetFacingToObject(food); me->HandleEmoteCommand(EMOTE_ONESHOT_EAT); - events.ScheduleEvent(EVENT_POISONED, 5000); + events.ScheduleEvent(EVENT_POISONED, 5s); } } @@ -617,7 +617,7 @@ public: { case EVENT_WALK_TO_MUTTON: me->SetWalk(true); - me->GetMotionMaster()->MovePoint(1, x, y, z, true); + me->GetMotionMaster()->MovePoint(1, x, y, z); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); break; @@ -628,7 +628,7 @@ public: Talk(SAY_POISONED_1); CreditPlayer(); me->CastSpell(me, SPELL_VOMIT); - events.ScheduleEvent(EVENT_KILL, 5000); + events.ScheduleEvent(EVENT_KILL, 5s); break; case EVENT_KILL: Unit::DealDamage(me, me, me->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); @@ -642,11 +642,11 @@ public: case EVENT_KICK: if (me->GetVictim()->HasUnitState(SPELL_STATE_CASTING)) DoCastVictim(SPELL_KICK); - events.RepeatEvent(urand(5000, 10000)); + events.Repeat(5s, 10s); break; case EVENT_SUNDER: DoCastVictim(SPELL_SUNDER); - events.RepeatEvent(urand(5000, 10000)); + events.Repeat(5s, 10s); break; } @@ -1860,22 +1860,22 @@ struct dragonmaw_race_npc : public ScriptedAI switch (me->GetEntry()) { case NPC_MUCKJAW: - me->GetMotionMaster()->MovePath(PATH_MUCKJAW, false); + me->GetMotionMaster()->MoveWaypoint(PATH_MUCKJAW, false); break; case NPC_TROPE: - me->GetMotionMaster()->MovePath(PATH_TROPE, false); + me->GetMotionMaster()->MoveWaypoint(PATH_TROPE, false); break; case NPC_CORLOK: - me->GetMotionMaster()->MovePath(PATH_CORLOK, false); + me->GetMotionMaster()->MoveWaypoint(PATH_CORLOK, false); break; case NPC_ICHMAN: - me->GetMotionMaster()->MovePath(PATH_ICHMAN, false); + me->GetMotionMaster()->MoveWaypoint(PATH_ICHMAN, false); break; case NPC_MULVERICK: - me->GetMotionMaster()->MovePath(PATH_MULVERICK, false); + me->GetMotionMaster()->MoveWaypoint(PATH_MULVERICK, false); break; case NPC_SKYSHATTER: - me->GetMotionMaster()->MovePath(PATH_SKYSHATTER, false); + me->GetMotionMaster()->MoveWaypoint(PATH_SKYSHATTER, false); break; default: break; diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp index 29382d6ae4..d4e29509d5 100644 --- a/src/server/scripts/Outland/zone_shattrath_city.cpp +++ b/src/server/scripts/Outland/zone_shattrath_city.cpp @@ -246,7 +246,10 @@ public: Player* player = summoner->ToPlayer(); if (player && player->GetQuestStatus(10211) == QUEST_STATUS_INCOMPLETE) - Start(false, false, summoner->GetGUID()); + { + me->SetWalk(true); + Start(false, summoner->GetGUID()); + } } void Reset() override { } diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index ffbed2ade5..38cb0214b1 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -433,9 +433,9 @@ public: void JustEngagedWith(Unit*) override { events.Reset(); - events.ScheduleEvent(EVENT_SPELL_WRATH, 0); - events.ScheduleEvent(EVENT_SPELL_MOONFIRE, 4000); - events.ScheduleEvent(EVENT_SPELL_ENTANGLING_ROOTS, 10000); + events.ScheduleEvent(EVENT_SPELL_WRATH, 0ms); + events.ScheduleEvent(EVENT_SPELL_MOONFIRE, 4s); + events.ScheduleEvent(EVENT_SPELL_ENTANGLING_ROOTS, 10s); } void UpdateEscortAI(uint32 diff) override @@ -451,15 +451,15 @@ public: { case EVENT_SPELL_WRATH: me->CastSpell(me->GetVictim(), SPELL_WRATH, false); - events.ScheduleEvent(EVENT_SPELL_WRATH, 3000); + events.ScheduleEvent(EVENT_SPELL_WRATH, 3s); break; case EVENT_SPELL_MOONFIRE: me->CastSpell(me->GetVictim(), SPELL_MOONFIRE, false); - events.ScheduleEvent(EVENT_SPELL_MOONFIRE, 12000); + events.ScheduleEvent(EVENT_SPELL_MOONFIRE, 12s); break; case EVENT_SPELL_ENTANGLING_ROOTS: me->CastSpell(me->GetVictim(), SPELL_ENTANGLING_ROOTS, false); - events.ScheduleEvent(EVENT_SPELL_ENTANGLING_ROOTS, 20000); + events.ScheduleEvent(EVENT_SPELL_ENTANGLING_ROOTS, 20s); break; } @@ -473,7 +473,8 @@ public: { if (quest->GetQuestId() == QUEST_EFTW_H || quest->GetQuestId() == QUEST_EFTW_A) { - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + creature->SetWalk(true); + CAST_AI(npc_escortAI, (creature->AI()))->Start(true, player->GetGUID()); creature->SetFaction(FACTION_ESCORTEE_N_NEUTRAL_ACTIVE); } return true; diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index 6e91d2a19a..8af8b89abc 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -49,7 +49,7 @@ struct npc_pet_gen_soul_trader_beacon : public ScriptedAI npc_pet_gen_soul_trader_beacon(Creature* c) : ScriptedAI(c) { events.Reset(); - events.ScheduleEvent(EVENT_INITIAL_TALK, 0); + events.ScheduleEvent(EVENT_INITIAL_TALK, 0ms); if (me->ToTempSummon()) if (Unit* owner = me->ToTempSummon()->GetOwner()) { @@ -65,7 +65,7 @@ struct npc_pet_gen_soul_trader_beacon : public ScriptedAI if (spellInfo->Id == SPELL_STEAL_ESSENCE_VISUAL && target == me) { Talk(1); - events.ScheduleEvent(EVENT_ADD_TOKEN, 3000); + events.ScheduleEvent(EVENT_ADD_TOKEN, 3s); me->CastSpell(me, SPELL_EMOTE_STATE_SWIM_RUN, true); } } @@ -160,7 +160,7 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI if (Unit* owner = me->GetCharmerOrOwner()) { me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, MINI_PET_FOLLOW_ANGLE, MOTION_SLOT_ACTIVE); } } @@ -193,7 +193,7 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI duration = cooldown; aura = SPELL_AURA_POSTMAN_S + i; _state = argentPonyService[TEAM_ALLIANCE][i]; - me->ToTempSummon()->UnSummon(duration); + me->ToTempSummon()->UnSummon(Milliseconds(duration)); break; } } @@ -204,7 +204,7 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI duration = cooldown * IN_MILLISECONDS; aura = SPELL_AURA_BANK_G + i; _state = argentPonyService[TEAM_HORDE][i]; - me->ToTempSummon()->UnSummon(duration); + me->ToTempSummon()->UnSummon(Milliseconds(duration)); break; } } @@ -327,7 +327,7 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI creature->CastSpell(creature, spellId, true); player->AddSpellCooldown(spellId, 0, 3 * MINUTE * IN_MILLISECONDS); player->AddSpellCooldown(player->GetTeamId(true) ? SPELL_AURA_TIRED_G : SPELL_AURA_TIRED_S, 0, 3 * MINUTE * IN_MILLISECONDS + 4 * HOUR * IN_MILLISECONDS); - creature->DespawnOrUnsummon(3 * MINUTE * IN_MILLISECONDS); + creature->DespawnOrUnsummon(180s); } return true; } @@ -388,7 +388,7 @@ struct npc_pet_gen_target_following_bomb : public NullCreatureAI if (me->GetDistance(target) < 3.0f) { me->CastSpell(me, bombSpellId, false); - me->DespawnOrUnsummon(500); + me->DespawnOrUnsummon(500ms); } } else if (!me->HasUnitState(UNIT_STATE_FOLLOW)) @@ -557,7 +557,7 @@ struct npc_pet_gen_imp_in_a_bottle : public NullCreatureAI if (_talkTimer >= 5000) { _talkTimer = 0; - me->DespawnOrUnsummon(1); + me->DespawnOrUnsummon(1ms); if (!_hasParty) Talk(0, ObjectAccessor::GetPlayer(*me, _ownerGUID)); else if (Player* player = ObjectAccessor::GetPlayer(*me, _ownerGUID)) @@ -567,9 +567,9 @@ struct npc_pet_gen_imp_in_a_bottle : public NullCreatureAI for (GroupReference* itr = player->GetGroup()->GetFirstMember(); itr != nullptr && limit < 4; itr = itr->next(), ++limit) if (Player* groupPlayer = itr->GetSource()) if (groupPlayer != player) - groupPlayer->GetSession()->SendPacket(&_data); + groupPlayer->SendDirectMessage(&_data); - player->GetSession()->SendPacket(&_data); + player->SendDirectMessage(&_data); } } } @@ -709,7 +709,7 @@ struct npc_pet_gen_toxic_wasteling : public PassiveAI if (Unit* owner = me->GetCharmerOrOwner()) { me->GetMotionMaster()->Clear(false); - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE); + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, MINI_PET_FOLLOW_ANGLE, MOTION_SLOT_ACTIVE); } me->AddAura(71854, me); // Growth checkTimer = 0; diff --git a/src/server/scripts/Pet/pet_mage.cpp b/src/server/scripts/Pet/pet_mage.cpp index 72ab586eca..9f3d40c3bb 100644 --- a/src/server/scripts/Pet/pet_mage.cpp +++ b/src/server/scripts/Pet/pet_mage.cpp @@ -62,10 +62,18 @@ struct npc_pet_mage_mirror_image : CasterAI ObjectGuid _ebonGargoyleGUID; uint32 checktarget; uint32 dist = urand(1, 5); + bool _delayAttack; void InitializeAI() override { CasterAI::InitializeAI(); + + _delayAttack = true; + me->m_Events.AddEventAtOffset([this]() + { + _delayAttack = false; + }, 1200ms); + Unit* owner = me->GetOwner(); if (!owner) return; @@ -130,7 +138,7 @@ struct npc_pet_mage_mirror_image : CasterAI newAura->SetDuration(visAura->GetDuration()); } - me->m_Events.AddEvent(new DeathEvent(*me), me->m_Events.CalculateTime(29500)); + me->m_Events.AddEventAtOffset(new DeathEvent(*me), 29500ms); } // Do not reload Creature templates on evade mode enter - prevent visual lost @@ -185,10 +193,11 @@ struct npc_pet_mage_mirror_image : CasterAI void UpdateAI(uint32 diff) override { - events.Update(diff); - if (events.GetTimer() < 1200) + if (_delayAttack) return; + events.Update(diff); + if (!me->IsInCombat() || !me->GetVictim()) { MySelectNextTarget(); @@ -212,7 +221,7 @@ struct npc_pet_mage_mirror_image : CasterAI if (uint32 spellId = events.ExecuteEvent()) { - events.RescheduleEvent(spellId, spellId == 59637 ? 6500 : 2500); + events.RescheduleEvent(spellId, spellId == 59637 ? 6500ms : 2500ms); me->CastSpell(me->GetVictim(), spellId, false); } } diff --git a/src/server/scripts/Pet/pet_shaman.cpp b/src/server/scripts/Pet/pet_shaman.cpp index d5266ea04e..286571a82c 100644 --- a/src/server/scripts/Pet/pet_shaman.cpp +++ b/src/server/scripts/Pet/pet_shaman.cpp @@ -49,7 +49,7 @@ struct npc_pet_shaman_earth_elemental : public ScriptedAI void JustEngagedWith(Unit*) override { _events.Reset(); - _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, 0); + _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, 0ms); } void InitializeAI() override { } @@ -74,7 +74,7 @@ struct npc_pet_shaman_earth_elemental : public ScriptedAI if (_events.ExecuteEvent() == EVENT_SHAMAN_ANGEREDEARTH) { DoCastVictim(SPELL_SHAMAN_ANGEREDEARTH); - _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, urand(5000, 20000)); + _events.ScheduleEvent(EVENT_SHAMAN_ANGEREDEARTH, 5s, 20s); } DoMeleeAttackIfReady(); @@ -94,9 +94,9 @@ struct npc_pet_shaman_fire_elemental : public ScriptedAI void JustEngagedWith(Unit*) override { _events.Reset(); - _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, urand(5000, 20000)); - _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, urand(5000, 20000)); - //_events.ScheduleEvent(EVENT_SHAMAN_FIRESHIELD, 0); + _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, 5s, 20s); + _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, 5s, 20s); + //_events.ScheduleEvent(EVENT_SHAMAN_FIRESHIELD, 0ms); me->RemoveAurasDueToSpell(SPELL_SHAMAN_FIRESHIELD); me->CastSpell(me, SPELL_SHAMAN_FIRESHIELD, true); @@ -124,11 +124,11 @@ struct npc_pet_shaman_fire_elemental : public ScriptedAI { case EVENT_SHAMAN_FIRENOVA: me->CastSpell(me, SPELL_SHAMAN_FIRENOVA, false); - _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, urand(8000, 15000)); + _events.ScheduleEvent(EVENT_SHAMAN_FIRENOVA, 8s, 15s); break; case EVENT_SHAMAN_FIREBLAST: me->CastSpell(me->GetVictim(), SPELL_SHAMAN_FIREBLAST, false); - _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, urand(4000, 8000)); + _events.ScheduleEvent(EVENT_SHAMAN_FIREBLAST, 4s, 8s); break; default: break; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 5b1d646acc..1d888d3e8a 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1970,7 +1970,7 @@ class spell_pvp_trinket_wotf_shared_cd : public SpellScript { WorldPacket data; player->BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_INCLUDE_GCD, 7744, GetSpellInfo()->CategoryRecoveryTime); // Will of the forsaken - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); } else { @@ -1983,11 +1983,11 @@ class spell_pvp_trinket_wotf_shared_cd : public SpellScript data << uint16(GetSpellInfo()->GetCategory()); // spell category data << uint32(0); data << uint32(GetSpellInfo()->CategoryRecoveryTime); - player->GetSession()->SendPacket(&data); + player->SendDirectMessage(&data); WorldPacket data2; player->BuildCooldownPacket(data2, SPELL_COOLDOWN_FLAG_INCLUDE_GCD, SPELL_PVP_TRINKET, GetSpellInfo()->CategoryRecoveryTime); // PvP Trinket spell - player->GetSession()->SendPacket(&data2); + player->SendDirectMessage(&data2); } } } @@ -2650,7 +2650,7 @@ class spell_gen_spirit_healer_res : public SpellScript { WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8); data << target->GetGUID(); - originalCaster->GetSession()->SendPacket(&data); + originalCaster->SendDirectMessage(&data); } } @@ -3706,7 +3706,7 @@ class spell_gen_despawn_self : public SpellScript void HandleDummy(SpellEffIndex effIndex) { if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT) - GetCaster()->ToCreature()->DespawnOrUnsummon(1); + GetCaster()->ToCreature()->DespawnOrUnsummon(1ms); } void Register() override @@ -5528,6 +5528,148 @@ class spell_gen_food_heart_emote : public AuraScript } }; +// 456 - SHOWLABEL Only OFF +class spell_gen_showlabel_off : public SpellScript +{ + PrepareSpellScript(spell_gen_showlabel_off) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + player->SetGMChat(false); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_showlabel_off::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 2765 - SHOWLABEL Only ON +class spell_gen_showlabel_on : public SpellScript +{ + PrepareSpellScript(spell_gen_showlabel_on) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + player->SetGMChat(true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_showlabel_on::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 1509 - GM Only OFF +class spell_gen_gm_off : public SpellScript +{ + PrepareSpellScript(spell_gen_gm_off) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + { + player->SetGameMaster(false); + player->UpdateTriggerVisibility(); + } + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_gm_off::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 18139 - GM Only ON +class spell_gen_gm_on : public SpellScript +{ + PrepareSpellScript(spell_gen_gm_on) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + { + player->SetGameMaster(true); + player->UpdateTriggerVisibility(); + } + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_gm_on::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 6147 - INVIS Only OFF +class spell_gen_invis_off : public SpellScript +{ + PrepareSpellScript(spell_gen_invis_off) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + player->SetGMVisible(true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_invis_off::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 2763 - INVIS Only ON +class spell_gen_invis_on : public SpellScript +{ + PrepareSpellScript(spell_gen_invis_on) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + player->SetGMVisible(false); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_invis_on::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 20114, 24675 - BM Only OFF +class spell_gen_bm_off : public SpellScript +{ + PrepareSpellScript(spell_gen_bm_off) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + player->SetBeastMaster(false); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_bm_off::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 20115, 24676 - BM Only ON +class spell_gen_bm_on : public SpellScript +{ + PrepareSpellScript(spell_gen_bm_on) + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Player* player = GetCaster()->ToPlayer()) + player->SetBeastMaster(true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_gen_bm_on::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + void AddSC_generic_spell_scripts() { RegisterSpellScript(spell_silithyst); @@ -5693,4 +5835,12 @@ void AddSC_generic_spell_scripts() RegisterSpellScriptWithArgs(spell_gen_translocate, "spell_gen_translocate_up", SPELL_TRANSLOCATION_UP); RegisterSpellScript(spell_gen_cooldown_all); RegisterSpellScript(spell_gen_food_heart_emote); + RegisterSpellScript(spell_gen_showlabel_off); + RegisterSpellScript(spell_gen_showlabel_on); + RegisterSpellScript(spell_gen_gm_off); + RegisterSpellScript(spell_gen_gm_on); + RegisterSpellScript(spell_gen_invis_off); + RegisterSpellScript(spell_gen_invis_on); + RegisterSpellScript(spell_gen_bm_on); + RegisterSpellScript(spell_gen_bm_off); } diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index d3325403ad..8ec480ca06 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -302,7 +302,7 @@ class spell_hun_taming_the_beast : public AuraScript { if (Unit* target = GetTarget()) if (Creature* creature = target->ToCreature()) - creature->DespawnOrUnsummon(1); + creature->DespawnOrUnsummon(1ms); } void Register() override diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 29269f5379..25c46b9d56 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -347,7 +347,7 @@ class spell_item_rocket_chicken : public AuraScript { if (roll_chance_i(5)) { - GetTarget()->ToCreature()->DespawnOrUnsummon(8000); + GetTarget()->ToCreature()->DespawnOrUnsummon(8s); GetTarget()->Kill(GetTarget(), GetTarget()); } else if (roll_chance_i(50)) @@ -468,7 +468,7 @@ class spell_item_toxic_wasteling : public SpellScript GetCaster()->GetMotionMaster()->MoveIdle(); GetCaster()->ToCreature()->SetHomePosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f); GetCaster()->GetMotionMaster()->MoveJump(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 12.0f, 3.0f, 1); - target->DespawnOrUnsummon(1500); + target->DespawnOrUnsummon(1500ms); } } @@ -505,7 +505,7 @@ class spell_item_lil_xt : public SpellScript return; if (GetCaster()->IsCreature() && GetCaster()->ToCreature()->AI()) GetCaster()->ToCreature()->AI()->Talk(2); - target->DespawnOrUnsummon(500); + target->DespawnOrUnsummon(500ms); } void Register() override @@ -1083,7 +1083,7 @@ class spell_item_enchanted_broom_periodic : public AuraScript { if (owner->isMoving()) { - GetTarget()->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, GetTarget()->GetFollowAngle(), MOTION_SLOT_ACTIVE); + GetTarget()->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, MINI_PET_FOLLOW_ANGLE, MOTION_SLOT_ACTIVE); } else { @@ -1206,27 +1206,38 @@ class spell_item_direbrew_remote_aura : public AuraScript } }; -enum EyeOfGruul +enum HealingTrance { - SPELL_DRUID_ITEM_HEALING_TRANCE = 37721, - SPELL_PALADIN_ITEM_HEALING_TRANCE = 37723, - SPELL_PRIEST_ITEM_HEALING_TRANCE = 37706, - SPELL_SHAMAN_ITEM_HEALING_TRANCE = 37722 + SPELL_HEALING_DISCOUNT = 37705, + SPELL_SOUL_PRESERVER = 60510, + SPELL_PRIEST_EYE_OF_GRUUL_HEALING_TRANCE = 37706, + SPELL_DRUID_EYE_OF_GRUUL_HEALING_TRANCE = 37721, + SPELL_SHAMAN_EYE_OF_GRUUL_HEALING_TRANCE = 37722, + SPELL_PALADIN_EYE_OF_GRUUL_HEALING_TRANCE = 37723, + SPELL_DRUID_SOUL_PRESERVER_HEALING_TRANCE = 60512, + SPELL_PALADIN_SOUL_PRESERVER_HEALING_TRANCE = 60513, + SPELL_PRIEST_SOUL_PRESERVER_HEALING_TRANCE = 60514, + SPELL_SHAMAN_SOUL_PRESERVER_HEALING_TRANCE = 60515, }; // 37705 - Healing Discount -class spell_item_eye_of_gruul_healing_discount : public AuraScript +// 60510 - Soul Preserver +class spell_item_healing_trance : public AuraScript { - PrepareAuraScript(spell_item_eye_of_gruul_healing_discount); + PrepareAuraScript(spell_item_healing_trance); bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo( { - SPELL_DRUID_ITEM_HEALING_TRANCE, - SPELL_PALADIN_ITEM_HEALING_TRANCE, - SPELL_PRIEST_ITEM_HEALING_TRANCE, - SPELL_SHAMAN_ITEM_HEALING_TRANCE + SPELL_PRIEST_EYE_OF_GRUUL_HEALING_TRANCE, + SPELL_DRUID_EYE_OF_GRUUL_HEALING_TRANCE, + SPELL_SHAMAN_EYE_OF_GRUUL_HEALING_TRANCE, + SPELL_PALADIN_EYE_OF_GRUUL_HEALING_TRANCE, + SPELL_DRUID_SOUL_PRESERVER_HEALING_TRANCE, + SPELL_PALADIN_SOUL_PRESERVER_HEALING_TRANCE, + SPELL_PRIEST_SOUL_PRESERVER_HEALING_TRANCE, + SPELL_SHAMAN_SOUL_PRESERVER_HEALING_TRANCE, }); } @@ -1235,32 +1246,57 @@ class spell_item_eye_of_gruul_healing_discount : public AuraScript PreventDefaultAction(); if (Unit* unitTarget = GetTarget()) { - uint32 spell_id = 0; - switch (unitTarget->getClass()) + uint32 const itemSpell = GetSpellInfo()->Id; + uint32 spellId = 0; + + if (itemSpell == SPELL_HEALING_DISCOUNT) + { + switch (unitTarget->getClass()) + { + case CLASS_DRUID: + spellId = SPELL_DRUID_EYE_OF_GRUUL_HEALING_TRANCE; + break; + case CLASS_PALADIN: + spellId = SPELL_PALADIN_EYE_OF_GRUUL_HEALING_TRANCE; + break; + case CLASS_PRIEST: + spellId = SPELL_PRIEST_EYE_OF_GRUUL_HEALING_TRANCE; + break; + case CLASS_SHAMAN: + spellId = SPELL_SHAMAN_EYE_OF_GRUUL_HEALING_TRANCE; + break; + default: + return; // ignore for non-healing classes + } + } + else if (itemSpell == SPELL_SOUL_PRESERVER) { + switch (unitTarget->getClass()) + { case CLASS_DRUID: - spell_id = SPELL_DRUID_ITEM_HEALING_TRANCE; + spellId = SPELL_DRUID_SOUL_PRESERVER_HEALING_TRANCE; break; case CLASS_PALADIN: - spell_id = SPELL_PALADIN_ITEM_HEALING_TRANCE; + spellId = SPELL_PALADIN_SOUL_PRESERVER_HEALING_TRANCE; break; case CLASS_PRIEST: - spell_id = SPELL_PRIEST_ITEM_HEALING_TRANCE; + spellId = SPELL_PRIEST_SOUL_PRESERVER_HEALING_TRANCE; break; case CLASS_SHAMAN: - spell_id = SPELL_SHAMAN_ITEM_HEALING_TRANCE; + spellId = SPELL_SHAMAN_SOUL_PRESERVER_HEALING_TRANCE; break; default: return; // ignore for non-healing classes + } } - unitTarget->CastSpell(unitTarget, spell_id, true, nullptr, aurEff); + unitTarget->CastSpell(unitTarget, spellId, true, nullptr, aurEff); } } void Register() override { - OnEffectProc += AuraEffectProcFn(spell_item_eye_of_gruul_healing_discount::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + OnEffectProc += AuraEffectProcFn(spell_item_healing_trance::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; @@ -1467,16 +1503,20 @@ class spell_item_blessing_of_ancient_kings : public AuraScript HealInfo* healInfo = eventInfo.GetHealInfo(); if (!healInfo) - { return; - } int32 absorb = int32(CalculatePct(healInfo->GetHeal(), 15.0f)); // xinef: all heals contribute to one bubble if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0/*, eventInfo.GetActor()->GetGUID()*/)) { - // The shield can grow to a maximum size of 20,000 damage absorbtion - protEff->SetAmount(std::min<int32>(protEff->GetAmount() + absorb, 20000)); + // The shield is supposed to cap out at 20,000 absorption... + absorb += protEff->GetAmount(); + + // ...but Blizz wrote this instead. See #23152 for details + if (absorb > 20000) + absorb = 200000; + + protEff->SetAmount(absorb); // Refresh and return to prevent replacing the aura protEff->GetBase()->RefreshDuration(); @@ -1629,7 +1669,7 @@ public: _player->HandleEmoteCommand(RAND(EMOTE_ONESHOT_APPLAUD, EMOTE_ONESHOT_DANCESPECIAL, EMOTE_ONESHOT_LAUGH, EMOTE_ONESHOT_CHEER, EMOTE_ONESHOT_CHICKEN)); } - _player->m_Events.AddEvent(this, RAND(_player->m_Events.CalculateTime(5000), _player->m_Events.CalculateTime(10000), _player->m_Events.CalculateTime(15000))); + _player->m_Events.AddEventAtOffset(this, RAND(5s, 10s, 15s)); return false; // do not delete re-added event in EventProcessor::Update } @@ -1650,7 +1690,7 @@ class spell_item_party_time : public AuraScript return; } - player->m_Events.AddEvent(new PartyTimeEmoteEvent(player), RAND(player->m_Events.CalculateTime(5000), player->m_Events.CalculateTime(10000), player->m_Events.CalculateTime(15000))); + player->m_Events.AddEventAtOffset(new PartyTimeEmoteEvent(player), RAND(5s, 10s, 15s)); } void Register() override @@ -4292,7 +4332,7 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_summon_or_dismiss); RegisterSpellScript(spell_item_draenic_pale_ale); RegisterSpellAndAuraScriptPair(spell_item_direbrew_remote, spell_item_direbrew_remote_aura); - RegisterSpellScript(spell_item_eye_of_gruul_healing_discount); + RegisterSpellScript(spell_item_healing_trance); RegisterSpellScript(spell_item_summon_argent_knight); RegisterSpellScript(spell_item_instant_statue); // 23074 Arcanite Dragonling diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 127bd957aa..9020cb9918 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -68,7 +68,7 @@ class spell_q11065_wrangle_some_aether_rays_aura : public AuraScript { cr->CastSpell(player, 40926, true); cr->GetMotionMaster()->MoveFollow(player, 5.0f, 2 * M_PI * rand_norm()); - ar->ToCreature()->DespawnOrUnsummon(500); + ar->ToCreature()->DespawnOrUnsummon(500ms); } } } @@ -756,10 +756,10 @@ private: uint32 _originalEntry; uint32 _newEntry; bool _shouldAttack; - uint32 _despawnTime; + Milliseconds _despawnTime; public: - spell_generic_quest_update_entry_SpellScript(uint16 spellEffect, uint8 effIndex, uint32 originalEntry, uint32 newEntry, bool shouldAttack, uint32 despawnTime = 0) : + spell_generic_quest_update_entry_SpellScript(uint16 spellEffect, uint8 effIndex, uint32 originalEntry, uint32 newEntry, bool shouldAttack, Milliseconds despawnTime = 0ms) : SpellScript(), _spellEffect(spellEffect), _effIndex(effIndex), _originalEntry(originalEntry), _newEntry(newEntry), _shouldAttack(shouldAttack), _despawnTime(despawnTime) { } @@ -772,7 +772,7 @@ public: if (_shouldAttack && creatureTarget->IsAIEnabled) creatureTarget->AI()->AttackStart(GetCaster()); - if (_despawnTime) + if (_despawnTime > 0ms) creatureTarget->DespawnOrUnsummon(_despawnTime); } } @@ -900,10 +900,11 @@ enum Quests6124_6129Data NPC_SICKLY_GAZELLE = 12296, NPC_CURED_GAZELLE = 12297, NPC_SICKLY_DEER = 12298, - NPC_CURED_DEER = 12299, - DESPAWN_TIME = 30000 + NPC_CURED_DEER = 12299 }; +constexpr Milliseconds DESPAWN_TIME = 30s; + class spell_q6124_6129_apply_salve : public SpellScript { PrepareSpellScript(spell_q6124_6129_apply_salve); @@ -1364,12 +1365,15 @@ class spell_q12937_relief_for_the_fallen : public AuraScript void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { + if (!GetCaster() || !GetCaster()->IsPlayer()) + return; + Player* caster = GetCaster()->ToPlayer(); Unit* target = GetUnitOwner(); if (target && target->ToCreature()) { caster->KilledMonsterCredit(NPC_FALLEN_EARTHEN_DEFENDER); - target->ToCreature()->DespawnOrUnsummon(5000); + target->ToCreature()->DespawnOrUnsummon(5s); target->SetStandState(UNIT_STAND_STATE_STAND); target->ToCreature()->AI()->Talk(TALK_FALLEN_EARTHEN_HEALED); @@ -1510,7 +1514,7 @@ class spell_q9874_liquid_fire : public SpellScript { caster->KilledMonsterCredit(NPC_VILLAGER_KILL_CREDIT); target->CastSpell(target, SPELL_FLAMES, true); - target->DespawnOrUnsummon(20000); + target->DespawnOrUnsummon(20s); } } @@ -1557,7 +1561,7 @@ class spell_q12805_lifeblood_dummy : public SpellScript caster->KilledMonsterCredit(NPC_SHARD_KILL_CREDIT); target->CastSpell(target, uint32(GetEffectValue()), true); - target->DespawnOrUnsummon(2000); + target->DespawnOrUnsummon(2s); } void Register() override @@ -2141,7 +2145,7 @@ class spell_q12690_burst_at_the_seams : public SpellScript void HandleScript(SpellEffIndex /*effIndex*/) { - GetCaster()->ToCreature()->DespawnOrUnsummon(2 * IN_MILLISECONDS); + GetCaster()->ToCreature()->DespawnOrUnsummon(2s); } void Register() override diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 814871ee1d..6caf5982d2 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -105,9 +105,9 @@ struct emerald_dragonAI : public WorldBossAI me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); me->SetReactState(REACT_AGGRESSIVE); DoCast(me, SPELL_MARK_OF_NATURE_AURA, true); - events.ScheduleEvent(EVENT_TAIL_SWEEP, 4000); - events.ScheduleEvent(EVENT_NOXIOUS_BREATH, urand(7500, 15000)); - events.ScheduleEvent(EVENT_SEEPING_FOG, urand(12500, 20000)); + events.ScheduleEvent(EVENT_TAIL_SWEEP, 4s); + events.ScheduleEvent(EVENT_NOXIOUS_BREATH, 7500ms, 15s); + events.ScheduleEvent(EVENT_SEEPING_FOG, 12500ms, 20s); events.ScheduleEvent(EVENT_SUMMON_PLAYER, 1s); } @@ -128,17 +128,17 @@ struct emerald_dragonAI : public WorldBossAI // Despawntime is 2 minutes, so reschedule it for new cast after 2 minutes + a minor "random time" (30 seconds at max) DoCast(me, SPELL_SEEPING_FOG_LEFT, true); DoCast(me, SPELL_SEEPING_FOG_RIGHT, true); - events.ScheduleEvent(EVENT_SEEPING_FOG, urand(120000, 150000)); + events.ScheduleEvent(EVENT_SEEPING_FOG, 120s, 150s); break; case EVENT_NOXIOUS_BREATH: // Noxious Breath is cast on random intervals, no less than 7.5 seconds between DoCast(me, SPELL_NOXIOUS_BREATH); - events.ScheduleEvent(EVENT_NOXIOUS_BREATH, urand(7500, 15000)); + events.ScheduleEvent(EVENT_NOXIOUS_BREATH, 7500ms, 15s); break; case EVENT_TAIL_SWEEP: // Tail Sweep is cast every two seconds, no matter what goes on in front of the dragon DoCast(me, SPELL_TAIL_SWEEP); - events.ScheduleEvent(EVENT_TAIL_SWEEP, 2000); + events.ScheduleEvent(EVENT_TAIL_SWEEP, 2s); break; case EVENT_SUMMON_PLAYER: if (Unit* target = me->GetVictim()) @@ -219,7 +219,7 @@ public: }); } - void SetGUID(ObjectGuid guid, int32 type) override + void SetGUID(ObjectGuid const& guid, int32 type) override { if (type == GUID_DRAGON) { @@ -304,7 +304,7 @@ public: { _stage = 1; emerald_dragonAI::Reset(); - events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 12000); + events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 12s); } void JustEngagedWith(Unit* who) override @@ -344,7 +344,7 @@ public: { case EVENT_LIGHTNING_WAVE: DoCastVictim(SPELL_LIGHTNING_WAVE); - events.ScheduleEvent(EVENT_LIGHTNING_WAVE, urand(10000, 20000)); + events.ScheduleEvent(EVENT_LIGHTNING_WAVE, 10s, 20s); break; default: emerald_dragonAI::ExecuteEvent(eventId); @@ -476,7 +476,7 @@ public: if (moveType == FOLLOW_MOTION_TYPE && data == _summonerGuid.GetCounter()) { me->CastSpell((Unit*)nullptr, SPELL_DARK_OFFERING, false); - me->DespawnOrUnsummon(1000); + me->DespawnOrUnsummon(1s); } } @@ -524,7 +524,7 @@ public: { _stage = 1; emerald_dragonAI::Reset(); - events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 12000); + events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 12s); } void KilledUnit(Unit* who) override @@ -559,7 +559,7 @@ public: { case EVENT_VOLATILE_INFECTION: DoCastVictim(SPELL_VOLATILE_INFECTION); - events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 120000); + events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 120s); break; default: emerald_dragonAI::ExecuteEvent(eventId); @@ -624,8 +624,8 @@ public: _banishedTimer = 0; emerald_dragonAI::Reset(); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 12000); - events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 12s); + events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30s); } void JustEngagedWith(Unit* who) override @@ -671,11 +671,11 @@ public: { case EVENT_ARCANE_BLAST: DoCast(SPELL_ARCANE_BLAST); - events.ScheduleEvent(EVENT_ARCANE_BLAST, urand(7000, 12000)); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 7s, 12s); break; case EVENT_BELLOWING_ROAR: DoCast(SPELL_BELLOWING_ROAR); - events.ScheduleEvent(EVENT_BELLOWING_ROAR, urand(20000, 30000)); + events.ScheduleEvent(EVENT_BELLOWING_ROAR, 20s, 30s); break; default: emerald_dragonAI::ExecuteEvent(eventId); diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp index ff9adc9635..b28ffaade3 100644 --- a/src/server/scripts/World/go_scripts.cpp +++ b/src/server/scripts/World/go_scripts.cpp @@ -283,7 +283,7 @@ public: for (std::list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) { player->KilledMonsterCredit(NPC_WINTERFIN_TADPOLE); - (*itr)->DespawnOrUnsummon(urand(45000, 60000)); + (*itr)->DespawnOrUnsummon(randtime(45s, 60s)); (*itr)->GetMotionMaster()->MoveFollow(player, 1.0f, frand(0.0f, 2 * M_PI), MOTION_SLOT_CONTROLLED); } } @@ -412,7 +412,7 @@ public: void Initialize() { - _events.ScheduleEvent(EVENT_CHECK, 1000); + _events.ScheduleEvent(EVENT_CHECK, 1s); } void UpdateAI(uint32 const diff) override @@ -432,7 +432,7 @@ public: } else { - _events.ScheduleEvent(EVENT_CHECK, 1000); + _events.ScheduleEvent(EVENT_CHECK, 1s); } break; } @@ -474,7 +474,7 @@ public: { go_l70_etc_musicAI(GameObject* go) : GameObjectAI(go) { - _events.ScheduleEvent(EVENT_ETC_START_MUSIC, 1600); + _events.ScheduleEvent(EVENT_ETC_START_MUSIC, 1600ms); } void UpdateAI(uint32 diff) override @@ -489,7 +489,7 @@ public: me->PlayDirectMusic(MUSIC_L70_ETC_MUSIC_LOUD); else me->PlayDirectMusic(MUSIC_L70_ETC_MUSIC); - _events.ScheduleEvent(EVENT_ETC_START_MUSIC, 1600); // Every 1.6 seconds SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + _events.ScheduleEvent(EVENT_ETC_START_MUSIC, 1600ms); // Every 1.6 seconds SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: break; @@ -521,15 +521,12 @@ enum BrewfestMusic }; // These are in seconds -enum BrewfestMusicTime -{ - EVENT_BREWFESTDWARF01_TIME = 95000, - EVENT_BREWFESTDWARF02_TIME = 155000, - EVENT_BREWFESTDWARF03_TIME = 23000, - EVENT_BREWFESTGOBLIN01_TIME = 68000, - EVENT_BREWFESTGOBLIN02_TIME = 93000, - EVENT_BREWFESTGOBLIN03_TIME = 28000 -}; +constexpr Milliseconds EVENT_BREWFESTDWARF01_TIME = 95s; +constexpr Milliseconds EVENT_BREWFESTDWARF02_TIME = 155s; +constexpr Milliseconds EVENT_BREWFESTDWARF03_TIME = 23s; +constexpr Milliseconds EVENT_BREWFESTGOBLIN01_TIME = 68s; +constexpr Milliseconds EVENT_BREWFESTGOBLIN02_TIME = 93s; +constexpr Milliseconds EVENT_BREWFESTGOBLIN03_TIME = 28s; enum BrewfestMusicEvents { @@ -546,8 +543,8 @@ public: { go_brewfest_musicAI(GameObject* go) : GameObjectAI(go) { - _events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, 1000); - _events.ScheduleEvent(EVENT_BM_START_MUSIC, 1500); + _events.ScheduleEvent(EVENT_BM_SELECT_MUSIC, 1s); + _events.ScheduleEvent(EVENT_BM_START_MUSIC, 1500ms); _currentMusicEvent = EVENT_BREWFESTGOBLIN01; } @@ -564,7 +561,7 @@ public: break; // Select random music sample uint32 rnd = urand(0, 2); - uint32 musicTime = 1000; + Milliseconds musicTime = 1s; //Restart the current selected music _currentMusicEvent = 0; //Check zone to play correct music @@ -652,7 +649,7 @@ public: { me->PlayDirectMusic(_currentMusicEvent); } - _events.ScheduleEvent(EVENT_BM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client + _events.ScheduleEvent(EVENT_BM_START_MUSIC, 5s); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client break; default: break; @@ -695,7 +692,7 @@ public: go_pirate_day_musicAI(GameObject* go) : GameObjectAI(go) { - _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 1000); + _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 1s); } void UpdateAI(uint32 diff) override @@ -709,7 +706,7 @@ public: if (!IsHolidayActive(HOLIDAY_PIRATES_DAY)) break; me->PlayDirectMusic(MUSIC_PIRATE_DAY_MUSIC); - _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + _events.ScheduleEvent(EVENT_PDM_START_MUSIC, 5s); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: break; @@ -750,7 +747,7 @@ public: go_darkmoon_faire_musicAI(GameObject* go) : GameObjectAI(go) { - _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 1000); + _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 1s); } void UpdateAI(uint32 diff) override @@ -764,7 +761,7 @@ public: if (!IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_ELWYNN) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_THUNDER) || !IsHolidayActive(HOLIDAY_DARKMOON_FAIRE_SHATTRATH)) break; me->PlayDirectMusic(MUSIC_DARKMOON_FAIRE_MUSIC); - _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + _events.ScheduleEvent(EVENT_DFM_START_MUSIC, 5s); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; default: break; @@ -805,7 +802,7 @@ public: { go_midsummer_musicAI(GameObject* go) : GameObjectAI(go) { - _events.ScheduleEvent(EVENT_MM_START_MUSIC, 1000); + _events.ScheduleEvent(EVENT_MM_START_MUSIC, 1s); } void UpdateAI(uint32 diff) override @@ -836,7 +833,7 @@ public: } } - _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5000); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) + _events.ScheduleEvent(EVENT_MM_START_MUSIC, 5s); // Every 5 second's SMSG_PLAY_MUSIC packet (PlayDirectMusic) is pushed to the client (sniffed value) break; } default: @@ -895,7 +892,7 @@ public: _playerGUID = player->GetGUID(); me->SetGameObjectFlag((GameObjectFlags)1); me->RemoveByteFlag(GAMEOBJECT_BYTES_1, 0, 1); - _events.ScheduleEvent(EVENT_STILLBLADE_SPAWN, 1000); + _events.ScheduleEvent(EVENT_STILLBLADE_SPAWN, 1s); } } return true; @@ -914,7 +911,7 @@ public: if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID)) { player->SummonCreature(NPC_STILLBLADE, 8032.587f, -7524.518f, 149.68073f, 6.161012172698974609f, TEMPSUMMON_DEAD_DESPAWN, 60000); - _events.ScheduleEvent(EVENT_RESET_BRAZIER, 4000); + _events.ScheduleEvent(EVENT_RESET_BRAZIER, 4s); } break; } @@ -1066,7 +1063,7 @@ class go_southfury_moonstone : public GameObjectScript public: go_southfury_moonstone() : GameObjectScript("go_southfury_moonstone") { } - bool OnGossipHello(Player* player, GameObject* /*go*/) override + bool OnGossipHello(Player* player, GameObject* go) override { //implicitTarget=48 not implemented as of writing this code, and manual summon may be just ok for our purpose //player->CastSpell(player, SPELL_SUMMON_RIZZLE, false); @@ -1076,6 +1073,7 @@ public: // no need casting spell blackjack, it's casted by script npc_rizzle_sprysprocket. //creature->CastSpell(player, SPELL_BLACKJACK, false); creature->AI()->AttackStart(player); + go->DespawnOrUnsummon(8000ms); } return false; @@ -1696,7 +1694,7 @@ public: for (std::list<Creature*>::const_iterator itr = childrenList.begin(); itr != childrenList.end(); ++itr) { player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID()); - (*itr)->DespawnOrUnsummon(5000); + (*itr)->DespawnOrUnsummon(5s); (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX() + 5, go->GetPositionY(), go->GetPositionZ()); (*itr)->AI()->Talk(SAY_FREE_0); (*itr)->GetMotionMaster()->Clear(); @@ -1821,7 +1819,7 @@ public: { // Reset once = false; - _events.ScheduleEvent(EVENT_TIME, 1000); + _events.ScheduleEvent(EVENT_TIME, 1s); } while (uint32 eventId = _events.ExecuteEvent()) @@ -1844,7 +1842,7 @@ public: // Schedule ring event for (auto i = 0; i < _rings; ++i) { - _events.ScheduleEvent(EVENT_RING_BELL, (i * 4 + 1) * 1000); + _events.ScheduleEvent(EVENT_RING_BELL, Seconds(i * 4 + 1)); } break; } diff --git a/src/server/scripts/World/npc_stave_of_ancients.cpp b/src/server/scripts/World/npc_stave_of_ancients.cpp index 20c64c4921..159ff1e72c 100644 --- a/src/server/scripts/World/npc_stave_of_ancients.cpp +++ b/src/server/scripts/World/npc_stave_of_ancients.cpp @@ -42,7 +42,7 @@ void NPCStaveQuestAI::RevealForm() { me->UpdateEntry(GetFormEntry("evil")); me->SetFullHealth(); - me->DespawnOrUnsummon(900000); + me->DespawnOrUnsummon(900s); } } @@ -306,11 +306,11 @@ public: me->CastSpell(who, SPELL_FOOLS_PLIGHT, true); } - events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000)); - events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); - events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000); - events.ScheduleEvent(ARTORIUS_EVENT_DEMONIC_DOOM, urand(3000, 5000)); - events.ScheduleEvent(ARTORIUS_EVENT_DEMONIC_ENRAGE, urand(6000, 8000)); + events.ScheduleEvent(EVENT_FOOLS_PLIGHT, 2s, 3s); + events.ScheduleEvent(EVENT_RANGE_CHECK, 1s); + events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1s); + events.ScheduleEvent(ARTORIUS_EVENT_DEMONIC_DOOM, 3s, 5s); + events.ScheduleEvent(ARTORIUS_EVENT_DEMONIC_ENRAGE, 6s, 8s); } void UpdateAI(uint32 diff) override @@ -325,7 +325,7 @@ public: me->Say(ARTORIUS_SAY); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - events.ScheduleEvent(EVENT_REVEAL, 5000); + events.ScheduleEvent(EVENT_REVEAL, 5s); break; case EVENT_REVEAL: RevealForm(); @@ -355,7 +355,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true); } - events.RepeatEvent(urand(3000, 6000)); + events.Repeat(3s, 6s); break; case EVENT_RANGE_CHECK: if (!me->GetVictim() || !me->GetVictim()->IsWithinDist2d(me, 60.0f)) @@ -364,7 +364,7 @@ public: } else { - events.RepeatEvent(2000); + events.Repeat(2s); } break; case EVENT_UNFAIR_FIGHT: @@ -373,21 +373,21 @@ public: SetHomePosition(); me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1); me->SetImmuneToAll(true); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); break; } - events.RepeatEvent(2000); + events.Repeat(2s); break; case ARTORIUS_EVENT_DEMONIC_DOOM: if (!me->GetVictim()->HasAura(ARTORIUS_SPELL_DEMONIC_DOOM)) { me->CastSpell(me->GetVictim(), ARTORIUS_SPELL_DEMONIC_DOOM, false); } - events.RepeatEvent(urand(5000, 10000)); + events.Repeat(5s, 10s); break; case ARTORIUS_EVENT_DEMONIC_ENRAGE: me->CastSpell(me, SPELL_DEMONIC_ENRAGE, false); - events.RepeatEvent(urand(22000, 39000)); + events.Repeat(22s, 39s); break; } @@ -423,7 +423,7 @@ public: if (action == EVENT_ENCOUNTER_START) { PrepareForEncounter(); - events.ScheduleEvent(EVENT_ENCOUNTER_START, 5000); + events.ScheduleEvent(EVENT_ENCOUNTER_START, 5s); } } }; @@ -476,7 +476,7 @@ public: { if (flaggedForDespawn) { - me->DespawnOrUnsummon(0); + me->DespawnOrUnsummon(0ms); flaggedForDespawn = false; } } @@ -640,7 +640,7 @@ public: } else { - Precious()->DespawnOrUnsummon(0); + Precious()->DespawnOrUnsummon(0ms); } } @@ -649,7 +649,7 @@ public: ResetState(SIMONE_SPELL_SILENCE); events.Reset(); - events.ScheduleEvent(SIMONE_EVENT_CHECK_PET_STATE, 2000); + events.ScheduleEvent(SIMONE_EVENT_CHECK_PET_STATE, 2s); } void JustEngagedWith(Unit* who) override @@ -664,13 +664,13 @@ public: me->CastSpell(who, SPELL_FOOLS_PLIGHT, true); } - events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); - events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000); - events.ScheduleEvent(SIMONE_EVENT_CHAIN_LIGHTNING, 3000); - events.ScheduleEvent(SIMONE_EVENT_TEMPTRESS_KISS, 1000); + events.ScheduleEvent(EVENT_RANGE_CHECK, 1s); + events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1s); + events.ScheduleEvent(SIMONE_EVENT_CHAIN_LIGHTNING, 3s); + events.ScheduleEvent(SIMONE_EVENT_TEMPTRESS_KISS, 1s); } - events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000)); + events.ScheduleEvent(EVENT_FOOLS_PLIGHT, 2s, 3s); } void UpdateAI(uint32 diff) override @@ -685,7 +685,7 @@ public: me->TextEmote(SIMONE_EMOTE, GetGossipPlayer()); me->HandleEmoteCommand(EMOTE_ONESHOT_NONE); me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); - events.ScheduleEvent(SIMONE_EVENT_TALK, 4000); + events.ScheduleEvent(SIMONE_EVENT_TALK, 4s); break; case SIMONE_EVENT_TALK: me->Say(SIMONE_SAY, GetGossipPlayer()); @@ -695,7 +695,7 @@ public: { Precious()->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); } - events.ScheduleEvent(EVENT_REVEAL, 5000); + events.ScheduleEvent(EVENT_REVEAL, 5s); break; case EVENT_REVEAL: RevealForm(); @@ -713,7 +713,7 @@ public: HandlePetRespawn(); } - events.ScheduleEvent(SIMONE_EVENT_CHECK_PET_STATE, 1000); + events.ScheduleEvent(SIMONE_EVENT_CHECK_PET_STATE, 1s); } break; } @@ -730,7 +730,7 @@ public: if (me->HasUnitState(UNIT_STATE_CASTING) && eventId != EVENT_RANGE_CHECK && eventId != EVENT_UNFAIR_FIGHT) { - events.RepeatEvent(1000); + events.Repeat(1s); return; } @@ -742,7 +742,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true); } - events.RepeatEvent(urand(3000, 6000)); + events.Repeat(3s, 6s); break; case EVENT_RANGE_CHECK: if (!me->GetVictim()->IsWithinDist2d(me, 60.0f)) @@ -751,7 +751,7 @@ public: } else { - events.RepeatEvent(2000); + events.Repeat(2s); } break; case EVENT_UNFAIR_FIGHT: @@ -765,20 +765,20 @@ public: me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1); me->SetImmuneToAll(true); - Precious()->DespawnOrUnsummon(5000); + Precious()->DespawnOrUnsummon(5s); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); break; } - events.RepeatEvent(2000); + events.Repeat(2s); break; case SIMONE_EVENT_CHAIN_LIGHTNING: me->CastSpell(me->GetVictim(), SIMONE_SPELL_CHAIN_LIGHTNING, false); - events.RepeatEvent(7000); + events.Repeat(7s); break; case SIMONE_EVENT_TEMPTRESS_KISS: me->CastSpell(me->GetVictim(), SIMONE_SPELL_TEMPTRESS_KISS, false); - events.RepeatEvent(45000); + events.Repeat(45s); break; } @@ -805,7 +805,7 @@ public: PreciousAI()->PrepareForEncounter(); } gossipPlayerGUID = playerGUID; - events.ScheduleEvent(EVENT_ENCOUNTER_START, 1000); + events.ScheduleEvent(EVENT_ENCOUNTER_START, 1s); } }; @@ -906,11 +906,11 @@ public: me->CastSpell(who, SPELL_FOOLS_PLIGHT, true); } - events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000)); - events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); - events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000); - events.ScheduleEvent(NELSON_EVENT_DREADFUL_FRIGHT, 10000); - events.ScheduleEvent(NELSON_EVENT_CREEPING_DOOM, 5000); + events.ScheduleEvent(EVENT_FOOLS_PLIGHT, 2s, 3s); + events.ScheduleEvent(EVENT_RANGE_CHECK, 1s); + events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1s); + events.ScheduleEvent(NELSON_EVENT_DREADFUL_FRIGHT, 10s); + events.ScheduleEvent(NELSON_EVENT_CREEPING_DOOM, 5s); } void UpdateAI(uint32 diff) override @@ -925,7 +925,7 @@ public: me->Say(NELSON_SAY); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - events.ScheduleEvent(EVENT_REVEAL, 5000); + events.ScheduleEvent(EVENT_REVEAL, 5s); break; case EVENT_REVEAL: RevealForm(); @@ -944,7 +944,7 @@ public: if (me->HasUnitState(UNIT_STATE_CASTING)) { - events.RepeatEvent(1000); + events.Repeat(1s); return; } @@ -956,7 +956,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true); } - events.RepeatEvent(urand(3000, 6000)); + events.Repeat(3s, 6s); break; case EVENT_RANGE_CHECK: if (!me->GetVictim()->IsWithinDist2d(me, 60.0f)) @@ -965,7 +965,7 @@ public: } else { - events.RepeatEvent(2000); + events.Repeat(2s); } break; case EVENT_UNFAIR_FIGHT: @@ -978,18 +978,18 @@ public: me->CombatStop(true); me->Say(NELSON_DESPAWN_SAY); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); break; } - events.RepeatEvent(2000); + events.Repeat(2s); break; case NELSON_EVENT_DREADFUL_FRIGHT: me->CastSpell(me->GetVictim(), NELSON_SPELL_DREADFUL_FRIGHT, false); - events.RepeatEvent(urand(12000, 19000)); + events.Repeat(12s, 19s); break; case NELSON_EVENT_CREEPING_DOOM: me->CastSpell(me->GetVictim(), NELSON_SPELL_CREEPING_DOOM, false); - events.RepeatEvent(urand(10000, 12000)); + events.Repeat(10s, 12s); break; } @@ -1016,7 +1016,7 @@ public: if (action == EVENT_ENCOUNTER_START) { PrepareForEncounter(); - events.ScheduleEvent(EVENT_ENCOUNTER_START, 5000); + events.ScheduleEvent(EVENT_ENCOUNTER_START, 5s); } } }; @@ -1077,12 +1077,12 @@ public: me->CastSpell(who, SPELL_FOOLS_PLIGHT, true); } - events.ScheduleEvent(FRANKLIN_EVENT_DEMONIC_ENRAGE, urand(9000, 13000)); - events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); - events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000); + events.ScheduleEvent(FRANKLIN_EVENT_DEMONIC_ENRAGE, 9s, 13s); + events.ScheduleEvent(EVENT_RANGE_CHECK, 1s); + events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1s); } - events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000)); + events.ScheduleEvent(EVENT_FOOLS_PLIGHT, 2s, 3s); } void UpdateAI(uint32 diff) override @@ -1097,7 +1097,7 @@ public: me->Say(FRANKLIN_SAY, GetGossipPlayer()); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - events.ScheduleEvent(EVENT_REVEAL, 5000); + events.ScheduleEvent(EVENT_REVEAL, 5s); break; case EVENT_REVEAL: RevealForm(); @@ -1116,7 +1116,7 @@ public: if (me->HasUnitState(UNIT_STATE_CASTING)) { - events.RepeatEvent(1000); + events.Repeat(1s); return; } @@ -1128,7 +1128,7 @@ public: { me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true); } - events.RepeatEvent(urand(3000, 6000)); + events.Repeat(3s, 6s); break; case EVENT_RANGE_CHECK: if (!me->GetVictim()->IsWithinDist2d(me, 60.0f)) @@ -1137,7 +1137,7 @@ public: } else { - events.RepeatEvent(2000); + events.Repeat(2s); } break; case EVENT_UNFAIR_FIGHT: @@ -1149,15 +1149,15 @@ public: me->CombatStop(true); me->Say(FRANKLIN_DESPAWN_SAY); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - me->DespawnOrUnsummon(5000); + me->DespawnOrUnsummon(5s); break; } - events.RepeatEvent(2000); + events.Repeat(2s); break; case FRANKLIN_EVENT_DEMONIC_ENRAGE: me->CastSpell(me, SPELL_DEMONIC_ENRAGE, false); me->TextEmote(FRANKLIN_ENRAGE_EMOTE); - events.RepeatEvent(urand(9000, 22000)); + events.Repeat(9s, 22s); break; } @@ -1189,7 +1189,7 @@ public: { PrepareForEncounter(); gossipPlayerGUID = playerGUID; - events.ScheduleEvent(EVENT_ENCOUNTER_START, 5000); + events.ScheduleEvent(EVENT_ENCOUNTER_START, 5s); } }; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 6612f6dc09..af5e033a2f 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -68,7 +68,7 @@ public: npc_elder_clearwaterAI(Creature* c) : ScriptedAI(c) { events.Reset(); - events.ScheduleEvent(EVENT_CLEARWATER_ANNOUNCE, 1000, 1, 0); + events.ScheduleEvent(EVENT_CLEARWATER_ANNOUNCE, 1s, 1, 0); finished = false; preWarning = false; startWarning = false; @@ -126,7 +126,7 @@ public: } } - events.RepeatEvent(1000); + events.Repeat(1s); break; } } @@ -1421,7 +1421,8 @@ public: break; } - Start(false, true); + me->SetWalk(true); + Start(false); } else EnterEvadeMode(); //something went wrong |
