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());
}
@@ -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();
+19 -4
View File
@@ -43,7 +43,7 @@ namespace Game.Networking.Packets
QuestGiverGUIDs.Add(_worldPacket.ReadPackedGuid());
}
}
public class QuestGiverStatusPkt : ServerPacket
{
public QuestGiverStatusPkt() : base(ServerOpcodes.QuestGiverStatus, ConnectionType.Instance)
@@ -440,7 +440,7 @@ namespace Game.Networking.Packets
public uint QuestID;
}
public class QuestGiverQuestDetails : ServerPacket
{
public QuestGiverQuestDetails() : base(ServerOpcodes.QuestGiverQuestDetails) { }
@@ -848,6 +848,21 @@ namespace Game.Networking.Packets
public override void Write() { }
}
class QuestForceRemoved : ServerPacket
{
uint QuestID;
public QuestForceRemoved(uint questId) : base(ServerOpcodes.QuestForceRemoved)
{
QuestID = questId;
}
public override void Write()
{
_worldPacket.WriteUInt32(QuestID);
}
}
class RequestWorldQuestUpdate : ClientPacket
{
public RequestWorldQuestUpdate(WorldPacket packet) : base(packet) { }
@@ -1038,7 +1053,7 @@ namespace Game.Networking.Packets
public float POIx;
public float POIy;
public uint POIPriority;
public RaceMask<ulong> AllowableRaces = new (0xFFFFFFFFFFFFFFFF);
public RaceMask<ulong> AllowableRaces = new(0xFFFFFFFFFFFFFFFF);
public string LogTitle;
public string LogDescription;
public string QuestDescription;
@@ -1372,7 +1387,7 @@ namespace Game.Networking.Packets
}
class PlayerChoiceResponse
{
{
public int ResponseID;
public ushort ResponseIdentifier;
public int ChoiceArtFileID;
-21
View File
@@ -2016,17 +2016,6 @@ namespace Game
player.DailyReset();
}
StringBuilder questIds = new StringBuilder("DELETE cq, cqo FROM character_queststatus cq LEFT JOIN character_queststatus_objectives cqo ON cq.quest = cqo.quest WHERE cq.quest IN (");
foreach (var (questId, quest) in Global.ObjectMgr.GetQuestTemplates())
{
if (quest.IsDaily() && quest.HasFlagEx(QuestFlagsEx.RemoveOnPeriodicReset))
questIds.Append($"{questId},");
}
questIds.Append("0)");
DB.Characters.Execute(questIds.ToString());
// reselect pools
Global.QuestPoolMgr.ChangeDailyQuests();
@@ -2069,16 +2058,6 @@ namespace Game
player.ResetWeeklyQuestStatus();
}
StringBuilder questIds = new StringBuilder("DELETE cq, cqo FROM character_queststatus cq LEFT JOIN character_queststatus_objectives cqo ON cq.quest = cqo.quest WHERE cq.quest IN (");
foreach (var (questId, quest) in Global.ObjectMgr.GetQuestTemplates())
{
if (quest.IsWeekly() && quest.HasFlagEx(QuestFlagsEx.RemoveOnWeeklyReset))
questIds.Append($"{questId},");
}
questIds.Append("0)");
DB.Characters.Execute(questIds.ToString());
// reselect pools
Global.QuestPoolMgr.ChangeWeeklyQuests();