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;
437typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyContainer;
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 UiMapBounds
461 {
462 // these coords are mixed when calculated and used... its a mess
463 float Bounds[4];
464 bool IsUiAssignment;
465 bool IsUiLink;
466 };
467
468 StorageMap _stores;
469 DB2Manager::HotfixContainer _hotfixData;
470 std::array<HotfixBlobMap, TOTAL_LOCALES> _hotfixBlob;
471 std::unordered_multimap<uint32 /*tableHash*/, AllowedHotfixOptionalData> _allowedHotfixOptionalData;
472 std::array<std::map<HotfixBlobKey, std::vector<DB2Manager::HotfixOptionalData>>, TOTAL_LOCALES> _hotfixOptionalData;
473
474 AreaGroupMemberContainer _areaGroupMembers;
475 ArtifactPowersContainer _artifactPowers;
476 ArtifactPowerLinksContainer _artifactPowerLinks;
477 ArtifactPowerRanksContainer _artifactPowerRanks;
478 std::unordered_map<uint32 /*itemId*/, AzeriteEmpoweredItemEntry const*> _azeriteEmpoweredItems;
479 std::unordered_map<std::pair<uint32 /*azeriteEssenceId*/, uint32 /*rank*/>, AzeriteEssencePowerEntry const*> _azeriteEssencePowersByIdAndRank;
480 std::vector<AzeriteItemMilestonePowerEntry const*> _azeriteItemMilestonePowers;
481 std::array<AzeriteItemMilestonePowerEntry const*, MAX_AZERITE_ESSENCE_SLOT> _azeriteItemMilestonePowerByEssenceSlot;
482 std::unordered_map<uint32 /*azeritePowerSetId*/, std::vector<AzeritePowerSetMemberEntry const*>> _azeritePowers;
483 std::unordered_map<std::pair<uint32 /*azeriteUnlockSetId*/, ItemContext>, std::array<uint8, MAX_AZERITE_EMPOWERED_TIER>> _azeriteTierUnlockLevels;
484 std::unordered_map<std::pair<uint32 /*broadcastTextId*/, CascLocaleBit /*cascLocaleBit*/>, int32> _broadcastTextDurations;
485 std::unordered_map<std::pair<uint8, uint8>, CharBaseInfoEntry const*> _charBaseInfoByRaceAndClass;
486 std::array<ChrClassUIDisplayEntry const*, MAX_CLASSES> _uiDisplayByClass;
487 std::array<std::array<uint32, MAX_POWERS>, MAX_CLASSES> _powersByClass;
488 std::unordered_map<uint32 /*chrCustomizationOptionId*/, std::vector<ChrCustomizationChoiceEntry const*>> _chrCustomizationChoicesByOption;
489 std::unordered_map<std::pair<uint8, uint8>, ChrModelEntry const*> _chrModelsByRaceAndGender;
490 std::map<std::tuple<uint8 /*race*/, uint8/*gender*/, uint8/*shapeshift*/>, ShapeshiftFormModelData> _chrCustomizationChoicesForShapeshifts;
491 std::unordered_map<std::pair<uint8 /*race*/, uint8/*gender*/>, std::vector<ChrCustomizationOptionEntry const*>> _chrCustomizationOptionsByRaceAndGender;
492 std::unordered_map<uint32 /*chrCustomizationReqId*/, std::vector<std::pair<uint32 /*chrCustomizationOptionId*/, std::vector<uint32>>>> _chrCustomizationRequiredChoices;
493 ChrSpecializationByIndexContainer _chrSpecializationsByIndex;
494 std::unordered_map<int32, ConditionalChrModelEntry const*> _conditionalChrModelsByChrModelId;
495 std::unordered_map<uint32 /*contentTuningId*/, std::vector<ConditionalContentTuningEntry const*>> _conditionalContentTuning;
496 std::unordered_set<std::pair<uint32, int32>> _contentTuningLabels;
497 std::unordered_map<uint32 /*creatureDifficultyId*/, std::vector<int32>> _creatureLabels;
498 std::unordered_multimap<uint32, CurrencyContainerEntry const*> _currencyContainers;
499 CurvePointsContainer _curvePoints;
500 EmotesTextSoundContainer _emoteTextSounds;
501 std::unordered_map<std::pair<uint32 /*level*/, int32 /*expansion*/>, ExpectedStatEntry const*> _expectedStatsByLevel;
502 std::unordered_map<uint32 /*contentTuningId*/, std::vector<ContentTuningXExpectedEntry const*>> _expectedStatModsByContentTuning;
503 FactionTeamContainer _factionTeams;
504 std::unordered_map<uint32, std::set<FriendshipRepReactionEntry const*, DB2Manager::FriendshipRepReactionEntryComparator>> _friendshipRepReactions;
505 HeirloomItemsContainer _heirlooms;
506 std::unordered_map<uint32 /*gameobjectId*/, std::vector<int32>> _gameobjectLabels;
507 GlyphBindableSpellsContainer _glyphBindableSpells;
508 GlyphRequiredSpecsContainer _glyphRequiredSpecs;
509 ItemChildEquipmentContainer _itemChildEquipment;
510 ItemClassByOldEnumContainer _itemClassByOldEnum;
511 std::unordered_set<uint32> _itemsWithCurrencyCost;
512 ItemLimitCategoryConditionContainer _itemCategoryConditions;
513 ItemSetSpellContainer _itemSetSpells;
514 ItemSpecOverridesContainer _itemSpecOverrides;
515 std::vector<JournalTierEntry const*> _journalTiersByIndex;
516 MapDifficultyContainer _mapDifficulties;
517 std::unordered_map<uint32, DB2Manager::MapDifficultyConditionsContainer> _mapDifficultyConditions;
518 std::unordered_map<uint32, MountEntry const*> _mountsBySpellId;
519 MountCapabilitiesByTypeContainer _mountCapabilitiesByType;
520 MountDisplaysCointainer _mountDisplays;
521 NameGenContainer _nameGenData;
522 NameValidationRegexContainer _nameValidators;
523 std::unordered_map<uint32, ParagonReputationEntry const*> _paragonReputations;
524 std::unordered_map<uint32 /*pathID*/, PathDb2> _paths;
525 PhaseGroupContainer _phasesByGroup;
526 PowerTypesContainer _powerTypes;
527 PvpTalentSlotUnlockEntry const* _pvpTalentSlotUnlock[MAX_PVP_TALENT_SLOTS];
528 QuestPackageItemContainer _questPackages;
529 std::unordered_map<uint32, std::vector<RewardPackXCurrencyTypeEntry const*>> _rewardPackCurrencyTypes;
530 std::unordered_map<uint32, std::vector<RewardPackXItemEntry const*>> _rewardPackItems;
531 std::unordered_map<uint32, std::vector<SkillLineEntry const*>> _skillLinesByParentSkillLine;
532 std::unordered_map<uint32, std::vector<SkillLineAbilityEntry const*>> _skillLineAbilitiesBySkillupSkill;
533 SkillRaceClassInfoContainer _skillRaceClassInfoBySkill;
534 std::unordered_map<std::pair<int32, int32>, SoulbindConduitRankEntry const*> _soulbindConduitRanks;
535 SpecializationSpellsContainer _specializationSpellsBySpec;
536 std::unordered_set<std::pair<int32, uint32>> _specsBySpecSet;
537 std::unordered_set<uint8> _spellFamilyNames;
538 SpellProcsPerMinuteModContainer _spellProcsPerMinuteMods;
539 std::unordered_map<int32, std::vector<SpellVisualMissileEntry const*>> _spellVisualMissilesBySet;
540 TalentsByPosition _talentsByPosition;
541 std::unordered_map<std::pair<uint32, uint32>, TaxiPathEntry const*> _taxiPaths;
543 std::unordered_map<int32, UiMapBounds> _uiMapBounds;
544 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByMap[MAX_UI_MAP_SYSTEM];
545 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByArea[MAX_UI_MAP_SYSTEM];
546 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByWmoDoodadPlacement[MAX_UI_MAP_SYSTEM];
547 std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByWmoGroup[MAX_UI_MAP_SYSTEM];
548 std::unordered_set<int32> _uiMapPhases;
549 WMOAreaTableLookupContainer _wmoAreaTableLookup;
550 std::unordered_map<uint32, std::unordered_set<uint32>> _pvpStatIdsByMap;
551}
552
553static void LoadDB2(std::bitset<TOTAL_LOCALES>& availableDb2Locales, std::vector<std::string>& errlist, StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path,
554 LocaleConstant defaultLocale, std::size_t cppRecordSize)
555{
556 // validate structure
557 {
558 DB2LoadInfo const* loadInfo = storage->GetLoadInfo();
559 std::string clientMetaString, ourMetaString;
560 for (std::size_t i = 0; i < loadInfo->Meta->FieldCount; ++i)
561 {
562 for (std::size_t j = 0; j < loadInfo->Meta->Fields[i].ArraySize; ++j)
563 {
564 if (i >= loadInfo->Meta->FileFieldCount && int32(i) == loadInfo->Meta->ParentIndexField)
565 {
566 clientMetaString += char(FT_INT);
567 continue;
568 }
569
570 clientMetaString += char(loadInfo->Meta->Fields[i].Type);
571 }
572 }
573
574 for (std::size_t i = loadInfo->Meta->HasIndexFieldInData() ? 0 : 1; i < loadInfo->FieldCount; ++i)
575 ourMetaString += char(loadInfo->Fields[i].Type);
576
577 ASSERT(clientMetaString == ourMetaString,
578 "%s C++ structure fields %s do not match generated types from the client %s",
579 storage->GetFileName().c_str(), ourMetaString.c_str(), clientMetaString.c_str());
580
581 // compatibility format and C++ structure sizes
582 ASSERT(loadInfo->Meta->GetRecordSize() == cppRecordSize,
583 "Size of '%s' set by format string (%u) not equal size of C++ structure (" SZFMTD ").",
584 storage->GetFileName().c_str(), loadInfo->Meta->GetRecordSize(), cppRecordSize);
585 }
586
587 try
588 {
589 storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale);
590 }
591 catch (std::system_error const& e)
592 {
593 if (e.code() == std::errc::no_such_file_or_directory)
594 {
595 errlist.push_back(Trinity::StringFormat("File {}{}/{} does not exist", db2Path, localeNames[defaultLocale], storage->GetFileName()));
596 }
597 else
598 throw;
599 }
600 catch (std::exception const& e)
601 {
602 errlist.emplace_back(e.what());
603 return;
604 }
605
606 // load additional data and enUS strings from db
607 storage->LoadFromDB();
608
609 for (LocaleConstant i = LOCALE_enUS; i < TOTAL_LOCALES; i = LocaleConstant(i + 1))
610 {
611 if (defaultLocale == i || !availableDb2Locales[i])
612 continue;
613
614 try
615 {
616 storage->LoadStringsFrom((db2Path + localeNames[i] + '/'), i);
617 }
618 catch (std::system_error const& e)
619 {
620 if (e.code() != std::errc::no_such_file_or_directory)
621 throw;
622
623 // locale db2 files are optional, do not error if nothing is found
624 }
625 catch (std::exception const& e)
626 {
627 errlist.emplace_back(e.what());
628 }
629 }
630
631 for (LocaleConstant i = LOCALE_koKR; i < TOTAL_LOCALES; i = LocaleConstant(i + 1))
632 if (availableDb2Locales[i])
633 storage->LoadStringsFromDB(i);
634
635 stores[storage->GetTableHash()] = storage;
636}
637
639{
640 static DB2Manager instance;
641 return instance;
642}
643
644uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaultLocale)
645{
646 uint32 oldMSTime = getMSTime();
647
648 std::string db2Path = dataPath + "dbc/";
649
650 std::vector<std::string> loadErrors;
651 std::bitset<TOTAL_LOCALES> availableDb2Locales = [&]()
652 {
653 std::bitset<TOTAL_LOCALES> foundLocales;
654 boost::filesystem::directory_iterator db2PathItr(db2Path), end;
655 while (db2PathItr != end)
656 {
657 LocaleConstant locale = GetLocaleByName(db2PathItr->path().filename().string());
658 if (IsValidLocale(locale) && (sWorld->getBoolConfig(CONFIG_LOAD_LOCALES) || locale == defaultLocale))
659 foundLocales[locale] = true;
660
661 ++db2PathItr;
662 }
663 return foundLocales;
664 }();
665
666 if (!availableDb2Locales[defaultLocale])
667 return 0;
668
669 auto LOAD_DB2 = [&]<typename T>(DB2Storage<T>& store)
670 {
671 LoadDB2(availableDb2Locales, loadErrors, _stores, &store, db2Path, defaultLocale, sizeof(T));
672 };
673
674 LOAD_DB2(sAchievementStore);
676 LOAD_DB2(sAdventureJournalStore);
677 LOAD_DB2(sAdventureMapPOIStore);
678 LOAD_DB2(sAnimationDataStore);
679 LOAD_DB2(sAnimKitStore);
680 LOAD_DB2(sAreaGroupMemberStore);
681 LOAD_DB2(sAreaTableStore);
682 LOAD_DB2(sAreaTriggerStore);
684 LOAD_DB2(sArmorLocationStore);
685 LOAD_DB2(sArtifactStore);
686 LOAD_DB2(sArtifactAppearanceStore);
688 LOAD_DB2(sArtifactCategoryStore);
689 LOAD_DB2(sArtifactPowerStore);
690 LOAD_DB2(sArtifactPowerLinkStore);
692 LOAD_DB2(sArtifactPowerRankStore);
693 LOAD_DB2(sArtifactTierStore);
694 LOAD_DB2(sArtifactUnlockStore);
695 LOAD_DB2(sAuctionHouseStore);
697 LOAD_DB2(sAzeriteEssenceStore);
699 LOAD_DB2(sAzeriteItemStore);
702 LOAD_DB2(sAzeriteLevelInfoStore);
703 LOAD_DB2(sAzeritePowerStore);
705 LOAD_DB2(sAzeriteTierUnlockStore);
708 LOAD_DB2(sBankTabStore);
709 LOAD_DB2(sBannedAddonsStore);
710 LOAD_DB2(sBarberShopStyleStore);
711 LOAD_DB2(sBattlePetAbilityStore);
714 LOAD_DB2(sBattlePetSpeciesStore);
716 LOAD_DB2(sBattlemasterListStore);
718 LOAD_DB2(sBroadcastTextStore);
720 LOAD_DB2(sCampaignStore);
721 LOAD_DB2(sCampaignXQuestLineStore);
722 LOAD_DB2(sCfgCategoriesStore);
723 LOAD_DB2(sCfgRegionsStore);
725 LOAD_DB2(sCharBaseInfoStore);
726 LOAD_DB2(sCharTitlesStore);
727 LOAD_DB2(sCharacterLoadoutStore);
729 LOAD_DB2(sChatChannelsStore);
730 LOAD_DB2(sChrClassUIDisplayStore);
731 LOAD_DB2(sChrClassesStore);
739 LOAD_DB2(sChrModelStore);
740 LOAD_DB2(sChrRaceXChrModelStore);
741 LOAD_DB2(sChrRacesStore);
742 LOAD_DB2(sChrSpecializationStore);
743 LOAD_DB2(sCinematicCameraStore);
744 LOAD_DB2(sCinematicSequencesStore);
747 LOAD_DB2(sContentTuningStore);
750 LOAD_DB2(sConversationLineStore);
751 LOAD_DB2(sCorruptionEffectsStore);
752 LOAD_DB2(sCraftingQualityStore);
755 LOAD_DB2(sCreatureFamilyStore);
756 LOAD_DB2(sCreatureLabelStore);
757 LOAD_DB2(sCreatureModelDataStore);
758 LOAD_DB2(sCreatureTypeStore);
759 LOAD_DB2(sCriteriaStore);
760 LOAD_DB2(sCriteriaTreeStore);
761 LOAD_DB2(sCurrencyContainerStore);
762 LOAD_DB2(sCurrencyTypesStore);
763 LOAD_DB2(sCurveStore);
764 LOAD_DB2(sCurvePointStore);
766 LOAD_DB2(sDifficultyStore);
767 LOAD_DB2(sDungeonEncounterStore);
768 LOAD_DB2(sDurabilityCostsStore);
769 LOAD_DB2(sDurabilityQualityStore);
770 LOAD_DB2(sEmotesStore);
771 LOAD_DB2(sEmotesTextStore);
772 LOAD_DB2(sEmotesTextSoundStore);
773 LOAD_DB2(sExpectedStatStore);
774 LOAD_DB2(sExpectedStatModStore);
775 LOAD_DB2(sFactionStore);
776 LOAD_DB2(sFactionTemplateStore);
777 LOAD_DB2(sFlightCapabilityStore);
780 LOAD_DB2(sGameObjectsStore);
781 LOAD_DB2(sGameObjectArtKitStore);
783 LOAD_DB2(sGameObjectLabelStore);
784 LOAD_DB2(sGarrAbilityStore);
785 LOAD_DB2(sGarrBuildingStore);
787 LOAD_DB2(sGarrClassSpecStore);
788 LOAD_DB2(sGarrFollowerStore);
790 LOAD_DB2(sGarrMissionStore);
791 LOAD_DB2(sGarrPlotStore);
792 LOAD_DB2(sGarrPlotBuildingStore);
793 LOAD_DB2(sGarrPlotInstanceStore);
794 LOAD_DB2(sGarrSiteLevelStore);
796 LOAD_DB2(sGarrTalentTreeStore);
797 LOAD_DB2(sGemPropertiesStore);
798 LOAD_DB2(sGlobalCurveStore);
799 LOAD_DB2(sGlyphBindableSpellStore);
800 LOAD_DB2(sGlyphPropertiesStore);
801 LOAD_DB2(sGlyphRequiredSpecStore);
802 LOAD_DB2(sGossipNPCOptionStore);
804 LOAD_DB2(sGuildColorBorderStore);
805 LOAD_DB2(sGuildColorEmblemStore);
806 LOAD_DB2(sGuildPerkSpellsStore);
807 LOAD_DB2(sHeirloomStore);
808 LOAD_DB2(sHolidaysStore);
809 LOAD_DB2(sImportPriceArmorStore);
810 LOAD_DB2(sImportPriceQualityStore);
811 LOAD_DB2(sImportPriceShieldStore);
812 LOAD_DB2(sImportPriceWeaponStore);
813 LOAD_DB2(sItemAppearanceStore);
814 LOAD_DB2(sItemArmorQualityStore);
815 LOAD_DB2(sItemArmorShieldStore);
816 LOAD_DB2(sItemArmorTotalStore);
817 LOAD_DB2(sItemBagFamilyStore);
818 LOAD_DB2(sItemBonusStore);
821 LOAD_DB2(sItemBonusTreeStore);
822 LOAD_DB2(sItemBonusTreeNodeStore);
823 LOAD_DB2(sItemChildEquipmentStore);
824 LOAD_DB2(sItemClassStore);
827 LOAD_DB2(sItemCurrencyCostStore);
828 LOAD_DB2(sItemDamageAmmoStore);
829 LOAD_DB2(sItemDamageOneHandStore);
831 LOAD_DB2(sItemDamageTwoHandStore);
833 LOAD_DB2(sItemDisenchantLootStore);
834 LOAD_DB2(sItemEffectStore);
835 LOAD_DB2(sItemStore);
836 LOAD_DB2(sItemExtendedCostStore);
837 LOAD_DB2(sItemLevelSelectorStore);
840 LOAD_DB2(sItemLimitCategoryStore);
845 LOAD_DB2(sItemOffsetCurveStore);
846 LOAD_DB2(sItemPriceBaseStore);
847 LOAD_DB2(sItemScalingConfigStore);
848 LOAD_DB2(sItemSearchNameStore);
849 LOAD_DB2(sItemSetStore);
850 LOAD_DB2(sItemSetSpellStore);
851 LOAD_DB2(sItemSparseStore);
852 LOAD_DB2(sItemSpecStore);
853 LOAD_DB2(sItemSpecOverrideStore);
854 LOAD_DB2(sItemSquishEraStore);
855 LOAD_DB2(sItemXBonusTreeStore);
856 LOAD_DB2(sItemXItemEffectStore);
857 LOAD_DB2(sJournalEncounterStore);
859 LOAD_DB2(sJournalInstanceStore);
860 LOAD_DB2(sJournalTierStore);
861 LOAD_DB2(sKeychainStore);
862 LOAD_DB2(sKeystoneAffixStore);
863 LOAD_DB2(sLanguageWordsStore);
864 LOAD_DB2(sLanguagesStore);
865 LOAD_DB2(sLFGDungeonsStore);
866 LOAD_DB2(sLightStore);
867 LOAD_DB2(sLiquidTypeStore);
868 LOAD_DB2(sLocationStore);
869 LOAD_DB2(sLockStore);
870 LOAD_DB2(sMailTemplateStore);
871 LOAD_DB2(sMapStore);
872 LOAD_DB2(sMapChallengeModeStore);
873 LOAD_DB2(sMapDifficultyStore);
875 LOAD_DB2(sMawPowerStore);
877 LOAD_DB2(sModifierTreeStore);
878 LOAD_DB2(sMountCapabilityStore);
879 LOAD_DB2(sMountStore);
880 LOAD_DB2(sMountEquipmentStore);
882 LOAD_DB2(sMountXDisplayStore);
883 LOAD_DB2(sMovieStore);
884 LOAD_DB2(sMythicPlusSeasonStore);
885 LOAD_DB2(sNameGenStore);
886 LOAD_DB2(sNamesProfanityStore);
887 LOAD_DB2(sNamesReservedStore);
889 LOAD_DB2(sNumTalentsAtLevelStore);
890 LOAD_DB2(sOverrideSpellDataStore);
891 LOAD_DB2(sParagonReputationStore);
892 LOAD_DB2(sPathStore);
893 LOAD_DB2(sPathNodeStore);
894 LOAD_DB2(sPathPropertyStore);
895 LOAD_DB2(sPerksActivityStore);
896 LOAD_DB2(sPhaseStore);
897 LOAD_DB2(sPhaseXPhaseGroupStore);
898 LOAD_DB2(sPlayerConditionStore);
903 LOAD_DB2(sPowerDisplayStore);
904 LOAD_DB2(sPowerTypeStore);
905 LOAD_DB2(sPrestigeLevelInfoStore);
906 LOAD_DB2(sPVPDifficultyStore);
907 LOAD_DB2(sPVPStatStore);
908 LOAD_DB2(sPvpSeasonStore);
909 LOAD_DB2(sPvpTalentStore);
910 LOAD_DB2(sPvpTalentCategoryStore);
912 LOAD_DB2(sPvpTierStore);
913 LOAD_DB2(sQuestFactionRewardStore);
914 LOAD_DB2(sQuestInfoStore);
915 LOAD_DB2(sQuestLineXQuestStore);
916 LOAD_DB2(sQuestMoneyRewardStore);
917 LOAD_DB2(sQuestPackageItemStore);
918 LOAD_DB2(sQuestSortStore);
919 LOAD_DB2(sQuestV2Store);
920 LOAD_DB2(sQuestXPStore);
921 LOAD_DB2(sRandPropPointsStore);
922 LOAD_DB2(sRewardPackStore);
924 LOAD_DB2(sRewardPackXItemStore);
925 LOAD_DB2(sScenarioStore);
926 LOAD_DB2(sScenarioStepStore);
927 LOAD_DB2(sSceneScriptStore);
929 LOAD_DB2(sSceneScriptPackageStore);
930 LOAD_DB2(sSceneScriptTextStore);
931 LOAD_DB2(sServerMessagesStore);
932 LOAD_DB2(sSkillLineStore);
933 LOAD_DB2(sSkillLineAbilityStore);
935 LOAD_DB2(sSkillRaceClassInfoStore);
937 LOAD_DB2(sSoundKitStore);
939 LOAD_DB2(sSpecSetMemberStore);
940 LOAD_DB2(sSpellAuraOptionsStore);
942 LOAD_DB2(sSpellCastTimesStore);
944 LOAD_DB2(sSpellCategoriesStore);
945 LOAD_DB2(sSpellCategoryStore);
946 LOAD_DB2(sSpellClassOptionsStore);
947 LOAD_DB2(sSpellCooldownsStore);
948 LOAD_DB2(sSpellDurationStore);
949 LOAD_DB2(sSpellEffectStore);
950 LOAD_DB2(sSpellEquippedItemsStore);
951 LOAD_DB2(sSpellEmpowerStore);
952 LOAD_DB2(sSpellEmpowerStageStore);
953 LOAD_DB2(sSpellFocusObjectStore);
954 LOAD_DB2(sSpellInterruptsStore);
958 LOAD_DB2(sSpellLabelStore);
959 LOAD_DB2(sSpellLearnSpellStore);
960 LOAD_DB2(sSpellLevelsStore);
961 LOAD_DB2(sSpellMiscStore);
962 LOAD_DB2(sSpellNameStore);
963 LOAD_DB2(sSpellPowerStore);
967 LOAD_DB2(sSpellRadiusStore);
968 LOAD_DB2(sSpellRangeStore);
969 LOAD_DB2(sSpellReagentsStore);
971 LOAD_DB2(sSpellScalingStore);
972 LOAD_DB2(sSpellShapeshiftStore);
975 LOAD_DB2(sSpellTotemsStore);
976 LOAD_DB2(sSpellVisualStore);
978 LOAD_DB2(sSpellVisualMissileStore);
979 LOAD_DB2(sSpellVisualKitStore);
980 LOAD_DB2(sSpellXSpellVisualStore);
981 LOAD_DB2(sSummonPropertiesStore);
982 LOAD_DB2(sTactKeyStore);
983 LOAD_DB2(sTalentStore);
984 LOAD_DB2(sTaxiNodesStore);
985 LOAD_DB2(sTaxiPathStore);
986 LOAD_DB2(sTaxiPathNodeStore);
987 LOAD_DB2(sTotemCategoryStore);
988 LOAD_DB2(sToyStore);
989 LOAD_DB2(sTraitCondStore);
991 LOAD_DB2(sTraitCostStore);
992 LOAD_DB2(sTraitCurrencyStore);
994 LOAD_DB2(sTraitDefinitionStore);
996 LOAD_DB2(sTraitEdgeStore);
997 LOAD_DB2(sTraitNodeStore);
998 LOAD_DB2(sTraitNodeEntryStore);
1001 LOAD_DB2(sTraitNodeGroupStore);
1005 LOAD_DB2(sTraitNodeXTraitCondStore);
1006 LOAD_DB2(sTraitNodeXTraitCostStore);
1008 LOAD_DB2(sTraitSubTreeStore);
1009 LOAD_DB2(sTraitSystemStore);
1010 LOAD_DB2(sTraitTreeStore);
1011 LOAD_DB2(sTraitTreeLoadoutStore);
1013 LOAD_DB2(sTraitTreeXTraitCostStore);
1015 LOAD_DB2(sTransmogHolidayStore);
1016 LOAD_DB2(sTransmogIllusionStore);
1017 LOAD_DB2(sTransmogOutfitEntryStore);
1020 LOAD_DB2(sTransmogSituationStore);
1023 LOAD_DB2(sTransmogSetStore);
1024 LOAD_DB2(sTransmogSetGroupStore);
1025 LOAD_DB2(sTransmogSetItemStore);
1026 LOAD_DB2(sTransportAnimationStore);
1027 LOAD_DB2(sTransportRotationStore);
1028 LOAD_DB2(sUiMapStore);
1029 LOAD_DB2(sUiMapAssignmentStore);
1030 LOAD_DB2(sUiMapLinkStore);
1031 LOAD_DB2(sUiMapXMapArtStore);
1032 LOAD_DB2(sUISplashScreenStore);
1033 LOAD_DB2(sUnitConditionStore);
1034 LOAD_DB2(sUnitPowerBarStore);
1035 LOAD_DB2(sVehicleStore);
1036 LOAD_DB2(sVehicleSeatStore);
1037 LOAD_DB2(sVignetteStore);
1038 LOAD_DB2(sWarbandSceneStore);
1039 LOAD_DB2(sWMOAreaTableStore);
1040 LOAD_DB2(sWorldEffectStore);
1041 LOAD_DB2(sWorldMapOverlayStore);
1043
1044 // error checks
1045
1046 // Check loaded DB2 files proper version
1048 if (!sItemSparseStore.LookupEntry(criticalItemId))
1049 loadErrors.emplace_back(Trinity::StringFormat("Missing required item {} from ItemSparse.db2 (or its hotfix table)", criticalItemId));
1050
1051 if (!loadErrors.empty())
1052 {
1053 sLog->SetSynchronous(); // server will shut down after this, so set sync logging to prevent messages from getting lost
1054
1055 for (std::string const& error : loadErrors)
1056 TC_LOG_FATAL("misc", "{}", error);
1057
1058 return 0;
1059 }
1060
1061 TC_LOG_INFO("server.loading", ">> Initialized {} DB2 data stores in {} ms", _stores.size(), GetMSTimeDiffToNow(oldMSTime));
1062
1063 return availableDb2Locales.to_ulong();
1064}
1065
1067{
1068 uint32 oldMSTime = getMSTime();
1069
1070 for (AreaGroupMemberEntry const* areaGroupMember : sAreaGroupMemberStore)
1071 _areaGroupMembers[areaGroupMember->AreaGroupID].push_back(areaGroupMember->AreaID);
1072
1073 for (AreaTableEntry const* areaTable : sAreaTableStore)
1074 {
1075 ASSERT(areaTable->AreaBit <= 0 || (size_t(areaTable->AreaBit / 64) < PLAYER_EXPLORED_ZONES_SIZE),
1076 "PLAYER_EXPLORED_ZONES_SIZE must be at least %d", (areaTable->AreaBit + 63) / 64);
1077 }
1078
1079 for (ArtifactPowerEntry const* artifactPower : sArtifactPowerStore)
1080 _artifactPowers[artifactPower->ArtifactID].push_back(artifactPower);
1081
1082 for (ArtifactPowerLinkEntry const* artifactPowerLink : sArtifactPowerLinkStore)
1083 {
1084 _artifactPowerLinks[artifactPowerLink->PowerA].push_back(artifactPowerLink->PowerB);
1085 _artifactPowerLinks[artifactPowerLink->PowerB].push_back(artifactPowerLink->PowerA);
1086 }
1087
1088 for (ArtifactPowerRankEntry const* artifactPowerRank : sArtifactPowerRankStore)
1089 _artifactPowerRanks[std::pair<uint32, uint8>{ artifactPowerRank->ArtifactPowerID, artifactPowerRank->RankIndex }] = artifactPowerRank;
1090
1091 for (AzeriteEmpoweredItemEntry const* azeriteEmpoweredItem : sAzeriteEmpoweredItemStore)
1092 _azeriteEmpoweredItems[azeriteEmpoweredItem->ItemID] = azeriteEmpoweredItem;
1093
1094 for (AzeriteEssencePowerEntry const* azeriteEssencePower : sAzeriteEssencePowerStore)
1095 _azeriteEssencePowersByIdAndRank[std::pair<uint32, uint32>{ azeriteEssencePower->AzeriteEssenceID, azeriteEssencePower->Tier }] = azeriteEssencePower;
1096
1097 for (AzeriteItemMilestonePowerEntry const* azeriteItemMilestonePower : sAzeriteItemMilestonePowerStore)
1098 _azeriteItemMilestonePowers.push_back(azeriteItemMilestonePower);
1099
1100 std::ranges::sort(_azeriteItemMilestonePowers, {}, &AzeriteItemMilestonePowerEntry::RequiredLevel);
1101
1102 {
1103 uint32 azeriteEssenceSlot = 0;
1104 for (AzeriteItemMilestonePowerEntry const* azeriteItemMilestonePower : _azeriteItemMilestonePowers)
1105 {
1106 AzeriteItemMilestoneType type = AzeriteItemMilestoneType(azeriteItemMilestonePower->Type);
1108 {
1109 ASSERT(azeriteEssenceSlot < MAX_AZERITE_ESSENCE_SLOT);
1110 _azeriteItemMilestonePowerByEssenceSlot[azeriteEssenceSlot] = azeriteItemMilestonePower;
1111 ++azeriteEssenceSlot;
1112 }
1113 }
1114 }
1115
1116 for (AzeritePowerSetMemberEntry const* azeritePowerSetMember : sAzeritePowerSetMemberStore)
1117 if (sAzeritePowerStore.LookupEntry(azeritePowerSetMember->AzeritePowerID))
1118 _azeritePowers[azeritePowerSetMember->AzeritePowerSetID].push_back(azeritePowerSetMember);
1119
1120 for (AzeriteTierUnlockEntry const* azeriteTierUnlock : sAzeriteTierUnlockStore)
1121 _azeriteTierUnlockLevels[std::pair<uint32, ItemContext>{ azeriteTierUnlock->AzeriteTierUnlockSetID, ItemContext(azeriteTierUnlock->ItemCreationContext) }][azeriteTierUnlock->Tier] = azeriteTierUnlock->AzeriteLevel;
1122
1123 for (BattlemasterListEntry const* battlemaster : sBattlemasterListStore)
1124 {
1125 if (battlemaster->MaxLevel < battlemaster->MinLevel)
1126 {
1127 TC_LOG_ERROR("db2.hotfix.battlemaster_list", "Battlemaster ({}) contains bad values for MinLevel ({}) and MaxLevel ({}). Swapping values.", battlemaster->ID, battlemaster->MinLevel, battlemaster->MaxLevel);
1128 std::swap(const_cast<BattlemasterListEntry*>(battlemaster)->MaxLevel, const_cast<BattlemasterListEntry*>(battlemaster)->MinLevel);
1129 }
1130 if (battlemaster->MaxPlayers < battlemaster->MinPlayers)
1131 {
1132 TC_LOG_ERROR("db2.hotfix.battlemaster_list", "Battlemaster ({}) contains bad values for MinPlayers ({}) and MaxPlayers ({}). Swapping values.", battlemaster->ID, battlemaster->MinPlayers, battlemaster->MaxPlayers);
1133 int8 minPlayers = battlemaster->MinPlayers;
1134 const_cast<BattlemasterListEntry*>(battlemaster)->MinPlayers = battlemaster->MaxPlayers;
1135 const_cast<BattlemasterListEntry*>(battlemaster)->MaxPlayers = minPlayers;
1136 }
1137 }
1138
1139 _broadcastTextDurations.reserve(sBroadcastTextDurationStore.GetNumRows());
1140 for (BroadcastTextDurationEntry const* broadcastTextDuration : sBroadcastTextDurationStore)
1141 _broadcastTextDurations[{ broadcastTextDuration->BroadcastTextID, CascLocaleBit(broadcastTextDuration->Locale) }] = broadcastTextDuration->Duration;
1142
1143 for (CharBaseInfoEntry const* charBaseInfo : sCharBaseInfoStore)
1144 _charBaseInfoByRaceAndClass[{ charBaseInfo->RaceID, charBaseInfo->ClassID }] = charBaseInfo;
1145
1146 for (ChrClassUIDisplayEntry const* uiDisplay : sChrClassUIDisplayStore)
1147 {
1148 ASSERT(uiDisplay->ChrClassesID < MAX_CLASSES);
1149 _uiDisplayByClass[uiDisplay->ChrClassesID] = uiDisplay;
1150 }
1151
1152 {
1153 std::set<ChrClassesXPowerTypesEntry const*, ChrClassesXPowerTypesEntryComparator> powers;
1155 powers.insert(power);
1156
1157 for (std::array<uint32, MAX_POWERS>& powersForClass : _powersByClass)
1158 powersForClass.fill(MAX_POWERS);
1159
1160 for (ChrClassesXPowerTypesEntry const* power : powers)
1161 {
1162 uint32 index = 0;
1163 for (uint32 j = 0; j < MAX_POWERS; ++j)
1164 if (_powersByClass[power->ClassID][j] != MAX_POWERS)
1165 ++index;
1166
1167 ASSERT(power->ClassID < MAX_CLASSES);
1168 ASSERT(power->PowerType < MAX_POWERS);
1169 _powersByClass[power->ClassID][power->PowerType] = index;
1170 }
1171 }
1172
1173 for (ChrCustomizationChoiceEntry const* customizationChoice : sChrCustomizationChoiceStore)
1174 _chrCustomizationChoicesByOption[customizationChoice->ChrCustomizationOptionID].push_back(customizationChoice);
1175
1176 std::unordered_multimap<uint32, std::pair<uint32, uint8>> shapeshiftFormByModel;
1177 std::unordered_map<uint32, ChrCustomizationDisplayInfoEntry const*> displayInfoByCustomizationChoice;
1178
1179 // build shapeshift form model lookup
1180 for (ChrCustomizationElementEntry const* customizationElement : sChrCustomizationElementStore)
1181 {
1182 if (ChrCustomizationDisplayInfoEntry const* customizationDisplayInfo = sChrCustomizationDisplayInfoStore.LookupEntry(customizationElement->ChrCustomizationDisplayInfoID))
1183 {
1184 if (ChrCustomizationChoiceEntry const* customizationChoice = sChrCustomizationChoiceStore.LookupEntry(customizationElement->ChrCustomizationChoiceID))
1185 {
1186 displayInfoByCustomizationChoice[customizationElement->ChrCustomizationChoiceID] = customizationDisplayInfo;
1187 if (ChrCustomizationOptionEntry const* customizationOption = sChrCustomizationOptionStore.LookupEntry(customizationChoice->ChrCustomizationOptionID))
1188 shapeshiftFormByModel.emplace(customizationOption->ChrModelID, std::make_pair(customizationOption->ID, uint8(customizationDisplayInfo->ShapeshiftFormID)));
1189 }
1190 }
1191 }
1192
1193 std::unordered_map<uint32, std::vector<ChrCustomizationOptionEntry const*>> customizationOptionsByModel;
1194 for (ChrCustomizationOptionEntry const* customizationOption : sChrCustomizationOptionStore)
1195 customizationOptionsByModel[customizationOption->ChrModelID].push_back(customizationOption);
1196
1198 {
1199 if (ChrCustomizationChoiceEntry const* customizationChoice = sChrCustomizationChoiceStore.LookupEntry(reqChoice->ChrCustomizationChoiceID))
1200 {
1201 std::vector<std::pair<uint32, std::vector<uint32>>>& requiredChoicesForReq = _chrCustomizationRequiredChoices[reqChoice->ChrCustomizationReqID];
1202 std::vector<uint32>* choices = nullptr;
1203 for (std::pair<uint32, std::vector<uint32>>& choicesForOption : requiredChoicesForReq)
1204 {
1205 if (choicesForOption.first == customizationChoice->ChrCustomizationOptionID)
1206 {
1207 choices = &choicesForOption.second;
1208 break;
1209 }
1210 }
1211 if (!choices)
1212 {
1213 std::pair<uint32, std::vector<uint32>>& choicesForReq = requiredChoicesForReq.emplace_back();
1214 choicesForReq.first = customizationChoice->ChrCustomizationOptionID;
1215 choices = &choicesForReq.second;
1216 }
1217 choices->push_back(reqChoice->ChrCustomizationChoiceID);
1218 }
1219 }
1220
1221 std::unordered_map<uint32, uint32> parentRaces;
1222 for (ChrRacesEntry const* chrRace : sChrRacesStore)
1223 if (chrRace->UnalteredVisualRaceID)
1224 parentRaces[chrRace->UnalteredVisualRaceID] = chrRace->ID;
1225
1226 for (ChrRaceXChrModelEntry const* raceModel : sChrRaceXChrModelStore)
1227 {
1228 if (ChrModelEntry const* model = sChrModelStore.LookupEntry(raceModel->ChrModelID))
1229 {
1230 _chrModelsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex) }] = model;
1231
1232 if (std::vector<ChrCustomizationOptionEntry const*> const* customizationOptionsForModel = Trinity::Containers::MapGetValuePtr(customizationOptionsByModel, model->ID))
1233 {
1234 std::vector<ChrCustomizationOptionEntry const*>& raceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex) }];
1235 raceOptions.insert(raceOptions.end(), customizationOptionsForModel->begin(), customizationOptionsForModel->end());
1236
1237 if (uint32 const* parentRace = Trinity::Containers::MapGetValuePtr(parentRaces, raceModel->ChrRacesID))
1238 {
1239 std::vector<ChrCustomizationOptionEntry const*>& parentRaceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(*parentRace), uint8(raceModel->Sex) }];
1240 parentRaceOptions.insert(parentRaceOptions.end(), customizationOptionsForModel->begin(), customizationOptionsForModel->end());
1241 }
1242 }
1243
1244 // link shapeshift displays to race/gender/form
1245 for (std::pair<uint32 const, std::pair<uint32, uint8>> const& shapeshiftOptionsForModel : Trinity::Containers::MapEqualRange(shapeshiftFormByModel, model->ID))
1246 {
1247 ShapeshiftFormModelData& data = _chrCustomizationChoicesForShapeshifts[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex), shapeshiftOptionsForModel.second.second }];
1248 data.OptionID = shapeshiftOptionsForModel.second.first;
1249 data.Choices = Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesByOption, shapeshiftOptionsForModel.second.first);
1250 if (data.Choices)
1251 {
1252 data.Displays.resize(data.Choices->size());
1253 for (std::size_t i = 0; i < data.Choices->size(); ++i)
1254 data.Displays[i] = Trinity::Containers::MapGetValuePtr(displayInfoByCustomizationChoice, (*data.Choices)[i]->ID);
1255 }
1256 }
1257 }
1258 }
1259
1260 memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex));
1261 for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore)
1262 {
1263 ASSERT(chrSpec->ClassID < MAX_CLASSES);
1264 ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS);
1265
1266 uint32 storageIndex = chrSpec->ClassID;
1267 if (chrSpec->GetFlags().HasFlag(ChrSpecializationFlag::PetOverrideSpec))
1268 {
1269 ASSERT(!chrSpec->ClassID);
1270 storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX;
1271 }
1272
1273 _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec;
1274 }
1275
1276 for (ConditionalChrModelEntry const* conditionalChrModel : sConditionalChrModelStore)
1277 _conditionalChrModelsByChrModelId[conditionalChrModel->ChrModelID] = conditionalChrModel;
1278
1279 {
1280 for (ConditionalContentTuningEntry const* conditionalContentTuning : sConditionalContentTuningStore)
1281 _conditionalContentTuning[conditionalContentTuning->ParentContentTuningID].push_back(conditionalContentTuning);
1282
1283 for (auto& [parentContentTuningId, conditionalContentTunings] : _conditionalContentTuning)
1284 std::ranges::sort(conditionalContentTunings, std::greater(), &ConditionalContentTuningEntry::OrderIndex);
1285 }
1286
1287 for (ContentTuningXExpectedEntry const* contentTuningXExpectedStat : sContentTuningXExpectedStore)
1288 if (sExpectedStatModStore.LookupEntry(contentTuningXExpectedStat->ExpectedStatModID))
1289 _expectedStatModsByContentTuning[contentTuningXExpectedStat->ContentTuningID].push_back(contentTuningXExpectedStat);
1290
1291 for (ContentTuningXLabelEntry const* contentTuningXLabel : sContentTuningXLabelStore)
1292 _contentTuningLabels.emplace(contentTuningXLabel->ContentTuningID, contentTuningXLabel->LabelID);
1293
1294 for (CreatureLabelEntry const* creatureLabel : sCreatureLabelStore)
1295 _creatureLabels[creatureLabel->CreatureDifficultyID].push_back(creatureLabel->LabelID);
1296
1297 for (CurrencyContainerEntry const* currencyContainer : sCurrencyContainerStore)
1298 _currencyContainers.emplace(currencyContainer->CurrencyTypesID, currencyContainer);
1299
1300 {
1301 std::unordered_map<uint32 /*curveID*/, std::vector<CurvePointEntry const*>> unsortedPoints;
1302 for (CurvePointEntry const* curvePoint : sCurvePointStore)
1303 if (sCurveStore.LookupEntry(curvePoint->CurveID))
1304 unsortedPoints[curvePoint->CurveID].push_back(curvePoint);
1305
1306 for (auto& [curveId, curvePoints] : unsortedPoints)
1307 {
1308 std::ranges::sort(curvePoints, {}, &CurvePointEntry::OrderIndex);
1309 std::vector<DBCPosition2D>& points = _curvePoints[curveId];
1310 points.resize(curvePoints.size());
1311 std::ranges::transform(curvePoints, points.begin(), &CurvePointEntry::Pos);
1312 }
1313 }
1314
1315 for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore)
1316 _emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextID, emoteTextSound->RaceID, emoteTextSound->SexID, emoteTextSound->ClassID)] = emoteTextSound;
1317
1318 for (ExpectedStatEntry const* expectedStat : sExpectedStatStore)
1319 _expectedStatsByLevel[std::make_pair(expectedStat->Lvl, expectedStat->ExpansionID)] = expectedStat;
1320
1321 for (FactionEntry const* faction : sFactionStore)
1322 if (faction->ParentFactionID)
1323 _factionTeams[faction->ParentFactionID].push_back(faction->ID);
1324
1325 for (FriendshipRepReactionEntry const* friendshipRepReaction : sFriendshipRepReactionStore)
1326 _friendshipRepReactions[friendshipRepReaction->FriendshipRepID].insert(friendshipRepReaction);
1327
1328 for (GameObjectDisplayInfoEntry const* gameObjectDisplayInfo : sGameObjectDisplayInfoStore)
1329 {
1330 if (gameObjectDisplayInfo->GeoBoxMax.X < gameObjectDisplayInfo->GeoBoxMin.X)
1331 std::swap(const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMax.X, const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMin.X);
1332 if (gameObjectDisplayInfo->GeoBoxMax.Y < gameObjectDisplayInfo->GeoBoxMin.Y)
1333 std::swap(const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMax.Y, const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMin.Y);
1334 if (gameObjectDisplayInfo->GeoBoxMax.Z < gameObjectDisplayInfo->GeoBoxMin.Z)
1335 std::swap(const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMax.Z, const_cast<GameObjectDisplayInfoEntry*>(gameObjectDisplayInfo)->GeoBoxMin.Z);
1336 }
1337
1338 for (GameObjectLabelEntry const* gameobjectLabel : sGameObjectLabelStore)
1339 _gameobjectLabels[gameobjectLabel->GameObjectID].push_back(gameobjectLabel->LabelID);
1340
1341 for (HeirloomEntry const* heirloom : sHeirloomStore)
1342 _heirlooms[heirloom->ItemID] = heirloom;
1343
1344 for (GlyphBindableSpellEntry const* glyphBindableSpell : sGlyphBindableSpellStore)
1345 _glyphBindableSpells[glyphBindableSpell->GlyphPropertiesID].push_back(glyphBindableSpell->SpellID);
1346
1347 for (GlyphRequiredSpecEntry const* glyphRequiredSpec : sGlyphRequiredSpecStore)
1348 _glyphRequiredSpecs[glyphRequiredSpec->GlyphPropertiesID].push_back(ChrSpecialization(glyphRequiredSpec->ChrSpecializationID));
1349
1350 for (ItemChildEquipmentEntry const* itemChildEquipment : sItemChildEquipmentStore)
1351 {
1352 ASSERT(_itemChildEquipment.find(itemChildEquipment->ParentItemID) == _itemChildEquipment.end(), "Item must have max 1 child item.");
1353 _itemChildEquipment[itemChildEquipment->ParentItemID] = itemChildEquipment;
1354 }
1355
1356 for (ItemClassEntry const* itemClass : sItemClassStore)
1357 {
1358 ASSERT(itemClass->ClassID < int32(_itemClassByOldEnum.size()));
1359 ASSERT(!_itemClassByOldEnum[itemClass->ClassID]);
1360 _itemClassByOldEnum[itemClass->ClassID] = itemClass;
1361 }
1362
1363 for (ItemCurrencyCostEntry const* itemCurrencyCost : sItemCurrencyCostStore)
1364 _itemsWithCurrencyCost.insert(itemCurrencyCost->ItemID);
1365
1367 _itemCategoryConditions[condition->ParentItemLimitCategoryID].push_back(condition);
1368
1369 for (ItemSetSpellEntry const* itemSetSpell : sItemSetSpellStore)
1370 _itemSetSpells[itemSetSpell->ItemSetID].push_back(itemSetSpell);
1371
1372 for (ItemSpecOverrideEntry const* itemSpecOverride : sItemSpecOverrideStore)
1373 _itemSpecOverrides[itemSpecOverride->ItemID].push_back(itemSpecOverride);
1374
1375 for (JournalTierEntry const* journalTier : sJournalTierStore)
1376 _journalTiersByIndex.push_back(journalTier);
1377
1378 for (MapDifficultyEntry const* entry : sMapDifficultyStore)
1379 if (sMapStore.HasRecord(entry->MapID))
1380 _mapDifficulties[entry->MapID][entry->DifficultyID] = entry;
1381
1382 std::vector<MapDifficultyXConditionEntry const*> mapDifficultyConditions;
1383 mapDifficultyConditions.reserve(sMapDifficultyXConditionStore.GetNumRows());
1384 for (MapDifficultyXConditionEntry const* mapDifficultyCondition : sMapDifficultyXConditionStore)
1385 mapDifficultyConditions.push_back(mapDifficultyCondition);
1386
1387 std::ranges::sort(mapDifficultyConditions, {}, &MapDifficultyXConditionEntry::OrderIndex);
1388
1389 for (MapDifficultyXConditionEntry const* mapDifficultyCondition : mapDifficultyConditions)
1390 if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(mapDifficultyCondition->PlayerConditionID))
1391 _mapDifficultyConditions[mapDifficultyCondition->MapDifficultyID].emplace_back(mapDifficultyCondition->ID, playerCondition);
1392
1393 for (MountEntry const* mount : sMountStore)
1394 _mountsBySpellId[mount->SourceSpellID] = mount;
1395
1396 for (MountTypeXCapabilityEntry const* mountTypeCapability : sMountTypeXCapabilityStore)
1397 _mountCapabilitiesByType[mountTypeCapability->MountTypeID].insert(mountTypeCapability);
1398
1399 for (MountXDisplayEntry const* mountDisplay : sMountXDisplayStore)
1400 _mountDisplays[mountDisplay->MountID].push_back(mountDisplay);
1401
1402 for (NameGenEntry const* nameGen : sNameGenStore)
1403 _nameGenData[nameGen->RaceID][nameGen->Sex].push_back(nameGen);
1404
1405 for (NamesProfanityEntry const* namesProfanity : sNamesProfanityStore)
1406 {
1407 ASSERT(namesProfanity->Language < TOTAL_LOCALES || namesProfanity->Language == -1);
1408 std::wstring name;
1409 bool conversionResult = Utf8toWStr(namesProfanity->Name, name);
1410 ASSERT(conversionResult);
1411 if (namesProfanity->Language != -1)
1412 _nameValidators[namesProfanity->Language].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1413 else
1414 {
1415 for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
1416 {
1417 if (i == LOCALE_none)
1418 continue;
1419
1420 _nameValidators[i].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1421 }
1422 }
1423 }
1424
1425 for (NamesReservedEntry const* namesReserved : sNamesReservedStore)
1426 {
1427 std::wstring name;
1428 bool conversionResult = Utf8toWStr(namesReserved->Name, name);
1429 ASSERT(conversionResult);
1430 _nameValidators[TOTAL_LOCALES].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1431 }
1432
1433 for (NamesReservedLocaleEntry const* namesReserved : sNamesReservedLocaleStore)
1434 {
1435 ASSERT(!(namesReserved->LocaleMask & ~((1u << TOTAL_LOCALES) - 1)));
1436 std::wstring name;
1437 bool conversionResult = Utf8toWStr(namesReserved->Name, name);
1438 ASSERT(conversionResult);
1439 for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
1440 {
1441 if (i == LOCALE_none)
1442 continue;
1443
1444 if (namesReserved->LocaleMask & (1 << i))
1445 _nameValidators[i].emplace_back(name, Trinity::regex::perl | Trinity::regex::icase | Trinity::regex::optimize);
1446 }
1447 }
1448
1449 for (ParagonReputationEntry const* paragonReputation : sParagonReputationStore)
1450 if (sFactionStore.HasRecord(paragonReputation->FactionID))
1451 _paragonReputations[paragonReputation->FactionID] = paragonReputation;
1452
1453 {
1454 std::unordered_map<uint32 /*pathID*/, std::vector<PathNodeEntry const*>> unsortedNodes;
1455 for (PathNodeEntry const* pathNode : sPathNodeStore)
1456 if (sPathStore.HasRecord(pathNode->PathID) && sLocationStore.HasRecord(pathNode->LocationID))
1457 unsortedNodes[pathNode->PathID].push_back(pathNode);
1458
1459 for (auto&& [pathId, pathNodes] : unsortedNodes)
1460 {
1461 PathDb2& path = _paths[pathId];
1462
1463 path.Locations.resize(pathNodes.size());
1464 std::ranges::sort(pathNodes, std::ranges::less(), &PathNodeEntry::Sequence);
1465 std::ranges::transform(pathNodes, path.Locations.begin(), [](PathNodeEntry const* node)
1466 {
1467 return sLocationStore.AssertEntry(node->LocationID)->Pos;
1468 });
1469 }
1470
1471 for (PathPropertyEntry const* pathProperty : sPathPropertyStore)
1472 if (sPathStore.HasRecord(pathProperty->PathID))
1473 _paths[pathProperty->PathID].Properties.push_back(pathProperty);
1474 }
1475
1477 if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID))
1478 _phasesByGroup[group->PhaseGroupID].push_back(phase->ID);
1479
1480 for (PowerTypeEntry const* powerType : sPowerTypeStore)
1481 {
1482 ASSERT(powerType->PowerTypeEnum < MAX_POWERS);
1483 ASSERT(!_powerTypes[powerType->PowerTypeEnum]);
1484
1485 _powerTypes[powerType->PowerTypeEnum] = powerType;
1486 }
1487
1488 for (PVPDifficultyEntry const* entry : sPVPDifficultyStore)
1489 {
1490 ASSERT(entry->RangeIndex < MAX_BATTLEGROUND_BRACKETS, "PvpDifficulty bracket (%d) exceeded max allowed value (%d)", entry->RangeIndex, MAX_BATTLEGROUND_BRACKETS);
1491 }
1492
1493 for (PVPStatEntry const* pvpStat : sPVPStatStore)
1494 _pvpStatIdsByMap[pvpStat->MapID].insert(pvpStat->ID);
1495
1496 for (PvpTalentSlotUnlockEntry const* talentUnlock : sPvpTalentSlotUnlockStore)
1497 {
1498 ASSERT(talentUnlock->Slot < (1 << MAX_PVP_TALENT_SLOTS));
1499 for (int8 i = 0; i < MAX_PVP_TALENT_SLOTS; ++i)
1500 {
1501 if (talentUnlock->Slot & (1 << i))
1502 {
1503 ASSERT(!_pvpTalentSlotUnlock[i]);
1504 _pvpTalentSlotUnlock[i] = talentUnlock;
1505 }
1506 }
1507 }
1508
1509 for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore)
1510 {
1511 if (questPackageItem->DisplayType != QUEST_PACKAGE_FILTER_UNMATCHED)
1512 _questPackages[questPackageItem->PackageID].first.push_back(questPackageItem);
1513 else
1514 _questPackages[questPackageItem->PackageID].second.push_back(questPackageItem);
1515 }
1516
1517 for (RewardPackXCurrencyTypeEntry const* rewardPackXCurrencyType : sRewardPackXCurrencyTypeStore)
1518 _rewardPackCurrencyTypes[rewardPackXCurrencyType->RewardPackID].push_back(rewardPackXCurrencyType);
1519
1520 for (RewardPackXItemEntry const* rewardPackXItem : sRewardPackXItemStore)
1521 _rewardPackItems[rewardPackXItem->RewardPackID].push_back(rewardPackXItem);
1522
1523 for (SkillLineEntry const* skill : sSkillLineStore)
1524 if (skill->ParentSkillLineID)
1525 _skillLinesByParentSkillLine[skill->ParentSkillLineID].push_back(skill);
1526
1527 for (SkillLineAbilityEntry const* skillLineAbility : sSkillLineAbilityStore)
1528 _skillLineAbilitiesBySkillupSkill[skillLineAbility->SkillupSkillLineID ? skillLineAbility->SkillupSkillLineID : skillLineAbility->SkillLine].push_back(skillLineAbility);
1529
1531 if (sSkillLineStore.LookupEntry(entry->SkillID))
1532 _skillRaceClassInfoBySkill.insert(SkillRaceClassInfoContainer::value_type(entry->SkillID, entry));
1533
1534 for (SoulbindConduitRankEntry const* soulbindConduitRank : sSoulbindConduitRankStore)
1535 _soulbindConduitRanks[{ soulbindConduitRank->SoulbindConduitID, soulbindConduitRank->RankIndex }] = soulbindConduitRank;
1536
1538 _specializationSpellsBySpec[specSpells->SpecID].push_back(specSpells);
1539
1540 for (SpecSetMemberEntry const* specSetMember : sSpecSetMemberStore)
1541 _specsBySpecSet.insert(std::make_pair(specSetMember->SpecSetID, uint32(specSetMember->ChrSpecializationID)));
1542
1543 for (SpellClassOptionsEntry const* classOption : sSpellClassOptionsStore)
1544 _spellFamilyNames.insert(classOption->SpellClassSet);
1545
1547 _spellProcsPerMinuteMods[ppmMod->SpellProcsPerMinuteID].push_back(ppmMod);
1548
1549 for (SpellVisualMissileEntry const* spellVisualMissile : sSpellVisualMissileStore)
1550 _spellVisualMissilesBySet[spellVisualMissile->SpellVisualMissileSetID].push_back(spellVisualMissile);
1551
1552 for (TalentEntry const* talentInfo : sTalentStore)
1553 {
1554 ASSERT(talentInfo->ClassID < MAX_CLASSES);
1555 ASSERT(talentInfo->TierID < MAX_TALENT_TIERS, "MAX_TALENT_TIERS must be at least %u", talentInfo->TierID + 1);
1556 ASSERT(talentInfo->ColumnIndex < MAX_TALENT_COLUMNS, "MAX_TALENT_COLUMNS must be at least %u", talentInfo->ColumnIndex + 1);
1557
1558 _talentsByPosition[talentInfo->ClassID][talentInfo->TierID][talentInfo->ColumnIndex].push_back(talentInfo);
1559 }
1560
1561 for (TaxiPathEntry const* entry : sTaxiPathStore)
1562 _taxiPaths[{ entry->FromTaxiNode, entry->ToTaxiNode }] = entry;
1563
1564 uint32 pathCount = sTaxiPathStore.GetNumRows();
1565
1566 // Calculate path nodes count
1567 std::vector<uint32> pathLength;
1568 pathLength.resize(pathCount); // 0 and some other indexes not used
1569 for (TaxiPathNodeEntry const* entry : sTaxiPathNodeStore)
1570 pathLength[entry->PathID] = std::max(pathLength[entry->PathID], entry->NodeIndex + 1u);
1571
1572 // Set path length
1573 sTaxiPathNodesByPath.resize(pathCount); // 0 and some other indexes not used
1574 for (uint32 i = 0; i < sTaxiPathNodesByPath.size(); ++i)
1575 sTaxiPathNodesByPath[i].resize(pathLength[i]);
1576
1577 // fill data
1578 for (TaxiPathNodeEntry const* entry : sTaxiPathNodeStore)
1579 sTaxiPathNodesByPath[entry->PathID][entry->NodeIndex] = entry;
1580
1581 for (ToyEntry const* toy : sToyStore)
1582 _toys.insert(toy->ItemID);
1583
1584 std::unordered_multimap<int32, UiMapAssignmentEntry const*> uiMapAssignmentByUiMap;
1585 for (UiMapAssignmentEntry const* uiMapAssignment : sUiMapAssignmentStore)
1586 {
1587 uiMapAssignmentByUiMap.emplace(uiMapAssignment->UiMapID, uiMapAssignment);
1588 if (UiMapEntry const* uiMap = sUiMapStore.LookupEntry(uiMapAssignment->UiMapID))
1589 {
1590 ASSERT(uiMap->System < MAX_UI_MAP_SYSTEM, "MAX_UI_MAP_SYSTEM must be at least %u", uiMap->System + 1);
1591 if (uiMapAssignment->MapID >= 0)
1592 _uiMapAssignmentByMap[uiMap->System].emplace(uiMapAssignment->MapID, uiMapAssignment);
1593 if (uiMapAssignment->AreaID)
1594 _uiMapAssignmentByArea[uiMap->System].emplace(uiMapAssignment->AreaID, uiMapAssignment);
1595 if (uiMapAssignment->WmoDoodadPlacementID)
1596 _uiMapAssignmentByWmoDoodadPlacement[uiMap->System].emplace(uiMapAssignment->WmoDoodadPlacementID, uiMapAssignment);
1597 if (uiMapAssignment->WmoGroupID)
1598 _uiMapAssignmentByWmoGroup[uiMap->System].emplace(uiMapAssignment->WmoGroupID, uiMapAssignment);
1599 }
1600 }
1601
1602 std::unordered_map<std::pair<uint32, uint32>, UiMapLinkEntry const*> uiMapLinks;
1603 for (UiMapLinkEntry const* uiMapLink : sUiMapLinkStore)
1604 uiMapLinks[std::make_pair(uiMapLink->ParentUiMapID, uint32(uiMapLink->ChildUiMapID))] = uiMapLink;
1605
1606 for (UiMapEntry const* uiMap : sUiMapStore)
1607 {
1608 UiMapBounds& bounds = _uiMapBounds[uiMap->ID];
1609 memset(&bounds, 0, sizeof(bounds));
1610 if (UiMapEntry const* parentUiMap = sUiMapStore.LookupEntry(uiMap->ParentUiMapID))
1611 {
1612 if (parentUiMap->GetFlags().HasFlag(UiMapFlag::NoWorldPositions))
1613 continue;
1614
1615 UiMapAssignmentEntry const* uiMapAssignment = nullptr;
1616 UiMapAssignmentEntry const* parentUiMapAssignment = nullptr;
1617 for (std::pair<int32 const, UiMapAssignmentEntry const*> const& uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ID))
1618 {
1619 if (uiMapAssignmentForMap.second->MapID >= 0 &&
1620 uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 &&
1621 uiMapAssignmentForMap.second->Region[1].Y - uiMapAssignmentForMap.second->Region[0].Y > 0)
1622 {
1623 uiMapAssignment = uiMapAssignmentForMap.second;
1624 break;
1625 }
1626 }
1627
1628 if (!uiMapAssignment)
1629 continue;
1630
1631 for (std::pair<int32 const, UiMapAssignmentEntry const*> const& uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ParentUiMapID))
1632 {
1633 if (uiMapAssignmentForMap.second->MapID == uiMapAssignment->MapID &&
1634 uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 &&
1635 uiMapAssignmentForMap.second->Region[1].Y - uiMapAssignmentForMap.second->Region[0].Y > 0)
1636 {
1637 parentUiMapAssignment = uiMapAssignmentForMap.second;
1638 break;
1639 }
1640 }
1641
1642 if (!parentUiMapAssignment)
1643 continue;
1644
1645 float parentXsize = parentUiMapAssignment->Region[1].X - parentUiMapAssignment->Region[0].X;
1646 float parentYsize = parentUiMapAssignment->Region[1].Y - parentUiMapAssignment->Region[0].Y;
1647 float bound0scale = (uiMapAssignment->Region[1].X - parentUiMapAssignment->Region[0].X) / parentXsize;
1648 float bound0 = ((1.0f - bound0scale) * parentUiMapAssignment->UiMax.Y) + (bound0scale * parentUiMapAssignment->UiMin.Y);
1649 float bound2scale = (uiMapAssignment->Region[0].X - parentUiMapAssignment->Region[0].X) / parentXsize;
1650 float bound2 = ((1.0f - bound2scale) * parentUiMapAssignment->UiMax.Y) + (bound2scale * parentUiMapAssignment->UiMin.Y);
1651 float bound1scale = (uiMapAssignment->Region[1].Y - parentUiMapAssignment->Region[0].Y) / parentYsize;
1652 float bound1 = ((1.0f - bound1scale) * parentUiMapAssignment->UiMax.X) + (bound1scale * parentUiMapAssignment->UiMin.X);
1653 float bound3scale = (uiMapAssignment->Region[0].Y - parentUiMapAssignment->Region[0].Y) / parentYsize;
1654 float bound3 = ((1.0f - bound3scale) * parentUiMapAssignment->UiMax.X) + (bound3scale * parentUiMapAssignment->UiMin.X);
1655 if ((bound3 - bound1) > 0.0f || (bound2 - bound0) > 0.0f)
1656 {
1657 bounds.Bounds[0] = bound0;
1658 bounds.Bounds[1] = bound1;
1659 bounds.Bounds[2] = bound2;
1660 bounds.Bounds[3] = bound3;
1661 bounds.IsUiAssignment = true;
1662 }
1663 }
1664
1665 if (UiMapLinkEntry const* uiMapLink = Trinity::Containers::MapGetValuePtr(uiMapLinks, std::make_pair(uiMap->ParentUiMapID, uiMap->ID)))
1666 {
1667 bounds.IsUiAssignment = false;
1668 bounds.IsUiLink = true;
1669 bounds.Bounds[0] = uiMapLink->UiMin.Y;
1670 bounds.Bounds[1] = uiMapLink->UiMin.X;
1671 bounds.Bounds[2] = uiMapLink->UiMax.Y;
1672 bounds.Bounds[3] = uiMapLink->UiMax.X;
1673 }
1674 }
1675
1676 for (UiMapXMapArtEntry const* uiMapArt : sUiMapXMapArtStore)
1677 if (uiMapArt->PhaseID)
1678 _uiMapPhases.insert(uiMapArt->PhaseID);
1679
1680 for (WMOAreaTableEntry const* entry : sWMOAreaTableStore)
1681 _wmoAreaTableLookup[WMOAreaTableKey(entry->WmoID, entry->NameSetID, entry->WmoGroupID)] = entry;
1682
1683 // Initialize global taxinodes mask
1684 // reinitialize internal storage for globals after loading TaxiNodes.db2
1685 sTaxiNodesMask = {};
1689 // include existed nodes that have at least single not spell base (scripted) path
1690 for (TaxiNodesEntry const* node : sTaxiNodesStore)
1691 {
1692 if (!node->IsPartOfTaxiNetwork())
1693 continue;
1694
1695 // valid taxi network node
1696 uint32 field = uint32((node->ID - 1) / (sizeof(TaxiMask::value_type) * 8));
1697 TaxiMask::value_type submask = TaxiMask::value_type(1 << ((node->ID - 1) % (sizeof(TaxiMask::value_type) * 8)));
1698
1699 sTaxiNodesMask[field] |= submask;
1700 if (node->GetFlags().HasFlag(TaxiNodeFlags::ShowOnHordeMap))
1701 sHordeTaxiNodesMask[field] |= submask;
1702 if (node->GetFlags().HasFlag(TaxiNodeFlags::ShowOnAllianceMap))
1703 sAllianceTaxiNodesMask[field] |= submask;
1704
1705 uint32 uiMapId = uint32(-1);
1706 if (!GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_ADVENTURE, false, &uiMapId))
1707 GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_TAXI, false, &uiMapId);
1708
1709 if (uiMapId == 985 || uiMapId == 986)
1710 sOldContinentsNodesMask[field] |= submask;
1711 }
1712
1713 TC_LOG_INFO("server.loading", ">> Indexed DB2 data stores in {} ms", GetMSTimeDiffToNow(oldMSTime));
1714}
1715
1717{
1718 auto itr = _stores.find(type);
1719 if (itr != _stores.end())
1720 return itr->second;
1721
1722 return nullptr;
1723}
1724
1726{
1727 uint32 oldMSTime = getMSTime();
1728
1729 QueryResult result = HotfixDatabase.Query("SELECT Id, UniqueId, TableHash, RecordId, Status FROM hotfix_data ORDER BY Id");
1730
1731 if (!result)
1732 {
1733 TC_LOG_INFO("server.loading", ">> Loaded 0 hotfix info entries.");
1734 return;
1735 }
1736
1737 uint32 count = 0;
1738
1739 std::map<std::pair<uint32, int32>, bool> deletedRecords;
1740
1741 do
1742 {
1743 Field* fields = result->Fetch();
1744
1745 int32 id = fields[0].GetInt32();
1746 uint32 uniqueId = fields[1].GetUInt32();
1747 uint32 tableHash = fields[2].GetUInt32();
1748 int32 recordId = fields[3].GetInt32();
1749 HotfixRecord::Status status = static_cast<HotfixRecord::Status>(fields[4].GetUInt8());
1750 std::bitset<TOTAL_LOCALES> availableDb2Locales = localeMask;
1751 if (status == HotfixRecord::Status::Valid && !_stores.contains(tableHash))
1752 {
1753 HotfixBlobKey key = std::make_pair(tableHash, recordId);
1754 for (std::size_t locale = 0; locale < TOTAL_LOCALES; ++locale)
1755 {
1756 if (!availableDb2Locales[locale])
1757 continue;
1758
1759 if (!_hotfixBlob[locale].contains(key))
1760 availableDb2Locales[locale] = false;
1761 }
1762
1763 if (availableDb2Locales.none())
1764 {
1765 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);
1766 continue;
1767 }
1768 }
1769
1770 HotfixRecord hotfixRecord;
1771 hotfixRecord.TableHash = tableHash;
1772 hotfixRecord.RecordID = recordId;
1773 hotfixRecord.ID.PushID = id;
1774 hotfixRecord.ID.UniqueID = uniqueId;
1775 hotfixRecord.HotfixStatus = status;
1776 hotfixRecord.AvailableLocalesMask = availableDb2Locales.to_ulong();
1777
1778 HotfixPush& push = _hotfixData[id];
1779 push.Records.push_back(hotfixRecord);
1780 push.AvailableLocalesMask |= hotfixRecord.AvailableLocalesMask;
1781
1782 _maxHotfixId = std::max(_maxHotfixId, id);
1783 deletedRecords[std::make_pair(tableHash, recordId)] = status == HotfixRecord::Status::RecordRemoved;
1784 ++count;
1785 } while (result->NextRow());
1786
1787 for (auto itr = deletedRecords.begin(); itr != deletedRecords.end(); ++itr)
1788 if (itr->second)
1789 if (DB2StorageBase* store = Trinity::Containers::MapGetValuePtr(_stores, itr->first.first))
1790 store->EraseRecord(itr->first.second);
1791
1792 TC_LOG_INFO("server.loading", ">> Loaded {} hotfix records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1793}
1794
1796{
1797 uint32 oldMSTime = getMSTime();
1798
1799 QueryResult result = HotfixDatabase.Query("SELECT TableHash, RecordId, locale, `Blob` FROM hotfix_blob ORDER BY TableHash");
1800
1801 if (!result)
1802 {
1803 TC_LOG_INFO("server.loading", ">> Loaded 0 hotfix blob entries.");
1804 return;
1805 }
1806
1807 std::bitset<TOTAL_LOCALES> availableDb2Locales = localeMask;
1808 uint32 hotfixBlobCount = 0;
1809 do
1810 {
1811 Field* fields = result->Fetch();
1812
1813 uint32 tableHash = fields[0].GetUInt32();
1814 auto storeItr = _stores.find(tableHash);
1815 if (storeItr != _stores.end())
1816 {
1817 TC_LOG_ERROR("sql.sql", "Table hash 0x{:X} points to a loaded DB2 store {}, fill related table instead of hotfix_blob",
1818 tableHash, storeItr->second->GetFileName());
1819 continue;
1820 }
1821
1822 int32 recordId = fields[1].GetInt32();
1823 std::string localeName = fields[2].GetString();
1824 LocaleConstant locale = GetLocaleByName(localeName);
1825
1826 if (!IsValidLocale(locale))
1827 {
1828 TC_LOG_ERROR("sql.sql", "`hotfix_blob` contains invalid locale: {} at TableHash: 0x{:X} and RecordID: {}", localeName, tableHash, recordId);
1829 continue;
1830 }
1831
1832 if (!availableDb2Locales[locale])
1833 continue;
1834
1835 _hotfixBlob[locale][std::make_pair(tableHash, recordId)] = fields[3].GetBinary();
1836 hotfixBlobCount++;
1837 } while (result->NextRow());
1838
1839 TC_LOG_INFO("server.loading", ">> Loaded {} hotfix blob records in {} ms", hotfixBlobCount, GetMSTimeDiffToNow(oldMSTime));
1840}
1841
1842bool ValidateBroadcastTextTactKeyOptionalData(std::vector<uint8> const& data)
1843{
1844 return data.size() == 8 + 16;
1845}
1846
1848{
1849 // Register allowed optional data keys
1850 _allowedHotfixOptionalData.emplace(sBroadcastTextStore.GetTableHash(), std::make_pair(sTactKeyStore.GetTableHash(), &ValidateBroadcastTextTactKeyOptionalData));
1851
1852 uint32 oldMSTime = getMSTime();
1853
1854 QueryResult result = HotfixDatabase.Query("SELECT TableHash, RecordId, locale, `Key`, `Data` FROM hotfix_optional_data ORDER BY TableHash");
1855
1856 if (!result)
1857 {
1858 TC_LOG_INFO("server.loading", ">> Loaded 0 hotfix optional data records.");
1859 return;
1860 }
1861
1862 std::bitset<TOTAL_LOCALES> availableDb2Locales = localeMask;
1863 uint32 hotfixOptionalDataCount = 0;
1864 do
1865 {
1866 Field* fields = result->Fetch();
1867
1868 uint32 tableHash = fields[0].GetUInt32();
1869 auto allowedHotfixes = Trinity::Containers::MapEqualRange(_allowedHotfixOptionalData, tableHash);
1870 if (allowedHotfixes.begin() == allowedHotfixes.end())
1871 {
1872 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);
1873 continue;
1874 }
1875
1876 uint32 recordId = fields[1].GetInt32();
1877 auto storeItr = _stores.find(tableHash);
1878 if (storeItr == _stores.end())
1879 {
1880 TC_LOG_ERROR("sql.sql", "Table `hotfix_optional_data` references unknown DB2 store by hash 0x{:X} with RecordID: {}", tableHash, recordId);
1881 continue;
1882 }
1883
1884 std::string localeName = fields[2].GetString();
1885 LocaleConstant locale = GetLocaleByName(localeName);
1886
1887 if (!IsValidLocale(locale))
1888 {
1889 TC_LOG_ERROR("sql.sql", "`hotfix_optional_data` contains invalid locale: {} at TableHash: 0x{:X} and RecordID: {}", localeName, tableHash, recordId);
1890 continue;
1891 }
1892
1893 if (!availableDb2Locales[locale])
1894 continue;
1895
1896 DB2Manager::HotfixOptionalData optionalData;
1897 optionalData.Key = fields[3].GetUInt32();
1898 auto allowedHotfixItr = std::find_if(allowedHotfixes.begin(), allowedHotfixes.end(), [&](std::pair<uint32 const, AllowedHotfixOptionalData> const& v)
1899 {
1900 return v.second.first == optionalData.Key;
1901 });
1902 if (allowedHotfixItr == allowedHotfixes.end())
1903 {
1904 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: {}",
1905 optionalData.Key, tableHash, recordId);
1906 continue;
1907 }
1908
1909 optionalData.Data = fields[4].GetBinary();
1910 if (!allowedHotfixItr->second.second(optionalData.Data))
1911 {
1912 TC_LOG_ERROR("sql.sql", "Table `hotfix_optional_data` contains invalid data for DB2 store 0x{:X}, RecordID: {} and Key: 0x{:X}",
1913 tableHash, recordId, optionalData.Key);
1914 continue;
1915 }
1916
1917 _hotfixOptionalData[locale][std::make_pair(tableHash, recordId)].push_back(std::move(optionalData));
1918 hotfixOptionalDataCount++;
1919 } while (result->NextRow());
1920
1921 TC_LOG_INFO("server.loading", ">> Loaded {} hotfix optional data records in {} ms", hotfixOptionalDataCount, GetMSTimeDiffToNow(oldMSTime));
1922}
1923
1925{
1926 return _hotfixData.size();
1927}
1928
1930{
1931 return _hotfixData;
1932}
1933
1934std::vector<uint8> const* DB2Manager::GetHotfixBlobData(uint32 tableHash, int32 recordId, LocaleConstant locale) const
1935{
1936 ASSERT(IsValidLocale(locale), "Locale %u is invalid locale", uint32(locale));
1937
1938 return Trinity::Containers::MapGetValuePtr(_hotfixBlob[locale], std::make_pair(tableHash, recordId));
1939}
1940
1941std::vector<DB2Manager::HotfixOptionalData> const* DB2Manager::GetHotfixOptionalData(uint32 tableHash, int32 recordId, LocaleConstant locale) const
1942{
1943 ASSERT(IsValidLocale(locale), "Locale %u is invalid locale", uint32(locale));
1944
1945 return Trinity::Containers::MapGetValuePtr(_hotfixOptionalData[locale], std::make_pair(tableHash, recordId));
1946}
1947
1949{
1950 return sAnimationDataStore.GetNumRows();
1951}
1952
1954{
1955 HotfixRecord hotfixRecord;
1956 hotfixRecord.TableHash = tableHash;
1957 hotfixRecord.RecordID = recordId;
1958 hotfixRecord.ID.PushID = ++_maxHotfixId;
1959 hotfixRecord.ID.UniqueID = rand32();
1960 hotfixRecord.AvailableLocalesMask = 0xDFF;
1961
1962 HotfixPush& push = _hotfixData[hotfixRecord.ID.PushID];
1963 push.Records.push_back(hotfixRecord);
1964 push.AvailableLocalesMask |= hotfixRecord.AvailableLocalesMask;
1965}
1966
1967std::vector<uint32> DB2Manager::GetAreasForGroup(uint32 areaGroupId) const
1968{
1969 auto itr = _areaGroupMembers.find(areaGroupId);
1970 if (itr != _areaGroupMembers.end())
1971 return itr->second;
1972
1973 return std::vector<uint32>();
1974}
1975
1976bool DB2Manager::IsInArea(uint32 objectAreaId, uint32 areaId)
1977{
1978 do
1979 {
1980 if (objectAreaId == areaId)
1981 return true;
1982
1983 AreaTableEntry const* objectArea = sAreaTableStore.LookupEntry(objectAreaId);
1984 if (!objectArea)
1985 break;
1986
1987 objectAreaId = objectArea->ParentAreaID;
1988 } while (objectAreaId);
1989
1990 return false;
1991}
1992
1994{
1995 if (!areaEntry)
1996 return nullptr;
1997
1998 // Get ContentTuning for the area
1999 if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(areaEntry->ContentTuningID))
2000 return contentTuning;
2001
2002 // If there is no data for the current area and it has a parent area, get data from the last (recursive)
2003 if (AreaTableEntry const* parentAreaEntry = sAreaTableStore.LookupEntry(areaEntry->ParentAreaID))
2004 return GetContentTuningForArea(parentAreaEntry);
2005
2006 return nullptr;
2007}
2008
2009std::vector<ArtifactPowerEntry const*> DB2Manager::GetArtifactPowers(uint8 artifactId) const
2010{
2011 auto itr = _artifactPowers.find(artifactId);
2012 if (itr != _artifactPowers.end())
2013 return itr->second;
2014
2015 return std::vector<ArtifactPowerEntry const*>{};
2016}
2017
2018std::vector<uint32> const* DB2Manager::GetArtifactPowerLinks(uint32 artifactPowerId) const
2019{
2020 return Trinity::Containers::MapGetValuePtr(_artifactPowerLinks, artifactPowerId);
2021}
2022
2024{
2025 return Trinity::Containers::MapGetValuePtr(_artifactPowerRanks, { artifactPowerId, rank });
2026}
2027
2029{
2030 return Trinity::Containers::MapGetValuePtr(_azeriteEmpoweredItems, itemId);
2031}
2032
2034{
2035 return std::find_if(sAzeriteItemStore.begin(), sAzeriteItemStore.end(),
2036 [&](AzeriteItemEntry const* azeriteItem) { return azeriteItem->ItemID == int32(itemId); }) != sAzeriteItemStore.end();
2037}
2038
2040{
2041 return Trinity::Containers::MapGetValuePtr(_azeriteEssencePowersByIdAndRank, std::make_pair(azeriteEssenceId, rank));
2042}
2043
2044std::vector<AzeriteItemMilestonePowerEntry const*> const& DB2Manager::GetAzeriteItemMilestonePowers() const
2045{
2046 return _azeriteItemMilestonePowers;
2047}
2048
2050{
2051 ASSERT(slot < MAX_AZERITE_ESSENCE_SLOT, "Slot %u must be lower than MAX_AZERITE_ESSENCE_SLOT (%u)", uint32(slot), MAX_AZERITE_ESSENCE_SLOT);
2052 return _azeriteItemMilestonePowerByEssenceSlot[slot];
2053}
2054
2055std::vector<AzeritePowerSetMemberEntry const*> const* DB2Manager::GetAzeritePowers(uint32 itemId) const
2056{
2057 if (AzeriteEmpoweredItemEntry const* azeriteEmpoweredItem = GetAzeriteEmpoweredItem(itemId))
2058 return Trinity::Containers::MapGetValuePtr(_azeritePowers, azeriteEmpoweredItem->AzeritePowerSetID);
2059
2060 return nullptr;
2061}
2062
2064{
2066 if (std::array<uint8, MAX_AZERITE_EMPOWERED_TIER> const* levels = Trinity::Containers::MapGetValuePtr(_azeriteTierUnlockLevels, std::make_pair(azeriteUnlockSetId, context)))
2067 return (*levels)[tier];
2068
2069 AzeriteTierUnlockSetEntry const* azeriteTierUnlockSet = sAzeriteTierUnlockSetStore.LookupEntry(azeriteUnlockSetId);
2070 if (azeriteTierUnlockSet && azeriteTierUnlockSet->Flags & AZERITE_TIER_UNLOCK_SET_FLAG_DEFAULT)
2071 if (std::array<uint8, MAX_AZERITE_EMPOWERED_TIER> const* levels = Trinity::Containers::MapGetValuePtr(_azeriteTierUnlockLevels, std::make_pair(azeriteUnlockSetId, ItemContext::NONE)))
2072 return (*levels)[tier];
2073
2074 return sAzeriteLevelInfoStore.GetNumRows();
2075}
2076
2077char const* DB2Manager::GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale /*= DEFAULT_LOCALE*/, uint8 gender /*= GENDER_MALE*/, bool forceGender /*= false*/)
2078{
2079 if ((gender == GENDER_FEMALE || gender == GENDER_NONE) && (forceGender || broadcastText->Text1[DEFAULT_LOCALE][0] != '\0'))
2080 {
2081 if (broadcastText->Text1[locale][0] != '\0')
2082 return broadcastText->Text1[locale];
2083
2084 return broadcastText->Text1[DEFAULT_LOCALE];
2085 }
2086
2087 if (broadcastText->Text[locale][0] != '\0')
2088 return broadcastText->Text[locale];
2089
2090 return broadcastText->Text[DEFAULT_LOCALE];
2091}
2092
2093int32 const* DB2Manager::GetBroadcastTextDuration(uint32 broadcastTextId, LocaleConstant locale /*= DEFAULT_LOCALE*/) const
2094{
2095 return Trinity::Containers::MapGetValuePtr(_broadcastTextDurations, { broadcastTextId, WowLocaleToCascLocaleBit[locale] });
2096}
2097
2099{
2100 return Trinity::Containers::MapGetValuePtr(_charBaseInfoByRaceAndClass, { race, class_ });
2101}
2102
2104{
2105 ASSERT(unitClass < MAX_CLASSES);
2106 return _uiDisplayByClass[unitClass];
2107}
2108
2109char const* DB2Manager::GetChrClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/)
2110{
2111 ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_);
2112 if (!classEntry)
2113 return "";
2114
2115 if (classEntry->Name[locale][0] != '\0')
2116 return classEntry->Name[locale];
2117
2118 return classEntry->Name[DEFAULT_LOCALE];
2119}
2120
2122{
2123 return _powersByClass[classId][power];
2124}
2125
2126std::vector<ChrCustomizationChoiceEntry const*> const* DB2Manager::GetCustomiztionChoices(uint32 chrCustomizationOptionId) const
2127{
2128 return Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesByOption, chrCustomizationOptionId);
2129}
2130
2131std::vector<ChrCustomizationOptionEntry const*> const* DB2Manager::GetCustomiztionOptions(uint8 race, uint8 gender) const
2132{
2133 return Trinity::Containers::MapGetValuePtr(_chrCustomizationOptionsByRaceAndGender, { race,gender });
2134}
2135
2136std::vector<std::pair<uint32, std::vector<uint32>>> const* DB2Manager::GetRequiredCustomizationChoices(uint32 chrCustomizationReqId) const
2137{
2138 return Trinity::Containers::MapGetValuePtr(_chrCustomizationRequiredChoices, chrCustomizationReqId);
2139}
2140
2142{
2143 return Trinity::Containers::MapGetValuePtr(_chrModelsByRaceAndGender, { race, gender });
2144}
2145
2147{
2148 return Trinity::Containers::MapGetValuePtr(_conditionalChrModelsByChrModelId, chrModelId);
2149}
2150
2151char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEFAULT_LOCALE*/)
2152{
2153 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
2154 if (!raceEntry)
2155 return "";
2156
2157 if (raceEntry->Name[locale][0] != '\0')
2158 return raceEntry->Name[locale];
2159
2160 return raceEntry->Name[DEFAULT_LOCALE];
2161}
2162
2164{
2165 return _chrSpecializationsByIndex[class_][index];
2166}
2167
2172
2173uint32 DB2Manager::GetRedirectedContentTuningId(uint32 contentTuningId, std::span<uint32 const> redirectFlag) const
2174{
2175 if (std::vector<ConditionalContentTuningEntry const*> const* conditionalContentTunings = Trinity::Containers::MapGetValuePtr(_conditionalContentTuning, contentTuningId))
2176 {
2177 for (ConditionalContentTuningEntry const* conditionalContentTuning : *conditionalContentTunings)
2178 {
2179 uint32 block = conditionalContentTuning->RedirectEnum / 32;
2180 uint32 flag = conditionalContentTuning->RedirectEnum % 32;
2181 if (block >= redirectFlag.size())
2182 continue;
2183
2184 if (flag & redirectFlag[block])
2185 return conditionalContentTuning->RedirectContentTuningID;
2186 }
2187 }
2188
2189 return contentTuningId;
2190}
2191
2192Optional<ContentTuningLevels> DB2Manager::GetContentTuningData(uint32 contentTuningId, std::span<uint32 const> redirectFlag, bool forItem /*= false*/) const
2193{
2194 ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(GetRedirectedContentTuningId(contentTuningId, redirectFlag));
2195 if (!contentTuning)
2196 return {};
2197
2198 if (forItem && contentTuning->GetFlags().HasFlag(ContentTuningFlag::DisabledForItem))
2199 return {};
2200
2201 auto getLevelAdjustment = [](ContentTuningCalcType type) -> int32
2202 {
2203 switch (type)
2204 {
2206 return 1;
2208 return GetMaxLevelForExpansion(sWorld->getIntConfig(CONFIG_EXPANSION));
2210 return GetMaxLevelForExpansion(std::max<int32>(sWorld->getIntConfig(CONFIG_EXPANSION) - 1, 0));
2211 default:
2212 break;
2213 }
2214
2215 return 0;
2216 };
2217
2218 ContentTuningLevels levels;
2219 levels.MinLevel = contentTuning->MinLevel + getLevelAdjustment(static_cast<ContentTuningCalcType>(contentTuning->MinLevelType));
2220 levels.MaxLevel = contentTuning->MaxLevel + getLevelAdjustment(static_cast<ContentTuningCalcType>(contentTuning->MaxLevelType));
2221 levels.MinLevelWithDelta = std::clamp<int32>(levels.MinLevel + contentTuning->TargetLevelDelta, 1, MAX_LEVEL);
2222 levels.MaxLevelWithDelta = std::clamp<int32>(levels.MaxLevel + contentTuning->TargetLevelMaxDelta, 1, MAX_LEVEL);
2223
2224 // clamp after calculating levels with delta (delta can bring "overflown" level back into correct range)
2225 levels.MinLevel = std::clamp<int32>(levels.MinLevel, 1, MAX_LEVEL);
2226 levels.MaxLevel = std::clamp<int32>(levels.MaxLevel, 1, MAX_LEVEL);
2227
2228 if (contentTuning->TargetLevelMin)
2229 levels.TargetLevelMin = contentTuning->TargetLevelMin;
2230 else
2231 levels.TargetLevelMin = levels.MinLevelWithDelta;
2232
2233 if (contentTuning->TargetLevelMax)
2234 levels.TargetLevelMax = contentTuning->TargetLevelMax;
2235 else
2236 levels.TargetLevelMax = levels.MaxLevelWithDelta;
2237
2238 return levels;
2239}
2240
2241bool DB2Manager::HasContentTuningLabel(uint32 contentTuningId, int32 label) const
2242{
2243 return _contentTuningLabels.contains({ contentTuningId, label });
2244}
2245
2247{
2248 if (!petfamily)
2249 return nullptr;
2250
2251 CreatureFamilyEntry const* petFamily = sCreatureFamilyStore.LookupEntry(petfamily);
2252 if (!petFamily)
2253 return nullptr;
2254
2255 return petFamily->Name[locale][0] != '\0' ? petFamily->Name[locale] : nullptr;
2256}
2257
2258std::span<int32 const> DB2Manager::GetCreatureLabels(uint32 creatureDifficultyId) const
2259{
2260 std::vector<int32> const* labels = Trinity::Containers::MapGetValuePtr(_creatureLabels, creatureDifficultyId);
2261 return labels ? std::span<int32 const>(*labels) : std::span<int32 const>();
2262}
2263
2265{
2266 for (std::pair<uint32 const, CurrencyContainerEntry const*> const& p : Trinity::Containers::MapEqualRange(_currencyContainers, currencyId))
2267 if (quantity >= p.second->MinAmount && (!p.second->MaxAmount || quantity <= p.second->MaxAmount))
2268 return p.second;
2269
2270 return nullptr;
2271}
2272
2273std::pair<float, float> DB2Manager::GetCurveXAxisRange(uint32 curveId) const
2274{
2275 if (std::vector<DBCPosition2D> const* points = Trinity::Containers::MapGetValuePtr(_curvePoints, curveId))
2276 return { points->front().X, points->back().X };
2277
2278 return { 0.0f, 0.0f };
2279}
2280
2281static CurveInterpolationMode DetermineCurveType(CurveEntry const* curve, std::vector<DBCPosition2D> const& points)
2282{
2283 switch (curve->Type)
2284 {
2285 case 1:
2287 case 2:
2288 {
2289 switch (points.size())
2290 {
2291 case 1:
2293 case 2:
2295 case 3:
2297 case 4:
2299 default:
2300 break;
2301 }
2303 }
2304 case 3:
2306 default:
2307 break;
2308 }
2309
2311}
2312
2313float DB2Manager::GetCurveValueAt(uint32 curveId, float x) const
2314{
2315 auto itr = _curvePoints.find(curveId);
2316 if (itr == _curvePoints.end())
2317 return 0.0f;
2318
2319 CurveEntry const* curve = sCurveStore.AssertEntry(curveId);
2320 std::vector<DBCPosition2D> const& points = itr->second;
2321 if (points.empty())
2322 return 0.0f;
2323
2324 return GetCurveValueAt(DetermineCurveType(curve, points), points, x);
2325}
2326
2327float DB2Manager::GetCurveValueAt(CurveInterpolationMode mode, std::span<DBCPosition2D const> points, float x) const
2328{
2329 switch (mode)
2330 {
2332 {
2333 std::size_t pointIndex = 0;
2334 while (pointIndex < points.size() && points[pointIndex].X <= x)
2335 ++pointIndex;
2336 if (!pointIndex)
2337 return points[0].Y;
2338 if (pointIndex >= points.size())
2339 return points.back().Y;
2340 float xDiff = points[pointIndex].X - points[pointIndex - 1].X;
2341 if (xDiff == 0.0)
2342 return points[pointIndex].Y;
2343 return (((x - points[pointIndex - 1].X) / xDiff) * (points[pointIndex].Y - points[pointIndex - 1].Y)) + points[pointIndex - 1].Y;
2344 }
2346 {
2347 std::size_t pointIndex = 0;
2348 while (pointIndex < points.size() && points[pointIndex].X <= x)
2349 ++pointIndex;
2350 if (!pointIndex)
2351 return points[0].Y;
2352 if (pointIndex >= points.size())
2353 return points.back().Y;
2354 float xDiff = points[pointIndex].X - points[pointIndex - 1].X;
2355 if (xDiff == 0.0)
2356 return points[pointIndex].Y;
2357 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;
2358 }
2360 {
2361 std::size_t pointIndex = 1;
2362 while (pointIndex < points.size() && points[pointIndex].X <= x)
2363 ++pointIndex;
2364 if (pointIndex == 1)
2365 return points[1].Y;
2366 if (pointIndex >= points.size() - 1)
2367 return points[points.size() - 2].Y;
2368 float xDiff = points[pointIndex].X - points[pointIndex - 1].X;
2369 if (xDiff == 0.0)
2370 return points[pointIndex].Y;
2371
2372 float mu = (x - points[pointIndex - 1].X) / xDiff;
2373 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;
2374 float a1 = points[pointIndex - 2].Y - 2.5f * points[pointIndex - 1].Y + 2.0f * points[pointIndex].Y - 0.5f * points[pointIndex + 1].Y;
2375 float a2 = -0.5f * points[pointIndex - 2].Y + 0.5f * points[pointIndex].Y;
2376 float a3 = points[pointIndex - 1].Y;
2377
2378 return a0 * mu * mu * mu + a1 * mu * mu + a2 * mu + a3;
2379 }
2381 {
2382 float xDiff = points[2].X - points[0].X;
2383 if (xDiff == 0.0)
2384 return points[1].Y;
2385 float mu = (x - points[0].X) / xDiff;
2386 return ((1.0f - mu) * (1.0f - mu) * points[0].Y) + (1.0f - mu) * 2.0f * mu * points[1].Y + mu * mu * points[2].Y;
2387 }
2389 {
2390 float xDiff = points[3].X - points[0].X;
2391 if (xDiff == 0.0)
2392 return points[1].Y;
2393 float mu = (x - points[0].X) / xDiff;
2394 return (1.0f - mu) * (1.0f - mu) * (1.0f - mu) * points[0].Y
2395 + 3.0f * mu * (1.0f - mu) * (1.0f - mu) * points[1].Y
2396 + 3.0f * mu * mu * (1.0f - mu) * points[2].Y
2397 + mu * mu * mu * points[3].Y;
2398 }
2400 {
2401 float xDiff = points.back().X - points[0].X;
2402 if (xDiff == 0.0f)
2403 return points.back().Y;
2404
2405 std::vector<float> tmp(points.size());
2406 for (std::size_t i = 0; i < points.size(); ++i)
2407 tmp[i] = points[i].Y;
2408
2409 float mu = (x - points[0].X) / xDiff;
2410 int32 i = int32(points.size()) - 1;
2411 while (i > 0)
2412 {
2413 for (int32 k = 0; k < i; ++k)
2414 {
2415 float val = tmp[k] + mu * (tmp[k + 1] - tmp[k]);
2416 tmp[k] = val;
2417 }
2418 --i;
2419 }
2420 return tmp[0];
2421 }
2423 return points[0].Y;
2424 default:
2425 break;
2426 }
2427
2428 return 0.0f;
2429}
2430
2431std::string_view DB2Manager::GetDifficultyName(Difficulty difficulty)
2432{
2433 if (DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(difficulty))
2434 return difficultyEntry->Name[sWorld->GetDefaultDbcLocale()];
2435
2436 return "None"sv;
2437}
2438
2440{
2441 if (EmotesTextSoundEntry const* emotesTextSound = Trinity::Containers::MapGetValuePtr(_emoteTextSounds, { emote, race, gender, class_ }))
2442 return emotesTextSound;
2443
2444 if (EmotesTextSoundEntry const* emotesTextSound = Trinity::Containers::MapGetValuePtr(_emoteTextSounds, { emote, race, gender, uint8(0) }))
2445 return emotesTextSound;
2446
2447 return nullptr;
2448}
2449
2450template<float(ExpectedStatModEntry::*field)>
2452{
2453 explicit ExpectedStatModReducer(int32 mythicPlusMilestoneSeason) : ActiveMilestoneSeason(mythicPlusMilestoneSeason) { }
2454
2455 float operator()(float mod, ContentTuningXExpectedEntry const* contentTuningXExpected) const
2456 {
2457 if (!contentTuningXExpected)
2458 return mod;
2459
2460 if (contentTuningXExpected->MinMythicPlusSeasonID)
2461 if (MythicPlusSeasonEntry const* mythicPlusSeason = sMythicPlusSeasonStore.LookupEntry(contentTuningXExpected->MinMythicPlusSeasonID))
2462 if (ActiveMilestoneSeason < mythicPlusSeason->MilestoneSeason)
2463 return mod;
2464
2465 if (contentTuningXExpected->MaxMythicPlusSeasonID)
2466 if (MythicPlusSeasonEntry const* mythicPlusSeason = sMythicPlusSeasonStore.LookupEntry(contentTuningXExpected->MaxMythicPlusSeasonID))
2467 if (ActiveMilestoneSeason >= mythicPlusSeason->MilestoneSeason)
2468 return mod;
2469
2470 return mod * sExpectedStatModStore.AssertEntry(contentTuningXExpected->ExpectedStatModID)->*field;
2471 }
2472
2474};
2475
2476float DB2Manager::EvaluateExpectedStat(ExpectedStatType stat, uint32 level, int32 expansion, uint32 contentTuningId, Classes unitClass, int32 mythicPlusMilestoneSeason) const
2477{
2478 auto expectedStatItr = _expectedStatsByLevel.find(std::make_pair(level, expansion));
2479 if (expectedStatItr == _expectedStatsByLevel.end())
2480 expectedStatItr = _expectedStatsByLevel.find(std::make_pair(level, -2));
2481
2482 if (expectedStatItr == _expectedStatsByLevel.end())
2483 return 1.0f;
2484
2485 ExpectedStatModEntry const* classMod = nullptr;
2486 switch (unitClass)
2487 {
2488 case CLASS_WARRIOR:
2489 classMod = sExpectedStatModStore.LookupEntry(4);
2490 break;
2491 case CLASS_PALADIN:
2492 classMod = sExpectedStatModStore.LookupEntry(2);
2493 break;
2494 case CLASS_ROGUE:
2495 classMod = sExpectedStatModStore.LookupEntry(3);
2496 break;
2497 case CLASS_MAGE:
2498 classMod = sExpectedStatModStore.LookupEntry(1);
2499 break;
2500 default:
2501 break;
2502 }
2503
2504 std::vector<ContentTuningXExpectedEntry const*> const* contentTuningMods = Trinity::Containers::MapGetValuePtr(_expectedStatModsByContentTuning, contentTuningId);
2505 float value = 0.0f;
2506 switch (stat)
2507 {
2509 value = expectedStatItr->second->CreatureHealth;
2510 if (contentTuningMods)
2511 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2513 if (classMod)
2514 value *= classMod->CreatureHealthMod;
2515 break;
2517 value = expectedStatItr->second->PlayerHealth;
2518 if (contentTuningMods)
2519 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2521 if (classMod)
2522 value *= classMod->PlayerHealthMod;
2523 break;
2525 value = expectedStatItr->second->CreatureAutoAttackDps;
2526 if (contentTuningMods)
2527 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2529 if (classMod)
2530 value *= classMod->CreatureAutoAttackDPSMod;
2531 break;
2533 value = expectedStatItr->second->CreatureArmor;
2534 if (contentTuningMods)
2535 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2537 if (classMod)
2538 value *= classMod->CreatureArmorMod;
2539 break;
2541 value = expectedStatItr->second->PlayerMana;
2542 if (contentTuningMods)
2543 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2545 if (classMod)
2546 value *= classMod->PlayerManaMod;
2547 break;
2549 value = expectedStatItr->second->PlayerPrimaryStat;
2550 if (contentTuningMods)
2551 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2553 if (classMod)
2554 value *= classMod->PlayerPrimaryStatMod;
2555 break;
2557 value = expectedStatItr->second->PlayerSecondaryStat;
2558 if (contentTuningMods)
2559 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2561 if (classMod)
2562 value *= classMod->PlayerSecondaryStatMod;
2563 break;
2565 value = expectedStatItr->second->ArmorConstant;
2566 if (contentTuningMods)
2567 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2569 if (classMod)
2570 value *= classMod->ArmorConstantMod;
2571 break;
2573 break;
2575 value = expectedStatItr->second->CreatureSpellDamage;
2576 if (contentTuningMods)
2577 value *= std::accumulate(contentTuningMods->begin(), contentTuningMods->end(), 1.0f,
2579 if (classMod)
2580 value *= classMod->CreatureSpellDamageMod;
2581 break;
2582 default:
2583 break;
2584 }
2585
2586 return value;
2587}
2588
2589std::vector<uint32> const* DB2Manager::GetFactionTeamList(uint32 faction) const
2590{
2591 return Trinity::Containers::MapGetValuePtr(_factionTeams, faction);
2592}
2593
2595{
2596 return Trinity::Containers::MapGetValuePtr(_friendshipRepReactions, friendshipRepID);
2597}
2598
2599std::span<int32 const> DB2Manager::GetGameObjectLabels(uint32 gameobjectId) const
2600{
2601 std::vector<int32> const* labels = Trinity::Containers::MapGetValuePtr(_gameobjectLabels, gameobjectId);
2602 return labels ? std::span<int32 const>(*labels) : std::span<int32 const>();
2603}
2604
2606{
2607 for (GlobalCurveEntry const* globalCurveEntry : sGlobalCurveStore)
2608 if (GlobalCurve(globalCurveEntry->Type) == globalCurveType)
2609 return globalCurveEntry->CurveID;
2610
2611 return 0;
2612}
2613
2614std::vector<uint32> const* DB2Manager::GetGlyphBindableSpells(uint32 glyphPropertiesId) const
2615{
2616 return Trinity::Containers::MapGetValuePtr(_glyphBindableSpells, glyphPropertiesId);
2617}
2618
2619std::vector<ChrSpecialization> const* DB2Manager::GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const
2620{
2621 return Trinity::Containers::MapGetValuePtr(_glyphRequiredSpecs, glyphPropertiesId);
2622}
2623
2625{
2626 return Trinity::Containers::MapGetValuePtr(_heirlooms, itemId);
2627}
2628
2630{
2631 return Trinity::Containers::MapGetValuePtr(_itemChildEquipment, itemId);
2632}
2633
2635{
2636 return _itemClassByOldEnum[itemClass];
2637}
2638
2640{
2641 return _itemsWithCurrencyCost.count(itemId) > 0;
2642}
2643
2644std::vector<ItemLimitCategoryConditionEntry const*> const* DB2Manager::GetItemLimitCategoryConditions(uint32 categoryId) const
2645{
2646 return Trinity::Containers::MapGetValuePtr(_itemCategoryConditions, categoryId);
2647}
2648
2649std::vector<ItemSetSpellEntry const*> const* DB2Manager::GetItemSetSpells(uint32 itemSetId) const
2650{
2651 return Trinity::Containers::MapGetValuePtr(_itemSetSpells, itemSetId);
2652}
2653
2654std::vector<ItemSpecOverrideEntry const*> const* DB2Manager::GetItemSpecOverrides(uint32 itemId) const
2655{
2656 return Trinity::Containers::MapGetValuePtr(_itemSpecOverrides, itemId);
2657}
2658
2660{
2661 if (index < _journalTiersByIndex.size())
2662 return _journalTiersByIndex[index];
2663 return nullptr;
2664}
2665
2667{
2668 for (LFGDungeonsEntry const* dungeon : sLFGDungeonsStore)
2669 if (dungeon->MapID == int32(mapId) && Difficulty(dungeon->DifficultyID) == difficulty)
2670 return dungeon;
2671
2672 return nullptr;
2673}
2674
2676{
2677 for (int32 i = sLightStore.GetNumRows(); i >= 0; --i)
2678 {
2679 LightEntry const* light = sLightStore.LookupEntry(uint32(i));
2680 if (!light)
2681 continue;
2682
2683 if (light->ContinentID == int32(mapId) && light->GameCoords.X == 0.0f && light->GameCoords.Y == 0.0f && light->GameCoords.Z == 0.0f)
2684 return uint32(i);
2685 }
2686
2687 return 0;
2688}
2689
2691{
2692 if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType))
2693 return 1 << liq->SoundBank;
2694
2695 return 0;
2696}
2697
2698MapDifficultyEntry const* DB2Manager::GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty /*= nullptr*/) const
2699{
2700 std::unordered_map<uint32, MapDifficultyEntry const*>* difficultiesForMap = Trinity::Containers::MapGetValuePtr(_mapDifficulties, mapId);
2701 if (!difficultiesForMap)
2702 return nullptr;
2703
2704 auto difficultyEnd = difficultiesForMap->end();
2705
2706 // first find any valid difficulty
2707 auto foundDifficulty = std::ranges::find_if(difficultiesForMap->begin(), difficultyEnd,
2708 [](uint32 difficultyId) { return sDifficultyStore.HasRecord(difficultyId); },
2710
2711 if (foundDifficulty == difficultyEnd)
2712 return nullptr; // nothing valid was found
2713
2714 if (!(sDifficultyStore.AssertEntry(foundDifficulty->first)->Flags & DIFFICULTY_FLAG_DEFAULT))
2715 {
2716 // first valid difficulty wasn't default, try finding one
2717 auto defaultDifficulty = std::ranges::find_if(foundDifficulty, difficultyEnd,
2718 [](DifficultyEntry const* difficultyEntry) { return difficultyEntry && (difficultyEntry->Flags & DIFFICULTY_FLAG_DEFAULT) != 0; },
2719 [](std::pair<uint32 const, MapDifficultyEntry const*> const& p) { return sDifficultyStore.LookupEntry(p.first); });
2720
2721 if (defaultDifficulty != difficultyEnd)
2722 foundDifficulty = defaultDifficulty; // got a default
2723 }
2724
2725 if (difficulty)
2726 *difficulty = Difficulty(foundDifficulty->first);
2727
2728 return foundDifficulty->second;
2729}
2730
2732{
2733 auto itr = _mapDifficulties.find(mapId);
2734 if (itr == _mapDifficulties.end())
2735 return nullptr;
2736
2737 auto diffItr = itr->second.find(difficulty);
2738 if (diffItr == itr->second.end())
2739 return nullptr;
2740
2741 return diffItr->second;
2742}
2743
2745{
2746 DifficultyEntry const* diffEntry = sDifficultyStore.LookupEntry(difficulty);
2747 if (!diffEntry)
2748 return GetDefaultMapDifficulty(mapId, &difficulty);
2749
2750 uint32 tmpDiff = difficulty;
2751 MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff));
2752 while (!mapDiff)
2753 {
2754 tmpDiff = diffEntry->FallbackDifficultyID;
2755 diffEntry = sDifficultyStore.LookupEntry(tmpDiff);
2756 if (!diffEntry)
2757 return GetDefaultMapDifficulty(mapId, &difficulty);
2758
2759 // pull new data
2760 mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); // we are 10 normal or 25 normal
2761 }
2762
2763 difficulty = Difficulty(tmpDiff);
2764 return mapDiff;
2765}
2766
2768{
2769 return Trinity::Containers::MapGetValuePtr(_mapDifficultyConditions, mapDifficultyId);
2770}
2771
2773{
2774 return Trinity::Containers::MapGetValuePtr(_mountsBySpellId, spellId);
2775}
2776
2778{
2779 return sMountStore.LookupEntry(id);
2780}
2781
2783{
2784 return Trinity::Containers::MapGetValuePtr(_mountCapabilitiesByType, mountType);
2785}
2786
2788{
2789 return Trinity::Containers::MapGetValuePtr(_mountDisplays, mountId);
2790}
2791
2792std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender) const
2793{
2794 ASSERT(gender < GENDER_NONE);
2795 auto ritr = _nameGenData.find(race);
2796 if (ritr == _nameGenData.end())
2797 return "";
2798
2799 if (ritr->second[gender].empty())
2800 return "";
2801
2802 return Trinity::Containers::SelectRandomContainerElement(ritr->second[gender])->Name;
2803}
2804
2805ResponseCodes DB2Manager::ValidateName(std::wstring const& name, LocaleConstant locale) const
2806{
2807 for (Trinity::wregex const& regex : _nameValidators[locale])
2808 if (Trinity::regex_search(name, regex))
2809 return CHAR_NAME_PROFANE;
2810
2811 // regexes at TOTAL_LOCALES are loaded from NamesReserved which is not locale specific
2812 for (Trinity::wregex const& regex : _nameValidators[TOTAL_LOCALES])
2813 if (Trinity::regex_search(name, regex))
2814 return CHAR_NAME_RESERVED;
2815
2816 return CHAR_NAME_SUCCESS;
2817}
2818
2820{
2821 NumTalentsAtLevelEntry const* numTalentsAtLevel = sNumTalentsAtLevelStore.LookupEntry(level);
2822 if (!numTalentsAtLevel)
2823 numTalentsAtLevel = sNumTalentsAtLevelStore.LookupEntry(sNumTalentsAtLevelStore.GetNumRows() - 1);
2824
2825 if (numTalentsAtLevel)
2826 {
2827 switch (playerClass)
2828 {
2829 case CLASS_DEATH_KNIGHT:
2830 return numTalentsAtLevel->NumTalentsDeathKnight;
2831 case CLASS_DEMON_HUNTER:
2832 return numTalentsAtLevel->NumTalentsDemonHunter;
2833 default:
2834 return numTalentsAtLevel->NumTalents;
2835 }
2836 }
2837
2838 return 0;
2839}
2840
2842{
2843 return Trinity::Containers::MapGetValuePtr(_paragonReputations, factionId);
2844}
2845
2847{
2848 return Trinity::Containers::MapGetValuePtr(_paths, pathId);
2849}
2850
2852{
2853 PVPDifficultyEntry const* maxEntry = nullptr; // used for level > max listed level case
2854 for (PVPDifficultyEntry const* entry : sPVPDifficultyStore)
2855 {
2856 // skip unrelated and too-high brackets
2857 if (entry->MapID != mapid || entry->MinLevel > level)
2858 continue;
2859
2860 // exactly fit
2861 if (entry->MaxLevel >= level)
2862 return entry;
2863
2864 // remember for possible out-of-range case (search higher from existed)
2865 if (!maxEntry || maxEntry->MaxLevel < entry->MaxLevel)
2866 maxEntry = entry;
2867 }
2868
2869 return maxEntry;
2870}
2871
2873{
2874 for (PVPDifficultyEntry const* entry : sPVPDifficultyStore)
2875 if (entry->MapID == mapid && entry->GetBracketId() == id)
2876 return entry;
2877
2878 return nullptr;
2879}
2880
2882{
2884 if (_pvpTalentSlotUnlock[slot])
2885 {
2886 switch (class_)
2887 {
2888 case CLASS_DEATH_KNIGHT:
2889 return _pvpTalentSlotUnlock[slot]->DeathKnightLevelRequired;
2890 case CLASS_DEMON_HUNTER:
2891 return _pvpTalentSlotUnlock[slot]->DemonHunterLevelRequired;
2892 default:
2893 break;
2894 }
2895 return _pvpTalentSlotUnlock[slot]->LevelRequired;
2896 }
2897
2898 return 0;
2899}
2900
2902{
2903 int32 slots = 0;
2904 for (uint8 slot = 0; slot < MAX_PVP_TALENT_SLOTS; ++slot)
2905 if (level >= GetRequiredLevelForPvpTalentSlot(slot, class_))
2906 ++slots;
2907
2908 return slots;
2909}
2910
2911std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItems(uint32 questPackageID) const
2912{
2913 auto itr = _questPackages.find(questPackageID);
2914 if (itr != _questPackages.end())
2915 return &itr->second.first;
2916
2917 return nullptr;
2918}
2919
2920std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItemsFallback(uint32 questPackageID) const
2921{
2922 auto itr = _questPackages.find(questPackageID);
2923 if (itr != _questPackages.end())
2924 return &itr->second.second;
2925
2926 return nullptr;
2927}
2928
2930{
2931 QuestV2Entry const* v2 = sQuestV2Store.LookupEntry(questId);
2932 if (!v2)
2933 return 0;
2934
2935 return v2->UniqueBitFlag;
2936}
2937
2938std::vector<uint32> const* DB2Manager::GetPhasesForGroup(uint32 group) const
2939{
2940 return Trinity::Containers::MapGetValuePtr(_phasesByGroup, group);
2941}
2942
2944{
2945 ASSERT(power < MAX_POWERS);
2946 return _powerTypes[power];
2947}
2948
2949PowerTypeEntry const* DB2Manager::GetPowerTypeByName(std::string const& name) const
2950{
2951 for (PowerTypeEntry const* powerType : sPowerTypeStore)
2952 {
2953 std::string powerName = powerType->NameGlobalStringTag;
2954 strToLower(powerName);
2955 if (powerName == name)
2956 return powerType;
2957
2958 powerName.erase(std::remove(powerName.begin(), powerName.end(), '_'), powerName.end());
2959 if (powerName == name)
2960 return powerType;
2961 }
2962
2963 return nullptr;
2964}
2965
2966std::vector<RewardPackXCurrencyTypeEntry const*> const* DB2Manager::GetRewardPackCurrencyTypesByRewardID(uint32 rewardPackID) const
2967{
2968 return Trinity::Containers::MapGetValuePtr(_rewardPackCurrencyTypes, rewardPackID);
2969}
2970
2971std::vector<RewardPackXItemEntry const*> const* DB2Manager::GetRewardPackItemsByRewardID(uint32 rewardPackID) const
2972{
2973 return Trinity::Containers::MapGetValuePtr(_rewardPackItems, rewardPackID);
2974}
2975
2977{
2978 return Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesForShapeshifts, { race, gender, form });
2979}
2980
2981std::vector<SkillLineEntry const*> const* DB2Manager::GetSkillLinesForParentSkill(uint32 parentSkillId) const
2982{
2983 return Trinity::Containers::MapGetValuePtr(_skillLinesByParentSkillLine, parentSkillId);
2984}
2985
2986std::vector<SkillLineAbilityEntry const*> const* DB2Manager::GetSkillLineAbilitiesBySkill(uint32 skillId) const
2987{
2988 return Trinity::Containers::MapGetValuePtr(_skillLineAbilitiesBySkillupSkill, skillId);
2989}
2990
2992{
2993 for (auto&& [_, skllRaceClassInfo] : Trinity::Containers::MapEqualRange(_skillRaceClassInfoBySkill, skill))
2994 {
2995 if (!skllRaceClassInfo->RaceMask.IsEmpty() && !(skllRaceClassInfo->RaceMask.HasRace(race)))
2996 continue;
2997 if (skllRaceClassInfo->ClassMask && !(skllRaceClassInfo->ClassMask & (1 << (class_ - 1))))
2998 continue;
2999
3000 return skllRaceClassInfo;
3001 }
3002
3003 return nullptr;
3004}
3005
3006std::vector<SkillRaceClassInfoEntry const*> DB2Manager::GetSkillRaceClassInfo(uint32 skill) const
3007{
3008 std::vector<SkillRaceClassInfoEntry const*> result;
3009 for (auto const& [_, skillRaceClassInfo] : Trinity::Containers::MapEqualRange(_skillRaceClassInfoBySkill, skill))
3010 result.push_back(skillRaceClassInfo);
3011
3012 return result;
3013}
3014
3016{
3017 return Trinity::Containers::MapGetValuePtr(_soulbindConduitRanks, { soulbindConduitId, rank });
3018}
3019
3020std::vector<SpecializationSpellsEntry const*> const* DB2Manager::GetSpecializationSpells(uint32 specId) const
3021{
3022 return Trinity::Containers::MapGetValuePtr(_specializationSpellsBySpec, specId);
3023}
3024
3025bool DB2Manager::IsSpecSetMember(int32 specSetId, uint32 specId) const
3026{
3027 return _specsBySpecSet.count(std::make_pair(specSetId, specId)) > 0;
3028}
3029
3031{
3032 return _spellFamilyNames.count(family) > 0;
3033}
3034
3035std::vector<SpellProcsPerMinuteModEntry const*> DB2Manager::GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const
3036{
3037 auto itr = _spellProcsPerMinuteMods.find(spellprocsPerMinuteId);
3038 if (itr != _spellProcsPerMinuteMods.end())
3039 return itr->second;
3040
3041 return std::vector<SpellProcsPerMinuteModEntry const*>();
3042}
3043
3044std::vector<SpellVisualMissileEntry const*> const* DB2Manager::GetSpellVisualMissiles(int32 spellVisualMissileSetId) const
3045{
3046 return Trinity::Containers::MapGetValuePtr(_spellVisualMissilesBySet, spellVisualMissileSetId);
3047}
3048
3049std::vector<TalentEntry const*> const& DB2Manager::GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const
3050{
3051 return _talentsByPosition[class_][tier][column];
3052}
3053
3055{
3056 return Trinity::Containers::MapGetValuePtr(_taxiPaths, { from, to });
3057}
3058
3059bool DB2Manager::IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId, bool requireAllTotems /*= true*/)
3060{
3061 if (requiredTotemCategoryId == 0)
3062 return true;
3063 if (itemTotemCategoryId == 0)
3064 return false;
3065
3066 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(itemTotemCategoryId);
3067 if (!itemEntry)
3068 return false;
3069 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
3070 if (!reqEntry)
3071 return false;
3072
3073 if (itemEntry->TotemCategoryType != reqEntry->TotemCategoryType)
3074 return false;
3075
3076 int32 sharedMask = itemEntry->TotemCategoryMask & reqEntry->TotemCategoryMask;
3077 return requireAllTotems ? sharedMask == reqEntry->TotemCategoryMask : sharedMask != 0;
3078}
3079
3081{
3082 return _toys.count(toy) > 0;
3083}
3084
3086{
3088 // distances if inside
3089 struct
3090 {
3091 float DistanceToRegionCenterSquared = std::numeric_limits<float>::max();
3092 float DistanceToRegionBottom = std::numeric_limits<float>::max();
3094
3095 // distances if outside
3096 struct
3097 {
3098 float DistanceToRegionEdgeSquared = std::numeric_limits<float>::max();
3099 float DistanceToRegionTop = std::numeric_limits<float>::max();
3100 float DistanceToRegionBottom = std::numeric_limits<float>::max();
3102
3106
3107 bool IsInside() const
3108 {
3109 return Outside.DistanceToRegionEdgeSquared < std::numeric_limits<float>::epsilon() &&
3110 std::abs(Outside.DistanceToRegionTop) < std::numeric_limits<float>::epsilon() &&
3111 std::abs(Outside.DistanceToRegionBottom) < std::numeric_limits<float>::epsilon();
3112 }
3113};
3114
3115static bool operator<(UiMapAssignmentStatus const& left, UiMapAssignmentStatus const& right)
3116{
3117 bool leftInside = left.IsInside();
3118 bool rightInside = right.IsInside();
3119 if (leftInside != rightInside)
3120 return leftInside;
3121
3122 if (left.UiMapAssignment && right.UiMapAssignment &&
3126
3127 if (left.WmoPriority != right.WmoPriority)
3128 return left.WmoPriority < right.WmoPriority;
3129
3130 if (left.AreaPriority != right.AreaPriority)
3131 return left.AreaPriority < right.AreaPriority;
3132
3133 if (left.MapPriority != right.MapPriority)
3134 return left.MapPriority < right.MapPriority;
3135
3136 if (leftInside)
3137 {
3140
3141 float leftUiSizeX = left.UiMapAssignment ? (left.UiMapAssignment->UiMax.X - left.UiMapAssignment->UiMin.X) : 0.0f;
3142 float rightUiSizeX = right.UiMapAssignment ? (right.UiMapAssignment->UiMax.X - right.UiMapAssignment->UiMin.X) : 0.0f;
3143
3144 if (leftUiSizeX > std::numeric_limits<float>::epsilon() && rightUiSizeX > std::numeric_limits<float>::epsilon())
3145 {
3146 float leftScale = (left.UiMapAssignment->Region[1].X - left.UiMapAssignment->Region[0].X) / leftUiSizeX;
3147 float rightScale = (right.UiMapAssignment->Region[1].X - right.UiMapAssignment->Region[0].X) / rightUiSizeX;
3148 if (leftScale != rightScale)
3149 return leftScale < rightScale;
3150 }
3151
3154 }
3155 else
3156 {
3159
3162
3165 }
3166
3167 return true;
3168}
3169
3170static bool CheckUiMapAssignmentStatus(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId,
3171 UiMapAssignmentEntry const* uiMapAssignment, UiMapAssignmentStatus* status)
3172{
3173 status->UiMapAssignment = uiMapAssignment;
3174 // x,y not in region
3175 if (x < uiMapAssignment->Region[0].X || x > uiMapAssignment->Region[1].X || y < uiMapAssignment->Region[0].Y || y > uiMapAssignment->Region[1].Y)
3176 {
3177 float xDiff, yDiff;
3178 if (x >= uiMapAssignment->Region[0].X)
3179 {
3180 xDiff = 0.0f;
3181 if (x > uiMapAssignment->Region[1].X)
3182 xDiff = x - uiMapAssignment->Region[0].X;
3183 }
3184 else
3185 xDiff = uiMapAssignment->Region[0].X - x;
3186
3187 if (y >= uiMapAssignment->Region[0].Y)
3188 {
3189 yDiff = 0.0f;
3190 if (y > uiMapAssignment->Region[1].Y)
3191 yDiff = y - uiMapAssignment->Region[0].Y;
3192 }
3193 else
3194 yDiff = uiMapAssignment->Region[0].Y - y;
3195
3196 status->Outside.DistanceToRegionEdgeSquared = xDiff * xDiff + yDiff * yDiff;
3197 }
3198 else
3199 {
3201 (x - (uiMapAssignment->Region[0].X + uiMapAssignment->Region[1].X) * 0.5f) * (x - (uiMapAssignment->Region[0].X + uiMapAssignment->Region[1].X) * 0.5f)
3202 + (y - (uiMapAssignment->Region[0].Y + uiMapAssignment->Region[1].Y) * 0.5f) * (y - (uiMapAssignment->Region[0].Y + uiMapAssignment->Region[1].Y) * 0.5f);
3203 status->Outside.DistanceToRegionEdgeSquared = 0.0f;
3204 }
3205
3206 // z not in region
3207 if (z < uiMapAssignment->Region[0].Z || z > uiMapAssignment->Region[1].Z)
3208 {
3209 if (z < uiMapAssignment->Region[1].Z)
3210 {
3211 if (z < uiMapAssignment->Region[0].Z)
3212 status->Outside.DistanceToRegionBottom = std::min(uiMapAssignment->Region[0].Z - z, 10000.0f);
3213 }
3214 else
3215 status->Outside.DistanceToRegionTop = std::min(z - uiMapAssignment->Region[1].Z, 10000.0f);
3216 }
3217 else
3218 {
3219 status->Outside.DistanceToRegionTop = 0.0f;
3220 status->Outside.DistanceToRegionBottom = 0.0f;
3221 status->Inside.DistanceToRegionBottom = std::min(uiMapAssignment->Region[0].Z - z, 10000.0f);
3222 }
3223
3224 if (areaId && uiMapAssignment->AreaID)
3225 {
3226 int8 areaPriority = 0;
3227 while (areaId != uiMapAssignment->AreaID)
3228 {
3229 if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId))
3230 {
3231 areaId = areaEntry->ParentAreaID;
3232 ++areaPriority;
3233 }
3234 else
3235 return false;
3236 }
3237
3238 status->AreaPriority = areaPriority;
3239 }
3240
3241 if (mapId >= 0 && uiMapAssignment->MapID >= 0)
3242 {
3243 if (mapId != uiMapAssignment->MapID)
3244 {
3245 if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
3246 {
3247 if (mapEntry->ParentMapID == uiMapAssignment->MapID)
3248 status->MapPriority = 1;
3249 else if (mapEntry->CosmeticParentMapID == uiMapAssignment->MapID)
3250 status->MapPriority = 2;
3251 else
3252 return false;
3253 }
3254 else
3255 return false;
3256 }
3257 else
3258 status->MapPriority = 0;
3259 }
3260
3261 if (wmoGroupId || wmoDoodadPlacementId)
3262 {
3263 if (uiMapAssignment->WmoGroupID || uiMapAssignment->WmoDoodadPlacementID)
3264 {
3265 bool hasDoodadPlacement = false;
3266 if (wmoDoodadPlacementId && uiMapAssignment->WmoDoodadPlacementID)
3267 {
3268 if (wmoDoodadPlacementId != uiMapAssignment->WmoDoodadPlacementID)
3269 return false;
3270
3271 hasDoodadPlacement = true;
3272 }
3273
3274 if (wmoGroupId && uiMapAssignment->WmoGroupID)
3275 {
3276 if (wmoGroupId != uiMapAssignment->WmoGroupID)
3277 return false;
3278
3279 if (hasDoodadPlacement)
3280 status->WmoPriority = 0;
3281 else
3282 status->WmoPriority = 2;
3283 }
3284 else if (hasDoodadPlacement)
3285 status->WmoPriority = 1;
3286 }
3287 }
3288
3289 return true;
3290}
3291
3292static UiMapAssignmentEntry const* FindNearestMapAssignment(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system)
3293{
3294 UiMapAssignmentStatus nearestMapAssignment;
3295 auto iterateUiMapAssignments = [&](std::unordered_multimap<int32, UiMapAssignmentEntry const*> const& assignments, int32 id)
3296 {
3297 for (auto assignment : Trinity::Containers::MapEqualRange(assignments, id))
3298 {
3299 UiMapAssignmentStatus status;
3300 if (CheckUiMapAssignmentStatus(x, y, z, mapId, areaId, wmoDoodadPlacementId, wmoGroupId, assignment.second, &status))
3301 if (status < nearestMapAssignment)
3302 nearestMapAssignment = status;
3303 }
3304 };
3305
3306 iterateUiMapAssignments(_uiMapAssignmentByWmoGroup[system], wmoGroupId);
3307 iterateUiMapAssignments(_uiMapAssignmentByWmoDoodadPlacement[system], wmoDoodadPlacementId);
3308
3309 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
3310 while (areaEntry)
3311 {
3312 iterateUiMapAssignments(_uiMapAssignmentByArea[system], areaEntry->ID);
3313 areaEntry = sAreaTableStore.LookupEntry(areaEntry->ParentAreaID);
3314 }
3315
3316 if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
3317 {
3318 iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->ID);
3319 if (mapEntry->ParentMapID >= 0)
3320 iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->ParentMapID);
3321 if (mapEntry->CosmeticParentMapID >= 0)
3322 iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->CosmeticParentMapID);
3323 }
3324
3325 return nearestMapAssignment.UiMapAssignment;
3326}
3327
3329{
3330 UiMapEntry const* uiMap = sUiMapStore.LookupEntry(uiMapID);
3331 while (uiMap)
3332 {
3333 if (uiMap->Type <= UI_MAP_TYPE_CONTINENT)
3334 break;
3335
3336 UiMapBounds const* bounds = Trinity::Containers::MapGetValuePtr(_uiMapBounds, uiMap->ID);
3337 if (!bounds || !bounds->IsUiAssignment)
3338 break;
3339
3340 uiPosition.X = ((1.0 - uiPosition.X) * bounds->Bounds[1]) + (bounds->Bounds[3] * uiPosition.X);
3341 uiPosition.Y = ((1.0 - uiPosition.Y) * bounds->Bounds[0]) + (bounds->Bounds[2] * uiPosition.Y);
3342
3343 uiMap = sUiMapStore.LookupEntry(uiMap->ParentUiMapID);
3344 }
3345
3346 return uiPosition;
3347}
3348
3349bool DB2Manager::GetUiMapPosition(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system, bool local,
3350 uint32* uiMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/)
3351{
3352 if (uiMapId)
3353 *uiMapId = -1;
3354
3355 if (newPos)
3356 {
3357 newPos->X = 0.0f;
3358 newPos->Y = 0.0f;
3359 }
3360
3361 UiMapAssignmentEntry const* uiMapAssignment = FindNearestMapAssignment(x, y, z, mapId, areaId, wmoDoodadPlacementId, wmoGroupId, system);
3362 if (!uiMapAssignment)
3363 return false;
3364
3365 if (uiMapId)
3366 *uiMapId = uiMapAssignment->UiMapID;
3367
3368 DBCPosition2D relativePosition{ 0.5f, 0.5f };
3369 DBCPosition2D regionSize{ uiMapAssignment->Region[1].X - uiMapAssignment->Region[0].X, uiMapAssignment->Region[1].Y - uiMapAssignment->Region[0].Y };
3370 if (regionSize.X > 0.0f)
3371 relativePosition.X = (x - uiMapAssignment->Region[0].X) / regionSize.X;
3372 if (regionSize.Y > 0.0f)
3373 relativePosition.Y = (y - uiMapAssignment->Region[0].Y) / regionSize.Y;
3374
3375 DBCPosition2D uiPosition
3376 {
3377 // x and y are swapped
3378 ((1.0f - (1.0f - relativePosition.Y)) * uiMapAssignment->UiMin.X) + ((1.0f - relativePosition.Y) * uiMapAssignment->UiMax.X),
3379 ((1.0f - (1.0f - relativePosition.X)) * uiMapAssignment->UiMin.Y) + ((1.0f - relativePosition.X) * uiMapAssignment->UiMax.Y)
3380 };
3381
3382 if (!local)
3383 uiPosition = CalculateGlobalUiMapPosition(uiMapAssignment->UiMapID, uiPosition);
3384
3385 if (newPos)
3386 *newPos = uiPosition;
3387
3388 return true;
3389}
3390
3391bool DB2Manager::Zone2MapCoordinates(uint32 areaId, float& x, float& y) const
3392{
3393 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
3394 if (!areaEntry)
3395 return false;
3396
3397 for (auto assignment : Trinity::Containers::MapEqualRange(_uiMapAssignmentByArea[UI_MAP_SYSTEM_WORLD], areaId))
3398 {
3399 if (assignment.second->MapID >= 0 && assignment.second->MapID != areaEntry->ContinentID)
3400 continue;
3401
3402 float tmpY = (y - assignment.second->UiMax.Y) / (assignment.second->UiMin.Y - assignment.second->UiMax.Y);
3403 float tmpX = (x - assignment.second->UiMax.X) / (assignment.second->UiMin.X - assignment.second->UiMax.X);
3404 x = assignment.second->Region[0].X + tmpY * (assignment.second->Region[1].X - assignment.second->Region[0].X);
3405 y = assignment.second->Region[0].Y + tmpX * (assignment.second->Region[1].Y - assignment.second->Region[0].Y);
3406
3407 return true;
3408 }
3409
3410 return false;
3411}
3412
3413void DB2Manager::Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const
3414{
3415 DBCPosition2D zoneCoords;
3416 if (!GetUiMapPosition(x, y, 0.0f, -1, areaId, 0, 0, UI_MAP_SYSTEM_WORLD, true, nullptr, &zoneCoords))
3417 return;
3418
3419 x = zoneCoords.Y * 100.0f;
3420 y = zoneCoords.X * 100.0f;
3421}
3422
3424{
3425 return _uiMapPhases.find(phaseId) != _uiMapPhases.end();
3426}
3427
3428WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId, bool allowGroupFallback)
3429{
3430 WMOAreaTableEntry const* wmoAreaTableEntry = Trinity::Containers::MapGetValuePtr(_wmoAreaTableLookup, WMOAreaTableKey(int16(rootId), int8(adtId), groupId));
3431 if (!wmoAreaTableEntry && allowGroupFallback)
3432 wmoAreaTableEntry = Trinity::Containers::MapGetValuePtr(_wmoAreaTableLookup, WMOAreaTableKey(int16(rootId), int8(adtId), -1));
3433
3434 return wmoAreaTableEntry;
3435}
3436
3437std::unordered_set<uint32> const* DB2Manager::GetPVPStatIDsForMap(uint32 mapId) const
3438{
3439 return Trinity::Containers::MapGetValuePtr(_pvpStatIdsByMap, mapId);
3440}
3441
3442bool ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerTypesEntry const* left, ChrClassesXPowerTypesEntry const* right)
3443{
3444 if (left->ClassID != right->ClassID)
3445 return left->ClassID < right->ClassID;
3446 return left->PowerType < right->PowerType;
3447}
3448
3450{
3451 if (sTaxiNodesStore.GetNumRows())
3452 {
3453 _data.resize((sTaxiNodesStore.GetNumRows() + (8 * sizeof(uint64) - 1)) / (8 * sizeof(uint64)) * (sizeof(uint64) / sizeof(value_type)), 0);
3454 ASSERT((_data.size() % 8) == 0, "TaxiMask size must be aligned to a multiple of uint64");
3455 }
3456}
3457
3458bool DB2Manager::FriendshipRepReactionEntryComparator::Compare(FriendshipRepReactionEntry const* left, FriendshipRepReactionEntry const* right)
3459{
3460 return left->ReactionThreshold < right->ReactionThreshold;
3461}
3462
3463bool DB2Manager::MountTypeXCapabilityEntryComparator::Compare(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right)
3464{
3465 if (left->MountTypeID == right->MountTypeID)
3466 return left->OrderIndex < right->OrderIndex;
3467 return left->MountTypeID < right->MountTypeID;
3468}
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)
std::unordered_map< uint32, std::unordered_map< uint32, MapDifficultyEntry const * > > MapDifficultyContainer
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)
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:366
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:374
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:921
@ AZERITE_TIER_UNLOCK_SET_FLAG_DEFAULT
Definition DBCEnums.h:241
UiMapSystem
Definition DBCEnums.h:2953
@ UI_MAP_SYSTEM_ADVENTURE
Definition DBCEnums.h:2956
@ MAX_UI_MAP_SYSTEM
Definition DBCEnums.h:2958
@ UI_MAP_SYSTEM_WORLD
Definition DBCEnums.h:2954
@ UI_MAP_SYSTEM_TAXI
Definition DBCEnums.h:2955
#define MAX_AZERITE_EMPOWERED_TIER
Definition DBCEnums.h:227
@ MAX_LEVEL
Definition DBCEnums.h:45
@ UI_MAP_TYPE_CONTINENT
Definition DBCEnums.h:2965
AzeriteItemMilestoneType
Definition DBCEnums.h:233
GlobalCurve
Definition DBCEnums.h:1171
@ DIFFICULTY_FLAG_DEFAULT
Definition DBCEnums.h:976
@ NoWorldPositions
ItemContext
Definition DBCEnums.h:1315
constexpr size_t PLAYER_EXPLORED_ZONES_SIZE
Definition DBCEnums.h:160
#define MAX_PVP_TALENT_SLOTS
Definition DBCEnums.h:2795
#define MAX_TALENT_TIERS
Definition DBCEnums.h:2793
ContentTuningCalcType
Definition DBCEnums.h:443
ChrSpecialization
Definition DBCEnums.h:398
Difficulty
Definition DBCEnums.h:932
ExpectedStatType
Definition DBCEnums.h:986
#define MAX_TALENT_COLUMNS
Definition DBCEnums.h:2794
BattlegroundBracketId
Definition DBCEnums.h:53
@ MAX_BATTLEGROUND_BRACKETS
Definition DBCEnums.h:58
#define MAX_AZERITE_ESSENCE_SLOT
Definition DBCEnums.h:229
@ QUEST_PACKAGE_FILTER_UNMATCHED
Definition DBCEnums.h:2328
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:80
@ ITEM_ACCOUNT_BANK_TAB_BAG
@ ITEM_CHARACTER_BANK_TAB_BAG
#define TC_LOG_ERROR(filterType__, message__,...)
Definition Log.h:190
#define TC_LOG_FATAL(filterType__, message__,...)
Definition Log.h:193
#define TC_LOG_INFO(filterType__, message__,...)
Definition Log.h:184
#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:27
uint32 rand32()
Definition Random.cpp:70
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)
uint32 GetPowerIndexByClass(Powers power, uint32 classId) const
ItemChildEquipmentEntry const * GetItemChildEquipment(uint32 itemId) const
std::vector< AzeriteItemMilestonePowerEntry const * > const & GetAzeriteItemMilestonePowers() const
static DB2Manager & Instance()
uint32 GetRequiredLevelForPvpTalentSlot(uint8 slot, Classes class_) const
std::vector< std::pair< uint32, PlayerConditionEntry const * > > MapDifficultyConditionsContainer
Definition DB2Stores.h:440
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:566
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:437
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
MapDifficultyEntry const * GetDefaultMapDifficulty(uint32 mapId, Difficulty *difficulty=nullptr) 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:442
std::vector< AzeritePowerSetMemberEntry const * > const * GetAzeritePowers(uint32 itemId) const
static std::string_view GetDifficultyName(Difficulty difficulty)
void LoadHotfixOptionalData(uint32 localeMask)
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
MapDifficultyEntry const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty) const
std::set< MountTypeXCapabilityEntry const *, MountTypeXCapabilityEntryComparator > MountTypeXCapabilitySet
Definition DB2Stores.h:441
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:439
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:2506
std::vector< value_type > _data
Definition DBCEnums.h:2520
#define sWorld
Definition World.h:916
@ CONFIG_EXPANSION
Definition World.h:306
@ CONFIG_LOAD_LOCALES
Definition World.h:200
constexpr auto MapKey
Definition MapUtils.h:72
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:428
std::vector< HotfixRecord > Records
Definition DB2Stores.h:433
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:345
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
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:353
std::vector< ChrCustomizationChoiceEntry const * > const * Choices
Definition DB2Stores.h:352
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
static constexpr DB2LoadInfo Instance
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::@190 Inside
struct UiMapAssignmentStatus::@191 Outside
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