Core/Quests: Removed slow queries from daily and weekly resets
Port From (https://github.com/TrinityCore/TrinityCore/commit/ee7b0e82fa076ad4338b1c362235cec6739f00e0)
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -187,6 +187,8 @@ namespace Game.Entities
|
||||
|
||||
if (quest.LimitTime != 0)
|
||||
RemoveTimedQuest(questId);
|
||||
|
||||
SendPacket(new QuestForceRemoved(questId));
|
||||
}
|
||||
|
||||
// DB data deleted in caller
|
||||
@@ -227,6 +229,8 @@ namespace Game.Entities
|
||||
|
||||
if (quest.LimitTime != 0)
|
||||
RemoveTimedQuest(questId);
|
||||
|
||||
SendPacket(new QuestForceRemoved(questId));
|
||||
}
|
||||
|
||||
m_weeklyquests.Clear();
|
||||
|
||||
Reference in New Issue
Block a user