diff options
Diffstat (limited to 'src')
242 files changed, 4704 insertions, 3789 deletions
diff --git a/src/server/authserver/Authentication/AuthCodes.cpp b/src/server/authserver/Authentication/AuthCodes.cpp index bb278dd6653..55517884b8e 100644 --- a/src/server/authserver/Authentication/AuthCodes.cpp +++ b/src/server/authserver/Authentication/AuthCodes.cpp @@ -79,4 +79,4 @@ namespace AuthHelper return NULL; } -}; +} diff --git a/src/server/authserver/Authentication/AuthCodes.h b/src/server/authserver/Authentication/AuthCodes.h index 5e6522f8981..97b4779da0e 100644 --- a/src/server/authserver/Authentication/AuthCodes.h +++ b/src/server/authserver/Authentication/AuthCodes.h @@ -92,6 +92,6 @@ namespace AuthHelper bool IsAcceptedClientBuild(int build); bool IsPostBCAcceptedClientBuild(int build); bool IsPreBCAcceptedClientBuild(int build); -}; +} #endif diff --git a/src/server/collision/Maps/MapTree.cpp b/src/server/collision/Maps/MapTree.cpp index bb57079c389..d592d795125 100644 --- a/src/server/collision/Maps/MapTree.cpp +++ b/src/server/collision/Maps/MapTree.cpp @@ -157,8 +157,7 @@ namespace VMAP { float maxDist = (pos2 - pos1).magnitude(); // return false if distance is over max float, in case of cheater teleporting to the end of the universe - if (maxDist == std::numeric_limits<float>::max() || - maxDist == std::numeric_limits<float>::infinity()) + if (maxDist == std::numeric_limits<float>::max() || !std::isfinite(maxDist)) return false; // valid map coords should *never ever* produce float overflow, but this would produce NaNs too diff --git a/src/server/collision/Models/GameObjectModel.cpp b/src/server/collision/Models/GameObjectModel.cpp index 1b99e282132..de97943bb37 100644 --- a/src/server/collision/Models/GameObjectModel.cpp +++ b/src/server/collision/Models/GameObjectModel.cpp @@ -140,6 +140,7 @@ bool GameObjectModel::initialize(const GameObject& go, const GameObjectDisplayIn } #endif + owner = &go; return true; } @@ -161,7 +162,7 @@ GameObjectModel* GameObjectModel::Create(const GameObject& go) bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask) const { - if (!(phasemask & ph_mask)) + if (!(phasemask & ph_mask) || !owner->isSpawned()) return false; float time = ray.intersectionTime(iBound); diff --git a/src/server/collision/Models/GameObjectModel.h b/src/server/collision/Models/GameObjectModel.h index 6088b924343..99c9b1337b3 100644 --- a/src/server/collision/Models/GameObjectModel.h +++ b/src/server/collision/Models/GameObjectModel.h @@ -44,8 +44,9 @@ class GameObjectModel /*, public Intersectable*/ float iInvScale; float iScale; VMAP::WorldModel* iModel; + GameObject const* owner; - GameObjectModel() : phasemask(0), iInvScale(0), iScale(0), iModel(NULL) { } + GameObjectModel() : phasemask(0), iInvScale(0), iScale(0), iModel(NULL), owner(NULL) { } bool initialize(const GameObject& go, const GameObjectDisplayInfoEntry& info); public: diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index e2eeaf880ad..7c640f9a66d 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -89,7 +89,8 @@ void PetAI::UpdateAI(uint32 diff) if (me->GetVictim() && me->EnsureVictim()->IsAlive()) { // is only necessary to stop casting, the pet must not exit combat - if (me->EnsureVictim()->HasBreakableByDamageCrowdControlAura(me)) + if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL) && // ignore channeled spells (Pin, Seduction) + me->EnsureVictim()->HasBreakableByDamageCrowdControlAura(me)) { me->InterruptNonMeleeSpells(false); return; @@ -459,9 +460,6 @@ void PetAI::DoAttack(Unit* target, bool chase) if (me->Attack(target, true)) { - if (Unit* owner = me->GetOwner()) - owner->SetInCombatWith(target); - // Play sound to let the player know the pet is attacking something it picked on its own if (me->HasReactState(REACT_AGGRESSIVE) && !me->GetCharmInfo()->IsCommandAttack()) me->SendPetAIReaction(me->GetGUID()); diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 8bf34527769..cb32740e068 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -28,7 +28,6 @@ void UnitAI::AttackStart(Unit* victim) { - if (victim && me->Attack(victim, true)) me->GetMotionMaster()->MoveChase(victim); } @@ -104,7 +103,7 @@ void UnitAI::DoAddAuraToAllHostilePlayers(uint32 spellid) ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid())) + if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) if (unit->GetTypeId() == TYPEID_PLAYER) me->AddAura(spellid, unit); } @@ -118,7 +117,7 @@ void UnitAI::DoCastToAllHostilePlayers(uint32 spellid, bool triggered) ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid())) + if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) if (unit->GetTypeId() == TYPEID_PLAYER) me->CastSpell(unit, spellid, triggered); } diff --git a/src/server/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h index 7447e290ba9..378d3ca18ab 100644 --- a/src/server/game/AI/CreatureAIImpl.h +++ b/src/server/game/AI/CreatureAIImpl.h @@ -327,7 +327,7 @@ class EventMap typedef std::multimap<uint32, uint32> EventStore; public: - EventMap() : _time(0), _phase(0) { } + EventMap() : _time(0), _phase(0), _lastEvent(0) { } /** * @name Reset @@ -447,27 +447,22 @@ class EventMap /** * @name RepeatEvent - * @brief Cancels the closest event and reschedules it. + * @brief Repeats the mostly recently executed event. * @param time Time until the event occurs. */ - void RepeatEvent(uint32 time) + void Repeat(uint32 time) { - if (Empty()) - return; - - uint32 eventId = _eventMap.begin()->second; - _eventMap.erase(_eventMap.begin()); - ScheduleEvent(eventId, time); + _eventMap.insert(EventStore::value_type(_time + time, _lastEvent)); } /** - * @name PopEvent - * @brief Remove the first event in the map. + * @name RepeatEvent + * @brief Repeats the mostly recently executed event. + * @param time Time until the event occurs. Equivalent to Repeat(urand(minTime, maxTime). */ - void PopEvent() + void Repeat(uint32 minTime, uint32 maxTime) { - if (!Empty()) - _eventMap.erase(_eventMap.begin()); + Repeat(urand(minTime, maxTime)); } /** @@ -488,6 +483,7 @@ class EventMap else { uint32 eventId = (itr->second & 0x0000FFFF); + _lastEvent = itr->second; // include phase/group _eventMap.erase(itr); return eventId; } @@ -497,28 +493,6 @@ class EventMap } /** - * @name GetEvent - * @brief Returns the next event to execute. - * @return Id of the event to execute. - */ - uint32 GetEvent() - { - while (!Empty()) - { - EventStore::iterator itr = _eventMap.begin(); - - if (itr->first > _time) - return 0; - else if (_phase && (itr->second & 0xFF000000) && !(itr->second & (_phase << 24))) - _eventMap.erase(itr); - else - return (itr->second & 0x0000FFFF); - } - - return 0; - } - - /** * @name DelayEvents * @brief Delays all events in the map. If delay is greater than or equal internal timer, delay will be 0. * @param delay Amount of delay. @@ -631,6 +605,21 @@ class EventMap return phase <= 8 && (!phase || _phase & (1 << (phase - 1))); } + /** + * @name GetTimeUntilEvent + * @brief Returns time in milliseconds until next event. + * @param Id of the event. + * @return Time of next event. + */ + uint32 GetTimeUntilEvent(uint32 eventId) const + { + for (EventStore::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr) + if (eventId == (itr->second & 0x0000FFFF)) + return itr->first - _time; + + return std::numeric_limits<uint32>::max(); + } + private: /** * @name _time @@ -662,6 +651,13 @@ class EventMap * details. */ EventStore _eventMap; + + + /** + * @name _lastEvent + * @brief Stores information on the most recently executed event + */ + uint32 _lastEvent; }; enum AITarget diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 36c1d384693..06820b03218 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -37,7 +37,7 @@ void SummonList::DoZoneInCombat(uint32 entry) { for (StorageType::iterator i = storage_.begin(); i != storage_.end();) { - Creature* summon = Unit::GetCreature(*me, *i); + Creature* summon = ObjectAccessor::GetCreature(*me, *i); ++i; if (summon && summon->IsAIEnabled && (!entry || summon->GetEntry() == entry)) @@ -51,7 +51,7 @@ void SummonList::DespawnEntry(uint32 entry) { for (StorageType::iterator i = storage_.begin(); i != storage_.end();) { - Creature* summon = Unit::GetCreature(*me, *i); + Creature* summon = ObjectAccessor::GetCreature(*me, *i); if (!summon) i = storage_.erase(i); else if (summon->GetEntry() == entry) @@ -68,7 +68,7 @@ void SummonList::DespawnAll() { while (!storage_.empty()) { - Creature* summon = Unit::GetCreature(*me, storage_.front()); + Creature* summon = ObjectAccessor::GetCreature(*me, storage_.front()); storage_.pop_front(); if (summon) summon->DespawnOrUnsummon(); @@ -79,7 +79,7 @@ void SummonList::RemoveNotExisting() { for (StorageType::iterator i = storage_.begin(); i != storage_.end();) { - if (Unit::GetCreature(*me, *i)) + if (ObjectAccessor::GetCreature(*me, *i)) ++i; else i = storage_.erase(i); @@ -90,7 +90,7 @@ bool SummonList::HasEntry(uint32 entry) const { for (StorageType::const_iterator i = storage_.begin(); i != storage_.end(); ++i) { - Creature* summon = Unit::GetCreature(*me, *i); + Creature* summon = ObjectAccessor::GetCreature(*me, *i); if (summon && summon->GetEntry() == entry) return true; } @@ -271,7 +271,7 @@ void ScriptedAI::DoResetThreat() for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && DoGetThreat(unit)) DoModifyThreatPercent(unit, -100); } @@ -478,10 +478,7 @@ void BossAI::_JustDied() events.Reset(); summons.DespawnAll(); if (instance) - { instance->SetBossState(_bossId, DONE); - instance->SaveToDB(); - } } void BossAI::_EnterCombat() diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index cee6ba3c379..c9f7f342183 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -98,7 +98,7 @@ public: Trinity::Containers::RandomResizeList<uint64, Predicate>(listCopy, predicate, max); for (StorageType::iterator i = listCopy.begin(); i != listCopy.end(); ) { - Creature* summon = Unit::GetCreature(*me, *i++); + Creature* summon = ObjectAccessor::GetCreature(*me, *i++); if (summon && summon->IsAIEnabled) summon->AI()->DoAction(info); } diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 098f3130fed..ecaa20284d7 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -437,8 +437,11 @@ void SmartAI::EnterEvadeMode() } else if (mFollowGuid) { - if (Unit* target = me->GetUnit(*me, mFollowGuid)) + if (Unit* target = ObjectAccessor::GetUnit(*me, mFollowGuid)) me->GetMotionMaster()->MoveFollow(target, mFollowDist, mFollowAngle); + + // evade is not cleared in MoveFollow, so we can't keep it + me->ClearUnitState(UNIT_STATE_EVADE); } else me->GetMotionMaster()->MoveTargetedHome(); @@ -618,10 +621,7 @@ void SmartAI::DamageTaken(Unit* doneBy, uint32& damage) { GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage); if (mInvincibilityHpLevel && (damage >= me->GetHealth() - mInvincibilityHpLevel)) - { - damage = 0; - me->SetHealth(mInvincibilityHpLevel); - } + damage = me->GetHealth() - mInvincibilityHpLevel; // damage should not be nullified, because of player damage req. } void SmartAI::HealReceived(Unit* doneBy, uint32& addhealth) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index dff9ddbaf2f..2647368559c 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -429,7 +429,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u ThreatContainer::StorageType threatList = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator i = threatList.begin(); i != threatList.end(); ++i) { - if (Unit* target = Unit::GetUnit(*me, (*i)->getUnitGuid())) + if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) { me->getThreatManager().modifyThreatPercent(target, e.action.threatPCT.threatINC ? (int32)e.action.threatPCT.threatINC : -(int32)e.action.threatPCT.threatDEC); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_THREAT_ALL_PCT: Creature guidLow %u modify threat for unit %u, value %i", @@ -2602,7 +2602,7 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /* { ThreatContainer::StorageType threatList = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator i = threatList.begin(); i != threatList.end(); ++i) - if (Unit* temp = Unit::GetUnit(*me, (*i)->getUnitGuid())) + if (Unit* temp = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) l->push_back(temp); } break; @@ -3462,16 +3462,10 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at) void SmartScript::OnMoveInLineOfSight(Unit* who) { - ProcessEventsFor(SMART_EVENT_OOC_LOS, who); - if (!me) return; - if (me->GetVictim()) - return; - - ProcessEventsFor(SMART_EVENT_IC_LOS, who); - + ProcessEventsFor(me->IsInCombat() ? SMART_EVENT_IC_LOS : SMART_EVENT_OOC_LOS, who); } /* diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index d8f61a22314..773e169e5c2 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -517,7 +517,7 @@ bool AccountMgr::HasPermission(uint32 accountId, uint32 permissionId, uint32 rea return false; } - rbac::RBACData rbac(accountId, "", realmId); + rbac::RBACData rbac(accountId, "", realmId, GetSecurity(accountId)); rbac.LoadFromDB(); bool hasPermission = rbac.HasPermission(permissionId); diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index 96f13dcd0ac..3f9c6cf0617 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -54,7 +54,7 @@ Battlefield::Battlefield() m_uiKickAfkPlayersTimer = 1000; - m_LastResurectTimer = 30 * IN_MILLISECONDS; + m_LastResurrectTimer = 30 * IN_MILLISECONDS; m_StartGroupingTimer = 0; m_StartGrouping = false; StalkerGuid = 0; @@ -184,15 +184,15 @@ bool Battlefield::Update(uint32 diff) } - if (m_LastResurectTimer <= diff) + if (m_LastResurrectTimer <= diff) { for (uint8 i = 0; i < m_GraveyardList.size(); i++) if (GetGraveyardById(i)) m_GraveyardList[i]->Resurrect(); - m_LastResurectTimer = RESURRECTION_INTERVAL; + m_LastResurrectTimer = RESURRECTION_INTERVAL; } else - m_LastResurectTimer -= diff; + m_LastResurrectTimer -= diff; return objective_changed; } @@ -632,7 +632,7 @@ void Battlefield::RemovePlayerFromResurrectQueue(uint64 playerGuid) void Battlefield::SendAreaSpiritHealerQueryOpcode(Player* player, uint64 guid) { WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 12); - uint32 time = m_LastResurectTimer; // resurrect every 30 seconds + uint32 time = m_LastResurrectTimer; // resurrect every 30 seconds data << guid << time; ASSERT(player && player->GetSession()); @@ -711,7 +711,7 @@ void BfGraveyard::Resurrect() if (Creature* spirit = m_Bf->GetCreature(m_SpiritGuide[m_ControlTeam])) spirit->CastSpell(spirit, SPELL_SPIRIT_HEAL, true); - // Resurect player + // Resurrect player player->CastSpell(player, SPELL_RESURRECTION_VISUAL, true); player->ResurrectPlayer(1.0f); player->CastSpell(player, 6962, true); diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index 6c9e653c510..296c48b0697 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -173,7 +173,7 @@ class BfGraveyard // Check if this graveyard has a spirit guide bool HasNpc(uint64 guid); - // Check if a player is in this graveyard's ressurect queue + // Check if a player is in this graveyard's resurrect queue bool HasPlayer(uint64 guid) { return m_ResurrectQueue.find(guid) != m_ResurrectQueue.end(); } // Get the graveyard's ID. @@ -383,7 +383,7 @@ class Battlefield : public ZoneScript // Graveyard variables GraveyardVect m_GraveyardList; // Vector witch contain the different GY of the battle - uint32 m_LastResurectTimer; // Timer for resurect player every 30 sec + uint32 m_LastResurrectTimer; // Timer for resurrect player every 30 sec uint32 m_StartGroupingTimer; // Timer for invite players in area 15 minute before start battle bool m_StartGrouping; // bool for know if all players in area has been invited diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 97320373e16..ca48ffb3a14 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -269,7 +269,7 @@ void Battleground::Update(uint32 diff) } else { - _ProcessRessurect(diff); + _ProcessResurrect(diff); if (sBattlegroundMgr->GetPrematureFinishTime() && (GetPlayersCountByTeam(ALLIANCE) < GetMinPlayersPerTeam() || GetPlayersCountByTeam(HORDE) < GetMinPlayersPerTeam())) _ProcessProgress(diff); else if (m_PrematureCountDown) @@ -334,10 +334,10 @@ inline void Battleground::_ProcessOfflineQueue() } } -inline void Battleground::_ProcessRessurect(uint32 diff) +inline void Battleground::_ProcessResurrect(uint32 diff) { // ********************************************************* - // *** BATTLEGROUND RESSURECTION SYSTEM *** + // *** BATTLEGROUND RESURRECTION SYSTEM *** // ********************************************************* // this should be handled by spell system m_LastResurrectTime += diff; diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 2cbf8bd0918..4256e2fc094 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -556,7 +556,7 @@ class Battleground Player* _GetPlayerForTeam(uint32 teamId, BattlegroundPlayerMap::const_iterator itr, const char* context) const; void _ProcessOfflineQueue(); - void _ProcessRessurect(uint32 diff); + void _ProcessResurrect(uint32 diff); void _ProcessProgress(uint32 diff); void _ProcessLeave(uint32 diff); void _ProcessJoin(uint32 diff); diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index 52ed50f3948..a4cb972e625 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -17,7 +17,6 @@ #include "CalendarMgr.h" #include "QueryResult.h" -#include "DatabaseEnv.h" #include "Log.h" #include "Player.h" #include "GuildMgr.h" @@ -128,6 +127,12 @@ void CalendarMgr::AddEvent(CalendarEvent* calendarEvent, CalendarSendEventType s void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite) { + SQLTransaction dummy; + AddInvite(calendarEvent, invite, dummy); +} + +void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite, SQLTransaction& trans) +{ if (!calendarEvent->IsGuildAnnouncement()) SendCalendarEventInvite(*invite); @@ -137,7 +142,7 @@ void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite if (!calendarEvent->IsGuildAnnouncement()) { _invites[invite->GetEventId()].push_back(invite); - UpdateInvite(invite); + UpdateInvite(invite, trans); } } @@ -221,7 +226,6 @@ void CalendarMgr::RemoveInvite(uint64 inviteId, uint64 eventId, uint64 /*remover void CalendarMgr::UpdateEvent(CalendarEvent* calendarEvent) { - SQLTransaction trans = CharacterDatabase.BeginTransaction(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CALENDAR_EVENT); stmt->setUInt64(0, calendarEvent->GetEventId()); stmt->setUInt32(1, GUID_LOPART(calendarEvent->GetCreatorGUID())); @@ -232,13 +236,17 @@ void CalendarMgr::UpdateEvent(CalendarEvent* calendarEvent) stmt->setUInt32(6, uint32(calendarEvent->GetEventTime())); stmt->setUInt32(7, calendarEvent->GetFlags()); stmt->setUInt32(8, calendarEvent->GetTimeZoneTime()); // correct? - trans->Append(stmt); - CharacterDatabase.CommitTransaction(trans); + CharacterDatabase.Execute(stmt); } void CalendarMgr::UpdateInvite(CalendarInvite* invite) { - SQLTransaction trans = CharacterDatabase.BeginTransaction(); + SQLTransaction dummy; + UpdateInvite(invite, dummy); +} + +void CalendarMgr::UpdateInvite(CalendarInvite* invite, SQLTransaction& trans) +{ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CALENDAR_INVITE); stmt->setUInt64(0, invite->GetInviteId()); stmt->setUInt64(1, invite->GetEventId()); @@ -248,8 +256,7 @@ void CalendarMgr::UpdateInvite(CalendarInvite* invite) stmt->setUInt32(5, uint32(invite->GetStatusTime())); stmt->setUInt8(6, invite->GetRank()); stmt->setString(7, invite->GetText()); - trans->Append(stmt); - CharacterDatabase.CommitTransaction(trans); + CharacterDatabase.ExecuteOrAppend(trans, stmt); } void CalendarMgr::RemoveAllPlayerEventsAndInvites(uint64 guid) diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h index da185d519d5..8f44b013e5c 100644 --- a/src/server/game/Calendar/CalendarMgr.h +++ b/src/server/game/Calendar/CalendarMgr.h @@ -20,6 +20,7 @@ #include <ace/Singleton.h> #include "Common.h" +#include "DatabaseEnv.h" #include "WorldPacket.h" enum CalendarMailAnswers @@ -305,8 +306,10 @@ class CalendarMgr void UpdateEvent(CalendarEvent* calendarEvent); void AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite); + void AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite, SQLTransaction& trans); void RemoveInvite(uint64 inviteId, uint64 eventId, uint64 remover); void UpdateInvite(CalendarInvite* invite); + void UpdateInvite(CalendarInvite* invite, SQLTransaction& trans); void RemoveAllPlayerEventsAndInvites(uint64 guid); void RemovePlayerGuildEventsAndSignups(uint64 guid, uint32 guildId); diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h index 9ad6877d929..115e340762e 100644 --- a/src/server/game/Chat/Channels/Channel.h +++ b/src/server/game/Chat/Channels/Channel.h @@ -25,7 +25,7 @@ #include "Common.h" -#include "Opcodes.h" +#include "WorldSession.h" #include "WorldPacket.h" class Player; diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 9b0465a4536..44f03b6978d 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -139,6 +139,7 @@ DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt); DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore(OverrideSpellDatafmt); +DBCStorage <PowerDisplayEntry> sPowerDisplayStore(PowerDisplayfmt); DBCStorage <PvPDifficultyEntry> sPvPDifficultyStore(PvPDifficultyfmt); DBCStorage <QuestSortEntry> sQuestSortStore(QuestSortEntryfmt); @@ -391,6 +392,7 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales, bad_dbc_files, sOverrideSpellDataStore, dbcPath, "OverrideSpellData.dbc"); + LoadDBC(availableDbcLocales, bad_dbc_files, sPowerDisplayStore, dbcPath, "PowerDisplay.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sPvPDifficultyStore, dbcPath, "PvpDifficulty.dbc"); for (uint32 i = 0; i < sPvPDifficultyStore.GetNumRows(); ++i) if (PvPDifficultyEntry const* entry = sPvPDifficultyStore.LookupEntry(i)) diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index b77db950541..fe775dfda19 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -141,6 +141,7 @@ extern DBCStorage <MapEntry> sMapStore; extern MapDifficultyMap sMapDifficultyMap; extern DBCStorage <MovieEntry> sMovieStore; extern DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore; +extern DBCStorage <PowerDisplayEntry> sPowerDisplayStore; extern DBCStorage <QuestSortEntry> sQuestSortStore; extern DBCStorage <QuestXPEntry> sQuestXPStore; extern DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index abe7bde4bf5..5d6c8c7aa89 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1398,6 +1398,16 @@ struct OverrideSpellDataEntry //uint32 unk0; // 11 }; +struct PowerDisplayEntry +{ + uint32 Id; // 0 + uint32 PowerType; // 1 + //char* Name; // 2 + //uint32 R; // 3 + //uint32 G; // 4 + //uint32 B; // 5 +}; + struct PvPDifficultyEntry { //uint32 id; // 0 m_ID @@ -1982,7 +1992,7 @@ struct VehicleEntry uint32 m_uiLocomotionType; // 34 float m_msslTrgtImpactTexRadius; // 35 uint32 m_uiSeatIndicatorType; // 36 - uint32 m_powerType; // 37, new in 3.1 + uint32 m_powerDisplayId; // 37, new in 3.1 // 38, new in 3.1 // 39, new in 3.1 }; diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 35a8eecb708..222353467f4 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -91,6 +91,7 @@ char const OverrideSpellDatafmt[] = "niiiiiiiiiix"; char const QuestFactionRewardfmt[] = "niiiiiiiiii"; char const QuestSortEntryfmt[] = "nxxxxxxxxxxxxxxxxx"; char const QuestXPfmt[] = "niiiiiiiiii"; +char const PowerDisplayfmt[] = "nixxxx"; char const PvPDifficultyfmt[] = "diiiii"; char const RandomPropertiesPointsfmt[] = "niiiiiiiiiiiiiii"; char const ScalingStatDistributionfmt[] = "niiiiiiiiiiiiiiiiiiiii"; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 36997eb884a..90527912efd 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -111,11 +111,11 @@ uint32 CreatureTemplate::GetFirstValidModelId() const bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { - if (Unit* victim = Unit::GetUnit(m_owner, m_victim)) + if (Unit* victim = ObjectAccessor::GetUnit(m_owner, m_victim)) { while (!m_assistants.empty()) { - Creature* assistant = Unit::GetCreature(m_owner, *m_assistants.begin()); + Creature* assistant = ObjectAccessor::GetCreature(m_owner, *m_assistants.begin()); m_assistants.pop_front(); if (assistant && assistant->CanAssistTo(&m_owner, victim)) @@ -569,7 +569,7 @@ void Creature::Update(uint32 diff) if (getPowerType() == POWER_ENERGY) { - if (!IsVehicle() || GetVehicleKit()->GetVehicleInfo()->m_powerType != POWER_PYRITE) + if (!IsVehicle() || GetVehicleKit()->GetVehicleInfo()->m_powerDisplayId != POWER_PYRITE) Regenerate(POWER_ENERGY); } else diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 8051c757bf2..4cf7d34cc11 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -526,7 +526,7 @@ void GameObject::Update(uint32 diff) { case GAMEOBJECT_TYPE_DOOR: case GAMEOBJECT_TYPE_BUTTON: - if (GetGOInfo()->GetAutoCloseTime() && (m_cooldownTime < time(NULL))) + if (m_cooldownTime && (m_cooldownTime < time(NULL))) ResetDoorOrButton(); break; case GAMEOBJECT_TYPE_GOOBER: @@ -561,17 +561,19 @@ void GameObject::Update(uint32 diff) CastSpell(NULL, goInfo->trap.spellId); SetLootState(GO_JUST_DEACTIVATED); } - else if (Unit* target = Unit::GetUnit(*this, m_lootStateUnitGUID)) + else if (Unit* target = ObjectAccessor::GetUnit(*this, m_lootStateUnitGUID)) { // Some traps do not have a spell but should be triggered if (goInfo->trap.spellId) CastSpell(target, goInfo->trap.spellId); // Template value or 4 seconds - m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)); + m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)); if (goInfo->trap.type == 1) SetLootState(GO_JUST_DEACTIVATED); + else if (!goInfo->trap.type) + SetLootState(GO_READY); // Battleground gameobjects have data2 == 0 && data5 == 3 if (!goInfo->trap.diameter && goInfo->trap.cooldown == 3) @@ -1098,7 +1100,7 @@ void GameObject::UseDoorOrButton(uint32 time_to_restore, bool alternative /* = f SwitchDoorOrButton(true, alternative); SetLootState(GO_ACTIVATED, user); - m_cooldownTime = time(NULL) + time_to_restore; + m_cooldownTime = time_to_restore ? (time(NULL) + time_to_restore) : 0; } void GameObject::SetGoArtKit(uint8 kit) @@ -2011,6 +2013,10 @@ void GameObject::SetLootState(LootState state, Unit* unit) m_lootStateUnitGUID = unit ? unit->GetGUID() : 0; AI()->OnStateChanged(state, unit); sScriptMgr->OnGameObjectLootStateChanged(this, state, unit); + + if (GetGoType() == GAMEOBJECT_TYPE_DOOR) // only set collision for doors on SetGoState + return; + if (m_model) { bool collision = false; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index ee389ed7311..4573b85c7f3 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -27,7 +27,7 @@ #include "ScriptMgr.h" #include "ConditionMgr.h" #include "Player.h" -#include "Opcodes.h" +#include "WorldSession.h" void AddItemsSetItem(Player* player, Item* item) { diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index eb4e2fcf2ee..768f5907c19 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -30,7 +30,7 @@ #include "Unit.h" #include "Util.h" #include "Group.h" -#include "Opcodes.h" +#include "WorldSession.h" #define PET_XP_FACTOR 0.05f diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a701e6fc38f..fdb0b526363 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -144,6 +144,8 @@ enum CharacterCustomizeFlags static uint32 copseReclaimDelay[MAX_DEATH_COUNT] = { 30, 60, 120 }; +uint32 const MAX_MONEY_AMOUNT = static_cast<uint32>(std::numeric_limits<int32>::max()); + // == PlayerTaxi ================================================ PlayerTaxi::PlayerTaxi() @@ -364,6 +366,12 @@ void TradeData::SetMoney(uint32 money) if (m_money == money) return; + if (!m_player->HasEnoughMoney(money)) + { + m_player->GetSession()->SendTradeStatus(TRADE_STATUS_BUSY); + return; + } + m_money = money; SetAccepted(false); @@ -681,6 +689,8 @@ Player::Player(WorldSession* session): Unit(true) m_areaUpdateId = 0; m_team = 0; + + m_needsZoneUpdate = false; m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); @@ -5930,32 +5940,33 @@ float Player::OCTRegenMPPerSpirit() void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply) { + float oldRating = m_baseRatingValue[cr]; m_baseRatingValue[cr]+=(apply ? value : -value); - // explicit affected values - switch (cr) - { - case CR_HASTE_MELEE: - { - float RatingChange = value * GetRatingMultiplier(cr); - ApplyAttackTimePercentMod(BASE_ATTACK, RatingChange, apply); - ApplyAttackTimePercentMod(OFF_ATTACK, RatingChange, apply); - break; - } - case CR_HASTE_RANGED: - { - float RatingChange = value * GetRatingMultiplier(cr); - ApplyAttackTimePercentMod(RANGED_ATTACK, RatingChange, apply); - break; - } - case CR_HASTE_SPELL: - { - float RatingChange = value * GetRatingMultiplier(cr); - ApplyCastTimePercentMod(RatingChange, apply); - break; + if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL) + { + float const mult = GetRatingMultiplier(cr); + float const oldVal = oldRating * mult; + float const newVal = m_baseRatingValue[cr] * mult; + switch (cr) + { + case CR_HASTE_MELEE: + ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false); + ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false); + ApplyAttackTimePercentMod(BASE_ATTACK, newVal, true); + ApplyAttackTimePercentMod(OFF_ATTACK, newVal, true); + break; + case CR_HASTE_RANGED: + ApplyAttackTimePercentMod(RANGED_ATTACK, oldVal, false); + ApplyAttackTimePercentMod(RANGED_ATTACK, newVal, true); + break; + case CR_HASTE_SPELL: + ApplyCastTimePercentMod(oldVal, false); + ApplyCastTimePercentMod(newVal, true); + break; + default: // shut up compiler warnings + break; } - default: - break; } UpdateRating(cr); @@ -6749,6 +6760,15 @@ bool Player::UpdatePosition(float x, float y, float z, float orientation, bool t // mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING); //AURA_INTERRUPT_FLAG_JUMP not sure + // Update player zone if needed + if (m_needsZoneUpdate) + { + uint32 newZone, newArea; + GetZoneAndAreaId(newZone, newArea); + UpdateZone(newZone, newArea); + m_needsZoneUpdate = false; + } + // group update if (GetGroup()) SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); @@ -7472,6 +7492,19 @@ void Player::UpdateArea(uint32 newArea) } else RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY); + + uint32 const areaRestFlag = (GetTeam() == ALLIANCE) ? AREA_FLAG_REST_ZONE_ALLIANCE : AREA_FLAG_REST_ZONE_HORDE; + if (area && area->flags & areaRestFlag) + { + SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); + SetRestType(REST_TYPE_IN_FACTION_AREA); + InnEnter(time(0), GetMapId(), 0, 0, 0); + } + else if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) && GetRestType() == REST_TYPE_IN_FACTION_AREA) + { + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); + SetRestType(REST_TYPE_NO); + } } void Player::UpdateZone(uint32 newZone, uint32 newArea) @@ -7557,8 +7590,9 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) SetRestType(REST_TYPE_NO); } } - else // Recently left a capital city + else if (GetRestType() != REST_TYPE_IN_FACTION_AREA) // handled in UpdateArea { + // Recently left a capital city RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING); SetRestType(REST_TYPE_NO); } @@ -8193,7 +8227,12 @@ void Player::_ApplyWeaponDependentAuraDamageMod(Item* item, WeaponAttackType att { HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply); if (unitModType == TOTAL_VALUE) - ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply); + { + if (aura->GetAmount() > 0) + ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply); + else + ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, aura->GetAmount(), apply); + } } } @@ -22639,7 +22678,7 @@ bool Player::ModifyMoney(int32 amount, bool sendError /*= true*/) SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0); else { - if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount)) + if (GetMoney() < MAX_MONEY_AMOUNT - static_cast<uint32>(amount)) SetMoney(GetMoney() + amount); else { @@ -23919,7 +23958,7 @@ uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const return GetBaseSkillValue(skill); } -void Player::ResurectUsingRequestData() +void Player::ResurrectUsingRequestData() { /// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 92691c3fd45..52674032c0a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -29,6 +29,7 @@ #include "SpellMgr.h" #include "Unit.h" +#include <limits> #include <string> #include <vector> @@ -728,9 +729,10 @@ class InstanceSave; enum RestType { - REST_TYPE_NO = 0, - REST_TYPE_IN_TAVERN = 1, - REST_TYPE_IN_CITY = 2 + REST_TYPE_NO = 0, + REST_TYPE_IN_TAVERN = 1, + REST_TYPE_IN_CITY = 2, + REST_TYPE_IN_FACTION_AREA = 3 // used with AREA_FLAG_REST_ZONE_* }; enum TeleportToOptions @@ -824,7 +826,8 @@ enum PlayerDelayedOperations // Player summoning auto-decline time (in secs) #define MAX_PLAYER_SUMMON_DELAY (2*MINUTE) -#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1) +// Maximum money amount : 2^31 - 1 +extern uint32 const MAX_MONEY_AMOUNT; struct InstancePlayerBind { @@ -1652,9 +1655,9 @@ class Player : public Unit, public GridObject<Player> void setResurrectRequestData(uint64 guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana); void clearResurrectRequestData() { setResurrectRequestData(0, 0, 0.0f, 0.0f, 0.0f, 0, 0); } - bool isRessurectRequestedBy(uint64 guid) const { return m_resurrectGUID == guid; } - bool isRessurectRequested() const { return m_resurrectGUID != 0; } - void ResurectUsingRequestData(); + bool isResurrectRequestedBy(uint64 guid) const { return m_resurrectGUID == guid; } + bool isResurrectRequested() const { return m_resurrectGUID != 0; } + void ResurrectUsingRequestData(); uint8 getCinematic() { return m_cinematic; } void setCinematic(uint8 cine) { m_cinematic = cine; } @@ -1672,7 +1675,8 @@ class Player : public Unit, public GridObject<Player> void UpdatePvP(bool state, bool override=false); void UpdateZone(uint32 newZone, uint32 newArea); void UpdateArea(uint32 newArea); - + void SetNeedsZoneUpdate(bool needsUpdate) { m_needsZoneUpdate = needsUpdate; } + void UpdateZoneDependentAuras(uint32 zone_id); // zones void UpdateAreaDependentAuras(uint32 area_id); // subzones @@ -2558,6 +2562,8 @@ class Player : public Unit, public GridObject<Player> bool IsAlwaysDetectableFor(WorldObject const* seer) const; uint8 m_grantableLevels; + + bool m_needsZoneUpdate; private: // internal common parts for CanStore/StoreItem functions diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index 8c8e470f80b..25315a30da1 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -19,7 +19,7 @@ #include "SocialMgr.h" #include "DatabaseEnv.h" -#include "Opcodes.h" +#include "WorldSession.h" #include "WorldPacket.h" #include "Player.h" #include "ObjectMgr.h" diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index fd45c3fc596..8bc07732bb6 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -85,8 +85,8 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa _triggeredDepartureEvent = false; m_goValue.Transport.PathProgress = 0; - SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size); - SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction); + SetObjectScale(goinfo->size); + SetFaction(goinfo->faction); SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags); SetPeriod(tInfo->pathTime); SetEntry(goinfo->entry); @@ -210,8 +210,14 @@ void Transport::Update(uint32 diff) 3. transport moves from active to inactive grid 4. the grid that transport is currently in unloads */ - if (_staticPassengers.empty() && GetMap()->IsGridLoaded(GetPositionX(), GetPositionY())) // 2. + bool gridActive = GetMap()->IsGridLoaded(GetPositionX(), GetPositionY()); + + if (_staticPassengers.empty() && gridActive) // 2. LoadStaticPassengers(); + else if (!_staticPassengers.empty() && !gridActive) + // 4. - if transports stopped on grid edge, some passengers can remain in active grids + // unload all static passengers otherwise passengers won't load correctly when the grid that transport is currently in becomes active + UnloadStaticPassengers(); } } @@ -450,6 +456,7 @@ TempSummon* Transport::SummonPassenger(uint32 entry, Position const& pos, TempSu void Transport::UpdatePosition(float x, float y, float z, float o) { bool newActive = GetMap()->IsGridLoaded(x, y); + Cell oldCell(GetPositionX(), GetPositionY()); Relocate(x, y, z, o); UpdateModelPosition(); @@ -464,7 +471,7 @@ void Transport::UpdatePosition(float x, float y, float z, float o) */ if (_staticPassengers.empty() && newActive) // 1. LoadStaticPassengers(); - else if (!_staticPassengers.empty() && !newActive && Cell(x, y).DiffGrid(Cell(GetPositionX(), GetPositionY()))) // 3. + else if (!_staticPassengers.empty() && !newActive && oldCell.DiffGrid(Cell(GetPositionX(), GetPositionY()))) // 3. UnloadStaticPassengers(); else UpdatePassengerPositions(_staticPassengers); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 00172face5f..4efa1374ec7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -774,7 +774,8 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam if (damagetype != NODAMAGE && damage) { - if (victim != this && victim->GetTypeId() == TYPEID_PLAYER) // does not support creature push_back + if (victim != this && victim->GetTypeId() == TYPEID_PLAYER && // does not support creature push_back + (!spellProto || !(spellProto->AttributesEx7 & SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE))) { if (damagetype != DOT) if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL]) @@ -977,86 +978,90 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask); uint32 crTypeMask = victim->GetCreatureTypeMask(); - if (IsDamageReducedByArmor(damageSchoolMask, spellInfo)) - damage = CalcArmorReducedDamage(victim, damage, spellInfo, attackType); - - bool blocked = false; - // Per-school calc - switch (spellInfo->DmgClass) + // Spells with SPELL_ATTR4_FIXED_DAMAGE ignore resilience because their damage is based off another spell's damage. + if (!(spellInfo->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE)) { - // Melee and Ranged Spells - case SPELL_DAMAGE_CLASS_RANGED: - case SPELL_DAMAGE_CLASS_MELEE: + if (IsDamageReducedByArmor(damageSchoolMask, spellInfo)) + damage = CalcArmorReducedDamage(victim, damage, spellInfo, attackType); + + bool blocked = false; + // Per-school calc + switch (spellInfo->DmgClass) { - // Physical Damage - if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL) + // Melee and Ranged Spells + case SPELL_DAMAGE_CLASS_RANGED: + case SPELL_DAMAGE_CLASS_MELEE: { - // Get blocked status - blocked = isSpellBlocked(victim, spellInfo, attackType); - } + // Physical Damage + if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL) + { + // Get blocked status + blocked = isSpellBlocked(victim, spellInfo, attackType); + } - if (crit) - { - damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT; - - // Calculate crit bonus - uint32 crit_bonus = damage; - // Apply crit_damage bonus for melee spells - if (Player* modOwner = GetSpellModOwner()) - modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus); - damage += crit_bonus; - - // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE - float critPctDamageMod = 0.0f; - if (attackType == RANGED_ATTACK) - critPctDamageMod += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE); - else - critPctDamageMod += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE); + if (crit) + { + damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT; + + // Calculate crit bonus + uint32 crit_bonus = damage; + // Apply crit_damage bonus for melee spells + if (Player* modOwner = GetSpellModOwner()) + modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus); + damage += crit_bonus; + + // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE + float critPctDamageMod = 0.0f; + if (attackType == RANGED_ATTACK) + critPctDamageMod += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE); + else + critPctDamageMod += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE); - // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS - critPctDamageMod += (GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask()) - 1.0f) * 100; + // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS + critPctDamageMod += (GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask()) - 1.0f) * 100; - // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS - critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, crTypeMask); + // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS + critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, crTypeMask); - if (critPctDamageMod != 0) - AddPct(damage, critPctDamageMod); - } + if (critPctDamageMod != 0) + AddPct(damage, critPctDamageMod); + } - // Spell weapon based damage CAN BE crit & blocked at same time - if (blocked) - { - damageInfo->blocked = victim->GetShieldBlockValue(); - // double blocked amount if block is critical - if (victim->isBlockCritical()) - damageInfo->blocked += damageInfo->blocked; - if (damage < int32(damageInfo->blocked)) - damageInfo->blocked = uint32(damage); - damage -= damageInfo->blocked; - } + // Spell weapon based damage CAN BE crit & blocked at same time + if (blocked) + { + damageInfo->blocked = victim->GetShieldBlockValue(); + // double blocked amount if block is critical + if (victim->isBlockCritical()) + damageInfo->blocked += damageInfo->blocked; + if (damage < int32(damageInfo->blocked)) + damageInfo->blocked = uint32(damage); + damage -= damageInfo->blocked; + } - if (attackType != RANGED_ATTACK) - ApplyResilience(victim, NULL, &damage, crit, CR_CRIT_TAKEN_MELEE); - else - ApplyResilience(victim, NULL, &damage, crit, CR_CRIT_TAKEN_RANGED); - break; - } - // Magical Attacks - case SPELL_DAMAGE_CLASS_NONE: - case SPELL_DAMAGE_CLASS_MAGIC: - { - // If crit add critical bonus - if (crit) - { - damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT; - damage = SpellCriticalDamageBonus(spellInfo, damage, victim); + if (attackType != RANGED_ATTACK) + ApplyResilience(victim, NULL, &damage, crit, CR_CRIT_TAKEN_MELEE); + else + ApplyResilience(victim, NULL, &damage, crit, CR_CRIT_TAKEN_RANGED); + break; } + // Magical Attacks + case SPELL_DAMAGE_CLASS_NONE: + case SPELL_DAMAGE_CLASS_MAGIC: + { + // If crit add critical bonus + if (crit) + { + damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT; + damage = SpellCriticalDamageBonus(spellInfo, damage, victim); + } - ApplyResilience(victim, NULL, &damage, crit, CR_CRIT_TAKEN_SPELL); - break; + ApplyResilience(victim, NULL, &damage, crit, CR_CRIT_TAKEN_SPELL); + break; + } + default: + break; } - default: - break; } // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations @@ -1834,14 +1839,15 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage())); dmgInfo.AbsorbDamage(splitDamage); - uint32 splitted = splitDamage; uint32 split_absorb = 0; - DealDamageMods(caster, splitted, &split_absorb); + DealDamageMods(caster, splitDamage, &split_absorb); - SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitted, schoolMask, split_absorb, 0, false, 0, false); + SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitDamage, schoolMask, split_absorb, 0, false, 0, false); - CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL); - DealDamage(caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false); + CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL); + DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false); + // break 'Fear' and similar auras + caster->ProcDamageAndSpellFor(true, this, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_NORMAL_HIT, BASE_ATTACK, (*itr)->GetSpellInfo(), splitDamage); } } @@ -9842,11 +9848,6 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin if (spellProto->AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS) return pdamage; - // small exception for Deep Wounds, can't find any general rule - // should ignore ALL damage mods, they already calculated in trigger spell - if (spellProto->Id == 12721) // Deep Wounds - return pdamage; - // For totems get damage bonus from owner if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsTotem()) if (Unit* owner = GetOwner()) @@ -9862,7 +9863,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank); // Some spells don't benefit from pct done mods - if (!(spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS) && !spellProto->IsRankOf(sSpellMgr->GetSpellInfo(12162))) + if (!(spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS)) { AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i) @@ -10259,19 +10260,16 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui int32 TakenTotal = 0; float TakenTotalMod = 1.0f; float TakenTotalCasterMod = 0.0f; - - // get all auras from caster that allow the spell to ignore resistance (sanctified wrath) - AuraEffectList const& IgnoreResistAuras = caster->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); - for (AuraEffectList::const_iterator i = IgnoreResistAuras.begin(); i != IgnoreResistAuras.end(); ++i) + + // Mod damage from spell mechanic + if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask()) { - if ((*i)->GetMiscValue() & spellProto->GetSchoolMask()) - TakenTotalCasterMod += (float((*i)->GetAmount())); + AuraEffectList const& mDamageDoneMechanic = GetAuraEffectsByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); + for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i) + if (mechanicMask & uint32(1 << ((*i)->GetMiscValue()))) + AddPct(TakenTotalMod, (*i)->GetAmount()); } - // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN - // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) - TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask()); - //.. taken pct: dummy auras AuraEffectList const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY); for (AuraEffectList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i) @@ -10290,45 +10288,51 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui break; } } + // Spells with SPELL_ATTR4_FIXED_DAMAGE should only benefit from mechanic damage mod auras. + if (!(spellProto->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE)) + { + // get all auras from caster that allow the spell to ignore resistance (sanctified wrath) + AuraEffectList const& IgnoreResistAuras = caster->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); + for (AuraEffectList::const_iterator i = IgnoreResistAuras.begin(); i != IgnoreResistAuras.end(); ++i) + { + if ((*i)->GetMiscValue() & spellProto->GetSchoolMask()) + TakenTotalCasterMod += (float((*i)->GetAmount())); + } - // From caster spells - AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); - for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) - if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto)) - AddPct(TakenTotalMod, (*i)->GetAmount()); + // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN + // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) + TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto->GetSchoolMask()); - // Mod damage from spell mechanic - if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask()) - { - AuraEffectList const& mDamageDoneMechanic = GetAuraEffectsByType(SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT); - for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i) - if (mechanicMask & uint32(1<<((*i)->GetMiscValue()))) + // From caster spells + AuraEffectList const& mOwnerTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_FROM_CASTER); + for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i) + if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto)) AddPct(TakenTotalMod, (*i)->GetAmount()); - } - - int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask()); - // Check for table values - float coeff = 0; - SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); - if (bonus) - coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage; + int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask()); - // Default calculation - if (TakenAdvertisedBenefit) - { - if (!bonus || coeff < 0) - coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack); + // Check for table values + float coeff = 0; + SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); + if (bonus) + coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage; - float factorMod = CalculateLevelPenalty(spellProto) * stack; - // level penalty still applied on Taken bonus - is it blizzlike? - if (Player* modOwner = GetSpellModOwner()) + // Default calculation + if (TakenAdvertisedBenefit) { - coeff *= 100.0f; - modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff); - coeff /= 100.0f; + if (!bonus || coeff < 0) + coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack); + + float factorMod = CalculateLevelPenalty(spellProto) * stack; + // level penalty still applied on Taken bonus - is it blizzlike? + if (Player* modOwner = GetSpellModOwner()) + { + coeff *= 100.0f; + modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff); + coeff /= 100.0f; + } + TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod); } - TakenTotal+= int32(TakenAdvertisedBenefit * coeff * factorMod); } float tmpDamage = 0.0f; @@ -12988,21 +12992,6 @@ float Unit::GetSpellMinRangeForTarget(Unit const* target, SpellInfo const* spell return spellInfo->GetMinRange(!IsHostileTo(target)); } -Unit* Unit::GetUnit(WorldObject& object, uint64 guid) -{ - return ObjectAccessor::GetUnit(object, guid); -} - -Player* Unit::GetPlayer(WorldObject& object, uint64 guid) -{ - return ObjectAccessor::GetPlayer(object, guid); -} - -Creature* Unit::GetCreature(WorldObject& object, uint64 guid) -{ - return object.GetMap()->GetCreature(guid); -} - uint32 Unit::GetCreatureType() const { if (GetTypeId() == TYPEID_PLAYER) @@ -15248,8 +15237,8 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) // update get killing blow achievements, must be done before setDeathState to be able to require auras on target // and before Spirit of Redemption as it also removes auras - if (player) - player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim); + if (Player* killerPlayer = GetCharmerOrOwnerPlayerOrPlayerItself()) + killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim); // if talent known but not triggered (check priest class for speedup check) bool spiritOfRedemption = false; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 9926403f7af..1735d1a8b8c 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2028,9 +2028,6 @@ class Unit : public WorldObject void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); } void removeFollower(FollowerReference* /*pRef*/) { /* nothing to do yet */ } - static Unit* GetUnit(WorldObject& object, uint64 guid); - static Player* GetPlayer(WorldObject& object, uint64 guid); - static Creature* GetCreature(WorldObject& object, uint64 guid); MotionMaster* GetMotionMaster() { return i_motionMaster; } const MotionMaster* GetMotionMaster() const { return i_motionMaster; } diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index fae4f0c6b6a..4c3724a8860 100755 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -76,42 +76,9 @@ Vehicle::~Vehicle() void Vehicle::Install() { - if (Creature* creature = _me->ToCreature()) - { - switch (_vehicleInfo->m_powerType) - { - case POWER_STEAM: - case POWER_HEAT: - case POWER_BLOOD: - case POWER_OOZE: - case POWER_WRATH: - _me->setPowerType(POWER_ENERGY); - _me->SetMaxPower(POWER_ENERGY, 100); - break; - case POWER_PYRITE: - _me->setPowerType(POWER_ENERGY); - _me->SetMaxPower(POWER_ENERGY, 50); - break; - default: - for (uint32 i = 0; i < MAX_SPELL_VEHICLE; ++i) - { - if (!creature->m_spells[i]) - continue; - - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creature->m_spells[i]); - if (!spellInfo) - continue; - - if (spellInfo->PowerType == POWER_ENERGY && spellInfo->CalcPowerCost(_me, spellInfo->GetSchoolMask()) > 0) - { - _me->setPowerType(POWER_ENERGY); - _me->SetMaxPower(POWER_ENERGY, 100); - break; - } - } - break; - } - } + if (_me->GetTypeId() == TYPEID_UNIT) + if (PowerDisplayEntry const* powerDisplay = sPowerDisplayStore.LookupEntry(_vehicleInfo->m_powerDisplayId)) + _me->setPowerType(Powers(powerDisplay->PowerType)); _status = STATUS_INSTALLED; if (GetBase()->GetTypeId() == TYPEID_UNIT) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 2905b0454c4..207f80eabe7 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3822,8 +3822,8 @@ void ObjectMgr::LoadQuests() "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, " // 117 118 119 120 121 122 123 124 125 126 127 128 129 "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4, DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4, " - // 130 131 132 133 134 135 136 137 138 139 140 - "EmoteOnIncomplete, EmoteOnComplete, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4, WDBVerified" + // 130 131 132 133 134 135 136 137 138 139 + "EmoteOnIncomplete, EmoteOnComplete, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4" " FROM quest_template"); if (!result) { diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 48c9e618a1d..ba5940d7e12 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -432,7 +432,7 @@ struct BroadcastText uint32 SoundId; uint32 Unk1; uint32 Unk2; - // uint32 WDBVerified; + // uint32 VerifiedBuild; std::string const& GetText(LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false) const { diff --git a/src/server/game/Grids/GridStates.cpp b/src/server/game/Grids/GridStates.cpp index 8b57c382cd7..3e085f1f381 100644 --- a/src/server/game/Grids/GridStates.cpp +++ b/src/server/game/Grids/GridStates.cpp @@ -20,18 +20,6 @@ #include "GridNotifiers.h" #include "Log.h" -#ifdef TRINITY_DEBUG -bool GridState::checkMagic() -{ - if (i_Magic != MAGIC_TESTVAL) - { - TC_LOG_ERROR("misc", "!!! GridState: Magic value gone !!!"); - return false; - } - return true; -} -#endif - void InvalidState::Update(Map&, NGridType&, GridInfo&, uint32) const { } diff --git a/src/server/game/Grids/GridStates.h b/src/server/game/Grids/GridStates.h index 016df4dc3d4..af11ab08d5e 100644 --- a/src/server/game/Grids/GridStates.h +++ b/src/server/game/Grids/GridStates.h @@ -27,13 +27,6 @@ class Map; class GridState { public: -#ifdef TRINITY_DEBUG -#define MAGIC_TESTVAL 0xFBE823BA - GridState() { i_Magic = MAGIC_TESTVAL; } - bool checkMagic(); - void setMagic() { i_Magic = MAGIC_TESTVAL; } - unsigned int i_Magic; -#endif virtual ~GridState() { }; virtual void Update(Map &, NGridType&, GridInfo &, uint32 t_diff) const = 0; }; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index f448fbb9f19..db0a196dec6 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -754,7 +754,7 @@ int32 Guild::Member::GetBankWithdrawValue(uint8 tabId) const { // Guild master has unlimited amount. if (IsRank(GR_GUILDMASTER)) - return tabId == GUILD_BANK_MAX_TABS ? GUILD_WITHDRAW_MONEY_UNLIMITED : GUILD_WITHDRAW_SLOT_UNLIMITED; + return static_cast<int32>(tabId == GUILD_BANK_MAX_TABS ? GUILD_WITHDRAW_MONEY_UNLIMITED : GUILD_WITHDRAW_SLOT_UNLIMITED); return m_bankWithdraw[tabId]; } @@ -1760,7 +1760,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount) bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool repair) { //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway - amount = std::min(amount, uint32(MAX_MONEY_AMOUNT)); + amount = std::min(amount, MAX_MONEY_AMOUNT); if (m_bankMoney < amount) // Not enough money in bank return false; @@ -2581,7 +2581,7 @@ inline int32 Guild::_GetMemberRemainingSlots(Member const* member, uint8 tabId) { uint8 rankId = member->GetRankId(); if (rankId == GR_GUILDMASTER) - return GUILD_WITHDRAW_SLOT_UNLIMITED; + return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED); if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0) { int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member->GetBankWithdrawValue(tabId); @@ -2598,7 +2598,7 @@ inline int32 Guild::_GetMemberRemainingMoney(Member const* member) const { uint8 rankId = member->GetRankId(); if (rankId == GR_GUILDMASTER) - return GUILD_WITHDRAW_MONEY_UNLIMITED; + return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED); if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0) { diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp index 632bd02def0..3bb3edac500 100644 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Handlers/ArenaTeamHandler.cpp @@ -121,6 +121,12 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket& recvData) return; } + if (GetPlayer()->GetArenaTeamId(arenaTeam->GetSlot()) != arenaTeamId) + { + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS); + return; + } + // OK result but don't send invite if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) return; diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 45d4d221d06..278c180c380 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -255,7 +255,14 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) uint32 inviteCount; recvData >> inviteCount; - for (uint32 i = 0; i < inviteCount; ++i) + SQLTransaction trans; + if (inviteCount > 1) + trans = CharacterDatabase.BeginTransaction(); + + // client limits the amount of players to be invited to 100 + const uint32 MaxPlayerInvites = 100; + + for (uint32 i = 0; i < inviteCount && i < MaxPlayerInvites; ++i) { uint64 invitee = 0; uint8 status = 0; @@ -265,8 +272,11 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) // 946684800 is 01/01/2000 00:00:00 - default response time CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEvent.GetEventId(), invitee, guid, 946684800, CalendarInviteStatus(status), CalendarModerationRank(rank), ""); - sCalendarMgr->AddInvite(&calendarEvent, invite); + sCalendarMgr->AddInvite(&calendarEvent, invite, trans); } + + if (inviteCount > 1) + CharacterDatabase.CommitTransaction(trans); } sCalendarMgr->AddEvent(new CalendarEvent(calendarEvent, calendarEvent.GetEventId()), CALENDAR_SENDTYPE_ADD); @@ -350,10 +360,15 @@ void WorldSession::HandleCalendarCopyEvent(WorldPacket& recvData) sCalendarMgr->AddEvent(newEvent, CALENDAR_SENDTYPE_COPY); CalendarInviteStore invites = sCalendarMgr->GetEventInvites(eventId); + SQLTransaction trans; + if (invites.size() > 1) + trans = CharacterDatabase.BeginTransaction(); for (CalendarInviteStore::const_iterator itr = invites.begin(); itr != invites.end(); ++itr) - sCalendarMgr->AddInvite(newEvent, new CalendarInvite(**itr, sCalendarMgr->GetFreeInviteId(), newEvent->GetEventId())); + sCalendarMgr->AddInvite(newEvent, new CalendarInvite(**itr, sCalendarMgr->GetFreeInviteId(), newEvent->GetEventId()), trans); + if (invites.size() > 1) + CharacterDatabase.CommitTransaction(trans); // should we change owner when somebody makes a copy of event owned by another person? } else diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index f4ea4971190..7d9d83abfde 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -243,8 +243,6 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) void WorldSession::HandleCharEnumOpcode(WorldPacket & /*recvData*/) { - AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, false); - // remove expired bans PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_BANS); CharacterDatabase.Execute(stmt); @@ -681,7 +679,6 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte data << uint8(CHAR_CREATE_SUCCESS); SendPacket(&data); - AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); std::string IP_str = GetRemoteAddress(); TC_LOG_INFO("entities.player.character", "Account: %d (IP: %s) Create Character:[%s] (GUID: %u)", GetAccountId(), IP_str.c_str(), createInfo->Name.c_str(), newChar.GetGUIDLow()); sScriptMgr->OnPlayerCreate(&newChar); @@ -758,8 +755,6 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData) WorldPacket data(SMSG_CHAR_DELETE, 1); data << uint8(CHAR_DELETE_SUCCESS); SendPacket(&data); - - AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); } void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) @@ -767,6 +762,7 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) if (PlayerLoading() || GetPlayer() != NULL) { TC_LOG_ERROR("network", "Player tryes to login again, AccountId = %d", GetAccountId()); + KickPlayer(); return; } @@ -1168,7 +1164,6 @@ void WorldSession::HandleCharRenameOpcode(WorldPacket& recvData) void WorldSession::HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string const& newName) { - AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); if (!result) { WorldPacket data(SMSG_CHAR_RENAME, 1); @@ -1426,8 +1421,6 @@ void WorldSession::HandleCharCustomize(WorldPacket& recvData) stmt->setUInt32(0, GUID_LOPART(guid)); // TODO: Make async with callback - // TODO 2: Allow opcode at end of callback - AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) @@ -1682,8 +1675,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData) uint8 playerClass = nameData->m_class; uint8 level = nameData->m_level; - // TO Do: Make async and allow opcode on callback - AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); + // TO Do: Make async PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_AT_LOGIN_TITLES); stmt->setUInt32(0, lowGuid); PreparedQueryResult result = CharacterDatabase.Query(stmt); diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index e0b29523a3a..eccf7a6fd38 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -269,7 +269,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData) } Player* receiver = sObjectAccessor->FindPlayerByName(to); - if (!receiver || (!receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))) + if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))) { SendPlayerNotFoundNotice(to); return; diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index c4b4b35bf37..0ca7885b82b 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -470,19 +470,6 @@ void WorldSession::HandleReadItem(WorldPacket& recvData) _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL); } -void WorldSession::HandlePageQuerySkippedOpcode(WorldPacket& recvData) -{ - TC_LOG_DEBUG("network", "WORLD: Received CMSG_PAGE_TEXT_QUERY"); - - uint32 itemid; - uint64 guid; - - recvData >> itemid >> guid; - - TC_LOG_INFO("network", "Packet Info: itemid: %u guidlow: %u guidentry: %u guidhigh: %u", - itemid, GUID_LOPART(guid), GUID_ENPART(guid), GUID_HIPART(guid)); -} - void WorldSession::HandleSellItemOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_SELL_ITEM"); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 1b04c89b338..11fa89d9d6b 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -186,11 +186,6 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_WHO Message"); - time_t now = time(NULL); - if (now - timeLastWhoCommand < 5) - return; - else timeLastWhoCommand = now; - uint32 matchcount = 0; uint32 level_min, level_max, racemask, classmask, zones_count, str_count; @@ -505,10 +500,9 @@ void WorldSession::HandleZoneUpdateOpcode(WorldPacket& recvData) TC_LOG_DEBUG("network", "WORLD: Recvd ZONE_UPDATE: %u", newZone); - // use server size data - uint32 newzone, newarea; - GetPlayer()->GetZoneAndAreaId(newzone, newarea); - GetPlayer()->UpdateZone(newzone, newarea); + // use server side data, but only after update the player position. See Player::UpdatePosition(). + GetPlayer()->SetNeedsZoneUpdate(true); + //GetPlayer()->SendInitWorldStates(true, newZone); } @@ -793,10 +787,10 @@ void WorldSession::HandleResurrectResponseOpcode(WorldPacket& recvData) return; } - if (!GetPlayer()->isRessurectRequestedBy(guid)) + if (!GetPlayer()->isResurrectRequestedBy(guid)) return; - GetPlayer()->ResurectUsingRequestData(); + GetPlayer()->ResurrectUsingRequestData(); } void WorldSession::SendAreaTriggerMessage(const char* Text, ...) diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index de08392b86a..dbcfb1c4970 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -405,19 +405,23 @@ void WorldSession::HandleQuestPOIQuery(WorldPacket& recvData) uint32 count; recvData >> count; // quest count, max=25 - if (count >= MAX_QUEST_LOG_SIZE) + if (count > MAX_QUEST_LOG_SIZE) { recvData.rfinish(); return; } - WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4+(4+4)*count); - data << uint32(count); // count - + // Read quest ids and add the in a unordered_set so we don't send POIs for the same quest multiple times + std::unordered_set<uint32> questIds; for (uint32 i = 0; i < count; ++i) + questIds.insert(recvData.read<uint32>()); // quest id + + WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4 + (4 + 4)*questIds.size()); + data << uint32(questIds.size()); // count + + for (auto itr = questIds.begin(); itr != questIds.end(); ++itr) { - uint32 questId; - recvData >> questId; // quest id + uint32 questId = *itr; bool questOk = false; diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp index 688d7e58b6c..a2aa426c096 100644 --- a/src/server/game/Handlers/TicketHandler.cpp +++ b/src/server/game/Handlers/TicketHandler.cpp @@ -187,6 +187,8 @@ void WorldSession::HandleGMSurveySubmit(WorldPacket& recvData) uint32 mainSurvey; // GMSurveyCurrentSurvey.dbc, column 1 (all 9) ref to GMSurveySurveys.dbc recvData >> mainSurvey; + std::unordered_set<uint32> surveyIds; + SQLTransaction trans = CharacterDatabase.BeginTransaction(); // sub_survey1, r1, comment1, sub_survey2, r2, comment2, sub_survey3, r3, comment3, sub_survey4, r4, comment4, sub_survey5, r5, comment5, sub_survey6, r6, comment6, sub_survey7, r7, comment7, sub_survey8, r8, comment8, sub_survey9, r9, comment9, sub_survey10, r10, comment10, for (uint8 i = 0; i < 10; i++) { @@ -200,12 +202,16 @@ void WorldSession::HandleGMSurveySubmit(WorldPacket& recvData) std::string comment; // comment ("Usage: GMSurveyAnswerSubmit(question, rank, comment)") recvData >> comment; + // make sure the same sub survey is not added to DB twice + if (!surveyIds.insert(subSurveyId).second) + continue; + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GM_SUBSURVEY); stmt->setUInt32(0, nextSurveyID); stmt->setUInt32(1, subSurveyId); stmt->setUInt32(2, rank); stmt->setString(3, comment); - CharacterDatabase.Execute(stmt); + trans->Append(stmt); } std::string comment; // just a guess @@ -217,7 +223,9 @@ void WorldSession::HandleGMSurveySubmit(WorldPacket& recvData) stmt->setUInt32(2, mainSurvey); stmt->setString(3, comment); - CharacterDatabase.Execute(stmt); + trans->Append(stmt); + + CharacterDatabase.CommitTransaction(trans); } void WorldSession::HandleReportLag(WorldPacket& recvData) diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 4372de9eafe..884c4a83b15 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -299,14 +299,14 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) return; } - if (_player->GetMoney() >= uint32(MAX_MONEY_AMOUNT) - his_trade->GetMoney()) + if (_player->GetMoney() >= MAX_MONEY_AMOUNT - his_trade->GetMoney()) { _player->SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL); my_trade->SetAccepted(false, true); return; } - if (trader->GetMoney() >= uint32(MAX_MONEY_AMOUNT) - my_trade->GetMoney()) + if (trader->GetMoney() >= MAX_MONEY_AMOUNT - my_trade->GetMoney()) { trader->SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL); his_trade->SetAccepted(false, true); @@ -686,7 +686,6 @@ void WorldSession::HandleSetTradeGoldOpcode(WorldPacket& recvPacket) if (!my_trade) return; - // gold can be incorrect, but this is checked at trade finished. my_trade->SetMoney(gold); } diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index 3973b23eab4..b3fa240e2d2 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -96,7 +96,7 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recvData) if (!accessory) GetPlayer()->ChangeSeat(-1, seatId > 0); // prev/next - else if (Unit* vehUnit = Unit::GetUnit(*GetPlayer(), accessory)) + else if (Unit* vehUnit = ObjectAccessor::GetUnit(*GetPlayer(), accessory)) { if (Vehicle* vehicle = vehUnit->GetVehicleKit()) if (vehicle->HasEmptySeat(seatId)) @@ -114,7 +114,7 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recvData) if (vehicle_base->GetGUID() == guid) GetPlayer()->ChangeSeat(seatId); - else if (Unit* vehUnit = Unit::GetUnit(*GetPlayer(), guid)) + else if (Unit* vehUnit = ObjectAccessor::GetUnit(*GetPlayer(), guid)) if (Vehicle* vehicle = vehUnit->GetVehicleKit()) if (vehicle->HasEmptySeat(seatId)) vehUnit->HandleSpellClick(GetPlayer(), seatId); diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 3050443edc0..9e11c566c22 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -243,7 +243,7 @@ AI* GetInstanceAI(T* obj, char const* scriptName) return new AI(obj); return NULL; -}; +} template<class AI, class T> AI* GetInstanceAI(T* obj) @@ -253,6 +253,6 @@ AI* GetInstanceAI(T* obj) return new AI(obj); return NULL; -}; +} #endif // TRINITY_INSTANCE_DATA_H diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index cd391299785..ba271235330 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1544,11 +1544,8 @@ void Map::UnloadAll() Transport* transport = *itr; ++itr; - transport->RemoveFromWorld(); - delete transport; + RemoveFromMap<Transport>(transport, true); } - - _transports.clear(); } // ***************************** @@ -2648,24 +2645,27 @@ void Map::RemoveAllObjectsInRemoveList() RemoveFromMap(corpse, true); break; } - case TYPEID_DYNAMICOBJECT: - RemoveFromMap((DynamicObject*)obj, true); - break; - case TYPEID_GAMEOBJECT: - if (Transport* transport = obj->ToGameObject()->ToTransport()) - RemoveFromMap(transport, true); - else - RemoveFromMap(obj->ToGameObject(), true); - break; - case TYPEID_UNIT: - // in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call - // make sure that like sources auras/etc removed before destructor start - obj->ToCreature()->CleanupsBeforeDelete(); - RemoveFromMap(obj->ToCreature(), true); - break; - default: - TC_LOG_ERROR("maps", "Non-grid object (TypeId: %u) is in grid object remove list, ignored.", obj->GetTypeId()); - break; + case TYPEID_DYNAMICOBJECT: + RemoveFromMap(obj->ToDynObject(), true); + break; + case TYPEID_GAMEOBJECT: + { + GameObject* go = obj->ToGameObject(); + if (Transport* transport = go->ToTransport()) + RemoveFromMap(transport, true); + else + RemoveFromMap(go, true); + break; + } + case TYPEID_UNIT: + // in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call + // make sure that like sources auras/etc removed before destructor start + obj->ToCreature()->CleanupsBeforeDelete(); + RemoveFromMap(obj->ToCreature(), true); + break; + default: + TC_LOG_ERROR("maps", "Non-grid object (TypeId: %u) is in grid object remove list, ignored.", obj->GetTypeId()); + break; } i_objectsToRemove.erase(itr); diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp index f3a5a66bf66..dd697719d54 100644 --- a/src/server/game/Maps/MapUpdater.cpp +++ b/src/server/game/Maps/MapUpdater.cpp @@ -6,34 +6,6 @@ #include <ace/Guard_T.h> #include <ace/Method_Request.h> -class WDBThreadStartReq1 : public ACE_Method_Request -{ - public: - - WDBThreadStartReq1() - { - } - - virtual int call() - { - return 0; - } -}; - -class WDBThreadEndReq1 : public ACE_Method_Request -{ - public: - - WDBThreadEndReq1() - { - } - - virtual int call() - { - return 0; - } -}; - class MapUpdateRequest : public ACE_Method_Request { private: @@ -67,7 +39,7 @@ MapUpdater::~MapUpdater() int MapUpdater::activate(size_t num_threads) { - return m_executor.start((int)num_threads, new WDBThreadStartReq1, new WDBThreadEndReq1); + return m_executor.start((int)num_threads); } int MapUpdater::deactivate() diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index eabc15d6ee7..34871085157 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1224,6 +1224,8 @@ enum TrinityStrings LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD = 11006, LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD = 11007, + LANG_NPCINFO_INHABIT_TYPE = 11008 + // NOT RESERVED IDS 12000-1999999999 // `db_script_string` table index 2000000000-2000009999 (MIN_DB_SCRIPT_STRING_ID-MAX_DB_SCRIPT_STRING_ID) // For other tables maybe 2000010000-2147483647 (max index) diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index b52e640afc7..4ec1d5750a4 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -427,7 +427,7 @@ enum SpellAttr4 SPELL_ATTR4_UNK5 = 0x00000020, // 5 SPELL_ATTR4_NOT_STEALABLE = 0x00000040, // 6 although such auras might be dispellable, they cannot be stolen SPELL_ATTR4_TRIGGERED = 0x00000080, // 7 spells forced to be triggered - SPELL_ATTR4_FIXED_DAMAGE = 0x00000100, // 8 ignores taken percent damage mods? + SPELL_ATTR4_FIXED_DAMAGE = 0x00000100, // 8 Ignores resilience and any (except mechanic related) damage or % damage taken auras on target. SPELL_ATTR4_TRIGGER_ACTIVATE = 0x00000200, // 9 initially disabled / trigger activate from event (Execute, Riposte, Deep Freeze end other) SPELL_ATTR4_SPELL_VS_EXTEND_COST = 0x00000400, // 10 Rogue Shiv have this flag SPELL_ATTR4_UNK11 = 0x00000800, // 11 @@ -533,7 +533,7 @@ enum SpellAttr7 SPELL_ATTR7_IS_CHEAT_SPELL = 0x00000008, // 3 Cannot cast if caster doesn't have UnitFlag2 & UNIT_FLAG2_ALLOW_CHEAT_SPELLS SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 47883 (Soulstone Resurrection) and test spell. SPELL_ATTR7_SUMMON_PLAYER_TOTEM = 0x00000020, // 5 Only Shaman player totems. - SPELL_ATTR7_UNK6 = 0x00000040, // 6 Dark Surge, Surge of Light, Burning Breath triggers (boss spells). + SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE = 0x00000040, // 6 Does not cause spell pushback on damage SPELL_ATTR7_UNK7 = 0x00000080, // 7 66218 (Launch) spell. SPELL_ATTR7_HORDE_ONLY = 0x00000100, // 8 Teleports, mounts and other spells. SPELL_ATTR7_ALLIANCE_ONLY = 0x00000200, // 9 Teleports, mounts and other spells. @@ -1129,7 +1129,7 @@ enum SpellCustomErrors SPELL_CUSTOM_ERROR_95 = 95, // "" SPELL_CUSTOM_ERROR_MAX_NUMBER_OF_RECRUITS = 96, // You already have the max number of recruits. SPELL_CUSTOM_ERROR_MAX_NUMBER_OF_VOLUNTEERS = 97, // You already have the max number of volunteers. - SPELL_CUSTOM_ERROR_FROSTMOURNE_RENDERED_RESSURECT = 98, // Frostmourne has rendered you unable to ressurect. + SPELL_CUSTOM_ERROR_FROSTMOURNE_RENDERED_RESURRECT = 98, // Frostmourne has rendered you unable to resurrect. SPELL_CUSTOM_ERROR_CANT_MOUNT_WITH_SHAPESHIFT = 99 // You can't mount while affected by that shapeshift. }; diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 9b3732d232b..099275ba8dc 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -137,7 +137,7 @@ Quest::Quest(Field* questRecord) for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) OfferRewardEmoteDelay[i] = questRecord[136+i].GetInt32(); - //int32 WDBVerified = questRecord[140].GetInt32(); + //int32 VerifiedBuild = questRecord[140].GetInt32(); if (SpecialFlags & QUEST_SPECIAL_FLAGS_AUTO_ACCEPT) Flags |= QUEST_FLAGS_AUTO_ACCEPT; diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index 69e677bd89d..46b73e74068 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -24,7 +24,7 @@ #include "World.h" #include "ObjectMgr.h" #include "ScriptMgr.h" -#include "Opcodes.h" +#include "WorldSession.h" const int32 ReputationMgr::PointsInRank[MAX_REPUTATION_RANK] = {36000, 3000, 3000, 3000, 6000, 12000, 21000, 1000}; diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index e581d7d1544..7b07abdf962 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -25,12 +25,6 @@ #include "Common.h" -// Note: this include need for be sure have full definition of class WorldSession -// if this class definition not complete then VS for x64 release use different size for -// struct OpcodeHandler in this header and Opcode.cpp and get totally wrong data from -// table opcodeTable in source when Opcode.h included but WorldSession.h not included -#include "WorldSession.h" - /// List of Opcodes enum Opcodes { @@ -1366,8 +1360,15 @@ enum PacketProcessing PROCESS_THREADSAFE //packet is thread-safe - process it in Map::Update() }; +class WorldSession; class WorldPacket; +#if defined(__GNUC__) +#pragma pack(1) +#else +#pragma pack(push, 1) +#endif + struct OpcodeHandler { char const* name; @@ -1378,6 +1379,12 @@ struct OpcodeHandler extern OpcodeHandler opcodeTable[NUM_MSG_TYPES]; +#if defined(__GNUC__) +#pragma pack() +#else +#pragma pack(pop) +#endif + /// Lookup opcode name for human understandable logging inline const char* LookupOpcodeName(uint16 id) { diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 89242bada6e..61a2e05d9be 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -121,8 +121,9 @@ WorldSession::WorldSession(uint32 id, WorldSocket* sock, AccountTypes sec, uint8 m_TutorialsChanged(false), recruiterId(recruiter), isRecruiter(isARecruiter), - timeLastWhoCommand(0), - _RBACData(NULL) + _RBACData(NULL), + expireTime(60000), // 1 min after socket loss, session is deleted + forceExit(false) { memset(m_Tutorials, 0, sizeof(m_Tutorials)); @@ -277,12 +278,13 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) //! loop caused by re-enqueueing the same packets over and over again, we stop updating this session //! and continue updating others. The re-enqueued packets will be handled in the next Update call for this session. uint32 processedPackets = 0; + time_t currentTime = time(NULL); while (m_Socket && !m_Socket->IsClosed() && !_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket && _recvQueue.next(packet, updater)) { - if (!AntiDOS.EvaluateOpcode(*packet)) + if (!AntiDOS.EvaluateOpcode(*packet, currentTime)) { KickPlayer(); } @@ -419,8 +421,12 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) ///- Cleanup socket pointer if need if (m_Socket && m_Socket->IsClosed()) { - m_Socket->RemoveReference(); - m_Socket = NULL; + expireTime -= expireTime > diff ? diff : expireTime; + if (expireTime < diff || forceExit) + { + m_Socket->RemoveReference(); + m_Socket = NULL; + } } if (!m_Socket) @@ -446,7 +452,6 @@ void WorldSession::LogoutPlayer(bool save) DoLootRelease(lguid); ///- If the player just died before logging out, make him appear as a ghost - //FIXME: logout must be delayed in case lost connection with client in time of combat if (_player->GetDeathTimer()) { _player->getHostileRefManager().deleteReferences(); @@ -569,7 +574,6 @@ void WorldSession::LogoutPlayer(bool save) m_playerLogout = false; m_playerSave = false; m_playerRecentlyLogout = true; - AntiDOS.AllowOpcode(CMSG_CHAR_ENUM, true); LogoutRequest(0); } @@ -577,7 +581,10 @@ void WorldSession::LogoutPlayer(bool save) void WorldSession::KickPlayer() { if (m_Socket) + { m_Socket->CloseSocket(); + forceExit = true; + } } void WorldSession::SendNotification(const char *format, ...) @@ -1236,14 +1243,39 @@ void WorldSession::InvalidateRBACData() _RBACData = NULL; } -bool WorldSession::DosProtection::EvaluateOpcode(WorldPacket& p) const +bool WorldSession::DosProtection::EvaluateOpcode(WorldPacket& p, time_t time) const { - if (IsOpcodeAllowed(p.GetOpcode())) - return true; + PacketCounter& packetCounter = _PacketThrottlingMap[p.GetOpcode()]; + if (packetCounter.lastReceiveTime != time) + { + packetCounter.lastReceiveTime = time; + packetCounter.amountCounter = 0; + } + + uint32 maxPacketCounterAllowed = GetMaxPacketCounterAllowed(p.GetOpcode()); + + bool dosTriggered = false; + // Check if player is flooding some packets + if (++packetCounter.amountCounter > maxPacketCounterAllowed) + { + dosTriggered = true; + TC_LOG_WARN("network", "AntiDOS: Account %u, IP: %s, Character: %s, flooding packet (opc: %s (0x%X), count: %u)", + Session->GetAccountId(), Session->GetRemoteAddress().c_str(), Session->GetPlayerName().c_str(), + opcodeTable[p.GetOpcode()].name, p.GetOpcode(), packetCounter.amountCounter); + } + + // Then check if player is sending packets not allowed + if (!IsOpcodeAllowed(p.GetOpcode())) + { + dosTriggered = true; + // Opcode not allowed, let the punishment begin + TC_LOG_WARN("network", "AntiDOS: Account %u, IP: %s, sent unacceptable packet (opc: %u, size: %u)", + Session->GetAccountId(), Session->GetRemoteAddress().c_str(), p.GetOpcode(), (uint32)p.size()); + } - // Opcode not allowed, let the punishment begin - TC_LOG_INFO("network", "AntiDOS: Account %u, IP: %s, sent unacceptable packet (opc: %u, size: %u)", - Session->GetAccountId(), Session->GetRemoteAddress().c_str(), p.GetOpcode(), (uint32)p.size()); + // Return true if everything is fine, otherwise apply the configured policy + if (!dosTriggered) + return true; switch (_policy) { @@ -1272,3 +1304,225 @@ bool WorldSession::DosProtection::EvaluateOpcode(WorldPacket& p) const return true; } } + + +uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) const +{ + uint32 maxPacketCounterAllowed; + switch (opcode) + { + // These opcodes are spammed by few addons so a very high limit is required + case CMSG_QUEST_QUERY: + case CMSG_MESSAGECHAT: + case CMSG_ITEM_QUERY_SINGLE: + case CMSG_ITEM_NAME_QUERY: + case CMSG_GAMEOBJECT_QUERY: + case CMSG_NAME_QUERY: + case CMSG_PET_NAME_QUERY: + case CMSG_CREATURE_QUERY: + case CMSG_NPC_TEXT_QUERY: + case CMSG_QUESTGIVER_STATUS_QUERY: + { + maxPacketCounterAllowed = 5000; + break; + } + + case CMSG_ATTACKSTOP: + case CMSG_GUILD_QUERY: + case CMSG_ARENA_TEAM_QUERY: + case CMSG_TAXINODE_STATUS_QUERY: + case CMSG_TAXIQUERYAVAILABLENODES: + case CMSG_QUESTGIVER_QUERY_QUEST: + case CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY: + case CMSG_QUERY_QUESTS_COMPLETED: + case CMSG_QUEST_POI_QUERY: + case CMSG_QUERY_TIME: + case CMSG_PAGE_TEXT_QUERY: + case CMSG_PETITION_QUERY: + case CMSG_QUERY_INSPECT_ACHIEVEMENTS: + case CMSG_AREA_SPIRIT_HEALER_QUERY: + case CMSG_CORPSE_MAP_POSITION_QUERY: + case CMSG_MOVE_TIME_SKIPPED: + case CMSG_GUILD_BANK_QUERY_TAB: + case MSG_GUILD_BANK_LOG_QUERY: + case MSG_QUERY_GUILD_BANK_TEXT: + case MSG_CORPSE_QUERY: + case MSG_QUERY_NEXT_MAIL_TIME: + case MSG_GUILD_EVENT_LOG_QUERY: + case MSG_MOVE_SET_FACING: + case CMSG_INSPECT: + { + maxPacketCounterAllowed = 500; + break; + } + + case CMSG_REQUEST_PARTY_MEMBER_STATS: + case CMSG_WHO: + case CMSG_SETSHEATHED: + case CMSG_CONTACT_LIST: + case CMSG_GUILD_SET_PUBLIC_NOTE: + case CMSG_GUILD_SET_OFFICER_NOTE: + { + maxPacketCounterAllowed = 50; + break; + } + + case CMSG_SPELLCLICK: + case CMSG_GAMEOBJ_USE: + case CMSG_GAMEOBJ_REPORT_USE: + case MSG_RAID_TARGET_UPDATE: + case CMSG_QUESTGIVER_COMPLETE_QUEST: + case CMSG_PLAYER_VEHICLE_ENTER: + case CMSG_PETITION_SIGN: + { + maxPacketCounterAllowed = 20; + break; + } + + case CMSG_PLAYER_LOGOUT: + case CMSG_LOGOUT_REQUEST: + case CMSG_LOGOUT_CANCEL: + case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE: + case CMSG_REQUEST_VEHICLE_PREV_SEAT: + case CMSG_REQUEST_VEHICLE_NEXT_SEAT: + case CMSG_REQUEST_VEHICLE_SWITCH_SEAT: + case CMSG_TOGGLE_PVP: + case CMSG_ADD_FRIEND: + case CMSG_DEL_FRIEND: + case CMSG_SET_CONTACT_NOTES: + case CMSG_RESET_INSTANCES: + case CMSG_HEARTH_AND_RESURRECT: + case CMSG_CHAR_CREATE: + case CMSG_READY_FOR_ACCOUNT_DATA_TIMES: + case CMSG_CHAR_ENUM: + case CMSG_REALM_SPLIT: + case CMSG_CHAR_DELETE: + case CMSG_PLAYER_LOGIN: + case CMSG_PET_ABANDON: + case CMSG_PET_RENAME: + case CMSG_CHAR_RENAME: + case CMSG_CHAR_CUSTOMIZE: + case CMSG_CHAR_RACE_CHANGE: + case CMSG_CHAR_FACTION_CHANGE: + case CMSG_GMTICKET_CREATE: + case CMSG_GMTICKET_UPDATETEXT: + case CMSG_GMTICKET_DELETETICKET: + case CMSG_GMSURVEY_SUBMIT: + case CMSG_GM_REPORT_LAG: + case CMSG_BUG: + case CMSG_GMRESPONSE_RESOLVE: + case CMSG_ACTIVATETAXIEXPRESS: + case CMSG_ACTIVATETAXI: + case CMSG_SELF_RES: + case CMSG_INITIATE_TRADE: + case CMSG_BEGIN_TRADE: + case CMSG_UNLEARN_SKILL: + case CMSG_DISMISS_CONTROLLED_VEHICLE: + case CMSG_REQUEST_VEHICLE_EXIT: + case CMSG_LEARN_PREVIEW_TALENTS: + case CMSG_LEARN_PREVIEW_TALENTS_PET: + case CMSG_CONTROLLER_EJECT_PASSENGER: + case CMSG_EQUIPMENT_SET_SAVE: + case CMSG_DELETEEQUIPMENT_SET: + case CMSG_REMOVE_GLYPH: + case CMSG_ALTER_APPEARANCE: + case CMSG_QUESTGIVER_ACCEPT_QUEST: + case CMSG_QUESTGIVER_CHOOSE_REWARD: + case CMSG_QUESTGIVER_REQUEST_REWARD: + case CMSG_QUESTGIVER_CANCEL: + case CMSG_QUESTLOG_REMOVE_QUEST: + case CMSG_QUEST_CONFIRM_ACCEPT: + case CMSG_DISMISS_CRITTER: + case CMSG_REPOP_REQUEST: + case CMSG_PETITION_BUY: + case CMSG_TURN_IN_PETITION: + case CMSG_COMPLETE_CINEMATIC: + case CMSG_ITEM_REFUND: + case CMSG_SOCKET_GEMS: + case CMSG_WRAP_ITEM: + case CMSG_BUY_BANK_SLOT: + case CMSG_GROUP_ACCEPT: + case CMSG_GROUP_DECLINE: + case CMSG_GROUP_UNINVITE_GUID: + case CMSG_GROUP_UNINVITE: + case CMSG_GROUP_SET_LEADER: + case CMSG_GROUP_DISBAND: + case CMSG_GROUP_RAID_CONVERT: + case CMSG_GROUP_CHANGE_SUB_GROUP: + case CMSG_GROUP_ASSISTANT_LEADER: + case CMSG_OPT_OUT_OF_LOOT: + case CMSG_BATTLEMASTER_JOIN_ARENA: + case CMSG_LEAVE_BATTLEFIELD: + case CMSG_REPORT_PVP_AFK: + case CMSG_DUEL_ACCEPTED: + case CMSG_DUEL_CANCELLED: + case CMSG_CALENDAR_GET_CALENDAR: + case CMSG_CALENDAR_ADD_EVENT: + case CMSG_CALENDAR_UPDATE_EVENT: + case CMSG_CALENDAR_REMOVE_EVENT: + case CMSG_CALENDAR_COPY_EVENT: + case CMSG_CALENDAR_EVENT_INVITE: + case CMSG_CALENDAR_EVENT_SIGNUP: + case CMSG_CALENDAR_EVENT_RSVP: + case CMSG_CALENDAR_EVENT_REMOVE_INVITE: + case CMSG_CALENDAR_EVENT_MODERATOR_STATUS: + case CMSG_CALENDAR_COMPLAIN: + case CMSG_ARENA_TEAM_INVITE: + case CMSG_ARENA_TEAM_ACCEPT: + case CMSG_ARENA_TEAM_DECLINE: + case CMSG_ARENA_TEAM_LEAVE: + case CMSG_ARENA_TEAM_DISBAND: + case CMSG_ARENA_TEAM_REMOVE: + case CMSG_ARENA_TEAM_LEADER: + case CMSG_LOOT_METHOD: + case CMSG_GUILD_INVITE: + case CMSG_GUILD_ACCEPT: + case CMSG_GUILD_DECLINE: + case CMSG_GUILD_LEAVE: + case CMSG_GUILD_DISBAND: + case CMSG_GUILD_LEADER: + case CMSG_GUILD_MOTD: + case CMSG_GUILD_RANK: + case CMSG_GUILD_ADD_RANK: + case CMSG_GUILD_DEL_RANK: + case CMSG_GUILD_INFO_TEXT: + case CMSG_GUILD_BANK_DEPOSIT_MONEY: + case CMSG_GUILD_BANK_WITHDRAW_MONEY: + case CMSG_GUILD_BANK_BUY_TAB: + case CMSG_GUILD_BANK_UPDATE_TAB: + case CMSG_SET_GUILD_BANK_TEXT: + case MSG_SAVE_GUILD_EMBLEM: + case MSG_PETITION_RENAME: + case MSG_PETITION_DECLINE: + case MSG_TALENT_WIPE_CONFIRM: + case MSG_SET_DUNGEON_DIFFICULTY: + case MSG_SET_RAID_DIFFICULTY: + case MSG_RANDOM_ROLL: + case MSG_PARTY_ASSIGNMENT: + case MSG_RAID_READY_CHECK: + { + maxPacketCounterAllowed = 3; + break; + } + + case CMSG_SET_ACTION_BUTTON: + { + maxPacketCounterAllowed = MAX_ACTION_BUTTONS; + break; + } + + case CMSG_ITEM_REFUND_INFO: + { + maxPacketCounterAllowed = PLAYER_SLOTS_COUNT; + break; + } + + default: + { + maxPacketCounterAllowed = 100; + break; + } + } + + return maxPacketCounterAllowed; +} diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 9d1a05ae753..82125aafd6d 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -28,9 +28,11 @@ #include "AddonMgr.h" #include "DatabaseEnv.h" #include "World.h" +#include "Opcodes.h" #include "WorldPacket.h" #include "Cryptography/BigNumber.h" #include "AccountMgr.h" +#include <unordered_set> class Creature; class GameObject; @@ -196,6 +198,12 @@ class CharacterCreateInfo uint8 CharCount; }; +struct PacketCounter +{ + time_t lastReceiveTime; + uint32 amountCounter; +}; + /// Player session in the World class WorldSession { @@ -721,7 +729,6 @@ class WorldSession void HandleCompleteCinematic(WorldPacket& recvPacket); void HandleNextCinematicCamera(WorldPacket& recvPacket); - void HandlePageQuerySkippedOpcode(WorldPacket& recvPacket); void HandlePageTextQueryOpcode(WorldPacket& recvPacket); void HandleTutorialFlag (WorldPacket& recvData); @@ -929,7 +936,7 @@ class WorldSession friend class World; public: DosProtection(WorldSession* s) : Session(s), _policy((Policy)sWorld->getIntConfig(CONFIG_PACKET_SPOOF_POLICY)) { } - bool EvaluateOpcode(WorldPacket& p) const; + bool EvaluateOpcode(WorldPacket& p, time_t time) const; void AllowOpcode(uint16 opcode, bool allow) { _isOpcodeAllowed[opcode] = allow; } protected: enum Policy @@ -948,12 +955,17 @@ class WorldSession return itr->second; } + uint32 GetMaxPacketCounterAllowed(uint16 opcode) const; + WorldSession* Session; private: typedef std::unordered_map<uint16, bool> OpcodeStatusMap; OpcodeStatusMap _isOpcodeAllowed; // could be bool array, but wouldn't be practical for game versions with non-linear opcodes Policy _policy; + typedef std::unordered_map<uint16, PacketCounter> PacketThrottlingMap; + // mark this member as "mutable" so it can be modified even in const functions + mutable PacketThrottlingMap _PacketThrottlingMap; DosProtection(DosProtection const& right) = delete; DosProtection& operator=(DosProtection const& right) = delete; @@ -1008,8 +1020,9 @@ class WorldSession uint32 recruiterId; bool isRecruiter; ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue; - time_t timeLastWhoCommand; rbac::RBACData* _RBACData; + uint32 expireTime; + bool forceExit; WorldSession(WorldSession const& right) = delete; WorldSession& operator=(WorldSession const& right) = delete; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b87524357d2..2096f21e5a1 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5856,7 +5856,8 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const damage = caster->SpellCriticalDamageBonus(m_spellInfo, damage, target); int32 dmg = damage; - caster->ApplyResilience(target, NULL, &dmg, crit, CR_CRIT_TAKEN_SPELL); + if (!(GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE)) + caster->ApplyResilience(target, NULL, &dmg, crit, CR_CRIT_TAKEN_SPELL); damage = dmg; caster->CalcAbsorbResist(target, GetSpellInfo()->GetSchoolMask(), DOT, damage, &absorb, &resist, GetSpellInfo()); @@ -5923,7 +5924,8 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c } int32 dmg = damage; - caster->ApplyResilience(target, NULL, &dmg, crit, CR_CRIT_TAKEN_SPELL); + if (!(GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE)) + caster->ApplyResilience(target, NULL, &dmg, crit, CR_CRIT_TAKEN_SPELL); damage = dmg; caster->CalcAbsorbResist(target, GetSpellInfo()->GetSchoolMask(), DOT, damage, &absorb, &resist, m_spellInfo); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 8e7edfc5355..3e1763e6c5b 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1343,17 +1343,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b if (target->HasAura(61988) && !target->HasAura(25771)) target->RemoveAura(61988); break; - case 72368: // Shared Suffering - case 72369: - if (caster) - { - if (AuraEffect* aurEff = GetEffect(0)) - { - int32 remainingDamage = aurEff->GetAmount() * (aurEff->GetTotalTicks() - aurEff->GetTickNumber()); - if (remainingDamage > 0) - caster->CastCustomSpell(caster, 72373, NULL, &remainingDamage, NULL, true); - } - } + default: break; } break; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 7c6f2552b44..f5d90bc3612 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -567,7 +567,7 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme m_spellState = SPELL_STATE_NULL; _triggeredCastFlags = triggerFlags; if (info->AttributesEx4 & SPELL_ATTR4_TRIGGERED) - _triggeredCastFlags = TRIGGERED_FULL_MASK; + _triggeredCastFlags = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_EQUIPPED_ITEM_REQUIREMENT); m_CastItem = NULL; m_castItemGUID = 0; @@ -1251,8 +1251,12 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici float angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dist, angle); - float ground = z; - float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground); + float ground = m_caster->GetMap()->GetHeight(m_caster->GetPhaseMask(), x, y, z, true, 50.0f); + float liquidLevel = VMAP_INVALID_HEIGHT_VALUE; + LiquidData liquidData; + if (m_caster->GetMap()->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquidData)) + liquidLevel = liquidData.level; + if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level { SendCastResult(SPELL_FAILED_NOT_HERE); @@ -1288,10 +1292,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici dist = objSize + (dist - objSize) * float(rand_norm()); Position pos = dest._position; - if (targetType.GetTarget() == TARGET_DEST_CASTER_FRONT_LEAP) - m_caster->MovePositionToFirstCollision(pos, dist, angle); - else - m_caster->MovePosition(pos, dist, angle); + m_caster->MovePositionToFirstCollision(pos, dist, angle); dest.Relocate(pos); break; @@ -1324,7 +1325,7 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffIndex effIndex, SpellImplici dist = objSize + (dist - objSize) * float(rand_norm()); Position pos = dest._position; - target->MovePosition(pos, dist, angle); + target->MovePositionToFirstCollision(pos, dist, angle); dest.Relocate(pos); break; @@ -1363,7 +1364,7 @@ void Spell::SelectImplicitDestDestTargets(SpellEffIndex effIndex, SpellImplicitT dist *= float(rand_norm()); Position pos = dest._position; - m_caster->MovePosition(pos, dist, angle); + m_caster->MovePositionToFirstCollision(pos, dist, angle); dest.Relocate(pos); break; @@ -4187,7 +4188,7 @@ void Spell::SendChannelStart(uint32 duration) void Spell::SendResurrectRequest(Player* target) { - // get ressurector name for creature resurrections, otherwise packet will be not accepted + // get resurrector name for creature resurrections, otherwise packet will be not accepted // for player resurrections the name is looked up by guid std::string const sentName(m_caster->GetTypeId() == TYPEID_PLAYER ? "" diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 65530b4b282..5b68d244457 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -259,7 +259,7 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) Player* target = unitTarget->ToPlayer(); - if (target->isRessurectRequested()) // already have one active request + if (target->isResurrectRequested()) // already have one active request return; uint32 health = damage; @@ -4542,7 +4542,7 @@ void Spell::EffectResurrect(SpellEffIndex effIndex) Player* target = unitTarget->ToPlayer(); - if (target->isRessurectRequested()) // already have one active request + if (target->isResurrectRequested()) // already have one active request return; uint32 health = target->CountPctFromMaxHealth(damage); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 21c36510a32..ba4c3deca85 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -24,6 +24,7 @@ #include "Player.h" #include "Battleground.h" #include "Vehicle.h" +#include "Pet.h" uint32 GetTargetFlagMask(SpellTargetObjectTypes objType) { @@ -1505,8 +1506,16 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta // creature/player specific target checks if (unitTarget) { - if (AttributesEx & SPELL_ATTR1_CANT_TARGET_IN_COMBAT && unitTarget->IsInCombat()) - return SPELL_FAILED_TARGET_AFFECTING_COMBAT; + if (AttributesEx & SPELL_ATTR1_CANT_TARGET_IN_COMBAT) + { + if (unitTarget->IsInCombat()) + return SPELL_FAILED_TARGET_AFFECTING_COMBAT; + // player with active pet counts as a player in combat + else if (Player const* player = unitTarget->ToPlayer()) + if (Pet* pet = player->GetPet()) + if (pet->GetVictim() && !pet->HasUnitState(UNIT_STATE_CONTROLLED)) + return SPELL_FAILED_TARGET_AFFECTING_COMBAT; + } // only spells with SPELL_ATTR3_ONLY_TARGET_GHOSTS can target ghosts if (((AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS) != 0) != unitTarget->HasAuraType(SPELL_AURA_GHOST)) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index ba5b8856323..4aced0c92dd 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3207,6 +3207,9 @@ void SpellMgr::LoadSpellInfoCorrections() case 63675: // Improved Devouring Plague spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_DONE_BONUS; break; + case 12721: // Deep Wounds shouldnt ignore resillience or damage taken auras because its damage is not based off a spell. + spellInfo->AttributesEx4 = 0; + break; case 8145: // Tremor Totem (instant pulse) case 6474: // Earthbind Totem (instant pulse) spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; @@ -3375,6 +3378,18 @@ void SpellMgr::LoadSpellInfoCorrections() break; // ENDOF TRIAL OF THE CRUSADER SPELLS // + // HALLS OF REFLECTION SPELLS + // + case 72435: // Defiling Horror + case 72452: // Defiling Horror + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd + spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd + break; + case 72900: // Start Halls of Reflection Quest AE + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd + break; + // ENDOF HALLS OF REFLECTION SPELLS + // // ICECROWN CITADEL SPELLS // // THESE SPELLS ARE WORKING CORRECTLY EVEN WITHOUT THIS HACK diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 75a191a9801..32b8781fb89 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -249,7 +249,7 @@ class SpellScript : public _SpellScript class HitHandlerFunction : public SpellScript::HitHandler { public: HitHandlerFunction(SpellHitFnType _pHitHandlerScript) : SpellScript::HitHandler((SpellScript::SpellHitFnType)_pHitHandlerScript) { } }; \ class ObjectAreaTargetSelectHandlerFunction : public SpellScript::ObjectAreaTargetSelectHandler { public: ObjectAreaTargetSelectHandlerFunction(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectAreaTargetSelectHandler((SpellScript::SpellObjectAreaTargetSelectFnType)_pObjectAreaTargetSelectHandlerScript, _effIndex, _targetType) { } }; \ class ObjectTargetSelectHandlerFunction : public SpellScript::ObjectTargetSelectHandler { public: ObjectTargetSelectHandlerFunction(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectTargetSelectHandler((SpellScript::SpellObjectTargetSelectFnType)_pObjectTargetSelectHandlerScript, _effIndex, _targetType) { } }; \ - class DestinationTargetSelectHandlerFunction : public SpellScript::DestinationTargetSelectHandler { public: DestinationTargetSelectHandlerFunction(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::DestinationTargetSelectHandler((SpellScript::SpellDestinationTargetSelectFnType)_DestinationTargetSelectHandlerScript, _effIndex, _targetType) { } }; + class DestinationTargetSelectHandlerFunction : public SpellScript::DestinationTargetSelectHandler { public: DestinationTargetSelectHandlerFunction(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::DestinationTargetSelectHandler((SpellScript::SpellDestinationTargetSelectFnType)_DestinationTargetSelectHandlerScript, _effIndex, _targetType) { } } #define PrepareSpellScript(CLASSNAME) SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) public: @@ -623,7 +623,7 @@ class AuraScript : public _SpellScript class EffectSplitFunction : public AuraScript::EffectSplitHandler { public: EffectSplitFunction(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectSplitHandler((AuraScript::AuraEffectSplitFnType)_pEffectHandlerScript, _effIndex) { } }; \ class CheckProcHandlerFunction : public AuraScript::CheckProcHandler { public: CheckProcHandlerFunction(AuraCheckProcFnType handlerScript) : AuraScript::CheckProcHandler((AuraScript::AuraCheckProcFnType)handlerScript) { } }; \ class AuraProcHandlerFunction : public AuraScript::AuraProcHandler { public: AuraProcHandlerFunction(AuraProcFnType handlerScript) : AuraScript::AuraProcHandler((AuraScript::AuraProcFnType)handlerScript) { } }; \ - class EffectProcHandlerFunction : public AuraScript::EffectProcHandler { public: EffectProcHandlerFunction(AuraEffectProcFnType effectHandlerScript, uint8 effIndex, uint16 effName) : AuraScript::EffectProcHandler((AuraScript::AuraEffectProcFnType)effectHandlerScript, effIndex, effName) { } }; \ + class EffectProcHandlerFunction : public AuraScript::EffectProcHandler { public: EffectProcHandlerFunction(AuraEffectProcFnType effectHandlerScript, uint8 effIndex, uint16 effName) : AuraScript::EffectProcHandler((AuraScript::AuraEffectProcFnType)effectHandlerScript, effIndex, effName) { } } #define PrepareAuraScript(CLASSNAME) AURASCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME) diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index b9ecfffb8c3..71d51153b4c 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -233,7 +233,7 @@ void GmTicket::SetChatLog(std::list<uint32> time, std::string const& log) std::stringstream ss(log); std::stringstream newss; std::string line; - while (std::getline(ss, line)) + while (std::getline(ss, line) && !time.empty()) { newss << secsToTimeString(time.front()) << ": " << line << "\n"; time.pop_front(); diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 42872bba22e..0810295c0cc 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -223,7 +223,7 @@ std::string Warden::Penalty(WardenCheck* check /*= NULL*/) void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData) { - if (!_warden) + if (!_warden || recvData.empty()) return; _warden->DecryptData(recvData.contents(), recvData.size()); diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp index cb332df9a41..8d39f553910 100644 --- a/src/server/game/Weather/Weather.cpp +++ b/src/server/game/Weather/Weather.cpp @@ -28,7 +28,7 @@ #include "ObjectMgr.h" #include "Util.h" #include "ScriptMgr.h" -#include "Opcodes.h" +#include "WorldSession.h" /// Create the Weather object Weather::Weather(uint32 zone, WeatherData const* weatherChances) diff --git a/src/server/game/Weather/WeatherMgr.cpp b/src/server/game/Weather/WeatherMgr.cpp index 59dc591ccd0..5cf5cde75fd 100644 --- a/src/server/game/Weather/WeatherMgr.cpp +++ b/src/server/game/Weather/WeatherMgr.cpp @@ -27,7 +27,7 @@ #include "AutoPtr.h" #include "Player.h" #include "WorldPacket.h" -#include "Opcodes.h" +#include "WorldSession.h" namespace WeatherMgr { diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index f2f11801229..5dbe95b3e54 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1020,7 +1020,7 @@ public: } else { - if (newmoney > MAX_MONEY_AMOUNT) + if (newmoney > static_cast<int32>(MAX_MONEY_AMOUNT)) newmoney = MAX_MONEY_AMOUNT; handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(moneyToAdd), handler->GetNameLink(target).c_str()); @@ -1035,10 +1035,7 @@ public: if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), moneyToAdd); - if (moneyToAdd >= MAX_MONEY_AMOUNT) - moneyToAdd = MAX_MONEY_AMOUNT; - - if (targetMoney >= uint32(MAX_MONEY_AMOUNT) - moneyToAdd) + if (targetMoney >= MAX_MONEY_AMOUNT - moneyToAdd) moneyToAdd -= targetMoney; target->ModifyMoney(moneyToAdd); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index a0df1292210..28d49fe11aa 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -715,6 +715,7 @@ public: handler->PSendSysMessage(LANG_NPCINFO_LEVEL, target->getLevel()); handler->PSendSysMessage(LANG_NPCINFO_EQUIPMENT, target->GetCurrentEquipmentId(), target->GetOriginalEquipmentId()); handler->PSendSysMessage(LANG_NPCINFO_HEALTH, target->GetCreateHealth(), target->GetMaxHealth(), target->GetHealth()); + handler->PSendSysMessage(LANG_NPCINFO_INHABIT_TYPE, cInfo->InhabitType); handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS)); for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i) diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 83b716728ea..47e91cac63d 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -82,7 +82,7 @@ public: // check if creature is not outside of building if (resetTimer < diff) { - if (Creature* pBalinda = Unit::GetCreature(*me, balindaGUID)) + if (Creature* pBalinda = ObjectAccessor::GetCreature(*me, balindaGUID)) if (me->GetDistance2d(pBalinda->GetHomePosition().GetPositionX(), pBalinda->GetHomePosition().GetPositionY()) > 50) EnterEvadeMode(); resetTimer = 5 * IN_MILLISECONDS; @@ -212,4 +212,4 @@ void AddSC_boss_balinda() { new boss_balinda; new npc_water_elemental; -}; +} diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 1ab2d746aa5..3eab75cfd76 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -229,7 +229,7 @@ public: if (RingBossGUID) { - Creature* boss = Unit::GetCreature(*me, RingBossGUID); + Creature* boss = ObjectAccessor::GetCreature(*me, RingBossGUID); if (boss && !boss->IsAlive() && boss->isDead()) { RingBossGUID = 0; @@ -242,7 +242,7 @@ public: for (uint8 i = 0; i < MAX_NPC_AMOUNT; ++i) { - Creature* mob = Unit::GetCreature(*me, RingMobGUID[i]); + Creature* mob = ObjectAccessor::GetCreature(*me, RingMobGUID[i]); if (mob && !mob->IsAlive() && mob->isDead()) { RingMobGUID[i] = 0; @@ -1304,7 +1304,7 @@ public: DoGo(DATA_GO_BAR_KEG_TRAP, 0); //doesn't work very well, leaving code here for future //spell by trap has effect61, this indicate the bar go hostile - if (Unit* tmp = Unit::GetUnit(*me, instance->GetData64(DATA_PHALANX))) + if (Unit* tmp = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_PHALANX))) tmp->setFaction(14); //for later, this event(s) has alot more to it. diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp index ab065f62bbb..94bf3e991f4 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp @@ -243,37 +243,37 @@ public: switch (eventId) { case EVENT_START_1: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_0); events.ScheduleEvent(EVENT_START_2, 4000); break; case EVENT_START_2: events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->HandleEmoteCommand(EMOTE_ONESHOT_POINT); events.ScheduleEvent(EVENT_START_3, 4000); break; case EVENT_START_3: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_1); events.ScheduleEvent(EVENT_WAVE_1, 2000); events.ScheduleEvent(EVENT_TURN_TO_REND, 4000); events.ScheduleEvent(EVENT_WAVES_TEXT_1, 20000); break; case EVENT_TURN_TO_REND: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) { victor->SetFacingToObject(me); victor->HandleEmoteCommand(EMOTE_ONESHOT_TALK); } break; case EVENT_TURN_TO_PLAYER: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) if (Unit* player = victor->SelectNearestPlayer(60.0f)) victor->SetFacingToObject(player); break; case EVENT_TURN_TO_FACING_1: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->SetFacingTo(1.518436f); break; case EVENT_TURN_TO_FACING_2: @@ -283,7 +283,7 @@ public: me->SetFacingTo(1.500983f); break; case EVENT_WAVES_EMOTE_1: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); break; case EVENT_WAVES_EMOTE_2: @@ -291,7 +291,7 @@ public: break; case EVENT_WAVES_TEXT_1: events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_2); me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); @@ -301,7 +301,7 @@ public: break; case EVENT_WAVES_TEXT_2: events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_3); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); events.ScheduleEvent(EVENT_WAVE_3, 2000); @@ -309,7 +309,7 @@ public: break; case EVENT_WAVES_TEXT_3: events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_4); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); events.ScheduleEvent(EVENT_WAVE_4, 2000); @@ -324,7 +324,7 @@ public: break; case EVENT_WAVES_TEXT_5: events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_5); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); events.ScheduleEvent(EVENT_WAVE_6, 2000); @@ -332,26 +332,26 @@ public: break; case EVENT_WAVES_COMPLETE_TEXT_1: events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_6); events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_2, 13000); break; case EVENT_WAVES_COMPLETE_TEXT_2: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_7); Talk(SAY_BLACKHAND_2); events.ScheduleEvent(EVENT_PATH_REND, 1000); events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_3, 4000); break; case EVENT_WAVES_COMPLETE_TEXT_3: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->AI()->Talk(SAY_NEFARIUS_8); events.ScheduleEvent(EVENT_PATH_NEFARIUS, 1000); events.ScheduleEvent(EVENT_PATH_REND, 1000); break; case EVENT_PATH_NEFARIUS: - if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Creature* victor = ObjectAccessor::GetCreature(*me, victorGUID)) victor->GetMotionMaster()->MovePath(NEFARIUS_PATH_1, true); break; case EVENT_PATH_REND: diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp index e645dd383f2..b3a55e1fe4a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp @@ -26,7 +26,7 @@ #include "ScriptedCreature.h" #include "blackrock_spire.h" -uint32 const DragonspireRunes[7] = { GO_HALL_RUNE_1, GO_HALL_RUNE_2, GO_HALL_RUNE_3, GO_HALL_RUNE_4, GO_HALL_RUNE_5, GO_HALL_RUNE_6, GO_HALL_RUNE_7 }; +//uint32 const DragonspireRunes[7] = { GO_HALL_RUNE_1, GO_HALL_RUNE_2, GO_HALL_RUNE_3, GO_HALL_RUNE_4, GO_HALL_RUNE_5, GO_HALL_RUNE_6, GO_HALL_RUNE_7 }; uint32 const DragonspireMobs[3] = { NPC_BLACKHAND_DREADWEAVER, NPC_BLACKHAND_SUMMONER, NPC_BLACKHAND_VETERAN }; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index ea4784bb5a4..8d4a84197b1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -167,7 +167,7 @@ public: { if (InstanceScript* instance = go->GetInstanceScript()) if (instance->GetData(DATA_EGG_EVENT) != DONE) - if (Creature* razor = Unit::GetCreature(*go, instance->GetData64(DATA_RAZORGORE_THE_UNTAMED))) + if (Creature* razor = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_RAZORGORE_THE_UNTAMED))) { razor->Attack(player, true); player->CastSpell(razor, SPELL_MINDCONTROL); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index c00029bea50..bbe70947901 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -146,8 +146,8 @@ public: break; case EVENT_SPEECH_4: me->setFaction(103); - if (PlayerGUID && Unit::GetUnit(*me, PlayerGUID)) - AttackStart(Unit::GetUnit(*me, PlayerGUID));; + if (PlayerGUID && ObjectAccessor::GetUnit(*me, PlayerGUID)) + AttackStart(ObjectAccessor::GetUnit(*me, PlayerGUID));; break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 048e6149b4b..6eafb41a8fa 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -147,7 +147,7 @@ class boss_ragnaros : public CreatureScript break; case EVENT_INTRO_4: Talk(SAY_ARRIVAL5_RAG); - if (Creature* executus = Unit::GetCreature(*me, instance->GetData64(BOSS_MAJORDOMO_EXECUTUS))) + if (Creature* executus = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_MAJORDOMO_EXECUTUS))) me->Kill(executus); break; case EVENT_INTRO_5: diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index 1398f959e46..b171bf014c7 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -198,7 +198,7 @@ public: if (!SummonList.empty()) for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr) { - if (Creature* summon = Unit::GetCreature(*me, *itr)) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) { if (summon->IsAlive()) summon->DisappearAndDie(); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index 59a04d6a457..b130ac74be3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -101,7 +101,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); - if (Unit* midnight = Unit::GetUnit(*me, Midnight)) + if (Unit* midnight = ObjectAccessor::GetUnit(*me, Midnight)) midnight->Kill(midnight); } @@ -149,7 +149,7 @@ public: { if (Phase == 2) { - if (Unit* unit = Unit::GetUnit(*me, Attumen)) + if (Unit* unit = ObjectAccessor::GetUnit(*me, Attumen)) Talk(SAY_MIDNIGHT_KILL, unit); } } @@ -172,7 +172,7 @@ public: } else if (Phase == 2 && HealthBelowPct(25)) { - if (Unit* pAttumen = Unit::GetUnit(*me, Attumen)) + if (Unit* pAttumen = ObjectAccessor::GetUnit(*me, Attumen)) Mount(pAttumen); } else if (Phase == 3) @@ -184,7 +184,7 @@ public: Mount_Timer = 0; me->SetVisible(false); me->GetMotionMaster()->MoveIdle(); - if (Unit* pAttumen = Unit::GetUnit(*me, Attumen)) + if (Unit* pAttumen = ObjectAccessor::GetUnit(*me, Attumen)) { pAttumen->SetDisplayId(MOUNTED_DISPLAYID); pAttumen->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -242,7 +242,7 @@ void boss_attumen::boss_attumenAI::UpdateAI(uint32 diff) if (ResetTimer <= diff) { ResetTimer = 0; - Unit* pMidnight = Unit::GetUnit(*me, Midnight); + Unit* pMidnight = ObjectAccessor::GetUnit(*me, Midnight); if (pMidnight) { pMidnight->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -288,7 +288,7 @@ void boss_attumen::boss_attumenAI::UpdateAI(uint32 diff) std::vector<Unit*> target_list; for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) { - target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (target && !target->IsWithinDist(me, ATTACK_DISTANCE, false)) target_list.push_back(target); target = NULL; @@ -304,7 +304,7 @@ void boss_attumen::boss_attumenAI::UpdateAI(uint32 diff) { if (HealthBelowPct(25)) { - Creature* pMidnight = Unit::GetCreature(*me, Midnight); + Creature* pMidnight = ObjectAccessor::GetCreature(*me, Midnight); if (pMidnight && pMidnight->GetTypeId() == TYPEID_UNIT) { CAST_AI(boss_midnight::boss_midnightAI, (pMidnight->AI()))->Mount(me); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 5d52cc62f8a..0ca7ee90986 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -236,7 +236,7 @@ public: { if (AddGUID[i]) { - Creature* temp = Creature::GetCreature((*me), AddGUID[i]); + Creature* temp = ObjectAccessor::GetCreature((*me), AddGUID[i]); if (temp && temp->IsAlive()) { temp->AI()->AttackStart(me->GetVictim()); @@ -270,7 +270,7 @@ public: { if (AddGUID[i]) { - Creature* temp = Unit::GetCreature((*me), AddGUID[i]); + Creature* temp = ObjectAccessor::GetCreature((*me), AddGUID[i]); if (temp && temp->IsAlive()) if (!temp->GetVictim()) temp->AI()->AttackStart(me->GetVictim()); @@ -350,7 +350,7 @@ struct boss_moroes_guestAI : public ScriptedAI void AcquireGUID() { - if (Creature* Moroes = Unit::GetCreature(*me, instance->GetData64(DATA_MOROES))) + if (Creature* Moroes = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOROES))) for (uint8 i = 0; i < 4; ++i) if (uint64 GUID = CAST_AI(boss_moroes::boss_moroesAI, Moroes->AI())->AddGUID[i]) GuestGUID[i] = GUID; @@ -361,7 +361,7 @@ struct boss_moroes_guestAI : public ScriptedAI uint64 TempGUID = GuestGUID[rand()%4]; if (TempGUID) { - Unit* unit = Unit::GetUnit(*me, TempGUID); + Unit* unit = ObjectAccessor::GetUnit(*me, TempGUID); if (unit && unit->IsAlive()) return unit; } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp index 33ea71f81e1..010b7223f97 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp @@ -158,9 +158,9 @@ public: { for (int i=0; i<3; ++i) { - if (Creature* portal = Unit::GetCreature(*me, PortalGUID[i])) + if (Creature* portal = ObjectAccessor::GetCreature(*me, PortalGUID[i])) portal->DisappearAndDie(); - if (Creature* portal = Unit::GetCreature(*me, BeamerGUID[i])) + if (Creature* portal = ObjectAccessor::GetCreature(*me, BeamerGUID[i])) portal->DisappearAndDie(); PortalGUID[i] = 0; BeamTarget[i] = 0; @@ -170,10 +170,10 @@ public: void UpdatePortals() // Here we handle the beams' behavior { for (int j=0; j<3; ++j) // j = color - if (Creature* portal = Unit::GetCreature(*me, PortalGUID[j])) + if (Creature* portal = ObjectAccessor::GetCreature(*me, PortalGUID[j])) { // the one who's been cast upon before - Unit* current = Unit::GetUnit(*portal, BeamTarget[j]); + Unit* current = ObjectAccessor::GetUnit(*portal, BeamTarget[j]); // temporary store for the best suitable beam reciever Unit* target = me; @@ -205,7 +205,7 @@ public: { BeamTarget[j] = target->GetGUID(); // remove currently beaming portal - if (Creature* beamer = Unit::GetCreature(*portal, BeamerGUID[j])) + if (Creature* beamer = ObjectAccessor::GetCreature(*portal, BeamerGUID[j])) { beamer->CastSpell(target, PortalBeam[j], false); beamer->DisappearAndDie(); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index cf13863f84b..befe72a6403 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -146,7 +146,7 @@ public: void KilledUnit(Unit* who) override { - if (Unit* unit = Unit::GetUnit(*me, malchezaar)) + if (Unit* unit = ObjectAccessor::GetUnit(*me, malchezaar)) if (Creature* creature = unit->ToCreature()) creature->AI()->KilledUnit(who); } @@ -273,7 +273,7 @@ public: { //Infernal Cleanup for (std::vector<uint64>::const_iterator itr = infernals.begin(); itr != infernals.end(); ++itr) - if (Unit* pInfernal = Unit::GetUnit(*me, *itr)) + if (Unit* pInfernal = ObjectAccessor::GetUnit(*me, *itr)) if (pInfernal->IsAlive()) { pInfernal->SetVisible(false); @@ -287,7 +287,7 @@ public: { for (uint8 i = 0; i < 2; ++i) { - Unit* axe = Unit::GetUnit(*me, axes[i]); + Unit* axe = ObjectAccessor::GetUnit(*me, axes[i]); if (axe && axe->IsAlive()) axe->Kill(axe); axes[i] = 0; @@ -316,7 +316,7 @@ public: ThreatContainer::StorageType::const_iterator itr = t_list.begin(); std::advance(itr, 1); for (; itr != t_list.end(); ++itr) //store the threat list in a different container - if (Unit* target = Unit::GetUnit(*me, (*itr)->getUnitGuid())) + if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) if (target->IsAlive() && target->GetTypeId() == TYPEID_PLAYER) targets.push_back(target); @@ -340,7 +340,7 @@ public: { for (uint8 i = 0; i < 5; ++i) { - Unit* target = Unit::GetUnit(*me, enfeeble_targets[i]); + Unit* target = ObjectAccessor::GetUnit(*me, enfeeble_targets[i]); if (target && target->IsAlive()) target->SetHealth(enfeeble_health[i]); enfeeble_targets[i] = 0; @@ -480,7 +480,7 @@ public: { for (uint8 i = 0; i < 2; ++i) { - if (Unit* axe = Unit::GetUnit(*me, axes[i])) + if (Unit* axe = ObjectAccessor::GetUnit(*me, axes[i])) { if (axe->GetVictim()) DoModifyThreatPercent(axe->GetVictim(), -100); @@ -583,7 +583,7 @@ public: void netherspite_infernal::netherspite_infernalAI::Cleanup() { - Creature* pMalchezaar = Unit::GetCreature(*me, malchezaar); + Creature* pMalchezaar = ObjectAccessor::GetCreature(*me, malchezaar); if (pMalchezaar && pMalchezaar->IsAlive()) CAST_AI(boss_malchezaar::boss_malchezaarAI, pMalchezaar->AI())->Cleanup(me, point); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 0a3a697c6a7..9bda41b03a1 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -184,7 +184,7 @@ public: //store the threat list in a different container for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - Unit* target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); //only on alive players if (target && target->IsAlive() && target->GetTypeId() == TYPEID_PLAYER) targets.push_back(target); @@ -450,7 +450,7 @@ public: if (!FlameWreathTarget[i]) continue; - Unit* unit = Unit::GetUnit(*me, FlameWreathTarget[i]); + Unit* unit = ObjectAccessor::GetUnit(*me, FlameWreathTarget[i]); if (unit && !unit->IsWithinDist2d(FWTargPosX[i], FWTargPosY[i], 3)) { unit->CastSpell(unit, 20476, true, 0, 0, me->GetGUID()); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 65c3522ea9a..3b499b649cf 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -103,7 +103,7 @@ public: uint64 TerestianGUID = instance->GetData64(DATA_TERESTIAN); if (TerestianGUID) { - Unit* Terestian = Unit::GetUnit(*me, TerestianGUID); + Unit* Terestian = ObjectAccessor::GetUnit(*me, TerestianGUID); if (Terestian && Terestian->IsAlive()) DoCast(Terestian, SPELL_BROKEN_PACT, true); } @@ -158,7 +158,7 @@ public: { if (SacrificeGUID) { - Unit* Sacrifice = Unit::GetUnit(*me, SacrificeGUID); + Unit* Sacrifice = ObjectAccessor::GetUnit(*me, SacrificeGUID); if (Sacrifice) Sacrifice->RemoveAurasDueToSpell(SPELL_SACRIFICE); } @@ -280,7 +280,7 @@ public: { if (PortalGUID[i]) { - if (Creature* pPortal = Unit::GetCreature(*me, PortalGUID[i])) + if (Creature* pPortal = ObjectAccessor::GetCreature(*me, PortalGUID[i])) { CAST_AI(npc_fiendish_portal::npc_fiendish_portalAI, pPortal->AI())->DespawnAllImp(); pPortal->DespawnOrUnsummon(); @@ -345,7 +345,7 @@ public: { if (PortalGUID[i]) { - if (Creature* pPortal = Unit::GetCreature((*me), PortalGUID[i])) + if (Creature* pPortal = ObjectAccessor::GetCreature((*me), PortalGUID[i])) pPortal->DespawnOrUnsummon(); PortalGUID[i] = 0; @@ -396,7 +396,7 @@ public: if (PortalGUID[0] && PortalGUID[1]) { - if (Creature* pPortal = Unit::GetCreature(*me, PortalGUID[urand(0, 1)])) + if (Creature* pPortal = ObjectAccessor::GetCreature(*me, PortalGUID[urand(0, 1)])) pPortal->CastSpell(me->GetVictim(), SPELL_SUMMON_FIENDISIMP, false); SummonTimer = 5000; } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index 010e06d67cb..c0e6a8d3b90 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -109,7 +109,7 @@ void SummonCroneIfReady(InstanceScript* instance, Creature* creature) pCrone->AI()->AttackStart(creature->GetVictim()); } } -}; +} class boss_dorothee : public CreatureScript { @@ -254,7 +254,7 @@ public: { if (DorotheeGUID) { - Creature* Dorothee = (Unit::GetCreature((*me), DorotheeGUID)); + Creature* Dorothee = (ObjectAccessor::GetCreature((*me), DorotheeGUID)); if (Dorothee && Dorothee->IsAlive()) { CAST_AI(boss_dorothee::boss_dorotheeAI, Dorothee->AI())->TitoDied = true; @@ -893,7 +893,7 @@ public: { IsChasing = false; - if (Unit* target = Unit::GetUnit(*me, HoodGUID)) + if (Unit* target = ObjectAccessor::GetUnit(*me, HoodGUID)) { HoodGUID = 0; if (DoGetThreat(target)) @@ -1186,7 +1186,7 @@ public: IsFakingDeath = true; Phase = PHASE_BOTH; - if (Creature* Julianne = (Unit::GetCreature((*me), JulianneGUID))) + if (Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID))) { CAST_AI(boss_julianne::boss_julianneAI, Julianne->AI())->RomuloDead = true; CAST_AI(boss_julianne::boss_julianneAI, Julianne->AI())->ResurrectSelfTimer = 10000; @@ -1200,7 +1200,7 @@ public: { if (JulianneDead) { - if (Creature* Julianne = (Unit::GetCreature((*me), JulianneGUID))) + if (Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID))) { Julianne->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Julianne->GetMotionMaster()->Clear(); @@ -1212,7 +1212,7 @@ public: return; } - if (Creature* Julianne = (Unit::GetCreature((*me), JulianneGUID))) + if (Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID))) { PretendToDie(me); IsFakingDeath = true; @@ -1231,7 +1231,7 @@ public: Talk(SAY_ROMULO_AGGRO); if (JulianneGUID) { - Creature* Julianne = (Unit::GetCreature((*me), JulianneGUID)); + Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID)); if (Julianne && Julianne->GetVictim()) { me->AddThreat(Julianne->GetVictim(), 1.0f); @@ -1275,7 +1275,7 @@ public: { if (ResurrectTimer <= diff) { - Creature* Julianne = (Unit::GetCreature((*me), JulianneGUID)); + Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID)); if (Julianne && CAST_AI(boss_julianne::boss_julianneAI, Julianne->AI())->IsFakingDeath) { Talk(SAY_ROMULO_RESURRECT); @@ -1395,7 +1395,7 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) { if (ResurrectTimer <= diff) { - Creature* Romulo = (Unit::GetCreature((*me), RomuloGUID)); + Creature* Romulo = (ObjectAccessor::GetCreature((*me), RomuloGUID)); if (Romulo && CAST_AI(boss_romulo::boss_romuloAI, Romulo->AI())->IsFakingDeath) { Talk(SAY_JULIANNE_RESURRECT); @@ -1430,7 +1430,7 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) { if (urand(0, 1) && SummonedRomulo) { - Creature* Romulo = (Unit::GetCreature((*me), RomuloGUID)); + Creature* Romulo = (ObjectAccessor::GetCreature((*me), RomuloGUID)); if (Romulo && Romulo->IsAlive() && !RomuloDead) DoCast(Romulo, SPELL_ETERNAL_AFFECTION); } else DoCast(me, SPELL_ETERNAL_AFFECTION); @@ -1460,7 +1460,7 @@ void boss_julianne::boss_julianneAI::DamageTaken(Unit* /*done_by*/, uint32 &dama DoCast(me, SPELL_DRINK_POISON); IsFakingDeath = true; - //IS THIS USEFULL? Creature* Julianne = (Unit::GetCreature((*me), JulianneGUID)); + //IS THIS USEFULL? Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID)); return; } @@ -1476,7 +1476,7 @@ void boss_julianne::boss_julianneAI::DamageTaken(Unit* /*done_by*/, uint32 &dama //if this is true then we have to kill romulo too if (RomuloDead) { - if (Creature* Romulo = (Unit::GetCreature((*me), RomuloGUID))) + if (Creature* Romulo = (ObjectAccessor::GetCreature((*me), RomuloGUID))) { Romulo->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Romulo->GetMotionMaster()->Clear(); @@ -1490,7 +1490,7 @@ void boss_julianne::boss_julianneAI::DamageTaken(Unit* /*done_by*/, uint32 &dama } //if not already returned, then romulo is alive and we can pretend die - if (Creature* Romulo = (Unit::GetCreature((*me), RomuloGUID))) + if (Creature* Romulo = (ObjectAccessor::GetCreature((*me), RomuloGUID))) { PretendToDie(me); IsFakingDeath = true; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index 9db4c4b2bfa..976a83a98c2 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -286,7 +286,7 @@ public: { if (TalkCount > 3) { - if (Creature* pSpotlight = Unit::GetCreature(*me, m_uiSpotlightGUID)) + if (Creature* pSpotlight = ObjectAccessor::GetCreature(*me, m_uiSpotlightGUID)) pSpotlight->DespawnOrUnsummon(); SetEscortPaused(false); @@ -539,7 +539,7 @@ public: uint32 NextStep(uint32 Step) { - Creature* arca = Unit::GetCreature(*me, ArcanagosGUID); + Creature* arca = ObjectAccessor::GetCreature(*me, ArcanagosGUID); Map* map = me->GetMap(); switch (Step) { @@ -630,7 +630,7 @@ public: if (Step >= 7 && Step <= 12) { - Unit* arca = Unit::GetUnit(*me, ArcanagosGUID); + Unit* arca = ObjectAccessor::GetUnit(*me, ArcanagosGUID); if (FireArcanagosTimer <= diff) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index e0c902427c2..3c4b372808b 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -196,7 +196,7 @@ public: ThreatContainer::StorageType::const_iterator i = threatlist.begin(); for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && unit->IsAlive()) { float threat = me->getThreatManager().getThreat(unit); @@ -214,7 +214,7 @@ public: ThreatContainer::StorageType::const_iterator i = threatlist.begin(); for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) unit->CastSpell(unit, SPELL_TELEPORT_CENTER, true); } @@ -227,7 +227,7 @@ public: ThreatContainer::StorageType::const_iterator i = threatlist.begin(); for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) // Knockback into the air unit->CastSpell(unit, SPELL_GRAVITY_LAPSE_DOT, true, 0, 0, me->GetGUID()); @@ -240,7 +240,7 @@ public: ThreatContainer::StorageType::const_iterator i = threatlist.begin(); for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { // Also needs an exception in spell system. @@ -260,7 +260,7 @@ public: ThreatContainer::StorageType::const_iterator i = threatlist.begin(); for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { unit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 046db7fc654..8dc8ff799ba 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -162,7 +162,7 @@ public: for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUID[i])) + if (Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUID[i])) { if (!pAdd->GetVictim()) { @@ -210,7 +210,7 @@ public: { for (std::vector<uint32>::const_iterator itr = LackeyEntryList.begin(); itr != LackeyEntryList.end(); ++itr) { - Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUID[j]); + Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUID[j]); //object already removed, not exist if (!pAdd) @@ -271,7 +271,7 @@ public: Unit* target = me; for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUID[i])) + if (Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUID[i])) { if (pAdd->IsAlive() && pAdd->GetHealth() < health) target = pAdd; @@ -287,7 +287,7 @@ public: Unit* target = me; if (urand(0, 1)) - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) + if (Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) if (pAdd->IsAlive()) target = pAdd; @@ -300,7 +300,7 @@ public: Unit* target = me; if (urand(0, 1)) - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) + if (Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) if (pAdd->IsAlive() && !pAdd->HasAura(SPELL_SHIELD)) target = pAdd; @@ -319,7 +319,7 @@ public: if (urand(0, 1)) target = me; else - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) + if (Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUID[rand()%MAX_ACTIVE_LACKEY])) if (pAdd->IsAlive()) target = pAdd; } @@ -390,7 +390,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUIDs[i])) + if (Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUIDs[i])) { if (!pAdd->GetVictim() && pAdd != me) { @@ -400,7 +400,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI } } - if (Creature* pDelrissa = Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) + if (Creature* pDelrissa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) { if (pDelrissa->IsAlive() && !pDelrissa->GetVictim()) { @@ -412,7 +412,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void JustDied(Unit* /*killer*/) override { - Creature* pDelrissa = Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA)); + Creature* pDelrissa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DELRISSA)); uint32 uiLackeyDeathCount = instance->GetData(DATA_DELRISSA_DEATH_COUNT); if (!pDelrissa) @@ -441,13 +441,13 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void KilledUnit(Unit* victim) override { - if (Creature* Delrissa = Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) + if (Creature* Delrissa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) Delrissa->AI()->KilledUnit(victim); } void AcquireGUIDs() { - if (Creature* Delrissa = (Unit::GetCreature(*me, instance->GetData64(DATA_DELRISSA)))) + if (Creature* Delrissa = (ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DELRISSA)))) { for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) m_auiLackeyGUIDs[i] = CAST_AI(boss_priestess_delrissa::boss_priestess_delrissaAI, Delrissa->AI())->m_auiLackeyGUID[i]; @@ -832,7 +832,7 @@ public: ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - if (Unit* target = Unit::GetUnit(*me, (*itr)->getUnitGuid())) + if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) { //if in melee range if (target->IsWithinDistInMap(me, 5)) @@ -918,7 +918,7 @@ public: ThreatContainer::StorageType const &t_list = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - if (Unit* target = Unit::GetUnit(*me, (*itr)->getUnitGuid())) + if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) { //if in melee range if (target->IsWithinDistInMap(me, ATTACK_DISTANCE)) @@ -1022,7 +1022,7 @@ public: Wing_Clip_Timer = 4000; Freezing_Trap_Timer = 15000; - Unit* pPet = Unit::GetUnit(*me, m_uiPetGUID); + Unit* pPet = ObjectAccessor::GetUnit(*me, m_uiPetGUID); if (!pPet) me->SummonCreature(NPC_SLIVER, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); @@ -1171,7 +1171,7 @@ public: // uint64 guid = (*itr)->guid; // if (guid) // { - // Unit* pAdd = Unit::GetUnit(*me, (*itr)->guid); + // Unit* pAdd = ObjectAccessor::GetUnit(*me, (*itr)->guid); // if (pAdd && pAdd->IsAlive()) // { DoCast(me, SPELL_LESSER_HEALING_WAVE); @@ -1256,7 +1256,7 @@ public: { for (uint8 i = 0; i < MAX_ACTIVE_LACKEY; ++i) { - if (Unit* pAdd = Unit::GetUnit(*me, m_auiLackeyGUIDs[i])) + if (Unit* pAdd = ObjectAccessor::GetUnit(*me, m_auiLackeyGUIDs[i])) { if (pAdd->IsPolymorphed()) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index 74e9321d08c..d77f5db9cea 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -107,8 +107,8 @@ public: //for (uint8 i = 0; i < CRYSTALS_NUMBER; ++i) for (std::list<uint64>::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) { - //Unit* unit = Unit::GetUnit(*me, FelCrystals[i]); - if (Creature* creature = Unit::GetCreature(*me, *itr)) + //Unit* unit = ObjectAccessor::GetUnit(*me, FelCrystals[i]); + if (Creature* creature = ObjectAccessor::GetCreature(*me, *itr)) { if (!creature->IsAlive()) creature->Respawn(); // Let the core handle setting death state, etc. @@ -148,8 +148,8 @@ public: for (std::list<uint64>::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) { pCrystal = NULL; - //pCrystal = Unit::GetUnit(*me, FelCrystals[i]); - pCrystal = Unit::GetUnit(*me, *itr); + //pCrystal = ObjectAccessor::GetUnit(*me, FelCrystals[i]); + pCrystal = ObjectAccessor::GetUnit(*me, *itr); if (pCrystal && pCrystal->IsAlive()) { // select nearest @@ -184,8 +184,8 @@ public: //for (uint8 i = 0; i < CRYSTALS_NUMBER; ++i) for (std::list<uint64>::const_iterator itr = Crystals.begin(); itr != Crystals.end(); ++itr) { - //Creature* pCrystal = (Unit::GetCreature(*me, FelCrystals[i])); - Creature* pCrystal = Unit::GetCreature(*me, *itr); + //Creature* pCrystal = (ObjectAccessor::GetCreature(*me, FelCrystals[i])); + Creature* pCrystal = ObjectAccessor::GetCreature(*me, *itr); if (pCrystal && pCrystal->IsAlive()) pCrystal->Kill(pCrystal); } @@ -206,7 +206,7 @@ public: { if (type == POINT_MOTION_TYPE && id == 1) { - Unit* CrystalChosen = Unit::GetUnit(*me, CrystalGUID); + Unit* CrystalChosen = ObjectAccessor::GetUnit(*me, CrystalGUID); if (CrystalChosen && CrystalChosen->IsAlive()) { // Make the crystal attackable @@ -292,7 +292,7 @@ public: Talk(SAY_EMPOWERED); - Unit* CrystalChosen = Unit::GetUnit(*me, CrystalGUID); + Unit* CrystalChosen = ObjectAccessor::GetUnit(*me, CrystalGUID); if (CrystalChosen && CrystalChosen->IsAlive()) // Use Deal Damage to kill it, not setDeathState. CrystalChosen->Kill(CrystalChosen); @@ -335,7 +335,7 @@ public: { if (InstanceScript* instance = me->GetInstanceScript()) { - Creature* Selin = (Unit::GetCreature(*me, instance->GetData64(DATA_SELIN))); + Creature* Selin = (ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SELIN))); if (Selin && Selin->IsAlive()) { if (CAST_AI(boss_selin_fireheart::boss_selin_fireheartAI, Selin->AI())->CrystalGUID == me->GetGUID()) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 5602a2a50e0..46c566f62bd 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -314,7 +314,7 @@ public: { if (Creature* anchor = go->FindNearestCreature(29521, 15)) if (uint64 prisonerGUID = anchor->AI()->GetGUID()) - if (Creature* prisoner = Creature::GetCreature(*player, prisonerGUID)) + if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) CAST_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); return false; @@ -467,7 +467,7 @@ public: { me->setFaction(FACTION_HOSTILE); - if (Unit* unit = Unit::GetUnit(*me, m_uiDuelerGUID)) + if (Unit* unit = ObjectAccessor::GetUnit(*me, m_uiDuelerGUID)) AttackStart(unit); } else @@ -1047,14 +1047,14 @@ class npc_scarlet_miner : public CreatureScript { if (IntroPhase == 1) { - if (Creature* car = Unit::GetCreature(*me, carGUID)) + if (Creature* car = ObjectAccessor::GetCreature(*me, carGUID)) DoCast(car, SPELL_CART_DRAG); IntroTimer = 800; IntroPhase = 2; } else { - if (Creature* car = Unit::GetCreature(*me, carGUID)) + if (Creature* car = ObjectAccessor::GetCreature(*me, carGUID)) car->AI()->DoAction(0); IntroPhase = 0; } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp index 88c30efdf71..09377f20bed 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp @@ -307,7 +307,7 @@ public: break; case 4: { - Creature* temp = Unit::GetCreature(*me, valrothGUID); + Creature* temp = ObjectAccessor::GetCreature(*me, valrothGUID); if (!temp || !temp->IsAlive()) { diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 8d5e10679ec..40773c87b68 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -400,15 +400,15 @@ public: //UpdateWorldState(me->GetMap(), WORLD_STATE_COUNTDOWN, 0); UpdateWorldState(me->GetMap(), WORLD_STATE_EVENT_BEGIN, 0); - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->setDeathState(JUST_DIED); - if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID)) temp->setDeathState(JUST_DIED); - if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID)) temp->setDeathState(JUST_DIED); - if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEligorGUID)) temp->setDeathState(JUST_DIED); - if (Creature* temp = Unit::GetCreature(*me, uiRayneGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiRayneGUID)) temp->setDeathState(JUST_DIED); uiTirionGUID = 0; @@ -419,24 +419,24 @@ public: for (uint8 i = 0; i < ENCOUNTER_DEFENDER_NUMBER; ++i) { - if (Creature* temp = Unit::GetCreature(*me, uiDefenderGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDefenderGUID[i])) temp->setDeathState(JUST_DIED); uiDefenderGUID[i] = 0; } for (uint8 i = 0; i < ENCOUNTER_EARTHSHATTER_NUMBER; ++i) { - if (Creature* temp = Unit::GetCreature(*me, uiEarthshatterGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEarthshatterGUID[i])) temp->setDeathState(JUST_DIED); uiEarthshatterGUID[i] = 0; } - if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKoltiraGUID)) temp->Respawn(); - if (Creature* temp = Unit::GetCreature(*me, uiOrbazGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiOrbazGUID)) temp->Respawn(); - if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiThassarianGUID)) temp->Respawn(); - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->Respawn(); uiKoltiraGUID = 0; @@ -445,25 +445,25 @@ public: uiLichKingGUID = 0; for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) { - if (Creature* temp = Unit::GetCreature(*me, uiAbominationGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAbominationGUID[i])) temp->setDeathState(JUST_DIED); uiAbominationGUID[i] = 0; } for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i) { - if (Creature* temp = Unit::GetCreature(*me, uiBehemothGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiBehemothGUID[i])) temp->setDeathState(JUST_DIED); uiBehemothGUID[i] = 0; } for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i) { - if (Creature* temp = Unit::GetCreature(*me, uiGhoulGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiGhoulGUID[i])) temp->setDeathState(JUST_DIED); uiGhoulGUID[i] = 0; } for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) { - if (Creature* temp = Unit::GetCreature(*me, uiWarriorGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiWarriorGUID[i])) temp->setDeathState(JUST_DIED); uiWarriorGUID[i] = 0; } @@ -514,9 +514,9 @@ public: case 1: SetHoldState(true); SpawnNPC(); - if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN07); - if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN08); for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i) @@ -534,9 +534,9 @@ public: me->Dismount(); me->CastSpell(me, SPELL_THE_MIGHT_OF_MOGRAINE, true); // need to fix, on player only - if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKoltiraGUID)) temp->Dismount(); - if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiThassarianGUID)) temp->Dismount(); bIsBattle = true; @@ -547,37 +547,37 @@ public: break; case 3: { - //Unit* pTirion = Unit::GetCreature(*me, uiTirionGUID); + //Unit* pTirion = ObjectAccessor::GetCreature(*me, uiTirionGUID); Talk(EMOTE_LIGHT_OF_DAWN05); if (me->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0)) me->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN); - if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKoltiraGUID)) { if (temp->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0)) temp->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN); temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[19].x, LightofDawnLoc[19].y, LightofDawnLoc[19].z); } - if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiThassarianGUID)) { if (temp->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0)) temp->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN); temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[21].x, LightofDawnLoc[21].y, LightofDawnLoc[21].z); } - if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID)) { temp->SetWalk(true); temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[10].x, LightofDawnLoc[10].y, LightofDawnLoc[10].z); } - if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID)) { temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[13].x, LightofDawnLoc[13].y, LightofDawnLoc[13].z); } - if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEligorGUID)) { temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[16].x, LightofDawnLoc[16].y, LightofDawnLoc[16].z); @@ -589,9 +589,9 @@ public: Talk(SAY_LIGHT_OF_DAWN27); me->SetStandState(UNIT_STAND_STATE_KNEEL); - if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKoltiraGUID)) temp->SetStandState(UNIT_STAND_STATE_KNEEL); - if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiThassarianGUID)) temp->SetStandState(UNIT_STAND_STATE_KNEEL); SetHoldState(true); break; @@ -610,7 +610,7 @@ public: break; case 8: me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP)); - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) me->CastSpell(temp, SPELL_ASHBRINGER, true); Talk(EMOTE_LIGHT_OF_DAWN14); SetHoldState(true); @@ -743,51 +743,51 @@ public: case 9: // charge begins SetHoldState(false); - if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKoltiraGUID)) { temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); } - if (Creature* temp = Unit::GetCreature(*me, uiOrbazGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiOrbazGUID)) { temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); } - if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiThassarianGUID)) { temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); } for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) - if (Creature* temp = Unit::GetCreature(*me, uiAbominationGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAbominationGUID[i])) temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i) - if (Creature* temp = Unit::GetCreature(*me, uiBehemothGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiBehemothGUID[i])) temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i) - if (Creature* temp = Unit::GetCreature(*me, uiGhoulGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiGhoulGUID[i])) temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) - if (Creature* temp = Unit::GetCreature(*me, uiWarriorGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiWarriorGUID[i])) temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z); JumpToNextStep(5000); break; // ******* After battle ***************************************************************** case 11: // Tirion starts to speak - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN28); JumpToNextStep(21000); break; case 12: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN29); JumpToNextStep(13000); break; case 13: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN30); JumpToNextStep(13000); break; @@ -810,7 +810,7 @@ public: break; case 16: // Alexandros out - if (Creature* temp = Unit::GetCreature(*me, uiAlexandrosGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAlexandrosGUID)) { temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[23].x, LightofDawnLoc[23].y, LightofDawnLoc[23].z); @@ -837,7 +837,7 @@ public: break; case 19: // runs to father - if (Creature* temp = Unit::GetCreature(*me, uiDarionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDarionGUID)) { temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN07); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[25].x, LightofDawnLoc[25].y, LightofDawnLoc[25].z); @@ -846,59 +846,59 @@ public: break; case 20: - if (Creature* temp = Unit::GetCreature(*me, uiDarionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDarionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN36); JumpToNextStep(4000); break; case 21: - if (Creature* temp = Unit::GetCreature(*me, uiDarionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDarionGUID)) temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN08); JumpToNextStep(4000); break; case 22: - if (Creature* temp = Unit::GetCreature(*me, uiAlexandrosGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAlexandrosGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN37); JumpToNextStep(8000); break; case 23: - if (Creature* temp = Unit::GetCreature(*me, uiDarionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDarionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN38); JumpToNextStep(8000); break; case 24: - if (Creature* temp = Unit::GetCreature(*me, uiAlexandrosGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAlexandrosGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN39); - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) // Tirion moves forward here + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) // Tirion moves forward here temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[1].x, LightofDawnLoc[1].y, LightofDawnLoc[1].z); JumpToNextStep(15000); break; case 25: - if (Creature* temp = Unit::GetCreature(*me, uiDarionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDarionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN40); JumpToNextStep(11000); break; case 26: - if (Creature* temp = Unit::GetCreature(*me, uiAlexandrosGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAlexandrosGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN41); JumpToNextStep(5000); break; case 27: - if (Creature* temp = Unit::GetCreature(*me, uiDarionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDarionGUID)) temp->setDeathState(JUST_DIED); JumpToNextStep(24000); break; case 28: - if (Creature* temp = Unit::GetCreature(*me, uiAlexandrosGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAlexandrosGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN42); JumpToNextStep(6000); break; @@ -908,19 +908,19 @@ public: { temp->AI()->Talk(SAY_LIGHT_OF_DAWN43); uiLichKingGUID = temp->GetGUID(); - if (Unit* pAlex = Unit::GetCreature(*me, uiAlexandrosGUID)) + if (Unit* pAlex = ObjectAccessor::GetCreature(*me, uiAlexandrosGUID)) temp->CastSpell(pAlex, SPELL_SOUL_FEAST_ALEX, false); } JumpToNextStep(2000); break; case 30: - if (Creature* temp = Unit::GetCreature(*me, uiAlexandrosGUID)) // just hide him + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiAlexandrosGUID)) // just hide him { temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN09); temp->SetVisible(false); } - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) { temp->InterruptNonMeleeSpells(false); temp->AI()->Talk(SAY_LIGHT_OF_DAWN45); @@ -936,13 +936,13 @@ public: break; case 32: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[27].x, LightofDawnLoc[27].y, LightofDawnLoc[27].z); JumpToNextStep(6000); break; case 33: // Darion supports to jump to lich king here - if (Unit::GetCreature(*me, uiLichKingGUID)) + if (ObjectAccessor::GetCreature(*me, uiLichKingGUID)) DoCast(me, SPELL_MOGRAINE_CHARGE); // jumping charge // doesn't make it looks well, so workarounds, Darion charges, looks better me->SetSpeed(MOVE_RUN, 3.0f); @@ -952,7 +952,7 @@ public: break; case 35: // Lich king counterattacks - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) { temp->HandleEmoteCommand(EMOTE_ONESHOT_KICK); temp->AI()->Talk(SAY_LIGHT_OF_DAWN46); @@ -969,29 +969,29 @@ public: break; case 38: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN47); JumpToNextStep(8000); break; case 39: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN48); JumpToNextStep(15000); break; case 40: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN49); JumpToNextStep(17000); break; case 41: // Lich king - Apocalypse - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) { temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN11); temp->AI()->Talk(SAY_LIGHT_OF_DAWN51); - if (Creature* pTirion = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* pTirion = ObjectAccessor::GetCreature(*me, uiTirionGUID)) { pTirion->SetStandState(UNIT_STAND_STATE_KNEEL); //temp->CastSpell(pTirion, SPELL_APOCALYPSE, false); // not working @@ -1007,7 +1007,7 @@ public: float fLichPositionX = 0, fLichPositionY = 0, fLichPositionZ = 0; - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) { fLichPositionX = temp->GetPositionX(); fLichPositionY = temp->GetPositionY(); @@ -1032,7 +1032,7 @@ public: temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); uiEarthshatterGUID[0] = temp->GetGUID(); } - if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); temp->SetWalk(false); @@ -1040,7 +1040,7 @@ public: temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); temp->AI()->Talk(SAY_LIGHT_OF_DAWN50); } - if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); temp->SetWalk(false); @@ -1048,7 +1048,7 @@ public: temp->HandleEmoteCommand(EMOTE_STATE_ATTACK_UNARMED); temp->GetMotionMaster()->MovePoint(0, fLichPositionX, fLichPositionY, fLichPositionZ); } - if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEligorGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_ATTACK_UNARMED); temp->SetWalk(false); @@ -1060,37 +1060,37 @@ public: break; case 43: // They all got kicked - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN13); - if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); temp->SetSpeed(MOVE_RUN, 6.0f); temp->SetStandState(UNIT_STAND_STATE_DEAD); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[14].x, LightofDawnLoc[14].y, LightofDawnLoc[14].z); } - if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); temp->SetSpeed(MOVE_RUN, 6.0f); temp->SetStandState(UNIT_STAND_STATE_DEAD); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[11].x, LightofDawnLoc[11].y, LightofDawnLoc[11].z); } - if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEligorGUID)) { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); temp->SetSpeed(MOVE_RUN, 6.0f); temp->SetStandState(UNIT_STAND_STATE_DEAD); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[17].x, LightofDawnLoc[17].y, LightofDawnLoc[17].z); } - if (Creature* temp = Unit::GetCreature(*me, uiDefenderGUID[0])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiDefenderGUID[0])) { temp->SetSpeed(MOVE_RUN, 6.0f); temp->SetStandState(UNIT_STAND_STATE_DEAD); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[0].x+rand()%10, LightofDawnLoc[0].y+rand()%10, LightofDawnLoc[0].z); } - if (Creature* temp = Unit::GetCreature(*me, uiEarthshatterGUID[0])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEarthshatterGUID[0])) { temp->SetSpeed(MOVE_RUN, 6.0f); temp->SetStandState(UNIT_STAND_STATE_DEAD); @@ -1100,11 +1100,11 @@ public: break; case 44: // make them stand up - if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID)) temp->SetStandState(UNIT_STAND_STATE_STAND); - if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID)) temp->SetStandState(UNIT_STAND_STATE_STAND); - if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEligorGUID)) temp->SetStandState(UNIT_STAND_STATE_STAND); JumpToNextStep(1000); break; @@ -1126,7 +1126,7 @@ public: case 47: // Ashbringer rebirth me->SetStandState(UNIT_STAND_STATE_KNEEL); Talk(EMOTE_LIGHT_OF_DAWN15); - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) { temp->SetStandState(UNIT_STAND_STATE_STAND); temp->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_HIGHLORD_TIRION_FORDRING)); @@ -1139,38 +1139,38 @@ public: //if (GameObject* go = me->GetMap()->GetGameObject(uiDawnofLightGUID)) // go->SetPhaseMask(128, true); me->SummonGameObject(GO_LIGHT_OF_DAWN, 2283.896f, -5287.914f, 83.066f, 0, 0, 0, 0, 0, 30000); - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) { if (temp->HasAura(SPELL_REBIRTH_OF_THE_ASHBRINGER, 0)) temp->RemoveAurasDueToSpell(SPELL_REBIRTH_OF_THE_ASHBRINGER); temp->CastSpell(temp, 41542, false); // workarounds, light expoded, makes it cool temp->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); } - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->InterruptNonMeleeSpells(false); JumpToNextStep(2500); break; case 49: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN54); JumpToNextStep(4000); break; case 50: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN55); JumpToNextStep(5000); break; case 51: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN56); JumpToNextStep(1000); break; case 52: // Tiron charges - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) { temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN16); temp->CastSpell(temp, SPELL_TIRION_CHARGE, false); // jumping charge @@ -1178,20 +1178,20 @@ public: temp->SetSpeed(MOVE_RUN, 3.0f); // workarounds, make Tirion still running temp->SetWalk(false); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[2].x, LightofDawnLoc[2].y, LightofDawnLoc[2].z); - if (Creature* lktemp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* lktemp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) lktemp->Relocate(LightofDawnLoc[28].x, LightofDawnLoc[28].y, LightofDawnLoc[28].z); // workarounds, he should kick back by Tirion, but here we relocate him } JumpToNextStep(1500); break; case 53: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN57); JumpToNextStep(1000); break; case 54: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) { temp->SetSpeed(MOVE_RUN, 1.0f); me->SetWalk(true); @@ -1201,33 +1201,33 @@ public: break; case 55: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->SetStandState(UNIT_STAND_STATE_KNEEL); JumpToNextStep(2000); break; case 56: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->SetStandState(UNIT_STAND_STATE_STAND); JumpToNextStep(1500); break; case 57: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN58); JumpToNextStep(10000); break; case 58: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN59); JumpToNextStep(10000); break; case 59: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->CastSpell(temp, SPELL_TELEPORT_VISUAL, false); - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) // Tirion runs to Darion + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) // Tirion runs to Darion { temp->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); temp->SetSpeed(MOVE_RUN, 1.0f); @@ -1237,7 +1237,7 @@ public: break; case 60: - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) // Lich king disappears here + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) // Lich king disappears here { temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN17); temp->Kill(temp); @@ -1246,13 +1246,13 @@ public: break; case 61: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN60); JumpToNextStep(3000); break; case 62: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) { temp->SetWalk(true); temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[7].x, LightofDawnLoc[7].y, LightofDawnLoc[7].z); @@ -1261,7 +1261,7 @@ public: break; case 63: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) { temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[8].x, LightofDawnLoc[8].y, LightofDawnLoc[8].z); temp->AI()->Talk(SAY_LIGHT_OF_DAWN61); @@ -1270,37 +1270,37 @@ public: break; case 64: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN62); JumpToNextStep(7000); break; case 65: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN63); JumpToNextStep(10000); break; case 66: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN64); JumpToNextStep(11000); break; case 67: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN65); JumpToNextStep(10000); break; case 68: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN66); JumpToNextStep(8000); break; case 69: - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN67); JumpToNextStep(10000); break; @@ -1335,13 +1335,13 @@ public: break; case 73: - if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKoltiraGUID)) temp->DespawnOrUnsummon(); - if (Creature* temp = Unit::GetCreature(*me, uiOrbazGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiOrbazGUID)) temp->DespawnOrUnsummon(); - if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiThassarianGUID)) temp->DespawnOrUnsummon(); - if (Creature* temp = Unit::GetCreature(*me, uiLichKingGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiLichKingGUID)) temp->DespawnOrUnsummon(); me->DespawnOrUnsummon(); break; @@ -1452,7 +1452,7 @@ public: for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) DespawnNPC(uiWarriorGUID[i]); - if (Creature* temp = Unit::GetCreature(*me, uiKorfaxGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID)) { temp->RemoveAllAuras(); temp->DeleteThreatList(); @@ -1463,7 +1463,7 @@ public: temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[9].x, LightofDawnLoc[9].y, LightofDawnLoc[9].z); } - if (Creature* temp = Unit::GetCreature(*me, uiMaxwellGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID)) { temp->RemoveAllAuras(); temp->DeleteThreatList(); @@ -1474,7 +1474,7 @@ public: temp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[12].x, LightofDawnLoc[12].y, LightofDawnLoc[12].z); } - if (Creature* temp = Unit::GetCreature(*me, uiEligorGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiEligorGUID)) { temp->RemoveAllAuras(); temp->DeleteThreatList(); @@ -1486,7 +1486,7 @@ public: } DespawnNPC(uiRayneGUID); - if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiKoltiraGUID)) { temp->RemoveAllAuras(); temp->DeleteThreatList(); @@ -1498,10 +1498,10 @@ public: temp->CastSpell(temp, SPELL_THE_LIGHT_OF_DAWN, false); } - if (Creature* temp = Unit::GetCreature(*me, uiOrbazGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiOrbazGUID)) temp->AI()->Talk(EMOTE_LIGHT_OF_DAWN04); - if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiThassarianGUID)) { temp->RemoveAllAuras(); temp->DeleteThreatList(); @@ -1513,7 +1513,7 @@ public: temp->CastSpell(temp, SPELL_THE_LIGHT_OF_DAWN, false); } - if (Creature* temp = Unit::GetCreature(*me, uiTirionGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) temp->AI()->Talk(SAY_LIGHT_OF_DAWN26); SetHoldState(false); @@ -1532,7 +1532,7 @@ public: void NPCChangeTarget(uint64 ui_GUID) { - if (Creature* temp = Unit::GetCreature(*me, ui_GUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, ui_GUID)) if (temp->IsAlive()) if (Unit* pTarger = SelectTarget(SELECT_TARGET_RANDOM, 0)) if (pTarger->IsAlive()) @@ -1553,7 +1553,7 @@ public: // Death for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i) { - temp = Unit::GetCreature(*me, uiGhoulGUID[i]); + temp = ObjectAccessor::GetCreature(*me, uiGhoulGUID[i]); if (!temp) { temp = me->SummonCreature(NPC_ACHERUS_GHOUL, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); @@ -1563,7 +1563,7 @@ public: } for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) { - temp = Unit::GetCreature(*me, uiAbominationGUID[i]); + temp = ObjectAccessor::GetCreature(*me, uiAbominationGUID[i]); if (!temp) { temp = me->SummonCreature(NPC_WARRIOR_OF_THE_FROZEN_WASTES, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); @@ -1573,7 +1573,7 @@ public: } for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) { - temp = Unit::GetCreature(*me, uiWarriorGUID[i]); + temp = ObjectAccessor::GetCreature(*me, uiWarriorGUID[i]); if (!temp) { temp = me->SummonCreature(NPC_RAMPAGING_ABOMINATION, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); @@ -1583,7 +1583,7 @@ public: } for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i) { - temp = Unit::GetCreature(*me, uiBehemothGUID[i]); + temp = ObjectAccessor::GetCreature(*me, uiBehemothGUID[i]); if (!temp) { temp = me->SummonCreature(NPC_FLESH_BEHEMOTH, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); @@ -1595,7 +1595,7 @@ public: // Dawn for (uint8 i = 0; i < ENCOUNTER_DEFENDER_NUMBER; ++i) { - temp = Unit::GetCreature(*me, uiDefenderGUID[i]); + temp = ObjectAccessor::GetCreature(*me, uiDefenderGUID[i]); if (!temp) { temp = me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); @@ -1606,7 +1606,7 @@ public: } for (uint8 i = 0; i < ENCOUNTER_EARTHSHATTER_NUMBER; ++i) { - temp = Unit::GetCreature(*me, uiEarthshatterGUID[i]); + temp = ObjectAccessor::GetCreature(*me, uiEarthshatterGUID[i]); if (!temp) { temp = me->SummonCreature(NPC_RIMBLAT_EARTHSHATTER, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); @@ -1615,7 +1615,7 @@ public: uiEarthshatterGUID[i] = temp->GetGUID(); } } - temp = Unit::GetCreature(*me, uiKorfaxGUID); + temp = ObjectAccessor::GetCreature(*me, uiKorfaxGUID); if (!temp) { temp = me->SummonCreature(NPC_KORFAX_CHAMPION_OF_THE_LIGHT, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000); @@ -1623,7 +1623,7 @@ public: me->AddThreat(temp, 0.0f); uiKorfaxGUID = temp->GetGUID(); } - temp = Unit::GetCreature(*me, uiMaxwellGUID); + temp = ObjectAccessor::GetCreature(*me, uiMaxwellGUID); if (!temp) { temp = me->SummonCreature(NPC_LORD_MAXWELL_TYROSUS, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000); @@ -1631,7 +1631,7 @@ public: me->AddThreat(temp, 0.0f); uiMaxwellGUID = temp->GetGUID(); } - temp = Unit::GetCreature(*me, uiEligorGUID); + temp = ObjectAccessor::GetCreature(*me, uiEligorGUID); if (!temp) { temp = me->SummonCreature(NPC_COMMANDER_ELIGOR_DAWNBRINGER, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000); @@ -1639,7 +1639,7 @@ public: me->AddThreat(temp, 0.0f); uiEligorGUID = temp->GetGUID(); } - temp = Unit::GetCreature(*me, uiRayneGUID); + temp = ObjectAccessor::GetCreature(*me, uiRayneGUID); if (!temp) { temp = me->SummonCreature(NPC_RAYNE, LightofDawnLoc[0].x+rand()%30, LightofDawnLoc[0].y+rand()%30, LightofDawnLoc[0].z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000); @@ -1651,7 +1651,7 @@ public: void DespawnNPC(uint64 pGUID) { - if (Creature* temp = Unit::GetCreature(*me, pGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, pGUID)) if (temp->IsAlive()) { temp->SetVisible(false); diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp index e5be2cb6eb7..43dee1338ef 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp @@ -99,7 +99,7 @@ public: FlyBackTimer = 4500; break; case 2: - if (!player->isRessurectRequested()) + if (!player->isResurrectRequested()) { me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOM_SPELL_01); DoCast(player, SPELL_REVIVE, true); diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 423f8f26130..0be681af915 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -356,7 +356,7 @@ public: if (wait <= diff) { die = false; - if (Unit* body = Unit::GetUnit(*me, bodyGUID)) + if (Unit* body = ObjectAccessor::GetUnit(*me, bodyGUID)) body->Kill(body); me->Kill(me); } @@ -428,7 +428,7 @@ public: DoCast(me, SPELL_HEAD); if (headGUID) { - if (Creature* Head = Unit::GetCreature((*me), headGUID)) + if (Creature* Head = ObjectAccessor::GetCreature((*me), headGUID)) Head->DisappearAndDie(); headGUID = 0; @@ -483,7 +483,7 @@ public: wp_reached = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SaySound(SAY_ENTRANCE); - if (Unit* player = Unit::GetUnit(*me, PlayerGUID)) + if (Unit* player = ObjectAccessor::GetUnit(*me, PlayerGUID)) DoStartMovement(player); break; } @@ -516,7 +516,7 @@ public: if (withhead) SaySound(SAY_PLAYER_DEATH); //maybe possible when player dies from conflagration - else if (Creature* Head = Unit::GetCreature((*me), headGUID)) + else if (Creature* Head = ObjectAccessor::GetCreature((*me), headGUID)) CAST_AI(npc_head::npc_headAI, Head->AI())->SaySound(SAY_PLAYER_DEATH); } } @@ -601,7 +601,7 @@ public: ThreatContainer::StorageType threatlist = caster->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->IsAlive() && unit != caster) me->AddThreat(unit, caster->getThreatManager().getThreat(unit)); } @@ -621,7 +621,7 @@ public: if (!headGUID) headGUID = DoSpawnCreature(HEAD, float(rand()%6), float(rand()%6), 0, 0, TEMPSUMMON_DEAD_DESPAWN, 0)->GetGUID(); - Unit* Head = Unit::GetUnit(*me, headGUID); + Unit* Head = ObjectAccessor::GetUnit(*me, headGUID); if (Head && Head->IsAlive()) { Head->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -746,7 +746,7 @@ public: --Phase; else Phase = 1; - Creature* Head = Unit::GetCreature((*me), headGUID); + Creature* Head = ObjectAccessor::GetCreature((*me), headGUID); if (Head && Head->IsAlive()) { CAST_AI(npc_head::npc_headAI, Head->AI())->Phase = Phase; @@ -837,7 +837,7 @@ public: if (!debuffGUID) return; - Unit* debuff = Unit::GetUnit(*me, debuffGUID); + Unit* debuff = ObjectAccessor::GetUnit(*me, debuffGUID); if (debuff) { debuff->SetVisible(false); @@ -909,7 +909,7 @@ void npc_head::npc_headAI::Disappear() if (bodyGUID) { - Creature* body = Unit::GetCreature((*me), bodyGUID); + Creature* body = ObjectAccessor::GetCreature((*me), bodyGUID); if (body && body->IsAlive()) { withbody = true; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp index e345dc60074..a7c795a81f6 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp @@ -84,7 +84,7 @@ public: void JustDied(Unit* /*killer*/) override { //Any other Actions to do with vorrel? setStandState? - if (Creature* vorrel = Creature::GetCreature(*me, instance->GetData64(DATA_VORREL))) + if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL))) vorrel->AI()->Talk(SAY_TRIGGER_VORREL); } diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp index a8d1f91c443..25bb08620a1 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp @@ -33,12 +33,12 @@ enum Says //Mograine says SAY_MO_AGGRO = 0, SAY_MO_KILL = 1, - SAY_MO_RESSURECTED = 2, + SAY_MO_RESURRECTED = 2, //Whitemane says SAY_WH_INTRO = 0, SAY_WH_KILL = 1, - SAY_WH_RESSURECT = 2, + SAY_WH_RESURRECT = 2, }; enum Spells @@ -127,7 +127,7 @@ public: return; //On first death, fake death and open door, as well as initiate whitemane if exist - if (Unit* Whitemane = Unit::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) + if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) { instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS); @@ -157,10 +157,10 @@ public: void SpellHit(Unit* /*who*/, const SpellInfo* spell) override { - //When hit with ressurection say text + //When hit with resurrection say text if (spell->Id == SPELL_SCARLETRESURRECTION) { - Talk(SAY_MO_RESSURECTED); + Talk(SAY_MO_RESURRECTED); _bFakeDeath = false; instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, SPECIAL); @@ -174,8 +174,8 @@ public: if (_bHasDied && !_bHeal && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL) { - //On ressurection, stop fake death and heal whitemane and resume fight - if (Unit* Whitemane = Unit::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) + //On resurrection, stop fake death and heal whitemane and resume fight + if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_STAND); @@ -294,7 +294,7 @@ public: if (Creature* mograine = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOGRAINE))) { DoCast(mograine, SPELL_SCARLETRESURRECTION); - Talk(SAY_WH_RESSURECT); + Talk(SAY_WH_RESURRECT); _bCanResurrect = false; } } @@ -325,7 +325,7 @@ public: if (!HealthAbovePct(75)) target = me; - if (Creature* mograine = Unit::GetCreature(*me, instance->GetData64(DATA_MOGRAINE))) + if (Creature* mograine = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOGRAINE))) { // checking _bCanResurrectCheck prevents her healing Mograine while he is "faking death" if (_bCanResurrectCheck && mograine->IsAlive() && !mograine->HealthAbovePct(75)) diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 9bcf67bce8c..4109328afda 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -187,7 +187,7 @@ public: { if (Die_Timer <= diff) { - if (Unit* temp = Unit::GetUnit(*me, Tagger)) + if (Unit* temp = ObjectAccessor::GetUnit(*me, Tagger)) { if (Player* player = temp->ToPlayer()) player->KilledMonsterCredit(NPC_RESTLESS, me->GetGUID()); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index 5bca936d5b4..8a9699ed1be 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -280,7 +280,7 @@ public: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!target) - target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); + target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); if (!target) { @@ -306,7 +306,7 @@ public: Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!target) - target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); + target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); if (!target) { @@ -335,7 +335,7 @@ public: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150, true); if (!target) - target = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); + target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); if (!target) { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 5562559786d..d300703152c 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -679,13 +679,16 @@ public: if (!map->IsDungeon()) return; - Map::PlayerList const &PlayerList = map->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + Map::PlayerList const &playerList = map->GetPlayers(); + Position homePos = me->GetHomePosition(); + for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) { - if (i->GetSource()->GetPositionZ() <= DRAGON_REALM_Z-5) + Player* player = itr->GetSource(); + if (player->IsInDist(&homePos, 50.0f) && player->GetPositionZ() <= DEMON_REALM_Z + 10.f) { - i->GetSource()->RemoveAura(AURA_SPECTRAL_REALM); - i->GetSource()->TeleportTo(me->GetMap()->GetId(), i->GetSource()->GetPositionX(), i->GetSource()->GetPositionY(), DRAGON_REALM_Z+5, i->GetSource()->GetOrientation()); + player->RemoveAura(AURA_SPECTRAL_REALM); + player->TeleportTo(me->GetMap()->GetId(), player->GetPositionX(), + player->GetPositionY(), DRAGON_REALM_Z + 5, player->GetOrientation()); } } } @@ -763,7 +766,7 @@ public: ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid())) + if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) if (unit->GetPositionZ() > me->GetPositionZ() + 5) me->getThreatManager().modifyThreatPercent(unit, -100); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 179a649aab4..565d40a802e 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -956,7 +956,7 @@ public: ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit) pPortal->AddThreat(unit, 1.0f); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 9d9232b774d..faecb2ca2f0 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -603,7 +603,7 @@ public: { if (SpellTimer <= diff) { - Unit* Victim = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); + Unit* Victim = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); switch (NeedForAHack) { case 0: diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp index 9134f15959f..f06dc247883 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp @@ -94,7 +94,7 @@ class boss_archaedas : public CreatureScript void ActivateMinion(uint64 uiGuid, bool flag) { - Unit* minion = Unit::GetUnit(*me, uiGuid); + Unit* minion = ObjectAccessor::GetUnit(*me, uiGuid); if (minion && minion->IsAlive()) { @@ -139,7 +139,7 @@ class boss_archaedas : public CreatureScript } else if (bWakingUp && iAwakenTimer <= 0) { bWakingUp = false; - AttackStart(Unit::GetUnit(*me, instance->GetData64(0))); + AttackStart(ObjectAccessor::GetUnit(*me, instance->GetData64(0))); return; // dont want to continue until we finish the AttackStart method } @@ -285,7 +285,7 @@ class npc_archaedas_minions : public CreatureScript { bWakingUp = false; bAmIAwake = true; - // AttackStart(Unit::GetUnit(*me, instance->GetData64(0))); // whoWokeArchaedasGUID + // AttackStart(ObjectAccessor::GetUnit(*me, instance->GetData64(0))); // whoWokeArchaedasGUID return; // dont want to continue until we finish the AttackStart method } diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp index 717406e6750..56c84677181 100644 --- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp +++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp @@ -252,7 +252,7 @@ class instance_uldaman : public InstanceMapScript if (!archaedas) return; - if (Unit::GetUnit(*archaedas, target)) + if (ObjectAccessor::GetUnit(*archaedas, target)) { archaedas->CastSpell(archaedas, SPELL_ARCHAEDAS_AWAKEN, false); whoWokeuiArchaedasGUID = target; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index 3adca160720..9810c42bdfb 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -304,13 +304,13 @@ class boss_akilzon : public CreatureScript break; case EVENT_STORM_SEQUENCE: { - Unit* target = Unit::GetUnit(*me, CloudGUID); + Unit* target = ObjectAccessor::GetUnit(*me, CloudGUID); if (!target || !target->IsAlive()) { EnterEvadeMode(); return; } - else if (Unit* Cyclone = Unit::GetUnit(*me, CycloneGUID)) + else if (Unit* Cyclone = ObjectAccessor::GetUnit(*me, CycloneGUID)) Cyclone->CastSpell(target, SPELL_SAND_STORM, true); // keep casting or... HandleStormSequence(target); break; @@ -323,7 +323,7 @@ class boss_akilzon : public CreatureScript for (uint8 i = 0; i < 8; ++i) { - Unit* bird = Unit::GetUnit(*me, BirdGUIDs[i]); + Unit* bird = ObjectAccessor::GetUnit(*me, BirdGUIDs[i]); if (!bird) //they despawned on die { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) @@ -406,7 +406,7 @@ class npc_akilzon_eagle : public CreatureScript arrived = true; if (TargetGUID) { - if (Unit* target = Unit::GetUnit(*me, TargetGUID)) + if (Unit* target = ObjectAccessor::GetUnit(*me, TargetGUID)) DoCast(target, SPELL_EAGLE_SWOOP, true); TargetGUID = 0; me->SetSpeed(MOVE_RUN, 1.2f); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp index 2da0201e060..74ce267441f 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp @@ -152,7 +152,7 @@ class boss_halazzi : public CreatureScript me->Attack(me->GetVictim(), true); me->GetMotionMaster()->MoveChase(me->GetVictim()); } - if (Creature* Lynx = Unit::GetCreature(*me, LynxGUID)) + if (Creature* Lynx = ObjectAccessor::GetCreature(*me, LynxGUID)) Lynx->DisappearAndDie(); me->SetMaxHealth(600000); me->SetHealth(600000 - 150000 * TransformCount); @@ -174,7 +174,7 @@ class boss_halazzi : public CreatureScript TotemTimer = 12000; break; case PHASE_MERGE: - if (Unit* pLynx = Unit::GetUnit(*me, LynxGUID)) + if (Unit* pLynx = ObjectAccessor::GetUnit(*me, LynxGUID)) { Talk(SAY_MERGE); pLynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -259,7 +259,7 @@ class boss_halazzi : public CreatureScript EnterPhase(PHASE_MERGE); else { - Unit* Lynx = Unit::GetUnit(*me, LynxGUID); + Unit* Lynx = ObjectAccessor::GetUnit(*me, LynxGUID); if (Lynx && !Lynx->HealthAbovePct(20) /*Lynx->HealthBelowPct(10)*/) EnterPhase(PHASE_MERGE); } @@ -272,7 +272,7 @@ class boss_halazzi : public CreatureScript { if (CheckTimer <= diff) { - Unit* Lynx = Unit::GetUnit(*me, LynxGUID); + Unit* Lynx = ObjectAccessor::GetUnit(*me, LynxGUID); if (Lynx) { Lynx->GetMotionMaster()->MoveFollow(me, 0, 0); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index a7afa93e835..6e5517e82a6 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -303,7 +303,7 @@ class boss_hexlord_malacrass : public CreatureScript for (uint8 i = 0; i < 4; ++i) { - Creature* creature = Unit::GetCreature(*me, AddGUID[i]); + Creature* creature = ObjectAccessor::GetCreature(*me, AddGUID[i]); if (creature && creature->IsAlive()) creature->AI()->AttackStart(me->GetVictim()); else @@ -338,7 +338,7 @@ class boss_hexlord_malacrass : public CreatureScript for (uint8 i = 0; i < 4; ++i) { - Unit* Temp = Unit::GetUnit(*me, AddGUID[i]); + Unit* Temp = ObjectAccessor::GetUnit(*me, AddGUID[i]); if (Temp && Temp->IsAlive()) Temp->DealDamage(Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } @@ -363,7 +363,7 @@ class boss_hexlord_malacrass : public CreatureScript { for (uint8 i = 0; i < 4; ++i) { - Creature* creature = (Unit::GetCreature((*me), AddGUID[i])); + Creature* creature = (ObjectAccessor::GetCreature((*me), AddGUID[i])); if (!creature || !creature->IsAlive()) { if (creature) creature->setDeathState(DEAD); @@ -397,7 +397,7 @@ class boss_hexlord_malacrass : public CreatureScript if (CheckAddState_Timer <= diff) { for (uint8 i = 0; i < 4; ++i) - if (Creature* temp = Unit::GetCreature(*me, AddGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, AddGUID[i])) if (temp->IsAlive() && !temp->GetVictim()) temp->AI()->AttackStart(me->GetVictim()); @@ -462,7 +462,7 @@ class boss_hexlord_malacrass : public CreatureScript if (PlayerAbility_Timer <= diff) { - //Unit* target = Unit::GetUnit(*me, PlayerGUID); + //Unit* target = ObjectAccessor::GetUnit(*me, PlayerGUID); //if (target && target->IsAlive()) //{ UseAbility(); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp index 47ca91ec591..f264b12ca23 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp @@ -292,7 +292,7 @@ class boss_janalai : public CreatureScript { if (BombCount < 40) { - if (Unit* FireBomb = Unit::GetUnit(*me, FireBombGUIDs[BombCount])) + if (Unit* FireBomb = ObjectAccessor::GetUnit(*me, FireBombGUIDs[BombCount])) { FireBomb->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCast(FireBomb, SPELL_FIRE_BOMB_THROW, true); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp index 179b29b70d8..6b0fc05ba3d 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp @@ -229,7 +229,7 @@ class boss_zuljin : public CreatureScript Talk(YELL_DEATH); Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE); - if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[3])) + if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[3])) Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); } @@ -284,7 +284,7 @@ class boss_zuljin : public CreatureScript { if (SpiritGUID[i]) { - if (Unit* temp = Unit::GetUnit(*me, SpiritGUID[i])) + if (Unit* temp = ObjectAccessor::GetUnit(*me, SpiritGUID[i])) { temp->SetVisible(false); temp->setDeathState(DEAD); @@ -322,10 +322,10 @@ class boss_zuljin : public CreatureScript Talk(Transform[Phase].text); if (Phase > 0) { - if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[Phase - 1])) + if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[Phase - 1])) Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); } - if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[NextPhase - 1])) + if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[NextPhase - 1])) Temp->CastSpell(me, SPELL_SIPHON_SOUL, false); // should m cast on temp if (NextPhase == 2) { @@ -442,7 +442,7 @@ class boss_zuljin : public CreatureScript if (Claw_Loop_Timer <= diff) { Unit* target = me->GetVictim(); - if (!target || !target->isTargetableForAttack()) target = Unit::GetUnit(*me, TankGUID); + if (!target || !target->isTargetableForAttack()) target = ObjectAccessor::GetUnit(*me, TankGUID); if (!target || !target->isTargetableForAttack()) target = SelectTarget(SELECT_TARGET_RANDOM, 0); if (target) { @@ -455,7 +455,7 @@ class boss_zuljin : public CreatureScript { Claw_Rage_Timer = urand(15000, 20000); me->SetSpeed(MOVE_RUN, 1.2f); - AttackStart(Unit::GetUnit(*me, TankGUID)); + AttackStart(ObjectAccessor::GetUnit(*me, TankGUID)); TankGUID = 0; return; } @@ -503,7 +503,7 @@ class boss_zuljin : public CreatureScript { Lynx_Rush_Timer = urand(15000, 20000); me->SetSpeed(MOVE_RUN, 1.2f); - AttackStart(Unit::GetUnit(*me, TankGUID)); + AttackStart(ObjectAccessor::GetUnit(*me, TankGUID)); TankGUID = 0; } else diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp index efd18472a52..4ac34615498 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp @@ -344,7 +344,7 @@ class npc_zulian_prowler : public CreatureScript DoCast(me, SPELL_SNEAK_RANK_1_1); DoCast(me, SPELL_SNEAK_RANK_1_2); - if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) + if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ()); _events.ScheduleEvent(EVENT_ATTACK, 6000); } diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp index 236455137dc..4eaf98d0a0e 100644 --- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp +++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp @@ -29,18 +29,19 @@ EndScriptData */ enum TwilightCorrupter { - ITEM_FRAGMENT = 21149, NPC_TWILIGHT_CORRUPTER = 15625, - YELL_TWILIGHTCORRUPTOR_RESPAWN = 0, - YELL_TWILIGHTCORRUPTOR_AGGRO = 1, - YELL_TWILIGHTCORRUPTOR_KILL = 2, + YELL_TWILIGHT_CORRUPTOR_RESPAWN = 0, + YELL_TWILIGHT_CORRUPTOR_AGGRO = 1, + YELL_TWILIGHT_CORRUPTOR_KILL = 2, + SPELL_SOUL_CORRUPTION = 25805, SPELL_CREATURE_OF_NIGHTMARE = 25806, SPELL_LEVEL_UP = 24312, EVENT_SOUL_CORRUPTION = 1, EVENT_CREATURE_OF_NIGHTMARE = 2, - FACTION_HOSTILE = 14 + + QUEST_NIGHTMARES_CORRUPTION = 8735 }; /*###### @@ -58,12 +59,13 @@ public: void Reset() override { - KillCount = 0; + _events.Reset(); + KillCount = 0; } void EnterCombat(Unit* /*who*/) override { - Talk(YELL_TWILIGHTCORRUPTOR_AGGRO); + Talk(YELL_TWILIGHT_CORRUPTOR_AGGRO); _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, 15000); _events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 30000); } @@ -73,7 +75,7 @@ public: if (victim->GetTypeId() == TYPEID_PLAYER) { ++KillCount; - Talk(YELL_TWILIGHTCORRUPTOR_KILL, victim); + Talk(YELL_TWILIGHT_CORRUPTOR_KILL, victim); if (KillCount == 3) { @@ -90,22 +92,27 @@ public: _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_SOUL_CORRUPTION: - DoCastVictim(SPELL_SOUL_CORRUPTION); - _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, rand()%4000+15000); + DoCastAOE(SPELL_SOUL_CORRUPTION); + _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, urand(15000, 19000)); break; case EVENT_CREATURE_OF_NIGHTMARE: - DoCastVictim(SPELL_CREATURE_OF_NIGHTMARE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_CREATURE_OF_NIGHTMARE); _events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 45000); break; default: break; } } + DoMeleeAttackIfReady(); } @@ -124,27 +131,22 @@ public: # at_twilight_grove ######*/ +Position const TwillightCorrupter = { -10328.16f, -489.57f, 49.95f, 0.0f }; + class at_twilight_grove : public AreaTriggerScript { -public: - at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { } + public: + at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { } - bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override - { - if (player->HasQuestForItem(ITEM_FRAGMENT)) + bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override { - if (Unit* corrupter = player->SummonCreature(NPC_TWILIGHT_CORRUPTER, -10328.16f, -489.57f, 49.95f, 0, TEMPSUMMON_MANUAL_DESPAWN, 60000)) - corrupter->setFaction(FACTION_HOSTILE); + if (player->GetQuestStatus(QUEST_NIGHTMARES_CORRUPTION) == QUEST_STATUS_INCOMPLETE) + if (!player->FindNearestCreature(NPC_TWILIGHT_CORRUPTER, 500.0f, true)) + if (Creature* corrupter = player->SummonCreature(NPC_TWILIGHT_CORRUPTER, TwillightCorrupter, TEMPSUMMON_MANUAL_DESPAWN, 60000)) + corrupter->AI()->Talk(YELL_TWILIGHT_CORRUPTOR_RESPAWN, player); - if (Creature* CorrupterSpeaker = player->SummonCreature(1, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()-1, 0, TEMPSUMMON_TIMED_DESPAWN, 15000)) - { - CorrupterSpeaker->SetName("Twilight Corrupter"); - CorrupterSpeaker->SetVisible(true); - CorrupterSpeaker->AI()->Talk(YELL_TWILIGHTCORRUPTOR_RESPAWN, player); - } - } - return false; - }; + return false; + }; }; void AddSC_duskwood() diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index ecf2bd95cbe..e7e374ea26e 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -252,7 +252,7 @@ public: { me->DisappearAndDie(); - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) + if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) { if (pMarzon->IsAlive()) pMarzon->DisappearAndDie(); @@ -261,7 +261,7 @@ public: void EnterCombat(Unit* who) override { - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) + if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) { if (pMarzon->IsAlive() && !pMarzon->IsInCombat()) pMarzon->AI()->AttackStart(who); @@ -335,7 +335,7 @@ public: uiPhase = 0; break; case 5: - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) + if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) pMarzon->AI()->Talk(SAY_MARZON_1); uiTimer = 3000; uiPhase = 6; @@ -350,7 +350,7 @@ public: case 7: if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 20.0f, true)) pTyrion->AI()->Talk(SAY_TYRION_2); - if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) + if (Creature* pMarzon = ObjectAccessor::GetCreature(*me, MarzonGUID)) pMarzon->setFaction(14); me->setFaction(14); uiTimer = 0; diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index 07cdcefcbbb..0958a9141f0 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -130,7 +130,7 @@ public: { if (summoned->GetEntry() == ENTRY_HIGHBORNE_BUNNY) { - if (Creature* target = Unit::GetCreature(*summoned, targetGUID)) + if (Creature* target = ObjectAccessor::GetCreature(*summoned, targetGUID)) { target->MonsterMoveWithSpeed(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ()+15.0f, 0); target->SetPosition(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ()+15.0f, 0.0f); diff --git a/src/server/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp index eeda208f0e1..353b5ab9501 100644 --- a/src/server/scripts/Events/childrens_week.cpp +++ b/src/server/scripts/Events/childrens_week.cpp @@ -1036,7 +1036,7 @@ class npc_grizzlemaw_cw_trigger : public CreatureScript if (who && who->GetDistance2d(me) < 10.0f) if (Player* player = who->ToPlayer()) if (player->GetQuestStatus(QUEST_HOME_OF_THE_BEAR_MEN) == QUEST_STATUS_INCOMPLETE) - if (Creature* orphan = Creature::GetCreature(*me, getOrphanGUID(player, ORPHAN_WOLVAR))) + if (Creature* orphan = ObjectAccessor::GetCreature(*me, getOrphanGUID(player, ORPHAN_WOLVAR))) { player->AreaExploredOrEventHappens(QUEST_HOME_OF_THE_BEAR_MEN); orphan->AI()->Talk(TEXT_WOLVAR_ORPHAN_10); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index ebe9939390f..7aaa2239745 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -94,7 +94,7 @@ public: { if (waypointId == 7) { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index c0f3ea35004..d86e3342cf0 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -118,7 +118,7 @@ public: { if (CheckTimer <= diff) { - if (Unit* Archimonde = Unit::GetUnit(*me, ArchimondeGUID)) + if (Unit* Archimonde = ObjectAccessor::GetUnit(*me, ArchimondeGUID)) { if (Archimonde->HealthBelowPct(2) || !Archimonde->IsAlive()) DoCast(me, SPELL_DENOUEMENT_WISP); @@ -205,7 +205,7 @@ public: { if (ChangeTargetTimer <= diff) { - if (Unit* temp = Unit::GetUnit(*me, TargetGUID)) + if (Unit* temp = ObjectAccessor::GetUnit(*me, TargetGUID)) { me->GetMotionMaster()->MoveFollow(temp, 0.0f, 0.0f); TargetGUID = 0; @@ -364,7 +364,7 @@ public: ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); for (; itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->IsAlive()) targets.push_back(unit); } @@ -406,7 +406,7 @@ public: summoned->CastSpell(summoned, SPELL_DOOMFIRE_SPAWN, false); summoned->CastSpell(summoned, SPELL_DOOMFIRE, true, 0, 0, me->GetGUID()); - if (Unit* DoomfireSpirit = Unit::GetUnit(*me, DoomfireSpiritGUID)) + if (Unit* DoomfireSpirit = ObjectAccessor::GetUnit(*me, DoomfireSpiritGUID)) { summoned->GetMotionMaster()->MoveFollow(DoomfireSpirit, 0.0f, 0.0f); DoomfireSpiritGUID = 0; @@ -487,7 +487,7 @@ public: if (temp) WorldTreeGUID = temp->GetGUID(); - if (Unit* Nordrassil = Unit::GetUnit(*me, WorldTreeGUID)) + if (Unit* Nordrassil = ObjectAccessor::GetUnit(*me, WorldTreeGUID)) { Nordrassil->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Nordrassil->SetDisplayId(11686); @@ -496,7 +496,7 @@ public: } } - if (Unit* Nordrassil = Unit::GetUnit(*me, WorldTreeGUID)) + if (Unit* Nordrassil = ObjectAccessor::GetUnit(*me, WorldTreeGUID)) { Nordrassil->CastSpell(me, SPELL_DRAIN_WORLD_TREE_2, true); DrainNordrassilTimer = 1000; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index d7c48541315..c9e010e4159 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -99,7 +99,7 @@ public: { if (waypointId == 7 && instance) { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index 193b8bfe483..5266f2b22c5 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -94,7 +94,7 @@ public: { if (waypointId == 7 && instance) { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp index 21fe3ab946b..9ac5034d954 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp @@ -89,7 +89,7 @@ public: { if (waypointId == 7 && instance) { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index c8006158ef1..4e6da7dcac2 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -665,7 +665,7 @@ void hyjalAI::DeSpawnVeins() { if (Faction == 1) { - Creature* unit=Unit::GetCreature((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); + Creature* unit=ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_JAINAPROUDMOORE)); if (!unit)return; hyjalAI* ai = CAST_AI(hyjalAI, unit->AI()); if (!ai)return; @@ -676,7 +676,7 @@ void hyjalAI::DeSpawnVeins() } } else if (Faction) { - Creature* unit=Unit::GetCreature((*me), instance->GetData64(DATA_THRALL)); + Creature* unit=ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_THRALL)); if (!unit)return; hyjalAI* ai = CAST_AI(hyjalAI, unit->AI()); if (!ai)return; @@ -804,7 +804,7 @@ void hyjalAI::UpdateAI(uint32 diff) { if (BossGUID[i]) { - Unit* unit = Unit::GetUnit(*me, BossGUID[i]); + Unit* unit = ObjectAccessor::GetUnit(*me, BossGUID[i]); if (unit && (!unit->IsAlive())) { if (BossGUID[i] == BossGUID[0]) @@ -937,7 +937,7 @@ void hyjalAI::WaypointReached(uint32 waypointId) DoCast(me, SPELL_MASS_TELEPORT, false); if (me->GetEntry() == THRALL && DummyGuid) { - if (Creature* creature = Unit::GetCreature(*me, DummyGuid)) + if (Creature* creature = ObjectAccessor::GetCreature(*me, DummyGuid)) { hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); ai->DoMassTeleport = true; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 038b7ab69ce..85de43cb4c4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -447,7 +447,7 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } @@ -486,7 +486,7 @@ public: CanMove = true; if (instance->GetData(DATA_ALLIANCE_RETREAT) && !instance->GetData(DATA_HORDE_RETREAT)) { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } else if (instance->GetData(DATA_ALLIANCE_RETREAT) && instance->GetData(DATA_HORDE_RETREAT)){ @@ -563,13 +563,13 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } else { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } @@ -662,13 +662,13 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } else { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } @@ -773,13 +773,13 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } else { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } @@ -886,13 +886,13 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } else { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } @@ -982,13 +982,13 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } else { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } @@ -1068,13 +1068,13 @@ public: { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } else { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) me->AddThreat(target, 0.0f); } @@ -1155,7 +1155,7 @@ public: { if (waypointId == 2 && !IsOverrun) { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) { me->AddThreat(target, 0.0f); @@ -1276,7 +1276,7 @@ public: { if (waypointId == 2 && !IsOverrun) { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); + Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) { me->AddThreat(target, 0.0f); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp index 0e6d60395d8..fd832051421 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp @@ -627,7 +627,7 @@ public: JumpToNextStep(2000); break; case 3: - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) { uther->AI()->Talk(SAY_PHASE102); } @@ -642,13 +642,13 @@ public: break; //After waypoint 1 case 5: - if (Creature* jaina = Unit::GetCreature(*me, jainaGUID)) + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) jaina->SetTarget(me->GetGUID()); Talk(SAY_PHASE104); JumpToNextStep(10000); break; case 6: - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) uther->AI()->Talk(SAY_PHASE105); JumpToNextStep(1000); break; @@ -657,7 +657,7 @@ public: JumpToNextStep(4000); break; case 8: - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) uther->AI()->Talk(SAY_PHASE107); JumpToNextStep(6000); break; @@ -666,7 +666,7 @@ public: JumpToNextStep(4000); break; case 10: - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) uther->AI()->Talk(SAY_PHASE109); JumpToNextStep(8000); break; @@ -675,7 +675,7 @@ public: JumpToNextStep(4000); break; case 12: - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) uther->AI()->Talk(SAY_PHASE111); JumpToNextStep(4000); break; @@ -684,7 +684,7 @@ public: JumpToNextStep(11000); break; case 14: - if (Creature* jaina = Unit::GetCreature(*me, jainaGUID)) + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) jaina->AI()->Talk(SAY_PHASE113); JumpToNextStep(3000); break; @@ -693,12 +693,12 @@ public: JumpToNextStep(9000); break; case 16: - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) uther->AI()->Talk(SAY_PHASE115); JumpToNextStep(4000); break; case 17: - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) { uther->SetWalk(true); uther->GetMotionMaster()->MovePoint(0, 1794.357f, 1272.183f, 140.558f); @@ -706,7 +706,7 @@ public: JumpToNextStep(1000); break; case 18: - if (Creature* jaina = Unit::GetCreature(*me, jainaGUID)) + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) { me->SetTarget(jainaGUID); jaina->SetWalk(true); @@ -719,7 +719,7 @@ public: JumpToNextStep(1000); break; case 20: - if (Creature* jaina = Unit::GetCreature(*me, jainaGUID)) + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) jaina->AI()->Talk(SAY_PHASE117); JumpToNextStep(3000); break; @@ -740,10 +740,10 @@ public: bStepping = false; SetRun(true); - if (Creature* jaina = Unit::GetCreature(*me, jainaGUID)) + if (Creature* jaina = ObjectAccessor::GetCreature(*me, jainaGUID)) jaina->DisappearAndDie(); - if (Creature* uther = Unit::GetCreature(*me, utherGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, utherGUID)) uther->DisappearAndDie(); me->SetTarget(0); @@ -772,7 +772,7 @@ public: //After waypoint 9 case 27: me->SetTarget(citymenGUID[0]); - if (Creature* cityman = Unit::GetCreature(*me, citymenGUID[0])) + if (Creature* cityman = ObjectAccessor::GetCreature(*me, citymenGUID[0])) { cityman->SetTarget(me->GetGUID()); cityman->SetWalk(true); @@ -781,7 +781,7 @@ public: JumpToNextStep(2000); break; case 28: - if (Creature* cityman = Unit::GetCreature(*me, citymenGUID[0])) + if (Creature* cityman = ObjectAccessor::GetCreature(*me, citymenGUID[0])) cityman->AI()->Talk(SAY_PHASE202); JumpToNextStep(4000); break; @@ -799,11 +799,11 @@ public: case 31: SetEscortPaused(false); bStepping = false; - if (Creature* cityman1 = Unit::GetCreature(*me, citymenGUID[1])) + if (Creature* cityman1 = ObjectAccessor::GetCreature(*me, citymenGUID[1])) { cityman1->AI()->Talk(SAY_PHASE204); cityman1->SetTarget(me->GetGUID()); - if (Creature* cityman0 = Unit::GetCreature(*me, citymenGUID[0])) + if (Creature* cityman0 = ObjectAccessor::GetCreature(*me, citymenGUID[0])) cityman0->Kill(cityman0); me->SetTarget(citymenGUID[1]); } @@ -815,7 +815,7 @@ public: JumpToNextStep(1000); break; case 33: - if (Creature* cityman1 = Unit::GetCreature(*me, citymenGUID[1])) + if (Creature* cityman1 = ObjectAccessor::GetCreature(*me, citymenGUID[1])) cityman1->Kill(cityman1); JumpToNextStep(1000); break; @@ -839,7 +839,7 @@ public: case 36: if (Creature* malganis = me->SummonCreature(NPC_MAL_GANIS, 2117.349f, 1288.624f, 136.271f, 1.37f, TEMPSUMMON_TIMED_DESPAWN, 60000)) { - if (Creature* pStalkerM = Unit::GetCreature(*me, stalkerGUID)) + if (Creature* pStalkerM = ObjectAccessor::GetCreature(*me, stalkerGUID)) malganis->CastSpell(pStalkerM, 63793, false); malganisGUID = malganis->GetGUID(); @@ -850,7 +850,7 @@ public: JumpToNextStep(11000); break; case 37: - if (Creature* malganis = Unit::GetCreature(*me, malganisGUID)) + if (Creature* malganis = ObjectAccessor::GetCreature(*me, malganisGUID)) { Creature* pZombie = GetClosestCreatureWithEntry(malganis, NPC_CITY_MAN, 100.0f); if (!pZombie) @@ -865,12 +865,12 @@ public: phaseTimer = 500; break; case 38: - if (Creature* malganis = Unit::GetCreature(*me, malganisGUID)) + if (Creature* malganis = ObjectAccessor::GetCreature(*me, malganisGUID)) malganis->AI()->Talk(SAY_PHASE207); JumpToNextStep(17000); break; case 39: - if (Creature* malganis = Unit::GetCreature(*me, malganisGUID)) + if (Creature* malganis = ObjectAccessor::GetCreature(*me, malganisGUID)) malganis->SetVisible(false); Talk(SAY_PHASE208); JumpToNextStep(7000); @@ -922,7 +922,7 @@ public: if (waveGUID[i] == 0) break; ++mobCounter; - Unit* temp = Unit::GetCreature(*me, waveGUID[i]); + Unit* temp = ObjectAccessor::GetCreature(*me, waveGUID[i]); if (!temp || temp->isDead()) ++deadCounter; } @@ -976,16 +976,16 @@ public: //After Gossip 2 (waypoint 22) case 61: me->SetReactState(REACT_AGGRESSIVE); - if (Creature* disguised0 = Unit::GetCreature(*me, infiniteDraconianGUID[0])) + if (Creature* disguised0 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[0])) disguised0->SetTarget(me->GetGUID()); - if (Creature* disguised1 = Unit::GetCreature(*me, infiniteDraconianGUID[1])) + if (Creature* disguised1 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[1])) disguised1->SetTarget(me->GetGUID()); - if (Creature* disguised2 = Unit::GetCreature(*me, infiniteDraconianGUID[2])) + if (Creature* disguised2 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[2])) disguised2->SetTarget(me->GetGUID()); JumpToNextStep(1000); break; case 62: - if (Creature* disguised0 = Unit::GetCreature(*me, infiniteDraconianGUID[0])) + if (Creature* disguised0 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[0])) disguised0->AI()->Talk(SAY_PHASE302); JumpToNextStep(7000); break; @@ -1001,7 +1001,7 @@ public: JumpToNextStep(1000); break; case 65: - if (Creature* disguised0 = Unit::GetCreature(*me, infiniteDraconianGUID[0])) + if (Creature* disguised0 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[0])) disguised0->HandleEmoteCommand(11); JumpToNextStep(1000); break; @@ -1010,12 +1010,12 @@ public: JumpToNextStep(2000); break; case 67: - if (Creature* disguised0 = Unit::GetCreature(*me, infiniteDraconianGUID[0])) + if (Creature* disguised0 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[0])) disguised0->AI()->Talk(SAY_PHASE305); JumpToNextStep(1000); break; case 68: - if (Creature* disguised2 = Unit::GetCreature(*me, infiniteDraconianGUID[2])) + if (Creature* disguised2 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[2])) { disguised2->UpdateEntry(NPC_INFINITE_HUNTER); //Make them unattackable @@ -1025,7 +1025,7 @@ public: JumpToNextStep(2000); break; case 69: - if (Creature* disguised1 = Unit::GetCreature(*me, infiniteDraconianGUID[1])) + if (Creature* disguised1 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[1])) { disguised1->UpdateEntry(NPC_INFINITE_AGENT); //Make them unattackable @@ -1035,7 +1035,7 @@ public: JumpToNextStep(2000); break; case 70: - if (Creature* disguised0 = Unit::GetCreature(*me, infiniteDraconianGUID[0])) + if (Creature* disguised0 = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[0])) { disguised0->UpdateEntry(NPC_INFINITE_ADVERSARY); //Make them unattackable @@ -1051,7 +1051,7 @@ public: case 77: //Make cratures attackable for (uint32 i = 0; i< ENCOUNTER_DRACONIAN_NUMBER; ++i) - if (Creature* temp = Unit::GetCreature(*me, infiniteDraconianGUID[i])) + if (Creature* temp = ObjectAccessor::GetCreature(*me, infiniteDraconianGUID[i])) { temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); temp->SetReactState(REACT_AGGRESSIVE); @@ -1091,7 +1091,7 @@ public: if (instance->GetData(DATA_EPOCH_EVENT) != DONE) { SpawnTimeRift(17, &epochGUID); - if (Creature* epoch = Unit::GetCreature(*me, epochGUID)) + if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID)) epoch->AI()->Talk(SAY_PHASE314); me->SetTarget(epochGUID); } @@ -1105,7 +1105,7 @@ public: case 82: if (instance->GetData(DATA_EPOCH_EVENT) != DONE) { - if (Creature* epoch = Unit::GetCreature(*me, epochGUID)) + if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID)) { //Make Epoch attackable epoch->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); @@ -1157,7 +1157,7 @@ public: me->SetTarget(malganisGUID); break; case 87: - if (Creature* malganis = Unit::GetCreature(*me, malganisGUID)) + if (Creature* malganis = ObjectAccessor::GetCreature(*me, malganisGUID)) { malganis->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_UNK_6 | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_UNK_15); malganis->SetReactState(REACT_AGGRESSIVE); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index f6ff1719391..14f9bfb2e2f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -402,7 +402,7 @@ public: case 94: if (uint64 TarethaGUID = instance->GetData64(DATA_TARETHA)) { - if (Creature* Taretha = Creature::GetCreature(*me, TarethaGUID)) + if (Creature* Taretha = ObjectAccessor::GetCreature(*me, TarethaGUID)) Taretha->AI()->Talk(SAY_TA_ESCAPED, me); } break; @@ -590,7 +590,7 @@ public: if (instance->GetData64(DATA_EPOCH) == 0) creature->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - if (Creature* thrall = (Unit::GetCreature(*creature, instance->GetData64(DATA_THRALL)))) + if (Creature* thrall = (ObjectAccessor::GetCreature(*creature, instance->GetData64(DATA_THRALL)))) CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); } } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 35086afa42e..21da920e4fd 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -545,7 +545,7 @@ public: while (i != Stomach_Map.end()) { //Check for valid player - Unit* unit = Unit::GetUnit(*me, i->first); + Unit* unit = ObjectAccessor::GetUnit(*me, i->first); //Only units out of stomach if (unit && i->second == false) @@ -640,7 +640,7 @@ public: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); //Emerging phase - //AttackStart(Unit::GetUnit(*me, HoldpPlayer)); + //AttackStart(ObjectAccessor::GetUnit(*me, HoldpPlayer)); DoZoneInCombat(); //Place all units in threat list on outside of stomach @@ -686,7 +686,7 @@ public: while (i != Stomach_Map.end()) { //Check for valid player - Unit* unit = Unit::GetUnit(*me, i->first); + Unit* unit = ObjectAccessor::GetUnit(*me, i->first); //Only move units in stomach if (unit && i->second == true) @@ -717,7 +717,7 @@ public: while (i != Stomach_Map.end()) { //Check for valid player - Unit* unit = Unit::GetUnit(*me, i->first); + Unit* unit = ObjectAccessor::GetUnit(*me, i->first); //Only apply to units in stomach if (unit && i->second == true) @@ -767,7 +767,7 @@ public: if (StomachEnterVisTimer <= diff) { //Check for valid player - Unit* unit = Unit::GetUnit(*me, StomachEnterTarget); + Unit* unit = ObjectAccessor::GetUnit(*me, StomachEnterTarget); if (unit) { @@ -917,7 +917,7 @@ public: void JustDied(Unit* /*killer*/) override { - if (Unit* p = Unit::GetUnit(*me, Portal)) + if (Unit* p = ObjectAccessor::GetUnit(*me, Portal)) p->Kill(p); } @@ -998,7 +998,7 @@ public: void JustDied(Unit* /*killer*/) override { - if (Unit* p = Unit::GetUnit(*me, Portal)) + if (Unit* p = ObjectAccessor::GetUnit(*me, Portal)) p->Kill(p); } @@ -1026,7 +1026,7 @@ public: { if (EvadeTimer <= diff) { - if (Unit* p = Unit::GetUnit(*me, Portal)) + if (Unit* p = ObjectAccessor::GetUnit(*me, Portal)) p->Kill(p); //Dissapear and reappear at new position @@ -1115,7 +1115,7 @@ public: void JustDied(Unit* /*killer*/) override { - if (Unit* p = Unit::GetUnit(*me, Portal)) + if (Unit* p = ObjectAccessor::GetUnit(*me, Portal)) p->Kill(p); } @@ -1144,7 +1144,7 @@ public: { if (EvadeTimer <= diff) { - if (Unit* p = Unit::GetUnit(*me, Portal)) + if (Unit* p = ObjectAccessor::GetUnit(*me, Portal)) p->Kill(p); //Dissapear and reappear at new position @@ -1234,7 +1234,7 @@ public: void JustDied(Unit* /*killer*/) override { - if (Unit* p = Unit::GetUnit(*me, Portal)) + if (Unit* p = ObjectAccessor::GetUnit(*me, Portal)) p->Kill(p); } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 6775d84d435..acf0215f9ff 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -103,7 +103,7 @@ struct boss_twinemperorsAI : public ScriptedAI Creature* GetOtherBoss() { - return Unit::GetCreature(*me, instance->GetData64(IAmVeklor() ? DATA_VEKNILASH : DATA_VEKLOR)); + return ObjectAccessor::GetCreature(*me, instance->GetData64(IAmVeklor() ? DATA_VEKNILASH : DATA_VEKLOR)); } void DamageTaken(Unit* /*done_by*/, uint32 &damage) override diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp index aa9180d79c2..0614303515c 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp @@ -132,7 +132,7 @@ public: void SendMyListToBuddies() { for (int i=0; i<3; ++i) - if (Creature* pNearby = Unit::GetCreature(*me, NearbyGUID[i])) + if (Creature* pNearby = ObjectAccessor::GetCreature(*me, NearbyGUID[i])) GiveBuddyMyList(pNearby); } @@ -140,7 +140,7 @@ public: { for (int i=0; i<3; ++i) { - Creature* c = Unit::GetCreature(*me, NearbyGUID[i]); + Creature* c = ObjectAccessor::GetCreature(*me, NearbyGUID[i]); if (c) { if (!c->IsInCombat()) @@ -195,7 +195,7 @@ public: if (!NearbyGUID[bli]) break; - Creature* pNearby = Unit::GetCreature(*me, NearbyGUID[bli]); + Creature* pNearby = ObjectAccessor::GetCreature(*me, NearbyGUID[bli]); if (!pNearby) break; @@ -221,7 +221,7 @@ public: { if (!NearbyGUID[i]) continue; - if (Creature* pNearby = Unit::GetCreature(*me, NearbyGUID[i])) + if (Creature* pNearby = ObjectAccessor::GetCreature(*me, NearbyGUID[i])) { if (pNearby->isDead()) pNearby->Respawn(); @@ -250,7 +250,7 @@ public: { for (int ni=0; ni<3; ++ni) { - Creature* sent = Unit::GetCreature(*me, NearbyGUID[ni]); + Creature* sent = ObjectAccessor::GetCreature(*me, NearbyGUID[ni]); if (!sent) continue; if (sent->isDead()) diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index 67e3801f842..be70b2e9fa4 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -443,7 +443,7 @@ public: uint32 NextStep(uint8 Step) { - Creature* Spark = Unit::GetCreature(*me, SparkGUID); + Creature* Spark = ObjectAccessor::GetCreature(*me, SparkGUID); if (!Spark) return 99999999; diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp index 8d6ae347b85..358814d440a 100644 --- a/src/server/scripts/Kalimdor/zone_durotar.cpp +++ b/src/server/scripts/Kalimdor/zone_durotar.cpp @@ -447,7 +447,7 @@ class spell_mount_check : public SpellScriptLoader class spell_mount_check_AuraScript : public AuraScript { - PrepareAuraScript(spell_mount_check_AuraScript) + PrepareAuraScript(spell_mount_check_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -495,7 +495,7 @@ class spell_voljin_war_drums : public SpellScriptLoader class spell_voljin_war_drums_SpellScript : public SpellScript { - PrepareSpellScript(spell_voljin_war_drums_SpellScript) + PrepareSpellScript(spell_voljin_war_drums_SpellScript); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -552,7 +552,7 @@ class spell_voodoo : public SpellScriptLoader class spell_voodoo_SpellScript : public SpellScript { - PrepareSpellScript(spell_voodoo_SpellScript) + PrepareSpellScript(spell_voodoo_SpellScript); bool Validate(SpellInfo const* /*spellInfo*/) override { diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp index 3f4fb31a11d..04cec70b7ad 100644 --- a/src/server/scripts/Kalimdor/zone_silithus.cpp +++ b/src/server/scripts/Kalimdor/zone_silithus.cpp @@ -706,7 +706,7 @@ public: break; case 65: me->SetVisible(false); - if (Creature* AnachronosQuestTrigger = (Unit::GetCreature(*me, AnachronosQuestTriggerGUID))) + if (Creature* AnachronosQuestTrigger = (ObjectAccessor::GetCreature(*me, AnachronosQuestTriggerGUID))) { Talk(ARYGOS_YELL_1); AnachronosQuestTrigger->AI()->EnterEvadeMode(); @@ -1002,11 +1002,11 @@ void npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::JustDied(Unit* /*slayer*/) if (!MobGUID) return; - if (Creature* mob = Unit::GetCreature(*me, MobGUID)) + if (Creature* mob = ObjectAccessor::GetCreature(*me, MobGUID)) if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, mob->AI())) triggerAI->LiveCounter(); -}; +} /*##### # go_crystalline_tear diff --git a/src/server/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp index 4ac4e502363..23e8e2f26ff 100644 --- a/src/server/scripts/Kalimdor/zone_tanaris.cpp +++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp @@ -584,7 +584,7 @@ public: { PostEventTimer = 5000; - Creature* torta = Creature::GetCreature(*me, TortaGUID); + Creature* torta = ObjectAccessor::GetCreature(*me, TortaGUID); if (!torta || !torta->IsAlive()) { //something happened, so just complete diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp index ae8c279947d..dabfee00065 100644 --- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp +++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp @@ -380,7 +380,7 @@ public: { if (AffrayChallenger[i]) { - Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]); + Creature* creature = ObjectAccessor::GetCreature((*me), AffrayChallenger[i]); if (creature && creature->IsAlive()) creature->DisappearAndDie(); } @@ -388,7 +388,7 @@ public: if (BigWill) // unsummon bigWill { - Creature* creature = Unit::GetCreature((*me), BigWill); + Creature* creature = ObjectAccessor::GetCreature((*me), BigWill); if (creature && creature->IsAlive()) creature->DisappearAndDie(); } @@ -429,7 +429,7 @@ public: { if (AffrayChallenger[i]) { - Creature* creature = Unit::GetCreature((*me), AffrayChallenger[i]); + Creature* creature = ObjectAccessor::GetCreature((*me), AffrayChallenger[i]); if ((!creature || (!creature->IsAlive())) && !ChallengerDown[i]) { Talk(SAY_TWIGGY_FLATHEAD_DOWN); diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp index d6d45d72f5b..09f82b0417c 100644 --- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp @@ -270,7 +270,7 @@ public: { if (EndEventTimer <= Diff) { - Creature* spraggle = Creature::GetCreature(*me, SpraggleGUID); + Creature* spraggle = ObjectAccessor::GetCreature(*me, SpraggleGUID); if (!spraggle || !spraggle->IsAlive()) { SetFollowComplete(); diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp index 09fdbcbce70..1c042f4d185 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -211,7 +211,7 @@ public: // Check if all summons in this phase killed for (SummonList::const_iterator iter = Summons.begin(); iter != Summons.end(); ++iter) { - if (Creature* visage = Unit::GetCreature(*me, *iter)) + if (Creature* visage = ObjectAccessor::GetCreature(*me, *iter)) { // Not all are dead if (phase == visage->GetPhaseMask()) diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index aab0f22169f..b78bdae5c87 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -212,7 +212,7 @@ public: } else { - if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_PL_JEDOGA_TARGET))) + if (Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_PL_JEDOGA_TARGET))) { AttackStart(target); instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index a4c3edb85f3..bf5855c3318 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -188,7 +188,7 @@ public: } break; case IMPALE_PHASE_ATTACK: - if (Creature* impaleTarget = Unit::GetCreature(*me, ImpaleTarget)) + if (Creature* impaleTarget = ObjectAccessor::GetCreature(*me, ImpaleTarget)) { impaleTarget->CastSpell(impaleTarget, SPELL_IMPALE_SPIKE, false); impaleTarget->RemoveAurasDueToSpell(SPELL_IMPALE_SHAKEGROUND); @@ -197,7 +197,7 @@ public: ImpaleTimer = 1*IN_MILLISECONDS; break; case IMPALE_PHASE_DMG: - if (Creature* impaleTarget = Unit::GetCreature(*me, ImpaleTarget)) + if (Creature* impaleTarget = ObjectAccessor::GetCreature(*me, ImpaleTarget)) me->CastSpell(impaleTarget, SPELL_IMPALE_DMG, true); ImpalePhase = IMPALE_PHASE_TARGET; ImpaleTimer = 9*IN_MILLISECONDS; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 12c3c580cae..81e124cf5bc 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -178,15 +178,15 @@ public: Talk(SAY_SARTHARION_DEATH); _JustDied(); - if (Creature* tenebron = Unit::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) + if (Creature* tenebron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) if (tenebron->IsAlive()) tenebron->DisappearAndDie(); - if (Creature* shadron = Unit::GetCreature(*me, instance->GetData64(DATA_SHADRON))) + if (Creature* shadron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADRON))) if (shadron->IsAlive()) shadron->DisappearAndDie(); - if (Creature* vesperon = Unit::GetCreature(*me, instance->GetData64(DATA_VESPERON))) + if (Creature* vesperon = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VESPERON))) if (vesperon->IsAlive()) vesperon->DisappearAndDie(); } @@ -211,7 +211,7 @@ public: void DrakeRespawn() // Drakes respawning system { - if (Creature* tenebron = Unit::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) + if (Creature* tenebron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) { tenebron->SetHomePosition(3239.07f, 657.235f, 86.8775f, 4.74729f); if (tenebron->IsAlive()) @@ -231,7 +231,7 @@ public: } } - if (Creature* shadron = Unit::GetCreature(*me, instance->GetData64(DATA_SHADRON))) + if (Creature* shadron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADRON))) { shadron->SetHomePosition(3363.06f, 525.28f, 98.362f, 4.76475f); if (shadron->IsAlive()) @@ -251,7 +251,7 @@ public: } } - if (Creature* vesperon = Unit::GetCreature(*me, instance->GetData64(DATA_VESPERON))) + if (Creature* vesperon = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VESPERON))) { vesperon->SetHomePosition(3145.68f, 520.71f, 89.7f, 4.64258f); if (vesperon->IsAlive()) @@ -280,7 +280,7 @@ public: //if at least one of the dragons are alive and are being called bool _canUseWill = false; - if (Creature* fetchTene = Unit::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) + if (Creature* fetchTene = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TENEBRON))) { if (fetchTene->IsAlive() && !fetchTene->GetVictim()) { @@ -298,7 +298,7 @@ public: } } - if (Creature* fetchShad = Unit::GetCreature(*me, instance->GetData64(DATA_SHADRON))) + if (Creature* fetchShad = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADRON))) { if (fetchShad->IsAlive() && !fetchShad->GetVictim()) { @@ -316,7 +316,7 @@ public: } } - if (Creature* fetchVesp = Unit::GetCreature(*me, instance->GetData64(DATA_VESPERON))) + if (Creature* fetchVesp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VESPERON))) { if (fetchVesp && fetchVesp->IsAlive() && !fetchVesp->GetVictim()) { @@ -340,7 +340,7 @@ public: void CallDragon(uint32 dataId) { - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(dataId))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(dataId))) { if (temp->IsAlive() && !temp->GetVictim()) { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index cb0cba21d6c..7e9e351ae9c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -292,7 +292,7 @@ public: bHealth = false; bDone = false; - if (Creature* pMemory = Unit::GetCreature(*me, MemoryGUID)) + if (Creature* pMemory = ObjectAccessor::GetCreature(*me, MemoryGUID)) if (pMemory->IsAlive()) pMemory->RemoveFromWorld(); } @@ -373,7 +373,7 @@ public: DoCast(me, SPELL_RENEW); break; case 1: - if (Creature* pMemory = Unit::GetCreature(*me, MemoryGUID)) + if (Creature* pMemory = ObjectAccessor::GetCreature(*me, MemoryGUID)) if (pMemory->IsAlive()) DoCast(pMemory, SPELL_RENEW); break; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp index 46817e46512..a8aff70b034 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp @@ -140,7 +140,7 @@ public: for (std::list<uint64>::const_iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr) { - if (Creature* temp = Unit::GetCreature(*me, *itr)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr)) if (temp) temp->DisappearAndDie(); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 2b1d582bcd4..2e24398d49a 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -126,9 +126,9 @@ bool GrandChampionsOutVehicle(Creature* me) if (!instance) return false; - Creature* pGrandChampion1 = Unit::GetCreature(*me, instance->GetData64(DATA_GRAND_CHAMPION_1)); - Creature* pGrandChampion2 = Unit::GetCreature(*me, instance->GetData64(DATA_GRAND_CHAMPION_2)); - Creature* pGrandChampion3 = Unit::GetCreature(*me, instance->GetData64(DATA_GRAND_CHAMPION_3)); + Creature* pGrandChampion1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GRAND_CHAMPION_1)); + Creature* pGrandChampion2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GRAND_CHAMPION_2)); + Creature* pGrandChampion3 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GRAND_CHAMPION_3)); if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3) { @@ -829,7 +829,7 @@ public: if (bShoot && uiMultiShotTimer <= uiDiff) { me->InterruptNonMeleeSpells(true); - Unit* target = Unit::GetUnit(*me, uiTargetGUID); + Unit* target = ObjectAccessor::GetUnit(*me, uiTargetGUID); if (target && me->IsInRange(target, 5.0f, 30.0f, false)) { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index faeb92e4595..e22ee040599 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -161,7 +161,7 @@ public: } for (std::list<uint64>::const_iterator itr = TempList.begin(); itr != TempList.end(); ++itr) - if (Creature* summon = Unit::GetCreature(*me, *itr)) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) AggroAllPlayers(summon); }else if (uiLesserChampions == 9) StartGrandChampionsAttack(); @@ -173,9 +173,9 @@ public: void StartGrandChampionsAttack() { - Creature* pGrandChampion1 = Unit::GetCreature(*me, uiVehicle1GUID); - Creature* pGrandChampion2 = Unit::GetCreature(*me, uiVehicle2GUID); - Creature* pGrandChampion3 = Unit::GetCreature(*me, uiVehicle3GUID); + Creature* pGrandChampion1 = ObjectAccessor::GetCreature(*me, uiVehicle1GUID); + Creature* pGrandChampion2 = ObjectAccessor::GetCreature(*me, uiVehicle2GUID); + Creature* pGrandChampion3 = ObjectAccessor::GetCreature(*me, uiVehicle3GUID); if (pGrandChampion1 && pGrandChampion2 && pGrandChampion3) { @@ -417,7 +417,7 @@ public: if (!Champion1List.empty()) { for (std::list<uint64>::const_iterator itr = Champion1List.begin(); itr != Champion1List.end(); ++itr) - if (Creature* summon = Unit::GetCreature(*me, *itr)) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr)) AggroAllPlayers(summon); NextStep(0, false); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 77e4e740333..6a664ec7f8d 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -344,7 +344,7 @@ class boss_anubarak_trial : public CreatureScript uint32 at = urand(0, _burrowGUID.size()-1); for (uint32 k = 0; k < at; k++) ++i; - if (Creature* pBurrow = Unit::GetCreature(*me, *i)) + if (Creature* pBurrow = ObjectAccessor::GetCreature(*me, *i)) pBurrow->CastSpell(pBurrow, 66340, false); events.ScheduleEvent(EVENT_SUMMON_SCARAB, 4*IN_MILLISECONDS, 0, PHASE_SUBMERGED); @@ -377,7 +377,7 @@ class boss_anubarak_trial : public CreatureScript uint8 i = startAt; do { - if (Unit* pSphere = Unit::GetCreature(*me, _sphereGUID[i])) + if (Unit* pSphere = ObjectAccessor::GetCreature(*me, _sphereGUID[i])) { if (!pSphere->HasAura(SPELL_FROST_SPHERE)) { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 71df7d05378..77697cdb3e8 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -479,7 +479,7 @@ class boss_toc_champion_controller : public CreatureScript case 1: for (std::list<uint64>::iterator i = _summons.begin(); i != _summons.end(); ++i) { - if (Creature* temp = Unit::GetCreature(*me, *i)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, *i)) { temp->SetReactState(REACT_AGGRESSIVE); temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC); @@ -559,7 +559,7 @@ struct boss_faction_championsAI : public BossAI void JustReachedHome() override { - if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(2, FAIL); me->DespawnOrUnsummon(); } @@ -577,7 +577,7 @@ struct boss_faction_championsAI : public BossAI std::list<HostileReference*> const& tList = me->getThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator itr = tList.begin(); itr != tList.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && me->getThreatManager().getThreat(unit)) { if (unit->GetTypeId() == TYPEID_PLAYER) @@ -609,7 +609,7 @@ struct boss_faction_championsAI : public BossAI void JustDied(Unit* /*killer*/) override { if (_aiType != AI_PET) - if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(2, DONE); } @@ -617,7 +617,7 @@ struct boss_faction_championsAI : public BossAI { DoCast(me, SPELL_ANTI_AOE, true); _EnterCombat(); - if (Creature* pChampionController = Unit::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(2, IN_PROGRESS); } @@ -634,11 +634,11 @@ struct boss_faction_championsAI : public BossAI if (TeamInInstance == ALLIANCE) { - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_VARIAN))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_VARIAN))) temp->AI()->Talk(SAY_KILL_PLAYER); } else - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(NPC_GARROSH))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GARROSH))) temp->AI()->Talk(SAY_KILL_PLAYER); @@ -663,7 +663,7 @@ struct boss_faction_championsAI : public BossAI Unit* target; for (iter = tList.begin(); iter!=tList.end(); ++iter) { - target = Unit::GetUnit(*me, (*iter)->getUnitGuid()); + target = ObjectAccessor::GetUnit(*me, (*iter)->getUnitGuid()); if (target && target->getPowerType() == POWER_MANA) return target; } @@ -678,7 +678,7 @@ struct boss_faction_championsAI : public BossAI Unit* target; for (iter = tList.begin(); iter != tList.end(); ++iter) { - target = Unit::GetUnit(*me, (*iter)->getUnitGuid()); + target = ObjectAccessor::GetUnit(*me, (*iter)->getUnitGuid()); if (target && me->GetDistance2d(target) < distance) ++count; } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index abeafe156ad..c0f7b2f1856 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -553,7 +553,7 @@ class spell_mistress_kiss_area : public SpellScriptLoader class spell_mistress_kiss_area_SpellScript : public SpellScript { - PrepareSpellScript(spell_mistress_kiss_area_SpellScript) + PrepareSpellScript(spell_mistress_kiss_area_SpellScript); void FilterTargets(std::list<WorldObject*>& targets) { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index f45a57bd0bc..9e75bef9735 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -508,7 +508,7 @@ struct boss_jormungarAI : public BossAI void JustDied(Unit* /*killer*/) override { - if (Creature* otherWorm = Unit::GetCreature(*me, instance->GetData64(OtherWormEntry))) + if (Creature* otherWorm = ObjectAccessor::GetCreature(*me, instance->GetData64(OtherWormEntry))) { if (!otherWorm->IsAlive()) { diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index 00eb970b57b..e40cd9d5f41 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -245,7 +245,7 @@ struct boss_twin_baseAI : public BossAI // Called when sister pointer needed Creature* GetSister() { - return Unit::GetCreature((*me), instance->GetData64(SisterNpcId)); + return ObjectAccessor::GetCreature((*me), instance->GetData64(SisterNpcId)); } void EnterCombat(Unit* /*who*/) override @@ -673,8 +673,7 @@ class spell_powering_up : public SpellScriptLoader class spell_powering_up_SpellScript : public SpellScript { - public: - PrepareSpellScript(spell_powering_up_SpellScript) + PrepareSpellScript(spell_powering_up_SpellScript); uint32 spellId; uint32 poweringUp; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp index 64afe8d5b2e..7cab84ee4a7 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp @@ -95,7 +95,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript // make sure Anub'arak isnt missing and floor is destroyed after a crash if (GetBossState(BOSS_LICH_KING) == DONE && TrialCounter && GetBossState(BOSS_ANUBARAK) != DONE) { - Creature* anubArak = Unit::GetCreature(*player, GetData64(NPC_ANUBARAK)); + Creature* anubArak = ObjectAccessor::GetCreature(*player, GetData64(NPC_ANUBARAK)); if (!anubArak) anubArak = player->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index 74e4f4caa9d..11548ba4b1c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -173,7 +173,7 @@ class npc_announcer_toc10 : public CreatureScript else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) { // if Jaraxxus is spawned, but the raid wiped - if (Creature* jaraxxus = Unit::GetCreature(*player, instance->GetData64(NPC_JARAXXUS))) + if (Creature* jaraxxus = ObjectAccessor::GetCreature(*player, instance->GetData64(NPC_JARAXXUS))) { jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -207,7 +207,7 @@ class npc_announcer_toc10 : public CreatureScript creature->CastSpell(creature, SPELL_CORPSE_TELEPORT, false); creature->CastSpell(creature, SPELL_DESTROY_FLOOR_KNOCKUP, false); - Creature* anubArak = Unit::GetCreature(*creature, instance->GetData64(NPC_ANUBARAK)); + Creature* anubArak = ObjectAccessor::GetCreature(*creature, instance->GetData64(NPC_ANUBARAK)); if (!anubArak || !anubArak->IsAlive()) anubArak = creature->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); @@ -330,7 +330,7 @@ class boss_lich_king_toc : public CreatureScript me->CastSpell(me, SPELL_DESTROY_FLOOR_KNOCKUP, false); _instance->SetBossState(BOSS_LICH_KING, DONE); - Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_ANUBARAK)); + Creature* temp = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_ANUBARAK)); if (!temp || !temp->IsAlive()) temp = me->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); @@ -377,7 +377,7 @@ class npc_fizzlebang_toc : public CreatureScript { Talk(SAY_STAGE_1_06, killer); _instance->SetData(TYPE_EVENT, 1180); - if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) { temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); temp->SetReactState(REACT_AGGRESSIVE); @@ -484,23 +484,23 @@ class npc_fizzlebang_toc : public CreatureScript _updateTimer = 5*IN_MILLISECONDS; break; case 1142: - if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) temp->SetTarget(me->GetGUID()); - if (Creature* pTrigger = Unit::GetCreature(*me, _triggerGUID)) + if (Creature* pTrigger = ObjectAccessor::GetCreature(*me, _triggerGUID)) pTrigger->DespawnOrUnsummon(); - if (Creature* pPortal = Unit::GetCreature(*me, _portalGUID)) + if (Creature* pPortal = ObjectAccessor::GetCreature(*me, _portalGUID)) pPortal->DespawnOrUnsummon(); _instance->SetData(TYPE_EVENT, 1144); _updateTimer = 10*IN_MILLISECONDS; break; case 1144: - if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) temp->AI()->Talk(SAY_STAGE_1_05); _instance->SetData(TYPE_EVENT, 1150); _updateTimer = 5*IN_MILLISECONDS; break; case 1150: - if (Creature* temp = Unit::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_JARAXXUS))) { //1-shot Fizzlebang temp->CastSpell(me, 67888, false); @@ -699,7 +699,7 @@ class npc_tirion_toc : public CreatureScript _instance->SetData(TYPE_EVENT, 3092); break; case 3092: - if (Creature* pChampionController = Unit::GetCreature((*me), _instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) + if (Creature* pChampionController = ObjectAccessor::GetCreature((*me), _instance->GetData64(NPC_CHAMPIONS_CONTROLLER))) pChampionController->AI()->SetData(1, NOT_STARTED); _instance->SetData(TYPE_EVENT, 3095); break; @@ -735,12 +735,12 @@ class npc_tirion_toc : public CreatureScript break; case 4015: _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR)); - if (Creature* temp = Unit::GetCreature((*me), _instance->GetData64(NPC_LIGHTBANE))) + if (Creature* temp = ObjectAccessor::GetCreature((*me), _instance->GetData64(NPC_LIGHTBANE))) { temp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[8].GetPositionX(), ToCCommonLoc[8].GetPositionY(), ToCCommonLoc[8].GetPositionZ()); temp->SetVisible(true); } - if (Creature* temp = Unit::GetCreature((*me), _instance->GetData64(NPC_DARKBANE))) + if (Creature* temp = ObjectAccessor::GetCreature((*me), _instance->GetData64(NPC_DARKBANE))) { temp->GetMotionMaster()->MovePoint(1, ToCCommonLoc[9].GetPositionX(), ToCCommonLoc[9].GetPositionY(), ToCCommonLoc[9].GetPositionZ()); temp->SetVisible(true); @@ -779,7 +779,7 @@ class npc_tirion_toc : public CreatureScript _instance->SetData(TYPE_EVENT, 6005); break; case 6005: - if (Creature* tirionFordring = Unit::GetCreature((*me), _instance->GetData64(NPC_TIRION_FORDRING))) + if (Creature* tirionFordring = ObjectAccessor::GetCreature((*me), _instance->GetData64(NPC_TIRION_FORDRING))) tirionFordring->AI()->Talk(SAY_STAGE_4_06); _updateTimer = 20*IN_MILLISECONDS; _instance->SetData(TYPE_EVENT, 6010); @@ -787,7 +787,7 @@ class npc_tirion_toc : public CreatureScript case 6010: if (IsHeroic()) { - if (Creature* tirionFordring = Unit::GetCreature((*me), _instance->GetData64(NPC_TIRION_FORDRING))) + if (Creature* tirionFordring = ObjectAccessor::GetCreature((*me), _instance->GetData64(NPC_TIRION_FORDRING))) tirionFordring->AI()->Talk(SAY_STAGE_4_07); _updateTimer = 1*MINUTE*IN_MILLISECONDS; _instance->SetBossState(BOSS_ANUBARAK, SPECIAL); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h index 562105c0866..8a62453d7c1 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h @@ -40,7 +40,7 @@ enum SpellIds enum MiscData { - DESPAWN_TIME = 300000, + DESPAWN_TIME = 1200000, DISPLAYID_DESTROYED_FLOOR = 9060 }; diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 72e4b0b5eb9..63b1359a406 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -314,7 +314,7 @@ public: { if (InstanceScript* instance = me->GetInstanceScript()) if (uint64 guid = instance->GetData64(DATA_NOVOS)) - if (Creature* novos = Creature::GetCreature(*me, guid)) + if (Creature* novos = ObjectAccessor::GetCreature(*me, guid)) novos->AI()->JustSummoned(summon); if (summon) diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp index 9cf61058bd9..a5577b6a0ea 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp @@ -25,7 +25,7 @@ enum Texts SAY_SLAY = 1, SAY_DEATH = 2, SAY_IMPENDING_DESPAIR = 3, - SAY_DEFILING_HORROR = 4, + SAY_DEFILING_HORROR = 4 }; enum Spells @@ -33,8 +33,9 @@ enum Spells SPELL_QUIVERING_STRIKE = 72422, SPELL_IMPENDING_DESPAIR = 72426, SPELL_DEFILING_HORROR = 72435, - SPELL_HOPELESSNESS = 72395, - H_SPELL_HOPELESSNESS = 72390, /// @todo not in dbc. Add in DB. + SPELL_HOPELESSNESS_1 = 72395, + SPELL_HOPELESSNESS_2 = 72396, + SPELL_HOPELESSNESS_3 = 72397 }; enum Events @@ -42,99 +43,106 @@ enum Events EVENT_NONE, EVENT_QUIVERING_STRIKE, EVENT_IMPENDING_DESPAIR, - EVENT_DEFILING_HORROR, + EVENT_DEFILING_HORROR }; +uint32 const HopelessnessHelper[3] = { SPELL_HOPELESSNESS_1, SPELL_HOPELESSNESS_2, SPELL_HOPELESSNESS_3 }; + class boss_falric : public CreatureScript { -public: - boss_falric() : CreatureScript("boss_falric") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_falricAI>(creature); - } - - struct boss_falricAI : public boss_horAI - { - boss_falricAI(Creature* creature) : boss_horAI(creature) { } - - uint8 uiHopelessnessCount; - - void Reset() override - { - boss_horAI::Reset(); - - uiHopelessnessCount = 0; + public: + boss_falric() : CreatureScript("boss_falric") { } - instance->SetBossState(DATA_FALRIC_EVENT, NOT_STARTED); - } - - void EnterCombat(Unit* /*who*/) override + struct boss_falricAI : public boss_horAI { - Talk(SAY_AGGRO); - instance->SetBossState(DATA_FALRIC_EVENT, IN_PROGRESS); - - events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000); - events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000); - events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer. - } + boss_falricAI(Creature* creature) : boss_horAI(creature, DATA_FALRIC) { } - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - - instance->SetBossState(DATA_FALRIC_EVENT, DONE); - } + void Reset() override + { + boss_horAI::Reset(); + _hopelessnessCount = 0; + } - void KilledUnit(Unit* /*victim*/) override - { - Talk(SAY_SLAY); - } + void EnterCombat(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + DoZoneInCombat(); + instance->SetBossState(DATA_FALRIC, IN_PROGRESS); - void UpdateAI(uint32 diff) override - { - // Return since we have no target - if (!UpdateVictim()) - return; + events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000); + events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000); + events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(21000, 39000)); + } - events.Update(diff); + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if ((_hopelessnessCount < 1 && me->HealthBelowPctDamaged(66, damage)) + || (_hopelessnessCount < 2 && me->HealthBelowPctDamaged(33, damage)) + || (_hopelessnessCount < 3 && me->HealthBelowPctDamaged(10, damage))) + { + if (_hopelessnessCount) + me->RemoveOwnedAura(sSpellMgr->GetSpellIdForDifficulty(HopelessnessHelper[_hopelessnessCount - 1], me)); + DoCast(me, HopelessnessHelper[_hopelessnessCount]); + ++_hopelessnessCount; + } + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + events.Reset(); + instance->SetBossState(DATA_FALRIC, DONE); + } - switch (events.ExecuteEvent()) + void KilledUnit(Unit* who) override { - case EVENT_QUIVERING_STRIKE: - DoCast(SPELL_QUIVERING_STRIKE); - events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 10000); - break; - case EVENT_IMPENDING_DESPAIR: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - { - Talk(SAY_IMPENDING_DESPAIR); - DoCast(target, SPELL_IMPENDING_DESPAIR); - } - events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 13000); - break; - case EVENT_DEFILING_HORROR: - DoCast(SPELL_DEFILING_HORROR); - events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer. - break; + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } - if ((uiHopelessnessCount < 1 && HealthBelowPct(66)) - || (uiHopelessnessCount < 2 && HealthBelowPct(33)) - || (uiHopelessnessCount < 3 && HealthBelowPct(10))) + void UpdateAI(uint32 diff) override { - uiHopelessnessCount++; - DoCast(DUNGEON_MODE(SPELL_HOPELESSNESS, H_SPELL_HOPELESSNESS)); + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_QUIVERING_STRIKE: + DoCastVictim(SPELL_QUIVERING_STRIKE); + events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 10000); + break; + case EVENT_IMPENDING_DESPAIR: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) + { + Talk(SAY_IMPENDING_DESPAIR); + DoCast(target, SPELL_IMPENDING_DESPAIR); + } + events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 13000); + break; + case EVENT_DEFILING_HORROR: + DoCastAOE(SPELL_DEFILING_HORROR); + events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(21000, 39000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); } - DoMeleeAttackIfReady(); - } - }; + private: + uint8 _hopelessnessCount; + }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<boss_falricAI>(creature); + } }; void AddSC_boss_falric() diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp index cf267ff1079..902a917c594 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp @@ -17,6 +17,8 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" #include "halls_of_reflection.h" enum Texts @@ -33,6 +35,7 @@ enum Spells SPELL_WELL_OF_CORRUPTION = 72362, SPELL_CORRUPTED_FLESH = 72363, SPELL_SHARED_SUFFERING = 72368, + SPELL_SHARED_SUFFERING_DISPEL = 72373 }; enum Events @@ -41,93 +44,130 @@ enum Events EVENT_OBLITERATE, EVENT_WELL_OF_CORRUPTION, EVENT_CORRUPTED_FLESH, - EVENT_SHARED_SUFFERING, + EVENT_SHARED_SUFFERING }; class boss_marwyn : public CreatureScript { -public: - boss_marwyn() : CreatureScript("boss_marwyn") { } + public: + boss_marwyn() : CreatureScript("boss_marwyn") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_marwynAI>(creature); - } - - struct boss_marwynAI : public boss_horAI - { - boss_marwynAI(Creature* creature) : boss_horAI(creature) { } - - void Reset() override + struct boss_marwynAI : public boss_horAI { - boss_horAI::Reset(); + boss_marwynAI(Creature* creature) : boss_horAI(creature, DATA_MARWYN) { } - instance->SetBossState(DATA_MARWYN_EVENT, NOT_STARTED); - } + void Reset() override + { + boss_horAI::Reset(); + } - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - instance->SetBossState(DATA_MARWYN_EVENT, IN_PROGRESS); + void EnterCombat(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + DoZoneInCombat(); + instance->SetBossState(DATA_MARWYN, IN_PROGRESS); + + events.ScheduleEvent(EVENT_OBLITERATE, urand(8000, 13000)); + events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000); + events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000); + events.ScheduleEvent(EVENT_SHARED_SUFFERING, urand(14000, 15000)); + } - events.ScheduleEvent(EVENT_OBLITERATE, 30000); /// @todo Check timer - events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000); - events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000); - events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000); /// @todo Check timer - } + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + events.Reset(); + instance->SetBossState(DATA_MARWYN, DONE); + } - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - instance->SetBossState(DATA_MARWYN_EVENT, DONE); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_OBLITERATE: + DoCastVictim(SPELL_OBLITERATE); + events.ScheduleEvent(EVENT_OBLITERATE, urand(8000, 13000)); + break; + case EVENT_WELL_OF_CORRUPTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_WELL_OF_CORRUPTION); + events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000); + break; + case EVENT_CORRUPTED_FLESH: + Talk(SAY_CORRUPTED_FLESH); + DoCastAOE(SPELL_CORRUPTED_FLESH); + events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000); + break; + case EVENT_SHARED_SUFFERING: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_SHARED_SUFFERING); + events.ScheduleEvent(EVENT_SHARED_SUFFERING, urand(14000, 15000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; - void KilledUnit(Unit* /*victim*/) override + CreatureAI* GetAI(Creature* creature) const override { - Talk(SAY_SLAY); + return GetHallsOfReflectionAI<boss_marwynAI>(creature); } +}; - void UpdateAI(uint32 diff) override - { - // Return since we have no target - if (!UpdateVictim()) - return; +// 72368, 72369 - Shared Suffering +class spell_marwyn_shared_suffering : public SpellScriptLoader +{ + public: + spell_marwyn_shared_suffering() : SpellScriptLoader("spell_marwyn_shared_suffering") { } - events.Update(diff); + class spell_marwyn_shared_suffering_AuraScript : public AuraScript + { + PrepareAuraScript(spell_marwyn_shared_suffering_AuraScript); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) + return; + + if (Unit* caster = GetCaster()) + { + int32 remainingDamage = aurEff->GetAmount() * (aurEff->GetTotalTicks() - aurEff->GetTickNumber()); + if (remainingDamage > 0) + caster->CastCustomSpell(SPELL_SHARED_SUFFERING_DISPEL, SPELLVALUE_BASE_POINT1, remainingDamage, GetTarget(), TRIGGERED_FULL_MASK); + } + } - switch (events.ExecuteEvent()) + void Register() override { - case EVENT_OBLITERATE: - DoCast(SPELL_OBLITERATE); - events.ScheduleEvent(EVENT_OBLITERATE, 30000); - break; - case EVENT_WELL_OF_CORRUPTION: - DoCast(SPELL_WELL_OF_CORRUPTION); - events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000); - break; - case EVENT_CORRUPTED_FLESH: - Talk(SAY_CORRUPTED_FLESH); - DoCast(SPELL_CORRUPTED_FLESH); - events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000); - break; - case EVENT_SHARED_SUFFERING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_SHARED_SUFFERING); - events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000); - break; + AfterEffectRemove += AuraEffectRemoveFn(spell_marwyn_shared_suffering_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } + }; - DoMeleeAttackIfReady(); + AuraScript* GetAuraScript() const override + { + return new spell_marwyn_shared_suffering_AuraScript(); } - }; - }; void AddSC_boss_marwyn() { new boss_marwyn(); + new spell_marwyn_shared_suffering(); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index ca2a181a48a..ccdd92ae4ba 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -18,6 +18,8 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "SpellScript.h" +#include "Transport.h" #include "Player.h" #include "halls_of_reflection.h" @@ -36,17 +38,6 @@ enum Text SAY_JAINA_INTRO_11 = 10, SAY_JAINA_INTRO_END = 11, - SAY_JAINA_ESCAPE_1 = 0, - SAY_JAINA_ESCAPE_2 = 1, - SAY_JAINA_ESCAPE_3 = 2, - SAY_JAINA_ESCAPE_4 = 3, - SAY_JAINA_ESCAPE_5 = 4, - SAY_JAINA_ESCAPE_6 = 5, - SAY_JAINA_ESCAPE_7 = 6, - SAY_JAINA_ESCAPE_8 = 7, - SAY_JAINA_ESCAPE_9 = 8, - SAY_JAINA_ESCAPE_10 = 9, - SAY_SYLVANAS_INTRO_1 = 0, SAY_SYLVANAS_INTRO_2 = 1, SAY_SYLVANAS_INTRO_3 = 2, @@ -57,16 +48,6 @@ enum Text SAY_SYLVANAS_INTRO_8 = 7, SAY_SYLVANAS_INTRO_END = 8, - SAY_SYLVANAS_ESCAPE_1 = 0, - SAY_SYLVANAS_ESCAPE_2 = 1, - SAY_SYLVANAS_ESCAPE_3 = 2, - SAY_SYLVANAS_ESCAPE_4 = 3, - SAY_SYLVANAS_ESCAPE_5 = 4, - SAY_SYLVANAS_ESCAPE_6 = 5, - SAY_SYLVANAS_ESCAPE_7 = 6, - SAY_SYLVANAS_ESCAPE_8 = 7, - SAY_SYLVANAS_ESCAPE_9 = 8, - SAY_UTHER_INTRO_A2_1 = 0, SAY_UTHER_INTRO_A2_2 = 1, SAY_UTHER_INTRO_A2_3 = 2, @@ -90,27 +71,40 @@ enum Text SAY_LK_JAINA_INTRO_END = 3, SAY_LK_SYLVANAS_INTRO_END = 4, + SAY_JAINA_SYLVANAS_ESCAPE_1 = 0, + SAY_JAINA_SYLVANAS_ESCAPE_2 = 1, + SAY_JAINA_SYLVANAS_ESCAPE_3 = 2, + SAY_JAINA_SYLVANAS_ESCAPE_4 = 3, + SAY_JAINA_SYLVANAS_ESCAPE_5 = 4, + SAY_JAINA_SYLVANAS_ESCAPE_6 = 5, + SAY_JAINA_SYLVANAS_ESCAPE_7 = 6, // unused + SAY_JAINA_SYLVANAS_ESCAPE_8 = 7, + + SAY_JAINA_ESCAPE_9 = 8, + SAY_JAINA_ESCAPE_10 = 9, + + SAY_SYLVANAS_ESCAPE_9 = 8, + SAY_LK_ESCAPE_1 = 0, SAY_LK_ESCAPE_2 = 1, - SAY_LK_ESCAPE_3 = 2, - SAY_LK_ESCAPE_4 = 3, - SAY_LK_ESCAPE_5 = 4, - SAY_LK_ESCAPE_6 = 5, - SAY_LK_ESCAPE_7 = 6, - SAY_LK_ESCAPE_8 = 7, - SAY_LK_ESCAPE_9 = 8, - SAY_LK_ESCAPE_10 = 9, - SAY_LK_ESCAPE_11 = 10, + SAY_LK_ESCAPE_ICEWALL_SUMMONED_1 = 2, + SAY_LK_ESCAPE_ICEWALL_SUMMONED_2 = 3, + SAY_LK_ESCAPE_ICEWALL_SUMMONED_3 = 4, + SAY_LK_ESCAPE_ICEWALL_SUMMONED_4 = 5, + SAY_LK_ESCAPE_GHOULS = 6, + SAY_LK_ESCAPE_ABOMINATION = 7, + SAY_LK_ESCAPE_WINTER = 8, + SAY_LK_ESCAPE_HARVEST_SOUL = 9, SAY_FALRIC_INTRO_1 = 5, SAY_FALRIC_INTRO_2 = 6, - SAY_MARWYN_INTRO_1 = 4, + SAY_MARWYN_INTRO_1 = 4 }; enum Events { - EVENT_WALK_INTRO1 = 1, + EVENT_WALK_INTRO1 = 1, EVENT_WALK_INTRO2, EVENT_START_INTRO, EVENT_SKIP_INTRO, @@ -181,21 +175,17 @@ enum Events EVENT_ESCAPE_13, EVENT_ESCAPE_14, EVENT_ESCAPE_15, - //EVENT_ESCAPE_16, + EVENT_ESCAPE_16, EVENT_ESCAPE_17, - EVENT_ESCAPE_18, - EVENT_ESCAPE_19, - EVENT_ESCAPE_20, - EVENT_ESCAPE_21, - EVENT_ESCAPE_22, - EVENT_ESCAPE_23, - EVENT_ESCAPE_24, - EVENT_ESCAPE_25, - EVENT_ESCAPE_26, - EVENT_ESCAPE_27, - - EVENT_OPEN_FROSTWORN_DOOR, - EVENT_CLOSE_FROSTWORN_DOOR, + + EVENT_REMORSELESS_WINTER, + EVENT_ESCAPE_SUMMON_GHOULS, + EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, + EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, + + EVENT_OPEN_IMPENETRABLE_DOOR, + EVENT_CLOSE_IMPENETRABLE_DOOR, + EVENT_KORELN_LORALEN_DEATH }; enum Misc @@ -203,907 +193,1151 @@ enum Misc ACTION_START_INTRO, ACTION_SKIP_INTRO, - QUEST_DELIVRANCE_FROM_THE_PIT_A2 = 24710, - QUEST_DELIVRANCE_FROM_THE_PIT_H2 = 24712, - QUEST_WRATH_OF_THE_LICH_KING_A2 = 24500, - QUEST_WRATH_OF_THE_LICH_KING_H2 = 24802, + JAINA_SYLVANAS_MAX_HEALTH = 252000, + + POINT_SHADOW_THRONE_DOOR = 1, + POINT_ATTACK_ICEWALL = 2, + POINT_TRAP = 3, + + SOUND_LK_SLAY_1 = 17214, + SOUND_LK_SLAY_2 = 17215, + SOUND_LK_FURY_OF_FROSTMOURNE = 17224 }; enum Spells { - SPELL_CAST_VISUAL = 65633, // Jaina/Sylavana - SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn - SPELL_UTHER_DESPAWN = 70693, + // Misc SPELL_TAKE_FROSTMOURNE = 72729, SPELL_FROSTMOURNE_DESPAWN = 72726, SPELL_FROSTMOURNE_VISUAL = 73220, SPELL_FROSTMOURNE_SOUNDS = 70667, - SPELL_JAINA_ICEBARRIER = 69787, // Jaina Ice Barrier - SPELL_JAINA_ICEPRISON = 69708, // Jaina Ice Prison - SPELL_SYLVANAS_CLOAKOFDARKNESS = 70188, // Sylvanas Cloak of Darkness - SPELL_SYLVANAS_DARKBINDING = 70194, // Sylvanas Dark Binding - SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter - SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper - SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of FrostMourne + SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn + SPELL_UTHER_DESPAWN = 70693, + + // Jaina, Sylvanas + SPELL_CAST_VISUAL = 65633, // wrong + SPELL_SUMMON_SOULS = 72711, + SPELL_TAUNT_ARTHAS = 69857, + SPELL_JAINA_ICE_BARRIER = 69787, // Jaina Ice Barrier + SPELL_JAINA_ICE_PRISON = 69708, // Jaina Ice Prison SPELL_JAINA_DESTROY_ICE_WALL = 69784, // Jaina + SPELL_SYLVANAS_CLOAK_OF_DARKNESS = 70188, // Sylvanas Cloak of Darkness + SPELL_SYLVANAS_DARK_BINDING = 70194, // Sylvanas Dark Binding SPELL_SYLVANAS_DESTROY_ICE_WALL = 70224, // Sylvanas - SPELL_SYLVANAS_JUMP = 68339, // Sylvanas Jump + SPELL_SYLVANAS_BLINDING_RETREAT = 70199, // Sylvanas Blinding Retreat + + // Lich King + SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter + SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper + SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of Frostmourne SPELL_RAISE_DEAD = 69818, - SPELL_HARVEST_SOUL = 70070, - SPELL_SUMMON_RISE_WITCH_DOCTOR = 69836, + SPELL_SUMMON_RISEN_WITCH_DOCTOR = 69836, SPELL_SUMMON_LUMBERING_ABOMINATION = 69835, SPELL_SUMMON_ICE_WALL = 69768, // Visual effect and icewall summoning + SPELL_PAIN_AND_SUFFERING = 74115, // Lich King Pain and Suffering + SPELL_STUN_BREAK_JAINA = 69764, // Lich King visual spell, another Stun Break is 69763, should remove the stun effect + SPELL_STUN_BREAK_SYLVANAS = 70200, + SPELL_HARVEST_SOUL = 69866, // Lich King Harvest Soul + + // Koreln, Loralen + SPELL_FEIGN_DEATH = 29266, // Raging Ghoul - SPELL_EMERGE_VISUAL = 50142, SPELL_GHOUL_JUMP = 70150, + SPELL_RAGING_GHOUL_SPAWN = 69636, - // Witch Doctor - SPELL_COURSE_OF_DOOM = 70144, + // Risen Witch Doctor + SPELL_CURSE_OF_DOOM = 70144, SPELL_SHADOW_BOLT_VOLLEY = 70145, SPELL_SHADOW_BOLT = 70080, + SPELL_RISEN_WITCH_DOCTOR_SPAWN = 69639, // Lumbering Abomination - SPELL_ABON_STRIKE = 40505, - SPELL_VOMIT_SPRAY = 70176, + SPELL_CLEAVE = 40505, + SPELL_VOMIT_SPRAY = 70176 }; -const Position HallsofReflectionLocs[] = +enum HorGossipMenu { - {5283.234863f, 1990.946777f, 707.695679f, 0.929097f}, // 2 Loralen Follows - {5408.031250f, 2102.918213f, 707.695251f, 0.792756f}, // 9 Sylvanas Follows - {5401.866699f, 2110.837402f, 707.695251f, 0.800610f}, // 10 Loralen follows + GOSSIP_MENU_JAINA_FINAL = 10930, + GOSSIP_MENU_SYLVANAS_FINAL = 10931 }; -const Position NpcJainaOrSylvanasEscapeRoute[] = +Position const NpcJainaOrSylvanasEscapeRoute[] = { - {5601.217285f, 2207.652832f, 731.541931f, 5.223304f}, // leave the throne room - {5607.224375f, 2173.913330f, 731.126038f, 2.608723f}, // adjust route - {5583.427246f, 2138.784180f, 731.150391f, 4.260901f}, // stop for talking - {5560.281738f, 2104.025635f, 731.410889f, 4.058383f}, // attack the first icewall - {5510.990723f, 2000.772217f, 734.716064f, 3.973213f}, // attack the second icewall - {5452.641113f, 1905.762329f, 746.530579f, 4.118834f}, // attack the third icewall - {5338.126953f, 1768.429810f, 767.237244f, 3.855189f}, // attack the fourth icewall - {5257.712402f, 1669.379395f, 784.300110f, 0.908373f}, // face the Lich king - {5261.191895f, 1681.901611f, 784.285278f, 4.410465f}, // final position + { 5601.217285f, 2207.652832f, 731.541931f, 5.223304f }, // leave the throne room + { 5607.224375f, 2173.913330f, 731.126038f, 2.608723f }, // adjust route + { 5583.427246f, 2138.784180f, 731.150391f, 4.260901f }, // stop for talking + { 5560.281738f, 2104.025635f, 731.410889f, 4.058383f }, // attack the first icewall + { 5510.990723f, 2000.772217f, 734.716064f, 3.973213f }, // attack the second icewall + { 5452.641113f, 1905.762329f, 746.530579f, 4.118834f }, // attack the third icewall + { 5338.126953f, 1768.429810f, 767.237244f, 3.855189f }, // attack the fourth icewall + { 5259.06f, 1669.27f, 784.3008f, 0.0f }, // trap (sniffed) + { 5265.53f, 1681.6f, 784.2947f, 4.13643f } // final position (sniffed) }; -const Position IceWalls[] = +Position const LichKingMoveAwayPos = { 5400.069824f, 2102.7131689f, 707.69525f, 0.843803f }; // Lich King walks away +Position const LichKingFirstSummon = { 5600.076172f, 2192.270996f, 731.750488f, 4.330935f }; // Lich King First summons +Position const JainaSylvanasShadowThroneDoor = { 5577.243f, 2235.852f, 733.0128f, 2.209562f }; // Jaina/Sylvanas move to door +Position const LichKingFinalPos = { 5283.742188f, 1706.335693f, 783.293518f, 4.138510f }; // Lich King Final Pos + +// sniffed +Position const KorelnOrLoralenPos[] = { - {5547.833f, 2083.701f,731.4332f,4.24115f}, // first icewall - {5503.213f, 1969.547f,737.0245f,4.293779f},// second icewall - {5439.976f, 1879.005f,752.7048f,4.207591f},// third icewall - {5318.289f, 1749.184f,771.9423f,4.054276f},// fourth icewall + { 5253.061f, 1953.616f, 707.6948f, 0.8377581f }, + { 5283.226f, 1992.300f, 707.7445f, 0.8377581f }, + { 5360.711f, 2064.797f, 707.6948f, 0.0f } }; -const Position IntroPos = {5265.89f, 1952.98f, 707.6978f, 0.0f}; // Jaina/Sylvanas Intro Start Position -const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne -const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f}; -const Position LichKingSpawnPos = {5362.917480f, 2062.307129f, 707.695374f, 3.945812f}; -const Position LichKingMoveThronePos = {5312.080566f, 2009.172119f, 709.341431f, 3.973301f}; // Lich King walks to throne -const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away -const Position LichKingSpawnPos2 = {5552.733398f, 2262.718506f, 733.011047f, 4.009696f}; // Lich King Spawn Position 2 -const Position LichKingFirstSummon = {5600.076172f, 2192.270996f, 731.750488f, 4.330935f}; // Lich King First summons -const Position JainaShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Jaina Spawn Position 2 -const Position SylvanasShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Sylvanas Spawn Position 2 -const Position FalricStartPos = {5283.878906f, 2030.459595f, 709.319641f, 5.506670f}; // Falric start position -const Position MarwynStartPos = {5334.979980f, 1982.399536f, 709.320129f, 2.347014f}; // Marwyn start position -const Position LichKingFinalPos = {5283.742188f, 1706.335693f, 783.293518f, 4.138510f}; // Lich King Final Pos -const Position ChestPos = {5246.187500f, 1649.079468f, 784.301758f, 0.901268f}; // Chest position -const Position FinalPortalPos = {5270.634277f ,1639.101196f, 784.303040f, 1.682743f}; // Final portal position - -class npc_jaina_or_sylvanas_hor : public CreatureScript +Position const SylvanasIntroPosition[] = { - public: - npc_jaina_or_sylvanas_hor() : CreatureScript("npc_jaina_or_sylvanas_hor") { } - - // AI of Part1 - struct npc_jaina_or_sylvanas_horAI : public ScriptedAI - { - npc_jaina_or_sylvanas_horAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); - } - - InstanceScript* _instance; - uint64 _utherGUID; - uint64 _lichkingGUID; + { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn + { 5263.2f, 1950.96f, 707.6948f, 0.8028514f }, // 1 - Move to Door + { 5306.82f, 1998.17f, 709.341f, 1.239184f }, // 2 - Move to Frostmourne +}; - EventMap _events; +Position const JainaIntroPosition[] = +{ + { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn + { 5265.89f, 1952.98f, 707.6978f, 0.0f }, // 1 - Move to Door + { 5306.95f, 1998.49f, 709.3414f, 1.277278f } // 2 - Move to Frostmourne +}; - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case 0: - player->CLOSE_GOSSIP_MENU(); - _events.ScheduleEvent(EVENT_START_INTRO, 1000); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); - break; - case 1: - player->CLOSE_GOSSIP_MENU(); - _events.ScheduleEvent(EVENT_SKIP_INTRO, 1000); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); - break; - } - } +Position const UtherSpawnPos = { 5307.814f, 2003.168f, 709.4244f, 4.537856f }; - void Reset() override - { - _events.Reset(); +Position const LichKingIntroPosition[] = +{ + { 5362.463f, 2062.693f, 707.7781f, 3.944444f }, // 0 - Spawn + { 5332.83f, 2031.24f, 707.6948f, 0.0f }, // 1 - Door + { 5312.93f, 2010.24f, 709.34f, 0.0f }, // 2 - Move to Frostmourne + { 5319.028f, 2016.662f, 707.6948f, 0.0f }, // 3 - Move back + { 5332.285f, 2030.832f, 707.6948f, 0.0f }, // 4 - Move back 2 + { 5355.488f, 2055.149f, 707.6907f, 0.0f } // 5 - Move back 3 +}; - _utherGUID = 0; - _lichkingGUID = 0; +Position const FalricPosition[] = +{ + { 5276.583f, 2037.45f, 709.4025f, 5.532694f }, // 0 - Spawn + { 5283.95f, 2030.53f, 709.3191f, 0.0f } // 1 - Intro +}; - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); - me->SetStandState(UNIT_STAND_STATE_STAND); - _events.ScheduleEvent(EVENT_WALK_INTRO1, 3000); - } +Position const MarwynPosition[] = +{ + { 5342.232f, 1975.696f, 709.4025f, 2.391101f }, // 0 - Spawn + { 5335.01f, 1982.37f, 709.3191f, 0.0f } // 1 - Intro +}; - void UpdateAI(uint32 diff) override - { - _events.Update(diff); +Position const SylvanasShadowThroneDoorPosition = { 5576.79f, 2235.73f, 733.0029f, 2.687807f }; - switch (_events.ExecuteEvent()) - { - case EVENT_WALK_INTRO1: - me->GetMotionMaster()->MovePoint(0, IntroPos); - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - { - Talk(SAY_JAINA_INTRO_1); - _events.ScheduleEvent(EVENT_WALK_INTRO2, 7000); - } - else - { - Talk(SAY_SYLVANAS_INTRO_1); - _events.ScheduleEvent(EVENT_WALK_INTRO2, 9000); - } - break; - case EVENT_WALK_INTRO2: - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - Talk(SAY_JAINA_INTRO_2); - else - Talk(SAY_SYLVANAS_INTRO_2); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); - break; - case EVENT_START_INTRO: - me->GetMotionMaster()->MovePoint(0, MoveThronePos); - // Begining of intro is differents between fActions as the speech sequence and timers are differents. - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - _events.ScheduleEvent(EVENT_INTRO_A2_1, 0); - else - _events.ScheduleEvent(EVENT_INTRO_H2_1, 0); - break; - // A2 Intro Events - case EVENT_INTRO_A2_1: - Talk(SAY_JAINA_INTRO_3); - _events.ScheduleEvent(EVENT_INTRO_A2_2, 7000); - break; - case EVENT_INTRO_A2_2: - Talk(SAY_JAINA_INTRO_4); - _events.ScheduleEvent(EVENT_INTRO_A2_3, 10000); - break; - case EVENT_INTRO_A2_3: - me->CastSpell(me, SPELL_CAST_VISUAL, false); - me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true); - _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true); - _events.ScheduleEvent(EVENT_INTRO_A2_4, 10000); - break; - case EVENT_INTRO_A2_4: - if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) - { - uther->GetMotionMaster()->MoveIdle(); - _utherGUID = uther->GetGUID(); - } - _events.ScheduleEvent(EVENT_INTRO_A2_5, 2000); - break; - case EVENT_INTRO_A2_5: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_1); - _events.ScheduleEvent(EVENT_INTRO_A2_6, 3000); - break; - case EVENT_INTRO_A2_6: - Talk(SAY_JAINA_INTRO_5); - _events.ScheduleEvent(EVENT_INTRO_A2_7, 7000); - break; - case EVENT_INTRO_A2_7: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_2); - _events.ScheduleEvent(EVENT_INTRO_A2_8, 7000); - break; - case EVENT_INTRO_A2_8: - Talk(SAY_JAINA_INTRO_6); - _events.ScheduleEvent(EVENT_INTRO_A2_9, 1200); - break; - case EVENT_INTRO_A2_9: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_3); - _events.ScheduleEvent(EVENT_INTRO_A2_10, 11000); - break; - case EVENT_INTRO_A2_10: - Talk(SAY_JAINA_INTRO_7); - _events.ScheduleEvent(EVENT_INTRO_A2_11, 6000); - break; - case EVENT_INTRO_A2_11: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_4); - _events.ScheduleEvent(EVENT_INTRO_A2_12, 12000); - break; - case EVENT_INTRO_A2_12: - Talk(SAY_JAINA_INTRO_8); - _events.ScheduleEvent(EVENT_INTRO_A2_13, 6000); - break; - case EVENT_INTRO_A2_13: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_5); - _events.ScheduleEvent(EVENT_INTRO_A2_14, 13000); - break; - case EVENT_INTRO_A2_14: - Talk(SAY_JAINA_INTRO_9); - _events.ScheduleEvent(EVENT_INTRO_A2_15, 12000); - break; - case EVENT_INTRO_A2_15: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_6); - _events.ScheduleEvent(EVENT_INTRO_A2_16, 25000); - break; - case EVENT_INTRO_A2_16: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_7); - _events.ScheduleEvent(EVENT_INTRO_A2_17, 6000); - break; - case EVENT_INTRO_A2_17: - Talk(SAY_JAINA_INTRO_10); - _events.ScheduleEvent(EVENT_INTRO_A2_18, 5000); - break; - case EVENT_INTRO_A2_18: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - { - uther->HandleEmoteCommand(EMOTE_ONESHOT_NO); - uther->AI()->Talk(SAY_UTHER_INTRO_A2_8); - } - _events.ScheduleEvent(EVENT_INTRO_A2_19, 12000); - break; - case EVENT_INTRO_A2_19: - Talk(SAY_JAINA_INTRO_11); - _events.ScheduleEvent(EVENT_INTRO_LK_1, 3000); - break; - // H2 Intro Events - case EVENT_INTRO_H2_1: - Talk(SAY_SYLVANAS_INTRO_1); - _events.ScheduleEvent(EVENT_INTRO_H2_2, 8000); - break; - case EVENT_INTRO_H2_2: - Talk(SAY_SYLVANAS_INTRO_2); - _events.ScheduleEvent(EVENT_INTRO_H2_3, 6000); - break; - case EVENT_INTRO_H2_3: - Talk(SAY_SYLVANAS_INTRO_3); - me->CastSpell(me, SPELL_CAST_VISUAL, false); - me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true); - _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true); - _events.ScheduleEvent(EVENT_INTRO_H2_4, 6000); - break; - case EVENT_INTRO_H2_4: - // spawn UTHER during speach 2 - if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) - { - uther->GetMotionMaster()->MoveIdle(); - _utherGUID = uther->GetGUID(); - } - _events.ScheduleEvent(EVENT_INTRO_H2_5, 2000); - break; - case EVENT_INTRO_H2_5: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_H2_1); - _events.ScheduleEvent(EVENT_INTRO_H2_6, 11000); - break; - case EVENT_INTRO_H2_6: - Talk(SAY_SYLVANAS_INTRO_4); - _events.ScheduleEvent(EVENT_INTRO_H2_7, 3000); - break; - case EVENT_INTRO_H2_7: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_H2_2); - _events.ScheduleEvent(EVENT_INTRO_H2_8, 6000); - break; - case EVENT_INTRO_H2_8: - Talk(SAY_SYLVANAS_INTRO_5); - _events.ScheduleEvent(EVENT_INTRO_H2_9, 5000); - break; - case EVENT_INTRO_H2_9: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_H2_3); - _events.ScheduleEvent(EVENT_INTRO_H2_10, 19000); - break; - case EVENT_INTRO_H2_10: - Talk(SAY_SYLVANAS_INTRO_6); - _events.ScheduleEvent(EVENT_INTRO_H2_11, 1500); - break; - case EVENT_INTRO_H2_11: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_H2_4); - _events.ScheduleEvent(EVENT_INTRO_H2_12, 19500); - break; - case EVENT_INTRO_H2_12: - Talk(SAY_SYLVANAS_INTRO_7); - _events.ScheduleEvent(EVENT_INTRO_H2_13, 2000); - break; - case EVENT_INTRO_H2_13: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - { - uther->HandleEmoteCommand(EMOTE_ONESHOT_NO); - uther->AI()->Talk(SAY_UTHER_INTRO_H2_5); - } - _events.ScheduleEvent(EVENT_INTRO_H2_14, 12000); - break; - case EVENT_INTRO_H2_14: - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - uther->AI()->Talk(SAY_UTHER_INTRO_H2_6); - _events.ScheduleEvent(EVENT_INTRO_H2_15, 8000); - break; - case EVENT_INTRO_H2_15: - Talk(SAY_SYLVANAS_INTRO_8); - _events.ScheduleEvent(EVENT_INTRO_LK_1, 2000); - break; - // Remaining Intro Events common for both faction - case EVENT_INTRO_LK_1: - // Spawn LK in front of door, and make him move to the sword. - if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART1, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) - { - lichking->SetWalk(true); - lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos); - _lichkingGUID = lichking->GetGUID(); - _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0); - _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000); - } - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - { - uther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - uther->AI()->Talk(SAY_UTHER_INTRO_A2_9); - else - uther->AI()->Talk(SAY_UTHER_INTRO_H2_7); - } - _events.ScheduleEvent(EVENT_INTRO_LK_2, 10000); - break; - case EVENT_INTRO_LK_2: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->AI()->Talk(SAY_LK_INTRO_1); - _events.ScheduleEvent(EVENT_INTRO_LK_3, 1000); - break; - case EVENT_INTRO_LK_3: - // The Lich King banishes Uther to the abyss. - if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) - { - uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true); - uther->DespawnOrUnsummon(5000); - _utherGUID = 0; - } - _events.ScheduleEvent(EVENT_INTRO_LK_4, 9000); - break; - case EVENT_INTRO_LK_4: - // He steps forward and removes the runeblade from the heap of skulls. - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - { - if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTMOURNE))) - frostmourne->SetPhaseMask(2, true); - lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true); - lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true); - } - _events.ScheduleEvent(EVENT_INTRO_LK_5, 8000); - break; - case EVENT_INTRO_LK_5: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->AI()->Talk(SAY_LK_INTRO_2); - _events.ScheduleEvent(EVENT_INTRO_LK_6, 10000); - break; - case EVENT_INTRO_LK_6: - // summon Falric and Marwyn. then go back to the door - if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC_EVENT))) - { - falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true); - falric->SetVisible(true); - } - if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN_EVENT))) - { - marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true); - marwyn->SetVisible(true); - } - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - { - lichking->AI()->Talk(SAY_LK_INTRO_3); - lichking->SetWalk(true); - lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos); - } - _events.ScheduleEvent(EVENT_INTRO_LK_7, 10000); - _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 5000); - break; - case EVENT_INTRO_LK_7: - if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN_EVENT))) - { - marwyn->AI()->Talk(SAY_MARWYN_INTRO_1); - marwyn->SetWalk(true); - marwyn->GetMotionMaster()->MovePoint(0, MarwynStartPos); - } - _events.ScheduleEvent(EVENT_INTRO_LK_8, 1000); - break; - case EVENT_INTRO_LK_8: - if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC_EVENT))) - { - falric->AI()->Talk(SAY_FALRIC_INTRO_1); - falric->SetWalk(true); - falric->GetMotionMaster()->MovePoint(0, FalricStartPos); - } - _events.ScheduleEvent(EVENT_INTRO_LK_9, 5000); - break; - case EVENT_INTRO_LK_9: - if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC_EVENT))) - falric->AI()->Talk(SAY_FALRIC_INTRO_2); - _instance->ProcessEvent(0, EVENT_SPAWN_WAVES); - _events.ScheduleEvent(EVENT_INTRO_LK_10, 4000); - break; - case EVENT_INTRO_LK_10: - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - Talk(SAY_JAINA_INTRO_END); - else - Talk(SAY_SYLVANAS_INTRO_END); - me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos); - /// @todo Loralen/Koreln shall run also - _events.ScheduleEvent(EVENT_INTRO_LK_11, 5000); - break; - case EVENT_INTRO_LK_11: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - { - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - lichking->AI()->Talk(SAY_LK_JAINA_INTRO_END); - else - lichking->AI()->Talk(SAY_LK_SYLVANAS_INTRO_END); - } - _events.ScheduleEvent(EVENT_INTRO_END, 5000); - break; - case EVENT_INTRO_END: - _instance->SetData(DATA_INTRO_EVENT, DONE); - // Loralen or Koreln disappearAndDie() - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - { - lichking->DespawnOrUnsummon(5000); - _lichkingGUID = 0; - } - me->DespawnOrUnsummon(10000); - _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 7000); - break; - case EVENT_SKIP_INTRO: - me->GetMotionMaster()->MovePoint(0, MoveThronePos); - /// @todo Loralen/Koreln shall run also - if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART1, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) - { - lichking->SetWalk(true); - lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos); - lichking->SetReactState(REACT_PASSIVE); - _lichkingGUID = lichking->GetGUID(); - _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0); - _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000); - } - _events.ScheduleEvent(EVENT_INTRO_LK_4, 15000); - break; - case EVENT_OPEN_FROSTWORN_DOOR: - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTWORN_DOOR))) - _instance->HandleGameObject(0, true, gate); - break; - case EVENT_CLOSE_FROSTWORN_DOOR: - if (GameObject* gate = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTWORN_DOOR))) - _instance->HandleGameObject(0, false, gate); - break; - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_horAI>(creature); - } +Position const IceWallTargetPosition[] = +{ + { 5547.833f, 2083.701f, 731.4332f, 1.029744f }, // 1st Icewall + { 5503.213f, 1969.547f, 737.0245f, 1.27409f }, // 2nd Icewall + { 5439.976f, 1879.005f, 752.7048f, 1.064651f }, // 3rd Icewall + { 5318.289f, 1749.184f, 771.9423f, 0.8726646f } // 4th Icewall }; -class npc_jaina_or_sylvanas_escape_hor : public CreatureScript +class npc_jaina_or_sylvanas_intro_hor : public CreatureScript { public: - npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { } - - // AI of Part2 - struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI - { - npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()), _lichkingGUID(0), _walltargetGUID(0), - _icewallGUID(0), _icewall(0) - { - } - - InstanceScript* _instance; - uint64 _lichkingGUID; - uint64 _walltargetGUID; // dummy - uint64 _icewallGUID; // object - uint32 _icewall; // icewall number - - EventMap _events; + npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { } - void Reset() override + struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI { - _events.Reset(); - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->DespawnOrUnsummon(1); - _lichkingGUID = 0; - _walltargetGUID = 0; - _icewallGUID = 0; - _icewall = 0; - _events.ScheduleEvent(EVENT_ESCAPE, 0); - } - - void JustDied(Unit* /*Killer*/) override - { - _instance->SetData(DATA_ESCAPE_EVENT, FAIL); - } - - void DoAction(int32 actionId) override - { - switch (actionId) - { - case ACTION_START_ESCAPING: // called by InstanceScript when we need to start the escaping event - _events.ScheduleEvent(EVENT_ESCAPE_1, 1000); - break; - case ACTION_WALL_BROKEN: - _icewall++; - if (_icewall != 4) - _events.ScheduleEvent(EVENT_ESCAPE_17, 3000); - else - _events.ScheduleEvent(EVENT_ESCAPE_23, 3000); - break; + npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + _utherGUID = 0; + _lichkingGUID = 0; } - } - void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) + void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override { - case 0: - player->CLOSE_GOSSIP_MENU(); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); - _events.ScheduleEvent(EVENT_ESCAPE_7, 0); - break; - } - } + player->PlayerTalkClass->ClearMenus(); - void DestroyIceWall() - { - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - me->RemoveAurasDueToSpell(SPELL_JAINA_DESTROY_ICE_WALL); - else - me->RemoveAurasDueToSpell(SPELL_SYLVANAS_DESTROY_ICE_WALL); + switch (gossipListId) + { + case 0: + player->PlayerTalkClass->SendCloseGossip(); + _events.ScheduleEvent(EVENT_START_INTRO, 1000); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + break; + case 1: + player->PlayerTalkClass->SendCloseGossip(); + _events.ScheduleEvent(EVENT_SKIP_INTRO, 1000); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + break; + default: + break; + } + } - _instance->HandleGameObject(_icewallGUID, true); + void Reset() override + { + _events.Reset(); - if (Creature* wallTarget = ObjectAccessor::GetCreature(*me, _walltargetGUID)) - wallTarget->DespawnOrUnsummon(); - } + _utherGUID = 0; + _lichkingGUID = 0; - void UpdateAI(uint32 diff) override - { - _events.Update(diff); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + me->SetStandState(UNIT_STAND_STATE_STAND); + _events.ScheduleEvent(EVENT_WALK_INTRO1, 3000); + } - while (uint32 event = _events.ExecuteEvent()) + void UpdateAI(uint32 diff) override { - switch (event) + _events.Update(diff); + + switch (_events.ExecuteEvent()) { - case EVENT_ESCAPE: - if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART2, LichKingSpawnPos2, TEMPSUMMON_MANUAL_DESPAWN)) + case EVENT_WALK_INTRO1: + if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN))) + korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[0]); + + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) { - me->Attack(lichking, true); - lichking->Attack(me, true); - me->SetReactState(REACT_PASSIVE); - lichking->SetReactState(REACT_PASSIVE); - _lichkingGUID = lichking->GetGUID(); - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - DoCast(me, SPELL_JAINA_ICEBARRIER); - else - DoCast(me, SPELL_SYLVANAS_CLOAKOFDARKNESS); + me->GetMotionMaster()->MovePoint(0, JainaIntroPosition[1]); + Talk(SAY_JAINA_INTRO_1); + _events.ScheduleEvent(EVENT_WALK_INTRO2, 7000); } - me->SetHealth(252000); - break; - case EVENT_ESCAPE_1: - _instance->SetData(DATA_ESCAPE_EVENT, IN_PROGRESS); - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + else { - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - lichking->AI()->Talk(SAY_LK_ESCAPE_1); - else - lichking->AI()->Talk(SAY_LK_ESCAPE_2); - _events.ScheduleEvent(EVENT_ESCAPE_2, 8000); + me->GetMotionMaster()->MovePoint(0, SylvanasIntroPosition[1]); + Talk(SAY_SYLVANAS_INTRO_1); + _events.ScheduleEvent(EVENT_WALK_INTRO2, 9000); } break; - case EVENT_ESCAPE_2: + case EVENT_WALK_INTRO2: if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - DoCast(me, SPELL_CAST_VISUAL, true); + Talk(SAY_JAINA_INTRO_2); else - DoCast(me, SPELL_SYLVANAS_JUMP, true); - _events.ScheduleEvent(EVENT_ESCAPE_3, 1000); + Talk(SAY_SYLVANAS_INTRO_2); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); break; - case EVENT_ESCAPE_3: + case EVENT_START_INTRO: + if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN))) + korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]); + // Begining of intro is differents between factions as the speech sequence and timers are differents. if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - DoCastAOE(SPELL_JAINA_ICEPRISON, true); + { + me->GetMotionMaster()->MovePoint(0, JainaIntroPosition[2]); + _events.ScheduleEvent(EVENT_INTRO_A2_1, 0); + } else - DoCastAOE(SPELL_SYLVANAS_DARKBINDING, true); - _events.ScheduleEvent(EVENT_ESCAPE_4, 2000); + { + me->GetMotionMaster()->MovePoint(0, SylvanasIntroPosition[2]); + _events.ScheduleEvent(EVENT_INTRO_H2_1, 0); + } break; - case EVENT_ESCAPE_4: - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - Talk(SAY_JAINA_ESCAPE_1); - else - Talk(SAY_SYLVANAS_ESCAPE_1); - _events.ScheduleEvent(EVENT_ESCAPE_5, 2000); + // A2 Intro Events + case EVENT_INTRO_A2_1: + Talk(SAY_JAINA_INTRO_3); + _events.ScheduleEvent(EVENT_INTRO_A2_2, 7000); break; - case EVENT_ESCAPE_5: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->CombatStop(); - me->GetMotionMaster()->MovePoint(0, JainaShadowThroneDoor); - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - me->RemoveAurasDueToSpell(SPELL_JAINA_ICEBARRIER); - else - me->RemoveAurasDueToSpell(SPELL_SYLVANAS_CLOAKOFDARKNESS); - _events.ScheduleEvent(EVENT_ESCAPE_6, 5000); + case EVENT_INTRO_A2_2: + Talk(SAY_JAINA_INTRO_4); + _events.ScheduleEvent(EVENT_INTRO_A2_3, 10000); break; - case EVENT_ESCAPE_6: - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER); + case EVENT_INTRO_A2_3: + me->CastSpell(me, SPELL_CAST_VISUAL, false); + me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true); + _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true); + _events.ScheduleEvent(EVENT_INTRO_A2_4, 10000); break; - case EVENT_ESCAPE_7: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - { - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICEPRISON); - else - lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARKBINDING); - } - _events.ScheduleEvent(EVENT_ESCAPE_8, 1000); + case EVENT_INTRO_A2_4: + if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) + _utherGUID = uther->GetGUID(); + _events.ScheduleEvent(EVENT_INTRO_A2_5, 2000); break; - case EVENT_ESCAPE_8: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->HandleEmoteCommand(TEXT_EMOTE_ROAR); - me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]); - _events.ScheduleEvent(EVENT_ESCAPE_9, 3000); + case EVENT_INTRO_A2_5: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_1); + _events.ScheduleEvent(EVENT_INTRO_A2_6, 3000); break; - case EVENT_ESCAPE_9: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]); - _events.ScheduleEvent(EVENT_ESCAPE_10, 1000); + case EVENT_INTRO_A2_6: + Talk(SAY_JAINA_INTRO_5); + _events.ScheduleEvent(EVENT_INTRO_A2_7, 7000); break; - case EVENT_ESCAPE_10: - me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[1]); - _events.ScheduleEvent(EVENT_ESCAPE_11, 5000); + case EVENT_INTRO_A2_7: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_2); + _events.ScheduleEvent(EVENT_INTRO_A2_8, 7000); break; - case EVENT_ESCAPE_11: - me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[2]); - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->GetMotionMaster()->MovePoint(0, LichKingFirstSummon); - _events.ScheduleEvent(EVENT_ESCAPE_12, 6000); + case EVENT_INTRO_A2_8: + Talk(SAY_JAINA_INTRO_6); + _events.ScheduleEvent(EVENT_INTRO_A2_9, 1200); break; - case EVENT_ESCAPE_12: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + case EVENT_INTRO_A2_9: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_3); + _events.ScheduleEvent(EVENT_INTRO_A2_10, 11000); + break; + case EVENT_INTRO_A2_10: + Talk(SAY_JAINA_INTRO_7); + _events.ScheduleEvent(EVENT_INTRO_A2_11, 6000); + break; + case EVENT_INTRO_A2_11: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_4); + _events.ScheduleEvent(EVENT_INTRO_A2_12, 12000); + break; + case EVENT_INTRO_A2_12: + Talk(SAY_JAINA_INTRO_8); + _events.ScheduleEvent(EVENT_INTRO_A2_13, 6000); + break; + case EVENT_INTRO_A2_13: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_5); + _events.ScheduleEvent(EVENT_INTRO_A2_14, 13000); + break; + case EVENT_INTRO_A2_14: + Talk(SAY_JAINA_INTRO_9); + _events.ScheduleEvent(EVENT_INTRO_A2_15, 12000); + break; + case EVENT_INTRO_A2_15: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_6); + _events.ScheduleEvent(EVENT_INTRO_A2_16, 25000); + break; + case EVENT_INTRO_A2_16: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_7); + _events.ScheduleEvent(EVENT_INTRO_A2_17, 6000); + break; + case EVENT_INTRO_A2_17: + Talk(SAY_JAINA_INTRO_10); + _events.ScheduleEvent(EVENT_INTRO_A2_18, 5000); + break; + case EVENT_INTRO_A2_18: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) { - lichking->AI()->Talk(SAY_LK_ESCAPE_3); - lichking->CastSpell(me, SPELL_RAISE_DEAD); - lichking->Attack(me, true); + uther->HandleEmoteCommand(EMOTE_ONESHOT_NO); + uther->AI()->Talk(SAY_UTHER_INTRO_A2_8); } - _events.ScheduleEvent(EVENT_ESCAPE_13, 4000); + _events.ScheduleEvent(EVENT_INTRO_A2_19, 12000); break; - case EVENT_ESCAPE_13: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + case EVENT_INTRO_A2_19: + Talk(SAY_JAINA_INTRO_11); + _events.ScheduleEvent(EVENT_INTRO_LK_1, 3000); + break; + // H2 Intro Events + case EVENT_INTRO_H2_1: + Talk(SAY_SYLVANAS_INTRO_1); + _events.ScheduleEvent(EVENT_INTRO_H2_2, 8000); + break; + case EVENT_INTRO_H2_2: + Talk(SAY_SYLVANAS_INTRO_2); + _events.ScheduleEvent(EVENT_INTRO_H2_3, 6000); + break; + case EVENT_INTRO_H2_3: + Talk(SAY_SYLVANAS_INTRO_3); + me->CastSpell(me, SPELL_CAST_VISUAL, false); + me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true); + _instance->HandleGameObject(_instance->GetData64(DATA_FROSTMOURNE), true); + _events.ScheduleEvent(EVENT_INTRO_H2_4, 6000); + break; + case EVENT_INTRO_H2_4: + // spawn UTHER during speach 2 + if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN)) + _utherGUID = uther->GetGUID(); + _events.ScheduleEvent(EVENT_INTRO_H2_5, 2000); + break; + case EVENT_INTRO_H2_5: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_H2_1); + _events.ScheduleEvent(EVENT_INTRO_H2_6, 11000); + break; + case EVENT_INTRO_H2_6: + Talk(SAY_SYLVANAS_INTRO_4); + _events.ScheduleEvent(EVENT_INTRO_H2_7, 3000); + break; + case EVENT_INTRO_H2_7: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_H2_2); + _events.ScheduleEvent(EVENT_INTRO_H2_8, 6000); + break; + case EVENT_INTRO_H2_8: + Talk(SAY_SYLVANAS_INTRO_5); + _events.ScheduleEvent(EVENT_INTRO_H2_9, 5000); + break; + case EVENT_INTRO_H2_9: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_H2_3); + _events.ScheduleEvent(EVENT_INTRO_H2_10, 19000); + break; + case EVENT_INTRO_H2_10: + Talk(SAY_SYLVANAS_INTRO_6); + _events.ScheduleEvent(EVENT_INTRO_H2_11, 1500); + break; + case EVENT_INTRO_H2_11: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_H2_4); + _events.ScheduleEvent(EVENT_INTRO_H2_12, 19500); + break; + case EVENT_INTRO_H2_12: + Talk(SAY_SYLVANAS_INTRO_7); + _events.ScheduleEvent(EVENT_INTRO_H2_13, 2000); + break; + case EVENT_INTRO_H2_13: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) { - lichking->CastSpell(lichking, SPELL_REMORSELESS_WINTER, true); - lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR); - lichking->GetMotionMaster()->MoveIdle(); - lichking->GetMotionMaster()->MoveChase(me); + uther->HandleEmoteCommand(EMOTE_ONESHOT_NO); + uther->AI()->Talk(SAY_UTHER_INTRO_H2_5); } - if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[0], TEMPSUMMON_MANUAL_DESPAWN, 720000)) + _events.ScheduleEvent(EVENT_INTRO_H2_14, 12000); + break; + case EVENT_INTRO_H2_14: + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) + uther->AI()->Talk(SAY_UTHER_INTRO_H2_6); + _events.ScheduleEvent(EVENT_INTRO_H2_15, 8000); + break; + case EVENT_INTRO_H2_15: + Talk(SAY_SYLVANAS_INTRO_8); + _events.ScheduleEvent(EVENT_INTRO_LK_1, 2000); + break; + // Remaining Intro Events common for both faction + case EVENT_INTRO_LK_1: + // Spawn LK in front of door, and make him move to the sword. + if (Creature* lichking = me->SummonCreature(NPC_THE_LICH_KING_INTRO, LichKingIntroPosition[0], TEMPSUMMON_MANUAL_DESPAWN)) { - _walltargetGUID = walltarget->GetGUID(); - walltarget->CastSpell(walltarget, SPELL_SUMMON_ICE_WALL); - walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->Attack(walltarget, false); + lichking->SetWalk(true); + lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]); + _lichkingGUID = lichking->GetGUID(); + _events.ScheduleEvent(EVENT_OPEN_IMPENETRABLE_DOOR, 0); + _events.ScheduleEvent(EVENT_CLOSE_IMPENETRABLE_DOOR, 4000); } - me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[3]); - _events.ScheduleEvent(EVENT_ESCAPE_14, 8000); - break; - case EVENT_ESCAPE_14: - if (Creature* walltarget = ObjectAccessor::GetCreature(*me, _walltargetGUID)) + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) { - if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f)) - { - _icewallGUID = icewall->GetGUID(); - icewall->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - _instance->HandleGameObject(0, false, icewall); - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - Talk(SAY_JAINA_ESCAPE_2); - else - Talk(SAY_SYLVANAS_ESCAPE_2); - } + uther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + uther->AI()->Talk(SAY_UTHER_INTRO_A2_9); + else + uther->AI()->Talk(SAY_UTHER_INTRO_H2_7); } - _events.ScheduleEvent(EVENT_ESCAPE_15, 1000); + _events.ScheduleEvent(EVENT_INTRO_LK_2, 10000); break; - case EVENT_ESCAPE_15: + case EVENT_INTRO_LK_2: if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + lichking->AI()->Talk(SAY_LK_INTRO_1); + _events.ScheduleEvent(EVENT_INTRO_LK_3, 1000); + break; + case EVENT_INTRO_LK_3: + // The Lich King banishes Uther to the abyss. + if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID)) { - lichking->GetMotionMaster()->MoveIdle(); - lichking->GetMotionMaster()->MoveChase(me); - lichking->SetReactState(REACT_PASSIVE); + uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true); + uther->DespawnOrUnsummon(5000); + _utherGUID = 0; } - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, true); - else - DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, true); + _events.ScheduleEvent(EVENT_INTRO_LK_4, 9000); break; - case EVENT_ESCAPE_17:// ICEWALL BROKEN - me->GetMotionMaster()->MoveIdle(); + case EVENT_INTRO_LK_4: + // He steps forward and removes the runeblade from the heap of skulls. if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) { - lichking->StopMoving(); - lichking->AI()->Talk(SAY_LK_ESCAPE_3); - lichking->CastSpell(me, SPELL_RAISE_DEAD); + if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTMOURNE))) + frostmourne->SetPhaseMask(2, true); + lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true); + lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true); } - - DestroyIceWall(); - - if (_icewall && _icewall < 4) - me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[_icewall + 3]); - _events.ScheduleEvent(EVENT_ESCAPE_18, 2000); + _events.ScheduleEvent(EVENT_INTRO_LK_5, 8000); break; - case EVENT_ESCAPE_18: + case EVENT_INTRO_LK_5: if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + lichking->AI()->Talk(SAY_LK_INTRO_2); + _events.ScheduleEvent(EVENT_INTRO_LK_6, 10000); + break; + case EVENT_INTRO_LK_6: + // summon Falric and Marwyn. then go back to the door + if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC))) { - lichking->GetMotionMaster()->MoveIdle(); - lichking->GetMotionMaster()->MoveChase(me); + falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true); + falric->SetVisible(true); } - _events.ScheduleEvent(EVENT_ESCAPE_19, 6000); - break; - case EVENT_ESCAPE_19: - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN))) { - if (_icewall && _icewall < 4) - lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR); - lichking->GetMotionMaster()->MoveIdle(); - lichking->GetMotionMaster()->MoveChase(me); - lichking->SetReactState(REACT_PASSIVE); - lichking->Attack(me, true); + marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true); + marwyn->SetVisible(true); } - if (_icewall < 4) + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) { - if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[_icewall], TEMPSUMMON_MANUAL_DESPAWN, 720000)) - { - _walltargetGUID = walltarget->GetGUID(); - walltarget->CastSpell(walltarget, SPELL_SUMMON_ICE_WALL); - walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->Attack(walltarget, false); - } + lichking->AI()->Talk(SAY_LK_INTRO_3); + lichking->SetWalk(true); + lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos); } - _events.ScheduleEvent(EVENT_ESCAPE_20, 3000); + _events.ScheduleEvent(EVENT_INTRO_LK_7, 10000); + _events.ScheduleEvent(EVENT_OPEN_IMPENETRABLE_DOOR, 5000); break; - case EVENT_ESCAPE_20: - if (Creature* walltarget = ObjectAccessor::GetCreature(*me, _walltargetGUID)) + case EVENT_INTRO_LK_7: + if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN))) { - if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f)) - { - _icewallGUID = icewall->GetGUID(); - _instance->HandleGameObject(0, false, icewall); - icewall->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - { - if (_icewall == 1) - Talk(SAY_JAINA_ESCAPE_3); - else if (_icewall == 2) - Talk(SAY_JAINA_ESCAPE_4); - else if (_icewall == 3) - Talk(SAY_JAINA_ESCAPE_5); - } - else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE) - { - if (_icewall == 1) - Talk(SAY_SYLVANAS_ESCAPE_3); - else if (_icewall == 2) - Talk(SAY_SYLVANAS_ESCAPE_4); - else if (_icewall == 3) - Talk(SAY_SYLVANAS_ESCAPE_5); - } - } + marwyn->AI()->Talk(SAY_MARWYN_INTRO_1); + marwyn->SetWalk(true); + marwyn->GetMotionMaster()->MovePoint(0, MarwynPosition[1]); } - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + _events.ScheduleEvent(EVENT_INTRO_LK_8, 1000); + break; + case EVENT_INTRO_LK_8: + if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC))) { - if (_icewall && _icewall < 3) - lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR); - else - lichking->CastSpell(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION); + falric->AI()->Talk(SAY_FALRIC_INTRO_1); + falric->SetWalk(true); + falric->GetMotionMaster()->MovePoint(0, FalricPosition[1]); } - if (_icewall == 3) - _events.ScheduleEvent(EVENT_ESCAPE_21, 16000); // last wall, really far - else - _events.ScheduleEvent(EVENT_ESCAPE_21, 9000); + _events.ScheduleEvent(EVENT_INTRO_LK_9, 5000); + break; + case EVENT_INTRO_LK_9: + if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC))) + falric->AI()->Talk(SAY_FALRIC_INTRO_2); + _instance->ProcessEvent(0, EVENT_SPAWN_WAVES); + _events.ScheduleEvent(EVENT_INTRO_LK_10, 4000); break; - case EVENT_ESCAPE_21: + case EVENT_INTRO_LK_10: if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, true); + Talk(SAY_JAINA_INTRO_END); else - DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, true); - + Talk(SAY_SYLVANAS_INTRO_END); + me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos); + /// @todo: needs some improvements + if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN))) + korelnOrLoralen->GetMotionMaster()->MovePoint(1, KorelnOrLoralenPos[2]); + _events.ScheduleEvent(EVENT_INTRO_LK_11, 5000); + break; + case EVENT_INTRO_LK_11: if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) { - if (_icewall == 1) - lichking->CastSpell(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION); - else if (_icewall > 1 && _icewall < 4) - { - lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR); - _events.ScheduleEvent(EVENT_ESCAPE_22, 1000); - } + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + lichking->AI()->Talk(SAY_LK_JAINA_INTRO_END); + else + lichking->AI()->Talk(SAY_LK_SYLVANAS_INTRO_END); } + _events.ScheduleEvent(EVENT_INTRO_END, 5000); break; - case EVENT_ESCAPE_22: + case EVENT_INTRO_END: + _instance->SetData(DATA_INTRO_EVENT, DONE); + _events.ScheduleEvent(EVENT_KORELN_LORALEN_DEATH, 8000); if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) { - if (_icewall >= 2 && _icewall < 4) - lichking->CastSpell(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION); + lichking->DespawnOrUnsummon(5000); + _lichkingGUID = 0; } + me->DespawnOrUnsummon(10000); + _events.ScheduleEvent(EVENT_CLOSE_IMPENETRABLE_DOOR, 7000); break; - case EVENT_ESCAPE_23: // FINAL PART - DestroyIceWall(); - + case EVENT_SKIP_INTRO: if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - Talk(SAY_JAINA_ESCAPE_6); + me->GetMotionMaster()->MovePoint(0, JainaIntroPosition[2]); else - Talk(SAY_SYLVANAS_ESCAPE_6); + me->GetMotionMaster()->MovePoint(0, SylvanasIntroPosition[2]); - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) + if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN))) + korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]); + + if (Creature* lichking = me->SummonCreature(NPC_THE_LICH_KING_INTRO, LichKingIntroPosition[0], TEMPSUMMON_MANUAL_DESPAWN)) { - lichking->GetMotionMaster()->MovePoint(0, LichKingFinalPos); - lichking->AI()->Talk(SAY_LK_ESCAPE_11); + lichking->SetWalk(true); + lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]); + lichking->SetReactState(REACT_PASSIVE); + _lichkingGUID = lichking->GetGUID(); + _events.ScheduleEvent(EVENT_OPEN_IMPENETRABLE_DOOR, 0); + _events.ScheduleEvent(EVENT_CLOSE_IMPENETRABLE_DOOR, 4000); } - me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[8]); - _events.ScheduleEvent(EVENT_ESCAPE_24, 10000); + _events.ScheduleEvent(EVENT_INTRO_LK_4, 15000); break; - case EVENT_ESCAPE_24: - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - Talk(SAY_JAINA_ESCAPE_8); - else - Talk(SAY_SYLVANAS_ESCAPE_8); - _events.ScheduleEvent(EVENT_ESCAPE_25, 5000); + case EVENT_OPEN_IMPENETRABLE_DOOR: + _instance->HandleGameObject(_instance->GetData64(DATA_IMPENETRABLE_DOOR), true); break; - case EVENT_ESCAPE_25: - if (GameObject* cave = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_CAVE_IN))) - cave->SetGoState(GO_STATE_READY); - _events.ScheduleEvent(EVENT_ESCAPE_26, 4000); + case EVENT_CLOSE_IMPENETRABLE_DOOR: + _instance->HandleGameObject(_instance->GetData64(DATA_IMPENETRABLE_DOOR), false); break; - case EVENT_ESCAPE_26: - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - Talk(SAY_JAINA_ESCAPE_10); + case EVENT_KORELN_LORALEN_DEATH: + if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN))) + korelnOrLoralen->CastSpell(korelnOrLoralen, SPELL_FEIGN_DEATH); + break; + default: + break; + } + } + + private: + InstanceScript* _instance; + EventMap _events; + uint64 _utherGUID; + uint64 _lichkingGUID; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_intro_horAI>(creature); + } +}; + +class npc_jaina_or_sylvanas_escape_hor : public CreatureScript +{ + public: + npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { } + + bool OnGossipHello(Player* player, Creature* creature) override + { + // override default gossip + if (InstanceScript* instance = creature->GetInstanceScript()) + if (instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) + { + player->PrepareGossipMenu(creature, creature->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true); + player->SendPreparedGossip(creature); + return true; + } + + // load default gossip + return false; + } + + struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI + { + npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()), _icewall(0), _prefight(false), _invincibility(true) { } + + void Reset() override + { + _events.Reset(); + _icewall = 0; + _events.ScheduleEvent(EVENT_ESCAPE, 1000); + _instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT); + } + + void JustDied(Unit* /*killer*/) override + { + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + lichking->AI()->EnterEvadeMode(); // event failed + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth() && _invincibility) + damage = me->GetHealth() - 1; + } + + void DoAction(int32 actionId) override + { + switch (actionId) + { + case ACTION_START_PREFIGHT: + if (_prefight) + return; + _prefight = true; + _events.ScheduleEvent(EVENT_ESCAPE_1, 1000); + break; + case ACTION_WALL_BROKEN: + ++_icewall; + if (_icewall < 4) + _events.ScheduleEvent(EVENT_ESCAPE_13, 3000); else - Talk(SAY_SYLVANAS_ESCAPE_9); - _events.ScheduleEvent(EVENT_ESCAPE_27, 4000); + _events.ScheduleEvent(EVENT_ESCAPE_15, 3000); break; - case EVENT_ESCAPE_27: - if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) - me->SummonGameObject(IsHeroic() ? GO_CAPTAIN_CHEST_ALLIANCE_HEROIC : GO_CAPTAIN_CHEST_ALLIANCE_NORMAL, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000); + case ACTION_GUNSHIP_ARRIVAL: + _events.ScheduleEvent(EVENT_ESCAPE_16, 5000); + break; + case ACTION_GUNSHIP_ARRIVAL_2: + _events.ScheduleEvent(EVENT_ESCAPE_17, 5000); + break; + default: + break; + } + } + + void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + player->PlayerTalkClass->ClearMenus(); + + switch (gossipListId) + { + case 0: + player->PlayerTalkClass->SendCloseGossip(); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + _events.ScheduleEvent(EVENT_ESCAPE_6, 0); + break; + default: + break; + } + } + + void DestroyIceWall() + { + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + me->RemoveAurasDueToSpell(SPELL_JAINA_DESTROY_ICE_WALL); + else + me->RemoveAurasDueToSpell(SPELL_SYLVANAS_DESTROY_ICE_WALL); + + _instance->HandleGameObject(_instance->GetData64(DATA_ICEWALL), true); + me->m_Events.AddEvent(new GameObjectDeleteDelayEvent(me, _instance->GetData64(DATA_ICEWALL)), me->m_Events.CalculateTime(5000)); + + if (Creature* wallTarget = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ICEWALL_TARGET))) + wallTarget->DespawnOrUnsummon(); + } + + void SummonIceWall() + { + if (_icewall < 4) + { + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + { + lichking->StopMoving(); + if (Creature* wallTarget = me->SummonCreature(NPC_ICE_WALL_TARGET, IceWallTargetPosition[_icewall], TEMPSUMMON_MANUAL_DESPAWN, 720000)) + lichking->CastSpell(wallTarget, SPELL_SUMMON_ICE_WALL); + + lichking->AI()->SetData(DATA_ICEWALL, _icewall); + } + } + } + + void AttackIceWall() + { + if (_icewall < 4) + Talk(SAY_JAINA_SYLVANAS_ESCAPE_2 + _icewall); + + if (Creature* wallTarget = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ICEWALL_TARGET))) + me->SetFacingToObject(wallTarget); + + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, true); + else + DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, true); + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type != POINT_MOTION_TYPE) + return; + + switch (pointId) + { + case POINT_SHADOW_THRONE_DOOR: + if (me->GetEntry() == NPC_JAINA_ESCAPE) + me->RemoveAurasDueToSpell(SPELL_JAINA_ICE_BARRIER); else - me->SummonGameObject(IsHeroic() ? GO_CAPTAIN_CHEST_HORDE_HEROIC : GO_CAPTAIN_CHEST_HORDE_NORMAL, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000); - me->SummonGameObject(GO_PORTAL, FinalPortalPos.GetPositionX(), FinalPortalPos.GetPositionY(), FinalPortalPos.GetPositionZ(), FinalPortalPos.GetOrientation(), 0, 0, 0, 0, 720000); - if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) - lichking->DespawnOrUnsummon(1); + me->RemoveAurasDueToSpell(SPELL_SYLVANAS_CLOAK_OF_DARKNESS); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetHealth(JAINA_SYLVANAS_MAX_HEALTH); + me->SetFacingTo(SylvanasShadowThroneDoorPosition.GetOrientation()); + break; + case POINT_ATTACK_ICEWALL: + AttackIceWall(); + break; + case POINT_TRAP: + Talk(SAY_JAINA_SYLVANAS_ESCAPE_8); + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + me->SetFacingToObject(lichking); break; + default: + break; + } + } + + void DeleteAllFromThreatList(Unit* target, uint64 except) + { + ThreatContainer::StorageType threatlist = target->getThreatManager().getThreatList(); + for (auto i : threatlist) + { + if (i->getUnitGuid() == except) + continue; + + i->removeReference(); + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + while (uint32 event = _events.ExecuteEvent()) + { + switch (event) + { + case EVENT_ESCAPE: + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + DoCast(me, SPELL_JAINA_ICE_BARRIER); + else + DoCast(me, SPELL_SYLVANAS_CLOAK_OF_DARKNESS); + + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + { + AttackStart(lichking); + lichking->AI()->AttackStart(me); + me->CastSpell(lichking, SPELL_TAUNT_ARTHAS, true); + } + me->SetHealth(JAINA_SYLVANAS_MAX_HEALTH); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + break; + case EVENT_ESCAPE_1: + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + { + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + lichking->AI()->Talk(SAY_LK_ESCAPE_1); + else + lichking->AI()->Talk(SAY_LK_ESCAPE_2); + _events.ScheduleEvent(EVENT_ESCAPE_2, 8000); + } + break; + case EVENT_ESCAPE_2: + me->AttackStop(); + me->StopMoving(); + me->SetReactState(REACT_PASSIVE); + + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + DoCast(me, SPELL_JAINA_ICE_PRISON, false); + else + DoCast(me, SPELL_SYLVANAS_BLINDING_RETREAT, true); + + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + { + lichking->SetReactState(REACT_PASSIVE); + lichking->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED); + } + + _events.ScheduleEvent(EVENT_ESCAPE_3, 1500); + break; + case EVENT_ESCAPE_3: + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE) + DoCastAOE(SPELL_SYLVANAS_DARK_BINDING, true); + _events.ScheduleEvent(EVENT_ESCAPE_4, 1000); + break; + case EVENT_ESCAPE_4: + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + DoCast(me, SPELL_CREDIT_FINDING_JAINA); + else + DoCast(me, SPELL_CREDIT_FINDING_SYLVANAS); + Talk(SAY_JAINA_SYLVANAS_ESCAPE_1); + + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + { + lichking->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + lichking->RemoveAllAttackers(); + + DeleteAllFromThreatList(lichking, me->GetGUID()); + } + + _events.ScheduleEvent(EVENT_ESCAPE_5, 2000); + break; + case EVENT_ESCAPE_5: + me->GetMotionMaster()->MovePoint(POINT_SHADOW_THRONE_DOOR, SylvanasShadowThroneDoorPosition); + break; + case EVENT_ESCAPE_6: + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + { + lichking->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_PACIFIED); + + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + { + lichking->CastSpell(lichking, SPELL_STUN_BREAK_JAINA); + lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICE_PRISON); + } + else + { + lichking->CastSpell(lichking, SPELL_STUN_BREAK_SYLVANAS); + lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARK_BINDING); + } + } + _invincibility = false; + _instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT); + _events.ScheduleEvent(EVENT_ESCAPE_7, 1000); + break; + case EVENT_ESCAPE_7: + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + lichking->HandleEmoteCommand(TEXT_EMOTE_ROAR); + me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]); + _events.ScheduleEvent(EVENT_ESCAPE_8, 3000); + break; + case EVENT_ESCAPE_8: + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]); + _events.ScheduleEvent(EVENT_ESCAPE_9, 1000); + break; + case EVENT_ESCAPE_9: + me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[1]); + _events.ScheduleEvent(EVENT_ESCAPE_10, 5000); + break; + case EVENT_ESCAPE_10: + me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[2]); + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + lichking->GetMotionMaster()->MovePoint(1, LichKingFirstSummon); + _events.ScheduleEvent(EVENT_ESCAPE_11, 6000); + break; + case EVENT_ESCAPE_11: + SummonIceWall(); + _events.ScheduleEvent(EVENT_ESCAPE_12, 4000); + break; + case EVENT_ESCAPE_12: + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + lichking->CastSpell(lichking, SPELL_PAIN_AND_SUFFERING, true); + + me->GetMotionMaster()->MovePoint(POINT_ATTACK_ICEWALL, NpcJainaOrSylvanasEscapeRoute[3]); + break; + case EVENT_ESCAPE_13: // ICEWALL BROKEN + DestroyIceWall(); + + if (_icewall && _icewall < 4) + me->GetMotionMaster()->MovePoint(POINT_ATTACK_ICEWALL, NpcJainaOrSylvanasEscapeRoute[_icewall + 3]); + _events.ScheduleEvent(EVENT_ESCAPE_14, 8000); + break; + case EVENT_ESCAPE_14: + SummonIceWall(); + break; + case EVENT_ESCAPE_15: // FINAL PART + DestroyIceWall(); + + Talk(SAY_JAINA_SYLVANAS_ESCAPE_6); + + if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE))) + { + lichking->GetMotionMaster()->MovePoint(2, LichKingFinalPos); + lichking->RemoveAurasDueToSpell(SPELL_REMORSELESS_WINTER); + } + me->GetMotionMaster()->MovePoint(POINT_TRAP, NpcJainaOrSylvanasEscapeRoute[7]); + break; + case EVENT_ESCAPE_16: + me->RemoveAurasDueToSpell(SPELL_HARVEST_SOUL); + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + Talk(SAY_JAINA_ESCAPE_9); + if (Transport* gunship = ObjectAccessor::GetTransport(*me, _instance->GetData64(DATA_GUNSHIP))) + gunship->EnableMovement(true); + _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, DONE); + break; + case EVENT_ESCAPE_17: + if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) + Talk(SAY_JAINA_ESCAPE_10); + else + Talk(SAY_SYLVANAS_ESCAPE_9); + DoCast(me, SPELL_CREDIT_ESCAPING_ARTHAS); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + break; + default: + break; } } + + DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_escape_horAI>(creature); - } + private: + InstanceScript* _instance; + EventMap _events; + uint32 _icewall; // icewall number + bool _prefight; + bool _invincibility; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_escape_horAI>(creature); + } +}; + +class npc_the_lich_king_escape_hor : public CreatureScript +{ + public: + npc_the_lich_king_escape_hor() : CreatureScript("npc_the_lich_king_escape_hor") { } + + struct npc_the_lich_king_escape_horAI : public ScriptedAI + { + npc_the_lich_king_escape_horAI(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, NOT_STARTED); + _summonsCount = 0; + _icewall = 0; + _despawn = false; + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + damage = me->GetHealth() - 1; + } + + void MovementInform(uint32 type, uint32 pointId) override + { + if (type == POINT_MOTION_TYPE) + { + switch (pointId) + { + case 1: + if (Creature* target = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER))) + me->GetMotionMaster()->MoveChase(target); + break; + case 2: + Talk(SAY_LK_ESCAPE_HARVEST_SOUL); + + if (Creature* target = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER))) + DoCast(target, SPELL_HARVEST_SOUL); + + if (Transport* gunship = ObjectAccessor::GetTransport(*me, _instance->GetData64(DATA_GUNSHIP))) + gunship->EnableMovement(true); + break; + default: + break; + } + } + } + + void JustSummoned(Creature* /*summon*/) override + { + ++_summonsCount; + } + + void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override + { + // should never happen + if (!_summonsCount) + return; + + --_summonsCount; + + // All summons dead and no summon events scheduled + if (!_summonsCount && _events.Empty()) + { + if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER))) + jainaOrSylvanas->AI()->DoAction(ACTION_WALL_BROKEN); + } + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + DoPlaySoundToSet(me, RAND(SOUND_LK_SLAY_1, SOUND_LK_SLAY_2)); + } + + void SetData(uint32 type, uint32 data) override + { + if (type != DATA_ICEWALL) + return; + + _icewall = data; + + switch (_icewall) + { + case 0: // 6 Ghouls, 1 Witch Doctor + DoZoneInCombat(); + _events.ScheduleEvent(EVENT_REMORSELESS_WINTER, 0); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 8000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 14000); + Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_1); + break; + case 1: // 6 Ghouls, 2 Witch Doctor, 1 Lumbering Abomination + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 8000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 13000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 16000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 18000); + Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_2); + break; + case 2: // 6 Ghouls, 2 Witch Doctor, 2 Lumbering Abomination + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 9000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 14000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 17000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 19000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 39000); + Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_3); + break; + case 3: // 12 Ghouls, 4 Witch Doctor, 3 Lumbering Abomination + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 9000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 17000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 19000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 40000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 46000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 55000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 62000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 66000); + _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 14000); + Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_4); + break; + default: + break; + } + } + + void EnterEvadeMode() override + { + if (_despawn) + return; + + _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, FAIL); + me->StopMoving(); + DoPlaySoundToSet(me, SOUND_LK_FURY_OF_FROSTMOURNE); + DoCastAOE(SPELL_FURY_OF_FROSTMOURNE); + me->DespawnOrUnsummon(12000); + _despawn = true; + } + + void UpdateAI(uint32 diff) override + { + if (!SelectVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 event = _events.ExecuteEvent()) + { + switch (event) + { + case EVENT_REMORSELESS_WINTER: + me->StopMoving(); + Talk(SAY_LK_ESCAPE_WINTER); + DoCast(me, SPELL_REMORSELESS_WINTER); + break; + case EVENT_ESCAPE_SUMMON_GHOULS: + me->StopMoving(); + Talk(SAY_LK_ESCAPE_GHOULS); + DoCast(me, SPELL_RAISE_DEAD); + break; + case EVENT_ESCAPE_SUMMON_WITCH_DOCTOR: + DoCast(me, SPELL_SUMMON_RISEN_WITCH_DOCTOR); + break; + case EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION: + Talk(SAY_LK_ESCAPE_ABOMINATION); + DoCast(me, SPELL_SUMMON_LUMBERING_ABOMINATION); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + bool SelectVictim() + { + if (!me->IsInCombat()) + return false; + + if (!me->HasReactState(REACT_PASSIVE)) + { + if (Unit* victim = me->SelectVictim()) + AttackStart(victim); + return me->GetVictim(); + } + else if (me->getThreatManager().getThreatList().size() < 2 && me->HasAura(SPELL_REMORSELESS_WINTER)) + { + EnterEvadeMode(); + return false; + } + + return true; + } + + InstanceScript* _instance; + EventMap _events; + uint8 _icewall; + uint32 _summonsCount; + bool _despawn; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<npc_the_lich_king_escape_horAI>(creature); + } }; enum TrashSpells @@ -1140,7 +1374,7 @@ enum TrashSpells SPELL_SHOOT = 72208, SPELL_CURSED_ARROW = 72222, SPELL_FROST_TRAP = 72215, - SPELL_ICE_SHOT = 72268, + SPELL_ICE_SHOT = 72268 }; enum TrashEvents @@ -1175,19 +1409,16 @@ enum TrashEvents EVENT_SHOOT, EVENT_CURSED_ARROW, EVENT_FROST_TRAP, - EVENT_ICE_SHOT, + EVENT_ICE_SHOT }; struct npc_gauntlet_trash : public ScriptedAI { - npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - InternalWaveId = 0; - } + npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()), InternalWaveId(0) { } void Reset() override { - InternalWaveId = 0; me->CastSpell(me, SPELL_WELL_OF_SOULS, true); _events.Reset(); } @@ -1222,352 +1453,362 @@ protected: class npc_ghostly_priest : public CreatureScript { -public: - npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { } - - struct npc_ghostly_priestAI : public npc_gauntlet_trash - { - npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature) { } + public: + npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { } - void EnterCombat(Unit* /*who*/) override + struct npc_ghostly_priestAI : public npc_gauntlet_trash { - _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000); /// @todo adjust timers - _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000); - _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000); - _events.ScheduleEvent(EVENT_DARK_MENDING, 20000); - } + npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature) { } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SHADOW_WORD_PAIN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_SHADOW_WORD_PAIN); - _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000); - break; - case EVENT_CIRCLE_OF_DESTRUCTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_CIRCLE_OF_DESTRUCTION); - _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000); - break; - case EVENT_COWER_IN_FEAR: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_COWER_IN_FEAR); - _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000); - break; - case EVENT_DARK_MENDING: - // find an ally with missing HP - if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000))) - { - DoCast(target, SPELL_DARK_MENDING); - _events.ScheduleEvent(EVENT_DARK_MENDING, 20000); - } - else - { - // no friendly unit with missing hp. re-check in just 5 sec. - _events.ScheduleEvent(EVENT_DARK_MENDING, 5000); - } - break; + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(6000, 15000)); + _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000); + _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000); + _events.ScheduleEvent(EVENT_DARK_MENDING, 20000); } - DoMeleeAttackIfReady(); - } - }; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_ghostly_priestAI>(creature); - } -}; + _events.Update(diff); -class npc_phantom_mage : public CreatureScript -{ -public: - npc_phantom_mage() : CreatureScript("npc_phantom_mage") { } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - struct npc_phantom_mageAI : public npc_gauntlet_trash - { - npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { } + switch (_events.ExecuteEvent()) + { + case EVENT_SHADOW_WORD_PAIN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_SHADOW_WORD_PAIN); + _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(6000, 15000)); + break; + case EVENT_CIRCLE_OF_DESTRUCTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true)) + DoCast(target, SPELL_CIRCLE_OF_DESTRUCTION); + _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000); + break; + case EVENT_COWER_IN_FEAR: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, true)) + DoCast(target, SPELL_COWER_IN_FEAR); + _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000); + break; + case EVENT_DARK_MENDING: + // find an ally with missing HP + if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000))) + { + DoCast(target, SPELL_DARK_MENDING); + _events.ScheduleEvent(EVENT_DARK_MENDING, 20000); + } + else + { + // no friendly unit with missing hp. re-check in just 5 sec. + _events.ScheduleEvent(EVENT_DARK_MENDING, 5000); + } + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; - void EnterEvadeMode() override + CreatureAI* GetAI(Creature* creature) const override { - if (!me->HasAura(AURA_HALLUCINATION)) - npc_gauntlet_trash::EnterEvadeMode(); + return GetHallsOfReflectionAI<npc_ghostly_priestAI>(creature); } +}; - void EnterCombat(Unit* /*who*/) override +class npc_phantom_mage : public CreatureScript +{ + public: + npc_phantom_mage() : CreatureScript("npc_phantom_mage") { } + + struct npc_phantom_mageAI : public npc_gauntlet_trash { - _events.ScheduleEvent(EVENT_FIREBALL, 3000); /// @todo adjust timers - _events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000); - _events.ScheduleEvent(EVENT_FROSTBOLT, 9000); - _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000); - _events.ScheduleEvent(EVENT_HALLUCINATION, 40000); - } + npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { } + + void EnterEvadeMode() override + { + if (!me->HasAura(AURA_HALLUCINATION)) + npc_gauntlet_trash::EnterEvadeMode(); + } - void UpdateAI(uint32 diff) override + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_FIREBALL, 3000); + _events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000); + _events.ScheduleEvent(EVENT_FROSTBOLT, 9000); + _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000); + _events.ScheduleEvent(EVENT_HALLUCINATION, 40000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_FIREBALL: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_FIREBALL); + _events.ScheduleEvent(EVENT_FIREBALL, 15000); + break; + case EVENT_FLAMESTRIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_FLAMESTRIKE); + _events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000); + break; + case EVENT_FROSTBOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_FROSTBOLT); + _events.ScheduleEvent(EVENT_FROSTBOLT, 15000); + break; + case EVENT_CHAINS_OF_ICE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(target, SPELL_CHAINS_OF_ICE); + _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000); + break; + case EVENT_HALLUCINATION: + // removing any dots on mage or else the invisibility spell will break duration + me->RemoveAllAuras(); + DoCast(me, SPELL_HALLUCINATION); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_FIREBALL: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_FIREBALL); - _events.ScheduleEvent(EVENT_FIREBALL, 15000); - break; - case EVENT_FLAMESTRIKE: - DoCast(SPELL_FLAMESTRIKE); - _events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000); - break; - case EVENT_FROSTBOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_FROSTBOLT); - _events.ScheduleEvent(EVENT_FROSTBOLT, 15000); - break; - case EVENT_CHAINS_OF_ICE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_CHAINS_OF_ICE); - _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000); - break; - case EVENT_HALLUCINATION: - // removing any dots on mage or else the invisibility spell will break duration - me->RemoveAllAuras(); - DoCast(SPELL_HALLUCINATION); - break; - } - - DoMeleeAttackIfReady(); + return GetHallsOfReflectionAI<npc_phantom_mageAI>(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_phantom_mageAI>(creature); - } }; class npc_phantom_hallucination : public CreatureScript { -public: - npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { } - - struct npc_phantom_hallucinationAI : public npc_phantom_mage::npc_phantom_mageAI - { - npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) { } + public: + npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { } - void Reset() override + struct npc_phantom_hallucinationAI : public npc_phantom_mage::npc_phantom_mageAI { - if (Unit* unit = me->SelectNearestTarget()) - AttackStart(unit); - DoZoneInCombat(); - } + npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) { } - void EnterEvadeMode() override - { - if (me->GetOwner() && !me->GetOwner()->HasAura(AURA_HALLUCINATION)) - npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(); - } + void Reset() override + { + DoZoneInCombat(me, 150.0f); + } + + void EnterEvadeMode() override + { + if (me->GetOwner() && !me->GetOwner()->HasAura(AURA_HALLUCINATION)) + npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(); + } + + void JustDied(Unit* /*killer*/) override + { + DoCastAOE(SPELL_HALLUCINATION_2); + } + }; - void JustDied(Unit* /*killer*/) override + CreatureAI* GetAI(Creature* creature) const override { - DoCast(SPELL_HALLUCINATION_2); + return new npc_phantom_hallucinationAI(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_phantom_hallucinationAI(creature); - } }; class npc_shadowy_mercenary : public CreatureScript { -public: - npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { } - - struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash - { - npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature) { } + public: + npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { } - void EnterCombat(Unit* /*who*/) override + struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash { - _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); /// @todo adjust timers - _events.ScheduleEvent(EVENT_DEADLY_POISON, 5000); - _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000); - _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000); - } + npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature) { } + + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SHADOW_STEP, 23000); + _events.ScheduleEvent(EVENT_DEADLY_POISON, 5000); + _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000); + _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); - void UpdateAI(uint32 diff) override + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_SHADOW_STEP: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_SHADOW_STEP); + _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); + break; + case EVENT_DEADLY_POISON: + DoCastVictim(SPELL_DEADLY_POISON); + _events.ScheduleEvent(EVENT_DEADLY_POISON, 10000); + break; + case EVENT_ENVENOMED_DAGGER_THROW: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_ENVENOMED_DAGGER_THROW); + _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000); + break; + case EVENT_KIDNEY_SHOT: + DoCastVictim(SPELL_KIDNEY_SHOT); + _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SHADOW_STEP: - DoCast(SPELL_SHADOW_STEP); - _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); - break; - case EVENT_DEADLY_POISON: - DoCastVictim(SPELL_DEADLY_POISON); - _events.ScheduleEvent(EVENT_DEADLY_POISON, 10000); - break; - case EVENT_ENVENOMED_DAGGER_THROW: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_ENVENOMED_DAGGER_THROW); - _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000); - break; - case EVENT_KIDNEY_SHOT: - DoCastVictim(SPELL_KIDNEY_SHOT); - _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000); - break; - } - - DoMeleeAttackIfReady(); + return GetHallsOfReflectionAI<npc_shadowy_mercenaryAI>(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_shadowy_mercenaryAI>(creature); - } }; class npc_spectral_footman : public CreatureScript { -public: - npc_spectral_footman() : CreatureScript("npc_spectral_footman") { } - - struct npc_spectral_footmanAI : public npc_gauntlet_trash - { - npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature) { } + public: + npc_spectral_footman() : CreatureScript("npc_spectral_footman") { } - void EnterCombat(Unit* /*who*/) override + struct npc_spectral_footmanAI : public npc_gauntlet_trash { - _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); /// @todo adjust timers - _events.ScheduleEvent(EVENT_SHIELD_BASH, 10000); - _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000); - } + npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature) { } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 14000); + _events.ScheduleEvent(EVENT_SHIELD_BASH, 10000); + _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - _events.Update(diff); + _events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - switch (_events.ExecuteEvent()) - { - case EVENT_SPECTRAL_STRIKE: - DoCastVictim(SPELL_SPECTRAL_STRIKE); - _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); - break; - case EVENT_SHIELD_BASH: - DoCastVictim(SPELL_SHIELD_BASH); - _events.ScheduleEvent(EVENT_SHIELD_BASH, 5000); - break; - case EVENT_TORTURED_ENRAGE: - DoCast(SPELL_TORTURED_ENRAGE); - _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000); - break; + switch (_events.ExecuteEvent()) + { + case EVENT_SPECTRAL_STRIKE: + DoCastVictim(SPELL_SPECTRAL_STRIKE); + _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); + break; + case EVENT_SHIELD_BASH: + DoCastVictim(SPELL_SHIELD_BASH); + _events.ScheduleEvent(EVENT_SHIELD_BASH, 5000); + break; + case EVENT_TORTURED_ENRAGE: + DoCast(me, SPELL_TORTURED_ENRAGE); + _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000); + break; + default: + break; + } + + DoMeleeAttackIfReady(); } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<npc_spectral_footmanAI>(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_spectral_footmanAI>(creature); - } }; class npc_tortured_rifleman : public CreatureScript { -public: - npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { } - - struct npc_tortured_riflemanAI : public npc_gauntlet_trash - { - npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature) { } + public: + npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { } - void EnterCombat(Unit* /*who*/) override + struct npc_tortured_riflemanAI : public npc_gauntlet_trash { - _events.ScheduleEvent(EVENT_SHOOT, 1); /// @todo adjust timers - _events.ScheduleEvent(EVENT_CURSED_ARROW, 7000); - _events.ScheduleEvent(EVENT_FROST_TRAP, 10000); - _events.ScheduleEvent(EVENT_ICE_SHOT, 15000); - } + npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature) { } + + void EnterCombat(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_SHOOT, 1); + _events.ScheduleEvent(EVENT_CURSED_ARROW, 7000); + _events.ScheduleEvent(EVENT_FROST_TRAP, 10000); + _events.ScheduleEvent(EVENT_ICE_SHOT, 15000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_SHOOT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_SHOOT); + _events.ScheduleEvent(EVENT_SHOOT, 2000); + break; + case EVENT_CURSED_ARROW: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_CURSED_ARROW); + _events.ScheduleEvent(EVENT_CURSED_ARROW, 10000); + break; + case EVENT_FROST_TRAP: + DoCast(me, SPELL_FROST_TRAP); + _events.ScheduleEvent(EVENT_FROST_TRAP, 30000); + break; + case EVENT_ICE_SHOT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) + DoCast(target, SPELL_ICE_SHOT); + _events.ScheduleEvent(EVENT_ICE_SHOT, 15000); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (_events.ExecuteEvent()) - { - case EVENT_SHOOT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_SHOOT); - _events.ScheduleEvent(EVENT_SHOOT, 2000); - break; - case EVENT_CURSED_ARROW: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_CURSED_ARROW); - _events.ScheduleEvent(EVENT_CURSED_ARROW, 10000); - break; - case EVENT_FROST_TRAP: - DoCast(SPELL_FROST_TRAP); - _events.ScheduleEvent(EVENT_FROST_TRAP, 30000); - break; - case EVENT_ICE_SHOT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_ICE_SHOT); - _events.ScheduleEvent(EVENT_ICE_SHOT, 15000); - break; - } - DoMeleeAttackIfReady(); + return GetHallsOfReflectionAI<npc_tortured_riflemanAI>(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_tortured_riflemanAI>(creature); - } }; - -enum GeneralEvents +enum FrostswornGeneral { - //General + // General EVENT_SHIELD = 1, EVENT_SPIKE = 2, EVENT_CLONE = 3, @@ -1575,554 +1816,652 @@ enum GeneralEvents SAY_AGGRO = 0, SAY_DEATH = 1, - SPELL_SHIELD_THROWN = 69222, // 73076 on hc - SPELL_SPIKE = 69184, // 70399 on hc - SPELL_CLONE_NAME = 57507, - SPELL_CLONE_MODEL = 45204, + SPELL_SHIELD_THROWN = 69222, + SPELL_SPIKE = 69184, + SPELL_CLONE = 69828, + SPELL_GHOST_VISUAL = 69861, // Reflection EVENT_BALEFUL_STRIKE = 1, - SPELL_BALEFUL_STRIKE = 69933, // 70400 on hc - SPELL_SPIRIT_BURST = 69900, // 73046 on hc + SPELL_BALEFUL_STRIKE = 69933, + SPELL_SPIRIT_BURST = 69900 }; -class npc_frostworn_general : public CreatureScript +class npc_frostsworn_general : public CreatureScript { -public: - npc_frostworn_general() : CreatureScript("npc_frostworn_general") { } + public: + npc_frostsworn_general() : CreatureScript("npc_frostsworn_general") { } - struct npc_frostworn_generalAI : public ScriptedAI - { - npc_frostworn_generalAI(Creature* creature) : ScriptedAI(creature) + struct npc_frostsworn_generalAI : public ScriptedAI { - _instance = me->GetInstanceScript(); - Reset(); - } + npc_frostsworn_generalAI(Creature* creature) : ScriptedAI(creature) + { + _instance = creature->GetInstanceScript(); + } - InstanceScript* _instance; - EventMap _events; + void Reset() override + { + _events.Reset(); + _instance->SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED); + } - void Reset() override - { - _events.Reset(); - _instance->SetData(DATA_FROSWORN_EVENT, NOT_STARTED); - } + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _events.Reset(); + _instance->SetData(DATA_FROSTSWORN_GENERAL, DONE); + } - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - _instance->SetData(DATA_FROSWORN_EVENT, DONE); - } + void EnterCombat(Unit* /*victim*/) override + { + Talk(SAY_AGGRO); + DoZoneInCombat(); + _events.ScheduleEvent(EVENT_SHIELD, 5000); + _events.ScheduleEvent(EVENT_SPIKE, 14000); + _events.ScheduleEvent(EVENT_CLONE, 22000); + _instance->SetData(DATA_FROSTSWORN_GENERAL, IN_PROGRESS); + } - void EnterCombat(Unit* /*victim*/) override - { - Talk(SAY_AGGRO); - _events.ScheduleEvent(EVENT_SHIELD, 5000); - _events.ScheduleEvent(EVENT_SPIKE, 14000); - _events.ScheduleEvent(EVENT_CLONE, 22000); - _instance->SetData(DATA_FROSWORN_EVENT, IN_PROGRESS); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + _events.Update(diff); - _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + while (uint32 event = _events.ExecuteEvent()) + { + switch (event) + { + case EVENT_SHIELD: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) + DoCast(target, SPELL_SHIELD_THROWN); + _events.ScheduleEvent(EVENT_SHIELD, urand(8000, 12000)); + break; + case EVENT_SPIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) + DoCast(target, SPELL_SPIKE); + _events.ScheduleEvent(EVENT_SPIKE, urand(15000, 20000)); + break; + case EVENT_CLONE: + SummonClones(); + _events.ScheduleEvent(EVENT_CLONE, 60000); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } - while (uint32 event = _events.ExecuteEvent()) + void SummonClones() { - switch (event) + std::list<Unit*> playerList; + SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0.0f, true); + for (Unit* target : playerList) { - case EVENT_SHIELD: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SHIELD_THROWN); - _events.ScheduleEvent(EVENT_SHIELD, urand(8000, 12000)); - break; - case EVENT_SPIKE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SPIKE); - _events.ScheduleEvent(EVENT_SPIKE, urand(15000, 20000)); - break; - case EVENT_CLONE: - SummonClones(); - _events.ScheduleEvent(EVENT_CLONE, 60000); - break; + if (Creature* reflection = me->SummonCreature(NPC_REFLECTION, *target, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000)) + { + target->CastSpell(reflection, SPELL_CLONE, true); + target->CastSpell(reflection, SPELL_GHOST_VISUAL, true); + reflection->AI()->AttackStart(target); + } } } - DoMeleeAttackIfReady(); - } - void SummonClones() + private: + InstanceScript* _instance; + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const override { - std::list<Unit *> playerList; - SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0, true); - for (std::list<Unit*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) - { - Unit* temp = (*itr); - Creature* reflection = me->SummonCreature(NPC_REFLECTION, temp->GetPositionX(), temp->GetPositionY(), temp->GetPositionZ(), temp->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000); - reflection->SetName(temp->GetName()); - temp->CastSpell(reflection, SPELL_CLONE_NAME, true); - temp->CastSpell(reflection, SPELL_CLONE_MODEL, true); - reflection->setFaction(me->getFaction()); - reflection->AI()->AttackStart(temp); - } + return GetHallsOfReflectionAI<npc_frostsworn_generalAI>(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_frostworn_generalAI>(creature); - } }; class npc_spiritual_reflection : public CreatureScript { -public: - npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { } + public: + npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { } - struct npc_spiritual_reflectionAI : public ScriptedAI - { - npc_spiritual_reflectionAI(Creature *creature) : ScriptedAI(creature) + struct npc_spiritual_reflectionAI : public ScriptedAI { - Reset(); - } + npc_spiritual_reflectionAI(Creature *creature) : ScriptedAI(creature) { } - EventMap _events; + void Reset() override + { + _events.Reset(); + } - void Reset() override - { - _events.Reset(); - } + void EnterCombat(Unit* /*victim*/) override + { + _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000); + } - void EnterCombat(Unit* /*victim*/) override - { - _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000); - } + void JustDied(Unit* /*killer*/) override + { + DoCastAOE(SPELL_SPIRIT_BURST); + } - void JustDied(Unit* killer) override - { - DoCast(killer, SPELL_SPIRIT_BURST); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + _events.Update(diff); - _events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + switch (_events.ExecuteEvent()) + { + case EVENT_BALEFUL_STRIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 8.0f, true)) + DoCast(target, SPELL_BALEFUL_STRIKE); + _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(3000, 8000)); + break; + default: + break; + } - switch (_events.ExecuteEvent()) - { - case EVENT_BALEFUL_STRIKE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_BALEFUL_STRIKE); - _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(3000, 8000)); + DoMeleeAttackIfReady(); } - DoMeleeAttackIfReady(); - } - }; + private: + EventMap _events; + }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_spiritual_reflectionAI(creature); - } + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_spiritual_reflectionAI(creature); + } }; +// 5689 class at_hor_intro_start : public AreaTriggerScript { -public: - at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") { } + public: + at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override - { - InstanceScript* _instance = player->GetInstanceScript(); + bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override + { + if (player->IsGameMaster()) + return true; - if (player->IsGameMaster()) - return true; + InstanceScript* _instance = player->GetInstanceScript(); - if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED) - _instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS); + if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED) + _instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS); - return true; - } + return true; + } }; class at_hor_waves_restarter : public AreaTriggerScript { -public: - at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") { } + public: + at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") { } - bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override - { - InstanceScript* _instance = player->GetInstanceScript(); + bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override + { + if (player->IsGameMaster()) + return true; - if (player->IsGameMaster()) - return true; + InstanceScript* _instance = player->GetInstanceScript(); + + if (_instance->GetData(DATA_WAVE_COUNT)) + return true; - if (_instance->GetData(DATA_WAVE_COUNT)) + if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN) != DONE) + { + _instance->ProcessEvent(0, EVENT_SPAWN_WAVES); + + if (Creature* falric = ObjectAccessor::GetCreature(*player, _instance->GetData64(DATA_FALRIC))) + { + falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true); + falric->SetVisible(true); + } + if (Creature* marwyn = ObjectAccessor::GetCreature(*player, _instance->GetData64(DATA_MARWYN))) + { + marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true); + marwyn->SetVisible(true); + } + } return true; + } +}; - if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN_EVENT) != DONE) +// 5740 +class at_hor_impenetrable_door : public AreaTriggerScript +{ + public: + at_hor_impenetrable_door() : AreaTriggerScript("at_hor_impenetrable_door") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override { - _instance->ProcessEvent(0, EVENT_SPAWN_WAVES); + if (player->IsGameMaster()) + return true; - if (Creature* falric = player->GetCreature(*player, _instance->GetData64(DATA_FALRIC_EVENT))) - { - falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true); - falric->SetVisible(true); - } - if (Creature* marwyn = player->GetCreature(*player, _instance->GetData64(DATA_MARWYN_EVENT))) - { - marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true); - marwyn->SetVisible(true); - } + InstanceScript* _instance = player->GetInstanceScript(); + if (_instance->GetBossState(DATA_MARWYN) == DONE) + return true; + + /// return false to handle teleport by db + return false; } - return true; - } }; -class at_shadow_throne : public AreaTriggerScript +// 5605 +class at_hor_shadow_throne : public AreaTriggerScript { -public: - at_shadow_throne() : AreaTriggerScript("at_shadow_throne") { } + public: + at_hor_shadow_throne() : AreaTriggerScript("at_hor_shadow_throne") { } - bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override - { - InstanceScript* _instance = player->GetInstanceScript(); + bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override + { + if (player->IsGameMaster()) + return true; + + InstanceScript* _instance = player->GetInstanceScript(); + + if (_instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == NOT_STARTED) + _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, IN_PROGRESS); - if (player->IsGameMaster()) return true; + } +}; - if (_instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED) - _instance->SetData(DATA_ESCAPE_EVENT, IN_PROGRESS); +enum EscapeEvents +{ + // Raging Ghoul + EVENT_RAGING_GHOUL_JUMP = 1, - return true; - } + // Risen Witch Doctor + EVENT_RISEN_WITCH_DOCTOR_CURSE, + EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT, + EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY, + + // Lumbering Abomination + EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY, + EVENT_LUMBERING_ABOMINATION_CLEAVE }; -class npc_raging_ghoul : public CreatureScript +namespace hor { -public: - npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { } - struct npc_raging_ghoulAI : public ScriptedAI - { - npc_raging_ghoulAI(Creature* creature) : ScriptedAI(creature) +class StartMovementEvent : public BasicEvent +{ + public: + StartMovementEvent(Creature* owner) : _owner(owner) { } + + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override { - _instance = me->GetInstanceScript(); + _owner->SetReactState(REACT_AGGRESSIVE); + if (Unit* target = _owner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + _owner->AI()->AttackStart(target); + return true; } - InstanceScript* _instance; - uint32 _emergeTimer; - bool _doEmerge; - bool _doJump; - uint64 _leaderGUID; + private: + Creature* _owner; +}; - void Reset() override - { - _emergeTimer = 4000; - _doEmerge = false; - _doJump = false; - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) - _instance->SetData(DATA_SUMMONS, 1); +} // namespace hor - } +struct npc_escape_event_trash : public ScriptedAI +{ + npc_escape_event_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } - void IsSummonedBy(Unit*) override - { - DoCast(me, SPELL_EMERGE_VISUAL); - } + void Reset() override + { + _events.Reset(); + } - void JustDied(Unit* /*killer*/) override + void UpdateAI(uint32 /*diff*/) override + { + if (_instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == FAIL || _instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == NOT_STARTED) + me->DespawnOrUnsummon(); + } + + void IsSummonedBy(Unit* /*summoner*/) override + { + DoZoneInCombat(me, 0.0f); + if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER))) { - _instance->SetData(DATA_SUMMONS, 0); + me->SetInCombatWith(leader); + leader->SetInCombatWith(me); + me->AddThreat(leader, 0.0f); } + } - void AttackStart(Unit* who) override +protected: + EventMap _events; + InstanceScript* _instance; +}; + +class npc_raging_ghoul : public CreatureScript +{ + public: + npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { } + + struct npc_raging_ghoulAI : public npc_escape_event_trash { - if (!who) - return; + npc_raging_ghoulAI(Creature* creature) : npc_escape_event_trash(creature) { } - if (!_doEmerge) - return; + void Reset() override + { + npc_escape_event_trash::Reset(); + _events.ScheduleEvent(EVENT_RAGING_GHOUL_JUMP, 5000); + } - ScriptedAI::AttackStart(who); - } + void IsSummonedBy(Unit* summoner) override + { + me->CastSpell(me, SPELL_RAGING_GHOUL_SPAWN, true); + me->SetReactState(REACT_PASSIVE); + me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); + me->m_Events.AddEvent(new hor::StartMovementEvent(me), me->m_Events.CalculateTime(5000)); - void UpdateAI(uint32 diff) override - { - if (!_instance) - return; + npc_escape_event_trash::IsSummonedBy(summoner); + } - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) + void UpdateAI(uint32 diff) override { - _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER); - Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)); + npc_escape_event_trash::UpdateAI(diff); + + if (!UpdateVictim()) + return; + + _events.Update(diff); - if (_doEmerge != true) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) { - if (_emergeTimer < diff) - { - _doEmerge = true; - if (leader) + case EVENT_RAGING_GHOUL_JUMP: + if (Unit* victim = me->GetVictim()) { - DoResetThreat(); - me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->MoveChase(leader); + if (me->IsInRange(victim, 5.0f, 30.0f)) + { + DoCast(victim, SPELL_GHOUL_JUMP); + return; + } } - } - else - _emergeTimer -= diff; + _events.ScheduleEvent(EVENT_RAGING_GHOUL_JUMP, 500); + break; + default: + break; } - if (me->Attack(leader,true))/*(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150.0f))*/ - { - if (!_doJump && me->IsWithinDistInMap(leader, 30.0f) && !me->IsWithinDistInMap(leader, 5.0f)) - { - _doJump = true; - DoCast(leader, SPELL_GHOUL_JUMP); - } - } + DoMeleeAttackIfReady(); } - else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED) - me->DespawnOrUnsummon(); - DoMeleeAttackIfReady(); - } - }; + }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_raging_ghoulAI>(creature); - } + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<npc_raging_ghoulAI>(creature); + } }; class npc_risen_witch_doctor : public CreatureScript { -public: - npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { } + public: + npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { } - struct npc_risen_witch_doctorAI : public ScriptedAI - { - npc_risen_witch_doctorAI(Creature* creature) : ScriptedAI(creature) + struct npc_risen_witch_doctorAI : public npc_escape_event_trash { - _instance = me->GetInstanceScript(); - } + npc_risen_witch_doctorAI(Creature* creature) : npc_escape_event_trash(creature) { } - InstanceScript* _instance; - uint32 _emergeTimer; - bool _doEmerge; - uint64 _leaderGUID; - uint32 _boltTimer; - uint32 _boltVolleyTimer; - uint32 _curseTimer; + void Reset() override + { + npc_escape_event_trash::Reset(); + _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT, 6000); + _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY, 15000); + _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_CURSE, 7000); + } - void Reset() override - { - _emergeTimer = 5000; - _boltTimer = 6000; - _boltVolleyTimer = 15000; - _curseTimer = 7000; - _doEmerge = false; - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) - _instance->SetData(DATA_SUMMONS, 1); - } + void IsSummonedBy(Unit* summoner) override + { + me->CastSpell(me, SPELL_RISEN_WITCH_DOCTOR_SPAWN, true); + me->SetReactState(REACT_PASSIVE); + me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); + me->m_Events.AddEvent(new hor::StartMovementEvent(me), me->m_Events.CalculateTime(5000)); - void IsSummonedBy(Unit*) override - { - DoCast(me, SPELL_EMERGE_VISUAL); - DoZoneInCombat(me, 100.00f); - } + npc_escape_event_trash::IsSummonedBy(summoner); + } - void JustDied(Unit* /*killer*/) override - { - _instance->SetData(DATA_SUMMONS, 0); - } + void UpdateAI(uint32 diff) override + { + npc_escape_event_trash::UpdateAI(diff); - void AttackStart(Unit* who) override - { - if (!who) - return; + if (!UpdateVictim()) + return; + + _events.Update(diff); - if (_doEmerge == false) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - ScriptedAI::AttackStart(who); + switch (_events.ExecuteEvent()) + { + case EVENT_RISEN_WITCH_DOCTOR_CURSE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) + DoCast(target, SPELL_CURSE_OF_DOOM); + _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_CURSE, urand(10000, 15000)); + break; + case EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 20.0f, true)) + DoCast(target, SPELL_SHADOW_BOLT); + _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT, urand(2000, 3000)); + break; + case EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY: + if (SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true)) + DoCastAOE(SPELL_SHADOW_BOLT_VOLLEY); + _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY, urand(15000, 22000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<npc_risen_witch_doctorAI>(creature); } +}; + +class npc_lumbering_abomination : public CreatureScript +{ + public: + npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { } - void UpdateAI(uint32 diff) override + struct npc_lumbering_abominationAI : public npc_escape_event_trash { - if (!_instance) - return; + npc_lumbering_abominationAI(Creature* creature) : npc_escape_event_trash(creature) { } - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) + void Reset() override { - if (_doEmerge != true) - { - if (_emergeTimer < diff) - { - _doEmerge = true; - _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER); + npc_escape_event_trash::Reset(); + _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY, 15000); + _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_CLEAVE, 6000); + } - if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER))) - { - DoResetThreat(); - me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->MoveChase(leader); - } - } - else - _emergeTimer -= diff; - } + void UpdateAI(uint32 diff) override + { + npc_escape_event_trash::UpdateAI(diff); - if (_curseTimer < diff) - { - if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM)) - DoCast(target, SPELL_COURSE_OF_DOOM); - _curseTimer = urand(10000, 15000); - } - else - _curseTimer -= diff; + if (!UpdateVictim()) + return; - if (_boltTimer < diff) - { - if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO)) - DoCast(target, SPELL_SHADOW_BOLT); - _boltTimer = urand(2000, 3000); - } - else - _boltTimer -= diff; + _events.Update(diff); - if (_boltVolleyTimer < diff) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) { - if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO)) - DoCast(target, SPELL_SHADOW_BOLT_VOLLEY); - _boltVolleyTimer = urand(15000, 22000); + case EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY: + DoCastVictim(SPELL_VOMIT_SPRAY); + _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY, urand(15000, 20000)); + break; + case EVENT_LUMBERING_ABOMINATION_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_CLEAVE, urand(7000, 9000)); + break; + default: + break; } - else - _boltVolleyTimer -= diff; + + DoMeleeAttackIfReady(); } - else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED) - me->DespawnOrUnsummon(); - DoMeleeAttackIfReady(); - } - }; + }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_risen_witch_doctorAI>(creature); - } + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfReflectionAI<npc_lumbering_abominationAI>(creature); + } }; - -class npc_lumbering_abomination : public CreatureScript +// 72900 - Start Halls of Reflection Quest AE +class spell_hor_start_halls_of_reflection_quest_ae : public SpellScriptLoader { -public: - npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { } + public: + spell_hor_start_halls_of_reflection_quest_ae() : SpellScriptLoader("spell_hor_start_halls_of_reflection_quest_ae") { } - struct npc_lumbering_abominationAI : public ScriptedAI - { - npc_lumbering_abominationAI(Creature* creature) : ScriptedAI(creature) + class spell_hor_start_halls_of_reflection_quest_ae_SpellScript : public SpellScript { - _instance = me->GetInstanceScript(); - } + PrepareSpellScript(spell_hor_start_halls_of_reflection_quest_ae_SpellScript); + + void StartQuests(SpellEffIndex /*effIndex*/) + { + if (Player* target = GetHitPlayer()) + { + // CanTakeQuest and CanAddQuest checks done in spell effect execution + if (target->GetTeam() == ALLIANCE) + target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_A, true); + else + target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_H, true); + } + } - InstanceScript* _instance; - uint64 _leaderGUID; - bool _doWalk; - uint32 _strikeTimer; - uint32 _vomitTimer; + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_hor_start_halls_of_reflection_quest_ae_SpellScript::StartQuests, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; - void Reset() override + SpellScript* GetSpellScript() const override { - _doWalk = false; - _vomitTimer = 15000; - _strikeTimer = 6000; - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) - _instance->SetData(DATA_SUMMONS, 1); + return new spell_hor_start_halls_of_reflection_quest_ae_SpellScript(); } +}; + +// 70190 - Evasion +class spell_hor_evasion : public SpellScriptLoader +{ + public: + spell_hor_evasion() : SpellScriptLoader("spell_hor_evasion") { } + + class spell_hor_evasion_SpellScript : public SpellScript + { + PrepareSpellScript(spell_hor_evasion_SpellScript); + + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void SetDest(SpellDestination& dest) + { + WorldObject* target = GetExplTargetWorldObject(); + Position pos(*target); + Position home = GetCaster()->ToCreature()->GetHomePosition(); + + // prevent evasion outside the room + if (pos.IsInDist2d(&home, 15.0f)) + return; + + float angle = pos.GetAngle(&home); + float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + target->MovePosition(pos, dist, angle); + + dest.Relocate(pos); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_hor_evasion_SpellScript::SetDest, EFFECT_0, TARGET_DEST_TARGET_RADIUS); + } + }; - void IsSummonedBy(Unit*) override + SpellScript* GetSpellScript() const override { - DoCast(me, SPELL_EMERGE_VISUAL); - DoZoneInCombat(me, 100.00f); + return new spell_hor_evasion_SpellScript(); } +}; + +// 70017 - Gunship Cannon Fire +class spell_hor_gunship_cannon_fire : public SpellScriptLoader +{ + public: + spell_hor_gunship_cannon_fire() : SpellScriptLoader("spell_hor_gunship_cannon_fire") { } - void UpdateAI(uint32 diff) override + class spell_hor_gunship_cannon_fire_AuraScript : public AuraScript { - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) + PrepareAuraScript(spell_hor_gunship_cannon_fire_AuraScript); + + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - if (_doWalk != true) + if (!urand(0, 2)) { - _doWalk = true; - _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER); - if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER))) - { - DoResetThreat(); - me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->MoveChase(leader); - } - } - if (_strikeTimer < diff) - { - if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO)) - DoCast(target, SPELL_ABON_STRIKE); - _strikeTimer = urand(7000, 9000); + if (GetTarget()->GetEntry() == NPC_GUNSHIP_CANNON_HORDE) + GetTarget()->CastSpell((Unit*)NULL, SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE, true); + else + GetTarget()->CastSpell((Unit*)NULL, SPELL_GUNSHIP_CANNON_FIRE_MISSILE_ALLIANCE, true); } - else - _strikeTimer -= diff; + } - if (_vomitTimer < diff) - { - if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO)) - DoCast(target, SPELL_VOMIT_SPRAY); - _vomitTimer = urand(15000, 20000); - } - else - _vomitTimer -= diff; + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hor_gunship_cannon_fire_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } - else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED) - me->DespawnOrUnsummon(); - DoMeleeAttackIfReady(); - } + }; - void JustDied(Unit* /*killer*/) override + AuraScript* GetAuraScript() const override { - _instance->SetData(DATA_SUMMONS, 0); + return new spell_hor_gunship_cannon_fire_AuraScript(); } - - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_lumbering_abominationAI>(creature); - } }; void AddSC_halls_of_reflection() { new at_hor_intro_start(); new at_hor_waves_restarter(); - new at_shadow_throne(); - new npc_jaina_or_sylvanas_hor(); + new at_hor_impenetrable_door(); + new at_hor_shadow_throne(); + new npc_jaina_or_sylvanas_intro_hor(); new npc_jaina_or_sylvanas_escape_hor(); + new npc_the_lich_king_escape_hor(); new npc_ghostly_priest(); new npc_phantom_mage(); new npc_phantom_hallucination(); new npc_shadowy_mercenary(); new npc_spectral_footman(); new npc_tortured_rifleman(); + new npc_frostsworn_general(); + new npc_spiritual_reflection(); new npc_raging_ghoul(); new npc_risen_witch_doctor(); new npc_lumbering_abomination(); - new npc_frostworn_general(); - new npc_spiritual_reflection(); + new spell_hor_start_halls_of_reflection_quest_ae(); + new spell_hor_evasion(); + new spell_hor_gunship_cannon_fire(); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h index c4776c3cfcd..a05035f7b44 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h @@ -15,170 +15,231 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_HALLS_OF_REFLECTION_H -#define DEF_HALLS_OF_REFLECTION_H +#ifndef HALLS_OF_REFLECTION_H_ +#define HALLS_OF_REFLECTION_H_ #define HoRScriptName "instance_halls_of_reflection" -#define MAX_ENCOUNTER 3 + +uint32 const EncounterCount = 3; /* Halls of Reflection encounters: -0- Falric -1- Marwyn -2- The Lich King + 0 - Falric + 1 - Marwyn + 2 - The Lich King */ -enum Data +enum DataTypes { - DATA_FALRIC_EVENT = 0, - DATA_MARWYN_EVENT = 1, - DATA_LICHKING_EVENT = 2, + DATA_FALRIC = 0, + DATA_MARWYN = 1, + DATA_THE_LICH_KING_ESCAPE = 2, + DATA_INTRO_EVENT = 3, - DATA_FROSWORN_EVENT = 4, + DATA_FROSTSWORN_GENERAL = 4, - DATA_WAVE_COUNT = 5, - DATA_TEAM_IN_INSTANCE = 6, - DATA_FROSTMOURNE = 7, - DATA_FROSTWORN_DOOR = 8, - DATA_ESCAPE_EVENT = 9, + DATA_KORELN_LORALEN = 5, + DATA_WAVE_COUNT = 6, + DATA_TEAM_IN_INSTANCE = 7, + DATA_FROSTMOURNE = 8, + DATA_IMPENETRABLE_DOOR = 9, DATA_ESCAPE_LEADER = 10, - DATA_SUMMONS = 11, - DATA_ICEWALL = 12, - DATA_CAVE_IN = 13 + DATA_ICEWALL = 11, + DATA_ICEWALL_TARGET = 12, + DATA_GUNSHIP = 13 }; -enum Creatures +enum CreatureIds { - NPC_JAINA_PART1 = 37221, - NPC_SYLVANAS_PART1 = 37223, - NPC_UTHER = 37225, - NPC_LICH_KING_PART1 = 37226, - NPC_LORALEN = 37779, - NPC_KORELN = 37582, - - NPC_FALRIC = 38112, - NPC_MARWYN = 38113, - NPC_WAVE_MERCENARY = 38177, - NPC_WAVE_FOOTMAN = 38173, - NPC_WAVE_RIFLEMAN = 38176, - NPC_WAVE_PRIEST = 38175, - NPC_WAVE_MAGE = 38172, - - NPC_FROSTWORN_GENERAL = 36723, - NPC_REFLECTION = 37068, // 37107 for tank only? - - NPC_JAINA_PART2 = 36955, - NPC_SYLVANAS_PART2 = 37554, - NPC_LICH_KING_PART2 = 36954, - NPC_BARTLETT = 37182, // High Captain Justin Bartlett - NPC_KORM = 37833, // Sky-Reaver Korm Blackscar - NPC_ICE_WALL = 37014, // Ice Wall Target - - NPC_RAGING_GNOUL = 36940, - NPC_RISEN_WITCH_DOCTOR = 36941, - NPC_ABON = 37069 + NPC_JAINA_INTRO = 37221, + NPC_SYLVANAS_INTRO = 37223, + NPC_UTHER = 37225, + NPC_THE_LICH_KING_INTRO = 37226, + NPC_KORELN = 37582, + NPC_LORALEN = 37779, + NPC_FROSTMOUNRE_ALTAR_BUNNY = 37704, + + NPC_FALRIC = 38112, + NPC_MARWYN = 38113, + NPC_WAVE_MERCENARY = 38177, + NPC_WAVE_FOOTMAN = 38173, + NPC_WAVE_RIFLEMAN = 38176, + NPC_WAVE_PRIEST = 38175, + NPC_WAVE_MAGE = 38172, + + NPC_FROSTSWORN_GENERAL = 36723, + NPC_REFLECTION = 37068, // 37107 for tank only? + + NPC_JAINA_ESCAPE = 36955, + NPC_SYLVANAS_ESCAPE = 37554, + NPC_THE_LICH_KING_ESCAPE = 36954, + NPC_ICE_WALL_TARGET = 37014, + + NPC_RAGING_GHOUL = 36940, + NPC_RISEN_WITCH_DOCTOR = 36941, + NPC_LUMBERING_ABOMINATION = 37069, + + NPC_GUNSHIP_CANNON_HORDE = 37593, + NPC_JUSTIN_BARTLETT = 30344, + NPC_KORM_BLACKSCAR = 30824, + + NPC_WORLD_TRIGGER = 22515 }; -enum GameObjects +enum GameObjectIds { - GO_FROSTMOURNE = 202302, - GO_ENTRANCE_DOOR = 201976, - GO_FROSTWORN_DOOR = 197341, - GO_ARTHAS_DOOR = 197342, - //GO_ESCAPE_DOOR = 197343, // always open ? - - GO_ICE_WALL = 201385, - GO_CAVE = 201596, - - GO_STAIRS_SKYBREAKER = 201709, - GO_SKYBREAKER = 201598, - GO_STAIRS_ORGRIM_HAMMER = 202211, - GO_ORGRIM_HAMMER = 201599, - GO_PORTAL = 202079, - - GO_CAPTAIN_CHEST_HORDE_NORMAL = 202212, //3145 - GO_CAPTAIN_CHEST_ALLIANCE_NORMAL = 201710, //30357 - GO_CAPTAIN_CHEST_HORDE_HEROIC = 202337, //3246 - GO_CAPTAIN_CHEST_ALLIANCE_HEROIC = 202336, //3333 + GO_FROSTMOURNE = 202302, + GO_ENTRANCE_DOOR = 201976, + GO_IMPENETRABLE_DOOR = 197341, + GO_SHADOW_THRONE_DOOR = 197342, + GO_ESCAPE_DOOR = 197343, // always open ? + + GO_ICE_WALL = 201385, + GO_CAVE_IN = 201596, + + GO_THE_SKYBREAKER = 201598, + GO_ORGRIMS_HAMMER = 201599, + GO_THE_SKYBREAKER_STAIRS = 201709, + GO_ORGRIMS_HAMMER_STAIRS = 202211, + GO_PORTAL_TO_DALARAN = 195682, + + GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL = 201710, + GO_THE_CAPTAIN_CHEST_HORDE_NORMAL = 202212, + GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC = 202336, + GO_THE_CAPTAIN_CHEST_HORDE_HEROIC = 202337 }; -enum HorWorldStates +enum Achievements { - WORLD_STATE_HOR_WAVES_ENABLED = 4884, - WORLD_STATE_HOR_WAVE_COUNT = 4882, + ACHIEV_NOT_RETREATING_EVENT = 22615, + SPELL_ACHIEV_CHECK = 72830 }; // Common actions from Instance Script to Boss Script enum Actions { - ACTION_ENTER_COMBAT, - ACTION_START_ESCAPING, - ACTION_WALL_BROKEN + ACTION_ENTER_COMBAT = -668001, + ACTION_START_PREFIGHT = -668002, + ACTION_WALL_BROKEN = -668003, + ACTION_GUNSHIP_ARRIVAL = -668004, + ACTION_GUNSHIP_ARRIVAL_2 = -668005 }; -enum TrashGeneralSpells +enum InstanceEvents { - // General spells - SPELL_WELL_OF_SOULS = 72630, // cast when spawn(become visible) - SPELL_SPIRIT_ACTIVATE = 72130, // cast when unit activates + EVENT_SPAWN_WAVES = 1, + EVENT_NEXT_WAVE = 2, + EVENT_DO_WIPE = 3, + EVENT_ADD_WAVE = 4, + EVENT_SPAWN_ESCAPE_EVENT = 5 }; -enum InstanceEvents +enum InstanceEventIds { - EVENT_SPAWN_WAVES = 1, - EVENT_NEXT_WAVE = 2, - EVENT_DO_WIPE = 3, - EVENT_ADD_WAVE = 4, + EVENT_GUNSHIP_ARRIVAL = 22709, + EVENT_GUNSHIP_ARRIVAL_2 = 22714, + EVENT_ICE_WALL_SUMMONED = 22795 }; -// Base class for FALRIC and MARWYN -// handled the summonList and the notification events to/from the InstanceScript -struct boss_horAI : ScriptedAI +enum InstanceSpells { - boss_horAI(Creature* creature) : ScriptedAI(creature), summons(creature) - { - instance = me->GetInstanceScript(); - } + // Trash + SPELL_WELL_OF_SOULS = 72630, // cast when spawn (become visible) + SPELL_SPIRIT_ACTIVATE = 72130, // cast when unit activates + + // Start Quests + SPELL_START_HALLS_OF_REFLECTION_QUEST_A = 71351, + SPELL_START_HALLS_OF_REFLECTION_QUEST_H = 71542, + SPELL_START_HALLS_OF_REFLECTION_QUEST_AE = 72900, + + // Quest Credits + SPELL_CREDIT_FINDING_SYLVANAS = 71536, + SPELL_CREDIT_FINDING_JAINA = 71538, + SPELL_CREDIT_ESCAPING_ARTHAS = 71352, + + // Gunship + SPELL_GUNSHIP_CANNON_FIRE = 70017, + SPELL_GUNSHIP_CANNON_FIRE_MISSILE_ALLIANCE = 70021, + SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE = 70246 +}; - InstanceScript* instance; - EventMap events; - SummonList summons; +enum InstanceWorldStates +{ + WORLD_STATE_HOR_WAVES_ENABLED = 4884, + WORLD_STATE_HOR_WAVE_COUNT = 4882 +}; + +enum InstanceYells +{ + SAY_CAPTAIN_FIRE = 0, + SAY_CAPTAIN_FINAL = 1 +}; + +// Base class for FALRIC and MARWYN +struct boss_horAI : BossAI +{ + boss_horAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId) { } - void Reset() + void Reset() override { - events.Reset(); + _Reset(); me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->SetReactState(REACT_PASSIVE); if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) - instance->ProcessEvent(0, EVENT_DO_WIPE); + instance->ProcessEvent(NULL, EVENT_DO_WIPE); } - void DoAction(int32 actionID) + void DoAction(int32 actionId) override { - switch (actionID) + switch (actionId) { - case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat. + case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat. me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->SetReactState(REACT_AGGRESSIVE); - - if (Unit* unit = me->SelectNearestTarget()) - AttackStart(unit); - - DoZoneInCombat(); + DoZoneInCombat(me, 150.0f); + break; + default: break; } } - void JustSummoned(Creature* summoned) + void JustSummoned(Creature* summon) override { - summons.Summon(summoned); + summons.Summon(summon); } }; +class GameObjectDeleteDelayEvent : public BasicEvent +{ + public: + GameObjectDeleteDelayEvent(Unit* owner, uint64 gameObjectGUID) : _owner(owner), _gameObjectGUID(gameObjectGUID) { } + + void DeleteGameObject() + { + if (GameObject* go = ObjectAccessor::GetGameObject(*_owner, _gameObjectGUID)) + go->Delete(); + } + + bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override + { + DeleteGameObject(); + return true; + } + + void Abort(uint64 /*execTime*/) override + { + DeleteGameObject(); + } + + private: + Unit* _owner; + uint64 _gameObjectGUID; +}; + template<class AI> AI* GetHallsOfReflectionAI(Creature* creature) { return GetInstanceAI<AI>(creature, HoRScriptName); } -#endif +#endif // HALLS_OF_REFLECTION_H_ diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index ab5168dd34a..6f33e80b92b 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -19,590 +19,792 @@ #include "ScriptedCreature.h" #include "InstanceScript.h" #include "Player.h" +#include "Transport.h" #include "WorldPacket.h" #include "halls_of_reflection.h" -Position const JainaSpawnPos = {5236.659f, 1929.894f, 707.7781f, 0.8726646f}; // Jaina Spawn Position -Position const SylvanasSpawnPos = {5236.667f, 1929.906f, 707.7781f, 0.8377581f}; // Sylvanas Spawn Position -Position const GeneralSpawnPos = {5415.538f, 2117.842f, 707.7781f, 3.944444f}; // Frostsworn General -Position const JainaSpawnPos2 = {5549.011f, 2257.041f, 733.0120f, 1.153993f}; // Jaina Spawn Position 2 -Position const SylvanasSpawnPos2 = {5549.011f, 2257.041f, 733.0120f, 1.153993f}; // Sylvanas Spawn Position 2 +Position const JainaSpawnPos = { 5236.659f, 1929.894f, 707.7781f, 0.8726646f }; // Jaina Spawn Position +Position const SylvanasSpawnPos = { 5236.667f, 1929.906f, 707.7781f, 0.8377581f }; // Sylvanas Spawn Position (sniffed) +Position const JainaSpawnPos2 = { 5549.011f, 2257.041f, 733.0120f, 1.153993f }; // Jaina Spawn Position 2 +Position const SylvanasSpawnPos2 = { 5549.29f, 2257.353f, 733.0943f, 0.8901179f }; // Sylvanas Spawn Position 2 (sniffed) +Position const KorelnOrLoralenSpawnPos = { 5232.68f, 1931.46f, 707.7781f, 0.8377581f }; + +Position const TheLichKingEscapePosition[] = +{ + { 5557.017f, 2266.103f, 733.0943f, 3.892084f }, // 0 - Spawn (Horde) + { 5552.733f, 2262.718f, 733.0110f, 4.009696f } // 1 - Spawn (Alliance) +}; Position const SpawnPos[] = { - {5309.577f, 2042.668f, 707.7781f, 4.694936f}, - {5295.885f, 2040.342f, 707.7781f, 5.078908f}, - {5340.836f, 1992.458f, 707.7781f, 2.757620f}, - {5325.072f, 1977.597f, 707.7781f, 2.076942f}, - {5277.365f, 1993.229f, 707.7781f, 0.401426f}, - {5275.479f, 2001.135f, 707.7781f, 0.174533f}, - {5302.448f, 2042.222f, 707.7781f, 4.904375f}, - {5343.293f, 1999.384f, 707.7781f, 2.914700f}, - {5295.635f, 1973.757f, 707.7781f, 1.186824f}, - {5311.031f, 1972.229f, 707.7781f, 1.640610f}, - {5275.076f, 2008.724f, 707.7781f, 6.213372f}, - {5316.701f, 2041.550f, 707.7781f, 4.502949f}, - {5344.150f, 2007.168f, 707.7781f, 3.159046f}, - {5319.158f, 1973.998f, 707.7781f, 1.919862f}, - {5302.247f, 1972.415f, 707.7781f, 1.378810f}, - {5277.739f, 2016.882f, 707.7781f, 5.969026f}, - {5322.964f, 2040.288f, 707.7781f, 4.345870f}, - {5343.467f, 2015.951f, 707.7781f, 3.490659f}, - {5313.820f, 1978.146f, 707.7781f, 1.745329f}, - {5279.649f, 2004.656f, 707.7781f, 0.069814f}, - {5306.057f, 2037.002f, 707.7781f, 4.817109f}, - {5337.865f, 2003.403f, 707.7781f, 2.984513f}, - {5299.434f, 1979.009f, 707.7781f, 1.239184f}, - {5312.752f, 2037.122f, 707.7781f, 4.590216f}, - {5335.724f, 1996.859f, 707.7781f, 2.740167f}, - {5280.632f, 2012.156f, 707.7781f, 6.056293f}, - {5320.369f, 1980.125f, 707.7781f, 2.007129f}, - {5306.572f, 1977.474f, 707.7781f, 1.500983f}, - {5336.599f, 2017.278f, 707.7781f, 3.473205f}, - {5282.897f, 2019.597f, 707.7781f, 5.881760f}, - {5318.704f, 2036.108f, 707.7781f, 4.223697f}, - {5280.513f, 1997.842f, 707.7781f, 0.296706f}, - {5337.833f, 2010.057f, 707.7781f, 3.228859f}, - {5299.250f, 2035.998f, 707.7781f, 5.026548f}, + { 5309.577f, 2042.668f, 707.7781f, 4.694936f }, + { 5295.885f, 2040.342f, 707.7781f, 5.078908f }, + { 5340.836f, 1992.458f, 707.7781f, 2.757620f }, + { 5325.072f, 1977.597f, 707.7781f, 2.076942f }, + { 5277.365f, 1993.229f, 707.7781f, 0.401426f }, + { 5275.479f, 2001.135f, 707.7781f, 0.174533f }, + { 5302.448f, 2042.222f, 707.7781f, 4.904375f }, + { 5343.293f, 1999.384f, 707.7781f, 2.914700f }, + { 5295.635f, 1973.757f, 707.7781f, 1.186824f }, + { 5311.031f, 1972.229f, 707.7781f, 1.640610f }, + { 5275.076f, 2008.724f, 707.7781f, 6.213372f }, + { 5316.701f, 2041.550f, 707.7781f, 4.502949f }, + { 5344.150f, 2007.168f, 707.7781f, 3.159046f }, + { 5319.158f, 1973.998f, 707.7781f, 1.919862f }, + { 5302.247f, 1972.415f, 707.7781f, 1.378810f }, + { 5277.739f, 2016.882f, 707.7781f, 5.969026f }, + { 5322.964f, 2040.288f, 707.7781f, 4.345870f }, + { 5343.467f, 2015.951f, 707.7781f, 3.490659f }, + { 5313.820f, 1978.146f, 707.7781f, 1.745329f }, + { 5279.649f, 2004.656f, 707.7781f, 0.069814f }, + { 5306.057f, 2037.002f, 707.7781f, 4.817109f }, + { 5337.865f, 2003.403f, 707.7781f, 2.984513f }, + { 5299.434f, 1979.009f, 707.7781f, 1.239184f }, + { 5312.752f, 2037.122f, 707.7781f, 4.590216f }, + { 5335.724f, 1996.859f, 707.7781f, 2.740167f }, + { 5280.632f, 2012.156f, 707.7781f, 6.056293f }, + { 5320.369f, 1980.125f, 707.7781f, 2.007129f }, + { 5306.572f, 1977.474f, 707.7781f, 1.500983f }, + { 5336.599f, 2017.278f, 707.7781f, 3.473205f }, + { 5282.897f, 2019.597f, 707.7781f, 5.881760f }, + { 5318.704f, 2036.108f, 707.7781f, 4.223697f }, + { 5280.513f, 1997.842f, 707.7781f, 0.296706f }, + { 5337.833f, 2010.057f, 707.7781f, 3.228859f }, + { 5299.250f, 2035.998f, 707.7781f, 5.026548f } }; class instance_halls_of_reflection : public InstanceMapScript { -public: - instance_halls_of_reflection() : InstanceMapScript("instance_halls_of_reflection", 668) { } - - struct instance_halls_of_reflection_InstanceMapScript : public InstanceScript - { - instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map) { } + public: + instance_halls_of_reflection() : InstanceMapScript(HoRScriptName, 668) { } - void Initialize() override + struct instance_halls_of_reflection_InstanceMapScript : public InstanceScript { - SetBossNumber(MAX_ENCOUNTER); - events.Reset(); - - _falricGUID = 0; - _marwynGUID = 0; - _jainaOrSylvanasPart1GUID = 0; - _jainaOrSylvanasPart2GUID = 0; - _lichkingPart1GUID = 0; - _frostwornGeneralGUID = 0; - - _frostmourneGUID = 0; - _entranceDoorGUID = 0; - _frostwornDoorGUID = 0; - _arthasDoorGUID = 0; - _escapeDoorGUID = 0; - _caveGUID = 0; - - _teamInInstance = 0; - _waveCount = 0; - _introEvent = NOT_STARTED; - _frostwornGeneral = NOT_STARTED; - _escapeevent = NOT_STARTED; - _mobsaticewall = 0; - } + instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + + JainaOrSylvanasIntroGUID = 0; + KorelnOrLoralenGUID = 0; + TheLichkingIntroGUID = 0; + FalricGUID = 0; + MarwynGUID = 0; + FrostmourneAltarBunnyGUID = 0; + FrostswornGeneralGUID = 0; + JainaOrSylvanasEscapeGUID = 0; + TheLichKingEscapeGUID = 0; + + FrostmourneGUID = 0; + EntranceDoorGUID = 0; + ImpenetrableDoorGUID = 0; + ShadowThroneDoorGUID = 0; + CaveInGUID = 0; + GunshipGUID = 0; + CaptainsChestGUID = 0; + CaptainGUID = 0; + IcewallGUID = 0; + IcewallTargetGUID = 0; + + _teamInInstance = 0; + _waveCount = 0; + _introState = NOT_STARTED; + _frostswornGeneralState = NOT_STARTED; + + events.Reset(); + } - void OnPlayerEnter(Player* player) override - { - if (!_teamInInstance) - _teamInInstance = player->GetTeam(); - } + void OnPlayerEnter(Player* player) override + { + if (!_teamInInstance) + _teamInInstance = player->GetTeam(); - void OnCreatureCreate(Creature* creature) override - { - if (!_teamInInstance) + if (GetBossState(DATA_MARWYN) == DONE) + { + SpawnGunship(); + + if (!JainaOrSylvanasEscapeGUID && GetBossState(DATA_THE_LICH_KING_ESCAPE) != DONE) + SpawnEscapeEvent(); + } + } + + void OnCreatureCreate(Creature* creature) override { - Map::PlayerList const& players = instance->GetPlayers(); - if (!players.isEmpty()) - if (Player* player = players.begin()->GetSource()) - _teamInInstance = player->GetTeam(); + switch (creature->GetEntry()) + { + case NPC_JAINA_INTRO: + case NPC_SYLVANAS_INTRO: + JainaOrSylvanasIntroGUID = creature->GetGUID(); + break; + case NPC_KORELN: + case NPC_LORALEN: + if (GetBossState(DATA_MARWYN) != DONE) + creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + KorelnOrLoralenGUID = creature->GetGUID(); + break; + case NPC_THE_LICH_KING_INTRO: + TheLichkingIntroGUID = creature->GetGUID(); + break; + case NPC_FALRIC: + FalricGUID = creature->GetGUID(); + break; + case NPC_MARWYN: + MarwynGUID = creature->GetGUID(); + break; + case NPC_FROSTMOUNRE_ALTAR_BUNNY: + FrostmourneAltarBunnyGUID = creature->GetGUID(); + break; + case NPC_FROSTSWORN_GENERAL: + FrostswornGeneralGUID = creature->GetGUID(); + if (GetBossState(DATA_MARWYN) == DONE) + creature->SetPhaseMask(1, true); + break; + case NPC_JAINA_ESCAPE: + case NPC_SYLVANAS_ESCAPE: + JainaOrSylvanasEscapeGUID = creature->GetGUID(); + break; + case NPC_THE_LICH_KING_ESCAPE: + TheLichKingEscapeGUID = creature->GetGUID(); + break; + case NPC_JUSTIN_BARTLETT: + case NPC_KORM_BLACKSCAR: + CaptainGUID = creature->GetGUID(); + break; + case NPC_WORLD_TRIGGER: + if (!creature->GetTransport()) + break; + // no break + case NPC_GUNSHIP_CANNON_HORDE: + GunshipCannonGUIDs.insert(creature->GetGUID()); + break; + case NPC_ICE_WALL_TARGET: + IcewallTargetGUID = creature->GetGUID(); + break; + default: + break; + } } - switch (creature->GetEntry()) + void OnCreatureRemove(Creature* creature) override { - case NPC_JAINA_PART1: - case NPC_SYLVANAS_PART1: - _jainaOrSylvanasPart1GUID = creature->GetGUID(); - break; - case NPC_FALRIC: - _falricGUID = creature->GetGUID(); - break; - case NPC_MARWYN: - _marwynGUID = creature->GetGUID(); - break; - case NPC_FROSTWORN_GENERAL: - _frostwornGeneralGUID = creature->GetGUID(); - if (GetBossState(DATA_MARWYN_EVENT) == DONE) - if (Creature* general = instance->GetCreature(_frostwornGeneralGUID)) - general->SetPhaseMask(1, true); - break; - case NPC_JAINA_PART2: - case NPC_SYLVANAS_PART2: - _jainaOrSylvanasPart2GUID = creature->GetGUID(); - break; + switch (creature->GetEntry()) + { + case NPC_WAVE_MERCENARY: + case NPC_WAVE_FOOTMAN: + case NPC_WAVE_RIFLEMAN: + case NPC_WAVE_PRIEST: + case NPC_WAVE_MAGE: + { + uint32 internalWaveId = creature->AI()->GetData(0); + waveGuidList[internalWaveId].erase(creature->GetGUID()); + break; + } + case NPC_ICE_WALL_TARGET: + IcewallTargetGUID = 0; + break; + case NPC_WORLD_TRIGGER: + case NPC_GUNSHIP_CANNON_HORDE: + GunshipCannonGUIDs.erase(creature->GetGUID()); + break; + default: + break; + } } - } - void OnCreatureRemove(Creature* creature) override - { - switch (creature->GetEntry()) + uint32 GetGameObjectEntry(uint32 /*guidLow*/, uint32 entry) override { - case NPC_WAVE_MERCENARY: - case NPC_WAVE_FOOTMAN: - case NPC_WAVE_RIFLEMAN: - case NPC_WAVE_PRIEST: - case NPC_WAVE_MAGE: + if (!_teamInInstance) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + _teamInInstance = player->GetTeam(); + } + + switch (entry) { - uint32 internalWaveId = creature->AI()->GetData(0); - waveGuidList[internalWaveId].erase(creature->GetGUID()); - break; + case GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL: + case GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC: + case GO_THE_SKYBREAKER_STAIRS: + if (_teamInInstance == HORDE) + return 0; + break; + case GO_THE_CAPTAIN_CHEST_HORDE_NORMAL: + case GO_THE_CAPTAIN_CHEST_HORDE_HEROIC: + case GO_ORGRIMS_HAMMER_STAIRS: + if (_teamInInstance == ALLIANCE) + return 0; + break; + default: + break; } + + return entry; } - } - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) + void OnGameObjectCreate(GameObject* go) override { - case GO_FROSTMOURNE: - _frostmourneGUID = go->GetGUID(); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - HandleGameObject(0, false, go); - if (GetData(DATA_INTRO_EVENT) == DONE) - go->SetPhaseMask(2, true); - break; - case GO_ENTRANCE_DOOR: - _entranceDoorGUID = go->GetGUID(); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - HandleGameObject(0, true, go); - break; - case GO_FROSTWORN_DOOR: - _frostwornDoorGUID = go->GetGUID(); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - if (GetBossState(DATA_MARWYN_EVENT) == DONE) - HandleGameObject(0, true, go); - else - HandleGameObject(0, false, go); - break; - case GO_ARTHAS_DOOR: - _arthasDoorGUID = go->GetGUID(); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - if (GetData(DATA_FROSWORN_EVENT) == DONE) - HandleGameObject(0, true, go); - else + switch (go->GetEntry()) + { + case GO_FROSTMOURNE: + FrostmourneGUID = go->GetGUID(); + if (GetData(DATA_INTRO_EVENT) == DONE) + go->SetPhaseMask(2, true); + break; + case GO_ENTRANCE_DOOR: + EntranceDoorGUID = go->GetGUID(); + break; + case GO_IMPENETRABLE_DOOR: + ImpenetrableDoorGUID = go->GetGUID(); + HandleGameObject(0, GetBossState(DATA_MARWYN) == DONE, go); + break; + case GO_SHADOW_THRONE_DOOR: + ShadowThroneDoorGUID = go->GetGUID(); + HandleGameObject(0, GetData(DATA_FROSTSWORN_GENERAL) == DONE, go); + break; + case GO_CAVE_IN: + CaveInGUID = go->GetGUID(); + break; + case GO_THE_SKYBREAKER: + case GO_ORGRIMS_HAMMER: + GunshipGUID = go->GetGUID(); + break; + case GO_THE_SKYBREAKER_STAIRS: + case GO_ORGRIMS_HAMMER_STAIRS: + if (GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) + go->SetRespawnTime(DAY); + GunshipStairGUIDs.insert(go->GetGUID()); + break; + case GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL: + case GO_THE_CAPTAIN_CHEST_HORDE_NORMAL: + case GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC: + case GO_THE_CAPTAIN_CHEST_HORDE_HEROIC: + CaptainsChestGUID = go->GetGUID(); + break; + case GO_ICE_WALL: HandleGameObject(0, false, go); - break; - case GO_CAVE: - _caveGUID = go->GetGUID(); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - break; + IcewallGUID = go->GetGUID(); + break; + default: + break; + } } - } - void FillInitialWorldStates(WorldPacket& data) override - { - data << uint32(WORLD_STATE_HOR_WAVES_ENABLED) << uint32(0); - data << uint32(WORLD_STATE_HOR_WAVE_COUNT) << uint32(0); - } - - bool SetBossState(uint32 type, EncounterState state) override - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - switch (type) + void OnGameObjectRemove(GameObject* go) override { - case DATA_FALRIC_EVENT: - if (state == DONE) - { - ++_waveCount; - events.ScheduleEvent(EVENT_NEXT_WAVE, 60000); - } - break; - case DATA_MARWYN_EVENT: - if (state == DONE) - { - HandleGameObject(_entranceDoorGUID, true); - HandleGameObject(_frostwornDoorGUID, true); - DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 0); - if (Creature* general = instance->GetCreature(_frostwornGeneralGUID)) - general->SetPhaseMask(1, true); - } - break; - case DATA_LICHKING_EVENT: - default: - break; + switch (go->GetEntry()) + { + case GO_THE_SKYBREAKER_STAIRS: + case GO_ORGRIMS_HAMMER_STAIRS: + GunshipStairGUIDs.erase(go->GetGUID()); + break; + default: + break; + } } - return true; - } + void FillInitialWorldStates(WorldPacket& data) override + { + data << uint32(WORLD_STATE_HOR_WAVES_ENABLED) << uint32(_introState == DONE && GetBossState(DATA_MARWYN) != DONE); + data << uint32(WORLD_STATE_HOR_WAVE_COUNT) << uint32(_waveCount); + } - void SetData(uint32 type, uint32 data) override - { - switch (type) + bool SetBossState(uint32 type, EncounterState state) override { - case DATA_INTRO_EVENT: - if (data == IN_PROGRESS) - { - if (!_introEvent) + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_FALRIC: + if (state == DONE) { - if (_teamInInstance == ALLIANCE) - instance->SummonCreature(NPC_JAINA_PART1, JainaSpawnPos); - else - instance->SummonCreature(NPC_SYLVANAS_PART1, SylvanasSpawnPos); + ++_waveCount; + events.ScheduleEvent(EVENT_NEXT_WAVE, 60000); } - } - _introEvent = data; - break; - case DATA_WAVE_COUNT: - if (_waveCount && data == NOT_STARTED) - ProcessEvent(NULL, EVENT_DO_WIPE); - break; - case DATA_FROSWORN_EVENT: - if (data == DONE) - { - HandleGameObject(_arthasDoorGUID, true); - if (_teamInInstance == ALLIANCE) - instance->SummonCreature(NPC_JAINA_PART2, JainaSpawnPos2); - else - instance->SummonCreature(NPC_SYLVANAS_PART2, SylvanasSpawnPos2); - } - _frostwornGeneral = data; - break; - case DATA_ESCAPE_EVENT: - if (data == IN_PROGRESS) - { - if (!_escapeevent) - if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID)) - jaina_or_sylvanas->AI()->DoAction(ACTION_START_ESCAPING); - } - else if (data == NOT_STARTED) - { - if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID)) - jaina_or_sylvanas->DespawnOrUnsummon(1); - if (_teamInInstance == ALLIANCE) - instance->SummonCreature(NPC_JAINA_PART2, JainaSpawnPos2); - else - instance->SummonCreature(NPC_SYLVANAS_PART2, SylvanasSpawnPos2); - SetData(DATA_ESCAPE_EVENT,IN_PROGRESS); - } - _escapeevent = data; - break; - case DATA_SUMMONS: - if (data == 0) - { - _mobsaticewall--; - if (_mobsaticewall == 0) + break; + case DATA_MARWYN: + if (state == DONE) { - if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID)) - jaina_or_sylvanas->AI()->DoAction(ACTION_WALL_BROKEN); + if (Creature* bunny = instance->GetCreature(FrostmourneAltarBunnyGUID)) + bunny->CastSpell(bunny, SPELL_START_HALLS_OF_REFLECTION_QUEST_AE, true); + + if (Creature* korelnOrLoralen = instance->GetCreature(KorelnOrLoralenGUID)) + korelnOrLoralen->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); + + HandleGameObject(EntranceDoorGUID, true); + HandleGameObject(ImpenetrableDoorGUID, true); + DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 0); + if (Creature* general = instance->GetCreature(FrostswornGeneralGUID)) + general->SetPhaseMask(1, true); + + SpawnGunship(); + SpawnEscapeEvent(); } - } - else if (data == 1) - _mobsaticewall++; - break; + break; + case DATA_THE_LICH_KING_ESCAPE: + switch (state) + { + case NOT_STARTED: + break; + case IN_PROGRESS: + if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID)) + jainaOrSylvanas->AI()->DoAction(ACTION_START_PREFIGHT); + break; + case DONE: + if (GameObject* chest = instance->GetGameObject(CaptainsChestGUID)) + chest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); + + DoUseDoorOrButton(CaveInGUID, 15); + + if (Creature* lichking = instance->GetCreature(TheLichKingEscapeGUID)) + { + lichking->CastSpell((Unit*)NULL, SPELL_ACHIEV_CHECK, true); + lichking->DespawnOrUnsummon(1); + } + break; + case FAIL: + DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT); + + if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID)) + jainaOrSylvanas->DespawnOrUnsummon(10000); + + if (Creature* icewallTarget = instance->GetCreature(IcewallTargetGUID)) + icewallTarget->DespawnOrUnsummon(); + + if (GameObject* icewall = instance->GetGameObject(IcewallGUID)) + icewall->Delete(); + + events.ScheduleEvent(EVENT_SPAWN_ESCAPE_EVENT, 30000); + break; + default: + break; + } + break; + default: + break; + } + + return true; } - SaveToDB(); - } + void SpawnGunship() + { + // don't spawn gunship twice + if (GunshipGUID) + return; + if (!_teamInInstance) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + _teamInInstance = player->GetTeam(); + } - // wave scheduling,checked when wave npcs die - void OnUnitDeath(Unit* unit) override - { - Creature* creature = unit->ToCreature(); - if (!creature) - return; + if (Transport* gunship = sTransportMgr->CreateTransport(_teamInInstance == HORDE ? GO_ORGRIMS_HAMMER : GO_THE_SKYBREAKER, 0, instance)) + gunship->EnableMovement(GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE); + } - switch (creature->GetEntry()) + void SpawnEscapeEvent() { - case NPC_WAVE_MERCENARY: - case NPC_WAVE_FOOTMAN: - case NPC_WAVE_RIFLEMAN: - case NPC_WAVE_PRIEST: - case NPC_WAVE_MAGE: + if (!_teamInInstance) { - uint32 deadNpcs = 0; - uint32 waveId = creature->AI()->GetData(0); - for (std::set<uint64>::const_iterator itr = waveGuidList[waveId].begin(); itr != waveGuidList[waveId].end(); ++itr) - { - Creature* npc = instance->GetCreature(*itr); - if (!npc || !npc->IsAlive()) - ++deadNpcs; - } - // because the current npc returns IsAlive when OnUnitDeath happens - // we check if the number of dead npcs is equal to the list-1 - if (deadNpcs == waveGuidList[waveId].size() - 1) + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + if (Player* player = players.begin()->GetSource()) + _teamInInstance = player->GetTeam(); + } + + if (_teamInInstance == ALLIANCE) + { + instance->SummonCreature(NPC_JAINA_ESCAPE, JainaSpawnPos2); + instance->SummonCreature(NPC_THE_LICH_KING_ESCAPE, TheLichKingEscapePosition[1]); + } + else + { + instance->SummonCreature(NPC_SYLVANAS_ESCAPE, SylvanasSpawnPos2); + instance->SummonCreature(NPC_THE_LICH_KING_ESCAPE, TheLichKingEscapePosition[0]); + } + } + + void SetData(uint32 type, uint32 data) override + { + switch (type) + { + case DATA_INTRO_EVENT: + if (data == IN_PROGRESS) + { + if (_introState == NOT_STARTED) + { + if (_teamInInstance == ALLIANCE) + { + instance->SummonCreature(NPC_JAINA_INTRO, JainaSpawnPos); + instance->SummonCreature(NPC_KORELN, KorelnOrLoralenSpawnPos); + } + else + { + instance->SummonCreature(NPC_SYLVANAS_INTRO, SylvanasSpawnPos); + instance->SummonCreature(NPC_LORALEN, KorelnOrLoralenSpawnPos); + } + } + } + _introState = data; + break; + case DATA_WAVE_COUNT: + if (_waveCount && data == NOT_STARTED) + ProcessEvent(NULL, EVENT_DO_WIPE); + break; + case DATA_FROSTSWORN_GENERAL: + if (data == DONE) + HandleGameObject(ShadowThroneDoorGUID, true); + _frostswornGeneralState = data; + break; + default: + break; + } + + SaveToDB(); + } + + // wave scheduling, checked when wave npcs die + void OnUnitDeath(Unit* unit) override + { + Creature* creature = unit->ToCreature(); + if (!creature) + return; + + switch (creature->GetEntry()) + { + case NPC_WAVE_MERCENARY: + case NPC_WAVE_FOOTMAN: + case NPC_WAVE_RIFLEMAN: + case NPC_WAVE_PRIEST: + case NPC_WAVE_MAGE: { + uint32 waveId = creature->AI()->GetData(0); + for (uint64 guid : waveGuidList[waveId]) + { + if (Creature* npc = instance->GetCreature(guid)) + if (npc->IsAlive()) + return; + } + ++_waveCount; events.ScheduleEvent(EVENT_NEXT_WAVE, 3000); + break; } - break; } } - } - void Update(uint32 diff) override - { - if (!instance->HavePlayers()) - return; + void Update(uint32 diff) override + { + if (!instance->HavePlayers()) + return; - events.Update(diff); + events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_NEXT_WAVE: - ProcessEvent(NULL, EVENT_ADD_WAVE); - break; + switch (events.ExecuteEvent()) + { + case EVENT_NEXT_WAVE: + ProcessEvent(NULL, EVENT_ADD_WAVE); + break; + case EVENT_SPAWN_ESCAPE_EVENT: + SpawnEscapeEvent(); + break; + } } - } - void ProcessEvent(WorldObject* /*go*/, uint32 eventId) override - { - switch (eventId) + void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override { - // spawning all wave npcs at once - case EVENT_SPAWN_WAVES: - _waveCount = 1; - DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); - DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); - { - std::list<uint32> possibilityList, tempList; - uint32 posIndex = 0; + switch (eventId) + { + // spawning all wave npcs at once + case EVENT_SPAWN_WAVES: + _waveCount = 1; + DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); + DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); + { + std::list<uint32> possibilityList, tempList; + uint32 posIndex = 0; - possibilityList.push_back(NPC_WAVE_MERCENARY); - possibilityList.push_back(NPC_WAVE_FOOTMAN); - possibilityList.push_back(NPC_WAVE_RIFLEMAN); - possibilityList.push_back(NPC_WAVE_PRIEST); - possibilityList.push_back(NPC_WAVE_MAGE); + possibilityList.push_back(NPC_WAVE_MERCENARY); + possibilityList.push_back(NPC_WAVE_FOOTMAN); + possibilityList.push_back(NPC_WAVE_RIFLEMAN); + possibilityList.push_back(NPC_WAVE_PRIEST); + possibilityList.push_back(NPC_WAVE_MAGE); - // iterate each wave - for (uint8 i = 0; i < 8; ++i) - { - tempList = possibilityList; + // iterate each wave + for (uint8 i = 0; i < 8; ++i) + { + tempList = possibilityList; - uint64 bossGuid = i <= 3 ? _falricGUID : _marwynGUID; + uint64 bossGuid = i <= 3 ? FalricGUID : MarwynGUID; - if (!i) - Trinity::Containers::RandomResizeList(tempList, 3); - else if (i < 6 && i != 3) - Trinity::Containers::RandomResizeList(tempList, 4); + if (!i) + Trinity::Containers::RandomResizeList(tempList, 3); + else if (i < 6 && i != 3) + Trinity::Containers::RandomResizeList(tempList, 4); - for (std::list<uint32>::const_iterator itr = tempList.begin(); itr != tempList.end(); ++itr) - { - if (Creature* boss = instance->GetCreature(bossGuid)) + for (uint32 entry : tempList) { - if (Creature* temp = boss->SummonCreature(*itr, SpawnPos[posIndex], TEMPSUMMON_DEAD_DESPAWN)) + if (Creature* boss = instance->GetCreature(bossGuid)) { - temp->AI()->SetData(0, i); - waveGuidList[i].insert(temp->GetGUID()); + if (Creature* temp = boss->SummonCreature(entry, SpawnPos[posIndex], TEMPSUMMON_DEAD_DESPAWN)) + { + temp->AI()->SetData(0, i); + waveGuidList[i].insert(temp->GetGUID()); + } } - } - ++posIndex; + ++posIndex; + } } } - } - events.ScheduleEvent(EVENT_NEXT_WAVE, 5000); - break; - case EVENT_ADD_WAVE: - DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); - DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); - HandleGameObject(_entranceDoorGUID, false); - - if (_waveCount % 5) - { - uint32 internalWaveId = _waveCount - ((_waveCount < 5) ? 1 : 2); - for (std::set<uint64>::const_iterator itr = waveGuidList[internalWaveId].begin(); itr != waveGuidList[internalWaveId].end(); ++itr) + events.ScheduleEvent(EVENT_NEXT_WAVE, 5000); + break; + case EVENT_ADD_WAVE: + DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); + DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); + HandleGameObject(EntranceDoorGUID, false); + + if (_waveCount % 5) { - if (Creature* temp = instance->GetCreature(*itr)) + uint32 internalWaveId = _waveCount - ((_waveCount < 5) ? 1 : 2); + for (uint64 guid : waveGuidList[internalWaveId]) { - temp->CastSpell(temp, SPELL_SPIRIT_ACTIVATE, true); - temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE); - temp->AI()->DoZoneInCombat(temp, 100.00f); + if (Creature* temp = instance->GetCreature(guid)) + { + temp->CastSpell(temp, SPELL_SPIRIT_ACTIVATE, false); + temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE); + temp->AI()->DoZoneInCombat(temp, 100.00f); + } } } - } - else - { - uint32 bossIndex = (_waveCount / 5) - 1; - if (GetBossState(DATA_FALRIC_EVENT + bossIndex) != DONE) + else + { + uint32 bossIndex = (_waveCount / 5) - 1; + if (GetBossState(DATA_FALRIC + bossIndex) != DONE) + { + if (Creature* boss = instance->GetCreature(bossIndex ? MarwynGUID : FalricGUID)) + boss->AI()->DoAction(ACTION_ENTER_COMBAT); + } + else if (_waveCount != 10) + { + ++_waveCount; + events.ScheduleEvent(EVENT_NEXT_WAVE, 5000); + } + } + break; + case EVENT_DO_WIPE: + _waveCount = 0; + events.Reset(); + DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); + DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); + HandleGameObject(EntranceDoorGUID, true); + + if (Creature* falric = instance->GetCreature(FalricGUID)) + falric->SetVisible(false); + if (Creature* marwyn = instance->GetCreature(MarwynGUID)) + marwyn->SetVisible(false); + // despawn wave npcs + for (uint8 i = 0; i < 8; ++i) { - if (Creature* boss = instance->GetCreature(bossIndex ? _marwynGUID : _falricGUID)) - boss->AI()->DoAction(ACTION_ENTER_COMBAT); + for (uint64 guid : waveGuidList[i]) + if (Creature* creature = instance->GetCreature(guid)) + creature->DespawnOrUnsummon(1); + waveGuidList[i].clear(); } - else if (_waveCount != 10) + break; + // Gunship Outro + case EVENT_GUNSHIP_ARRIVAL: + if (GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE) + break; + + if (Transport* gunship = instance->GetTransport(GunshipGUID)) + gunship->EnableMovement(false); + + if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID)) + jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL); + + if (Creature* captain = instance->GetCreature(CaptainGUID)) + captain->AI()->Talk(SAY_CAPTAIN_FIRE); + + for (uint64 guid : GunshipCannonGUIDs) { - ++_waveCount; - events.ScheduleEvent(EVENT_NEXT_WAVE, 5000); + uint32 entry = GUID_ENPART(guid); + if ((entry == NPC_WORLD_TRIGGER && _teamInInstance == ALLIANCE) || (entry == NPC_GUNSHIP_CANNON_HORDE && _teamInInstance == HORDE)) + if (Creature* cannon = instance->GetCreature(guid)) + cannon->CastSpell(cannon, SPELL_GUNSHIP_CANNON_FIRE, true); } - } - break; - case EVENT_DO_WIPE: - _waveCount = 0; - events.Reset(); - DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1); - DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount); - HandleGameObject(_entranceDoorGUID, true); - - if (Creature* falric = instance->GetCreature(_falricGUID)) - falric->SetVisible(false); - if (Creature* marwyn = instance->GetCreature(_marwynGUID)) - marwyn->SetVisible(false); - //despawn wave npcs - for (uint8 i = 0; i < 8; ++i) - { - for (std::set<uint64>::const_iterator itr = waveGuidList[i].begin(); itr != waveGuidList[i].end(); ++itr) - if (Creature* creature = instance->GetCreature(*itr)) - creature->DespawnOrUnsummon(1); - waveGuidList[i].clear(); - } - break; + break; + case EVENT_GUNSHIP_ARRIVAL_2: + if (Transport* gunship = instance->GetTransport(GunshipGUID)) + gunship->EnableMovement(false); + + for (uint64 guid : GunshipStairGUIDs) + if (GameObject* stairs = instance->GetGameObject(guid)) + stairs->SetRespawnTime(DAY); + + if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID)) + jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL_2); + + if (Creature* captain = instance->GetCreature(CaptainGUID)) + captain->AI()->Talk(SAY_CAPTAIN_FINAL); + + break; + default: + break; + } } - } - uint32 GetData(uint32 type) const override - { - switch (type) + uint32 GetData(uint32 type) const override { - case DATA_WAVE_COUNT: - return _waveCount; - case DATA_TEAM_IN_INSTANCE: - return _teamInInstance; - case DATA_INTRO_EVENT: - return _introEvent; - case DATA_FROSWORN_EVENT: - return _frostwornGeneral; - case DATA_ESCAPE_EVENT: - return _escapeevent; - case DATA_SUMMONS: - return _mobsaticewall; - default: - break; - } + switch (type) + { + case DATA_WAVE_COUNT: + return _waveCount; + case DATA_TEAM_IN_INSTANCE: + return _teamInInstance; + case DATA_INTRO_EVENT: + return _introState; + case DATA_FROSTSWORN_GENERAL: + return _frostswornGeneralState; + default: + break; + } - return 0; - } + return 0; + } - uint64 GetData64(uint32 type) const override - { - switch (type) + uint64 GetData64(uint32 type) const override { - case DATA_FALRIC_EVENT: - return _falricGUID; - case DATA_MARWYN_EVENT: - return _marwynGUID; - case DATA_FROSWORN_EVENT: - return _frostwornGeneralGUID; - case DATA_FROSTWORN_DOOR: - return _frostwornDoorGUID; - case DATA_FROSTMOURNE: - return _frostmourneGUID; - case DATA_ESCAPE_LEADER: - return _jainaOrSylvanasPart2GUID; - case DATA_CAVE_IN: - return _caveGUID; - default: - break; - } + switch (type) + { + case DATA_FALRIC: + return FalricGUID; + case DATA_MARWYN: + return MarwynGUID; + case DATA_FROSTSWORN_GENERAL: + return FrostswornGeneralGUID; + case DATA_IMPENETRABLE_DOOR: + return ImpenetrableDoorGUID; + case DATA_FROSTMOURNE: + return FrostmourneGUID; + case DATA_ESCAPE_LEADER: + return JainaOrSylvanasEscapeGUID; + case DATA_KORELN_LORALEN: + return KorelnOrLoralenGUID; + case DATA_THE_LICH_KING_ESCAPE: + return TheLichKingEscapeGUID; + case DATA_GUNSHIP: + return GunshipGUID; + case DATA_ICEWALL: + return IcewallGUID; + case DATA_ICEWALL_TARGET: + return IcewallTargetGUID; + default: + break; + } - return 0; - } + return 0; + } - std::string GetSaveData() override - { - OUT_SAVE_INST_DATA; + std::string GetSaveData() override + { + OUT_SAVE_INST_DATA; - std::ostringstream saveStream; - saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral << ' ' << _escapeevent; + std::ostringstream saveStream; + saveStream << "H R " << GetBossSaveData() << _introState << ' ' << _frostswornGeneralState; - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } - void Load(char const* in) override - { - if (!in) + void Load(char const* in) override { - OUT_LOAD_INST_DATA_FAIL; - return; - } + if (!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - OUT_LOAD_INST_DATA(in); + OUT_LOAD_INST_DATA(in); - char dataHead1, dataHead2; + char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'H' && dataHead2 == 'R') - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + if (dataHead1 == 'H' && dataHead2 == 'R') { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; + for (uint8 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; - SetBossState(i, EncounterState(tmpState)); - } + SetBossState(i, EncounterState(tmpState)); + } - uint32 temp = 0; - loadStream >> temp; - if (temp == DONE) - SetData(DATA_INTRO_EVENT, DONE); - else - SetData(DATA_INTRO_EVENT, NOT_STARTED); + uint32 temp = 0; + loadStream >> temp; + if (temp == DONE) + SetData(DATA_INTRO_EVENT, DONE); + else + SetData(DATA_INTRO_EVENT, NOT_STARTED); - loadStream >> temp; - if (temp == DONE) - SetData(DATA_FROSWORN_EVENT, DONE); + loadStream >> temp; + if (temp == DONE) + SetData(DATA_FROSTSWORN_GENERAL, DONE); + else + SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED); + } else - SetData(DATA_FROSWORN_EVENT, NOT_STARTED); + OUT_LOAD_INST_DATA_FAIL; - loadStream >> temp; - if (temp == DONE) - SetData(DATA_ESCAPE_EVENT, DONE); - else - SetData(DATA_ESCAPE_EVENT, NOT_STARTED); + OUT_LOAD_INST_DATA_COMPLETE; } - else - OUT_LOAD_INST_DATA_FAIL; - OUT_LOAD_INST_DATA_COMPLETE; + private: + uint64 JainaOrSylvanasIntroGUID; // unused + uint64 KorelnOrLoralenGUID; + uint64 TheLichkingIntroGUID; // unused + uint64 FalricGUID; + uint64 MarwynGUID; + uint64 FrostmourneAltarBunnyGUID; + uint64 FrostswornGeneralGUID; + uint64 JainaOrSylvanasEscapeGUID; + uint64 TheLichKingEscapeGUID; + + uint64 FrostmourneGUID; + uint64 EntranceDoorGUID; + uint64 ImpenetrableDoorGUID; + uint64 ShadowThroneDoorGUID; + uint64 CaveInGUID; + + uint32 _teamInInstance; + uint32 _waveCount; + uint32 _introState; + uint32 _frostswornGeneralState; + + EventMap events; + std::set<uint64> waveGuidList[8]; + + uint64 GunshipGUID; + uint64 CaptainsChestGUID; + uint64 CaptainGUID; + uint64 IcewallGUID; + uint64 IcewallTargetGUID; + + std::set<uint64> GunshipCannonGUIDs; + std::set<uint64> GunshipStairGUIDs; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_halls_of_reflection_InstanceMapScript(map); } - - private: - uint64 _falricGUID; - uint64 _marwynGUID; - uint64 _jainaOrSylvanasPart1GUID; - uint64 _jainaOrSylvanasPart2GUID; - uint64 _lichkingPart1GUID; - uint64 _frostwornGeneralGUID; - - uint64 _frostmourneGUID; - uint64 _entranceDoorGUID; - uint64 _frostwornDoorGUID; - uint64 _arthasDoorGUID; - uint64 _escapeDoorGUID; - uint64 _caveGUID; - - uint32 _teamInInstance; - uint32 _waveCount; - uint32 _introEvent; - uint32 _frostwornGeneral; - uint32 _escapeevent; - uint32 _mobsaticewall; - - EventMap events; - - std::set<uint64> waveGuidList[8]; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_halls_of_reflection_InstanceMapScript(map); - } }; void AddSC_instance_halls_of_reflection() diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 9cbd296d69e..783f9e245c8 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -113,7 +113,7 @@ class boss_garfrost : public CreatureScript Talk(SAY_DEATH); me->RemoveAllGameObjects(); - if (Creature* tyrannus = me->GetCreature(*me, instance->GetData64(DATA_TYRANNUS))) + if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TYRANNUS))) tyrannus->AI()->Talk(SAY_TYRANNUS_DEATH); } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 26ab1f61ae8..1c126bc54fd 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -362,7 +362,7 @@ class boss_krick : public CreatureScript { case EVENT_OUTRO_1: { - if (Creature* temp = me->GetCreature(*me, _instanceScript->GetData64(DATA_JAINA_SYLVANAS_1))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, _instanceScript->GetData64(DATA_JAINA_SYLVANAS_1))) temp->DespawnOrUnsummon(); Creature* jainaOrSylvanas = NULL; @@ -410,7 +410,7 @@ class boss_krick : public CreatureScript _events.ScheduleEvent(EVENT_OUTRO_6, 1000); break; case EVENT_OUTRO_6: - if (Creature* tyrannus = me->GetCreature(*me, _instanceScript->GetData64(DATA_TYRANNUS_EVENT))) + if (Creature* tyrannus = ObjectAccessor::GetCreature(*me, _instanceScript->GetData64(DATA_TYRANNUS_EVENT))) { tyrannus->SetSpeed(MOVE_FLIGHT, 3.5f, true); tyrannus->GetMotionMaster()->MovePoint(1, outroPos[4]); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index a501bf4ea55..c4f46136bd9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -25,12 +25,12 @@ enum Yells { - //Gorkun + // Gorkun SAY_GORKUN_INTRO_2 = 0, SAY_GORKUN_OUTRO_1 = 1, SAY_GORKUN_OUTRO_2 = 2, - //Tyrannus + // Tyrannus SAY_AMBUSH_1 = 3, SAY_AMBUSH_2 = 4, SAY_GAUNTLET_START = 5, @@ -44,12 +44,12 @@ enum Yells SAY_DARK_MIGHT_1 = 13, SAY_DARK_MIGHT_2 = 14, - //Jaina + // Jaina SAY_JAYNA_OUTRO_3 = 3, SAY_JAYNA_OUTRO_4 = 4, SAY_JAYNA_OUTRO_5 = 5, - //Sylvanas + // Sylvanas SAY_SYLVANAS_OUTRO_3 = 3, SAY_SYLVANAS_OUTRO_4 = 4 }; @@ -121,7 +121,7 @@ static const Position rimefangPos[10] = {1012.601f, 142.4965f, 665.0453f, 0.000000f}, }; -static const Position miscPos = {1018.376f, 167.2495f, 628.2811f, 0.000000f}; //tyrannus combat start position +static Position const miscPos = { 1018.376f, 167.2495f, 628.2811f, 0.000000f }; // tyrannus combat start position class boss_tyrannus : public CreatureScript { @@ -235,7 +235,7 @@ class boss_tyrannus : public CreatureScript me->GetMotionMaster()->MovePoint(0, miscPos); break; case EVENT_COMBAT_START: - if (Creature* rimefang = me->GetCreature(*me, instance->GetData64(DATA_RIMEFANG))) + if (Creature* rimefang = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RIMEFANG))) rimefang->AI()->DoAction(ACTION_START_RIMEFANG); //set rimefang also infight events.SetPhase(PHASE_COMBAT); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -357,7 +357,7 @@ class boss_rimefang : public CreatureScript _events.ScheduleEvent(EVENT_ICY_BLAST, 15000, 0, PHASE_COMBAT); break; case EVENT_HOARFROST: - if (Unit* target = me->GetUnit(*me, _hoarfrostTargetGUID)) + if (Unit* target = ObjectAccessor::GetUnit(*me, _hoarfrostTargetGUID)) { DoCast(target, SPELL_HOARFROST); _hoarfrostTargetGUID = 0; @@ -490,6 +490,43 @@ class spell_tyrannus_mark_of_rimefang : public SpellScriptLoader } }; +// 69232 - Icy Blast +class spell_tyrannus_rimefang_icy_blast : public SpellScriptLoader +{ + public: + spell_tyrannus_rimefang_icy_blast() : SpellScriptLoader("spell_tyrannus_rimefang_icy_blast") { } + + class spell_tyrannus_rimefang_icy_blast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_tyrannus_rimefang_icy_blast_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ICY_BLAST_AURA)) + return false; + return true; + } + + void HandleTriggerMissile(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Position const* pos = GetHitDest()) + if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 60000)) + summon->CastSpell(summon, SPELL_ICY_BLAST_AURA, true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_tyrannus_rimefang_icy_blast_SpellScript::HandleTriggerMissile, EFFECT_1, SPELL_EFFECT_TRIGGER_MISSILE); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_tyrannus_rimefang_icy_blast_SpellScript(); + } +}; + class at_tyrannus_event_starter : public AreaTriggerScript { public: @@ -518,5 +555,6 @@ void AddSC_boss_tyrannus() new boss_rimefang(); new spell_tyrannus_overlord_brand(); new spell_tyrannus_mark_of_rimefang(); + new spell_tyrannus_rimefang_icy_blast(); new at_tyrannus_event_starter(); } diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index f0affa66d0f..b02a319abdc 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -278,7 +278,7 @@ class boss_drakkari_elemental : public CreatureScript if (killer == me) return; - if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) + if (Creature* colossus = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) killer->Kill(colossus); } @@ -314,7 +314,7 @@ class boss_drakkari_elemental : public CreatureScript { case ACTION_RETURN_TO_COLOSSUS: DoCast(SPELL_SURGE_VISUAL); - if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) + if (Creature* colossus = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) // what if the elemental is more than 80 yards from drakkari colossus ? DoCast(colossus, SPELL_MERGE, true); break; @@ -325,7 +325,7 @@ class boss_drakkari_elemental : public CreatureScript { if (HealthBelowPct(50) && instance) { - if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) + if (Creature* colossus = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) { if (colossus->AI()->GetData(DATA_COLOSSUS_PHASE) == COLOSSUS_PHASE_FIRST_ELEMENTAL_SUMMON) { @@ -423,7 +423,7 @@ public: if (id == 1) { - if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) + if (Creature* colossus = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) { colossus->AI()->DoAction(ACTION_UNFREEZE_COLOSSUS); if (!colossus->AI()->GetData(DATA_INTRO_DONE)) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 9847d7191c6..4e45d72cadf 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -345,7 +345,7 @@ class npc_stinky_icc : public CreatureScript void JustDied(Unit* /*killer*/) override { - if (Creature* festergut = me->GetCreature(*me, _instance->GetData64(DATA_FESTERGUT))) + if (Creature* festergut = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FESTERGUT))) if (festergut->IsAlive()) festergut->AI()->Talk(SAY_STINKY_DEAD); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index c408c486b30..3bf8fd8d305 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -372,7 +372,7 @@ class boss_professor_putricide : public CreatureScript instance->SetBossState(DATA_FESTERGUT, IN_PROGRESS); // needed here for delayed gate close me->SetSpeed(MOVE_RUN, _baseSpeed, true); DoAction(ACTION_FESTERGUT_GAS); - if (Creature* festergut = Unit::GetCreature(*me, instance->GetData64(DATA_FESTERGUT))) + if (Creature* festergut = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FESTERGUT))) festergut->CastSpell(festergut, SPELL_GASEOUS_BLIGHT_LARGE, false, NULL, NULL, festergut->GetGUID()); break; case POINT_ROTFACE: @@ -442,7 +442,7 @@ class boss_professor_putricide : public CreatureScript _oozeFloodStage = 0; DoZoneInCombat(me); // init random sequence of floods - if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) + if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) { std::list<Creature*> list; GetCreatureListWithEntryInGrid(list, rotface, NPC_PUDDLE_STALKER, 50.0f); @@ -469,7 +469,7 @@ class boss_professor_putricide : public CreatureScript } case ACTION_ROTFACE_OOZE: Talk(SAY_ROTFACE_OOZE_FLOOD); - if (Creature* dummy = Unit::GetCreature(*me, _oozeFloodDummyGUIDs[_oozeFloodStage])) + if (Creature* dummy = ObjectAccessor::GetCreature(*me, _oozeFloodDummyGUIDs[_oozeFloodStage])) dummy->CastSpell(dummy, oozeFloodSpells[_oozeFloodStage], true, NULL, NULL, me->GetGUID()); // cast from self for LoS (with prof's GUID for logs) if (++_oozeFloodStage == 4) _oozeFloodStage = 0; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 8766781de7c..c1ee616218c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -126,7 +126,7 @@ class boss_rotface : public CreatureScript me->setActive(true); Talk(SAY_AGGRO); - if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_ROTFACE_COMBAT); DoZoneInCombat(); @@ -138,7 +138,7 @@ class boss_rotface : public CreatureScript instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION); _JustDied(); Talk(SAY_DEATH); - if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_ROTFACE_DEATH); } @@ -158,7 +158,7 @@ class boss_rotface : public CreatureScript void EnterEvadeMode() override { ScriptedAI::EnterEvadeMode(); - if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->EnterEvadeMode(); } @@ -176,7 +176,7 @@ class boss_rotface : public CreatureScript void JustSummoned(Creature* summon) override { if (summon->GetEntry() == NPC_VILE_GAS_STALKER) - if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) + if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->CastSpell(summon, SPELL_VILE_GAS_H, true); } @@ -308,13 +308,13 @@ class npc_big_ooze : public CreatureScript DoCast(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true); events.ScheduleEvent(EVENT_STICKY_OOZE, 5000); // register in Rotface's summons - not summoned with Rotface as owner - if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) + if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) rotface->AI()->JustSummoned(me); } void JustDied(Unit* /*killer*/) override { - if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) + if (Creature* rotface = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ROTFACE))) rotface->AI()->SummonedCreatureDespawn(me); me->DespawnOrUnsummon(); } @@ -395,7 +395,7 @@ class npc_precious_icc : public CreatureScript void JustDied(Unit* /*killer*/) override { _summons.DespawnAll(); - if (Creature* rotface = Unit::GetCreature(*me, _instance->GetData64(DATA_ROTFACE))) + if (Creature* rotface = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ROTFACE))) if (rotface->IsAlive()) rotface->AI()->Talk(SAY_PRECIOUS_DIES); } @@ -657,7 +657,7 @@ class spell_rotface_large_ooze_buff_combine : public SpellScriptLoader GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_BUFF_COMBINE); GetCaster()->RemoveAurasDueToSpell(SPELL_LARGE_OOZE_COMBINE); if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - if (Creature* rotface = Unit::GetCreature(*GetCaster(), instance->GetData64(DATA_ROTFACE))) + if (Creature* rotface = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_ROTFACE))) if (rotface->IsAlive()) { rotface->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 25cc47b358c..592c44940a4 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -1800,7 +1800,7 @@ class spell_icc_sprit_alarm : public SpellScriptLoader } if (GameObject* trap = GetCaster()->FindNearestGameObject(trapId, 5.0f)) - trap->SetRespawnTime(trap->GetGOInfo()->trap.autoCloseTime); + trap->SetRespawnTime(trap->GetGOInfo()->GetAutoCloseTime()); std::list<Creature*> wards; GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, 150.0f); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 0543b0274b5..77486c37498 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -138,10 +138,10 @@ public: bool DoEncounteraction(Unit* who, bool attack, bool reset, bool checkAllDead) { - Creature* Thane = Unit::GetCreature(*me, instance->GetData64(DATA_THANE)); - Creature* Lady = Unit::GetCreature(*me, instance->GetData64(DATA_LADY)); - Creature* Baron = Unit::GetCreature(*me, instance->GetData64(DATA_BARON)); - Creature* Sir = Unit::GetCreature(*me, instance->GetData64(DATA_SIR)); + Creature* Thane = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THANE)); + Creature* Lady = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_LADY)); + Creature* Baron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BARON)); + Creature* Sir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SIR)); if (Thane && Lady && Baron && Sir) { @@ -226,7 +226,7 @@ public: movementCompleted = true; me->SetReactState(REACT_AGGRESSIVE); - Unit* eventStarter = Unit::GetUnit(*me, uiEventStarterGUID); + Unit* eventStarter = ObjectAccessor::GetUnit(*me, uiEventStarterGUID); if (eventStarter && me->IsValidAttackTarget(eventStarter)) AttackStart(eventStarter); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 29e435e2127..d973ce867f2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -257,25 +257,25 @@ class boss_gothik : public CreatureScript { case NPC_LIVE_TRAINEE: { - if (Creature* liveTrigger = Unit::GetCreature(*me, LiveTriggerGUID[0])) + if (Creature* liveTrigger = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[0])) DoSummon(NPC_LIVE_TRAINEE, liveTrigger, 1); - if (Creature* liveTrigger1 = Unit::GetCreature(*me, LiveTriggerGUID[1])) + if (Creature* liveTrigger1 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[1])) DoSummon(NPC_LIVE_TRAINEE, liveTrigger1, 1); - if (Creature* liveTrigger2 = Unit::GetCreature(*me, LiveTriggerGUID[2])) + if (Creature* liveTrigger2 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[2])) DoSummon(NPC_LIVE_TRAINEE, liveTrigger2, 1); break; } case NPC_LIVE_KNIGHT: { - if (Creature* liveTrigger3 = Unit::GetCreature(*me, LiveTriggerGUID[3])) + if (Creature* liveTrigger3 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[3])) DoSummon(NPC_LIVE_KNIGHT, liveTrigger3, 1); - if (Creature* liveTrigger5 = Unit::GetCreature(*me, LiveTriggerGUID[5])) + if (Creature* liveTrigger5 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[5])) DoSummon(NPC_LIVE_KNIGHT, liveTrigger5, 1); break; } case NPC_LIVE_RIDER: { - if (Creature* liveTrigger4 = Unit::GetCreature(*me, LiveTriggerGUID[4])) + if (Creature* liveTrigger4 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[4])) DoSummon(NPC_LIVE_RIDER, liveTrigger4, 1); break; } @@ -287,21 +287,21 @@ class boss_gothik : public CreatureScript { case NPC_LIVE_TRAINEE: { - if (Creature* liveTrigger = Unit::GetCreature(*me, LiveTriggerGUID[4])) + if (Creature* liveTrigger = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[4])) DoSummon(NPC_LIVE_TRAINEE, liveTrigger, 1); - if (Creature* liveTrigger2 = Unit::GetCreature(*me, LiveTriggerGUID[4])) + if (Creature* liveTrigger2 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[4])) DoSummon(NPC_LIVE_TRAINEE, liveTrigger2, 1); break; } case NPC_LIVE_KNIGHT: { - if (Creature* liveTrigger5 = Unit::GetCreature(*me, LiveTriggerGUID[4])) + if (Creature* liveTrigger5 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[4])) DoSummon(NPC_LIVE_KNIGHT, liveTrigger5, 1); break; } case NPC_LIVE_RIDER: { - if (Creature* liveTrigger4 = Unit::GetCreature(*me, LiveTriggerGUID[4])) + if (Creature* liveTrigger4 = ObjectAccessor::GetCreature(*me, LiveTriggerGUID[4])) DoSummon(NPC_LIVE_RIDER, liveTrigger4, 1); break; } @@ -359,7 +359,7 @@ class boss_gothik : public CreatureScript if (spellId && me->IsInCombat()) { me->HandleEmoteCommand(EMOTE_ONESHOT_SPELL_CAST); - if (Creature* pRandomDeadTrigger = Unit::GetCreature(*me, DeadTriggerGUID[rand() % POS_DEAD])) + if (Creature* pRandomDeadTrigger = ObjectAccessor::GetCreature(*me, DeadTriggerGUID[rand() % POS_DEAD])) me->CastSpell(pRandomDeadTrigger, spellId, true); } } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 8b3ac64fb89..c5c70cf3957 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -368,38 +368,33 @@ public: if (Phase == 1) { - while (uint32 eventId = events.GetEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_WASTE: DoSummon(NPC_WASTE, Pos[RAND(0, 3, 6, 9)]); - events.RepeatEvent(urand(2000, 5000)); + events.Repeat(2000, 5000); break; case EVENT_ABOMIN: if (nAbomination < 8) { DoSummon(NPC_ABOMINATION, Pos[RAND(1, 4, 7, 10)]); nAbomination++; - events.RepeatEvent(20000); + events.Repeat(20000); } - else - events.PopEvent(); break; case EVENT_WEAVER: if (nWeaver < 8) { DoSummon(NPC_WEAVER, Pos[RAND(0, 3, 6, 9)]); nWeaver++; - events.RepeatEvent(25000); + events.Repeat(25000); } - else - events.PopEvent(); break; case EVENT_TRIGGER: if (GameObject* trigger = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_KELTHUZAD_TRIGGER))) trigger->SetPhaseMask(2, true); - events.PopEvent(); break; case EVENT_PHASE: events.Reset(); @@ -419,7 +414,6 @@ public: Phase = 2; break; default: - events.PopEvent(); break; } } @@ -461,17 +455,17 @@ public: if (me->HasUnitState(UNIT_STATE_CASTING)) return; - if (uint32 eventId = events.GetEvent()) + if (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_BOLT: DoCastVictim(SPELL_FROST_BOLT); - events.RepeatEvent(urand(5000, 10000)); + events.Repeat(5000, 10000); break; case EVENT_NOVA: DoCastAOE(SPELL_FROST_BOLT_AOE); - events.RepeatEvent(urand(15000, 30000)); + events.Repeat(15000, 30000); break; case EVENT_CHAIN: { @@ -490,7 +484,7 @@ public: } if (!chained.empty()) Talk(SAY_CHAIN); - events.RepeatEvent(urand(100000, 180000)); + events.Repeat(100000, 180000); break; } case EVENT_CHAINED_SPELL: @@ -565,10 +559,8 @@ public: ++itr; } - if (chained.empty()) - events.PopEvent(); - else - events.RepeatEvent(5000); + if (!chained.empty()) + events.Repeat(5000); break; } @@ -596,23 +588,22 @@ public: Talk(SAY_SPECIAL); } - events.RepeatEvent(urand(20000, 50000)); + events.Repeat(20000, 50000); break; } case EVENT_FISSURE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(target, SPELL_SHADOW_FISURE); - events.RepeatEvent(urand(10000, 45000)); + events.Repeat(10000, 45000); break; case EVENT_BLAST: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, RAID_MODE(1, 0), 0, true)) DoCast(target, SPELL_FROST_BLAST); if (rand()%2) Talk(SAY_FROST_BLAST); - events.RepeatEvent(urand(30000, 90000)); + events.Repeat(30000, 90000); break; default: - events.PopEvent(); break; } } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index ce605987890..52723b591a2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -169,14 +169,14 @@ public: { victimGUID = guid; if (me->m_spells[0] && victimGUID) - if (Unit* victim = Unit::GetUnit(*me, victimGUID)) + if (Unit* victim = ObjectAccessor::GetUnit(*me, victimGUID)) victim->CastSpell(victim, me->m_spells[0], true, NULL, NULL, me->GetGUID()); } void JustDied(Unit* /*killer*/) override { if (me->m_spells[0] && victimGUID) - if (Unit* victim = Unit::GetUnit(*me, victimGUID)) + if (Unit* victim = ObjectAccessor::GetUnit(*me, victimGUID)) victim->RemoveAurasDueToSpell(me->m_spells[0], me->GetGUID()); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index 528b2fec348..406ca3963a4 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -123,11 +123,11 @@ public: // Moreover, the adds may not yet be spawn. So just track down the status if mob is spawn // and each mob will send its status at reset (meaning that it is alive) checkFeugenAlive = false; - if (Creature* pFeugen = me->GetCreature(*me, instance->GetData64(DATA_FEUGEN))) + if (Creature* pFeugen = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FEUGEN))) checkFeugenAlive = pFeugen->IsAlive(); checkStalaggAlive = false; - if (Creature* pStalagg = me->GetCreature(*me, instance->GetData64(DATA_STALAGG))) + if (Creature* pStalagg = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_STALAGG))) checkStalaggAlive = pStalagg->IsAlive(); if (!checkFeugenAlive && !checkStalaggAlive) @@ -230,12 +230,12 @@ public: { if (!checkStalaggAlive) { - if (Creature* pStalagg = me->GetCreature(*me, instance->GetData64(DATA_STALAGG))) + if (Creature* pStalagg = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_STALAGG))) pStalagg->Respawn(); } else { - if (Creature* pFeugen = me->GetCreature(*me, instance->GetData64(DATA_FEUGEN))) + if (Creature* pFeugen = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FEUGEN))) pFeugen->Respawn(); } } @@ -300,7 +300,7 @@ public: void Reset() override { - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS))) if (pThaddius->AI()) pThaddius->AI()->DoAction(ACTION_STALAGG_RESET); powerSurgeTimer = urand(20000, 25000); @@ -322,7 +322,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_STAL_DEATH); - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS))) if (pThaddius->AI()) pThaddius->AI()->DoAction(ACTION_STALAGG_DIED); } @@ -334,7 +334,7 @@ public: if (magneticPullTimer <= uiDiff) { - if (Creature* pFeugen = me->GetCreature(*me, instance->GetData64(DATA_FEUGEN))) + if (Creature* pFeugen = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FEUGEN))) { Unit* pStalaggVictim = me->GetVictim(); Unit* pFeugenVictim = pFeugen->GetVictim(); @@ -391,7 +391,7 @@ public: void Reset() override { - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS))) if (pThaddius->AI()) pThaddius->AI()->DoAction(ACTION_FEUGEN_RESET); staticFieldTimer = 5000; @@ -412,7 +412,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_FEUG_DEATH); - if (Creature* pThaddius = me->GetCreature(*me, instance->GetData64(DATA_THADDIUS))) + if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_THADDIUS))) if (pThaddius->AI()) pThaddius->AI()->DoAction(ACTION_FEUGEN_DIED); } diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index b1e9ad8f595..fefdfa633ea 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -1809,7 +1809,7 @@ public: class spell_malygos_vortex_dummy_SpellScript : public SpellScript { - PrepareSpellScript(spell_malygos_vortex_dummy_SpellScript) + PrepareSpellScript(spell_malygos_vortex_dummy_SpellScript); bool Load() override { @@ -2281,7 +2281,7 @@ class spell_malygos_surge_of_power_warning_selector_25 : public SpellScriptLoade class spell_malygos_surge_of_power_warning_selector_25_SpellScript : public SpellScript { - PrepareSpellScript(spell_malygos_surge_of_power_warning_selector_25_SpellScript) + PrepareSpellScript(spell_malygos_surge_of_power_warning_selector_25_SpellScript); bool Load() override { @@ -2347,7 +2347,7 @@ class spell_malygos_surge_of_power_25 : public SpellScriptLoader class spell_malygos_surge_of_power_25_SpellScript : public SpellScript { - PrepareSpellScript(spell_malygos_surge_of_power_25_SpellScript) + PrepareSpellScript(spell_malygos_surge_of_power_25_SpellScript); bool Load() override { diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 0870614ba78..585da8e28d3 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -299,7 +299,7 @@ class spell_varos_energize_core_area_enemy : public SpellScriptLoader class spell_varos_energize_core_area_enemySpellScript : public SpellScript { - PrepareSpellScript(spell_varos_energize_core_area_enemySpellScript) + PrepareSpellScript(spell_varos_energize_core_area_enemySpellScript); void FilterTargets(std::list<WorldObject*>& targets) { @@ -343,7 +343,7 @@ class spell_varos_energize_core_area_entry : public SpellScriptLoader class spell_varos_energize_core_area_entrySpellScript : public SpellScript { - PrepareSpellScript(spell_varos_energize_core_area_entrySpellScript) + PrepareSpellScript(spell_varos_energize_core_area_entrySpellScript); void FilterTargets(std::list<WorldObject*>& targets) { diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 727060578c8..24d145f097f 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -164,7 +164,7 @@ public: for (uint8 i = 0; i < 2; ++i) { - if (Creature* pStormforgedLieutenant = (Unit::GetCreature((*me), m_auiStormforgedLieutenantGUID[i]))) + if (Creature* pStormforgedLieutenant = (ObjectAccessor::GetCreature((*me), m_auiStormforgedLieutenantGUID[i]))) { if (!pStormforgedLieutenant->IsAlive()) pStormforgedLieutenant->Respawn(); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 880045b96ef..d0b8f75e711 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -164,7 +164,7 @@ public: for (std::list<uint64>::const_iterator itr = m_lGolemGUIDList.begin(); itr != m_lGolemGUIDList.end(); ++itr) { - if (Creature* temp = Unit::GetCreature(*me, *itr)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr)) { if (temp->IsAlive()) temp->DespawnOrUnsummon(); @@ -181,7 +181,7 @@ public: for (std::list<uint64>::const_iterator itr = m_lGolemGUIDList.begin(); itr != m_lGolemGUIDList.end(); ++itr) { - if (Creature* temp = Unit::GetCreature(*me, *itr)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr)) { // Only shatter brittle golems if (temp->IsAlive() && temp->GetEntry() == NPC_BRITTLE_GOLEM) diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index c81cd0b0b80..07cdfa3353c 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -15,14 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* Script Data Start -SDName: Boss krystallus -SDAuthor: LordVanMartin -SD%Complete: -SDComment: -SDCategory: -Script Data End */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" @@ -30,17 +22,13 @@ Script Data End */ enum Spells { - SPELL_BOULDER_TOSS = 50843, - H_SPELL_BOULDER_TOSS = 59742, - SPELL_GROUND_SPIKE = 59750, - SPELL_GROUND_SLAM = 50827, - SPELL_SHATTER = 50810, - H_SPELL_SHATTER = 61546, - SPELL_SHATTER_EFFECT = 50811, - H_SPELL_SHATTER_EFFECT = 61547, - SPELL_STONED = 50812, - SPELL_STOMP = 48131, - H_SPELL_STOMP = 59744 + SPELL_BOULDER_TOSS = 50843, + SPELL_GROUND_SPIKE = 59750, + SPELL_GROUND_SLAM = 50827, + SPELL_SHATTER = 50810, + SPELL_SHATTER_EFFECT = 50811, + SPELL_STONED = 50812, + SPELL_STOMP = 48131 }; enum Yells @@ -51,133 +39,103 @@ enum Yells SAY_SHATTER = 3 }; -class boss_krystallus : public CreatureScript +enum Events { -public: - boss_krystallus() : CreatureScript("boss_krystallus") { } - - struct boss_krystallusAI : public ScriptedAI - { - boss_krystallusAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - uint32 uiBoulderTossTimer; - uint32 uiGroundSpikeTimer; - uint32 uiGroundSlamTimer; - uint32 uiShatterTimer; - uint32 uiStompTimer; - - bool bIsSlam; - - InstanceScript* instance; - - void Reset() override - { - bIsSlam = false; - - uiBoulderTossTimer = urand(3000, 9000); - uiGroundSpikeTimer = urand(9000, 14000); - uiGroundSlamTimer = urand(15000, 18000); - uiStompTimer = urand(20000, 29000); - uiShatterTimer = 0; - - instance->SetBossState(DATA_KRYSTALLUS, NOT_STARTED); - } - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); + EVENT_BOULDER_TOSS = 1, + EVENT_GROUND_SPIKE, + EVENT_GROUND_SLAM, + EVENT_STOMP, + EVENT_SHATTER +}; - instance->SetBossState(DATA_KRYSTALLUS, IN_PROGRESS); - } +class boss_krystallus : public CreatureScript +{ + public: + boss_krystallus() : CreatureScript("boss_krystallus") { } - void UpdateAI(uint32 diff) override + struct boss_krystallusAI : public BossAI { - //Return since we have no target - if (!UpdateVictim()) - return; + boss_krystallusAI(Creature* creature) : BossAI(creature, DATA_KRYSTALLUS) { } - if (uiBoulderTossTimer <= diff) + void Reset() override { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_BOULDER_TOSS); - uiBoulderTossTimer = urand(9000, 15000); - } else uiBoulderTossTimer -= diff; - - if (uiGroundSpikeTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_GROUND_SPIKE); - uiGroundSpikeTimer = urand(12000, 17000); - } else uiGroundSpikeTimer -= diff; - - if (uiStompTimer <= diff) - { - DoCast(me, SPELL_STOMP); - uiStompTimer = urand(20000, 29000); - } else uiStompTimer -= diff; - - if (uiGroundSlamTimer <= diff) - { - DoCast(me, SPELL_GROUND_SLAM); - bIsSlam = true; - uiShatterTimer = 10000; - uiGroundSlamTimer = urand(15000, 18000); - } else uiGroundSlamTimer -= diff; + _Reset(); + } - if (bIsSlam) + void EnterCombat(Unit* /*who*/) override { - if (uiShatterTimer <= diff) - { - DoCast(me, DUNGEON_MODE(SPELL_SHATTER, H_SPELL_SHATTER)); - } else uiShatterTimer -= diff; + Talk(SAY_AGGRO); + _EnterCombat(); + + events.ScheduleEvent(EVENT_BOULDER_TOSS, urand(3000, 9000)); + events.ScheduleEvent(EVENT_GROUND_SLAM, urand(15000, 18000)); + events.ScheduleEvent(EVENT_STOMP, urand(20000, 29000)); + if (IsHeroic()) + events.ScheduleEvent(EVENT_GROUND_SPIKE, urand(9000, 14000)); } - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - - instance->SetBossState(DATA_KRYSTALLUS, DONE); - } + void UpdateAI(uint32 diff) override + { + // Return since we have no target + if (!UpdateVictim()) + return; - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; + events.Update(diff); - Talk(SAY_KILL); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void SpellHitTarget(Unit* /*target*/, const SpellInfo* pSpell) override - { - //this part should be in the core - if (pSpell->Id == SPELL_SHATTER || pSpell->Id == H_SPELL_SHATTER) - { - /// @todo we need eventmap to kill this stuff - //clear this, if we are still performing - if (bIsSlam) + while (uint32 eventId = events.ExecuteEvent()) { - bIsSlam = false; - - //and correct movement, if not already - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE) + switch (eventId) { - if (me->GetVictim()) - me->GetMotionMaster()->MoveChase(me->GetVictim()); + case EVENT_BOULDER_TOSS: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) + DoCast(target, SPELL_BOULDER_TOSS); + events.ScheduleEvent(EVENT_BOULDER_TOSS, urand(9000, 15000)); + break; + case EVENT_GROUND_SPIKE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + DoCast(target, SPELL_GROUND_SPIKE); + events.ScheduleEvent(EVENT_GROUND_SPIKE, urand(12000, 17000)); + break; + case EVENT_GROUND_SLAM: + DoCast(me, SPELL_GROUND_SLAM); + events.ScheduleEvent(EVENT_SHATTER, 10000); + events.ScheduleEvent(EVENT_GROUND_SLAM, urand(15000, 18000)); + break; + case EVENT_STOMP: + DoCast(me, SPELL_STOMP); + events.ScheduleEvent(EVENT_STOMP, urand(20000, 29000)); + break; + case EVENT_SHATTER: + DoCast(me, SPELL_SHATTER); + break; + default: + break; } } + + DoMeleeAttackIfReady(); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); } - } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfStoneAI<boss_krystallusAI>(creature); - } + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetHallsOfStoneAI<boss_krystallusAI>(creature); + } }; class spell_krystallus_shatter : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index f666f5d5874..cedf06a3154 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -211,7 +211,7 @@ public: if (!KaddrakGUIDList.empty()) for (std::list<uint64>::const_iterator itr = KaddrakGUIDList.begin(); itr != KaddrakGUIDList.end(); ++itr) { - if (Creature* pKaddrak = Unit::GetCreature(*me, *itr)) + if (Creature* pKaddrak = ObjectAccessor::GetCreature(*me, *itr)) { if (pKaddrak->IsAlive()) pKaddrak->CastSpell(target, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, H_SPELL_GLARE_OF_THE_TRIBUNAL), true); @@ -331,7 +331,7 @@ public: return; for (std::list<uint64>::const_iterator itr = lDwarfGUIDList.begin(); itr != lDwarfGUIDList.end(); ++itr) { - Creature* temp = Unit::GetCreature(*me, instance ? (*itr) : 0); + Creature* temp = ObjectAccessor::GetCreature(*me, instance ? (*itr) : 0); if (temp && temp->IsAlive()) temp->DespawnOrUnsummon(); } @@ -446,7 +446,7 @@ public: JumpToNextStep(0); break; case 5: - if (Creature* temp = (Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM)))) + if (Creature* temp = (ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM)))) temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED); JumpToNextStep(8500); break; @@ -455,14 +455,14 @@ public: JumpToNextStep(6500); break; case 7: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_A_2_KADD); JumpToNextStep(12500); break; case 8: Talk(SAY_EVENT_A_3); instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), true); - if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bKaddrakActivated = true; JumpToNextStep(5000); break; @@ -476,7 +476,7 @@ public: JumpToNextStep(6000); break; case 11: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_B_2_MARN); SpawnDwarf(1); JumpToNextStep(20000); @@ -484,7 +484,7 @@ public: case 12: Talk(SAY_EVENT_B_3); instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), true); - if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bMarnakActivated = true; JumpToNextStep(10000); break; @@ -506,7 +506,7 @@ public: JumpToNextStep(20000); break; case 17: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_C_2_ABED); SpawnDwarf(1); JumpToNextStep(20000); @@ -514,7 +514,7 @@ public: case 18: Talk(SAY_EVENT_C_3); instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), true); - if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bAbedneumActivated = true; JumpToNextStep(5000); break; @@ -532,7 +532,7 @@ public: JumpToNextStep(20000); break; case 22: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_D_2_ABED); SpawnDwarf(1); JumpToNextStep(5000); @@ -555,7 +555,7 @@ public: JumpToNextStep(10000); break; case 27: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_D_4_ABED); SpawnDwarf(1); JumpToNextStep(10000); @@ -565,7 +565,7 @@ public: Talk(SAY_EVENT_END_01); me->SetStandState(UNIT_STAND_STATE_STAND); instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), true); - if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) temp->DealDamage(temp, temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); bIsBattle = true; SetEscortPaused(false); @@ -578,7 +578,7 @@ public: JumpToNextStep(5500); break; case 30: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_03_ABED); JumpToNextStep(8500); break; @@ -587,7 +587,7 @@ public: JumpToNextStep(11500); break; case 32: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_05_ABED); JumpToNextStep(11500); break; @@ -596,7 +596,7 @@ public: JumpToNextStep(4500); break; case 34: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_07_ABED); JumpToNextStep(22500); break; @@ -605,7 +605,7 @@ public: JumpToNextStep(7500); break; case 36: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_END_09_KADD); JumpToNextStep(18500); break; @@ -614,7 +614,7 @@ public: JumpToNextStep(5500); break; case 38: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_END_11_KADD); JumpToNextStep(20500); break; @@ -623,7 +623,7 @@ public: JumpToNextStep(2500); break; case 40: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_END_13_KADD); JumpToNextStep(19500); break; @@ -632,7 +632,7 @@ public: JumpToNextStep(10500); break; case 42: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_END_15_MARN); JumpToNextStep(6500); break; @@ -641,7 +641,7 @@ public: JumpToNextStep(6500); break; case 44: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_END_17_MARN); JumpToNextStep(25500); break; @@ -650,7 +650,7 @@ public: JumpToNextStep(23500); break; case 46: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_END_19_MARN); JumpToNextStep(3500); break; @@ -659,7 +659,7 @@ public: JumpToNextStep(8500); break; case 48: - if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_21_ABED); JumpToNextStep(5500); break; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp index 58df31a4471..011d1844adf 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp @@ -332,7 +332,7 @@ class boss_saronite_animus : public CreatureScript void JustDied(Unit* /*killer*/) override { - if (Creature* Vezax = me->GetCreature(*me, instance->GetData64(BOSS_VEZAX))) + if (Creature* Vezax = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_VEZAX))) Vezax->AI()->DoAction(ACTION_ANIMUS_DIE); } @@ -427,7 +427,7 @@ class npc_saronite_vapors : public CreatureScript DoCast(me, SPELL_SARONITE_VAPORS); me->DespawnOrUnsummon(30000); - if (Creature* Vezax = me->GetCreature(*me, instance->GetData64(BOSS_VEZAX))) + if (Creature* Vezax = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_VEZAX))) Vezax->AI()->DoAction(ACTION_VAPORS_DIE); } } @@ -494,13 +494,13 @@ class spell_general_vezax_mark_of_the_faceless_leech : public SpellScriptLoader FinishCast(SPELL_FAILED_NO_VALID_TARGETS); } - void Register() + void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_general_vezax_mark_of_the_faceless_leech_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); } }; - SpellScript* GetSpellScript() const + SpellScript* GetSpellScript() const override { return new spell_general_vezax_mark_of_the_faceless_leech_SpellScript(); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index ef9bd9a8b12..6be3586de28 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -399,7 +399,7 @@ class npc_scorch_ground : public CreatureScript { if (_heatTimer <= uiDiff) { - Creature* construct = me->GetCreature(*me, _constructGUID); + Creature* construct = ObjectAccessor::GetCreature(*me, _constructGUID); if (construct && !construct->HasAura(SPELL_MOLTEN)) { me->AddAura(SPELL_HEAT, construct); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index e77350e2710..58969fd63c8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -234,7 +234,7 @@ class boss_kologarn : public CreatureScript // Victim gets 67351 if (eyebeamTarget) { - if (Unit* target = Unit::GetUnit(*summon, eyebeamTarget)) + if (Unit* target = ObjectAccessor::GetUnit(*summon, eyebeamTarget)) { summon->Attack(target, false); summon->GetMotionMaster()->MoveChase(target); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index cfa5429ea79..f284aacf996 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -89,7 +89,7 @@ class spell_ulduar_proximity_mines : public SpellScriptLoader class spell_ulduar_proximity_minesSpellScript : public SpellScript { - PrepareSpellScript(spell_ulduar_proximity_minesSpellScript) + PrepareSpellScript(spell_ulduar_proximity_minesSpellScript); void HandleScript(SpellEffIndex effIndex) { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index c57c3b33d01..87192f39a5c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -457,7 +457,7 @@ class npc_xt002_heart : public CreatureScript void JustDied(Unit* /*killer*/) override { - Creature* xt002 = _instance ? me->GetCreature(*me, _instance->GetData64(BOSS_XT002)) : NULL; + Creature* xt002 = _instance ? ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002)) : NULL; if (!xt002 || !xt002->AI()) return; @@ -503,7 +503,7 @@ class npc_scrapbot : public CreatureScript _rangeCheckTimer = 500; - if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002))) + if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002))) me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f); } @@ -511,7 +511,7 @@ class npc_scrapbot : public CreatureScript { if (_rangeCheckTimer <= diff) { - if (Creature* xt002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002))) + if (Creature* xt002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002))) { if (me->IsWithinMeleeRange(xt002)) { @@ -560,7 +560,7 @@ class npc_pummeller : public CreatureScript _trampleTimer = TIMER_TRAMPLE; _uppercutTimer = TIMER_UPPERCUT; - if (Creature* xt002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002))) + if (Creature* xt002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002))) { Position pos = xt002->GetPosition(); me->GetMotionMaster()->MovePoint(0, pos); @@ -668,7 +668,7 @@ class npc_boombot : public CreatureScript me->SetFloatValue(UNIT_FIELD_MAXDAMAGE, 18000.0f); /// @todo proper waypoints? - if (Creature* pXT002 = me->GetCreature(*me, _instance->GetData64(BOSS_XT002))) + if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, _instance->GetData64(BOSS_XT002))) me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index 4a5c0291ce0..41dd1a165f2 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -206,7 +206,7 @@ public: Summons.DespawnAll(); me->SetSpeed(MOVE_FLIGHT, 3.0f); - if ((Unit::GetCreature(*me, m_uiGraufGUID) == NULL) && !me->IsMounted()) + if ((ObjectAccessor::GetCreature(*me, m_uiGraufGUID) == NULL) && !me->IsMounted()) me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f); instance->SetBossState(DATA_SKADI_THE_RUTHLESS, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); @@ -217,7 +217,7 @@ public: me->SetCanFly(false); me->Dismount(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - if (!Unit::GetCreature(*me, m_uiGraufGUID)) + if (!ObjectAccessor::GetCreature(*me, m_uiGraufGUID)) me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f); } @@ -469,7 +469,7 @@ public: if (!instance) return false; - if (Creature* pSkadi = Unit::GetCreature(*go, instance->GetData64(DATA_SKADI_THE_RUTHLESS))) + if (Creature* pSkadi = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_SKADI_THE_RUTHLESS))) player->CastSpell(pSkadi, SPELL_RAPID_FIRE, true); return false; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp index a33d02fb083..de4d6c32c97 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp @@ -369,7 +369,7 @@ public: void DespawnBoatGhosts(uint64& m_uiCreatureGUID) { if (m_uiCreatureGUID) - if (Creature* temp = Unit::GetCreature(*me, m_uiCreatureGUID)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, m_uiCreatureGUID)) temp->DisappearAndDie(); m_uiCreatureGUID = 0; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 205030947d1..ea5c5b9ee48 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -103,7 +103,7 @@ class boss_emalon : public CreatureScript { for (std::list<uint64>::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { - Creature* minion = Unit::GetCreature(*me, *itr); + Creature* minion = ObjectAccessor::GetCreature(*me, *itr); if (minion && minion->IsAlive() && !minion->GetVictim() && minion->AI()) minion->AI()->AttackStart(who); } @@ -143,7 +143,7 @@ class boss_emalon : public CreatureScript case EVENT_OVERCHARGE: if (!summons.empty()) { - Creature* minion = Unit::GetCreature(*me, Trinity::Containers::SelectRandomContainerElement(summons)); + Creature* minion = ObjectAccessor::GetCreature(*me, Trinity::Containers::SelectRandomContainerElement(summons)); if (minion && minion->IsAlive()) { minion->CastSpell(me, SPELL_OVERCHARGED, true); diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 5cbd4cafffb..4aede5e5f46 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -242,7 +242,7 @@ public: if (!m_waterElements.empty()) { for (std::list<uint64>::const_iterator itr = m_waterElements.begin(); itr != m_waterElements.end(); ++itr) - if (Creature* temp = Unit::GetCreature(*me, *itr)) + if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr)) if (temp->IsAlive()) { bIsWaterElementsAlive = true; @@ -362,7 +362,7 @@ public: { if (uiRangeCheck_Timer < uiDiff) { - if (Creature* pIchoron = Unit::GetCreature(*me, instance->GetData64(DATA_ICHORON))) + if (Creature* pIchoron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ICHORON))) { if (me->IsWithinDist(pIchoron, 2.0f, false)) { @@ -379,7 +379,7 @@ public: void JustDied(Unit* /*killer*/) override { DoCast(me, SPELL_SPLASH); - if (Creature* pIchoron = Unit::GetCreature(*me, instance->GetData64(DATA_ICHORON))) + if (Creature* pIchoron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ICHORON))) if (pIchoron->AI()) pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_KILLED); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index de08022b5ed..2bac444a558 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -254,7 +254,7 @@ public: if (uiRangeCheck_Timer < uiDiff) { - if (Creature* pXevozz = Unit::GetCreature(*me, instance->GetData64(DATA_XEVOZZ))) + if (Creature* pXevozz = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_XEVOZZ))) { float fDistance = me->GetDistance2d(pXevozz); if (fDistance <= 3) diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index a4f142e1c89..b623d5e6ddc 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -535,7 +535,7 @@ public: { me->CastSpell(me, SABOTEUR_SHIELD_DISRUPTION, false); me->DisappearAndDie(); - Creature* pSaboPort = Unit::GetCreature((*me), instance->GetData64(DATA_SABOTEUR_PORTAL)); + Creature* pSaboPort = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_SABOTEUR_PORTAL)); if (pSaboPort) pSaboPort->DisappearAndDie(); instance->SetData(DATA_START_BOSS_ENCOUNTER, 1); diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index c226edf28b8..38d73e0673d 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -1071,8 +1071,8 @@ public: if (phaseTimer <= diff) { - Creature* talbot = me->GetCreature(*me, talbotGUID); - Creature* arthas = me->GetCreature(*me, arthasGUID); + Creature* talbot = ObjectAccessor::GetCreature(*me, talbotGUID); + Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID); switch (phase) { case 1: @@ -1209,9 +1209,9 @@ public: break; case 17: - if (Creature* leryssa = me->GetCreature(*me, leryssaGUID)) + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, leryssaGUID)) leryssa->RemoveFromWorld(); - if (Creature* arlos= me->GetCreature(*me, arlosGUID)) + if (Creature* arlos= ObjectAccessor::GetCreature(*me, arlosGUID)) arlos->RemoveFromWorld(); if (talbot) talbot->RemoveFromWorld(); @@ -1230,16 +1230,16 @@ public: void JustDied(Unit* /*killer*/) override { - if (Creature* talbot = me->GetCreature(*me, talbotGUID)) + if (Creature* talbot = ObjectAccessor::GetCreature(*me, talbotGUID)) talbot->RemoveFromWorld(); - if (Creature* leryssa = me->GetCreature(*me, leryssaGUID)) + if (Creature* leryssa = ObjectAccessor::GetCreature(*me, leryssaGUID)) leryssa->RemoveFromWorld(); - if (Creature* arlos = me->GetCreature(*me, arlosGUID)) + if (Creature* arlos = ObjectAccessor::GetCreature(*me, arlosGUID)) arlos->RemoveFromWorld(); - if (Creature* arthas = me->GetCreature(*me, arthasGUID)) + if (Creature* arthas = ObjectAccessor::GetCreature(*me, arthasGUID)) arthas->RemoveFromWorld(); } }; @@ -1433,8 +1433,8 @@ public: if (!leryssaGUID || !arlosGUID) return; - Creature* leryssa = Unit::GetCreature(*me, leryssaGUID); - Creature* arlos = Unit::GetCreature(*me, arlosGUID); + Creature* leryssa = ObjectAccessor::GetCreature(*me, leryssaGUID); + Creature* arlos = ObjectAccessor::GetCreature(*me, arlosGUID); if (!leryssa || !arlos) return; diff --git a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp index a5ff2271316..e4bd9c469fb 100644 --- a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp +++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp @@ -97,7 +97,7 @@ public: } - if (Creature* pOrb = me->GetCreature(*me, targetGUID)) + if (Creature* pOrb = ObjectAccessor::GetCreature(*me, targetGUID)) DoCast(pOrb, SPELL_TRANSITUS_SHIELD_BEAM); } diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index e98d424abd5..d0fd948ce6a 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -85,18 +85,18 @@ public: _mrfloppyGUID = Mrfloppy->GetGUID(); break; case 10: - if (Unit::GetCreature(*me, _mrfloppyGUID)) + if (ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) { Talk(SAY_WORGHAGGRO1); me->SummonCreature(NPC_HUNGRY_WORG, me->GetPositionX()+5, me->GetPositionY()+2, me->GetPositionZ()+1, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); } break; case 11: - if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); break; case 17: - if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); Talk(SAY_WORGRAGGRO3); if (Creature* RWORG = me->SummonCreature(NPC_RAVENOUS_WORG, me->GetPositionX()+10, me->GetPositionY()+8, me->GetPositionZ()+2, 3.229f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000)) @@ -106,31 +106,31 @@ public: } break; case 18: - if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) { - if (Creature* RWORG = Unit::GetCreature(*me, _RavenousworgGUID)) + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); DoCast(Mrfloppy, SPELL_MRFLOPPY); } break; case 19: - if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) { if (Mrfloppy->HasAura(SPELL_MRFLOPPY, 0)) { - if (Creature* RWORG = Unit::GetCreature(*me, _RavenousworgGUID)) + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) Mrfloppy->EnterVehicle(RWORG); } } break; case 20: - if (Creature* RWORG = Unit::GetCreature(*me, _RavenousworgGUID)) + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) RWORG->HandleEmoteCommand(34); break; case 21: - if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) { - if (Creature* RWORG = Unit::GetCreature(*me, _RavenousworgGUID)) + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) { RWORG->Kill(Mrfloppy); Mrfloppy->ExitVehicle(); @@ -141,11 +141,11 @@ public: } break; case 22: - if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) { if (Mrfloppy->isDead()) { - if (Creature* RWORG = Unit::GetCreature(*me, _RavenousworgGUID)) + if (Creature* RWORG = ObjectAccessor::GetCreature(*me, _RavenousworgGUID)) RWORG->DisappearAndDie(); me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); Mrfloppy->setDeathState(ALIVE); @@ -167,7 +167,7 @@ public: break; case 27: me->DisappearAndDie(); - if (Creature* Mrfloppy = Unit::GetCreature(*me, _mrfloppyGUID)) + if (Creature* Mrfloppy = ObjectAccessor::GetCreature(*me, _mrfloppyGUID)) Mrfloppy->DisappearAndDie(); break; } diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 93e1f19b195..32b9805470e 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -595,14 +595,14 @@ public: break; case EVENT_INTRO_1: { - if (Creature* Dalfors = me->GetCreature(*me, guidDalfors)) + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) Dalfors->AI()->Talk(DALFORS_SAY_PRE_1); events.ScheduleEvent(EVENT_INTRO_2, 5000); } break; case EVENT_INTRO_2: { - if (Creature* Dalfors = me->GetCreature(*me, guidDalfors)) + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) { Dalfors->SetFacingTo(6.215f); Dalfors->AI()->Talk(DALFORS_SAY_PRE_2); @@ -612,37 +612,37 @@ public: break; case EVENT_INTRO_3: { - if (Creature* Dalfors = me->GetCreature(*me, guidDalfors)) + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) { Dalfors->GetMotionMaster()->MovePoint(0, DalforsPos[2]); Dalfors->SetHomePosition(DalforsPos[2]); } - if (Creature* Priest1 = me->GetCreature(*me, guidPriest[0])) + if (Creature* Priest1 = ObjectAccessor::GetCreature(*me, guidPriest[0])) { Priest1->SetFacingTo(5.7421f); Priest1->SetHomePosition(Priest1Pos[1]); } - if (Creature* Priest2 = me->GetCreature(*me, guidPriest[1])) + if (Creature* Priest2 = ObjectAccessor::GetCreature(*me, guidPriest[1])) { Priest2->SetFacingTo(5.7421f); Priest2->SetHomePosition(Priest2Pos[1]); } - if (Creature* Priest3 = me->GetCreature(*me, guidPriest[2])) + if (Creature* Priest3 = ObjectAccessor::GetCreature(*me, guidPriest[2])) { Priest3->SetFacingTo(5.7421f); Priest3->SetHomePosition(Priest3Pos[1]); } - if (Creature* Mason1 = me->GetCreature(*me, guidMason[0])) + if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) { Mason1->GetMotionMaster()->MovePoint(0, Mason1Pos[2]); Mason1->SetHomePosition(Mason1Pos[2]); } - if (Creature* Mason2 = me->GetCreature(*me, guidMason[1])) + if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) { Mason2->GetMotionMaster()->MovePoint(0, Mason2Pos[2]); Mason2->SetHomePosition(Mason2Pos[2]); } - if (Creature* Mason3 = me->GetCreature(*me, guidMason[2])) + if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) { Mason3->GetMotionMaster()->MovePoint(0, Mason3Pos[2]); Mason3->SetHomePosition(Mason3Pos[2]); @@ -653,17 +653,17 @@ public: break; case EVENT_MASON_ACTION: { - if (Creature* Mason1 = me->GetCreature(*me, guidMason[0])) + if (Creature* Mason1 = ObjectAccessor::GetCreature(*me, guidMason[0])) { Mason1->SetFacingTo(2.8972f); Mason1->AI()->SetData(1, 1); // triggers SAI actions on npc } - if (Creature* Mason2 = me->GetCreature(*me, guidMason[1])) + if (Creature* Mason2 = ObjectAccessor::GetCreature(*me, guidMason[1])) { Mason2->SetFacingTo(3.1241f); Mason2->AI()->SetData(1, 1); // triggers SAI actions on npc } - if (Creature* Mason3 = me->GetCreature(*me, guidMason[2])) + if (Creature* Mason3 = ObjectAccessor::GetCreature(*me, guidMason[2])) { Mason3->SetFacingTo(3.6651f); Mason3->AI()->SetData(1, 1); // triggers SAI actions on npc @@ -674,7 +674,7 @@ public: { if (Creature* LK = GetClosestCreatureWithEntry(me, NPC_LK, 100)) LK->AI()->Talk(LK_TALK_1); - if (Creature* Dalfors = me->GetCreature(*me, guidDalfors)) + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) Dalfors->AI()->Talk(DALFORS_SAY_START); events.ScheduleEvent(EVENT_WAVE_SPAWN, 1000); } @@ -763,7 +763,7 @@ public: } if (PhaseCount == 8) - if (Creature* Halof = me->GetCreature(*me, guidHalof)) + if (Creature* Halof = ObjectAccessor::GetCreature(*me, guidHalof)) if (Halof->isDead()) { DoCast(me, SPELL_CRUSADERS_SPIRE_VICTORY, true); @@ -771,7 +771,7 @@ public: Summons.DespawnEntry(NPC_REANIMATED_CAPTAIN); Summons.DespawnEntry(NPC_SCOURGE_DRUDGE); Summons.DespawnEntry(NPC_HALOF_THE_DEATHBRINGER); - if (Creature* Dalfors = me->GetCreature(*me, guidDalfors)) + if (Creature* Dalfors = ObjectAccessor::GetCreature(*me, guidDalfors)) Dalfors->AI()->Talk(DALFORS_YELL_FINISHED); events.ScheduleEvent(EVENT_ENDED, 10000); } @@ -963,35 +963,35 @@ class npc_margrave_dhakar : public CreatureScript } case EVENT_LK_SAY_1: { - if (Creature* lichKing = Unit::GetCreature(*me, _lichKingGuid)) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _lichKingGuid)) lichKing->AI()->Talk(SAY_LK_1); _events.ScheduleEvent(EVENT_LK_SAY_2, 5000); break; } case EVENT_LK_SAY_2: { - if (Creature* lichKing = Unit::GetCreature(*me, _lichKingGuid)) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _lichKingGuid)) lichKing->AI()->Talk(SAY_LK_2); _events.ScheduleEvent(EVENT_LK_SAY_3, 5000); break; } case EVENT_LK_SAY_3: { - if (Creature* lichKing = Unit::GetCreature(*me, _lichKingGuid)) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _lichKingGuid)) lichKing->AI()->Talk(SAY_LK_3); _events.ScheduleEvent(EVENT_LK_SAY_4, 5000); break; } case EVENT_LK_SAY_4: { - if (Creature* lichKing = Unit::GetCreature(*me, _lichKingGuid)) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _lichKingGuid)) lichKing->AI()->Talk(SAY_LK_4); _events.ScheduleEvent(EVENT_OUTRO, 12000); break; } case EVENT_LK_SAY_5: { - if (Creature* lichKing = Unit::GetCreature(*me, _lichKingGuid)) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _lichKingGuid)) lichKing->AI()->Talk(SAY_LK_5); _events.ScheduleEvent(EVENT_OUTRO, 8000); break; @@ -1001,7 +1001,7 @@ class npc_margrave_dhakar : public CreatureScript if (Creature* olakin = me->FindNearestCreature(NPC_OLAKIN, 50.0f, true)) olakin->AI()->Talk(SAY_OLAKIN_PAY); - if (Creature* lichKing = Unit::GetCreature(*me, _lichKingGuid)) + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _lichKingGuid)) lichKing->DespawnOrUnsummon(0); _events.ScheduleEvent(EVENT_START, 5000); diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp index 78b9a99b2e4..cf8c4cd9b36 100644 --- a/src/server/scripts/Northrend/zone_zuldrak.cpp +++ b/src/server/scripts/Northrend/zone_zuldrak.cpp @@ -91,7 +91,7 @@ public: { if (caster->ToPlayer()->GetQuestStatus(QUEST_TROLLS_IS_GONE_CRAZY) == QUEST_STATUS_INCOMPLETE) { - if (Creature* rageclaw = Unit::GetCreature(*me, _rageclawGUID)) + if (Creature* rageclaw = ObjectAccessor::GetCreature(*me, _rageclawGUID)) { UnlockRageclaw(caster, rageclaw); caster->ToPlayer()->KilledMonster(rageclaw->GetCreatureTemplate(), _rageclawGUID); diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp index 9ab35aa188b..ea877435acf 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -223,7 +223,7 @@ public: summoned->SetDisplayId(soulmodel); summoned->setFaction(me->getFaction()); - if (Unit* target = Unit::GetUnit(*me, soulholder)) + if (Unit* target = ObjectAccessor::GetUnit(*me, soulholder)) { CAST_AI(npc_stolen_soul::npc_stolen_soulAI, summoned->AI())->SetMyClass(soulclass); diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp index bd65cd9fc89..26e9df6620c 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp @@ -92,7 +92,7 @@ public: summoned->SetLevel(me->getLevel()); summoned->AddUnitState(UNIT_STATE_ROOT); - if (Unit* pFocusedTarget = Unit::GetUnit(*me, FocusedTargetGUID)) + if (Unit* pFocusedTarget = ObjectAccessor::GetUnit(*me, FocusedTargetGUID)) summoned->AI()->AttackStart(pFocusedTarget); } } diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.cpp b/src/server/scripts/Outland/BlackTemple/black_temple.cpp index 427265e2562..5edae14d47a 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/black_temple.cpp @@ -155,11 +155,11 @@ public: case EVENT_SET_CHANNELERS: { for (std::list<uint64>::const_iterator itr = bloodmage.begin(); itr != bloodmage.end(); ++itr) - if (Creature* bloodmage = (Unit::GetCreature(*me, *itr))) + if (Creature* bloodmage = (ObjectAccessor::GetCreature(*me, *itr))) bloodmage->CastSpell((Unit*)NULL, SPELL_SUMMON_CHANNEL); for (std::list<uint64>::const_iterator itr = deathshaper.begin(); itr != deathshaper.end(); ++itr) - if (Creature* deathshaper = (Unit::GetCreature(*me, *itr))) + if (Creature* deathshaper = (ObjectAccessor::GetCreature(*me, *itr))) deathshaper->CastSpell((Unit*)NULL, SPELL_SUMMON_CHANNEL); events.ScheduleEvent(EVENT_SET_CHANNELERS, 12000); diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp index 1f8c090230b..0004df68016 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp @@ -150,7 +150,7 @@ public: std::list<HostileReference*>::const_iterator itr = m_threatlist.begin(); for (; itr!= m_threatlist.end(); ++itr) //store the threat list in a different container { - Unit* target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); //only on alive players if (target && target->IsAlive() && target->GetTypeId() == TYPEID_PLAYER) targets.push_back(target); @@ -184,7 +184,7 @@ public: void RevertThreatOnTarget(uint64 guid) { - if (Unit* unit = Unit::GetUnit(*me, guid)) + if (Unit* unit = ObjectAccessor::GetUnit(*me, guid)) { if (DoGetThreat(unit)) DoModifyThreatPercent(unit, -100); diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index f0498d8a5c2..b1c3d607396 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -596,9 +596,9 @@ public: if (Conversation[count].creature == ILLIDAN_STORMRAGE) creature = me; else if (Conversation[count].creature == AKAMA) - creature = (Unit::GetCreature((*me), AkamaGUID)); + creature = (ObjectAccessor::GetCreature((*me), AkamaGUID)); else if (Conversation[count].creature == MAIEV_SHADOWSONG) - creature = (Unit::GetCreature((*me), MaievGUID)); + creature = (ObjectAccessor::GetCreature((*me), MaievGUID)); if (creature) { @@ -831,7 +831,7 @@ public: { if (GlaiveGUID[i]) { - Unit* Glaive = Unit::GetUnit(*me, GlaiveGUID[i]); + Unit* Glaive = ObjectAccessor::GetUnit(*me, GlaiveGUID[i]); if (Glaive) { Glaive->CastSpell(me, SPELL_GLAIVE_RETURNS, false); // Make it look like the Glaive flies back up to us @@ -1437,7 +1437,7 @@ public: std::vector<Unit*> eliteList; for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->GetEntry() == ILLIDARI_ELITE) eliteList.push_back(unit); } @@ -1588,9 +1588,9 @@ public: Unit* Spirit[2] = { NULL, NULL }; if (ChannelCount <= 5) { - Channel = Unit::GetUnit(*me, ChannelGUID); - Spirit[0] = Unit::GetUnit(*me, SpiritGUID[0]); - Spirit[1] = Unit::GetUnit(*me, SpiritGUID[1]); + Channel = ObjectAccessor::GetUnit(*me, ChannelGUID); + Spirit[0] = ObjectAccessor::GetUnit(*me, SpiritGUID[0]); + Spirit[1] = ObjectAccessor::GetUnit(*me, SpiritGUID[1]); if (!Channel || !Spirit[0] || !Spirit[1]) return; } @@ -2007,7 +2007,7 @@ public: // if (IllidanGUID && !SummonedBeams) // { - // if (Unit* Illidan = Unit::GetUnit(*me, IllidanGUID) + // if (Unit* Illidan = ObjectAccessor::GetUnit(*me, IllidanGUID) // { // /// @todo Find proper spells and properly apply 'caged' Illidan effect // } @@ -2068,7 +2068,7 @@ public: void JustDied(Unit* /*killer*/) override { - if (Unit* target = Unit::GetUnit(*me, TargetGUID)) + if (Unit* target = ObjectAccessor::GetUnit(*me, TargetGUID)) target->RemoveAurasDueToSpell(SPELL_PARALYZE); } @@ -2157,7 +2157,7 @@ public: if (!me->EnsureVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND) && !me->EnsureVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND2)) { - if (Creature* illidan = Unit::GetCreature((*me), IllidanGUID))// summon only in 1. phase + if (Creature* illidan = ObjectAccessor::GetCreature((*me), IllidanGUID))// summon only in 1. phase if (CAST_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->Phase == PHASE_NORMAL) me->CastSpell(me->GetVictim(), SPELL_PARASITIC_SHADOWFIEND2, true, 0, 0, IllidanGUID); // do not stack } diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index ac91c2ac034..db3fcea35db 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -245,7 +245,7 @@ public: { if (TargetGUID[i]) { - if (Unit* unit = Unit::GetUnit(*me, TargetGUID[i])) + if (Unit* unit = ObjectAccessor::GetUnit(*me, TargetGUID[i])) unit->CastSpell(unit, SPELL_ATTRACTION, true); TargetGUID[i] = 0; } diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 39edb6b04aa..9b304c3cd7b 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -229,7 +229,7 @@ public: ThreatContainer::StorageType threatlist = target->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit) { DoModifyThreatPercent(unit, -100); @@ -258,7 +258,7 @@ public: Creature* Essence = NULL; if (EssenceGUID) { - Essence = Unit::GetCreature(*me, EssenceGUID); + Essence = ObjectAccessor::GetCreature(*me, EssenceGUID); if (!Essence) { EnterEvadeMode(); @@ -378,7 +378,7 @@ public: void npc_enslaved_soul::npc_enslaved_soulAI::JustDied(Unit* /*killer*/) { if (ReliquaryGUID) - if (Creature* Reliquary = (Unit::GetCreature((*me), ReliquaryGUID))) + if (Creature* Reliquary = (ObjectAccessor::GetCreature((*me), ReliquaryGUID))) ++(CAST_AI(boss_reliquary_of_souls::boss_reliquary_of_soulsAI, Reliquary->AI())->SoulDeathCount); DoCast(me, SPELL_SOUL_RELEASE, true); @@ -454,7 +454,7 @@ public: ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); for (; itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->IsAlive() && (unit->GetTypeId() == TYPEID_PLAYER)) // Only alive players targets.push_back(unit); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 8e5eb5ca888..b59d073c17d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -777,7 +777,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { - if (Creature* summoner = (Unit::GetCreature((*me), summonerGuid))) + if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } @@ -883,7 +883,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { - if (Creature* summoner = (Unit::GetCreature((*me), summonerGuid))) + if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } @@ -973,7 +973,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { - if (Creature* summoner = (Unit::GetCreature((*me), summonerGuid))) + if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } @@ -1053,7 +1053,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { - if (Creature* summoner = (Unit::GetCreature((*me), summonerGuid))) + if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } @@ -1135,7 +1135,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { - if (Creature* summoner = (Unit::GetCreature((*me), summonerGuid))) + if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index 98a349f3606..a705659337f 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -178,7 +178,7 @@ public: ThreatContainer::StorageType::const_iterator i = threatlist.begin(); for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && me->IsWithinMeleeRange(unit)) { if (unit->GetHealth() > health) diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index 35521a783be..0d9537b8b7a 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -95,7 +95,7 @@ public: { DoZoneInCombat(); - Creature* Teron = (Unit::GetCreature((*me), TeronGUID)); + Creature* Teron = (ObjectAccessor::GetCreature((*me), TeronGUID)); if ((Teron) && (!Teron->IsAlive() || Teron->IsInEvadeMode())) Despawn(); } @@ -177,7 +177,7 @@ public: std::list<Unit*> targets; for (; itr != threatlist.end(); ++itr) { - Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->IsAlive()) targets.push_back(unit); } @@ -200,7 +200,7 @@ public: if (CheckTeronTimer <= diff) { - Creature* Teron = (Unit::GetCreature((*me), TeronGUID)); + Creature* Teron = (ObjectAccessor::GetCreature((*me), TeronGUID)); if (!Teron || !Teron->IsAlive() || Teron->IsInEvadeMode()) me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); @@ -324,7 +324,7 @@ public: ThreatContainer::StorageType::const_iterator i = threatlist.begin(); for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && unit->IsAlive()) { float threat = DoGetThreat(unit); @@ -344,7 +344,7 @@ public: Unit* ghost = NULL; if (GhostGUID) - ghost = Unit::GetUnit(*me, GhostGUID); + ghost = ObjectAccessor::GetUnit(*me, GhostGUID); if (ghost && ghost->IsAlive() && ghost->HasAura(SPELL_SHADOW_OF_DEATH)) { /*float x, y, z; @@ -391,7 +391,7 @@ public: Done = true; if (AggroTargetGUID) { - Unit* unit = Unit::GetUnit(*me, AggroTargetGUID); + Unit* unit = ObjectAccessor::GetUnit(*me, AggroTargetGUID); if (unit) AttackStart(unit); diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index 5228f891294..2362f534b05 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -141,7 +141,7 @@ public: if (!SpineTargetGUID) return false; - Unit* target = Unit::GetUnit(*me, SpineTargetGUID); + Unit* target = ObjectAccessor::GetUnit(*me, SpineTargetGUID); if (target && target->HasAura(SPELL_IMPALING_SPINE)) target->RemoveAurasDueToSpell(SPELL_IMPALING_SPINE); SpineTargetGUID=0; diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index 4a4addd253e..8fd9a421a49 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -182,7 +182,7 @@ public: { if (AggroYellTimer <= diff) { - if (Creature* pMember = Creature::GetCreature(*me, Council[YellCounter])) + if (Creature* pMember = ObjectAccessor::GetCreature(*me, Council[YellCounter])) { pMember->AI()->Talk(CouncilAggro[YellCounter].entry); AggroYellTimer = CouncilAggro[YellCounter].timer; @@ -197,7 +197,7 @@ public: { if (EnrageTimer <= diff) { - if (Creature* pMember = Creature::GetCreature(*me, Council[YellCounter])) + if (Creature* pMember = ObjectAccessor::GetCreature(*me, Council[YellCounter])) { pMember->CastSpell(pMember, SPELL_BERSERK, true); pMember->AI()->Talk(CouncilEnrage[YellCounter].entry); @@ -251,7 +251,7 @@ public: Creature* pMember = NULL; for (uint8 i = 0; i < 4; ++i) { - pMember = Unit::GetCreature((*me), Council[i]); + pMember = ObjectAccessor::GetCreature((*me), Council[i]); if (!pMember) continue; @@ -330,7 +330,7 @@ public: return; } - Creature* pMember = (Unit::GetCreature(*me, Council[DeathCount])); + Creature* pMember = (ObjectAccessor::GetCreature(*me, Council[DeathCount])); if (pMember && pMember->IsAlive()) pMember->DealDamage(pMember, pMember->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); ++DeathCount; @@ -347,7 +347,7 @@ public: { if (Council[i]) { - if (Creature* Member = (Unit::GetCreature((*me), Council[i]))) + if (Creature* Member = (ObjectAccessor::GetCreature((*me), Council[i]))) { // This is the evade/death check. if (Member->IsAlive() && !Member->GetVictim()) @@ -407,7 +407,7 @@ struct boss_illidari_councilAI : public ScriptedAI { for (uint8 i = 0; i < 4; ++i) { - if (Unit* unit = Unit::GetUnit(*me, Council[i])) + if (Unit* unit = ObjectAccessor::GetUnit(*me, Council[i])) if (unit != me && unit->GetVictim()) { AttackStart(unit->GetVictim()); @@ -425,7 +425,7 @@ struct boss_illidari_councilAI : public ScriptedAI damage /= 4; for (uint8 i = 0; i < 4; ++i) { - if (Creature* unit = Unit::GetCreature(*me, Council[i])) + if (Creature* unit = ObjectAccessor::GetCreature(*me, Council[i])) if (unit != me && damage < unit->GetHealth()) { unit->ModifyHealth(-int32(damage)); @@ -493,7 +493,7 @@ public: member = urand(1, 3); if (member != 2) // No need to create another pointer to us using Unit::GetUnit - unit = Unit::GetUnit(*me, Council[member]); + unit = ObjectAccessor::GetUnit(*me, Council[member]); return unit; } @@ -507,7 +507,7 @@ public: } for (uint8 i = 0; i < 4; ++i) { - Unit* unit = Unit::GetUnit(*me, Council[i]); + Unit* unit = ObjectAccessor::GetUnit(*me, Council[i]); if (unit) unit->CastSpell(unit, spellid, true, 0, 0, me->GetGUID()); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp index 6d43b0e910c..c6b62ee8de7 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -216,7 +216,7 @@ public: //Only if not incombat check if the event is started if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { - if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) + if (Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) { AttackStart(target); GetAdvisors(); @@ -357,7 +357,7 @@ public: //Only if not incombat check if the event is started if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { - if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) + if (Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) AttackStart(target); } @@ -484,7 +484,7 @@ public: //Only if not incombat check if the event is started if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { - if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) + if (Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) AttackStart(target); } @@ -515,7 +515,7 @@ public: if (Spitfire_Timer <= diff) { DoCast(me, SPELL_SPITFIRE_TOTEM); - if (Unit* SpitfireTotem = Unit::GetUnit(*me, CREATURE_SPITFIRE_TOTEM)) + if (Unit* SpitfireTotem = ObjectAccessor::GetUnit(*me, CREATURE_SPITFIRE_TOTEM)) SpitfireTotem->ToCreature()->AI()->AttackStart(me->GetVictim()); Spitfire_Timer = 60000; @@ -599,7 +599,7 @@ public: //Only if not incombat check if the event is started if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { - if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) + if (Unit* target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) AttackStart(target); } @@ -675,13 +675,13 @@ public: switch (rand()%4) { case 0: - unit = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESS)); + unit = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_KARATHRESS)); break; case 1: - unit = Unit::GetUnit(*me, instance->GetData64(DATA_SHARKKIS)); + unit = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_SHARKKIS)); break; case 2: - unit = Unit::GetUnit(*me, instance->GetData64(DATA_TIDALVESS)); + unit = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_TIDALVESS)); break; case 3: unit = me; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp index c4d21d30328..bcde75584fb 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp @@ -162,7 +162,7 @@ public: { for (uint8 i = 0; i < 2; ++i) { - if (Creature* mob = Unit::GetCreature(*me, beams[i])) + if (Creature* mob = ObjectAccessor::GetCreature(*me, beams[i])) { mob->setDeathState(DEAD); mob->RemoveCorpse(); diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index dbf0c419fad..0745a85bf02 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -207,7 +207,7 @@ public: { if (ShieldGeneratorChannel[i]) { - if (Unit* remo = Unit::GetUnit(*me, ShieldGeneratorChannel[i])) + if (Unit* remo = ObjectAccessor::GetUnit(*me, ShieldGeneratorChannel[i])) { remo->setDeathState(JUST_DIED); ShieldGeneratorChannel[i] = 0; @@ -431,7 +431,7 @@ public: std::list<HostileReference*> t_list = me->getThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - Unit* target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (target && target->IsWithinDistInMap(me, 5)) // if in melee range { inMeleeRange = true; @@ -620,7 +620,7 @@ public: if (me->IsWithinDist3d(MIDDLE_X, MIDDLE_Y, MIDDLE_Z, 3)) DoCast(me, SPELL_SURGE); } - if (Creature* vashj = Unit::GetCreature(*me, VashjGUID)) + if (Creature* vashj = ObjectAccessor::GetCreature(*me, VashjGUID)) if (!vashj->IsInCombat() || CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->Phase != 2 || vashj->isDead()) me->Kill(me); Move = 1000; @@ -662,7 +662,7 @@ public: void JustDied(Unit* /*killer*/) override { - if (Creature* vashj = Unit::GetCreature((*me), instance->GetData64(DATA_LADYVASHJ))) + if (Creature* vashj = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_LADYVASHJ))) CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->EventTaintedElementalDeath(); } @@ -778,7 +778,7 @@ public: if (CheckTimer <= diff) { // check if vashj is death - Unit* Vashj = Unit::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); + Unit* Vashj = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); if (!Vashj || !Vashj->IsAlive() || CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->ToCreature()->AI())->Phase != 3) { // remove @@ -833,7 +833,7 @@ public: { if (CheckTimer <= diff) { - Unit* vashj = Unit::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); + Unit* vashj = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LADYVASHJ)); if (vashj && vashj->IsAlive()) { @@ -865,7 +865,7 @@ public: return true; } - Creature* vashj = Unit::GetCreature((*player), instance->GetData64(DATA_LADYVASHJ)); + Creature* vashj = ObjectAccessor::GetCreature((*player), instance->GetData64(DATA_LADYVASHJ)); if (vashj && (CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->Phase == 2)) { if (GameObject* gObj = targets.GetGOTarget()) @@ -901,7 +901,7 @@ public: } // get and remove channel - if (Unit* channel = Unit::GetCreature(*vashj, CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->ShieldGeneratorChannel[channelIdentifier])) + if (Unit* channel = ObjectAccessor::GetCreature(*vashj, CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->ShieldGeneratorChannel[channelIdentifier])) channel->setDeathState(JUST_DIED); // call Unsummon() instance->SetData(identifier, 1); diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index 462babdc597..cc09952d336 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -112,7 +112,7 @@ public: void JustDied(Unit* /*killer*/) override { - Unit* unit = Unit::GetUnit(*me, victimGUID); + Unit* unit = ObjectAccessor::GetUnit(*me, victimGUID); if (unit && unit->HasAura(SPELL_INSIDIOUS_WHISPER)) unit->RemoveAurasDueToSpell(SPELL_INSIDIOUS_WHISPER); } @@ -141,7 +141,7 @@ public: if (me->EnsureVictim()->GetGUID() != victimGUID) { DoModifyThreatPercent(me->GetVictim(), -100); - Unit* owner = Unit::GetUnit(*me, victimGUID); + Unit* owner = ObjectAccessor::GetUnit(*me, victimGUID); if (owner && owner->IsAlive()) { me->AddThreat(owner, 999999); @@ -249,7 +249,7 @@ public: { for (uint8 i = 0; i < 3; ++i) { - if (Creature* add = Unit::GetCreature(*me, SpellBinderGUID[i])) + if (Creature* add = ObjectAccessor::GetCreature(*me, SpellBinderGUID[i])) add->DisappearAndDie(); float nx = x; @@ -297,7 +297,7 @@ public: uint8 AliveChannelers = 0; for (uint8 i = 0; i < 3; ++i) { - Unit* add = Unit::GetUnit(*me, SpellBinderGUID[i]); + Unit* add = ObjectAccessor::GetUnit(*me, SpellBinderGUID[i]); if (add && add->IsAlive()) ++AliveChannelers; } @@ -350,7 +350,7 @@ public: if (InnderDemon[i]) { //delete creature - Creature* creature = Unit::GetCreature((*me), InnderDemon[i]); + Creature* creature = ObjectAccessor::GetCreature((*me), InnderDemon[i]); if (creature && creature->IsAlive()) { creature->DespawnOrUnsummon(); @@ -368,10 +368,10 @@ public: { if (InnderDemon[i] > 0) { - Creature* unit = Unit::GetCreature((*me), InnderDemon[i]); + Creature* unit = ObjectAccessor::GetCreature((*me), InnderDemon[i]); if (unit && unit->IsAlive()) { - Unit* unit_target = Unit::GetUnit(*unit, unit->AI()->GetGUID(INNER_DEMON_VICTIM)); + Unit* unit_target = ObjectAccessor::GetUnit(*unit, unit->AI()->GetGUID(INNER_DEMON_VICTIM)); if (unit_target && unit_target->IsAlive()) { unit->CastSpell(unit_target, SPELL_CONSUMING_MADNESS, true); @@ -397,7 +397,7 @@ public: //despawn copy if (Demon) { - if (Creature* pDemon = Unit::GetCreature(*me, Demon)) + if (Creature* pDemon = ObjectAccessor::GetCreature(*me, Demon)) pDemon->DespawnOrUnsummon(); } instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, DONE); @@ -518,7 +518,7 @@ public: std::vector<Unit*> TargetList; for (ThreatContainer::StorageType::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr) { - Unit* tempTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* tempTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (tempTarget && tempTarget->GetTypeId() == TYPEID_PLAYER && tempTarget->GetGUID() != me->EnsureVictim()->GetGUID() && TargetList.size()<5) TargetList.push_back(tempTarget); } @@ -701,7 +701,7 @@ public: Earthshock_Timer = urand(5000, 10000); instance->SetData64(DATA_LEOTHERAS_EVENT_STARTER, 0); - Creature* leotheras = Unit::GetCreature(*me, leotherasGUID); + Creature* leotheras = ObjectAccessor::GetCreature(*me, leotherasGUID); if (leotheras && leotheras->IsAlive()) CAST_AI(boss_leotheras_the_blind::boss_leotheras_the_blindAI, leotheras->AI())->CheckChannelers(/*false*/); } @@ -724,7 +724,7 @@ public: { if (leotherasGUID) { - Creature* leotheras = Unit::GetCreature(*me, leotherasGUID); + Creature* leotheras = ObjectAccessor::GetCreature(*me, leotherasGUID); if (leotheras && leotheras->IsAlive()) DoCast(leotheras, BANISH_BEAM); } @@ -739,7 +739,7 @@ public: if (!me->IsInCombat() && instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)) { Unit* victim = NULL; - victim = Unit::GetUnit(*me, instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)); + victim = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)); if (victim) AttackStart(victim); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp index 4f8c9390ba4..7e37c22565a 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp @@ -98,7 +98,7 @@ public: void JustDied(Unit* /*killer*/) override { for (std::list<uint64>::const_iterator i = Striders.begin(); i != Striders.end(); ++i) - if (Creature* strider = Unit::GetCreature(*me, *i)) + if (Creature* strider = ObjectAccessor::GetCreature(*me, *i)) strider->DisappearAndDie(); } @@ -132,7 +132,7 @@ public: { if (LevitatedTarget_Timer <= diff) { - if (Unit* target = Unit::GetUnit(*me, LevitatedTarget)) + if (Unit* target = ObjectAccessor::GetUnit(*me, LevitatedTarget)) { if (!target->HasAura(SPELL_LEVITATE)) { diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp index c1e9d0a2b91..89aad2534f0 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp @@ -530,7 +530,7 @@ public: std::vector<Unit*> target_list; for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); //15 yard radius minimum if (target && target->IsWithinDist(me, 15, false)) target_list.push_back(target); diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index 066772cb0f7..c85a26a25ab 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -118,7 +118,7 @@ class boss_kelidan_the_breaker : public CreatureScript } for (uint8 i=0; i<5; ++i) { - Creature* channeler = Unit::GetCreature(*me, Channelers[i]); + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); if (who && channeler && !channeler->IsInCombat()) channeler->AI()->AttackStart(who); } @@ -128,7 +128,7 @@ class boss_kelidan_the_breaker : public CreatureScript { for (uint8 i=0; i<5; ++i) { - Creature* channeler = Unit::GetCreature(*me, Channelers[i]); + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); if (channeler && channeler->IsAlive()) return; } @@ -147,7 +147,7 @@ class boss_kelidan_the_breaker : public CreatureScript uint8 i; for (i=0; i<5; ++i) { - Creature* channeler = Unit::GetCreature(*me, Channelers[i]); + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); if (channeler && channeler->GetGUID() == channeler1->GetGUID()) break; } @@ -158,7 +158,7 @@ class boss_kelidan_the_breaker : public CreatureScript { for (uint8 i=0; i<5; ++i) { - Creature* channeler = Unit::GetCreature(*me, Channelers[i]); + Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]); if (!channeler || channeler->isDead()) channeler = me->SummonCreature(ENTRY_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000); if (channeler) @@ -313,7 +313,7 @@ class npc_shadowmoon_channeler : public CreatureScript if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) { uint64 channeler = CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me); - if (Unit* channeled = Unit::GetUnit(*me, channeler)) + if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler)) DoCast(channeled, SPELL_CHANNELING); } check_Timer = 5000; diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index 424090c87d0..b15bd18c97c 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -124,7 +124,7 @@ class boss_nazan : public CreatureScript if (flight) // phase 1 - the flight { - Creature* Vazruden = Unit::GetCreature(*me, VazrudenGUID); + Creature* Vazruden = ObjectAccessor::GetCreature(*me, VazrudenGUID); if (Fly_Timer < diff || !(Vazruden && Vazruden->IsAlive() && Vazruden->HealthAbovePct(20))) { flight = false; @@ -300,7 +300,7 @@ class boss_vazruden_the_herald : public CreatureScript { if (summoned) { - Creature* Nazan = Unit::GetCreature(*me, NazanGUID); + Creature* Nazan = ObjectAccessor::GetCreature(*me, NazanGUID); if (!Nazan) Nazan = me->FindNearestCreature(NPC_NAZAN, 5000); if (Nazan) @@ -309,7 +309,7 @@ class boss_vazruden_the_herald : public CreatureScript NazanGUID = 0; } - Creature* Vazruden = Unit::GetCreature(*me, VazrudenGUID); + Creature* Vazruden = ObjectAccessor::GetCreature(*me, VazrudenGUID); if (!Vazruden) Vazruden = me->FindNearestCreature(NPC_VAZRUDEN, 5000); if (Vazruden) @@ -404,8 +404,8 @@ class boss_vazruden_the_herald : public CreatureScript default: // adds do the job now if (check <= diff) { - Creature* Nazan = Unit::GetCreature(*me, NazanGUID); - Creature* Vazruden = Unit::GetCreature(*me, VazrudenGUID); + Creature* Nazan = ObjectAccessor::GetCreature(*me, NazanGUID); + Creature* Vazruden = ObjectAccessor::GetCreature(*me, VazrudenGUID); if ((Nazan && Nazan->IsAlive()) || (Vazruden && Vazruden->IsAlive())) { if ((Nazan && Nazan->GetVictim()) || (Vazruden && Vazruden->GetVictim())) diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index 91aad3c00eb..1bdaf4fc260 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -257,7 +257,7 @@ class boss_magtheridon : public CreatureScript { // to avoid multiclicks from 1 cube if (uint64 guid = Cube[cubeGUID]) - DebuffClicker(Unit::GetUnit(*me, guid)); + DebuffClicker(ObjectAccessor::GetUnit(*me, guid)); Cube[cubeGUID] = clickerGUID; NeedCheckCube = true; } @@ -280,7 +280,7 @@ class boss_magtheridon : public CreatureScript // if not - apply mind exhaustion and delete from clicker's list for (CubeMap::iterator i = Cube.begin(); i != Cube.end(); ++i) { - Unit* clicker = Unit::GetUnit(*me, (*i).second); + Unit* clicker = ObjectAccessor::GetUnit(*me, (*i).second); if (!clicker || !clicker->HasAura(SPELL_SHADOW_GRASP)) { DebuffClicker(clicker); @@ -588,7 +588,7 @@ public: if (instance->GetData(DATA_MAGTHERIDON_EVENT) != IN_PROGRESS) return true; - Creature* Magtheridon =Unit::GetCreature(*go, instance->GetData64(DATA_MAGTHERIDON)); + Creature* Magtheridon =ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_MAGTHERIDON)); if (!Magtheridon || !Magtheridon->IsAlive()) return true; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index 187e5b4993b..88c3041b62c 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -323,7 +323,7 @@ class npc_fel_orc_convert : public CreatureScript { events.ScheduleEvent(EVENT_HEMORRHAGE, 3000); - if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) + if (Creature* Kurse = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) if (me->IsWithinDist(Kurse, 45.0f)) Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_AGGRO); } @@ -333,7 +333,7 @@ class npc_fel_orc_convert : public CreatureScript if (instance->GetBossState(DATA_NETHEKURSE) != IN_PROGRESS) return; - if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) + if (Creature* Kurse = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))) Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_DEATH); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp index 69be4b46eff..b03fc651e12 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp @@ -142,13 +142,13 @@ class boss_warbringer_omrogg : public CreatureScript void Reset() override { - if (Unit* LeftHead = Unit::GetUnit(*me, LeftHeadGUID)) + if (Unit* LeftHead = ObjectAccessor::GetUnit(*me, LeftHeadGUID)) { LeftHead->setDeathState(JUST_DIED); LeftHeadGUID = 0; } - if (Unit* RightHead = Unit::GetUnit(*me, RightHeadGUID)) + if (Unit* RightHead = ObjectAccessor::GetUnit(*me, RightHeadGUID)) { RightHead->setDeathState(JUST_DIED); RightHeadGUID = 0; @@ -172,8 +172,8 @@ class boss_warbringer_omrogg : public CreatureScript void DoYellForThreat() { - Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID); - Creature* RightHead = Unit::GetCreature(*me, RightHeadGUID); + Creature* LeftHead = ObjectAccessor::GetCreature(*me, LeftHeadGUID); + Creature* RightHead = ObjectAccessor::GetCreature(*me, RightHeadGUID); if (!LeftHead || !RightHead) return; @@ -193,7 +193,7 @@ class boss_warbringer_omrogg : public CreatureScript me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - if (Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID)) + if (Creature* LeftHead = ObjectAccessor::GetCreature(*me, LeftHeadGUID)) { iaggro = rand()%3; @@ -221,8 +221,8 @@ class boss_warbringer_omrogg : public CreatureScript void KilledUnit(Unit* /*victim*/) override { - Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID); - Creature* RightHead = Creature::GetCreature(*me, RightHeadGUID); + Creature* LeftHead = ObjectAccessor::GetCreature(*me, LeftHeadGUID); + Creature* RightHead = ObjectAccessor::GetCreature(*me, RightHeadGUID); if (!LeftHead || !RightHead) return; @@ -247,8 +247,8 @@ class boss_warbringer_omrogg : public CreatureScript void JustDied(Unit* /*killer*/) override { - Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID); - Creature* RightHead = Creature::GetCreature(*me, RightHeadGUID); + Creature* LeftHead = ObjectAccessor::GetCreature(*me, LeftHeadGUID); + Creature* RightHead = ObjectAccessor::GetCreature(*me, RightHeadGUID); if (!LeftHead || !RightHead) return; @@ -266,8 +266,8 @@ class boss_warbringer_omrogg : public CreatureScript { Delay_Timer = 3500; - Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID); - Creature* RightHead = Creature::GetCreature(*me, RightHeadGUID); + Creature* LeftHead = ObjectAccessor::GetCreature(*me, LeftHeadGUID); + Creature* RightHead = ObjectAccessor::GetCreature(*me, RightHeadGUID); if (!LeftHead || !RightHead) return; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp index f918038b369..66aa02bbeaf 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp @@ -145,7 +145,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript { for (std::vector<uint64>::const_iterator itr = adds.begin(); itr!= adds.end(); ++itr) { - Creature* creature = Unit::GetCreature(*me, *itr); + Creature* creature = ObjectAccessor::GetCreature(*me, *itr); if (creature && creature->IsAlive()) { creature->GetMotionMaster()->Clear(true); @@ -157,7 +157,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript for (std::vector<uint64>::const_iterator itr = assassins.begin(); itr!= assassins.end(); ++itr) { - Creature* creature = Unit::GetCreature(*me, *itr); + Creature* creature = ObjectAccessor::GetCreature(*me, *itr); if (creature && creature->IsAlive()) { creature->GetMotionMaster()->Clear(true); diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index ead163b3a82..bcc8b0c5a48 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -494,7 +494,7 @@ class npc_ember_of_alar : public CreatureScript me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (instance->GetData(DATA_ALAREVENT) == 2) { - if (Unit* Alar = Unit::GetUnit(*me, instance->GetData64(DATA_ALAR))) + if (Unit* Alar = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ALAR))) { int32 AlarHealth = int32(Alar->GetHealth()) - int32(Alar->CountPctFromMaxHealth(3)); if (AlarHealth > 0) diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index 5f92445f9dd..2cac4a0be1a 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -464,7 +464,7 @@ class npc_solarium_priest : public CreatureScript switch (urand(0, 1)) { case 0: - target = Unit::GetUnit(*me, instance->GetData64(DATA_ASTROMANCER)); + target = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ASTROMANCER)); break; case 1: target = me; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 016e68a4e8d..a24e1d5d34f 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -143,7 +143,7 @@ uint32 m_auiSpellSummonWeapon[]= }; const float CAPERNIAN_DISTANCE = 20.0f; //she casts away from the target -const float KAEL_VISIBLE_RANGE = 50.0f; +//const float KAEL_VISIBLE_RANGE = 50.0f; const float afGravityPos[3] = {795.0f, 0.0f, 70.0f}; @@ -183,7 +183,7 @@ struct advisorbase_ai : public ScriptedAI //reset encounter if (instance->GetData(DATA_KAELTHASEVENT) == 1 || instance->GetData(DATA_KAELTHASEVENT) == 3) - if (Creature* Kaelthas = Unit::GetCreature(*me, instance->GetData64(DATA_KAELTHAS))) + if (Creature* Kaelthas = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KAELTHAS))) Kaelthas->AI()->EnterEvadeMode(); } @@ -262,7 +262,7 @@ struct advisorbase_ai : public ScriptedAI DelayRes_Timer = 0; FakeDeath = false; - Unit* Target = Unit::GetUnit(*me, DelayRes_Target); + Unit* Target = ObjectAccessor::GetUnit(*me, DelayRes_Target); if (!Target) Target = me->GetVictim(); @@ -351,7 +351,7 @@ class boss_kaelthas : public CreatureScript { for (uint8 i = 0; i < MAX_ADVISORS; ++i) { - if (Creature* creature = Unit::GetCreature(*me, m_auiAdvisorGuid[i])) + if (Creature* creature = ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[i])) { creature->Respawn(); creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -468,7 +468,7 @@ class boss_kaelthas : public CreatureScript for (uint8 i = 0; i < MAX_ADVISORS; ++i) { - if (Unit* pAdvisor = Unit::GetUnit(*me, m_auiAdvisorGuid[i])) + if (Unit* pAdvisor = ObjectAccessor::GetUnit(*me, m_auiAdvisorGuid[i])) pAdvisor->Kill(pAdvisor); } } @@ -502,7 +502,7 @@ class boss_kaelthas : public CreatureScript case 1: if (Phase_Timer <= diff) { - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[0])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[0])); if (Advisor) { @@ -520,7 +520,7 @@ class boss_kaelthas : public CreatureScript //Subphase 2 - Start case 2: - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[0])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[0])); if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -536,7 +536,7 @@ class boss_kaelthas : public CreatureScript case 3: if (Phase_Timer <= diff) { - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[1])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[1])); if (Advisor) { @@ -554,7 +554,7 @@ class boss_kaelthas : public CreatureScript //Subphase 3 - Start case 4: - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[1])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[1])); if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -570,7 +570,7 @@ class boss_kaelthas : public CreatureScript case 5: if (Phase_Timer <= diff) { - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[2])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[2])); if (Advisor) { @@ -588,7 +588,7 @@ class boss_kaelthas : public CreatureScript //Subphase 4 - Start case 6: - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[2])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[2])); if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -604,7 +604,7 @@ class boss_kaelthas : public CreatureScript case 7: if (Phase_Timer <= diff) { - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[3])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[3])); if (Advisor) { @@ -623,7 +623,7 @@ class boss_kaelthas : public CreatureScript //End of phase 1 case 8: - Advisor = (Unit::GetCreature(*me, m_auiAdvisorGuid[3])); + Advisor = (ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[3])); if (Advisor && (Advisor->getStandState() == UNIT_STAND_STATE_DEAD)) { @@ -692,7 +692,7 @@ class boss_kaelthas : public CreatureScript Creature* Advisor; for (uint8 i = 0; i < MAX_ADVISORS; ++i) { - Advisor = Unit::GetCreature(*me, m_auiAdvisorGuid[i]); + Advisor = ObjectAccessor::GetCreature(*me, m_auiAdvisorGuid[i]); if (!Advisor) TC_LOG_ERROR("scripts", "SD2: Kael'Thas Advisor %u does not exist. Possibly despawned? Incorrectly Killed?", i); @@ -896,7 +896,7 @@ class boss_kaelthas : public CreatureScript // 1) Kael'thas will portal the whole raid right into his body for (i = threatlist.begin(); i != threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); if (unit && (unit->GetTypeId() == TYPEID_PLAYER)) { //Use work around packet to prevent player from being dropped from combat @@ -917,7 +917,7 @@ class boss_kaelthas : public CreatureScript // 2) At that point he will put a Gravity Lapse debuff on everyone for (i = threatlist.begin(); i != threatlist.end(); ++i) { - if (Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid())) + if (Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) { DoCast(unit, SPELL_KNOCKBACK, true); //Gravity lapse - needs an exception in Spell system to work @@ -949,7 +949,7 @@ class boss_kaelthas : public CreatureScript //Remove flight for (i = threatlist.begin(); i != threatlist.end(); ++i) { - if (Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid())) + if (Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) { //Using packet workaround WorldPacket data(SMSG_MOVE_UNSET_CAN_FLY, 12); @@ -1288,7 +1288,7 @@ class boss_grand_astromancer_capernian : public CreatureScript ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i!= threatlist.end(); ++i) { - Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); + Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); //if in melee range if (unit && unit->IsWithinDistInMap(me, 5)) { diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index 58b5972c25c..634d54ed58b 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -122,7 +122,7 @@ class boss_void_reaver : public CreatureScript std::vector<Unit*> target_list; for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { - target = Unit::GetUnit(*me, (*itr)->getUnitGuid()); + target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (!target) continue; // exclude pets & totems, 18 yard radius minimum diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp index 53727db2f4b..2c15a6dd30d 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp @@ -151,7 +151,7 @@ class boss_high_botanist_freywinn : public CreatureScript { for (std::list<uint64>::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr) { - if (Unit* temp = Unit::GetUnit(*me, *itr)) + if (Unit* temp = ObjectAccessor::GetUnit(*me, *itr)) { if (!temp->IsAlive()) { diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp index c9dd31cdc76..a1335290d5a 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp @@ -97,7 +97,7 @@ class npc_warp_splinter_treant : public CreatureScript { if (WarpGuid && check_Timer <= diff) { - if (Unit* Warp = Unit::GetUnit(*me, WarpGuid)) + if (Unit* Warp = ObjectAccessor::GetUnit(*me, WarpGuid)) { if (me->IsWithinMeleeRange(Warp, 2.5f)) { diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp index 7b9b2be4674..0da70207a04 100644 --- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp +++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp @@ -318,7 +318,7 @@ public: if (type != POINT_MOTION_TYPE || id != 1) return; - if (Creature* helboar = me->GetCreature(*me, helboarGUID)) + if (Creature* helboar = ObjectAccessor::GetCreature(*me, helboarGUID)) { helboar->RemoveCorpse(); DoCast(SPELL_SUMMON_POO); diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp index 8fac7853f26..cb75ee3b2ad 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -243,7 +243,7 @@ public: case 1: if (someplayer) { - Unit* u = Unit::GetUnit(*me, someplayer); + Unit* u = ObjectAccessor::GetUnit(*me, someplayer); if (u && u->GetTypeId() == TYPEID_PLAYER) Talk(EMOTE_START, u); } @@ -795,7 +795,7 @@ public: for (std::list<HostileReference*>::const_iterator itr = AggroList.begin(); itr != AggroList.end(); ++itr) { - if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid())) + if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) { if (unit->GetCreateMana() > 0) UnitsWithMana.push_back(unit); diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 4efa108429a..116beb3d081 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -133,7 +133,7 @@ public: { if (bCanEat && !bIsEating) { - if (Unit* unit = Unit::GetUnit(*me, uiPlayerGUID)) + if (Unit* unit = ObjectAccessor::GetUnit(*me, uiPlayerGUID)) { if (GameObject* go = unit->FindNearestGameObject(GO_CARCASS, 10)) { @@ -273,7 +273,7 @@ public: { if (PlayerGUID) { - Unit* player = Unit::GetUnit(*me, PlayerGUID); + Unit* player = ObjectAccessor::GetUnit(*me, PlayerGUID); if (player) DoCast(player, SPELL_FORCE_OF_NELTHARAKU, true); @@ -1225,7 +1225,7 @@ public: if (TorlothAnim[AnimationCount].creature == 1) { - creature = (Unit::GetCreature(*me, LordIllidanGUID)); + creature = (ObjectAccessor::GetCreature(*me, LordIllidanGUID)); if (!creature) return; @@ -1326,7 +1326,7 @@ public: break; } - if (Creature* LordIllidan = (Unit::GetCreature(*me, LordIllidanGUID))) + if (Creature* LordIllidan = (ObjectAccessor::GetCreature(*me, LordIllidanGUID))) LordIllidan->AI()->EnterEvadeMode(); } }; @@ -1507,7 +1507,7 @@ public: void JustDied(Unit* /*killer*/) override { me->RemoveCorpse(); - if (Creature* LordIllidan = (Unit::GetCreature(*me, LordIllidanGUID))) + if (Creature* LordIllidan = (ObjectAccessor::GetCreature(*me, LordIllidanGUID))) if (LordIllidan) CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, LordIllidan->AI())->LiveCounter(); } @@ -1867,13 +1867,6 @@ public: { npc_shadowmoon_tuber_nodeAI(Creature* creature) : ScriptedAI(creature) { } - void Reset() override - { - tapped = false; - tuberGUID = 0; - resetTimer = 60000; - } - void SetData(uint32 id, uint32 data) override { if (id == TYPE_BOAR && data == DATA_BOAR) @@ -1884,49 +1877,23 @@ public: // Despawn the tuber if (GameObject* tuber = me->FindNearestGameObject(GO_SHADOWMOON_TUBER_MOUND, 5.0f)) { - tuberGUID = tuber->GetGUID(); - // @Workaround: find how to properly despawn the GO - tuber->SetPhaseMask(2, true); + tuber->SetLootState(GO_JUST_DEACTIVATED); + me->DespawnOrUnsummon(); } } } void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override { - if (!tapped && spell->Id == SPELL_WHISTLE) + if (spell->Id == SPELL_WHISTLE) { if (Creature* boar = me->FindNearestCreature(NPC_BOAR_ENTRY, 30.0f)) { - // Disable trigger and force nearest boar to walk to him - tapped = true; boar->SetWalk(false); boar->GetMotionMaster()->MovePoint(POINT_TUBER, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); } } } - - void UpdateAI(uint32 diff) override - { - if (tapped) - { - if (resetTimer <= diff) - { - // Respawn the tuber - if (tuberGUID) - if (GameObject* tuber = GameObject::GetGameObject(*me, tuberGUID)) - // @Workaround: find how to properly respawn the GO - tuber->SetPhaseMask(1, true); - - Reset(); - } - else - resetTimer -= diff; - } - } - private: - bool tapped; - uint64 tuberGUID; - uint32 resetTimer; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 77a4faa7e8c..4c72d790059 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -509,7 +509,7 @@ class spell_gen_break_shield: public SpellScriptLoader class spell_gen_break_shield_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_break_shield_SpellScript) + PrepareSpellScript(spell_gen_break_shield_SpellScript); void HandleScriptEffect(SpellEffIndex effIndex) { @@ -671,7 +671,7 @@ class spell_gen_chaos_blast : public SpellScriptLoader class spell_gen_chaos_blast_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_chaos_blast_SpellScript) + PrepareSpellScript(spell_gen_chaos_blast_SpellScript); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -895,7 +895,7 @@ class spell_gen_count_pct_from_max_hp : public SpellScriptLoader class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript) + PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript); public: spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { } @@ -1446,6 +1446,7 @@ class spell_gen_elune_candle : public SpellScriptLoader class spell_gen_elune_candle_SpellScript : public SpellScript { PrepareSpellScript(spell_gen_elune_candle_SpellScript); + bool Validate(SpellInfo const* /*spellInfo*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) || @@ -1511,7 +1512,7 @@ class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader class spell_gen_gadgetzan_transporter_backfire_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript) + PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -1612,7 +1613,7 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader class spell_gen_gnomish_transporter_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript) + PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript); bool Validate(SpellInfo const* /*spellInfo*/) override { @@ -2093,7 +2094,7 @@ class spell_gen_mounted_charge: public SpellScriptLoader class spell_gen_mounted_charge_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_mounted_charge_SpellScript) + PrepareSpellScript(spell_gen_mounted_charge_SpellScript); void HandleScriptEffect(SpellEffIndex effIndex) { @@ -2794,7 +2795,7 @@ class spell_gen_parachute_ic : public SpellScriptLoader class spell_gen_parachute_ic_AuraScript : public AuraScript { - PrepareAuraScript(spell_gen_parachute_ic_AuraScript) + PrepareAuraScript(spell_gen_parachute_ic_AuraScript); void HandleTriggerSpell(AuraEffect const* /*aurEff*/) { @@ -2842,30 +2843,28 @@ class spell_gen_pet_summoned : public SpellScriptLoader if (player->GetLastPetNumber()) { PetType newPetType = (player->getClass() == CLASS_HUNTER) ? HUNTER_PET : SUMMON_PET; - if (Pet* newPet = new Pet(player, newPetType)) + Pet* newPet = new Pet(player, newPetType); + if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true)) { - if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true)) - { - // revive the pet if it is dead - if (newPet->getDeathState() == DEAD) - newPet->setDeathState(ALIVE); + // revive the pet if it is dead + if (newPet->getDeathState() == DEAD) + newPet->setDeathState(ALIVE); - newPet->SetFullHealth(); - newPet->SetPower(newPet->getPowerType(), newPet->GetMaxPower(newPet->getPowerType())); + newPet->SetFullHealth(); + newPet->SetPower(newPet->getPowerType(), newPet->GetMaxPower(newPet->getPowerType())); - switch (newPet->GetEntry()) - { - case NPC_DOOMGUARD: - case NPC_INFERNAL: - newPet->SetEntry(NPC_IMP); - break; - default: - break; - } + switch (newPet->GetEntry()) + { + case NPC_DOOMGUARD: + case NPC_INFERNAL: + newPet->SetEntry(NPC_IMP); + break; + default: + break; } - else - delete newPet; } + else + delete newPet; } } @@ -3123,7 +3122,7 @@ class spell_gen_spectator_cheer_trigger : public SpellScriptLoader class spell_gen_spectator_cheer_trigger_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript) + PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript); void HandleDummy(SpellEffIndex /*effIndex*/) { @@ -3615,7 +3614,7 @@ class spell_gen_vendor_bark_trigger : public SpellScriptLoader class spell_gen_vendor_bark_trigger_SpellScript : public SpellScript { - PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript) + PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript); void HandleDummy(SpellEffIndex /* effIndex */) { diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp index dc0c70975dd..85bf85fa2d2 100644 --- a/src/server/scripts/Spells/spell_holiday.cpp +++ b/src/server/scripts/Spells/spell_holiday.cpp @@ -296,7 +296,7 @@ class spell_pilgrims_bounty_buff_food : public SpellScriptLoader class spell_pilgrims_bounty_buff_food_AuraScript : public AuraScript { - PrepareAuraScript(spell_pilgrims_bounty_buff_food_AuraScript) + PrepareAuraScript(spell_pilgrims_bounty_buff_food_AuraScript); private: uint32 const _triggeredSpellId; diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 2739a8453df..725312eafce 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -744,8 +744,13 @@ class spell_hun_sniper_training : public SpellScriptLoader { Unit* target = GetTarget(); uint32 spellId = SPELL_HUNTER_SNIPER_TRAINING_BUFF_R1 + GetId() - SPELL_HUNTER_SNIPER_TRAINING_R1; - if (!target->HasAura(spellId)) - target->CastSpell(target, spellId, true, 0, aurEff); + target->CastSpell(target, spellId, true, 0, aurEff); + if (Player* playerTarget = GetUnitOwner()->ToPlayer()) + { + int32 baseAmount = aurEff->GetBaseAmount(); + int32 amount = playerTarget->CalculateSpellDamage(playerTarget, GetSpellInfo(), aurEff->GetEffIndex(), &baseAmount); + GetEffect(EFFECT_0)->SetAmount(amount); + } } } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index be3b48b114d..a17d7dce2ea 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -2231,7 +2231,8 @@ class spell_item_nitro_boots : public SpellScriptLoader void HandleDummy(SpellEffIndex /* effIndex */) { Unit* caster = GetCaster(); - caster->CastSpell(caster, roll_chance_i(95) ? SPELL_NITRO_BOOTS_SUCCESS : SPELL_NITRO_BOOTS_BACKFIRE, true, GetCastItem()); + bool success = caster->GetMap()->IsDungeon() || roll_chance_i(95); + caster->CastSpell(caster, success ? SPELL_NITRO_BOOTS_SUCCESS : SPELL_NITRO_BOOTS_BACKFIRE, true, GetCastItem()); } void Register() override diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index bf4f1b77a19..447cb645e76 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -866,8 +866,8 @@ class spell_pal_improved_aura : public SpellScriptLoader void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); - if (!target->GetOwnedAura(_spellId)) - target->CastSpell(target, _spellId, true); + GetTarget()->RemoveOwnedAura(_spellId, GetCasterGUID()); // need to remove to reapply spellmods + target->CastSpell(target, _spellId, true); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index f96a30c903a..dea67b5222d 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -205,7 +205,7 @@ class spell_pri_divine_hymn : public SpellScriptLoader void Register() override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_divine_hymn_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); } }; @@ -336,7 +336,7 @@ class spell_pri_hymn_of_hope : public SpellScriptLoader void Register() override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_hymn_of_hope_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_hymn_of_hope_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ALLY); } }; diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 590cad7007f..61ff79c505e 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -775,7 +775,7 @@ class spell_sha_lava_lash : public SpellScriptLoader class spell_sha_lava_lash_SpellScript : public SpellScript { - PrepareSpellScript(spell_sha_lava_lash_SpellScript) + PrepareSpellScript(spell_sha_lava_lash_SpellScript); bool Load() override { diff --git a/src/server/scripts/World/areatrigger_scripts.cpp b/src/server/scripts/World/areatrigger_scripts.cpp index 73093037689..fb438c38efb 100644 --- a/src/server/scripts/World/areatrigger_scripts.cpp +++ b/src/server/scripts/World/areatrigger_scripts.cpp @@ -461,11 +461,11 @@ public: if (player->GetQuestStatus(QUEST_THE_LONESOME_WATCHER) != QUEST_STATUS_INCOMPLETE) return false; - Creature* stormforgedMonitor = Creature::GetCreature(*player, stormforgedMonitorGUID); + Creature* stormforgedMonitor = ObjectAccessor::GetCreature(*player, stormforgedMonitorGUID); if (stormforgedMonitor) return false; - Creature* stormforgedEradictor = Creature::GetCreature(*player, stormforgedEradictorGUID); + Creature* stormforgedEradictor = ObjectAccessor::GetCreature(*player, stormforgedEradictorGUID); if (stormforgedEradictor) return false; diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 362c02e1af5..950b4cd10e9 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -781,4 +781,4 @@ void AddSC_emerald_dragons() // dragon spellscripts new spell_dream_fog_sleep(); new spell_mark_of_nature(); -}; +} diff --git a/src/server/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp index 416cab8efcd..21a81d37868 100644 --- a/src/server/scripts/World/guards.cpp +++ b/src/server/scripts/World/guards.cpp @@ -282,7 +282,7 @@ public: { if (exileTimer <= diff) { - if (Unit* temp = Unit::GetUnit(*me, playerGUID)) + if (Unit* temp = ObjectAccessor::GetUnit(*me, playerGUID)) { temp->CastSpell(temp, SPELL_EXILE, true); temp->CastSpell(temp, SPELL_BANISH_TELEPORT, true); @@ -347,7 +347,7 @@ public: { if (exileTimer <= diff) { - if (Unit* temp = Unit::GetUnit(*me, playerGUID)) + if (Unit* temp = ObjectAccessor::GetUnit(*me, playerGUID)) { temp->CastSpell(temp, SPELL_EXILE, true); temp->CastSpell(temp, SPELL_BANISH_TELEPORT, true); diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 891ffd83628..bb7da1b7042 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -175,7 +175,7 @@ public: Creature* GetSummonedGuard() { - Creature* creature = Unit::GetCreature(*me, SpawnedGUID); + Creature* creature = ObjectAccessor::GetCreature(*me, SpawnedGUID); if (creature && creature->IsAlive()) return creature; @@ -671,7 +671,7 @@ public: std::list<uint64>::const_iterator itr; for (itr = Patients.begin(); itr != Patients.end(); ++itr) { - if (Creature* patient = Unit::GetCreature((*me), *itr)) + if (Creature* patient = ObjectAccessor::GetCreature((*me), *itr)) patient->setDeathState(JUST_DIED); } } @@ -768,7 +768,7 @@ public: if (player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE) if (DoctorGUID) - if (Creature* doctor = Unit::GetCreature(*me, DoctorGUID)) + if (Creature* doctor = ObjectAccessor::GetCreature(*me, DoctorGUID)) CAST_AI(npc_doctor::npc_doctorAI, doctor->AI())->PatientSaved(me, player, Coord); //make not selectable @@ -814,7 +814,7 @@ public: me->SetFlag(UNIT_DYNAMIC_FLAGS, 32); if (DoctorGUID) - if (Creature* doctor = Unit::GetCreature((*me), DoctorGUID)) + if (Creature* doctor = ObjectAccessor::GetCreature((*me), DoctorGUID)) CAST_AI(npc_doctor::npc_doctorAI, doctor->AI())->PatientDied(Coord); } } @@ -1064,7 +1064,7 @@ public: { if (RunAwayTimer <= diff) { - if (Unit* unit = Unit::GetUnit(*me, CasterGUID)) + if (Unit* unit = ObjectAccessor::GetUnit(*me, CasterGUID)) { switch (me->GetEntry()) { @@ -2319,7 +2319,7 @@ public: { if (jumpTimer <= diff) { - if (Unit* rabbit = Unit::GetUnit(*me, rabbitGUID)) + if (Unit* rabbit = ObjectAccessor::GetUnit(*me, rabbitGUID)) DoCast(rabbit, SPELL_SPRING_RABBIT_JUMP); jumpTimer = urand(5000, 10000); } else jumpTimer -= diff; diff --git a/src/server/shared/Containers.h b/src/server/shared/Containers.h index d6ba98e4ed4..9121fbe2a97 100644 --- a/src/server/shared/Containers.h +++ b/src/server/shared/Containers.h @@ -64,6 +64,34 @@ namespace Trinity std::advance(it, urand(0, container.size() - 1)); return *it; } + + /** + * @fn bool Trinity::Containers::Intersects(Iterator first1, Iterator last1, Iterator first2, Iterator last2) + * + * @brief Checks if two SORTED containers have a common element + * + * @param first1 Iterator pointing to start of the first container + * @param last1 Iterator pointing to end of the first container + * @param first2 Iterator pointing to start of the second container + * @param last2 Iterator pointing to end of the second container + * + * @return true if containers have a common element, false otherwise. + */ + template<class Iterator1, class Iterator2> + bool Intersects(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) + { + while (first1 != last1 && first2 != last2) + { + if (*first1 < *first2) + ++first1; + else if (*first2 < *first1) + ++first2; + else + return true; + } + + return false; + } } //! namespace Containers } diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h index c60458323f7..3665a388854 100644 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/shared/Database/DatabaseWorkerPool.h @@ -49,8 +49,10 @@ class DatabaseWorkerPool { public: /* Activity state */ - DatabaseWorkerPool() : _queue(new ACE_Activation_Queue()), _connectionInfo(NULL) + DatabaseWorkerPool() : _connectionInfo(NULL) { + _messageQueue = new ACE_Message_Queue<ACE_SYNCH>(8 * 1024 * 1024, 8 * 1024 * 1024); + _queue = new ACE_Activation_Queue(_messageQueue); memset(_connectionCount, 0, sizeof(_connectionCount)); _connections.resize(IDX_SIZE); @@ -131,6 +133,7 @@ class DatabaseWorkerPool //! Deletes the ACE_Activation_Queue object and its underlying ACE_Message_Queue delete _queue; + delete _messageQueue; TC_LOG_INFO("sql.driver", "All connections on DatabasePool '%s' closed.", GetDatabaseName()); @@ -520,6 +523,7 @@ class DatabaseWorkerPool IDX_SIZE }; + ACE_Message_Queue<ACE_SYNCH>* _messageQueue; //! Message Queue used by ACE_Activation_Queue ACE_Activation_Queue* _queue; //! Queue shared by async worker threads. std::vector< std::vector<T*> > _connections; uint32 _connectionCount[2]; //! Counter of MySQL connections; diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index bc002668b3b..dc9bda62bfb 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -250,13 +250,13 @@ void Log::ReadLoggersFromConfig() AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE); appenders[appender->getId()] = appender; - Logger& rootLogger = loggers[LOGGER_ROOT]; - rootLogger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR); - rootLogger.addAppender(appender->getId(), appender); + Logger& logger = loggers[LOGGER_ROOT]; + logger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR); + logger.addAppender(appender->getId(), appender); - Logger& serverLogger = loggers["server"]; - serverLogger.Create("server", LOG_LEVEL_INFO); - serverLogger.addAppender(appender->getId(), appender); + logger = loggers["server"]; + logger.Create("server", LOG_LEVEL_ERROR); + logger.addAppender(appender->getId(), appender); } } @@ -267,7 +267,7 @@ void Log::vlog(std::string const& filter, LogLevel level, char const* str, va_li write(new LogMessage(level, filter, text)); } -void Log::write(LogMessage* msg) +void Log::write(LogMessage* msg) const { Logger const* logger = GetLoggerByType(msg->type); msg->text.append("\n"); @@ -376,7 +376,6 @@ void Log::Close() delete worker; worker = NULL; loggers.clear(); - cachedLoggers.clear(); for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) { delete it->second; diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h index 5fa638e2f40..a118e6e8773 100644 --- a/src/server/shared/Logging/Log.h +++ b/src/server/shared/Logging/Log.h @@ -35,7 +35,6 @@ class Log friend class ACE_Singleton<Log, ACE_Thread_Mutex>; typedef std::unordered_map<std::string, Logger> LoggerMap; - typedef std::unordered_map<std::string, Logger const*> CachedLoggerContainer; private: Log(); @@ -44,7 +43,7 @@ class Log public: void LoadFromConfig(); void Close(); - bool ShouldLog(std::string const& type, LogLevel level); + bool ShouldLog(std::string const& type, LogLevel level) const; bool SetLogLevel(std::string const& name, char const* level, bool isLogger = true); void outMessage(std::string const& f, LogLevel level, char const* str, ...) ATTR_PRINTF(4, 5); @@ -57,9 +56,9 @@ class Log private: static std::string GetTimestampStr(); void vlog(std::string const& f, LogLevel level, char const* str, va_list argptr); - void write(LogMessage* msg); + void write(LogMessage* msg) const; - Logger const* GetLoggerByType(std::string const& type); + Logger const* GetLoggerByType(std::string const& type) const; Appender* GetAppenderByName(std::string const& name); uint8 NextAppenderId(); void CreateAppenderFromConfig(std::string const& name); @@ -69,7 +68,6 @@ class Log AppenderMap appenders; LoggerMap loggers; - CachedLoggerContainer cachedLoggers; uint8 AppenderId; std::string m_logsDir; @@ -78,37 +76,29 @@ class Log LogWorker* worker; }; -inline Logger const* Log::GetLoggerByType(std::string const& originalType) +inline Logger const* Log::GetLoggerByType(std::string const& type) const { - // Check if already cached - CachedLoggerContainer::const_iterator itCached = cachedLoggers.find(originalType); - if (itCached != cachedLoggers.end()) - return itCached->second; - - Logger const* logger = NULL; - std::string type(originalType); - - do - { - // Search for the logger "type.subtype" - LoggerMap::const_iterator it = loggers.find(type); - if (it == loggers.end()) - { - // Search for the logger "type", if our logger contains '.', otherwise search for LOGGER_ROOT - size_t found = type.find_last_of("."); - type = found != std::string::npos ? type.substr(0, found) : LOGGER_ROOT; - } - else - logger = &(it->second); - } - while (!logger); - - cachedLoggers[originalType] = logger; - return logger; + LoggerMap::const_iterator it = loggers.find(type); + if (it != loggers.end()) + return &(it->second); + + if (type == LOGGER_ROOT) + return NULL; + + std::string parentLogger = LOGGER_ROOT; + size_t found = type.find_last_of("."); + if (found != std::string::npos) + parentLogger = type.substr(0,found); + + return GetLoggerByType(parentLogger); } -inline bool Log::ShouldLog(std::string const& type, LogLevel level) +inline bool Log::ShouldLog(std::string const& type, LogLevel level) const { + // TODO: Use cache to store "Type.sub1.sub2": "Type" equivalence, should + // Speed up in cases where requesting "Type.sub1.sub2" but only configured + // Logger "Type" + Logger const* logger = GetLoggerByType(type); if (!logger) return false; diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp index b8cb5215665..f446592e922 100644 --- a/src/server/shared/Packets/ByteBuffer.cpp +++ b/src/server/shared/Packets/ByteBuffer.cpp @@ -27,11 +27,10 @@ ByteBufferPositionException::ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize) { std::ostringstream ss; - ACE_Stack_Trace trace; ss << "Attempted to " << (add ? "put" : "get") << " value with size: " << valueSize << " in ByteBuffer (pos: " << pos << " size: " << size - << ")\n\n" << trace.c_str(); + << ")"; message().assign(ss.str()); } @@ -40,12 +39,10 @@ ByteBufferSourceException::ByteBufferSourceException(size_t pos, size_t size, size_t valueSize) { std::ostringstream ss; - ACE_Stack_Trace trace; ss << "Attempted to put a " << (valueSize > 0 ? "NULL-pointer" : "zero-sized value") - << " in ByteBuffer (pos: " << pos << " size: " << size << ")\n\n" - << trace.c_str(); + << " in ByteBuffer (pos: " << pos << " size: " << size << ")"; message().assign(ss.str()); } diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index bc46b87fa27..9f766a72d19 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -31,6 +31,7 @@ #include <vector> #include <cstring> #include <time.h> +#include <math.h> // Root of ByteBuffer exception hierarchy class ByteBufferException : public std::exception @@ -241,12 +242,16 @@ class ByteBuffer ByteBuffer &operator>>(float &value) { value = read<float>(); + if (!std::isfinite(value)) + throw ByteBufferException(); return *this; } ByteBuffer &operator>>(double &value) { value = read<double>(); + if (!std::isfinite(value)) + throw ByteBufferException(); return *this; } @@ -377,9 +382,19 @@ class ByteBuffer return *this; } - uint8 * contents() { return &_storage[0]; } + uint8 * contents() + { + if (_storage.empty()) + throw ByteBufferException(); + return &_storage[0]; + } - const uint8 *contents() const { return &_storage[0]; } + const uint8 *contents() const + { + if (_storage.empty()) + throw ByteBufferException(); + return &_storage[0]; + } size_t size() const { return _storage.size(); } bool empty() const { return _storage.empty(); } diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 19112d84266..7832cef18de 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -906,7 +906,7 @@ namespace MMAP float p0[3], p1[3]; uint32 mid, tx, ty; float size; - if (sscanf(buf, "%d %d,%d (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty, + if (sscanf(buf, "%u %u,%u (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty, &p0[0], &p0[1], &p0[2], &p1[0], &p1[1], &p1[2], &size) != 10) continue; |