diff options
84 files changed, 334 insertions, 312 deletions
diff --git a/sql/updates/world/2014_08_06_00_world_gameobject.sql b/sql/updates/world/2014_08_06_00_world_gameobject.sql new file mode 100644 index 00000000000..0128071ae65 --- /dev/null +++ b/sql/updates/world/2014_08_06_00_world_gameobject.sql @@ -0,0 +1,2 @@ +UPDATE `gameobject` SET `spawntimesecs`=-60 WHERE `guid`=46424; +UPDATE `event_scripts` SET `datalong2`=60 WHERE `id`=466; diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 701792293de..f26c0342654 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -104,6 +104,7 @@ int main(int argc, char** argv) if (sRealmList->size() == 0) { TC_LOG_ERROR("server.authserver", "No valid realms specified."); + StopDB(); return 1; } @@ -112,6 +113,7 @@ int main(int argc, char** argv) if (port < 0 || port > 0xFFFF) { TC_LOG_ERROR("server.authserver", "Specified port out of allowed range (1-65535)"); + StopDB(); return 1; } diff --git a/src/server/authserver/Realms/RealmList.cpp b/src/server/authserver/Realms/RealmList.cpp index c8369273331..8f11d3882ce 100644 --- a/src/server/authserver/Realms/RealmList.cpp +++ b/src/server/authserver/Realms/RealmList.cpp @@ -97,8 +97,10 @@ void RealmList::UpdateRealms(bool init) uint32 realmId = fields[0].GetUInt32(); std::string name = fields[1].GetString(); boost::asio::ip::tcp::resolver::query externalAddressQuery(ip::tcp::v4(), fields[2].GetString(), ""); - boost::asio::ip::tcp::resolver::iterator endPoint = _resolver->resolve(externalAddressQuery); - if (endPoint == end) + + boost::system::error_code ec; + boost::asio::ip::tcp::resolver::iterator endPoint = _resolver->resolve(externalAddressQuery, ec); + if (endPoint == end || ec) { TC_LOG_ERROR("server.authserver", "Could not resolve address %s", fields[2].GetString().c_str()); return; @@ -107,8 +109,8 @@ void RealmList::UpdateRealms(bool init) ip::address externalAddress = (*endPoint).endpoint().address(); boost::asio::ip::tcp::resolver::query localAddressQuery(ip::tcp::v4(), fields[3].GetString(), ""); - endPoint = _resolver->resolve(localAddressQuery); - if (endPoint == end) + endPoint = _resolver->resolve(localAddressQuery, ec); + if (endPoint == end || ec) { TC_LOG_ERROR("server.authserver", "Could not resolve address %s", fields[3].GetString().c_str()); return; @@ -117,8 +119,8 @@ void RealmList::UpdateRealms(bool init) ip::address localAddress = (*endPoint).endpoint().address(); boost::asio::ip::tcp::resolver::query localSubmaskQuery(ip::tcp::v4(), fields[4].GetString(), ""); - endPoint = _resolver->resolve(localSubmaskQuery); - if (endPoint == end) + endPoint = _resolver->resolve(localSubmaskQuery, ec); + if (endPoint == end || ec) { TC_LOG_ERROR("server.authserver", "Could not resolve address %s", fields[4].GetString().c_str()); return; diff --git a/src/server/authserver/Server/AuthSession.h b/src/server/authserver/Server/AuthSession.h index 14129d76fd8..5a05ee6f8e9 100644 --- a/src/server/authserver/Server/AuthSession.h +++ b/src/server/authserver/Server/AuthSession.h @@ -37,7 +37,8 @@ class AuthSession : public Socket<AuthSession, ByteBuffer> public: static std::unordered_map<uint8, AuthHandler> InitHandlers(); - AuthSession(tcp::socket&& socket) : Socket(std::move(socket), 1) + AuthSession(tcp::socket&& socket) : Socket(std::move(socket), 1), + _isAuthenticated(false), _build(0), _expversion(0), _accountSecurityLevel(SEC_PLAYER) { N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7"); g.SetDword(7); diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index c9f7f342183..42a849354ef 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -25,6 +25,15 @@ #include "InstanceScript.h" #define CAST_AI(a, b) (dynamic_cast<a*>(b)) +#define ENSURE_AI(a,b) (EnsureAI<a>(b)) + +template<class T, class U> +T* EnsureAI(U* ai) +{ + T* cast_ai = dynamic_cast<T*>(ai); + ASSERT(cast_ai); + return cast_ai; +}; class InstanceScript; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 02298684584..b06ee8613e9 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -519,7 +519,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u mana < spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask())) _allowMove = true; - CAST_AI(SmartAI, me->AI())->SetCombatMove(_allowMove); + ENSURE_AI(SmartAI, me->AI())->SetCombatMove(_allowMove); } me->CastSpell((*itr)->ToUnit(), e.action.cast.spell, (e.action.cast.flags & SMARTCAST_TRIGGERED) != 0); @@ -707,7 +707,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetAutoAttack(e.action.autoAttack.attack != 0); + ENSURE_AI(SmartAI, me->AI())->SetAutoAttack(e.action.autoAttack.attack != 0); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_AUTO_ATTACK: Creature: %u bool on = %u", me->GetGUIDLow(), e.action.autoAttack.attack); break; @@ -718,7 +718,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; bool move = e.action.combatMove.move != 0; - CAST_AI(SmartAI, me->AI())->SetCombatMove(move); + ENSURE_AI(SmartAI, me->AI())->SetCombatMove(move); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_ALLOW_COMBAT_MOVEMENT: Creature %u bool on = %u", me->GetGUIDLow(), e.action.combatMove.move); break; @@ -817,7 +817,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u ObjectList* targets = GetTargets(e, unit); if (!targets) { - CAST_AI(SmartAI, me->AI())->StopFollow(); + ENSURE_AI(SmartAI, me->AI())->StopFollow(); break; } @@ -825,7 +825,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { if (IsUnit(*itr)) { - CAST_AI(SmartAI, me->AI())->SetFollow((*itr)->ToUnit(), (float)e.action.follow.dist, (float)e.action.follow.angle, e.action.follow.credit, e.action.follow.entry, e.action.follow.creditType); + ENSURE_AI(SmartAI, me->AI())->SetFollow((*itr)->ToUnit(), (float)e.action.follow.dist, (float)e.action.follow.angle, e.action.follow.credit, e.action.follow.entry, e.action.follow.creditType); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_FOLLOW: Creature %u following target %u", me->GetGUIDLow(), (*itr)->GetGUIDLow()); break; @@ -1035,8 +1035,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if ((*itr)->ToUnit()->IsAlive() && IsSmart((*itr)->ToCreature())) { - CAST_AI(SmartAI, (*itr)->ToCreature()->AI())->SetDespawnTime(e.action.forceDespawn.delay + 1); // Next tick - CAST_AI(SmartAI, (*itr)->ToCreature()->AI())->StartDespawn(); + ENSURE_AI(SmartAI, (*itr)->ToCreature()->AI())->SetDespawnTime(e.action.forceDespawn.delay + 1); // Next tick + ENSURE_AI(SmartAI, (*itr)->ToCreature()->AI())->StartDespawn(); } else (*itr)->ToCreature()->DespawnOrUnsummon(e.action.forceDespawn.delay); @@ -1320,7 +1320,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly != 0); + ENSURE_AI(SmartAI, me->AI())->SetFly(e.action.setFly.fly != 0); break; } case SMART_ACTION_SET_RUN: @@ -1328,7 +1328,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetRun(e.action.setRun.run != 0); + ENSURE_AI(SmartAI, me->AI())->SetRun(e.action.setRun.run != 0); break; } case SMART_ACTION_SET_SWIM: @@ -1336,7 +1336,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->SetSwim(e.action.setSwim.swim != 0); + ENSURE_AI(SmartAI, me->AI())->SetSwim(e.action.setSwim.swim != 0); break; } case SMART_ACTION_WP_START: @@ -1350,12 +1350,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u ObjectList* targets = GetTargets(e, unit); StoreTargetList(targets, SMART_ESCORT_TARGETS); me->SetReactState((ReactStates)e.action.wpStart.reactState); - CAST_AI(SmartAI, me->AI())->StartPath(run, entry, repeat, unit); + ENSURE_AI(SmartAI, me->AI())->StartPath(run, entry, repeat, unit); uint32 quest = e.action.wpStart.quest; uint32 DespawnTime = e.action.wpStart.despawnTime; - CAST_AI(SmartAI, me->AI())->mEscortQuestID = quest; - CAST_AI(SmartAI, me->AI())->SetDespawnTime(DespawnTime); + ENSURE_AI(SmartAI, me->AI())->mEscortQuestID = quest; + ENSURE_AI(SmartAI, me->AI())->SetDespawnTime(DespawnTime); break; } case SMART_ACTION_WP_PAUSE: @@ -1364,7 +1364,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; uint32 delay = e.action.wpPause.delay; - CAST_AI(SmartAI, me->AI())->PausePath(delay, e.GetEventType() == SMART_EVENT_WAYPOINT_REACHED ? false : true); + ENSURE_AI(SmartAI, me->AI())->PausePath(delay, e.GetEventType() == SMART_EVENT_WAYPOINT_REACHED ? false : true); break; } case SMART_ACTION_WP_STOP: @@ -1375,7 +1375,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u uint32 DespawnTime = e.action.wpStop.despawnTime; uint32 quest = e.action.wpStop.quest; bool fail = e.action.wpStop.fail != 0; - CAST_AI(SmartAI, me->AI())->StopPath(DespawnTime, quest, fail); + ENSURE_AI(SmartAI, me->AI())->StopPath(DespawnTime, quest, fail); break; } case SMART_ACTION_WP_RESUME: @@ -1383,7 +1383,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsSmart()) break; - CAST_AI(SmartAI, me->AI())->ResumePath(); + ENSURE_AI(SmartAI, me->AI())->ResumePath(); break; } case SMART_ACTION_SET_ORIENTATION: @@ -1620,7 +1620,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u for (ObjectList::iterator itr = targets->begin(); itr != targets->end(); ++itr) if (Creature* target = (*itr)->ToCreature()) if (IsSmart(target) && target->GetVictim()) - if (CAST_AI(SmartAI, target->AI())->CanCombatMove()) + if (ENSURE_AI(SmartAI, target->AI())->CanCombatMove()) target->GetMotionMaster()->MoveChase(target->GetVictim(), attackDistance, attackAngle); delete targets; @@ -1642,12 +1642,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (Creature* target = (*itr)->ToCreature()) { if (IsSmart(target)) - CAST_AI(SmartAI, target->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); + ENSURE_AI(SmartAI, target->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); } else if (GameObject* goTarget = (*itr)->ToGameObject()) { if (IsSmartGO(goTarget)) - CAST_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); + ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); } } @@ -1778,12 +1778,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (Creature* target = (*itr)->ToCreature()) { if (IsSmart(target)) - CAST_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker()); + ENSURE_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker()); } else if (GameObject* goTarget = (*itr)->ToGameObject()) { if (IsSmartGO(goTarget)) - CAST_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); + ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); } } @@ -1808,12 +1808,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (Creature* target = (*itr)->ToCreature()) { if (IsSmart(target)) - CAST_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker()); + ENSURE_AI(SmartAI, target->AI())->SetScript9(e, id, GetLastInvoker()); } else if (GameObject* goTarget = (*itr)->ToGameObject()) { if (IsSmartGO(goTarget)) - CAST_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); + ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index cde93292b62..fa009d94fe2 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13524,7 +13524,7 @@ void Player::AddItemToBuyBackSlot(Item* pItem) // found empty if (!m_items[i]) { - slot = i; + oldest_slot = i; break; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9c7779407f1..b5a60793d63 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13608,7 +13608,7 @@ void Unit::DeleteCharmInfo() } CharmInfo::CharmInfo(Unit* unit) -: _unit(unit), _CommandState(COMMAND_FOLLOW), _petnumber(0), _barInit(false), _oldReactState(REACT_PASSIVE), +: _unit(unit), _CommandState(COMMAND_FOLLOW), _petnumber(0), _oldReactState(REACT_PASSIVE), _isCommandAttack(false), _isCommandFollow(false), _isAtStay(false), _isFollowing(false), _isReturning(false), _stayX(0.0f), _stayY(0.0f), _stayZ(0.0f) { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index e87eb957de8..b88ea856c77 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1194,7 +1194,6 @@ struct CharmInfo CharmSpellInfo _charmspells[4]; CommandStates _CommandState; uint32 _petnumber; - bool _barInit; //for restoration after charmed ReactStates _oldReactState; diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 7c82b806cf8..3ccc876e1a2 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -824,10 +824,9 @@ void Map::ScriptsProcess() } Creature* cTarget = NULL; - if (source) //using grid searcher + WorldObject* wSource = dynamic_cast <WorldObject*> (source); + if (wSource) //using grid searcher { - WorldObject* wSource = dynamic_cast <WorldObject*> (source); - CellCoord p(Trinity::ComputeCellCoord(wSource->GetPositionX(), wSource->GetPositionY())); Cell cell(p); diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 47e91cac63d..60a8e943bc7 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -140,7 +140,7 @@ public: void JustSummoned(Creature* summoned) override { - CAST_AI(npc_water_elemental::npc_water_elementalAI, summoned->AI())->balindaGUID = me->GetGUID(); + ENSURE_AI(npc_water_elemental::npc_water_elementalAI, summoned->AI())->balindaGUID = me->GetGUID(); summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true)); summoned->setFaction(me->getFaction()); summons.Summon(summoned); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index 90306913534..0f4840c0d1f 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -19,7 +19,7 @@ #include "ScriptedCreature.h" #include "karazhan.h" -enum Spells +enum Spells { SPELL_REPENTANCE = 29511, SPELL_HOLYFIRE = 29522, diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index d812a8e3001..5d1e5451ab1 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -230,7 +230,7 @@ public: void SetMidnight(Creature* pAttumen, uint64 value) { - CAST_AI(boss_attumen::boss_attumenAI, pAttumen->AI())->Midnight = value; + ENSURE_AI(boss_attumen::boss_attumenAI, pAttumen->AI())->Midnight = value; } }; }; @@ -307,7 +307,7 @@ void boss_attumen::boss_attumenAI::UpdateAI(uint32 diff) Creature* pMidnight = ObjectAccessor::GetCreature(*me, Midnight); if (pMidnight && pMidnight->GetTypeId() == TYPEID_UNIT) { - CAST_AI(boss_midnight::boss_midnightAI, (pMidnight->AI()))->Mount(me); + ENSURE_AI(boss_midnight::boss_midnightAI, (pMidnight->AI()))->Mount(me); me->SetHealth(pMidnight->GetHealth()); DoResetThreat(); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 411ebed869d..6ff1faf35b6 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -352,7 +352,7 @@ struct boss_moroes_guestAI : public ScriptedAI { 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]) + if (uint64 GUID = ENSURE_AI(boss_moroes::boss_moroesAI, Moroes->AI())->AddGUID[i]) GuestGUID[i] = GUID; } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index e6c544aa0a0..518c4eacbd9 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -367,8 +367,8 @@ public: infernal->SetDisplayId(INFERNAL_MODEL_INVISIBLE); infernal->setFaction(me->getFaction()); if (point) - CAST_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->point=point; - CAST_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->malchezaar=me->GetGUID(); + ENSURE_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->point = point; + ENSURE_AI(netherspite_infernal::netherspite_infernalAI, infernal->AI())->malchezaar = me->GetGUID(); infernals.push_back(infernal->GetGUID()); DoCast(infernal, SPELL_INFERNAL_RELAY); @@ -586,7 +586,7 @@ void netherspite_infernal::netherspite_infernalAI::Cleanup() Creature* pMalchezaar = ObjectAccessor::GetCreature(*me, malchezaar); if (pMalchezaar && pMalchezaar->IsAlive()) - CAST_AI(boss_malchezaar::boss_malchezaarAI, pMalchezaar->AI())->Cleanup(me, point); + ENSURE_AI(boss_malchezaar::boss_malchezaarAI, pMalchezaar->AI())->Cleanup(me, point); } void AddSC_boss_malchezaar() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 256ab06a7b7..9b66beb5986 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -273,7 +273,7 @@ public: { if (Creature* pPortal = ObjectAccessor::GetCreature(*me, PortalGUID[i])) { - CAST_AI(npc_fiendish_portal::npc_fiendish_portalAI, pPortal->AI())->DespawnAllImp(); + ENSURE_AI(npc_fiendish_portal::npc_fiendish_portalAI, pPortal->AI())->DespawnAllImp(); pPortal->DespawnOrUnsummon(); } @@ -363,7 +363,7 @@ public: if (Creature* Chains = me->FindNearestCreature(NPC_DEMONCHAINS, 5000)) { - CAST_AI(npc_demon_chain::npc_demon_chainAI, Chains->AI())->SacrificeGUID = target->GetGUID(); + ENSURE_AI(npc_demon_chain::npc_demon_chainAI, Chains->AI())->SacrificeGUID = target->GetGUID(); Chains->CastSpell(Chains, SPELL_DEMON_CHAINS, true); Talk(SAY_SACRIFICE); SacrificeTimer = 30000; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index dd5ad8ee7ae..f86f267b6b9 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -257,7 +257,7 @@ public: Creature* Dorothee = (ObjectAccessor::GetCreature((*me), DorotheeGUID)); if (Dorothee && Dorothee->IsAlive()) { - CAST_AI(boss_dorothee::boss_dorotheeAI, Dorothee->AI())->TitoDied = true; + ENSURE_AI(boss_dorothee::boss_dorotheeAI, Dorothee->AI())->TitoDied = true; Talk(SAY_DOROTHEE_TITO_DEATH, Dorothee); } } @@ -284,7 +284,7 @@ void boss_dorothee::boss_dorotheeAI::SummonTito() if (Creature* pTito = me->SummonCreature(CREATURE_TITO, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000)) { Talk(SAY_DOROTHEE_SUMMON); - CAST_AI(npc_tito::npc_titoAI, pTito->AI())->DorotheeGUID = me->GetGUID(); + ENSURE_AI(npc_tito::npc_titoAI, pTito->AI())->DorotheeGUID = me->GetGUID(); pTito->AI()->AttackStart(me->GetVictim()); SummonedTito = true; TitoDied = false; @@ -1188,8 +1188,8 @@ public: 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; + ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->RomuloDead = true; + ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->ResurrectSelfTimer = 10000; } damage = 0; @@ -1216,8 +1216,8 @@ public: { PretendToDie(me); IsFakingDeath = true; - CAST_AI(boss_julianne::boss_julianneAI, Julianne->AI())->ResurrectTimer = 10000; - CAST_AI(boss_julianne::boss_julianneAI, Julianne->AI())->RomuloDead = true; + ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->ResurrectTimer = 10000; + ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->RomuloDead = true; damage = 0; return; } @@ -1276,11 +1276,11 @@ public: if (ResurrectTimer <= diff) { Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID)); - if (Julianne && CAST_AI(boss_julianne::boss_julianneAI, Julianne->AI())->IsFakingDeath) + if (Julianne && ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->IsFakingDeath) { Talk(SAY_ROMULO_RESURRECT); Resurrect(Julianne); - CAST_AI(boss_julianne::boss_julianneAI, Julianne->AI())->IsFakingDeath = false; + ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->IsFakingDeath = false; JulianneDead = false; ResurrectTimer = 10000; } @@ -1362,8 +1362,8 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) if (Creature* pRomulo = me->SummonCreature(CREATURE_ROMULO, ROMULO_X, ROMULO_Y, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS)) { RomuloGUID = pRomulo->GetGUID(); - CAST_AI(boss_romulo::boss_romuloAI, pRomulo->AI())->JulianneGUID = me->GetGUID(); - CAST_AI(boss_romulo::boss_romuloAI, pRomulo->AI())->Phase = PHASE_ROMULO; + ENSURE_AI(boss_romulo::boss_romuloAI, pRomulo->AI())->JulianneGUID = me->GetGUID(); + ENSURE_AI(boss_romulo::boss_romuloAI, pRomulo->AI())->Phase = PHASE_ROMULO; DoZoneInCombat(pRomulo); pRomulo->setFaction(16); @@ -1396,11 +1396,11 @@ void boss_julianne::boss_julianneAI::UpdateAI(uint32 diff) if (ResurrectTimer <= diff) { Creature* Romulo = (ObjectAccessor::GetCreature((*me), RomuloGUID)); - if (Romulo && CAST_AI(boss_romulo::boss_romuloAI, Romulo->AI())->IsFakingDeath) + if (Romulo && ENSURE_AI(boss_romulo::boss_romuloAI, Romulo->AI())->IsFakingDeath) { Talk(SAY_JULIANNE_RESURRECT); Resurrect(Romulo); - CAST_AI(boss_romulo::boss_romuloAI, Romulo->AI())->IsFakingDeath = false; + ENSURE_AI(boss_romulo::boss_romuloAI, Romulo->AI())->IsFakingDeath = false; RomuloDead = false; ResurrectTimer = 10000; } @@ -1494,8 +1494,8 @@ void boss_julianne::boss_julianneAI::DamageTaken(Unit* /*done_by*/, uint32 &dama { PretendToDie(me); IsFakingDeath = true; - CAST_AI(boss_romulo::boss_romuloAI, Romulo->AI())->ResurrectTimer = 10000; - CAST_AI(boss_romulo::boss_romuloAI, Romulo->AI())->JulianneDead = true; + ENSURE_AI(boss_romulo::boss_romuloAI, Romulo->AI())->ResurrectTimer = 10000; + ENSURE_AI(boss_romulo::boss_romuloAI, Romulo->AI())->JulianneDead = true; damage = 0; return; } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index 976a83a98c2..c89950b7de3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -339,7 +339,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { player->PlayerTalkClass->ClearMenus(); - npc_barnesAI* pBarnesAI = CAST_AI(npc_barnes::npc_barnesAI, creature->AI()); + npc_barnesAI* pBarnesAI = ENSURE_AI(npc_barnes::npc_barnesAI, creature->AI()); switch (action) { diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 45fd9fed60a..40dedcf6d93 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -450,7 +450,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI 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]; + m_auiLackeyGUIDs[i] = ENSURE_AI(boss_priestess_delrissa::boss_priestess_delrissaAI, Delrissa->AI())->m_auiLackeyGUID[i]; } } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 46c566f62bd..ae6aaef9999 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -315,7 +315,7 @@ public: if (Creature* anchor = go->FindNearestCreature(29521, 15)) if (uint64 prisonerGUID = anchor->AI()->GetGUID()) if (Creature* prisoner = ObjectAccessor::GetCreature(*player, prisonerGUID)) - CAST_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); + ENSURE_AI(npc_unworthy_initiate::npc_unworthy_initiateAI, prisoner->AI())->EventStart(anchor, player); return false; } @@ -632,7 +632,7 @@ public: caster->setFaction(35); DoCast(caster, SPELL_CALL_DARK_RIDER, true); if (Creature* Dark_Rider = me->FindNearestCreature(28654, 15)) - CAST_AI(npc_dark_rider_of_acherus::npc_dark_rider_of_acherusAI, Dark_Rider->AI())->InitDespawnHorse(caster); + ENSURE_AI(npc_dark_rider_of_acherus::npc_dark_rider_of_acherusAI, Dark_Rider->AI())->InitDespawnHorse(caster); } } } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 2800e9473b7..72757387b1c 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -282,8 +282,8 @@ public: { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->uiStep = 1; - CAST_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->uiStep = 1; + ENSURE_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, creature->AI())->Start(true, false, player->GetGUID()); break; } return true; diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index e169e521d0b..5939d4a41db 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -466,7 +466,7 @@ public: case 1: { if (Creature* smoke = me->SummonCreature(HELPER, Spawn[1].x, Spawn[1].y, Spawn[1].z, 0, TEMPSUMMON_TIMED_DESPAWN, 20000)) - CAST_AI(npc_wisp_invis::npc_wisp_invisAI, smoke->AI())->SetType(3); + ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, smoke->AI())->SetType(3); DoCast(me, SPELL_RHYME_BIG); break; } @@ -517,7 +517,7 @@ public: SaySound(SAY_PLAYER_DEATH); //maybe possible when player dies from conflagration else if (Creature* Head = ObjectAccessor::GetCreature((*me), headGUID)) - CAST_AI(npc_head::npc_headAI, Head->AI())->SaySound(SAY_PLAYER_DEATH); + ENSURE_AI(npc_head::npc_headAI, Head->AI())->SaySound(SAY_PLAYER_DEATH); } } @@ -566,7 +566,7 @@ public: if (Creature* flame = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) flame->CastSpell(flame, SPELL_BODY_FLAME, false); if (Creature* wisp = DoSpawnCreature(WISP_INVIS, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) - CAST_AI(npc_wisp_invis::npc_wisp_invisAI, wisp->AI())->SetType(4); + ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, wisp->AI())->SetType(4); instance->SetData(DATA_HORSEMAN_EVENT, DONE); Map::PlayerList const& players = me->GetMap()->GetPlayers(); @@ -690,7 +690,7 @@ public: if (burn <= diff) { if (Creature* flame = me->SummonCreature(HELPER, Spawn[0].x, Spawn[0].y, Spawn[0].z, 0, TEMPSUMMON_TIMED_DESPAWN, 17000)) - CAST_AI(npc_wisp_invis::npc_wisp_invisAI, flame->AI())->SetType(2); + ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, flame->AI())->SetType(2); burned = true; } else burn -= diff; @@ -749,8 +749,8 @@ public: Creature* Head = ObjectAccessor::GetCreature((*me), headGUID); if (Head && Head->IsAlive()) { - CAST_AI(npc_head::npc_headAI, Head->AI())->Phase = Phase; - CAST_AI(npc_head::npc_headAI, Head->AI())->Disappear(); + ENSURE_AI(npc_head::npc_headAI, Head->AI())->Phase = Phase; + ENSURE_AI(npc_head::npc_headAI, Head->AI())->Disappear(); } return; } @@ -808,7 +808,7 @@ public: { debuff->SetDisplayId(me->GetDisplayId()); debuff->CastSpell(debuff, SPELL_PUMPKIN_AURA_GREEN, false); - CAST_AI(npc_wisp_invis::npc_wisp_invisAI, debuff->AI())->SetType(1); + ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, debuff->AI())->SetType(1); debuffGUID = debuff->GetGUID(); } sprouted = false; @@ -894,8 +894,8 @@ public: player->AreaExploredOrEventHappens(11405); if (Creature* horseman = soil->SummonCreature(HH_MOUNTED, FlightPoint[20].x, FlightPoint[20].y, FlightPoint[20].z, 0, TEMPSUMMON_MANUAL_DESPAWN, 0)) { - CAST_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); - CAST_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, horseman->AI())->FlyMode(); } //} return true; @@ -920,7 +920,7 @@ void npc_head::npc_headAI::Disappear() me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->GetMotionMaster()->MoveIdle(); - CAST_AI(boss_headless_horseman::boss_headless_horsemanAI, body->AI())->returned = true; + ENSURE_AI(boss_headless_horseman::boss_headless_horsemanAI, body->AI())->returned = true; } } } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index 9c83b038545..b7e03fe0459 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -650,8 +650,8 @@ public: TeleportAllPlayersBack(); if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID)) { - CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1; - CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = false; + ENSURE_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1; + ENSURE_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = false; } EnterEvadeMode(); return; @@ -666,8 +666,8 @@ public: TeleportAllPlayersBack(); if (Creature* Kalecgos = ObjectAccessor::GetCreature(*me, KalecgosGUID)) { - CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1; - CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = true; + ENSURE_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1; + ENSURE_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = true; } instance->SetBossState(DATA_KALECGOS, DONE); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 849b7014d3a..e6029acc61f 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -370,7 +370,7 @@ public: go->SetUInt32Value(GAMEOBJECT_FACTION, 0); if (Creature* pKalec = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_KALECGOS_KJ))) - CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->SetRingOfBlueFlames(); go->Refresh(); } @@ -422,7 +422,7 @@ public: phase = PHASE_DECEIVERS; if (Creature* pKalecKJ = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_KALECGOS_KJ))) - CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs(); + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalecKJ->AI())->ResetOrbs(); deceiverDeathCount = 0; bSummonedDeceivers = false; bKiljaedenDeath = false; @@ -612,7 +612,7 @@ public: // Reset the controller if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER))) - CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->Reset(); + ENSURE_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->Reset(); } void EnterCombat(Unit* /*who*/) override @@ -800,10 +800,10 @@ public: switch (Phase) { case PHASE_SACRIFICE: - CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true); + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(true); break; default: - CAST_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false); + ENSURE_AI(boss_kalecgos_kj::boss_kalecgos_kjAI, pKalec->AI())->EmpowerOrb(false); break; } } @@ -924,7 +924,7 @@ public: void JustDied(Unit* /*killer*/) override { if (Creature* pControl = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KILJAEDEN_CONTROLLER))) - ++(CAST_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount); + ++(ENSURE_AI(npc_kiljaeden_controller::npc_kiljaeden_controllerAI, pControl->AI())->deceiverDeathCount); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp index 68d34f109a5..6bdf43c3305 100644 --- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp @@ -168,12 +168,12 @@ public: bool OnQuestAccept(Player* player, Creature* creature, const Quest *quest) override { - if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress) + if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress) { - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true; - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0; - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0; - CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true; + ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0; + ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0; + ENSURE_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID(); } return true; diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index e7e374ea26e..16c66c5e4e3 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -582,8 +582,8 @@ public: { if (Player* player = GetPlayerForEscort()) { - CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID()); - CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->SetMaxPlayerDistance(200.0f); + ENSURE_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID()); + ENSURE_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->SetMaxPlayerDistance(200.0f); } } me->DisappearAndDie(); @@ -623,8 +623,8 @@ public: { if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true)) { - CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID()); - CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f); + ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID()); + ENSURE_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->SetMaxPlayerDistance(200.0f); } return true; } diff --git a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp index 6a4cb1e0196..4d19256e5a1 100644 --- a/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp @@ -56,7 +56,7 @@ public: { creature->setFaction(FACTION_HOSTILE); creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - CAST_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player); + ENSURE_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player); } return true; } diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index 8baeaec96ff..41e6bafd4a7 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -81,8 +81,8 @@ public: { if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY) { - CAST_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->LamentEvent = true; - CAST_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->DoPlaySoundToSet(creature, SOUND_CREDIT); + ENSURE_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->LamentEvent = true; + ENSURE_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->DoPlaySoundToSet(creature, SOUND_CREDIT); creature->CastSpell(creature, SPELL_SYLVANAS_CAST, false); for (uint8 i = 0; i < 4; ++i) diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 0839a476941..dbcf5998bdb 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -304,10 +304,11 @@ public: bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { - npc_escortAI* pEscortAI = CAST_AI(npc_anchorite_truuen::npc_anchorite_truuenAI, creature->AI()); - if (quest->GetQuestId() == QUEST_TOMB_LIGHTBRINGER) + { + npc_escortAI* pEscortAI = ENSURE_AI(npc_anchorite_truuen::npc_anchorite_truuenAI, creature->AI()); pEscortAI->Start(true, true, player->GetGUID()); + } return false; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp index ede038863fc..4a92041f921 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp @@ -56,7 +56,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { player->PlayerTalkClass->ClearMenus(); - hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); + hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: @@ -80,7 +80,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); + hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); if (ai->EventBegun) return false; @@ -135,7 +135,7 @@ public: bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override { player->PlayerTalkClass->ClearMenus(); - hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); + hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); ai->DeSpawnVeins();//despawn the alliance veins switch (action) { @@ -160,7 +160,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); + hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); if (ai->EventBegun) return false; @@ -242,7 +242,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); + hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); uint32 AzgalorEvent = ai->GetInstanceData(DATA_AZGALOREVENT); // Only let them get item if Azgalor is dead. diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index 316834c422a..b9c6025b91c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -460,7 +460,7 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) {//summon at tower creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0]+irand(-20, 20), SpawnPointSpecial[SPAWN_NEAR_TOWER][1]+irand(-20, 20), SpawnPointSpecial[SPAWN_NEAR_TOWER][2]+irand(-10, 10), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); if (creature) - CAST_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; + ENSURE_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; } else {//summon at gate @@ -474,7 +474,7 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) { creature = me->SummonCreature(entry, SpawnPointSpecial[SPAWN_NEAR_TOWER][0], SpawnPointSpecial[SPAWN_NEAR_TOWER][1], SpawnPointSpecial[SPAWN_NEAR_TOWER][2], 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); if (creature) - CAST_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; + ENSURE_AI(hyjal_trashAI, creature->AI())->useFlyPath = true; } break; case 17908: //GIANT_INFERNAL @@ -511,7 +511,7 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3]) case ANETHERON: case KAZROGAL: case AZGALOR: - CAST_AI(hyjal_trashAI, creature->AI())->IsEvent = true; + ENSURE_AI(hyjal_trashAI, creature->AI())->IsEvent = true; break; } if (instance->GetData(DATA_RAIDDAMAGE) < MINRAIDDAMAGE) @@ -623,7 +623,7 @@ void hyjalAI::Retreat() if (JainaDummy) { JainaDummy->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - CAST_AI(hyjalAI, JainaDummy->AI())->IsDummy = true; + ENSURE_AI(hyjalAI, JainaDummy->AI())->IsDummy = true; DummyGuid = JainaDummy->GetGUID(); } AddWaypoint(0, JainaDummySpawn[1][0], JainaDummySpawn[1][1], JainaDummySpawn[1][2]); @@ -939,7 +939,7 @@ void hyjalAI::WaypointReached(uint32 waypointId) { if (Creature* creature = ObjectAccessor::GetCreature(*me, DummyGuid)) { - hyjalAI* ai = CAST_AI(hyjalAI, creature->AI()); + hyjalAI* ai = ENSURE_AI(hyjalAI, creature->AI()); ai->DoMassTeleport = true; ai->MassTeleportTimer = 20000; creature->CastSpell(me, SPELL_MASS_TELEPORT, false); @@ -1036,9 +1036,9 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) Creature* unit = me->SummonCreature(GHOUL, AllianceBase[r][0]+irand(-15, 15), AllianceBase[r][1]+irand(-15, 15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); if (unit) { - CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; - CAST_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; - CAST_AI(hyjal_trashAI, unit->AI())->OverrunType = i; + ENSURE_AI(hyjal_trashAI, unit->AI())->faction = Faction; + ENSURE_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; + ENSURE_AI(hyjal_trashAI, unit->AI())->OverrunType = i; unit->setActive(true); } } @@ -1048,9 +1048,9 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) Creature* unit = me->SummonCreature(ABOMINATION, AllianceBase[r][0]+irand(-15, 15), AllianceBase[r][1]+irand(-15, 15), AllianceBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); if (unit) { - CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; - CAST_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; - CAST_AI(hyjal_trashAI, unit->AI())->OverrunType = i; + ENSURE_AI(hyjal_trashAI, unit->AI())->faction = Faction; + ENSURE_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; + ENSURE_AI(hyjal_trashAI, unit->AI())->OverrunType = i; unit->setActive(true); } } @@ -1060,9 +1060,9 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) if (unit) { unit->SetHomePosition(AllianceOverrunGargPos[i][0], AllianceOverrunGargPos[i][1], AllianceOverrunGargPos[i][2], AllianceOverrunGargPos[i][3]); - CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; - CAST_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; - CAST_AI(hyjal_trashAI, unit->AI())->OverrunType = i; + ENSURE_AI(hyjal_trashAI, unit->AI())->faction = Faction; + ENSURE_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; + ENSURE_AI(hyjal_trashAI, unit->AI())->OverrunType = i; unit->setActive(true); } } @@ -1077,9 +1077,9 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) if (unit) { unit->SetHomePosition(InfernalSPWP[i][0], InfernalSPWP[i][1], InfernalSPWP[i][2], InfernalSPWP[i][3]); - CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; - CAST_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; - CAST_AI(hyjal_trashAI, unit->AI())->OverrunType = i; + ENSURE_AI(hyjal_trashAI, unit->AI())->faction = Faction; + ENSURE_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; + ENSURE_AI(hyjal_trashAI, unit->AI())->OverrunType = i; unit->setActive(true); } } @@ -1089,9 +1089,9 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) Creature* unit = me->SummonCreature(GHOUL, HordeBase[r][0]+irand(-15, 15), HordeBase[r][1]+irand(-15, 15), HordeBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); if (unit) { - CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; - CAST_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; - CAST_AI(hyjal_trashAI, unit->AI())->OverrunType = i; + ENSURE_AI(hyjal_trashAI, unit->AI())->faction = Faction; + ENSURE_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; + ENSURE_AI(hyjal_trashAI, unit->AI())->OverrunType = i; unit->setActive(true); } } @@ -1101,9 +1101,9 @@ void hyjalAI::DoOverrun(uint32 faction, const uint32 diff) Creature* unit = me->SummonCreature(ABOMINATION, HordeBase[r][0]+irand(-15, 15), HordeBase[r][1]+irand(-15, 15), HordeBase[r][2], 0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000); if (unit) { - CAST_AI(hyjal_trashAI, unit->AI())->faction = Faction; - CAST_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; - CAST_AI(hyjal_trashAI, unit->AI())->OverrunType = i; + ENSURE_AI(hyjal_trashAI, unit->AI())->faction = Faction; + ENSURE_AI(hyjal_trashAI, unit->AI())->IsOverrun = true; + ENSURE_AI(hyjal_trashAI, unit->AI())->OverrunType = i; unit->setActive(true); } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 3a5025695f8..7537654c09c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -1184,7 +1184,7 @@ public: if (IsEvent || IsOverrun) { - CAST_AI(hyjal_trashAI, me->AI())->SetCanAttack(false); + ENSURE_AI(hyjal_trashAI, me->AI())->SetCanAttack(false); npc_escortAI::UpdateAI(diff); } @@ -1301,7 +1301,7 @@ public: if (IsEvent || IsOverrun) { - CAST_AI(hyjal_trashAI, me->AI())->SetCanAttack(false); + ENSURE_AI(hyjal_trashAI, me->AI())->SetCanAttack(false); npc_escortAI::UpdateAI(diff); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index da40ec333a6..1dc86cd4ad4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -209,9 +209,9 @@ public: if (npc_escortAI* pEscortAI = CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())) pEscortAI->Start(true, true, player->GetGUID()); - CAST_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far - CAST_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); - CAST_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); + ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(100.0f);//not really needed, because it will not despawn if player is too far + ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); + ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); break; case GOSSIP_ACTION_INFO_DEF+2: @@ -227,14 +227,14 @@ public: creature->AI()->Talk(SAY_TH_START_EVENT_PART2); - CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); + ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); break; case GOSSIP_ACTION_INFO_DEF+3: player->CLOSE_GOSSIP_MENU(); if (instance) instance->SetData(TYPE_THRALL_PART3, IN_PROGRESS); - CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); + ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, creature->AI())->StartWP(); break; } return true; @@ -423,7 +423,7 @@ public: if (Creature* Taretha = instance->instance->GetCreature(instance->GetData64(DATA_TARETHA))) { if (Player* player = GetPlayerForEscort()) - CAST_AI(npc_escortAI, (Taretha->AI()))->Start(false, true, player->GetGUID()); + ENSURE_AI(npc_escortAI, (Taretha->AI()))->Start(false, true, player->GetGUID()); } //kill credit Creature for quest @@ -586,7 +586,7 @@ public: creature->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); if (Creature* thrall = (ObjectAccessor::GetCreature(*creature, instance->GetData64(DATA_THRALL)))) - CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); + ENSURE_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); } } return true; diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp index 835fd6228e1..f996bcc6f70 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp @@ -51,7 +51,7 @@ public: { if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER) { - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); creature->AI()->Talk(SAY_READY, player); creature->setFaction(113); } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index c5011eba2f8..3e02406b93d 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -131,7 +131,7 @@ struct boss_twinemperorsAI : public ScriptedAI pOtherBoss->SetHealth(0); pOtherBoss->setDeathState(JUST_DIED); pOtherBoss->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - CAST_AI(boss_twinemperorsAI, pOtherBoss->AI())->DontYellWhenDead = true; + ENSURE_AI(boss_twinemperorsAI, pOtherBoss->AI())->DontYellWhenDead = true; } if (!DontYellWhenDead) // I hope AI is not threaded DoPlaySoundToSet(me, IAmVeklor() ? SOUND_VL_DEATH : SOUND_VN_DEATH); @@ -150,9 +150,9 @@ struct boss_twinemperorsAI : public ScriptedAI { /// @todo we should activate the other boss location so he can start attackning even if nobody // is near I dont know how to do that - ScriptedAI* otherAI = CAST_AI(ScriptedAI, pOtherBoss->AI()); if (!pOtherBoss->IsInCombat()) { + ScriptedAI* otherAI = ENSURE_AI(ScriptedAI, pOtherBoss->AI()); DoPlaySoundToSet(me, IAmVeklor() ? SOUND_VL_AGGRO : SOUND_VN_AGGRO); otherAI->AttackStart(who); otherAI->DoZoneInCombat(); @@ -224,7 +224,7 @@ struct boss_twinemperorsAI : public ScriptedAI me->SetPosition(otherPos); SetAfterTeleport(); - CAST_AI(boss_twinemperorsAI, pOtherBoss->AI())->SetAfterTeleport(); + ENSURE_AI(boss_twinemperorsAI, pOtherBoss->AI())->SetAfterTeleport(); } } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp index e41fbb7d90d..a0d57481c75 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp @@ -122,7 +122,7 @@ public: void GiveBuddyMyList(Creature* c) { - aqsentinelAI* cai = CAST_AI(aqsentinelAI, (c)->AI()); + aqsentinelAI* cai = ENSURE_AI(aqsentinelAI, (c)->AI()); for (int i=0; i<3; ++i) if (NearbyGUID[i] && NearbyGUID[i] != c->GetGUID()) cai->AddBuddyToList(NearbyGUID[i]); @@ -200,8 +200,8 @@ public: break; AddSentinelsNear(pNearby); - CAST_AI(aqsentinelAI, pNearby->AI())->gatherOthersWhenAggro = false; - CAST_AI(aqsentinelAI, pNearby->AI())->selectAbility(pickAbilityRandom(chosenAbilities)); + ENSURE_AI(aqsentinelAI, pNearby->AI())->gatherOthersWhenAggro = false; + ENSURE_AI(aqsentinelAI, pNearby->AI())->selectAbility(pickAbilityRandom(chosenAbilities)); } /*if (bli < 3) DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/ @@ -256,7 +256,7 @@ public: if (sent->isDead()) continue; sent->ModifyHealth(int32(sent->CountPctFromMaxHealth(50))); - CAST_AI(aqsentinelAI, sent->AI())->GainSentinelAbility(ability); + ENSURE_AI(aqsentinelAI, sent->AI())->GainSentinelAbility(ability); } } }; diff --git a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp index 516da307bfd..bb872421197 100644 --- a/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp +++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.cpp @@ -99,9 +99,9 @@ public: creature->setFaction(250); creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); - CAST_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); - CAST_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtFar(false); + ENSURE_AI(npc_escortAI, (creature->AI()))->SetDespawnAtEnd(false); } return true; } diff --git a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp index 04be688d8aa..7c02ecdb8f2 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.cpp @@ -70,7 +70,7 @@ public: if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_sergeant_bly::npc_sergeant_blyAI, creature->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(npc_sergeant_bly::npc_sergeant_blyAI, creature->AI())->PlayerGUID = player->GetGUID(); creature->AI()->DoAction(0); } return true; diff --git a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp index be70b2e9fa4..6f02752d2fb 100644 --- a/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp @@ -721,7 +721,7 @@ class go_bristlelimb_cage : public GameObjectScript if (Creature* capitive = go->FindNearestCreature(NPC_STILLPINE_CAPITIVE, 5.0f, true)) { go->ResetDoorOrButton(); - CAST_AI(npc_stillpine_capitive::npc_stillpine_capitiveAI, capitive->AI())->StartMoving(player); + ENSURE_AI(npc_stillpine_capitive::npc_stillpine_capitiveAI, capitive->AI())->StartMoving(player); return false; } } diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp index 36ea884cf50..5ae50ff7c8e 100644 --- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp @@ -51,8 +51,8 @@ public: { if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE) { - CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true; - CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true; + ENSURE_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID(); } return true; } diff --git a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp index 09f82b0417c..a1e4467e9fb 100644 --- a/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp @@ -61,7 +61,7 @@ public: { if (quest->GetQuestId() == QUEST_CHASING_AME) { - CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); creature->AI()->Talk(SAY_READY, player); creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); // Change faction so mobs attack diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index b78bdae5c87..bc6807c54d9 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -373,8 +373,8 @@ public: { if (Creature* boss = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_JEDOGA_SHADOWSEEKER))) { - if (!CAST_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok) - CAST_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = true; + if (!ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok) + ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = true; if (killer->GetTypeId() == TYPEID_PLAYER) boss->AI()->DoAction(ACTION_INITIAND_KILLED); @@ -421,8 +421,8 @@ public: Creature* boss = me->GetMap()->GetCreature(instance->GetData64(DATA_JEDOGA_SHADOWSEEKER)); if (boss) { - CAST_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok = true; - CAST_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = false; + ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerok = true; + ENSURE_AI(boss_jedoga_shadowseeker::boss_jedoga_shadowseekerAI, boss->AI())->bOpFerokFail = false; me->Kill(me); } } diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp index e3156e21371..c5b87eb48e8 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -403,7 +403,7 @@ class go_prince_taldaram_sphere : public GameObjectScript break; } - CAST_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); + ENSURE_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); } return true; } 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 e22ee040599..4015467501e 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 @@ -494,7 +494,7 @@ public: if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter(); + ENSURE_AI(npc_announcer_toc5::npc_announcer_toc5AI, creature->AI())->StartEncounter(); } return true; 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 e40cd9d5f41..a0c42492a1b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -837,7 +837,7 @@ class spell_power_of_the_twins : public SpellScriptLoader if (InstanceScript* instance = GetCaster()->GetInstanceScript()) { if (Creature* Valk = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(GetCaster()->GetEntry()))) - CAST_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(true); + ENSURE_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(true); } } @@ -846,7 +846,7 @@ class spell_power_of_the_twins : public SpellScriptLoader if (InstanceScript* instance = GetCaster()->GetInstanceScript()) { if (Creature* Valk = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(GetCaster()->GetEntry()))) - CAST_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(false); + ENSURE_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(false); } } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 1c126bc54fd..3f8e1cc6ee0 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -624,7 +624,7 @@ class spell_krick_pursuit : public SpellScriptLoader { ick->AI()->Talk(SAY_ICK_CHASE_1, target); ick->AddAura(GetSpellInfo()->Id, target); - CAST_AI(boss_ick::boss_ickAI, ick->AI())->SetTempThreat(ick->getThreatManager().getThreat(target)); + ENSURE_AI(boss_ick::boss_ickAI, ick->AI())->SetTempThreat(ick->getThreatManager().getThreat(target)); ick->AddThreat(target, float(GetEffectValue())); target->AddThreat(ick, float(GetEffectValue())); } @@ -645,7 +645,7 @@ class spell_krick_pursuit : public SpellScriptLoader { if (Unit* caster = GetCaster()) if (Creature* creCaster = caster->ToCreature()) - CAST_AI(boss_ick::boss_ickAI, creCaster->AI())->_ResetThreat(GetTarget()); + ENSURE_AI(boss_ick::boss_ickAI, creCaster->AI())->_ResetThreat(GetTarget()); } void Register() override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 9a9e7aa6849..e2ff68ab851 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -147,15 +147,15 @@ public: { if (attack && who) { - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->encounterActionAttack = true; - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->encounterActionAttack = true; - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->encounterActionAttack = true; - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->encounterActionAttack = true; - - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->AttackStart(who); - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->AttackStart(who); - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->AttackStart(who); - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->AttackStart(who); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->encounterActionAttack = true; + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->encounterActionAttack = true; + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->encounterActionAttack = true; + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->encounterActionAttack = true; + + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->AttackStart(who); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->AttackStart(who); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->AttackStart(who); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->AttackStart(who); } if (reset) @@ -174,15 +174,15 @@ public: if (!Sir->IsAlive()) Sir->Respawn(); - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->encounterActionReset = true; - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->encounterActionReset = true; - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->encounterActionReset = true; - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->encounterActionReset = true; + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->encounterActionReset = true; + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->encounterActionReset = true; + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->encounterActionReset = true; + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->encounterActionReset = true; - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->EnterEvadeMode(); - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->EnterEvadeMode(); - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->EnterEvadeMode(); - CAST_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->EnterEvadeMode(); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Thane->AI())->EnterEvadeMode(); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Lady->AI())->EnterEvadeMode(); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Baron->AI())->EnterEvadeMode(); + ENSURE_AI(boss_four_horsemen::boss_four_horsemenAI, Sir->AI())->EnterEvadeMode(); } } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp index 946b60d4e27..5702987cc5a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp @@ -177,13 +177,13 @@ class spell_loatheb_necrotic_aura_warning : public SpellScriptLoader void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (GetTarget()->IsAIEnabled) - CAST_AI(LoathebAI, GetTarget()->GetAI())->Talk(SAY_NECROTIC_AURA_APPLIED); + ENSURE_AI(LoathebAI, GetTarget()->GetAI())->Talk(SAY_NECROTIC_AURA_APPLIED); } void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { if (GetTarget()->IsAIEnabled) - CAST_AI(LoathebAI, GetTarget()->GetAI())->Talk(SAY_NECROTIC_AURA_REMOVED); + ENSURE_AI(LoathebAI, GetTarget()->GetAI())->Talk(SAY_NECROTIC_AURA_REMOVED); } void Register() override diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 38e6a3fc816..bfe34ece6cf 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -220,7 +220,7 @@ public: go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); go->SetGoState(GO_STATE_ACTIVE); - CAST_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); + ENSURE_AI(boss_keristrasza::boss_keristraszaAI, pKeristrasza->AI())->CheckContainmentSpheres(true); } return true; } @@ -271,7 +271,7 @@ class achievement_intense_cold : public AchievementCriteriaScript if (!target) return false; - std::list<uint64> intenseColdList = CAST_AI(boss_keristrasza::boss_keristraszaAI, target->ToCreature()->AI())->intenseColdList; + std::list<uint64> intenseColdList = ENSURE_AI(boss_keristrasza::boss_keristraszaAI, target->ToCreature()->AI())->intenseColdList; if (!intenseColdList.empty()) for (std::list<uint64>::iterator itr = intenseColdList.begin(); itr != intenseColdList.end(); ++itr) if (player->GetGUID() == *itr) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 585da8e28d3..f398dd99b5c 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -310,7 +310,7 @@ class spell_varos_energize_core_area_enemy : public SpellScriptLoader if (varos->GetEntry() != NPC_VAROS) return; - float orientation = CAST_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); + float orientation = ENSURE_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();) { @@ -354,7 +354,7 @@ class spell_varos_energize_core_area_entry : public SpellScriptLoader if (varos->GetEntry() != NPC_VAROS) return; - float orientation = CAST_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); + float orientation = ENSURE_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();) { 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 cedf06a3154..683eb97a4f7 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -272,7 +272,7 @@ public: if (action == GOSSIP_ACTION_INFO_DEF+1 || action == GOSSIP_ACTION_INFO_DEF+2) { player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_brann_hos::npc_brann_hosAI, creature->AI())->StartWP(); + ENSURE_AI(npc_brann_hos::npc_brann_hosAI, creature->AI())->StartWP(); } return true; @@ -347,7 +347,7 @@ public: { if (!creature->IsAlive()) creature->Respawn(); - CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, creature->AI())->UpdateFacesList(); + ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, creature->AI())->UpdateFacesList(); uiControllerGUID = creature->GetGUID(); } break; @@ -463,7 +463,7 @@ public: Talk(SAY_EVENT_A_3); instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), true); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) - CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bKaddrakActivated = true; + ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bKaddrakActivated = true; JumpToNextStep(5000); break; case 9: @@ -485,7 +485,7 @@ public: Talk(SAY_EVENT_B_3); instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), true); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) - CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bMarnakActivated = true; + ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bMarnakActivated = true; JumpToNextStep(10000); break; case 13: @@ -515,7 +515,7 @@ public: Talk(SAY_EVENT_C_3); instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), true); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) - CAST_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bAbedneumActivated = true; + ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bAbedneumActivated = true; JumpToNextStep(5000); break; case 19: diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 57df8c76a56..68bdbe0fdf3 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -1101,7 +1101,7 @@ class npc_ancient_water_spirit : public CreatureScript { instance = me->GetInstanceScript(); if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) - waveCount = CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; + waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; } void Reset() override @@ -1133,8 +1133,8 @@ class npc_ancient_water_spirit : public CreatureScript { if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) { - CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false; - CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(1); + ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false; + ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(1); } } @@ -1161,7 +1161,7 @@ class npc_storm_lasher : public CreatureScript { instance = me->GetInstanceScript(); if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) - waveCount = CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; + waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; } void Reset() override @@ -1199,8 +1199,8 @@ class npc_storm_lasher : public CreatureScript { if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) { - CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false; - CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(2); + ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false; + ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(2); } } @@ -1228,7 +1228,7 @@ class npc_snaplasher : public CreatureScript { instance = me->GetInstanceScript(); if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) - waveCount = CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; + waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount; } void UpdateAI(uint32 /*diff*/) override @@ -1246,8 +1246,8 @@ class npc_snaplasher : public CreatureScript { if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_FREYA))) { - CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false; - CAST_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(4); + ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->checkElementalAlive[waveCount] = false; + ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->LasherDead(4); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index ed909d459ca..399113e18c8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -711,7 +711,7 @@ class npc_expedition_commander : public CreatureScript { case GOSSIP_ACTION_INFO_DEF: player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_expedition_commanderAI, creature->AI())->Phase = 1; + ENSURE_AI(npc_expedition_commanderAI, creature->AI())->Phase = 1; break; } return true; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index b623d5e6ddc..9e2bb85e27a 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -267,7 +267,7 @@ public: { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); - CAST_AI(npc_sinclari_vh::npc_sinclariAI, (creature->AI()))->uiPhase = 1; + ENSURE_AI(npc_sinclari_vh::npc_sinclariAI, (creature->AI()))->uiPhase = 1; if (InstanceScript* instance = creature->GetInstanceScript()) instance->SetData(DATA_MAIN_EVENT_PHASE, SPECIAL); break; diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 38d73e0673d..45b640f27be 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -1263,8 +1263,8 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF+1: - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - CAST_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(200.0f); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(200.0f); break; } return true; @@ -1301,7 +1301,7 @@ public: if (me->IsSummon()) if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - CAST_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->arthasInPosition = true; + ENSURE_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->arthasInPosition = true; } }; @@ -1333,7 +1333,7 @@ public: me->CastSpell(me, SPELL_STUN, true); if (me->IsSummon()) if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - CAST_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->arlosInPosition = true; + ENSURE_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->arlosInPosition = true; } }; @@ -1387,7 +1387,7 @@ public: if (me->IsSummon()) if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - CAST_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->talbotInPosition = true; + ENSURE_AI(npc_thassarian::npc_thassarianAI, summoner->ToCreature()->AI())->talbotInPosition = true; } void UpdateAI(uint32 diff) override @@ -1491,14 +1491,14 @@ public: if (!bDone) { if (Creature* talbot = me->FindNearestCreature(NPC_PRINCE_VALANAR, 50.0f, true)) - CAST_AI(npc_counselor_talbot::npc_counselor_talbotAI, talbot->GetAI())->bCheck = true; + ENSURE_AI(npc_counselor_talbot::npc_counselor_talbotAI, talbot->GetAI())->bCheck = true; me->AddUnitState(UNIT_STATE_STUNNED); me->CastSpell(me, SPELL_STUN, true); if (me->IsSummon()) if (Unit* summoner = me->ToTempSummon()->GetSummoner()) - CAST_AI(npc_thassarian::npc_thassarianAI, summoner->GetAI())->leryssaInPosition = true; + ENSURE_AI(npc_thassarian::npc_thassarianAI, summoner->GetAI())->leryssaInPosition = true; bDone = true; } else @@ -1566,7 +1566,7 @@ public: if (Creature* thassarian = summoner->ToCreature()) { thassarian->AI()->Talk(SAY_THASSARIAN_7); - CAST_AI(npc_thassarian::npc_thassarianAI, thassarian->GetAI())->phase = 16; + ENSURE_AI(npc_thassarian::npc_thassarianAI, thassarian->GetAI())->phase = 16; } phaseTimer = 5000; phase = 0; @@ -1812,7 +1812,7 @@ public: } creature->SetStandState(UNIT_STAND_STATE_STAND); creature->AI()->Talk(SAY_1); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); } return true; } @@ -1893,7 +1893,7 @@ public: { creature->SetStandState(UNIT_STAND_STATE_STAND); creature->AI()->Talk(SAY_BONKER_2, player); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, true, player->GetGUID()); } return true; } diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index c577fb2864f..96fdcbfe990 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -67,7 +67,7 @@ public: creature->setFaction(FACTION_ESCORTEE_H); break; } - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); } return true; } diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 3ec138dcfaa..f9fb3801955 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -146,8 +146,8 @@ public: player->PlayerTalkClass->ClearMenus(); if (action == GOSSIP_ACTION_INFO_DEF+1) { - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - CAST_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(35.0f); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->SetMaxPlayerDistance(35.0f); creature->AI()->Talk(SAY_START_IRO); switch (player->GetTeam()){ 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 2b3928f322a..7ba0a452941 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp @@ -225,9 +225,8 @@ public: if (Unit* target = ObjectAccessor::GetUnit(*me, soulholder)) { - - CAST_AI(npc_stolen_soul::npc_stolen_soulAI, summoned->AI())->SetMyClass(soulclass); - summoned->AI()->AttackStart(target); + ENSURE_AI(npc_stolen_soul::npc_stolen_soulAI, summoned->AI())->SetMyClass(soulclass); + summoned->AI()->AttackStart(target); } } } diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index ec89acfb7b6..08fc588e923 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -747,7 +747,7 @@ public: flame->setFaction(me->getFaction()); // Just in case the database has it as a different faction flame->SetMeleeDamageSchool(SPELL_SCHOOL_FIRE); FlameGUID[i] = flame->GetGUID(); // Record GUID in order to check if they're dead later on to move to the next phase - CAST_AI(npc_flame_of_azzinoth::flame_of_azzinothAI, flame->AI())->SetGlaiveGUID(GlaiveGUID[i]); + ENSURE_AI(npc_flame_of_azzinoth::flame_of_azzinothAI, flame->AI())->SetGlaiveGUID(GlaiveGUID[i]); glaive->CastSpell(flame, SPELL_AZZINOTH_CHANNEL, false); // Glaives do some random Beam type channel on it. } } @@ -1325,7 +1325,7 @@ public: me->SetVisible(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if (Creature* illidan = ObjectAccessor::GetCreature(*me, IllidanGUID)) - CAST_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->DeleteFromThreatList(me->GetGUID()); + ENSURE_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->DeleteFromThreatList(me->GetGUID()); me->AttackStop(); Timer[EVENT_MAIEV_STEALTH] = 60000; // reappear after 1 minute MaxTimer = 1; @@ -1458,8 +1458,8 @@ public: illidan->SetInFront(me); me->GetMotionMaster()->MoveIdle(); illidan->GetMotionMaster()->MoveIdle(); - CAST_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->AkamaGUID = me->GetGUID(); - CAST_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->EnterPhase(PHASE_TALK_SEQUENCE); + ENSURE_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->AkamaGUID = me->GetGUID(); + ENSURE_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->EnterPhase(PHASE_TALK_SEQUENCE); } } @@ -1512,7 +1512,7 @@ public: else if (Phase == PHASE_TALK) { if (Creature* illidan = ObjectAccessor::GetCreature(*me, IllidanGUID)) - CAST_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->DeleteFromThreatList(me->GetGUID()); + ENSURE_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->DeleteFromThreatList(me->GetGUID()); EnterEvadeMode(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); ++WalkCount; @@ -1566,7 +1566,7 @@ public: case 0: if (Creature* illidan = ObjectAccessor::GetCreature(*me, IllidanGUID)) { - CAST_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->Timer[EVENT_TAUNT] += 30000; + ENSURE_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->Timer[EVENT_TAUNT] += 30000; illidan->AI()->Talk(SAY_ILLIDAN_MINION); } Timer = 8000; @@ -1849,7 +1849,7 @@ void boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned(Creature* su summon->SetVisible(false); // Leave her invisible until she has to talk summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); MaievGUID = summon->GetGUID(); - CAST_AI(boss_maiev_shadowsong::boss_maievAI, summon->AI())->GetIllidanGUID(me->GetGUID()); + ENSURE_AI(boss_maiev_shadowsong::boss_maievAI, summon->AI())->GetIllidanGUID(me->GetGUID()); summon->AI()->DoAction(PHASE_TALK_SEQUENCE); } break; @@ -1881,7 +1881,7 @@ void boss_illidan_stormrage::boss_illidan_stormrageAI::HandleTalkSequence() { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); me->AddThreat(akama, 100.0f); - CAST_AI(npc_akama_illidan::npc_akama_illidanAI, akama->AI())->EnterPhase(PHASE_FIGHT_ILLIDAN); + ENSURE_AI(npc_akama_illidan::npc_akama_illidanAI, akama->AI())->EnterPhase(PHASE_FIGHT_ILLIDAN); EnterPhase(PHASE_NORMAL); } break; @@ -2040,7 +2040,7 @@ public: // Grid search for nearest live Creature of entry 23304 within 10 yards if (Creature* pTrigger = go->FindNearestCreature(23304, 10.0f)) - CAST_AI(npc_cage_trap_trigger::cage_trap_triggerAI, pTrigger->AI())->Active = true; + ENSURE_AI(npc_cage_trap_trigger::cage_trap_triggerAI, pTrigger->AI())->Active = true; go->SetGoState(GO_STATE_ACTIVE); return true; } @@ -2158,7 +2158,7 @@ public: && !me->EnsureVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND2)) { 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) + if (ENSURE_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 } me->AttackerStateUpdate(me->GetVictim()); 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 67d456286d5..f3c8af50328 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -215,7 +215,7 @@ public: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - CAST_AI(npc_enslaved_soul::npc_enslaved_soulAI, Soul->AI())->ReliquaryGUID = me->GetGUID(); + ENSURE_AI(npc_enslaved_soul::npc_enslaved_soulAI, Soul->AI())->ReliquaryGUID = me->GetGUID(); Soul->AI()->AttackStart(target); } else EnterEvadeMode(); return true; @@ -379,7 +379,7 @@ void npc_enslaved_soul::npc_enslaved_soulAI::JustDied(Unit* /*killer*/) { if (ReliquaryGUID) if (Creature* Reliquary = (ObjectAccessor::GetCreature((*me), ReliquaryGUID))) - ++(CAST_AI(boss_reliquary_of_souls::boss_reliquary_of_soulsAI, Reliquary->AI())->SoulDeathCount); + ++(ENSURE_AI(boss_reliquary_of_souls::boss_reliquary_of_soulsAI, Reliquary->AI())->SoulDeathCount); DoCast(me, SPELL_SOUL_RELEASE, true); } 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 b59d073c17d..6b478bc9dfc 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -439,7 +439,7 @@ public: { if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) if (Shade->IsAlive()) - CAST_AI(boss_shade_of_akama::boss_shade_of_akamaAI, Shade->AI())->HasKilledAkama = true; + ENSURE_AI(boss_shade_of_akama::boss_shade_of_akamaAI, Shade->AI())->HasKilledAkama = true; me->GetMotionMaster()->Clear(true); me->GetMotionMaster()->MoveIdle(); } @@ -778,7 +778,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); + ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } void EnterCombat(Unit* /*who*/) override { } @@ -884,7 +884,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); + ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } void EnterCombat(Unit* /*who*/) override @@ -974,7 +974,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); + ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } void EnterCombat(Unit* /*who*/) override @@ -1054,7 +1054,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); + ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } void EnterCombat(Unit* /*who*/) override @@ -1136,7 +1136,7 @@ public: void IsSummonedBy(Unit* /*summoner*/) override { if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid))) - CAST_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); + ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me); } void EnterCombat(Unit* /*who*/) override diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index c2bf5966a5c..0bbf2cb2a96 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -366,7 +366,7 @@ public: { Construct->CastSpell(Construct, SPELL_PASSIVE_SHADOWFORM, true); SetThreatList(Construct); // Use same function as Doom Blossom to set Threat List. - CAST_AI(npc_shadowy_construct::npc_shadowy_constructAI, Construct->AI())->GhostGUID = GhostGUID; + ENSURE_AI(npc_shadowy_construct::npc_shadowy_constructAI, Construct->AI())->GhostGUID = GhostGUID; Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); if (!target) // someone's trying to solo. target = me->GetVictim(); @@ -444,7 +444,7 @@ public: DoomBlossom->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoomBlossom->setFaction(me->getFaction()); DoomBlossom->AddThreat(target, 1.0f); - CAST_AI(npc_doom_blossom::npc_doom_blossomAI, DoomBlossom->AI())->SetTeronGUID(me->GetGUID()); + ENSURE_AI(npc_doom_blossom::npc_doom_blossomAI, DoomBlossom->AI())->SetTeronGUID(me->GetGUID()); target->CombatStart(DoomBlossom); SetThreatList(DoomBlossom); SummonDoomBlossomTimer = 35000; diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index b9a9f41ca09..64a6add9801 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -226,7 +226,7 @@ public: { if (InstanceScript* instance = go->GetInstanceScript()) if (Creature* Najentus = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_HIGH_WARLORD_NAJENTUS))) - if (CAST_AI(boss_najentus::boss_najentusAI, Najentus->AI())->RemoveImpalingSpine()) + if (ENSURE_AI(boss_najentus::boss_najentusAI, Najentus->AI())->RemoveImpalingSpine()) { player->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true); go->Delete(); diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index ba7730ba566..2c6bac4c9d9 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -291,8 +291,8 @@ public: // Start the event for the Voice Trigger if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) { - CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->LoadCouncilGUIDs(); - CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->EventStarted = true; + ENSURE_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->LoadCouncilGUIDs(); + ENSURE_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->EventStarted = true; } for (uint8 i = 0; i < 4; ++i) @@ -393,7 +393,7 @@ struct boss_illidari_councilAI : public ScriptedAI void EnterCombat(Unit* who) override { if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ILLIDARI_COUNCIL))) - CAST_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who); + ENSURE_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who); DoZoneInCombat(); // Load GUIDs on first aggro because the Creature guids are only set as the creatures are created in world- // this means that for each creature, it will attempt to LoadGUIDs even though some of the other creatures are 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 0f9a10e5c4f..7e24f4b54b2 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -343,7 +343,7 @@ public: void JustDied(Unit* /*killer*/) override { if (Creature* Karathress = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KARATHRESS))) - CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath(); + ENSURE_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath(); } void EnterCombat(Unit* who) override @@ -469,7 +469,7 @@ public: void JustDied(Unit* /*killer*/) override { if (Creature* Karathress = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KARATHRESS))) - CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath(); + ENSURE_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath(); } void EnterCombat(Unit* who) override @@ -585,7 +585,7 @@ public: void JustDied(Unit* /*killer*/) override { if (Creature* Karathress = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KARATHRESS))) - CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath(); + ENSURE_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath(); } void EnterCombat(Unit* who) override 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 f877ce83b37..a241f2bea37 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -621,7 +621,7 @@ public: DoCast(me, SPELL_SURGE); } if (Creature* vashj = ObjectAccessor::GetCreature(*me, VashjGUID)) - if (!vashj->IsInCombat() || CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->Phase != 2 || vashj->isDead()) + if (!vashj->IsInCombat() || ENSURE_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->Phase != 2 || vashj->isDead()) me->Kill(me); Move = 1000; } else Move -= diff; @@ -663,7 +663,7 @@ public: void JustDied(Unit* /*killer*/) override { if (Creature* vashj = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_LADYVASHJ))) - CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->EventTaintedElementalDeath(); + ENSURE_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->EventTaintedElementalDeath(); } void EnterCombat(Unit* who) override @@ -779,7 +779,7 @@ public: { // check if vashj is death 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) + if (!Vashj || !Vashj->IsAlive() || ENSURE_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->ToCreature()->AI())->Phase != 3) { // remove me->setDeathState(DEAD); @@ -866,7 +866,7 @@ public: } Creature* vashj = ObjectAccessor::GetCreature((*player), instance->GetData64(DATA_LADYVASHJ)); - if (vashj && (CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->Phase == 2)) + if (vashj && (ENSURE_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 = ObjectAccessor::GetCreature(*vashj, CAST_AI(boss_lady_vashj::boss_lady_vashjAI, vashj->AI())->ShieldGeneratorChannel[channelIdentifier])) + if (Unit* channel = ObjectAccessor::GetCreature(*vashj, ENSURE_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 cc09952d336..8e478aadeca 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 @@ -703,7 +703,7 @@ public: instance->SetData64(DATA_LEOTHERAS_EVENT_STARTER, 0); Creature* leotheras = ObjectAccessor::GetCreature(*me, leotherasGUID); if (leotheras && leotheras->IsAlive()) - CAST_AI(boss_leotheras_the_blind::boss_leotheras_the_blindAI, leotheras->AI())->CheckChannelers(/*false*/); + ENSURE_AI(boss_leotheras_the_blind::boss_leotheras_the_blindAI, leotheras->AI())->CheckChannelers(/*false*/); } void EnterCombat(Unit* who) override diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp index ab6e0afaab4..8024d5138eb 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp @@ -168,7 +168,7 @@ public: { Talk(SAY_REGEN); DoCast(me, SPELL_WARLORDS_RAGE); - CAST_AI(npc_naga_distiller::npc_naga_distillerAI, distiller->AI())->StartRageGen(me); + ENSURE_AI(npc_naga_distiller::npc_naga_distillerAI, distiller->AI())->StartRageGen(me); } Rage_Timer = 3000 + rand32() % 15000; } else Rage_Timer -= diff; 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 e56b82d4507..b2f199008d0 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 @@ -291,7 +291,7 @@ class npc_shadowmoon_channeler : public CreatureScript void EnterCombat(Unit* who) override { if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) - CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who); + ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who); if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); DoStartMovement(who); @@ -300,7 +300,7 @@ class npc_shadowmoon_channeler : public CreatureScript void JustDied(Unit* killer) override { if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) - CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(killer); + ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(killer); } void UpdateAI(uint32 diff) override @@ -312,7 +312,7 @@ class npc_shadowmoon_channeler : public CreatureScript if (!me->IsNonMeleeSpellCast(false)) if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100)) { - uint64 channeler = CAST_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me); + uint64 channeler = ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me); if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler)) DoCast(channeled, SPELL_CHANNELING); } 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 b15bd18c97c..839dd800721 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 @@ -468,7 +468,7 @@ class npc_hellfire_sentry : public CreatureScript void JustDied(Unit* killer) override { if (Creature* herald = me->FindNearestCreature(NPC_VAZRUDEN_HERALD, 150)) - CAST_AI(boss_vazruden_the_herald::boss_vazruden_the_heraldAI, herald->AI())->SentryDownBy(killer); + ENSURE_AI(boss_vazruden_the_herald::boss_vazruden_the_heraldAI, herald->AI())->SentryDownBy(killer); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index c6756feb0ce..8a5d6e41780 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -405,7 +405,7 @@ class boss_magtheridon : public CreatureScript Creature* summon = me->SummonCreature(NPC_ABYSSAL, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); if (summon) { - CAST_AI(npc_abyssal::npc_abyssalAI, summon->AI())->SetTrigger(2); + ENSURE_AI(npc_abyssal::npc_abyssalAI, summon->AI())->SetTrigger(2); DoCast(summon, SPELL_BLAZE_TARGET, true); summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } @@ -437,7 +437,7 @@ class boss_magtheridon : public CreatureScript target->GetPosition(x, y, z); Creature* summon = me->SummonCreature(NPC_ABYSSAL, x, y, z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); if (summon) - CAST_AI(npc_abyssal::npc_abyssalAI, summon->AI())->SetTrigger(1); + ENSURE_AI(npc_abyssal::npc_abyssalAI, summon->AI())->SetTrigger(1); } Debris_Timer = 10000; } @@ -599,7 +599,7 @@ public: player->InterruptNonMeleeSpells(false); player->CastSpell(player, SPELL_SHADOW_GRASP, true); player->CastSpell(player, SPELL_SHADOW_GRASP_VISUAL, false); - CAST_AI(boss_magtheridon::boss_magtheridonAI, Magtheridon->AI())->SetClicker(go->GetGUID(), player->GetGUID()); + ENSURE_AI(boss_magtheridon::boss_magtheridonAI, Magtheridon->AI())->SetClicker(go->GetGUID(), player->GetGUID()); return true; } }; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 29f240773e5..64deebce8b8 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -697,7 +697,7 @@ class boss_kaelthas : public CreatureScript if (!Advisor) TC_LOG_ERROR("scripts", "SD2: Kael'Thas Advisor %u does not exist. Possibly despawned? Incorrectly Killed?", i); else - CAST_AI(advisorbase_ai, Advisor->AI())->Revive(target); + ENSURE_AI(advisorbase_ai, Advisor->AI())->Revive(target); } PhaseSubphase = 1; 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 a1335290d5a..0981fc527f3 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp @@ -186,7 +186,7 @@ class boss_warp_splinter : public CreatureScript float O = - me->GetAngle(X, Y); if (Creature* pTreant = me->SummonCreature(CREATURE_TREANT, treant_pos[i][0], treant_pos[i][1], treant_pos[i][2], O, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 25000)) - CAST_AI(npc_warp_splinter_treant::npc_warp_splinter_treantAI, pTreant->AI())->WarpGuid = me->GetGUID(); + ENSURE_AI(npc_warp_splinter_treant::npc_warp_splinter_treantAI, pTreant->AI())->WarpGuid = me->GetGUID(); } Talk(SAY_SUMMON); } diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp index 6f331425be0..42be5ba8c90 100644 --- a/src/server/scripts/Outland/zone_netherstorm.cpp +++ b/src/server/scripts/Outland/zone_netherstorm.cpp @@ -347,8 +347,8 @@ public: if (manaforge) { - CAST_AI(npc_manaforge_control_console::npc_manaforge_control_consoleAI, manaforge->AI())->someplayer = player->GetGUID(); - CAST_AI(npc_manaforge_control_console::npc_manaforge_control_consoleAI, manaforge->AI())->goConsole = go->GetGUID(); + ENSURE_AI(npc_manaforge_control_console::npc_manaforge_control_consoleAI, manaforge->AI())->someplayer = player->GetGUID(); + ENSURE_AI(npc_manaforge_control_console::npc_manaforge_control_consoleAI, manaforge->AI())->goConsole = go->GetGUID(); go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); } return true; @@ -638,7 +638,7 @@ public: if (!Dawnforge) return false; - if (CAST_AI(npc_commander_dawnforge::npc_commander_dawnforgeAI, Dawnforge->AI())->CanStartEvent(player)) + if (ENSURE_AI(npc_commander_dawnforge::npc_commander_dawnforgeAI, Dawnforge->AI())->CanStartEvent(player)) return true; } return false; @@ -860,7 +860,7 @@ public: { creature->setFaction(113); creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); } return true; } diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index e1590873455..b9b87fd5d6a 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -643,8 +643,8 @@ public: { if (_Quest->GetQuestId() == QUEST_LORD_ILLIDAN_STORMRAGE) { - CAST_AI(npc_overlord_morghor::npc_overlord_morghorAI, creature->AI())->PlayerGUID = player->GetGUID(); - CAST_AI(npc_overlord_morghor::npc_overlord_morghorAI, creature->AI())->StartEvent(); + ENSURE_AI(npc_overlord_morghor::npc_overlord_morghorAI, creature->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(npc_overlord_morghor::npc_overlord_morghorAI, creature->AI())->StartEvent(); return true; } return false; @@ -1509,7 +1509,7 @@ public: me->RemoveCorpse(); if (Creature* LordIllidan = (ObjectAccessor::GetCreature(*me, LordIllidanGUID))) if (LordIllidan) - CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, LordIllidan->AI())->LiveCounter(); + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, LordIllidan->AI())->LiveCounter(); } void UpdateAI(uint32 diff) override @@ -1644,14 +1644,14 @@ void npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave() Spawn->GetMotionMaster()->MovePoint(0, x, y, z); } } - CAST_AI(npc_illidari_spawn::npc_illidari_spawnAI, Spawn->AI())->LordIllidanGUID = me->GetGUID(); + ENSURE_AI(npc_illidari_spawn::npc_illidari_spawnAI, Spawn->AI())->LordIllidanGUID = me->GetGUID(); } if (WavesInfo[WaveCount].CreatureId == 22076) // Torloth { - CAST_AI(npc_torloth_the_magnificent::npc_torloth_the_magnificentAI, Spawn->AI())->LordIllidanGUID = me->GetGUID(); + ENSURE_AI(npc_torloth_the_magnificent::npc_torloth_the_magnificentAI, Spawn->AI())->LordIllidanGUID = me->GetGUID(); if (PlayerGUID) - CAST_AI(npc_torloth_the_magnificent::npc_torloth_the_magnificentAI, Spawn->AI())->AggroTargetGUID = PlayerGUID; + ENSURE_AI(npc_torloth_the_magnificent::npc_torloth_the_magnificentAI, Spawn->AI())->AggroTargetGUID = PlayerGUID; } } } @@ -1675,11 +1675,11 @@ public: { Creature* Illidan = player->FindNearestCreature(22083, 50); - if (Illidan && !CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted) + if (Illidan && !ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted) { - CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID(); - CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0; - CAST_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted=true; + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->PlayerGUID = player->GetGUID(); + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->LiveCount = 0; + ENSURE_AI(npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI, Illidan->AI())->EventStarted = true; } } return true; diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index c0755b6b06b..da7ae03a8ee 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -529,7 +529,7 @@ public: { if (quest->GetQuestId() == QUEST_EFTW_H || quest->GetQuestId() == QUEST_EFTW_A) { - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); + ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); creature->setFaction(113); } return true; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index f4a8d72d8c8..3bb1ed87ef5 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -392,7 +392,7 @@ public: bool OnQuestAccept(Player* /*player*/, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_CLUCK) - CAST_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); + ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); return true; } @@ -400,7 +400,7 @@ public: bool OnQuestComplete(Player* /*player*/, Creature* creature, Quest const* quest) override { if (quest->GetQuestId() == QUEST_CLUCK) - CAST_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); + ENSURE_AI(npc_chicken_cluck::npc_chicken_cluckAI, creature->AI())->Reset(); return true; } @@ -698,7 +698,7 @@ public: bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { if ((quest->GetQuestId() == 6624) || (quest->GetQuestId() == 6622)) - CAST_AI(npc_doctor::npc_doctorAI, creature->AI())->BeginEvent(player); + ENSURE_AI(npc_doctor::npc_doctorAI, creature->AI())->BeginEvent(player); return true; } @@ -769,7 +769,7 @@ public: if (player->GetQuestStatus(6624) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(6622) == QUEST_STATUS_INCOMPLETE) if (DoctorGUID) if (Creature* doctor = ObjectAccessor::GetCreature(*me, DoctorGUID)) - CAST_AI(npc_doctor::npc_doctorAI, doctor->AI())->PatientSaved(me, player, Coord); + ENSURE_AI(npc_doctor::npc_doctorAI, doctor->AI())->PatientSaved(me, player, Coord); //make not selectable me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -815,7 +815,7 @@ public: if (DoctorGUID) if (Creature* doctor = ObjectAccessor::GetCreature((*me), DoctorGUID)) - CAST_AI(npc_doctor::npc_doctorAI, doctor->AI())->PatientDied(Coord); + ENSURE_AI(npc_doctor::npc_doctorAI, doctor->AI())->PatientDied(Coord); } } }; @@ -865,8 +865,8 @@ void npc_doctor::npc_doctorAI::UpdateAI(uint32 diff) Patient->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); Patients.push_back(Patient->GetGUID()); - CAST_AI(npc_injured_patient::npc_injured_patientAI, Patient->AI())->DoctorGUID = me->GetGUID(); - CAST_AI(npc_injured_patient::npc_injured_patientAI, Patient->AI())->Coord = point; + ENSURE_AI(npc_injured_patient::npc_injured_patientAI, Patient->AI())->DoctorGUID = me->GetGUID(); + ENSURE_AI(npc_injured_patient::npc_injured_patientAI, Patient->AI())->Coord = point; Coordinates.erase(itr); } diff --git a/src/server/shared/Define.h b/src/server/shared/Define.h index 570964b8671..ad1231ec9f9 100644 --- a/src/server/shared/Define.h +++ b/src/server/shared/Define.h @@ -28,6 +28,9 @@ # if !defined(__STDC_CONSTANT_MACROS) # define __STDC_CONSTANT_MACROS # endif +# if !defined(_GLIBCXX_USE_NANOSLEEP) +# define _GLIBCXX_USE_NANOSLEEP +# endif #endif #include <cstddef> diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h index d056731bb79..64665c2b198 100644 --- a/src/server/shared/Networking/AsyncAcceptor.h +++ b/src/server/shared/Networking/AsyncAcceptor.h @@ -18,6 +18,7 @@ #ifndef __ASYNCACCEPT_H_ #define __ASYNCACCEPT_H_ +#include "Log.h" #include <boost/asio.hpp> using boost::asio::ip::tcp; @@ -49,8 +50,15 @@ private: { if (!error) { - // this-> is required here to fix an segmentation fault in gcc 4.7.2 - reason is lambdas in a templated class - std::make_shared<T>(std::move(this->_socket))->Start(); + try + { + // this-> is required here to fix an segmentation fault in gcc 4.7.2 - reason is lambdas in a templated class + std::make_shared<T>(std::move(this->_socket))->Start(); + } + catch (boost::system::system_error const& err) + { + TC_LOG_INFO("network", "Failed to retrieve client's remote address %s", err.what()); + } } // lets slap some more this-> on this so we can fix this bug with gcc 4.7.2 throwing internals in yo face diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index 38d88e3592c..6bf67e06d9c 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -37,36 +37,22 @@ class Socket : public std::enable_shared_from_this<T> typedef typename std::conditional<std::is_pointer<PacketType>::value, PacketType, PacketType const&>::type WritePacketType; public: - Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)), _headerSize(headerSize) { } + Socket(tcp::socket&& socket, std::size_t headerSize) : _socket(std::move(socket)), _headerSize(headerSize) + { + _remotePort = _socket.remote_endpoint().port(); + _remoteAddress = _socket.remote_endpoint().address(); + } virtual void Start() = 0; boost::asio::ip::address GetRemoteIpAddress() const { - boost::system::error_code error; - auto ep = _socket.remote_endpoint(error); - - if (error) - { - TC_LOG_DEBUG("network", "Socket::GetRemoteIpAddress: errored with: %i (%s)", error.value(), error.message().c_str()); - return boost::asio::ip::address(); - } - else - return ep.address(); + return _remoteAddress; } uint16 GetRemotePort() const { - boost::system::error_code error; - auto ep = _socket.remote_endpoint(error); - - if (error) - { - TC_LOG_DEBUG("network", "Socket::GetRemotePort: errored with: %i (%s)", error.value(), error.message().c_str()); - return 0; - } - else - return ep.port(); + return _remotePort; } void AsyncReadHeader() @@ -104,6 +90,12 @@ public: bool IsOpen() const { return _socket.is_open(); } void CloseSocket() { + boost::system::error_code shutdownError; + _socket.shutdown(boost::asio::socket_base::shutdown_both, shutdownError); + if (shutdownError) + TC_LOG_DEBUG("network", "Socket::CloseSocket: %s errored when shutting down socket: %i (%s)", GetRemoteIpAddress().to_string().c_str(), + shutdownError.value(), shutdownError.message().c_str()); + boost::system::error_code error; _socket.close(error); if (error) @@ -150,6 +142,9 @@ private: uint8 _readBuffer[4096]; + uint16 _remotePort; + boost::asio::ip::address _remoteAddress; + std::size_t _headerSize; }; diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp index 0a911492f85..86234039a4a 100644 --- a/src/server/shared/Packets/ByteBuffer.cpp +++ b/src/server/shared/Packets/ByteBuffer.cpp @@ -69,8 +69,8 @@ void ByteBuffer::textlike() const o << "STORAGE_SIZE: " << size(); for (uint32 i = 0; i < size(); ++i) { - char buf[1]; - snprintf(buf, 1, "%c", read<uint8>(i)); + char buf[2]; + snprintf(buf, 2, "%c", read<uint8>(i)); o << buf; } o << " "; @@ -90,7 +90,7 @@ void ByteBuffer::hexlike() const for (uint32 i = 0; i < size(); ++i) { char buf[3]; - snprintf(buf, 1, "%2X ", read<uint8>(i)); + snprintf(buf, 3, "%2X ", read<uint8>(i)); if ((i == (j * 8)) && ((i != (k * 16)))) { o << "| "; diff --git a/src/server/shared/Threading/ProcessPriority.h b/src/server/shared/Threading/ProcessPriority.h index 06a5622fb9d..23238c94ace 100644 --- a/src/server/shared/Threading/ProcessPriority.h +++ b/src/server/shared/Threading/ProcessPriority.h @@ -32,7 +32,7 @@ void SetProcessPriority(const std::string logChannel) #if PLATFORM_APPLE (void)logChannel; #endif - + #if defined(_WIN32) || defined(__linux__) ///- Handle affinity for multiple processors and process priority diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp index bf40b8ec352..f2c02510ed4 100644 --- a/src/server/shared/Utilities/Util.cpp +++ b/src/server/shared/Utilities/Util.cpp @@ -18,13 +18,14 @@ #include "Util.h" #include "Common.h" +#include "CompilerDefs.h" #include "utf8.h" #include "SFMT.h" #include "Errors.h" // for ASSERT #include <stdarg.h> #include <boost/thread/tss.hpp> -#if PLATFORM == PLATFORM_UNIX +#if COMPILER == COMPILER_GNU #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index b119b6cdbde..885dd24d760 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -63,7 +63,8 @@ namespace MMAP m_skipBattlegrounds (skipBattlegrounds), m_maxWalkableAngle (maxWalkableAngle), m_bigBaseUnit (bigBaseUnit), - m_rcContext (NULL) + m_rcContext (NULL), + _cancelationToken (false) { m_terrainBuilder = new TerrainBuilder(skipLiquid); |