fix(Scripts/Outland): Fix crash in dragonmaw_race_npc by refreshing players pointer in lambda function. (#20333)
* fix(Scripts/Outland): Fix crash in dragonmaw_race_npc by refreshing players pointer in lambda function. * Fix typo * Refactor dragonmaw_race_npc to replace players pointer to GUID. * Update src/server/scripts/Outland/zone_shadowmoon_valley.cpp ---------
This commit is contained in:
parent
2daedcec8a
commit
b45c41cf6e
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user