diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 0408f7843..2c5844b4a 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -2138,6 +2138,59 @@ namespace Game.Entities return result; } + /// + /// Removes quest from log, flags rewarded, but does not give any rewards to player + /// + /// + public void SkipQuests(List questIds) + { + bool updateVisibility = false; + foreach (uint questId in questIds) + { + Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); + if (quest == null) + return; + + ushort questSlot = FindQuestSlot(questId); + QuestStatus oldStatus = GetQuestStatus(questSlot); + + if (questSlot != SharedConst.MaxQuestLogSize) + { + if (quest.LimitTime != 0) + RemoveTimedQuest(questId); + + if (quest.HasFlag(QuestFlags.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(QuestFlags.UpdatePhaseshift)) + updateVisibility = PhasingHandler.OnConditionChange(this, false); + + Global.ScriptMgr.OnQuestStatusChange(this, questId); + Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, QuestStatus.Rewarded); + } + + SendQuestGiverStatusMultiple(); + + // make full db save + SaveToDB(false); + + if (updateVisibility) + UpdateObjectVisibility(); + } + + public ushort GetReqKillOrCastCurrentCount(uint quest_id, int entry) { Quest qInfo = Global.ObjectMgr.GetQuestTemplate(quest_id);