diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-06-10 20:31:33 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-06-10 20:31:33 +0200 |
commit | 4d4c7e68935df9ca40bd5539d602ac4e779f53d5 (patch) | |
tree | cba70a6e20bb52a33815204d40d929220ac4ab0c /src/server/game/Handlers/QuestHandler.cpp | |
parent | 39bebe6a653bdd65160aa7f9fef6501d43884079 (diff) |
Core/Quests: Quest flag fixups
* Update flag names
* Implemented QUEST_FLAGS_COMPLETION_NO_DEATH and QUEST_FLAGS_FAIL_ON_LOGOUT
* Started using QUEST_FLAGS_COMPLETION_EVENT and QUEST_FLAGS_COMPLETION_AREA_TRIGGER instead of a custom SpeclalFlag
* Renamed Quest::IsAutoComplete to Quest::IsTurnIn to better describe what it means (a quest that can be turned in without accepting it to quest log)
* Implemented QUEST_FLAGS_UPDATE_PHASESHIFT and removed forced phaseshift updates on every quest status change
* Implemented QUEST_FLAGS_LAUNCH_GOSSIP_ACCEPT - reopens gossip menu with questgiver
Diffstat (limited to 'src/server/game/Handlers/QuestHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index aa80e11e1cd..9010a3d629e 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -177,7 +177,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG { _player->AddQuestAndCheckCompletion(quest, object); - if (quest->HasFlag(QUEST_FLAGS_PARTY_ACCEPT)) + if (quest->IsPushedToPartyOnAccept()) { if (Group* group = _player->GetGroup()) { @@ -203,6 +203,21 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG _player->PlayerTalkClass->SendCloseGossip(); + if (quest->HasFlag(QUEST_FLAGS_LAUNCH_GOSSIP_ACCEPT)) + { + auto launchGossip = [&](WorldObject* worldObject) + { + _player->PlayerTalkClass->ClearMenus(); + _player->PrepareGossipMenu(worldObject, _player->GetGossipMenuForSource(worldObject), true); + _player->SendPreparedGossip(worldObject); + }; + + if (Creature* creature = object->ToCreature()) + launchGossip(creature); + else if (GameObject* go = object->ToGameObject()) + launchGossip(go); + } + return; } } @@ -230,7 +245,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPackets::Quest::QuestGi if (quest->IsAutoAccept() && _player->CanAddQuest(quest, true)) _player->AddQuestAndCheckCompletion(quest, object); - if (quest->IsAutoComplete()) + if (quest->IsTurnIn()) _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, object->GetGUID(), _player->CanCompleteQuest(quest->GetQuestId()), true); else _player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, object->GetGUID(), true, false); @@ -359,7 +374,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest Object* object = _player; - if (!quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) + if (!quest->HasFlag(QUEST_FLAGS_AUTO_COMPLETE)) { object = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); if (!object || !object->hasInvolvedQuest(packet.QuestID)) @@ -371,7 +386,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest } if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(packet.QuestID) == QUEST_STATUS_NONE) || - (_player->GetQuestStatus(packet.QuestID) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) + (_player->GetQuestStatus(packet.QuestID) != QUEST_STATUS_COMPLETE && !quest->IsTurnIn())) { TC_LOG_ERROR("network", "Error in QUEST_STATUS_COMPLETE: player {} {} tried to complete quest {}, but is not allowed to do so (possible packet-hacking or high latency)", _player->GetName(), _player->GetGUID().ToString(), packet.QuestID); @@ -474,34 +489,34 @@ void WorldSession::HandleQuestConfirmAccept(WorldPackets::Quest::QuestConfirmAcc { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUEST_CONFIRM_ACCEPT questId = {}", packet.QuestID); - if (Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID)) - { - if (!quest->HasFlag(QUEST_FLAGS_PARTY_ACCEPT)) - return; + if (_player->GetSharedQuestID() != uint32(packet.QuestID)) + return; - Player* originalPlayer = ObjectAccessor::FindPlayer(_player->GetPlayerSharingQuest()); - if (!originalPlayer) - return; + _player->ClearQuestSharingInfo(); + Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID); + if (!quest) + return; - if (!_player->IsInSameRaidWith(originalPlayer)) - return; + Player* originalPlayer = ObjectAccessor::FindPlayer(_player->GetPlayerSharingQuest()); + if (!originalPlayer) + return; - if (!originalPlayer->IsActiveQuest(packet.QuestID)) - return; + if (!_player->IsInSameRaidWith(originalPlayer)) + return; - if (!_player->CanTakeQuest(quest, true)) - return; + if (!originalPlayer->IsActiveQuest(packet.QuestID)) + return; - if (_player->CanAddQuest(quest, true)) - { - _player->AddQuestAndCheckCompletion(quest, nullptr); // NULL, this prevent DB script from duplicate running + if (!_player->CanTakeQuest(quest, true)) + return; - if (quest->GetSrcSpell() > 0) - _player->CastSpell(_player, quest->GetSrcSpell(), true); - } - } + if (!_player->CanAddQuest(quest, true)) + return; - _player->ClearQuestSharingInfo(); + _player->AddQuestAndCheckCompletion(quest, nullptr); // NULL, this prevent DB script from duplicate running + + if (quest->GetSrcSpell() > 0) + _player->CastSpell(_player, quest->GetSrcSpell(), true); } void WorldSession::HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiverCompleteQuest& packet) @@ -514,9 +529,6 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiver if (!quest) return; - if (autoCompleteMode && !quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) - return; - Object* object = nullptr; if (autoCompleteMode) object = _player; @@ -526,7 +538,7 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiver if (!object) return; - if (!autoCompleteMode) + if (!quest->HasFlag(QUEST_FLAGS_AUTO_COMPLETE)) { if (!object->hasInvolvedQuest(packet.QuestID)) return; @@ -716,7 +728,7 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& sender->SendPushToPartyResponse(receiver, QuestPushReason::Success); - if (quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) + if (quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) receiver->PlayerTalkClass->SendQuestGiverRequestItems(quest, sender->GetGUID(), receiver->CanCompleteRepeatableQuest(quest), true); else { |