aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorxinef1 <w.szyszko2@gmail.com>2017-02-20 20:27:08 +0100
committerariel- <ariel-@users.noreply.github.com>2017-02-20 16:27:08 -0300
commitae9d01a3245c59a8a8d50516a79b79250337450d (patch)
treed8cb2e521d7e15c130d21aad9d2225ba82b7998d /src/server/game/Entities
parent4eae29d421e1d7a28aaa50d401cbbf09c50bd476 (diff)
Store cached static data queries, instead of building them in every query opcode (#18637)
- Added config option to enable / disable cache - Reinitialize data on reload command use - Always send WDB fields in item query
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp56
-rw-r--r--src/server/game/Entities/Creature/Creature.h5
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp152
-rw-r--r--src/server/game/Entities/Creature/GossipDef.h2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp50
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h5
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.cpp139
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h5
8 files changed, 269 insertions, 145 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 0fec09ac8f2..93345dee29e 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -146,6 +146,62 @@ uint32 CreatureTemplate::GetFirstVisibleModel() const
return 17519;
}
+void CreatureTemplate::InitializeQueryData()
+{
+ WorldPacket queryTemp;
+ for (uint8 loc = LOCALE_enUS; loc < TOTAL_LOCALES; ++loc)
+ {
+ queryTemp = BuildQueryData(static_cast<LocaleConstant>(loc));
+ QueryData[loc] = queryTemp;
+ }
+}
+
+WorldPacket CreatureTemplate::BuildQueryData(LocaleConstant loc) const
+{
+ WorldPacket queryTemp(SMSG_CREATURE_QUERY_RESPONSE, 200);
+
+ std::string locName = Name, locTitle = Title;
+ if (CreatureLocale const* cl = sObjectMgr->GetCreatureLocale(Entry))
+ {
+ ObjectMgr::GetLocaleString(cl->Name, loc, locName);
+ ObjectMgr::GetLocaleString(cl->Title, loc, locTitle);
+ }
+
+ queryTemp << uint32(Entry); // creature entry
+ queryTemp << locName;
+ queryTemp << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4, always empty
+ queryTemp << locTitle;
+ queryTemp << IconName; // "Directions" for guard, string for Icons 2.3.0
+ queryTemp << uint32(type_flags); // flags
+ queryTemp << uint32(type); // CreatureType.dbc
+ queryTemp << uint32(family); // CreatureFamily.dbc
+ queryTemp << uint32(rank); // Creature Rank (elite, boss, etc)
+ queryTemp << uint32(KillCredit[0]); // new in 3.1, kill credit
+ queryTemp << uint32(KillCredit[1]); // new in 3.1, kill credit
+ queryTemp << uint32(Modelid1); // Modelid1
+ queryTemp << uint32(Modelid2); // Modelid2
+ queryTemp << uint32(Modelid3); // Modelid3
+ queryTemp << uint32(Modelid4); // Modelid4
+ queryTemp << float(ModHealth); // dmg/hp modifier
+ queryTemp << float(ModMana); // dmg/mana modifier
+ queryTemp << uint8(RacialLeader);
+
+ CreatureQuestItemList const* items = sObjectMgr->GetCreatureQuestItemList(Entry);
+ if (items)
+ {
+ for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
+ queryTemp << (i < items->size() ? uint32((*items)[i]) : uint32(0));
+ }
+ else
+ {
+ for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
+ queryTemp << uint32(0);
+ }
+
+ queryTemp << uint32(movementId); // CreatureMovementInfo.dbc
+ return queryTemp;
+}
+
bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
{
if (Unit* victim = ObjectAccessor::GetUnit(m_owner, m_victim))
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 50e70cdcd0e..aa9b2466e62 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -26,6 +26,7 @@
#include "LootMgr.h"
#include "DatabaseEnv.h"
#include "Cell.h"
+#include "WorldPacket.h"
#include <list>
@@ -140,6 +141,7 @@ struct TC_GAME_API CreatureTemplate
uint32 MechanicImmuneMask;
uint32 flags_extra;
uint32 ScriptID;
+ WorldPacket QueryData[TOTAL_LOCALES];
uint32 GetRandomValidModelId() const;
uint32 GetFirstValidModelId() const;
uint32 GetFirstInvisibleModel() const;
@@ -171,6 +173,9 @@ struct TC_GAME_API CreatureTemplate
// if can tame exotic then can tame any tameable
return canTameExotic || !IsExotic();
}
+
+ void InitializeQueryData();
+ WorldPacket BuildQueryData(LocaleConstant loc) const;
};
typedef std::vector<uint32> CreatureQuestItemList;
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index df5abb14f71..4ace28fc131 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -234,7 +234,7 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
ObjectMgr::GetLocaleString(localeData->Title, locale, title);
if (questLevelInTitle)
- AddQuestLevelToTitle(title, quest->GetQuestLevel());
+ Quest::AddQuestLevelToTitle(title, quest->GetQuestLevel());
data << title; // max 0x200
}
@@ -353,7 +353,7 @@ void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, const std::string
ObjectMgr::GetLocaleString(localeData->Title, locale, title);
if (questLevelInTitle)
- AddQuestLevelToTitle(title, quest->GetQuestLevel());
+ Quest::AddQuestLevelToTitle(title, quest->GetQuestLevel());
data << uint32(questID);
data << uint32(qmi.QuestIcon);
@@ -399,7 +399,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
}
if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS))
- AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
+ Quest::AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
WorldPacket data(SMSG_QUESTGIVER_QUEST_DETAILS, 100); // guess size
data << uint64(npcGUID);
@@ -489,138 +489,14 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
{
- std::string questTitle = quest->GetTitle();
- std::string questDetails = quest->GetDetails();
- std::string questObjectives = quest->GetObjectives();
- std::string questAreaDescription = quest->GetAreaDescription();
- std::string questCompletedText = quest->GetCompletedText();
-
- std::string questObjectiveText[QUEST_OBJECTIVES_COUNT];
- for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- questObjectiveText[i] = quest->ObjectiveText[i];
-
- int32 locale = _session->GetSessionDbLocaleIndex();
- if (locale >= 0)
- {
- if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
- {
- ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
- ObjectMgr::GetLocaleString(localeData->Details, locale, questDetails);
- ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
- ObjectMgr::GetLocaleString(localeData->AreaDescription, locale, questAreaDescription);
- ObjectMgr::GetLocaleString(localeData->CompletedText, locale, questCompletedText);
-
- for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ObjectMgr::GetLocaleString(localeData->ObjectiveText[i], locale, questObjectiveText[i]);
- }
- }
-
- WorldPacket data(SMSG_QUEST_QUERY_RESPONSE, 100); // guess size
-
- data << uint32(quest->GetQuestId()); // quest id
- data << uint32(quest->GetQuestMethod()); // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
- data << uint32(quest->GetQuestLevel()); // may be -1, static data, in other cases must be used dynamic level: Player::GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client)
- data << uint32(quest->GetMinLevel()); // min level
- data << uint32(quest->GetZoneOrSort()); // zone or sort to display in quest log
-
- data << uint32(quest->GetType()); // quest type
- data << uint32(quest->GetSuggestedPlayers()); // suggested players count
-
- data << uint32(quest->GetRepObjectiveFaction()); // shown in quest log as part of quest objective
- data << uint32(quest->GetRepObjectiveValue()); // shown in quest log as part of quest objective
-
- data << uint32(quest->GetRepObjectiveFaction2()); // shown in quest log as part of quest objective OPPOSITE faction
- data << uint32(quest->GetRepObjectiveValue2()); // shown in quest log as part of quest objective OPPOSITE faction
-
- data << uint32(quest->GetNextQuestInChain()); // client will request this quest from NPC, if not 0
- data << uint32(quest->GetXPId()); // used for calculating rewarded experience
-
- if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
- data << uint32(0); // Hide money rewarded
- else
- data << uint32(quest->GetRewOrReqMoney()); // reward money (below max lvl)
-
- data << uint32(quest->GetRewMoneyMaxLevel()); // used in XP calculation at client
- data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (cast if RewSpellCast == 0)
- data << int32(quest->GetRewSpellCast()); // cast spell
-
- // rewarded honor points
- data << uint32(quest->GetRewHonorAddition());
- data << float(quest->GetRewHonorMultiplier());
- data << uint32(quest->GetSrcItemId()); // source item id
- data << uint32(quest->GetFlags() & 0xFFFF); // quest flags
- data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
- data << uint32(quest->GetPlayersSlain()); // players slain
- data << uint32(quest->GetBonusTalents()); // bonus talents
- data << uint32(quest->GetRewArenaPoints()); // bonus arena points
- data << uint32(0); // review rep show mask
-
- if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
- {
- for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
- data << uint32(0) << uint32(0);
- for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- data << uint32(0) << uint32(0);
- }
+ if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES))
+ _session->SendPacket(&quest->QueryData[static_cast<uint32>(_session->GetSessionDbLocaleIndex())]);
else
{
- for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
- {
- data << uint32(quest->RewardItemId[i]);
- data << uint32(quest->RewardItemIdCount[i]);
- }
- for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- {
- data << uint32(quest->RewardChoiceItemId[i]);
- data << uint32(quest->RewardChoiceItemCount[i]);
- }
+ WorldPacket queryPacket = quest->BuildQueryData(_session->GetSessionDbLocaleIndex());
+ _session->SendPacket(&queryPacket);
}
- for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
- data << uint32(quest->RewardFactionId[i]);
-
- for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid+1 QuestFactionReward.dbc?
- data << int32(quest->RewardFactionValueId[i]);
-
- for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // unk (0)
- data << int32(quest->RewardFactionValueIdOverride[i]);
-
- data << uint32(quest->GetPOIContinent());
- data << float(quest->GetPOIx());
- data << float(quest->GetPOIy());
- data << uint32(quest->GetPointOpt());
-
- if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS))
- AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
-
- data << questTitle;
- data << questObjectives;
- data << questDetails;
- data << questAreaDescription;
- data << questCompletedText; // display in quest objectives window once all objectives are completed
-
- for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- {
- if (quest->RequiredNpcOrGo[i] < 0)
- data << uint32((quest->RequiredNpcOrGo[i] * (-1)) | 0x80000000); // client expects gameobject template id in form (id|0x80000000)
- else
- data << uint32(quest->RequiredNpcOrGo[i]);
-
- data << uint32(quest->RequiredNpcOrGoCount[i]);
- data << uint32(quest->ItemDrop[i]);
- data << uint32(0); // req source count?
- }
-
- for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
- {
- data << uint32(quest->RequiredItemId[i]);
- data << uint32(quest->RequiredItemCount[i]);
- }
-
- for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- data << questObjectiveText[i];
-
- _session->SendPacket(&data);
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", quest->GetQuestId());
}
@@ -640,7 +516,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
}
if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS))
- AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
+ Quest::AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
WorldPacket data(SMSG_QUESTGIVER_OFFER_REWARD, 50); // guess size
data << uint64(npcGUID);
@@ -743,7 +619,7 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU
}
if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS))
- AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
+ Quest::AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
WorldPacket data(SMSG_QUESTGIVER_REQUEST_ITEMS, 50); // guess size
data << uint64(npcGUID);
@@ -794,13 +670,3 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU
_session->SendPacket(&data);
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPC=%s, questid=%u", npcGUID.ToString().c_str(), quest->GetQuestId());
}
-
-void PlayerMenu::AddQuestLevelToTitle(std::string &title, int32 level)
-{
- // Adds the quest level to the front of the quest title
- // example: [13] Westfall Stew
-
- std::stringstream questTitlePretty;
- questTitlePretty << "[" << level << "] " << title;
- title = questTitlePretty.str();
-}
diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h
index b649b4ae873..9826057361d 100644
--- a/src/server/game/Entities/Creature/GossipDef.h
+++ b/src/server/game/Entities/Creature/GossipDef.h
@@ -286,8 +286,6 @@ class TC_GAME_API PlayerMenu
void SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUID, bool enableNext) const;
void SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const;
- static void AddQuestLevelToTitle(std::string &title, int32 level);
-
private:
GossipMenu _gossipMenu;
QuestMenu _questMenu;
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 3ef54a6187c..2fc2d44666b 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -33,6 +33,56 @@
#include "World.h"
#include "Transport.h"
+void GameObjectTemplate::InitializeQueryData()
+{
+ WorldPacket queryTemp;
+ for (uint8 loc = LOCALE_enUS; loc < TOTAL_LOCALES; ++loc)
+ {
+ queryTemp = BuildQueryData(static_cast<LocaleConstant>(loc));
+ QueryData[loc] = queryTemp;
+ }
+}
+
+WorldPacket GameObjectTemplate::BuildQueryData(LocaleConstant loc) const
+{
+ WorldPacket queryTemp(SMSG_GAMEOBJECT_QUERY_RESPONSE, 200);
+
+ std::string locName = name;
+ std::string locIconName = IconName;
+ std::string locCastBarCaption = castBarCaption;
+
+ if (GameObjectLocale const* gameObjectLocale = sObjectMgr->GetGameObjectLocale(entry))
+ {
+ ObjectMgr::GetLocaleString(gameObjectLocale->Name, loc, locName);
+ ObjectMgr::GetLocaleString(gameObjectLocale->CastBarCaption, loc, locCastBarCaption);
+ }
+
+ queryTemp << uint32(entry);
+ queryTemp << uint32(type);
+ queryTemp << uint32(displayId);
+ queryTemp << locName;
+ queryTemp << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4
+ queryTemp << locIconName; // 2.0.3, string. Icon name to use instead of default icon for go's (ex: "Attack" makes sword)
+ queryTemp << locCastBarCaption; // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting")
+ queryTemp << unk1; // 2.0.3, string
+ queryTemp.append(raw.data, MAX_GAMEOBJECT_DATA);
+ queryTemp << float(size); // go size
+
+ GameObjectQuestItemList const* items = sObjectMgr->GetGameObjectQuestItemList(entry);
+ if (items)
+ {
+ for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i)
+ queryTemp << (i < items->size() ? uint32((*items)[i]) : uint32(0));
+ }
+ else
+ {
+ for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i)
+ queryTemp << uint32(0);
+ }
+
+ return queryTemp;
+}
+
GameObject::GameObject() : WorldObject(false), MapObject(),
m_model(nullptr), m_goValue(), m_AI(nullptr)
{
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 549b51cbab6..b9160f3cc11 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -25,6 +25,7 @@
#include "Object.h"
#include "LootMgr.h"
#include "DatabaseEnv.h"
+#include "WorldPacket.h"
#include <G3D/Quat.h>
class GameObjectAI;
@@ -423,6 +424,7 @@ struct GameObjectTemplate
std::string AIName;
uint32 ScriptId;
+ WorldPacket QueryData[TOTAL_LOCALES];
// helpers
bool IsDespawnAtAction() const
@@ -559,6 +561,9 @@ struct GameObjectTemplate
default: return 0;
}
}
+
+ void InitializeQueryData();
+ WorldPacket BuildQueryData(LocaleConstant loc) const;
};
// From `gameobject_template_addon`
diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp
index 90c488992f2..e55d0d73132 100644
--- a/src/server/game/Entities/Item/ItemTemplate.cpp
+++ b/src/server/game/Entities/Item/ItemTemplate.cpp
@@ -16,6 +16,10 @@
*/
#include "ItemTemplate.h"
+#include "ObjectMgr.h"
+#include "Opcodes.h"
+#include "SpellMgr.h"
+#include "SpellInfo.h"
#include "SpellInfo.h"
#include "SpellMgr.h"
@@ -143,3 +147,138 @@ void ItemTemplate::_LoadTotalAP()
_totalAP = totalAP;
}
+
+void ItemTemplate::InitializeQueryData()
+{
+ WorldPacket queryTemp;
+ for (uint8 loc = LOCALE_enUS; loc < TOTAL_LOCALES; ++loc)
+ {
+ queryTemp = BuildQueryData(static_cast<LocaleConstant>(loc));
+ QueryData[loc] = queryTemp;
+ }
+}
+
+WorldPacket ItemTemplate::BuildQueryData(LocaleConstant loc) const
+{
+ WorldPacket queryTemp(SMSG_ITEM_QUERY_SINGLE_RESPONSE, 500);
+
+ std::string locName = Name1;
+ std::string locDescription = Description;
+
+ if (ItemLocale const* il = sObjectMgr->GetItemLocale(ItemId))
+ {
+ ObjectMgr::GetLocaleString(il->Name, loc, locName);
+ ObjectMgr::GetLocaleString(il->Description, loc, locDescription);
+ }
+
+ queryTemp << ItemId;
+ queryTemp << Class;
+ queryTemp << SubClass;
+ queryTemp << SoundOverrideSubclass;
+ queryTemp << locName;
+ queryTemp << uint8(0x00); //Name2; // blizz not send name there, just uint8(0x00); <-- \0 = empty string = empty name...
+ queryTemp << uint8(0x00); //Name3; // blizz not send name there, just uint8(0x00);
+ queryTemp << uint8(0x00); //Name4; // blizz not send name there, just uint8(0x00);
+ queryTemp << DisplayInfoID;
+ queryTemp << Quality;
+ queryTemp << Flags;
+ queryTemp << Flags2;
+ queryTemp << BuyPrice;
+ queryTemp << SellPrice;
+ queryTemp << InventoryType;
+ queryTemp << AllowableClass;
+ queryTemp << AllowableRace;
+ queryTemp << ItemLevel;
+ queryTemp << RequiredLevel;
+ queryTemp << RequiredSkill;
+ queryTemp << RequiredSkillRank;
+ queryTemp << RequiredSpell;
+ queryTemp << RequiredHonorRank;
+ queryTemp << RequiredCityRank;
+ queryTemp << RequiredReputationFaction;
+ queryTemp << RequiredReputationRank;
+ queryTemp << int32(MaxCount);
+ queryTemp << int32(Stackable);
+ queryTemp << ContainerSlots;
+ queryTemp << StatsCount; // item stats count
+ for (uint32 i = 0; i < StatsCount; ++i)
+ {
+ queryTemp << ItemStat[i].ItemStatType;
+ queryTemp << ItemStat[i].ItemStatValue;
+ }
+ queryTemp << ScalingStatDistribution; // scaling stats distribution
+ queryTemp << ScalingStatValue; // some kind of flags used to determine stat values column
+ for (int i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
+ {
+ queryTemp << Damage[i].DamageMin;
+ queryTemp << Damage[i].DamageMax;
+ queryTemp << Damage[i].DamageType;
+ }
+
+ // resistances (7)
+ queryTemp << Armor;
+ queryTemp << HolyRes;
+ queryTemp << FireRes;
+ queryTemp << NatureRes;
+ queryTemp << FrostRes;
+ queryTemp << ShadowRes;
+ queryTemp << ArcaneRes;
+
+ queryTemp << Delay;
+ queryTemp << AmmoType;
+ queryTemp << RangedModRange;
+
+ for (uint8 s = 0; s < MAX_ITEM_PROTO_SPELLS; ++s)
+ {
+ // spells are validated on template loading
+ if (Spells[s].SpellId > 0)
+ {
+ queryTemp << Spells[s].SpellId;
+ queryTemp << Spells[s].SpellTrigger;
+ queryTemp << uint32(-abs(Spells[s].SpellCharges));
+ queryTemp << uint32(Spells[s].SpellCooldown);
+ queryTemp << uint32(Spells[s].SpellCategory);
+ queryTemp << uint32(Spells[s].SpellCategoryCooldown);
+ }
+ else
+ {
+ queryTemp << uint32(0);
+ queryTemp << uint32(0);
+ queryTemp << uint32(0);
+ queryTemp << uint32(-1);
+ queryTemp << uint32(0);
+ queryTemp << uint32(-1);
+ }
+ }
+ queryTemp << Bonding;
+ queryTemp << locDescription;
+ queryTemp << PageText;
+ queryTemp << LanguageID;
+ queryTemp << PageMaterial;
+ queryTemp << StartQuest;
+ queryTemp << LockID;
+ queryTemp << int32(Material);
+ queryTemp << Sheath;
+ queryTemp << RandomProperty;
+ queryTemp << RandomSuffix;
+ queryTemp << Block;
+ queryTemp << ItemSet;
+ queryTemp << MaxDurability;
+ queryTemp << Area;
+ queryTemp << Map; // Added in 1.12.x & 2.0.1 client branch
+ queryTemp << BagFamily;
+ queryTemp << TotemCategory;
+ for (int s = 0; s < MAX_ITEM_PROTO_SOCKETS; ++s)
+ {
+ queryTemp << Socket[s].Color;
+ queryTemp << Socket[s].Content;
+ }
+ queryTemp << socketBonus;
+ queryTemp << GemProperties;
+ queryTemp << RequiredDisenchantSkill;
+ queryTemp << ArmorDamageModifier;
+ queryTemp << Duration; // added in 2.4.2.8209, duration (seconds)
+ queryTemp << ItemLimitCategory; // WotLK, ItemLimitCategory
+ queryTemp << HolidayId; // Holiday.dbc?
+ return queryTemp;
+}
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index 79b2147b1be..5ea34aedb01 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -21,6 +21,7 @@
#include "Common.h"
#include "SharedDefines.h"
+#include "WorldPacket.h"
class ObjectMgr;
@@ -685,6 +686,7 @@ struct ItemTemplate
uint32 MinMoneyLoot;
uint32 MaxMoneyLoot;
uint32 FlagsCu;
+ WorldPacket QueryData[TOTAL_LOCALES];
// helpers
bool CanChangeEquipStateInCombat() const;
@@ -710,6 +712,9 @@ struct ItemTemplate
bool IsArmorVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_ARMOR_ENCHANTMENT; }
bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && (Flags & ITEM_FLAG_CONJURED); }
+ void InitializeQueryData();
+ WorldPacket BuildQueryData(LocaleConstant loc) const;
+
private:
// Cached info
int32 _totalAP;