mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-19 22:49:39 -04:00
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
This commit is contained in:
committed by
Vincent-Michael
parent
1f62d9c387
commit
f53045ae5c
@@ -513,7 +513,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
||||
data << uint32(quest->GetRewHonorAddition());
|
||||
data << float(quest->GetRewHonorMultiplier());
|
||||
data << uint32(quest->GetSrcItemId()); // source item id
|
||||
data << uint32(quest->GetFlags() & 0xFFFF); // quest flags
|
||||
data << uint32(quest->GetFlags()); // quest flags
|
||||
data << uint32(quest->GetMinimapTargetMark()); // minimap target mark (skull, etc. missing enum)
|
||||
data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
|
||||
data << uint32(quest->GetPlayersSlain()); // players slain
|
||||
|
||||
@@ -14863,7 +14863,7 @@ void Player::SendPreparedQuest(uint64 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);
|
||||
@@ -14931,7 +14931,7 @@ Quest const* Player::GetNextQuest(uint64 guid, Quest const* quest)
|
||||
switch (GUID_HIPART(guid))
|
||||
{
|
||||
case HIGHGUID_PLAYER:
|
||||
ASSERT(quest->HasFlag(QUEST_FLAGS_AUTO_SUBMIT));
|
||||
ASSERT(quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE));
|
||||
return sObjectMgr->GetQuestTemplate(nextQuestID);
|
||||
case HIGHGUID_UNIT:
|
||||
case HIGHGUID_PET:
|
||||
@@ -15032,7 +15032,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);
|
||||
@@ -15112,7 +15112,7 @@ bool Player::CanCompleteRepeatableQuest(Quest const* quest)
|
||||
bool Player::CanRewardQuest(Quest const* quest, bool msg)
|
||||
{
|
||||
// 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)
|
||||
|
||||
@@ -273,7 +273,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData)
|
||||
|
||||
Object* object = _player;
|
||||
|
||||
if (!quest->HasFlag(QUEST_FLAGS_AUTO_SUBMIT))
|
||||
if (!quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
|
||||
{
|
||||
object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT);
|
||||
if (!object || !object->hasInvolvedQuest(questId))
|
||||
@@ -469,26 +469,43 @@ void WorldSession::HandleQuestConfirmAccept(WorldPacket& recvData)
|
||||
void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData)
|
||||
{
|
||||
uint32 questId;
|
||||
uint64 playerGuid;
|
||||
uint64 guid; // NPC / GameObject guid for normal quest completion. Player guid for self-completed quests
|
||||
bool autoCompleteMode; // 0 - standart complete quest mode with npc, 1 - auto-complete mode
|
||||
recvData >> playerGuid >> questId >> autoCompleteMode;
|
||||
recvData >> guid >> questId >> autoCompleteMode;
|
||||
|
||||
TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, questId = %u", uint32(GUID_LOPART(playerGuid)), questId);
|
||||
TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %u, questId = %u self-complete: %u", uint32(GUID_LOPART(guid)), questId, autoCompleteMode ? 1 : 0);
|
||||
|
||||
Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
|
||||
if (!quest)
|
||||
return;
|
||||
|
||||
Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, playerGuid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
|
||||
if (!object || !object->hasInvolvedQuest(questId))
|
||||
if (autoCompleteMode && !quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE))
|
||||
return;
|
||||
|
||||
Object* object = nullptr;
|
||||
if (autoCompleteMode)
|
||||
object = _player;
|
||||
else
|
||||
object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT);
|
||||
|
||||
if (!object)
|
||||
return;
|
||||
|
||||
if (autoCompleteMode == 0)
|
||||
{
|
||||
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)
|
||||
{
|
||||
@@ -503,16 +520,16 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData)
|
||||
if (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE)
|
||||
{
|
||||
if (quest->IsRepeatable())
|
||||
_player->PlayerTalkClass->SendQuestGiverRequestItems(quest, playerGuid, _player->CanCompleteRepeatableQuest(quest), false);
|
||||
_player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanCompleteRepeatableQuest(quest), false);
|
||||
else
|
||||
_player->PlayerTalkClass->SendQuestGiverRequestItems(quest, playerGuid, _player->CanRewardQuest(quest, false), false);
|
||||
_player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (quest->GetReqItemsCount()) // some items required
|
||||
_player->PlayerTalkClass->SendQuestGiverRequestItems(quest, playerGuid, _player->CanRewardQuest(quest, false), false);
|
||||
_player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false);
|
||||
else // no items required
|
||||
_player->PlayerTalkClass->SendQuestGiverOfferReward(quest, playerGuid, true);
|
||||
_player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true);
|
||||
}
|
||||
|
||||
if (Creature* creature = object->ToCreature())
|
||||
@@ -586,7 +603,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
|
||||
if (quest->IsAutoAccept() && receiver->CanAddQuest(quest, true) && receiver->CanTakeQuest(quest, true))
|
||||
receiver->AddQuestAndCheckCompletion(quest, sender);
|
||||
|
||||
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
|
||||
{
|
||||
|
||||
@@ -326,7 +326,7 @@ bool Quest::IsAutoAccept() const
|
||||
|
||||
bool Quest::IsAutoComplete() const
|
||||
{
|
||||
return sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_COMPLETE) ? false : (Method == 0 || HasFlag(QUEST_FLAGS_AUTOCOMPLETE));
|
||||
return sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_COMPLETE) || (Method == 0);
|
||||
}
|
||||
|
||||
bool Quest::IsRaidQuest(Difficulty difficulty) const
|
||||
|
||||
@@ -147,11 +147,11 @@ 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 player submit automatically by special button in player gui
|
||||
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.
|
||||
QUEST_FLAGS_AUTO_SUBMIT = 0x00100000, // Quests with this flag player submit automatically by special button in player gui
|
||||
QUEST_FLAGS_UNK1 = 0x00100000, //
|
||||
QUEST_FLAGS_AUTO_TAKE = 0x00200000, // Automatically suggestion of accepting quest. Not from npc.
|
||||
//QUEST_FLAGS_UNK2 = 0x00400000,
|
||||
//QUEST_FLAGS_UNK3 = 0x00800000, // Found in quest 14069
|
||||
|
||||
Reference in New Issue
Block a user