Core/Quests: Fixed QuestScript::OnQuestStatusChange incorrectly triggering with QUEST_STATUS_INCOMPLETE when removing items from quest objectives on rewarding quest

Port From (https://github.com/TrinityCore/TrinityCore/commit/2c9b67f00be95bd816dbaa9db43838a67e187753)
This commit is contained in:
Hondacrx
2025-08-20 22:30:52 -04:00
parent 846daa3891
commit 06030a7ce8
5 changed files with 53 additions and 75 deletions
+9 -14
View File
@@ -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);
-4
View File
@@ -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)
{
+33 -41
View File
@@ -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);
+2 -2
View File
@@ -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);
+9 -14
View File
@@ -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);