aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastian Valle Herrera <subv2112@gmail.com>2014-06-08 00:34:14 +0200
committerShauren <shauren.trinity@gmail.com>2025-09-27 19:56:44 +0200
commit691ee639b886a3ff5093abf6f33878d498dc5d67 (patch)
treec325ff726872d19db57c21a517271a021c371a99 /src
parent8712a47951b7352c49ac5d1f2a2c787a132aae41 (diff)
Core/Quest:
Fixed self-completing quests without NPCs no, wait Fixed self-completing quests without NPCs, and fixed some issues with the AUTOCOMPLETE quest flag (cherry picked from commit f53045ae5c880ff5fbb75cfe0bd51bb5bbade655)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp6
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp27
-rw-r--r--src/server/game/Quests/QuestDef.h2
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp2
4 files changed, 25 insertions, 12 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 35269d079e4..17e684c80c6 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -14487,7 +14487,7 @@ void Player::SendPreparedQuest(ObjectGuid guid)
if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
AddQuestAndCheckCompletion(quest, object);
- if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
+ if (quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanCompleteRepeatableQuest(quest), true);
else
PlayerTalkClass->SendQuestGiverQuestDetails(quest, guid, true);
@@ -14629,7 +14629,7 @@ bool Player::CanCompleteQuest(uint32 quest_id)
return false; // not allow re-complete quest
// auto complete quest
- if ((qInfo->IsAutoComplete() || qInfo->GetFlags() & QUEST_FLAGS_AUTOCOMPLETE) && CanTakeQuest(qInfo, false))
+ if (qInfo->IsAutoComplete() && CanTakeQuest(qInfo, false))
return true;
QuestStatusMap::iterator itr = m_QuestStatus.find(quest_id);
@@ -14713,7 +14713,7 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg)
return false;
// not auto complete quest and not completed quest (only cheating case, then ignore without message)
- if (!quest->IsDFQuest() && !quest->IsAutoComplete() && !(quest->GetFlags() & QUEST_FLAGS_AUTOCOMPLETE) && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE)
+ if (!quest->IsDFQuest() && !quest->IsAutoComplete() && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE)
return false;
// daily quest can't be rewarded (25 daily quest already completed)
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 7c74891d6d3..4999f7e3c7f 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -503,17 +503,30 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData)
return;
Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
- if (!object || !object->hasInvolvedQuest(questId))
- return;
- // some kind of WPE protection
- if (!_player->CanInteractWithQuestGiver(object))
+ if (!object)
return;
+ if (!quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
+ {
+ if (!object->hasInvolvedQuest(questId))
+ return;
+
+ // some kind of WPE protection
+ if (!_player->CanInteractWithQuestGiver(object))
+ return;
+ }
+ else
+ {
+ // Do not allow completing quests on other players.
+ if (guid != _player->GetGUID())
+ return;
+ }
+
if (!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE)
{
- TC_LOG_ERROR("entities.player.cheat", "Possible hacking attempt: Player {} {} tried to complete quest [entry: {}] without being in possession of the quest!",
- _player->GetName(), _player->GetGUID().ToString(), questId);
+ TC_LOG_ERROR("entities.player.cheat", "Possible hacking attempt: Player {} [{}] tried to complete quest [entry: {}] without being in possession of the quest!",
+ _player->GetName(), _player->GetGUID().ToString(), questId);
return;
}
@@ -614,7 +627,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_SHARING_QUEST);
- if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
+ if (quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
receiver->PlayerTalkClass->SendQuestGiverRequestItems(quest, sender->GetGUID(), receiver->CanCompleteRepeatableQuest(quest), true);
else
{
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 6e9a0be33df..ffe7312aa77 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -146,7 +146,7 @@ enum QuestFlags
QUEST_FLAGS_FLAGS_PVP = 0x00002000, // Having this quest in log forces PvP flag
QUEST_FLAGS_UNAVAILABLE = 0x00004000, // Used on quests that are not generically available
QUEST_FLAGS_WEEKLY = 0x00008000,
- QUEST_FLAGS_AUTOCOMPLETE = 0x00010000, // auto complete
+ QUEST_FLAGS_AUTOCOMPLETE = 0x00010000, // Quests with this flag cause the client to automatically send CMSG_QUESTGIVER_COMPLETE_QUEST after accepting if the quest has any objectives and they are completed before accepting (none of 3.3.5a quests fit this criteria)
QUEST_FLAGS_DISPLAY_ITEM_IN_TRACKER = 0x00020000, // Displays usable item in quest tracker
QUEST_FLAGS_OBJ_TEXT = 0x00040000, // use Objective text as Complete text
QUEST_FLAGS_AUTO_ACCEPT = 0x00080000, // The client recognizes this flag as auto-accept. However, NONE of the current quests (3.3.5a) have this flag. Maybe blizz used to use it, or will use it in the future.
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
index 67b36e59791..220a732437b 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -54,7 +54,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
_worldPacket << uint32(Info.RewardHonor);
_worldPacket << float(Info.RewardKillHonor);
_worldPacket << uint32(Info.StartItem);
- _worldPacket << uint32(Info.Flags & 0xFFFF);
+ _worldPacket << uint32(Info.Flags);
_worldPacket << uint32(Info.RewardTitleId);
_worldPacket << uint32(Info.RequiredPlayerKills);
_worldPacket << uint32(Info.RewardTalents);