diff --git a/sql/updates/world/2016_07_25_00_world.sql b/sql/updates/world/2016_07_25_00_world.sql new file mode 100644 index 0000000000..89f07652aa --- /dev/null +++ b/sql/updates/world/2016_07_25_00_world.sql @@ -0,0 +1 @@ +UPDATE `creature_template` SET `flags_extra`=128 WHERE `entry`=47319; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 601edf937e..99efaf29b9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18534,10 +18534,10 @@ void Player::_LoadQuestStatusRewarded(PreparedQueryResult result) if (uint32 talents = quest->GetBonusTalents()) AddQuestRewardedTalentCount(talents); - } - if (quest->CanIncreaseRewardedQuestCounters()) - m_RewardedQuests.insert(quest_id); + if (quest->CanIncreaseRewardedQuestCounters()) + m_RewardedQuests.insert(quest_id); + } } while (result->NextRow()); } @@ -25207,7 +25207,7 @@ bool Player::CanFlyInZone(uint32 mapid, uint32 areaid) const case 530: // Outland // Draenei and blood elves starting zones belong to Outland map, but are not flyable // These zones don't have flag AREA_FLAG_OUTLAND2 - if (sAreaTableStore.LookupEntry(areaid)->flags & AREA_FLAG_OUTLAND2) + if (sAreaTableStore.AssertEntry(areaid)->flags & AREA_FLAG_OUTLAND2) can_fly = true; default: break; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 05f576ea73..d4aabe5f06 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3365,6 +3365,7 @@ void SpellMgr::LoadSpellInfoCorrections() case 42490: // Energized! case 42492: // Cast Energized spellInfo->AttributesEx |= SPELL_ATTR1_NO_THREAT; + break; case 85123: // Siege Cannon (Tol Barad) spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ENTRY); diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp index 78f95dccae..dcdc244aef 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp @@ -47,7 +47,22 @@ class boss_pit_lord_argaloth : public CreatureScript struct boss_pit_lord_argalothAI : public BossAI { - boss_pit_lord_argalothAI(Creature* creature) : BossAI(creature, DATA_ARGALOTH) { } + boss_pit_lord_argalothAI(Creature* creature) : BossAI(creature, DATA_ARGALOTH) + { + Initialize(); + } + + void Initialize() + { + first_fel_firestorm = false; + second_fel_firestorm = false; + } + + void Reset() override + { + _Reset(); + Initialize(); + } void EnterCombat(Unit* /*who*/) override { @@ -69,13 +84,12 @@ class boss_pit_lord_argaloth : public CreatureScript void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (me->HealthBelowPctDamaged(66,damage) && !first_fel_firestorm) + if (me->HealthBelowPctDamaged(66, damage) && !first_fel_firestorm) { first_fel_firestorm = true; DoCastAOE(SPELL_FEL_FIRESTORM); } - else - if(me->HealthBelowPctDamaged(33,damage) && !second_fel_firestorm) + else if (me->HealthBelowPctDamaged(33, damage) && !second_fel_firestorm) { second_fel_firestorm = true; DoCastAOE(SPELL_FEL_FIRESTORM); @@ -120,6 +134,7 @@ class boss_pit_lord_argaloth : public CreatureScript DoMeleeAttackIfReady(); } + private: bool first_fel_firestorm; bool second_fel_firestorm; diff --git a/src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp b/src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp index 28ed5ab6dc..dfde235597 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp @@ -72,8 +72,7 @@ enum Events EVENT_COUNTDOWN = 5, EVENT_BERSERK = 6, - EVENT_SHARD_SPAWN_EFFECT = 7, - EVENT_UNLOCK_YELLSPAM = 8 + EVENT_SHARD_SPAWN_EFFECT = 7 }; enum Emotes @@ -108,8 +107,6 @@ class boss_baleroc : public CreatureScript { boss_balerocAI(Creature* creature) : BossAI(creature, DATA_BALEROC) { } - bool _canYellKilledPlayer; - void Reset() override { _Reset(); @@ -156,12 +153,11 @@ class boss_baleroc : public CreatureScript void KilledUnit(Unit* who) override { - if (who->GetTypeId() == TYPEID_PLAYER && _canYellKilledPlayer) - { - _canYellKilledPlayer = false; - events.ScheduleEvent(EVENT_UNLOCK_YELLSPAM, 8000); + if (who->GetTypeId() != TYPEID_PLAYER) + return; + + if (!(rand32() % 5)) Talk(EMOTE_KILL); - } } void JustDied(Unit* /*killer*/) override @@ -281,9 +277,6 @@ class boss_baleroc : public CreatureScript Talk(EMOTE_ENRAGE); Talk(EMOTE_ENRAGE_2); break; - case EVENT_UNLOCK_YELLSPAM: - _canYellKilledPlayer = true; - break; default: break; } @@ -362,7 +355,6 @@ class npc_shard_of_torment : public CreatureScript DoCast(SPELL_TORMENT_COSMETIC_1); _events.ScheduleEvent(EVENT_SHARD_SPAWN_EFFECT, 5000); me->SetInCombatWithZone(); - _baleroc = summoner->ToCreature(); } else me->DespawnOrUnsummon(); @@ -371,8 +363,8 @@ class npc_shard_of_torment : public CreatureScript void KilledUnit(Unit* who) override { if (who->GetTypeId() == TYPEID_PLAYER) - if (_baleroc) - _baleroc->AI()->KilledUnit(who); + if (Creature* baleroc = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BALEROC))) + baleroc->AI()->KilledUnit(who); } void UpdateAI(uint32 diff) override @@ -396,7 +388,6 @@ class npc_shard_of_torment : public CreatureScript private: InstanceScript* _instance; EventMap _events; - Creature* _baleroc; }; CreatureAI* GetAI(Creature* creature) const @@ -416,6 +407,8 @@ class spell_countdown_p1 : public SpellScriptLoader bool Load() override { + target1 = nullptr; + target2 = nullptr; return GetCaster()->GetTypeId() == TYPEID_UNIT; } @@ -433,10 +426,9 @@ class spell_countdown_p1 : public SpellScriptLoader void FilterTargets(std::list& targets) { - //Remove current tank if we have one - if (GetCaster()->GetVictim()) - targets.remove(GetCaster()->ToCreature()->GetVictim()); + if (Unit* victim = GetCaster()->GetVictim()) + targets.remove(victim); if (targets.size() < 2) { @@ -445,11 +437,8 @@ class spell_countdown_p1 : public SpellScriptLoader } Trinity::Containers::RandomResizeList(targets, 2); - - std::list::const_iterator itr = targets.begin(); - target1 = (*itr); - itr++; - target2 = (*itr); + target1 = targets.front(); + target2 = targets.back(); } void Register() override @@ -676,24 +665,26 @@ class spell_baleroc_torment : public SpellScriptLoader if (targets.empty()) { //No targets found, start pulsating immediately. - GetCaster()->ToCreature()->AI()->DoCast(SPELL_WAVE_OF_TORMENT); + GetCaster()->GetAI()->DoCast(SPELL_WAVE_OF_TORMENT); return; } targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster(), true)); - targets.resize(1); + WorldObject* target = targets.front(); + if (target->GetTypeId() != TYPEID_PLAYER) + return; - if ((*targets.begin())->GetDistance2d(GetCaster()) > 15.0f) - GetCaster()->ToCreature()->AI()->DoCast(SPELL_WAVE_OF_TORMENT); + if (target->GetDistance2d(GetCaster()) > 15.0f) + GetCaster()->GetAI()->DoCast(SPELL_WAVE_OF_TORMENT); else { - if ((*targets.begin())->ToPlayer()->GetAura(SPELL_TORMENT_PERIODIC)) - if ((*targets.begin())->ToPlayer()->GetAura(SPELL_TORMENT_PERIODIC)->GetCaster() != GetCaster()) - GetCaster()->CastSpell((*targets.begin())->ToPlayer(), SPELL_TORMENT_PERIODIC, false); - else{ - } + if (Aura* torment = target->ToPlayer()->GetAura(SPELL_TORMENT_PERIODIC)) + { + if (torment->GetCaster() != GetCaster()) + GetCaster()->CastSpell(target->ToPlayer(), SPELL_TORMENT_PERIODIC, false); + } else - GetCaster()->CastSpell((*targets.begin())->ToPlayer(), SPELL_TORMENT_PERIODIC, false); + GetCaster()->CastSpell(target->ToPlayer(), SPELL_TORMENT_PERIODIC, false); } } diff --git a/src/server/scripts/Kalimdor/VortexPinnacle/boss_altairus.cpp b/src/server/scripts/Kalimdor/VortexPinnacle/boss_altairus.cpp index 0dadb5b6ed..70ec2a73f1 100644 --- a/src/server/scripts/Kalimdor/VortexPinnacle/boss_altairus.cpp +++ b/src/server/scripts/Kalimdor/VortexPinnacle/boss_altairus.cpp @@ -350,7 +350,7 @@ class spell_upwind_of_altairus : public SpellScriptLoader } private: - float upwindDistance; + float upwindDistance = 0.f; }; SpellScript* GetSpellScript() const override diff --git a/src/server/scripts/Kalimdor/VortexPinnacle/boss_asaad.cpp b/src/server/scripts/Kalimdor/VortexPinnacle/boss_asaad.cpp index 5e324ba1cd..c780110fa8 100644 --- a/src/server/scripts/Kalimdor/VortexPinnacle/boss_asaad.cpp +++ b/src/server/scripts/Kalimdor/VortexPinnacle/boss_asaad.cpp @@ -101,65 +101,67 @@ enum Events enum Points { - POINT_STORM_A, + POINT_STORM_A = 1, POINT_STORM_B, POINT_STORM_C, }; +float const TRIANGLE_Z = 646.7143f; + uint32 const StormTargetPositions = 39; Position const StormTargetPositionData[StormTargetPositions] = { - { -633.771f, 490.976f, 646.7143f, 3.141593f }, // 56889 - { -625.688f, 501.934f, 646.7143f, 3.141593f }, // 56890 - { -620.226f, 490.892f, 646.7143f, 3.141593f }, // 56891 + { -633.771f, 490.976f, TRIANGLE_Z, 3.141593f }, // 56889 + { -625.688f, 501.934f, TRIANGLE_Z, 3.141593f }, // 56890 + { -620.226f, 490.892f, TRIANGLE_Z, 3.141593f }, // 56891 - { -649.906f, 494.905f, 646.7143f, 3.141593f }, // 56892 - { -643.214f, 503.953f, 646.7143f, 3.141593f }, // 56893 - { -640.542f, 487.474f, 646.7143f, 3.141593f }, // 56894 + { -649.906f, 494.905f, TRIANGLE_Z, 3.141593f }, // 56892 + { -643.214f, 503.953f, TRIANGLE_Z, 3.141593f }, // 56893 + { -640.542f, 487.474f, TRIANGLE_Z, 3.141593f }, // 56894 - { -637.839f, 516.186f, 646.7143f, 1.099557f }, // 56895 - { -634.068f, 507.51f, 646.7143f, 1.099557f }, // 56896 - { -650.894f, 509.323f, 646.7143f, 1.099557f }, // 56897 + { -637.839f, 516.186f, TRIANGLE_Z, 1.099557f }, // 56895 + { -634.068f, 507.51f, TRIANGLE_Z, 1.099557f }, // 56896 + { -650.894f, 509.323f, TRIANGLE_Z, 1.099557f }, // 56897 - { -637.01f, 530.09f, 646.7143f, 1.099557f }, // 56898 - { -632.167f, 521.153f, 646.7143f, 1.099557f }, // 56899 - { -646.939f, 519.566f, 646.7143f, 1.099557f }, // 56900 + { -637.01f, 530.09f, TRIANGLE_Z, 1.099557f }, // 56898 + { -632.167f, 521.153f, TRIANGLE_Z, 1.099557f }, // 56899 + { -646.939f, 519.566f, TRIANGLE_Z, 1.099557f }, // 56900 - { -628.512f, 516.988f, 646.7143f, 1.099557f }, // 56901 - { -622.184f, 507.908f, 646.7143f, 1.099557f }, // 56902 - { -633.148f, 499.762f, 646.7143f, 1.099557f }, // 56903 + { -628.512f, 516.988f, TRIANGLE_Z, 1.099557f }, // 56901 + { -622.184f, 507.908f, TRIANGLE_Z, 1.099557f }, // 56902 + { -633.148f, 499.762f, TRIANGLE_Z, 1.099557f }, // 56903 - { -615.528f, 515.944f, 646.7143f, 1.099557f }, // 56904 - { -609.41f, 504.675f, 646.7143f, 1.099557f }, // 56905 - { -618.748f, 501.946f, 646.7143f, 1.099557f }, // 56906 + { -615.528f, 515.944f, TRIANGLE_Z, 1.099557f }, // 56904 + { -609.41f, 504.675f, TRIANGLE_Z, 1.099557f }, // 56905 + { -618.748f, 501.946f, TRIANGLE_Z, 1.099557f }, // 56906 - { -600.986f, 522.576f, 646.7143f, 1.099557f }, // 56907 - { -594.96f, 507.582f, 646.7143f, 1.099557f }, // 56908 - { -605.094f, 509.141f, 646.7143f, 1.099557f }, // 56909 + { -600.986f, 522.576f, TRIANGLE_Z, 1.099557f }, // 56907 + { -594.96f, 507.582f, TRIANGLE_Z, 1.099557f }, // 56908 + { -605.094f, 509.141f, TRIANGLE_Z, 1.099557f }, // 56909 - { -617.269f, 521.168f, 646.7143f, 0.0f }, // 56910 - { -606.75f, 530.002f, 646.7143f, 0.0f }, // 56911 - { -608.832f, 515.175f, 646.7143f, 0.0f }, // 56912 + { -617.269f, 521.168f, TRIANGLE_Z, 0.0f }, // 56910 + { -606.75f, 530.002f, TRIANGLE_Z, 0.0f }, // 56911 + { -608.832f, 515.175f, TRIANGLE_Z, 0.0f }, // 56912 - { -627.957f, 529.927f, 646.7143f, 0.0f }, // 56913 - { -616.997f, 530.564f, 646.7143f, 0.0f }, // 56914 - { -621.91f, 517.644f, 646.7143f, 0.0f }, // 56915 + { -627.957f, 529.927f, TRIANGLE_Z, 0.0f }, // 56913 + { -616.997f, 530.564f, TRIANGLE_Z, 0.0f }, // 56914 + { -621.91f, 517.644f, TRIANGLE_Z, 0.0f }, // 56915 - { -604.839f, 485.186f, 646.7143f, 3.141593f }, // 56916 - { -616.885f, 496.186f, 646.7143f, 3.141593f }, // 56917 - { -606.833f, 500.078f, 646.7143f, 3.141593f }, // 56918 + { -604.839f, 485.186f, TRIANGLE_Z, 3.141593f }, // 56916 + { -616.885f, 496.186f, TRIANGLE_Z, 3.141593f }, // 56917 + { -606.833f, 500.078f, TRIANGLE_Z, 3.141593f }, // 56918 - { -600.387f, 482.604f, 646.7143f, 3.141593f }, // 56919 - { -602.899f, 497.245f, 646.7143f, 3.141593f }, // 56920 - { -592.599f, 500.392f, 646.7143f, 3.141593f }, // 56921 + { -600.387f, 482.604f, TRIANGLE_Z, 3.141593f }, // 56919 + { -602.899f, 497.245f, TRIANGLE_Z, 3.141593f }, // 56920 + { -592.599f, 500.392f, TRIANGLE_Z, 3.141593f }, // 56921 - { -622.946f, 483.113f, 646.7143f, 3.141593f }, // 56922 - { -613.104f, 488.776f, 646.7143f, 3.141593f }, // 56923 - { -606.915f, 477.097f, 646.7143f, 3.141593f }, // 56924 + { -622.946f, 483.113f, TRIANGLE_Z, 3.141593f }, // 56922 + { -613.104f, 488.776f, TRIANGLE_Z, 3.141593f }, // 56923 + { -606.915f, 477.097f, TRIANGLE_Z, 3.141593f }, // 56924 - { -640.717f, 480.623f, 646.7143f, 3.141593f }, // 56925 - { -627.049f, 486.917f, 646.7143f, 3.141593f }, // 56926 - { -623.059f, 476.104f, 646.7143f, 3.141593f }, // 56927 + { -640.717f, 480.623f, TRIANGLE_Z, 3.141593f }, // 56925 + { -627.049f, 486.917f, TRIANGLE_Z, 3.141593f }, // 56926 + { -623.059f, 476.104f, TRIANGLE_Z, 3.141593f }, // 56927 }; class boss_asaad : public CreatureScript @@ -169,11 +171,15 @@ class boss_asaad : public CreatureScript struct boss_asaadAI : public BossAI { - boss_asaadAI(Creature* creature) : BossAI(creature, DATA_ASAAD) { } + boss_asaadAI(Creature* creature) : BossAI(creature, DATA_ASAAD) + { + stormTargetGUIDs.reserve(StormTargetPositions); + } void Reset() override { _Reset(); + stormTargetGUIDs.clear(); me->SetReactState(REACT_AGGRESSIVE); @@ -191,7 +197,7 @@ class boss_asaad : public CreatureScript Talk(SAY_AGGRO); // Spawn Storm Targets - for (uint32 i = 0; i < StormTargetPositions; i++) + for (uint32 i = 0; i < StormTargetPositions; ++i) if (Creature* stormTarget = me->SummonCreature(NPC_STORM_TARGET, StormTargetPositionData[i])) stormTargetGUIDs.push_back(stormTarget->GetGUID()); } @@ -213,19 +219,25 @@ class boss_asaad : public CreatureScript if (spellInfo->Id != SPELL_SOTS_TARGETING || target->GetEntry() != NPC_STORM_TARGET) return; - stormTargetA = target->ToCreature(); + selectedStormTargets[0] = target->GetGUID(); + auto itr = std::find(stormTargetGUIDs.begin(), stormTargetGUIDs.end(), target->GetGUID()); + ASSERT(itr != stormTargetGUIDs.end()); - for (uint32 i = 0; i < StormTargetPositions; i++) + uint8 index = uint8(std::distance(stormTargetGUIDs.begin(), itr)); + switch (index % 3) { - if (stormTargetGUIDs[i] != target->GetGUID()) - continue; - - stormTargetB = ObjectAccessor::GetCreature(*me, stormTargetGUIDs[i % 3 == 0 ? i + 1 : (i % 3 == 1 ? i - 1 : i - 2)]); - stormTargetC = ObjectAccessor::GetCreature(*me, stormTargetGUIDs[i % 3 == 0 ? i + 2 : (i % 3 == 1 ? i + 1 : i - 1)]); - - ASSERT(stormTargetB); - ASSERT(stormTargetC); - break; + case 0: + selectedStormTargets[1] = stormTargetGUIDs.at(index + 1); + selectedStormTargets[2] = stormTargetGUIDs.at(index + 2); + break; + case 1: + selectedStormTargets[1] = stormTargetGUIDs.at(index - 1); + selectedStormTargets[2] = stormTargetGUIDs.at(index + 1); + break; + case 2: + selectedStormTargets[1] = stormTargetGUIDs.at(index - 2); + selectedStormTargets[2] = stormTargetGUIDs.at(index - 1); + break; } } @@ -305,38 +317,55 @@ class boss_asaad : public CreatureScript DoMeleeAttackIfReady(); } - Creature* GetSelectedStormTarget(uint32 point) + ObjectGuid GetGUID(int32 type) const override { - if (point == POINT_STORM_A) - return stormTargetA; - if (point == POINT_STORM_B) - return stormTargetB; - if (point == POINT_STORM_C) - return stormTargetC; - return NULL; + switch (type) + { + case POINT_STORM_A: + case POINT_STORM_B: + case POINT_STORM_C: + return selectedStormTargets[type - POINT_STORM_A]; + default: + break; + } + + return ObjectGuid::Empty; } - Position GetTriangleCenterPosition() + Position GetTriangleCenterPosition() const { Position pos; - pos.m_positionX = (stormTargetA->GetPositionX() + stormTargetB->GetPositionX() + stormTargetC->GetPositionX()) / 3; - pos.m_positionY = (stormTargetA->GetPositionY() + stormTargetB->GetPositionY() + stormTargetC->GetPositionY()) / 3; - pos.m_positionZ = stormTargetA->GetPositionZ() + 8.0f; + pos.m_positionZ = TRIANGLE_Z + 8.f; + + for (uint8 i = 0; i < 3; ++i) + { + if (Creature* stormTarget = ObjectAccessor::GetCreature(*me, selectedStormTargets[i])) + { + pos.m_positionX += stormTarget->m_positionX; + pos.m_positionY += stormTarget->m_positionY; + } + } + + pos.m_positionX /= 3.f; + pos.m_positionY /= 3.f; return pos; } void ResetStormTargets() { - stormTargetA->CastStop(); - stormTargetB->CastStop(); - stormTargetC->CastStop(); + for (uint8 i = 0; i < 3; ++i) + { + if (Creature* stormTarget = ObjectAccessor::GetCreature(*me, selectedStormTargets[i])) + stormTarget->CastStop(); + + selectedStormTargets[i].Clear(); + } } private: + GuidVector stormTargetGUIDs; - Creature* stormTargetA; - Creature* stormTargetB; - Creature* stormTargetC; + std::array selectedStormTargets; }; CreatureAI* GetAI(Creature* creature) const override @@ -362,24 +391,23 @@ public: if (action != ACTION_SOTS_TARGET) return; - events.ScheduleEvent(EVENT_SOTS_SUMMON, 400); + _events.ScheduleEvent(EVENT_SOTS_SUMMON, 400); } void JustSummoned(Creature* creature) override { - if (InstanceScript* instance = me->GetInstanceScript()) - if (Creature* asaad = instance->GetCreature(DATA_ASAAD)) - ENSURE_AI(AsaadAI, asaad->AI())->JustSummoned(creature); + if (Creature* asaad = _instance->GetCreature(DATA_ASAAD)) + asaad->AI()->JustSummoned(creature); } void UpdateAI(uint32 diff) override { - if (events.Empty()) + if (_events.Empty()) return; - events.Update(diff); + _events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { @@ -393,7 +421,8 @@ public: } private: - EventMap events; + EventMap _events; + InstanceScript* _instance; }; CreatureAI* GetAI(Creature* creature) const override @@ -410,14 +439,10 @@ public: struct npc_unstable_grounding_fieldAI : public ScriptedAI { - npc_unstable_grounding_fieldAI(Creature* creature) : ScriptedAI(creature) + npc_unstable_grounding_fieldAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - if (InstanceScript* instance = me->GetInstanceScript()) - if (Creature* asaad = instance->GetCreature(DATA_ASAAD)) - asaadAI = CAST_AI(AsaadAI, asaad->AI()); - me->SetWalk(true); - events.ScheduleEvent(EVENT_STORM_ASSAD_CHANNEL, 400); + _events.ScheduleEvent(EVENT_STORM_ASSAD_CHANNEL, 400); } void MovementInform(uint32 movementType, uint32 pointId) override @@ -425,27 +450,32 @@ public: if (movementType != POINT_MOTION_TYPE) return; + Creature* asaad = _instance->GetCreature(DATA_ASAAD); + if (!asaad) + return; + switch (pointId) { case POINT_STORM_B: - if (Creature* stormTargetB = asaadAI->GetSelectedStormTarget(POINT_STORM_B)) + if (Creature* stormTargetB = ObjectAccessor::GetCreature(*me, asaad->AI()->GetGUID(POINT_STORM_B))) stormTargetB->CastSpell((Unit*)NULL, SPELL_STORM_RUNE_BEAM_A); - events.ScheduleEvent(EVENT_STORM_MOVE_C, 1200); + _events.ScheduleEvent(EVENT_STORM_MOVE_C, 1200); break; case POINT_STORM_C: - if (Creature* stormTargetB = asaadAI->GetSelectedStormTarget(POINT_STORM_C)) - stormTargetB->CastSpell((Unit*)NULL, SPELL_STORM_RUNE_BEAM_B); - events.ScheduleEvent(EVENT_STORM_MOVE_A, 1200); + if (Creature* stormTargetC = ObjectAccessor::GetCreature(*me, asaad->AI()->GetGUID(POINT_STORM_C))) + stormTargetC->CastSpell((Unit*)NULL, SPELL_STORM_RUNE_BEAM_B); + _events.ScheduleEvent(EVENT_STORM_MOVE_A, 1200); break; case POINT_STORM_A: { - if (Creature* stormTargetB = asaadAI->GetSelectedStormTarget(POINT_STORM_A)) - stormTargetB->CastSpell((Unit*)NULL, SPELL_STORM_RUNE_BEAM_C); + if (Creature* stormTargetA = ObjectAccessor::GetCreature(*me, asaad->AI()->GetGUID(POINT_STORM_A))) + stormTargetA->CastSpell((Unit*)NULL, SPELL_STORM_RUNE_BEAM_C); DoCast(me, SPELL_STORM_SUMMON_GROUNDING_FIELD); - Position pos = asaadAI->GetTriangleCenterPosition(); + + Position pos = ENSURE_AI(AsaadAI, asaad->AI())->GetTriangleCenterPosition(); me->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_STORM_SUMMON_GROUNDING_FIELD, true); - events.ScheduleEvent(EVENT_STORM_ASAAD_TELEPORT, 500); + _events.ScheduleEvent(EVENT_STORM_ASAAD_TELEPORT, 500); break; } default: @@ -455,40 +485,44 @@ public: void UpdateAI(uint32 diff) override { - if (events.Empty()) + if (_events.Empty()) return; - events.Update(diff); + _events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_STORM_ASSAD_CHANNEL: DoCast(me, SPELL_SOTS_TRIGGER); - events.ScheduleEvent(EVENT_STORM_RUNE_BEAM_AA, 400); + _events.ScheduleEvent(EVENT_STORM_RUNE_BEAM_AA, 400); break; case EVENT_STORM_RUNE_BEAM_AA: DoCast(me, SPELL_STORM_RUNE_BEAM_AA); - events.ScheduleEvent(EVENT_STORM_MOVE_B, 800); + _events.ScheduleEvent(EVENT_STORM_MOVE_B, 800); break; case EVENT_STORM_MOVE_B: - if (Creature* stormTargetB = asaadAI->GetSelectedStormTarget(POINT_STORM_B)) - me->GetMotionMaster()->MovePoint(POINT_STORM_B, stormTargetB->GetPosition()); + if (Creature* asaad = _instance->GetCreature(DATA_ASAAD)) + if (Creature* stormTargetB = ObjectAccessor::GetCreature(*me, asaad->AI()->GetGUID(POINT_STORM_B))) + me->GetMotionMaster()->MovePoint(POINT_STORM_B, stormTargetB->GetPosition()); break; case EVENT_STORM_MOVE_C: DoCast(me, SPELL_STORM_RUNE_BEAM_B); - if (Creature* stormTargetC = asaadAI->GetSelectedStormTarget(POINT_STORM_C)) - me->GetMotionMaster()->MovePoint(POINT_STORM_C, stormTargetC->GetPosition()); + if (Creature* asaad = _instance->GetCreature(DATA_ASAAD)) + if (Creature* stormTargetC = ObjectAccessor::GetCreature(*me, asaad->AI()->GetGUID(POINT_STORM_C))) + me->GetMotionMaster()->MovePoint(POINT_STORM_C, stormTargetC->GetPosition()); break; case EVENT_STORM_MOVE_A: me->CastStop(); DoCast(me, SPELL_STORM_RUNE_BEAM_C); - if (Creature* stormTargetA = asaadAI->GetSelectedStormTarget(POINT_STORM_A)) - me->GetMotionMaster()->MovePoint(POINT_STORM_A, stormTargetA->GetPosition()); + if (Creature* asaad = _instance->GetCreature(DATA_ASAAD)) + if (Creature* stormTargetA = ObjectAccessor::GetCreature(*me, asaad->AI()->GetGUID(POINT_STORM_A))) + me->GetMotionMaster()->MovePoint(POINT_STORM_A, stormTargetA->GetPosition()); break; case EVENT_STORM_ASAAD_TELEPORT: - asaadAI->DoAction(ACTION_SUPREMACY_OF_THE_STORM); + if (Creature* asaad = _instance->GetCreature(DATA_ASAAD)) + asaad->AI()->DoAction(ACTION_SUPREMACY_OF_THE_STORM); me->DespawnOrUnsummon(700); break; default: @@ -498,8 +532,8 @@ public: } private: - AsaadAI* asaadAI; - EventMap events; + EventMap _events; + InstanceScript* _instance; }; CreatureAI* GetAI(Creature* creature) const override @@ -648,13 +682,13 @@ public: { case SPELL_STORM_RUNE_BEAM_AA: case SPELL_STORM_RUNE_BEAM_A: - target = ENSURE_AI(AsaadAI, asaad->AI())->GetSelectedStormTarget(POINT_STORM_A); + target = ObjectAccessor::GetCreature(*asaad, asaad->AI()->GetGUID(POINT_STORM_A)); break; case SPELL_STORM_RUNE_BEAM_B: - target = ENSURE_AI(AsaadAI, asaad->AI())->GetSelectedStormTarget(POINT_STORM_B); + target = ObjectAccessor::GetCreature(*asaad, asaad->AI()->GetGUID(POINT_STORM_B)); break; case SPELL_STORM_RUNE_BEAM_C: - target = ENSURE_AI(AsaadAI, asaad->AI())->GetSelectedStormTarget(POINT_STORM_C); + target = ObjectAccessor::GetCreature(*asaad, asaad->AI()->GetGUID(POINT_STORM_C)); break; default: break; @@ -706,12 +740,14 @@ public: } private: + Creature* GetStormTarget(uint32 point) { if (InstanceScript* instance = GetCaster()->GetInstanceScript()) if (Creature* asaad = instance->GetCreature(DATA_ASAAD)) - return ENSURE_AI(AsaadAI, asaad->AI())->GetSelectedStormTarget(point); - return NULL; + ObjectAccessor::GetCreature(*GetCaster(), asaad->AI()->GetGUID(point)); + + return nullptr; } }; @@ -741,12 +777,14 @@ public: if (!asaad) return; - AsaadAI* asaadAI = CAST_AI(AsaadAI, asaad->AI()); + Creature* stormTargetA = ObjectAccessor::GetCreature(*asaad, asaad->AI()->GetGUID(POINT_STORM_A)); + Creature* stormTargetB = ObjectAccessor::GetCreature(*asaad, asaad->AI()->GetGUID(POINT_STORM_B)); + Creature* stormTargetC = ObjectAccessor::GetCreature(*asaad, asaad->AI()->GetGUID(POINT_STORM_C)); - if (Creature* stormTargetA = asaadAI->GetSelectedStormTarget(POINT_STORM_A)) - if (Creature* stormTargetB = asaadAI->GetSelectedStormTarget(POINT_STORM_B)) - if (Creature* stormTargetC = asaadAI->GetSelectedStormTarget(POINT_STORM_C)) - targets.remove_if(TargetInTriangleCheck(false, stormTargetA->GetPosition(), stormTargetB->GetPosition(), stormTargetC->GetPosition())); + if (!stormTargetA || !stormTargetB || !stormTargetC) + return; + + targets.remove_if(TargetInTriangleCheck(false, stormTargetA->GetPosition(), stormTargetB->GetPosition(), stormTargetC->GetPosition())); } void Register() override diff --git a/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.cpp b/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.cpp index c84bbd7551..dde06e7e6d 100644 --- a/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.cpp +++ b/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.cpp @@ -883,10 +883,14 @@ public: { PrepareSpellScript(spell_grounding_field_SpellScript); - void GetNearbyGroundFields() + bool Load() override { prevent = false; + return true; + } + void GetNearbyGroundFields() + { std::list groundingFields; GetCaster()->GetCreatureListWithEntryInGrid(groundingFields, NPC_GROUNDING_FIELD, 60.0f); diff --git a/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.h b/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.h index 7ed48e7af3..0db2c0ee45 100644 --- a/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.h +++ b/src/server/scripts/Kalimdor/VortexPinnacle/vortex_pinnacle.h @@ -80,31 +80,32 @@ class TargetInTriangleCheck { public: TargetInTriangleCheck(bool negate, Position positionA, Position positionB, Position positionC) - : negate(negate), positionA(positionA), positionB(positionB), positionC(positionC) { } + : _negate(negate), _positionA(positionA), _positionB(positionB), _positionC(positionC) { } bool operator()(WorldObject* target) const { - return negate != IsInTriangle(target); + return _negate != IsInTriangle(target); } private: + bool IsInTriangle(WorldObject* target) const { - G3D::Triangle const triangle(PositionToVector3(positionA), PositionToVector3(positionB), PositionToVector3(positionC)); - G3D::Vector3 const vector(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); - float b[3]; - return G3D::CollisionDetection::isPointInsideTriangle(triangle.vertex(0), triangle.vertex(1), triangle.vertex(2), triangle.normal(), vector, b, triangle.primaryAxis()); + G3D::Triangle const triangle(PositionToVector3(_positionA), PositionToVector3(_positionB), PositionToVector3(_positionC)); + G3D::Vector3 const vector(PositionToVector3(*target)); + + return G3D::CollisionDetection::isPointInsideTriangle(triangle.vertex(0), triangle.vertex(1), triangle.vertex(2), triangle.normal(), vector, triangle.primaryAxis()); } - G3D::Vector3 PositionToVector3(Position const& position) const + inline static G3D::Vector3 PositionToVector3(Position const& position) { return G3D::Vector3(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ()); } - bool const negate; - Position const positionA; - Position const positionB; - Position const positionC; + bool _negate; + Position _positionA; + Position _positionB; + Position _positionC; }; #endif // DEF_VORTEX_PINNACLE_H