diff --git a/Source/Game/Chat/Commands/QuestCommands.cs b/Source/Game/Chat/Commands/QuestCommands.cs index 0642da83a..2925052bc 100644 --- a/Source/Game/Chat/Commands/QuestCommands.cs +++ b/Source/Game/Chat/Commands/QuestCommands.cs @@ -86,26 +86,21 @@ namespace Game.Chat if (oldStatus != QuestStatus.None) { + player.RemoveActiveQuest(quest.Id, false); + // remove all quest entries for 'entry' from quest log - for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot) + if (oldStatus != QuestStatus.Rewarded) { - uint logQuest = player.GetQuestSlotQuestId(slot); - if (logQuest == quest.Id) + // we ignore unequippable quest items in this case, its' still be equipped + player.TakeQuestSourceItem(quest.Id, false); + + if (quest.HasFlag(QuestFlags.Pvp)) { - player.SetQuestSlot(slot, 0); - - // we ignore unequippable quest items in this case, its' still be equipped - player.TakeQuestSourceItem(logQuest, false); - - if (quest.HasFlag(QuestFlags.Pvp)) - { - player.pvpInfo.IsHostile = player.pvpInfo.IsInHostileArea || player.HasPvPForcingQuest(); - player.UpdatePvPState(); - } + player.pvpInfo.IsHostile = player.pvpInfo.IsInHostileArea || player.HasPvPForcingQuest(); + player.UpdatePvPState(); } } - player.RemoveActiveQuest(quest.Id, false); player.RemoveRewardedQuest(quest.Id); player.DespawnPersonalSummonsForQuest(quest.Id); diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 6b23fd789..d31a9bfd9 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -865,10 +865,6 @@ namespace Game.Entities } while (result.NextRow()); } - - // clear quest log tail - for (ushort i = slot; i < SharedConst.MaxQuestLogSize; ++i) - SetQuestSlot(i, 0); } void _LoadQuestStatusObjectives(SQLResult result) { diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 36b45d76f..9a7a9fcda 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -176,9 +176,8 @@ namespace Game.Entities if (quest == null || !quest.IsDaily() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnPeriodicReset)) continue; - SetQuestSlot(slot, 0); - AbandonQuest(questId); RemoveActiveQuest(questId); + AbandonQuest(questId); DespawnPersonalSummonsForQuest(questId); if (quest.LimitTime != 0) @@ -215,9 +214,8 @@ namespace Game.Entities if (quest == null || !quest.IsWeekly() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnWeeklyReset)) continue; - SetQuestSlot(slot, 0); - AbandonQuest(questId); RemoveActiveQuest(questId); + AbandonQuest(questId); DespawnPersonalSummonsForQuest(questId); if (quest.LimitTime != 0) @@ -967,6 +965,30 @@ namespace Game.Entities uint questId = quest.Id; QuestStatus oldStatus = GetQuestStatus(questId); + if (quest.IsDaily() || quest.IsDFQuest()) + { + SetDailyQuestStatus(questId); + if (quest.IsDaily()) + { + StartCriteria(CriteriaStartEvent.CompleteDailyQuest, 0); + UpdateCriteria(CriteriaType.CompleteDailyQuest, questId); + UpdateCriteria(CriteriaType.CompleteAnyDailyQuestPerDay, questId); + } + } + else if (quest.IsWeekly()) + SetWeeklyQuestStatus(questId); + else if (quest.IsMonthly()) + SetMonthlyQuestStatus(questId); + else if (quest.IsSeasonal()) + SetSeasonalQuestStatus(questId); + + RemoveTimedQuest(questId); + RemoveActiveQuest(questId, false); + if (quest.CanIncreaseRewardedQuestCounters()) + SetRewardedQuest(questId); + + SetQuestCompletedBit(questId, true); + foreach (QuestObjective obj in quest.Objectives) { switch (obj.Type) @@ -999,8 +1021,6 @@ namespace Game.Entities } } - RemoveTimedQuest(questId); - if (quest.GetRewItemsCount() > 0) { for (uint i = 0; i < quest.GetRewItemsCount(); ++i) @@ -1081,10 +1101,6 @@ namespace Game.Entities if (skill != 0) UpdateSkillPro(skill, 1000, quest.RewardSkillPoints); - ushort log_slot = FindQuestSlot(questId); - if (log_slot < SharedConst.MaxQuestLogSize) - SetQuestSlot(log_slot, 0); - uint XP = GetQuestXPReward(quest); int moneyRew = 0; @@ -1132,27 +1148,6 @@ namespace Game.Entities DB.Characters.CommitTransaction(trans); } - if (quest.IsDaily() || quest.IsDFQuest()) - { - SetDailyQuestStatus(questId); - if (quest.IsDaily()) - { - StartCriteria(CriteriaStartEvent.CompleteDailyQuest, 0); - UpdateCriteria(CriteriaType.CompleteDailyQuest, questId); - UpdateCriteria(CriteriaType.CompleteAnyDailyQuestPerDay, questId); - } - } - else if (quest.IsWeekly()) - SetWeeklyQuestStatus(questId); - else if (quest.IsMonthly()) - SetMonthlyQuestStatus(questId); - else if (quest.IsSeasonal()) - SetSeasonalQuestStatus(questId); - - RemoveActiveQuest(questId, false); - if (quest.CanIncreaseRewardedQuestCounters()) - SetRewardedQuest(questId); - SendQuestReward(quest, questGiver?.ToCreature(), XP, !announce); RewardReputation(quest); @@ -1193,8 +1188,6 @@ namespace Game.Entities // make full db save SaveToDB(false); - SetQuestCompletedBit(questId, true); - if (quest.HasFlag(QuestFlags.Pvp)) { pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest(); @@ -1906,6 +1899,8 @@ namespace Game.Entities var questStatus = m_QuestStatus.LookupByKey(questId); if (questStatus != null) { + SetQuestSlot(questStatus.Slot, 0); + foreach (var objective in m_questObjectiveStatus.KeyValueList) { if (objective.Value.QuestStatusPair.Status == questStatus) @@ -2173,11 +2168,13 @@ namespace Game.Entities if (quest == null) return; - ushort questSlot = FindQuestSlot(questId); - QuestStatus oldStatus = GetQuestStatus(questSlot); + QuestStatus oldStatus = GetQuestStatus(questId); - if (questSlot != SharedConst.MaxQuestLogSize) + if (oldStatus != QuestStatus.None && oldStatus != QuestStatus.Rewarded) { + RemoveActiveQuest(questId); + 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. if (quest.LimitTime != 0) RemoveTimedQuest(questId); @@ -2186,11 +2183,6 @@ namespace Game.Entities 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); diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index 470496237..532590525 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -381,6 +381,8 @@ namespace Game Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); QuestStatus oldStatus = _player.GetQuestStatus(questId); + _player.RemoveActiveQuest(questId); + if (quest != null) { if (quest.HasFlagEx(QuestFlagsEx.NoAbandonOnceBegun)) @@ -401,10 +403,8 @@ namespace Game } GetPlayer().SendForceSpawnTrackingUpdate(questId); - GetPlayer().SetQuestSlot(packet.Entry, 0); GetPlayer().TakeQuestSourceItem(questId, true); // remove quest src item from player GetPlayer().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. - GetPlayer().RemoveActiveQuest(questId); GetPlayer().DespawnPersonalSummonsForQuest(questId); Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId); diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 1f9b0f279..3e607be63 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -3785,26 +3785,21 @@ namespace Game.Spells if (oldStatus == QuestStatus.None) return; + player.RemoveActiveQuest(quest_id, false); + // remove all quest entries for 'entry' from quest log - for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot) + if (oldStatus != QuestStatus.Rewarded) { - uint logQuest = player.GetQuestSlotQuestId(slot); - if (logQuest == quest_id) + // we ignore unequippable quest items in this case, it's still be equipped + player.TakeQuestSourceItem(quest_id, false); + + if (quest.HasFlag(QuestFlags.Pvp)) { - player.SetQuestSlot(slot, 0); - - // we ignore unequippable quest items in this case, it's still be equipped - player.TakeQuestSourceItem(logQuest, false); - - if (quest.HasFlag(QuestFlags.Pvp)) - { - player.pvpInfo.IsHostile = player.pvpInfo.IsInHostileArea || player.HasPvPForcingQuest(); - player.UpdatePvPState(); - } + player.pvpInfo.IsHostile = player.pvpInfo.IsInHostileArea || player.HasPvPForcingQuest(); + player.UpdatePvPState(); } } - player.RemoveActiveQuest(quest_id, false); player.RemoveRewardedQuest(quest_id); player.DespawnPersonalSummonsForQuest(quest_id);