Core/Player: Added Player::SkipQuests helper to skip quests (without rewards)

This commit is contained in:
ModoX
2024-01-01 13:36:01 +01:00
parent 0284d9bfb1
commit e10f7e6d45
2 changed files with 49 additions and 0 deletions

View File

@@ -16334,6 +16334,54 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object const* questgiver) const
return result;
}
void Player::SkipQuests(std::vector<uint32> const& questIds)
{
bool updateVisibility = false;
for (uint32 const& questId : questIds)
{
Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
if (!quest)
return;
uint16 questSlot = FindQuestSlot(questId);
QuestStatus oldStatus = GetQuestStatus(questSlot);
if (questSlot != MAX_QUEST_LOG_SIZE)
{
if (quest->GetLimitTime())
RemoveTimedQuest(questId);
if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
{
pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest();
UpdatePvPState();
}
SetQuestSlot(questSlot, 0);
TakeQuestSourceItem(questId, true); // remove quest src item from player
AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements.
RemoveActiveQuest(questId);
}
SetRewardedQuest(questId);
SendQuestUpdate(questId);
if (!updateVisibility && quest->HasFlag(QUEST_FLAGS_UPDATE_PHASESHIFT))
updateVisibility = PhasingHandler::OnConditionChange(this, false);
sScriptMgr->OnQuestStatusChange(this, questId);
sScriptMgr->OnQuestStatusChange(this, quest, oldStatus, QUEST_STATUS_REWARDED);
}
SendQuestGiverStatusMultiple();
// make full db save
SaveToDB(false);
if (updateVisibility)
UpdateObjectVisibility();
}
// not used in Trinity, but used in scripting code
uint16 Player::GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) const
{

View File

@@ -1593,6 +1593,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void RemoveRewardedQuest(uint32 questId, bool update = true);
void SendQuestUpdate(uint32 questId);
QuestGiverStatus GetQuestDialogStatus(Object const* questGiver) const;
void SkipQuests(std::vector<uint32> const& questIds); // removes quest from log, flags rewarded, but does not give any rewards to player
void SetDailyQuestStatus(uint32 quest_id);
bool IsDailyQuestDone(uint32 quest_id) const;