Merge branch 'master' into Playerbot
# Conflicts: # src/server/game/Entities/Player/Player.h
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
void BIH::buildHierarchy(std::vector<uint32>& tempTree, buildData& dat, BuildStats& stats)
|
||||
{
|
||||
// create space for the first node
|
||||
// cppcheck-suppress integerOverflow
|
||||
tempTree.push_back(uint32(3 << 30)); // dummy leaf
|
||||
tempTree.insert(tempTree.end(), 2, 0);
|
||||
//tempTree.add(0);
|
||||
|
||||
@@ -187,9 +187,9 @@ public:
|
||||
while (true)
|
||||
{
|
||||
uint32 tn = tree[node];
|
||||
uint32 axis = (tn & (3 << 30)) >> 30;
|
||||
bool BVH2 = tn & (1 << 29);
|
||||
int offset = tn & ~(7 << 29);
|
||||
uint32 axis = (tn & (3 << 30)) >> 30; // cppcheck-suppress integerOverflow
|
||||
bool BVH2 = tn & (1 << 29); // cppcheck-suppress integerOverflow
|
||||
int offset = tn & ~(7 << 29); // cppcheck-suppress integerOverflow
|
||||
if (!BVH2)
|
||||
{
|
||||
if (axis < 3)
|
||||
@@ -297,9 +297,9 @@ public:
|
||||
while (true)
|
||||
{
|
||||
uint32 tn = tree[node];
|
||||
uint32 axis = (tn & (3 << 30)) >> 30;
|
||||
bool BVH2 = tn & (1 << 29);
|
||||
int offset = tn & ~(7 << 29);
|
||||
uint32 axis = (tn & (3 << 30)) >> 30; // cppcheck-suppress integerOverflow
|
||||
bool BVH2 = tn & (1 << 29); // cppcheck-suppress integerOverflow
|
||||
int offset = tn & ~(7 << 29); // cppcheck-suppress integerOverflow
|
||||
if (!BVH2)
|
||||
{
|
||||
if (axis < 3)
|
||||
@@ -425,7 +425,7 @@ protected:
|
||||
void createNode(std::vector<uint32>& tempTree, int nodeIndex, uint32 left, uint32 right) const
|
||||
{
|
||||
// write leaf node
|
||||
tempTree[nodeIndex + 0] = (3 << 30) | left;
|
||||
tempTree[nodeIndex + 0] = (3 << 30) | left; // cppcheck-suppress integerOverflow
|
||||
tempTree[nodeIndex + 1] = right - left + 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ SERVICE_STATUS serviceStatus;
|
||||
|
||||
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
|
||||
|
||||
// cppcheck-suppress syntaxError
|
||||
typedef WINADVAPI BOOL (WINAPI* CSD_T)(SC_HANDLE, DWORD, LPCVOID);
|
||||
|
||||
bool WinServiceInstall()
|
||||
|
||||
@@ -139,6 +139,21 @@ namespace Acore::Containers
|
||||
return *it;
|
||||
}
|
||||
|
||||
/*
|
||||
* Select a random element from a container.
|
||||
*
|
||||
* Note: container cannot be empty
|
||||
*/
|
||||
template<class C, class Predicate>
|
||||
inline auto SelectRandomContainerElementIf(C const& container, Predicate&& predicate) -> typename std::add_const<decltype(*std::begin(container))>::type&
|
||||
{
|
||||
C containerCopy;
|
||||
std::copy_if(std::begin(container), std::end(container), std::inserter(containerCopy, std::end(containerCopy)), predicate);
|
||||
auto it = std::begin(containerCopy);
|
||||
std::advance(it, urand(0, uint32(std::size(containerCopy)) - 1));
|
||||
return *it;
|
||||
}
|
||||
|
||||
/*
|
||||
* Select a random element from a container where each element has a different chance to be selected.
|
||||
*
|
||||
|
||||
@@ -75,7 +75,7 @@ void EventProcessor::Update(uint32 p_time)
|
||||
|
||||
// Reschedule non deletable events to be checked at
|
||||
// the next update tick
|
||||
AddEvent(event, CalculateTime(1), false);
|
||||
AddEvent(event, CalculateTime(1), false, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,11 +111,33 @@ void EventProcessor::KillAllEvents(bool force)
|
||||
m_events.clear();
|
||||
}
|
||||
|
||||
void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime)
|
||||
void EventProcessor::CancelEventGroup(uint8 group)
|
||||
{
|
||||
for (auto itr = m_events.begin(); itr != m_events.end();)
|
||||
{
|
||||
if (itr->second->m_eventGroup != group)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Abort events which weren't aborted already
|
||||
if (!itr->second->IsAborted())
|
||||
{
|
||||
itr->second->SetAborted();
|
||||
itr->second->Abort(m_time);
|
||||
}
|
||||
|
||||
delete itr->second;
|
||||
itr = m_events.erase(itr);
|
||||
}
|
||||
}
|
||||
|
||||
void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime, uint8 eventGroup)
|
||||
{
|
||||
if (set_addtime)
|
||||
Event->m_addTime = m_time;
|
||||
Event->m_execTime = e_time;
|
||||
Event->m_eventGroup = eventGroup;
|
||||
m_events.insert(std::pair<uint64, BasicEvent*>(e_time, Event));
|
||||
}
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ class BasicEvent
|
||||
// these can be used for time offset control
|
||||
uint64 m_addTime{0}; // time when the event was added to queue, filled by event handler
|
||||
uint64 m_execTime{0}; // planned time of next execution, filled by event handler
|
||||
uint8 m_eventGroup{0};
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
@@ -101,11 +102,16 @@ class EventProcessor
|
||||
|
||||
void Update(uint32 p_time);
|
||||
void KillAllEvents(bool force);
|
||||
void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true);
|
||||
void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true) { AddEvent(Event, e_time, set_addtime, 0); };
|
||||
void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime, uint8 eventGroup);
|
||||
template<typename T>
|
||||
is_lambda_event<T> AddEvent(T&& event, Milliseconds e_time, bool set_addtime = true) { AddEvent(new LambdaBasicEvent<T>(std::move(event)), e_time, set_addtime); }
|
||||
void AddEventAtOffset(BasicEvent* event, Milliseconds offset) { AddEvent(event, CalculateTime(offset.count())); }
|
||||
void AddEventAtOffset(BasicEvent* event, Milliseconds offset, Milliseconds offset2) { AddEvent(event, CalculateTime(randtime(offset, offset2).count())); }
|
||||
void AddEventAtOffset(BasicEvent* event, Milliseconds offset) { AddEvent(event, CalculateTime(offset.count()), true, 0); }
|
||||
void AddEventAtOffset(BasicEvent* event, Milliseconds offset, Milliseconds offset2) { AddEvent(event, CalculateTime(randtime(offset, offset2).count()), true, false); }
|
||||
template<typename T>
|
||||
is_lambda_event<T> AddEventAtOffset(T&& event, Milliseconds offset, uint8 eventGroup) { AddEvent(new LambdaBasicEvent<T>(std::move(event)), CalculateTime(offset.count()), true, eventGroup); };
|
||||
template<typename T>
|
||||
is_lambda_event<T> AddEventAtOffset(T&& event, Milliseconds offset, Milliseconds offset2, uint8 eventGroup) { AddEvent(new LambdaBasicEvent<T>(std::move(event)), CalculateTime(randtime(offset, offset2).count()), true, eventGroup); };
|
||||
template<typename T>
|
||||
is_lambda_event<T> AddEventAtOffset(T&& event, Milliseconds offset) { AddEventAtOffset(new LambdaBasicEvent<T>(std::move(event)), offset); }
|
||||
template<typename T>
|
||||
@@ -116,6 +122,8 @@ class EventProcessor
|
||||
//calculates next queue tick time
|
||||
[[nodiscard]] uint64 CalculateQueueTime(uint64 delay) const;
|
||||
|
||||
void CancelEventGroup(uint8 group);
|
||||
|
||||
protected:
|
||||
uint64 m_time{0};
|
||||
EventList m_events;
|
||||
|
||||
@@ -77,7 +77,8 @@ DatabaseWorkerPool<T>::DatabaseWorkerPool() :
|
||||
bool isSameClientDB = true; // Client version 3.2.3?
|
||||
#endif
|
||||
|
||||
WPFatal(isSupportClientDB, "AzerothCore does not support MySQL versions below 5.7 and MariaDB 10.5\nSearch the wiki for ACE00043 in Common Errors (https://www.azerothcore.org/wiki/common-errors#ace00043).");
|
||||
WPFatal(isSupportClientDB, "AzerothCore does not support MySQL versions below 5.7 or MariaDB versions below 10.5.\n\nFound version: {} / {}. Server compiled with: {}.\nSearch the wiki for ACE00043 in Common Errors (https://www.azerothcore.org/wiki/common-errors#ace00043).",
|
||||
mysql_get_client_info(), mysql_get_client_version(), MYSQL_VERSION_ID);
|
||||
WPFatal(isSameClientDB, "Used MySQL library version ({} id {}) does not match the version id used to compile AzerothCore (id {}).\nSearch the wiki for ACE00046 in Common Errors (https://www.azerothcore.org/wiki/common-errors#ace00046).",
|
||||
mysql_get_client_info(), mysql_get_client_version(), MYSQL_VERSION_ID);
|
||||
}
|
||||
@@ -407,7 +408,8 @@ uint32 DatabaseWorkerPool<T>::OpenConnections(InternalIndex type, uint8 numConne
|
||||
}
|
||||
else if (connection->GetServerVersion() < MIN_MYSQL_SERVER_VERSION)
|
||||
{
|
||||
LOG_ERROR("sql.driver", "AzerothCore does not support MySQL versions below 5.7 or MariaDB versions below 10.5");
|
||||
LOG_ERROR("sql.driver", "AzerothCore does not support MySQL versions below 5.7 or MariaDB versions below 10.5.\n\nFound server version: {}. Server compiled with: {}.",
|
||||
connection->GetServerVersion(), MYSQL_VERSION_ID);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -596,6 +596,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
|
||||
// Character names
|
||||
PrepareStatement(CHAR_INS_RESERVED_PLAYER_NAME, "INSERT IGNORE INTO reserved_name (name) VALUES (?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_INS_PROFANITY_PLAYER_NAME, "INSERT IGNORE INTO profanity_name (name) VALUES (?)", CONNECTION_ASYNC);
|
||||
|
||||
// Character settings
|
||||
PrepareStatement(CHAR_SEL_CHAR_SETTINGS, "SELECT source, data FROM character_settings WHERE guid = ?", CONNECTION_ASYNC);
|
||||
|
||||
@@ -510,6 +510,7 @@ enum CharacterDatabaseStatements : uint32
|
||||
CHAR_SEL_ARENAPOINTS,
|
||||
|
||||
CHAR_INS_RESERVED_PLAYER_NAME,
|
||||
CHAR_INS_PROFANITY_PLAYER_NAME,
|
||||
|
||||
CHAR_SEL_CHAR_SETTINGS,
|
||||
CHAR_REP_CHAR_SETTINGS,
|
||||
|
||||
@@ -110,7 +110,7 @@ bool TransactionTask::Execute()
|
||||
// Make sure only 1 async thread retries a transaction so they don't keep dead-locking each other
|
||||
std::lock_guard<std::mutex> lock(_deadlockLock);
|
||||
|
||||
for (Milliseconds loopDuration = 0s, startMSTime = GetTimeMS(); loopDuration <= DEADLOCK_MAX_RETRY_TIME_MS; loopDuration = GetMSTimeDiffToNow(startMSTime))
|
||||
for (Milliseconds loopDuration{}, startMSTime = GetTimeMS(); loopDuration <= DEADLOCK_MAX_RETRY_TIME_MS; loopDuration = GetMSTimeDiffToNow(startMSTime))
|
||||
{
|
||||
if (!TryExecute())
|
||||
return true;
|
||||
@@ -157,7 +157,7 @@ bool TransactionWithResultTask::Execute()
|
||||
// Make sure only 1 async thread retries a transaction so they don't keep dead-locking each other
|
||||
std::lock_guard<std::mutex> lock(_deadlockLock);
|
||||
|
||||
for (Milliseconds loopDuration = 0s, startMSTime = GetTimeMS(); loopDuration <= DEADLOCK_MAX_RETRY_TIME_MS; loopDuration = GetMSTimeDiffToNow(startMSTime))
|
||||
for (Milliseconds loopDuration{}, startMSTime = GetTimeMS(); loopDuration <= DEADLOCK_MAX_RETRY_TIME_MS; loopDuration = GetMSTimeDiffToNow(startMSTime))
|
||||
{
|
||||
if (!TryExecute())
|
||||
{
|
||||
|
||||
@@ -577,6 +577,7 @@ void BossAI::_Reset()
|
||||
events.Reset();
|
||||
scheduler.CancelAll();
|
||||
summons.DespawnAll();
|
||||
_healthCheckEvents.clear();
|
||||
if (instance)
|
||||
instance->SetBossState(_bossId, NOT_STARTED);
|
||||
}
|
||||
@@ -586,6 +587,7 @@ void BossAI::_JustDied()
|
||||
events.Reset();
|
||||
scheduler.CancelAll();
|
||||
summons.DespawnAll();
|
||||
_healthCheckEvents.clear();
|
||||
if (instance)
|
||||
{
|
||||
instance->SetBossState(_bossId, DONE);
|
||||
@@ -667,6 +669,39 @@ void BossAI::UpdateAI(uint32 diff)
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void BossAI::DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
|
||||
{
|
||||
if (!_healthCheckEvents.empty())
|
||||
{
|
||||
_healthCheckEvents.remove_if([&](HealthCheckEventData data) -> bool
|
||||
{
|
||||
return _ProccessHealthCheckEvent(data._healthPct, damage, data._exec);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Executes a function once the creature reaches the defined health point percent.
|
||||
*
|
||||
* @param healthPct The health percent at which the code will be executed.
|
||||
* @param exec The fuction to be executed.
|
||||
*/
|
||||
void BossAI::ScheduleHealthCheckEvent(uint32 healthPct, std::function<void()> exec)
|
||||
{
|
||||
_healthCheckEvents.push_back(HealthCheckEventData(healthPct, exec));
|
||||
};
|
||||
|
||||
bool BossAI::_ProccessHealthCheckEvent(uint8 healthPct, uint32 damage, std::function<void()> exec) const
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(healthPct, damage))
|
||||
{
|
||||
exec();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// WorldBossAI - for non-instanced bosses
|
||||
|
||||
WorldBossAI::WorldBossAI(Creature* creature) :
|
||||
|
||||
@@ -139,6 +139,20 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void DoForAllSummons(std::function<void(WorldObject*)> exec)
|
||||
{
|
||||
// We need to use a copy of SummonList here, otherwise original SummonList would be modified
|
||||
StorageType listCopy = storage_;
|
||||
|
||||
for (auto const& guid : listCopy)
|
||||
{
|
||||
if (WorldObject* summon = ObjectAccessor::GetWorldObject(*me, guid))
|
||||
{
|
||||
exec(summon);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoZoneInCombat(uint32 entry = 0);
|
||||
void RemoveNotExisting();
|
||||
bool HasEntry(uint32 entry) const;
|
||||
@@ -430,6 +444,14 @@ private:
|
||||
bool _isHeroic;
|
||||
};
|
||||
|
||||
struct HealthCheckEventData
|
||||
{
|
||||
HealthCheckEventData(uint8 healthPct, std::function<void()> exec) : _healthPct(healthPct), _exec(exec) { };
|
||||
|
||||
uint8 _healthPct;
|
||||
std::function<void()> _exec;
|
||||
};
|
||||
|
||||
class BossAI : public ScriptedAI
|
||||
{
|
||||
public:
|
||||
@@ -440,12 +462,15 @@ public:
|
||||
|
||||
bool CanRespawn() override;
|
||||
|
||||
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override;
|
||||
void JustSummoned(Creature* summon) override;
|
||||
void SummonedCreatureDespawn(Creature* summon) override;
|
||||
void SummonedCreatureDespawnAll() override;
|
||||
|
||||
void UpdateAI(uint32 diff) override;
|
||||
|
||||
void ScheduleHealthCheckEvent(uint32 healthPct, std::function<void()> exec);
|
||||
|
||||
// Hook used to execute events scheduled into EventMap without the need
|
||||
// to override UpdateAI
|
||||
// note: You must re-schedule the event within this method if the event
|
||||
@@ -464,6 +489,7 @@ protected:
|
||||
void _JustEngagedWith();
|
||||
void _JustDied();
|
||||
void _JustReachedHome() { me->setActive(false); }
|
||||
[[nodiscard]] bool _ProccessHealthCheckEvent(uint8 healthPct, uint32 damage, std::function<void()> exec) const;
|
||||
|
||||
void TeleportCheaters();
|
||||
|
||||
@@ -473,6 +499,7 @@ protected:
|
||||
|
||||
private:
|
||||
uint32 const _bossId;
|
||||
std::list<HealthCheckEventData> _healthCheckEvents;
|
||||
};
|
||||
|
||||
class WorldBossAI : public ScriptedAI
|
||||
|
||||
@@ -129,12 +129,12 @@ void AutobroadcastMgr::SendAutobroadcasts()
|
||||
LOG_DEBUG("autobroadcast", "AutobroadcastMgr::SendAutobroadcasts: '{}'", msg);
|
||||
}
|
||||
|
||||
void AutobroadcastMgr::SendWorldAnnouncement(std::string_view msg)
|
||||
void AutobroadcastMgr::SendWorldAnnouncement(std::string msg)
|
||||
{
|
||||
sWorld->SendWorldTextOptional(LANG_AUTO_BROADCAST, ANNOUNCER_FLAG_DISABLE_AUTOBROADCAST, msg.data());
|
||||
}
|
||||
|
||||
void AutobroadcastMgr::SendNotificationAnnouncement(std::string_view msg)
|
||||
void AutobroadcastMgr::SendNotificationAnnouncement(std::string msg)
|
||||
{
|
||||
WorldPacket data(SMSG_NOTIFICATION, (msg.size() + 1));
|
||||
data << msg.data();
|
||||
|
||||
@@ -37,8 +37,8 @@ public:
|
||||
void SendAutobroadcasts();
|
||||
|
||||
private:
|
||||
void SendWorldAnnouncement(std::string_view msg);
|
||||
void SendNotificationAnnouncement(std::string_view msg);
|
||||
void SendWorldAnnouncement(std::string msg);
|
||||
void SendNotificationAnnouncement(std::string msg);
|
||||
|
||||
typedef std::map<uint8, std::string> AutobroadcastsMap;
|
||||
typedef std::map<uint8, uint8> AutobroadcastsWeightMap;
|
||||
|
||||
@@ -281,7 +281,7 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result)
|
||||
|
||||
bool ArenaTeam::SetName(std::string const& name)
|
||||
{
|
||||
if (TeamName == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
if (TeamName == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || sObjectMgr->IsProfanityName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
return false;
|
||||
|
||||
TeamName = name;
|
||||
|
||||
@@ -895,8 +895,8 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 diff, BattlegroundTypeId
|
||||
{
|
||||
if (!(*itr3)->IsInvitedToBGInstanceGUID
|
||||
&& (((*itr3)->ArenaMatchmakerRating >= arenaMinRating && (*itr3)->ArenaMatchmakerRating <= arenaMaxRating) || (int32)(*itr3)->JoinTime < discardTime)
|
||||
&& ((*itr_teams[0])->ArenaTeamId != (*itr3)->PreviousOpponentsTeamId || ((int32)(*itr3)->JoinTime < discardOpponentsTime))
|
||||
&& (*itr_teams[0])->ArenaTeamId != (*itr3)->ArenaTeamId)
|
||||
&& ((*(itr_teams[0]))->ArenaTeamId != (*itr3)->PreviousOpponentsTeamId || ((int32)(*itr3)->JoinTime < discardOpponentsTime))
|
||||
&& (*(itr_teams[0]))->ArenaTeamId != (*itr3)->ArenaTeamId)
|
||||
{
|
||||
itr_teams[found++] = itr3;
|
||||
break;
|
||||
@@ -907,8 +907,8 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 diff, BattlegroundTypeId
|
||||
//if we have 2 teams, then start new arena and invite players!
|
||||
if (found == 2)
|
||||
{
|
||||
GroupQueueInfo* aTeam = *itr_teams[TEAM_ALLIANCE];
|
||||
GroupQueueInfo* hTeam = *itr_teams[TEAM_HORDE];
|
||||
GroupQueueInfo* aTeam = *(itr_teams[TEAM_ALLIANCE]);
|
||||
GroupQueueInfo* hTeam = *(itr_teams[TEAM_HORDE]);
|
||||
|
||||
Battleground* arena = sBattlegroundMgr->CreateNewBattleground(bgTypeId, bracketEntry, arenaType, true);
|
||||
if (!arena)
|
||||
|
||||
@@ -459,17 +459,8 @@ bool Creature::InitEntry(uint32 Entry, const CreatureData* data)
|
||||
|
||||
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
|
||||
|
||||
float runSpeed = cinfo->speed_run;
|
||||
if (Pet* pet = ToPet())
|
||||
{
|
||||
if (pet->isControlled() && pet->GetOwnerGUID().IsPlayer())
|
||||
{
|
||||
runSpeed = 1.15f;
|
||||
}
|
||||
}
|
||||
|
||||
SetSpeed(MOVE_WALK, cinfo->speed_walk);
|
||||
SetSpeed(MOVE_RUN, runSpeed);
|
||||
SetSpeed(MOVE_RUN, cinfo->speed_run);
|
||||
SetSpeed(MOVE_SWIM, cinfo->speed_swim);
|
||||
SetSpeed(MOVE_FLIGHT, cinfo->speed_flight);
|
||||
|
||||
|
||||
@@ -392,6 +392,12 @@ public:
|
||||
|
||||
void ModifyThreatPercentTemp(Unit* victim, int32 percent, Milliseconds duration);
|
||||
|
||||
/**
|
||||
* @brief Helper to resume chasing current victim.
|
||||
*
|
||||
* */
|
||||
void ResumeChasingVictim() { GetMotionMaster()->MoveChase(GetVictim()); };
|
||||
|
||||
std::string GetDebugInfo() const override;
|
||||
|
||||
protected:
|
||||
|
||||
@@ -1344,7 +1344,7 @@ bool GameObject::ActivateToQuest(Player* target) const
|
||||
case GAMEOBJECT_TYPE_CHEST:
|
||||
{
|
||||
// scan GO chest with loot including quest items
|
||||
if (LootTemplates_Gameobject.HaveQuestLootForPlayer(GetGOInfo()->GetLootId(), target))
|
||||
if (target->GetQuestStatus(GetGOInfo()->chest.questId) == QUEST_STATUS_INCOMPLETE || LootTemplates_Gameobject.HaveQuestLootForPlayer(GetGOInfo()->GetLootId(), target))
|
||||
{
|
||||
//TODO: fix this hack
|
||||
//look for battlegroundAV for some objects which are only activated after mine gots captured by own team
|
||||
|
||||
@@ -1048,6 +1048,11 @@ bool Guardian::InitStatsForLevel(uint8 petlevel)
|
||||
else if (petType != SUMMON_PET)
|
||||
LOG_ERROR("entities.pet", "Unknown type pet {} is summoned by player class {}", GetEntry(), owner->getClass());
|
||||
}
|
||||
|
||||
if (petType == HUNTER_PET || petType == SUMMON_PET)
|
||||
{
|
||||
SetSpeed(MOVE_RUN, 1.15f);
|
||||
}
|
||||
}
|
||||
|
||||
uint32 creature_ID = (petType == HUNTER_PET) ? 1 : cinfo->Entry;
|
||||
|
||||
@@ -9185,32 +9185,47 @@ Pet* Player::CreatePet(uint32 creatureEntry, uint32 spellID /*= 0*/)
|
||||
return pet;
|
||||
}
|
||||
|
||||
void Player::StopCastingCharm()
|
||||
void Player::StopCastingCharm(Aura* except /*= nullptr*/)
|
||||
{
|
||||
Unit* charm = GetCharm();
|
||||
if (!charm)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (charm->GetTypeId() == TYPEID_UNIT)
|
||||
{
|
||||
if (charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_PUPPET))
|
||||
{
|
||||
((Puppet*)charm)->UnSummon();
|
||||
}
|
||||
else if (charm->IsVehicle())
|
||||
{
|
||||
ExitVehicle();
|
||||
}
|
||||
}
|
||||
|
||||
if (GetCharmGUID())
|
||||
charm->RemoveCharmAuras();
|
||||
{
|
||||
charm->RemoveAurasByType(SPELL_AURA_MOD_CHARM, ObjectGuid::Empty, except);
|
||||
charm->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, ObjectGuid::Empty, except);
|
||||
charm->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, ObjectGuid::Empty, except);
|
||||
charm->RemoveAurasByType(SPELL_AURA_AOE_CHARM, ObjectGuid::Empty, except);
|
||||
}
|
||||
|
||||
if (GetCharmGUID())
|
||||
{
|
||||
LOG_FATAL("entities.player", "Player {} ({} is not able to uncharm unit ({})", GetName(), GetGUID().ToString(), GetCharmGUID().ToString());
|
||||
|
||||
if (charm->GetCharmerGUID())
|
||||
{
|
||||
LOG_FATAL("entities.player", "Charmed unit has charmer {}", charm->GetCharmerGUID().ToString());
|
||||
ABORT();
|
||||
}
|
||||
else
|
||||
{
|
||||
SetCharm(charm, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10800,7 +10815,6 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
|
||||
// cooldown information stored in item prototype
|
||||
// This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
|
||||
|
||||
bool useSpellCooldown = spellInfo->HasAttribute(SPELL_ATTR7_CAN_BE_MULTI_CAST);
|
||||
if (itemId)
|
||||
{
|
||||
if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))
|
||||
@@ -10812,12 +10826,6 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
|
||||
cat = proto->Spells[idx].SpellCategory;
|
||||
rec = proto->Spells[idx].SpellCooldown;
|
||||
catrec = proto->Spells[idx].SpellCategoryCooldown;
|
||||
|
||||
if (static_cast<int32>(cat) != catrec)
|
||||
{
|
||||
useSpellCooldown = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -10854,14 +10862,7 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
|
||||
|
||||
// Now we have cooldown data (if found any), time to apply mods
|
||||
if (rec > 0)
|
||||
{
|
||||
int32 oldRec = rec;
|
||||
ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
|
||||
if (oldRec != rec)
|
||||
{
|
||||
useSpellCooldown = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))
|
||||
{
|
||||
@@ -10874,7 +10875,6 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
|
||||
if (HasSpell(spellInfo->Id))
|
||||
{
|
||||
needsCooldownPacket = true;
|
||||
useSpellCooldown = true;
|
||||
rec += cooldownMod * IN_MILLISECONDS; // SPELL_AURA_MOD_COOLDOWN does not affect category cooldows, verified with shaman shocks
|
||||
}
|
||||
}
|
||||
@@ -10894,11 +10894,11 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
|
||||
// category spells
|
||||
if (cat && catrec > 0)
|
||||
{
|
||||
_AddSpellCooldown(spellInfo->Id, cat, itemId, useSpellCooldown ? recTime : catrecTime, true, true);
|
||||
_AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
|
||||
if (needsCooldownPacket)
|
||||
{
|
||||
WorldPacket data;
|
||||
BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, useSpellCooldown ? recTime : catrecTime);
|
||||
BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, recTime);
|
||||
SendDirectMessage(&data);
|
||||
}
|
||||
|
||||
@@ -13048,15 +13048,15 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const
|
||||
return false;
|
||||
}
|
||||
|
||||
void Player::StopCastingBindSight()
|
||||
void Player::StopCastingBindSight(Aura* except /*= nullptr*/)
|
||||
{
|
||||
if (WorldObject* target = GetViewpoint())
|
||||
{
|
||||
if (target->isType(TYPEMASK_UNIT))
|
||||
{
|
||||
((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID());
|
||||
((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID());
|
||||
((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID());
|
||||
((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except);
|
||||
((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except);
|
||||
((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID(), except);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16237,3 +16237,8 @@ std::string Player::GetDebugInfo() const
|
||||
sstr << Unit::GetDebugInfo();
|
||||
return sstr.str();
|
||||
}
|
||||
|
||||
void Player::SendSystemMessage(std::string_view msg, bool escapeCharacters)
|
||||
{
|
||||
ChatHandler(GetSession()).SendSysMessage(msg, escapeCharacters);
|
||||
}
|
||||
|
||||
@@ -2298,8 +2298,8 @@ public:
|
||||
void SetSeer(WorldObject* target) { m_seer = target; }
|
||||
void SetViewpoint(WorldObject* target, bool apply);
|
||||
[[nodiscard]] WorldObject* GetViewpoint() const;
|
||||
void StopCastingCharm();
|
||||
void StopCastingBindSight();
|
||||
void StopCastingCharm(Aura* except = nullptr);
|
||||
void StopCastingBindSight(Aura* except = nullptr);
|
||||
|
||||
[[nodiscard]] uint32 GetSaveTimer() const { return m_nextSave; }
|
||||
void SetSaveTimer(uint32 timer) { m_nextSave = timer; }
|
||||
@@ -2575,6 +2575,8 @@ public:
|
||||
[[nodiscard]] PlayerSetting GetPlayerSetting(std::string source, uint8 index);
|
||||
void UpdatePlayerSetting(std::string source, uint8 index, uint32 value);
|
||||
|
||||
void SendSystemMessage(std::string_view msg, bool escapeCharacters = false);
|
||||
|
||||
void ResetSpeakTimers();
|
||||
|
||||
std::string GetDebugInfo() const override;
|
||||
|
||||
@@ -1314,6 +1314,7 @@ bool Player::SatisfyQuestSeasonal(Quest const* qInfo, bool /*msg*/) const
|
||||
if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
|
||||
return true;
|
||||
|
||||
// cppcheck-suppress mismatchingContainers
|
||||
Player::SeasonalEventQuestMap::iterator itr = ((Player*)this)->m_seasonalquests.find(qInfo->GetEventIdForQuest());
|
||||
|
||||
if (itr == m_seasonalquests.end() || itr->second.empty())
|
||||
|
||||
@@ -4990,7 +4990,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons
|
||||
|
||||
// check name limitations
|
||||
if (ObjectMgr::CheckPlayerName(m_name) != CHAR_NAME_SUCCESS ||
|
||||
(AccountMgr::IsPlayerAccount(GetSession()->GetSecurity()) && sObjectMgr->IsReservedName(m_name)))
|
||||
(AccountMgr::IsPlayerAccount(GetSession()->GetSecurity()) && (sObjectMgr->IsReservedName(m_name) || sObjectMgr->IsProfanityName(m_name))))
|
||||
{
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG);
|
||||
stmt->SetData(0, uint16(AT_LOGIN_RENAME));
|
||||
|
||||
@@ -10717,11 +10717,6 @@ void Unit::SetMinion(Minion* minion, bool apply)
|
||||
// PvP, FFAPvP
|
||||
minion->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
|
||||
|
||||
// FIXME: hack, speed must be set only at follow
|
||||
if (GetTypeId() == TYPEID_PLAYER && minion->IsPet())
|
||||
for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
|
||||
minion->SetSpeed(UnitMoveType(i), m_speed_rate[i], true);
|
||||
|
||||
// Ghoul pets have energy instead of mana (is anywhere better place for this code?)
|
||||
if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
|
||||
minion->setPowerType(POWER_ENERGY);
|
||||
@@ -14268,7 +14263,17 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced)
|
||||
{
|
||||
// Set creature speed rate
|
||||
if (GetTypeId() == TYPEID_UNIT)
|
||||
speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
|
||||
{
|
||||
if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
|
||||
{
|
||||
// contant value for player pets
|
||||
speed *= 1.15f;
|
||||
}
|
||||
else
|
||||
{
|
||||
speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
|
||||
}
|
||||
}
|
||||
|
||||
// Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
|
||||
/// @todo possible affect only on MOVE_RUN
|
||||
@@ -15397,7 +15402,7 @@ void Unit::SetHealth(uint32 val)
|
||||
SetUInt32Value(UNIT_FIELD_HEALTH, val);
|
||||
|
||||
// mobs that are now or were below 30% need to update their speed
|
||||
if (GetTypeId() == TYPEID_UNIT && (prevHealthPct < 30.0 || HealthBelowPct(30)))
|
||||
if (GetTypeId() == TYPEID_UNIT && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
|
||||
{
|
||||
UpdateSpeed(MOVE_RUN, false);
|
||||
}
|
||||
@@ -15905,7 +15910,10 @@ bool CharmInfo::AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates new
|
||||
{
|
||||
WorldPacket data;
|
||||
creature->BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spell_id, cooldown);
|
||||
creature->GetCharmer()->ToPlayer()->SendDirectMessage(&data);
|
||||
if (creature->GetCharmer() && creature->GetCharmer()->IsPlayer())
|
||||
{
|
||||
creature->GetCharmer()->ToPlayer()->SendDirectMessage(&data);
|
||||
}
|
||||
}
|
||||
}, 500ms);
|
||||
}
|
||||
@@ -18586,15 +18594,15 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
|
||||
// Charmer stop charming
|
||||
if (playerCharmer)
|
||||
{
|
||||
playerCharmer->StopCastingCharm();
|
||||
playerCharmer->StopCastingBindSight();
|
||||
playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
|
||||
playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
|
||||
}
|
||||
|
||||
// Charmed stop charming
|
||||
if (GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
ToPlayer()->StopCastingCharm();
|
||||
ToPlayer()->StopCastingBindSight();
|
||||
ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
|
||||
ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
|
||||
}
|
||||
|
||||
// StopCastingCharm may remove a possessed pet?
|
||||
@@ -18706,8 +18714,11 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
|
||||
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
|
||||
}
|
||||
}
|
||||
GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, GetFollowAngle());
|
||||
playerCharmer->CharmSpellInitialize();
|
||||
if (playerCharmer->m_seer != this)
|
||||
{
|
||||
GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, GetFollowAngle());
|
||||
playerCharmer->CharmSpellInitialize();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -19979,17 +19990,27 @@ void Unit::_ExitVehicle(Position const* exitPosition)
|
||||
pos = *exitPosition;
|
||||
|
||||
// HACK
|
||||
if (vehicle->GetVehicleInfo()->m_ID == 380) // Kologarn right arm
|
||||
pos.Relocate(1776.0f, -24.0f, 448.75f, 0.0f);
|
||||
else if (vehicle->GetVehicleInfo()->m_ID == 91) // Helsman's Ship
|
||||
pos.Relocate(2802.18f, 7054.91f, -0.6f, 4.67f);
|
||||
else if (vehicle->GetVehicleInfo()->m_ID == 349) // AT Mounts, dismount to the right
|
||||
VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
|
||||
if (vehicleInfo)
|
||||
{
|
||||
float x = pos.GetPositionX() + 2.0f * cos(pos.GetOrientation() - M_PI / 2.0f);
|
||||
float y = pos.GetPositionY() + 2.0f * std::sin(pos.GetOrientation() - M_PI / 2.0f);
|
||||
float z = GetMapHeight(x, y, pos.GetPositionZ());
|
||||
if (z > INVALID_HEIGHT)
|
||||
pos.Relocate(x, y, z);
|
||||
if (vehicleInfo->m_ID == 380) // Kologarn right arm
|
||||
{
|
||||
pos.Relocate(1776.0f, -24.0f, 448.75f, 0.0f);
|
||||
}
|
||||
else if (vehicleInfo->m_ID == 91) // Helsman's Ship
|
||||
{
|
||||
pos.Relocate(2802.18f, 7054.91f, -0.6f, 4.67f);
|
||||
}
|
||||
else if (vehicleInfo->m_ID == 349) // AT Mounts, dismount to the right
|
||||
{
|
||||
float x = pos.GetPositionX() + 2.0f * cos(pos.GetOrientation() - M_PI / 2.0f);
|
||||
float y = pos.GetPositionY() + 2.0f * std::sin(pos.GetOrientation() - M_PI / 2.0f);
|
||||
float z = GetMapHeight(x, y, pos.GetPositionZ());
|
||||
if (z > INVALID_HEIGHT)
|
||||
{
|
||||
pos.Relocate(x, y, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AddUnitState(UNIT_STATE_MOVE);
|
||||
@@ -20009,7 +20030,7 @@ void Unit::_ExitVehicle(Position const* exitPosition)
|
||||
}
|
||||
|
||||
// xinef: hack for flameleviathan seat vehicle
|
||||
if (vehicle->GetVehicleInfo()->m_ID != 341)
|
||||
if (!vehicleInfo || vehicleInfo->m_ID != 341)
|
||||
{
|
||||
Movement::MoveSplineInit init(this);
|
||||
init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
|
||||
@@ -20031,16 +20052,18 @@ void Unit::_ExitVehicle(Position const* exitPosition)
|
||||
}
|
||||
|
||||
// xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
|
||||
if (GetTypeId() == TYPEID_UNIT && !CanFly() &&
|
||||
(vehicle->GetVehicleInfo()->m_ID == 113 || vehicle->GetVehicleInfo()->m_ID == 8 || vehicle->GetVehicleInfo()->m_ID == 290 || vehicle->GetVehicleInfo()->m_ID == 298))
|
||||
if (GetTypeId() == TYPEID_UNIT && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
|
||||
{
|
||||
GetMotionMaster()->MoveFall();
|
||||
//GetMotionMaster()->MoveFall(); // Enable this once passenger positions are calculater properly (see above)
|
||||
}
|
||||
|
||||
if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
|
||||
if (((Minion*)vehicleBase)->GetOwner() == this)
|
||||
{
|
||||
if (vehicle->GetVehicleInfo()->m_ID != 349)
|
||||
if (!vehicleInfo || vehicleInfo->m_ID != 349)
|
||||
{
|
||||
vehicle->Dismiss();
|
||||
}
|
||||
else if (vehicleBase->GetTypeId() == TYPEID_UNIT)
|
||||
{
|
||||
vehicle->Uninstall();
|
||||
|
||||
@@ -1337,7 +1337,7 @@ public:
|
||||
|
||||
void Update(uint32 time) override;
|
||||
|
||||
void setAttackTimer(WeaponAttackType type, int32 time) { m_attackTimer[type] = time; }
|
||||
void setAttackTimer(WeaponAttackType type, int32 time) { m_attackTimer[type] = time; } /// @todo - Look to convert to std::chrono
|
||||
void resetAttackTimer(WeaponAttackType type = BASE_ATTACK);
|
||||
[[nodiscard]] int32 getAttackTimer(WeaponAttackType type) const { return m_attackTimer[type]; }
|
||||
[[nodiscard]] bool isAttackReady(WeaponAttackType type = BASE_ATTACK) const { return m_attackTimer[type] <= 0; }
|
||||
@@ -2467,6 +2467,8 @@ public:
|
||||
|
||||
bool m_cannotReachTarget;
|
||||
|
||||
[[nodiscard]] uint32 GetOldFactionId() const { return _oldFactionId; }
|
||||
|
||||
protected:
|
||||
explicit Unit (bool isWorldObject);
|
||||
|
||||
|
||||
@@ -8204,6 +8204,81 @@ void ObjectMgr::AddReservedPlayerName(std::string const& name)
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadProfanityPlayersNames()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
_profanityNamesStore.clear(); // need for reload case
|
||||
|
||||
QueryResult result = CharacterDatabase.Query("SELECT name FROM profanity_name");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
LOG_WARN("server.loading", ">> Loaded 0 profanity player names. DB table `profanity_name` is empty!");
|
||||
LOG_INFO("server.loading", " ");
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
Field* fields;
|
||||
do
|
||||
{
|
||||
fields = result->Fetch();
|
||||
std::string name = fields[0].Get<std::string>();
|
||||
|
||||
std::wstring wstr;
|
||||
if (!Utf8toWStr (name, wstr))
|
||||
{
|
||||
LOG_ERROR("sql.sql", "Table `profanity_name` have invalid name: {}", name);
|
||||
continue;
|
||||
}
|
||||
|
||||
wstrToLower(wstr);
|
||||
|
||||
_profanityNamesStore.insert(wstr);
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
|
||||
LOG_INFO("server.loading", ">> Loaded {} profanity player names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
LOG_INFO("server.loading", " ");
|
||||
}
|
||||
|
||||
bool ObjectMgr::IsProfanityName(std::string_view name) const
|
||||
{
|
||||
// pussywizard
|
||||
if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
|
||||
return true;
|
||||
|
||||
std::wstring wstr;
|
||||
if (!Utf8toWStr (name, wstr))
|
||||
return false;
|
||||
|
||||
wstrToLower(wstr);
|
||||
|
||||
return _profanityNamesStore.find(wstr) != _profanityNamesStore.end();
|
||||
}
|
||||
|
||||
void ObjectMgr::AddProfanityPlayerName(std::string const& name)
|
||||
{
|
||||
if (!IsProfanityName(name))
|
||||
{
|
||||
std::wstring wstr;
|
||||
if (!Utf8toWStr(name, wstr))
|
||||
{
|
||||
LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
|
||||
return;
|
||||
}
|
||||
wstrToLower(wstr);
|
||||
|
||||
_profanityNamesStore.insert(wstr);
|
||||
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PROFANITY_PLAYER_NAME);
|
||||
stmt->SetData(0, name);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
}
|
||||
|
||||
enum LanguageType
|
||||
{
|
||||
LT_BASIC_LATIN = 0x0000,
|
||||
@@ -8311,6 +8386,11 @@ uint8 ObjectMgr::CheckPlayerName(std::string_view name, bool create)
|
||||
return CHAR_NAME_RESERVED;
|
||||
}
|
||||
|
||||
if (sObjectMgr->IsProfanityName(name))
|
||||
{
|
||||
return CHAR_NAME_PROFANE;
|
||||
}
|
||||
|
||||
// Check for Reserved Name from DBC
|
||||
if (sWorld->getBoolConfig(CONFIG_STRICT_NAMES_RESERVED))
|
||||
{
|
||||
|
||||
@@ -1338,6 +1338,11 @@ public:
|
||||
[[nodiscard]] bool IsReservedName(std::string_view name) const;
|
||||
void AddReservedPlayerName(std::string const& name);
|
||||
|
||||
// profanity names
|
||||
void LoadProfanityPlayersNames();
|
||||
[[nodiscard]] bool IsProfanityName(std::string_view name) const;
|
||||
void AddProfanityPlayerName(std::string const& name);
|
||||
|
||||
// name with valid structure and symbols
|
||||
static uint8 CheckPlayerName(std::string_view name, bool create = false);
|
||||
static PetNameInvalidReason CheckPetName(std::string_view name);
|
||||
@@ -1507,6 +1512,10 @@ private:
|
||||
typedef std::set<std::wstring> ReservedNamesContainer;
|
||||
ReservedNamesContainer _reservedNamesStore;
|
||||
|
||||
//character profanity names
|
||||
typedef std::set<std::wstring> ProfanityNamesContainer;
|
||||
ReservedNamesContainer _profanityNamesStore;
|
||||
|
||||
GameTeleContainer _gameTeleStore;
|
||||
|
||||
ScriptNameContainer _scriptNamesStore;
|
||||
|
||||
@@ -860,7 +860,7 @@ namespace Acore
|
||||
AnyUnfriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range) : i_obj(obj), i_funit(funit), i_range(range) {}
|
||||
bool operator()(Unit* u)
|
||||
{
|
||||
if (u->IsAlive() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u) &&
|
||||
if (u->IsAlive() && !u->IsCritter() && i_obj->IsWithinDistInMap(u, i_range) && !i_funit->IsFriendlyTo(u) &&
|
||||
(i_funit->GetTypeId() != TYPEID_UNIT || !i_funit->ToCreature()->IsAvoidingAOE())) // pussywizard
|
||||
return true;
|
||||
else
|
||||
|
||||
@@ -1184,7 +1184,7 @@ void Guild::OnPlayerStatusChange(Player* player, uint32 flag, bool state)
|
||||
|
||||
bool Guild::SetName(std::string_view const& name)
|
||||
{
|
||||
if (m_name == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
if (m_name == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || sObjectMgr->IsProfanityName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -409,7 +409,10 @@ void WorldSession::DoLootRelease(ObjectGuid lguid)
|
||||
}
|
||||
|
||||
//Player is not looking at loot list, he doesn't need to see updates on the loot list
|
||||
loot->RemoveLooter(player->GetGUID());
|
||||
if (!lguid.IsItem())
|
||||
{
|
||||
loot->RemoveLooter(player->GetGUID());
|
||||
}
|
||||
}
|
||||
|
||||
void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData)
|
||||
|
||||
@@ -289,10 +289,6 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket& recvData)
|
||||
if (unit->GetNpcFlags() == UNIT_NPC_FLAG_NONE)
|
||||
return;
|
||||
|
||||
// xinef: do not allow to open gossip when npc is in combat
|
||||
if (unit->GetNpcFlags() == UNIT_NPC_FLAG_GOSSIP && unit->IsInCombat()) // should work on all flags?
|
||||
return;
|
||||
|
||||
// set faction visible if needed
|
||||
if (FactionTemplateEntry const* factionTemplateEntry = sFactionTemplateStore.LookupEntry(unit->GetFaction()))
|
||||
_player->GetReputationMgr().SetVisible(factionTemplateEntry);
|
||||
|
||||
@@ -861,6 +861,12 @@ void WorldSession::HandlePetRename(WorldPacket& recvData)
|
||||
return;
|
||||
}
|
||||
|
||||
if (sObjectMgr->IsProfanityName(name))
|
||||
{
|
||||
SendPetNameInvalid(PET_NAME_PROFANE, name, nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
pet->SetName(name);
|
||||
|
||||
Unit* owner = pet->GetOwner();
|
||||
|
||||
@@ -137,7 +137,7 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket& recvData)
|
||||
return;
|
||||
}
|
||||
|
||||
if (sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
if (sObjectMgr->IsReservedName(name) || sObjectMgr->IsProfanityName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
{
|
||||
Guild::SendCommandResult(this, GUILD_COMMAND_CREATE, ERR_GUILD_NAME_INVALID, name);
|
||||
return;
|
||||
@@ -150,7 +150,7 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket& recvData)
|
||||
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_EXISTS_S);
|
||||
return;
|
||||
}
|
||||
if (sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
if (sObjectMgr->IsReservedName(name) || sObjectMgr->IsProfanityName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
{
|
||||
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_INVALID);
|
||||
return;
|
||||
@@ -351,7 +351,7 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
|
||||
Guild::SendCommandResult(this, GUILD_COMMAND_CREATE, ERR_GUILD_NAME_EXISTS_S, newName);
|
||||
return;
|
||||
}
|
||||
if (sObjectMgr->IsReservedName(newName) || !ObjectMgr::IsValidCharterName(newName))
|
||||
if (sObjectMgr->IsReservedName(newName) || sObjectMgr->IsProfanityName(newName) || !ObjectMgr::IsValidCharterName(newName))
|
||||
{
|
||||
Guild::SendCommandResult(this, GUILD_COMMAND_CREATE, ERR_GUILD_NAME_INVALID, newName);
|
||||
return;
|
||||
@@ -364,7 +364,7 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
|
||||
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, newName, "", ERR_ARENA_TEAM_NAME_EXISTS_S);
|
||||
return;
|
||||
}
|
||||
if (sObjectMgr->IsReservedName(newName) || !ObjectMgr::IsValidCharterName(newName))
|
||||
if (sObjectMgr->IsReservedName(newName) || sObjectMgr->IsProfanityName(newName) || !ObjectMgr::IsValidCharterName(newName))
|
||||
{
|
||||
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, newName, "", ERR_ARENA_TEAM_NAME_INVALID);
|
||||
return;
|
||||
|
||||
@@ -612,6 +612,35 @@ void InstanceScript::DoCastSpellOnPlayers(uint32 spell)
|
||||
player->CastSpell(player, spell, true);
|
||||
}
|
||||
|
||||
void InstanceScript::DoCastSpellOnPlayer(Player* player, uint32 spell, bool includePets /*= false*/, bool includeControlled /*= false*/)
|
||||
{
|
||||
if (!player)
|
||||
return;
|
||||
|
||||
player->CastSpell(player, spell, true);
|
||||
|
||||
if (!includePets)
|
||||
return;
|
||||
|
||||
for (uint8 itr2 = 0; itr2 < MAX_SUMMON_SLOT; ++itr2)
|
||||
{
|
||||
ObjectGuid summonGUID = player->m_SummonSlot[itr2];
|
||||
if (!summonGUID.IsEmpty())
|
||||
if (Creature* summon = instance->GetCreature(summonGUID))
|
||||
summon->CastSpell(player, spell, true);
|
||||
}
|
||||
|
||||
if (!includeControlled)
|
||||
return;
|
||||
|
||||
for (auto itr2 = player->m_Controlled.begin(); itr2 != player->m_Controlled.end(); ++itr2)
|
||||
{
|
||||
if (Unit* controlled = *itr2)
|
||||
if (controlled->IsInWorld() && controlled->GetTypeId() == TYPEID_UNIT)
|
||||
controlled->CastSpell(player, spell, true);
|
||||
}
|
||||
}
|
||||
|
||||
bool InstanceScript::CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/ /*= nullptr*/, uint32 /*miscvalue1*/ /*= 0*/)
|
||||
{
|
||||
LOG_ERROR("scripts.ai", "Achievement system call InstanceScript::CheckAchievementCriteriaMeet but instance script for map {} not have implementation for achievement criteria {}",
|
||||
|
||||
@@ -220,6 +220,9 @@ public:
|
||||
// Cast spell on all players in instance
|
||||
void DoCastSpellOnPlayers(uint32 spell);
|
||||
|
||||
// Cast spell on player
|
||||
void DoCastSpellOnPlayer(Player* player, uint32 spell, bool includePets /*= false*/, bool includeControlled /*= false*/);
|
||||
|
||||
// Return wether server allow two side groups or not
|
||||
bool ServerAllowsTwoSideGroups() { return sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP); }
|
||||
|
||||
|
||||
@@ -190,6 +190,7 @@ uint32 LootStore::LoadLootTable()
|
||||
|
||||
// Looking for the template of the entry
|
||||
// often entries are put together
|
||||
// cppcheck-suppress eraseDereference
|
||||
if (m_LootTemplates.empty() || tab->first != entry)
|
||||
{
|
||||
// Searching the template (in case template Id changed)
|
||||
|
||||
@@ -218,7 +218,7 @@ enum AcoreStrings
|
||||
LANG_GRID_POSITION = 178,
|
||||
// 179-185 used in other client versions
|
||||
LANG_TRANSPORT_POSITION = 186,
|
||||
// 187
|
||||
LANG_PROFANITY_NAME = 187,
|
||||
LANG_2FA_SECRET_TOO_LONG = 188,
|
||||
LANG_2FA_SECRET_INVALID = 189,
|
||||
LANG_2FA_SECRET_SET_COMPLETE = 190,
|
||||
|
||||
@@ -296,7 +296,13 @@ static Optional<float> GetVelocity(Unit* owner, Unit* target, G3D::Vector3 const
|
||||
if (!owner->IsInCombat() && !owner->IsVehicle() && !owner->HasUnitFlag(UNIT_FLAG_POSSESSED) &&
|
||||
(owner->IsPet() || owner->IsGuardian() || owner->GetGUID() == target->GetCritterGUID() || owner->GetCharmerOrOwnerGUID() == target->GetGUID()))
|
||||
{
|
||||
UnitMoveType moveType = Movement::SelectSpeedType(target->GetUnitMovementFlags());
|
||||
uint32 moveFlags = target->GetUnitMovementFlags();
|
||||
if (target->movespline->isWalking())
|
||||
{
|
||||
moveFlags |= MOVEMENTFLAG_WALKING;
|
||||
}
|
||||
|
||||
UnitMoveType moveType = Movement::SelectSpeedType(moveFlags);
|
||||
speed = std::max(target->GetSpeed(moveType), owner->GetSpeed(moveType));
|
||||
|
||||
if (playerPet)
|
||||
@@ -503,8 +509,8 @@ bool FollowMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
||||
|
||||
Movement::MoveSplineInit init(owner);
|
||||
init.MovebyPath(i_path->GetPath());
|
||||
init.SetWalk(target->IsWalking());
|
||||
if (Optional<float> velocity = GetVelocity(owner, target, i_path->GetActualEndPosition(), owner->IsGuardian() && target->GetTypeId() == TYPEID_PLAYER))
|
||||
init.SetWalk(target->IsWalking() || target->movespline->isWalking());
|
||||
if (Optional<float> velocity = GetVelocity(owner, target, i_path->GetActualEndPosition(), owner->IsGuardian()))
|
||||
init.SetVelocity(*velocity);
|
||||
init.Launch();
|
||||
}
|
||||
|
||||
@@ -1102,8 +1102,12 @@ void WorldSession::ReadMovementInfo(WorldPacket& data, MovementInfo* mi)
|
||||
e.g. aerial combat.
|
||||
*/
|
||||
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSecurity() == SEC_PLAYER && !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_FLY) && !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
|
||||
MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY);
|
||||
if (mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSecurity() == SEC_PLAYER && !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_FLY) && !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED))
|
||||
{
|
||||
// Inform the client we can no longer fly, which is required if data mismatches for some reason
|
||||
// Like flight auras being removed but the client still sends flight movement packets.
|
||||
GetPlayer()->SetCanFly(false);
|
||||
}
|
||||
|
||||
//! Cannot fly and fall at the same time
|
||||
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_DISABLE_GRAVITY) && mi->HasMovementFlag(MOVEMENTFLAG_FALLING),
|
||||
|
||||
@@ -6032,13 +6032,6 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)
|
||||
Unit::Kill(target, target);
|
||||
return;
|
||||
}
|
||||
// Spellcloth
|
||||
case 31373:
|
||||
{
|
||||
// Summon Elemental after create item
|
||||
target->SummonCreature(17870, 0, 0, 0, target->GetOrientation(), TEMPSUMMON_DEAD_DESPAWN, 0);
|
||||
return;
|
||||
}
|
||||
// Eye of Grillok
|
||||
case 38495:
|
||||
triggerSpellId = 38530;
|
||||
|
||||
@@ -131,7 +131,7 @@ public:
|
||||
int32 CalcMaxDuration() const { return CalcMaxDuration(GetCaster()); }
|
||||
int32 CalcMaxDuration(Unit* caster) const;
|
||||
int32 GetDuration() const { return m_duration; }
|
||||
void SetDuration(int32 duration, bool withMods = false);
|
||||
void SetDuration(int32 duration, bool withMods = false); /// @todo - Look to convert to std::chrono
|
||||
void RefreshDuration(bool withMods = false);
|
||||
void RefreshTimers(bool periodicReset = false);
|
||||
void RefreshTimersWithMods();
|
||||
|
||||
@@ -3352,6 +3352,7 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
|
||||
// some spell specific modifiers
|
||||
float totalDamagePercentMod = 100.0f; // applied to final bonus+weapon damage
|
||||
int32 spell_bonus = 0; // bonus specific for spell
|
||||
bool normalized = false;
|
||||
|
||||
switch (m_spellInfo->SpellFamilyName)
|
||||
{
|
||||
@@ -3438,6 +3439,18 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
|
||||
spell_bonus += int32(0.08f * m_caster->GetTotalAttackPowerValue(BASE_ATTACK));
|
||||
spell_bonus += int32(0.13f * m_caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()));
|
||||
}
|
||||
|
||||
switch (m_spellInfo->Id)
|
||||
{
|
||||
case 20424: // Seal of Command
|
||||
case 42463: // Seal of Vengeance
|
||||
case 53739: // Seal of Corruption
|
||||
case 53385: // Divine Storm
|
||||
normalized = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELLFAMILY_SHAMAN:
|
||||
@@ -3557,14 +3570,9 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex)
|
||||
}
|
||||
}
|
||||
|
||||
bool normalized = false;
|
||||
float weaponDamagePercentMod = 100.0f;
|
||||
int32 fixed_bonus = 0;
|
||||
|
||||
// xinef: Divine Storm deals normalized damage
|
||||
if (m_spellInfo->Id == 53385)
|
||||
normalized = true;
|
||||
|
||||
for (int j = 0; j < MAX_SPELL_EFFECTS; ++j)
|
||||
{
|
||||
switch (m_spellInfo->Effects[j].Effect)
|
||||
@@ -4939,7 +4947,8 @@ void Spell::EffectCharge(SpellEffIndex /*effIndex*/)
|
||||
m_caster->ToPlayer()->SetFallInformation(GameTime::GetGameTime().count(), m_caster->GetPositionZ());
|
||||
|
||||
ObjectGuid targetGUID = ObjectGuid::Empty;
|
||||
if (!m_spellInfo->IsPositive() && m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->GetTarget() == unitTarget->GetGUID())
|
||||
if (!m_spellInfo->HasAttribute(SPELL_ATTR0_CANCELS_AUTO_ATTACK_COMBAT) && !m_spellInfo->IsPositive() && m_caster->GetTypeId() == TYPEID_PLAYER &&
|
||||
m_caster->GetTarget() == unitTarget->GetGUID())
|
||||
{
|
||||
targetGUID = unitTarget->GetGUID();
|
||||
}
|
||||
|
||||
@@ -4470,6 +4470,18 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
{
|
||||
spellInfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT;
|
||||
});
|
||||
// Game In Session
|
||||
ApplySpellFix({ 39331 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_APPLY_AURA;
|
||||
spellInfo->Attributes |= SPELL_ATTR0_NO_AURA_CANCEL;
|
||||
spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CHANGE_MAP;
|
||||
});
|
||||
// Death Ray Warning Visual, Death Ray Damage Visual
|
||||
ApplySpellFix({ 63882, 63886 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->AttributesEx5 |= SPELL_ATTR5_ALLOW_ACTION_DURING_CHANNEL;
|
||||
});
|
||||
|
||||
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
|
||||
{
|
||||
|
||||
@@ -154,6 +154,11 @@ bool Warden::IsValidCheckSum(uint32 checksum, const uint8* data, const uint16 le
|
||||
}
|
||||
}
|
||||
|
||||
bool Warden::IsInitialized()
|
||||
{
|
||||
return _initialized;
|
||||
}
|
||||
|
||||
union keyData
|
||||
{
|
||||
std::array<uint8, 20> bytes;
|
||||
@@ -240,28 +245,28 @@ void Warden::ApplyPenalty(uint16 checkId, std::string const& reason)
|
||||
{
|
||||
if (Player const* plr = _session->GetPlayer())
|
||||
{
|
||||
std::string const reportFormat = "Player %s (guid %u, account id: %u) failed warden %u check (%s). Action: %s";
|
||||
reportMsg = Acore::StringFormat(reportFormat, plr->GetName().c_str(), plr->GetGUID().GetCounter(), _session->GetAccountId(),
|
||||
checkId, ((checkData && !checkData->Comment.empty()) ? checkData->Comment.c_str() : "<warden comment is not set>"),
|
||||
GetWardenActionStr(action).c_str());
|
||||
std::string const reportFormat = "Player {} (guid {}, account id: {}) failed warden {} check ({}). Action: {}";
|
||||
reportMsg = Acore::StringFormatFmt(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(),
|
||||
checkId, ((checkData && !checkData->Comment.empty()) ? checkData->Comment : "<warden comment is not set>"),
|
||||
GetWardenActionStr(action));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string const reportFormat = "Account id: %u failed warden %u check. Action: %s";
|
||||
reportMsg = Acore::StringFormat(reportFormat, _session->GetAccountId(), checkId, GetWardenActionStr(action).c_str());
|
||||
std::string const reportFormat = "Account id: {} failed warden {} check. Action: {}";
|
||||
reportMsg = Acore::StringFormatFmt(reportFormat, _session->GetAccountId(), checkId, GetWardenActionStr(action));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Player const* plr = _session->GetPlayer())
|
||||
{
|
||||
std::string const reportFormat = "Player %s (guid %u, account id: %u) triggered warden penalty by reason: %s. Action: %s";
|
||||
reportMsg = Acore::StringFormat(reportFormat, plr->GetName().c_str(), plr->GetGUID().GetCounter(), _session->GetAccountId(), causeMsg.c_str(), GetWardenActionStr(action).c_str());
|
||||
std::string const reportFormat = "Player {} (guid {}, account id: {}) triggered warden penalty by reason: {}. Action: {}";
|
||||
reportMsg = Acore::StringFormatFmt(reportFormat, plr->GetName(), plr->GetGUID().GetCounter(), _session->GetAccountId(), causeMsg, GetWardenActionStr(action));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string const reportFormat = "Account id: %u failed warden %u check. Action: %s";
|
||||
reportMsg = Acore::StringFormat(reportFormat, _session->GetAccountId(), causeMsg.c_str(), GetWardenActionStr(action).c_str());
|
||||
std::string const reportFormat = "Account id: {} failed warden {} check. Action: {}";
|
||||
reportMsg = Acore::StringFormatFmt(reportFormat, _session->GetAccountId(), causeMsg, GetWardenActionStr(action));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -115,6 +115,7 @@ public:
|
||||
virtual void RequestHash() = 0;
|
||||
virtual void HandleHashResult(ByteBuffer &buff) = 0;
|
||||
virtual bool IsCheckInProgress() = 0;
|
||||
virtual bool IsInitialized();
|
||||
virtual void ForceChecks() = 0;
|
||||
virtual void RequestChecks() = 0;
|
||||
virtual void HandleData(ByteBuffer &buff) = 0;
|
||||
|
||||
@@ -561,189 +561,197 @@ void WardenWin::RequestChecks()
|
||||
|
||||
void WardenWin::HandleData(ByteBuffer& buff)
|
||||
{
|
||||
if (!_interrupted)
|
||||
LOG_DEBUG("warden", "Handle data");
|
||||
|
||||
_dataSent = false;
|
||||
_clientResponseTimer = 0;
|
||||
|
||||
uint16 Length;
|
||||
buff >> Length;
|
||||
uint32 Checksum;
|
||||
buff >> Checksum;
|
||||
|
||||
if (Length != (buff.size() - buff.rpos()))
|
||||
{
|
||||
LOG_DEBUG("warden", "Handle data");
|
||||
buff.rfinish();
|
||||
|
||||
_dataSent = false;
|
||||
_clientResponseTimer = 0;
|
||||
|
||||
uint16 Length;
|
||||
buff >> Length;
|
||||
uint32 Checksum;
|
||||
buff >> Checksum;
|
||||
|
||||
if (Length != (buff.size() - buff.rpos()))
|
||||
if (!_interrupted)
|
||||
{
|
||||
buff.rfinish();
|
||||
ApplyPenalty(0, "Failed size checks in HandleData");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsValidCheckSum(Checksum, buff.contents() + buff.rpos(), Length))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsValidCheckSum(Checksum, buff.contents() + buff.rpos(), Length))
|
||||
{
|
||||
buff.rpos(buff.wpos());
|
||||
LOG_DEBUG("warden", "CHECKSUM FAIL");
|
||||
|
||||
if (!_interrupted)
|
||||
{
|
||||
buff.rpos(buff.wpos());
|
||||
LOG_DEBUG("warden", "CHECKSUM FAIL");
|
||||
ApplyPenalty(0, "Failed checksum in HandleData");
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// TIMING_CHECK
|
||||
{
|
||||
uint8 result;
|
||||
buff >> result;
|
||||
/// @todo: test it.
|
||||
if (result == 0x00)
|
||||
{
|
||||
LOG_DEBUG("warden", "TIMING CHECK FAIL result 0x00");
|
||||
// ApplyPenalty(0, "TIMING CHECK FAIL result"); Commented out because of too many false postives. Mostly caused by client stutter.
|
||||
return;
|
||||
}
|
||||
|
||||
// TIMING_CHECK
|
||||
uint32 newClientTicks;
|
||||
buff >> newClientTicks;
|
||||
|
||||
uint32 ticksNow = GameTime::GetGameTimeMS().count();
|
||||
uint32 ourTicks = newClientTicks + (ticksNow - _serverTicks);
|
||||
|
||||
LOG_DEBUG("warden", "ServerTicks {}", ticksNow); // Now
|
||||
LOG_DEBUG("warden", "RequestTicks {}", _serverTicks); // At request
|
||||
LOG_DEBUG("warden", "Ticks {}", newClientTicks); // At response
|
||||
LOG_DEBUG("warden", "Ticks diff {}", ourTicks - newClientTicks);
|
||||
}
|
||||
|
||||
uint16 checkFailed = 0;
|
||||
|
||||
for (uint16 const checkId : _CurrentChecks)
|
||||
{
|
||||
WardenCheck const* rd = sWardenCheckMgr->GetWardenDataById(checkId);
|
||||
|
||||
// Custom payload should be loaded in if equal to over offset.
|
||||
if (!rd && checkId >= WardenPayloadMgr::WardenPayloadOffsetMin)
|
||||
{
|
||||
uint8 result;
|
||||
buff >> result;
|
||||
/// @todo: test it.
|
||||
if (result == 0x00)
|
||||
{
|
||||
LOG_DEBUG("warden", "TIMING CHECK FAIL result 0x00");
|
||||
// ApplyPenalty(0, "TIMING CHECK FAIL result"); Commented out because of too many false postives. Mostly caused by client stutter.
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 newClientTicks;
|
||||
buff >> newClientTicks;
|
||||
|
||||
uint32 ticksNow = GameTime::GetGameTimeMS().count();
|
||||
uint32 ourTicks = newClientTicks + (ticksNow - _serverTicks);
|
||||
|
||||
LOG_DEBUG("warden", "ServerTicks {}", ticksNow); // Now
|
||||
LOG_DEBUG("warden", "RequestTicks {}", _serverTicks); // At request
|
||||
LOG_DEBUG("warden", "Ticks {}", newClientTicks); // At response
|
||||
LOG_DEBUG("warden", "Ticks diff {}", ourTicks - newClientTicks);
|
||||
rd = &_payloadMgr.CachedChecks.at(checkId);
|
||||
}
|
||||
|
||||
uint16 checkFailed = 0;
|
||||
|
||||
for (uint16 const checkId : _CurrentChecks)
|
||||
uint8 const type = rd->Type;
|
||||
switch (type)
|
||||
{
|
||||
WardenCheck const* rd = sWardenCheckMgr->GetWardenDataById(checkId);
|
||||
case MEM_CHECK:
|
||||
{
|
||||
uint8 Mem_Result;
|
||||
buff >> Mem_Result;
|
||||
|
||||
// Custom payload should be loaded in if equal to over offset.
|
||||
if (!rd && checkId >= WardenPayloadMgr::WardenPayloadOffsetMin)
|
||||
if (Mem_Result != 0)
|
||||
{
|
||||
rd = &_payloadMgr.CachedChecks.at(checkId);
|
||||
LOG_DEBUG("warden", "RESULT MEM_CHECK not 0x00, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
continue;
|
||||
}
|
||||
|
||||
uint8 const type = rd->Type;
|
||||
switch (type)
|
||||
WardenCheckResult const* rs = sWardenCheckMgr->GetWardenResultById(checkId);
|
||||
|
||||
std::vector<uint8> result = rs->Result.ToByteVector(0, false);
|
||||
if (memcmp(buff.contents() + buff.rpos(), result.data(), rd->Length) != 0)
|
||||
{
|
||||
case MEM_CHECK:
|
||||
{
|
||||
uint8 Mem_Result;
|
||||
buff >> Mem_Result;
|
||||
|
||||
if (Mem_Result != 0)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MEM_CHECK not 0x00, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
continue;
|
||||
}
|
||||
|
||||
WardenCheckResult const* rs = sWardenCheckMgr->GetWardenResultById(checkId);
|
||||
|
||||
std::vector<uint8> result = rs->Result.ToByteVector(0, false);
|
||||
if (memcmp(buff.contents() + buff.rpos(), result.data(), rd->Length) != 0)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MEM_CHECK fail CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
buff.rpos(buff.rpos() + rd->Length);
|
||||
continue;
|
||||
}
|
||||
|
||||
LOG_DEBUG("warden", "RESULT MEM_CHECK fail CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
buff.rpos(buff.rpos() + rd->Length);
|
||||
LOG_DEBUG("warden", "RESULT MEM_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
case PAGE_CHECK_A:
|
||||
case PAGE_CHECK_B:
|
||||
case DRIVER_CHECK:
|
||||
case MODULE_CHECK:
|
||||
|
||||
buff.rpos(buff.rpos() + rd->Length);
|
||||
LOG_DEBUG("warden", "RESULT MEM_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
break;
|
||||
}
|
||||
case PAGE_CHECK_A:
|
||||
case PAGE_CHECK_B:
|
||||
case DRIVER_CHECK:
|
||||
case MODULE_CHECK:
|
||||
{
|
||||
uint8 const byte = 0xE9;
|
||||
if (memcmp(buff.contents() + buff.rpos(), &byte, sizeof(uint8)) != 0)
|
||||
{
|
||||
uint8 const byte = 0xE9;
|
||||
if (memcmp(buff.contents() + buff.rpos(), &byte, sizeof(uint8)) != 0)
|
||||
{
|
||||
if (type == PAGE_CHECK_A || type == PAGE_CHECK_B)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT PAGE_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
|
||||
if (type == MODULE_CHECK)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MODULE_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
|
||||
if (type == DRIVER_CHECK)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT DRIVER_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
|
||||
checkFailed = checkId;
|
||||
buff.rpos(buff.rpos() + 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
buff.rpos(buff.rpos() + 1);
|
||||
|
||||
if (type == PAGE_CHECK_A || type == PAGE_CHECK_B)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT PAGE_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
LOG_DEBUG("warden", "RESULT PAGE_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
else if (type == MODULE_CHECK)
|
||||
|
||||
if (type == MODULE_CHECK)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MODULE_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
LOG_DEBUG("warden", "RESULT MODULE_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
else if (type == DRIVER_CHECK)
|
||||
|
||||
if (type == DRIVER_CHECK)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT DRIVER_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
LOG_DEBUG("warden", "RESULT DRIVER_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
break;
|
||||
|
||||
checkFailed = checkId;
|
||||
buff.rpos(buff.rpos() + 1);
|
||||
continue;
|
||||
}
|
||||
case LUA_EVAL_CHECK:
|
||||
|
||||
buff.rpos(buff.rpos() + 1);
|
||||
|
||||
if (type == PAGE_CHECK_A || type == PAGE_CHECK_B)
|
||||
{
|
||||
uint8 const result = buff.read<uint8>();
|
||||
|
||||
if (result == 0)
|
||||
{
|
||||
buff.read_skip(buff.read<uint8>()); // discard attached string
|
||||
}
|
||||
|
||||
LOG_DEBUG("warden", "LUA_EVAL_CHECK CheckId {} account Id {} got in-warden dummy response", checkId, _session->GetAccountId()/* , result */);
|
||||
break;
|
||||
LOG_DEBUG("warden", "RESULT PAGE_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
case MPQ_CHECK:
|
||||
else if (type == MODULE_CHECK)
|
||||
{
|
||||
uint8 Mpq_Result;
|
||||
buff >> Mpq_Result;
|
||||
|
||||
if (Mpq_Result != 0)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MPQ_CHECK not 0x00 account id {}", _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
continue;
|
||||
}
|
||||
|
||||
WardenCheckResult const* rs = sWardenCheckMgr->GetWardenResultById(checkId);
|
||||
if (memcmp(buff.contents() + buff.rpos(), rs->Result.ToByteArray<20>(false).data(), Acore::Crypto::Constants::SHA1_DIGEST_LENGTH_BYTES) != 0) // SHA1
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MPQ_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
buff.rpos(buff.rpos() + Acore::Crypto::Constants::SHA1_DIGEST_LENGTH_BYTES); // 20 bytes SHA1
|
||||
continue;
|
||||
}
|
||||
|
||||
buff.rpos(buff.rpos() + Acore::Crypto::Constants::SHA1_DIGEST_LENGTH_BYTES); // 20 bytes SHA1
|
||||
LOG_DEBUG("warden", "RESULT MPQ_CHECK passed, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
break;
|
||||
LOG_DEBUG("warden", "RESULT MODULE_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
else if (type == DRIVER_CHECK)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT DRIVER_CHECK passed CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (checkFailed > 0)
|
||||
case LUA_EVAL_CHECK:
|
||||
{
|
||||
ApplyPenalty(checkFailed, "");
|
||||
uint8 const result = buff.read<uint8>();
|
||||
|
||||
if (result == 0)
|
||||
{
|
||||
buff.read_skip(buff.read<uint8>()); // discard attached string
|
||||
}
|
||||
|
||||
LOG_DEBUG("warden", "LUA_EVAL_CHECK CheckId {} account Id {} got in-warden dummy response", checkId, _session->GetAccountId()/* , result */);
|
||||
break;
|
||||
}
|
||||
case MPQ_CHECK:
|
||||
{
|
||||
uint8 Mpq_Result;
|
||||
buff >> Mpq_Result;
|
||||
|
||||
if (Mpq_Result != 0)
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MPQ_CHECK not 0x00 account id {}", _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
continue;
|
||||
}
|
||||
|
||||
WardenCheckResult const* rs = sWardenCheckMgr->GetWardenResultById(checkId);
|
||||
if (memcmp(buff.contents() + buff.rpos(), rs->Result.ToByteArray<20>(false).data(), Acore::Crypto::Constants::SHA1_DIGEST_LENGTH_BYTES) != 0) // SHA1
|
||||
{
|
||||
LOG_DEBUG("warden", "RESULT MPQ_CHECK fail, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
checkFailed = checkId;
|
||||
buff.rpos(buff.rpos() + Acore::Crypto::Constants::SHA1_DIGEST_LENGTH_BYTES); // 20 bytes SHA1
|
||||
continue;
|
||||
}
|
||||
|
||||
buff.rpos(buff.rpos() + Acore::Crypto::Constants::SHA1_DIGEST_LENGTH_BYTES); // 20 bytes SHA1
|
||||
LOG_DEBUG("warden", "RESULT MPQ_CHECK passed, CheckId {} account Id {}", checkId, _session->GetAccountId());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (checkFailed > 0 && !_interrupted)
|
||||
{
|
||||
ApplyPenalty(checkFailed, "");
|
||||
}
|
||||
|
||||
if (_interrupted)
|
||||
{
|
||||
LOG_DEBUG("warden", "Warden was interrupted by ForceChecks, ignoring results.");
|
||||
|
||||
|
||||
@@ -1912,9 +1912,12 @@ void World::SetInitialWorldSettings()
|
||||
LOG_INFO("server.loading", "Loading Groups...");
|
||||
sGroupMgr->LoadGroups();
|
||||
|
||||
LOG_INFO("server.loading", "Loading ReservedNames...");
|
||||
LOG_INFO("server.loading", "Loading Reserved Names...");
|
||||
sObjectMgr->LoadReservedPlayersNames();
|
||||
|
||||
LOG_INFO("server.loading", "Loading Profanity Names...");
|
||||
sObjectMgr->LoadProfanityPlayersNames();
|
||||
|
||||
LOG_INFO("server.loading", "Loading GameObjects for Quests...");
|
||||
sObjectMgr->LoadGameObjectForQuests();
|
||||
|
||||
|
||||
@@ -363,6 +363,13 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sObjectMgr->IsProfanityName(newName))
|
||||
{
|
||||
handler->SendSysMessage(LANG_PROFANITY_NAME);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME);
|
||||
stmt->SetData(0, newName);
|
||||
PreparedQueryResult result = CharacterDatabase.Query(stmt);
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sObjectMgr->IsReservedName(guildName) || !sObjectMgr->IsValidCharterName(guildName))
|
||||
if (sObjectMgr->IsReservedName(guildName) || sObjectMgr->IsProfanityName(guildName) || !sObjectMgr->IsValidCharterName(guildName))
|
||||
{
|
||||
handler->SendSysMessage(LANG_BAD_VALUE);
|
||||
handler->SetSentErrorMessage(true);
|
||||
|
||||
@@ -143,6 +143,7 @@ public:
|
||||
{ "quest_template", HandleReloadQuestTemplateCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "reference_loot_template", HandleReloadLootTemplatesReferenceCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "reserved_name", HandleReloadReservedNameCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "profanity_name", HandleReloadProfanityNameCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "reputation_reward_rate", HandleReloadReputationRewardRateCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "reputation_spillover_template", HandleReloadReputationRewardRateCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
{ "skill_discovery_template", HandleReloadSkillDiscoveryTemplateCommand, SEC_ADMINISTRATOR, Console::Yes },
|
||||
@@ -204,6 +205,7 @@ public:
|
||||
HandleReloadMailServerTemplateCommand(handler);
|
||||
HandleReloadCommandCommand(handler);
|
||||
HandleReloadReservedNameCommand(handler);
|
||||
HandleReloadProfanityNameCommand(handler);
|
||||
HandleReloadAcoreStringCommand(handler);
|
||||
HandleReloadGameTeleCommand(handler);
|
||||
HandleReloadCreatureMovementOverrideCommand(handler);
|
||||
@@ -779,9 +781,17 @@ public:
|
||||
|
||||
static bool HandleReloadReservedNameCommand(ChatHandler* handler)
|
||||
{
|
||||
LOG_INFO("server.loading", "Loading ReservedNames... (`reserved_name`)");
|
||||
LOG_INFO("server.loading", "Re-Loading `reserved_player` Table!");
|
||||
sObjectMgr->LoadReservedPlayersNames();
|
||||
handler->SendGlobalGMSysMessage("DB table `reserved_name` (player reserved names) reloaded.");
|
||||
handler->SendGlobalGMSysMessage("DB table `reserved_name` reloaded.");
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool HandleReloadProfanityNameCommand(ChatHandler* handler)
|
||||
{
|
||||
LOG_INFO("server.loading", "Re-Loading `profanity_player` Table!");
|
||||
sObjectMgr->LoadProfanityPlayersNames();
|
||||
handler->SendGlobalGMSysMessage("DB table `profanity_player` reloaded.");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -121,13 +121,13 @@ public:
|
||||
};
|
||||
};
|
||||
|
||||
struct Wave
|
||||
struct WaveCreature
|
||||
{
|
||||
uint32 entry;
|
||||
uint32 amount;
|
||||
};
|
||||
|
||||
static Wave RingMobs[] = // different amounts based on the type
|
||||
static WaveCreature RingMobs[] = // different amounts based on the type
|
||||
{
|
||||
{NPC_DREDGE_WORM, 3},
|
||||
{NPC_DEEP_STINGER, 3},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -60,6 +60,10 @@ public:
|
||||
OperaEvent = urand(EVENT_OZ, EVENT_RAJ);
|
||||
OzDeathCount = 0;
|
||||
OptionalBossCount = 0;
|
||||
|
||||
_chessTeam = TEAM_NEUTRAL;
|
||||
_chessGamePhase = CHESS_PHASE_NOT_STARTED;
|
||||
_chessEvent = NOT_STARTED;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
@@ -88,6 +92,27 @@ public:
|
||||
creature->Respawn(true);
|
||||
}
|
||||
break;
|
||||
case NPC_PAWN_H:
|
||||
case NPC_KNIGHT_H:
|
||||
case NPC_QUEEN_H:
|
||||
case NPC_BISHOP_H:
|
||||
case NPC_ROOK_H:
|
||||
case NPC_KING_H:
|
||||
case NPC_PAWN_A:
|
||||
case NPC_KNIGHT_A:
|
||||
case NPC_QUEEN_A:
|
||||
case NPC_BISHOP_A:
|
||||
case NPC_ROOK_A:
|
||||
case NPC_KING_A:
|
||||
_chessPiecesGUID.insert(creature->GetGUID());
|
||||
creature->SetHealth(creature->GetMaxHealth());
|
||||
break;
|
||||
case NPC_CHESS_EVENT_MEDIVH_CHEAT_FIRES:
|
||||
_medivhCheatFiresGUID.insert(creature->GetGUID());
|
||||
break;
|
||||
case NPC_ECHO_OF_MEDIVH:
|
||||
_echoOfMedivhGUID = creature->GetGUID();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -160,6 +185,82 @@ public:
|
||||
|
||||
break;
|
||||
}
|
||||
case DATA_CHESS_EVENT:
|
||||
{
|
||||
_chessEvent = data;
|
||||
|
||||
switch (data)
|
||||
{
|
||||
case IN_PROGRESS:
|
||||
case SPECIAL:
|
||||
{
|
||||
DoCastSpellOnPlayers(SPELL_GAME_IN_SESSION);
|
||||
for (ObjectGuid const& chessPieceGUID : _chessPiecesGUID)
|
||||
{
|
||||
if (Creature* piece = instance->GetCreature(chessPieceGUID))
|
||||
{
|
||||
if (_chessTeam == TEAM_ALLIANCE)
|
||||
{
|
||||
if (piece->GetFaction() == CHESS_FACTION_ALLIANCE)
|
||||
{
|
||||
piece->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
}
|
||||
else if (_chessTeam == TEAM_HORDE)
|
||||
{
|
||||
if (piece->GetFaction() == CHESS_FACTION_HORDE)
|
||||
{
|
||||
piece->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
piece->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_GAME_IN_SESSION);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CHESS_EVENT_TEAM:
|
||||
_chessTeam = data;
|
||||
break;
|
||||
case DATA_CHESS_REINIT_PIECES:
|
||||
for (ObjectGuid const& chessPieceGUID : _chessPiecesGUID)
|
||||
{
|
||||
if (Creature* piece = instance->GetCreature(chessPieceGUID))
|
||||
{
|
||||
piece->RemoveAllAuras();
|
||||
piece->setDeathState(JUST_RESPAWNED);
|
||||
piece->SetHealth(piece->GetMaxHealth());
|
||||
float x, y, z, o;
|
||||
piece->GetHomePosition(x, y, z, o);
|
||||
piece->NearTeleportTo(x, y, z, o);
|
||||
piece->AI()->DoAction(ACTION_CHESS_PIECE_RESET_ORIENTATION);
|
||||
piece->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||
piece->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
piece->AI()->Reset();
|
||||
}
|
||||
}
|
||||
|
||||
for (ObjectGuid const& medivhCheatFireGUID : _medivhCheatFiresGUID)
|
||||
{
|
||||
if (Creature* fire = instance->GetCreature(medivhCheatFireGUID))
|
||||
{
|
||||
fire->DespawnOrUnsummon();
|
||||
}
|
||||
}
|
||||
|
||||
_medivhCheatFiresGUID.clear();
|
||||
break;
|
||||
case DATA_CHESS_GAME_PHASE:
|
||||
_chessGamePhase = data;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -189,10 +290,6 @@ public:
|
||||
DoRespawnCreature(_barnesGUID, true);
|
||||
}
|
||||
break;
|
||||
case DATA_CHESS:
|
||||
if (state == DONE)
|
||||
DoRespawnGameObject(DustCoveredChest, DAY);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -291,6 +388,12 @@ public:
|
||||
return OperaEvent;
|
||||
case DATA_OPERA_OZ_DEATHCOUNT:
|
||||
return OzDeathCount;
|
||||
case CHESS_EVENT_TEAM:
|
||||
return _chessTeam;
|
||||
case DATA_CHESS_GAME_PHASE:
|
||||
return _chessGamePhase;
|
||||
case DATA_CHESS_EVENT:
|
||||
return _chessEvent;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -332,6 +435,10 @@ public:
|
||||
return ImageGUID;
|
||||
case DATA_NIGHTBANE:
|
||||
return m_uiNightBaneGUID;
|
||||
case DATA_ECHO_OF_MEDIVH:
|
||||
return _echoOfMedivhGUID;
|
||||
case DATA_DUST_COVERED_CHEST:
|
||||
return DustCoveredChest;
|
||||
}
|
||||
|
||||
return ObjectGuid::Empty;
|
||||
@@ -341,8 +448,10 @@ public:
|
||||
uint32 OperaEvent;
|
||||
uint32 OzDeathCount;
|
||||
uint32 OptionalBossCount;
|
||||
//uint32 m_auiEncounter[MAX_ENCOUNTERS];
|
||||
//uint32 m_uiTeam;
|
||||
uint32 _chessTeam;
|
||||
uint32 _chessGamePhase;
|
||||
uint32 _chessEvent;
|
||||
|
||||
ObjectGuid m_uiCurtainGUID;
|
||||
ObjectGuid m_uiStageDoorLeftGUID;
|
||||
ObjectGuid m_uiStageDoorRightGUID;
|
||||
@@ -350,20 +459,22 @@ public:
|
||||
ObjectGuid m_uiTerestianGUID;
|
||||
ObjectGuid m_uiMoroesGUID;
|
||||
ObjectGuid m_uiNightBaneGUID;
|
||||
//ObjectGuid EchoOfMedivhGUID;
|
||||
ObjectGuid m_uiLibraryDoor; // Door at Shade of Aran
|
||||
ObjectGuid m_uiMassiveDoor; // Door at Netherspite
|
||||
ObjectGuid m_uiSideEntranceDoor; // Side Entrance
|
||||
ObjectGuid m_uiGamesmansDoor; // Door before Chess
|
||||
ObjectGuid m_uiGamesmansExitDoor; // Door after Chess
|
||||
ObjectGuid m_uiNetherspaceDoor; // Door at Malchezaar
|
||||
//ObjectGuid m_uiServantsAccessDoor; // Door to Brocken Stair
|
||||
ObjectGuid MastersTerraceDoor[2];
|
||||
ObjectGuid ImageGUID;
|
||||
ObjectGuid DustCoveredChest;
|
||||
ObjectGuid m_uiRelayGUID;
|
||||
ObjectGuid _barnesGUID;
|
||||
ObjectGuid _echoOfMedivhGUID;
|
||||
|
||||
GuidVector _operaDecorations[EVENT_RAJ];
|
||||
GuidSet _chessPiecesGUID;
|
||||
GuidSet _medivhCheatFiresGUID;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ enum KZDataTypes
|
||||
DATA_ARAN = 6,
|
||||
DATA_TERESTIAN = 7,
|
||||
DATA_NETHERSPITE = 8,
|
||||
DATA_CHESS = 9,
|
||||
DATA_CHESS_EVENT = 9,
|
||||
DATA_MALCHEZZAR = 10,
|
||||
DATA_NIGHTBANE = 11,
|
||||
DATA_SERVANT_QUARTERS = 12,
|
||||
@@ -60,40 +60,63 @@ enum KZDataTypes
|
||||
DATA_GO_SIDE_ENTRANCE_DOOR = 29,
|
||||
DATA_PRINCE = 30,
|
||||
DATA_SPAWN_OPERA_DECORATIONS = 31,
|
||||
DATA_MIDNIGHT = 32
|
||||
DATA_MIDNIGHT = 32,
|
||||
|
||||
// Chess Event
|
||||
CHESS_EVENT_TEAM = 33,
|
||||
DATA_CHESS_REINIT_PIECES = 34,
|
||||
DATA_CHESS_GAME_PHASE = 35,
|
||||
DATA_ECHO_OF_MEDIVH = 36,
|
||||
DATA_DUST_COVERED_CHEST = 37
|
||||
};
|
||||
|
||||
enum KZOperaEvents
|
||||
{
|
||||
EVENT_OZ = 1,
|
||||
EVENT_HOOD = 2,
|
||||
EVENT_RAJ = 3
|
||||
EVENT_OZ = 1,
|
||||
EVENT_HOOD = 2,
|
||||
EVENT_RAJ = 3
|
||||
};
|
||||
|
||||
enum KZMiscCreatures
|
||||
enum KZCreatures
|
||||
{
|
||||
NPC_HYAKISS_THE_LURKER = 16179,
|
||||
NPC_ROKAD_THE_RAVAGER = 16181,
|
||||
NPC_SHADIKITH_THE_GLIDER = 16180,
|
||||
NPC_TERESTIAN_ILLHOOF = 15688,
|
||||
NPC_MOROES = 15687,
|
||||
NPC_ATTUMEN_THE_HUNTSMAN = 15550,
|
||||
NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152,
|
||||
NPC_MIDNIGHT = 16151,
|
||||
NPC_NIGHTBANE = 17225,
|
||||
NPC_HYAKISS_THE_LURKER = 16179,
|
||||
NPC_ROKAD_THE_RAVAGER = 16181,
|
||||
NPC_SHADIKITH_THE_GLIDER = 16180,
|
||||
NPC_TERESTIAN_ILLHOOF = 15688,
|
||||
NPC_MOROES = 15687,
|
||||
NPC_ATTUMEN_THE_HUNTSMAN = 15550,
|
||||
NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152,
|
||||
NPC_MIDNIGHT = 16151,
|
||||
NPC_NIGHTBANE = 17225,
|
||||
|
||||
// Trash
|
||||
NPC_COLDMIST_WIDOW = 16171,
|
||||
NPC_COLDMIST_STALKER = 16170,
|
||||
NPC_SHADOWBAT = 16173,
|
||||
NPC_VAMPIRIC_SHADOWBAT = 16175,
|
||||
NPC_GREATER_SHADOWBAT = 16174,
|
||||
NPC_PHASE_HOUND = 16178,
|
||||
NPC_DREADBEAST = 16177,
|
||||
NPC_SHADOWBEAST = 16176,
|
||||
NPC_KILREK = 17229,
|
||||
NPC_RELAY = 17645,
|
||||
NPC_BARNES = 16812
|
||||
NPC_COLDMIST_WIDOW = 16171,
|
||||
NPC_COLDMIST_STALKER = 16170,
|
||||
NPC_SHADOWBAT = 16173,
|
||||
NPC_VAMPIRIC_SHADOWBAT = 16175,
|
||||
NPC_GREATER_SHADOWBAT = 16174,
|
||||
NPC_PHASE_HOUND = 16178,
|
||||
NPC_DREADBEAST = 16177,
|
||||
NPC_SHADOWBEAST = 16176,
|
||||
NPC_KILREK = 17229,
|
||||
NPC_RELAY = 17645,
|
||||
NPC_BARNES = 16812,
|
||||
|
||||
// Chess Event
|
||||
NPC_ECHO_OF_MEDIVH = 16816,
|
||||
NPC_PAWN_H = 17469,
|
||||
NPC_PAWN_A = 17211,
|
||||
NPC_KNIGHT_H = 21748,
|
||||
NPC_KNIGHT_A = 21664,
|
||||
NPC_QUEEN_H = 21750,
|
||||
NPC_QUEEN_A = 21683,
|
||||
NPC_BISHOP_H = 21747,
|
||||
NPC_BISHOP_A = 21682,
|
||||
NPC_ROOK_H = 21726,
|
||||
NPC_ROOK_A = 21160,
|
||||
NPC_KING_H = 21752,
|
||||
NPC_KING_A = 21684,
|
||||
NPC_CHESS_EVENT_MEDIVH_CHEAT_FIRES = 22521
|
||||
};
|
||||
|
||||
enum KZGameObjectIds
|
||||
@@ -124,14 +147,39 @@ enum KZGameObjectIds
|
||||
|
||||
enum KZMisc
|
||||
{
|
||||
OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50
|
||||
OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50,
|
||||
|
||||
ACTION_CHESS_PIECE_RESET_ORIENTATION = 1
|
||||
};
|
||||
|
||||
enum KarazhanSpells
|
||||
{
|
||||
SPELL_RATTLED = 32437,
|
||||
SPELL_OVERLOAD = 29766,
|
||||
SPELL_BLINK = 29884
|
||||
SPELL_RATTLED = 32437,
|
||||
SPELL_OVERLOAD = 29766,
|
||||
SPELL_BLINK = 29884,
|
||||
|
||||
// Chess Event
|
||||
SPELL_GAME_IN_SESSION = 39331,
|
||||
SPELL_HAND_OF_MEDIVH = 39339, // 1st cheat: AOE spell burn cell under enemy chesspieces.
|
||||
SPELL_FURY_OF_MEDIVH = 39383 // 2nd cheat: Berserk own chesspieces.
|
||||
};
|
||||
|
||||
enum KarazhanChessGamePhase
|
||||
{
|
||||
CHESS_PHASE_NOT_STARTED = 0,
|
||||
CHESS_PHASE_PVE_WARMUP = 1, // Medivh has been spoken too but king isn't controlled yet
|
||||
CHESS_PHASE_INPROGRESS_PVE = 2,
|
||||
CHESS_PHASE_FAILED = 3,
|
||||
CHESS_PHASE_PVE_FINISHED = 4,
|
||||
CHESS_PHASE_PVP_WARMUP = 5,
|
||||
CHESS_PHASE_INPROGRESS_PVP = 6 // Get back to PVE_FINISHED after that
|
||||
};
|
||||
|
||||
enum KarazhanChessGameFactions
|
||||
{
|
||||
CHESS_FACTION_HORDE = 1689,
|
||||
CHESS_FACTION_ALLIANCE = 1690,
|
||||
CHESS_FACTION_BOTH = 536
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
|
||||
@@ -68,6 +68,7 @@ void AddSC_instance_karazhan(); //Karazhan
|
||||
void AddSC_boss_servant_quarters();
|
||||
void AddSC_boss_attumen();
|
||||
void AddSC_boss_curator();
|
||||
void AddSC_boss_chess_event();
|
||||
void AddSC_boss_maiden_of_virtue();
|
||||
void AddSC_boss_shade_of_aran();
|
||||
void AddSC_boss_malchezaar();
|
||||
@@ -220,6 +221,7 @@ void AddEasternKingdomsScripts()
|
||||
AddSC_boss_servant_quarters();
|
||||
AddSC_boss_attumen();
|
||||
AddSC_boss_curator();
|
||||
AddSC_boss_chess_event();
|
||||
AddSC_boss_maiden_of_virtue();
|
||||
AddSC_boss_shade_of_aran();
|
||||
AddSC_boss_malchezaar();
|
||||
|
||||
@@ -49,18 +49,18 @@ enum Rinji
|
||||
GO_RINJI_CAGE = 142036
|
||||
};
|
||||
|
||||
struct Location
|
||||
struct LocationXYZ
|
||||
{
|
||||
float posX, posY, posZ;
|
||||
float x, y, z;
|
||||
};
|
||||
|
||||
Location AmbushSpawn[] =
|
||||
LocationXYZ AmbushSpawn[] =
|
||||
{
|
||||
{ 191.296204f, -2839.329346f, 107.388f },
|
||||
{ 70.972466f, -2848.674805f, 109.459f }
|
||||
};
|
||||
|
||||
Location AmbushMoveTo[] =
|
||||
LocationXYZ AmbushMoveTo[] =
|
||||
{
|
||||
{ 166.630386f, -2824.780273f, 108.153f },
|
||||
{ 70.886589f, -2874.335449f, 116.675f }
|
||||
@@ -118,12 +118,12 @@ public:
|
||||
if (!_first)
|
||||
spawnId = 1;
|
||||
|
||||
me->SummonCreature(NPC_RANGER, AmbushSpawn[spawnId].posX, AmbushSpawn[spawnId].posY, AmbushSpawn[spawnId].posZ, 0.0f,
|
||||
me->SummonCreature(NPC_RANGER, AmbushSpawn[spawnId].x, AmbushSpawn[spawnId].y, AmbushSpawn[spawnId].z, 0.0f,
|
||||
TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
|
||||
|
||||
for (int i = 0; i < 2; ++i)
|
||||
{
|
||||
me->SummonCreature(NPC_OUTRUNNER, AmbushSpawn[spawnId].posX, AmbushSpawn[spawnId].posY, AmbushSpawn[spawnId].posZ, 0.0f,
|
||||
me->SummonCreature(NPC_OUTRUNNER, AmbushSpawn[spawnId].x, AmbushSpawn[spawnId].y, AmbushSpawn[spawnId].z, 0.0f,
|
||||
TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000);
|
||||
}
|
||||
}
|
||||
@@ -131,7 +131,7 @@ public:
|
||||
void JustSummoned(Creature* summoned) override
|
||||
{
|
||||
summoned->SetWalk(false);
|
||||
summoned->GetMotionMaster()->MovePoint(0, AmbushMoveTo[spawnId].posX, AmbushMoveTo[spawnId].posY, AmbushMoveTo[spawnId].posZ);
|
||||
summoned->GetMotionMaster()->MovePoint(0, AmbushMoveTo[spawnId].x, AmbushMoveTo[spawnId].y, AmbushMoveTo[spawnId].z);
|
||||
}
|
||||
|
||||
void sQuestAccept(Player* player, Quest const* quest) override
|
||||
|
||||
@@ -748,12 +748,11 @@ enum Worldstates
|
||||
WORLD_STATE_FAIL_H = 3878
|
||||
};
|
||||
|
||||
struct Location
|
||||
{
|
||||
struct LocationXYZO {
|
||||
float x, y, z, o;
|
||||
};
|
||||
|
||||
static Location AllianceSpawn[] =
|
||||
static LocationXYZO AllianceSpawn[] =
|
||||
{
|
||||
{ 1603.97f, 718.02f, 65.10f, 0 }, // guardian // sewers
|
||||
{ 1604.78f, 657.22f, 40.80f, 0 }, // wave 1
|
||||
@@ -788,7 +787,7 @@ static Location AllianceSpawn[] =
|
||||
{ 1307.92f, 395.53f, -63.24f, 4.472f },
|
||||
};
|
||||
|
||||
static Location AllianceWP[] =
|
||||
static LocationXYZO AllianceWP[] =
|
||||
{
|
||||
{ 1737.06f, 734.176f, 48.8f, 0 }, // Jaina sewers UNUSED
|
||||
{ 1682.92f, 730.89f, 76.84f, 0 }, // UNUSED
|
||||
@@ -802,12 +801,12 @@ static Location AllianceWP[] =
|
||||
{ 1300.75f, 347.39f, -65.02f, 0 }, // jaina throne room
|
||||
};
|
||||
|
||||
static Location HordeSpawn[] =
|
||||
static LocationXYZO HordeSpawn[] =
|
||||
{
|
||||
{ 1581.94f, 383.22f, -62.22f, 0 } // Khanok
|
||||
};
|
||||
|
||||
static Location ThrallSpawn[] =
|
||||
static LocationXYZO ThrallSpawn[] =
|
||||
{
|
||||
// Vortex
|
||||
{ 1880.0001f, 237.8242f, 59.472f, 3.060f },
|
||||
|
||||
+5
-1
@@ -118,12 +118,16 @@ public:
|
||||
}
|
||||
else if (id == 2)
|
||||
{
|
||||
me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->Dismount();
|
||||
me->SetWalk(true);
|
||||
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
|
||||
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
|
||||
summon->SetWalk(true);
|
||||
if (Creature* mount = me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN))
|
||||
{
|
||||
mount->SetImmuneToNPC(true);
|
||||
mount->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
|
||||
if (me->movespline->Finalized())
|
||||
|
||||
+4
-4
@@ -21,10 +21,10 @@
|
||||
|
||||
enum EpochHunter
|
||||
{
|
||||
SAY_AGGRO = 3,
|
||||
SAY_SLAY = 4,
|
||||
SAY_BREATH = 5,
|
||||
SAY_DEATH = 6,
|
||||
SAY_AGGRO = 5,
|
||||
SAY_SLAY = 6,
|
||||
SAY_BREATH = 7,
|
||||
SAY_DEATH = 8,
|
||||
|
||||
SPELL_SAND_BREATH = 31914,
|
||||
SPELL_IMPENDING_DEATH = 31916,
|
||||
|
||||
+198
-74
@@ -54,6 +54,9 @@ enum Says
|
||||
SAY_ENTER_CHURCH = 18,
|
||||
SAY_GREET_TARETHA = 19,
|
||||
SAY_CHAT_TARETHA1 = 20,
|
||||
SAY_EMOTE_HORSE = 21,
|
||||
SAY_EMOTE_HORSE_2 = 22,
|
||||
SAY_LEAD = 23,
|
||||
|
||||
SAY_TARETHA_FREE = 0,
|
||||
SAY_TARETHA_ESCAPED = 1,
|
||||
@@ -87,7 +90,10 @@ enum Spells
|
||||
|
||||
SPELL_TELEPORT = 34776,
|
||||
SPELL_MEMORY_WIPE = 33336,
|
||||
SPELL_MEMORY_WIPE_RESUME = 33337
|
||||
SPELL_MEMORY_WIPE_RESUME = 33337,
|
||||
SPELL_KNOCKOUT_ARMORER = 32890,
|
||||
SPELL_SALVATION = 33790,
|
||||
SPELL_DUMMY_AURA = 22805
|
||||
};
|
||||
|
||||
enum Npcs
|
||||
@@ -133,8 +139,10 @@ enum Events
|
||||
EVENT_START_WP = 7,
|
||||
|
||||
EVENT_SET_FACING = 9,
|
||||
EVENT_KILL_ARMORER = 10,
|
||||
EVENT_TALK_KILL_ARMORER = 11,
|
||||
EVENT_ARMORER_SAY = 10,
|
||||
EVENT_THRALL_EMOTE = 11,
|
||||
EVENT_KILL_ARMORER = 12,
|
||||
EVENT_TALK_KILL_ARMORER = 13,
|
||||
|
||||
EVENT_DRESSING_KNEEL = 20,
|
||||
EVENT_DRESSING_ARMOR = 21,
|
||||
@@ -149,12 +157,14 @@ enum Events
|
||||
EVENT_LOOK_1 = 40,
|
||||
EVENT_MOVE_AROUND = 41,
|
||||
EVENT_LOOK_2 = 42,
|
||||
EVENT_LOOK_3 = 43,
|
||||
EVENT_SUMMON_GUARDS = 44,
|
||||
EVENT_SUMMON_GUARDS = 43,
|
||||
EVENT_LOOK_3 = 44,
|
||||
EVENT_SUMMON_TALK1 = 45,
|
||||
EVENT_SUMMON_TALK2 = 46,
|
||||
EVENT_LOOK_4 = 46,
|
||||
EVENT_SUMMON_TALK2 = 47,
|
||||
EVENT_GUARDS_MOVING = 48,
|
||||
|
||||
EVENT_LOOK_4 = 50,
|
||||
EVENT_LOOK_5 = 50,
|
||||
EVENT_SUMMON_GUARDS_2 = 51,
|
||||
EVENT_SUMMON_TALK3 = 52,
|
||||
|
||||
@@ -186,7 +196,8 @@ enum Events
|
||||
EVENT_EROZION_TALK_3 = 89,
|
||||
EVENT_THRALL_TALK_6 = 90,
|
||||
EVENT_THRALL_RUN_AWAY = 91,
|
||||
EVENT_TARETHA_TALK_2 = 92
|
||||
EVENT_TARETHA_TALK_2 = 92,
|
||||
EVENT_EROZION_FLAGS = 93
|
||||
};
|
||||
|
||||
class npc_thrall_old_hillsbrad : public CreatureScript
|
||||
@@ -238,6 +249,8 @@ public:
|
||||
npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature), summons(me)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
_barnWave = false;
|
||||
_churchWave = false;
|
||||
}
|
||||
|
||||
void DoAction(int32 param) override
|
||||
@@ -258,7 +271,7 @@ public:
|
||||
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, 14000);
|
||||
events.ScheduleEvent(EVENT_THRALL_TALK_3, 15000);
|
||||
events.ScheduleEvent(EVENT_THRALL_MOVE_DOWN, 17000);
|
||||
break;
|
||||
case NPC_TARETHA:
|
||||
@@ -268,13 +281,14 @@ public:
|
||||
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, 26000);
|
||||
events.ScheduleEvent(EVENT_EROZION_ACTION_1, 24000);
|
||||
events.ScheduleEvent(EVENT_EROZION_TALK_2, 29000);
|
||||
events.ScheduleEvent(EVENT_EROZION_TALK_3, 42000);
|
||||
events.ScheduleEvent(EVENT_EROZION_ACTION_2, 47000);
|
||||
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);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -298,11 +312,13 @@ public:
|
||||
break;
|
||||
case 8:
|
||||
events.ScheduleEvent(EVENT_SET_FACING, 500);
|
||||
events.ScheduleEvent(EVENT_ARMORER_SAY, 700);
|
||||
events.ScheduleEvent(EVENT_THRALL_EMOTE, 1300);
|
||||
break;
|
||||
case 9:
|
||||
SetRun(false);
|
||||
events.ScheduleEvent(EVENT_KILL_ARMORER, 500);
|
||||
events.ScheduleEvent(EVENT_TALK_KILL_ARMORER, 4000);
|
||||
events.ScheduleEvent(EVENT_TALK_KILL_ARMORER, 3000);
|
||||
break;
|
||||
case 10:
|
||||
SetRun(true);
|
||||
@@ -313,35 +329,33 @@ public:
|
||||
events.ScheduleEvent(EVENT_DRESSING_SHIELD, 9000);
|
||||
events.ScheduleEvent(EVENT_DRESSING_TALK, 12000);
|
||||
break;
|
||||
case 13:
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2200.28f, 137.37f, 87.93f, 5.07f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2197.44f, 131.83f, 87.93f, 0.78f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2203.62f, 135.40f, 87.93f, 3.70f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2200.75f, 130.13f, 87.93f, 1.48f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
break;
|
||||
case 16:
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2147.43f, 122.194f, 76.422f, 0.67f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2146.27f, 126.13f, 76.241f, 0.60f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2142.62f, 120.38f, 75.862f, 0.48f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2141.74f, 123.95f, 75.732f, 0.24f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
break;
|
||||
case 18:
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2138.37f, 167.98f, 66.23f, 2.59f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_WARDEN, 2142.76f, 173.62f, 66.23f, 2.59f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2140.96f, 168.64f, 66.23f, 2.59f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2142.53f, 171.03f, 66.23f, 2.59f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
break;
|
||||
case 22:
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2108.73f, 190.43f, 66.23f, 5.56f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2109.74f, 195.29f, 66.23f, 5.56f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2107.74f, 192.59f, 66.23f, 5.56f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2112.26f, 195.13f, 66.23f, 5.56f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
if (Creature* warden = me->SummonCreature(NPC_DURNHOLDE_WARDEN, 2149.4634f, 104.97559f, 73.632385f, 1.9065f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
warden->SetWalk(true);
|
||||
warden->GetMotionMaster()->MovePoint(0, 2144.9893f, 117.81233f, 75.98518f);
|
||||
}
|
||||
if (Creature* veteran = me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2147.3281f, 106.72353f, 74.34447f, 1.6904f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
veteran->SetWalk(true);
|
||||
veteran->GetMotionMaster()->MovePoint(0, 2145.2092f, 124.361f, 76.13655f);
|
||||
}
|
||||
if (Creature* veteran = me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2149.212f, 107.20052f, 74.15676f, 1.9887f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
veteran->SetWalk(true);
|
||||
veteran->GetMotionMaster()->MovePoint(0, 2143.7898f, 119.41281f, 75.96626f);
|
||||
}
|
||||
if (Creature* mage = me->SummonCreature(NPC_DURNHOLDE_MAGE, 2147.624f, 104.61046f, 73.909294f, 1.6186f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
mage->SetWalk(true);
|
||||
mage->GetMotionMaster()->MovePoint(0, 2146.975f, 118.05078f, 76.098465f);
|
||||
}
|
||||
break;
|
||||
case 27:
|
||||
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_AMBUSHES_1);
|
||||
break;
|
||||
case 28:
|
||||
me->SummonCreature(NPC_CAPTAIN_SKARLOC, 1995.78f, 277.46f, 66.64f, 0.74f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_CAPTAIN_SKARLOC, 1995.78f, 277.46f, 66.64f, 0.74f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2 * MINUTE * IN_MILLISECONDS);
|
||||
break;
|
||||
case 29:
|
||||
SetEscortPaused(true);
|
||||
@@ -353,34 +367,45 @@ public:
|
||||
break;
|
||||
case 59:
|
||||
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_TARREN_MILL);
|
||||
me->SummonCreature(NPC_SKARLOC_MOUNT, 2488.64f, 625.77f, 58.26f, 4.71f, TEMPSUMMON_TIMED_DESPAWN, 7000);
|
||||
if (Creature* mount = me->SummonCreature(NPC_SKARLOC_MOUNT, 2488.64f, 625.77f, 58.26f, 4.71f, TEMPSUMMON_TIMED_DESPAWN, 7000))
|
||||
{
|
||||
mount->SetImmuneToNPC(true);
|
||||
mount->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
UnMountSelf();
|
||||
_mounted = false;
|
||||
SetRun(false);
|
||||
me->SetFacingTo(6.0388f);
|
||||
break;
|
||||
case 60:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
|
||||
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);
|
||||
}
|
||||
Talk(SAY_EMOTE_HORSE);
|
||||
SetEscortPaused(true);
|
||||
SetRun(true);
|
||||
me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
me->SetFacingTo(4.1364f);
|
||||
break;
|
||||
case 64:
|
||||
SetRun(false);
|
||||
break;
|
||||
case 67:
|
||||
events.ScheduleEvent(EVENT_LOOK_1, 500);
|
||||
events.ScheduleEvent(EVENT_LOOK_1, 1200);
|
||||
events.ScheduleEvent(EVENT_MOVE_AROUND, 3500);
|
||||
events.ScheduleEvent(EVENT_LOOK_2, 5000);
|
||||
events.ScheduleEvent(EVENT_LOOK_3, 6700);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDS, 6000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_TALK1, 6500);
|
||||
events.ScheduleEvent(EVENT_SUMMON_TALK2, 12000);
|
||||
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);
|
||||
break;
|
||||
case 82:
|
||||
events.ScheduleEvent(EVENT_LOOK_4, 500);
|
||||
events.ScheduleEvent(EVENT_LOOK_5, 500);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDS_2, 1000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_TALK3, 1500);
|
||||
break;
|
||||
@@ -401,8 +426,11 @@ public:
|
||||
SetRun(true);
|
||||
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, 2000);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_THRALL_TALK, 4000);
|
||||
break;
|
||||
case 101:
|
||||
SetEscortPaused(true);
|
||||
@@ -412,8 +440,6 @@ public:
|
||||
events.ScheduleEvent(EVENT_START_WAVE_1, 25000);
|
||||
break;
|
||||
case 103:
|
||||
if (Creature* erozion = summons.GetCreatureWithEntry(NPC_EROZION))
|
||||
erozion->SetNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
|
||||
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_FINISHED);
|
||||
me->SetVisible(false);
|
||||
break;
|
||||
@@ -476,6 +502,20 @@ public:
|
||||
ReorderInstance(data);
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
{
|
||||
if (_barnWave)
|
||||
{
|
||||
_barnWave = false;
|
||||
Talk(SAY_LEAD);
|
||||
}
|
||||
else if (_churchWave)
|
||||
{
|
||||
_churchWave = false;
|
||||
Talk(SAY_CHURCH_END);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit*) override
|
||||
{
|
||||
Talk(SAY_RANDOM_KILL);
|
||||
@@ -517,6 +557,13 @@ public:
|
||||
case EVENT_OPEN_DOORS:
|
||||
if (GameObject* doors = me->FindNearestGameObject(GO_PRISON_DOOR, 10.0f))
|
||||
doors->SetGoState(GO_STATE_ACTIVE);
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2142.372f, 174.2907f, 66.30494f, 2.5656f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2138.178f, 168.6046f, 66.30494f, 2.4783f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2140.1458f, 169.23643f, 66.30494f, 2.4958f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2107.9377f, 192.07530f, 66.30494f, 2.5481f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2142.3633f, 172.42600f, 66.30494f, 2.5481f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2109.8518f, 195.14030f, 66.30493f, 2.4260f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
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);
|
||||
@@ -525,15 +572,28 @@ public:
|
||||
case EVENT_SET_FACING:
|
||||
if (Creature* armorer = me->FindNearestCreature(NPC_DURNHOLDE_ARMORER, 30.0f))
|
||||
{
|
||||
armorer->AI()->Talk(SAY_ARMORER_THRALL);
|
||||
armorer->GetMotionMaster()->Clear();
|
||||
armorer->GetMotionMaster()->MoveIdle();
|
||||
armorer->SetFacingToObject(me);
|
||||
me->SetFacingToObject(armorer);
|
||||
}
|
||||
break;
|
||||
case EVENT_ARMORER_SAY:
|
||||
if (Creature* armorer = me->FindNearestCreature(NPC_DURNHOLDE_ARMORER, 30.0f))
|
||||
{
|
||||
armorer->AI()->Talk(SAY_ARMORER_THRALL);
|
||||
}
|
||||
break;
|
||||
case EVENT_THRALL_EMOTE:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
|
||||
break;
|
||||
case EVENT_KILL_ARMORER:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK_UNARMED);
|
||||
if (Creature* armorer = me->FindNearestCreature(NPC_DURNHOLDE_ARMORER, 30.0f))
|
||||
{
|
||||
DoCast(armorer, SPELL_KNOCKOUT_ARMORER, true);
|
||||
armorer->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
}
|
||||
break;
|
||||
case EVENT_TALK_KILL_ARMORER:
|
||||
Talk(SAY_KILL_ARMORER);
|
||||
@@ -557,7 +617,29 @@ public:
|
||||
break;
|
||||
case EVENT_DRESSING_TALK:
|
||||
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_THRALL_ARMORED);
|
||||
DoCastSelf(SPELL_SALVATION);
|
||||
me->SetFacingTo(5.6897f);
|
||||
Talk(SAY_GO_ARMORED);
|
||||
if (Creature* sentry = me->SummonCreature(NPC_DURNHOLDE_SENTRY, 2185.916f, 140.38835f, 88.299866f, 5.9238f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
sentry->SetWalk(true);
|
||||
sentry->GetMotionMaster()->MovePoint(0, 2191.9712f, 138.11394f, 88.2125f);
|
||||
}
|
||||
if (Creature* warden = me->SummonCreature(NPC_DURNHOLDE_WARDEN, 2188.5586f, 138.88553f, 88.299866f, 1.6031f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
warden->SetWalk(true);
|
||||
warden->GetMotionMaster()->MovePoint(0, 2188.5068f, 140.48346f, 88.21251f);
|
||||
}
|
||||
if (Creature* veteran = me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2186.9856f, 142.199f, 88.299866f, 5.9049f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
veteran->SetWalk(true);
|
||||
veteran->GetMotionMaster()->MovePoint(0, 2190.48f, 140.81056f, 88.21251f);
|
||||
}
|
||||
if (Creature* mage = me->SummonCreature(NPC_DURNHOLDE_MAGE, 2189.7336f, 140.64551f, 88.299866f, 3.9532f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS))
|
||||
{
|
||||
mage->SetWalk(true);
|
||||
mage->GetMotionMaster()->MovePoint(0, 2187.8035f, 138.61118f, 88.21251f);
|
||||
}
|
||||
break;
|
||||
case EVENT_ENTER_MOUNT:
|
||||
MountSelf();
|
||||
@@ -571,43 +653,60 @@ public:
|
||||
Talk(SAY_MOUNTS_UP);
|
||||
break;
|
||||
case EVENT_LOOK_1:
|
||||
me->SetFacingTo(5.058f);
|
||||
me->SetFacingTo(5.0090f);
|
||||
me->SetImmuneToNPC(true);
|
||||
break;
|
||||
case EVENT_MOVE_AROUND:
|
||||
me->GetMotionMaster()->MovePoint(0, 2477.146f, 695.041f, 55.801f);
|
||||
break;
|
||||
case EVENT_LOOK_2:
|
||||
me->SetFacingTo(2.297f);
|
||||
break;
|
||||
case EVENT_LOOK_3:
|
||||
me->SetFacingTo(0.64f);
|
||||
me->SetFacingTo(2.0071f);
|
||||
break;
|
||||
case EVENT_SUMMON_GUARDS:
|
||||
SetRun(true);
|
||||
me->SummonCreature(NPC_TM_PROTECTOR, 2501.34f, 700.80f, 55.573f, 3.92f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_TM_LOOKOUT, 2503.02f, 699.11f, 55.57f, 3.92f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_TM_GUARDSMAN, 2503.04f, 702.495f, 50.63f, 3.92f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_TM_GUARDSMAN, 2504.72f, 700.806f, 55.62f, 3.92f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
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))
|
||||
{
|
||||
guardsman->CastSpell(guardsman, SPELL_DUMMY_AURA, true);
|
||||
}
|
||||
me->SummonCreature(NPC_TM_GUARDSMAN, 2499.0579f, 698.99725f, 55.611156f, 4.5727f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
summons.DoAction(ACTION_SET_IMMUNE_FLAG);
|
||||
break;
|
||||
case EVENT_LOOK_3:
|
||||
me->SetFacingTo(0.3490f);
|
||||
break;
|
||||
case EVENT_SUMMON_TALK1:
|
||||
if (Creature* summon = summons.GetCreatureWithEntry(NPC_TM_LOOKOUT))
|
||||
summon->AI()->Talk(SAY_LOOKOUT_SAW);
|
||||
break;
|
||||
case EVENT_SUMMON_TALK2:
|
||||
if (Creature* summon = summons.GetCreatureWithEntry(NPC_TM_LOOKOUT))
|
||||
summon->AI()->Talk(SAY_LOOKOUT_GO);
|
||||
summons.DoAction(ACTION_REMOVE_IMMUNE_FLAG);
|
||||
me->SetFacingTo(0.4363f);
|
||||
break;
|
||||
case EVENT_LOOK_4:
|
||||
me->SetFacingTo(0.41f);
|
||||
me->SetFacingTo(4.7510f);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_NO);
|
||||
Talk(SAY_EMOTE_HORSE_2);
|
||||
break;
|
||||
case EVENT_SUMMON_TALK2:
|
||||
me->SetFacingTo(0.4363f);
|
||||
if (Creature* summon = summons.GetCreatureWithEntry(NPC_TM_LOOKOUT))
|
||||
summon->AI()->Talk(SAY_LOOKOUT_GO);
|
||||
me->SetImmuneToNPC(true);
|
||||
break;
|
||||
case EVENT_GUARDS_MOVING:
|
||||
me->SetImmuneToNPC(false);
|
||||
summons.DoAction(ACTION_REMOVE_IMMUNE_FLAG);
|
||||
_barnWave = true;
|
||||
break;
|
||||
case EVENT_LOOK_5:
|
||||
me->SetFacingTo(0.4886f);
|
||||
Talk(SAY_ENTER_CHURCH);
|
||||
break;
|
||||
case EVENT_SUMMON_GUARDS_2:
|
||||
me->SummonCreature(NPC_TM_PROTECTOR, 2630.75f, 664.80f, 54.28f, 4.37f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_TM_LOOKOUT, 2632.20f, 661.98f, 54.30f, 4.37f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_TM_GUARDSMAN, 2630.02f, 662.75f, 54.28f, 4.37f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_TM_GUARDSMAN, 2632.86f, 664.05f, 54.31f, 4.37f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
me->SummonCreature(NPC_TM_PROTECTOR, 2630.75f, 664.80f, 54.28f, 4.37f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_TM_LOOKOUT, 2632.20f, 661.98f, 54.30f, 4.37f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_TM_GUARDSMAN, 2630.02f, 662.75f, 54.28f, 4.37f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_TM_GUARDSMAN, 2632.86f, 664.05f, 54.31f, 4.37f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30 * IN_MILLISECONDS);
|
||||
_churchWave = true;
|
||||
break;
|
||||
case EVENT_SUMMON_TALK3:
|
||||
if (Creature* summon = summons.GetCreatureWithEntry(NPC_TM_LOOKOUT))
|
||||
@@ -625,7 +724,7 @@ public:
|
||||
}
|
||||
break;
|
||||
case EVENT_THRALL_TALK_2:
|
||||
me->SetFacingTo(2.67f);
|
||||
me->SetFacingTo(2.60f);
|
||||
Talk(SAY_EPOCH_WONDER);
|
||||
break;
|
||||
case EVENT_TARETHA_FALL:
|
||||
@@ -638,16 +737,22 @@ public:
|
||||
}
|
||||
break;
|
||||
case EVENT_THRALL_TALK_3:
|
||||
me->SetFacingTo(5.78f);
|
||||
if (Creature* Taretha = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TARETHA_GUID)))
|
||||
{
|
||||
me->SetFacingToObject(Taretha);
|
||||
}
|
||||
Talk(SAY_EPOCH_KILL_TARETHA);
|
||||
break;
|
||||
case EVENT_THRALL_MOVE_DOWN:
|
||||
SetEscortPaused(false);
|
||||
break;
|
||||
case EVENT_EPOCH_INTRO:
|
||||
me->SetFacingTo(1.33f);
|
||||
if (Creature* epoch = summons.GetCreatureWithEntry(NPC_EPOCH_HUNTER))
|
||||
{
|
||||
me->SetFacingToObject(epoch);
|
||||
epoch->SetFacingToObject(me);
|
||||
epoch->AI()->Talk(SAY_EPOCH_ENTER3);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_INFINITES:
|
||||
me->SummonCreature(NPC_EPOCH_LOOKOUT, 2647.57f, 701.17f, 56.215f, 4.3f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
@@ -715,15 +820,24 @@ public:
|
||||
if (Player* player = itr->GetSource())
|
||||
player->KilledMonsterCredit(20156);
|
||||
|
||||
me->SetFacingTo(5.76f);
|
||||
if (Creature* Taretha = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TARETHA_GUID)))
|
||||
{
|
||||
me->SetFacingToObject(Taretha);
|
||||
}
|
||||
me->SetImmuneToNPC(true);
|
||||
break;
|
||||
}
|
||||
case EVENT_THRALL_TALK_4:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_TALK);
|
||||
Talk(SAY_GREET_TARETHA);
|
||||
break;
|
||||
case EVENT_TARETHA_TALK_1:
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
|
||||
if (Creature* Taretha = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TARETHA_GUID)))
|
||||
{
|
||||
Taretha->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
|
||||
Taretha->AI()->Talk(SAY_TARETHA_TALK1);
|
||||
}
|
||||
break;
|
||||
case EVENT_THRALL_TALK_5:
|
||||
Talk(SAY_CHAT_TARETHA1);
|
||||
@@ -766,10 +880,14 @@ public:
|
||||
case EVENT_TARETHA_TALK_2:
|
||||
if (Creature* Taretha = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TARETHA_GUID)))
|
||||
{
|
||||
Taretha->SetFacingTo(4.233f);
|
||||
Taretha->SetFacingToObject(me);
|
||||
Taretha->AI()->Talk(SAY_TARETHA_TALK2);
|
||||
}
|
||||
break;
|
||||
case EVENT_EROZION_FLAGS:
|
||||
if (Creature* erozion = summons.GetCreatureWithEntry(NPC_EROZION))
|
||||
erozion->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -832,7 +950,11 @@ public:
|
||||
SetNextWaypoint(27, false);
|
||||
break;
|
||||
case ENCOUNTER_PROGRESS_SKARLOC_KILLED:
|
||||
me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN);
|
||||
if (Creature* mount = me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN))
|
||||
{
|
||||
mount->SetImmuneToNPC(true);
|
||||
mount->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
SetNextWaypoint(30, false);
|
||||
break;
|
||||
case ENCOUNTER_PROGRESS_TARREN_MILL:
|
||||
@@ -853,6 +975,8 @@ public:
|
||||
SummonList summons;
|
||||
|
||||
bool _mounted;
|
||||
bool _barnWave;
|
||||
bool _churchWave;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -50,8 +50,8 @@ enum NpcIds
|
||||
NPC_DURNHOLDE_ARMORER = 18764,
|
||||
NPC_DURNHOLDE_WARDEN = 17833,
|
||||
NPC_DURNHOLDE_VETERAN = 17860,
|
||||
NPC_DURNHOLDE_MAGE = 17860,
|
||||
NPC_DURNHOLDE_SENTRY = 17860,
|
||||
NPC_DURNHOLDE_MAGE = 18934,
|
||||
NPC_DURNHOLDE_SENTRY = 17819,
|
||||
|
||||
NPC_CAPTAIN_SKARLOC = 17862,
|
||||
NPC_SKARLOC_MOUNT = 18798,
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
|
||||
enum Enums
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
@@ -36,131 +35,87 @@ enum Enums
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550
|
||||
};
|
||||
|
||||
enum Events
|
||||
struct boss_aeonus : public BossAI
|
||||
{
|
||||
EVENT_SANDBREATH = 1,
|
||||
EVENT_TIMESTOP = 2,
|
||||
EVENT_FRENZY = 3,
|
||||
EVENT_CLEAVE = 4
|
||||
};
|
||||
boss_aeonus(Creature* creature) : BossAI(creature, DATA_AEONUS) { }
|
||||
|
||||
class boss_aeonus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_aeonus() : CreatureScript("boss_aeonus") { }
|
||||
|
||||
struct boss_aeonusAI : public ScriptedAI
|
||||
void JustReachedHome() override
|
||||
{
|
||||
boss_aeonusAI(Creature* creature) : ScriptedAI(creature)
|
||||
if (Creature* medivh = instance->GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
InstanceScript* instance;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
{
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MEDIVH)))
|
||||
if (me->GetDistance2d(medivh) < 20.0f)
|
||||
me->CastSpell(me, SPELL_CORRUPT_MEDIVH, false);
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
Talk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MEDIVH)))
|
||||
if (me->GetDistance2d(medivh) < 20.0f)
|
||||
{
|
||||
me->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f * std::sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh));
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
DoCastAOE(SPELL_CORRUPT_MEDIVH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 5000);
|
||||
events.ScheduleEvent(EVENT_SANDBREATH, 20000);
|
||||
events.ScheduleEvent(EVENT_TIMESTOP, 15000);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
Talk(SAY_BANISH);
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
instance->SetData(TYPE_AEONUS, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 10000);
|
||||
break;
|
||||
case EVENT_SANDBREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_SANDBREATH, 20000);
|
||||
break;
|
||||
case EVENT_TIMESTOP:
|
||||
me->CastSpell(me, SPELL_TIME_STOP, false);
|
||||
events.ScheduleEvent(EVENT_TIMESTOP, 25000);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
Talk(EMOTE_FRENZY);
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
void IsSummonedBy(WorldObject* /*summoner*/) override
|
||||
{
|
||||
return GetTheBlackMorassAI<boss_aeonusAI>(creature);
|
||||
me->SetReactState(REACT_DEFENSIVE);
|
||||
|
||||
if (Creature* medivh = instance->GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
me->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f * std::sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh));
|
||||
me->GetMotionMaster()->MoveTargetedHome();
|
||||
}
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
scheduler.Schedule(5s, [this](TaskContext context)
|
||||
{
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
context.Repeat(10s);
|
||||
}).Schedule(20s, [this](TaskContext context)
|
||||
{
|
||||
DoCastVictim(SPELL_SAND_BREATH);
|
||||
context.Repeat(20s);
|
||||
}).Schedule(15s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_TIME_STOP);
|
||||
context.Repeat(25s);
|
||||
}).Schedule(30s, [this](TaskContext context)
|
||||
{
|
||||
Talk(EMOTE_FRENZY);
|
||||
DoCastSelf(SPELL_ENRAGE);
|
||||
context.Repeat(30s);
|
||||
});
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
Talk(SAY_BANISH);
|
||||
DoCastAOE(SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->IsPlayer())
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_aeonus()
|
||||
{
|
||||
new boss_aeonus();
|
||||
RegisterTheBlackMorassCreatureAI(boss_aeonus);
|
||||
}
|
||||
|
||||
+63
-107
@@ -21,7 +21,6 @@
|
||||
|
||||
enum Enums
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
@@ -35,121 +34,78 @@ enum Enums
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_ARCANE_BLAST = 1,
|
||||
EVENT_TIME_LAPSE = 2,
|
||||
EVENT_ARCANE_DISCHARGE = 3,
|
||||
EVENT_ATTRACTION = 4
|
||||
};
|
||||
struct boss_chrono_lord_deja : public BossAI
|
||||
{
|
||||
boss_chrono_lord_deja(Creature* creature) : BossAI(creature, DATA_CHRONO_LORD_DEJA) { }
|
||||
|
||||
class boss_chrono_lord_deja : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_chrono_lord_deja() : CreatureScript("boss_chrono_lord_deja") { }
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
if (me->GetEntry() == NPC_CHRONO_LORD_DEJA)
|
||||
{
|
||||
Talk(id);
|
||||
}
|
||||
}
|
||||
|
||||
struct boss_chrono_lord_dejaAI : public ScriptedAI
|
||||
{
|
||||
boss_chrono_lord_dejaAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
OwnTalk(SAY_AGGRO);
|
||||
_JustEngagedWith();
|
||||
|
||||
EventMap events;
|
||||
scheduler.Schedule(10s, [this](TaskContext context)
|
||||
{
|
||||
DoCastVictim(SPELL_ARCANE_BLAST);
|
||||
context.Repeat(20s);
|
||||
}).Schedule(15s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_TIME_LAPSE);
|
||||
context.Repeat(20s);
|
||||
}).Schedule(20s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_ARCANE_DISCHARGE);
|
||||
context.Repeat(25s);
|
||||
});
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
if (IsHeroic())
|
||||
{
|
||||
scheduler.Schedule(20s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_ATTRACTION);
|
||||
context.Repeat(30s);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
if (me->GetEntry() == NPC_CHRONO_LORD_DEJA)
|
||||
Talk(id);
|
||||
}
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
OwnTalk(SAY_BANISH);
|
||||
DoCastAOE(SPELL_BANISH_DRAGON_HELPER);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
OwnTalk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 10000);
|
||||
events.ScheduleEvent(EVENT_TIME_LAPSE, 15000);
|
||||
events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 25000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_ATTRACTION, 20000);
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->IsPlayer())
|
||||
{
|
||||
OwnTalk(SAY_SLAY);
|
||||
}
|
||||
}
|
||||
|
||||
OwnTalk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
OwnTalk(SAY_BANISH);
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
OwnTalk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
OwnTalk(SAY_DEATH);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(TYPE_CHRONO_LORD_DEJA, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_ARCANE_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_BLAST, 20000);
|
||||
break;
|
||||
case EVENT_TIME_LAPSE:
|
||||
me->CastSpell(me, SPELL_TIME_LAPSE, false);
|
||||
events.ScheduleEvent(EVENT_TIME_LAPSE, 20000);
|
||||
break;
|
||||
case EVENT_ARCANE_DISCHARGE:
|
||||
me->CastSpell(me, SPELL_ARCANE_DISCHARGE, false);
|
||||
events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 25000);
|
||||
break;
|
||||
case EVENT_ATTRACTION:
|
||||
me->CastSpell(me, SPELL_ATTRACTION, false);
|
||||
events.ScheduleEvent(EVENT_ATTRACTION, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetTheBlackMorassAI<boss_chrono_lord_dejaAI>(creature);
|
||||
}
|
||||
};
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
OwnTalk(SAY_DEATH);
|
||||
_JustDied();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_chrono_lord_deja()
|
||||
{
|
||||
new boss_chrono_lord_deja();
|
||||
RegisterTheBlackMorassCreatureAI(boss_chrono_lord_deja);
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
|
||||
enum Enums
|
||||
{
|
||||
SAY_ENTER = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_BANISH = 2,
|
||||
SAY_SLAY = 3,
|
||||
@@ -34,121 +33,77 @@ enum Enums
|
||||
SPELL_BANISH_DRAGON_HELPER = 31550
|
||||
};
|
||||
|
||||
enum Events
|
||||
struct boss_temporus : public BossAI
|
||||
{
|
||||
EVENT_HASTEN = 1,
|
||||
EVENT_MORTAL_WOUND = 2,
|
||||
EVENT_WING_BUFFET = 3,
|
||||
EVENT_SPELL_REFLECTION = 4
|
||||
};
|
||||
boss_temporus(Creature* creature) : BossAI(creature, DATA_TEMPORUS) { }
|
||||
|
||||
class boss_temporus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_temporus() : CreatureScript("boss_temporus") { }
|
||||
|
||||
struct boss_temporusAI : public ScriptedAI
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
boss_temporusAI(Creature* creature) : ScriptedAI(creature) { }
|
||||
if (me->GetEntry() == NPC_TEMPORUS)
|
||||
Talk(id);
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
|
||||
void OwnTalk(uint32 id)
|
||||
{
|
||||
if (me->GetEntry() == NPC_TEMPORUS)
|
||||
Talk(id);
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
OwnTalk(SAY_ENTER);
|
||||
ScriptedAI::InitializeAI();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_HASTEN, 12000);
|
||||
events.ScheduleEvent(EVENT_MORTAL_WOUND, 5000);
|
||||
events.ScheduleEvent(EVENT_WING_BUFFET, 20000);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTION, 28000);
|
||||
|
||||
OwnTalk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
OwnTalk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
OwnTalk(SAY_DEATH);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->SetData(TYPE_TEMPORUS, DONE);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
OwnTalk(SAY_BANISH);
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_HASTEN:
|
||||
me->CastSpell(me, SPELL_HASTEN, false);
|
||||
events.ScheduleEvent(EVENT_HASTEN, 20000);
|
||||
break;
|
||||
case EVENT_MORTAL_WOUND:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
|
||||
events.ScheduleEvent(EVENT_MORTAL_WOUND, 10000);
|
||||
break;
|
||||
case EVENT_WING_BUFFET:
|
||||
me->CastSpell(me, SPELL_WING_BUFFET, false);
|
||||
events.ScheduleEvent(EVENT_WING_BUFFET, 20000);
|
||||
break;
|
||||
case EVENT_SPELL_REFLECTION:
|
||||
me->CastSpell(me, SPELL_REFLECT, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_REFLECTION, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
return GetTheBlackMorassAI<boss_temporusAI>(creature);
|
||||
_JustEngagedWith();
|
||||
|
||||
scheduler.Schedule(12s, [this](TaskContext context)
|
||||
{
|
||||
DoCastSelf(SPELL_HASTEN);
|
||||
context.Repeat(20s);
|
||||
}).Schedule(5s, [this](TaskContext context)
|
||||
{
|
||||
DoCastVictim(SPELL_MORTAL_WOUND);
|
||||
context.Repeat(10s);
|
||||
}).Schedule(20s, [this](TaskContext context)
|
||||
{
|
||||
DoCastAOE(SPELL_WING_BUFFET);
|
||||
context.Repeat(20s);
|
||||
});
|
||||
|
||||
if (IsHeroic())
|
||||
{
|
||||
scheduler.Schedule(28s, [this](TaskContext context)
|
||||
{
|
||||
DoCastSelf(SPELL_REFLECT);
|
||||
context.Repeat(30s);
|
||||
});
|
||||
}
|
||||
|
||||
OwnTalk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->IsPlayer())
|
||||
{
|
||||
OwnTalk(SAY_SLAY);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
OwnTalk(SAY_DEATH);
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_TIME_KEEPER)
|
||||
{
|
||||
if (me->IsWithinDistInMap(who, 20.0f))
|
||||
{
|
||||
OwnTalk(SAY_BANISH);
|
||||
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_temporus()
|
||||
{
|
||||
new boss_temporus();
|
||||
RegisterTheBlackMorassCreatureAI(boss_temporus);
|
||||
}
|
||||
|
||||
+253
-341
@@ -23,8 +23,7 @@
|
||||
#include "TemporarySummon.h"
|
||||
#include "the_black_morass.h"
|
||||
|
||||
#define MAX_PORTAL_LOCATIONS 4
|
||||
const Position PortalLocation[MAX_PORTAL_LOCATIONS] =
|
||||
const Position PortalLocation[4] =
|
||||
{
|
||||
{ -2030.8318f, 7024.9443f, 23.071817f, 3.14159f },
|
||||
{ -1961.7335f, 7029.5280f, 21.811401f, 2.12931f },
|
||||
@@ -32,6 +31,11 @@ const Position PortalLocation[MAX_PORTAL_LOCATIONS] =
|
||||
{ -1930.9106f, 7183.5970f, 23.007639f, 3.59537f }
|
||||
};
|
||||
|
||||
ObjectData const creatureData[1] =
|
||||
{
|
||||
{ NPC_MEDIVH, DATA_MEDIVH }
|
||||
};
|
||||
|
||||
class instance_the_black_morass : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
@@ -44,67 +48,189 @@ public:
|
||||
|
||||
struct instance_the_black_morass_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_the_black_morass_InstanceMapScript(Map* map) : InstanceScript(map) { }
|
||||
|
||||
GuidSet encounterNPCs;
|
||||
uint32 encounters[MAX_ENCOUNTER];
|
||||
ObjectGuid _medivhGUID;
|
||||
uint8 _currentRift;
|
||||
int8 _shieldPercent;
|
||||
|
||||
void Initialize() override
|
||||
instance_the_black_morass_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
memset(&encounters, 0, sizeof(encounters));
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadObjectData(creatureData, nullptr);
|
||||
_currentRift = 0;
|
||||
_shieldPercent = 100;
|
||||
encounterNPCs.clear();
|
||||
_timerToNextBoss = 0;
|
||||
_encounterNPCs.clear();
|
||||
_canSpawnPortal = true; // Delay after bosses
|
||||
}
|
||||
|
||||
void CleanupInstance()
|
||||
{
|
||||
Events.Reset();
|
||||
_currentRift = 0;
|
||||
_shieldPercent = 100;
|
||||
|
||||
_usedRiftPostions.fill(ObjectGuid::Empty);
|
||||
_availableRiftPositions.clear();
|
||||
_scheduler.CancelAll();
|
||||
|
||||
instance->LoadGrid(-2023.0f, 7121.0f);
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
for (Position const& pos : PortalLocation)
|
||||
{
|
||||
medivh->DespawnOrUnsummon();
|
||||
medivh->SetRespawnTime(3);
|
||||
_availableRiftPositions.push_back(pos);
|
||||
}
|
||||
|
||||
GuidSet eCopy = encounterNPCs;
|
||||
for (ObjectGuid const& guid : eCopy)
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
creature->DespawnOrUnsummon();
|
||||
instance->LoadGrid(-2023.0f, 7121.0f);
|
||||
if (Creature* medivh = GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
medivh->DespawnOrUnsummon(0ms, 3s);
|
||||
}
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const override
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
{
|
||||
return false;
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (state == DONE)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_AEONUS:
|
||||
{
|
||||
if (Creature* medivh = GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
medivh->AI()->DoAction(ACTION_OUTRO);
|
||||
}
|
||||
|
||||
instance->DoForAllPlayers([&](Player* player)
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
player->AreaExploredOrEventHappens(QUEST_OPENING_PORTAL);
|
||||
}
|
||||
|
||||
if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH);
|
||||
}
|
||||
});
|
||||
|
||||
for (ObjectGuid const& guid : _encounterNPCs)
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_RIFT_KEEPER_WARLOCK:
|
||||
case NPC_RIFT_KEEPER_MAGE:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
case NPC_INFINITE_ASSASIN_2:
|
||||
case NPC_INFINITE_WHELP:
|
||||
case NPC_INFINITE_CHRONOMANCER:
|
||||
case NPC_INFINITE_CHRONOMANCER_2:
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
case NPC_INFINITE_EXECUTIONER_2:
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
case NPC_INFINITE_VANQUISHER_2:
|
||||
creature->DespawnOrUnsummon();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case DATA_CHRONO_LORD_DEJA:
|
||||
case DATA_TEMPORUS:
|
||||
{
|
||||
_canSpawnPortal = false;
|
||||
|
||||
_scheduler.Schedule(2min + 30s, [this](TaskContext)
|
||||
{
|
||||
_canSpawnPortal = true;
|
||||
});
|
||||
|
||||
ScheduleNextPortal(2min + 30s, Position(0.0f, 0.0f, 0.0f, 0.0f));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* player) override
|
||||
{
|
||||
if (instance->GetPlayersCountExceptGMs() <= 1 && GetData(TYPE_AEONUS) != DONE)
|
||||
if (instance->GetPlayersCountExceptGMs() <= 1 && GetBossState(DATA_AEONUS) != DONE)
|
||||
{
|
||||
CleanupInstance();
|
||||
}
|
||||
|
||||
player->SendUpdateWorldState(WORLD_STATE_BM, _currentRift > 0 ? 1 : 0);
|
||||
player->SendUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
|
||||
player->SendUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
}
|
||||
|
||||
void ScheduleNextPortal(Milliseconds time, Position lastPosition)
|
||||
{
|
||||
_scheduler.CancelGroup(CONTEXT_GROUP_RIFTS);
|
||||
|
||||
_scheduler.Schedule(time, [this, lastPosition](TaskContext context)
|
||||
{
|
||||
if (GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
// Spawning prevented - there's a 150s delay after a boss dies.
|
||||
if (!_canSpawnPortal)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Position spawnPos;
|
||||
if (!_availableRiftPositions.empty())
|
||||
{
|
||||
if (_availableRiftPositions.size() > 1)
|
||||
{
|
||||
spawnPos = Acore::Containers::SelectRandomContainerElementIf(_availableRiftPositions, [&](Position pos) -> bool
|
||||
{
|
||||
return pos != lastPosition;
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
spawnPos = Acore::Containers::SelectRandomContainerElement(_availableRiftPositions);
|
||||
}
|
||||
|
||||
_availableRiftPositions.remove(spawnPos);
|
||||
|
||||
DoUpdateWorldState(WORLD_STATE_BM_RIFT, ++_currentRift);
|
||||
|
||||
instance->SummonCreature(NPC_TIME_RIFT, spawnPos);
|
||||
|
||||
// Here we check if we have available rift spots.
|
||||
if (_currentRift < 18)
|
||||
{
|
||||
if (!_availableRiftPositions.empty())
|
||||
{
|
||||
context.Repeat((_currentRift >= 13 ? 2min : 90s));
|
||||
}
|
||||
else
|
||||
{
|
||||
context.Repeat(4s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
context.SetGroup(CONTEXT_GROUP_RIFTS);
|
||||
});
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_MEDIVH:
|
||||
_medivhGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_CHRONO_LORD_DEJA:
|
||||
case NPC_INFINITE_CHRONO_LORD:
|
||||
@@ -116,14 +242,20 @@ public:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
case NPC_INFINITE_ASSASIN_2:
|
||||
case NPC_INFINITE_WHELP:
|
||||
case NPC_INFINITE_CRONOMANCER:
|
||||
case NPC_INFINITE_CHRONOMANCER:
|
||||
case NPC_INFINITE_CHRONOMANCER_2:
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
case NPC_INFINITE_EXECUTIONER_2:
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
case NPC_INFINITE_VANQUISHER_2:
|
||||
case NPC_DP_BEAM_STALKER:
|
||||
encounterNPCs.insert(creature->GetGUID());
|
||||
_encounterNPCs.insert(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
|
||||
InstanceScript::OnCreatureCreate(creature);
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature) override
|
||||
@@ -131,6 +263,20 @@ public:
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_TIME_RIFT:
|
||||
if (_currentRift < 18)
|
||||
{
|
||||
if (_availableRiftPositions.size() < 3)
|
||||
{
|
||||
ScheduleNextPortal((_currentRift >= 13 ? 2min : 90s), creature->GetHomePosition());
|
||||
}
|
||||
else
|
||||
{
|
||||
ScheduleNextPortal(1s, creature->GetHomePosition());
|
||||
}
|
||||
}
|
||||
|
||||
_availableRiftPositions.push_back(creature->GetHomePosition());
|
||||
[[fallthrough]];
|
||||
case NPC_CHRONO_LORD_DEJA:
|
||||
case NPC_INFINITE_CHRONO_LORD:
|
||||
case NPC_TEMPORUS:
|
||||
@@ -141,96 +287,34 @@ public:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
case NPC_INFINITE_ASSASIN_2:
|
||||
case NPC_INFINITE_WHELP:
|
||||
case NPC_INFINITE_CRONOMANCER:
|
||||
case NPC_INFINITE_CHRONOMANCER:
|
||||
case NPC_INFINITE_CHRONOMANCER_2:
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
case NPC_INFINITE_EXECUTIONER_2:
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
encounterNPCs.erase(creature->GetGUID());
|
||||
case NPC_INFINITE_VANQUISHER_2:
|
||||
_encounterNPCs.erase(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
|
||||
InstanceScript::OnCreatureRemove(creature);
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data) override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_AEONUS:
|
||||
{
|
||||
encounters[type] = DONE;
|
||||
SaveToDB();
|
||||
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
medivh->AI()->DoAction(ACTION_OUTRO);
|
||||
}
|
||||
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
if (!players.IsEmpty())
|
||||
{
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
if (Player* player = itr->GetSource())
|
||||
{
|
||||
if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
player->AreaExploredOrEventHappens(QUEST_OPENING_PORTAL);
|
||||
}
|
||||
|
||||
if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE)
|
||||
{
|
||||
player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TYPE_CHRONO_LORD_DEJA:
|
||||
case TYPE_TEMPORUS:
|
||||
{
|
||||
GuidSet eCopy = encounterNPCs;
|
||||
for (ObjectGuid const& guid : eCopy)
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_RIFT_KEEPER_WARLOCK:
|
||||
case NPC_RIFT_KEEPER_MAGE:
|
||||
case NPC_RIFT_LORD:
|
||||
case NPC_RIFT_LORD_2:
|
||||
case NPC_TIME_RIFT:
|
||||
creature->DespawnOrUnsummon();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
encounters[type] = DONE;
|
||||
|
||||
if (!_timerToNextBoss || _timerToNextBoss > 30 * IN_MILLISECONDS)
|
||||
{
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 30 * IN_MILLISECONDS);
|
||||
}
|
||||
else
|
||||
{
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, _timerToNextBoss);
|
||||
}
|
||||
Events.SetPhase(1);
|
||||
SaveToDB();
|
||||
_timerToNextBoss = (instance->IsHeroic() ? 300 : 150) * IN_MILLISECONDS;
|
||||
break;
|
||||
}
|
||||
case DATA_MEDIVH:
|
||||
{
|
||||
DoUpdateWorldState(WORLD_STATE_BM, 1);
|
||||
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
|
||||
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 3000);
|
||||
_timerToNextBoss = (instance->IsHeroic() ? 300 : 150) * IN_MILLISECONDS;
|
||||
|
||||
for (ObjectGuid const& guid : encounterNPCs)
|
||||
ScheduleNextPortal(3s, Position(0.0f, 0.0f, 0.0f, 0.0f));
|
||||
|
||||
for (ObjectGuid const& guid : _encounterNPCs)
|
||||
{
|
||||
if (guid.GetEntry() == NPC_DP_BEAM_STALKER)
|
||||
{
|
||||
@@ -264,26 +348,73 @@ public:
|
||||
|
||||
if (!_shieldPercent)
|
||||
{
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
if (Creature* medivh = GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
if (medivh->IsAlive())
|
||||
if (medivh->IsAlive() && medivh->IsAIEnabled)
|
||||
{
|
||||
medivh->SetImmuneToNPC(true);
|
||||
medivh->AI()->Talk(SAY_MEDIVH_DEATH);
|
||||
|
||||
if (medivh->IsAIEnabled)
|
||||
{
|
||||
medivh->AI()->Talk(SAY_MEDIVH_DEATH);
|
||||
}
|
||||
|
||||
Events.ScheduleEvent(EVENT_WIPE_1, 4s);
|
||||
|
||||
for (ObjectGuid const& guid : encounterNPCs)
|
||||
for (ObjectGuid const& guid : _encounterNPCs)
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
{
|
||||
creature->InterruptNonMeleeSpells(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Step 1 - Medivh loses all auras.
|
||||
_scheduler.Schedule(4s, [this](TaskContext)
|
||||
{
|
||||
if (Creature* medivh = GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
medivh->RemoveAllAuras();
|
||||
}
|
||||
|
||||
// Step 2 - Medivh dies and visual effect NPCs are despawned.
|
||||
_scheduler.Schedule(500ms, [this](TaskContext)
|
||||
{
|
||||
if (Creature* medivh = GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
medivh->KillSelf(false);
|
||||
|
||||
GuidSet encounterNPCSCopy = _encounterNPCs;
|
||||
for (ObjectGuid const& guid : encounterNPCSCopy)
|
||||
{
|
||||
switch (guid.GetEntry())
|
||||
{
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_DP_EMITTER_STALKER:
|
||||
case NPC_DP_CRYSTAL_STALKER:
|
||||
case NPC_DP_BEAM_STALKER:
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
{
|
||||
creature->DespawnOrUnsummon();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Step 3 - All summoned creatures despawn
|
||||
_scheduler.Schedule(2s, [this](TaskContext)
|
||||
{
|
||||
GuidSet encounterNPCSCopy = _encounterNPCs;
|
||||
for (ObjectGuid const& guid : encounterNPCSCopy)
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
{
|
||||
creature->CastSpell(creature, SPELL_TELEPORT_VISUAL, true);
|
||||
creature->DespawnOrUnsummon(1200ms, 0s);
|
||||
}
|
||||
}
|
||||
|
||||
_scheduler.CancelAll();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -298,10 +429,6 @@ public:
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_CHRONO_LORD_DEJA:
|
||||
case TYPE_TEMPORUS:
|
||||
case TYPE_AEONUS:
|
||||
return encounters[type];
|
||||
case DATA_SHIELD_PERCENT:
|
||||
return _shieldPercent;
|
||||
case DATA_RIFT_NUMBER:
|
||||
@@ -310,233 +437,18 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetGuidData(uint32 type, ObjectGuid data) override
|
||||
{
|
||||
if (type == DATA_SUMMONED_NPC)
|
||||
encounterNPCs.insert(data);
|
||||
else if (type == DATA_DELETED_NPC)
|
||||
encounterNPCs.erase(data);
|
||||
else if (type == DATA_RIFT_KILLED)
|
||||
{
|
||||
if (!Events.IsInPhase(1))
|
||||
{
|
||||
uint8 emptySpots = 0;
|
||||
for (uint8 i = 0; i < MAX_PORTAL_LOCATIONS; ++i)
|
||||
{
|
||||
if (!_usedRiftPostions[i])
|
||||
{
|
||||
++emptySpots;
|
||||
}
|
||||
|
||||
if (_usedRiftPostions[i] == data)
|
||||
{
|
||||
_usedRiftPostions[i].Clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (emptySpots >= MAX_PORTAL_LOCATIONS - 1)
|
||||
{
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 4000);
|
||||
}
|
||||
else if (!emptySpots)
|
||||
{
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, (_currentRift >= 13 ? 120 : 90) * IN_MILLISECONDS);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ObjectGuid GetGuidData(uint32 data) const override
|
||||
{
|
||||
if (data == DATA_MEDIVH)
|
||||
return _medivhGUID;
|
||||
|
||||
return ObjectGuid::Empty;
|
||||
}
|
||||
|
||||
void SummonPortalKeeper(uint32 eventId)
|
||||
{
|
||||
uint8 riftPosition = eventId - EVENT_SUMMON_KEEPER_1;
|
||||
ObjectGuid const& riftGUID = _usedRiftPostions[riftPosition];
|
||||
Creature* rift = instance->GetCreature(riftGUID);
|
||||
if (!rift)
|
||||
return;
|
||||
|
||||
int32 entry = 0;
|
||||
switch (_currentRift)
|
||||
{
|
||||
case 6:
|
||||
entry = GetData(TYPE_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA;
|
||||
break;
|
||||
case 12:
|
||||
entry = GetData(TYPE_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS;
|
||||
break;
|
||||
case 18:
|
||||
entry = NPC_AEONUS;
|
||||
break;
|
||||
default:
|
||||
entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2);
|
||||
break;
|
||||
}
|
||||
|
||||
Position pos = rift->GetNearPosition(10.0f, 2 * M_PI * rand_norm());
|
||||
|
||||
if (TempSummon* summon = instance->SummonCreature(std::abs(entry), pos))
|
||||
{
|
||||
summon->SetTempSummonType(TEMPSUMMON_CORPSE_TIMED_DESPAWN);
|
||||
summon->SetTimer(3 * MINUTE * IN_MILLISECONDS);
|
||||
|
||||
if (entry < 0)
|
||||
summon->SetLootMode(0);
|
||||
|
||||
if (summon->GetEntry() != NPC_AEONUS)
|
||||
{
|
||||
rift->AI()->SetGUID(summon->GetGUID());
|
||||
rift->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
|
||||
}
|
||||
else
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void Update(uint32 diff) override
|
||||
{
|
||||
if (_timerToNextBoss)
|
||||
{
|
||||
if (_timerToNextBoss <= diff)
|
||||
{
|
||||
_timerToNextBoss = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
_timerToNextBoss -= diff;
|
||||
}
|
||||
}
|
||||
|
||||
Events.Update(diff);
|
||||
|
||||
uint32 eventId = Events.ExecuteEvent();
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_NEXT_PORTAL:
|
||||
{
|
||||
if (instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
uint8 position = MAX_PORTAL_LOCATIONS;
|
||||
|
||||
std::vector<uint8> possibleSpots;
|
||||
for (uint8 i = 0; i < MAX_PORTAL_LOCATIONS; ++i)
|
||||
{
|
||||
if (!_usedRiftPostions[i])
|
||||
{
|
||||
possibleSpots.push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (!possibleSpots.empty())
|
||||
{
|
||||
position = Acore::Containers::SelectRandomContainerElement(possibleSpots);
|
||||
}
|
||||
|
||||
if (position < MAX_PORTAL_LOCATIONS)
|
||||
{
|
||||
++_currentRift;
|
||||
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
|
||||
Events.ScheduleEvent(EVENT_SUMMON_KEEPER_1 + position, 6000);
|
||||
Events.SetPhase(0);
|
||||
|
||||
if (Creature* rift = instance->SummonCreature(NPC_TIME_RIFT, PortalLocation[position]))
|
||||
{
|
||||
_usedRiftPostions[position] = rift->GetGUID();
|
||||
|
||||
for (uint8 i = 0; i < MAX_PORTAL_LOCATIONS; ++i)
|
||||
{
|
||||
if (!_usedRiftPostions[i])
|
||||
{
|
||||
Events.RescheduleEvent(EVENT_NEXT_PORTAL, (_currentRift >= 13 ? 120 : 90) * IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_SUMMON_KEEPER_1:
|
||||
case EVENT_SUMMON_KEEPER_2:
|
||||
case EVENT_SUMMON_KEEPER_3:
|
||||
case EVENT_SUMMON_KEEPER_4:
|
||||
SummonPortalKeeper(eventId);
|
||||
break;
|
||||
case EVENT_WIPE_1:
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
medivh->RemoveAllAuras();
|
||||
}
|
||||
Events.ScheduleEvent(EVENT_WIPE_2, 500ms);
|
||||
break;
|
||||
case EVENT_WIPE_2:
|
||||
if (Creature* medivh = instance->GetCreature(_medivhGUID))
|
||||
{
|
||||
medivh->KillSelf(false);
|
||||
|
||||
GuidSet encounterNPCSCopy = encounterNPCs;
|
||||
for (ObjectGuid const& guid : encounterNPCSCopy)
|
||||
{
|
||||
switch (guid.GetEntry())
|
||||
{
|
||||
case NPC_TIME_RIFT:
|
||||
case NPC_DP_EMITTER_STALKER:
|
||||
case NPC_DP_CRYSTAL_STALKER:
|
||||
case NPC_DP_BEAM_STALKER:
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
{
|
||||
creature->DespawnOrUnsummon();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Events.ScheduleEvent(EVENT_WIPE_3, 2s);
|
||||
break;
|
||||
case EVENT_WIPE_3:
|
||||
{
|
||||
GuidSet encounterNPCSCopy = encounterNPCs;
|
||||
for (ObjectGuid const& guid : encounterNPCSCopy)
|
||||
{
|
||||
if (Creature* creature = instance->GetCreature(guid))
|
||||
{
|
||||
creature->CastSpell(creature, SPELL_TELEPORT_VISUAL, true);
|
||||
creature->DespawnOrUnsummon(1200ms, 0s);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ReadSaveDataMore(std::istringstream& data) override
|
||||
{
|
||||
data >> encounters[0];
|
||||
data >> encounters[1];
|
||||
data >> encounters[2];
|
||||
}
|
||||
|
||||
void WriteSaveDataMore(std::ostringstream& data) override
|
||||
{
|
||||
data << encounters[0] << ' '
|
||||
<< encounters[1] << ' '
|
||||
<< encounters[2] << ' ';
|
||||
_scheduler.Update(diff);
|
||||
}
|
||||
|
||||
protected:
|
||||
EventMap Events;
|
||||
std::array<ObjectGuid, MAX_PORTAL_LOCATIONS> _usedRiftPostions;
|
||||
uint32 _timerToNextBoss;
|
||||
std::list<Position> _availableRiftPositions;
|
||||
GuidSet _encounterNPCs;
|
||||
uint8 _currentRift;
|
||||
int8 _shieldPercent;
|
||||
bool _canSpawnPortal;
|
||||
TaskScheduler _scheduler;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -43,6 +43,10 @@ enum medivhMisc
|
||||
EVENT_OUTRO_8 = 17
|
||||
};
|
||||
|
||||
static std::vector<uint32> firstWave = { NPC_INFINITE_ASSASIN, NPC_INFINITE_WHELP, NPC_INFINITE_CHRONOMANCER };
|
||||
static std::vector<uint32> secondWave = { NPC_INFINITE_EXECUTIONER, NPC_INFINITE_CHRONOMANCER, NPC_INFINITE_WHELP, NPC_INFINITE_ASSASIN };
|
||||
static std::vector<uint32> thirdWave = { NPC_INFINITE_EXECUTIONER, NPC_INFINITE_VANQUISHER, NPC_INFINITE_CHRONOMANCER, NPC_INFINITE_ASSASIN };
|
||||
|
||||
class NpcRunToHome : public BasicEvent
|
||||
{
|
||||
public:
|
||||
@@ -91,7 +95,7 @@ struct npc_medivh_bm : public ScriptedAI
|
||||
events.Reset();
|
||||
me->CastSpell(me, SPELL_MANA_SHIELD, true);
|
||||
|
||||
if (_instance->GetData(TYPE_AEONUS) != DONE)
|
||||
if (_instance->GetBossState(DATA_AEONUS) != DONE)
|
||||
{
|
||||
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
|
||||
}
|
||||
@@ -101,8 +105,6 @@ struct npc_medivh_bm : public ScriptedAI
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
_instance->SetGuidData(DATA_SUMMONED_NPC, summon->GetGUID());
|
||||
|
||||
if (summon->GetEntry() == NPC_DP_CRYSTAL_STALKER)
|
||||
{
|
||||
summon->DespawnOrUnsummon(25000);
|
||||
@@ -119,14 +121,9 @@ struct npc_medivh_bm : public ScriptedAI
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* summon) override
|
||||
{
|
||||
_instance->SetGuidData(DATA_DELETED_NPC, summon->GetGUID());
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!events.Empty() || _instance->GetData(TYPE_AEONUS) == DONE)
|
||||
if (!events.Empty() || _instance->GetBossState(DATA_AEONUS) == DONE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -252,7 +249,10 @@ private:
|
||||
enum timeRift
|
||||
{
|
||||
EVENT_SUMMON_AT_RIFT = 1,
|
||||
EVENT_CHECK_DEATH = 2
|
||||
EVENT_CHECK_DEATH = 2,
|
||||
EVENT_SUMMON_BOSS = 3,
|
||||
|
||||
SAY_RIFT_MOB_SUMMONED = 0
|
||||
};
|
||||
|
||||
struct npc_time_rift : public NullCreatureAI
|
||||
@@ -264,19 +264,32 @@ struct npc_time_rift : public NullCreatureAI
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
if (_instance->GetData(DATA_RIFT_NUMBER) >= 18)
|
||||
uint32 riftNumer = _instance->GetData(DATA_RIFT_NUMBER);
|
||||
|
||||
if (riftNumer < 6)
|
||||
{
|
||||
me->DespawnOrUnsummon(30000);
|
||||
return;
|
||||
waveMobs = firstWave;
|
||||
}
|
||||
else if (riftNumer < 12)
|
||||
{
|
||||
waveMobs = secondWave;
|
||||
}
|
||||
else
|
||||
{
|
||||
waveMobs = thirdWave;
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16000);
|
||||
events.ScheduleEvent(EVENT_CHECK_DEATH, 8000);
|
||||
waveMobIndex = 0;
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_BOSS, 6s);
|
||||
}
|
||||
|
||||
void SetGUID(ObjectGuid guid, int32) override
|
||||
void JustSummoned(Creature* creature) override
|
||||
{
|
||||
_riftKeeperGUID = guid;
|
||||
if (creature->GetEntry() != NPC_AEONUS && _riftKeeperGUID.IsEmpty())
|
||||
{
|
||||
_riftKeeperGUID = creature->GetGUID();
|
||||
}
|
||||
}
|
||||
|
||||
void DoSummonAtRift(uint32 entry)
|
||||
@@ -284,21 +297,20 @@ struct npc_time_rift : public NullCreatureAI
|
||||
Position pos = me->GetNearPosition(10.0f, 2 * M_PI * rand_norm());
|
||||
|
||||
if (Creature* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 150000))
|
||||
if (_instance)
|
||||
{
|
||||
if (Creature* medivh = _instance->GetCreature(DATA_MEDIVH))
|
||||
{
|
||||
if (Unit* medivh = ObjectAccessor::GetUnit(*me, _instance->GetGuidData(DATA_MEDIVH)))
|
||||
{
|
||||
float o = medivh->GetAngle(summon) + frand(-1.0f, 1.0f);
|
||||
summon->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(o), medivh->GetPositionY() + 14.0f * std::sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh));
|
||||
summon->GetMotionMaster()->MoveTargetedHome(true);
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
float o = medivh->GetAngle(summon) + frand(-1.0f, 1.0f);
|
||||
summon->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(o), medivh->GetPositionY() + 14.0f * std::sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh));
|
||||
summon->GetMotionMaster()->MoveTargetedHome(true);
|
||||
summon->SetReactState(REACT_DEFENSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoSelectSummon()
|
||||
{
|
||||
uint32 entry = RAND(NPC_INFINITE_ASSASIN, NPC_INFINITE_WHELP, NPC_INFINITE_CRONOMANCER, NPC_INFINITE_EXECUTIONER, NPC_INFINITE_VANQUISHER);
|
||||
uint32 entry = waveMobs[waveMobIndex];
|
||||
if (entry == NPC_INFINITE_WHELP)
|
||||
{
|
||||
DoSummonAtRift(entry);
|
||||
@@ -307,8 +319,42 @@ struct npc_time_rift : public NullCreatureAI
|
||||
}
|
||||
else
|
||||
{
|
||||
if (urand(0, 1))
|
||||
{
|
||||
switch (entry)
|
||||
{
|
||||
case NPC_INFINITE_ASSASIN:
|
||||
entry = NPC_INFINITE_ASSASIN_2;
|
||||
break;
|
||||
case NPC_INFINITE_CHRONOMANCER:
|
||||
entry = NPC_INFINITE_CHRONOMANCER_2;
|
||||
break;
|
||||
case NPC_INFINITE_EXECUTIONER:
|
||||
entry = NPC_INFINITE_EXECUTIONER_2;
|
||||
break;
|
||||
case NPC_INFINITE_VANQUISHER:
|
||||
entry = NPC_INFINITE_VANQUISHER_2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoSummonAtRift(entry);
|
||||
}
|
||||
|
||||
if (++waveMobIndex >= waveMobs.size())
|
||||
{
|
||||
waveMobIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* creature, Unit* /*killer*/) override
|
||||
{
|
||||
if (creature->GetGUID() == _riftKeeperGUID)
|
||||
{
|
||||
me->DespawnOrUnsummon(0);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -317,27 +363,51 @@ struct npc_time_rift : public NullCreatureAI
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SUMMON_AT_RIFT:
|
||||
DoSelectSummon();
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
|
||||
break;
|
||||
case EVENT_CHECK_DEATH:
|
||||
if (!me->HasUnitState(UNIT_STATE_CASTING))
|
||||
if (!_instance->GetCreature(DATA_AEONUS))
|
||||
{
|
||||
Creature* riftKeeper = ObjectAccessor::GetCreature(*me, _riftKeeperGUID);
|
||||
if (!riftKeeper || !riftKeeper->IsAlive())
|
||||
{
|
||||
_instance->SetGuidData(DATA_RIFT_KILLED, me->GetGUID());
|
||||
|
||||
me->DespawnOrUnsummon(0);
|
||||
DoSelectSummon();
|
||||
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_BOSS:
|
||||
{
|
||||
int32 entry = 0;
|
||||
switch (_instance->GetData(DATA_RIFT_NUMBER))
|
||||
{
|
||||
case 6:
|
||||
entry = _instance->GetBossState(DATA_CHRONO_LORD_DEJA) == DONE ? (me->GetMap()->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA;
|
||||
break;
|
||||
}
|
||||
else
|
||||
case 12:
|
||||
entry = _instance->GetBossState(DATA_TEMPORUS) == DONE ? (me->GetMap()->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS;
|
||||
break;
|
||||
case 18:
|
||||
entry = NPC_AEONUS;
|
||||
break;
|
||||
default:
|
||||
entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2);
|
||||
break;
|
||||
}
|
||||
|
||||
Position pos = me->GetNearPosition(10.0f, 2 * M_PI * rand_norm());
|
||||
|
||||
if (Creature* summon = me->SummonCreature(std::abs(entry), pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3 * MINUTE * IN_MILLISECONDS))
|
||||
{
|
||||
if (entry < 0)
|
||||
{
|
||||
me->CastSpell(riftKeeper, SPELL_RIFT_CHANNEL, false);
|
||||
summon->SetLootMode(0);
|
||||
}
|
||||
|
||||
if (summon->GetEntry() != NPC_AEONUS)
|
||||
{
|
||||
me->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
|
||||
}
|
||||
|
||||
if (summon->IsAIEnabled)
|
||||
{
|
||||
summon->AI()->Talk(SAY_RIFT_MOB_SUMMONED);
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_DEATH, 500);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -345,6 +415,8 @@ private:
|
||||
EventMap _events;
|
||||
InstanceScript* _instance;
|
||||
ObjectGuid _riftKeeperGUID;
|
||||
std::vector<uint32> waveMobs;
|
||||
uint8 waveMobIndex;
|
||||
};
|
||||
|
||||
struct npc_black_morass_summoned_add : public SmartAI
|
||||
|
||||
@@ -24,13 +24,15 @@
|
||||
|
||||
#define DataHeader "TBM"
|
||||
|
||||
uint32 const EncounterCount = 3;
|
||||
|
||||
#define TheBlackMorassScriptName "instance_the_black_morass"
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_CHRONO_LORD_DEJA = 0,
|
||||
TYPE_TEMPORUS = 1,
|
||||
TYPE_AEONUS = 2,
|
||||
DATA_CHRONO_LORD_DEJA = 0,
|
||||
DATA_TEMPORUS = 1,
|
||||
DATA_AEONUS = 2,
|
||||
MAX_ENCOUNTER = 3,
|
||||
|
||||
DATA_MEDIVH = 10,
|
||||
@@ -40,7 +42,7 @@ enum DataTypes
|
||||
DATA_RIFT_NUMBER = 14,
|
||||
|
||||
DATA_SUMMONED_NPC = 20,
|
||||
DATA_DELETED_NPC = 21,
|
||||
DATA_DELETED_NPC = 21
|
||||
};
|
||||
|
||||
enum WorldStateIds
|
||||
@@ -75,10 +77,15 @@ enum CreatureIds
|
||||
|
||||
NPC_INFINITE_ASSASIN = 17835,
|
||||
NPC_INFINITE_WHELP = 21818,
|
||||
NPC_INFINITE_CRONOMANCER = 17892,
|
||||
NPC_INFINITE_CHRONOMANCER = 17892,
|
||||
NPC_INFINITE_EXECUTIONER = 18994,
|
||||
NPC_INFINITE_VANQUISHER = 18995,
|
||||
|
||||
NPC_INFINITE_ASSASIN_2 = 21137,
|
||||
NPC_INFINITE_CHRONOMANCER_2 = 21136,
|
||||
NPC_INFINITE_EXECUTIONER_2 = 21138,
|
||||
NPC_INFINITE_VANQUISHER_2 = 21139,
|
||||
|
||||
NPC_DP_EMITTER_STALKER = 18582,
|
||||
NPC_DP_CRYSTAL_STALKER = 18553,
|
||||
NPC_DP_BEAM_STALKER = 18555
|
||||
@@ -89,16 +96,9 @@ enum Misc
|
||||
SPELL_RIFT_CHANNEL = 31387,
|
||||
SPELL_TELEPORT_VISUAL = 7791,
|
||||
|
||||
EVENT_NEXT_PORTAL = 1,
|
||||
EVENT_SUMMON_KEEPER_1 = 2,
|
||||
EVENT_SUMMON_KEEPER_2 = 3,
|
||||
EVENT_SUMMON_KEEPER_3 = 4,
|
||||
EVENT_SUMMON_KEEPER_4 = 5,
|
||||
EVENT_WIPE_1 = 6,
|
||||
EVENT_WIPE_2 = 7,
|
||||
EVENT_WIPE_3 = 8,
|
||||
ACTION_OUTRO = 1,
|
||||
|
||||
ACTION_OUTRO = 1
|
||||
CONTEXT_GROUP_RIFTS = 1
|
||||
};
|
||||
|
||||
enum medivhSays
|
||||
|
||||
@@ -1078,7 +1078,7 @@ public:
|
||||
|
||||
bool GossipSelect(Player* player, uint32 sender, uint32 action) override
|
||||
{
|
||||
Seconds respawnTimer = 0s;
|
||||
Seconds respawnTimer{};
|
||||
player->PlayerTalkClass->SendCloseGossip();
|
||||
|
||||
Creature* lastSpawn = ObjectAccessor::GetCreature(*me, _creatureGuid);
|
||||
|
||||
@@ -110,7 +110,7 @@ class boss_anub_arak : public CreatureScript
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,13 +133,13 @@ class boss_anub_arak : public CreatureScript
|
||||
Talk(SAY_AGGRO);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20000);
|
||||
events.ScheduleEvent(EVENT_POUND, 15000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 1000);
|
||||
events.ScheduleEvent(EVENT_CLOSE_DOORS, 5000);
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETELS, 6500ms);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s);
|
||||
events.ScheduleEvent(EVENT_POUND, 15s);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 1s);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 1s);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 1s);
|
||||
events.ScheduleEvent(EVENT_CLOSE_DOORS, 5s);
|
||||
}
|
||||
|
||||
void SummonHelpers(float x, float y, float z, uint32 spellId)
|
||||
@@ -164,12 +164,12 @@ class boss_anub_arak : public CreatureScript
|
||||
break;
|
||||
case EVENT_CARRION_BEETELS:
|
||||
me->CastSpell(me, SPELL_CARRION_BEETLES, false);
|
||||
events.ScheduleEvent(EVENT_CARRION_BEETELS, 25000);
|
||||
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, 20000);
|
||||
events.ScheduleEvent(EVENT_LEECHING_SWARM, 20s);
|
||||
break;
|
||||
case EVENT_POUND:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f))
|
||||
@@ -177,10 +177,10 @@ class boss_anub_arak : public CreatureScript
|
||||
me->CastSpell(me, SPELL_SELF_ROOT, true);
|
||||
me->DisableRotate(true);
|
||||
me->SendMovementFlagUpdate();
|
||||
events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300);
|
||||
events.ScheduleEvent(EVENT_ENABLE_ROTATE, 3300ms);
|
||||
me->CastSpell(target, SPELL_POUND, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_POUND, 18000);
|
||||
events.ScheduleEvent(EVENT_POUND, 18s);
|
||||
break;
|
||||
case EVENT_ENABLE_ROTATE:
|
||||
me->RemoveAurasDueToSpell(SPELL_SELF_ROOT);
|
||||
@@ -197,16 +197,16 @@ class boss_anub_arak : public CreatureScript
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
|
||||
events.DelayEvents(46000, 0);
|
||||
events.ScheduleEvent(EVENT_EMERGE, 45000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 2000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN, 4000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 15000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_VENOMANCER, 20000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_DARTER, 30000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 35000);
|
||||
events.ScheduleEvent(EVENT_EMERGE, 45s);
|
||||
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);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(eventId, 500);
|
||||
events.ScheduleEvent(eventId, 500ms);
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
me->CastSpell(me, SPELL_EMERGE, true);
|
||||
|
||||
@@ -97,10 +97,10 @@ public:
|
||||
{
|
||||
instance->SetBossState(DATA_HADRONOX_EVENT, IN_PROGRESS);
|
||||
me->setActive(true);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE1, 20000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE2, 40000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE3, 60000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE4, 80000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE1, 20s);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE2, 40s);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE3, 60s);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE4, 80s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,10 +139,10 @@ public:
|
||||
|
||||
void JustEngagedWith(Unit*) override
|
||||
{
|
||||
events.RescheduleEvent(EVENT_HADRONOX_ACID, 10000);
|
||||
events.RescheduleEvent(EVENT_HADRONOX_LEECH, 4000);
|
||||
events.RescheduleEvent(EVENT_HADRONOX_PIERCE, 1000);
|
||||
events.RescheduleEvent(EVENT_HADRONOX_GRAB, 15000);
|
||||
events.RescheduleEvent(EVENT_HADRONOX_ACID, 10s);
|
||||
events.RescheduleEvent(EVENT_HADRONOX_LEECH, 4s);
|
||||
events.RescheduleEvent(EVENT_HADRONOX_PIERCE, 1s);
|
||||
events.RescheduleEvent(EVENT_HADRONOX_GRAB, 15s);
|
||||
}
|
||||
|
||||
bool AnyPlayerValid() const
|
||||
@@ -183,20 +183,20 @@ public:
|
||||
{
|
||||
case EVENT_HADRONOX_PIERCE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_PIERCE_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_PIERCE, 8000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_PIERCE, 8s);
|
||||
break;
|
||||
case EVENT_HADRONOX_ACID:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, false))
|
||||
me->CastSpell(target, SPELL_ACID_CLOUD, false);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_ACID, 25000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_ACID, 25s);
|
||||
break;
|
||||
case EVENT_HADRONOX_LEECH:
|
||||
me->CastSpell(me, SPELL_LEECH_POISON, false);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_LEECH, 12000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_LEECH, 12s);
|
||||
break;
|
||||
case EVENT_HADRONOX_GRAB:
|
||||
me->CastSpell(me, SPELL_WEB_GRAB, false);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_GRAB, 25000);
|
||||
events.ScheduleEvent(EVENT_HADRONOX_GRAB, 25s);
|
||||
break;
|
||||
case EVENT_HADRONOX_MOVE4:
|
||||
me->CastSpell(me, SPELL_WEB_FRONT_DOORS, true);
|
||||
@@ -281,8 +281,8 @@ public:
|
||||
Talk(SAY_CRUSHER_AGGRO);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_CRUSHER_SMASH, 8000, 0, 0);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_CRUSHER_SMASH, 8s, 0, 0);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -298,7 +298,7 @@ public:
|
||||
{
|
||||
case EVENT_CRUSHER_SMASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SMASH, false);
|
||||
events.ScheduleEvent(EVENT_CRUSHER_SMASH, 15000);
|
||||
events.ScheduleEvent(EVENT_CRUSHER_SMASH, 15s);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(30))
|
||||
@@ -307,7 +307,7 @@ public:
|
||||
me->CastSpell(me, SPELL_FRENZY, false);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+16
-16
@@ -105,17 +105,17 @@ public:
|
||||
|
||||
if (events.Empty() && who->GetPositionZ() < 785.0f)
|
||||
{
|
||||
events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 10000);
|
||||
events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 40000);
|
||||
events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 70000);
|
||||
events2.ScheduleEvent(EVENT_KRIK_ENTER_COMBAT, 100000);
|
||||
events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5000);
|
||||
events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 10s);
|
||||
events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 40s);
|
||||
events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 70s);
|
||||
events2.ScheduleEvent(EVENT_KRIK_ENTER_COMBAT, 100s);
|
||||
events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5s);
|
||||
|
||||
events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1000);
|
||||
events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 13000);
|
||||
events.ScheduleEvent(EVENT_KRIK_SUMMON, 17000);
|
||||
events.ScheduleEvent(EVENT_KRIK_CURSE, 8000);
|
||||
events.ScheduleEvent(EVENT_CALL_ADDS, 1000);
|
||||
events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1s);
|
||||
events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 13s);
|
||||
events.ScheduleEvent(EVENT_KRIK_SUMMON, 17s);
|
||||
events.ScheduleEvent(EVENT_KRIK_CURSE, 8s);
|
||||
events.ScheduleEvent(EVENT_CALL_ADDS, 1s);
|
||||
me->setActive(true);
|
||||
}
|
||||
}
|
||||
@@ -145,7 +145,7 @@ public:
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,7 +178,7 @@ public:
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5000);
|
||||
events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -197,21 +197,21 @@ public:
|
||||
me->CastSpell(me, SPELL_FRENZY, true);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1000);
|
||||
events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1s);
|
||||
break;
|
||||
case EVENT_KRIK_SUMMON:
|
||||
Talk(SAY_SWARM);
|
||||
me->CastSpell(me, SPELL_SWARM, false);
|
||||
events.ScheduleEvent(EVENT_KRIK_SUMMON, 20000);
|
||||
events.ScheduleEvent(EVENT_KRIK_SUMMON, 20s);
|
||||
break;
|
||||
case EVENT_KRIK_MIND_FLAY:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MIND_FLAY, false);
|
||||
events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 15000);
|
||||
events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 15s);
|
||||
break;
|
||||
case EVENT_KRIK_CURSE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
|
||||
me->CastSpell(target, SPELL_CURSE_OF_FATIGUE, true);
|
||||
events.ScheduleEvent(EVENT_KRIK_CURSE, 10000);
|
||||
events.ScheduleEvent(EVENT_KRIK_CURSE, 10s);
|
||||
break;
|
||||
case EVENT_CALL_ADDS:
|
||||
summons.DoZoneInCombat();
|
||||
|
||||
@@ -116,11 +116,11 @@ struct boss_amanitar : public BossAI
|
||||
|
||||
void JustEngagedWith(Unit* /*attacker*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_ROOTS, urand(5000, 9000));
|
||||
events.ScheduleEvent(EVENT_BASH, urand(10000, 14000));
|
||||
events.ScheduleEvent(EVENT_BOLT, urand(15000, 20000));
|
||||
events.ScheduleEvent(EVENT_MINI, 1000);
|
||||
events.ScheduleEvent(EVENT_RESPAWN, 40000, 60000);
|
||||
events.ScheduleEvent(EVENT_ROOTS, 5s, 9s);
|
||||
events.ScheduleEvent(EVENT_BASH, 10s, 14s);
|
||||
events.ScheduleEvent(EVENT_BOLT, 15s, 20s);
|
||||
events.ScheduleEvent(EVENT_MINI, 1s);
|
||||
events.ScheduleEvent(EVENT_RESPAWN, 40s, 60s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
@@ -158,7 +158,7 @@ struct boss_amanitar : public BossAI
|
||||
_mushroomsDeque.pop_front();
|
||||
}
|
||||
|
||||
events.RepeatEvent(urand(40000, 60000));
|
||||
events.Repeat(40s, 60s);
|
||||
break;
|
||||
}
|
||||
case EVENT_ROOTS:
|
||||
@@ -168,13 +168,13 @@ struct boss_amanitar : public BossAI
|
||||
DoCast(pTarget, SPELL_ENTANGLING_ROOTS, false);
|
||||
}
|
||||
|
||||
events.RepeatEvent(urand(10000, 15000));
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
}
|
||||
case EVENT_BASH:
|
||||
{
|
||||
DoCastVictim(SPELL_BASH, false);
|
||||
events.RepeatEvent(urand(15000, 20000));
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
}
|
||||
case EVENT_BOLT:
|
||||
@@ -184,13 +184,13 @@ struct boss_amanitar : public BossAI
|
||||
DoCast(pTarget, SPELL_VENOM_BOLT_VOLLEY, false);
|
||||
}
|
||||
|
||||
events.RepeatEvent(urand(15000, 20000));
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
}
|
||||
case EVENT_REMOVE_MUSHROOM_POWER:
|
||||
{
|
||||
DoCastAOE(SPELL_REMOVE_MUSHROOM_POWER, true);
|
||||
events.RescheduleEvent(EVENT_MINI, 1000);
|
||||
events.RescheduleEvent(EVENT_MINI, 1s);
|
||||
break;
|
||||
}
|
||||
case EVENT_MINI:
|
||||
@@ -208,7 +208,7 @@ struct boss_amanitar : public BossAI
|
||||
{
|
||||
DoCastSelf(SPELL_REMOVE_MUSHROOM_POWER, true);
|
||||
DoCastAOE(SPELL_MINI);
|
||||
events.RescheduleEvent(EVENT_REMOVE_MUSHROOM_POWER, 29000);
|
||||
events.RescheduleEvent(EVENT_REMOVE_MUSHROOM_POWER, 29s);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -261,11 +261,11 @@ struct npc_amanitar_mushrooms : public ScriptedAI
|
||||
DoCastSelf(SPELL_HEALTHY_MUSHROOM_VISUAL_AURA, true);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_GROW, 800);
|
||||
events.ScheduleEvent(EVENT_GROW, 800ms);
|
||||
|
||||
if (me->GetEntry() == NPC_POISONOUS_MUSHROOM)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHECK_PLAYER, 250);
|
||||
events.ScheduleEvent(EVENT_CHECK_PLAYER, 250ms);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -300,11 +300,11 @@ struct npc_amanitar_mushrooms : public ScriptedAI
|
||||
DoCastSelf(SPELL_POISONOUS_MUSHROOM_VISUAL_AREA);
|
||||
DoCastSelf(SPELL_POISONOUS_MUSHROOM_POISON_CLOUD);
|
||||
DoCastSelf(SPELL_SHRINK);
|
||||
events.ScheduleEvent(EVENT_KILLSELF, 4000);
|
||||
events.ScheduleEvent(EVENT_KILLSELF, 4s);
|
||||
}
|
||||
else
|
||||
{
|
||||
events.RepeatEvent(250);
|
||||
events.Repeat(250ms);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -94,13 +94,13 @@ struct boss_elder_nadox : public BossAI
|
||||
_JustEngagedWith();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SWARMER, 10000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HOME, 2000);
|
||||
events.ScheduleEvent(EVENT_PLAGUE, urand(5000, 8000));
|
||||
events.ScheduleEvent(EVENT_SWARMER, 10s);
|
||||
events.ScheduleEvent(EVENT_CHECK_HOME, 2s);
|
||||
events.ScheduleEvent(EVENT_PLAGUE, 5s, 8s);
|
||||
|
||||
if (IsHeroic())
|
||||
{
|
||||
events.ScheduleEvent(EVENT_BROOD_RAGE, 5000);
|
||||
events.ScheduleEvent(EVENT_BROOD_RAGE, 5s);
|
||||
}
|
||||
|
||||
// Cache eggs
|
||||
@@ -198,19 +198,19 @@ struct boss_elder_nadox : public BossAI
|
||||
if (Creature* pSwarmer = me->FindNearestCreature(NPC_AHNKAHAR_SWARMER, 40, true))
|
||||
DoCast(pSwarmer, SPELL_BROOD_RAGE_H, true);
|
||||
|
||||
events.RepeatEvent(10000);
|
||||
events.Repeat(10s);
|
||||
break;
|
||||
}
|
||||
case EVENT_PLAGUE:
|
||||
{
|
||||
DoCastVictim(SPELL_BROOD_PLAGUE, false);
|
||||
events.RepeatEvent(urand(12000, 17000));
|
||||
events.Repeat(12s, 17s);
|
||||
break;
|
||||
}
|
||||
case EVENT_SWARMER:
|
||||
{
|
||||
SummonHelpers(true);
|
||||
events.RepeatEvent(10000);
|
||||
events.Repeat(10s);
|
||||
break;
|
||||
}
|
||||
case EVENT_CHECK_HOME:
|
||||
|
||||
@@ -115,9 +115,9 @@ struct boss_volazj : public BossAI
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_JustEngagedWith();
|
||||
events.ScheduleEvent(EVENT_HERALD_MIND_FLAY, 8000);
|
||||
events.ScheduleEvent(EVENT_HERALD_SHADOW, 5000);
|
||||
events.ScheduleEvent(EVENT_HERALD_SHIVER, 15000);
|
||||
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);
|
||||
@@ -241,13 +241,13 @@ struct boss_volazj : public BossAI
|
||||
case EVENT_HERALD_MIND_FLAY:
|
||||
{
|
||||
DoCastVictim(SPELL_MIND_FLAY, false);
|
||||
events.RepeatEvent(20000);
|
||||
events.Repeat(20s);
|
||||
break;
|
||||
}
|
||||
case EVENT_HERALD_SHADOW:
|
||||
{
|
||||
DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY, false);
|
||||
events.RepeatEvent(5000);
|
||||
events.Repeat(5s);
|
||||
break;
|
||||
}
|
||||
case EVENT_HERALD_SHIVER:
|
||||
@@ -257,7 +257,7 @@ struct boss_volazj : public BossAI
|
||||
DoCast(pTarget, SPELL_SHIVER, false);
|
||||
}
|
||||
|
||||
events.RepeatEvent(15000);
|
||||
events.Repeat(15s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@ struct boss_jedoga_shadowseeker : public BossAI
|
||||
{
|
||||
DoCastSelf(SPELL_GIFT_OF_THE_HERALD, true);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_JEDOGA_MOVE_DOWN, 1000, 0, PHASE_RITUAL);
|
||||
events.ScheduleEvent(EVENT_JEDOGA_MOVE_DOWN, 1s, 0, PHASE_RITUAL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -299,7 +299,7 @@ struct boss_jedoga_shadowseeker : public BossAI
|
||||
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||
|
||||
events.SetPhase(PHASE_RITUAL);
|
||||
events.ScheduleEvent(EVENT_JEDOGA_PREPARE_RITUAL, 1000, 0, PHASE_RITUAL);
|
||||
events.ScheduleEvent(EVENT_JEDOGA_PREPARE_RITUAL, 1s, 0, PHASE_RITUAL);
|
||||
ritualTriggered = true;
|
||||
return;
|
||||
}
|
||||
@@ -405,7 +405,7 @@ struct boss_jedoga_shadowseeker : public BossAI
|
||||
{
|
||||
me->SetFacingTo(5.66f);
|
||||
DoCastSelf(SPELL_HOVER_FALL);
|
||||
events.ScheduleEvent(EVENT_JEDOGA_MOVE_UP, 1000, 0, PHASE_RITUAL);
|
||||
events.ScheduleEvent(EVENT_JEDOGA_MOVE_UP, 1s, 0, PHASE_RITUAL);
|
||||
break;
|
||||
}
|
||||
case POINT_INITIAL:
|
||||
@@ -461,7 +461,7 @@ struct boss_jedoga_shadowseeker : public BossAI
|
||||
case EVENT_JEDOGA_CYCLONE:
|
||||
{
|
||||
DoCastSelf(DUNGEON_MODE(SPELL_CYCLONE_STRIKE, SPELL_CYCLONE_STRIKE_H), false);
|
||||
events.RepeatEvent(urand(10000, 14000));
|
||||
events.Repeat(10s, 14s);
|
||||
break;
|
||||
}
|
||||
case EVENT_JEDOGA_LIGHTNING_BOLT:
|
||||
@@ -470,7 +470,7 @@ struct boss_jedoga_shadowseeker : public BossAI
|
||||
{
|
||||
DoCast(pTarget, DUNGEON_MODE(SPELL_LIGHTNING_BOLT, SPELL_LIGHTNING_BOLT_H), false);
|
||||
}
|
||||
events.RepeatEvent(urand(11000, 15000));
|
||||
events.Repeat(11s, 15s);
|
||||
break;
|
||||
}
|
||||
case EVENT_JEDOGA_THUNDERSHOCK:
|
||||
@@ -480,7 +480,7 @@ struct boss_jedoga_shadowseeker : public BossAI
|
||||
DoCast(pTarget, DUNGEON_MODE(SPELL_THUNDERSHOCK, SPELL_THUNDERSHOCK_H), false);
|
||||
}
|
||||
|
||||
events.RepeatEvent(urand(16000, 22000));
|
||||
events.Repeat(16s, 22s);
|
||||
break;
|
||||
}
|
||||
// Ritual phase
|
||||
@@ -534,9 +534,9 @@ private:
|
||||
void ReschedulleCombatEvents()
|
||||
{
|
||||
events.SetPhase(PHASE_NORMAL);
|
||||
events.RescheduleEvent(EVENT_JEDOGA_CYCLONE, 3000, 0, PHASE_NORMAL);
|
||||
events.RescheduleEvent(EVENT_JEDOGA_LIGHTNING_BOLT, 7000, 0, PHASE_NORMAL);
|
||||
events.RescheduleEvent(EVENT_JEDOGA_THUNDERSHOCK, 12000, 0, PHASE_NORMAL);
|
||||
events.RescheduleEvent(EVENT_JEDOGA_CYCLONE, 3s, 0, PHASE_NORMAL);
|
||||
events.RescheduleEvent(EVENT_JEDOGA_LIGHTNING_BOLT, 7s, 0, PHASE_NORMAL);
|
||||
events.RescheduleEvent(EVENT_JEDOGA_THUNDERSHOCK, 12s, 0, PHASE_NORMAL);
|
||||
}
|
||||
|
||||
void DespawnOOCSummons()
|
||||
@@ -592,7 +592,7 @@ struct npc_twilight_volunteer : public ScriptedAI
|
||||
Talk(SAY_CHOSEN);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
|
||||
events.ScheduleEvent(EVENT_RITUAL_BEGIN_MOVE, 1500);
|
||||
events.ScheduleEvent(EVENT_RITUAL_BEGIN_MOVE, 1500ms);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -383,7 +383,7 @@ struct boss_taldaram : public BossAI
|
||||
case EVENT_PRINCE_BLOODTHIRST:
|
||||
{
|
||||
DoCastSelf(SPELL_BLOODTHIRST);
|
||||
events.RepeatEvent(10000);
|
||||
events.Repeat(10s);
|
||||
break;
|
||||
}
|
||||
case EVENT_PRINCE_FLAME_SPHERES:
|
||||
@@ -396,15 +396,15 @@ struct boss_taldaram : public BossAI
|
||||
|
||||
if (!events.GetNextEventTime(EVENT_PRINCE_VANISH))
|
||||
{
|
||||
events.RescheduleEvent(EVENT_PRINCE_VANISH, 14000);
|
||||
events.RescheduleEvent(EVENT_PRINCE_VANISH, 14s);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Make sure that Vanish won't get triggered at same time as sphere summon
|
||||
events.DelayEvents(4000);
|
||||
events.DelayEvents(4s);
|
||||
}
|
||||
|
||||
events.RepeatEvent(15000);
|
||||
events.Repeat(15s);
|
||||
break;
|
||||
}
|
||||
case EVENT_PRINCE_VANISH:
|
||||
@@ -439,7 +439,7 @@ struct boss_taldaram : public BossAI
|
||||
|
||||
events.CancelEvent(EVENT_PRINCE_FLAME_SPHERES);
|
||||
events.CancelEvent(EVENT_PRINCE_BLOODTHIRST);
|
||||
events.ScheduleEvent(EVENT_PRINCE_VANISH_RUN, 2499);
|
||||
events.ScheduleEvent(EVENT_PRINCE_VANISH_RUN, 2499ms);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -453,7 +453,7 @@ struct boss_taldaram : public BossAI
|
||||
me->RemoveAura(SPELL_VANISH);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_PRINCE_RESCHEDULE, 20000);
|
||||
events.ScheduleEvent(EVENT_PRINCE_RESCHEDULE, 20s);
|
||||
break;
|
||||
}
|
||||
case EVENT_PRINCE_RESCHEDULE:
|
||||
@@ -483,8 +483,8 @@ private:
|
||||
void ScheduleCombatEvents()
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_PRINCE_FLAME_SPHERES, 10000);
|
||||
events.RescheduleEvent(EVENT_PRINCE_BLOODTHIRST, 10000);
|
||||
events.RescheduleEvent(EVENT_PRINCE_FLAME_SPHERES, 10s);
|
||||
events.RescheduleEvent(EVENT_PRINCE_BLOODTHIRST, 10s);
|
||||
vanishTarget_GUID.Clear();
|
||||
vanishDamage = 0;
|
||||
}
|
||||
|
||||
@@ -291,15 +291,15 @@ public:
|
||||
Talk(SAY_SARTHARION_AGGRO);
|
||||
|
||||
// Combat events
|
||||
events.ScheduleEvent(EVENT_SARTHARION_CAST_CLEAVE, 7000);
|
||||
events.ScheduleEvent(EVENT_SARTHARION_CAST_FLAME_BREATH, 15000);
|
||||
events.ScheduleEvent(EVENT_SARTHARION_CAST_TAIL_LASH, 11000);
|
||||
events.ScheduleEvent(EVENT_SARTHARION_CAST_CLEAVE, 7s);
|
||||
events.ScheduleEvent(EVENT_SARTHARION_CAST_FLAME_BREATH, 15s);
|
||||
events.ScheduleEvent(EVENT_SARTHARION_CAST_TAIL_LASH, 11s);
|
||||
|
||||
// Extra events
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_SUMMON_LAVA, 20000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_LAVA_STRIKE, 5000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_BERSERK, 900000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_BOUNDARY, 250);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_SUMMON_LAVA, 20s);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_LAVA_STRIKE, 5s);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_BERSERK, 15min);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_BOUNDARY, 250ms);
|
||||
|
||||
// Store dragons
|
||||
for (uint8 i = 0; i < MAX_DRAGONS; ++i)
|
||||
@@ -321,19 +321,19 @@ public:
|
||||
case DATA_TENEBRON:
|
||||
{
|
||||
dragon->CastSpell(dragon, SPELL_POWER_OF_TENEBRON, true);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_CALL_TENEBRON, 10000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_CALL_TENEBRON, 10s);
|
||||
break;
|
||||
}
|
||||
case DATA_SHADRON:
|
||||
{
|
||||
dragon->CastSpell(dragon, SPELL_POWER_OF_SHADRON, true);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_CALL_SHADRON, 65000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_CALL_SHADRON, 65s);
|
||||
break;
|
||||
}
|
||||
case DATA_VESPERON:
|
||||
{
|
||||
dragon->CastSpell(dragon, SPELL_POWER_OF_VESPERON, true);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_CALL_VESPERON, 115000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_CALL_VESPERON, 115s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -469,7 +469,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
extraEvents.RepeatEvent(250);
|
||||
extraEvents.Repeat(250ms);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -481,7 +481,7 @@ public:
|
||||
}
|
||||
|
||||
SummonLavaWaves();
|
||||
extraEvents.RepeatEvent(25000);
|
||||
extraEvents.Repeat(25s);
|
||||
return;
|
||||
}
|
||||
case EVENT_SARTHARION_START_LAVA:
|
||||
@@ -542,19 +542,19 @@ public:
|
||||
case EVENT_SARTHARION_CAST_CLEAVE:
|
||||
{
|
||||
DoCastVictim(SPELL_SARTHARION_CLEAVE, false);
|
||||
events.RepeatEvent(10000);
|
||||
events.Repeat(10s);
|
||||
break;
|
||||
}
|
||||
case EVENT_SARTHARION_CAST_FLAME_BREATH:
|
||||
{
|
||||
DoCastVictim(SPELL_SARTHARION_FLAME_BREATH, false);
|
||||
events.RepeatEvent(20000);
|
||||
events.Repeat(20s);
|
||||
break;
|
||||
}
|
||||
case EVENT_SARTHARION_CAST_TAIL_LASH:
|
||||
{
|
||||
DoCastSelf(SPELL_SARTHARION_TAIL_LASH, false);
|
||||
events.RepeatEvent(18000);
|
||||
events.Repeat(18s);
|
||||
break;
|
||||
}
|
||||
case EVENT_SARTHARION_LAVA_STRIKE:
|
||||
@@ -617,8 +617,8 @@ public:
|
||||
{
|
||||
summons.RemoveNotExisting();
|
||||
Talk(WHISPER_LAVA_CHURN);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_START_LAVA, 2000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_FINISH_LAVA, 9000);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_START_LAVA, 2s);
|
||||
extraEvents.ScheduleEvent(EVENT_SARTHARION_FINISH_LAVA, 9s);
|
||||
|
||||
// Send wave from left
|
||||
if (lastLavaSide == LAVA_RIGHT_SIDE)
|
||||
@@ -743,7 +743,7 @@ struct boss_sartharion_dragonAI : public BossAI
|
||||
if (param == ACTION_CALL_DRAGON && !isCalledBySartharion)
|
||||
{
|
||||
isCalledBySartharion = true;
|
||||
extraEvents.RescheduleEvent(EVENT_MINIDRAKE_SPEECH, 4000);
|
||||
extraEvents.RescheduleEvent(EVENT_MINIDRAKE_SPEECH, 4s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1037,9 +1037,9 @@ public:
|
||||
summons2.DespawnAll();
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 15000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20s);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10s);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 15s);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
@@ -1112,8 +1112,8 @@ public:
|
||||
instance->DoAction(ACTION_ADD_PORTAL);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000);
|
||||
events.RepeatEvent(60000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2s);
|
||||
events.Repeat(60s);
|
||||
break;
|
||||
}
|
||||
case EVENT_MINIBOSS_SPAWN_HELPERS:
|
||||
@@ -1135,7 +1135,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_HATCH_EGGS, 25000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_HATCH_EGGS, 25s);
|
||||
break;
|
||||
}
|
||||
case EVENT_MINIBOSS_HATCH_EGGS:
|
||||
@@ -1215,9 +1215,9 @@ public:
|
||||
void Reset() override
|
||||
{
|
||||
boss_sartharion_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 15000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20s);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10s);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 15s);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* /*summon*/, Unit* /*summon*/) override
|
||||
@@ -1241,7 +1241,7 @@ public:
|
||||
me->RemoveAura(SPELL_GIFT_OF_TWILIGHT_SHADOW);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 30000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 30s);
|
||||
}
|
||||
|
||||
void HandleExtraEvent(uint32 const eventId) override
|
||||
@@ -1295,7 +1295,7 @@ public:
|
||||
instance->DoAction(ACTION_ADD_PORTAL);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2s);
|
||||
break;
|
||||
}
|
||||
case EVENT_MINIBOSS_SPAWN_HELPERS:
|
||||
@@ -1340,9 +1340,9 @@ public:
|
||||
void Reset() override
|
||||
{
|
||||
boss_sartharion_dragonAI::Reset();
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 30000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_FISSURE, 20s);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SHADOW_BREATH, 10s);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 30s);
|
||||
}
|
||||
|
||||
void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override
|
||||
@@ -1357,7 +1357,7 @@ public:
|
||||
instance->DoAction(ACTION_CLEAR_PORTAL);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 30000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_OPEN_PORTAL, 30s);
|
||||
}
|
||||
|
||||
void HandleExtraEvent(uint32 const eventId) override
|
||||
@@ -1383,7 +1383,7 @@ public:
|
||||
}
|
||||
|
||||
DoCastVictim(SPELL_SHADOW_BREATH, false);
|
||||
events.RepeatEvent(17500);
|
||||
events.Repeat(17s + 500ms);
|
||||
break;
|
||||
}
|
||||
case EVENT_MINIBOSS_SHADOW_FISSURE:
|
||||
@@ -1393,7 +1393,7 @@ public:
|
||||
DoCast(target, SPELL_SHADOW_FISSURE, false);
|
||||
}
|
||||
|
||||
events.RepeatEvent(22500);
|
||||
events.Repeat(22s + 500ms);
|
||||
break;
|
||||
}
|
||||
case EVENT_MINIBOSS_OPEN_PORTAL:
|
||||
@@ -1412,7 +1412,7 @@ public:
|
||||
instance->DoAction(ACTION_ADD_PORTAL);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2000);
|
||||
events.ScheduleEvent(EVENT_MINIBOSS_SPAWN_HELPERS, 2s);
|
||||
break;
|
||||
}
|
||||
case EVENT_MINIBOSS_SPAWN_HELPERS:
|
||||
|
||||
+28
-28
@@ -154,7 +154,7 @@ public:
|
||||
{
|
||||
me->CastSpell(me, SPELL_REPELLING_WAVE, false);
|
||||
me->CastSpell(me, SPELL_CLEAR_DEBUFFS, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CLONE, 1000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CLONE, 1s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,15 +164,15 @@ public:
|
||||
BossAI::JustEngagedWith(who);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 11000);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13000);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15000);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 11s);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13s);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15s);
|
||||
if (!Is25ManRaid())
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1s);
|
||||
else
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1s);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ public:
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,17 +216,17 @@ public:
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 24000);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 24s);
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
me->CastSpell(me, SPELL_BLADE_TEMPEST, false);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000);
|
||||
events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24s);
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(2, 4, 2, 4); i++)
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.0f, true, true, -SPELL_ENERVATING_BRAND))
|
||||
me->CastSpell(target, SPELL_ENERVATING_BRAND, true);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000);
|
||||
events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26s);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH1:
|
||||
if (me->HealthBelowPct(50))
|
||||
@@ -234,7 +234,7 @@ public:
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH1, 1s);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH2:
|
||||
if (me->HealthBelowPct(66))
|
||||
@@ -242,7 +242,7 @@ public:
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1s);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH3:
|
||||
if (me->HealthBelowPct(33))
|
||||
@@ -250,7 +250,7 @@ public:
|
||||
DoAction(ACTION_CLONE);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH3, 1s);
|
||||
break;
|
||||
case EVENT_SUMMON_CLONE:
|
||||
me->CastSpell(me, SPELL_CLONE, false);
|
||||
@@ -285,9 +285,9 @@ public:
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000));
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, urand(18000, 25000));
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, urand(10000, 15000));
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 5s, 10s);
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, 18s, 25s);
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, 10s, 15s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -303,17 +303,17 @@ public:
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 24000);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 24s);
|
||||
break;
|
||||
case EVENT_BLADE_TEMPEST:
|
||||
me->CastSpell(me, SPELL_BLADE_TEMPEST, false);
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000);
|
||||
_events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24s);
|
||||
break;
|
||||
case EVENT_ENERVATING_BRAND:
|
||||
for (uint8 i = 0; i < RAID_MODE<uint8>(4, 10, 4, 10); i++)
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.0f, true, true, -SPELL_ENERVATING_BRAND))
|
||||
me->CastSpell(target, SPELL_ENERVATING_BRAND, true);
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000);
|
||||
_events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -391,14 +391,14 @@ public:
|
||||
me->setActive(true);
|
||||
_isIntro = false;
|
||||
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_0, 6000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_1, 22000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_2, 31000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_3, 38000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_4, 48000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_5, 57000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 67000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 75000);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_0, 6s);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_1, 22s);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_2, 31s);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_3, 38s);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_4, 48s);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_5, 57s);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_6, 67s);
|
||||
_events.ScheduleEvent(EVENT_XERESTRASZA_EVENT_7, 75s);
|
||||
}
|
||||
else if (action == ACTION_INTRO_BALTHARUS && !_introDone && me->IsAlive())
|
||||
{
|
||||
|
||||
+14
-14
@@ -116,11 +116,11 @@ public:
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 9000);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 14000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 18000);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 9s);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 14s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 18s);
|
||||
if (Is25ManRaid())
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 20000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 20s);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
@@ -139,7 +139,7 @@ public:
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,22 +160,22 @@ public:
|
||||
stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false);
|
||||
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ZARITHRIAN_SPAWN_STALKER_2)))
|
||||
stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 40000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS1, 40s);
|
||||
break;
|
||||
case EVENT_SUMMON_ADDS2:
|
||||
if (Creature* stalker1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ZARITHRIAN_SPAWN_STALKER_1)))
|
||||
stalker1->CastSpell(stalker1, SPELL_SUMMON_FLAMECALLER, false);
|
||||
if (Creature* stalker2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ZARITHRIAN_SPAWN_STALKER_2)))
|
||||
stalker2->CastSpell(stalker2, SPELL_SUMMON_FLAMECALLER, false);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 40000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ADDS2, 40s);
|
||||
break;
|
||||
case EVENT_INTIDMDATING_ROAR:
|
||||
me->CastSpell(me, SPELL_INTIMIDATING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 30000);
|
||||
events.ScheduleEvent(EVENT_INTIDMDATING_ROAR, 30s);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE_ARMOR, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 15000);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 15s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -216,8 +216,8 @@ public:
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 5000);
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, 20s, 30s);
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 5s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
@@ -265,18 +265,18 @@ public:
|
||||
{
|
||||
case EVENT_BLAST_NOVA:
|
||||
DoCastAOE(SPELL_BLAST_NOVA);
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, urand(20000, 30000));
|
||||
_events.ScheduleEvent(EVENT_BLAST_NOVA, 20s, 30s);
|
||||
break;
|
||||
case EVENT_LAVA_GOUT:
|
||||
if (_lavaGoutCount >= 3)
|
||||
{
|
||||
_lavaGoutCount = 0;
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 8000);
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 8s);
|
||||
break;
|
||||
}
|
||||
DoCastVictim(SPELL_LAVA_GOUT);
|
||||
_lavaGoutCount++;
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 1500);
|
||||
_events.ScheduleEvent(EVENT_LAVA_GOUT, 1500ms);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -225,7 +225,7 @@ public:
|
||||
me->SetVisible(false);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
_events2.Reset();
|
||||
_events2.RescheduleEvent(EVENT_HALION_VISIBILITY, 30000);
|
||||
_events2.RescheduleEvent(EVENT_HALION_VISIBILITY, 30s);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
@@ -300,14 +300,14 @@ public:
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
|
||||
|
||||
events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
|
||||
events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
|
||||
events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000));
|
||||
events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 5000);
|
||||
events.ScheduleEvent(EVENT_METEOR_STRIKE, urand(20000, 25000));
|
||||
events.ScheduleEvent(EVENT_FIERY_COMBUSTION, urand(15000, 18000));
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
_events2.ScheduleEvent(EVENT_TRIGGER_BERSERK, 8 * MINUTE * IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 8s, 10s);
|
||||
events.ScheduleEvent(EVENT_TAIL_LASH, 10s);
|
||||
events.ScheduleEvent(EVENT_BREATH, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_ACTIVATE_FIREWALL, 5s);
|
||||
events.ScheduleEvent(EVENT_METEOR_STRIKE, 20s, 25s);
|
||||
events.ScheduleEvent(EVENT_FIERY_COMBUSTION, 15s, 18s);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s);
|
||||
_events2.ScheduleEvent(EVENT_TRIGGER_BERSERK, 8min);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
@@ -315,7 +315,7 @@ public:
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -378,15 +378,15 @@ public:
|
||||
{
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 8s, 10s);
|
||||
break;
|
||||
case EVENT_TAIL_LASH:
|
||||
me->CastSpell(me, SPELL_TAIL_LASH, false);
|
||||
events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
|
||||
events.ScheduleEvent(EVENT_TAIL_LASH, 10s);
|
||||
break;
|
||||
case EVENT_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000));
|
||||
events.ScheduleEvent(EVENT_BREATH, 10s, 12s);
|
||||
break;
|
||||
case EVENT_ACTIVATE_FIREWALL:
|
||||
instance->HandleGameObject(instance->GetGuidData(GO_FLAME_RING), false, nullptr);
|
||||
@@ -396,22 +396,22 @@ public:
|
||||
_livingEmberCount = summons.GetEntryCount(NPC_LIVING_EMBER);
|
||||
me->CastCustomSpell(SPELL_METEOR_STRIKE_TARGETING, SPELLVALUE_MAX_TARGETS, 1, me, false);
|
||||
Talk(SAY_METEOR_STRIKE);
|
||||
events.ScheduleEvent(EVENT_METEOR_STRIKE, 40000);
|
||||
events.ScheduleEvent(EVENT_METEOR_STRIKE, 40s);
|
||||
break;
|
||||
case EVENT_FIERY_COMBUSTION:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true, true, -SPELL_TWILIGHT_REALM))
|
||||
me->CastSpell(target, SPELL_FIERY_COMBUSTION, false);
|
||||
events.ScheduleEvent(EVENT_FIERY_COMBUSTION, 25000);
|
||||
events.ScheduleEvent(EVENT_FIERY_COMBUSTION, 25s);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(75))
|
||||
{
|
||||
Talk(SAY_PHASE_TWO);
|
||||
me->CastSpell(me, SPELL_TWILIGHT_PHASING, false);
|
||||
events.DelayEvents(10000);
|
||||
events.DelayEvents(10s);
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -462,13 +462,13 @@ public:
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
|
||||
_events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
|
||||
_events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000));
|
||||
_events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_PULSARS, 16000);
|
||||
_events.ScheduleEvent(EVENT_SEND_ENCOUNTER_UNIT, 2000);
|
||||
_events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 8s, 10s);
|
||||
_events.ScheduleEvent(EVENT_TAIL_LASH, 10s);
|
||||
_events.ScheduleEvent(EVENT_BREATH, 10s, 15s);
|
||||
_events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20s);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_PULSARS, 16s);
|
||||
_events.ScheduleEvent(EVENT_SEND_ENCOUNTER_UNIT, 2s);
|
||||
_events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s);
|
||||
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
@@ -482,7 +482,7 @@ public:
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && _events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
_events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
_events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -531,20 +531,20 @@ public:
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, urand(8000, 10000));
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 8s, 10s);
|
||||
break;
|
||||
case EVENT_TAIL_LASH:
|
||||
me->CastSpell(me, SPELL_TAIL_LASH, false);
|
||||
_events.ScheduleEvent(EVENT_TAIL_LASH, 10000);
|
||||
_events.ScheduleEvent(EVENT_TAIL_LASH, 10s);
|
||||
break;
|
||||
case EVENT_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_DARK_BREATH, false);
|
||||
_events.ScheduleEvent(EVENT_BREATH, urand(10000, 12000));
|
||||
_events.ScheduleEvent(EVENT_BREATH, 10s, 12s);
|
||||
break;
|
||||
case EVENT_SOUL_CONSUMPTION:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true, true, SPELL_TWILIGHT_REALM))
|
||||
me->CastSpell(target, SPELL_SOUL_CONSUMPTION, false);
|
||||
_events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20000);
|
||||
_events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, 20s);
|
||||
break;
|
||||
case EVENT_CHECK_HEALTH:
|
||||
if (me->HealthBelowPct(50))
|
||||
@@ -554,13 +554,13 @@ public:
|
||||
Talk(SAY_PHASE_THREE);
|
||||
return;
|
||||
}
|
||||
_events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
|
||||
_events.ScheduleEvent(EVENT_CHECK_HEALTH, 1s);
|
||||
break;
|
||||
case EVENT_SHADOW_PULSARS:
|
||||
Talk(SAY_SPHERE_PULSE);
|
||||
Talk(EMOTE_WARN_LASER);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_PULSARS, 29000);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_PULSARS_SHOOT, 5000);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_PULSARS, 29s);
|
||||
_events.ScheduleEvent(EVENT_SHADOW_PULSARS_SHOOT, 5s);
|
||||
break;
|
||||
case EVENT_SHADOW_PULSARS_SHOOT:
|
||||
if (Creature* orbCarrier = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_ORB_CARRIER)))
|
||||
@@ -612,13 +612,13 @@ public:
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
if (action == ACTION_INTRO_HALION)
|
||||
_events.ScheduleEvent(EVENT_START_INTRO, 2000);
|
||||
_events.ScheduleEvent(EVENT_START_INTRO, 2s);
|
||||
else if (action == ACTION_CHECK_CORPOREALITY)
|
||||
{
|
||||
_materialDamage = 1;
|
||||
_twilightDamage = 1;
|
||||
_corporeality = 5;
|
||||
_events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 7000);
|
||||
_events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 7s);
|
||||
}
|
||||
else if (action == ACTION_RESET_ENCOUNTER)
|
||||
{
|
||||
@@ -637,23 +637,23 @@ public:
|
||||
// Intro
|
||||
case EVENT_START_INTRO:
|
||||
me->CastSpell(me, SPELL_COSMETIC_FIRE_PILLAR, false);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_1, 5000);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_1, 5s);
|
||||
break;
|
||||
case EVENT_INTRO_PROGRESS_1:
|
||||
_instance->SetBossState(DATA_HALION_INTRO1, NOT_STARTED);
|
||||
_instance->SetBossState(DATA_HALION_INTRO1, DONE);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_2, 5000);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_2, 5s);
|
||||
break;
|
||||
case EVENT_INTRO_PROGRESS_2:
|
||||
_instance->SetBossState(DATA_HALION_INTRO2, NOT_STARTED);
|
||||
_instance->SetBossState(DATA_HALION_INTRO2, DONE);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_3, 4000);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_3, 4s);
|
||||
break;
|
||||
case EVENT_INTRO_PROGRESS_3:
|
||||
_instance->SetBossState(DATA_HALION_INTRO_DONE, NOT_STARTED);
|
||||
_instance->SetBossState(DATA_HALION_INTRO_DONE, DONE);
|
||||
me->CastSpell(me, SPELL_FIERY_EXPLOSION, false);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_4, 500);
|
||||
_events.ScheduleEvent(EVENT_INTRO_PROGRESS_4, 500ms);
|
||||
break;
|
||||
case EVENT_INTRO_PROGRESS_4:
|
||||
if (Creature* halion = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(NPC_HALION)))
|
||||
@@ -668,7 +668,7 @@ public:
|
||||
break;
|
||||
case EVENT_CHECK_CORPOREALITY:
|
||||
UpdateCorporeality();
|
||||
_events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 10000);
|
||||
_events.ScheduleEvent(EVENT_CHECK_CORPOREALITY, 10s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -686,7 +686,7 @@ public:
|
||||
float damageRatio = float(_materialDamage) / float(_twilightDamage);
|
||||
|
||||
if (_twilightDamage == 1 || _materialDamage == 1)
|
||||
_events.ScheduleEvent(EVENT_TWILIGHT_MENDING, 4000);
|
||||
_events.ScheduleEvent(EVENT_TWILIGHT_MENDING, 4s);
|
||||
|
||||
_twilightDamage = 1;
|
||||
_materialDamage = 1;
|
||||
|
||||
+12
-12
@@ -79,9 +79,9 @@ public:
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15000);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, 10000);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 30000);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15s);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, 10s);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 30s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
@@ -99,13 +99,13 @@ public:
|
||||
{
|
||||
case POINT_FLIGHT:
|
||||
me->SetFacingTo(4.69f);
|
||||
events.ScheduleEvent(EVENT_CONFLAGRATION, 1000);
|
||||
events.ScheduleEvent(EVENT_LAND_BACK, 7000);
|
||||
events.ScheduleEvent(EVENT_CONFLAGRATION, 1s);
|
||||
events.ScheduleEvent(EVENT_LAND_BACK, 7s);
|
||||
Talk(SAY_CONFLAGRATION);
|
||||
break;
|
||||
case POINT_LAND:
|
||||
me->SetDisableGravity(false);
|
||||
events.ScheduleEvent(EVENT_LAND_GROUND, 500);
|
||||
events.ScheduleEvent(EVENT_LAND_GROUND, 500ms);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -122,7 +122,7 @@ public:
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,9 +143,9 @@ public:
|
||||
me->AttackStop();
|
||||
me->SetDisableGravity(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_TAKEOFF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 6.0f, false);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 50000);
|
||||
events.DelayEvents(15000);
|
||||
events.ScheduleEvent(EVENT_AIR_MOVEMENT, 2000);
|
||||
events.ScheduleEvent(EVENT_FLIGHT, 50s);
|
||||
events.DelayEvents(15s);
|
||||
events.ScheduleEvent(EVENT_AIR_MOVEMENT, 2s);
|
||||
break;
|
||||
}
|
||||
case EVENT_CONFLAGRATION:
|
||||
@@ -154,11 +154,11 @@ public:
|
||||
case EVENT_ENRAGE:
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
Talk(EMOTE_ENRAGED);
|
||||
events.ScheduleEvent(EVENT_ENRAGE, urand(15000, 20000));
|
||||
events.ScheduleEvent(EVENT_ENRAGE, 15s, 20s);
|
||||
break;
|
||||
case EVENT_FLAME_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_FLAME_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(20000, 30000));
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, 20s, 30s);
|
||||
break;
|
||||
case EVENT_AIR_MOVEMENT:
|
||||
me->GetMotionMaster()->MovePoint(POINT_FLIGHT, 3155.51f, 683.844f, 95.0f, false);
|
||||
|
||||
+35
-35
@@ -183,7 +183,7 @@ public:
|
||||
case EVENT_SPELL_RADIANCE:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_RADIANCE, false);
|
||||
me->TextEmote(TEXT_RADIATE, nullptr, true);
|
||||
events.RepeatEvent(16000);
|
||||
events.Repeat(16s);
|
||||
break;
|
||||
case EVENT_SPELL_HAMMER_RIGHTEOUS:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 55.0f, true) )
|
||||
@@ -195,7 +195,7 @@ public:
|
||||
me->CastSpell(target, SPELL_HAMMER_JUSTICE, true);
|
||||
me->CastSpell(target, SPELL_HAMMER_RIGHTEOUS, false);
|
||||
}
|
||||
events.RepeatEvent(25000);
|
||||
events.Repeat(25s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -261,8 +261,8 @@ public:
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(9000, 12000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SMITE, urand(2000, 3000));
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 9s, 12s);
|
||||
events.ScheduleEvent(EVENT_SPELL_SMITE, 2s, 3s);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
Talk(TEXT_PALETRESS_AGGRO);
|
||||
if( pInstance )
|
||||
@@ -347,7 +347,7 @@ public:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_SUMMON_MEMORY, false);
|
||||
SummonMemory();
|
||||
me->CastSpell((Unit*)nullptr, SPELL_CONFESS, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RENEW, urand(6000, 8000));
|
||||
events.ScheduleEvent(EVENT_SPELL_RENEW, 6s, 8s);
|
||||
summoned = true;
|
||||
return;
|
||||
}
|
||||
@@ -362,12 +362,12 @@ public:
|
||||
case EVENT_SPELL_SMITE:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true) )
|
||||
me->CastSpell(target, SPELL_SMITE, false);
|
||||
events.RepeatEvent(urand(3000, 4000));
|
||||
events.Repeat(3s, 4s);
|
||||
break;
|
||||
case EVENT_SPELL_HOLY_FIRE:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_HOLY_FIRE, false);
|
||||
events.RepeatEvent(urand(9000, 12000));
|
||||
events.Repeat(9s, 12s);
|
||||
break;
|
||||
case EVENT_SPELL_RENEW:
|
||||
if( !MemoryGUID )
|
||||
@@ -379,7 +379,7 @@ public:
|
||||
else if( Creature* memory = ObjectAccessor::GetCreature(*me, MemoryGUID) )
|
||||
if( memory->IsAlive() )
|
||||
me->CastSpell(memory, SPELL_RENEW, false);
|
||||
events.RepeatEvent(urand(15000, 17000));
|
||||
events.Repeat(15s, 17s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -408,7 +408,7 @@ public:
|
||||
me->SetObjectScale(0.01f);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetImmuneToAll(true);
|
||||
events.ScheduleEvent(EVENT_MEMORY_SCALE, 500);
|
||||
events.ScheduleEvent(EVENT_MEMORY_SCALE, 500ms);
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
@@ -439,7 +439,7 @@ public:
|
||||
break;
|
||||
case EVENT_MEMORY_SCALE:
|
||||
me->SetObjectScale(1.0f);
|
||||
events.ScheduleEvent(EVENT_MEMORY_START_ATTACK, 5000);
|
||||
events.ScheduleEvent(EVENT_MEMORY_START_ATTACK, 5s);
|
||||
|
||||
break;
|
||||
case EVENT_MEMORY_START_ATTACK:
|
||||
@@ -451,23 +451,23 @@ public:
|
||||
DoZoneInCombat();
|
||||
}
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.ScheduleEvent(EVENT_SPELL_OLD_WOUNDS, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOWS_PAST, 4000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WAKING_NIGHTMARE, urand(20000, 30000));
|
||||
events.ScheduleEvent(EVENT_SPELL_OLD_WOUNDS, 8s);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOWS_PAST, 4s);
|
||||
events.ScheduleEvent(EVENT_SPELL_WAKING_NIGHTMARE, 20s, 30s);
|
||||
break;
|
||||
case EVENT_SPELL_OLD_WOUNDS:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f, true) )
|
||||
me->CastSpell(target, SPELL_OLD_WOUNDS, true);
|
||||
events.RepeatEvent(12000);
|
||||
events.Repeat(12s);
|
||||
break;
|
||||
case EVENT_SPELL_SHADOWS_PAST:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true) )
|
||||
me->CastSpell(target, SPELL_SHADOWS_PAST, false);
|
||||
events.RepeatEvent(urand(15000, 20000));
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_WAKING_NIGHTMARE:
|
||||
me->CastSpell(me, SPELL_WAKING_NIGHTMARE, false);
|
||||
events.RepeatEvent(35000);
|
||||
events.Repeat(35s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -626,7 +626,7 @@ public:
|
||||
{
|
||||
bCheck = false;
|
||||
damage = me->GetHealth() - 1;
|
||||
events.DelayEvents(10000);
|
||||
events.DelayEvents(10s);
|
||||
me->CastSpell(me, SPELL_DIVINE_SHIELD_H, true);
|
||||
me->CastSpell((Unit*)nullptr, SPELL_FINAL_MEDITATION_H, true);
|
||||
}
|
||||
@@ -637,23 +637,23 @@ public:
|
||||
switch( me->GetEntry() )
|
||||
{
|
||||
case NPC_ARGENT_MONK:
|
||||
events.RescheduleEvent(EVENT_MONK_SPELL_FLURRY_OF_BLOWS, 5000);
|
||||
events.RescheduleEvent(EVENT_MONK_SPELL_PUMMEL, 7000);
|
||||
events.RescheduleEvent(EVENT_MONK_SPELL_FLURRY_OF_BLOWS, 5s);
|
||||
events.RescheduleEvent(EVENT_MONK_SPELL_PUMMEL, 7s);
|
||||
if( IsHeroic() )
|
||||
bCheck = true;
|
||||
break;
|
||||
case NPC_PRIESTESS:
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_HOLY_SMITE, urand(5000, 8000));
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN, urand(3000, 6000));
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT, urand(8000, 15000));
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_HOLY_SMITE, 5s, 8s);
|
||||
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, 12000);
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_MIND_CONTROL_H, 12s);
|
||||
break;
|
||||
case NPC_ARGENT_LIGHTWIELDER:
|
||||
events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT, urand(12000, 15000));
|
||||
events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_CLEAVE, urand(3000, 5000));
|
||||
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, urand(8000, 12000));
|
||||
events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H, 8s, 12s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -677,32 +677,32 @@ public:
|
||||
|
||||
case EVENT_MONK_SPELL_FLURRY_OF_BLOWS:
|
||||
me->CastSpell(me, SPELL_FLURRY_OF_BLOWS, false);
|
||||
events.RepeatEvent(urand(12000, 18000));
|
||||
events.Repeat(12s, 18s);
|
||||
break;
|
||||
case EVENT_MONK_SPELL_PUMMEL:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false);
|
||||
events.RepeatEvent(urand(8000, 11000));
|
||||
events.Repeat(8s, 11s);
|
||||
break;
|
||||
|
||||
case EVENT_PRIESTESS_SPELL_HOLY_SMITE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_HOLY_SMITE, false);
|
||||
events.RepeatEvent(urand(6000, 8000));
|
||||
events.Repeat(6s, 8s);
|
||||
break;
|
||||
case EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_WORD_PAIN, false);
|
||||
events.RepeatEvent(urand(12000, 15000));
|
||||
events.Repeat(12s, 15s);
|
||||
break;
|
||||
case EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_FOUNTAIN_OF_LIGHT, false);
|
||||
events.RepeatEvent(urand(35000, 45000));
|
||||
events.Repeat(35s, 45s);
|
||||
break;
|
||||
case EVENT_PRIESTESS_SPELL_MIND_CONTROL_H:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_MIND_CONTROL_H, false);
|
||||
events.RepeatEvent(urand(22000, 30000));
|
||||
events.Repeat(22s, 30s);
|
||||
break;
|
||||
|
||||
case EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT:
|
||||
@@ -711,18 +711,18 @@ public:
|
||||
if( !target )
|
||||
target = me;
|
||||
me->CastSpell(target, SPELL_BLAZING_LIGHT, false);
|
||||
events.RepeatEvent(urand(8000, 12000));
|
||||
events.Repeat(8s, 12s);
|
||||
}
|
||||
break;
|
||||
case EVENT_LIGHTWIELDER_SPELL_CLEAVE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.RepeatEvent(urand(6000, 8000));
|
||||
events.Repeat(6s, 8s);
|
||||
break;
|
||||
case EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_UNBALANCING_STRIKE_H, false);
|
||||
events.RepeatEvent(urand(12000, 15000));
|
||||
events.Repeat(12s, 15s);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+22
-22
@@ -180,11 +180,11 @@ public:
|
||||
announcer->DespawnOrUnsummon();
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_ANNOUNCER_SAY_ZOMBIE, 2500);
|
||||
events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000, 9000));
|
||||
events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500, 7000));
|
||||
events.ScheduleEvent(EVENT_SPELL_DEATH_RESPITE, urand(13000, 15000));
|
||||
events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000, 19000));
|
||||
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_DEATH_RESPITE, 13s, 15s);
|
||||
events.ScheduleEvent(EVENT_SPELL_OBLITERATE, 11s, 19s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,18 +213,18 @@ public:
|
||||
me->CastSpell(me, SPELL_ARMY_DEAD, false);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000, 9000));
|
||||
events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500, 7000));
|
||||
events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000, 19000));
|
||||
events.ScheduleEvent(EVENT_SPELL_DESECRATION, urand(2000, 3000));
|
||||
events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, 7s, 9s);
|
||||
events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, 3500ms, 7000ms);
|
||||
events.ScheduleEvent(EVENT_SPELL_OBLITERATE, 11s, 19s);
|
||||
events.ScheduleEvent(EVENT_SPELL_DESECRATION, 2s, 3s);
|
||||
break;
|
||||
case 3:
|
||||
me->SetDisplayId(MODEL_GHOST);
|
||||
Talk(TEXT_BK_GHOST_RES);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_DEATH_BITE, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARKED_DEATH, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_DEATH_BITE, 2s);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARKED_DEATH, 1s);
|
||||
break;
|
||||
default:
|
||||
EnterEvadeMode(EVADE_REASON_OTHER);
|
||||
@@ -257,36 +257,36 @@ public:
|
||||
case EVENT_SPELL_PLAGUE_STRIKE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_PLAGUE_STRIKE, false);
|
||||
events.RepeatEvent(urand(10000, 12000));
|
||||
events.Repeat(10s, 12s);
|
||||
break;
|
||||
case EVENT_SPELL_ICY_TOUCH:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_ICY_TOUCH, false);
|
||||
events.RepeatEvent(urand(5000, 6000));
|
||||
events.Repeat(5s, 6s);
|
||||
break;
|
||||
case EVENT_SPELL_DEATH_RESPITE:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true) )
|
||||
me->CastSpell(target, SPELL_DEATH_RESPITE, false);
|
||||
events.RepeatEvent(urand(13000, 15000));
|
||||
events.Repeat(13s, 15s);
|
||||
break;
|
||||
case EVENT_SPELL_OBLITERATE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_OBLITERATE, false);
|
||||
events.RepeatEvent(urand(15000, 17000));
|
||||
events.Repeat(15s, 17s);
|
||||
break;
|
||||
case EVENT_SPELL_DESECRATION:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true) )
|
||||
me->CastSpell(target, SPELL_DESECRATION, false);
|
||||
events.RepeatEvent(urand(14000, 17000));
|
||||
events.Repeat(14s, 17s);
|
||||
break;
|
||||
case EVENT_SPELL_DEATH_BITE:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_DEATH_BITE, false);
|
||||
events.RepeatEvent(urand(2000, 4000));
|
||||
events.Repeat(2s, 4s);
|
||||
break;
|
||||
case EVENT_SPELL_MARKED_DEATH:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.000000f, true) )
|
||||
me->CastSpell(target, SPELL_MARKED_DEATH, false);
|
||||
events.RepeatEvent(9000);
|
||||
events.Repeat(9s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -410,8 +410,8 @@ public:
|
||||
{
|
||||
events.Reset();
|
||||
if (me->GetEntry() == NPC_RISEN_JAEREN || me->GetEntry() == NPC_RISEN_ARELAS)
|
||||
events.RescheduleEvent(1, 1000); // leap
|
||||
events.RescheduleEvent(2, urand(3000, 4000)); // claw
|
||||
events.RescheduleEvent(1, 1s); // leap
|
||||
events.RescheduleEvent(2, 3s, 4s); // claw
|
||||
}
|
||||
|
||||
void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
|
||||
@@ -466,12 +466,12 @@ public:
|
||||
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(1000);
|
||||
events.Repeat(1s);
|
||||
break;
|
||||
case 2: // claw
|
||||
if (Unit* target = me->GetVictim())
|
||||
me->CastSpell(target, SPELL_CLAW_N, false);
|
||||
events.RepeatEvent(urand(6000, 8000));
|
||||
events.Repeat(6s, 8s);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+53
-55
@@ -246,9 +246,9 @@ public:
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500, 4000));
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000, 8000));
|
||||
events.ScheduleEvent(EVENT_THRUST, urand(3000, 5000));
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4000ms);
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, 5s, 8s);
|
||||
events.ScheduleEvent(EVENT_THRUST, 3s, 5s);
|
||||
me->CastSpell(me, SPELL_TRAMPLE_AURA, true);
|
||||
}
|
||||
|
||||
@@ -302,7 +302,7 @@ public:
|
||||
me->CastSpell(target, SPELL_MINIONS_CHARGE, false);
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(urand(4500, 6000));
|
||||
events.Repeat(4500ms, 6000ms);
|
||||
}
|
||||
break;
|
||||
case EVENT_SHIELD_BREAKER:
|
||||
@@ -324,13 +324,13 @@ public:
|
||||
if( Unit* target = ObjectAccessor::GetCreature(*me, LIST.at(rnd)) )
|
||||
me->CastSpell(target, SPELL_NPC_SHIELD_BREAKER, false);
|
||||
}
|
||||
events.RepeatEvent(urand(6000, 8000));
|
||||
events.Repeat(6s, 8s);
|
||||
}
|
||||
break;
|
||||
case EVENT_THRUST:
|
||||
if( me->GetVictim() && me->GetExactDist(me->GetVictim()) <= 5.5f )
|
||||
me->CastSpell(me->GetVictim(), SPELL_PLAYER_VEHICLE_THRUST, false);
|
||||
events.RepeatEvent(urand(3000, 5000));
|
||||
events.Repeat(3s, 5s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -363,9 +363,9 @@ public:
|
||||
me->CastSpell(me, SPELL_BOSS_DEFEND_PERIODIC, true);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500, 4000));
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000, 8000));
|
||||
events.ScheduleEvent(EVENT_THRUST, urand(3000, 5000));
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4000ms);
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, 5s, 8s);
|
||||
events.ScheduleEvent(EVENT_THRUST, 3s, 5s);
|
||||
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, true);
|
||||
@@ -421,36 +421,34 @@ public:
|
||||
{
|
||||
case NPC_AMBROSE: // Ambrose Boltspark
|
||||
case NPC_ERESSEA: // Eressea Dawnsinger
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_FIREBALL, 5000);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_BLAST_WAVE, 12000);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_HASTE, 22000);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_POLYMORPH, 8000);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_FIREBALL, 5s);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_BLAST_WAVE, 12s);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_HASTE, 22s);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_POLYMORPH, 8s);
|
||||
break;
|
||||
case NPC_COLOSOS: // Colosos
|
||||
case NPC_RUNOK: // Runok Wildmane
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_CHAIN_LIGHTNING, 16000);
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_EARTH_SHIELD, urand(30000, 35000));
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEALING_WAVE, 12000);
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEX_OF_MENDING, urand(20000, 25000));
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_CHAIN_LIGHTNING, 16s);
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_EARTH_SHIELD, 30s, 35s);
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEALING_WAVE, 12s);
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEX_OF_MENDING, 20s, 25s);
|
||||
break;
|
||||
case NPC_JAELYNE: // Jaelyne Evensong
|
||||
case NPC_ZULTORE: // Zul'tore
|
||||
//events.RescheduleEvent(EVENT_HUNTER_SPELL_DISENGAGE, x);
|
||||
events.RescheduleEvent(EVENT_HUNTER_SPELL_LIGHTNING_ARROWS, 7000);
|
||||
events.RescheduleEvent(EVENT_HUNTER_SPELL_MULTI_SHOT, 12000);
|
||||
events.RescheduleEvent(EVENT_HUNTER_SPELL_LIGHTNING_ARROWS, 7s);
|
||||
events.RescheduleEvent(EVENT_HUNTER_SPELL_MULTI_SHOT, 12s);
|
||||
break;
|
||||
case NPC_LANA: // Lana Stouthammer
|
||||
case NPC_VISCERI: // Deathstalker Visceri
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_EVISCERATE, 8000);
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_FAN_OF_KNIVES, 14000);
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_POISON_BOTTLE, 19000);
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_EVISCERATE, 8s);
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_FAN_OF_KNIVES, 14s);
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_POISON_BOTTLE, 19s);
|
||||
break;
|
||||
case NPC_JACOB: // Marshal Jacob Alerius
|
||||
case NPC_MOKRA: // Mokra the Skullcrusher
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_MORTAL_STRIKE, urand(8000, 12000));
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_BLADESTORM, urand(15000, 20000));
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_INTERCEPT, 7000);
|
||||
//events.RescheduleEvent(EVENT_WARRIOR_SPELL_ROLLING_THROW, x);
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_MORTAL_STRIKE, 8s, 12s);
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_BLADESTORM, 15s, 20s);
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_INTERCEPT, 7s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -568,7 +566,7 @@ public:
|
||||
{
|
||||
NewMountGUID = mount->GetGUID();
|
||||
me->GetMotionMaster()->MovePoint(7, *mount);
|
||||
events.RescheduleEvent(EVENT_FIND_NEW_MOUNT, 1000);
|
||||
events.RescheduleEvent(EVENT_FIND_NEW_MOUNT, 1s);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -627,9 +625,9 @@ public:
|
||||
me->CastSpell(me, SPELL_BOSS_DEFEND_PERIODIC, true);
|
||||
me->SetRegeneratingHealth(true);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500, 4000));
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000, 8000));
|
||||
events.ScheduleEvent(EVENT_THRUST, urand(3000, 5000));
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, 2500ms, 4000ms);
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, 5s, 8s);
|
||||
events.ScheduleEvent(EVENT_THRUST, 3s, 5s);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetImmuneToAll(false);
|
||||
@@ -681,7 +679,7 @@ public:
|
||||
{
|
||||
if( me->HasAura(SPELL_TRAMPLE_STUN) )
|
||||
{
|
||||
events.RepeatEvent(200);
|
||||
events.Repeat(200ms);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -707,7 +705,7 @@ public:
|
||||
|
||||
if( trample )
|
||||
{
|
||||
events.RepeatEvent(15100);
|
||||
events.Repeat(15s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -717,7 +715,7 @@ public:
|
||||
{
|
||||
if( me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE )
|
||||
me->GetMotionMaster()->MovePoint(7, *mount);
|
||||
events.RepeatEvent(200);
|
||||
events.Repeat(200ms);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -728,7 +726,7 @@ public:
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetImmuneToAll(true);
|
||||
me->GetMotionMaster()->MovePoint(7, *mount);
|
||||
events.RepeatEvent(200);
|
||||
events.Repeat(200ms);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -761,7 +759,7 @@ public:
|
||||
me->CastSpell(target, SPELL_MINIONS_CHARGE, false);
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(urand(4500, 6000));
|
||||
events.Repeat(4500ms, 6000ms);
|
||||
}
|
||||
break;
|
||||
case EVENT_SHIELD_BREAKER:
|
||||
@@ -783,34 +781,34 @@ public:
|
||||
if( Unit* target = ObjectAccessor::GetCreature(*me, LIST.at(rnd)) )
|
||||
me->CastSpell(target, SPELL_NPC_SHIELD_BREAKER, false);
|
||||
}
|
||||
events.RepeatEvent(urand(6000, 8000));
|
||||
events.Repeat(6s, 8s);
|
||||
}
|
||||
break;
|
||||
case EVENT_THRUST:
|
||||
if( Unit* victim = me->GetVictim() )
|
||||
if( me->GetExactDist(victim) <= 6.0f )
|
||||
me->CastSpell(victim, SPELL_PLAYER_VEHICLE_THRUST, false);
|
||||
events.RepeatEvent(urand(3000, 5000));
|
||||
events.Repeat(3s, 5s);
|
||||
break;
|
||||
|
||||
/******************* MAGE *******************/
|
||||
case EVEMT_MAGE_SPELL_FIREBALL:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false);
|
||||
events.RepeatEvent(5000);
|
||||
events.Repeat(5s);
|
||||
break;
|
||||
case EVEMT_MAGE_SPELL_BLAST_WAVE:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_BLAST_WAVE, false);
|
||||
events.RepeatEvent(13000);
|
||||
events.Repeat(13s);
|
||||
break;
|
||||
case EVEMT_MAGE_SPELL_HASTE:
|
||||
me->CastSpell(me, SPELL_HASTE, false);
|
||||
events.RepeatEvent(22000);
|
||||
events.Repeat(22s);
|
||||
break;
|
||||
case EVEMT_MAGE_SPELL_POLYMORPH:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_POLYMORPH, false);
|
||||
events.RepeatEvent(8000);
|
||||
events.Repeat(8s);
|
||||
break;
|
||||
/***************** MAGE END *****************/
|
||||
|
||||
@@ -818,11 +816,11 @@ public:
|
||||
case EVENT_SHAMAN_SPELL_CHAIN_LIGHTNING:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false);
|
||||
events.RepeatEvent(16000);
|
||||
events.Repeat(16s);
|
||||
break;
|
||||
case EVENT_SHAMAN_SPELL_EARTH_SHIELD:
|
||||
me->CastSpell(me, SPELL_EARTH_SHIELD, false);
|
||||
events.RepeatEvent(urand(30000, 35000));
|
||||
events.Repeat(30s, 35s);
|
||||
break;
|
||||
case EVENT_SHAMAN_SPELL_HEALING_WAVE:
|
||||
{
|
||||
@@ -836,13 +834,13 @@ public:
|
||||
else
|
||||
target = me;
|
||||
me->CastSpell(target, SPELL_HEALING_WAVE, false);
|
||||
events.RepeatEvent(22000);
|
||||
events.Repeat(22s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SHAMAN_SPELL_HEX_OF_MENDING:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_HEX_OF_MENDING, false);
|
||||
events.RepeatEvent(urand(20000, 25000));
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
/**************** SHAMAN END ****************/
|
||||
|
||||
@@ -852,7 +850,7 @@ public:
|
||||
break;
|
||||
case EVENT_HUNTER_SPELL_LIGHTNING_ARROWS:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_LIGHTNING_ARROWS, false);
|
||||
events.RepeatEvent(urand(20000, 25000));
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_HUNTER_SPELL_MULTI_SHOT:
|
||||
{
|
||||
@@ -863,7 +861,7 @@ public:
|
||||
me->CastSpell(target, SPELL_SHOOT, false);
|
||||
UnitTargetGUID = target->GetGUID();
|
||||
}
|
||||
events.RepeatEvent(2000);
|
||||
events.Repeat(2s);
|
||||
break;
|
||||
}
|
||||
else
|
||||
@@ -886,7 +884,7 @@ public:
|
||||
}
|
||||
UnitTargetGUID.Clear();
|
||||
}
|
||||
events.RepeatEvent(urand(15000, 20000));
|
||||
events.Repeat(15s, 20s);
|
||||
}
|
||||
break;
|
||||
/**************** HUNTER END ****************/
|
||||
@@ -895,16 +893,16 @@ public:
|
||||
case EVENT_ROGUE_SPELL_EVISCERATE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_EVISCERATE, false);
|
||||
events.RepeatEvent(8000);
|
||||
events.Repeat(8s);
|
||||
break;
|
||||
case EVENT_ROGUE_SPELL_FAN_OF_KNIVES:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_FAN_OF_KNIVES, false);
|
||||
events.RepeatEvent(14000);
|
||||
events.Repeat(14s);
|
||||
break;
|
||||
case EVENT_ROGUE_SPELL_POISON_BOTTLE:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_POISON_BOTTLE, false);
|
||||
events.RepeatEvent(19000);
|
||||
events.Repeat(19s);
|
||||
break;
|
||||
/**************** ROGUE END *****************/
|
||||
|
||||
@@ -912,12 +910,12 @@ public:
|
||||
case EVENT_WARRIOR_SPELL_MORTAL_STRIKE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
|
||||
events.RepeatEvent(urand(8000, 12000));
|
||||
events.Repeat(8s, 12s);
|
||||
break;
|
||||
case EVENT_WARRIOR_SPELL_BLADESTORM:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_BLADESTORM, false);
|
||||
events.RepeatEvent(urand(15000, 20000));
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_WARRIOR_SPELL_INTERCEPT:
|
||||
{
|
||||
@@ -933,7 +931,7 @@ public:
|
||||
break;
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(7000);
|
||||
events.Repeat(7s);
|
||||
}
|
||||
break;
|
||||
case EVENT_WARRIOR_SPELL_ROLLING_THROW:
|
||||
|
||||
+39
-39
@@ -224,7 +224,7 @@ public:
|
||||
{
|
||||
CLEANED = false;
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0);
|
||||
events.RescheduleEvent(EVENT_CHECK_PLAYERS, 0ms);
|
||||
|
||||
if( !in )
|
||||
{
|
||||
@@ -492,7 +492,7 @@ public:
|
||||
if( Creature* tirion = instance->GetCreature(NPC_TirionGUID) )
|
||||
tirion->AI()->Talk(TEXT_WELCOME);
|
||||
}
|
||||
events.RescheduleEvent(EVENT_YELL_WELCOME_2, 8000);
|
||||
events.RescheduleEvent(EVENT_YELL_WELCOME_2, 8s);
|
||||
}
|
||||
else // short version
|
||||
{
|
||||
@@ -515,7 +515,7 @@ public:
|
||||
announcer->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
|
||||
announcer->GetMotionMaster()->MovePoint(1, 735.81f, 661.92f, 412.39f);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_1_MOVE_MIDDLE, 10000);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_1_MOVE_MIDDLE, 10s);
|
||||
}
|
||||
break;
|
||||
case INSTANCE_PROGRESS_CHAMPIONS_DEAD:
|
||||
@@ -528,12 +528,12 @@ public:
|
||||
announcer->AI()->Talk(TEXT_INTRODUCE_PALETRESS);
|
||||
}
|
||||
HandleGameObject(GO_EnterGateGUID, false);
|
||||
events.RescheduleEvent(EVENT_START_ARGENT_CHALLENGE_INTRO, 0);
|
||||
events.RescheduleEvent(EVENT_START_ARGENT_CHALLENGE_INTRO, 0ms);
|
||||
break;
|
||||
case INSTANCE_PROGRESS_ARGENT_CHALLENGE_DIED:
|
||||
if( Creature* tirion = instance->GetCreature(NPC_TirionGUID) )
|
||||
tirion->AI()->Talk(TEXT_BK_INTRO);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BLACK_KNIGHT, 3000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BLACK_KNIGHT, 3s);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -543,10 +543,10 @@ public:
|
||||
switch( uiData )
|
||||
{
|
||||
case 0:
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAND_CHAMPION_2, 0);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAND_CHAMPION_2, 0ms);
|
||||
break;
|
||||
case 1:
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAND_CHAMPION_3, 0);
|
||||
events.ScheduleEvent(EVENT_SUMMON_GRAND_CHAMPION_3, 0ms);
|
||||
break;
|
||||
case 2:
|
||||
if( Creature* announcer = instance->GetCreature(NPC_AnnouncerGUID) )
|
||||
@@ -555,7 +555,7 @@ public:
|
||||
uiData = DONE; // save to db
|
||||
announcer->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
|
||||
announcer->GetMotionMaster()->MovePoint(1, 735.81f, 661.92f, 412.39f);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_1_MOVE_MIDDLE, 8500);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_1_MOVE_MIDDLE, 8500ms);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -569,7 +569,7 @@ public:
|
||||
Counter = 0;
|
||||
InstanceProgress = INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_1;
|
||||
uiData = DONE; // save to db
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_2_MOVE_MIDDLE, 0);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_2_MOVE_MIDDLE, 0ms);
|
||||
}
|
||||
break;
|
||||
case INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_1: // fighting group 2/3
|
||||
@@ -578,7 +578,7 @@ public:
|
||||
Counter = 0;
|
||||
InstanceProgress = INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_2;
|
||||
uiData = DONE; // save to db
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_3_MOVE_MIDDLE, 0);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_3_MOVE_MIDDLE, 0ms);
|
||||
}
|
||||
break;
|
||||
case INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_2: // fighting group 3/3
|
||||
@@ -587,7 +587,7 @@ public:
|
||||
Counter = 0;
|
||||
InstanceProgress = INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_3;
|
||||
uiData = DONE; // save to db
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_MOVE_MIDDLE, 0);
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_MOVE_MIDDLE, 0ms);
|
||||
}
|
||||
break;
|
||||
case INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_3: // fighting grand champions (on vehicles)
|
||||
@@ -598,7 +598,7 @@ public:
|
||||
for (ObjectGuid const& guid : VehicleList)
|
||||
if (Creature* veh = instance->GetCreature(guid))
|
||||
veh->DespawnOrUnsummon();
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_MOVE_SIDE, 0);
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_MOVE_SIDE, 0ms);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -629,8 +629,8 @@ public:
|
||||
{
|
||||
announcer->GetMotionMaster()->MovePoint(0, 743.14f, 628.77f, 411.2f);
|
||||
announcer->SummonGameObject(instance->IsHeroic() ? GO_CHAMPIONS_LOOT_H : GO_CHAMPIONS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000); // [LOOT]
|
||||
events.ScheduleEvent(EVENT_RESTORE_ANNOUNCER_GOSSIP, 15000);
|
||||
events.ScheduleEvent(EVENT_GRATZ_SLAIN_CHAMPIONS, 6000);
|
||||
events.ScheduleEvent(EVENT_RESTORE_ANNOUNCER_GOSSIP, 15s);
|
||||
events.ScheduleEvent(EVENT_GRATZ_SLAIN_CHAMPIONS, 6s);
|
||||
}
|
||||
|
||||
// bind players to instance
|
||||
@@ -644,7 +644,7 @@ public:
|
||||
Counter = 0;
|
||||
InstanceProgress = INSTANCE_PROGRESS_ARGENT_SOLDIERS_DIED;
|
||||
uiData = DONE; // save to db
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_MOVE_FORWARD, 0);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_MOVE_FORWARD, 0ms);
|
||||
}
|
||||
break;
|
||||
case BOSS_ARGENT_CHALLENGE:
|
||||
@@ -654,7 +654,7 @@ public:
|
||||
{
|
||||
HandleGameObject(GO_EnterGateGUID, true);
|
||||
InstanceProgress = INSTANCE_PROGRESS_ARGENT_CHALLENGE_DIED;
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_RUN_MIDDLE, 0);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_RUN_MIDDLE, 0ms);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -663,7 +663,7 @@ public:
|
||||
break;
|
||||
case DATA_SKELETAL_GRYPHON_LANDED:
|
||||
{
|
||||
events.ScheduleEvent(EVENT_START_BLACK_KNIGHT_SCENE, 3000);
|
||||
events.ScheduleEvent(EVENT_START_BLACK_KNIGHT_SCENE, 3s);
|
||||
}
|
||||
break;
|
||||
case BOSS_BLACK_KNIGHT:
|
||||
@@ -795,7 +795,7 @@ public:
|
||||
temp1 = urand(0, 4);
|
||||
DoSummonGrandChampion(temp1, 0);
|
||||
HandleGameObject(GO_MainGateGUID, true);
|
||||
events.ScheduleEvent(EVENT_CLOSE_GATE, 6000);
|
||||
events.ScheduleEvent(EVENT_CLOSE_GATE, 6s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_GRAND_CHAMPION_2:
|
||||
@@ -804,7 +804,7 @@ public:
|
||||
while( temp1 == temp2 );
|
||||
DoSummonGrandChampion(temp2, 1);
|
||||
HandleGameObject(GO_MainGateGUID, true);
|
||||
events.ScheduleEvent(EVENT_CLOSE_GATE, 6000);
|
||||
events.ScheduleEvent(EVENT_CLOSE_GATE, 6s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_GRAND_CHAMPION_3:
|
||||
@@ -829,7 +829,7 @@ public:
|
||||
tirion->AI()->Talk(TEXT_WELCOME_2);
|
||||
}
|
||||
|
||||
events.RescheduleEvent(EVENT_SUMMON_GRAND_CHAMPION_1, 8000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_GRAND_CHAMPION_1, 8s);
|
||||
break;
|
||||
}
|
||||
case EVENT_GRAND_GROUP_1_MOVE_MIDDLE:
|
||||
@@ -848,7 +848,7 @@ public:
|
||||
c->GetMotionMaster()->MovePoint(0, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * std::sin(angle), 411.3f);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_1_ATTACK, 3000);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_1_ATTACK, 3s);
|
||||
}
|
||||
break;
|
||||
case EVENT_GRAND_GROUP_1_ATTACK:
|
||||
@@ -875,7 +875,7 @@ public:
|
||||
c->GetMotionMaster()->MovePoint(0, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * std::sin(angle), 411.3f);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_2_ATTACK, 3000);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_2_ATTACK, 3s);
|
||||
}
|
||||
break;
|
||||
case EVENT_GRAND_GROUP_2_ATTACK:
|
||||
@@ -901,7 +901,7 @@ public:
|
||||
c->GetMotionMaster()->MovePoint(0, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * std::sin(angle), 411.3f);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_3_ATTACK, 3000);
|
||||
events.ScheduleEvent(EVENT_GRAND_GROUP_3_ATTACK, 3s);
|
||||
}
|
||||
break;
|
||||
case EVENT_GRAND_GROUP_3_ATTACK:
|
||||
@@ -927,7 +927,7 @@ public:
|
||||
c->GetMotionMaster()->MovePoint(4, 748.309f + 3.0f * cos(angle), 619.448f + 3.0f * std::sin(angle), 411.3f);
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_MOUNTS_ATTACK, 3000);
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_MOUNTS_ATTACK, 3s);
|
||||
}
|
||||
break;
|
||||
case EVENT_GRAND_CHAMPIONS_MOUNTS_ATTACK:
|
||||
@@ -965,7 +965,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_ATTACK, 15000);
|
||||
events.ScheduleEvent(EVENT_GRAND_CHAMPIONS_ATTACK, 15s);
|
||||
}
|
||||
break;
|
||||
case EVENT_GRAND_CHAMPIONS_ATTACK:
|
||||
@@ -1043,7 +1043,7 @@ public:
|
||||
NPC_ArgentSoldierGUID[i][2] = pTrash->GetGUID();
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SUMMON_ARGENT_CHALLENGE, 4000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ARGENT_CHALLENGE, 4s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_ARGENT_CHALLENGE:
|
||||
@@ -1052,9 +1052,9 @@ public:
|
||||
announcer->GetMotionMaster()->MovePoint(0, 735.81f, 661.92f, 412.39f);
|
||||
if (Creature* boss = instance->SummonCreature(Counter ? NPC_EADRIC : NPC_PALETRESS, SpawnPosition))
|
||||
boss->GetMotionMaster()->MovePoint(0, 746.881f, 660.263f, 411.7f);
|
||||
events.ScheduleEvent(EVENT_CLOSE_GATE, 5000);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_SAY_1, 4000);
|
||||
events.ScheduleEvent(EVENT_ARGENT_SOLDIER_GROUP_ATTACK, 12500);
|
||||
events.ScheduleEvent(EVENT_CLOSE_GATE, 5s);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_SAY_1, 4s);
|
||||
events.ScheduleEvent(EVENT_ARGENT_SOLDIER_GROUP_ATTACK, 12s + 500ms);
|
||||
}
|
||||
break;
|
||||
case EVENT_ARGENT_CHALLENGE_SAY_1:
|
||||
@@ -1062,7 +1062,7 @@ public:
|
||||
if( Creature* ac = instance->GetCreature(NPC_ArgentChampionGUID) )
|
||||
ac->AI()->Talk(Counter ? TEXT_EADRIC_SAY_1 : TEXT_PALETRESS_SAY_1);
|
||||
if( !Counter )
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_SAY_2, 6000);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_SAY_2, 6s);
|
||||
}
|
||||
break;
|
||||
case EVENT_ARGENT_CHALLENGE_SAY_2:
|
||||
@@ -1093,7 +1093,7 @@ public:
|
||||
{
|
||||
boss->GetMotionMaster()->MovePoint(0, 746.881f, 635.263f, 411.7f);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_ATTACK, 3000);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_ATTACK, 3s);
|
||||
}
|
||||
break;
|
||||
case EVENT_ARGENT_CHALLENGE_ATTACK:
|
||||
@@ -1114,7 +1114,7 @@ public:
|
||||
if( Creature* boss = instance->GetCreature(NPC_ArgentChampionGUID) )
|
||||
{
|
||||
boss->GetMotionMaster()->MovePoint(1, 747.13f, 628.037f, 411.2f);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_LEAVE_CHEST, 6000);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_LEAVE_CHEST, 6s);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1132,8 +1132,8 @@ public:
|
||||
announcer->SummonGameObject(chest, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000); // [LOOT]
|
||||
}
|
||||
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_DISAPPEAR, 4000);
|
||||
events.ScheduleEvent(EVENT_RESTORE_ANNOUNCER_GOSSIP, 15000);
|
||||
events.ScheduleEvent(EVENT_ARGENT_CHALLENGE_DISAPPEAR, 4s);
|
||||
events.ScheduleEvent(EVENT_RESTORE_ANNOUNCER_GOSSIP, 15s);
|
||||
}
|
||||
break;
|
||||
case EVENT_ARGENT_CHALLENGE_DISAPPEAR:
|
||||
@@ -1176,7 +1176,7 @@ public:
|
||||
bk->GetMotionMaster()->MoveJump(exitPos, 2.0f, 2.0f);
|
||||
bk->AI()->Talk(TEXT_BK_SPOILED);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_CAST_ANNOUNCER, 2000);
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_CAST_ANNOUNCER, 2s);
|
||||
}
|
||||
break;
|
||||
case EVENT_BLACK_KNIGHT_CAST_ANNOUNCER:
|
||||
@@ -1195,7 +1195,7 @@ public:
|
||||
tirion->AI()->Talk(TEXT_BK_MEANING);
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_KILL_ANNOUNCER, 1000);
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_KILL_ANNOUNCER, 1s);
|
||||
}
|
||||
break;
|
||||
case EVENT_BLACK_KNIGHT_KILL_ANNOUNCER:
|
||||
@@ -1203,7 +1203,7 @@ public:
|
||||
if( Creature* bk_vehicle = instance->GetCreature(NPC_BlackKnightVehicleGUID) )
|
||||
bk_vehicle->AI()->DoAction(1);
|
||||
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_MOVE_FORWARD, 4000);
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_MOVE_FORWARD, 4s);
|
||||
}
|
||||
break;
|
||||
case EVENT_BLACK_KNIGHT_MOVE_FORWARD:
|
||||
@@ -1217,7 +1217,7 @@ public:
|
||||
if( Creature* announcer = instance->GetCreature(NPC_AnnouncerGUID) )
|
||||
if (announcer->IsAlive())
|
||||
Unit::Kill(announcer, announcer);
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_SAY_TASK, 14000);
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_SAY_TASK, 14s);
|
||||
}
|
||||
break;
|
||||
case EVENT_BLACK_KNIGHT_SAY_TASK:
|
||||
@@ -1227,7 +1227,7 @@ public:
|
||||
bk->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
bk->AI()->Talk(TEXT_BK_TASK);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_ATTACK, 5000);
|
||||
events.ScheduleEvent(EVENT_BLACK_KNIGHT_ATTACK, 5s);
|
||||
}
|
||||
break;
|
||||
case EVENT_BLACK_KNIGHT_ATTACK:
|
||||
|
||||
+29
-32
@@ -140,9 +140,6 @@ enum AnubEvents
|
||||
EVENT_SUMMON_SCARAB,
|
||||
};
|
||||
|
||||
#define SUBMERGE_INTERVAL 80000
|
||||
#define EMERGE_INTERVAL 60000
|
||||
|
||||
class boss_anubarak_trial : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -205,13 +202,13 @@ public:
|
||||
{
|
||||
me->setActive(true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_ENRAGE, 600000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000, 20000));
|
||||
events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000, 8000));
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL);
|
||||
events.RescheduleEvent(EVENT_ENRAGE, 10min);
|
||||
events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, 7s, 15s);
|
||||
events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, 15s, 20s);
|
||||
events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, 5s, 8s);
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 80s);
|
||||
if( !IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_RESPAWN_SPHERE, 4000);
|
||||
events.RescheduleEvent(EVENT_RESPAWN_SPHERE, 4s);
|
||||
|
||||
for (ObjectGuid const& guid : summons)
|
||||
if (pInstance)
|
||||
@@ -289,26 +286,26 @@ public:
|
||||
}
|
||||
i = (i + 1) % 6;
|
||||
} while( i != StartAt );
|
||||
events.RepeatEvent(4000);
|
||||
events.Repeat(4s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_FREEZING_SLASH:
|
||||
{
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_FREEZING_SLASH, false);
|
||||
events.RepeatEvent(urand(15000, 20000));
|
||||
events.Repeat(15s, 20s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_PENETRATING_COLD:
|
||||
{
|
||||
me->CastCustomSpell(SPELL_PENETRATING_COLD, SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5, 2, 5));
|
||||
events.RepeatEvent(18000);
|
||||
events.Repeat(18s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_NERUBIAN:
|
||||
{
|
||||
me->CastCustomSpell(SPELL_SUMMON_BURROWER, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 2, 2, 4));
|
||||
events.RepeatEvent(45000);
|
||||
events.Repeat(45s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUBMERGE:
|
||||
@@ -324,9 +321,9 @@ public:
|
||||
events.CancelEvent(EVENT_SUMMON_NERUBIAN);
|
||||
events.CancelEvent(EVENT_SPELL_FREEZING_SLASH);
|
||||
events.CancelEvent(EVENT_SPELL_PENETRATING_COLD);
|
||||
events.RescheduleEvent(EVENT_EMERGE, EMERGE_INTERVAL);
|
||||
events.RescheduleEvent(EVENT_SPELL_SUMMON_SPIKE, 2500);
|
||||
events.RescheduleEvent(EVENT_SUMMON_SCARAB, 3000);
|
||||
events.RescheduleEvent(EVENT_EMERGE, 1min);
|
||||
events.RescheduleEvent(EVENT_SPELL_SUMMON_SPIKE, 2500ms);
|
||||
events.RescheduleEvent(EVENT_SUMMON_SCARAB, 3s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_SCARAB:
|
||||
@@ -334,7 +331,7 @@ public:
|
||||
uint8 i = urand(0, 3);
|
||||
if( Creature* c = ObjectAccessor::GetCreature(*me, BurrowGUID[i]) )
|
||||
me->CastSpell(c, SPELL_SUMMON_SCARAB, true);
|
||||
events.RepeatEvent(4000);
|
||||
events.Repeat(4s);
|
||||
}
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
@@ -342,7 +339,7 @@ public:
|
||||
me->CastSpell(me, SPELL_SPIKE_TELE, true);
|
||||
summons.DespawnEntry(NPC_SPIKE);
|
||||
events.CancelEvent(EVENT_SUMMON_SCARAB);
|
||||
events.RescheduleEvent(EVENT_EMERGE_2, 2000);
|
||||
events.RescheduleEvent(EVENT_EMERGE_2, 2s);
|
||||
}
|
||||
break;
|
||||
case EVENT_EMERGE_2:
|
||||
@@ -352,10 +349,10 @@ public:
|
||||
me->setAttackTimer(BASE_ATTACK, 3000);
|
||||
me->RemoveAura(SPELL_SUBMERGE);
|
||||
me->CastSpell(me, SPELL_EMERGE, false);
|
||||
events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000, 8000));
|
||||
events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000, 20000));
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL);
|
||||
events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, 5s, 8s);
|
||||
events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, 7s, 15s);
|
||||
events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, 15s, 20s);
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 80s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_SPIKE:
|
||||
@@ -630,9 +627,9 @@ public:
|
||||
me->CastSpell(me, SPELL_EXPOSE_WEAKNESS, true);
|
||||
me->CastSpell(me, SPELL_SPIDER_FRENZY, true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 30000);
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 30s);
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_STRIKE, urand(30000, 45000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_STRIKE, 30s, 45s);
|
||||
if( Unit* target = me->SelectNearestTarget(250.0f) )
|
||||
{
|
||||
AttackStart(target);
|
||||
@@ -676,7 +673,7 @@ public:
|
||||
case EVENT_SPELL_SHADOW_STRIKE:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 250.0f, true) )
|
||||
me->CastSpell(target, SPELL_SHADOW_STRIKE, false);
|
||||
events.RepeatEvent(urand(30000, 45000));
|
||||
events.Repeat(30s, 45s);
|
||||
break;
|
||||
case EVENT_SUBMERGE:
|
||||
if( HealthBelowPct(80) && !me->HasAura(RAID_MODE(66193, 67855, 67856, 67857)) ) // not having permafrost - allow submerge
|
||||
@@ -688,11 +685,11 @@ public:
|
||||
me->CastSpell(me, SPELL_SPIDER_FRENZY, true);
|
||||
me->CastSpell(me, SPELL_SUBMERGE, false);
|
||||
|
||||
events.DelayEvents(15000);
|
||||
events.RescheduleEvent(EVENT_EMERGE, 10000);
|
||||
events.DelayEvents(15s);
|
||||
events.RescheduleEvent(EVENT_EMERGE, 10s);
|
||||
}
|
||||
else
|
||||
events.RepeatEvent(3000);
|
||||
events.Repeat(3s);
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
me->SetHealth(me->GetMaxHealth());
|
||||
@@ -701,7 +698,7 @@ public:
|
||||
me->CastSpell(me, SPELL_EMERGE, false);
|
||||
me->RemoveAura(SPELL_SUBMERGE);
|
||||
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 30000);
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 30s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -751,7 +748,7 @@ public:
|
||||
me->RemoveAllAuras();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
events.Reset();
|
||||
events.RescheduleEvent(3, 4000);
|
||||
events.RescheduleEvent(3, 4s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -774,7 +771,7 @@ public:
|
||||
{
|
||||
me->CastSpell(me, SPELL_SPIKE_SPEED1, true);
|
||||
me->CastSpell(me, SPELL_SPIKE_TRAIL, true);
|
||||
events.RescheduleEvent(1, 7000);
|
||||
events.RescheduleEvent(1, 7s);
|
||||
}
|
||||
TargetGUID = target->GetGUID();
|
||||
me->CastSpell(target, SPELL_MARK, true);
|
||||
@@ -810,7 +807,7 @@ public:
|
||||
case 1:
|
||||
me->CastSpell(me, SPELL_SPIKE_SPEED2, true);
|
||||
|
||||
events.RescheduleEvent(2, 7000);
|
||||
events.RescheduleEvent(2, 7s);
|
||||
break;
|
||||
case 2:
|
||||
me->CastSpell(me, SPELL_SPIKE_SPEED3, true);
|
||||
|
||||
+290
-289
File diff suppressed because it is too large
Load Diff
+25
-25
@@ -129,14 +129,14 @@ public:
|
||||
{
|
||||
me->setActive(true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_FIREBALL, 5000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_LIGHTNING, urand(10000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_INCINERATE_FLESH, urand(24000, 26000));
|
||||
events.RescheduleEvent(EVENT_SPELL_NETHER_POWER, urand(25000, 45000));
|
||||
events.RescheduleEvent(EVENT_SPELL_LEGION_FLAME, 30000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_FIREBALL, 5s);
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_LIGHTNING, 10s, 15s);
|
||||
events.RescheduleEvent(EVENT_SPELL_INCINERATE_FLESH, 24s, 26s);
|
||||
events.RescheduleEvent(EVENT_SPELL_NETHER_POWER, 25s, 45s);
|
||||
events.RescheduleEvent(EVENT_SPELL_LEGION_FLAME, 30s);
|
||||
//if( GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC )
|
||||
// events.RescheduleEvent(EVENT_SPELL_TOUCH_OF_JARAXXUS, urand(10000,15000));
|
||||
events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 20000); // it schedules EVENT_SUMMON_VOLCANO
|
||||
// events.RescheduleEvent(EVENT_SPELL_TOUCH_OF_JARAXXUS, 10s, 15s);
|
||||
events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 20s); // it schedules EVENT_SUMMON_VOLCANO
|
||||
|
||||
me->RemoveAura(SPELL_CHAINS);
|
||||
Talk(SAY_AGGRO);
|
||||
@@ -208,12 +208,12 @@ public:
|
||||
case EVENT_SPELL_FEL_FIREBALL:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_FEL_FIREBALL, false);
|
||||
events.RepeatEvent(urand(10000, 15000));
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_SPELL_FEL_LIGHTNING:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true) )
|
||||
me->CastSpell(target, SPELL_FEL_LIGHTNING, false);
|
||||
events.RepeatEvent(urand(10000, 15000));
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_SPELL_INCINERATE_FLESH:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true) )
|
||||
@@ -222,12 +222,12 @@ public:
|
||||
Talk(SAY_INCINERATE);
|
||||
me->CastSpell(target, SPELL_INCINERATE_FLESH, false);
|
||||
}
|
||||
events.RepeatEvent(urand(20000, 25000));
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_SPELL_NETHER_POWER:
|
||||
me->CastSpell(me, SPELL_NETHER_POWER, false);
|
||||
events.DelayEvents(5000);
|
||||
events.RepeatEvent(urand(25000, 45000));
|
||||
events.DelayEvents(5s);
|
||||
events.Repeat(25s, 45s);
|
||||
break;
|
||||
case EVENT_SPELL_LEGION_FLAME:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true) )
|
||||
@@ -235,26 +235,26 @@ public:
|
||||
Talk(EMOTE_LEGION_FLAME, target);
|
||||
me->CastSpell(target, SPELL_LEGION_FLAME, false);
|
||||
}
|
||||
events.RepeatEvent(30000);
|
||||
events.Repeat(30s);
|
||||
break;
|
||||
case EVENT_SPELL_TOUCH_OF_JARAXXUS:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true) )
|
||||
me->CastSpell(target, SPELL_TOUCH_OF_JARAXXUS, false);
|
||||
events.RepeatEvent(urand(10000, 15000));
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_SUMMON_NETHER_PORTAL:
|
||||
Talk(EMOTE_NETHER_PORTAL);
|
||||
Talk(SAY_MISTRESS_OF_PAIN);
|
||||
me->CastSpell((Unit*)nullptr, SPELL_SUMMON_NETHER_PORTAL, false);
|
||||
|
||||
events.RescheduleEvent(EVENT_SUMMON_VOLCANO, 60000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_VOLCANO, 1min);
|
||||
break;
|
||||
case EVENT_SUMMON_VOLCANO:
|
||||
Talk(EMOTE_INFERNAL_ERUPTION);
|
||||
Talk(SAY_INFERNAL_ERUPTION);
|
||||
me->CastSpell((Unit*)nullptr, SPELL_SUMMON_VOLCANO, false);
|
||||
|
||||
events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 60000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 1min);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -316,7 +316,7 @@ public:
|
||||
DoZoneInCombat();
|
||||
}
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_STEAK, urand(7000, 20000));
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_STEAK, 7s, 20s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -340,10 +340,10 @@ public:
|
||||
me->AddThreat(target, 50000.0f);
|
||||
me->CastSpell(target, SPELL_FEL_STEAK_MORPH, true);
|
||||
me->CastSpell(target, SPELL_FEL_STEAK, true);
|
||||
events.RepeatEvent(30000);
|
||||
events.Repeat(30s);
|
||||
}
|
||||
else
|
||||
events.RepeatEvent(5000);
|
||||
events.Repeat(5s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -386,10 +386,10 @@ public:
|
||||
DoZoneInCombat();
|
||||
}
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_SHIVAN_SLASH, urand(10000, 20000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SPINNING_PAIN_SPIKE, urand(22000, 30000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SHIVAN_SLASH, 10s, 20s);
|
||||
events.RescheduleEvent(EVENT_SPELL_SPINNING_PAIN_SPIKE, 22s, 30s);
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_MISTRESS_KISS, urand(10000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_MISTRESS_KISS, 10s, 15s);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) override
|
||||
@@ -415,16 +415,16 @@ public:
|
||||
case EVENT_SPELL_SHIVAN_SLASH:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHIVAN_SLASH, false);
|
||||
events.RepeatEvent(urand(15000, 25000));
|
||||
events.Repeat(15s, 25s);
|
||||
break;
|
||||
case EVENT_SPELL_SPINNING_PAIN_SPIKE:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 140.0f, true) )
|
||||
me->CastSpell(target, SPELL_SPINNING_PAIN_SPIKE, false);
|
||||
events.RepeatEvent(urand(25000, 30000));
|
||||
events.Repeat(25s, 30s);
|
||||
break;
|
||||
case EVENT_SPELL_MISTRESS_KISS:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_MISTRESS_KISS, false);
|
||||
events.RepeatEvent(urand(25000, 35000));
|
||||
events.Repeat(25s, 35s);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+55
-55
@@ -100,15 +100,15 @@ public:
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_BOMB, urand(10000, 30000));
|
||||
events.ScheduleEvent(EVENT_SPELL_FIRE_BOMB, 10s, 30s);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_SNOBOLLED, 1500);
|
||||
events.ScheduleEvent(EVENT_SPELL_BATTER, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HEAD_CRACK, 25000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SNOBOLLED, 1500ms);
|
||||
events.ScheduleEvent(EVENT_SPELL_BATTER, 5s);
|
||||
events.ScheduleEvent(EVENT_SPELL_HEAD_CRACK, 25s);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) override
|
||||
@@ -168,7 +168,7 @@ public:
|
||||
case EVENT_SPELL_BATTER:
|
||||
if( t->GetTypeId() == TYPEID_PLAYER )
|
||||
me->CastSpell(t, SPELL_BATTER);
|
||||
events.RepeatEvent(urand(6000, 8000));
|
||||
events.Repeat(6s, 8s);
|
||||
break;
|
||||
case EVENT_SPELL_FIRE_BOMB:
|
||||
{
|
||||
@@ -194,13 +194,13 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
events.RepeatEvent(urand(20000, 30000));
|
||||
events.Repeat(20s, 30s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_HEAD_CRACK:
|
||||
if( t->GetTypeId() == TYPEID_PLAYER )
|
||||
me->CastSpell(t, SPELL_HEAD_CRACK);
|
||||
events.RepeatEvent(urand(30000, 35000));
|
||||
events.Repeat(30s, 35s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -260,9 +260,9 @@ public:
|
||||
{
|
||||
me->setActive(true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_IMPALE, urand(9000, 10000));
|
||||
events.RescheduleEvent(EVENT_SPELL_STAGGERING_STOMP, 15000);
|
||||
events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, urand(16000, 24000));
|
||||
events.RescheduleEvent(EVENT_SPELL_IMPALE, 9s, 10s);
|
||||
events.RescheduleEvent(EVENT_SPELL_STAGGERING_STOMP, 15s);
|
||||
events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, 16s, 24s);
|
||||
|
||||
// refresh snobold position
|
||||
if( Vehicle* vk = me->GetVehicleKit() )
|
||||
@@ -297,14 +297,14 @@ public:
|
||||
{
|
||||
if( Unit* victim = me->GetVictim() )
|
||||
me->CastSpell(victim, SPELL_IMPALE, false);
|
||||
events.RepeatEvent(urand(9000, 10000));
|
||||
events.Repeat(9s, 10s);
|
||||
}
|
||||
else
|
||||
events.RepeatEvent(2500);
|
||||
events.Repeat(2500ms);
|
||||
break;
|
||||
case EVENT_SPELL_STAGGERING_STOMP:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_STAGGERING_STOMP, false);
|
||||
events.RepeatEvent(urand(20000, 25000));
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_PICK_SNOBOLD_TARGET:
|
||||
if( Vehicle* vk = me->GetVehicleKit() )
|
||||
@@ -326,12 +326,12 @@ public:
|
||||
snobold->ChangeSeat(4); // switch to hand
|
||||
me->setAttackTimer(BASE_ATTACK, 3000);
|
||||
PlayerGUID = p->GetGUID();
|
||||
events.RescheduleEvent(EVENT_RELEASE_SNOBOLD, 2500);
|
||||
events.RescheduleEvent(EVENT_RELEASE_SNOBOLD, 2500ms);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(urand(16000, 24000));
|
||||
events.Repeat(16s, 24s);
|
||||
break;
|
||||
case EVENT_RELEASE_SNOBOLD:
|
||||
{
|
||||
@@ -355,7 +355,7 @@ public:
|
||||
}
|
||||
else if( Vehicle* vk = me->GetVehicleKit() )
|
||||
{
|
||||
events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, 5000); // player not found (died? left instance?), pick new one faster!
|
||||
events.RescheduleEvent(EVENT_PICK_SNOBOLD_TARGET, 5s);
|
||||
if( Unit* snobold = vk->GetPassenger(4) )
|
||||
if( snobold->GetTypeId() == TYPEID_UNIT )
|
||||
{
|
||||
@@ -492,13 +492,13 @@ struct boss_jormungarAI : public ScriptedAI
|
||||
{
|
||||
case -1:
|
||||
if( !me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE) )
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 1500);
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 1500ms);
|
||||
break;
|
||||
case -2:
|
||||
if( me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE) )
|
||||
bIsStationary = true; // it will come out mobile soon
|
||||
else if( me->GetDisplayId() == _MODEL_STATIONARY )
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 1000);
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 1s);
|
||||
else
|
||||
events.CancelEvent(EVENT_SUBMERGE);
|
||||
me->CastSpell(me, SPELL_ENRAGE, true);
|
||||
@@ -513,18 +513,18 @@ struct boss_jormungarAI : public ScriptedAI
|
||||
if( me->GetDisplayId() == _MODEL_STATIONARY )
|
||||
{
|
||||
me->SetAttackTime(BASE_ATTACK, 1500);
|
||||
events.RescheduleEvent(EVENT_SPELL_SPRAY, (me->GetEntry() == NPC_ACIDMAW ? 20000 : 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SWEEP, urand(15000, 30000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SPRAY, (me->GetEntry() == NPC_ACIDMAW ? 20s : 15s));
|
||||
events.RescheduleEvent(EVENT_SPELL_SWEEP, 15s, 30s);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetAttackTime(BASE_ATTACK, 2000);
|
||||
events.RescheduleEvent(EVENT_SPELL_BITE, (me->GetEntry() == NPC_ACIDMAW ? 20000 : 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SPEW, urand(15000, 30000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SLIME_POOL, 15000);
|
||||
events.RescheduleEvent(EVENT_SPELL_BITE, (me->GetEntry() == NPC_ACIDMAW ? 20s : 15s));
|
||||
events.RescheduleEvent(EVENT_SPELL_SPEW, 15s, 30s);
|
||||
events.RescheduleEvent(EVENT_SPELL_SLIME_POOL, 15s);
|
||||
}
|
||||
if( !me->HasAura(SPELL_ENRAGE) )
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, urand(45000, 50000));
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 45s, 50s);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
@@ -578,7 +578,7 @@ struct boss_jormungarAI : public ScriptedAI
|
||||
c->AI()->DoAction(-1);
|
||||
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_MOVE_UNDERGROUND, 2500);
|
||||
events.RescheduleEvent(EVENT_MOVE_UNDERGROUND, 2500ms);
|
||||
}
|
||||
break;
|
||||
case EVENT_MOVE_UNDERGROUND:
|
||||
@@ -595,7 +595,7 @@ struct boss_jormungarAI : public ScriptedAI
|
||||
me->StopMovingOnCurrentPos();
|
||||
DoResetThreatList();
|
||||
|
||||
events.RescheduleEvent(EVENT_EMERGE, 6000);
|
||||
events.RescheduleEvent(EVENT_EMERGE, 6s);
|
||||
}
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
@@ -625,25 +625,25 @@ struct boss_jormungarAI : public ScriptedAI
|
||||
case EVENT_SPELL_SPRAY:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true) )
|
||||
me->CastSpell(target, _SPELL_SPRAY, false);
|
||||
events.RepeatEvent(20000);
|
||||
events.Repeat(20s);
|
||||
break;
|
||||
case EVENT_SPELL_SWEEP:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_SWEEP_0, false);
|
||||
events.RepeatEvent(urand(15000, 30000));
|
||||
events.Repeat(15s, 30s);
|
||||
break;
|
||||
case EVENT_SPELL_BITE:
|
||||
if( Unit* victim = me->GetVictim() )
|
||||
me->CastSpell(victim, _SPELL_BITE, false);
|
||||
events.RepeatEvent(20000);
|
||||
events.Repeat(20s);
|
||||
break;
|
||||
case EVENT_SPELL_SPEW:
|
||||
me->CastSpell(me->GetVictim(), _SPELL_SPEW, false);
|
||||
events.RepeatEvent(urand(15000, 30000));
|
||||
events.Repeat(15s, 30s);
|
||||
break;
|
||||
case EVENT_SPELL_SLIME_POOL:
|
||||
if( Creature* c = me->SummonCreature(NPC_SLIME_POOL, *me, TEMPSUMMON_TIMED_DESPAWN, 30000) )
|
||||
c->CastSpell(c, SPELL_SLIME_POOL_EFFECT, true);
|
||||
events.RepeatEvent(30000);
|
||||
events.Repeat(30s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -802,10 +802,10 @@ public:
|
||||
{
|
||||
me->setActive(true);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(15000, 30000));
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(10000, 12000));
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, 14000);
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, 15s, 30s);
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, 10s, 12s);
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, 14s);
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, 30s);
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
@@ -832,10 +832,10 @@ public:
|
||||
if( id == EVENT_CHARGE )
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000, 5000));
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000, 8000));
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000, 50000));
|
||||
events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, 5s, 15s);
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, 2s, 5s);
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, 5s, 8s);
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, 30s, 50s);
|
||||
|
||||
float angle = me->GetAngle(&Locs[LOC_CENTER]);
|
||||
angle = angle >= M_PI ? angle - M_PI : angle + M_PI;
|
||||
@@ -877,16 +877,16 @@ public:
|
||||
case EVENT_SPELL_FEROCIOUS_BUTT:
|
||||
if( Unit* victim = me->GetVictim() )
|
||||
me->CastSpell(victim, SPELL_FEROCIOUS_BUTT, false);
|
||||
events.RepeatEvent(urand(15000, 30000));
|
||||
events.Repeat(15s, 30s);
|
||||
break;
|
||||
case EVENT_SPELL_WHIRL:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_WHIRL, false);
|
||||
events.RepeatEvent(urand(15000, 20000));
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_ARCTIC_BREATH:
|
||||
if( Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 90.0f, true) )
|
||||
me->CastSpell(target, SPELL_ARCTIC_BREATH, false);
|
||||
events.RepeatEvent(urand(20000, 30000));
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_JUMP_MIDDLE:
|
||||
me->StopMoving();
|
||||
@@ -897,13 +897,13 @@ public:
|
||||
me->GetMotionMaster()->MoveJump(Locs[LOC_CENTER].GetPositionX(), Locs[LOC_CENTER].GetPositionY(), Locs[LOC_CENTER].GetPositionZ(), 40.0f, 12.0f);
|
||||
me->SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_MASSIVE_CRASH, 2000);
|
||||
events.RescheduleEvent(EVENT_SPELL_MASSIVE_CRASH, 2s);
|
||||
break;
|
||||
case EVENT_SPELL_MASSIVE_CRASH:
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->CastSpell((Unit*)nullptr, SPELL_MASSIVE_CRASH, false);
|
||||
|
||||
events.RescheduleEvent(EVENT_GAZE, 2000);
|
||||
events.RescheduleEvent(EVENT_GAZE, 2s);
|
||||
break;
|
||||
case EVENT_GAZE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 500.0f, true) )
|
||||
@@ -913,14 +913,14 @@ public:
|
||||
me->SetFacingToObject(target);
|
||||
Talk(EMOTE_TRAMPLE_STARE, target);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
|
||||
events.RescheduleEvent(EVENT_JUMP_BACK, 2000);
|
||||
events.RescheduleEvent(EVENT_JUMP_BACK, 2s);
|
||||
}
|
||||
else // in case something went wrong
|
||||
{
|
||||
events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000, 5000));
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000, 8000));
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000, 50000));
|
||||
events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, 5s, 15s);
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, 2s, 5s);
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, 5s, 8s);
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, 30s, 50s);
|
||||
me->GetMotionMaster()->MovementExpired();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
@@ -944,7 +944,7 @@ public:
|
||||
me->StopMoving();
|
||||
me->GetMotionMaster()->MoveJump(Locs[LOC_CENTER].GetPositionX() + cos(jumpangle) * 35.0f, Locs[LOC_CENTER].GetPositionY() + std::sin(jumpangle) * 35.0f, Locs[LOC_CENTER].GetPositionZ() + 1.0f, 40.0f, 12.0f);
|
||||
|
||||
events.RescheduleEvent(EVENT_TRAMPLE, 1500);
|
||||
events.RescheduleEvent(EVENT_TRAMPLE, 1500ms);
|
||||
|
||||
if( pInstance )
|
||||
switch( GetDifficulty() )
|
||||
@@ -972,17 +972,17 @@ public:
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveCharge(destX, destY, destZ + 1.0f, 65.0f);
|
||||
me->SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty);
|
||||
events.RescheduleEvent(EVENT_CHECK_TRAMPLE_PLAYERS, 100);
|
||||
events.RescheduleEvent(EVENT_CHECK_TRAMPLE_PLAYERS, 100ms);
|
||||
|
||||
break;
|
||||
case EVENT_CHECK_TRAMPLE_PLAYERS:
|
||||
if( DoTrampleIfValid() )
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, urand(5000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, urand(2000, 5000));
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, urand(5000, 8000));
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, urand(30000, 50000));
|
||||
events.RescheduleEvent(EVENT_SPELL_FEROCIOUS_BUTT, 5s, 15s);
|
||||
events.RescheduleEvent(EVENT_SPELL_WHIRL, 2s, 5s);
|
||||
events.RescheduleEvent(EVENT_SPELL_ARCTIC_BREATH, 5s, 8s);
|
||||
events.RescheduleEvent(EVENT_JUMP_MIDDLE, 30s, 50s);
|
||||
Talk(EMOTE_TRAMPLE_FAIL);
|
||||
me->CastSpell(me, SPELL_FROTHING_RAGE, true);
|
||||
me->GetMotionMaster()->MovementExpired();
|
||||
|
||||
+13
-13
@@ -123,13 +123,13 @@ struct boss_twin_valkyrAI : public ScriptedAI
|
||||
pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, 21853);
|
||||
|
||||
// special events here
|
||||
events.RescheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 600000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_1, urand(10000, 15000));
|
||||
events.RescheduleEvent(EVENT_SPECIAL, 45000);
|
||||
events.RescheduleEvent(EVENT_BERSERK, IsHeroic() ? 6min : 10min);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_1, 10s, 15s);
|
||||
events.RescheduleEvent(EVENT_SPECIAL, 45s);
|
||||
}
|
||||
events.RescheduleEvent(EVENT_SPELL_SPIKE, urand(5000, 8000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SPIKE, 5s, 8s);
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_TOUCH, urand(10000, 25000), 1);
|
||||
events.RescheduleEvent(EVENT_SPELL_TOUCH, 10s, 25s, 1);
|
||||
|
||||
me->SetCanFly(true);
|
||||
me->SetDisableGravity(true);
|
||||
@@ -196,7 +196,7 @@ struct boss_twin_valkyrAI : public ScriptedAI
|
||||
case -3:
|
||||
me->SetCanDualWield(true);
|
||||
me->CastSpell(me, SPELL_TWIN_POWER, true);
|
||||
events.RescheduleEvent(EVENT_REMOVE_DUAL_WIELD, 15000);
|
||||
events.RescheduleEvent(EVENT_REMOVE_DUAL_WIELD, 15s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -326,20 +326,20 @@ struct boss_twin_valkyrAI : public ScriptedAI
|
||||
switch( eventId )
|
||||
{
|
||||
case EVENT_SUMMON_BALLS_1:
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_2, 8000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_2, 8s);
|
||||
break;
|
||||
case EVENT_SUMMON_BALLS_2:
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_3, 8000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_3, 8s);
|
||||
break;
|
||||
case EVENT_SUMMON_BALLS_3:
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_1, 15000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_1, 15s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_SPIKE:
|
||||
me->CastSpell(me->GetVictim(), me->GetEntry() == NPC_LIGHTBANE ? SPELL_LIGHT_TWIN_SPIKE : SPELL_DARK_TWIN_SPIKE, false);
|
||||
events.RepeatEvent(urand(7000, 10000));
|
||||
events.Repeat(7s, 10s);
|
||||
break;
|
||||
case EVENT_SPELL_TOUCH:
|
||||
{
|
||||
@@ -402,11 +402,11 @@ struct boss_twin_valkyrAI : public ScriptedAI
|
||||
if (Player* target = ObjectAccessor::GetPlayer(*me, tList[urand(0, tList.size() - 1)]))
|
||||
{
|
||||
me->CastSpell(target, me->GetEntry() == NPC_LIGHTBANE ? SPELL_LIGHT_TOUCH : SPELL_DARK_TOUCH, false);
|
||||
events.RepeatEvent(urand(45000, 50000));
|
||||
events.Repeat(45s, 50s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(10000);
|
||||
events.Repeat(10s);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPECIAL:
|
||||
@@ -458,7 +458,7 @@ struct boss_twin_valkyrAI : public ScriptedAI
|
||||
}
|
||||
if( (SpecialMask & 0xF) == 0xF )
|
||||
SpecialMask = 0;
|
||||
events.RepeatEvent(45000);
|
||||
events.Repeat(45s);
|
||||
events.DelayEventsToMax(15000, 1); // no touch of light/darkness during special abilities!
|
||||
}
|
||||
break;
|
||||
|
||||
+3
-4
@@ -22,7 +22,6 @@
|
||||
#include "ScriptedCreature.h"
|
||||
#include "trial_of_the_crusader.h"
|
||||
|
||||
#define CLEANUP_CHECK_INTERVAL 5000
|
||||
std::map<uint32, bool> validDedicatedInsanityItems;
|
||||
|
||||
class instance_trial_of_the_crusader : public InstanceMapScript
|
||||
@@ -575,7 +574,7 @@ public:
|
||||
{
|
||||
InstanceCleanup();
|
||||
}
|
||||
events.RepeatEvent(CLEANUP_CHECK_INTERVAL);
|
||||
events.Repeat(5s);
|
||||
}
|
||||
break;
|
||||
case EVENT_OPEN_GATE:
|
||||
@@ -1415,7 +1414,7 @@ public:
|
||||
// if missing spawn anub'arak
|
||||
SpawnAnubArak();
|
||||
|
||||
events.RescheduleEvent(EVENT_CHECK_PLAYERS, CLEANUP_CHECK_INTERVAL);
|
||||
events.RescheduleEvent(EVENT_CHECK_PLAYERS, 5s);
|
||||
}
|
||||
|
||||
bool DoNeedCleanup(Player* ignoredPlayer = nullptr)
|
||||
@@ -1590,7 +1589,7 @@ public:
|
||||
Counter = 0;
|
||||
EncounterStatus = NOT_STARTED;
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_CHECK_PLAYERS, CLEANUP_CHECK_INTERVAL);
|
||||
events.RescheduleEvent(EVENT_CHECK_PLAYERS, 5s);
|
||||
}
|
||||
|
||||
void ReadSaveDataMore(std::istringstream& data) override
|
||||
|
||||
@@ -86,15 +86,15 @@ public:
|
||||
BossAI::JustEngagedWith(who);
|
||||
_raptorCount = 0;
|
||||
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 33000);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 18500);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, urand(10000, 20000));
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 17000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 33s);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20s);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 18s + 500ms);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 10s, 20s);
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 17s);
|
||||
if (IsHeroic())
|
||||
{
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 21000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, urand(20000, 25000));
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 21s);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20s, 25s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,27 +111,27 @@ public:
|
||||
{
|
||||
case EVENT_SPELL_BELLOWING_ROAR:
|
||||
me->CastSpell(me, SPELL_BELLOWING_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 40000);
|
||||
events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 40s);
|
||||
break;
|
||||
case EVENT_SPELL_GRIEVOUS_BITE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_GRIEVOUS_BITE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_GRIEVOUS_BITE, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_MANGLING_SLASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MANGLING_SLASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MANGLING_SLASH, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_FEARSOME_ROAR:
|
||||
me->CastSpell(me, SPELL_FEARSOME_ROAR, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 17000);
|
||||
events.ScheduleEvent(EVENT_SPELL_FEARSOME_ROAR, 17s);
|
||||
break;
|
||||
case EVENT_SPELL_PIERCING_SLASH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_PIERCING_SLASH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_PIERCING_SLASH, 20s);
|
||||
break;
|
||||
case EVENT_SPELL_RAPTOR_CALL:
|
||||
me->CastSpell(me, SPELL_RAPTOR_CALL, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAPTOR_CALL, 20s);
|
||||
break;
|
||||
case EVENT_MENACING_CLAW:
|
||||
Talk(SAY_CLAW_EMOTE);
|
||||
@@ -141,7 +141,7 @@ public:
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
if (me->GetVictim())
|
||||
me->AttackerStateUpdate(me->GetVictim());
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 20000);
|
||||
events.ScheduleEvent(EVENT_MENACING_CLAW, 20s);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -122,11 +122,11 @@ public:
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000);
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 80000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 9s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30s);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20s);
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 80s);
|
||||
|
||||
me->CastSpell(me, SPELL_ARCANE_BLAST, true);
|
||||
me->CastSpell(me, SPELL_ARCANE_FIELD, true);
|
||||
@@ -167,7 +167,7 @@ public:
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,17 +191,17 @@ public:
|
||||
case EVENT_SUMMON_FETID_TROLL:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_FETID_TROLL_CORPSE, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_FETID_TROLL, 3s);
|
||||
break;
|
||||
case EVENT_SUMMON_HULKING_CORPSE:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_HULKING_CORPSE, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_HULKING_CORPSE, 30s);
|
||||
break;
|
||||
case EVENT_SUMMON_SHADOWCASTER:
|
||||
if (Creature* trigger = summons.GetCreatureWithEntry(NPC_CRYSTAL_CHANNEL_TARGET))
|
||||
trigger->CastSpell(trigger, SPELL_SUMMON_RISEN_SHADOWCASTER, true, nullptr, nullptr, me->GetGUID());
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_SHADOWCASTER, 10s);
|
||||
break;
|
||||
case EVENT_SUMMON_CRYSTAL_HANDLER:
|
||||
if (_crystalCounter++ < 4)
|
||||
@@ -211,18 +211,18 @@ public:
|
||||
if (Creature* target = ObjectAccessor::GetCreature(*me, _stage ? _summonTargetLeftGUID : _summonTargetRightGUID))
|
||||
target->CastSpell(target, SPELL_SUMMON_CRYSTAL_HANDLER, true, nullptr, nullptr, me->GetGUID());
|
||||
_stage = _stage ? 0 : 1;
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20000);
|
||||
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL_HANDLER, 20s);
|
||||
}
|
||||
break;
|
||||
case EVENT_CHECK_PHASE:
|
||||
if (me->HasAura(SPELL_BEAM_CHANNEL))
|
||||
{
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 2000);
|
||||
events.ScheduleEvent(EVENT_CHECK_PHASE, 2s);
|
||||
break;
|
||||
}
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10000);
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 3s);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 10s);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
@@ -232,16 +232,16 @@ public:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
|
||||
me->CastSpell(target, RAND(SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_TOUCH_OF_MISERY), false);
|
||||
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500);
|
||||
events.ScheduleEvent(EVENT_CAST_OFFENSIVE_SPELL, 500ms);
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_MINIONS:
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
me->CastSpell(me, SPELL_SUMMON_MINIONS, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 15s);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500);
|
||||
events.ScheduleEvent(EVENT_SPELL_SUMMON_MINIONS, 500ms);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,10 +94,10 @@ public:
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(14000, 18000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000, 10000));
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 5s);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 14s, 18s);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 8s, 10s);
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1s);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
@@ -105,7 +105,7 @@ public:
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ public:
|
||||
{
|
||||
Talk(SAY_SKELETON);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_TURN_BONES_REAL, 3000);
|
||||
events.ScheduleEvent(EVENT_TURN_BONES_REAL, 3s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,16 +146,16 @@ public:
|
||||
case EVENT_SPELL_CURSE_OF_LIFE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_CURSE_OF_LIFE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 13s);
|
||||
break;
|
||||
case EVENT_SPELL_RAIN_OF_FIRE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
|
||||
me->CastSpell(target, SPELL_RAIN_OF_FIRE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 16000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 16s);
|
||||
break;
|
||||
case EVENT_SPELL_SHADOW_VOLLEY:
|
||||
me->CastSpell(me, SPELL_SHADOW_VOLLEY, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 9s);
|
||||
break;
|
||||
case EVENT_SPELL_TURN_FLESH:
|
||||
if (me->HealthBelowPct(50))
|
||||
@@ -165,18 +165,18 @@ public:
|
||||
me->CastSpell((Unit*)nullptr, SPELL_TURN_FLESH, false);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3000);
|
||||
events.ScheduleEvent(EVENT_TURN_FLESH_REAL, 3s);
|
||||
return;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_TURN_FLESH, 1s);
|
||||
break;
|
||||
case EVENT_TURN_FLESH_REAL:
|
||||
me->CastSpell(me, SPELL_DUMMY, true);
|
||||
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
events.ScheduleEvent(EVENT_SPELL_EYE_BEAM, 11000);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 3000);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 6000);
|
||||
events.ScheduleEvent(EVENT_SPELL_EYE_BEAM, 11s);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 3s);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 6s);
|
||||
break;
|
||||
case EVENT_SPELL_EYE_BEAM:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true))
|
||||
@@ -184,21 +184,21 @@ public:
|
||||
break;
|
||||
case EVENT_SPELL_LIGHTNING_BREATH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_LIGHTNING_BREATH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_LIGHTNING_BREATH, 8s);
|
||||
break;
|
||||
case EVENT_SPELL_POISON_CLOUD:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 35.0f, true))
|
||||
me->CastSpell(target, SPELL_POISON_CLOUD, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 10000);
|
||||
events.ScheduleEvent(EVENT_SPELL_POISON_CLOUD, 10s);
|
||||
break;
|
||||
case EVENT_TURN_BONES_REAL:
|
||||
me->SetDisplayId(me->GetNativeDisplayId());
|
||||
me->CastSpell(me, SPELL_FLESH_VISUAL, true);
|
||||
me->CastSpell(me, SPELL_CLEAR_GIFT, true);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 1000);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, urand(12000, 14000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, urand(8000, 10000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_LIFE, 1s);
|
||||
events.ScheduleEvent(EVENT_SPELL_RAIN_OF_FIRE, 12s, 14s);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_VOLLEY, 8s, 10s);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,16 +69,16 @@ public:
|
||||
{
|
||||
BossAI::Reset();
|
||||
events2.Reset();
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000);
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30s);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(6000, 10000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(3000, 5000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 35000);
|
||||
events.ScheduleEvent(EVENT_SPAWN_INVADERS, 20000, 30000);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, 6s, 10s);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, 3s, 5s);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15s);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 35s);
|
||||
events.ScheduleEvent(EVENT_SPAWN_INVADERS, 20s, 30s);
|
||||
|
||||
me->setActive(true);
|
||||
instance->SetBossState(DATA_TROLLGORE, IN_PROGRESS);
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6000);
|
||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public:
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_A, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_B, true);
|
||||
me->CastSpell(me, SPELL_SUMMON_INVADER_C, true);
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30000);
|
||||
events2.ScheduleEvent(EVENT_SPAWN_INVADERS, 30s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -133,21 +133,21 @@ public:
|
||||
{
|
||||
case EVENT_SPELL_INFECTED_WOUND:
|
||||
me->CastSpell(me->GetVictim(), SPELL_INFECTED_WOUND, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, urand(25000, 35000));
|
||||
events.ScheduleEvent(EVENT_SPELL_INFECTED_WOUND, 25s, 35s);
|
||||
break;
|
||||
case EVENT_SPELL_CRUSH:
|
||||
me->CastSpell(me->GetVictim(), SPELL_CRUSH, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, urand(10000, 15000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CRUSH, 10s, 15s);
|
||||
break;
|
||||
case EVENT_SPELL_CONSUME:
|
||||
Talk(SAY_CONSUME);
|
||||
me->CastSpell(me, SPELL_CONSUME, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15000);
|
||||
events.ScheduleEvent(EVENT_SPELL_CONSUME, 15s);
|
||||
break;
|
||||
case EVENT_SPELL_CORPSE_EXPLODE:
|
||||
Talk(SAY_EXPLODE);
|
||||
me->CastSpell(me, SPELL_CORPSE_EXPLODE, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, urand(15000, 19000));
|
||||
events.ScheduleEvent(EVENT_SPELL_CORPSE_EXPLODE, 15s, 19s);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,9 +96,9 @@ public:
|
||||
|
||||
DoZoneInCombat();
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 2000);
|
||||
events.RescheduleEvent(EVENT_SPELL_MAGICS_BANE, urand(5000, 10000));
|
||||
events.RescheduleEvent(EVENT_SPELL_CORRUPT_SOUL, urand(14000, 20000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 2s);
|
||||
events.RescheduleEvent(EVENT_SPELL_MAGICS_BANE, 5s, 10s);
|
||||
events.RescheduleEvent(EVENT_SPELL_CORRUPT_SOUL, 14s, 20s);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_BRONJAHM, IN_PROGRESS);
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
me->CastSpell(me, SPELL_TELEPORT, false);
|
||||
events.CancelEvent(EVENT_SPELL_CORRUPT_SOUL);
|
||||
events.DelayEvents(6000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FEAR, urand(8000, 14000));
|
||||
events.RescheduleEvent(EVENT_SPELL_FEAR, 8s, 14s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ public:
|
||||
if (spell->Id == SPELL_TELEPORT)
|
||||
{
|
||||
me->CastSpell(me, SPELL_TELEPORT_VISUAL, true);
|
||||
events.RescheduleEvent(EVENT_START_SOULSTORM, 1);
|
||||
events.RescheduleEvent(EVENT_START_SOULSTORM, 1ms);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,16 +148,16 @@ public:
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
if (!me->IsWithinMeleeRange(me->GetVictim()))
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
|
||||
events.RepeatEvent(2000);
|
||||
events.Repeat(2s);
|
||||
break;
|
||||
case EVENT_SPELL_FEAR:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 10.0f, true))
|
||||
me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, target, false);
|
||||
events.RepeatEvent(urand(8000, 12000));
|
||||
events.Repeat(8s, 12s);
|
||||
break;
|
||||
case EVENT_SPELL_MAGICS_BANE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_MAGICS_BANE, false);
|
||||
events.RepeatEvent(urand(10000, 15000));
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_SPELL_CORRUPT_SOUL:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
|
||||
@@ -165,7 +165,7 @@ public:
|
||||
Talk(SAY_CORRUPT_SOUL);
|
||||
me->CastSpell(target, SPELL_CORRUPT_SOUL, false);
|
||||
}
|
||||
events.RepeatEvent(urand(20000, 25000));
|
||||
events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_START_SOULSTORM:
|
||||
Talk(SAY_SOUL_STORM);
|
||||
|
||||
@@ -121,11 +121,11 @@ public:
|
||||
Talk(SAY_FACE_AGGRO);
|
||||
DoZoneInCombat();
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_PHANTOM_BLAST, 5000);
|
||||
events.RescheduleEvent(EVENT_SPELL_MIRRORED_SOUL, 9000);
|
||||
events.RescheduleEvent(EVENT_SPELL_WELL_OF_SOULS, urand(6000, 8000));
|
||||
events.RescheduleEvent(EVENT_SPELL_UNLEASHED_SOULS, urand(18000, 20000));
|
||||
events.RescheduleEvent(EVENT_SPELL_WAILING_SOULS, 65000);
|
||||
events.RescheduleEvent(EVENT_SPELL_PHANTOM_BLAST, 5s);
|
||||
events.RescheduleEvent(EVENT_SPELL_MIRRORED_SOUL, 9s);
|
||||
events.RescheduleEvent(EVENT_SPELL_WELL_OF_SOULS, 6s, 8s);
|
||||
events.RescheduleEvent(EVENT_SPELL_UNLEASHED_SOULS, 18s, 20s);
|
||||
events.RescheduleEvent(EVENT_SPELL_WAILING_SOULS, 65s);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_DEVOURER, IN_PROGRESS);
|
||||
@@ -183,10 +183,10 @@ public:
|
||||
break;
|
||||
case EVENT_SPELL_PHANTOM_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_PHANTOM_BLAST, false);
|
||||
events.RepeatEvent(5000);
|
||||
events.Repeat(5s);
|
||||
break;
|
||||
default:
|
||||
events.RepeatEvent(1000);
|
||||
events.Repeat(1s);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ public:
|
||||
break;
|
||||
case EVENT_SPELL_PHANTOM_BLAST:
|
||||
me->CastSpell(me->GetVictim(), SPELL_PHANTOM_BLAST, false);
|
||||
events.RepeatEvent(5000);
|
||||
events.Repeat(5s);
|
||||
break;
|
||||
case EVENT_SPELL_MIRRORED_SOUL:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 90.0f, true))
|
||||
@@ -218,19 +218,19 @@ public:
|
||||
me->setAttackTimer(BASE_ATTACK, 2500);
|
||||
Talk(EMOTE_MIRRORED_SOUL);
|
||||
}
|
||||
events.RepeatEvent(urand(20000, 30000));
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_SPELL_WELL_OF_SOULS:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
|
||||
me->CastSpell(target, SPELL_WELL_OF_SOULS, false);
|
||||
events.RepeatEvent(urand(25000, 30000));
|
||||
events.Repeat(25s, 30s);
|
||||
events.DelayEventsToMax(4000, 0);
|
||||
break;
|
||||
case EVENT_SPELL_UNLEASHED_SOULS:
|
||||
me->CastSpell(me, SPELL_UNLEASHED_SOULS, false);
|
||||
Talk(SAY_FACE_UNLEASH_SOUL);
|
||||
Talk(EMOTE_UNLEASH_SOUL);
|
||||
events.RepeatEvent(urand(30000, 40000));
|
||||
events.Repeat(30s, 40s);
|
||||
events.DelayEventsToMax(5000, 0);
|
||||
me->setAttackTimer(BASE_ATTACK, 5500);
|
||||
break;
|
||||
@@ -239,7 +239,7 @@ public:
|
||||
Talk(EMOTE_WAILING_SOUL);
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
|
||||
me->CastCustomSpell(SPELL_WAILING_SOULS_TARGETING, SPELLVALUE_MAX_TARGETS, 1, target, false);
|
||||
events.RepeatEvent(80000);
|
||||
events.Repeat(80s);
|
||||
events.DelayEventsToMax(20000, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
{
|
||||
me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(1, 1000);
|
||||
events.ScheduleEvent(1, 1s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,12 +89,12 @@ public:
|
||||
if (me->GetEntry() == NPC_JAINA_PART1)
|
||||
{
|
||||
Talk(SAY_JAINA_INTRO_1);
|
||||
events.ScheduleEvent(2, 8000);
|
||||
events.ScheduleEvent(2, 8s);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(SAY_SYLVANAS_INTRO_1);
|
||||
events.ScheduleEvent(2, 11500);
|
||||
events.ScheduleEvent(2, 11s + 500ms);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
@@ -102,12 +102,12 @@ public:
|
||||
if (me->GetEntry() == NPC_JAINA_PART1)
|
||||
{
|
||||
Talk(SAY_JAINA_INTRO_2);
|
||||
events.ScheduleEvent(3, 9000);
|
||||
events.ScheduleEvent(3, 9s);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(SAY_SYLVANAS_INTRO_2);
|
||||
events.ScheduleEvent(3, 10500);
|
||||
events.ScheduleEvent(3, 10s + 500ms);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
@@ -115,12 +115,12 @@ public:
|
||||
if (me->GetEntry() == NPC_JAINA_PART1)
|
||||
{
|
||||
Talk(SAY_JAINA_INTRO_3);
|
||||
events.ScheduleEvent(4, 8000);
|
||||
events.ScheduleEvent(4, 8s);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(SAY_SYLVANAS_INTRO_3);
|
||||
events.ScheduleEvent(4, 10500);
|
||||
events.ScheduleEvent(4, 10s + 500ms);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
@@ -128,12 +128,12 @@ public:
|
||||
if (me->GetEntry() == NPC_JAINA_PART1)
|
||||
{
|
||||
Talk(SAY_JAINA_INTRO_4);
|
||||
events.ScheduleEvent(5, 10000);
|
||||
events.ScheduleEvent(5, 10s);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(SAY_SYLVANAS_INTRO_4);
|
||||
events.ScheduleEvent(5, 11000);
|
||||
events.ScheduleEvent(5, 11s);
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
@@ -141,12 +141,12 @@ public:
|
||||
if (me->GetEntry() == NPC_JAINA_PART1)
|
||||
{
|
||||
Talk(SAY_JAINA_INTRO_5);
|
||||
events.ScheduleEvent(6, 8000);
|
||||
events.ScheduleEvent(6, 8s);
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(SAY_SYLVANAS_INTRO_5);
|
||||
events.ScheduleEvent(6, 9500);
|
||||
events.ScheduleEvent(6, 9500ms);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
@@ -154,7 +154,7 @@ public:
|
||||
if (me->GetEntry() == NPC_JAINA_PART1)
|
||||
{
|
||||
Talk(SAY_JAINA_INTRO_6);
|
||||
events.ScheduleEvent(7, 12000);
|
||||
events.ScheduleEvent(7, 12s);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -166,7 +166,7 @@ public:
|
||||
if (me->GetEntry() == NPC_JAINA_PART1)
|
||||
{
|
||||
Talk(SAY_JAINA_INTRO_7);
|
||||
events.ScheduleEvent(8, 8000);
|
||||
events.ScheduleEvent(8, 8s);
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
|
||||
@@ -19,12 +19,11 @@
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = 50,
|
||||
SAY_SLAY_1 = 51,
|
||||
SAY_SLAY_2 = 52,
|
||||
SAY_DEATH = 53,
|
||||
SAY_IMPENDING_DESPAIR = 54,
|
||||
SAY_DEFILING_HORROR = 55,
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SLAY = 1,
|
||||
SAY_DEATH = 2,
|
||||
SAY_IMPENDING_DESPAIR = 3,
|
||||
SAY_DEFILING_HORROR = 4,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
@@ -77,9 +76,9 @@ public:
|
||||
{
|
||||
me->SetImmuneToAll(false);
|
||||
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5000);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 11000);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20000);
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5s);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 11s);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20s);
|
||||
}
|
||||
|
||||
void DoAction(int32 a) override
|
||||
@@ -116,7 +115,7 @@ public:
|
||||
{
|
||||
case EVENT_QUIVERING_STRIKE:
|
||||
me->CastSpell(me->GetVictim(), SPELL_QUIVERING_STRIKE, false);
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5000);
|
||||
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 5s);
|
||||
break;
|
||||
case EVENT_IMPENDING_DESPAIR:
|
||||
if (Unit* target = SelectTargetFromPlayerList(45.0f, 0, true))
|
||||
@@ -124,15 +123,15 @@ public:
|
||||
Talk(SAY_IMPENDING_DESPAIR);
|
||||
me->CastSpell(target, SPELL_IMPENDING_DESPAIR, false);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 12000);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 12s);
|
||||
break;
|
||||
case EVENT_DEFILING_HORROR:
|
||||
Talk(SAY_DEFILING_HORROR);
|
||||
me->CastSpell((Unit*)nullptr, SPELL_DEFILING_HORROR, false);
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
events.DelayEventsToMax(5000, 0);
|
||||
events.ScheduleEvent(EVENT_UNROOT, 4000);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20000);
|
||||
events.ScheduleEvent(EVENT_UNROOT, 4s);
|
||||
events.ScheduleEvent(EVENT_DEFILING_HORROR, 20s);
|
||||
break;
|
||||
case EVENT_UNROOT:
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
@@ -161,7 +160,7 @@ public:
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(RAND(SAY_SLAY_1, SAY_SLAY_2));
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason why) override
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user