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)
|
void _LoadQuestStatus(SQLResult result)
|
||||||
{
|
{
|
||||||
ushort slot = 0;
|
ushort slot = 0;
|
||||||
|
|
||||||
|
long lastDailyReset = Global.WorldMgr.GetNextDailyQuestsResetTime() - Time.Day;
|
||||||
|
long lastWeeklyReset = Global.WorldMgr.GetNextWeeklyQuestsResetTime() - Time.Week;
|
||||||
|
|
||||||
if (!result.IsEmpty())
|
if (!result.IsEmpty())
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
@@ -728,64 +732,73 @@ namespace Game.Entities
|
|||||||
uint questId = result.Read<uint>(0);
|
uint questId = result.Read<uint>(0);
|
||||||
// used to be new, no delete?
|
// used to be new, no delete?
|
||||||
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
|
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.Status = QuestStatus.Incomplete;
|
||||||
QuestStatusData questStatusData = new();
|
Log.outError(LogFilter.Player, $"Player._LoadQuestStatus: Player '{GetName()}' ({GetGUID()}) has invalid quest {questId} status ({qstatus}), replaced by QUEST_STATUS_INCOMPLETE(3).");
|
||||||
|
|
||||||
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.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());
|
while (result.NextRow());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,6 +187,8 @@ namespace Game.Entities
|
|||||||
|
|
||||||
if (quest.LimitTime != 0)
|
if (quest.LimitTime != 0)
|
||||||
RemoveTimedQuest(questId);
|
RemoveTimedQuest(questId);
|
||||||
|
|
||||||
|
SendPacket(new QuestForceRemoved(questId));
|
||||||
}
|
}
|
||||||
|
|
||||||
// DB data deleted in caller
|
// DB data deleted in caller
|
||||||
@@ -227,6 +229,8 @@ namespace Game.Entities
|
|||||||
|
|
||||||
if (quest.LimitTime != 0)
|
if (quest.LimitTime != 0)
|
||||||
RemoveTimedQuest(questId);
|
RemoveTimedQuest(questId);
|
||||||
|
|
||||||
|
SendPacket(new QuestForceRemoved(questId));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_weeklyquests.Clear();
|
m_weeklyquests.Clear();
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ namespace Game.Networking.Packets
|
|||||||
QuestGiverGUIDs.Add(_worldPacket.ReadPackedGuid());
|
QuestGiverGUIDs.Add(_worldPacket.ReadPackedGuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class QuestGiverStatusPkt : ServerPacket
|
public class QuestGiverStatusPkt : ServerPacket
|
||||||
{
|
{
|
||||||
public QuestGiverStatusPkt() : base(ServerOpcodes.QuestGiverStatus, ConnectionType.Instance)
|
public QuestGiverStatusPkt() : base(ServerOpcodes.QuestGiverStatus, ConnectionType.Instance)
|
||||||
@@ -440,7 +440,7 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
public uint QuestID;
|
public uint QuestID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class QuestGiverQuestDetails : ServerPacket
|
public class QuestGiverQuestDetails : ServerPacket
|
||||||
{
|
{
|
||||||
public QuestGiverQuestDetails() : base(ServerOpcodes.QuestGiverQuestDetails) { }
|
public QuestGiverQuestDetails() : base(ServerOpcodes.QuestGiverQuestDetails) { }
|
||||||
@@ -848,6 +848,21 @@ namespace Game.Networking.Packets
|
|||||||
public override void Write() { }
|
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
|
class RequestWorldQuestUpdate : ClientPacket
|
||||||
{
|
{
|
||||||
public RequestWorldQuestUpdate(WorldPacket packet) : base(packet) { }
|
public RequestWorldQuestUpdate(WorldPacket packet) : base(packet) { }
|
||||||
@@ -1038,7 +1053,7 @@ namespace Game.Networking.Packets
|
|||||||
public float POIx;
|
public float POIx;
|
||||||
public float POIy;
|
public float POIy;
|
||||||
public uint POIPriority;
|
public uint POIPriority;
|
||||||
public RaceMask<ulong> AllowableRaces = new (0xFFFFFFFFFFFFFFFF);
|
public RaceMask<ulong> AllowableRaces = new(0xFFFFFFFFFFFFFFFF);
|
||||||
public string LogTitle;
|
public string LogTitle;
|
||||||
public string LogDescription;
|
public string LogDescription;
|
||||||
public string QuestDescription;
|
public string QuestDescription;
|
||||||
@@ -1372,7 +1387,7 @@ namespace Game.Networking.Packets
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PlayerChoiceResponse
|
class PlayerChoiceResponse
|
||||||
{
|
{
|
||||||
public int ResponseID;
|
public int ResponseID;
|
||||||
public ushort ResponseIdentifier;
|
public ushort ResponseIdentifier;
|
||||||
public int ChoiceArtFileID;
|
public int ChoiceArtFileID;
|
||||||
|
|||||||
@@ -2016,17 +2016,6 @@ namespace Game
|
|||||||
player.DailyReset();
|
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
|
// reselect pools
|
||||||
Global.QuestPoolMgr.ChangeDailyQuests();
|
Global.QuestPoolMgr.ChangeDailyQuests();
|
||||||
|
|
||||||
@@ -2069,16 +2058,6 @@ namespace Game
|
|||||||
player.ResetWeeklyQuestStatus();
|
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
|
// reselect pools
|
||||||
Global.QuestPoolMgr.ChangeWeeklyQuests();
|
Global.QuestPoolMgr.ChangeWeeklyQuests();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user