TrinityCore
Loading...
Searching...
No Matches
DB2Stores.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "DB2Stores.h"
19#include "Containers.h"
20#include "DB2LoadInfo.h"
21#include "DatabaseEnv.h"
22#include "Hash.h"
23#include "ItemTemplate.h"
24#include "IteratorPair.h"
25#include "Log.h"
26#include "MapUtils.h"
27#include "Random.h"
28#include "Regex.h"
29#include "Timer.h"
30#include "Util.h"
31#include "World.h"
32#include <algorithm>
33#include <array>
34#include <bitset>
35#include <boost/filesystem/directory.hpp>
36#include <boost/filesystem/operations.hpp>
37#include <numeric>
38#include <cctype>
39#include <cmath>
40
411
417
419
420typedef std::map<uint32 /*hash*/, DB2StorageBase*> StorageMap;
421typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer;
422typedef std::unordered_map<uint32, std::vector<ArtifactPowerEntry const*>> ArtifactPowersContainer;
423typedef std::unordered_map<uint32, std::vector<uint32>> ArtifactPowerLinksContainer;
426typedef std::unordered_map<uint32 /*curveID*/, std::vector<DBCPosition2D>> CurvePointsContainer;
428typedef std::unordered_map<uint32, std::vector<uint32>> FactionTeamContainer;
429typedef std::unordered_map<uint32, HeirloomEntry const*> HeirloomItemsContainer;
430typedef std::unordered_map<uint32 /*glyphPropertiesId*/, std::vector<uint32>> GlyphBindableSpellsContainer;
431typedef std::unordered_map<uint32 /*glyphPropertiesId*/, std::vector<ChrSpecialization>> GlyphRequiredSpecsContainer;
432typedef std::unordered_map<uint32 /*itemId*/, ItemChildEquipmentEntry const*> ItemChildEquipmentContainer;
435typedef std::unordered_map<uint32, std::vector<ItemSetSpellEntry const*>> ItemSetSpellContainer;
436typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer;
438typedef std::unordered_map<uint32, DB2Manager::MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer;
439typedef std::unordered_map<uint32, DB2Manager::MountXDisplayContainer> MountDisplaysCointainer;
440typedef std::unordered_map<uint32, std::array<std::vector<NameGenEntry const*>, 2>> NameGenContainer;
441typedef std::array<std::vector<Trinity::wregex>, TOTAL_LOCALES + 1> NameValidationRegexContainer;
442typedef std::unordered_map<uint32, std::vector<uint32>> PhaseGroupContainer;
444typedef std::unordered_map<uint32, std::pair<std::vector<QuestPackageItemEntry const*>, std::vector<QuestPackageItemEntry const*>>> QuestPackageItemContainer;
447typedef std::unordered_map<uint32, std::vector<SpellPowerEntry const*>> SpellPowerContainer;
448typedef std::unordered_map<uint32, std::unordered_map<uint32, std::vector<SpellPowerEntry const*>>> SpellPowerDifficultyContainer;
451typedef std::unordered_set<uint32> ToyItemIdsContainer;
454typedef std::pair<uint32 /*tableHash*/, int32 /*recordId*/> HotfixBlobKey;
455typedef std::map<HotfixBlobKey, std::vector<uint8>> HotfixBlobMap;
456using AllowedHotfixOptionalData = std::pair<uint32 /*optional data key*/, bool(*)(std::vector<uint8> const& data) /*validator*/>;
457
458namespace
459{
460 struct ClassPowerData
461 {
462 ClassPowerData()
463 {
464 IndexByType.fill(MAX_POWERS_PER_CLASS);
465 }
466
467 ClassPowerTypes TypeByIndex;
468 std::array<uint8, MAX_POWERS> IndexByType;
469 };
470
471 struct UiMapBounds
472 {
473 // these coords are mixed when calculated and used... its a mess
474 float Bounds[4];
475 bool IsUiAssignment;
476 bool IsUiLink;
477 };
478
479 StorageMap _stores;
480 DB2Manager::HotfixContainer _hotfixData;
481 std::array<HotfixBlobMap, TOTAL_LOCALES> _hotfixBlob;
482 std::unordered_multimap<uint32 /*tableHash*/, AllowedHotfixOptionalData> _allowedHotfixOptionalData;
483 std::array<std::map<HotfixBlobKey, std::vector<DB2Manager::HotfixOptionalData>>, TOTAL_LOCALES> _hotfixOptionalData;
484
485 AreaGroupMemberContainer _areaGroupMembers;
486 ArtifactPowersContainer _artifactPowers;
487 ArtifactPowerLinksContainer _artifactPowerLinks;
488 ArtifactPowerRanksContainer _artifactPowerRanks;
489 std::unordered_map<uint32 /*itemId*/, AzeriteEmpoweredItemEntry const*> _azeriteEmpoweredItems;
490 std::unordered_map<std::pair<uint32 /*azeriteEssenceId*/, uint32 /*rank*/>, AzeriteEssencePowerEntry const*> _azeriteEssencePowersByIdAndRank;
491 std::vector<AzeriteItemMilestonePowerEntry const*> _azeriteItemMilestonePowers;
492 std::array<AzeriteItemMilestonePowerEntry const*, MAX_AZERITE_ESSENCE_SLOT> _azeriteItemMilestonePowerByEssenceSlot;
493 std::unordered_map<uint32 /*azeritePowerSetId*/, std::vector<AzeritePowerSetMemberEntry const*>> _azeritePowers;
494 std::unordered_map<std::pair<uint32 /*azeriteUnlockSetId*/, ItemContext>, std::array<uint8, MAX_AZERITE_EMPOWERED_TIER>> _azeriteTierUnlockLevels;
495 std::unordered_map<std::pair<uint32 /*broadcastTextId*/, CascLocaleBit /*cascLocaleBit*/>, int32> _broadcastTextDurations;
496 std::unordered_map<std::pair<uint8, uint8>, CharBaseInfoEntry const*> _charBaseInfoByRaceAndClass;
497 std::array<ChrClassUIDisplayEntry const*, MAX_CLASSES> _uiDisplayByClass;
498 std::array<ClassPowerData, MAX_CLASSES> _powersByClass;
499 std::unordered_map<uint32 /*chrCustomizationOptionId*/, std::vector<ChrCustomizationChoiceEntry const*>> _chrCustomizationChoicesByOption;
500 std::unordered_map<std::pair<uint8, uint8>, ChrModelEntry const*> _chrModelsByRaceAndGender;
501 std::map<std::tuple<uint8 /*race*/, uint8/*gender*/, uint8/*shapeshift*/>, ShapeshiftFormModelData> _chrCustomizationChoicesForShapeshifts;
502 std::unordered_map<std::pair<uint8 /*race*/, uint8/*gender*/>, std::vector<ChrCustomizationOptionEntry const*>> _chrCustomizationOptionsByRaceAndGender;
503 std::unordered_map<uint32 /*chrCustomizationReqId*/, std::vector<std::pair<uint32 /*chrCustomizationOptionId*/, std::vector<uint32>>>> _chrCustomizationRequiredChoices;
504 ChrSpecializationByIndexContainer _chrSpecializationsByIndex;
505 std::unordered_map<int32, ConditionalChrModelEntry const*> _conditionalChrModelsByChrModelId;
506 std::unordered_map<uint32 /*contentTuningId*/, std::vector<ConditionalContentTuningEntry const*>> _conditionalContentTuning;
507 std::unordered_set<std::pair<uint32, int32>> _contentTuningLabels;
508 std::unordered_map<uint32 /*creatureDifficultyId*/, std::vector<int32>> _creatureLabels;
509 std::unordered_multimap<uint32, CurrencyContainerEntry const*> _currencyContainers;
510 CurvePointsContainer _curvePoints;
511 EmotesTextSoundContainer _emoteTextSounds;
512 std::unordered_map<std::pair<uint32 /*level*/, int32 /*expansion*/>, ExpectedStatEntry const*> _expectedStatsByLevel;
513 std::unordered_map<uint32 /*contentTuningId*/, std::vector<ContentTuningXExpectedEntry const*>> _expectedStatModsByContentTuning;
514 FactionTeamContainer _factionTeams;
515 std::unordered_map<uint32, std::set<FriendshipRepReactionEntry const*, DB2Manager::FriendshipRepReactionEntryComparator>> _friendshipRepReactions;
516 HeirloomItemsContainer _heirlooms;
517 std::unordered_map<uint32 /*gameobjectId*/, std::vector<int32>> _gameobjectLabels;
518 GlyphBindableSpellsContainer _glyphBindableSpells;
519 GlyphRequiredSpecsContainer _glyphRequiredSpecs;
520 ItemChildEquipmentContainer _itemChildEquipment;
521 ItemClassByOldEnumContainer _itemClassByOldEnum;
522 std::unordered_set<uint32> _itemsWithCurrencyCost;
523 ItemLimitCategoryConditionContainer _itemCategoryConditions;
524 ItemSetSpellContainer _itemSetSpells;
525 ItemSpecOverridesContainer _itemSpecOverrides;
526 std::vector<JournalTierEntry const*> _journalTiersByIndex;
527 MapDifficultyContainer _mapDifficulties;
528 std::unordered_map<uint32, DB2Manager::MapDifficultyConditionsContainer> _mapDifficultyConditions;
529 std::unordered_map<uint32, MountEntry const*> _mountsBySpellId;
530 MountCapabilitiesByTypeContainer _mountCapabilitiesByType;
531 MountDisplaysCointainer _mountDisplays;
532 NameGenContainer _nameGenData;
533 NameValidationRegexContainer _nameValidators;
534 std::unordered_map<uint32, ParagonReputationEntry const*> _paragonReputations;
535 std::unordered_map<uint32 /*pathID*/, PathDb2> _paths;
536 PhaseGroupContainer _phasesByGroup;
537 PowerTypesContainer _powerTypes;
538 PvpTalentSlotUnlockEntry const* _pvpTalentSlotUnlock[MAX_PVP_TALENT_SLOTS];
539 QuestPackageItemContainer _questPackages;
540 std::unordered_map<uint32, std::vector<RewardPackXCurrencyTypeEntry const*>> _rewardPackCurrencyTypes;
541 std::unordered_map<uint32, std::vector<RewardPackXItemEntry const*>> _rewardPackItems;
542 std::unordered_map<uint32, std::vector<SkillLineEntry const*>> _skillLinesByParentSkillLine;
543 std::unordered_map<uint32, std::vector<SkillLineAbilityEntry const*>> _skillLineAbilitiesBySkillupSkill;
544 SkillRaceClassInfoContainer _skillRaceClassInfoBySkill;
545 std::unordered_map<std::pair<int32, int32>, SoulbindConduitRankEntry const*> _soulbindConduitRanks;
546 SpecializationSpellsContainer _specializationSpellsBySpec;
547 std::unordered_set<std::pair<int32, uint32>> _specsBySpecSet;
548 std::unordered_set<uint8> _spellFamilyNames;
549 SpellProcsPerMinuteModContainer _spellProcsPerMinuteMods;
550 std::unordered_map<int32, std::vector<SpellVisualMissileEntry const*>> _spellVisualMissilesBySet;
551 TalentsByPosition _talentsByPosition;
552 std::unordered_map<std::pair<uint32, uint32>, TaxiPathEntry const*> _taxiPaths;
554 std::unordered_map<int32, UiMapBounds> _uiMapBounds;
555 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByMap[MAX_UI_MAP_SYSTEM];
556 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByArea[MAX_UI_MAP_SYSTEM];
557 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByWmoDoodadPlacement[MAX_UI_MAP_SYSTEM];
558 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByWmoGroup[MAX_UI_MAP_SYSTEM];
559 std::unordered_set<int32> _uiMapPhases;
560 WMOAreaTableLookupContainer _wmoAreaTableLookup;
561 std::unordered_map<uint32, std::unordered_set<uint32>> _pvpStatIdsByMap;
562}
563
564static void LoadDB2(std::bitset<TOTAL_LOCALES>& availableDb2Locales, std::vector<std::string>& errlist, StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path,
565 LocaleConstant defaultLocale, std::size_t cppRecordSize)
566{
567 // validate structure
568 {
569 DB2LoadInfo const* loadInfo = storage->GetLoadInfo();
570 std::string clientMetaString, ourMetaString;
571 for (std::size_t i = 0; i < loadInfo->Meta->FieldCount; ++i)
572 {
573 for (std::size_t j = 0; j < loadInfo->Meta->Fields[i].ArraySize; ++j)
574 {
575 if (i >= loadInfo->Meta->FileFieldCount && int32(i) == loadInfo->Meta->ParentIndexField)
576 {
577 clientMetaString += char(FT_INT);
578 continue;
579 }
580
581 clientMetaString += char(loadInfo->Meta->Fields[i].Type);
582 }
583 }
584
585 for (std::size_t i = loadInfo->Meta->HasIndexFieldInData() ? 0 : 1; i < loadInfo->FieldCount; ++i)
586 ourMetaString += char(loadInfo->Fields[i].Type);
587
588 ASSERT(clientMetaString == ourMetaString,
589 "%s C++ structure fields %s do not match generated types from the client %s",
590 storage->GetFileName().c_str(), ourMetaString.c_str(), clientMetaString.c_str());
591
592 // compatibility format and C++ structure sizes
593 ASSERT(loadInfo->Meta->GetRecordSize() == cppRecordSize,
594 "Size of '%s' set by format string (%u) not equal size of C++ structure (" SZFMTD ").",
595 storage->GetFileName().c_str(), loadInfo->Meta->GetRecordSize(), cppRecordSize);
596 }
597
598 try
599 {
600 storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale);
601 }
602 catch (std::system_error const& e)
603 {
604 if (e.code() == std::errc::no_such_file_or_directory)
605 {
606 errlist.push_back(Trinity::StringFormat("File {}{}/{} does not exist", db2Path, localeNames[defaultLocale], storage->GetFileName()));
607 }
608 else
609 throw;
610 }
611 catch (std::exception const& e)
612 {
613 errlist.emplace_back(e.what());
614 return;
615 }
616
617 // load additional data and enUS strings from db
618 storage->LoadFromDB();
619
620 for (LocaleConstant i = LOCALE_enUS; i < TOTAL_LOCALES; i = LocaleConstant(i + 1))
621 {
622 if (defaultLocale == i || !availableDb2Locales[i])
623 continue;
624
625 try
626 {
627 storage->LoadStringsFrom((db2Path + localeNames[i] + '/'), i);
628 }
629 catch (std::system_error const& e)
630 {
631 if (e.code() != std::errc::no_such_file_or_directory)
632 throw;
633
634 // locale db2 files are optional, do not error if nothing is found
635 }
636 catch (std::exception const& e)
637 {
638 errlist.emplace_back(e.what());
639 }
640 }
641
642 for (LocaleConstant i = LOCALE_koKR; i < TOTAL_LOCALES; i = LocaleConstant(i + 1))
643 if (availableDb2Locales[i])
644 storage->LoadStringsFromDB(i);
645
646 stores[storage->GetTableHash()] = storage;
647}
648
650{
651 static DB2Manager instance;
652 return instance;
653}
654
655uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaultLocale)
656{
657 uint32 oldMSTime = getMSTime();
658
659 std::string db2Path = dataPath + "dbc/";
660
661 std::vector<std::string> loadErrors;
662 std::bitset<TOTAL_LOCALES> availableDb2Locales = [&]()
663 {
664 std::bitset<TOTAL_LOCALES> foundLocales;
665 boost::filesystem::directory_iterator db2PathItr(db2Path), end;
666 while (db2PathItr != end)
667 {
668 LocaleConstant locale = GetLocaleByName(db2PathItr->path().filename().string());
669 if (IsValidLocale(locale) && (sWorld->getBoolConfig(CONFIG_LOAD_LOCALES) || locale == defaultLocale))
670 foundLocales[locale] = true;
671
672 ++db2PathItr;
673 }
674 return foundLocales;
675 }();
676
677 if (!availableDb2Locales[defaultLocale])
678 return 0;
679
680 auto LOAD_DB2 = [&]<typename T>(DB2Storage<T>& store)
681 {
682 LoadDB2(availableDb2Locales, loadErrors, _stores, &store, db2Path, defaultLocale, sizeof(T));
683 };
684
685 LOAD_DB2(sAchievementStore);
687 LOAD_DB2(sAdventureJournalStore);
688 LOAD_DB2(sAdventureMapPOIStore);
689 LOAD_DB2(sAnimationDataStore);
690 LOAD_DB2(sAnimKitStore);
691 LOAD_DB2(sAreaGroupMemberStore);
692 LOAD_DB2(sAreaTableStore);
693 LOAD_DB2(sAreaTriggerStore);
695 LOAD_DB2(sArmorLocationStore);
696 LOAD_DB2(sArtifactStore);
697 LOAD_DB2(sArtifactAppearanceStore);
699 LOAD_DB2(sArtifactCategoryStore);
700 LOAD_DB2(sArtifactPowerStore);
701 LOAD_DB2(sArtifactPowerLinkStore);
703 LOAD_DB2(sArtifactPowerRankStore);
704 LOAD_DB2(sArtifactTierStore);
705 LOAD_DB2(sArtifactUnlockStore);
706 LOAD_DB2(sAuctionHouseStore);
708 LOAD_DB2(sAzeriteEssenceStore);
710 LOAD_DB2(sAzeriteItemStore);
713 LOAD_DB2(sAzeriteLevelInfoStore);
714 LOAD_DB2(sAzeritePowerStore);
716 LOAD_DB2(sAzeriteTierUnlockStore);
719 LOAD_DB2(sBankTabStore);
720 LOAD_DB2(sBannedAddonsStore);
721 LOAD_DB2(sBarberShopStyleStore);
722 LOAD_DB2(sBattlePetAbilityStore);
725 LOAD_DB2(sBattlePetSpeciesStore);
727 LOAD_DB2(sBattlemasterListStore);
729 LOAD_DB2(sBroadcastTextStore);
731 LOAD_DB2(sCampaignStore);
732 LOAD_DB2(sCampaignXQuestLineStore);
733 LOAD_DB2(sCfgCategoriesStore);
734 LOAD_DB2(sCfgRegionsStore);
736 LOAD_DB2(sCharBaseInfoStore);
737 LOAD_DB2(sCharTitlesStore);
738 LOAD_DB2(sCharacterLoadoutStore);
740 LOAD_DB2(sChatChannelsStore);
741 LOAD_DB2(sChrClassUIDisplayStore);
742 LOAD_DB2(sChrClassesStore);
750 LOAD_DB2(sChrModelStore);
751 LOAD_DB2(sChrRaceXChrModelStore);
752 LOAD_DB2(sChrRacesStore);
753 LOAD_DB2(sChrSpecializationStore);
754 LOAD_DB2(sCinematicCameraStore);
755 LOAD_DB2(sCinematicSequencesStore);
758 LOAD_DB2(sContentTuningStore);
761 LOAD_DB2(sConversationLineStore);
762 LOAD_DB2(sCorruptionEffectsStore);
763 LOAD_DB2(sCraftingQualityStore);
766 LOAD_DB2(sCreatureFamilyStore);
767 LOAD_DB2(sCreatureLabelStore);
768 LOAD_DB2(sCreatureModelDataStore);
769 LOAD_DB2(sCreatureTypeStore);
770 LOAD_DB2(sCriteriaStore);
771 LOAD_DB2(sCriteriaTreeStore);
772 LOAD_DB2(sCurrencyContainerStore);
773 LOAD_DB2(sCurrencyTypesStore);
774 LOAD_DB2(sCurveStore);
775 LOAD_DB2(sCurvePointStore);
777 LOAD_DB2(sDifficultyStore);
778 LOAD_DB2(sDungeonEncounterStore);
779 LOAD_DB2(sDurabilityCostsStore);
780 LOAD_DB2(sDurabilityQualityStore);
781 LOAD_DB2(sEmotesStore);
782 LOAD_DB2(sEmotesTextStore);
783 LOAD_DB2(sEmotesTextSoundStore);
784 LOAD_DB2(sExpectedStatStore);
785 LOAD_DB2(sExpectedStatModStore);
786 LOAD_DB2(sFactionStore);
787 LOAD_DB2(sFactionTemplateStore);
788 LOAD_DB2(sFlightCapabilityStore);
791 LOAD_DB2(sGameObjectsStore);
792 LOAD_DB2(sGameObjectArtKitStore);
794 LOAD_DB2(sGameObjectLabelStore);
795 LOAD_DB2(sGarrAbilityStore);
796 LOAD_DB2(sGarrBuildingStore);
798 LOAD_DB2(sGarrClassSpecStore);
799 LOAD_DB2(sGarrFollowerStore);
801 LOAD_DB2(sGarrMissionStore);
802 LOAD_DB2(sGarrPlotStore);
803 LOAD_DB2(sGarrPlotBuildingStore);
804 LOAD_DB2(sGarrPlotInstanceStore);
805 LOAD_DB2(sGarrSiteLevelStore);
807 LOAD_DB2(sGarrTalentTreeStore);
808 LOAD_DB2(sGemPropertiesStore);
809 LOAD_DB2(sGlobalCurveStore);
810 LOAD_DB2(sGlyphBindableSpellStore);
811 LOAD_DB2(sGlyphPropertiesStore);
812 LOAD_DB2(sGlyphRequiredSpecStore);
813 LOAD_DB2(sGossipNPCOptionStore);
815 LOAD_DB2(sGuildColorBorderStore);
816 LOAD_DB2(sGuildColorEmblemStore);
817 LOAD_DB2(sGuildPerkSpellsStore);
818 LOAD_DB2(sHeirloomStore);
819 LOAD_DB2(sHolidaysStore);
820 LOAD_DB2(sImportPriceArmorStore);
821 LOAD_DB2(sImportPriceQualityStore);
822 LOAD_DB2(sImportPriceShieldStore);
823 LOAD_DB2(sImportPriceWeaponStore);
824 LOAD_DB2(sItemAppearanceStore);
825 LOAD_DB2(sItemArmorQualityStore);
826 LOAD_DB2(sItemArmorShieldStore);
827 LOAD_DB2(sItemArmorTotalStore);
828 LOAD_DB2(sItemBagFamilyStore);
829 LOAD_DB2(sItemBonusStore);
832 LOAD_DB2(sItemBonusTreeStore);
833 LOAD_DB2(sItemBonusTreeNodeStore);
834 LOAD_DB2(sItemChildEquipmentStore);
835 LOAD_DB2(sItemClassStore);
838 LOAD_DB2(sItemCurrencyCostStore);
839 LOAD_DB2(sItemDamageAmmoStore);
840 LOAD_DB2(sItemDamageOneHandStore);
842 LOAD_DB2(sItemDamageTwoHandStore);
844 LOAD_DB2(sItemDisenchantLootStore);
845 LOAD_DB2(sItemEffectStore);
846 LOAD_DB2(sItemStore);
847 LOAD_DB2(sItemExtendedCostStore);
848 LOAD_DB2(sItemLevelSelectorStore);
851 LOAD_DB2(sItemLimitCategoryStore);
856 LOAD_DB2(sItemOffsetCurveStore);
857 LOAD_DB2(sItemPriceBaseStore);
858 LOAD_DB2(sItemScalingConfigStore);
859 LOAD_DB2(sItemSearchNameStore);
860 LOAD_DB2(sItemSetStore);
861 LOAD_DB2(sItemSetSpellStore);
862 LOAD_DB2(sItemSparseStore);
863 LOAD_DB2(sItemSpecStore);
864 LOAD_DB2(sItemSpecOverrideStore);
865 LOAD_DB2(sItemSquishEraStore);
866 LOAD_DB2(sItemXBonusTreeStore);
867 LOAD_DB2(sItemXItemEffectStore);
868 LOAD_DB2(sJournalEncounterStore);
870 LOAD_DB2(sJournalInstanceStore);
871 LOAD_DB2(sJournalTierStore);
872 LOAD_DB2(sKeychainStore);
873 LOAD_DB2(sKeystoneAffixStore);
874 LOAD_DB2(sLanguageWordsStore);
875 LOAD_DB2(sLanguagesStore);
876 LOAD_DB2(sLFGDungeonsStore);
877 LOAD_DB2(sLightStore);
878 LOAD_DB2(sLiquidTypeStore);
879 LOAD_DB2(sLocationStore);
880 LOAD_DB2(sLockStore);
881 LOAD_DB2(sMailTemplateStore);
882 LOAD_DB2(sMapStore);
883 LOAD_DB2(sMapChallengeModeStore);
884 LOAD_DB2(sMapDifficultyStore);
886 LOAD_DB2(sMawPowerStore);
888 LOAD_DB2(sModifierTreeStore);
889 LOAD_DB2(sMountCapabilityStore);
890 LOAD_DB2(sMountStore);
891 LOAD_DB2(sMountEquipmentStore);
893 LOAD_DB2(sMountXDisplayStore);
894 LOAD_DB2(sMovieStore);
895 LOAD_DB2(sMythicPlusSeasonStore);
896 LOAD_DB2(sNameGenStore);
897 LOAD_DB2(sNamesProfanityStore);
898 LOAD_DB2(sNamesReservedStore);
900 LOAD_DB2(sNumTalentsAtLevelStore);
901 LOAD_DB2(sOverrideSpellDataStore);
902 LOAD_DB2(sParagonReputationStore);
903 LOAD_DB2(sPathStore);
904 LOAD_DB2(sPathNodeStore);
905 LOAD_DB2(sPathPropertyStore);
906 LOAD_DB2(sPerksActivityStore);
907 LOAD_DB2(sPhaseStore);
908 LOAD_DB2(sPhaseXPhaseGroupStore);
909 LOAD_DB2(sPlayerConditionStore);
914 LOAD_DB2(sPowerDisplayStore);
915 LOAD_DB2(sPowerTypeStore);
916 LOAD_DB2(sPrestigeLevelInfoStore);
917 LOAD_DB2(sPVPDifficultyStore);
918 LOAD_DB2(sPVPStatStore);
919 LOAD_DB2(sPvpSeasonStore);
920 LOAD_DB2(sPvpTalentStore);
921 LOAD_DB2(sPvpTalentCategoryStore);
923 LOAD_DB2(sPvpTierStore);
924 LOAD_DB2(sQuestFactionRewardStore);
925 LOAD_DB2(sQuestInfoStore);
926 LOAD_DB2(sQuestLineXQuestStore);
927 LOAD_DB2(sQuestMoneyRewardStore);
928 LOAD_DB2(sQuestPackageItemStore);
929 LOAD_DB2(sQuestSortStore);
930 LOAD_DB2(sQuestV2Store);
931 LOAD_DB2(sQuestXPStore);
932 LOAD_DB2(sRandPropPointsStore);
933 LOAD_DB2(sRewardPackStore);
935 LOAD_DB2(sRewardPackXItemStore);
936 LOAD_DB2(sScenarioStore);
937 LOAD_DB2(sScenarioStepStore);
938 LOAD_DB2(sSceneScriptStore);
940 LOAD_DB2(sSceneScriptPackageStore);
941 LOAD_DB2(sSceneScriptTextStore);
942 LOAD_DB2(sServerMessagesStore);
943 LOAD_DB2(sSkillLineStore);
944 LOAD_DB2(sSkillLineAbilityStore);
946 LOAD_DB2(sSkillRaceClassInfoStore);
948 LOAD_DB2(sSoundKitStore);
950 LOAD_DB2(sSpecSetMemberStore);
951 LOAD_DB2(sSpellAuraOptionsStore);
953 LOAD_DB2(sSpellCastTimesStore);
955 LOAD_DB2(sSpellCategoriesStore);
956 LOAD_DB2(sSpellCategoryStore);
957 LOAD_DB2(sSpellClassOptionsStore);
958 LOAD_DB2(sSpellCooldownsStore);
959 LOAD_DB2(sSpellDurationStore);
960 LOAD_DB2(sSpellEffectStore);
961 LOAD_DB2(sSpellEquippedItemsStore);
962 LOAD_DB2(sSpellEmpowerStore);
963 LOAD_DB2(sSpellEmpowerStageStore);
964 LOAD_DB2(sSpellFocusObjectStore);
965 LOAD_DB2(sSpellInterruptsStore);
969 LOAD_DB2(sSpellLabelStore);
970 LOAD_DB2(sSpellLearnSpellStore);
971 LOAD_DB2(sSpellLevelsStore);
972 LOAD_DB2(sSpellMiscStore);
973 LOAD_DB2(sSpellNameStore);
974 LOAD_DB2(sSpellPowerStore);
978 LOAD_DB2(sSpellRadiusStore);
979 LOAD_DB2(sSpellRangeStore);
980 LOAD_DB2(sSpellReagentsStore);
982 LOAD_DB2(sSpellScalingStore);
983 LOAD_DB2(sSpellShapeshiftStore);
986 LOAD_DB2(sSpellTotemsStore);
987 LOAD_DB2(sSpellVisualStore);
989 LOAD_DB2(sSpellVisualMissileStore);
990 LOAD_DB2(sSpellVisualKitStore);
991 LOAD_DB2(sSpellXSpellVisualStore);
992 LOAD_DB2(sSummonPropertiesStore);
993 LOAD_DB2(sTactKeyStore);
994 LOAD_DB2(sTalentStore);
995 LOAD_DB2(sTaxiNodesStore);
996 LOAD_DB2(sTaxiPathStore);
997 LOAD_DB2(sTaxiPathNodeStore);
998 LOAD_DB2(sTotemCategoryStore);
999 LOAD_DB2(sToyStore);
1000 LOAD_DB2(sTraitCondStore);
1002 LOAD_DB2(sTraitCostStore);
1003 LOAD_DB2(sTraitCurrencyStore);
1004 LOAD_DB2(sTraitCurrencySourceStore);
1005 LOAD_DB2(sTraitDefinitionStore);
1007 LOAD_DB2(sTraitEdgeStore);
1008 LOAD_DB2(sTraitNodeStore);
1009 LOAD_DB2(sTraitNodeEntryStore);
1012 LOAD_DB2(sTraitNodeGroupStore);
1016 LOAD_DB2(sTraitNodeXTraitCondStore);
1017 LOAD_DB2(sTraitNodeXTraitCostStore);
1019 LOAD_DB2(sTraitSubTreeStore);
1020 LOAD_DB2(sTraitSystemStore);
1021 LOAD_DB2(sTraitTreeStore);
1022 LOAD_DB2(sTraitTreeLoadoutStore);
1024 LOAD_DB2(sTraitTreeXTraitCostStore);
1026 LOAD_DB2(sTransmogHolidayStore);
1027 LOAD_DB2(sTransmogIllusionStore);
1028 LOAD_DB2(sTransmogOutfitEntryStore);
1031 LOAD_DB2(sTransmogSituationStore);
1034 LOAD_DB2(sTransmogSetStore);
1035 LOAD_DB2(sTransmogSetGroupStore);
1036 LOAD_DB2(sTransmogSetItemStore);
1037 LOAD_DB2(sTransportAnimationStore);
1038 LOAD_DB2(sTransportRotationStore);
1039 LOAD_DB2(sUiMapStore);
1040 LOAD_DB2(sUiMapAssignmentStore);
1041 LOAD_DB2(sUiMapLinkStore);
1042 LOAD_DB2(sUiMapXMapArtStore);
1043 LOAD_DB2(sUISplashScreenStore);
1044 LOAD_DB2(sUnitConditionStore);
1045 LOAD_DB2(sUnitPowerBarStore);
1046 LOAD_DB2(sVehicleStore);
1047 LOAD_DB2(sVehicleSeatStore);
1048 LOAD_DB2(sVignetteStore);
1049 LOAD_DB2(sWarbandSceneStore);
1050 LOAD_DB2(sWMOAreaTableStore);
1051 LOAD_DB2(sWorldEffectStore);
1052 LOAD_DB2(sWorldMapOverlayStore);
1054
1055 // error checks
1056
1057 // Check loaded DB2 files proper version
1059 if (!sItemSparseStore.LookupEntry(criticalItemId))
1060 loadErrors.emplace_back(Trinity::StringFormat("Missing required item {} from ItemSparse.db2 (or its hotfix table)", criticalItemId));
1061
1062 if (!loadErrors.empty())
1063 {
1064 sLog->SetSynchronous(); // server will shut down after this, so set sync logging to prevent messages from getting lost
1065
1066 for (std::string const& error : loadErrors)
1067 TC_LOG_FATAL("misc", "{}", error);
1068
1069 return 0;
1070 }
1071
1072 TC_LOG_INFO("server.loading", ">> Initialized {} DB2 data stores in {} ms", _stores.size(), GetMSTimeDiffToNow(oldMSTime));
1073
1074 return availableDb2Locales.to_ulong();
1075}
1076
1078{
1079 uint32 oldMSTime = getMSTime();
1080
1081 for (AreaGroupMemberEntry const* areaGroupMember : sAreaGroupMemberStore)
1082 _areaGroupMembers[areaGroupMember->AreaGroupID].push_back(areaGroupMember->AreaID);
1083
1084 for (AreaTableEntry const* areaTable : sAreaTableStore)
1085 {
1086 ASSERT(areaTable->AreaBit <= 0 || (size_t(areaTable->AreaBit / 64) < PLAYER_EXPLORED_ZONES_SIZE),
1087 "PLAYER_EXPLORED_ZONES_SIZE must be at least %d", (areaTable->AreaBit + 63) / 64);
1088 }
1089
1090 for (ArtifactPowerEntry const* artifactPower : sArtifactPowerStore)
1091 _artifactPowers[artifactPower->ArtifactID].push_back(artifactPower);
1092
1093 for (ArtifactPowerLinkEntry const* artifactPowerLink : sArtifactPowerLinkStore)
1094 {
1095 _artifactPowerLinks[artifactPowerLink->PowerA].push_back(artifactPowerLink->PowerB);
1096 _artifactPowerLinks[artifactPowerLink->PowerB].push_back(artifactPowerLink->PowerA);
1097 }
1098
1099 for (ArtifactPowerRankEntry const* artifactPowerRank : sArtifactPowerRankStore)
1100 _artifactPowerRanks[std::pair<uint32, uint8>{ artifactPowerRank->ArtifactPowerID, artifactPowerRank->RankIndex }] = artifactPowerRank;
1101
1102 for (AzeriteEmpoweredItemEntry const* azeriteEmpoweredItem : sAzeriteEmpoweredItemStore)
1103 _azeriteEmpoweredItems[azeriteEmpoweredItem->ItemID] = azeriteEmpoweredItem;
1104
1105 for (AzeriteEssencePowerEntry const* azeriteEssencePower : sAzeriteEssencePowerStore)
1106 _azeriteEssencePowersByIdAndRank[std::pair<uint32, uint32>{ azeriteEssencePower->AzeriteEssenceID, azeriteEssencePower->Tier }] = azeriteEssencePower;
1107
1108 for (AzeriteItemMilestonePowerEntry const* azeriteItemMilestonePower : sAzeriteItemMilestonePowerStore)
1109 _azeriteItemMilestonePowers.push_back(azeriteItemMilestonePower);
1110
1111 std::ranges::sort(_azeriteItemMilestonePowers, {}, &AzeriteItemMilestonePowerEntry::RequiredLevel);
1112
1113 {
1114 uint32 azeriteEssenceSlot = 0;
1115 for (AzeriteItemMilestonePowerEntry const* azeriteItemMilestonePower : _azeriteItemMilestonePowers)
1116 {
1117 AzeriteItemMilestoneType type = AzeriteItemMilestoneType(azeriteItemMilestonePower->Type);
1119 {
1120 ASSERT(azeriteEssenceSlot < MAX_AZERITE_ESSENCE_SLOT);
1121 _azeriteItemMilestonePowerByEssenceSlot[azeriteEssenceSlot] = azeriteItemMilestonePower;
1122 ++azeriteEssenceSlot;
1123 }
1124 }
1125 }
1126
1127 for (AzeritePowerSetMemberEntry const* azeritePowerSetMember : sAzeritePowerSetMemberStore)
1128 if (sAzeritePowerStore.LookupEntry(azeritePowerSetMember->AzeritePowerID))
1129 _azeritePowers[azeritePowerSetMember->AzeritePowerSetID].push_back(azeritePowerSetMember);
1130
1131 for (AzeriteTierUnlockEntry const* azeriteTierUnlock : sAzeriteTierUnlockStore)
1132 _azeriteTierUnlockLevels[std::pair<uint32, ItemContext>{ azeriteTierUnlock->AzeriteTierUnlockSetID, ItemContext(azeriteTierUnlock->ItemCreationContext) }][azeriteTierUnlock->Tier] = azeriteTierUnlock->AzeriteLevel;
1133
1134 for (BattlemasterListEntry const* battlemaster : sBattlemasterListStore)
1135 {
1136 if (battlemaster->MaxLevel < battlemaster->MinLevel)
1137 {
1138 TC_LOG_ERROR("db2.hotfix.battlemaster_list", "Battlemaster ({}) contains bad values for MinLevel ({}) and MaxLevel ({}). Swapping values.", battlemaster->ID, battlemaster->MinLevel, battlemaster->MaxLevel);
1139 std::swap(const_cast<BattlemasterListEntry*>(battlemaster)->MaxLevel, const_cast<BattlemasterListEntry*>(battlemaster)->MinLevel);
1140 }
1141 if (battlemaster->MaxPlayers < battlemaster->MinPlayers)
1142 {
1143 TC_LOG_ERROR("db2.hotfix.battlemaster_list", "Battlemaster ({}) contains bad values for MinPlayers ({}) and MaxPlayers ({}). Swapping values.", battlemaster->ID, battlemaster->MinPlayers, battlemaster->MaxPlayers);
1144 int8 minPlayers = battlemaster->MinPlayers;
1145 const_cast<BattlemasterListEntry*>(battlemaster)->MinPlayers = battlemaster->MaxPlayers;
1146 const_cast<BattlemasterListEntry*>(battlemaster)->MaxPlayers = minPlayers;
1147 }
1148 }
1149
1150 _broadcastTextDurations.reserve(sBroadcastTextDurationStore.GetNumRows());
1151 for (BroadcastTextDurationEntry const* broadcastTextDuration : sBroadcastTextDurationStore)
1152 _broadcastTextDurations[{ broadcastTextDuration->BroadcastTextID, CascLocaleBit(broadcastTextDuration->Locale) }] = broadcastTextDuration->Duration;
1153
1154 for (CharBaseInfoEntry const* charBaseInfo : sCharBaseInfoStore)
1155 _charBaseInfoByRaceAndClass[{ charBaseInfo->RaceID, charBaseInfo->ClassID }] = charBaseInfo;
1156
1157 for (ChrClassUIDisplayEntry const* uiDisplay : sChrClassUIDisplayStore)
1158 {
1159 ASSERT(uiDisplay->ChrClassesID < MAX_CLASSES);
1160 _uiDisplayByClass[uiDisplay->ChrClassesID] = uiDisplay;
1161 }
1162
1163 {
1164 std::set<ChrClassesXPowerTypesEntry const*, ChrClassesXPowerTypesEntryComparator> powers;
1166 powers.insert(power);
1167
1168 for (ChrClassesXPowerTypesEntry const* power : powers)
1169 {
1170 ASSERT(power->ClassID < MAX_CLASSES);
1171 ASSERT(power->PowerType < MAX_POWERS);
1172
1173 uint8 index = _powersByClass[power->ClassID].TypeByIndex.PowerTypeCount++;
1174 _powersByClass[power->ClassID].TypeByIndex.PowerType[index] = Powers(power->PowerType);
1175 _powersByClass[power->ClassID].IndexByType[power->PowerType] = index;
1176 }
1177 }
1178
1179 for (ChrCustomizationChoiceEntry const* customizationChoice : sChrCustomizationChoiceStore)
1180 _chrCustomizationChoicesByOption[customizationChoice->ChrCustomizationOptionID].push_back(customizationChoice);
1181
1182 std::unordered_multimap<uint32, std::pair<uint32, uint8>> shapeshiftFormByModel;
1183 std::unordered_map<uint32, ChrCustomizationDisplayInfoEntry const*> displayInfoByCustomizationChoice;
1184
1185 // build shapeshift form model lookup
1186 for (ChrCustomizationElementEntry const* customizationElement : sChrCustomizationElementStore)
1187 {
1188 if (ChrCustomizationDisplayInfoEntry const* customizationDisplayInfo = sChrCustomizationDisplayInfoStore.LookupEntry(customizationElement->ChrCustomizationDisplayInfoID))
1189 {
1190 if (ChrCustomizationChoiceEntry const* customizationChoice = sChrCustomizationChoiceStore.LookupEntry(customizationElement->ChrCustomizationChoiceID))
1191 {
1192 displayInfoByCustomizationChoice[customizationElement->ChrCustomizationChoiceID] = customizationDisplayInfo;
1193 if (ChrCustomizationOptionEntry const* customizationOption = sChrCustomizationOptionStore.LookupEntry(customizationChoice->ChrCustomizationOptionID))
1194 shapeshiftFormByModel.emplace(customizationOption->ChrModelID, std::make_pair(customizationOption->ID, uint8(customizationDisplayInfo->ShapeshiftFormID)));
1195 }
1196 }
1197 }
1198
1199 std::unordered_map<uint32, std::vector<ChrCustomizationOptionEntry const*>> customizationOptionsByModel;
1200 for (ChrCustomizationOptionEntry const* customizationOption : sChrCustomizationOptionStore)
1201 customizationOptionsByModel[customizationOption->ChrModelID].push_back(customizationOption);
1202
1204 {
1205 if (ChrCustomizationChoiceEntry const* customizationChoice = sChrCustomizationChoiceStore.LookupEntry(reqChoice->ChrCustomizationChoiceID))
1206 {
1207 std::vector<std::pair<uint32, std::vector<uint32>>>& requiredChoicesForReq = _chrCustomizationRequiredChoices[reqChoice->ChrCustomizationReqID];
1208 std::vector<uint32>* choices = nullptr;
1209 for (std::pair<uint32, std::vector<uint32>>& choicesForOption : requiredChoicesForReq)
1210 {
1211 if (choicesForOption.first == customizationChoice->ChrCustomizationOptionID)
1212 {
1213 choices = &choicesForOption.second;
1214 break;
1215 }
1216 }
1217 if (!choices)
1218 {
1219 std::pair<uint32, std::vector<uint32>>& choicesForReq = requiredChoicesForReq.emplace_back();
1220 choicesForReq.first = customizationChoice->ChrCustomizationOptionID;
1221 choices = &choicesForReq.second;
1222 }
1223 choices->push_back(reqChoice->ChrCustomizationChoiceID);
1224 }
1225 }
1226
1227 std::unordered_map<uint32, uint32> parentRaces;
1228 for (ChrRacesEntry const* chrRace : sChrRacesStore)
1229 if (chrRace->UnalteredVisualRaceID)
1230 parentRaces[chrRace->UnalteredVisualRaceID] = chrRace->ID;
1231
1232 for (ChrRaceXChrModelEntry const* raceModel : sChrRaceXChrModelStore)
1233 {
1234 if (ChrModelEntry const* model = sChrModelStore.LookupEntry(raceModel->ChrModelID))
1235 {
1236 _chrModelsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex) }] = model;
1237
1238 if (std::vector<ChrCustomizationOptionEntry const*> const* customizationOptionsForModel = Trinity::Containers::MapGetValuePtr(customizationOptionsByModel, model->ID))
1239 {
1240 std::vector<ChrCustomizationOptionEntry const*>& raceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex) }];
1241 raceOptions.insert(raceOptions.end(), customizationOptionsForModel->begin(), customizationOptionsForModel->end());
1242
1243 if (uint32 const* parentRace = Trinity::Containers::MapGetValuePtr(parentRaces, raceModel->ChrRacesID))
1244 {
1245 std::vector<ChrCustomizationOptionEntry const*>& parentRaceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(*parentRace), uint8(raceModel->Sex) }];
1246 parentRaceOptions.insert(parentRaceOptions.end(), customizationOptionsForModel->begin(), customizationOptionsForModel->end());
1247 }
1248 }
1249
1250 // link shapeshift displays to race/gender/form
1251 for (std::pair<uint32 const, std::pair<uint32, uint8>> const& shapeshiftOptionsForModel : Trinity::Containers::MapEqualRange(shapeshiftFormByModel, model->ID))
1252 {
1253 ShapeshiftFormModelData& data = _chrCustomizationChoicesForShapeshifts[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex), shapeshiftOptionsForModel.second.second }];
1254 data.OptionID = shapeshiftOptionsForModel.second.first;
1255 data.Choices = Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesByOption, shapeshiftOptionsForModel.second.first);
1256 if (data.Choices)
1257 {
1258 data.Displays.resize(data.Choices->size());
1259 for (std::size_t i = 0; i < data.Choices->size(); ++i)
1260 data.Displays[i] = Trinity::Containers::MapGetValuePtr(displayInfoByCustomizationChoice, (*data.Choices)[i]->ID);
1261 }
1262 }
1263 }
1264 }
1265
1266 memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex));
1267 for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore)
1268 {
1269 ASSERT(chrSpec->ClassID < MAX_CLASSES);
1270 ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS);
1271
1272 uint32 storageIndex = chrSpec->ClassID;
1273 if (chrSpec->GetFlags().HasFlag(ChrSpecializationFlag::PetOverrideSpec))
1274 {
1275 ASSERT(!chrSpec->ClassID);
1276 storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX;
1277 }
1278
1279 _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec;
1280 }
1281
1282 for (ConditionalChrModelEntry const* conditionalChrModel : sConditionalChrModelStore)
1283 _conditionalChrModelsByChrModelId[conditionalChrModel->ChrModelID] = conditionalChrModel;
1284
1285 {
1286 for (ConditionalContentTuningEntry const* conditionalContentTuning : sConditionalContentTuningStore)
1287 _conditionalContentTuning[conditionalContentTuning->ParentContentTuningID].push_back(conditionalContentTuning);
1288
1289 for (auto& [parentContentTuningId, conditionalContentTunings] : _conditionalContentTuning)
1290 std::ranges::sort(conditionalContentTunings, std::greater(), &ConditionalContentTuningEntry::OrderIndex);
1291 }
1292
1293 for (ContentTuningXExpectedEntry const* contentTuningXExpectedStat : sContentTuningXExpectedStore)
1294 if (sExpectedStatModStore.LookupEntry(contentTuningXExpectedStat->ExpectedStatModID))
1295 _expectedStatModsByContentTuning[contentTuningXExpectedStat->ContentTuningID].push_back(contentTuningXExpectedStat);
1296
1297 for (ContentTuningXLabelEntry const* contentTuningXLabel : sContentTuningXLabelStore)
1298 _contentTuningLabels.emplace(contentTuningXLabel->ContentTuningID, contentTuningXLabel->LabelID);
1299
1300 for (CreatureLabelEntry const* creatureLabel : sCreatureLabelStore)
1301 _creatureLabels[creatureLabel->CreatureDifficultyID].push_back(creatureLabel->LabelID);
1302
1303 for (CurrencyContainerEntry const* currencyContainer : sCurrencyContainerStore)
1304 _currencyContainers.emplace(currencyContainer->CurrencyTypesID, currencyContainer);
1305
1306 {
1307 std::unordered_map<uint32 /*curveID*/, std::vector<CurvePointEntry const*>> unsortedPoints;
1308 for (CurvePointEntry const* curvePoint : sCurvePointStore)
1309 if (sCurveStore.LookupEntry(curvePoint->CurveID))
1310 unsortedPoints[curvePoint->CurveID].push_back(curvePoint);
1311
1312 for (auto& [curveId, curvePoints] : unsortedPoints)
1313 {
1314 std::ranges::sort(curvePoints, {}, &CurvePointEntry::OrderIndex);
1315 std::vector<DBCPosition2D>& points = _curvePoints[curveId];
1316 points.resize(curvePoints.size());
1317 std::ranges::transform(curvePoints, points.begin(), &CurvePointEntry::Pos);
1318 }
1319 }
1320
1321 for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore)
1322 _emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextID, emoteTextSound->RaceID, emoteTextSound->SexID, emoteTextSound->ClassID)] = emoteTextSound;
1323
1324 for (ExpectedStatEntry const* expectedStat : sExpectedStatStore)
1325 _expectedStatsByLevel[std::make_pair(expectedStat->Lvl, expectedStat->ExpansionID)] = expectedStat;
1326
1327 for (FactionEntry const* faction : sFactionStore)
1328 if (faction->ParentFactionID)
1329 _factionTeams[faction->ParentFactionID].push_back(faction->ID);
1330
1331 for (FriendshipRepReactionEntry const* friendshipRepReaction : sFriendshipRepReactionStore)
1332 _friendshipRepReactions[friendshipRepReaction->FriendshipRepID].insert(friendshipRepReaction);
1333
1334 for (GameObjectDisplayInfoEntry const* gameObjectDisplayInfo : sGameObjectDisplayInfoStore)
1335 {
1336 if (gameObjectDisplayInfo->GeoBoxMax.X < gameObjectDisplayInfo->GeoBoxMin.X)
1337 std::swap(const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMax.X, const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMin.X);
1338 if (gameObjectDisplayInfo->GeoBoxMax.Y < gameObjectDisplayInfo->GeoBoxMin.Y)
1339 std::swap(const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMax.Y, const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMin.Y);
1340 if (gameObjectDisplayInfo->GeoBoxMax.Z < gameObjectDisplayInfo->GeoBoxMin.Z)
1341 std::swap(const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMax.Z, const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMin.Z);
1342 }
1343
1344 for (GameObjectLabelEntry const* gameobjectLabel : sGameObjectLabelStore)
1345 _gameobjectLabels[gameobjectLabel->GameObjectID].push_back(gameobjectLabel->LabelID);
1346
1347 for (HeirloomEntry const* heirloom : sHeirloomStore)
1348 _heirlooms[heirloom->ItemID] = heirloom;
1349
1350 for (GlyphBindableSpellEntry const* glyphBindableSpell : sGlyphBindableSpellStore)
1351 _glyphBindableSpells[glyphBindableSpell->GlyphPropertiesID].push_back(glyphBindableSpell->SpellID);
1352
1353 for (GlyphRequiredSpecEntry const* glyphRequiredSpec : sGlyphRequiredSpecStore)
1354 _glyphRequiredSpecs[glyphRequiredSpec->GlyphPropertiesID].push_back(ChrSpecialization(glyphRequiredSpec->ChrSpecializationID));
1355
1356 for (ItemChildEquipmentEntry const* itemChildEquipment : sItemChildEquipmentStore)
1357 {
1358 ASSERT(_itemChildEquipment.find(itemChildEquipment->ParentItemID) == _itemChildEquipment.end(), "Item must have max 1 child item.");
1359 _itemChildEquipment[itemChildEquipment->ParentItemID] = itemChildEquipment;
1360 }
1361
1362 for (ItemClassEntry const* itemClass : sItemClassStore)
1363 {
1364 ASSERT(itemClass->ClassID < int32(_itemClassByOldEnum.size()));
1365 ASSERT(!_itemClassByOldEnum[itemClass->ClassID]);
1366 _itemClassByOldEnum[itemClass->ClassID] = itemClass;
1367 }
1368
1369 for (ItemCurrencyCostEntry const* itemCurrencyCost : sItemCurrencyCostStore)
1370 _itemsWithCurrencyCost.insert(itemCurrencyCost->ItemID);
1371
1373 _itemCategoryConditions[condition->ParentItemLimitCategoryID].push_back(condition);
1374
1375 for (ItemSetSpellEntry const* itemSetSpell : sItemSetSpellStore)
1376 _itemSetSpells[itemSetSpell->ItemSetID].push_back(itemSetSpell);
1377
1378 for (ItemSpecOverrideEntry const* itemSpecOverride : sItemSpecOverrideStore)
1379 _itemSpecOverrides[itemSpecOverride->ItemID].push_back(itemSpecOverride);
1380
1381 for (JournalTierEntry const* journalTier : sJournalTierStore)
1382 _journalTiersByIndex.push_back(journalTier);
1383
1384 for (MapDifficultyEntry const* entry : sMapDifficultyStore)
1385 if (sMapStore.HasRecord(entry->MapID) && (!entry->DifficultyID || sDifficultyStore.HasRecord(entry->DifficultyID)))
1386 _mapDifficulties.push_back(entry);
1387
1388 std::ranges::sort(_mapDifficulties, std::ranges::less(),
1389 [](MapDifficultyEntry const* entry) { return std::pair(entry->MapID, entry->DifficultyID); });
1390
1391 std::vector<MapDifficultyXConditionEntry const*> mapDifficultyConditions;
1392 mapDifficultyConditions.reserve(sMapDifficultyXConditionStore.GetNumRows());
1393 for (MapDifficultyXConditionEntry const* mapDifficultyCondition : sMapDifficultyXConditionStore)
1394 mapDifficultyConditions.push_back(mapDifficultyCondition);
1395
1396 std::ranges::sort(mapDifficultyConditions, {}, &MapDifficultyXConditionEntry::OrderIndex);
1397
1398 for (MapDifficultyXConditionEntry const* mapDifficultyCondition : mapDifficultyConditions)
1399 if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(mapDifficultyCondition->PlayerConditionID))
1400 _mapDifficultyConditions[mapDifficultyCondition->MapDifficultyID].emplace_back(mapDifficultyCondition->ID, playerCondition);
1401
1402 for (MountEntry const* mount : sMountStore)
1403 _mountsBySpellId[mount->SourceSpellID] = mount;
1404
1405 for (MountTypeXCapabilityEntry const* mountTypeCapability : sMountTypeXCapabilityStore)
1406 _mountCapabilitiesByType[mountTypeCapability->MountTypeID].insert(mountTypeCapability);
1407
1408 for (MountXDisplayEntry const* mountDisplay : sMountXDisplayStore)
1409 _mountDisplays[mountDisplay->MountID].push_back(mountDisplay);
1410
1411 for (NameGenEntry const* nameGen : sNameGenStore)
1412 _nameGenData[nameGen->RaceID][nameGen->Sex].push_back(nameGen);
1413
1414 for (NamesProfanityEntry const* namesProfanity : sNamesProfanityStore)
1415 {
1416 ASSERT(namesProfanity->Language < TOTAL_LOCALES || namesProfanity->Language == -1);
1417 std::wstring name;
1418 bool conversionResult = Utf8toWStr(namesProfanity->Name, name);
1419 ASSERT(conversionResult);
1420 if (namesProfanity->Language != -1)
1421 _nameValidators[namesProfanity->Language].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1422 else
1423 {
1424 for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
1425 {
1426 if (i == LOCALE_none)
1427 continue;
1428
1429 _nameValidators[i].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1430 }
1431 }
1432 }
1433
1434 for (NamesReservedEntry const* namesReserved : sNamesReservedStore)
1435 {
1436 std::wstring name;
1437 bool conversionResult = Utf8toWStr(namesReserved->Name, name);
1438 ASSERT(conversionResult);
1439 _nameValidators[TOTAL_LOCALES].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1440 }
1441
1442 for (NamesReservedLocaleEntry const* namesReserved : sNamesReservedLocaleStore)
1443 {
1444 ASSERT(!(namesReserved->LocaleMask & ~((1u << TOTAL_LOCALES) - 1)));
1445 std::wstring name;
1446 bool conversionResult = Utf8toWStr(namesReserved->Name, name);
1447 ASSERT(conversionResult);
1448 for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
1449 {
1450 if (i == LOCALE_none)
1451 continue;
1452
1453 if (namesReserved->LocaleMask & (1 << i))
1454 _nameValidators[i].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1455 }
1456 }
1457
1458 for (ParagonReputationEntry const* paragonReputation : sParagonReputationStore)
1459 if (sFactionStore.HasRecord(paragonReputation->FactionID))
1460 _paragonReputations[paragonReputation->FactionID] = paragonReputation;
1461
1462 {
1463 std::unordered_map<uint32 /*pathID*/, std::vector<PathNodeEntry const*>> unsortedNodes;
1464 for (PathNodeEntry const* pathNode : sPathNodeStore)
1465 if (sPathStore.HasRecord(pathNode->PathID) && sLocationStore.HasRecord(pathNode->LocationID))
1466 unsortedNodes[pathNode->PathID].push_back(pathNode);
1467
1468 for (auto&& [pathId, pathNodes] : unsortedNodes)
1469 {
1470 PathDb2& path = _paths[pathId];
1471
1472 path.Locations.resize(pathNodes.size());
1473 std::ranges::sort(pathNodes, std::ranges::less(), &PathNodeEntry::Sequence);
1474 std::ranges::transform(pathNodes, path.Locations.begin(), [](PathNodeEntry const* node)
1475 {
1476 return sLocationStore.AssertEntry(node->LocationID)->Pos;
1477 });
1478 }
1479
1480 for (PathPropertyEntry const* pathProperty : sPathPropertyStore)
1481 if (sPathStore.HasRecord(pathProperty->PathID))
1482 _paths[pathProperty->PathID].Properties.push_back(pathProperty);
1483 }
1484
1486 if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID))
1487 _phasesByGroup[group->PhaseGroupID].push_back(phase->ID);
1488
1489 for (PowerTypeEntry const* powerType : sPowerTypeStore)
1490 {
1491 ASSERT(powerType->PowerTypeEnum < MAX_POWERS);
1492 ASSERT(!_powerTypes[powerType->PowerTypeEnum]);
1493
1494 _powerTypes[powerType->PowerTypeEnum] = powerType;
1495 }
1496
1497 for (PVPDifficultyEntry const* entry : sPVPDifficultyStore)
1498 {
1499 ASSERT(entry->RangeIndex < MAX_BATTLEGROUND_BRACKETS, "PvpDifficulty bracket (%d) exceeded max allowed value (%d)", entry->RangeIndex, MAX_BATTLEGROUND_BRACKETS);
1500 }
1501
1502 for (PVPStatEntry const* pvpStat : sPVPStatStore)
1503 _pvpStatIdsByMap[pvpStat->MapID].insert(pvpStat->ID);
1504
1505 for (PvpTalentSlotUnlockEntry const* talentUnlock : sPvpTalentSlotUnlockStore)
1506 {
1507 ASSERT(talentUnlock->Slot < (1 << MAX_PVP_TALENT_SLOTS));
1508 for (int8 i = 0; i < MAX_PVP_TALENT_SLOTS; ++i)
1509 {
1510 if (talentUnlock->Slot & (1 << i))
1511 {
1512 ASSERT(!_pvpTalentSlotUnlock[i]);
1513 _pvpTalentSlotUnlock[i] = talentUnlock;
1514 }
1515 }
1516 }
1517
1518 for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore)
1519 {
1520 if (questPackageItem->DisplayType != QUEST_PACKAGE_FILTER_UNMATCHED)
1521 _questPackages[questPackageItem->PackageID].first.push_back(questPackageItem);
1522 else
1523 _questPackages[questPackageItem->PackageID].second.push_back(questPackageItem);
1524 }
1525
1526 for (RewardPackXCurrencyTypeEntry const* rewardPackXCurrencyType : sRewardPackXCurrencyTypeStore)
1527 _rewardPackCurrencyTypes[rewardPackXCurrencyType->RewardPackID].push_back(rewardPackXCurrencyType);
1528
1529 for (RewardPackXItemEntry const* rewardPackXItem : sRewardPackXItemStore)
1530 _rewardPackItems[rewardPackXItem->RewardPackID].push_back(rewardPackXItem);
1531
1532 for (SkillLineEntry const* skill : sSkillLineStore)
1533 if (skill->ParentSkillLineID)
1534 _skillLinesByParentSkillLine[skill->ParentSkillLineID].push_back(skill);
1535
1536 for (SkillLineAbilityEntry const* skillLineAbility : sSkillLineAbilityStore)
1537 _skillLineAbilitiesBySkillupSkill[skillLineAbility->SkillupSkillLineID ? skillLineAbility->SkillupSkillLineID : skillLineAbility->SkillLine].push_back(skillLineAbility);
1538
1540 if (sSkillLineStore.LookupEntry(entry->SkillID))
1541 _skillRaceClassInfoBySkill.insert(SkillRaceClassInfoContainer::value_type(entry->SkillID, entry));
1542
1543 for (SoulbindConduitRankEntry const* soulbindConduitRank : sSoulbindConduitRankStore)
1544 _soulbindConduitRanks[{ soulbindConduitRank->SoulbindConduitID, soulbindConduitRank->RankIndex }] = soulbindConduitRank;
1545
1547 _specializationSpellsBySpec[specSpells->SpecID].push_back(specSpells);
1548
1549 for (SpecSetMemberEntry const* specSetMember : sSpecSetMemberStore)
1550 _specsBySpecSet.insert(std::make_pair(specSetMember->SpecSetID, uint32(specSetMember->ChrSpecializationID)));
1551
1552 for (SpellClassOptionsEntry const* classOption : sSpellClassOptionsStore)
1553 _spellFamilyNames.insert(classOption->SpellClassSet);
1554
1556 _spellProcsPerMinuteMods[ppmMod->SpellProcsPerMinuteID].push_back(ppmMod);
1557
1558 for (SpellVisualMissileEntry const* spellVisualMissile : sSpellVisualMissileStore)
1559 _spellVisualMissilesBySet[spellVisualMissile->SpellVisualMissileSetID].push_back(spellVisualMissile);
1560
1561 for (TalentEntry const* talentInfo : sTalentStore)
1562 {
1563 ASSERT(talentInfo->ClassID < MAX_CLASSES);
1564 ASSERT(talentInfo->TierID < MAX_TALENT_TIERS, "MAX_TALENT_TIERS must be at least %u", talentInfo->TierID + 1);
1565 ASSERT(talentInfo->ColumnIndex < MAX_TALENT_COLUMNS, "MAX_TALENT_COLUMNS must be at least %u", talentInfo->ColumnIndex + 1);
1566
1567 _talentsByPosition[talentInfo->ClassID][talentInfo->TierID][talentInfo->ColumnIndex].push_back(talentInfo);
1568 }
1569
1570 for (TaxiPathEntry const* entry : sTaxiPathStore)
1571 _taxiPaths[{ entry->FromTaxiNode, entry->ToTaxiNode }] = entry;
1572
1573 uint32 pathCount = sTaxiPathStore.GetNumRows();
1574
1575 // Calculate path nodes count
1576 std::vector<uint32> pathLength;
1577 pathLength.resize(pathCount); // 0 and some other indexes not used
1578 for (TaxiPathNodeEntry const* entry : sTaxiPathNodeStore)
1579 pathLength[entry->PathID] = std::max(pathLength[entry->PathID], entry->NodeIndex + 1u);
1580
1581 // Set path length
1582 sTaxiPathNodesByPath.resize(pathCount); // 0 and some other indexes not used
1583 for (uint32 i = 0; i < sTaxiPathNodesByPath.size(); ++i)
1584 sTaxiPathNodesByPath[i].resize(pathLength[i]);
1585
1586 // fill data
1587 for (TaxiPathNodeEntry const* entry : sTaxiPathNodeStore)
1588 sTaxiPathNodesByPath[entry->PathID][entry->NodeIndex] = entry;
1589
1590 for (ToyEntry const* toy : sToyStore)
1591 _toys.insert(toy->ItemID);
1592
1593 std::unordered_multimap<int32, UiMapAssignmentEntry const*> uiMapAssignmentByUiMap;
1594 for (UiMapAssignmentEntry const* uiMapAssignment : sUiMapAssignmentStore)
1595 {
1596 uiMapAssignmentByUiMap.emplace(uiMapAssignment->UiMapID, uiMapAssignment);
1597 if (UiMapEntry const* uiMap = sUiMapStore.LookupEntry(uiMapAssignment->UiMapID))
1598 {
1599 ASSERT(uiMap->System < MAX_UI_MAP_SYSTEM, "MAX_UI_MAP_SYSTEM must be at least %u", uiMap->System + 1);
1600 if (uiMapAssignment->MapID >= 0)
1601 _uiMapAssignmentByMap[uiMap->System].emplace(uiMapAssignment->MapID, uiMapAssignment);
1602 if (uiMapAssignment->AreaID)
1603 _uiMapAssignmentByArea[uiMap->System].emplace(uiMapAssignment->AreaID, uiMapAssignment);
1604 if (uiMapAssignment->WmoDoodadPlacementID)
1605 _uiMapAssignmentByWmoDoodadPlacement[uiMap->System].emplace(uiMapAssignment->WmoDoodadPlacementID, uiMapAssignment);
1606 if (uiMapAssignment->WmoGroupID)
1607 _uiMapAssignmentByWmoGroup[uiMap->System].emplace(uiMapAssignment->WmoGroupID, uiMapAssignment);
1608 }
1609 }
1610
1611 std::unordered_map<std::pair<uint32, uint32>, UiMapLinkEntry const*> uiMapLinks;
1612 for (UiMapLinkEntry const* uiMapLink : sUiMapLinkStore)
1613 uiMapLinks[std::make_pair(uiMapLink->ParentUiMapID, uint32(uiMapLink->ChildUiMapID))] = uiMapLink;
1614
1615 for (UiMapEntry const* uiMap : sUiMapStore)
1616 {
1617 UiMapBounds& bounds = _uiMapBounds[uiMap->ID];
1618 memset(&bounds, 0, sizeof(bounds));
1619 if (UiMapEntry const* parentUiMap = sUiMapStore.LookupEntry(uiMap->ParentUiMapID))
1620 {
1621 if (parentUiMap->GetFlags().HasFlag(UiMapFlag::NoWorldPositions))
1622 continue;
1623
1624 UiMapAssignmentEntry const* uiMapAssignment = nullptr;
1625 UiMapAssignmentEntry const* parentUiMapAssignment = nullptr;
1626 for (std::pair<int32 const, UiMapAssignmentEntry const*> const& uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ID))
1627 {
1628 if (uiMapAssignmentForMap.second->MapID >= 0 &&
1629 uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 &&
1630 uiMapAssignmentForMap.second->Region[1].Y - uiMapAssignmentForMap.second->Region[0].Y > 0)
1631 {
1632 uiMapAssignment = uiMapAssignmentForMap.second;
1633 break;
1634 }
1635 }
1636
1637 if (!uiMapAssignment)
1638 continue;
1639
1640 for (std::pair<int32 const, UiMapAssignmentEntry const*> const& uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ParentUiMapID))
1641 {
1642 if (uiMapAssignmentForMap.second->MapID == uiMapAssignment->MapID &&
1643 uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 &&
1644 uiMapAssignmentForMap.second->Region[1].Y - uiMapAssignmentForMap.second->Region[0].Y > 0)
1645 {
1646 parentUiMapAssignment = uiMapAssignmentForMap.second;
1647 break;
1648 }
1649 }
1650
1651 if (!parentUiMapAssignment)
1652 continue;
1653
1654 float parentXsize = parentUiMapAssignment->Region[1].X - parentUiMapAssignment->Region[0].X;
1655 float parentYsize = parentUiMapAssignment->Region[1].Y - parentUiMapAssignment->Region[0].Y;
1656 float bound0scale = (uiMapAssignment->Region[1].X - parentUiMapAssignment->Region[0].X) / parentXsize;
1657 float bound0 = ((1.0f - bound0scale) * parentUiMapAssignment->UiMax.Y) + (bound0scale * parentUiMapAssignment->UiMin.Y);
1658 float bound2scale = (uiMapAssignment->Region[0].X - parentUiMapAssignment->Region[0].X) / parentXsize;
1659 float bound2 = ((1.0f - bound2scale) * parentUiMapAssignment->UiMax.Y) + (bound2scale * parentUiMapAssignment->UiMin.Y);
1660 float bound1scale = (uiMapAssignment->Region[1].Y - parentUiMapAssignment->Region[0].Y) / parentYsize;
1661 float bound1 = ((1.0f - bound1scale) * parentUiMapAssignment->UiMax.X) + (bound1scale * parentUiMapAssignment->UiMin.X);
1662 float bound3scale = (uiMapAssignment->Region[0].Y - parentUiMapAssignment->Region[0].Y) / parentYsize;
1663 float bound3 = ((1.0f - bound3scale) * parentUiMapAssignment->UiMax.X) + (bound3scale * parentUiMapAssignment->UiMin.X);
1664 if ((bound3 - bound1) > 0.0f || (bound2 - bound0) > 0.0f)
1665 {
1666 bounds.Bounds[0] = bound0;
1667 bounds.Bounds[1] = bound1;
1668 bounds.Bounds[2] = bound2;
1669 bounds.Bounds[3] = bound3;
1670 bounds.IsUiAssignment = true;
1671 }
1672 }
1673
1674 if (UiMapLinkEntry const* uiMapLink = Trinity::Containers::MapGetValuePtr(uiMapLinks, std::make_pair(uiMap->ParentUiMapID, uiMap->ID)))
1675 {
1676 bounds.IsUiAssignment = false;
1677 bounds.IsUiLink = true;
1678 bounds.Bounds[0] = uiMapLink->UiMin.Y;
1679 bounds.Bounds[1] = uiMapLink->UiMin.X;
1680 bounds.Bounds[2] = uiMapLink->UiMax.Y;
1681 bounds.Bounds[3] = uiMapLink->UiMax.X;
1682 }
1683 }
1684
1685 for (UiMapXMapArtEntry const* uiMapArt : sUiMapXMapArtStore)
1686 if (uiMapArt->PhaseID)
1687 _uiMapPhases.insert(uiMapArt->PhaseID);
1688
1689 for (WMOAreaTableEntry const* entry : sWMOAreaTableStore)
1690 _wmoAreaTableLookup[WMOAreaTableKey(entry->WmoID, entry->NameSetID, entry->WmoGroupID)] = entry;
1691
1692 // Initialize global taxinodes mask
1693 // reinitialize internal storage for globals after loading TaxiNodes.db2
1694 sTaxiNodesMask = {};
1698 // include existed nodes that have at least single not spell base (scripted) path
1699 for (TaxiNodesEntry const* node : sTaxiNodesStore)
1700 {
1701 if (!node->IsPartOfTaxiNetwork())
1702 continue;
1703
1704 // valid taxi network node
1705 uint32 field = uint32((node->ID - 1) / (sizeof(TaxiMask::value_type) * 8));
1706 TaxiMask::value_type submask = TaxiMask::value_type(1 << ((node->ID - 1) % (sizeof(TaxiMask::value_type) * 8)));
1707
1708 sTaxiNodesMask[field] |= submask;
1709 if (node->GetFlags().HasFlag(TaxiNodeFlags::ShowOnHordeMap))
1710 sHordeTaxiNodesMask[field] |= submask;
1711 if (node->GetFlags().HasFlag(TaxiNodeFlags::ShowOnAllianceMap))
1712 sAllianceTaxiNodesMask[field] |= submask;
1713
1714 uint32 uiMapId = uint32(-1);
1715 if (!GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_ADVENTURE, false, &uiMapId))
1716 GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_TAXI, false, &uiMapId);
1717
1718 if (uiMapId == 985 || uiMapId == 986)
1719 sOldContinentsNodesMask[field] |= submask;
1720 }
1721
1722 TC_LOG_INFO("server.loading", ">> Indexed DB2 data stores in {} ms", GetMSTimeDiffToNow(oldMSTime));
1723}
1724
1726{
1727 auto itr = _stores.find(type);
1728 if (itr != _stores.end())
1729 return itr->second;
1730
1731 return nullptr;
1732}
1733
1735{
1736 uint32 oldMSTime = getMSTime();
1737
1738 QueryResult result = HotfixDatabase.Query("SELECT Id, UniqueId, TableHash, RecordId, Status FROM hotfix_data ORDER BY Id");
1739
1740 if (!result)
1741 {
1742 TC_LOG_INFO("server.loading", ">> Loaded 0 hotfix info entries.");
1743 return;
1744 }
1745
1746 uint32 count = 0;
1747
1748 std::map<std::pair<uint32, int32>, bool> deletedRecords;
1749
1750 do
1751 {
1752 Field* fields = result->Fetch();
1753
1754 int32 id = fields[0].GetInt32();
1755 uint32 uniqueId = fields[1].GetUInt32();
1756 uint32 tableHash = fields[2].GetUInt32();
1757 int32 recordId = fields[3].GetInt32();
1758 HotfixRecord::Status status = static_cast<HotfixRecord::Status>(fields[4].GetUInt8());
1759 std::bitset<TOTAL_LOCALES> availableDb2Locales = localeMask;
1760 if (status == HotfixRecord::Status::Valid && !_stores.contains(tableHash))
1761 {
1762 HotfixBlobKey key = std::make_pair(tableHash, recordId);
1763 for (std::size_t locale = 0; locale < TOTAL_LOCALES; ++locale)
1764 {
1765 if (!availableDb2Locales[locale])
1766 continue;
1767
1768 if (!_hotfixBlob[locale].contains(key))
1769 availableDb2Locales[locale] = false;
1770 }
1771
1772 if (availableDb2Locales.none())
1773 {
1774 TC_LOG_ERROR("sql.sql", "Table `hotfix_data` references unknown DB2 store by hash 0x{:X} and has no reference to `hotfix_blob` in hotfix id {} with RecordID: {}", tableHash, id, recordId);
1775 continue;
1776 }
1777 }
1778
1779 HotfixRecord hotfixRecord;
1780 hotfixRecord.TableHash = tableHash;
1781 hotfixRecord.RecordID = recordId;
1782 hotfixRecord.ID.PushID = id;
1783 hotfixRecord.ID.UniqueID = uniqueId;
1784 hotfixRecord.HotfixStatus = status;
1785 hotfixRecord.AvailableLocalesMask = availableDb2Locales.to_ulong();
1786
1787 HotfixPush& push = _hotfixData[id];
1788 push.Records.push_back(hotfixRecord);
1789 push.AvailableLocalesMask |= hotfixRecord.AvailableLocalesMask;
1790
1791 _maxHotfixId = std::max(_maxHotfixId, id);
1792 deletedRecords[std::make_pair(tableHash, recordId)] = status == HotfixRecord::Status::RecordRemoved;
1793 ++count;
1794 } while (result->NextRow());
1795
1796 for (auto itr = deletedRecords.begin(); itr != deletedRecords.end(); ++itr)
1797 if (itr->second)
1798 if (DB2StorageBase* store = Trinity::Containers::MapGetValuePtr(_stores, itr->first.first))
1799 store->EraseRecord(itr->first.second);
1800
1801 TC_LOG_INFO("server.loading", ">> Loaded {} hotfix records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1802}
1803
1805{
1806 uint32 oldMSTime = getMSTime();
1807
1808 QueryResult result = HotfixDatabase.Query("SELECT TableHash, RecordId, locale, `Blob` FROM hotfix_blob ORDER BY TableHash");
1809
1810 if (!result)
1811 {
1812 TC_LOG_INFO("server.loading", ">> Loaded 0 hotfix blob entries.");
1813 return;
1814 }
1815
1816 std::bitset<TOTAL_LOCALES> availableDb2Locales = localeMask;
1817 uint32 hotfixBlobCount = 0;
1818 do
1819 {
1820 Field* fields = result->Fetch();
1821
1822 uint32 tableHash = fields[0].GetUInt32();
1823 auto storeItr = _stores.find(tableHash);
1824 if (storeItr != _stores.end())
1825 {
1826 TC_LOG_ERROR("sql.sql", "Table hash 0x{:X} points to a loaded DB2 store {}, fill related table instead of hotfix_blob",
1827 tableHash, storeItr->second->GetFileName());
1828 continue;
1829 }
1830
1831 int32 recordId = fields[1].GetInt32();
1832 std::string localeName = fields[2].GetString();
1833 LocaleConstant locale = GetLocaleByName(localeName);
1834
1835 if (!IsValidLocale(locale))
1836 {
1837 TC_LOG_ERROR("sql.sql", "`hotfix_blob` contains invalid locale: {} at TableHash: 0x{:X} and RecordID: {}", localeName, tableHash, recordId);
1838 continue;
1839 }
1840
1841 if (!availableDb2Locales[locale])
1842 continue;
1843
1844 _hotfixBlob[locale][std::make_pair(tableHash, recordId)] = fields[3].GetBinary();
1845 hotfixBlobCount++;
1846 } while (result->NextRow());
1847
1848 TC_LOG_INFO("server.loading", ">> Loaded {} hotfix blob records in {} ms", hotfixBlobCount, GetMSTimeDiffToNow(oldMSTime));
1849}
1850
1851bool ValidateBroadcastTextTactKeyOptionalData(std::vector<uint8> const& data)
1852{
1853 return data.size() == 8 + 16;
1854}
1855
1857{
1858 // Register allowed optional data keys
1859 _allowedHotfixOptionalData.emplace(sBroadcastTextStore.GetTableHash(), std::make_pair(sTactKeyStore.GetTableHash(), &ValidateBroadcastTextTactKeyOptionalData));
1860
1861 uint32 oldMSTime = getMSTime();
1862
1863 QueryResult result = HotfixDatabase.Query("SELECT TableHash, RecordId, locale, `Key`, `Data` FROM hotfix_optional_data ORDER BY TableHash");
1864
1865 if (!result)
1866 {
1867 TC_LOG_INFO("server.loading", ">> Loaded 0 hotfix optional data records.");
1868 return;
1869 }
1870
1871 std::bitset<TOTAL_LOCALES> availableDb2Locales = localeMask;
1872 uint32 hotfixOptionalDataCount = 0;
1873 do
1874 {
1875 Field* fields = result->Fetch();
1876
1877 uint32 tableHash = fields[0].GetUInt32();
1878 auto allowedHotfixes = Trinity::Containers::MapEqualRange(_allowedHotfixOptionalData, tableHash);
1879 if (allowedHotfixes.begin() == allowedHotfixes.end())
1880 {
1881 TC_LOG_ERROR("sql.sql", "Table `hotfix_optional_data` references DB2 store by hash 0x{:X} that is not allowed to have optional data", tableHash);
1882 continue;
1883 }
1884
1885 uint32 recordId = fields[1].GetInt32();
1886 auto storeItr = _stores.find(tableHash);
1887 if (storeItr == _stores.end())
1888 {
1889 TC_LOG_ERROR("sql.sql", "Table `hotfix_optional_data` references unknown DB2 store by hash 0x{:X} with RecordID: {}", tableHash, recordId);
1890 continue;
1891 }
1892
1893 std::string localeName = fields[2].GetString();
1894 LocaleConstant locale = GetLocaleByName(localeName);
1895
1896 if (!IsValidLocale(locale))
1897 {
1898 TC_LOG_ERROR("sql.sql", "`hotfix_optional_data` contains invalid locale: {} at TableHash: 0x{:X} and RecordID: {}", localeName, tableHash, recordId);
1899 continue;
1900 }
1901
1902 if (!availableDb2Locales[locale])
1903 continue;
1904
1905 DB2Manager::HotfixOptionalData optionalData;
1906 optionalData.Key = fields[3].GetUInt32();
1907 auto allowedHotfixItr = std::find_if(allowedHotfixes.begin(), allowedHotfixes.end(), [&](std::pair<uint32 const, AllowedHotfixOptionalData> const& v)
1908 {
1909 return v.second.first == optionalData.Key;
1910 });
1911 if (allowedHotfixItr == allowedHotfixes.end())
1912 {
1913 TC_LOG_ERROR("sql.sql", "Table `hotfix_optional_data` references non-allowed optional data key 0x{:X} for DB2 store by hash 0x{:X} and RecordID: {}",
1914 optionalData.Key, tableHash, recordId);
1915 continue;
1916 }
1917
1918 optionalData.Data = fields[4].GetBinary();
1919 if (!allowedHotfixItr->second.second(optionalData.Data))
1920 {
1921 TC_LOG_ERROR("sql.sql", "Table `hotfix_optional_data` contains invalid data for DB2 store 0x{:X}, RecordID: {} and Key: 0x{:X}",
1922 tableHash, recordId, optionalData.Key);
1923 continue;
1924 }
1925
1926 _hotfixOptionalData[locale][std::make_pair(tableHash, recordId)].push_back(std::move(optionalData));
1927 hotfixOptionalDataCount++;
1928 } while (result->NextRow());
1929
1930 TC_LOG_INFO("server.loading", ">> Loaded {} hotfix optional data records in {} ms", hotfixOptionalDataCount, GetMSTimeDiffToNow(oldMSTime));
1931}
1932
1934{
1935 return _hotfixData.size();
1936}
1937
1939{
1940 return _hotfixData;
1941}
1942
1943std::vector<uint8> const* DB2Manager::GetHotfixBlobData(uint32 tableHash, int32 recordId, LocaleConstant locale) const
1944{
1945 ASSERT(IsValidLocale(locale), "Locale %u is invalid locale", uint32(locale));
1946
1947 return Trinity::Containers::MapGetValuePtr(_hotfixBlob[locale], std::make_pair(tableHash, recordId));
1948}
1949
1950std::vector<DB2Manager::HotfixOptionalData> const* DB2Manager::GetHotfixOptionalData(uint32 tableHash, int32 recordId, LocaleConstant locale) const
1951{
1952 ASSERT(IsValidLocale(locale), "Locale %u is invalid locale", uint32(locale));
1953
1954 return Trinity::Containers::MapGetValuePtr(_hotfixOptionalData[locale], std::make_pair(tableHash, recordId));
1955}
1956
1958{
1959 return sAnimationDataStore.GetNumRows();
1960}
1961
1963{
1964 HotfixRecord hotfixRecord;
1965 hotfixRecord.TableHash = tableHash;
1966 hotfixRecord.RecordID = recordId;
1967 hotfixRecord.ID.PushID = ++_maxHotfixId;
1968 hotfixRecord.ID.UniqueID = rand32();
1969 hotfixRecord.AvailableLocalesMask = 0xDFF;
1970
1971 HotfixPush& push = _hotfixData[hotfixRecord.ID.PushID];
1972 push.Records.push_back(hotfixRecord);
1973 push.AvailableLocalesMask |= hotfixRecord.AvailableLocalesMask;
1974}
1975
1976std::vector<uint32> DB2Manager::GetAreasForGroup(uint32 areaGroupId) const
1977{
1978 auto itr = _areaGroupMembers.find(areaGroupId);
1979 if (itr != _areaGroupMembers.end())
1980 return itr->second;
1981
1982 return std::vector<uint32>();
1983}
1984
1985bool DB2Manager::IsInArea(uint32 objectAreaId, uint32 areaId)
1986{
1987 do
1988 {
1989 if (objectAreaId == areaId)
1990 return true;
1991
1992 AreaTableEntry const* objectArea = sAreaTableStore.LookupEntry(objectAreaId);
1993 if (!objectArea)
1994 break;
1995
1996 objectAreaId = objectArea->ParentAreaID;
1997 } while (objectAreaId);
1998
1999 return false;
2000}
2001
2003{
2004 if (!areaEntry)
2005 return nullptr;
2006
2007 // Get ContentTuning for the area
2008 if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(areaEntry->ContentTuningID))
2009 return contentTuning;
2010
2011 // If there is no data for the current area and it has a parent area, get data from the last (recursive)
2012 if (AreaTableEntry const* parentAreaEntry = sAreaTableStore.LookupEntry(areaEntry->ParentAreaID))
2013 return GetContentTuningForArea(parentAreaEntry);
2014
2015 return nullptr;
2016}
2017
2018std::vector<ArtifactPowerEntry const*> DB2Manager::GetArtifactPowers(uint8 artifactId) const
2019{
2020 auto itr = _artifactPowers.find(artifactId);
2021 if (itr != _artifactPowers.end())
2022 return itr->second;
2023
2024 return std::vector<ArtifactPowerEntry const*>{};
2025}
2026
2027std::vector<uint32> const* DB2Manager::GetArtifactPowerLinks(uint32 artifactPowerId) const
2028{
2029 return Trinity::Containers::MapGetValuePtr(_artifactPowerLinks, artifactPowerId);
2030}
2031
2033{
2034 return Trinity::Containers::MapGetValuePtr(_artifactPowerRanks, { artifactPowerId, rank });
2035}
2036
2038{
2039 return Trinity::Containers::MapGetValuePtr(_azeriteEmpoweredItems, itemId);
2040}
2041
2043{
2044 return std::find_if(sAzeriteItemStore.begin(), sAzeriteItemStore.end(),
2045 [&](AzeriteItemEntry const* azeriteItem) { return azeriteItem->ItemID == int32(itemId); }) != sAzeriteItemStore.end();
2046}
2047
2049{
2050 return Trinity::Containers::MapGetValuePtr(_azeriteEssencePowersByIdAndRank, std::make_pair(azeriteEssenceId, rank));
2051}
2052
2053std::vector<AzeriteItemMilestonePowerEntry const*> const& DB2Manager::GetAzeriteItemMilestonePowers() const
2054{
2055 return _azeriteItemMilestonePowers;
2056}
2057
2059{
2060 ASSERT(slot < MAX_AZERITE_ESSENCE_SLOT, "Slot %u must be lower than MAX_AZERITE_ESSENCE_SLOT (%u)", uint32(slot), MAX_AZERITE_ESSENCE_SLOT);
2061 return _azeriteItemMilestonePowerByEssenceSlot[slot];
2062}
2063
2064std::vector<AzeritePowerSetMemberEntry const*> const* DB2Manager::GetAzeritePowers(uint32 itemId) const
2065{
2066 if (AzeriteEmpoweredItemEntry const* azeriteEmpoweredItem = GetAzeriteEmpoweredItem(itemId))
2067 return Trinity::Containers::MapGetValuePtr(_azeritePowers, azeriteEmpoweredItem->AzeritePowerSetID);
2068
2069 return nullptr;
2070}
2071
2073{
2075 if (std::array<uint8, MAX_AZERITE_EMPOWERED_TIER> const* levels = Trinity::Containers::MapGetValuePtr(_azeriteTierUnlockLevels, std::make_pair(azeriteUnlockSetId, context)))
2076 return (*levels)[tier];
2077
2078 AzeriteTierUnlockSetEntry const* azeriteTierUnlockSet = sAzeriteTierUnlockSetStore.LookupEntry(azeriteUnlockSetId);
2079 if (azeriteTierUnlockSet && azeriteTierUnlockSet->Flags & AZERITE_TIER_UNLOCK_SET_FLAG_DEFAULT)
2080 if (std::array<uint8, MAX_AZERITE_EMPOWERED_TIER> const* levels = Trinity::Containers::MapGetValuePtr(_azeriteTierUnlockLevels, std::make_pair(azeriteUnlockSetId, ItemContext::NONE)))
2081 return (*levels)[tier];
2082
2083 return sAzeriteLevelInfoStore.GetNumRows();
2084}
2085
2086char const* DB2Manager::GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale /*= DEFAULT_LOCALE*/, uint8 gender /*= GENDER_MALE*/, bool forceGender /*= false*/)
2087{
2088 if ((gender == GENDER_FEMALE || gender == GENDER_NONE) && (forceGender || broadcastText->Text1[DEFAULT_LOCALE][0] != '\0'))
2089 {
2090 if (broadcastText->Text1[locale][0] != '\0')
2091 return broadcastText->Text1[locale];
2092
2093 return broadcastText->Text1[DEFAULT_LOCALE];
2094 }
2095
2096 if (broadcastText->Text[locale][0] != '\0')
2097 return broadcastText->Text[locale];
2098
2099 return broadcastText->Text[DEFAULT_LOCALE];
2100}
2101
2102int32 const* DB2Manager::GetBroadcastTextDuration(uint32 broadcastTextId, LocaleConstant locale /*= DEFAULT_LOCALE*/) const
2103{
2104 return Trinity::Containers::MapGetValuePtr(_broadcastTextDurations, { broadcastTextId, WowLocaleToCascLocaleBit[locale] });
2105}
2106
2108{
2109 return Trinity::Containers::MapGetValuePtr(_charBaseInfoByRaceAndClass, { race, class_ });
2110}
2111
2113{
2114 ASSERT(unitClass < MAX_CLASSES);
2115 return _uiDisplayByClass[unitClass];
2116}
2117
2118char const* DB2Manager::GetChrClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/)
2119{
2120 ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_);
2121 if (!classEntry)
2122 return "";
2123
2124 if (classEntry->Name[locale][0] != '\0')
2125 return classEntry->Name[locale];
2126
2127 return classEntry->Name[DEFAULT_LOCALE];
2128}
2129
2131{
2132 return _powersByClass[classId].TypeByIndex;
2133}
2134
2136{
2137 return _powersByClass[classId].IndexByType[power];
2138}
2139
2140std::vector<ChrCustomizationChoiceEntry const*> const* DB2Manager::GetCustomiztionChoices(uint32 chrCustomizationOptionId) const
2141{
2142 return Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesByOption, chrCustomizationOptionId);
2143}
2144
2145std::vector<ChrCustomizationOptionEntry const*> const* DB2Manager::GetCustomiztionOptions(uint8 race, uint8 gender) const
2146{
2147 return Trinity::Containers::MapGetValuePtr(_chrCustomizationOptionsByRaceAndGender, { race,gender });
2148}
2149
2150std::vector<std::pair<uint32, std::vector<uint32>>> const* DB2Manager::GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const
2151{
2152 return Trinity::Containers::MapGetValuePtr(_chrCustomizationRequiredChoices, chrCustomizationReqId);
2153}
2154
2156{
2157 return Trinity::Containers::MapGetValuePtr(_chrModelsByRaceAndGender, { race, gender });
2158}
2159
2161{
2162 return Trinity::Containers::MapGetValuePtr(_conditionalChrModelsByChrModelId, chrModelId);
2163}
2164
2165char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEFAULT_LOCALE*/)
2166{
2167 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
2168 if (!raceEntry)
2169 return "";
2170
2171 if (raceEntry->Name[locale][0] != '\0')
2172 return raceEntry->Name[locale];
2173
2174 return raceEntry->Name[DEFAULT_LOCALE];
2175}
2176
2178{
2179 return _chrSpecializationsByIndex[class_][index];
2180}
2181
2186
2187uint32 DB2Manager::GetRedirectedContentTuningId(uint32 contentTuningId, std::span<uint32 const> redirectFlag) const
2188{
2189 if (std::vector<ConditionalContentTuningEntry const*> const* conditionalContentTunings = Trinity::Containers::MapGetValuePtr(_conditionalContentTuning, contentTuningId))
2190 {
2191 for (ConditionalContentTuningEntry const* conditionalContentTuning : *conditionalContentTunings)
2192 {
2193 uint32 block = conditionalContentTuning->RedirectEnum / 32;
2194 uint32 flag = conditionalContentTuning->RedirectEnum % 32;
2195 if (block >= redirectFlag.size())
2196 continue;
2197
2198 if (flag & redirectFlag[block])
2199 return conditionalContentTuning->RedirectContentTuningID;
2200 }
2201 }
2202
2203 return contentTuningId;
2204}
2205
2206Optional<ContentTuningLevels> DB2Manager::GetContentTuningData(uint32 contentTuningId, std::span<uint32 const> redirectFlag, bool forItem /*= false*/) const
2207{
2208 ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(GetRedirectedContentTuningId(contentTuningId, redirectFlag));
2209 if (!contentTuning)
2210 return {};
2211
2212 if (forItem && contentTuning->GetFlags().HasFlag(ContentTuningFlag::DisabledForItem))
2213 return {};
2214
2215 auto getLevelAdjustment = [](ContentTuningCalcType type) -> int32
2216 {
2217 switch (type)
2218 {
2220 return 1;
2222 return GetMaxLevelForExpansion(sWorld->getIntConfig(CONFIG_EXPANSION));
2224 return GetMaxLevelForExpansion(std::max<int32>(sWorld->getIntConfig(CONFIG_EXPANSION) - 1, 0));
2225 default:
2226 break;
2227 }
2228
2229 return 0;
2230 };
2231
2232 ContentTuningLevels levels;
2233 levels.MinLevel = contentTuning->MinLevel + getLevelAdjustment(static_cast<ContentTuningCalcType>(contentTuning->MinLevelType));
2234 levels.MaxLevel = contentTuning->MaxLevel + getLevelAdjustment(static_cast<ContentTuningCalcType>(contentTuning->MaxLevelType));
2235 levels.MinLevelWithDelta = std::clamp<int32>(levels.MinLevel + contentTuning->TargetLevelDelta, 1, MAX_LEVEL);
2236 levels.MaxLevelWithDelta = std::clamp<int32>(levels.MaxLevel + contentTuning->TargetLevelMaxDelta, 1, MAX_LEVEL);
2237
2238 // clamp after calculating levels with delta (delta can bring "overflown" level back into correct range)
2239 levels.MinLevel = std::clamp<int32>(levels.MinLevel, 1, MAX_LEVEL);
2240 levels.MaxLevel = std::clamp<int32>(levels.MaxLevel, 1, MAX_LEVEL);
2241
2242 if (contentTuning->TargetLevelMin)
2243 levels.TargetLevelMin = contentTuning->TargetLevelMin;
2244 else
2245 levels.TargetLevelMin = levels.MinLevelWithDelta;
2246
2247 if (contentTuning->TargetLevelMax)
2248 levels.TargetLevelMax = contentTuning->TargetLevelMax;
2249 else
2250 levels.TargetLevelMax = levels.MaxLevelWithDelta;
2251
2252 return levels;
2253}
2254
2255bool DB2Manager::HasContentTuningLabel(uint32 contentTuningId, int32 label) const
2256{
2257 return _contentTuningLabels.contains({ contentTuningId, label });
2258}
2259
2261{
2262 if (!petfamily)
2263 return nullptr;
2264
2265 CreatureFamilyEntry const* petFamily = sCreatureFamilyStore.LookupEntry(petfamily);
2266 if (!petFamily)
2267 return nullptr;
2268
2269 return petFamily->Name[locale][0] != '\0' ? petFamily->Name[locale] : nullptr;
2270}
2271
2272std::span<int32 const> DB2Manager::GetCreatureLabels(uint32 creatureDifficultyId) const
2273{
2274 std::vector<int32> const* labels = Trinity::Containers::MapGetValuePtr(_creatureLabels, creatureDifficultyId);
2275 return labels ? std::span<int32 const>(*labels) : std::span<int32 const>();
2276}
2277
2279{
2280 for (std::pair<uint32 const, CurrencyContainerEntry const*> const& p : Trinity::Containers::MapEqualRange(_currencyContainers, currencyId))
2281 if (quantity >= p.second->MinAmount && (!p.second->MaxAmount || quantity <= p.second->MaxAmount))
2282 return p.second;
2283
2284 return nullptr;
2285}
2286
2287std::pair<float, float> DB2Manager::GetCurveXAxisRange(uint32 curveId) const
2288{
2289 if (std::vector<DBCPosition2D> const* points = Trinity::Containers::MapGetValuePtr(_curvePoints, curveId))
2290 return { points->front().X, points->back().X };
2291
2292 return { 0.0f, 0.0f };
2293}
2294
2295static CurveInterpolationMode DetermineCurveType(CurveEntry const* curve, std::vector<DBCPosition2D> const& points)
2296{
2297 switch (curve->Type)
2298 {
2299 case 1:
2301 case 2:
2302 {
2303 switch (points.size())
2304 {
2305 case 2:
2307 case 3:
2309 case 4:
2311 default:
2312 break;
2313 }
2315 }
2316 case 3:
2318 case 4:
2320 case 5:
2322 default:
2323 break;
2324 }
2325
2327}
2328
2329float DB2Manager::GetCurveValueAt(uint32 curveId, float x) const
2330{
2331 auto itr = _curvePoints.find(curveId);
2332 if (itr == _curvePoints.end())
2333 return 0.0f;
2334
2335 CurveEntry const* curve = sCurveStore.AssertEntry(curveId);
2336 std::vector<DBCPosition2D> const& points = itr->second;
2337 if (points.empty())
2338 return 0.0f;
2339
2340 if (points.size() == 1)
2341 return points[0].Y;
2342
2343 return GetCurveValueAt(DetermineCurveType(curve, points), points, x);
2344}
2345
2346float DB2Manager::GetCurveValueAt(CurveInterpolationMode mode, std::span<DBCPosition2D const> points, float x) const
2347{
2348 auto findPointIndex = [&](std::size_t pointIndex)
2349 {
2350 while (pointIndex < points.size() && points[pointIndex].X <= x)
2351 ++pointIndex;
2352 return pointIndex;
2353 };
2354
2355 switch (mode)
2356 {
2358 {
2359 std::size_t pointIndex = findPointIndex(0);
2360 if (!pointIndex)
2361 return points[0].Y;
2362 if (pointIndex >= points.size())
2363 return points.back().Y;
2364 float xDiff = points[pointIndex].X - points[pointIndex - 1].X;
2365 if (xDiff == 0.0)
2366 return points[pointIndex].Y;
2367 return (((x - points[pointIndex - 1].X) / xDiff) * (points[pointIndex].Y - points[pointIndex - 1].Y)) + points[pointIndex - 1].Y;
2368 }
2370 {
2371 std::size_t pointIndex = findPointIndex(0);
2372 if (!pointIndex)
2373 return points[0].Y;
2374 if (pointIndex >= points.size())
2375 return points.back().Y;
2376 float xDiff = points[pointIndex].X - points[pointIndex - 1].X;
2377 if (xDiff == 0.0)
2378 return points[pointIndex].Y;
2379 return ((points[pointIndex].Y - points[pointIndex - 1].Y) * (1.0f - std::cos((x - points[pointIndex - 1].X) / xDiff * float(M_PI))) * 0.5f) + points[pointIndex - 1].Y;
2380 }
2382 {
2383 std::size_t pointIndex = findPointIndex(1);
2384 if (pointIndex == 1)
2385 return points[1].Y;
2386 if (pointIndex >= points.size() - 1)
2387 return points[points.size() - 2].Y;
2388 float xDiff = points[pointIndex].X - points[pointIndex - 1].X;
2389 if (xDiff == 0.0)
2390 return points[pointIndex].Y;
2391
2392 float mu = (x - points[pointIndex - 1].X) / xDiff;
2393 float a0 = -0.5f * points[pointIndex - 2].Y + 1.5f * points[pointIndex - 1].Y - 1.5f * points[pointIndex].Y + 0.5f * points[pointIndex + 1].Y;
2394 float a1 = points[pointIndex - 2].Y - 2.5f * points[pointIndex - 1].Y + 2.0f * points[pointIndex].Y - 0.5f * points[pointIndex + 1].Y;
2395 float a2 = -0.5f * points[pointIndex - 2].Y + 0.5f * points[pointIndex].Y;
2396 float a3 = points[pointIndex - 1].Y;
2397
2398 return a0 * mu * mu * mu + a1 * mu * mu + a2 * mu + a3;
2399 }
2401 {
2402 float xDiff = points[2].X - points[0].X;
2403 if (xDiff == 0.0)
2404 return points[1].Y;
2405 float mu = (x - points[0].X) / xDiff;
2406 return ((1.0f - mu) * (1.0f - mu) * points[0].Y) + (1.0f - mu) * 2.0f * mu * points[1].Y + mu * mu * points[2].Y;
2407 }
2409 {
2410 float xDiff = points[3].X - points[0].X;
2411 if (xDiff == 0.0)
2412 return points[1].Y;
2413 float mu = (x - points[0].X) / xDiff;
2414 return (1.0f - mu) * (1.0f - mu) * (1.0f - mu) * points[0].Y
2415 + 3.0f * mu * (1.0f - mu) * (1.0f - mu) * points[1].Y
2416 + 3.0f * mu * mu * (1.0f - mu) * points[2].Y
2417 + mu * mu * mu * points[3].Y;
2418 }
2420 {
2421 float xDiff = points.back().X - points[0].X;
2422 if (xDiff == 0.0f)
2423 return points.back().Y;
2424
2425 std::vector<float> tmp(points.size());
2426 for (std::size_t i = 0; i < points.size(); ++i)
2427 tmp[i] = points[i].Y;
2428
2429 float mu = (x - points[0].X) / xDiff;
2430 int32 i = int32(points.size()) - 1;
2431 while (i > 0)
2432 {
2433 for (int32 k = 0; k < i; ++k)
2434 {
2435 float val = tmp[k] + mu * (tmp[k + 1] - tmp[k]);
2436 tmp[k] = val;
2437 }
2438 --i;
2439 }
2440 return tmp[0];
2441 }
2443 {
2444 std::size_t pointIndex = findPointIndex(0);
2445 if (pointIndex == 0)
2446 return points[0].Y;
2447 if (pointIndex >= points.size())
2448 return points.back().Y;
2449 return 0.0f;
2450 }
2452 {
2453 std::size_t pointIndex = findPointIndex(0);
2454 if (pointIndex == 0)
2455 return points[0].Y;
2456 if (pointIndex >= points.size())
2457 return points.back().Y;
2458 return points[pointIndex - 1].Y;
2459 }
2460 default:
2461 break;
2462 }
2463
2464 return 0.0f;
2465}
2466
2467std::string_view DB2Manager::GetDifficultyName(Difficulty difficulty)
2468{
2469 if (DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(difficulty))
2470 return difficultyEntry->Name[sWorld->GetDefaultDbcLocale()];
2471
2472 return "None"sv;
2473}
2474
2476{
2477 if (EmotesTextSoundEntry const* emotesTextSound = Trinity::Containers::MapGetValuePtr(_emoteTextSounds, { emote, race, gender, class_ }))
2478 return emotesTextSound;
2479
2480 if (EmotesTextSoundEntry const* emotesTextSound = Trinity::Containers::MapGetValuePtr(_emoteTextSounds, { emote, race, gender, uint8(0) }))
2481 return emotesTextSound;
2482
2483 return nullptr;
2484}
2485
2486template<float(ExpectedStatModEntry::*field)>
2488{
2489 explicit ExpectedStatModReducer(int32 mythicPlusMilestoneSeason) : ActiveMilestoneSeason(mythicPlusMilestoneSeason) { }
2490
2491 float operator()(float mod, ContentTuningXExpectedEntry const* contentTuningXExpected) const
2492 {
2493 if (!contentTuningXExpected)
2494 return mod;
2495
2496 if (contentTuningXExpected->MinMythicPlusSeasonID)
2497 if (MythicPlusSeasonEntry const* mythicPlusSeason = sMythicPlusSeasonStore.LookupEntry(contentTuningXExpected->MinMythicPlusSeasonID))
2498 if (ActiveMilestoneSeason < mythicPlusSeason->MilestoneSeason)
2499 return mod;
2500
2501 if (contentTuningXExpected->MaxMythicPlusSeasonID)
2502 if (MythicPlusSeasonEntry const* mythicPlusSeason = sMythicPlusSeasonStore.LookupEntry(contentTuningXExpected->MaxMythicPlusSeasonID))
2503 if (ActiveMilestoneSeason >= mythicPlusSeason->MilestoneSeason)
2504 return mod;
2505
2506 return mod * sExpectedStatModStore.AssertEntry(contentTuningXExpected->ExpectedStatModID)->*field;
2507 }
2508
2510};
2511
2512float DB2Manager::EvaluateExpectedStat(ExpectedStatType stat, uint32 level, int32 expansion, uint32 contentTuningId, Classes unitClass, int32 mythicPlusMilestoneSeason) const
2513{
2514 auto expectedStatItr = _expectedStatsByLevel.find(std::make_pair(level, expansion));
2515 if (expectedStatItr == _expectedStatsByLevel.end())
2516 expectedStatItr = _expectedStatsByLevel.find(std::make_pair(level, -2));
2517
2518 if (expectedStatItr == _expectedStatsByLevel.end())
2519 return 1.0f;
2520
2521 ExpectedStatModEntry const* classMod = nullptr;
2522 switch (unitClass)
2523 {
2524 case CLASS_WARRIOR:
2525 classMod = sExpectedStatModStore.LookupEntry(4);
2526 break;
2527 case CLASS_PALADIN:
2528 classMod = sExpectedStatModStore.LookupEntry(2);
2529 break;
2530 case CLASS_ROGUE:
2531 classMod = sExpectedStatModStore.LookupEntry(3);
2532 break;
2533 case CLASS_MAGE:
2534 classMod = sExpectedStatModStore.LookupEntry(1);
2535 break;
2536 default:
2537 break;
2538 }
2539
2540 std::vector<ContentTuningXExpectedEntry const*> const* contentTuningMods = Trinity::Containers::MapGetValuePtr(_expectedStatModsByContentTuning, contentTuningId);
2541 float value = 0.0f;
2542 switch (stat)
2543 {
2545 value = expectedStatItr->second->CreatureHealth;
2546 if (contentTuningMods)
2547 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2549 if (classMod)
2550 value *= classMod->CreatureHealthMod;
2551 break;
2553 value = expectedStatItr->second->PlayerHealth;
2554 if (contentTuningMods)
2555 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2557 if (classMod)
2558 value *= classMod->PlayerHealthMod;
2559 break;
2561 value = expectedStatItr->second->CreatureAutoAttackDps;
2562 if (contentTuningMods)
2563 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2565 if (classMod)
2566 value *= classMod->CreatureAutoAttackDPSMod;
2567 break;
2569 value = expectedStatItr->second->CreatureArmor;
2570 if (contentTuningMods)
2571 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2573 if (classMod)
2574 value *= classMod->CreatureArmorMod;
2575 break;
2577 value = expectedStatItr->second->PlayerMana;
2578 if (contentTuningMods)
2579 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2581 if (classMod)
2582 value *= classMod->PlayerManaMod;
2583 break;
2585 value = expectedStatItr->second->PlayerPrimaryStat;
2586 if (contentTuningMods)
2587 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2589 if (classMod)
2590 value *= classMod->PlayerPrimaryStatMod;
2591 break;
2593 value = expectedStatItr->second->PlayerSecondaryStat;
2594 if (contentTuningMods)
2595 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2597 if (classMod)
2598 value *= classMod->PlayerSecondaryStatMod;
2599 break;
2601 value = expectedStatItr->second->ArmorConstant;
2602 if (contentTuningMods)
2603 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2605 if (classMod)
2606 value *= classMod->ArmorConstantMod;
2607 break;
2609 break;
2611 value = expectedStatItr->second->CreatureSpellDamage;
2612 if (contentTuningMods)
2613 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2615 if (classMod)
2616 value *= classMod->CreatureSpellDamageMod;
2617 break;
2618 default:
2619 break;
2620 }
2621
2622 return value;
2623}
2624
2625std::vector<uint32> const* DB2Manager::GetFactionTeamList(uint32 faction) const
2626{
2627 return Trinity::Containers::MapGetValuePtr(_factionTeams, faction);
2628}
2629
2631{
2632 return Trinity::Containers::MapGetValuePtr(_friendshipRepReactions, friendshipRepID);
2633}
2634
2635std::span<int32 const> DB2Manager::GetGameObjectLabels(uint32 gameobjectId) const
2636{
2637 std::vector<int32> const* labels = Trinity::Containers::MapGetValuePtr(_gameobjectLabels, gameobjectId);
2638 return labels ? std::span<int32 const>(*labels) : std::span<int32 const>();
2639}
2640
2642{
2643 for (GlobalCurveEntry const* globalCurveEntry : sGlobalCurveStore)
2644 if (GlobalCurve(globalCurveEntry->Type) == globalCurveType)
2645 return globalCurveEntry->CurveID;
2646
2647 return 0;
2648}
2649
2650std::vector<uint32> const* DB2Manager::GetGlyphBindableSpells(uint32 glyphPropertiesId) const
2651{
2652 return Trinity::Containers::MapGetValuePtr(_glyphBindableSpells, glyphPropertiesId);
2653}
2654
2655std::vector<ChrSpecialization> const* DB2Manager::GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const
2656{
2657 return Trinity::Containers::MapGetValuePtr(_glyphRequiredSpecs, glyphPropertiesId);
2658}
2659
2661{
2662 return Trinity::Containers::MapGetValuePtr(_heirlooms, itemId);
2663}
2664
2666{
2667 return Trinity::Containers::MapGetValuePtr(_itemChildEquipment, itemId);
2668}
2669
2671{
2672 return _itemClassByOldEnum[itemClass];
2673}
2674
2676{
2677 return _itemsWithCurrencyCost.count(itemId) > 0;
2678}
2679
2680std::vector<ItemLimitCategoryConditionEntry const*> const* DB2Manager::GetItemLimitCategoryConditions(uint32 categoryId) const
2681{
2682 return Trinity::Containers::MapGetValuePtr(_itemCategoryConditions, categoryId);
2683}
2684
2685std::vector<ItemSetSpellEntry const*> const* DB2Manager::GetItemSetSpells(uint32 itemSetId) const
2686{
2687 return Trinity::Containers::MapGetValuePtr(_itemSetSpells, itemSetId);
2688}
2689
2690std::vector<ItemSpecOverrideEntry const*> const* DB2Manager::GetItemSpecOverrides(uint32 itemId) const
2691{
2692 return Trinity::Containers::MapGetValuePtr(_itemSpecOverrides, itemId);
2693}
2694
2696{
2697 if (index < _journalTiersByIndex.size())
2698 return _journalTiersByIndex[index];
2699 return nullptr;
2700}
2701
2703{
2704 for (LFGDungeonsEntry const* dungeon : sLFGDungeonsStore)
2705 if (dungeon->MapID == int32(mapId) && Difficulty(dungeon->DifficultyID) == difficulty)
2706 return dungeon;
2707
2708 return nullptr;
2709}
2710
2712{
2713 for (int32 i = sLightStore.GetNumRows(); i >= 0; --i)
2714 {
2715 LightEntry const* light = sLightStore.LookupEntry(uint32(i));
2716 if (!light)
2717 continue;
2718
2719 if (light->ContinentID == int32(mapId) && light->GameCoords.X == 0.0f && light->GameCoords.Y == 0.0f && light->GameCoords.Z == 0.0f)
2720 return uint32(i);
2721 }
2722
2723 return 0;
2724}
2725
2727{
2728 if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType))
2729 return 1 << liq->SoundBank;
2730
2731 return 0;
2732}
2733
2735{
2736 auto difficultyBegin = std::ranges::lower_bound(_mapDifficulties, mapId, std::ranges::less(), &MapDifficultyEntry::MapID);
2737 struct
2738 {
2739 bool operator==(MapDifficultyContainer::const_iterator const& itr) const { return itr == end || (*itr)->MapID != mapId; }
2740 MapDifficultyContainer::const_iterator end = _mapDifficulties.end();
2741 uint32 mapId;
2742 } difficultyEnd { .mapId = mapId };
2743
2744 MapDifficultyEntry const* defaultDifficulty = nullptr;
2745 while (difficultyBegin != difficultyEnd)
2746 {
2747 if (DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry((*difficultyBegin)->DifficultyID))
2748 {
2749 // if a default difficulty exists then use that
2750 if (difficultyEntry->Flags & DIFFICULTY_FLAG_DEFAULT)
2751 {
2752 defaultDifficulty = *difficultyBegin;
2753 break;
2754 }
2755 // otherwise pick first existing difficulty
2756 if (!defaultDifficulty)
2757 defaultDifficulty = *difficultyBegin;
2758 }
2759 ++difficultyBegin;
2760 }
2761
2762 // if no difficulty waa found in Difficulty.db2 then we should only have DIFFICULTY_NONE
2763
2764 return defaultDifficulty;
2765}
2766
2768{
2769 auto itr = std::ranges::lower_bound(_mapDifficulties, std::pair(mapId, difficulty) , std::ranges::less(),
2770 [](MapDifficultyEntry const* mapDifficulty) { return std::pair(mapDifficulty->MapID, Difficulty(mapDifficulty->DifficultyID)); });
2771
2772 if (itr != _mapDifficulties.end() && (*itr)->MapID == mapId && (*itr)->DifficultyID == difficulty)
2773 return *itr;
2774
2775 return nullptr;
2776}
2777
2779{
2780 MapDifficultyEntry const* mapDiff = nullptr;
2781 Difficulty currentDifficulty = difficulty;
2782 do
2783 {
2784 mapDiff = GetMapDifficultyData(mapId, currentDifficulty);
2785 DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(currentDifficulty);
2786 if (!currentDifficulty)
2787 break;
2788
2789 currentDifficulty = Difficulty(difficultyEntry->FallbackDifficultyID);
2790
2791 } while (!mapDiff);
2792
2793 if (!mapDiff)
2794 mapDiff = GetDefaultMapDifficulty(mapId);
2795
2796 return mapDiff;
2797}
2798
2800{
2801 return Trinity::Containers::MapGetValuePtr(_mapDifficultyConditions, mapDifficultyId);
2802}
2803
2805{
2806 return Trinity::Containers::MapGetValuePtr(_mountsBySpellId, spellId);
2807}
2808
2810{
2811 return sMountStore.LookupEntry(id);
2812}
2813
2815{
2816 return Trinity::Containers::MapGetValuePtr(_mountCapabilitiesByType, mountType);
2817}
2818
2820{
2821 return Trinity::Containers::MapGetValuePtr(_mountDisplays, mountId);
2822}
2823
2824std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender) const
2825{
2826 ASSERT(gender < GENDER_NONE);
2827 auto ritr = _nameGenData.find(race);
2828 if (ritr == _nameGenData.end())
2829 return "";
2830
2831 if (ritr->second[gender].empty())
2832 return "";
2833
2834 return Trinity::Containers::SelectRandomContainerElement(ritr->second[gender])->Name;
2835}
2836
2837ResponseCodes DB2Manager::ValidateName(std::wstring const& name, LocaleConstant locale) const
2838{
2839 for (Trinity::wregex const& regex : _nameValidators[locale])
2840 if (Trinity::regex_search(name, regex))
2841 return CHAR_NAME_PROFANE;
2842
2843 // regexes at TOTAL_LOCALES are loaded from NamesReserved which is not locale specific
2844 for (Trinity::wregex const& regex : _nameValidators[TOTAL_LOCALES])
2845 if (Trinity::regex_search(name, regex))
2846 return CHAR_NAME_RESERVED;
2847
2848 return CHAR_NAME_SUCCESS;
2849}
2850
2852{
2853 NumTalentsAtLevelEntry const* numTalentsAtLevel = sNumTalentsAtLevelStore.LookupEntry(level);
2854 if (!numTalentsAtLevel)
2855 numTalentsAtLevel = sNumTalentsAtLevelStore.LookupEntry(sNumTalentsAtLevelStore.GetNumRows() - 1);
2856
2857 if (numTalentsAtLevel)
2858 {
2859 switch (playerClass)
2860 {
2861 case CLASS_DEATH_KNIGHT:
2862 return numTalentsAtLevel->NumTalentsDeathKnight;
2863 case CLASS_DEMON_HUNTER:
2864 return numTalentsAtLevel->NumTalentsDemonHunter;
2865 default:
2866 return numTalentsAtLevel->NumTalents;
2867 }
2868 }
2869
2870 return 0;
2871}
2872
2874{
2875 return Trinity::Containers::MapGetValuePtr(_paragonReputations, factionId);
2876}
2877
2879{
2880 return Trinity::Containers::MapGetValuePtr(_paths, pathId);
2881}
2882
2884{
2885 PVPDifficultyEntry const* maxEntry = nullptr; // used for level > max listed level case
2886 for (PVPDifficultyEntry const* entry : sPVPDifficultyStore)
2887 {
2888 // skip unrelated and too-high brackets
2889 if (entry->MapID != mapid || entry->MinLevel > level)
2890 continue;
2891
2892 // exactly fit
2893 if (entry->MaxLevel >= level)
2894 return entry;
2895
2896 // remember for possible out-of-range case (search higher from existed)
2897 if (!maxEntry || maxEntry->MaxLevel < entry->MaxLevel)
2898 maxEntry = entry;
2899 }
2900
2901 return maxEntry;
2902}
2903
2905{
2906 for (PVPDifficultyEntry const* entry : sPVPDifficultyStore)
2907 if (entry->MapID == mapid && entry->GetBracketId() == id)
2908 return entry;
2909
2910 return nullptr;
2911}
2912
2914{
2916 if (_pvpTalentSlotUnlock[slot])
2917 {
2918 switch (class_)
2919 {
2920 case CLASS_DEATH_KNIGHT:
2921 return _pvpTalentSlotUnlock[slot]->DeathKnightLevelRequired;
2922 case CLASS_DEMON_HUNTER:
2923 return _pvpTalentSlotUnlock[slot]->DemonHunterLevelRequired;
2924 default:
2925 break;
2926 }
2927 return _pvpTalentSlotUnlock[slot]->LevelRequired;
2928 }
2929
2930 return 0;
2931}
2932
2934{
2935 int32 slots = 0;
2936 for (uint8 slot = 0; slot < MAX_PVP_TALENT_SLOTS; ++slot)
2937 if (level >= GetRequiredLevelForPvpTalentSlot(slot, class_))
2938 ++slots;
2939
2940 return slots;
2941}
2942
2943std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItems(uint32 questPackageID) const
2944{
2945 auto itr = _questPackages.find(questPackageID);
2946 if (itr != _questPackages.end())
2947 return &itr->second.first;
2948
2949 return nullptr;
2950}
2951
2952std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItemsFallback(uint32 questPackageID) const
2953{
2954 auto itr = _questPackages.find(questPackageID);
2955 if (itr != _questPackages.end())
2956 return &itr->second.second;
2957
2958 return nullptr;
2959}
2960
2962{
2963 QuestV2Entry const* v2 = sQuestV2Store.LookupEntry(questId);
2964 if (!v2)
2965 return 0;
2966
2967 return v2->UniqueBitFlag;
2968}
2969
2970std::vector<uint32> const* DB2Manager::GetPhasesForGroup(uint32 group) const
2971{
2972 return Trinity::Containers::MapGetValuePtr(_phasesByGroup, group);
2973}
2974
2976{
2977 ASSERT(power < MAX_POWERS);
2978 return _powerTypes[power];
2979}
2980
2981PowerTypeEntry const* DB2Manager::GetPowerTypeByName(std::string const& name) const
2982{
2983 for (PowerTypeEntry const* powerType : sPowerTypeStore)
2984 {
2985 std::string powerName = powerType->NameGlobalStringTag;
2986 strToLower(powerName);
2987 if (powerName == name)
2988 return powerType;
2989
2990 powerName.erase(std::remove(powerName.begin(), powerName.end(), '_'), powerName.end());
2991 if (powerName == name)
2992 return powerType;
2993 }
2994
2995 return nullptr;
2996}
2997
2998std::vector<RewardPackXCurrencyTypeEntry const*> const* DB2Manager::GetRewardPackCurrencyTypesByRewardID(uint32 rewardPackID) const
2999{
3000 return Trinity::Containers::MapGetValuePtr(_rewardPackCurrencyTypes, rewardPackID);
3001}
3002
3003std::vector<RewardPackXItemEntry const*> const* DB2Manager::GetRewardPackItemsByRewardID(uint32 rewardPackID) const
3004{
3005 return Trinity::Containers::MapGetValuePtr(_rewardPackItems, rewardPackID);
3006}
3007
3009{
3010 return Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesForShapeshifts, { race, gender, form });
3011}
3012
3013std::vector<SkillLineEntry const*> const* DB2Manager::GetSkillLinesForParentSkill(uint32 parentSkillId) const
3014{
3015 return Trinity::Containers::MapGetValuePtr(_skillLinesByParentSkillLine, parentSkillId);
3016}
3017
3018std::vector<SkillLineAbilityEntry const*> const* DB2Manager::GetSkillLineAbilitiesBySkill(uint32 skillId) const
3019{
3020 return Trinity::Containers::MapGetValuePtr(_skillLineAbilitiesBySkillupSkill, skillId);
3021}
3022
3024{
3025 for (auto&& [_, skllRaceClassInfo] : Trinity::Containers::MapEqualRange(_skillRaceClassInfoBySkill, skill))
3026 {
3027 if (!skllRaceClassInfo->RaceMask.IsEmpty() && !(skllRaceClassInfo->RaceMask.HasRace(race)))
3028 continue;
3029 if (skllRaceClassInfo->ClassMask && !(skllRaceClassInfo->ClassMask & (1 << (class_ - 1))))
3030 continue;
3031
3032 return skllRaceClassInfo;
3033 }
3034
3035 return nullptr;
3036}
3037
3038std::vector<SkillRaceClassInfoEntry const*> DB2Manager::GetSkillRaceClassInfo(uint32 skill) const
3039{
3040 std::vector<SkillRaceClassInfoEntry const*> result;
3041 for (auto const& [_, skillRaceClassInfo] : Trinity::Containers::MapEqualRange(_skillRaceClassInfoBySkill, skill))
3042 result.push_back(skillRaceClassInfo);
3043
3044 return result;
3045}
3046
3048{
3049 return Trinity::Containers::MapGetValuePtr(_soulbindConduitRanks, { soulbindConduitId, rank });
3050}
3051
3052std::vector<SpecializationSpellsEntry const*> const* DB2Manager::GetSpecializationSpells(uint32 specId) const
3053{
3054 return Trinity::Containers::MapGetValuePtr(_specializationSpellsBySpec, specId);
3055}
3056
3057bool DB2Manager::IsSpecSetMember(int32 specSetId, uint32 specId) const
3058{
3059 return _specsBySpecSet.count(std::make_pair(specSetId, specId)) > 0;
3060}
3061
3063{
3064 return _spellFamilyNames.count(family) > 0;
3065}
3066
3067std::vector<SpellProcsPerMinuteModEntry const*> DB2Manager::GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const
3068{
3069 auto itr = _spellProcsPerMinuteMods.find(spellprocsPerMinuteId);
3070 if (itr != _spellProcsPerMinuteMods.end())
3071 return itr->second;
3072
3073 return std::vector<SpellProcsPerMinuteModEntry const*>();
3074}
3075
3076std::vector<SpellVisualMissileEntry const*> const* DB2Manager::GetSpellVisualMissiles(int32 spellVisualMissileSetId) const
3077{
3078 return Trinity::Containers::MapGetValuePtr(_spellVisualMissilesBySet, spellVisualMissileSetId);
3079}
3080
3081std::vector<TalentEntry const*> const& DB2Manager::GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const
3082{
3083 return _talentsByPosition[class_][tier][column];
3084}
3085
3087{
3088 return Trinity::Containers::MapGetValuePtr(_taxiPaths, { from, to });
3089}
3090
3091bool DB2Manager::IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId, bool requireAllTotems /*= true*/)
3092{
3093 if (requiredTotemCategoryId == 0)
3094 return true;
3095 if (itemTotemCategoryId == 0)
3096 return false;
3097
3098 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(itemTotemCategoryId);
3099 if (!itemEntry)
3100 return false;
3101 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
3102 if (!reqEntry)
3103 return false;
3104
3105 if (itemEntry->TotemCategoryType != reqEntry->TotemCategoryType)
3106 return false;
3107
3108 int32 sharedMask = itemEntry->TotemCategoryMask & reqEntry->TotemCategoryMask;
3109 return requireAllTotems ? sharedMask == reqEntry->TotemCategoryMask : sharedMask != 0;
3110}
3111
3113{
3114 return _toys.count(toy) > 0;
3115}
3116
3118{
3120 // distances if inside
3121 struct
3122 {
3123 float DistanceToRegionCenterSquared = std::numeric_limits<float>::max();
3124 float DistanceToRegionBottom = std::numeric_limits<float>::max();
3126
3127 // distances if outside
3128 struct
3129 {
3130 float DistanceToRegionEdgeSquared = std::numeric_limits<float>::max();
3131 float DistanceToRegionTop = std::numeric_limits<float>::max();
3132 float DistanceToRegionBottom = std::numeric_limits<float>::max();
3134
3138
3139 bool IsInside() const
3140 {
3141 return Outside.DistanceToRegionEdgeSquared < std::numeric_limits<float>::epsilon() &&
3142 std::abs(Outside.DistanceToRegionTop) < std::numeric_limits<float>::epsilon() &&
3143 std::abs(Outside.DistanceToRegionBottom) < std::numeric_limits<float>::epsilon();
3144 }
3145};
3146
3147static bool operator<(UiMapAssignmentStatus const& left, UiMapAssignmentStatus const& right)
3148{
3149 bool leftInside = left.IsInside();
3150 bool rightInside = right.IsInside();
3151 if (leftInside != rightInside)
3152 return leftInside;
3153
3154 if (left.UiMapAssignment && right.UiMapAssignment &&
3158
3159 if (left.WmoPriority != right.WmoPriority)
3160 return left.WmoPriority < right.WmoPriority;
3161
3162 if (left.AreaPriority != right.AreaPriority)
3163 return left.AreaPriority < right.AreaPriority;
3164
3165 if (left.MapPriority != right.MapPriority)
3166 return left.MapPriority < right.MapPriority;
3167
3168 if (leftInside)
3169 {
3172
3173 float leftUiSizeX = left.UiMapAssignment ? (left.UiMapAssignment->UiMax.X - left.UiMapAssignment->UiMin.X) : 0.0f;
3174 float rightUiSizeX = right.UiMapAssignment ? (right.UiMapAssignment->UiMax.X - right.UiMapAssignment->UiMin.X) : 0.0f;
3175
3176 if (leftUiSizeX > std::numeric_limits<float>::epsilon() && rightUiSizeX > std::numeric_limits<float>::epsilon())
3177 {
3178 float leftScale = (left.UiMapAssignment->Region[1].X - left.UiMapAssignment->Region[0].X) / leftUiSizeX;
3179 float rightScale = (right.UiMapAssignment->Region[1].X - right.UiMapAssignment->Region[0].X) / rightUiSizeX;
3180 if (leftScale != rightScale)
3181 return leftScale < rightScale;
3182 }
3183
3186 }
3187 else
3188 {
3191
3194
3197 }
3198
3199 return true;
3200}
3201
3202static bool CheckUiMapAssignmentStatus(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId,
3203 UiMapAssignmentEntry const* uiMapAssignment, UiMapAssignmentStatus* status)
3204{
3205 status->UiMapAssignment = uiMapAssignment;
3206 // x,y not in region
3207 if (x < uiMapAssignment->Region[0].X || x > uiMapAssignment->Region[1].X || y < uiMapAssignment->Region[0].Y || y > uiMapAssignment->Region[1].Y)
3208 {
3209 float xDiff, yDiff;
3210 if (x >= uiMapAssignment->Region[0].X)
3211 {
3212 xDiff = 0.0f;
3213 if (x > uiMapAssignment->Region[1].X)
3214 xDiff = x - uiMapAssignment->Region[0].X;
3215 }
3216 else
3217 xDiff = uiMapAssignment->Region[0].X - x;
3218
3219 if (y >= uiMapAssignment->Region[0].Y)
3220 {
3221 yDiff = 0.0f;
3222 if (y > uiMapAssignment->Region[1].Y)
3223 yDiff = y - uiMapAssignment->Region[0].Y;
3224 }
3225 else
3226 yDiff = uiMapAssignment->Region[0].Y - y;
3227
3228 status->Outside.DistanceToRegionEdgeSquared = xDiff * xDiff + yDiff * yDiff;
3229 }
3230 else
3231 {
3233 (x - (uiMapAssignment->Region[0].X + uiMapAssignment->Region[1].X) * 0.5f) * (x - (uiMapAssignment->Region[0].X + uiMapAssignment->Region[1].X) * 0.5f)
3234 + (y - (uiMapAssignment->Region[0].Y + uiMapAssignment->Region[1].Y) * 0.5f) * (y - (uiMapAssignment->Region[0].Y + uiMapAssignment->Region[1].Y) * 0.5f);
3235 status->Outside.DistanceToRegionEdgeSquared = 0.0f;
3236 }
3237
3238 // z not in region
3239 if (z < uiMapAssignment->Region[0].Z || z > uiMapAssignment->Region[1].Z)
3240 {
3241 if (z < uiMapAssignment->Region[1].Z)
3242 {
3243 if (z < uiMapAssignment->Region[0].Z)
3244 status->Outside.DistanceToRegionBottom = std::min(uiMapAssignment->Region[0].Z - z, 10000.0f);
3245 }
3246 else
3247 status->Outside.DistanceToRegionTop = std::min(z - uiMapAssignment->Region[1].Z, 10000.0f);
3248 }
3249 else
3250 {
3251 status->Outside.DistanceToRegionTop = 0.0f;
3252 status->Outside.DistanceToRegionBottom = 0.0f;
3253 status->Inside.DistanceToRegionBottom = std::min(uiMapAssignment->Region[0].Z - z, 10000.0f);
3254 }
3255
3256 if (areaId && uiMapAssignment->AreaID)
3257 {
3258 int8 areaPriority = 0;
3259 while (areaId != uiMapAssignment->AreaID)
3260 {
3261 if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId))
3262 {
3263 areaId = areaEntry->ParentAreaID;
3264 ++areaPriority;
3265 }
3266 else
3267 return false;
3268 }
3269
3270 status->AreaPriority = areaPriority;
3271 }
3272
3273 if (mapId >= 0 && uiMapAssignment->MapID >= 0)
3274 {
3275 if (mapId != uiMapAssignment->MapID)
3276 {
3277 if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
3278 {
3279 if (mapEntry->ParentMapID == uiMapAssignment->MapID)
3280 status->MapPriority = 1;
3281 else if (mapEntry->CosmeticParentMapID == uiMapAssignment->MapID)
3282 status->MapPriority = 2;
3283 else
3284 return false;
3285 }
3286 else
3287 return false;
3288 }
3289 else
3290 status->MapPriority = 0;
3291 }
3292
3293 if (wmoGroupId || wmoDoodadPlacementId)
3294 {
3295 if (uiMapAssignment->WmoGroupID || uiMapAssignment->WmoDoodadPlacementID)
3296 {
3297 bool hasDoodadPlacement = false;
3298 if (wmoDoodadPlacementId && uiMapAssignment->WmoDoodadPlacementID)
3299 {
3300 if (wmoDoodadPlacementId != uiMapAssignment->WmoDoodadPlacementID)
3301 return false;
3302
3303 hasDoodadPlacement = true;
3304 }
3305
3306 if (wmoGroupId && uiMapAssignment->WmoGroupID)
3307 {
3308 if (wmoGroupId != uiMapAssignment->WmoGroupID)
3309 return false;
3310
3311 if (hasDoodadPlacement)
3312 status->WmoPriority = 0;
3313 else
3314 status->WmoPriority = 2;
3315 }
3316 else if (hasDoodadPlacement)
3317 status->WmoPriority = 1;
3318 }
3319 }
3320
3321 return true;
3322}
3323
3324static UiMapAssignmentEntry const* FindNearestMapAssignment(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system)
3325{
3326 UiMapAssignmentStatus nearestMapAssignment;
3327 auto iterateUiMapAssignments = [&](std::unordered_multimap<int32, UiMapAssignmentEntry const*> const& assignments, int32 id)
3328 {
3329 for (auto assignment : Trinity::Containers::MapEqualRange(assignments, id))
3330 {
3331 UiMapAssignmentStatus status;
3332 if (CheckUiMapAssignmentStatus(x, y, z, mapId, areaId, wmoDoodadPlacementId, wmoGroupId, assignment.second, &status))
3333 if (status < nearestMapAssignment)
3334 nearestMapAssignment = status;
3335 }
3336 };
3337
3338 iterateUiMapAssignments(_uiMapAssignmentByWmoGroup[system], wmoGroupId);
3339 iterateUiMapAssignments(_uiMapAssignmentByWmoDoodadPlacement[system], wmoDoodadPlacementId);
3340
3341 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
3342 while (areaEntry)
3343 {
3344 iterateUiMapAssignments(_uiMapAssignmentByArea[system], areaEntry->ID);
3345 areaEntry = sAreaTableStore.LookupEntry(areaEntry->ParentAreaID);
3346 }
3347
3348 if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
3349 {
3350 iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->ID);
3351 if (mapEntry->ParentMapID >= 0)
3352 iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->ParentMapID);
3353 if (mapEntry->CosmeticParentMapID >= 0)
3354 iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->CosmeticParentMapID);
3355 }
3356
3357 return nearestMapAssignment.UiMapAssignment;
3358}
3359
3361{
3362 UiMapEntry const* uiMap = sUiMapStore.LookupEntry(uiMapID);
3363 while (uiMap)
3364 {
3365 if (uiMap->Type <= UI_MAP_TYPE_CONTINENT)
3366 break;
3367
3368 UiMapBounds const* bounds = Trinity::Containers::MapGetValuePtr(_uiMapBounds, uiMap->ID);
3369 if (!bounds || !bounds->IsUiAssignment)
3370 break;
3371
3372 uiPosition.X = ((1.0 - uiPosition.X) * bounds->Bounds[1]) + (bounds->Bounds[3] * uiPosition.X);
3373 uiPosition.Y = ((1.0 - uiPosition.Y) * bounds->Bounds[0]) + (bounds->Bounds[2] * uiPosition.Y);
3374
3375 uiMap = sUiMapStore.LookupEntry(uiMap->ParentUiMapID);
3376 }
3377
3378 return uiPosition;
3379}
3380
3381bool DB2Manager::GetUiMapPosition(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system, bool local,
3382 uint32* uiMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/)
3383{
3384 if (uiMapId)
3385 *uiMapId = -1;
3386
3387 if (newPos)
3388 {
3389 newPos->X = 0.0f;
3390 newPos->Y = 0.0f;
3391 }
3392
3393 UiMapAssignmentEntry const* uiMapAssignment = FindNearestMapAssignment(x, y, z, mapId, areaId, wmoDoodadPlacementId, wmoGroupId, system);
3394 if (!uiMapAssignment)
3395 return false;
3396
3397 if (uiMapId)
3398 *uiMapId = uiMapAssignment->UiMapID;
3399
3400 DBCPosition2D relativePosition{ 0.5f, 0.5f };
3401 DBCPosition2D regionSize{ uiMapAssignment->Region[1].X - uiMapAssignment->Region[0].X, uiMapAssignment->Region[1].Y - uiMapAssignment->Region[0].Y };
3402 if (regionSize.X > 0.0f)
3403 relativePosition.X = (x - uiMapAssignment->Region[0].X) / regionSize.X;
3404 if (regionSize.Y > 0.0f)
3405 relativePosition.Y = (y - uiMapAssignment->Region[0].Y) / regionSize.Y;
3406
3407 DBCPosition2D uiPosition
3408 {
3409 // x and y are swapped
3410 ((1.0f - (1.0f - relativePosition.Y)) * uiMapAssignment->UiMin.X) + ((1.0f - relativePosition.Y) * uiMapAssignment->UiMax.X),
3411 ((1.0f - (1.0f - relativePosition.X)) * uiMapAssignment->UiMin.Y) + ((1.0f - relativePosition.X) * uiMapAssignment->UiMax.Y)
3412 };
3413
3414 if (!local)
3415 uiPosition = CalculateGlobalUiMapPosition(uiMapAssignment->UiMapID, uiPosition);
3416
3417 if (newPos)
3418 *newPos = uiPosition;
3419
3420 return true;
3421}
3422
3423bool DB2Manager::Zone2MapCoordinates(uint32 areaId, float& x, float& y) const
3424{
3425 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
3426 if (!areaEntry)
3427 return false;
3428
3429 for (auto assignment : Trinity::Containers::MapEqualRange(_uiMapAssignmentByArea[UI_MAP_SYSTEM_WORLD], areaId))
3430 {
3431 if (assignment.second->MapID >= 0 && assignment.second->MapID != areaEntry->ContinentID)
3432 continue;
3433
3434 float tmpY = (y - assignment.second->UiMax.Y) / (assignment.second->UiMin.Y - assignment.second->UiMax.Y);
3435 float tmpX = (x - assignment.second->UiMax.X) / (assignment.second->UiMin.X - assignment.second->UiMax.X);
3436 x = assignment.second->Region[0].X + tmpY * (assignment.second->Region[1].X - assignment.second->Region[0].X);
3437 y = assignment.second->Region[0].Y + tmpX * (assignment.second->Region[1].Y - assignment.second->Region[0].Y);
3438
3439 return true;
3440 }
3441
3442 return false;
3443}
3444
3445void DB2Manager::Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const
3446{
3447 DBCPosition2D zoneCoords;
3448 if (!GetUiMapPosition(x, y, 0.0f, -1, areaId, 0, 0, UI_MAP_SYSTEM_WORLD, true, nullptr, &zoneCoords))
3449 return;
3450
3451 x = zoneCoords.Y * 100.0f;
3452 y = zoneCoords.X * 100.0f;
3453}
3454
3456{
3457 return _uiMapPhases.find(phaseId) != _uiMapPhases.end();
3458}
3459
3460WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId, bool allowGroupFallback)
3461{
3462 WMOAreaTableEntry const* wmoAreaTableEntry = Trinity::Containers::MapGetValuePtr(_wmoAreaTableLookup, WMOAreaTableKey(int16(rootId), int8(adtId), groupId));
3463 if (!wmoAreaTableEntry && allowGroupFallback)
3464 wmoAreaTableEntry = Trinity::Containers::MapGetValuePtr(_wmoAreaTableLookup, WMOAreaTableKey(int16(rootId), int8(adtId), -1));
3465
3466 return wmoAreaTableEntry;
3467}
3468
3469std::unordered_set<uint32> const* DB2Manager::GetPVPStatIDsForMap(uint32 mapId) const
3470{
3471 return Trinity::Containers::MapGetValuePtr(_pvpStatIdsByMap, mapId);
3472}
3473
3474bool ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerTypesEntry const* left, ChrClassesXPowerTypesEntry const* right)
3475{
3476 if (left->ClassID != right->ClassID)
3477 return left->ClassID < right->ClassID;
3478 return left->PowerType < right->PowerType;
3479}
3480
3482{
3483 if (sTaxiNodesStore.GetNumRows())
3484 {
3485 _data.resize((sTaxiNodesStore.GetNumRows() + (8 * sizeof(uint64) - 1)) / (8 * sizeof(uint64)) * (sizeof(uint64) / sizeof(value_type)), 0);
3486 ASSERT((_data.size() % 8) == 0, "TaxiMask size must be aligned to a multiple of uint64");
3487 }
3488}
3489
3490bool DB2Manager::FriendshipRepReactionEntryComparator::Compare(FriendshipRepReactionEntry const* left, FriendshipRepReactionEntry const* right)
3491{
3492 return left->ReactionThreshold < right->ReactionThreshold;
3493}
3494
3495bool DB2Manager::MountTypeXCapabilityEntryComparator::Compare(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right)
3496{
3497 if (left->MountTypeID == right->MountTypeID)
3498 return left->OrderIndex < right->OrderIndex;
3499 return left->MountTypeID < right->MountTypeID;
3500}
char const * localeNames[TOTAL_LOCALES]
Definition Common.cpp:20
LocaleConstant GetLocaleByName(std::string_view name)
Definition Common.cpp:36
CascLocaleBit WowLocaleToCascLocaleBit[TOTAL_LOCALES]
Definition Common.cpp:45
LocaleConstant
Definition Common.h:51
@ LOCALE_none
Definition Common.h:61
@ TOTAL_LOCALES
Definition Common.h:65
@ LOCALE_enUS
Definition Common.h:52
@ LOCALE_koKR
Definition Common.h:53
constexpr bool IsValidLocale(LocaleConstant locale)
Definition Common.h:98
CascLocaleBit
Definition Common.h:72
#define DEFAULT_LOCALE
Definition Common.h:69
#define M_PI
Definition Common.h:118
DB2Storage< UISplashScreenEntry > sUISplashScreenStore("UISplashScreen.db2", &UiSplashScreenLoadInfo::Instance)
DB2Storage< LightEntry > sLightStore("Light.db2", &LightLoadInfo::Instance)
DB2Storage< PlayerDataElementCharacterEntry > sPlayerDataElementCharacterStore("PlayerDataElementCharacter.db2", &PlayerDataElementCharacterLoadInfo::Instance)
DB2Storage< AzeritePowerSetMemberEntry > sAzeritePowerSetMemberStore("AzeritePowerSetMember.db2", &AzeritePowerSetMemberLoadInfo::Instance)
DB2Storage< QuestFactionRewardEntry > sQuestFactionRewardStore("QuestFactionReward.db2", &QuestFactionRewardLoadInfo::Instance)
DB2Storage< PhaseEntry > sPhaseStore("Phase.db2", &PhaseLoadInfo::Instance)
DB2Storage< ArtifactAppearanceEntry > sArtifactAppearanceStore("ArtifactAppearance.db2", &ArtifactAppearanceLoadInfo::Instance)
DB2Storage< SkillRaceClassInfoEntry > sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", &SkillRaceClassInfoLoadInfo::Instance)
DB2Storage< ItemNameDescriptionEntry > sItemNameDescriptionStore("ItemNameDescription.db2", &ItemNameDescriptionLoadInfo::Instance)
DB2Storage< ChrRaceXChrModelEntry > sChrRaceXChrModelStore("ChrRaceXChrModel.db2", &ChrRaceXChrModelLoadInfo::Instance)
DB2Storage< ItemLimitCategoryEntry > sItemLimitCategoryStore("ItemLimitCategory.db2", &ItemLimitCategoryLoadInfo::Instance)
DB2Storage< DifficultyEntry > sDifficultyStore("Difficulty.db2", &DifficultyLoadInfo::Instance)
DB2Storage< WorldMapOverlayEntry > sWorldMapOverlayStore("WorldMapOverlay.db2", &WorldMapOverlayLoadInfo::Instance)
ChrSpecializationEntry const * ChrSpecializationByIndexContainer[MAX_CLASSES+1][MAX_SPECIALIZATIONS]
DB2Storage< PlayerDataElementAccountEntry > sPlayerDataElementAccountStore("PlayerDataElementAccount.db2", &PlayerDataElementAccountLoadInfo::Instance)
DB2Storage< ItemModifiedAppearanceExtraEntry > sItemModifiedAppearanceExtraStore("ItemModifiedAppearanceExtra.db2", &ItemModifiedAppearanceExtraLoadInfo::Instance)
DB2Storage< ItemDamageTwoHandCasterEntry > sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", &ItemDamageTwoHandCasterLoadInfo::Instance)
DB2Storage< ItemLevelSelectorEntry > sItemLevelSelectorStore("ItemLevelSelector.db2", &ItemLevelSelectorLoadInfo::Instance)
DB2Storage< NamesReservedEntry > sNamesReservedStore("NamesReserved.db2", &NamesReservedLoadInfo::Instance)
DB2Storage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", &GameobjectDisplayInfoLoadInfo::Instance)
DB2Storage< SceneScriptEntry > sSceneScriptStore("SceneScript.db2", &SceneScriptLoadInfo::Instance)
DB2Storage< CharacterLoadoutEntry > sCharacterLoadoutStore("CharacterLoadout.db2", &CharacterLoadoutLoadInfo::Instance)
DB2Storage< SpellVisualEntry > sSpellVisualStore("SpellVisual.db2", &SpellVisualLoadInfo::Instance)
DB2Storage< ItemEntry > sItemStore("Item.db2", &ItemLoadInfo::Instance)
DB2Storage< Achievement_CategoryEntry > sAchievementCategoryStore("Achievement_Category.db2", &AchievementCategoryLoadInfo::Instance)
DB2Storage< ItemSearchNameEntry > sItemSearchNameStore("ItemSearchName.db2", &ItemSearchNameLoadInfo::Instance)
DB2Storage< PhaseXPhaseGroupEntry > sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", &PhaseXPhaseGroupLoadInfo::Instance)
DB2Storage< BattlemasterListEntry > sBattlemasterListStore("BattlemasterList.db2", &BattlemasterListLoadInfo::Instance)
DB2Storage< TraitCondAccountElementEntry > sTraitCondAccountElementStore("TraitCondAccountElement.db2", &TraitCondAccountElementLoadInfo::Instance)
DB2Storage< PathEntry > sPathStore("Path.db2", &PathLoadInfo::Instance)
DB2Storage< TransmogOutfitSlotInfoEntry > sTransmogOutfitSlotInfoStore("TransmogOutfitSlotInfo.db2", &TransmogOutfitSlotInfoLoadInfo::Instance)
TaxiMask sAllianceTaxiNodesMask
std::unordered_map< uint32, std::vector< DBCPosition2D > > CurvePointsContainer
DB2Storage< AzeriteEssencePowerEntry > sAzeriteEssencePowerStore("AzeriteEssencePower.db2", &AzeriteEssencePowerLoadInfo::Instance)
DB2Storage< SpellInterruptsEntry > sSpellInterruptsStore("SpellInterrupts.db2", &SpellInterruptsLoadInfo::Instance)
DB2Storage< TraitCurrencySourceEntry > sTraitCurrencySourceStore("TraitCurrencySource.db2", &TraitCurrencySourceLoadInfo::Instance)
DB2Storage< SkillLineEntry > sSkillLineStore("SkillLine.db2", &SkillLineLoadInfo::Instance)
DB2Storage< TraitTreeXTraitCostEntry > sTraitTreeXTraitCostStore("TraitTreeXTraitCost.db2", &TraitTreeXTraitCostLoadInfo::Instance)
DB2Storage< OverrideSpellDataEntry > sOverrideSpellDataStore("OverrideSpellData.db2", &OverrideSpellDataLoadInfo::Instance)
DB2Storage< AnimationDataEntry > sAnimationDataStore("AnimationData.db2", &AnimationDataLoadInfo::Instance)
DB2Storage< FriendshipReputationEntry > sFriendshipReputationStore("FriendshipReputation.db2", &FriendshipReputationLoadInfo::Instance)
DB2Storage< BattlePetBreedQualityEntry > sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", &BattlePetBreedQualityLoadInfo::Instance)
DB2Storage< EmotesTextEntry > sEmotesTextStore("EmotesText.db2", &EmotesTextLoadInfo::Instance)
DB2Storage< ArtifactEntry > sArtifactStore("Artifact.db2", &ArtifactLoadInfo::Instance)
DB2Storage< ArtifactPowerPickerEntry > sArtifactPowerPickerStore("ArtifactPowerPicker.db2", &ArtifactPowerPickerLoadInfo::Instance)
DB2Storage< TraitNodeGroupXTraitCondEntry > sTraitNodeGroupXTraitCondStore("TraitNodeGroupXTraitCond.db2", &TraitNodeGroupXTraitCondLoadInfo::Instance)
std::unordered_map< uint32, HeirloomEntry const * > HeirloomItemsContainer
DB2Storage< ArtifactQuestXPEntry > sArtifactQuestXPStore("ArtifactQuestXP.db2", &ArtifactQuestXpLoadInfo::Instance)
DB2Storage< JournalEncounterSectionEntry > sJournalEncounterSectionStore("JournalEncounterSection.db2", &JournalEncounterSectionLoadInfo::Instance)
DB2Storage< BattlePetBreedStateEntry > sBattlePetBreedStateStore("BattlePetBreedState.db2", &BattlePetBreedStateLoadInfo::Instance)
static DBCPosition2D CalculateGlobalUiMapPosition(uint32 uiMapID, DBCPosition2D uiPosition)
DB2Storage< PVPStatEntry > sPVPStatStore("PVPStat.db2", &PvpStatLoadInfo::Instance)
std::unordered_map< uint32, ItemChildEquipmentEntry const * > ItemChildEquipmentContainer
DB2Storage< PvpTalentCategoryEntry > sPvpTalentCategoryStore("PvpTalentCategory.db2", &PvpTalentCategoryLoadInfo::Instance)
DB2Storage< ItemBonusTreeEntry > sItemBonusTreeStore("ItemBonusTree.db2", &ItemBonusTreeLoadInfo::Instance)
DB2Storage< TransmogOutfitSlotOptionEntry > sTransmogOutfitSlotOptionInfoStore("TransmogOutfitSlotOption.db2", &TransmogOutfitSlotOptionLoadInfo::Instance)
DB2Storage< RandPropPointsEntry > sRandPropPointsStore("RandPropPoints.db2", &RandPropPointsLoadInfo::Instance)
DB2Storage< ItemBagFamilyEntry > sItemBagFamilyStore("ItemBagFamily.db2", &ItemBagFamilyLoadInfo::Instance)
DB2Storage< TransmogSituationEntry > sTransmogSituationStore("TransmogSituation.db2", &TransmogSituationLoadInfo::Instance)
DB2Storage< GameObjectsEntry > sGameObjectsStore("GameObjects.db2", &GameobjectsLoadInfo::Instance)
DB2Storage< SpellAuraOptionsEntry > sSpellAuraOptionsStore("SpellAuraOptions.db2", &SpellAuraOptionsLoadInfo::Instance)
std::unordered_map< uint32, std::unordered_map< uint32, std::vector< SpellPowerEntry const * > > > SpellPowerDifficultyContainer
DB2Storage< TraitNodeGroupXTraitNodeEntry > sTraitNodeGroupXTraitNodeStore("TraitNodeGroupXTraitNode.db2", &TraitNodeGroupXTraitNodeLoadInfo::Instance)
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
DB2Storage< AchievementEntry > sAchievementStore("Achievement.db2", &AchievementLoadInfo::Instance)
DB2Storage< ImportPriceWeaponEntry > sImportPriceWeaponStore("ImportPriceWeapon.db2", &ImportPriceWeaponLoadInfo::Instance)
DB2Storage< FriendshipRepReactionEntry > sFriendshipRepReactionStore("FriendshipRepReaction.db2", &FriendshipRepReactionLoadInfo::Instance)
DB2Storage< GarrMissionEntry > sGarrMissionStore("GarrMission.db2", &GarrMissionLoadInfo::Instance)
DB2Storage< SpellNameEntry > sSpellNameStore("SpellName.db2", &SpellNameLoadInfo::Instance)
DB2Storage< CurveEntry > sCurveStore("Curve.db2", &CurveLoadInfo::Instance)
DB2Storage< PvpSeasonEntry > sPvpSeasonStore("PvpSeason.db2", &PvpSeasonLoadInfo::Instance)
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
DB2Storage< TraitNodeEntry > sTraitNodeStore("TraitNode.db2", &TraitNodeLoadInfo::Instance)
DB2Storage< TaxiNodesEntry > sTaxiNodesStore("TaxiNodes.db2", &TaxiNodesLoadInfo::Instance)
DB2Storage< TransmogOutfitEntryEntry > sTransmogOutfitEntryStore("TransmogOutfitEntry.db2", &TransmogOutfitEntryLoadInfo::Instance)
DB2Storage< CreatureModelDataEntry > sCreatureModelDataStore("CreatureModelData.db2", &CreatureModelDataLoadInfo::Instance)
DB2Storage< LiquidTypeEntry > sLiquidTypeStore("LiquidType.db2", &LiquidTypeLoadInfo::Instance)
std::vector< MapDifficultyEntry const * > MapDifficultyContainer
DB2Storage< ConditionalChrModelEntry > sConditionalChrModelStore("ConditionalChrModel.db2", &ConditionalChrModelLoadInfo::Instance)
DB2Storage< CreatureFamilyEntry > sCreatureFamilyStore("CreatureFamily.db2", &CreatureFamilyLoadInfo::Instance)
std::map< uint32, DB2StorageBase * > StorageMap
DB2Storage< CurvePointEntry > sCurvePointStore("CurvePoint.db2", &CurvePointLoadInfo::Instance)
DB2Storage< SpellXSpellVisualEntry > sSpellXSpellVisualStore("SpellXSpellVisual.db2", &SpellXSpellVisualLoadInfo::Instance)
DB2Storage< CharacterLoadoutItemEntry > sCharacterLoadoutItemStore("CharacterLoadoutItem.db2", &CharacterLoadoutItemLoadInfo::Instance)
DB2Storage< AnimKitEntry > sAnimKitStore("AnimKit.db2", &AnimKitLoadInfo::Instance)
DB2Storage< MapDifficultyEntry > sMapDifficultyStore("MapDifficulty.db2", &MapDifficultyLoadInfo::Instance)
DB2Storage< SpellEquippedItemsEntry > sSpellEquippedItemsStore("SpellEquippedItems.db2", &SpellEquippedItemsLoadInfo::Instance)
DB2Storage< ItemBonusEntry > sItemBonusStore("ItemBonus.db2", &ItemBonusLoadInfo::Instance)
DB2Storage< UiMapLinkEntry > sUiMapLinkStore("UiMapLink.db2", &UiMapLinkLoadInfo::Instance)
static UiMapAssignmentEntry const * FindNearestMapAssignment(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system)
static bool CheckUiMapAssignmentStatus(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapAssignmentEntry const *uiMapAssignment, UiMapAssignmentStatus *status)
DB2Storage< UnitPowerBarEntry > sUnitPowerBarStore("UnitPowerBar.db2", &UnitPowerBarLoadInfo::Instance)
TaxiMask sTaxiNodesMask
DB2Storage< SpellReagentsEntry > sSpellReagentsStore("SpellReagents.db2", &SpellReagentsLoadInfo::Instance)
DB2Storage< LanguageWordsEntry > sLanguageWordsStore("LanguageWords.db2", &LanguageWordsLoadInfo::Instance)
DB2Storage< SkillLineXTraitTreeEntry > sSkillLineXTraitTreeStore("SkillLineXTraitTree.db2", &SkillLineXTraitTreeLoadInfo::Instance)
std::unordered_map< uint32, std::vector< uint32 > > ArtifactPowerLinksContainer
DB2Storage< TraitCostEntry > sTraitCostStore("TraitCost.db2", &TraitCostLoadInfo::Instance)
DB2Storage< ArtifactCategoryEntry > sArtifactCategoryStore("ArtifactCategory.db2", &ArtifactCategoryLoadInfo::Instance)
DB2Storage< ServerMessagesEntry > sServerMessagesStore("ServerMessages.db2", &ServerMessagesLoadInfo::Instance)
DB2Storage< ItemChildEquipmentEntry > sItemChildEquipmentStore("ItemChildEquipment.db2", &ItemChildEquipmentLoadInfo::Instance)
DB2Storage< SpecSetMemberEntry > sSpecSetMemberStore("SpecSetMember.db2", &SpecSetMemberLoadInfo::Instance)
DB2Storage< GarrBuildingPlotInstEntry > sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", &GarrBuildingPlotInstLoadInfo::Instance)
DB2Storage< ItemBonusTreeNodeEntry > sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", &ItemBonusTreeNodeLoadInfo::Instance)
DB2Storage< CreatureLabelEntry > sCreatureLabelStore("CreatureLabel.db2", &CreatureLabelLoadInfo::Instance)
DB2Storage< ChrCustomizationOptionEntry > sChrCustomizationOptionStore("ChrCustomizationOption.db2", &ChrCustomizationOptionLoadInfo::Instance)
DB2Storage< ItemSpecOverrideEntry > sItemSpecOverrideStore("ItemSpecOverride.db2", &ItemSpecOverrideLoadInfo::Instance)
DB2Storage< CreatureTypeEntry > sCreatureTypeStore("CreatureType.db2", &CreatureTypeLoadInfo::Instance)
DB2Storage< DurabilityQualityEntry > sDurabilityQualityStore("DurabilityQuality.db2", &DurabilityQualityLoadInfo::Instance)
DB2Storage< AreaTriggerActionSetEntry > sAreaTriggerActionSetStore("AreaTriggerActionSet.db2", &AreaTriggerActionSetLoadInfo::Instance)
DB2Storage< ChrCustomizationElementEntry > sChrCustomizationElementStore("ChrCustomizationElement.db2", &ChrCustomizationElementLoadInfo::Instance)
DB2Storage< SpellPowerDifficultyEntry > sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", &SpellPowerDifficultyLoadInfo::Instance)
DB2Storage< ArtifactPowerEntry > sArtifactPowerStore("ArtifactPower.db2", &ArtifactPowerLoadInfo::Instance)
DB2Storage< TraitTreeLoadoutEntry > sTraitTreeLoadoutStore("TraitTreeLoadout.db2", &TraitTreeLoadoutLoadInfo::Instance)
DB2Storage< CriteriaEntry > sCriteriaStore("Criteria.db2", &CriteriaLoadInfo::Instance)
TaxiPathNodesByPath sTaxiPathNodesByPath
DB2Storage< ChallengeModeItemBonusOverrideEntry > sChallengeModeItemBonusOverrideStore("ChallengeModeItemBonusOverride.db2", &ChallengeModeItemBonusOverrideLoadInfo::Instance)
DB2Storage< AzeriteItemMilestonePowerEntry > sAzeriteItemMilestonePowerStore("AzeriteItemMilestonePower.db2", &AzeriteItemMilestonePowerLoadInfo::Instance)
std::pair< uint32, int32 > HotfixBlobKey
DB2Storage< QuestMoneyRewardEntry > sQuestMoneyRewardStore("QuestMoneyReward.db2", &QuestMoneyRewardLoadInfo::Instance)
DB2Storage< ItemXItemEffectEntry > sItemXItemEffectStore("ItemXItemEffect.db2", &ItemXItemEffectLoadInfo::Instance)
DB2Storage< ScenarioEntry > sScenarioStore("Scenario.db2", &ScenarioLoadInfo::Instance)
DB2Storage< TraitNodeXTraitNodeEntryEntry > sTraitNodeXTraitNodeEntryStore("TraitNodeXTraitNodeEntry.db2", &TraitNodeXTraitNodeEntryLoadInfo::Instance)
std::unordered_map< uint32, std::vector< ChrSpecialization > > GlyphRequiredSpecsContainer
DB2Storage< JournalInstanceEntry > sJournalInstanceStore("JournalInstance.db2", &JournalInstanceLoadInfo::Instance)
DB2Storage< ItemDamageOneHandEntry > sItemDamageOneHandStore("ItemDamageOneHand.db2", &ItemDamageOneHandLoadInfo::Instance)
DB2Storage< TransmogIllusionEntry > sTransmogIllusionStore("TransmogIllusion.db2", &TransmogIllusionLoadInfo::Instance)
std::unordered_map< uint32, std::vector< ItemSpecOverrideEntry const * > > ItemSpecOverridesContainer
static CurveInterpolationMode DetermineCurveType(CurveEntry const *curve, std::vector< DBCPosition2D > const &points)
DB2Storage< TransmogSetEntry > sTransmogSetStore("TransmogSet.db2", &TransmogSetLoadInfo::Instance)
DB2Storage< GuildColorEmblemEntry > sGuildColorEmblemStore("GuildColorEmblem.db2", &GuildColorEmblemLoadInfo::Instance)
DB2Storage< GarrBuildingEntry > sGarrBuildingStore("GarrBuilding.db2", &GarrBuildingLoadInfo::Instance)
DB2Storage< TraitNodeGroupXTraitCostEntry > sTraitNodeGroupXTraitCostStore("TraitNodeGroupXTraitCost.db2", &TraitNodeGroupXTraitCostLoadInfo::Instance)
DB2Storage< AzeriteKnowledgeMultiplierEntry > sAzeriteKnowledgeMultiplierStore("AzeriteKnowledgeMultiplier.db2", &AzeriteKnowledgeMultiplierLoadInfo::Instance)
DB2Storage< ModifiedCraftingItemEntry > sModifiedCraftingItemStore("ModifiedCraftingItem.db2", &ModifiedCraftingItemLoadInfo::Instance)
DB2Storage< SpecializationSpellsEntry > sSpecializationSpellsStore("SpecializationSpells.db2", &SpecializationSpellsLoadInfo::Instance)
std::map< WMOAreaTableKey, WMOAreaTableEntry const * > WMOAreaTableLookupContainer
std::unordered_map< uint32, DB2Manager::MountTypeXCapabilitySet > MountCapabilitiesByTypeContainer
DB2Storage< GarrFollowerXAbilityEntry > sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", &GarrFollowerXAbilityLoadInfo::Instance)
DB2Storage< QuestInfoEntry > sQuestInfoStore("QuestInfo.db2", &QuestInfoLoadInfo::Instance)
DB2Storage< ItemArmorTotalEntry > sItemArmorTotalStore("ItemArmorTotal.db2", &ItemArmorTotalLoadInfo::Instance)
DB2Storage< ChrModelEntry > sChrModelStore("ChrModel.db2", &ChrModelLoadInfo::Instance)
std::unordered_map< uint32, std::vector< SpecializationSpellsEntry const * > > SpecializationSpellsContainer
DB2Storage< TraitTreeEntry > sTraitTreeStore("TraitTree.db2", &TraitTreeLoadInfo::Instance)
DB2Storage< GarrTalentTreeEntry > sGarrTalentTreeStore("GarrTalentTree.db2", &GarrTalentTreeLoadInfo::Instance)
DB2Storage< TransportRotationEntry > sTransportRotationStore("TransportRotation.db2", &TransportRotationLoadInfo::Instance)
DB2Storage< SpellRangeEntry > sSpellRangeStore("SpellRange.db2", &SpellRangeLoadInfo::Instance)
DB2Storage< ItemLevelSelectorQualityEntry > sItemLevelSelectorQualityStore("ItemLevelSelectorQuality.db2", &ItemLevelSelectorQualityLoadInfo::Instance)
DB2Storage< ItemScalingConfigEntry > sItemScalingConfigStore("ItemScalingConfig.db2", &ItemScalingConfigLoadInfo::Instance)
DB2Storage< RewardPackXItemEntry > sRewardPackXItemStore("RewardPackXItem.db2", &RewardPackXItemLoadInfo::Instance)
DB2Storage< EmotesTextSoundEntry > sEmotesTextSoundStore("EmotesTextSound.db2", &EmotesTextSoundLoadInfo::Instance)
std::array< PowerTypeEntry const *, MAX_POWERS > PowerTypesContainer
bool ValidateBroadcastTextTactKeyOptionalData(std::vector< uint8 > const &data)
DB2Storage< ChrClassesEntry > sChrClassesStore("ChrClasses.db2", &ChrClassesLoadInfo::Instance)
DB2Storage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", &SpellShapeshiftFormLoadInfo::Instance)
DB2Storage< ItemPriceBaseEntry > sItemPriceBaseStore("ItemPriceBase.db2", &ItemPriceBaseLoadInfo::Instance)
DB2Storage< GlobalCurveEntry > sGlobalCurveStore("GlobalCurve.db2", &GlobalCurveLoadInfo::Instance)
DB2Storage< CampaignEntry > sCampaignStore("Campaign.db2", &CampaignLoadInfo::Instance)
DB2Storage< ModifierTreeEntry > sModifierTreeStore("ModifierTree.db2", &ModifierTreeLoadInfo::Instance)
std::unordered_map< uint32, std::vector< uint32 > > FactionTeamContainer
DB2Storage< SpellAuraRestrictionsEntry > sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", &SpellAuraRestrictionsLoadInfo::Instance)
DB2Storage< MountEntry > sMountStore("Mount.db2", &MountLoadInfo::Instance)
DB2Storage< VehicleSeatEntry > sVehicleSeatStore("VehicleSeat.db2", &VehicleSeatLoadInfo::Instance)
DB2Storage< ChrCustomizationDisplayInfoEntry > sChrCustomizationDisplayInfoStore("ChrCustomizationDisplayInfo.db2", &ChrCustomizationDisplayInfoLoadInfo::Instance)
std::unordered_map< uint32, std::vector< SpellProcsPerMinuteModEntry const * > > SpellProcsPerMinuteModContainer
DB2Storage< ArtifactPowerRankEntry > sArtifactPowerRankStore("ArtifactPowerRank.db2", &ArtifactPowerRankLoadInfo::Instance)
DB2Storage< DestructibleModelDataEntry > sDestructibleModelDataStore("DestructibleModelData.db2", &DestructibleModelDataLoadInfo::Instance)
DB2Storage< SpellShapeshiftEntry > sSpellShapeshiftStore("SpellShapeshift.db2", &SpellShapeshiftLoadInfo::Instance)
DB2Storage< CampaignXQuestLineEntry > sCampaignXQuestLineStore("CampaignXQuestLine.db2", &CampaignXQuestLineLoadInfo::Instance)
DB2Storage< GarrSiteLevelPlotInstEntry > sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", &GarrSiteLevelPlotInstLoadInfo::Instance)
TaxiMask sOldContinentsNodesMask
DB2Storage< MountEquipmentEntry > sMountEquipmentStore("MountEquipment.db2", &MountEquipmentLoadInfo::Instance)
DB2Storage< SpellVisualEffectNameEntry > sSpellVisualEffectNameStore("SpellVisualEffectName.db2", &SpellVisualEffectNameLoadInfo::Instance)
DB2Storage< SpellMiscEntry > sSpellMiscStore("SpellMisc.db2", &SpellMiscLoadInfo::Instance)
DB2Storage< WorldStateExpressionEntry > sWorldStateExpressionStore("WorldStateExpression.db2", &WorldStateExpressionLoadInfo::Instance)
DB2Storage< GarrPlotInstanceEntry > sGarrPlotInstanceStore("GarrPlotInstance.db2", &GarrPlotInstanceLoadInfo::Instance)
DB2Storage< LockEntry > sLockStore("Lock.db2", &LockLoadInfo::Instance)
DB2Storage< NamesProfanityEntry > sNamesProfanityStore("NamesProfanity.db2", &NamesProfanityLoadInfo::Instance)
DB2Storage< CharTitlesEntry > sCharTitlesStore("CharTitles.db2", &CharTitlesLoadInfo::Instance)
DB2Storage< GlyphRequiredSpecEntry > sGlyphRequiredSpecStore("GlyphRequiredSpec.db2", &GlyphRequiredSpecLoadInfo::Instance)
DB2Storage< ExpectedStatEntry > sExpectedStatStore("ExpectedStat.db2", &ExpectedStatLoadInfo::Instance)
DB2Storage< BattlePetSpeciesStateEntry > sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", &BattlePetSpeciesStateLoadInfo::Instance)
DB2Storage< NumTalentsAtLevelEntry > sNumTalentsAtLevelStore("NumTalentsAtLevel.db2", &NumTalentsAtLevelLoadInfo::Instance)
std::map< std::tuple< uint32, uint8, uint8, uint8 >, EmotesTextSoundEntry const * > EmotesTextSoundContainer
DB2Storage< ArtifactUnlockEntry > sArtifactUnlockStore("ArtifactUnlock.db2", &ArtifactUnlockLoadInfo::Instance)
DB2Storage< QuestLineXQuestEntry > sQuestLineXQuestStore("QuestLineXQuest.db2", &QuestLineXQuestLoadInfo::Instance)
DB2Storage< TraitCondEntry > sTraitCondStore("TraitCond.db2", &TraitCondLoadInfo::Instance)
DB2Storage< TransportAnimationEntry > sTransportAnimationStore("TransportAnimation.db2", &TransportAnimationLoadInfo::Instance)
std::vector< TalentEntry const * > TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]
DB2Storage< ContentTuningXExpectedEntry > sContentTuningXExpectedStore("ContentTuningXExpected.db2", &ContentTuningXExpectedLoadInfo::Instance)
DB2Storage< ConditionalContentTuningEntry > sConditionalContentTuningStore("ConditionalContentTuning.db2", &ConditionalContentTuningLoadInfo::Instance)
DB2Storage< TransmogSituationGroupEntry > sTransmogSituationGroupStore("TransmogSituationGroup.db2", &TransmogSituationGroupLoadInfo::Instance)
DB2Storage< WMOAreaTableEntry > sWMOAreaTableStore("WMOAreaTable.db2", &WmoAreaTableLoadInfo::Instance)
DB2Storage< TraitTreeXTraitCurrencyEntry > sTraitTreeXTraitCurrencyStore("TraitTreeXTraitCurrency.db2", &TraitTreeXTraitCurrencyLoadInfo::Instance)
DB2Storage< ItemXBonusTreeEntry > sItemXBonusTreeStore("ItemXBonusTree.db2", &ItemXBonusTreeLoadInfo::Instance)
DB2Storage< ChrSpecializationEntry > sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance)
DB2Storage< Cfg_CategoriesEntry > sCfgCategoriesStore("Cfg_Categories.db2", &CfgCategoriesLoadInfo::Instance)
DB2Storage< ExpectedStatModEntry > sExpectedStatModStore("ExpectedStatMod.db2", &ExpectedStatModLoadInfo::Instance)
DB2Storage< PrestigeLevelInfoEntry > sPrestigeLevelInfoStore("PrestigeLevelInfo.db2", &PrestigeLevelInfoLoadInfo::Instance)
DB2Storage< ChrClassesXPowerTypesEntry > sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", &ChrClassesXPowerTypesLoadInfo::Instance)
DB2Storage< GarrPlotBuildingEntry > sGarrPlotBuildingStore("GarrPlotBuilding.db2", &GarrPlotBuildingLoadInfo::Instance)
DB2Storage< TraitSystemEntry > sTraitSystemStore("TraitSystem.db2", &TraitSystemLoadInfo::Instance)
DB2Storage< SceneScriptTextEntry > sSceneScriptTextStore("SceneScriptText.db2", &SceneScriptTextLoadInfo::Instance)
DB2Storage< ChrCustomizationReqChoiceEntry > sChrCustomizationReqChoiceStore("ChrCustomizationReqChoice.db2", &ChrCustomizationReqChoiceLoadInfo::Instance)
DB2Storage< GossipNPCOptionEntry > sGossipNPCOptionStore("GossipNPCOption.db2", &GossipNpcOptionLoadInfo::Instance)
DB2Storage< PowerTypeEntry > sPowerTypeStore("PowerType.db2", &PowerTypeLoadInfo::Instance)
DB2Storage< ItemSetEntry > sItemSetStore("ItemSet.db2", &ItemSetLoadInfo::Instance)
DB2Storage< TraitNodeEntryEntry > sTraitNodeEntryStore("TraitNodeEntry.db2", &TraitNodeEntryLoadInfo::Instance)
DB2Storage< QuestSortEntry > sQuestSortStore("QuestSort.db2", &QuestSortLoadInfo::Instance)
DB2Storage< GarrSiteLevelEntry > sGarrSiteLevelStore("GarrSiteLevel.db2", &GarrSiteLevelLoadInfo::Instance)
DB2Storage< SceneScriptPackageEntry > sSceneScriptPackageStore("SceneScriptPackage.db2", &SceneScriptPackageLoadInfo::Instance)
DB2Storage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", &CreatureDisplayInfoExtraLoadInfo::Instance)
DB2Storage< TotemCategoryEntry > sTotemCategoryStore("TotemCategory.db2", &TotemCategoryLoadInfo::Instance)
DB2Storage< SpellLevelsEntry > sSpellLevelsStore("SpellLevels.db2", &SpellLevelsLoadInfo::Instance)
DB2Storage< SpellVisualKitEntry > sSpellVisualKitStore("SpellVisualKit.db2", &SpellVisualKitLoadInfo::Instance)
DB2Storage< AdventureMapPOIEntry > sAdventureMapPOIStore("AdventureMapPOI.db2", &AdventureMapPoiLoadInfo::Instance)
DB2Storage< PvpTalentEntry > sPvpTalentStore("PvpTalent.db2", &PvpTalentLoadInfo::Instance)
DB2Storage< ScenarioStepEntry > sScenarioStepStore("ScenarioStep.db2", &ScenarioStepLoadInfo::Instance)
DB2Storage< JournalTierEntry > sJournalTierStore("JournalTier.db2", &JournalTierLoadInfo::Instance)
DB2Storage< BattlePetAbilityEntry > sBattlePetAbilityStore("BattlePetAbility.db2", &BattlePetAbilityLoadInfo::Instance)
DB2Storage< SpellVisualMissileEntry > sSpellVisualMissileStore("SpellVisualMissile.db2", &SpellVisualMissileLoadInfo::Instance)
DB2Storage< ItemEffectEntry > sItemEffectStore("ItemEffect.db2", &ItemEffectLoadInfo::Instance)
std::unordered_map< uint32, std::vector< ArtifactPowerEntry const * > > ArtifactPowersContainer
DB2Storage< PathPropertyEntry > sPathPropertyStore("PathProperty.db2", &PathPropertyLoadInfo::Instance)
DB2Storage< BarberShopStyleEntry > sBarberShopStyleStore("BarberShopStyle.db2", &BarberShopStyleLoadInfo::Instance)
std::unordered_multimap< uint32, SkillRaceClassInfoEntry const * > SkillRaceClassInfoContainer
DB2Storage< ChatChannelsEntry > sChatChannelsStore("ChatChannels.db2", &ChatChannelsLoadInfo::Instance)
std::pair< uint32, bool(*)(std::vector< uint8 > const &data) > AllowedHotfixOptionalData
DB2Storage< MawPowerEntry > sMawPowerStore("MawPower.db2", &MawPowerLoadInfo::Instance)
DB2Storage< ToyEntry > sToyStore("Toy.db2", &ToyLoadInfo::Instance)
DB2Storage< ItemSquishEraEntry > sItemSquishEraStore("ItemSquishEra.db2", &ItemSquishEraLoadInfo::Instance)
std::array< ItemClassEntry const *, 21 > ItemClassByOldEnumContainer
DB2Storage< BankTabEntry > sBankTabStore("BankTab.db2", &BankTabLoadInfo::Instance)
DB2Storage< CriteriaTreeEntry > sCriteriaTreeStore("CriteriaTree.db2", &CriteriaTreeLoadInfo::Instance)
DB2Storage< ChrClassUIDisplayEntry > sChrClassUIDisplayStore("ChrClassUIDisplay.db2", &ChrClassUiDisplayLoadInfo::Instance)
DB2Storage< TraitDefinitionEffectPointsEntry > sTraitDefinitionEffectPointsStore("TraitDefinitionEffectPoints.db2", &TraitDefinitionEffectPointsLoadInfo::Instance)
DB2Storage< CorruptionEffectsEntry > sCorruptionEffectsStore("CorruptionEffects.db2", &CorruptionEffectsLoadInfo::Instance)
DB2Storage< ImportPriceShieldEntry > sImportPriceShieldStore("ImportPriceShield.db2", &ImportPriceShieldLoadInfo::Instance)
DB2Storage< LocationEntry > sLocationStore("Location.db2", &LocationLoadInfo::Instance)
DB2Storage< BattlePetSpeciesEntry > sBattlePetSpeciesStore("BattlePetSpecies.db2", &BattlePetSpeciesLoadInfo::Instance)
DB2Storage< ItemArmorShieldEntry > sItemArmorShieldStore("ItemArmorShield.db2", &ItemArmorShieldLoadInfo::Instance)
DB2Storage< AreaTriggerEntry > sAreaTriggerStore("AreaTrigger.db2", &AreaTriggerLoadInfo::Instance)
DB2Storage< PlayerDataFlagAccountEntry > sPlayerDataFlagAccountStore("PlayerDataFlagAccount.db2", &PlayerDataFlagAccountLoadInfo::Instance)
DB2Storage< SpellDurationEntry > sSpellDurationStore("SpellDuration.db2", &SpellDurationLoadInfo::Instance)
DB2Storage< SpellLearnSpellEntry > sSpellLearnSpellStore("SpellLearnSpell.db2", &SpellLearnSpellLoadInfo::Instance)
DB2Storage< ConversationLineEntry > sConversationLineStore("ConversationLine.db2", &ConversationLineLoadInfo::Instance)
DB2Storage< SpellCooldownsEntry > sSpellCooldownsStore("SpellCooldowns.db2", &SpellCooldownsLoadInfo::Instance)
DB2Storage< MountTypeXCapabilityEntry > sMountTypeXCapabilityStore("MountTypeXCapability.db2", &MountTypeXCapabilityLoadInfo::Instance)
DB2Storage< AdventureJournalEntry > sAdventureJournalStore("AdventureJournal.db2", &AdventureJournalLoadInfo::Instance)
DB2Storage< MapDifficultyXConditionEntry > sMapDifficultyXConditionStore("MapDifficultyXCondition.db2", &MapDifficultyXConditionLoadInfo::Instance)
DB2Storage< BannedAddonsEntry > sBannedAddonsStore("BannedAddons.db2", &BannedAddonsLoadInfo::Instance)
DB2Storage< ItemOffsetCurveEntry > sItemOffsetCurveStore("ItemOffsetCurve.db2", &ItemOffsetCurveLoadInfo::Instance)
std::tuple< uint16, uint8, int32 > WMOAreaTableKey
DB2Storage< ItemArmorQualityEntry > sItemArmorQualityStore("ItemArmorQuality.db2", &ItemArmorQualityLoadInfo::Instance)
DB2Storage< UnitConditionEntry > sUnitConditionStore("UnitCondition.db2", &UnitConditionLoadInfo::Instance)
DB2Storage< BattlemasterListXMapEntry > sBattlemasterListXMapStore("BattlemasterListXMap.db2", &BattlemasterListXMapLoadInfo::Instance)
std::unordered_map< uint32, std::vector< uint32 > > AreaGroupMemberContainer
DB2Storage< ItemDamageAmmoEntry > sItemDamageAmmoStore("ItemDamageAmmo.db2", &ItemDamageAmmoLoadInfo::Instance)
DB2Storage< ArtifactTierEntry > sArtifactTierStore("ArtifactTier.db2", &ArtifactTierLoadInfo::Instance)
std::unordered_map< uint32, std::vector< uint32 > > GlyphBindableSpellsContainer
DB2Storage< ItemModifiedAppearanceEntry > sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", &ItemModifiedAppearanceLoadInfo::Instance)
DB2Storage< MailTemplateEntry > sMailTemplateStore("MailTemplate.db2", &MailTemplateLoadInfo::Instance)
DB2Storage< EmotesEntry > sEmotesStore("Emotes.db2", &EmotesLoadInfo::Instance)
std::unordered_map< uint32, std::vector< ItemSetSpellEntry const * > > ItemSetSpellContainer
DB2Storage< ItemSetSpellEntry > sItemSetSpellStore("ItemSetSpell.db2", &ItemSetSpellLoadInfo::Instance)
DB2Storage< Cfg_RegionsEntry > sCfgRegionsStore("Cfg_Regions.db2", &CfgRegionsLoadInfo::Instance)
DB2Storage< UiMapEntry > sUiMapStore("UiMap.db2", &UiMapLoadInfo::Instance)
DB2Storage< SkillLineAbilityEntry > sSkillLineAbilityStore("SkillLineAbility.db2", &SkillLineAbilityLoadInfo::Instance)
DB2Storage< CurrencyContainerEntry > sCurrencyContainerStore("CurrencyContainer.db2", &CurrencyContainerLoadInfo::Instance)
DB2Storage< ItemDisenchantLootEntry > sItemDisenchantLootStore("ItemDisenchantLoot.db2", &ItemDisenchantLootLoadInfo::Instance)
DB2Storage< KeychainEntry > sKeychainStore("Keychain.db2", &KeychainLoadInfo::Instance)
std::unordered_map< uint32, std::pair< std::vector< QuestPackageItemEntry const * >, std::vector< QuestPackageItemEntry const * > > > QuestPackageItemContainer
DB2Storage< TraitEdgeEntry > sTraitEdgeStore("TraitEdge.db2", &TraitEdgeLoadInfo::Instance)
DB2Storage< AzeriteUnlockMappingEntry > sAzeriteUnlockMappingStore("AzeriteUnlockMapping.db2", &AzeriteUnlockMappingLoadInfo::Instance)
DB2Storage< WarbandSceneEntry > sWarbandSceneStore("WarbandScene.db2", &WarbandSceneLoadInfo::Instance)
DB2Storage< AzeriteTierUnlockEntry > sAzeriteTierUnlockStore("AzeriteTierUnlock.db2", &AzeriteTierUnlockLoadInfo::Instance)
DB2Storage< SummonPropertiesEntry > sSummonPropertiesStore("SummonProperties.db2", &SummonPropertiesLoadInfo::Instance)
DB2Storage< SpellReagentsCurrencyEntry > sSpellReagentsCurrencyStore("SpellReagentsCurrency.db2", &SpellReagentsCurrencyLoadInfo::Instance)
DB2Storage< GuildPerkSpellsEntry > sGuildPerkSpellsStore("GuildPerkSpells.db2", &GuildPerkSpellsLoadInfo::Instance)
DB2Storage< TraitDefinitionEntry > sTraitDefinitionStore("TraitDefinition.db2", &TraitDefinitionLoadInfo::Instance)
DB2Storage< AzeriteLevelInfoEntry > sAzeriteLevelInfoStore("AzeriteLevelInfo.db2", &AzeriteLevelInfoLoadInfo::Instance)
DB2Storage< ItemCreationContextEntry > sItemCreationContextStore("ItemCreationContext.db2", &ItemCreationContextLoadInfo::Instance)
DB2Storage< LFGDungeonsEntry > sLFGDungeonsStore("LFGDungeons.db2", &LfgDungeonsLoadInfo::Instance)
DB2Storage< TaxiPathNodeEntry > sTaxiPathNodeStore("TaxiPathNode.db2", &TaxiPathNodeLoadInfo::Instance)
DB2Storage< SpellFocusObjectEntry > sSpellFocusObjectStore("SpellFocusObject.db2", &SpellFocusObjectLoadInfo::Instance)
DB2Storage< TactKeyEntry > sTactKeyStore("TactKey.db2", &TactKeyLoadInfo::Instance)
DB2Storage< NamesReservedLocaleEntry > sNamesReservedLocaleStore("NamesReservedLocale.db2", &NamesReservedLocaleLoadInfo::Instance)
DB2Storage< ImportPriceQualityEntry > sImportPriceQualityStore("ImportPriceQuality.db2", &ImportPriceQualityLoadInfo::Instance)
DB2Storage< PvpTierEntry > sPvpTierStore("PvpTier.db2", &PvpTierLoadInfo::Instance)
DB2Storage< ItemContextPickerEntryEntry > sItemContextPickerEntryStore("ItemContextPickerEntry.db2", &ItemContextPickerEntryLoadInfo::Instance)
DB2Storage< MountXDisplayEntry > sMountXDisplayStore("MountXDisplay.db2", &MountXDisplayLoadInfo::Instance)
DB2Storage< NameGenEntry > sNameGenStore("NameGen.db2", &NameGenLoadInfo::Instance)
DB2Storage< CraftingQualityEntry > sCraftingQualityStore("CraftingQuality.db2", &CraftingQualityLoadInfo::Instance)
DB2Storage< BroadcastTextEntry > sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance)
DB2Storage< SpellCastingRequirementsEntry > sSpellCastingRequirementsStore("SpellCastingRequirements.db2", &SpellCastingRequirementsLoadInfo::Instance)
std::unordered_map< uint32, std::vector< ItemLimitCategoryConditionEntry const * > > ItemLimitCategoryConditionContainer
DB2Storage< SpellEmpowerEntry > sSpellEmpowerStore("SpellEmpower.db2", &SpellEmpowerLoadInfo::Instance)
DB2Storage< MythicPlusSeasonEntry > sMythicPlusSeasonStore("MythicPlusSeason.db2", &MythicPlusSeasonLoadInfo::Instance)
DB2Storage< GameObjectArtKitEntry > sGameObjectArtKitStore("GameObjectArtKit.db2", &GameobjectArtKitLoadInfo::Instance)
DB2Storage< TransmogSituationTriggerEntry > sTransmogSituationTriggerStore("TransmogSituationTrigger.db2", &TransmogSituationTriggerLoadInfo::Instance)
DB2Storage< ItemLimitCategoryConditionEntry > sItemLimitCategoryConditionStore("ItemLimitCategoryCondition.db2", &ItemLimitCategoryConditionLoadInfo::Instance)
DB2Storage< ItemExtendedCostEntry > sItemExtendedCostStore("ItemExtendedCost.db2", &ItemExtendedCostLoadInfo::Instance)
DB2Storage< SpellEffectEntry > sSpellEffectStore("SpellEffect.db2", &SpellEffectLoadInfo::Instance)
DB2Storage< ContentTuningXLabelEntry > sContentTuningXLabelStore("ContentTuningXLabel.db2", &ContentTuningXLabelLoadInfo::Instance)
std::array< std::vector< Trinity::wregex >, TOTAL_LOCALES+1 > NameValidationRegexContainer
DB2Storage< GuildColorBackgroundEntry > sGuildColorBackgroundStore("GuildColorBackground.db2", &GuildColorBackgroundLoadInfo::Instance)
DB2Storage< PVPDifficultyEntry > sPVPDifficultyStore("PVPDifficulty.db2", &PvpDifficultyLoadInfo::Instance)
std::map< HotfixBlobKey, std::vector< uint8 > > HotfixBlobMap
DB2Storage< TraitNodeEntryXTraitCondEntry > sTraitNodeEntryXTraitCondStore("TraitNodeEntryXTraitCond.db2", &TraitNodeEntryXTraitCondLoadInfo::Instance)
DB2Storage< QuestV2Entry > sQuestV2Store("QuestV2.db2", &QuestV2LoadInfo::Instance)
DB2Storage< AzeriteEmpoweredItemEntry > sAzeriteEmpoweredItemStore("AzeriteEmpoweredItem.db2", &AzeriteEmpoweredItemLoadInfo::Instance)
DB2Storage< VignetteEntry > sVignetteStore("Vignette.db2", &VignetteLoadInfo::Instance)
DB2Storage< CurrencyTypesEntry > sCurrencyTypesStore("CurrencyTypes.db2", &CurrencyTypesLoadInfo::Instance)
DB2Storage< LanguagesEntry > sLanguagesStore("Languages.db2", &LanguagesLoadInfo::Instance)
DB2Storage< MapChallengeModeEntry > sMapChallengeModeStore("MapChallengeMode.db2", &MapChallengeModeLoadInfo::Instance)
DB2Storage< SpellRadiusEntry > sSpellRadiusStore("SpellRadius.db2", &SpellRadiusLoadInfo::Instance)
DB2Storage< TraitCurrencyEntry > sTraitCurrencyStore("TraitCurrency.db2", &TraitCurrencyLoadInfo::Instance)
DB2Storage< AzeriteTierUnlockSetEntry > sAzeriteTierUnlockSetStore("AzeriteTierUnlockSet.db2", &AzeriteTierUnlockSetLoadInfo::Instance)
DB2Storage< GemPropertiesEntry > sGemPropertiesStore("GemProperties.db2", &GemPropertiesLoadInfo::Instance)
DB2Storage< ItemBonusListLevelDeltaEntry > sItemBonusListLevelDeltaStore("ItemBonusListLevelDelta.db2", &ItemBonusListLevelDeltaLoadInfo::Instance)
DB2Storage< ItemBonusListGroupEntryEntry > sItemBonusListGroupEntryStore("ItemBonusListGroupEntry.db2", &ItemBonusListGroupEntryLoadInfo::Instance)
DB2Storage< HeirloomEntry > sHeirloomStore("Heirloom.db2", &HeirloomLoadInfo::Instance)
DB2Storage< QuestXPEntry > sQuestXPStore("QuestXP.db2", &QuestXpLoadInfo::Instance)
DB2Storage< UiMapXMapArtEntry > sUiMapXMapArtStore("UiMapXMapArt.db2", &UiMapXMapArtLoadInfo::Instance)
DB2Storage< GlyphPropertiesEntry > sGlyphPropertiesStore("GlyphProperties.db2", &GlyphPropertiesLoadInfo::Instance)
DB2Storage< SpellEmpowerStageEntry > sSpellEmpowerStageStore("SpellEmpowerStage.db2", &SpellEmpowerStageLoadInfo::Instance)
DB2Storage< WorldEffectEntry > sWorldEffectStore("WorldEffect.db2", &WorldEffectLoadInfo::Instance)
std::unordered_map< uint32, std::vector< uint32 > > PhaseGroupContainer
DB2Storage< DungeonEncounterEntry > sDungeonEncounterStore("DungeonEncounter.db2", &DungeonEncounterLoadInfo::Instance)
DB2Storage< PvpTalentSlotUnlockEntry > sPvpTalentSlotUnlockStore("PvpTalentSlotUnlock.db2", &PvpTalentSlotUnlockLoadInfo::Instance)
DB2Storage< SpellTargetRestrictionsEntry > sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", &SpellTargetRestrictionsLoadInfo::Instance)
DB2Storage< ChrRacesEntry > sChrRacesStore("ChrRaces.db2", &ChrRacesLoadInfo::Instance)
DB2Storage< TraitNodeXTraitCostEntry > sTraitNodeXTraitCostStore("TraitNodeXTraitCost.db2", &TraitNodeXTraitCostLoadInfo::Instance)
DB2Storage< ParagonReputationEntry > sParagonReputationStore("ParagonReputation.db2", &ParagonReputationLoadInfo::Instance)
DB2Storage< QuestPackageItemEntry > sQuestPackageItemStore("QuestPackageItem.db2", &QuestPackageItemLoadInfo::Instance)
std::unordered_map< std::pair< uint32, uint8 >, ArtifactPowerRankEntry const * > ArtifactPowerRanksContainer
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
DB2Storage< PerksActivityEntry > sPerksActivityStore("PerksActivity.db2", &PerksActivityLoadInfo::Instance)
DB2Storage< GlyphBindableSpellEntry > sGlyphBindableSpellStore("GlyphBindableSpell.db2", &GlyphBindableSpellLoadInfo::Instance)
DB2Storage< TransmogSetItemEntry > sTransmogSetItemStore("TransmogSetItem.db2", &TransmogSetItemLoadInfo::Instance)
DB2Storage< RewardPackXCurrencyTypeEntry > sRewardPackXCurrencyTypeStore("RewardPackXCurrencyType.db2", &RewardPackXCurrencyTypeLoadInfo::Instance)
std::unordered_map< uint32, std::vector< SpellPowerEntry const * > > SpellPowerContainer
DB2Storage< ArtifactPowerLinkEntry > sArtifactPowerLinkStore("ArtifactPowerLink.db2", &ArtifactPowerLinkLoadInfo::Instance)
DB2Storage< ChrCustomizationReqEntry > sChrCustomizationReqStore("ChrCustomizationReq.db2", &ChrCustomizationReqLoadInfo::Instance)
DB2Storage< ImportPriceArmorEntry > sImportPriceArmorStore("ImportPriceArmor.db2", &ImportPriceArmorLoadInfo::Instance)
DB2Storage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", &CreatureDisplayInfoLoadInfo::Instance)
DB2Storage< ContentTuningEntry > sContentTuningStore("ContentTuning.db2", &ContentTuningLoadInfo::Instance)
DB2Storage< ItemLevelSelectorQualitySetEntry > sItemLevelSelectorQualitySetStore("ItemLevelSelectorQualitySet.db2", &ItemLevelSelectorQualitySetLoadInfo::Instance)
DB2Storage< TraitNodeXTraitCondEntry > sTraitNodeXTraitCondStore("TraitNodeXTraitCond.db2", &TraitNodeXTraitCondLoadInfo::Instance)
DB2Storage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore("SpellItemEnchantment.db2", &SpellItemEnchantmentLoadInfo::Instance)
DB2Storage< CharBaseInfoEntry > sCharBaseInfoStore("CharBaseInfo.db2", &CharBaseInfoLoadInfo::Instance)
DB2Storage< SpellClassOptionsEntry > sSpellClassOptionsStore("SpellClassOptions.db2", &SpellClassOptionsLoadInfo::Instance)
DB2Storage< AzeritePowerEntry > sAzeritePowerStore("AzeritePower.db2", &AzeritePowerLoadInfo::Instance)
DB2Storage< PowerDisplayEntry > sPowerDisplayStore("PowerDisplay.db2", &PowerDisplayLoadInfo::Instance)
DB2Storage< TraitSubTreeEntry > sTraitSubTreeStore("TraitSubTree.db2", &TraitSubTreeLoadInfo::Instance)
DB2Storage< KeystoneAffixEntry > sKeystoneAffixStore("KeystoneAffix.db2", &KeystoneAffixLoadInfo::Instance)
DB2Storage< SoulbindConduitRankEntry > sSoulbindConduitRankStore("SoulbindConduitRank.db2", &SoulbindConduitRankLoadInfo::Instance)
DB2Storage< HolidaysEntry > sHolidaysStore("Holidays.db2", &HolidaysLoadInfo::Instance)
DB2Storage< ArmorLocationEntry > sArmorLocationStore("ArmorLocation.db2", &ArmorLocationLoadInfo::Instance)
DB2Storage< TransmogHolidayEntry > sTransmogHolidayStore("TransmogHoliday.db2", &TransmogHolidayLoadInfo::Instance)
DB2Storage< TalentEntry > sTalentStore("Talent.db2", &TalentLoadInfo::Instance)
DB2Storage< MovieEntry > sMovieStore("Movie.db2", &MovieLoadInfo::Instance)
DB2Storage< ItemCurrencyCostEntry > sItemCurrencyCostStore("ItemCurrencyCost.db2", &ItemCurrencyCostLoadInfo::Instance)
std::unordered_map< uint32, std::array< std::vector< NameGenEntry const * >, 2 > > NameGenContainer
DB2Storage< ItemAppearanceEntry > sItemAppearanceStore("ItemAppearance.db2", &ItemAppearanceLoadInfo::Instance)
DB2Storage< TransmogSetGroupEntry > sTransmogSetGroupStore("TransmogSetGroup.db2", &TransmogSetGroupLoadInfo::Instance)
DB2Storage< ItemSparseEntry > sItemSparseStore("ItemSparse.db2", &ItemSparseLoadInfo::Instance)
DB2Storage< TraitNodeGroupEntry > sTraitNodeGroupStore("TraitNodeGroup.db2", &TraitNodeGroupLoadInfo::Instance)
DB2Storage< FactionTemplateEntry > sFactionTemplateStore("FactionTemplate.db2", &FactionTemplateLoadInfo::Instance)
DB2Storage< ItemDamageTwoHandEntry > sItemDamageTwoHandStore("ItemDamageTwoHand.db2", &ItemDamageTwoHandLoadInfo::Instance)
DB2Storage< AuctionHouseEntry > sAuctionHouseStore("AuctionHouse.db2", &AuctionHouseLoadInfo::Instance)
DB2Storage< FlightCapabilityEntry > sFlightCapabilityStore("FlightCapability.db2", &FlightCapabilityLoadInfo::Instance)
DB2Storage< SpellProcsPerMinuteModEntry > sSpellProcsPerMinuteModStore("SpellProcsPerMinuteMod.db2", &SpellProcsPerMinuteModLoadInfo::Instance)
DB2Storage< MountCapabilityEntry > sMountCapabilityStore("MountCapability.db2", &MountCapabilityLoadInfo::Instance)
DB2Storage< SoundKitEntry > sSoundKitStore("SoundKit.db2", &SoundKitLoadInfo::Instance)
DB2Storage< ChrCustomizationChoiceEntry > sChrCustomizationChoiceStore("ChrCustomizationChoice.db2", &ChrCustomizationChoiceLoadInfo::Instance)
DB2Storage< AzeriteItemEntry > sAzeriteItemStore("AzeriteItem.db2", &AzeriteItemLoadInfo::Instance)
DB2Storage< ItemClassEntry > sItemClassStore("ItemClass.db2", &ItemClassLoadInfo::Instance)
DB2Storage< TraitNodeEntryXTraitCostEntry > sTraitNodeEntryXTraitCostStore("TraitNodeEntryXTraitCost.db2", &TraitNodeEntryXTraitCostLoadInfo::Instance)
DB2Storage< ItemSpecEntry > sItemSpecStore("ItemSpec.db2", &ItemSpecLoadInfo::Instance)
DB2Storage< AzeriteEssenceEntry > sAzeriteEssenceStore("AzeriteEssence.db2", &AzeriteEssenceLoadInfo::Instance)
DB2Storage< ItemDamageOneHandCasterEntry > sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", &ItemDamageOneHandCasterLoadInfo::Instance)
DB2Storage< SpellKeyboundOverrideEntry > sSpellKeyboundOverrideStore("SpellKeyboundOverride.db2", &SpellKeyboundOverrideLoadInfo::Instance)
std::unordered_map< uint32, DB2Manager::MountXDisplayContainer > MountDisplaysCointainer
DB2Storage< SpellTotemsEntry > sSpellTotemsStore("SpellTotems.db2", &SpellTotemsLoadInfo::Instance)
DB2Storage< TraitTreeLoadoutEntryEntry > sTraitTreeLoadoutEntryStore("TraitTreeLoadoutEntry.db2", &TraitTreeLoadoutEntryLoadInfo::Instance)
DB2Storage< PathNodeEntry > sPathNodeStore("PathNode.db2", &PathNodeLoadInfo::Instance)
static void LoadDB2(std::bitset< TOTAL_LOCALES > &availableDb2Locales, std::vector< std::string > &errlist, StorageMap &stores, DB2StorageBase *storage, std::string const &db2Path, LocaleConstant defaultLocale, std::size_t cppRecordSize)
DB2Storage< GarrClassSpecEntry > sGarrClassSpecStore("GarrClassSpec.db2", &GarrClassSpecLoadInfo::Instance)
DB2Storage< SpellCategoriesEntry > sSpellCategoriesStore("SpellCategories.db2", &SpellCategoriesLoadInfo::Instance)
DB2Storage< BroadcastTextDurationEntry > sBroadcastTextDurationStore("BroadcastTextDuration.db2", &BroadcastTextDurationLoadInfo::Instance)
DB2Storage< AreaGroupMemberEntry > sAreaGroupMemberStore("AreaGroupMember.db2", &AreaGroupMemberLoadInfo::Instance)
DB2Storage< SceneScriptGlobalTextEntry > sSceneScriptGlobalTextStore("SceneScriptGlobalText.db2", &SceneScriptGlobalTextLoadInfo::Instance)
DB2Storage< SpellLabelEntry > sSpellLabelStore("SpellLabel.db2", &SpellLabelLoadInfo::Instance)
DB2Storage< GameObjectLabelEntry > sGameObjectLabelStore("GameObjectLabel.db2", &GameobjectLabelLoadInfo::Instance)
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
DB2Storage< SpellProcsPerMinuteEntry > sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", &SpellProcsPerMinuteLoadInfo::Instance)
DB2Storage< TaxiPathEntry > sTaxiPathStore("TaxiPath.db2", &TaxiPathLoadInfo::Instance)
static bool operator<(UiMapAssignmentStatus const &left, UiMapAssignmentStatus const &right)
std::unordered_set< uint32 > ToyItemIdsContainer
DB2Storage< SpellPowerEntry > sSpellPowerStore("SpellPower.db2", &SpellPowerLoadInfo::Instance)
DB2Storage< GarrFollowerEntry > sGarrFollowerStore("GarrFollower.db2", &GarrFollowerLoadInfo::Instance)
DB2Storage< ArtifactAppearanceSetEntry > sArtifactAppearanceSetStore("ArtifactAppearanceSet.db2", &ArtifactAppearanceSetLoadInfo::Instance)
DB2Storage< UiMapAssignmentEntry > sUiMapAssignmentStore("UiMapAssignment.db2", &UiMapAssignmentLoadInfo::Instance)
DB2Storage< RewardPackEntry > sRewardPackStore("RewardPack.db2", &RewardPackLoadInfo::Instance)
DB2Storage< FactionEntry > sFactionStore("Faction.db2", &FactionLoadInfo::Instance)
DB2Storage< DurabilityCostsEntry > sDurabilityCostsStore("DurabilityCosts.db2", &DurabilityCostsLoadInfo::Instance)
DB2Storage< VehicleEntry > sVehicleStore("Vehicle.db2", &VehicleLoadInfo::Instance)
DB2Storage< CinematicSequencesEntry > sCinematicSequencesStore("CinematicSequences.db2", &CinematicSequencesLoadInfo::Instance)
TaxiMask sHordeTaxiNodesMask
DB2Storage< GuildColorBorderEntry > sGuildColorBorderStore("GuildColorBorder.db2", &GuildColorBorderLoadInfo::Instance)
DB2Storage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", &SpellItemEnchantmentConditionLoadInfo::Instance)
DB2Storage< CinematicCameraEntry > sCinematicCameraStore("CinematicCamera.db2", &CinematicCameraLoadInfo::Instance)
DB2Storage< SpellCastTimesEntry > sSpellCastTimesStore("SpellCastTimes.db2", &SpellCastTimesLoadInfo::Instance)
DB2Storage< PlayerDataFlagCharacterEntry > sPlayerDataFlagCharacterStore("PlayerDataFlagCharacter.db2", &PlayerDataFlagCharacterLoadInfo::Instance)
DB2Storage< GarrAbilityEntry > sGarrAbilityStore("GarrAbility.db2", &GarrAbilityLoadInfo::Instance)
DB2Storage< GarrPlotEntry > sGarrPlotStore("GarrPlot.db2", &GarrPlotLoadInfo::Instance)
DB2Storage< SpellScalingEntry > sSpellScalingStore("SpellScaling.db2", &SpellScalingLoadInfo::Instance)
DB2Storage< JournalEncounterEntry > sJournalEncounterStore("JournalEncounter.db2", &JournalEncounterLoadInfo::Instance)
TC_GAME_API DB2Storage< JournalEncounterEntry > sJournalEncounterStore
TC_GAME_API DB2Storage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore
TC_GAME_API DB2Storage< ItemLevelSelectorEntry > sItemLevelSelectorStore
TC_GAME_API DB2Storage< CharacterLoadoutItemEntry > sCharacterLoadoutItemStore
TC_GAME_API DB2Storage< ItemModifiedAppearanceExtraEntry > sItemModifiedAppearanceExtraStore
TC_GAME_API DB2Storage< ItemArmorQualityEntry > sItemArmorQualityStore
TC_GAME_API DB2Storage< AreaTriggerEntry > sAreaTriggerStore
TC_GAME_API DB2Storage< TransportRotationEntry > sTransportRotationStore
TC_GAME_API DB2Storage< ItemBonusTreeNodeEntry > sItemBonusTreeNodeStore
TC_GAME_API TaxiMask sAllianceTaxiNodesMask
TC_GAME_API DB2Storage< SpellTotemsEntry > sSpellTotemsStore
TC_GAME_API DB2Storage< ChrCustomizationReqEntry > sChrCustomizationReqStore
TC_GAME_API DB2Storage< BattlePetSpeciesEntry > sBattlePetSpeciesStore
TC_GAME_API DB2Storage< Achievement_CategoryEntry > sAchievementCategoryStore
TC_GAME_API DB2Storage< GarrPlotEntry > sGarrPlotStore
TC_GAME_API DB2Storage< TraitNodeGroupXTraitCostEntry > sTraitNodeGroupXTraitCostStore
TC_GAME_API DB2Storage< ItemBonusListGroupEntryEntry > sItemBonusListGroupEntryStore
TC_GAME_API DB2Storage< ItemSearchNameEntry > sItemSearchNameStore
TC_GAME_API DB2Storage< QuestLineXQuestEntry > sQuestLineXQuestStore
TC_GAME_API DB2Storage< ItemLimitCategoryEntry > sItemLimitCategoryStore
TC_GAME_API DB2Storage< ParagonReputationEntry > sParagonReputationStore
TC_GAME_API DB2Storage< PvpSeasonEntry > sPvpSeasonStore
TC_GAME_API DB2Storage< SpellInterruptsEntry > sSpellInterruptsStore
TC_GAME_API DB2Storage< SceneScriptPackageEntry > sSceneScriptPackageStore
TC_GAME_API DB2Storage< BannedAddonsEntry > sBannedAddonsStore
TC_GAME_API DB2Storage< SpellShapeshiftEntry > sSpellShapeshiftStore
TC_GAME_API DB2Storage< DifficultyEntry > sDifficultyStore
TC_GAME_API DB2Storage< SpellVisualKitEntry > sSpellVisualKitStore
TC_GAME_API DB2Storage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore
TC_GAME_API DB2Storage< LanguageWordsEntry > sLanguageWordsStore
TC_GAME_API DB2Storage< CriteriaEntry > sCriteriaStore
TC_GAME_API DB2Storage< SpellScalingEntry > sSpellScalingStore
TC_GAME_API DB2Storage< WorldEffectEntry > sWorldEffectStore
TC_GAME_API DB2Storage< ItemDamageOneHandEntry > sItemDamageOneHandStore
TC_GAME_API DB2Storage< AzeritePowerEntry > sAzeritePowerStore
TC_GAME_API DB2Storage< SpellTargetRestrictionsEntry > sSpellTargetRestrictionsStore
TC_GAME_API DB2Storage< CurveEntry > sCurveStore
TC_GAME_API DB2Storage< SpellEmpowerEntry > sSpellEmpowerStore
TC_GAME_API DB2Storage< RandPropPointsEntry > sRandPropPointsStore
TC_GAME_API DB2Storage< UISplashScreenEntry > sUISplashScreenStore
TC_GAME_API DB2Storage< SpellRadiusEntry > sSpellRadiusStore
TC_GAME_API DB2Storage< GlyphPropertiesEntry > sGlyphPropertiesStore
TC_GAME_API DB2Storage< TransportAnimationEntry > sTransportAnimationStore
TC_GAME_API DB2Storage< ArtifactAppearanceEntry > sArtifactAppearanceStore
TC_GAME_API DB2Storage< PerksActivityEntry > sPerksActivityStore
TC_GAME_API DB2Storage< TalentEntry > sTalentStore
TC_GAME_API DB2Storage< ChrRacesEntry > sChrRacesStore
TC_GAME_API DB2Storage< TransmogSetGroupEntry > sTransmogSetGroupStore
TC_GAME_API DB2Storage< TaxiPathEntry > sTaxiPathStore
TC_GAME_API DB2Storage< ItemCreationContextEntry > sItemCreationContextStore
TC_GAME_API DB2Storage< GuildColorEmblemEntry > sGuildColorEmblemStore
TC_GAME_API DB2Storage< ItemBonusListLevelDeltaEntry > sItemBonusListLevelDeltaStore
TC_GAME_API DB2Storage< TraitTreeXTraitCurrencyEntry > sTraitTreeXTraitCurrencyStore
TC_GAME_API DB2Storage< SpellProcsPerMinuteEntry > sSpellProcsPerMinuteStore
TC_GAME_API DB2Storage< TransmogSituationTriggerEntry > sTransmogSituationTriggerStore
TC_GAME_API DB2Storage< ItemBonusEntry > sItemBonusStore
TC_GAME_API TaxiMask sTaxiNodesMask
TC_GAME_API DB2Storage< TraitDefinitionEntry > sTraitDefinitionStore
TC_GAME_API DB2Storage< ChrClassesEntry > sChrClassesStore
TC_GAME_API DB2Storage< AdventureJournalEntry > sAdventureJournalStore
TC_GAME_API DB2Storage< SpellXSpellVisualEntry > sSpellXSpellVisualStore
TC_GAME_API DB2Storage< LiquidTypeEntry > sLiquidTypeStore
TC_GAME_API DB2Storage< TraitNodeEntryXTraitCostEntry > sTraitNodeEntryXTraitCostStore
TC_GAME_API DB2Storage< TraitCondAccountElementEntry > sTraitCondAccountElementStore
TC_GAME_API DB2Storage< FriendshipRepReactionEntry > sFriendshipRepReactionStore
TC_GAME_API DB2Storage< SummonPropertiesEntry > sSummonPropertiesStore
TC_GAME_API DB2Storage< TransmogSituationGroupEntry > sTransmogSituationGroupStore
TC_GAME_API DB2Storage< SpellReagentsEntry > sSpellReagentsStore
TC_GAME_API DB2Storage< ArtifactEntry > sArtifactStore
TC_GAME_API DB2Storage< BattlemasterListXMapEntry > sBattlemasterListXMapStore
TC_GAME_API DB2Storage< DurabilityQualityEntry > sDurabilityQualityStore
TC_GAME_API DB2Storage< ItemDamageTwoHandEntry > sItemDamageTwoHandStore
TC_GAME_API DB2Storage< SkillLineEntry > sSkillLineStore
TC_GAME_API DB2Storage< CinematicSequencesEntry > sCinematicSequencesStore
TC_GAME_API DB2Storage< ArmorLocationEntry > sArmorLocationStore
TC_GAME_API TaxiMask sOldContinentsNodesMask
TC_GAME_API DB2Storage< TraitEdgeEntry > sTraitEdgeStore
TC_GAME_API DB2Storage< AreaTriggerActionSetEntry > sAreaTriggerActionSetStore
TC_GAME_API DB2Storage< WarbandSceneEntry > sWarbandSceneStore
TC_GAME_API DB2Storage< ItemLevelSelectorQualitySetEntry > sItemLevelSelectorQualitySetStore
TC_GAME_API DB2Storage< MountEquipmentEntry > sMountEquipmentStore
TC_GAME_API DB2Storage< CharTitlesEntry > sCharTitlesStore
TC_GAME_API DB2Storage< ItemSetEntry > sItemSetStore
TC_GAME_API DB2Storage< GuildPerkSpellsEntry > sGuildPerkSpellsStore
TC_GAME_API DB2Storage< PlayerConditionEntry > sPlayerConditionStore
TC_GAME_API DB2Storage< BattlePetBreedStateEntry > sBattlePetBreedStateStore
TC_GAME_API DB2Storage< SpellMiscEntry > sSpellMiscStore
TC_GAME_API DB2Storage< TraitCurrencySourceEntry > sTraitCurrencySourceStore
TC_GAME_API DB2Storage< SpellAuraRestrictionsEntry > sSpellAuraRestrictionsStore
TC_GAME_API DB2Storage< ItemXItemEffectEntry > sItemXItemEffectStore
TC_GAME_API DB2Storage< GuildColorBorderEntry > sGuildColorBorderStore
TC_GAME_API DB2Storage< GarrSiteLevelEntry > sGarrSiteLevelStore
TC_GAME_API DB2Storage< GarrMissionEntry > sGarrMissionStore
TC_GAME_API DB2Storage< OverrideSpellDataEntry > sOverrideSpellDataStore
TC_GAME_API DB2Storage< TaxiPathNodeEntry > sTaxiPathNodeStore
TC_GAME_API DB2Storage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore
TC_GAME_API DB2Storage< BankTabEntry > sBankTabStore
TC_GAME_API DB2Storage< TransmogSetItemEntry > sTransmogSetItemStore
TC_GAME_API DB2Storage< TraitCurrencyEntry > sTraitCurrencyStore
TC_GAME_API DB2Storage< CraftingQualityEntry > sCraftingQualityStore
TC_GAME_API DB2Storage< UnitPowerBarEntry > sUnitPowerBarStore
TC_GAME_API DB2Storage< TraitNodeEntry > sTraitNodeStore
TC_GAME_API DB2Storage< AzeriteUnlockMappingEntry > sAzeriteUnlockMappingStore
TC_GAME_API DB2Storage< CreatureModelDataEntry > sCreatureModelDataStore
TC_GAME_API DB2Storage< ItemModifiedAppearanceEntry > sItemModifiedAppearanceStore
TC_GAME_API DB2Storage< ItemPriceBaseEntry > sItemPriceBaseStore
TC_GAME_API DB2Storage< ItemAppearanceEntry > sItemAppearanceStore
TC_GAME_API DB2Storage< ItemEffectEntry > sItemEffectStore
TC_GAME_API DB2Storage< TraitTreeXTraitCostEntry > sTraitTreeXTraitCostStore
TC_GAME_API DB2Storage< TraitDefinitionEffectPointsEntry > sTraitDefinitionEffectPointsStore
TC_GAME_API DB2Storage< CorruptionEffectsEntry > sCorruptionEffectsStore
TC_GAME_API DB2Storage< CurrencyTypesEntry > sCurrencyTypesStore
TC_GAME_API DB2Storage< ItemNameDescriptionEntry > sItemNameDescriptionStore
TC_GAME_API DB2Storage< TaxiNodesEntry > sTaxiNodesStore
TC_GAME_API DB2Storage< ChatChannelsEntry > sChatChannelsStore
TC_GAME_API DB2Storage< CampaignEntry > sCampaignStore
TC_GAME_API DB2Storage< MountEntry > sMountStore
TC_GAME_API DB2Storage< SpellReagentsCurrencyEntry > sSpellReagentsCurrencyStore
TC_GAME_API DB2Storage< SpellLevelsEntry > sSpellLevelsStore
TC_GAME_API DB2Storage< PhaseEntry > sPhaseStore
TC_GAME_API DB2Storage< AnimationDataEntry > sAnimationDataStore
TC_GAME_API DB2Storage< QuestFactionRewardEntry > sQuestFactionRewardStore
TC_GAME_API DB2Storage< ArtifactCategoryEntry > sArtifactCategoryStore
TC_GAME_API DB2Storage< TraitNodeEntryEntry > sTraitNodeEntryStore
TC_GAME_API DB2Storage< FlightCapabilityEntry > sFlightCapabilityStore
TC_GAME_API DB2Storage< TransmogOutfitEntryEntry > sTransmogOutfitEntryStore
TC_GAME_API DB2Storage< SpellLearnSpellEntry > sSpellLearnSpellStore
TC_GAME_API DB2Storage< ItemEntry > sItemStore
TC_GAME_API DB2Storage< BattlePetAbilityEntry > sBattlePetAbilityStore
TC_GAME_API DB2Storage< SoundKitEntry > sSoundKitStore
TC_GAME_API DB2Storage< CinematicCameraEntry > sCinematicCameraStore
TC_GAME_API DB2Storage< FactionEntry > sFactionStore
TC_GAME_API DB2Storage< TraitNodeXTraitCostEntry > sTraitNodeXTraitCostStore
TC_GAME_API TaxiPathNodesByPath sTaxiPathNodesByPath
TC_GAME_API DB2Storage< SpellEquippedItemsEntry > sSpellEquippedItemsStore
TC_GAME_API DB2Storage< EmotesEntry > sEmotesStore
TC_GAME_API DB2Storage< TraitTreeLoadoutEntry > sTraitTreeLoadoutStore
TC_GAME_API DB2Storage< DurabilityCostsEntry > sDurabilityCostsStore
TC_GAME_API DB2Storage< SpellNameEntry > sSpellNameStore
TC_GAME_API DB2Storage< BattlemasterListEntry > sBattlemasterListStore
TC_GAME_API DB2Storage< TraitTreeLoadoutEntryEntry > sTraitTreeLoadoutEntryStore
TC_GAME_API DB2Storage< GarrFollowerEntry > sGarrFollowerStore
TC_GAME_API DB2Storage< BattlePetSpeciesStateEntry > sBattlePetSpeciesStateStore
TC_GAME_API DB2Storage< UnitConditionEntry > sUnitConditionStore
TC_GAME_API DB2Storage< MythicPlusSeasonEntry > sMythicPlusSeasonStore
TC_GAME_API DB2Storage< GossipNPCOptionEntry > sGossipNPCOptionStore
TC_GAME_API DB2Storage< TraitTreeEntry > sTraitTreeStore
TC_GAME_API DB2Storage< RewardPackEntry > sRewardPackStore
TC_GAME_API DB2Storage< ItemBonusTreeEntry > sItemBonusTreeStore
TC_GAME_API DB2Storage< ScenarioEntry > sScenarioStore
TC_GAME_API DB2Storage< CharacterLoadoutEntry > sCharacterLoadoutStore
TC_GAME_API DB2Storage< ItemXBonusTreeEntry > sItemXBonusTreeStore
TC_GAME_API DB2Storage< QuestSortEntry > sQuestSortStore
TC_GAME_API DB2Storage< SpellCategoryEntry > sSpellCategoryStore
TC_GAME_API DB2Storage< LFGDungeonsEntry > sLFGDungeonsStore
TC_GAME_API DB2Storage< ImportPriceArmorEntry > sImportPriceArmorStore
TC_GAME_API DB2Storage< ItemOffsetCurveEntry > sItemOffsetCurveStore
TC_GAME_API DB2Storage< TraitSubTreeEntry > sTraitSubTreeStore
TC_GAME_API DB2Storage< JournalInstanceEntry > sJournalInstanceStore
TC_GAME_API DB2Storage< ItemContextPickerEntryEntry > sItemContextPickerEntryStore
TC_GAME_API DB2Storage< GameObjectArtKitEntry > sGameObjectArtKitStore
TC_GAME_API DB2Storage< SkillRaceClassInfoEntry > sSkillRaceClassInfoStore
TC_GAME_API DB2Storage< MapEntry > sMapStore
TC_GAME_API DB2Storage< ItemDamageAmmoEntry > sItemDamageAmmoStore
TC_GAME_API DB2Storage< MapDifficultyEntry > sMapDifficultyStore
TC_GAME_API DB2Storage< TransmogSetEntry > sTransmogSetStore
TC_GAME_API DB2Storage< SpellCooldownsEntry > sSpellCooldownsStore
TC_GAME_API DB2Storage< QuestInfoEntry > sQuestInfoStore
TC_GAME_API DB2Storage< GarrClassSpecEntry > sGarrClassSpecStore
TC_GAME_API DB2Storage< VehicleSeatEntry > sVehicleSeatStore
TC_GAME_API DB2Storage< UiMapEntry > sUiMapStore
TC_GAME_API DB2Storage< GarrTalentTreeEntry > sGarrTalentTreeStore
TC_GAME_API DB2Storage< MawPowerEntry > sMawPowerStore
TC_GAME_API DB2Storage< PlayerDataElementAccountEntry > sPlayerDataElementAccountStore
TC_GAME_API DB2Storage< GarrAbilityEntry > sGarrAbilityStore
TC_GAME_API DB2Storage< ItemSquishEraEntry > sItemSquishEraStore
TC_GAME_API DB2Storage< WorldStateExpressionEntry > sWorldStateExpressionStore
TC_GAME_API DB2Storage< GuildColorBackgroundEntry > sGuildColorBackgroundStore
TC_GAME_API DB2Storage< HolidaysEntry > sHolidaysStore
TC_GAME_API DB2Storage< ArtifactTierEntry > sArtifactTierStore
TC_GAME_API DB2Storage< AdventureMapPOIEntry > sAdventureMapPOIStore
TC_GAME_API DB2Storage< BattlePetBreedQualityEntry > sBattlePetBreedQualityStore
TC_GAME_API DB2Storage< ItemSpecOverrideEntry > sItemSpecOverrideStore
TC_GAME_API DB2Storage< ArtifactPowerPickerEntry > sArtifactPowerPickerStore
TC_GAME_API DB2Storage< ChrSpecializationEntry > sChrSpecializationStore
TC_GAME_API DB2Storage< SpellAuraOptionsEntry > sSpellAuraOptionsStore
TC_GAME_API DB2Storage< MailTemplateEntry > sMailTemplateStore
TC_GAME_API DB2Storage< JournalEncounterSectionEntry > sJournalEncounterSectionStore
TC_GAME_API DB2Storage< WorldMapOverlayEntry > sWorldMapOverlayStore
TC_GAME_API DB2Storage< EmotesTextEntry > sEmotesTextStore
TC_GAME_API DB2Storage< MountCapabilityEntry > sMountCapabilityStore
TC_GAME_API DB2Storage< MovieEntry > sMovieStore
TC_GAME_API DB2Storage< SpellClassOptionsEntry > sSpellClassOptionsStore
TC_GAME_API DB2Storage< ItemScalingConfigEntry > sItemScalingConfigStore
TC_GAME_API DB2Storage< SpellDurationEntry > sSpellDurationStore
TC_GAME_API DB2Storage< ArtifactUnlockEntry > sArtifactUnlockStore
TC_GAME_API DB2Storage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore
TC_GAME_API DB2Storage< ScenarioStepEntry > sScenarioStepStore
TC_GAME_API DB2Storage< BarberShopStyleEntry > sBarberShopStyleStore
TC_GAME_API DB2Storage< SpellCategoriesEntry > sSpellCategoriesStore
TC_GAME_API DB2Storage< TransmogHolidayEntry > sTransmogHolidayStore
TC_GAME_API DB2Storage< ModifiedCraftingItemEntry > sModifiedCraftingItemStore
TC_GAME_API DB2Storage< ModifierTreeEntry > sModifierTreeStore
TC_GAME_API DB2Storage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore
TC_GAME_API DB2Storage< AzeriteEssenceEntry > sAzeriteEssenceStore
TC_GAME_API DB2Storage< QuestMoneyRewardEntry > sQuestMoneyRewardStore
TC_GAME_API DB2Storage< TransmogIllusionEntry > sTransmogIllusionStore
TC_GAME_API DB2Storage< LanguagesEntry > sLanguagesStore
TC_GAME_API DB2Storage< MapChallengeModeEntry > sMapChallengeModeStore
std::vector< TaxiPathNodeList > TaxiPathNodesByPath
Definition DB2Stores.h:375
TC_GAME_API DB2Storage< AzeriteKnowledgeMultiplierEntry > sAzeriteKnowledgeMultiplierStore
TC_GAME_API DB2Storage< TraitNodeXTraitCondEntry > sTraitNodeXTraitCondStore
TC_GAME_API DB2Storage< SpellVisualEntry > sSpellVisualStore
TC_GAME_API DB2Storage< QuestXPEntry > sQuestXPStore
TC_GAME_API DB2Storage< GarrBuildingPlotInstEntry > sGarrBuildingPlotInstStore
TC_GAME_API DB2Storage< LightEntry > sLightStore
TC_GAME_API DB2Storage< ArtifactAppearanceSetEntry > sArtifactAppearanceSetStore
TC_GAME_API DB2Storage< ItemExtendedCostEntry > sItemExtendedCostStore
TC_GAME_API DB2Storage< SpellCastingRequirementsEntry > sSpellCastingRequirementsStore
TC_GAME_API DB2Storage< TransmogOutfitSlotOptionEntry > sTransmogOutfitSlotOptionInfoStore
TC_GAME_API DB2Storage< SpellCastTimesEntry > sSpellCastTimesStore
TC_GAME_API DB2Storage< GarrPlotBuildingEntry > sGarrPlotBuildingStore
TC_GAME_API DB2Storage< ItemLevelSelectorQualityEntry > sItemLevelSelectorQualityStore
TC_GAME_API DB2Storage< PvpTierEntry > sPvpTierStore
TC_GAME_API DB2Storage< GarrBuildingEntry > sGarrBuildingStore
TC_GAME_API DB2Storage< ItemSparseEntry > sItemSparseStore
TC_GAME_API DB2Storage< PlayerDataFlagAccountEntry > sPlayerDataFlagAccountStore
TC_GAME_API DB2Storage< TraitNodeXTraitNodeEntryEntry > sTraitNodeXTraitNodeEntryStore
TC_GAME_API DB2Storage< PvpTalentEntry > sPvpTalentStore
TC_GAME_API DB2Storage< ItemSpecEntry > sItemSpecStore
TC_GAME_API DB2Storage< TraitNodeEntryXTraitCondEntry > sTraitNodeEntryXTraitCondStore
TC_GAME_API DB2Storage< ImportPriceWeaponEntry > sImportPriceWeaponStore
TC_GAME_API DB2Storage< PvpTalentSlotUnlockEntry > sPvpTalentSlotUnlockStore
TC_GAME_API DB2Storage< ConversationLineEntry > sConversationLineStore
TC_GAME_API DB2Storage< PlayerDataFlagCharacterEntry > sPlayerDataFlagCharacterStore
TC_GAME_API DB2Storage< ItemArmorShieldEntry > sItemArmorShieldStore
TC_GAME_API DB2Storage< GarrFollowerXAbilityEntry > sGarrFollowerXAbilityStore
TC_GAME_API DB2Storage< ItemSetSpellEntry > sItemSetSpellStore
TC_GAME_API DB2Storage< SpellFocusObjectEntry > sSpellFocusObjectStore
TC_GAME_API DB2Storage< GemPropertiesEntry > sGemPropertiesStore
TC_GAME_API DB2Storage< TransmogOutfitSlotInfoEntry > sTransmogOutfitSlotInfoStore
TC_GAME_API DB2Storage< SpellPowerEntry > sSpellPowerStore
TC_GAME_API DB2Storage< TraitCondEntry > sTraitCondStore
TC_GAME_API DB2Storage< PVPStatEntry > sPVPStatStore
TC_GAME_API DB2Storage< SkillLineAbilityEntry > sSkillLineAbilityStore
TC_GAME_API DB2Storage< ItemBagFamilyEntry > sItemBagFamilyStore
TC_GAME_API DB2Storage< LocationEntry > sLocationStore
TC_GAME_API DB2Storage< SkillLineXTraitTreeEntry > sSkillLineXTraitTreeStore
TC_GAME_API DB2Storage< VignetteEntry > sVignetteStore
TC_GAME_API DB2Storage< FriendshipReputationEntry > sFriendshipReputationStore
TC_GAME_API DB2Storage< ItemDisenchantLootEntry > sItemDisenchantLootStore
TC_GAME_API DB2Storage< TransmogSituationEntry > sTransmogSituationStore
TC_GAME_API DB2Storage< TraitNodeGroupXTraitNodeEntry > sTraitNodeGroupXTraitNodeStore
TC_GAME_API DB2Storage< TraitCostEntry > sTraitCostStore
TC_GAME_API DB2Storage< ConditionalChrModelEntry > sConditionalChrModelStore
TC_GAME_API DB2Storage< CampaignXQuestLineEntry > sCampaignXQuestLineStore
TC_GAME_API DB2Storage< ChrCustomizationOptionEntry > sChrCustomizationOptionStore
TC_GAME_API DB2Storage< CriteriaTreeEntry > sCriteriaTreeStore
TC_GAME_API DB2Storage< GameObjectsEntry > sGameObjectsStore
TC_GAME_API DB2Storage< SpellKeyboundOverrideEntry > sSpellKeyboundOverrideStore
TC_GAME_API TaxiMask sHordeTaxiNodesMask
TC_GAME_API DB2Storage< AnimKitEntry > sAnimKitStore
TC_GAME_API DB2Storage< SpellPowerDifficultyEntry > sSpellPowerDifficultyStore
TC_GAME_API DB2Storage< BroadcastTextEntry > sBroadcastTextStore
TC_GAME_API DB2Storage< ImportPriceShieldEntry > sImportPriceShieldStore
TC_GAME_API DB2Storage< ContentTuningEntry > sContentTuningStore
TC_GAME_API DB2Storage< PowerDisplayEntry > sPowerDisplayStore
TC_GAME_API DB2Storage< CreatureFamilyEntry > sCreatureFamilyStore
TC_GAME_API DB2Storage< AuctionHouseEntry > sAuctionHouseStore
TC_GAME_API DB2Storage< CreatureTypeEntry > sCreatureTypeStore
TC_GAME_API DB2Storage< GarrPlotInstanceEntry > sGarrPlotInstanceStore
TC_GAME_API DB2Storage< TraitSystemEntry > sTraitSystemStore
TC_GAME_API DB2Storage< ImportPriceQualityEntry > sImportPriceQualityStore
TC_GAME_API DB2Storage< VehicleEntry > sVehicleStore
TC_GAME_API DB2Storage< TraitNodeGroupEntry > sTraitNodeGroupStore
#define DEFINE_DB2_SET_COMPARATOR(structure)
Definition DB2Stores.h:383
TC_GAME_API DB2Storage< TraitNodeGroupXTraitCondEntry > sTraitNodeGroupXTraitCondStore
TC_GAME_API DB2Storage< PowerTypeEntry > sPowerTypeStore
TC_GAME_API DB2Storage< ServerMessagesEntry > sServerMessagesStore
TC_GAME_API DB2Storage< SpellEmpowerStageEntry > sSpellEmpowerStageStore
TC_GAME_API DB2Storage< AreaTableEntry > sAreaTableStore
TC_GAME_API DB2Storage< ItemDamageOneHandCasterEntry > sItemDamageOneHandCasterStore
TC_GAME_API DB2Storage< ArtifactPowerEntry > sArtifactPowerStore
TC_GAME_API DB2Storage< DestructibleModelDataEntry > sDestructibleModelDataStore
TC_GAME_API DB2Storage< LockEntry > sLockStore
TC_GAME_API DB2Storage< SpellRangeEntry > sSpellRangeStore
TC_GAME_API DB2Storage< DungeonEncounterEntry > sDungeonEncounterStore
TC_GAME_API DB2Storage< ItemArmorTotalEntry > sItemArmorTotalStore
TC_GAME_API DB2Storage< GarrSiteLevelPlotInstEntry > sGarrSiteLevelPlotInstStore
TC_GAME_API DB2Storage< AzeriteItemMilestonePowerEntry > sAzeriteItemMilestonePowerStore
TC_GAME_API DB2Storage< Cfg_RegionsEntry > sCfgRegionsStore
TC_GAME_API DB2Storage< Cfg_CategoriesEntry > sCfgCategoriesStore
TC_GAME_API DB2Storage< SpellLabelEntry > sSpellLabelStore
TC_GAME_API DB2Storage< AchievementEntry > sAchievementStore
TC_GAME_API DB2Storage< KeystoneAffixEntry > sKeystoneAffixStore
TC_GAME_API DB2Storage< AzeriteLevelInfoEntry > sAzeriteLevelInfoStore
TC_GAME_API DB2Storage< SpellVisualEffectNameEntry > sSpellVisualEffectNameStore
TC_GAME_API DB2Storage< PlayerDataElementCharacterEntry > sPlayerDataElementCharacterStore
TC_GAME_API DB2Storage< ItemDamageTwoHandCasterEntry > sItemDamageTwoHandCasterStore
TC_GAME_API DB2Storage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore
TC_GAME_API DB2Storage< PvpTalentCategoryEntry > sPvpTalentCategoryStore
TC_GAME_API DB2Storage< FactionTemplateEntry > sFactionTemplateStore
TC_GAME_API DB2Storage< ChallengeModeItemBonusOverrideEntry > sChallengeModeItemBonusOverrideStore
TC_GAME_API DB2Storage< SpellEffectEntry > sSpellEffectStore
CurveInterpolationMode
Definition DBCEnums.h:923
@ AZERITE_TIER_UNLOCK_SET_FLAG_DEFAULT
Definition DBCEnums.h:243
UiMapSystem
Definition DBCEnums.h:2973
@ UI_MAP_SYSTEM_ADVENTURE
Definition DBCEnums.h:2976
@ MAX_UI_MAP_SYSTEM
Definition DBCEnums.h:2978
@ UI_MAP_SYSTEM_WORLD
Definition DBCEnums.h:2974
@ UI_MAP_SYSTEM_TAXI
Definition DBCEnums.h:2975
#define MAX_AZERITE_EMPOWERED_TIER
Definition DBCEnums.h:229
@ MAX_LEVEL
Definition DBCEnums.h:45
@ UI_MAP_TYPE_CONTINENT
Definition DBCEnums.h:2985
AzeriteItemMilestoneType
Definition DBCEnums.h:235
GlobalCurve
Definition DBCEnums.h:1174
@ DIFFICULTY_FLAG_DEFAULT
Definition DBCEnums.h:979
@ NoWorldPositions
ItemContext
Definition DBCEnums.h:1324
constexpr size_t PLAYER_EXPLORED_ZONES_SIZE
Definition DBCEnums.h:160
#define MAX_PVP_TALENT_SLOTS
Definition DBCEnums.h:2815
#define MAX_TALENT_TIERS
Definition DBCEnums.h:2813
ContentTuningCalcType
Definition DBCEnums.h:445
ChrSpecialization
Definition DBCEnums.h:400
Difficulty
Definition DBCEnums.h:935
ExpectedStatType
Definition DBCEnums.h:989
#define MAX_TALENT_COLUMNS
Definition DBCEnums.h:2814
BattlegroundBracketId
Definition DBCEnums.h:53
@ MAX_BATTLEGROUND_BRACKETS
Definition DBCEnums.h:58
#define MAX_AZERITE_ESSENCE_SLOT
Definition DBCEnums.h:231
@ QUEST_PACKAGE_FILTER_UNMATCHED
Definition DBCEnums.h:2348
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< HotfixDatabaseConnection > HotfixDatabase
Accessor to the hotfix database.
uint8_t uint8
Definition Define.h:156
int16_t int16
Definition Define.h:151
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint16_t uint16
Definition Define.h:155
@ FT_INT
Definition Define.h:163
uint32_t uint32
Definition Define.h:154
#define SZFMTD
Definition Define.h:144
#define ASSERT
Definition Errors.h:72
@ ITEM_ACCOUNT_BANK_TAB_BAG
@ ITEM_CHARACTER_BANK_TAB_BAG
#define TC_LOG_ERROR(filterType__, message__,...)
Definition Log.h:182
#define TC_LOG_FATAL(filterType__, message__,...)
Definition Log.h:185
#define TC_LOG_INFO(filterType__, message__,...)
Definition Log.h:176
#define sLog
Definition Log.h:156
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
Races
Definition RaceMask.h:28
uint32 rand32()
Definition Random.cpp:71
#define MAX_POWERS_PER_CLASS
Classes
@ CLASS_WARRIOR
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_DEMON_HUNTER
@ CLASS_PALADIN
@ CLASS_ROGUE
constexpr uint32 GetMaxLevelForExpansion(uint32 expansion)
@ GENDER_FEMALE
@ GENDER_NONE
ResponseCodes
@ CHAR_NAME_RESERVED
@ CHAR_NAME_PROFANE
@ CHAR_NAME_SUCCESS
#define MAX_SPECIALIZATIONS
#define PET_SPEC_OVERRIDE_CLASS_INDEX
Powers
@ MAX_POWERS
#define MAX_CLASSES
SpellFamilyNames
#define INITIAL_SPECIALIZATION_INDEX
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:57
uint32 getMSTime()
Definition Timer.h:33
void strToLower(std::string &str)
Definition Util.cpp:435
bool Utf8toWStr(char const *utf8str, size_t csize, wchar_t *wstr, size_t &wsize)
Definition Util.cpp:336
AzeriteEssencePowerEntry const * GetAzeriteEssencePower(uint32 azeriteEssenceId, uint32 rank) const
std::vector< RewardPackXCurrencyTypeEntry const * > const * GetRewardPackCurrencyTypesByRewardID(uint32 rewardPackID) const
SoulbindConduitRankEntry const * GetSoulbindConduitRank(int32 soulbindConduitId, int32 rank) const
int32 const * GetBroadcastTextDuration(uint32 broadcastTextId, LocaleConstant locale=DEFAULT_LOCALE) const
std::vector< ItemSetSpellEntry const * > const * GetItemSetSpells(uint32 itemSetId) const
ChrModelEntry const * GetChrModel(uint8 race, uint8 gender) const
void IndexLoadedStores()
float EvaluateExpectedStat(ExpectedStatType stat, uint32 level, int32 expansion, uint32 contentTuningId, Classes unitClass, int32 mythicPlusMilestoneSeason) const
static char const * GetChrClassName(uint8 class_, LocaleConstant locale=DEFAULT_LOCALE)
static ContentTuningEntry const * GetContentTuningForArea(AreaTableEntry const *areaEntry)
std::vector< uint32 > const * GetArtifactPowerLinks(uint32 artifactPowerId) const
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_) const
static char const * GetBroadcastTextValue(BroadcastTextEntry const *broadcastText, LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false)
FriendshipRepReactionSet const * GetFriendshipRepReactions(uint32 friendshipRepID) const
std::vector< uint32 > const * GetFactionTeamList(uint32 faction) const
bool IsSpecSetMember(int32 specSetId, uint32 specId) const
uint32 GetRequiredAzeriteLevelForAzeritePowerTier(uint32 azeriteUnlockSetId, ItemContext context, uint32 tier) const
std::vector< SpellVisualMissileEntry const * > const * GetSpellVisualMissiles(int32 spellVisualMissileSetId) const
MountEntry const * GetMountById(uint32 id) const
ItemClassEntry const * GetItemClassByOldEnum(uint32 itemClass) const
std::vector< SkillLineEntry const * > const * GetSkillLinesForParentSkill(uint32 parentSkillId) const
MapDifficultyEntry const * GetMapDifficultyData(uint32 mapId, Difficulty difficulty) const
std::vector< ItemLimitCategoryConditionEntry const * > const * GetItemLimitCategoryConditions(uint32 categoryId) const
static bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId, bool requireAllTotems=true)
static uint32 GetPowerIndexByClass(Powers power, uint32 classId)
MapDifficultyEntry const * GetDefaultMapDifficulty(uint32 mapId) const
ItemChildEquipmentEntry const * GetItemChildEquipment(uint32 itemId) const
std::vector< AzeriteItemMilestonePowerEntry const * > const & GetAzeriteItemMilestonePowers() const
static DB2Manager & Instance()
uint32 GetRequiredLevelForPvpTalentSlot(uint8 slot, Classes class_) const
static ClassPowerTypes GetPowerTypesByClass(uint32 classId)
std::vector< std::pair< uint32, PlayerConditionEntry const * > > MapDifficultyConditionsContainer
Definition DB2Stores.h:449
uint32 GetEmptyAnimStateID() const
std::span< int32 const > GetGameObjectLabels(uint32 gameobjectId) const
MapDifficultyConditionsContainer const * GetMapDifficultyConditions(uint32 mapDifficultyId) const
std::vector< ChrSpecialization > const * GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const
static PVPDifficultyEntry const * GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id)
ChrSpecializationEntry const * GetChrSpecializationByIndex(uint32 class_, uint32 index) const
uint32 GetQuestUniqueBitFlag(uint32 questId)
std::vector< uint32 > const * GetPhasesForGroup(uint32 group) const
MountXDisplayContainer const * GetMountDisplays(uint32 mountId) const
DB2StorageBase const * GetStorage(uint32 type) const
static LFGDungeonsEntry const * GetLfgDungeon(uint32 mapId, Difficulty difficulty)
void Map2ZoneCoordinates(uint32 areaId, float &x, float &y) const
int32 _maxHotfixId
Definition DB2Stores.h:576
static CharBaseInfoEntry const * GetCharBaseInfo(Races race, Classes class_)
HotfixContainer const & GetHotfixData() const
static uint32 GetLiquidFlags(uint32 liquidType)
static char const * GetChrRaceName(uint8 race, LocaleConstant locale=DEFAULT_LOCALE)
std::map< int32, HotfixPush > HotfixContainer
Definition DB2Stores.h:446
TaxiPathEntry const * GetTaxiPath(uint32 from, uint32 to) const
std::vector< RewardPackXItemEntry const * > const * GetRewardPackItemsByRewardID(uint32 rewardPackID) const
PowerTypeEntry const * GetPowerTypeByName(std::string const &name) const
static bool GetUiMapPosition(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system, bool local, uint32 *uiMapId=nullptr, DBCPosition2D *newPos=nullptr)
bool Zone2MapCoordinates(uint32 areaId, float &x, float &y) const
ChrClassUIDisplayEntry const * GetUiDisplayForClass(Classes unitClass) const
AzeriteEmpoweredItemEntry const * GetAzeriteEmpoweredItem(uint32 itemId) const
std::vector< uint32 > const * GetGlyphBindableSpells(uint32 glyphPropertiesId) const
PathDb2 const * GetPath(uint32 pathId) const
JournalTierEntry const * GetJournalTier(uint32 index) const
std::vector< ItemSpecOverrideEntry const * > const * GetItemSpecOverrides(uint32 itemId) const
ChrSpecializationEntry const * GetDefaultChrSpecializationForClass(uint32 class_) const
MountTypeXCapabilitySet const * GetMountCapabilities(uint32 mountType) const
bool HasItemCurrencyCost(uint32 itemId) const
std::vector< HotfixOptionalData > const * GetHotfixOptionalData(uint32 tableHash, int32 recordId, LocaleConstant locale) const
CurrencyContainerEntry const * GetCurrencyContainerForCurrencyQuantity(uint32 currencyId, int32 quantity) const
std::vector< ChrCustomizationChoiceEntry const * > const * GetCustomiztionChoices(uint32 chrCustomizationOptionId) const
ShapeshiftFormModelData const * GetShapeshiftFormModelData(uint8 race, uint8 gender, uint8 form) const
static int32 GetNumTalentsAtLevel(uint32 level, Classes playerClass)
std::vector< std::pair< uint32, std::vector< uint32 > > > const * GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const
void InsertNewHotfix(uint32 tableHash, uint32 recordId)
ParagonReputationEntry const * GetParagonReputation(uint32 factionId) const
uint32 GetGlobalCurveId(GlobalCurve globalCurveType) const
static bool IsInArea(uint32 objectAreaId, uint32 areaId)
bool IsAzeriteItem(uint32 itemId) const
std::vector< SpellProcsPerMinuteModEntry const * > GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const
AzeriteItemMilestonePowerEntry const * GetAzeriteItemMilestonePower(uint8 slot) const
Optional< ContentTuningLevels > GetContentTuningData(uint32 contentTuningId, std::span< uint32 const > redirectFlag, bool forItem=false) const
static PVPDifficultyEntry const * GetBattlegroundBracketByLevel(uint32 mapid, uint32 level)
static bool IsValidSpellFamiliyName(SpellFamilyNames family)
HeirloomEntry const * GetHeirloomByItemId(uint32 itemId) const
std::string GetNameGenEntry(uint8 race, uint8 gender) const
bool IsToyItem(uint32 toy) const
std::span< int32 const > GetCreatureLabels(uint32 creatureDifficultyId) const
std::vector< TalentEntry const * > const & GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const
void LoadHotfixBlob(uint32 localeMask)
EmotesTextSoundEntry const * GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const
ArtifactPowerRankEntry const * GetArtifactPowerRank(uint32 artifactPowerId, uint8 rank) const
static ConditionalChrModelEntry const * GetConditionalChrModel(int32 chrModelId)
float GetCurveValueAt(uint32 curveId, float x) const
std::vector< MountXDisplayEntry const * > MountXDisplayContainer
Definition DB2Stores.h:451
std::vector< AzeritePowerSetMemberEntry const * > const * GetAzeritePowers(uint32 itemId) const
static std::string_view GetDifficultyName(Difficulty difficulty)
void LoadHotfixOptionalData(uint32 localeMask)
MapDifficultyEntry const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty difficulty) const
std::vector< SpecializationSpellsEntry const * > const * GetSpecializationSpells(uint32 specId) const
bool HasContentTuningLabel(uint32 contentTuningId, int32 label) const
MountEntry const * GetMount(uint32 spellId) const
static uint32 GetDefaultMapLight(uint32 mapId)
std::vector< QuestPackageItemEntry const * > const * GetQuestPackageItems(uint32 questPackageID) const
std::vector< uint32 > GetAreasForGroup(uint32 areaGroupId) const
std::vector< uint8 > const * GetHotfixBlobData(uint32 tableHash, int32 recordId, LocaleConstant locale) const
uint32 GetHotfixCount() const
std::unordered_set< uint32 > const * GetPVPStatIDsForMap(uint32 mapId) const
std::vector< ArtifactPowerEntry const * > GetArtifactPowers(uint8 artifactId) const
ResponseCodes ValidateName(std::wstring const &name, LocaleConstant locale) const
std::set< MountTypeXCapabilityEntry const *, MountTypeXCapabilityEntryComparator > MountTypeXCapabilitySet
Definition DB2Stores.h:450
static WMOAreaTableEntry const * GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId, bool allowGroupFallback)
bool IsUiMapPhase(uint32 phaseId) const
PowerTypeEntry const * GetPowerTypeEntry(Powers power) const
uint32 LoadStores(std::string const &dataPath, LocaleConstant defaultLocale)
std::vector< QuestPackageItemEntry const * > const * GetQuestPackageItemsFallback(uint32 questPackageID) const
std::set< FriendshipRepReactionEntry const *, FriendshipRepReactionEntryComparator > FriendshipRepReactionSet
Definition DB2Stores.h:448
std::vector< ChrCustomizationOptionEntry const * > const * GetCustomiztionOptions(uint8 race, uint8 gender) const
static char const * GetCreatureFamilyPetName(uint32 petfamily, LocaleConstant locale)
uint32 GetRedirectedContentTuningId(uint32 contentTuningId, std::span< uint32 const > redirectFlag) const
std::vector< SkillLineAbilityEntry const * > const * GetSkillLineAbilitiesBySkill(uint32 skillId) const
void LoadHotfixData(uint32 localeMask)
int32 GetPvpTalentNumSlotsAtLevel(uint32 level, Classes class_) const
std::pair< float, float > GetCurveXAxisRange(uint32 curveId) const
Interface class for common access.
Definition DB2Store.h:31
uint32 GetTableHash() const
Definition DB2Store.h:40
std::string const & GetFileName() const
Definition DB2Store.h:47
void LoadStringsFromDB(LocaleConstant locale)
Definition DB2Store.cpp:136
DB2LoadInfo const * GetLoadInfo() const
Definition DB2Store.h:49
void LoadFromDB()
Definition DB2Store.cpp:127
void Load(std::string const &path, LocaleConstant locale)
Definition DB2Store.cpp:88
void LoadStringsFrom(std::string const &path, LocaleConstant locale)
Definition DB2Store.cpp:110
Class used to access individual fields of database query result.
Definition Field.h:94
std::vector< uint8 > GetBinary() const noexcept
Definition Field.cpp:125
uint32 GetUInt32() const noexcept
Definition Field.cpp:57
uint8 GetUInt8() const noexcept
Definition Field.cpp:29
int32 GetInt32() const noexcept
Definition Field.cpp:64
std::string GetString() const noexcept
Definition Field.cpp:113
uint8 value_type
Definition DBCEnums.h:2526
std::vector< value_type > _data
Definition DBCEnums.h:2540
#define sWorld
Definition World.h:919
@ CONFIG_EXPANSION
Definition World.h:306
@ CONFIG_LOAD_LOCALES
Definition World.h:201
auto MapEqualRange(M &map, typename M::key_type const &key)
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
auto MapGetValuePtr(M &map, typename M::key_type const &key)
Definition MapUtils.h:37
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
TC_REGEX_NAMESPACE ::wregex wregex
Definition Regex.h:29
STL namespace.
static constexpr DB2LoadInfo Instance
Definition DB2LoadInfo.h:66
static constexpr DB2LoadInfo Instance
Definition DB2LoadInfo.h:53
static constexpr DB2LoadInfo Instance
Definition DB2LoadInfo.h:98
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
LocalizedString Text
LocalizedString Text1
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
LocalizedString Name
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
LocalizedString Name
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
EnumFlag< ContentTuningFlag > GetFlags() const
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
LocalizedString Name
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
DBCPosition2D Pos
static constexpr DB2LoadInfo Instance
DBCFormer Type
std::size_t FieldCount
DB2Meta const * Meta
DB2FieldMeta const * Fields
std::vector< uint8 > Data
Definition DB2Stores.h:437
std::vector< HotfixRecord > Records
Definition DB2Stores.h:442
uint8 ArraySize
Definition DB2Meta.h:26
DBCFormer Type
Definition DB2Meta.h:25
uint32 FileFieldCount
Definition DB2Meta.h:52
DB2MetaField const * Fields
Definition DB2Meta.h:54
uint32 GetRecordSize() const
Definition DB2Meta.cpp:32
bool HasIndexFieldInData() const
Definition DB2Meta.cpp:22
uint32 FieldCount
Definition DB2Meta.h:51
int32 ParentIndexField
Definition DB2Meta.h:50
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
ExpectedStatModReducer(int32 mythicPlusMilestoneSeason)
float operator()(float mod, ContentTuningXExpectedEntry const *contentTuningXExpected) const
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
DBCPosition3D GameCoords
int16 ContinentID
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
std::vector< DBCPosition3D > Locations
Definition DB2Stores.h:354
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
char const * NameGlobalStringTag
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
std::vector< ChrCustomizationDisplayInfoEntry const * > Displays
Definition DB2Stores.h:362
std::vector< ChrCustomizationChoiceEntry const * > const * Choices
Definition DB2Stores.h:361
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
std::array< DBCPosition3D, 2 > Region
static constexpr DB2LoadInfo Instance
UiMapAssignmentEntry const * UiMapAssignment
struct UiMapAssignmentStatus::@192 Outside
struct UiMapAssignmentStatus::@191 Inside
uint32 ParentUiMapID
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance