aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/QuestHandler.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-06-10 20:31:33 +0200
committerShauren <shauren.trinity@gmail.com>2023-06-10 20:31:33 +0200
commit4d4c7e68935df9ca40bd5539d602ac4e779f53d5 (patch)
treecba70a6e20bb52a33815204d40d929220ac4ab0c /src/server/game/Handlers/QuestHandler.cpp
parent39bebe6a653bdd65160aa7f9fef6501d43884079 (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.cpp72
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
{