diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 1cf8e89f7..a93ff83bf 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -1863,7 +1863,6 @@ struct dragonmaw_race_npc : public ScriptedAI { dragonmaw_race_npc(Creature* creature) : ScriptedAI(creature) { - _player = nullptr; } void Reset() override @@ -1873,14 +1872,17 @@ struct dragonmaw_race_npc : public ScriptedAI me->SetWalk(true); me->SetDisableGravity(false); me->GetMotionMaster()->MoveIdle(); + _playerGUID.Clear(); } void sQuestAccept(Player* player, Quest const* /*quest*/) override { - _player = player; me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER); - if (_player) - Talk(SAY_START, _player); + if (player) + { + _playerGUID = player->GetGUID(); + Talk(SAY_START, player); + } switch (me->GetEntry()) { @@ -1915,38 +1917,38 @@ struct dragonmaw_race_npc : public ScriptedAI void StartRace() { me->SetWalk(false); + ScheduleTimedEvent(5s, [&] { - if (!_player) - FailQuest(); - else if (!me->IsWithinDist(_player, 100.f)) - FailQuest(); + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player || !me->IsWithinDist(player, 100.f)) + FailQuest(player); }, 5s); } - void FailQuest() + void FailQuest(Player *player) { - if (_player) + if (player) { switch (me->GetEntry()) { case NPC_MUCKJAW: - _player->FailQuest(QUEST_MUCKJAW); + player->FailQuest(QUEST_MUCKJAW); break; case NPC_TROPE: - _player->FailQuest(QUEST_TROPE); + player->FailQuest(QUEST_TROPE); break; case NPC_CORLOK: - _player->FailQuest(QUEST_CORLOK); + player->FailQuest(QUEST_CORLOK); break; case NPC_ICHMAN: - _player->FailQuest(QUEST_ICHMAN); + player->FailQuest(QUEST_ICHMAN); break; case NPC_MULVERICK: - _player->FailQuest(QUEST_MULVERICK); + player->FailQuest(QUEST_MULVERICK); break; case NPC_SKYSHATTER: - _player->FailQuest(QUEST_SKYSHATTER); + player->FailQuest(QUEST_SKYSHATTER); break; default: break; @@ -1962,7 +1964,11 @@ struct dragonmaw_race_npc : public ScriptedAI * Timers are placeholders * After spawned, the rest is done via SmartAI */ - if (!_player) + if (_playerGUID.IsEmpty()) + return; + + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) return; switch (me->GetEntry()) @@ -1970,85 +1976,79 @@ struct dragonmaw_race_npc : public ScriptedAI case NPC_MUCKJAW: ScheduleTimedEvent(4s, [&] { - if (_player) - { - Position summonPos; - summonPos = me->GetRandomPoint(_player->GetPosition(), 15.f); - summonPos.m_positionZ = _player->GetPositionZ(); // So they don't spawn at ground height - me->SummonCreature(NPC_TARGET_MUCKJAW, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); - } - else + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) return; + + Position summonPos; + summonPos = me->GetRandomPoint(player->GetPosition(), 15.f); + summonPos.m_positionZ = player->GetPositionZ(); // So they don't spawn at ground height + me->SummonCreature(NPC_TARGET_MUCKJAW, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); }, 4s, 8s); break; case NPC_TROPE: ScheduleTimedEvent(4s, [&] { - if (_player) - { - Position summonPos; - summonPos = me->GetRandomPoint(_player->GetPosition(), 10.f); - summonPos.m_positionZ = _player->GetPositionZ(); - me->SummonCreature(NPC_TARGET_TROPE, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); - } - else - return; + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) + return; + + Position summonPos; + summonPos = me->GetRandomPoint(player->GetPosition(), 10.f); + summonPos.m_positionZ = player->GetPositionZ(); + me->SummonCreature(NPC_TARGET_TROPE, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); }, 1s, 3s); break; case NPC_CORLOK: ScheduleTimedEvent(4s, [&] { - if (_player) - { - Position summonPos; - summonPos = me->GetRandomPoint(_player->GetPosition(), 10.f); - summonPos.m_positionZ = _player->GetPositionZ(); - me->SummonCreature(NPC_TARGET_CORLOK, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); - } - else - return; + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) + return; + + Position summonPos; + summonPos = me->GetRandomPoint(player->GetPosition(), 10.f); + summonPos.m_positionZ = player->GetPositionZ(); + me->SummonCreature(NPC_TARGET_CORLOK, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); }, 1s, 3s); break; case NPC_ICHMAN: ScheduleTimedEvent(4s, [&] { - if (_player) - { - Position summonPos; - summonPos = me->GetRandomPoint(_player->GetPosition(), 10.f); - summonPos.m_positionZ = _player->GetPositionZ(); - me->SummonCreature(NPC_TARGET_ICHMAN, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); - } - else - return; + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) + return; + + Position summonPos; + summonPos = me->GetRandomPoint(player->GetPosition(), 10.f); + summonPos.m_positionZ = player->GetPositionZ(); + me->SummonCreature(NPC_TARGET_ICHMAN, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); }, 1s, 3s); break; case NPC_MULVERICK: ScheduleTimedEvent(4s, [&] { - if (_player) - { - Position summonPos; - summonPos = me->GetRandomPoint(_player->GetPosition(), 10.f); - summonPos.m_positionZ = _player->GetPositionZ(); - me->SummonCreature(NPC_TARGET_MULVERICK, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); - } - else - return; + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) + return; + + Position summonPos; + summonPos = me->GetRandomPoint(player->GetPosition(), 10.f); + summonPos.m_positionZ = player->GetPositionZ(); + me->SummonCreature(NPC_TARGET_MULVERICK, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); }, 1s, 3s); break; case NPC_SKYSHATTER: ScheduleTimedEvent(4s, [&] { - if (_player) - { - Position summonPos; - summonPos = me->GetRandomPoint(_player->GetPosition(), 7.f); - summonPos.m_positionZ = _player->GetPositionZ(); // So they don't spawn at ground height - me->SummonCreature(NPC_TARGET_SKYSHATTER, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); - } - else - return; + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) + return; + + Position summonPos; + summonPos = me->GetRandomPoint(player->GetPosition(), 7.f); + summonPos.m_positionZ = player->GetPositionZ(); // So they don't spawn at ground height + me->SummonCreature(NPC_TARGET_SKYSHATTER, summonPos, TEMPSUMMON_TIMED_DESPAWN, 10000); }, 1s, 3s); break; default: @@ -2063,32 +2063,33 @@ struct dragonmaw_race_npc : public ScriptedAI me->SetDisableGravity(false); me->SetWalk(true); - if (_player) + Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID); + if (!player) + return; + + Talk(SAY_COMPLETE, player); + switch (me->GetEntry()) { - Talk(SAY_COMPLETE, _player); - switch (me->GetEntry()) - { - case NPC_MUCKJAW: - _player->AreaExploredOrEventHappens(QUEST_MUCKJAW); - break; - case NPC_TROPE: - _player->AreaExploredOrEventHappens(QUEST_TROPE); - break; - case NPC_CORLOK: - _player->AreaExploredOrEventHappens(QUEST_CORLOK); - break; - case NPC_ICHMAN: - _player->AreaExploredOrEventHappens(QUEST_ICHMAN); - break; - case NPC_MULVERICK: - _player->AreaExploredOrEventHappens(QUEST_MULVERICK); - break; - case NPC_SKYSHATTER: - _player->AreaExploredOrEventHappens(QUEST_SKYSHATTER); - break; - default: - break; - } + case NPC_MUCKJAW: + player->AreaExploredOrEventHappens(QUEST_MUCKJAW); + break; + case NPC_TROPE: + player->AreaExploredOrEventHappens(QUEST_TROPE); + break; + case NPC_CORLOK: + player->AreaExploredOrEventHappens(QUEST_CORLOK); + break; + case NPC_ICHMAN: + player->AreaExploredOrEventHappens(QUEST_ICHMAN); + break; + case NPC_MULVERICK: + player->AreaExploredOrEventHappens(QUEST_MULVERICK); + break; + case NPC_SKYSHATTER: + player->AreaExploredOrEventHappens(QUEST_SKYSHATTER); + break; + default: + break; } } @@ -2202,8 +2203,8 @@ struct dragonmaw_race_npc : public ScriptedAI break; case 7: StartRace(); - if (_player) - Talk(SAY_SKYSHATTER_SPECIAL, _player); + if (Player *player = ObjectAccessor::GetPlayer(me->GetMap(), _playerGUID)) + Talk(SAY_SKYSHATTER_SPECIAL, player); break; case 10: StartRaceAttacks(); @@ -2232,7 +2233,7 @@ struct dragonmaw_race_npc : public ScriptedAI } private: - Player* _player; + ObjectGuid _playerGUID; }; void AddSC_shadowmoon_valley()