aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp48
-rw-r--r--src/server/game/Entities/Player/Player.h1
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;