Core/Cache: Implement QueryCache system
Ideas/Port From (https://github.com/TrinityCore/TrinityCore/commit/b4d30bb92cbfc8411d8d91b0f4f2981f2cecc148)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user