diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 48 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 |
2 files changed, 49 insertions, 0 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e265978a342..110ddd35470 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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 { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c77122714f6..aa756c3e251 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -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; |