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)
|
||||
{
|
||||
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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user