diff options
author | Seyden <saiifii@live.de> | 2023-01-28 15:36:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-28 15:36:28 +0100 |
commit | b5886f6a2d1756357a9240703306e9efc82771d7 (patch) | |
tree | a4581ccb1436817693f480fcaa076fadfab3365a | |
parent | b5176eb6c2ae640a1cdf22d3d0a483d1b48ecbb6 (diff) |
Core/Quests: Dont immediately update object visibility at PhaseShift and wait for the AI Hooks to be called in Player::RewardQuest (#28516)
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 63 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 48 | ||||
-rw-r--r-- | src/server/game/Phasing/PhasingHandler.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Phasing/PhasingHandler.h | 2 |
5 files changed, 64 insertions, 56 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bf5e6a9a4fb..788e4ba63da 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15051,15 +15051,70 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew UpdatePvPState(); } - SendQuestUpdate(quest_id); - SendQuestGiverStatusMultiple(); + bool conditionChanged = SendQuestUpdate(quest_id, false); + //lets remove flag for delayed teleports SetCanDelayTeleport(false); + bool canHaveNextQuest = !quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE) ? !questGiver->IsPlayer() : true; + if (canHaveNextQuest) + { + switch (questGiver->GetTypeId()) + { + case TYPEID_UNIT: + case TYPEID_PLAYER: + { + //For AutoSubmition was added plr case there as it almost same exclute AI script cases. + // Send next quest + if (Quest const* nextQuest = GetNextQuest(questGiver->GetGUID(), quest)) + { + // Only send the quest to the player if the conditions are met + if (CanTakeQuest(nextQuest, false)) + { + if (nextQuest->IsAutoAccept() && CanAddQuest(nextQuest, true)) + AddQuestAndCheckCompletion(nextQuest, questGiver); + + PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, questGiver->GetGUID(), true, false); + } + } + + PlayerTalkClass->ClearMenus(); + if (Creature* creatureQGiver = questGiver->ToCreature()) + creatureQGiver->AI()->OnQuestReward(this, quest, rewardType, rewardId); + break; + } + case TYPEID_GAMEOBJECT: + { + GameObject* questGiverGob = questGiver->ToGameObject(); + // Send next quest + if (Quest const* nextQuest = GetNextQuest(questGiverGob->GetGUID(), quest)) + { + // Only send the quest to the player if the conditions are met + if (CanTakeQuest(nextQuest, false)) + { + if (nextQuest->IsAutoAccept() && CanAddQuest(nextQuest, true)) + AddQuestAndCheckCompletion(nextQuest, questGiver); + + PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, questGiverGob->GetGUID(), true, false); + } + } + + PlayerTalkClass->ClearMenus(); + questGiverGob->AI()->OnQuestReward(this, quest, rewardType, rewardId); + break; + } + default: + break; + } + } + sScriptMgr->OnQuestStatusChange(this, quest_id); sScriptMgr->OnQuestStatusChange(this, quest, oldStatus, QUEST_STATUS_REWARDED); + + if (conditionChanged) + UpdateObjectVisibility(); } void Player::SetRewardedQuest(uint32 quest_id) @@ -15750,7 +15805,7 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/) SendQuestUpdate(questId); } -void Player::SendQuestUpdate(uint32 questId) +bool Player::SendQuestUpdate(uint32 questId, bool updateVisiblity /*= true*/) { SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId); @@ -15799,7 +15854,7 @@ void Player::SendQuestUpdate(uint32 questId) } UpdateVisibleGameobjectsOrSpellClicks(); - PhasingHandler::OnConditionChange(this); + return PhasingHandler::OnConditionChange(this, updateVisiblity); } QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3c795bcee63..85737fe83e6 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1607,7 +1607,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SetQuestStatus(uint32 questId, QuestStatus status, bool update = true); void RemoveActiveQuest(uint32 questId, bool update = true); void RemoveRewardedQuest(uint32 questId, bool update = true); - void SendQuestUpdate(uint32 questId); + bool SendQuestUpdate(uint32 questId, bool updateVisiblity = true); QuestGiverStatus GetQuestDialogStatus(Object* questGiver); void SetDailyQuestStatus(uint32 quest_id); diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 94cbf2a48de..220eaba8985 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -386,54 +386,6 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest bg->HandleQuestComplete(packet.QuestID, _player); _player->RewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, object); - - switch (object->GetTypeId()) - { - case TYPEID_UNIT: - case TYPEID_PLAYER: - { - //For AutoSubmition was added plr case there as it almost same exclute AI script cases. - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(packet.QuestGiverGUID, quest)) - { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, packet.QuestGiverGUID, true, false); - } - } - - _player->PlayerTalkClass->ClearMenus(); - if (Creature* creatureQGiver = object->ToCreature()) - creatureQGiver->AI()->OnQuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); - break; - } - case TYPEID_GAMEOBJECT: - { - GameObject* questGiver = object->ToGameObject(); - // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(packet.QuestGiverGUID, quest)) - { - // Only send the quest to the player if the conditions are met - if (_player->CanTakeQuest(nextQuest, false)) - { - if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) - _player->AddQuestAndCheckCompletion(nextQuest, object); - - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, packet.QuestGiverGUID, true, false); - } - } - - _player->PlayerTalkClass->ClearMenus(); - questGiver->AI()->OnQuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); - break; - } - default: - break; - } } } else diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp index 5521d7f0d57..b4eef7b5e90 100644 --- a/src/server/game/Phasing/PhasingHandler.cpp +++ b/src/server/game/Phasing/PhasingHandler.cpp @@ -366,7 +366,7 @@ void PhasingHandler::OnAreaChange(WorldObject* object) UpdateVisibilityIfNeeded(object, true, changed); } -void PhasingHandler::OnConditionChange(WorldObject* object) +bool PhasingHandler::OnConditionChange(WorldObject* object, bool updateVisibility /*= true*/) { PhaseShift& phaseShift = object->GetPhaseShift(); PhaseShift& suppressedPhaseShift = object->GetSuppressedPhaseShift(); @@ -478,7 +478,8 @@ void PhasingHandler::OnConditionChange(WorldObject* object) unit->RemoveNotOwnSingleTargetAuras(true); } - UpdateVisibilityIfNeeded(object, true, changed); + UpdateVisibilityIfNeeded(object, updateVisibility, changed); + return changed; } void PhasingHandler::SendToPlayer(Player const* player, PhaseShift const& phaseShift) diff --git a/src/server/game/Phasing/PhasingHandler.h b/src/server/game/Phasing/PhasingHandler.h index 6da249558a7..5a751dcc725 100644 --- a/src/server/game/Phasing/PhasingHandler.h +++ b/src/server/game/Phasing/PhasingHandler.h @@ -52,7 +52,7 @@ public: static void OnMapChange(WorldObject* object); static void OnAreaChange(WorldObject* object); - static void OnConditionChange(WorldObject* object); + static bool OnConditionChange(WorldObject* object, bool updateVisibility = true); static void SendToPlayer(Player const* player, PhaseShift const& phaseShift); static void SendToPlayer(Player const* player); |