Core/Quests: Removed slow queries from daily and weekly resets

Port From (https://github.com/TrinityCore/TrinityCore/commit/ee7b0e82fa076ad4338b1c362235cec6739f00e0)
This commit is contained in:
hondacrx
2024-02-05 13:20:21 -05:00
parent ea2004af89
commit 5043b5ca8a
4 changed files with 92 additions and 81 deletions
+69 -56
View File
@@ -721,6 +721,10 @@ namespace Game.Entities
void _LoadQuestStatus(SQLResult result)
{
ushort slot = 0;
long lastDailyReset = Global.WorldMgr.GetNextDailyQuestsResetTime() - Time.Day;
long lastWeeklyReset = Global.WorldMgr.GetNextWeeklyQuestsResetTime() - Time.Week;
if (!result.IsEmpty())
{
do
@@ -728,64 +732,73 @@ namespace Game.Entities
uint questId = result.Read<uint>(0);
// used to be new, no delete?
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest != null)
if (quest == null)
continue;
// find or create
QuestStatusData questStatusData = new();
QuestStatus qstatus = (QuestStatus)result.Read<byte>(1);
if (qstatus < QuestStatus.Max)
questStatusData.Status = qstatus;
else
{
// find or create
QuestStatusData questStatusData = new();
byte qstatus = result.Read<byte>(1);
if (qstatus < (byte)QuestStatus.Max)
questStatusData.Status = (QuestStatus)qstatus;
else
{
questStatusData.Status = QuestStatus.Incomplete;
Log.outError(LogFilter.Player, "Player {0} (GUID: {1}) has invalid quest {2} status ({3}), replaced by QUEST_STATUS_INCOMPLETE(3).",
GetName(), GetGUID().ToString(), questId, qstatus);
}
questStatusData.Explored = result.Read<byte>(2) > 0;
long acceptTime = result.Read<long>(3);
long endTime = result.Read<long>(4);
if (quest.LimitTime != 0 && !GetQuestRewardStatus(questId))
{
AddTimedQuest(questId);
if (endTime <= GameTime.GetGameTime())
questStatusData.Timer = 1;
else
questStatusData.Timer = (uint)((endTime - GameTime.GetGameTime()) * Time.InMilliseconds);
}
else
endTime = 0;
// add to quest log
if (slot < SharedConst.MaxQuestLogSize && questStatusData.Status != QuestStatus.None)
{
questStatusData.Slot = slot;
foreach (QuestObjective obj in quest.Objectives)
m_questObjectiveStatus.Add((obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = (questId, questStatusData), ObjectiveId = obj.Id });
SetQuestSlot(slot, questId);
SetQuestSlotEndTime(slot, endTime);
questStatusData.AcceptTime = acceptTime;
if (questStatusData.Status == QuestStatus.Complete)
SetQuestSlotState(slot, QuestSlotStateMask.Complete);
else if (questStatusData.Status == QuestStatus.Failed)
SetQuestSlotState(slot, QuestSlotStateMask.Fail);
if (quest.HasFlagEx(QuestFlagsEx.RecastAcceptSpellOnLogin) && quest.HasFlag(QuestFlags.PlayerCastAccept) && quest.SourceSpellID > 0)
CastSpell(this, quest.SourceSpellID, new CastSpellExtraArgs(TriggerCastFlags.FullMask));
++slot;
}
m_QuestStatus[questId] = questStatusData;
Log.outDebug(LogFilter.ServerLoading, "Quest status is {0} for quest {1} for player (GUID: {2})", questStatusData.Status, questId, GetGUID().ToString());
questStatusData.Status = QuestStatus.Incomplete;
Log.outError(LogFilter.Player, $"Player._LoadQuestStatus: Player '{GetName()}' ({GetGUID()}) has invalid quest {questId} status ({qstatus}), replaced by QUEST_STATUS_INCOMPLETE(3).");
}
questStatusData.Explored = result.Read<byte>(2) > 0;
questStatusData.AcceptTime = result.Read<long>(3);
if (quest.HasFlagEx(QuestFlagsEx.RemoveOnPeriodicReset))
{
if ((quest.IsDaily() && questStatusData.AcceptTime < lastDailyReset)
|| (quest.IsWeekly() && questStatusData.AcceptTime < lastWeeklyReset))
{
questStatusData.Status = QuestStatus.None;
m_QuestStatusSave[questId] = QuestSaveType.Delete;
SendPacket(new QuestForceRemoved(questId));
}
}
long endTime = result.Read<long>(4);
if (quest.LimitTime != 0 && !GetQuestRewardStatus(questId))
{
AddTimedQuest(questId);
if (endTime <= GameTime.GetGameTime())
questStatusData.Timer = 1;
else
questStatusData.Timer = (uint)((endTime - GameTime.GetGameTime()) * Time.InMilliseconds);
}
else
endTime = 0;
// add to quest log
if (slot < SharedConst.MaxQuestLogSize && questStatusData.Status != QuestStatus.None)
{
questStatusData.Slot = slot;
foreach (QuestObjective obj in quest.Objectives)
m_questObjectiveStatus.Add((obj.Type, obj.ObjectID), new QuestObjectiveStatusData() { QuestStatusPair = (questId, questStatusData), ObjectiveId = obj.Id });
SetQuestSlot(slot, questId);
SetQuestSlotEndTime(slot, endTime);
if (questStatusData.Status == QuestStatus.Complete)
SetQuestSlotState(slot, QuestSlotStateMask.Complete);
else if (questStatusData.Status == QuestStatus.Failed)
SetQuestSlotState(slot, QuestSlotStateMask.Fail);
if (quest.HasFlagEx(QuestFlagsEx.RecastAcceptSpellOnLogin) && quest.HasFlag(QuestFlags.PlayerCastAccept) && quest.SourceSpellID > 0)
CastSpell(this, quest.SourceSpellID, new CastSpellExtraArgs(TriggerCastFlags.FullMask));
++slot;
}
m_QuestStatus[questId] = questStatusData;
Log.outDebug(LogFilter.ServerLoading, "Quest status is {0} for quest {1} for player (GUID: {2})", questStatusData.Status, questId, GetGUID().ToString());
}
while (result.NextRow());
}