Core/Cache: Implement QueryCache system

Ideas/Port From (https://github.com/TrinityCore/TrinityCore/commit/b4d30bb92cbfc8411d8d91b0f4f2981f2cecc148)
This commit is contained in:
hondacrx
2019-08-31 10:06:35 -04:00
parent 8797760d8a
commit 966c1fff33
13 changed files with 430 additions and 358 deletions
@@ -20,6 +20,8 @@ using Framework.Constants;
using System;
using System.Collections.Generic;
using Framework.Dynamic;
using Game.Network.Packets;
using Game.Network;
namespace Game.Entities
{
@@ -91,6 +93,8 @@ namespace Game.Entities
public CreatureFlagsExtra FlagsExtra;
public uint ScriptID;
public QueryCreatureResponse QueryData;
public CreatureModel GetModelByIdx(int idx)
{
return idx < Models.Count ? Models[idx] : null;
@@ -210,6 +214,58 @@ namespace Game.Entities
return -1;
}
}
public void InitializeQueryData()
{
QueryData = new QueryCreatureResponse();
QueryData.CreatureID = Entry;
QueryData.Allow = true;
CreatureStats stats = new CreatureStats();
stats.Leader = RacialLeader;
stats.Name[0] = Name;
stats.NameAlt[0] = FemaleName;
stats.Flags[0] = (uint)TypeFlags;
stats.Flags[1] = TypeFlags2;
stats.CreatureType = (int)CreatureType;
stats.CreatureFamily = (int)Family;
stats.Classification = (int)Rank;
for (uint i = 0; i < SharedConst.MaxCreatureKillCredit; ++i)
stats.ProxyCreatureID[i] = KillCredit[i];
foreach (var model in Models)
{
stats.Display.TotalProbability += model.Probability;
stats.Display.CreatureDisplay.Add(new CreatureXDisplay(model.CreatureDisplayID, model.DisplayScale, model.Probability));
}
stats.HpMulti = ModHealth;
stats.EnergyMulti = ModMana;
stats.CreatureMovementInfoID = MovementId;
stats.RequiredExpansion = RequiredExpansion;
stats.HealthScalingExpansion = HealthScalingExpansion;
stats.VignetteID = VignetteID;
stats.Class = (int)UnitClass;
stats.FadeRegionRadius = FadeRegionRadius;
stats.WidgetSetID = WidgetSetID;
stats.WidgetSetUnitConditionID = WidgetSetUnitConditionID;
stats.Title = SubName;
stats.TitleAlt = TitleAlt;
stats.CursorName = IconName;
var items = Global.ObjectMgr.GetCreatureQuestItemList(Entry);
if (items != null)
stats.QuestItems.AddRange(items);
QueryData.Stats = stats;
}
}
public class CreatureBaseStats
+18 -125
View File
@@ -467,145 +467,38 @@ namespace Game.Misc
public void SendQuestQueryResponse(Quest quest)
{
QueryQuestInfoResponse packet = new QueryQuestInfoResponse();
if (!WorldConfig.GetBoolValue(WorldCfg.CacheDataQueries))
quest.InitializeQueryData();
packet.Allow = true;
packet.QuestID = quest.Id;
QueryQuestInfoResponse queryQuestInfoResponse = quest.QueryData;
packet.Info.LogTitle = quest.LogTitle;
packet.Info.LogDescription = quest.LogDescription;
packet.Info.QuestDescription = quest.QuestDescription;
packet.Info.AreaDescription = quest.AreaDescription;
packet.Info.QuestCompletionLog = quest.QuestCompletionLog;
packet.Info.PortraitGiverText = quest.PortraitGiverText;
packet.Info.PortraitGiverName = quest.PortraitGiverName;
packet.Info.PortraitTurnInText = quest.PortraitTurnInText;
packet.Info.PortraitTurnInName = quest.PortraitTurnInName;
LocaleConstant locale = _session.GetSessionDbLocaleIndex();
if (locale != LocaleConstant.enUS)
LocaleConstant loc = _session.GetSessionDbLocaleIndex();
if (loc != LocaleConstant.enUS)
{
QuestTemplateLocale questTemplateLocale = Global.ObjectMgr.GetQuestLocale(quest.Id);
QuestTemplateLocale questTemplateLocale = Global.ObjectMgr.GetQuestLocale(queryQuestInfoResponse.QuestID);
if (questTemplateLocale != null)
{
ObjectManager.GetLocaleString(questTemplateLocale.LogTitle, locale, ref packet.Info.LogTitle);
ObjectManager.GetLocaleString(questTemplateLocale.LogDescription, locale, ref packet.Info.LogDescription);
ObjectManager.GetLocaleString(questTemplateLocale.QuestDescription, locale, ref packet.Info.QuestDescription);
ObjectManager.GetLocaleString(questTemplateLocale.AreaDescription, locale, ref packet.Info.AreaDescription);
ObjectManager.GetLocaleString(questTemplateLocale.QuestCompletionLog, locale, ref packet.Info.QuestCompletionLog);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitGiverText, locale, ref packet.Info.PortraitGiverText);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitGiverName, locale, ref packet.Info.PortraitGiverName);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitTurnInText, locale, ref packet.Info.PortraitTurnInText);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitTurnInName, locale, ref packet.Info.PortraitTurnInName);
ObjectManager.GetLocaleString(questTemplateLocale.LogTitle, loc, ref queryQuestInfoResponse.Info.LogTitle);
ObjectManager.GetLocaleString(questTemplateLocale.LogDescription, loc, ref queryQuestInfoResponse.Info.LogDescription);
ObjectManager.GetLocaleString(questTemplateLocale.QuestDescription, loc, ref queryQuestInfoResponse.Info.QuestDescription);
ObjectManager.GetLocaleString(questTemplateLocale.AreaDescription, loc, ref queryQuestInfoResponse.Info.AreaDescription);
ObjectManager.GetLocaleString(questTemplateLocale.QuestCompletionLog, loc, ref queryQuestInfoResponse.Info.QuestCompletionLog);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitGiverText, loc, ref queryQuestInfoResponse.Info.PortraitGiverText);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitGiverName, loc, ref queryQuestInfoResponse.Info.PortraitGiverName);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitTurnInText, loc, ref queryQuestInfoResponse.Info.PortraitTurnInText);
ObjectManager.GetLocaleString(questTemplateLocale.PortraitTurnInName, loc, ref queryQuestInfoResponse.Info.PortraitTurnInName);
}
}
packet.Info.QuestID = quest.Id;
packet.Info.QuestType = (int)quest.Type;
packet.Info.QuestLevel = quest.Level;
packet.Info.QuestScalingFactionGroup = quest.ScalingFactionGroup;
packet.Info.QuestMaxScalingLevel = quest.MaxScalingLevel;
packet.Info.QuestPackageID = quest.PackageID;
packet.Info.QuestMinLevel = quest.MinLevel;
packet.Info.QuestSortID = quest.QuestSortID;
packet.Info.QuestInfoID = quest.QuestInfoID;
packet.Info.SuggestedGroupNum = quest.SuggestedPlayers;
packet.Info.RewardNextQuest = quest.NextQuestInChain;
packet.Info.RewardXPDifficulty = quest.RewardXPDifficulty;
packet.Info.RewardXPMultiplier = quest.RewardXPMultiplier;
if (!quest.HasFlag(QuestFlags.HiddenRewards))
packet.Info.RewardMoney = quest.RewardMoney < 0 ? quest.RewardMoney : (int)_session.GetPlayer().GetQuestMoneyReward(quest);
packet.Info.RewardMoneyDifficulty = quest.RewardMoneyDifficulty;
packet.Info.RewardMoneyMultiplier = quest.RewardMoneyMultiplier;
packet.Info.RewardBonusMoney = quest.RewardBonusMoney;
for (byte i = 0; i < SharedConst.QuestRewardDisplaySpellCount; ++i)
packet.Info.RewardDisplaySpell[i] = quest.RewardDisplaySpell[i];
packet.Info.RewardSpell = quest.RewardSpell;
packet.Info.RewardHonor = quest.RewardHonor;
packet.Info.RewardKillHonor = quest.RewardKillHonor;
packet.Info.RewardArtifactXPDifficulty = (int)quest.RewardArtifactXPDifficulty;
packet.Info.RewardArtifactXPMultiplier = quest.RewardArtifactXPMultiplier;
packet.Info.RewardArtifactCategoryID = (int)quest.RewardArtifactCategoryID;
packet.Info.StartItem = quest.SourceItemId;
packet.Info.Flags = (uint)quest.Flags;
packet.Info.FlagsEx = (uint)quest.FlagsEx;
packet.Info.FlagsEx2 = (uint)quest.FlagsEx2;
packet.Info.RewardTitle = quest.RewardTitleId;
packet.Info.RewardArenaPoints = quest.RewardArenaPoints;
packet.Info.RewardSkillLineID = quest.RewardSkillId;
packet.Info.RewardNumSkillUps = quest.RewardSkillPoints;
packet.Info.RewardFactionFlags = quest.RewardReputationMask;
packet.Info.PortraitGiver = quest.QuestGiverPortrait;
packet.Info.PortraitGiverMount = quest.QuestGiverPortraitMount;
packet.Info.PortraitTurnIn = quest.QuestTurnInPortrait;
for (byte i = 0; i < SharedConst.QuestItemDropCount; ++i)
{
packet.Info.ItemDrop[i] = (int)quest.ItemDrop[i];
packet.Info.ItemDropQuantity[i] = (int)quest.ItemDropQuantity[i];
}
if (!quest.HasFlag(QuestFlags.HiddenRewards))
{
for (byte i = 0; i < SharedConst.QuestRewardItemCount; ++i)
{
packet.Info.RewardItems[i] = quest.RewardItemId[i];
packet.Info.RewardAmount[i] = quest.RewardItemCount[i];
}
for (byte i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
{
packet.Info.UnfilteredChoiceItems[i].ItemID = quest.RewardChoiceItemId[i];
packet.Info.UnfilteredChoiceItems[i].Quantity = quest.RewardChoiceItemCount[i];
}
}
for (byte i = 0; i < SharedConst.QuestRewardReputationsCount; ++i)
{
packet.Info.RewardFactionID[i] = quest.RewardFactionId[i];
packet.Info.RewardFactionValue[i] = quest.RewardFactionValue[i];
packet.Info.RewardFactionOverride[i] = quest.RewardFactionOverride[i];
packet.Info.RewardFactionCapIn[i] = (int)quest.RewardFactionCapIn[i];
}
packet.Info.POIContinent = quest.POIContinent;
packet.Info.POIx = quest.POIx;
packet.Info.POIy = quest.POIy;
packet.Info.POIPriority = quest.POIPriority;
packet.Info.AllowableRaces = quest.AllowableRaces;
packet.Info.TreasurePickerID = (int)quest.TreasurePickerID;
packet.Info.Expansion = quest.Expansion;
foreach (QuestObjective questObjective in quest.Objectives)
{
if (locale != LocaleConstant.enUS)
foreach (QuestObjective questObjective in queryQuestInfoResponse.Info.Objectives)
{
QuestObjectivesLocale questObjectivesLocaleData = Global.ObjectMgr.GetQuestObjectivesLocale(questObjective.ID);
if (questObjectivesLocaleData != null)
ObjectManager.GetLocaleString(questObjectivesLocaleData.Description, locale, ref questObjective.Description);
ObjectManager.GetLocaleString(questObjectivesLocaleData.Description, loc, ref questObjective.Description);
}
packet.Info.Objectives.Add(questObjective);
}
for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
packet.Info.RewardCurrencyID[i] = quest.RewardCurrencyId[i];
packet.Info.RewardCurrencyQty[i] = quest.RewardCurrencyCount[i];
}
packet.Info.AcceptedSoundKitID = quest.SoundAccept;
packet.Info.CompleteSoundKitID = quest.SoundTurnIn;
packet.Info.AreaGroupID = quest.AreaGroupID;
packet.Info.TimeAllowed = quest.LimitTime;
_session.SendPacket(packet);
_session.SendPacket(queryQuestInfoResponse);
}
public void SendQuestGiverOfferReward(Quest quest, ObjectGuid npcGUID, bool autoLaunched)
@@ -20,6 +20,8 @@ using Framework.Constants;
using Framework.GameMath;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Game.Network;
using Game.Network.Packets;
namespace Game.Entities
{
@@ -209,6 +211,9 @@ namespace Game.Entities
[FieldOffset(68)]
public raw Raw;
[FieldOffset(208)]
public QueryGameObjectResponse QueryData;
// helpers
public bool IsDespawnAtAction()
{
@@ -513,6 +518,41 @@ namespace Game.Entities
}
}
public void InitializeQueryData()
{
QueryData = new QueryGameObjectResponse();
QueryData.GameObjectID = entry;
QueryData.Allow = true;
GameObjectStats stats = new GameObjectStats();
stats.Type = (uint)type;
stats.DisplayID = displayId;
stats.Name[0] = name;
stats.IconName = IconName;
stats.CastBarCaption = castBarCaption;
stats.UnkString = unk1;
stats.Size = size;
var items = Global.ObjectMgr.GetGameObjectQuestItemList(entry);
foreach (uint item in items)
stats.QuestItems.Add(item);
unsafe
{
fixed (int* ptr = Raw.data)
{
for (int i = 0; i < SharedConst.MaxGOData; i++)
stats.Data[i] = ptr[i];
}
}
stats.RequiredLevel = (uint)RequiredLevel;
QueryData.Stats = stats;
}
#region TypeStructs
public unsafe struct raw
{