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:
@@ -86,26 +86,21 @@ namespace Game.Chat
|
|||||||
|
|
||||||
if (oldStatus != QuestStatus.None)
|
if (oldStatus != QuestStatus.None)
|
||||||
{
|
{
|
||||||
|
player.RemoveActiveQuest(quest.Id, false);
|
||||||
|
|
||||||
// remove all quest entries for 'entry' from quest log
|
// 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);
|
// we ignore unequippable quest items in this case, its' still be equipped
|
||||||
if (logQuest == quest.Id)
|
player.TakeQuestSourceItem(quest.Id, false);
|
||||||
|
|
||||||
|
if (quest.HasFlag(QuestFlags.Pvp))
|
||||||
{
|
{
|
||||||
player.SetQuestSlot(slot, 0);
|
player.pvpInfo.IsHostile = player.pvpInfo.IsInHostileArea || player.HasPvPForcingQuest();
|
||||||
|
player.UpdatePvPState();
|
||||||
// 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.RemoveActiveQuest(quest.Id, false);
|
|
||||||
player.RemoveRewardedQuest(quest.Id);
|
player.RemoveRewardedQuest(quest.Id);
|
||||||
player.DespawnPersonalSummonsForQuest(quest.Id);
|
player.DespawnPersonalSummonsForQuest(quest.Id);
|
||||||
|
|
||||||
|
|||||||
@@ -865,10 +865,6 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
while (result.NextRow());
|
while (result.NextRow());
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear quest log tail
|
|
||||||
for (ushort i = slot; i < SharedConst.MaxQuestLogSize; ++i)
|
|
||||||
SetQuestSlot(i, 0);
|
|
||||||
}
|
}
|
||||||
void _LoadQuestStatusObjectives(SQLResult result)
|
void _LoadQuestStatusObjectives(SQLResult result)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -176,9 +176,8 @@ namespace Game.Entities
|
|||||||
if (quest == null || !quest.IsDaily() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnPeriodicReset))
|
if (quest == null || !quest.IsDaily() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnPeriodicReset))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SetQuestSlot(slot, 0);
|
|
||||||
AbandonQuest(questId);
|
|
||||||
RemoveActiveQuest(questId);
|
RemoveActiveQuest(questId);
|
||||||
|
AbandonQuest(questId);
|
||||||
DespawnPersonalSummonsForQuest(questId);
|
DespawnPersonalSummonsForQuest(questId);
|
||||||
|
|
||||||
if (quest.LimitTime != 0)
|
if (quest.LimitTime != 0)
|
||||||
@@ -215,9 +214,8 @@ namespace Game.Entities
|
|||||||
if (quest == null || !quest.IsWeekly() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnWeeklyReset))
|
if (quest == null || !quest.IsWeekly() || !quest.HasFlagEx(QuestFlagsEx.RemoveOnWeeklyReset))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SetQuestSlot(slot, 0);
|
|
||||||
AbandonQuest(questId);
|
|
||||||
RemoveActiveQuest(questId);
|
RemoveActiveQuest(questId);
|
||||||
|
AbandonQuest(questId);
|
||||||
DespawnPersonalSummonsForQuest(questId);
|
DespawnPersonalSummonsForQuest(questId);
|
||||||
|
|
||||||
if (quest.LimitTime != 0)
|
if (quest.LimitTime != 0)
|
||||||
@@ -967,6 +965,30 @@ namespace Game.Entities
|
|||||||
uint questId = quest.Id;
|
uint questId = quest.Id;
|
||||||
QuestStatus oldStatus = GetQuestStatus(questId);
|
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)
|
foreach (QuestObjective obj in quest.Objectives)
|
||||||
{
|
{
|
||||||
switch (obj.Type)
|
switch (obj.Type)
|
||||||
@@ -999,8 +1021,6 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveTimedQuest(questId);
|
|
||||||
|
|
||||||
if (quest.GetRewItemsCount() > 0)
|
if (quest.GetRewItemsCount() > 0)
|
||||||
{
|
{
|
||||||
for (uint i = 0; i < quest.GetRewItemsCount(); ++i)
|
for (uint i = 0; i < quest.GetRewItemsCount(); ++i)
|
||||||
@@ -1081,10 +1101,6 @@ namespace Game.Entities
|
|||||||
if (skill != 0)
|
if (skill != 0)
|
||||||
UpdateSkillPro(skill, 1000, quest.RewardSkillPoints);
|
UpdateSkillPro(skill, 1000, quest.RewardSkillPoints);
|
||||||
|
|
||||||
ushort log_slot = FindQuestSlot(questId);
|
|
||||||
if (log_slot < SharedConst.MaxQuestLogSize)
|
|
||||||
SetQuestSlot(log_slot, 0);
|
|
||||||
|
|
||||||
uint XP = GetQuestXPReward(quest);
|
uint XP = GetQuestXPReward(quest);
|
||||||
|
|
||||||
int moneyRew = 0;
|
int moneyRew = 0;
|
||||||
@@ -1132,27 +1148,6 @@ namespace Game.Entities
|
|||||||
DB.Characters.CommitTransaction(trans);
|
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);
|
SendQuestReward(quest, questGiver?.ToCreature(), XP, !announce);
|
||||||
|
|
||||||
RewardReputation(quest);
|
RewardReputation(quest);
|
||||||
@@ -1193,8 +1188,6 @@ namespace Game.Entities
|
|||||||
// make full db save
|
// make full db save
|
||||||
SaveToDB(false);
|
SaveToDB(false);
|
||||||
|
|
||||||
SetQuestCompletedBit(questId, true);
|
|
||||||
|
|
||||||
if (quest.HasFlag(QuestFlags.Pvp))
|
if (quest.HasFlag(QuestFlags.Pvp))
|
||||||
{
|
{
|
||||||
pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest();
|
pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest();
|
||||||
@@ -1906,6 +1899,8 @@ namespace Game.Entities
|
|||||||
var questStatus = m_QuestStatus.LookupByKey(questId);
|
var questStatus = m_QuestStatus.LookupByKey(questId);
|
||||||
if (questStatus != null)
|
if (questStatus != null)
|
||||||
{
|
{
|
||||||
|
SetQuestSlot(questStatus.Slot, 0);
|
||||||
|
|
||||||
foreach (var objective in m_questObjectiveStatus.KeyValueList)
|
foreach (var objective in m_questObjectiveStatus.KeyValueList)
|
||||||
{
|
{
|
||||||
if (objective.Value.QuestStatusPair.Status == questStatus)
|
if (objective.Value.QuestStatusPair.Status == questStatus)
|
||||||
@@ -2173,11 +2168,13 @@ namespace Game.Entities
|
|||||||
if (quest == null)
|
if (quest == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ushort questSlot = FindQuestSlot(questId);
|
QuestStatus oldStatus = GetQuestStatus(questId);
|
||||||
QuestStatus oldStatus = GetQuestStatus(questSlot);
|
|
||||||
|
|
||||||
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)
|
if (quest.LimitTime != 0)
|
||||||
RemoveTimedQuest(questId);
|
RemoveTimedQuest(questId);
|
||||||
|
|
||||||
@@ -2186,11 +2183,6 @@ namespace Game.Entities
|
|||||||
pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest();
|
pvpInfo.IsHostile = pvpInfo.IsInHostileArea || HasPvPForcingQuest();
|
||||||
UpdatePvPState();
|
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);
|
SetRewardedQuest(questId);
|
||||||
|
|||||||
@@ -381,6 +381,8 @@ namespace Game
|
|||||||
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
|
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
|
||||||
QuestStatus oldStatus = _player.GetQuestStatus(questId);
|
QuestStatus oldStatus = _player.GetQuestStatus(questId);
|
||||||
|
|
||||||
|
_player.RemoveActiveQuest(questId);
|
||||||
|
|
||||||
if (quest != null)
|
if (quest != null)
|
||||||
{
|
{
|
||||||
if (quest.HasFlagEx(QuestFlagsEx.NoAbandonOnceBegun))
|
if (quest.HasFlagEx(QuestFlagsEx.NoAbandonOnceBegun))
|
||||||
@@ -401,10 +403,8 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetPlayer().SendForceSpawnTrackingUpdate(questId);
|
GetPlayer().SendForceSpawnTrackingUpdate(questId);
|
||||||
GetPlayer().SetQuestSlot(packet.Entry, 0);
|
|
||||||
GetPlayer().TakeQuestSourceItem(questId, true); // remove quest src item from player
|
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().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);
|
GetPlayer().DespawnPersonalSummonsForQuest(questId);
|
||||||
|
|
||||||
Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId);
|
Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId);
|
||||||
|
|||||||
@@ -3785,26 +3785,21 @@ namespace Game.Spells
|
|||||||
if (oldStatus == QuestStatus.None)
|
if (oldStatus == QuestStatus.None)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
player.RemoveActiveQuest(quest_id, false);
|
||||||
|
|
||||||
// remove all quest entries for 'entry' from quest log
|
// 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);
|
// we ignore unequippable quest items in this case, it's still be equipped
|
||||||
if (logQuest == quest_id)
|
player.TakeQuestSourceItem(quest_id, false);
|
||||||
|
|
||||||
|
if (quest.HasFlag(QuestFlags.Pvp))
|
||||||
{
|
{
|
||||||
player.SetQuestSlot(slot, 0);
|
player.pvpInfo.IsHostile = player.pvpInfo.IsInHostileArea || player.HasPvPForcingQuest();
|
||||||
|
player.UpdatePvPState();
|
||||||
// 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.RemoveActiveQuest(quest_id, false);
|
|
||||||
player.RemoveRewardedQuest(quest_id);
|
player.RemoveRewardedQuest(quest_id);
|
||||||
player.DespawnPersonalSummonsForQuest(quest_id);
|
player.DespawnPersonalSummonsForQuest(quest_id);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user