diff options
| author | xinef1 <w.szyszko2@gmail.com> | 2017-02-20 20:27:08 +0100 |
|---|---|---|
| committer | ariel- <ariel-@users.noreply.github.com> | 2017-02-20 16:27:08 -0300 |
| commit | ae9d01a3245c59a8a8d50516a79b79250337450d (patch) | |
| tree | d8cb2e521d7e15c130d21aad9d2225ba82b7998d /src/server/game/Entities | |
| parent | 4eae29d421e1d7a28aaa50d401cbbf09c50bd476 (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.cpp | 56 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 152 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 50 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.cpp | 139 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 5 |
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; |
