aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp44
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h25
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp3
-rw-r--r--src/server/game/Chat/Chat.cpp5
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp51
-rw-r--r--src/server/game/DataStores/DB2Stores.h10
-rw-r--r--src/server/game/DataStores/DB2Structure.h174
-rw-r--r--src/server/game/DataStores/DB2fmt.h9
-rw-r--r--src/server/game/DataStores/DBCEnums.h46
-rw-r--r--src/server/game/DataStores/DBCStores.cpp62
-rw-r--r--src/server/game/DataStores/DBCStores.h12
-rw-r--r--src/server/game/DataStores/DBCStructure.h188
-rw-r--r--src/server/game/DataStores/DBCfmt.h10
-rw-r--r--src/server/game/Entities/Creature/Creature.h4
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp6
-rw-r--r--src/server/game/Entities/Player/Player.cpp12
-rw-r--r--src/server/game/Garrison/Garrison.cpp4
-rw-r--r--src/server/game/Garrison/GarrisonMgr.cpp4
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp40
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp2
-rw-r--r--src/server/game/Instances/InstanceScript.cpp5
-rw-r--r--src/server/game/Loot/LootMgr.cpp7
-rw-r--r--src/server/game/Maps/Map.cpp12
-rw-r--r--src/server/game/Maps/MapManager.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp2
-rw-r--r--src/server/scripts/Commands/cs_character.cpp2
-rw-r--r--src/server/scripts/Commands/cs_go.cpp4
-rw-r--r--src/server/scripts/Commands/cs_group.cpp2
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp125
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp12
-rw-r--r--src/server/scripts/Commands/cs_titles.cpp12
-rw-r--r--src/server/shared/DataStores/DB2SparseStorageLoader.h1
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.h1
-rw-r--r--src/server/shared/DataStores/DB2Store.h23
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.cpp9
-rw-r--r--src/server/shared/DataStores/DBStorageIterator.h4
36 files changed, 524 insertions, 410 deletions
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index d2a62e1f9ce..9b9363f6724 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -41,6 +41,17 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// AreaGroupMember.db2
PrepareStatement(HOTFIX_SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaGroupID, AreaID FROM area_group_member ORDER BY ID DESC", CONNECTION_SYNCH);
+ // AreaTable.db2
+ PrepareStatement(HOTFIX_SEL_AREA_TABLE, "SELECT ID, Flags1, Flags2, ZoneName, AmbientMultiplier, AreaName, MapID, ParentAreaID, AreaBit, "
+ "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UWZoneMusic, UWAmbience, "
+ "PvPCombastWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, UWIntroMusic, "
+ "WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID FROM area_table ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_AREA_TABLE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?", CONNECTION_SYNCH);
+
+ // AreaTrigger.db2
+ PrepareStatement(HOTFIX_SEL_AREA_TRIGGER, "SELECT ID, PosX, PosY, PosZ, Radius, BoxLength, BoxWidth, BoxHeight, BoxYaw, MapID, PhaseID, "
+ "PhaseGroupID, ShapeID, AreaTriggerActionSetID, PhaseUseFlags, ShapeType, Flag FROM area_trigger ORDER BY ID DESC", CONNECTION_SYNCH);
+
// ArmorLocation.db2
PrepareStatement(HOTFIX_SEL_ARMOR_LOCATION, "SELECT ID, Modifier1, Modifier2, Modifier3, Modifier4, Modifier5 FROM armor_location ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -80,6 +91,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, "
"ItemID24, PetDisplayID, RaceID, ClassID, GenderID, OutfitID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH);
+ // CharTitles.db2
+ PrepareStatement(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale, NameFemale, ConditionID, MaskID, Flags FROM char_titles ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, NameMale_lang, NameFemale_lang FROM char_titles_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// ChatChannels.db2
PrepareStatement(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Flags, Name, Shortcut, FactionGroup FROM chat_channels ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -118,6 +133,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"SkinID, FaceID, HairStyleID, HairColorID, FacialHairID, CustomDisplayOption1, CustomDisplayOption2, CustomDisplayOption3, Flags"
" FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH);
+ // CreatureFamily.db2
+ PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, MinScale, MaxScale, Name, IconFile, SkillLine1, SkillLine2, PetFoodMask, MinScaleLevel, "
+ "MaxScaleLevel, PetTalentType, CategoryEnumID FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// CreatureType.db2
PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -147,6 +167,17 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"StateSmokeInitDoodadSet, StateSmokeAmbientDoodadSet, StateSmokeNameSet, EjectDirection, DoNotHighlight, HealEffect"
" FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH);
+ // Difficulty.db2
+ PrepareStatement(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name, FallbackDifficultyID, InstanceType, MinPlayers, MaxPlayers, OldEnumValue, Flags, "
+ "ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID, ItemBonusTreeModID, OrderIndex FROM difficulty"
+ " ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?", CONNECTION_SYNCH);
+
+ // DungeonEncounter.db2
+ PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name, CreatureDisplayID, MapID, OrderIndex, SpellIconID, DifficultyID, Bit, Flags"
+ " FROM dungeon_encounter ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// DurabilityCosts.db2
PrepareStatement(HOTFIX_SEL_DURABILITY_COSTS, "SELECT ID, WeaponSubClassCost1, WeaponSubClassCost2, WeaponSubClassCost3, WeaponSubClassCost4, "
"WeaponSubClassCost5, WeaponSubClassCost6, WeaponSubClassCost7, WeaponSubClassCost8, WeaponSubClassCost9, WeaponSubClassCost10, "
@@ -162,6 +193,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, AnimID, EmoteSoundID, EmoteSpecProc, "
"EmoteSpecProcParam FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH);
+ // EmotesText.db2
+ PrepareStatement(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name, EmoteID FROM emotes_text ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name_lang FROM emotes_text_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// EmotesTextSound.db2
PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, EmotesTextId, SoundId, RaceId, SexId, ClassId FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -427,6 +462,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body FROM mail_template ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH);
+ // Map.db2
+ PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags, MapType, MinimapIconScale, CorpsePosX, CorpsePosY, RaidOffset, MapName, "
+ "MapDescription0, MapDescription1, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, "
+ "InstanceType, unk5, ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// ModifierTree.db2
PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset1, Asset2, Parent, Type, Unk700, Operator, Amount FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -463,6 +504,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, SpellID1, SpellID2, SpellID3, SpellID4, SpellID5, SpellID6, SpellID7, SpellID8, "
"SpellID9, SpellID10, PlayerActionbarFileDataID, Flags FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH);
+ // Phase.db2
+ PrepareStatement(HOTFIX_SEL_PHASE, "SELECT ID, Flags FROM phase ORDER BY ID DESC", CONNECTION_SYNCH);
+
// PhaseXPhaseGroup.db2
PrepareStatement(HOTFIX_SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group ORDER BY ID DESC", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index cedaccf6168..0c915c06b92 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -39,6 +39,11 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_AREA_GROUP_MEMBER,
+ HOTFIX_SEL_AREA_TABLE,
+ HOTFIX_SEL_AREA_TABLE_LOCALE,
+
+ HOTFIX_SEL_AREA_TRIGGER,
+
HOTFIX_SEL_ARMOR_LOCATION,
HOTFIX_SEL_AUCTION_HOUSE,
@@ -63,6 +68,9 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_CHAR_START_OUTFIT,
+ HOTFIX_SEL_CHAR_TITLES,
+ HOTFIX_SEL_CHAR_TITLES_LOCALE,
+
HOTFIX_SEL_CHAT_CHANNELS,
HOTFIX_SEL_CHAT_CHANNELS_LOCALE,
@@ -80,6 +88,9 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA,
+ HOTFIX_SEL_CREATURE_FAMILY,
+ HOTFIX_SEL_CREATURE_FAMILY_LOCALE,
+
HOTFIX_SEL_CREATURE_TYPE,
HOTFIX_SEL_CREATURE_TYPE_LOCALE,
@@ -95,12 +106,21 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA,
+ HOTFIX_SEL_DIFFICULTY,
+ HOTFIX_SEL_DIFFICULTY_LOCALE,
+
+ HOTFIX_SEL_DUNGEON_ENCOUNTER,
+ HOTFIX_SEL_DUNGEON_ENCOUNTER_LOCALE,
+
HOTFIX_SEL_DURABILITY_COSTS,
HOTFIX_SEL_DURABILITY_QUALITY,
HOTFIX_SEL_EMOTES,
+ HOTFIX_SEL_EMOTES_TEXT,
+ HOTFIX_SEL_EMOTES_TEXT_LOCALE,
+
HOTFIX_SEL_EMOTES_TEXT_SOUND,
HOTFIX_SEL_GAMEOBJECTS,
@@ -240,6 +260,9 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_MAIL_TEMPLATE,
HOTFIX_SEL_MAIL_TEMPLATE_LOCALE,
+ HOTFIX_SEL_MAP,
+ HOTFIX_SEL_MAP_LOCALE,
+
HOTFIX_SEL_MODIFIER_TREE,
HOTFIX_SEL_MOUNT,
@@ -262,6 +285,8 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_OVERRIDE_SPELL_DATA,
+ HOTFIX_SEL_PHASE,
+
HOTFIX_SEL_PHASE_X_PHASE_GROUP,
HOTFIX_SEL_PLAYER_CONDITION,
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 6a0ee3b11e2..a869699dbec 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -1168,8 +1168,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
}
- PhaseEntry const* phase = sPhaseStore.LookupEntry(phaseId);
- if (!phase)
+ if (!sPhaseStore.LookupEntry(phaseId))
{
TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INGAME_PHASE_ID uses invalid phaseid %u for creature " SI64FMTD ", skipped", phaseId, e.entryOrGuid);
return false;
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 15743a0e686..85d803a6948 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -305,9 +305,10 @@ bool ChatHandler::ExecuteCommandInTable(std::vector<ChatCommand> const& table, c
std::string zoneName = "Unknown";
if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId))
{
- areaName = area->AreaName_lang;
+ int32 locale = GetSessionDbcLocale();
+ areaName = area->AreaName->Str[locale];
if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID))
- zoneName = zone->AreaName_lang;
+ zoneName = zone->AreaName->Str[locale];
}
sLog->outCommand(m_session->GetAccountId(), "Command: %s [Player: %s (%s) (Account: %u) X: %f Y: %f Z: %f Map: %u (%s) Area: %u (%s) Zone: %s Selected: %s (%s)]",
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 1778a0b97aa..f985a266e29 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -27,6 +27,8 @@
DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementFormat, HOTFIX_SEL_ACHIEVEMENT);
DB2Storage<AnimKitEntry> sAnimKitStore("AnimKit.db2", AnimKitFormat, HOTFIX_SEL_ANIM_KIT);
DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER);
+DB2Storage<AreaTableEntry> sAreaTableStore("AreaTable.db2", AreaTableFormat, HOTFIX_SEL_AREA_TABLE);
+DB2Storage<AreaTriggerEntry> sAreaTriggerStore("AreaTrigger.db2", AreaTriggerFormat, HOTFIX_SEL_AREA_TRIGGER);
DB2Storage<ArmorLocationEntry> sArmorLocationStore("ArmorLocation.db2", ArmorLocationFormat, HOTFIX_SEL_ARMOR_LOCATION);
DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE);
DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesFormat, HOTFIX_SEL_BANK_BAG_SLOT_PRICES);
@@ -38,21 +40,26 @@ DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("Bat
DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT);
DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS);
DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT);
+DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2", CharTitlesFormat, HOTFIX_SEL_CHAR_TITLES);
DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES);
DB2Storage<ChrRacesEntry> sChrRacesStore("ChrRaces.db2", ChrRacesFormat, HOTFIX_SEL_CHR_RACES);
DB2Storage<ChrSpecializationEntry> sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationFormat, HOTFIX_SEL_CHR_SPECIALIZATION);
DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES);
DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO);
DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA);
+DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyFormat, HOTFIX_SEL_CREATURE_FAMILY);
DB2Storage<CreatureTypeEntry> sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE);
DB2Storage<CriteriaEntry> sCriteriaStore("Criteria.db2", CriteriaFormat, HOTFIX_SEL_CRITERIA);
DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeFormat, HOTFIX_SEL_CRITERIA_TREE);
DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES);
DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT);
DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA);
+DB2Storage<DifficultyEntry> sDifficultyStore("Difficulty.db2", DifficultyFormat, HOTFIX_SEL_DIFFICULTY);
+DB2Storage<DungeonEncounterEntry> sDungeonEncounterStore("DungeonEncounter.db2", DungeonEncounterFormat, HOTFIX_SEL_DUNGEON_ENCOUNTER);
DB2Storage<DurabilityCostsEntry> sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsFormat, HOTFIX_SEL_DURABILITY_COSTS);
DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY);
DB2Storage<EmotesEntry> sEmotesStore("Emotes.db2", EmotesFormat, HOTFIX_SEL_EMOTES);
+DB2Storage<EmotesTextEntry> sEmotesTextStore("EmotesText.db2", EmotesTextFormat, HOTFIX_SEL_EMOTES_TEXT);
DB2Storage<EmotesTextSoundEntry> sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundFormat, HOTFIX_SEL_EMOTES_TEXT_SOUND);
DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS);
DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO);
@@ -114,6 +121,7 @@ DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonus
DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN);
DB2Storage<LockEntry> sLockStore("Lock.db2", LockFormat, HOTFIX_SEL_LOCK);
DB2Storage<MailTemplateEntry> sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE);
+DB2Storage<MapEntry> sMapStore("Map.db2", MapFormat, HOTFIX_SEL_MAP);
DB2Storage<ModifierTreeEntry> sModifierTreeStore("ModifierTree.db2", ModifierTreeFormat, HOTFIX_SEL_MODIFIER_TREE);
DB2Storage<MountCapabilityEntry> sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY);
DB2Storage<MountEntry> sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT);
@@ -124,6 +132,7 @@ DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfa
DB2Storage<NamesReservedEntry> sNamesReservedStore("NamesReserved.db2", NamesReservedFormat, HOTFIX_SEL_NAMES_RESERVED);
DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleFormat, HOTFIX_SEL_NAMES_RESERVED_LOCALE);
DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA);
+DB2Storage<PhaseEntry> sPhaseStore("Phase.db2", PhaseFormat, HOTFIX_SEL_PHASE);
DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP);
DB2Storage<PlayerConditionEntry> sPlayerConditionStore("PlayerCondition.db2", PlayerConditionFormat, HOTFIX_SEL_PLAYER_CONDITION);
DB2Storage<PowerDisplayEntry> sPowerDisplayStore("PowerDisplay.db2", PowerDisplayFormat, HOTFIX_SEL_POWER_DISPLAY);
@@ -207,8 +216,16 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D
++DB2FilesCount;
+#define EXPECTED_DB2_BUILD 20950
+
if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale))
{
+ if (storage->GetBuild() != EXPECTED_DB2_BUILD)
+ {
+ errlist.push_back(Trinity::StringFormat("DB2 file %s is from wrong client version!", storage->GetFileName()));
+ return;
+ }
+
storage->LoadFromDB();
for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
@@ -263,6 +280,8 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sAnimKitStore);
LOAD_DB2(sArmorLocationStore);
LOAD_DB2(sAreaGroupMemberStore);
+ LOAD_DB2(sAreaTableStore);
+ LOAD_DB2(sAreaTriggerStore);
LOAD_DB2(sBankBagSlotPricesStore);
LOAD_DB2(sBattlePetBreedQualityStore);
LOAD_DB2(sBattlePetBreedStateStore);
@@ -272,6 +291,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sBattlePetSpeciesStateStore);
LOAD_DB2(sBroadcastTextStore);
LOAD_DB2(sCharStartOutfitStore);
+ LOAD_DB2(sCharTitlesStore);
LOAD_DB2(sChatChannelsStore);
LOAD_DB2(sChrClassesXPowerTypesStore);
LOAD_DB2(sChrRacesStore);
@@ -279,15 +299,19 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sCinematicSequencesStore);
LOAD_DB2(sCreatureDisplayInfoStore);
LOAD_DB2(sCreatureDisplayInfoExtraStore);
+ LOAD_DB2(sCreatureFamilyStore);
LOAD_DB2(sCreatureTypeStore);
LOAD_DB2(sCriteriaStore);
LOAD_DB2(sCriteriaTreeStore);
LOAD_DB2(sCurrencyTypesStore);
LOAD_DB2(sCurvePointStore);
LOAD_DB2(sDestructibleModelDataStore);
+ LOAD_DB2(sDifficultyStore);
+ LOAD_DB2(sDungeonEncounterStore);
LOAD_DB2(sDurabilityCostsStore);
LOAD_DB2(sDurabilityQualityStore);
LOAD_DB2(sEmotesStore);
+ LOAD_DB2(sEmotesTextStore);
LOAD_DB2(sEmotesTextSoundStore);
LOAD_DB2(sGameObjectsStore);
LOAD_DB2(sGameObjectDisplayInfoStore);
@@ -349,6 +373,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sKeyChainStore);
LOAD_DB2(sLockStore);
LOAD_DB2(sMailTemplateStore);
+ LOAD_DB2(sMapStore);
LOAD_DB2(sModifierTreeStore);
LOAD_DB2(sMountCapabilityStore);
LOAD_DB2(sMountStore);
@@ -359,6 +384,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sNamesReservedStore);
LOAD_DB2(sNamesReservedLocaleStore);
LOAD_DB2(sOverrideSpellDataStore);
+ LOAD_DB2(sPhaseStore);
LOAD_DB2(sPhaseXPhaseGroupStore);
LOAD_DB2(sPlayerConditionStore);
LOAD_DB2(sPowerDisplayStore);
@@ -460,6 +486,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
}
}
+ ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(),
+ "MAX_DIFFICULTY is not large enough to contain all difficulties! (current value %d, required %d)",
+ MAX_DIFFICULTY, sDifficultyStore.GetNumRows());
+
for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore)
_emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextId, emoteTextSound->RaceId, emoteTextSound->SexId, emoteTextSound->ClassId)] = emoteTextSound;
@@ -563,7 +593,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (PhaseXPhaseGroupEntry const* group : sPhaseXPhaseGroupStore)
if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID))
- _phasesByGroup[group->PhaseGroupID].insert(phase->ID);
+ _phasesByGroup[group->PhaseGroupID].insert(group->PhaseID);
for (PvPDifficultyEntry const* entry : sPvpDifficultyStore)
{
@@ -686,9 +716,12 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
}
// Check loaded DB2 files proper version
- if (!sGemPropertiesStore.LookupEntry(2960) || // last gem property added in 7.0.1 (20914)
+ if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810)
+ !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810)
+ !sGemPropertiesStore.LookupEntry(2960) || // last gem property added in 7.0.1 (20914)
!sItemStore.LookupEntry(136350) || // last item added in 7.0.1 (20810)
- !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810)
+ !sItemExtendedCostStore.LookupEntry(5951) || // last item extended cost added in 7.0.1 (20810)
+ !sMapStore.LookupEntry(1602) || // last map added in 7.0.1 (20810)
!sSpellStore.LookupEntry(207511)) // last spell added in 7.0.1 (20810)
{
TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client.");
@@ -813,6 +846,18 @@ char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEF
return raceEntry->Name->Str[DEFAULT_LOCALE];
}
+char const* DB2Manager::GetCreatureFamilyPetName(uint32 petfamily, uint32 locale)
+{
+ if (!petfamily)
+ return nullptr;
+
+ CreatureFamilyEntry const* petFamily = sCreatureFamilyStore.LookupEntry(petfamily);
+ if (!petFamily)
+ return nullptr;
+
+ return petFamily->Name->Str[locale][0] != '\0' ? petFamily->Name->Str[locale] : nullptr;
+}
+
EmotesTextSoundEntry const* DB2Manager::GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const
{
auto itr = _emoteTextSounds.find(EmotesTextSoundContainer::key_type(emote, race, gender, class_));
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index ded2bf01b4f..5dbd24dacf6 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -26,6 +26,8 @@
TC_GAME_API extern DB2Storage<AchievementEntry> sAchievementStore;
TC_GAME_API extern DB2Storage<AnimKitEntry> sAnimKitStore;
+TC_GAME_API extern DB2Storage<AreaTableEntry> sAreaTableStore;
+TC_GAME_API extern DB2Storage<AreaTriggerEntry> sAreaTriggerStore;
TC_GAME_API extern DB2Storage<ArmorLocationEntry> sArmorLocationStore;
TC_GAME_API extern DB2Storage<AuctionHouseEntry> sAuctionHouseStore;
TC_GAME_API extern DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore;
@@ -36,20 +38,25 @@ TC_GAME_API extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSp
TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore;
TC_GAME_API extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore;
TC_GAME_API extern DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore;
+TC_GAME_API extern DB2Storage<CharTitlesEntry> sCharTitlesStore;
TC_GAME_API extern DB2Storage<ChatChannelsEntry> sChatChannelsStore;
TC_GAME_API extern DB2Storage<ChrRacesEntry> sChrRacesStore;
TC_GAME_API extern DB2Storage<ChrSpecializationEntry> sChrSpecializationStore;
TC_GAME_API extern DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore;
TC_GAME_API extern DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore;
TC_GAME_API extern DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore;
+TC_GAME_API extern DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore;
TC_GAME_API extern DB2Storage<CreatureTypeEntry> sCreatureTypeStore;
TC_GAME_API extern DB2Storage<CriteriaEntry> sCriteriaStore;
TC_GAME_API extern DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore;
TC_GAME_API extern DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore;
TC_GAME_API extern DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore;
+TC_GAME_API extern DB2Storage<DifficultyEntry> sDifficultyStore;
+TC_GAME_API extern DB2Storage<DungeonEncounterEntry> sDungeonEncounterStore;
TC_GAME_API extern DB2Storage<DurabilityCostsEntry> sDurabilityCostsStore;
TC_GAME_API extern DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore;
TC_GAME_API extern DB2Storage<EmotesEntry> sEmotesStore;
+TC_GAME_API extern DB2Storage<EmotesTextEntry> sEmotesTextStore;
TC_GAME_API extern DB2Storage<GameObjectsEntry> sGameObjectsStore;
TC_GAME_API extern DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore;
TC_GAME_API extern DB2Storage<GameTablesEntry> sGameTablesStore;
@@ -102,10 +109,12 @@ TC_GAME_API extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOve
TC_GAME_API extern DB2Storage<ItemToBattlePetSpeciesEntry> sItemToBattlePetSpeciesStore;
TC_GAME_API extern DB2Storage<LockEntry> sLockStore;
TC_GAME_API extern DB2Storage<MailTemplateEntry> sMailTemplateStore;
+TC_GAME_API extern DB2Storage<MapEntry> sMapStore;
TC_GAME_API extern DB2Storage<ModifierTreeEntry> sModifierTreeStore;
TC_GAME_API extern DB2Storage<MountCapabilityEntry> sMountCapabilityStore;
TC_GAME_API extern DB2Storage<MovieEntry> sMovieStore;
TC_GAME_API extern DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore;
+TC_GAME_API extern DB2Storage<PhaseEntry> sPhaseStore;
TC_GAME_API extern DB2Storage<PlayerConditionEntry> sPlayerConditionStore;
TC_GAME_API extern DB2Storage<PowerDisplayEntry> sPowerDisplayStore;
TC_GAME_API extern DB2Storage<QuestFactionRewardEntry> sQuestFactionRewardStore;
@@ -229,6 +238,7 @@ public:
ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const;
uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const;
static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE);
+ static char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale);
EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const;
GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; }
uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 171d4324a62..692ae88847e 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -56,6 +56,60 @@ struct AreaGroupMemberEntry
uint16 AreaID;
};
+struct AreaTableEntry
+{
+ uint32 Flags[2];
+ char const* ZoneName;
+ float AmbientMultiplier;
+ LocalizedString* AreaName;
+ uint16 MapID;
+ uint16 ParentAreaID;
+ int16 AreaBit;
+ uint16 AmbienceID;
+ uint16 ZoneMusic;
+ uint16 IntroSound;
+ uint16 LiquidTypeID[4];
+ uint16 UWZoneMusic;
+ uint16 UWAmbience;
+ uint16 PvPCombastWorldStateID;
+ uint8 SoundProviderPref;
+ uint8 SoundProviderPrefUnderwater;
+ uint8 ExplorationLevel;
+ uint8 FactionGroupMask;
+ uint8 MountFlags;
+ uint8 UWIntroMusic;
+ uint8 WildBattlePetLevelMin;
+ uint8 WildBattlePetLevelMax;
+ uint8 WindSettingsID;
+
+ // helpers
+ bool IsSanctuary() const
+ {
+ if (MapID == 609)
+ return true;
+ return (Flags[0] & AREA_FLAG_SANCTUARY) != 0;
+ }
+};
+
+struct AreaTriggerEntry
+{
+ uint32 ID;
+ DBCPosition3D Pos;
+ float Radius;
+ float BoxLength;
+ float BoxWidth;
+ float BoxHeight;
+ float BoxYaw;
+ uint16 MapID;
+ uint16 PhaseID;
+ uint16 PhaseGroupID;
+ uint16 ShapeID;
+ uint16 AreaTriggerActionSetID;
+ uint8 PhaseUseFlags;
+ uint8 ShapeType;
+ uint8 Flag;
+};
+
struct ArmorLocationEntry
{
float Modifier[5];
@@ -148,6 +202,15 @@ struct CharStartOutfitEntry
uint8 PetFamilyID; // Pet Family Entry for starting pet
};
+struct CharTitlesEntry
+{
+ LocalizedString* NameMale;
+ LocalizedString* NameFemale;
+ uint16 ConditionID;
+ uint16 MaskID;
+ uint8 Flags;
+};
+
struct ChatChannelsEntry
{
uint32 Flags;
@@ -268,6 +331,20 @@ struct CreatureDisplayInfoExtraEntry
uint8 Flags;
};
+struct CreatureFamilyEntry
+{
+ float MinScale;
+ float MaxScale;
+ LocalizedString* Name;
+ char const* IconFile;
+ uint16 SkillLine[2];
+ uint16 PetFoodMask;
+ uint8 MinScaleLevel;
+ uint8 MaxScaleLevel;
+ uint8 PetTalentType;
+ uint8 CategoryEnumID;
+};
+
struct CreatureTypeEntry
{
LocalizedString* Name;
@@ -467,6 +544,36 @@ struct DestructibleModelDataEntry
uint8 HealEffect;
};
+struct DifficultyEntry
+{
+ uint32 ID;
+ LocalizedString* Name;
+ uint8 FallbackDifficultyID;
+ uint8 InstanceType;
+ uint8 MinPlayers;
+ uint8 MaxPlayers;
+ int8 OldEnumValue;
+ uint8 Flags;
+ uint8 ToggleDifficultyID;
+ uint8 GroupSizeHealthCurveID;
+ uint8 GroupSizeDmgCurveID;
+ uint8 GroupSizeSpellPointsCurveID;
+ uint8 ItemBonusTreeModID;
+ uint8 OrderIndex;
+};
+
+struct DungeonEncounterEntry
+{
+ LocalizedString* Name;
+ uint32 CreatureDisplayID;
+ uint16 MapID;
+ uint16 OrderIndex;
+ uint16 SpellIconID;
+ uint8 DifficultyID;
+ uint8 Bit;
+ uint8 Flags;
+};
+
struct DurabilityCostsEntry
{
uint16 WeaponSubClassCost[21];
@@ -489,6 +596,12 @@ struct EmotesEntry
uint8 EmoteSpecProcParam;
};
+struct EmotesTextEntry
+{
+ LocalizedString* Name;
+ uint16 EmoteID;
+};
+
struct EmotesTextSoundEntry
{
uint16 EmotesTextId;
@@ -1097,6 +1210,62 @@ struct MailTemplateEntry
LocalizedString* Body;
};
+struct MapEntry
+{
+ uint32 ID;
+ char* Directory;
+ uint32 Flags;
+ uint32 MapType;
+ float MinimapIconScale;
+ DBCPosition2D CorpsePos; // entrance coordinates in ghost mode (in most cases = normal entrance)
+ uint32 RaidOffset;
+ LocalizedString* MapName;
+ LocalizedString* MapDescription0; // Horde
+ LocalizedString* MapDescription1; // Alliance
+ uint16 AreaTableID;
+ uint16 LoadingScreenID;
+ int16 CorpseMapID; // map_id of entrance map in ghost mode (continent always and in most cases = normal entrance)
+ uint16 TimeOfDayOverride;
+ int16 ParentMapID;
+ int16 CosmeticParentMapID;
+ uint8 InstanceType;
+ uint8 unk5;
+ uint8 ExpansionID;
+ uint8 MaxPlayers;
+ uint8 TimeOffset;
+
+ // Helpers
+ uint8 Expansion() const { return ExpansionID; }
+
+ bool IsDungeon() const { return (InstanceType == MAP_INSTANCE || InstanceType == MAP_RAID) && !IsGarrison(); }
+ bool IsNonRaidDungeon() const { return InstanceType == MAP_INSTANCE; }
+ bool Instanceable() const { return InstanceType == MAP_INSTANCE || InstanceType == MAP_RAID || InstanceType == MAP_BATTLEGROUND || InstanceType == MAP_ARENA; }
+ bool IsRaid() const { return InstanceType == MAP_RAID; }
+ bool IsBattleground() const { return InstanceType == MAP_BATTLEGROUND; }
+ bool IsBattleArena() const { return InstanceType == MAP_ARENA; }
+ bool IsBattlegroundOrArena() const { return InstanceType == MAP_BATTLEGROUND || InstanceType == MAP_ARENA; }
+ bool IsWorldMap() const { return InstanceType == MAP_COMMON; }
+
+ bool GetEntrancePos(int32& mapid, float& x, float& y) const
+ {
+ if (CorpseMapID < 0)
+ return false;
+
+ mapid = CorpseMapID;
+ x = CorpsePos.X;
+ y = CorpsePos.Y;
+ return true;
+ }
+
+ bool IsContinent() const
+ {
+ return ID == 0 || ID == 1 || ID == 530 || ID == 571 || ID == 870 || ID == 1116;
+ }
+
+ bool IsDynamicDifficultyMap() const { return (Flags & MAP_FLAG_CAN_TOGGLE_DIFFICULTY) != 0; }
+ bool IsGarrison() const { return (Flags & MAP_FLAG_GARRISON) != 0; }
+};
+
struct ModifierTreeEntry
{
uint32 Asset[2];
@@ -1181,6 +1350,11 @@ struct OverrideSpellDataEntry
uint8 Flags;
};
+struct PhaseEntry
+{
+ uint16 Flags;
+};
+
struct PhaseXPhaseGroupEntry
{
uint16 PhaseID;
diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h
index 596a67bd35d..58ab1319b98 100644
--- a/src/server/game/DataStores/DB2fmt.h
+++ b/src/server/game/DataStores/DB2fmt.h
@@ -21,6 +21,8 @@
char const AchievementFormat[] = "nssishhhhhhhbbb";
char const AnimKitFormat[] = "dihh";
char const AreaGroupMemberFormat[] = "dhh";
+char const AreaTableFormat[] = "diiSfshhhhhhhhhhhhhbbbbbbbbb";
+char const AreaTriggerFormat[] = "nffffffffhhhhhbbb";
char const ArmorLocationFormat[] = "dfffff";
char const AuctionHouseFormat[] = "dshbb";
char const BankBagSlotPricesFormat[] = "di";
@@ -31,6 +33,7 @@ char const BattlePetSpeciesFormat[] = "niiisshbb";
char const BattlePetSpeciesStateFormat[] = "nihb";
char const BroadcastTextFormat[] = "dsshhhhhhhhbb";
char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb";
+char const CharTitlesFormat[] = "dsshhb";
char const ChatChannelsFormat[] = "dissb";
char const ChrClassesXPowerTypesFormat[] = "dbb";
char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbb";
@@ -38,15 +41,19 @@ char const ChrSpecializationFormat[] = "niiiisssShbbbbb";
char const CinematicSequencesFormat[] = "dhhhhhhhhh";
char const CreatureDisplayInfoFormat[] = "niffiiiSiiihhhhhhbbbbbb";
char const CreatureDisplayInfoExtraFormat[] = "diibbbbbbbbbbbb";
+char const CreatureFamilyFormat[] = "dffsshhhbbbb";
char const CreatureTypeFormat[] = "dsb";
char const CriteriaFormat[] = "diiihhhbbbbb";
char const CriteriaTreeFormat[] = "dishhhhb";
char const CurrencyTypesFormat[] = "nSSsiiisbbbb";
char const CurvePointFormat[] = "dffhb";
char const DestructibleModelDataFormat[] = "dhhhhhbbbbbbbbbbbbbbbbb";
+char const DifficultyFormat[] = "nsbbbbbbbbbbbb";
+char const DungeonEncounterFormat[] = "dsihhhbbb";
char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
char const DurabilityQualityFormat[] = "df";
char const EmotesFormat[] = "dSiihhbb";
+char const EmotesTextFormat[] = "dsh";
char const EmotesTextSoundFormat[] = "dhhbbb";
char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb";
char const GameObjectDisplayInfoFormat[] = "diffffffffh";
@@ -108,6 +115,7 @@ char const ItemXBonusTreeFormat[] = "dih";
char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
char const LockFormat[] = "diiiiiiiihhhhhhhhbbbbbbbbbbbbbbbb";
char const MailTemplateFormat[] = "ds";
+char const MapFormat[] = "nsiifffissshhhhhhbbbbb";
char const ModifierTreeFormat[] = "diihbbbb";
char const MountFormat[] = "niissshhhb";
char const MountCapabilityFormat[] = "niihhhbb";
@@ -118,6 +126,7 @@ char const NamesProfanityFormat[] = "dSb";
char const NamesReservedFormat[] = "dS";
char const NamesReservedLocaleFormat[] = "dSb";
char const OverrideSpellDataFormat[] = "diiiiiiiiiiib";
+char const PhaseFormat[] = "dh";
char const PhaseXPhaseGroupFormat[] = "dhh";
char const PlayerConditionFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
char const PowerDisplayFormat[] = "dSbbbb";
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 739b4ac51a0..f1f391f39ab 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -415,28 +415,30 @@ enum CriteriaTreeOperator
enum Difficulty : uint8
{
- DIFFICULTY_NONE = 0,
- DIFFICULTY_NORMAL = 1,
- DIFFICULTY_HEROIC = 2,
- DIFFICULTY_10_N = 3,
- DIFFICULTY_25_N = 4,
- DIFFICULTY_10_HC = 5,
- DIFFICULTY_25_HC = 6,
- DIFFICULTY_LFR = 7,
- DIFFICULTY_CHALLENGE = 8,
- DIFFICULTY_40 = 9,
- DIFFICULTY_HC_SCENARIO = 11,
- DIFFICULTY_N_SCENARIO = 12,
- DIFFICULTY_NORMAL_RAID = 14,
- DIFFICULTY_HEROIC_RAID = 15,
- DIFFICULTY_MYTHIC_RAID = 16,
- DIFFICULTY_LFR_NEW = 17,
- DIFFICULTY_EVENT_RAID = 18,
- DIFFICULTY_EVENT_DUNGEON = 19,
- DIFFICULTY_EVENT_SCENARIO = 20,
- DIFFICULTY_MYTHIC = 23,
- DIFFICULTY_TIMEWALKER = 24,
- DIFFICULTY_PVP_SCENARIO = 25,
+ DIFFICULTY_NONE = 0,
+ DIFFICULTY_NORMAL = 1,
+ DIFFICULTY_HEROIC = 2,
+ DIFFICULTY_10_N = 3,
+ DIFFICULTY_25_N = 4,
+ DIFFICULTY_10_HC = 5,
+ DIFFICULTY_25_HC = 6,
+ DIFFICULTY_LFR = 7,
+ DIFFICULTY_CHALLENGE = 8,
+ DIFFICULTY_40 = 9,
+ DIFFICULTY_3_MAN_SCENARIO_HC = 11,
+ DIFFICULTY_3_MAN_SCENARIO_N = 12,
+ DIFFICULTY_NORMAL_RAID = 14,
+ DIFFICULTY_HEROIC_RAID = 15,
+ DIFFICULTY_MYTHIC_RAID = 16,
+ DIFFICULTY_LFR_NEW = 17,
+ DIFFICULTY_EVENT_RAID = 18,
+ DIFFICULTY_EVENT_DUNGEON = 19,
+ DIFFICULTY_EVENT_SCENARIO = 20,
+ DIFFICULTY_MYTHIC = 23,
+ DIFFICULTY_TIMEWALKER = 24,
+ DIFFICULTY_PVP_SCENARIO = 25,
+ DIFFICULTY_5_MAN_SCENARIO_N = 26,
+ DIFFICULTY_20_MAN_SCENARIO_N = 27,
MAX_DIFFICULTY
};
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index 04313191799..03e1c365bc7 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -46,24 +46,14 @@ typedef std::multimap<uint32, CharSectionsEntry const*> CharSectionsMap;
typedef std::map<uint32, std::vector<uint32>> FactionTeamMap;
typedef std::map<WMOAreaTableTripple, WMOAreaTableEntry const*> WMOAreaInfoByTripple;
-DBCStorage<AreaTableEntry> sAreaTableStore(AreaTablefmt);
-DBCStorage<AreaTriggerEntry> sAreaTriggerStore(AreaTriggerfmt);
-
DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore(BannedAddOnsfmt);
DBCStorage<BattlemasterListEntry> sBattlemasterListStore(BattlemasterListfmt);
DBCStorage<CharSectionsEntry> sCharSectionsStore(CharSectionsfmt);
CharSectionsMap sCharSectionMap;
-DBCStorage<CharTitlesEntry> sCharTitlesStore(CharTitlesfmt);
DBCStorage<ChrClassesEntry> sChrClassesStore(ChrClassesfmt);
-DBCStorage<CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt);
DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt);
-DBCStorage<DifficultyEntry> sDifficultyStore(DifficultyFmt);
-DBCStorage<DungeonEncounterEntry> sDungeonEncounterStore(DungeonEncounterfmt);
-
-DBCStorage<EmotesTextEntry> sEmotesTextStore(EmotesTextfmt);
-
DBCStorage<FactionEntry> sFactionStore(Factionfmt);
static FactionTeamMap sFactionTeamMap;
DBCStorage<FactionTemplateEntry> sFactionTemplateStore(FactionTemplatefmt);
@@ -72,12 +62,9 @@ DBCStorage<LFGDungeonEntry> sLFGDungeonStore(LFGDungeonfmt);
DBCStorage<LightEntry> sLightStore(Lightfmt);
DBCStorage<LiquidTypeEntry> sLiquidTypeStore(LiquidTypefmt);
-DBCStorage<MapEntry> sMapStore(Mapfmt);
DBCStorage<MapDifficultyEntry> sMapDifficultyStore(MapDifficultyfmt); // only for loading
MapDifficultyMap sMapDifficultyMap;
-DBCStorage<PhaseEntry> sPhaseStore(Phasefmt);
-
DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt);
DBCStorage<TalentEntry> sTalentStore(Talentfmt);
@@ -224,26 +211,17 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale)
#define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file, defaultLocale)
- LOAD_DBC(sAreaTableStore, "AreaTable.dbc");//20810
- LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20810
LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20810
LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20810
LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20810
- LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20810
LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20810
- LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20810
LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20810
- LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20810
- LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20810
- LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20810
LOAD_DBC(sFactionStore, "Faction.dbc");//20810
LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20810
LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20810
LOAD_DBC(sLightStore, "Light.dbc"); //20810
LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20810
LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20810
- LOAD_DBC(sMapStore, "Map.dbc");//20810
- LOAD_DBC(sPhaseStore, "Phase.dbc");//20810
LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20810
LOAD_DBC(sTalentStore, "Talent.dbc");//20810
LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20810
@@ -258,28 +236,11 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale)
if (entry->Race && ((1 << (entry->Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0) //ignore Nonplayable races
sCharSectionMap.insert({ entry->GenType | (entry->Gender << 8) | (entry->Race << 16), entry });
- uint32 storageIndex = chrSpec->ClassID;
- if (chrSpec->Flags & CHR_SPECIALIZATION_FLAG_PET_OVERRIDE_SPEC)
- {
- ASSERT(!chrSpec->ClassID);
- storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX;
- }
-
- sChrSpecializationByIndexStore[storageIndex][chrSpec->OrderIndex] = chrSpec;
- }
-
- ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(),
- "MAX_DIFFICULTY is not large enough to contain all difficulties! (current value %d, required %d)",
- MAX_DIFFICULTY, sDifficultyStore.GetNumRows());
-
for (uint32 i = 0; i < sFactionStore.GetNumRows(); ++i)
{
FactionEntry const* faction = sFactionStore.LookupEntry(i);
if (faction && faction->ParentFactionID)
- {
- std::vector<uint32> &flist = sFactionTeamMap[faction->ParentFactionID];
- flist.push_back(i);
- }
+ sFactionTeamMap[faction->ParentFactionID].push_back(i);
}
// fill data
@@ -320,15 +281,6 @@ void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale)
exit(1);
}
- // Check loaded DBC files proper version
- if (!sAreaTableStore.LookupEntry(6719) || // last area (areaflag) added in 7.0.1 (20810)
- !sCharTitlesStore.LookupEntry(469) || // last char title added in 7.0.1 (20810)
- !sMapStore.LookupEntry(1602) ) // last map added in 7.0.1 (20810)
- {
- TC_LOG_ERROR("misc", "You have _outdated_ DBC files. Please extract correct versions from current using client.");
- exit(1);
- }
-
TC_LOG_INFO("server.loading", ">> Initialized %d DBC data stores in %u ms", DBCFileCount, GetMSTimeDiffToNow(oldMSTime));
}
@@ -401,18 +353,6 @@ std::vector<uint32> const* GetFactionTeamList(uint32 faction)
return NULL;
}
-char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 /*locale*/)
-{
- if (!petfamily)
- return nullptr;
-
- CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(petfamily);
- if (!pet_family)
- return nullptr;
-
- return pet_family->Name_lang ? pet_family->Name_lang : NULL;
-}
-
WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid)
{
WMOAreaInfoByTripple::iterator i = sWMOAreaInfoByTripple.find(WMOAreaTableTripple(rootid, adtid, groupid));
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index b55c9573421..ef8056a06fc 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -30,9 +30,6 @@ TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSection
// ChrClasses
TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale);
-// CreatureFamilty
-TC_GAME_API char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale);
-
// Faction
TC_GAME_API std::vector<uint32> const* GetFactionTeamList(uint32 faction);
@@ -93,25 +90,16 @@ private:
GameTablesEntry const* _gtEntry;
};
-TC_GAME_API extern DBCStorage<AreaTableEntry> sAreaTableStore;
-TC_GAME_API extern DBCStorage<AreaTriggerEntry> sAreaTriggerStore;
TC_GAME_API extern DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore;
TC_GAME_API extern DBCStorage<BattlemasterListEntry> sBattlemasterListStore;
TC_GAME_API extern DBCStorage<CharSectionsEntry> sCharSectionsStore;
-TC_GAME_API extern DBCStorage<CharTitlesEntry> sCharTitlesStore;
TC_GAME_API extern DBCStorage<ChrClassesEntry> sChrClassesStore;
-TC_GAME_API extern DBCStorage<CreatureFamilyEntry> sCreatureFamilyStore;
TC_GAME_API extern DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore;
-TC_GAME_API extern DBCStorage<DifficultyEntry> sDifficultyStore;
-TC_GAME_API extern DBCStorage<DungeonEncounterEntry> sDungeonEncounterStore;
-TC_GAME_API extern DBCStorage<EmotesTextEntry> sEmotesTextStore;
TC_GAME_API extern DBCStorage<FactionEntry> sFactionStore;
TC_GAME_API extern DBCStorage<FactionTemplateEntry> sFactionTemplateStore;
TC_GAME_API extern DBCStorage<LFGDungeonEntry> sLFGDungeonStore;
TC_GAME_API extern DBCStorage<LiquidTypeEntry> sLiquidTypeStore;
-TC_GAME_API extern DBCStorage<MapEntry> sMapStore;
TC_GAME_API extern MapDifficultyMap sMapDifficultyMap;
-TC_GAME_API extern DBCStorage<PhaseEntry> sPhaseStore;
TC_GAME_API extern DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore;
TC_GAME_API extern DBCStorage<TalentEntry> sTalentStore;
TC_GAME_API extern TalentsByPosition sTalentByPos;
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 8dcb1a687a4..d831231cb88 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -26,61 +26,6 @@
// Structures using to access raw DBC data and required packing to portability
#pragma pack(push, 1)
-struct AreaTableEntry
-{
- uint32 ID; // 0
- uint32 MapID; // 1
- uint32 ParentAreaID; // 2 if 0 then it's zone, else it's zone id of this area
- int32 AreaBit; // 3
- uint32 Flags[2]; // 4-5,
- //uint32 SoundProviderPref; // 6,
- //uint32 SoundProviderPrefUnderwater; // 7,
- //uint32 AmbienceID; // 8,
- //uint32 ZoneMusic; // 9,
- //char* ZoneName; // 10 - Internal name
- //uint32 IntroSound; // 11
- uint32 ExplorationLevel; // 12
- char* AreaName_lang; // 13 - In-game name
- uint32 FactionGroupMask; // 14
- uint32 LiquidTypeID[4]; // 15-18
- //float AmbientMultiplier; // 19
- //uint32 MountFlags; // 20
- //uint32 UWIntroMusic; // 21
- //uint32 UWZoneMusic; // 22
- //uint32 UWAmbience; // 23
- //uint32 PvPCombastWorldStateID; // 25
- //uint32 WildBattlePetLevelMin; // 26
- //uint32 WildBattlePetLevelMax; // 27
- //uint32 WindSettingsID; // 28
-
- // helpers
- bool IsSanctuary() const
- {
- if (MapID == 609)
- return true;
- return (Flags[0] & AREA_FLAG_SANCTUARY) != 0;
- }
-};
-
-struct AreaTriggerEntry
-{
- uint32 ID; // 0
- uint32 MapID; // 1
- DBCPosition3D Pos; // 2-4
- //uint32 PhaseUseFlags // 5
- //uint32 PhaseID // 6
- //uint32 PhaseGroupID // 7
- float Radius; // 8
- float BoxLength; // 9
- float BoxWidth; // 10
- float BoxHeight; // 11
- float BoxYaw; // 12
- //uint32 ShapeType // 13
- //uint32 ShapeID // 14
- //uint32 AreaTriggerActionSetID // 15
- //uint32 Flags // 16
-};
-
struct BannedAddOnsEntry
{
uint32 ID; // 0
@@ -141,16 +86,6 @@ struct CharSectionsEntry
uint32 Color;
};
-struct CharTitlesEntry
-{
- uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId()
- //uint32 ConditionID; // 1
- char* NameMale_lang; // 2 m_name_lang
- char* NameFemale_lang; // 3 m_name1_lang
- uint32 MaskID; // 4 m_mask_ID used in PLAYER_CHOSEN_TITLE and 1<<index in PLAYER__FIELD_KNOWN_TITLES
- //uint32 Flags; // 5
-};
-
struct ChrClassesEntry
{
uint32 ID; // 0
@@ -174,21 +109,6 @@ struct ChrClassesEntry
//uint32 Unk1; // 18
};
-struct CreatureFamilyEntry
-{
- uint32 ID; // 0
- float MinScale; // 1
- uint32 MinScaleLevel; // 2
- float MaxScale; // 3
- uint32 MaxScaleLevel; // 4
- uint32 SkillLine[2]; // 5-6
- uint32 PetFoodMask; // 7
- uint32 PetTalentType; // 8
- //uint32 CategoryEnumID; // 9
- char* Name_lang; // 10
- //char* IconFile; // 11
-};
-
struct CreatureModelDataEntry
{
uint32 ID; // 0
@@ -235,45 +155,6 @@ struct CurrencyCategoryEntry
};
*/
-struct DifficultyEntry
-{
- uint32 ID; // 0
- uint32 FallbackDifficultyID; // 1
- uint32 InstanceType; // 2
- uint32 MinPlayers; // 3
- uint32 MaxPlayers; // 4
- //int32 OldEnumValue; // 5
- uint32 Flags; // 6
- uint32 ToggleDifficultyID; // 7
- //uint32 GroupSizeHealthCurveID; // 8
- //uint32 GroupSizeDmgCurveID; // 9
- //uint32 GroupSizeSpellPointsCurveID; // 10
- //char const* NameLang; // 11
- uint32 ItemBonusTreeModID; // 12
- //uint32 OrderIndex; // 13
-};
-
-struct DungeonEncounterEntry
-{
- uint32 ID; // 0
- uint32 MapID; // 1
- uint32 DifficultyID; // 2
- uint32 OrderIndex; // 3
- //uint32 Bit; // 4
- char* Name_lang; // 5
- //uint32 CreatureDisplayID; // 6
- //uint32 Flags; // 7
- //uint32 Unk; // 8 Flags2?
-};
-
-struct EmotesTextEntry
-{
- uint32 ID; // 0
- //char* Name_lang; // 1
- uint32 EmoteID; // 2
- //uint32 EmoteText[16]; // 3-18
-};
-
struct FactionEntry
{
uint32 ID; // 0
@@ -546,67 +427,6 @@ struct LiquidTypeEntry
//uint32 Int[4]; // 47-50
};
-struct PhaseEntry
-{
- uint32 ID; // 0
- uint32 Flags; // 1
-};
-
-struct MapEntry
-{
- uint32 ID; // 0
- //char* Directory; // 1
- uint32 InstanceType; // 2
- uint32 Flags; // 3
- //uint32 MapType; // 4
- //uint32 unk5; // 5
- char* MapName_lang; // 6
- uint32 AreaTableID; // 7
- //char* MapDescription0_lang; // 8 Horde
- //char* MapDescription1_lang; // 9 Alliance
- uint32 LoadingScreenID; // 10 LoadingScreens.dbc
- //float MinimapIconScale; // 11
- int32 CorpseMapID; // 12 map_id of entrance map in ghost mode (continent always and in most cases = normal entrance)
- DBCPosition2D CorpsePos; // 13 entrance coordinates in ghost mode (in most cases = normal entrance)
- //uint32 TimeOfDayOverride; // 15
- uint32 ExpansionID; // 16
- uint32 RaidOffset; // 17
- uint32 MaxPlayers; // 18
- int32 ParentMapID; // 19 related to phasing
- int32 CosmeticParentMapID; // 20
- //uint32 TimeOffset // 21
-
- // Helpers
- uint32 Expansion() const { return ExpansionID; }
-
- bool IsDungeon() const { return (InstanceType == MAP_INSTANCE || InstanceType == MAP_RAID) && !IsGarrison(); }
- bool IsNonRaidDungeon() const { return InstanceType == MAP_INSTANCE; }
- bool Instanceable() const { return InstanceType == MAP_INSTANCE || InstanceType == MAP_RAID || InstanceType == MAP_BATTLEGROUND || InstanceType == MAP_ARENA; }
- bool IsRaid() const { return InstanceType == MAP_RAID; }
- bool IsBattleground() const { return InstanceType == MAP_BATTLEGROUND; }
- bool IsBattleArena() const { return InstanceType == MAP_ARENA; }
- bool IsBattlegroundOrArena() const { return InstanceType == MAP_BATTLEGROUND || InstanceType == MAP_ARENA; }
- bool IsWorldMap() const { return InstanceType == MAP_COMMON; }
-
- bool GetEntrancePos(int32 &mapid, float &x, float &y) const
- {
- if (CorpseMapID < 0)
- return false;
- mapid = CorpseMapID;
- x = CorpsePos.X;
- y = CorpsePos.Y;
- return true;
- }
-
- bool IsContinent() const
- {
- return ID == 0 || ID == 1 || ID == 530 || ID == 571 || ID == 870 || ID == 1116;
- }
-
- bool IsDynamicDifficultyMap() const { return (Flags & MAP_FLAG_CAN_TOGGLE_DIFFICULTY) != 0; }
- bool IsGarrison() const { return (Flags & MAP_FLAG_GARRISON) != 0; }
-};
-
struct MapDifficultyEntry
{
//uint32 ID; // 0
@@ -621,14 +441,6 @@ struct MapDifficultyEntry
bool HasMessage() const { return Message_lang[0] != '\0'; }
};
-struct MinorTalentEntry
-{
- uint32 ID; // 0
- uint32 SpecID; // 1
- uint32 SpellID; // 2
- uint32 OrderIndex; // 3
-};
-
#define MAX_ITEM_ENCHANTMENT_EFFECTS 3
struct SpellItemEnchantmentEntry
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index b20b55d709f..8b2e729a2be 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -22,28 +22,18 @@
// x - skip<uint32>, X - skip<uint8>, s - char*, f - float, i - uint32, b - uint8, d - index (not included)
// n - index (included), l - uint64, p - field present in sql dbc, a - field absent in sql dbc
-char const AreaTablefmt[] = "niiiiixxxxxxisiiiiixxxxxxxxx";
-char const AreaTriggerfmt[] = "nifffxxxfffffxxxx";
char const BannedAddOnsfmt[] = "nxxxxxxxxxx";
char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx";
char const CharSectionsfmt[] = "diiixxxiii";
-char const CharTitlesfmt[] = "nxssix";
char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx";
-char const CreatureFamilyfmt[] = "nfifiiiiixsx";
char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx";
-char const DifficultyFmt[] = "niiiixiixxxxix";
-char const DungeonEncounterfmt[] = "niiixsxxx";
-char const EmotesTextfmt[] = "nxixxxxxxxxxxxxxxxx";
char const EmotesTextSoundEntryfmt[] = "niiii";
char const Factionfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx";
char const FactionTemplatefmt[] = "niiiiiiiiiiiii";
char const LFGDungeonfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx";
char const Lightfmt[] = "nifffxxxxxxxxxx";
char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
-char const Mapfmt[] = "nxiixxsixxixiffxiiiiix";
char const MapDifficultyfmt[] = "diisiiii";
-char const MinorTalentfmt[] = "niii";
-char const Phasefmt[] = "ni";
char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiifffxxx";
char const Talentfmt[] = "niiiiiiiiix";
char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii";
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 6e723a29191..d80c2eabe3b 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -181,12 +181,12 @@ struct TC_GAME_API CreatureTemplate
case DIFFICULTY_NORMAL:
case DIFFICULTY_10_N:
case DIFFICULTY_40:
- case DIFFICULTY_N_SCENARIO:
+ case DIFFICULTY_3_MAN_SCENARIO_N:
case DIFFICULTY_NORMAL_RAID:
return -1;
case DIFFICULTY_HEROIC:
case DIFFICULTY_25_N:
- case DIFFICULTY_HC_SCENARIO:
+ case DIFFICULTY_3_MAN_SCENARIO_HC:
case DIFFICULTY_HEROIC_RAID:
return 0;
case DIFFICULTY_10_HC:
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index deefff1423b..a3ca26c99c5 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -753,7 +753,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
SetDisplayId(creature->GetDisplayId());
if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family))
- SetName(cFamily->Name_lang);
+ SetName(cFamily->Name->Str[GetOwner()->GetSession()->GetSessionDbcLocale()]);
else
SetName(creature->GetNameForLocaleIdx(sObjectMgr->GetDBCLocaleIndex()));
@@ -766,7 +766,7 @@ bool Pet::CreateBaseAtCreatureInfo(CreatureTemplate const* cinfo, Unit* owner)
return false;
if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family))
- SetName(cFamily->Name_lang);
+ SetName(cFamily->Name->Str[GetOwner()->GetSession()->GetSessionDbcLocale()]);
Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation());
@@ -1828,7 +1828,7 @@ void Pet::LearnPetPassives()
if (!cFamily)
return;
- PetFamilySpellsStore::const_iterator petStore = sPetFamilySpellsStore.find(cFamily->ID);
+ PetFamilySpellsStore::const_iterator petStore = sPetFamilySpellsStore.find(cInfo->family);
if (petStore != sPetFamilySpellsStore.end())
{
// For general hunter pets skill 270
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 04d7c07aa3d..303ef5d4c5d 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -4727,7 +4727,7 @@ void Player::UpdateLocalChannels(uint32 newZone)
if (channel->Flags & CHANNEL_DBC_FLAG_CITY_ONLY)
currentNameExt = sObjectMgr->GetTrinityStringForDBCLocale(LANG_CHANNEL_CITY);
else
- currentNameExt = current_zone->AreaName_lang;
+ currentNameExt = current_zone->AreaName->Str[GetSession()->GetSessionDbcLocale()];
snprintf(new_channel_name_buf, 100, channel->Name->Str[m_session->GetSessionDbcLocale()], currentNameExt);
@@ -6906,9 +6906,9 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
if (sWorld->getBoolConfig(CONFIG_WEATHER) && !HasAuraType(SPELL_AURA_FORCE_WEATHER))
{
- if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
+ if (Weather* weather = WeatherMgr::FindWeather(newZone))
weather->SendWeatherUpdateToPlayer(this);
- else if (!WeatherMgr::AddWeather(zone->ID))
+ else if (!WeatherMgr::AddWeather(newZone))
// send fine weather packet to remove old zone's weather
WeatherMgr::SendFineWeatherUpdateToPlayer(this);
}
@@ -18060,7 +18060,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result)
bool deleteInstance = false;
MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
- std::string mapname = mapEntry ? mapEntry->MapName_lang : "Unknown";
+ std::string mapname = mapEntry ? mapEntry->MapName->Str[sWorld->GetDefaultDbcLocale()] : "Unknown";
if (!mapEntry || !mapEntry->IsDungeon())
{
@@ -25792,9 +25792,9 @@ std::string Player::GetMapAreaAndZoneString() const
std::string zoneName = "Unknown";
if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId))
{
- areaName = area->AreaName_lang;
+ areaName = area->AreaName->Str[GetSession()->GetSessionDbcLocale()];
if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID))
- zoneName = zone->AreaName_lang;
+ zoneName = zone->AreaName->Str[GetSession()->GetSessionDbcLocale()];
}
std::ostringstream str;
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp
index 33bf14d4c15..7ba412f5a69 100644
--- a/src/server/game/Garrison/Garrison.cpp
+++ b/src/server/game/Garrison/Garrison.cpp
@@ -224,8 +224,8 @@ bool Garrison::Create(uint32 garrSiteId)
if (siteLevelItr == sGarrSiteLevelStore.end())
return false;
- _siteLevelId = siteLevelItr.Key();
- _siteLevel = siteLevelItr.Value();
+ _siteLevelId = siteLevelItr.ID();
+ _siteLevel = siteLevelItr.Data();
InitializePlots();
diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp
index e2cba691910..c07d9a82c45 100644
--- a/src/server/game/Garrison/GarrisonMgr.cpp
+++ b/src/server/game/Garrison/GarrisonMgr.cpp
@@ -33,7 +33,7 @@ GarrisonMgr& GarrisonMgr::Instance()
void GarrisonMgr::Initialize()
{
for (auto itr = sGarrSiteLevelPlotInstStore.begin(); itr != sGarrSiteLevelPlotInstStore.end(); ++itr)
- _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.Key(), itr.Value()));
+ _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.ID(), itr.Data()));
for (GameObjectsEntry const* gameObject : sGameObjectsStore)
if (gameObject->Type == GAMEOBJECT_TYPE_GARRISON_PLOT)
@@ -46,7 +46,7 @@ void GarrisonMgr::Initialize()
_garrisonBuildingPlotInstances[MAKE_PAIR64(buildingPlotInst->GarrBuildingID, buildingPlotInst->GarrSiteLevelPlotInstID)] = buildingPlotInst->ID;
for (auto itr = sGarrBuildingStore.begin(); itr != sGarrBuildingStore.end(); ++itr)
- _garrisonBuildingsByType[itr->Type].push_back(itr.Key());
+ _garrisonBuildingsByType[itr->Type].push_back(itr.ID());
for (GarrFollowerXAbilityEntry const* followerAbility : sGarrFollowerXAbilityStore)
{
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index c52622bd966..aec1bba1e65 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -1857,8 +1857,7 @@ void ObjectMgr::LoadCreatures()
if (data.phaseid)
{
- PhaseEntry const* phase = sPhaseStore.LookupEntry(data.phaseid);
- if (!phase)
+ if (!sPhaseStore.LookupEntry(data.phaseid))
{
TC_LOG_ERROR("sql.sql", "Table `creature` have creature (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, data.id, data.phaseid);
data.phaseid = 0;
@@ -2144,8 +2143,7 @@ void ObjectMgr::LoadGameobjects()
if (data.phaseid)
{
- PhaseEntry const* phase = sPhaseStore.LookupEntry(data.phaseid);
- if (!phase)
+ if (!sPhaseStore.LookupEntry(data.phaseid))
{
TC_LOG_ERROR("sql.sql", "Table `gameobject` have gameobject (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, data.id, data.phaseid);
data.phaseid = 0;
@@ -2626,13 +2624,13 @@ void ObjectMgr::LoadItemTemplates()
for (auto itr = sItemSparseStore.begin(); itr != sItemSparseStore.end(); ++itr)
{
- ItemSparseEntry const* sparse = itr->second;
- ItemEntry const* db2Data = sItemStore.LookupEntry(itr->first);
+ ItemSparseEntry const* sparse = itr.Data();
+ ItemEntry const* db2Data = sItemStore.LookupEntry(itr.ID());
if (!db2Data)
continue;
- ItemTemplate& itemTemplate = _itemTemplateStore[itr->first];
- itemTemplate.Id = itr->first;
+ ItemTemplate& itemTemplate = _itemTemplateStore[itr.ID()];
+ itemTemplate.Id = itr.ID();
itemTemplate.BasicData = db2Data;
itemTemplate.ExtendedData = sparse;
@@ -5284,7 +5282,7 @@ void ObjectMgr::LoadInstanceEncounters()
}
uint32 count = 0;
- std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
+ std::map<uint32, std::pair<uint32, DungeonEncounterEntry const*>> dungeonLastBosses;
do
{
Field* fields = result->Fetch();
@@ -5301,20 +5299,22 @@ void ObjectMgr::LoadInstanceEncounters()
if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon))
{
- TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter %u (%s) marked as final for invalid dungeon id %u, skipped!", entry, dungeonEncounter->Name_lang, lastEncounterDungeon);
+ TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter %u (%s) marked as final for invalid dungeon id %u, skipped!",
+ entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()], lastEncounterDungeon);
continue;
}
- std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
+ std::map<uint32, std::pair<uint32, DungeonEncounterEntry const*>>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
if (lastEncounterDungeon)
{
if (itr != dungeonLastBosses.end())
{
- TC_LOG_ERROR("sql.sql", "Table `instance_encounters` specified encounter %u (%s) as last encounter but %u (%s) is already marked as one, skipped!", entry, dungeonEncounter->Name_lang, itr->second->ID, itr->second->Name_lang);
+ TC_LOG_ERROR("sql.sql", "Table `instance_encounters` specified encounter %u (%s) as last encounter but %u (%s) is already marked as one, skipped!",
+ entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()], itr->second.first, itr->second.second->Name->Str[sWorld->GetDefaultDbcLocale()]);
continue;
}
- dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
+ dungeonLastBosses[lastEncounterDungeon] = std::make_pair(entry, dungeonEncounter);
}
switch (creditType)
@@ -5324,7 +5324,8 @@ void ObjectMgr::LoadInstanceEncounters()
CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry);
if (!creatureInfo)
{
- TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry %u) linked to the encounter %u (%s), skipped!", creditEntry, entry, dungeonEncounter->Name_lang);
+ TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry %u) linked to the encounter %u (%s), skipped!",
+ creditEntry, entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()]);
continue;
}
const_cast<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS;
@@ -5333,12 +5334,14 @@ void ObjectMgr::LoadInstanceEncounters()
case ENCOUNTER_CREDIT_CAST_SPELL:
if (!sSpellMgr->GetSpellInfo(creditEntry))
{
- TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry %u) linked to the encounter %u (%s), skipped!", creditEntry, entry, dungeonEncounter->Name_lang);
+ TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry %u) linked to the encounter %u (%s), skipped!",
+ creditEntry, entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()]);
continue;
}
break;
default:
- TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type (%u) for encounter %u (%s), skipped!", creditType, entry, dungeonEncounter->Name_lang);
+ TC_LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type (%u) for encounter %u (%s), skipped!",
+ creditType, entry, dungeonEncounter->Name->Str[sWorld->GetDefaultDbcLocale()]);
continue;
}
@@ -6894,7 +6897,7 @@ std::string ObjectMgr::GeneratePetName(uint32 entry)
if (!cinfo)
return std::string();
- char const* petname = GetCreatureFamilyPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
+ char const* petname = DB2Manager::GetCreatureFamilyPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
if (petname)
return std::string(petname);
else
@@ -9025,8 +9028,7 @@ void ObjectMgr::LoadTerrainPhaseInfo()
uint32 phaseId = fields[0].GetUInt32();
- PhaseEntry const* phase = sPhaseStore.LookupEntry(phaseId);
- if (!phase)
+ if (!sPhaseStore.LookupEntry(phaseId))
{
TC_LOG_ERROR("sql.sql", "Phase %u defined in `terrain_phase_info` does not exist, skipped.", phaseId);
continue;
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index a43ec6c2202..a2634390cbc 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -199,7 +199,7 @@ void WorldSession::HandleWhoOpcode(WorldPackets::Who::WhoRequestPkt& whoRequest)
{
std::string aName;
if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(target->GetZoneId()))
- aName = areaEntry->AreaName_lang;
+ aName = areaEntry->AreaName->Str[GetSessionDbcLocale()];
bool show = false;
for (size_t i = 0; i < wWords.size(); ++i)
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index dc008aa881e..a8d347a57a7 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -677,11 +677,12 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi
DungeonEncounter const* encounter = *itr;
if (encounter->creditType == type && encounter->creditEntry == creditEntry)
{
- completedEncounters |= 1 << encounter->dbcEntry->OrderIndex;
+ completedEncounters |= 1 << encounter->dbcEntry->Bit;
if (encounter->lastEncounterDungeon)
{
dungeonId = encounter->lastEncounterDungeon;
- TC_LOG_DEBUG("lfg", "UpdateEncounterState: Instance %s (instanceId %u) completed encounter %s. Credit Dungeon: %u", instance->GetMapName(), instance->GetInstanceId(), encounter->dbcEntry->Name_lang, dungeonId);
+ TC_LOG_DEBUG("lfg", "UpdateEncounterState: Instance %s (instanceId %u) completed encounter %s. Credit Dungeon: %u",
+ instance->GetMapName(), instance->GetInstanceId(), encounter->dbcEntry->Name->Str[sWorld->GetDefaultDbcLocale()], dungeonId);
break;
}
}
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index be4f71e8b71..2452c8f913e 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -1586,10 +1586,9 @@ void LoadLootTemplates_Fishing()
uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(lootIdSet);
// remove real entries and check existence loot
- for (uint32 i = 1; i < sAreaTableStore.GetNumRows(); ++i)
- if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i))
- if (lootIdSet.find(areaEntry->ID) != lootIdSet.end())
- lootIdSet.erase(areaEntry->ID);
+ for (auto itr = sAreaTableStore.begin(); itr != sAreaTableStore.end(); ++itr)
+ if (lootIdSet.find(itr.ID()) != lootIdSet.end())
+ lootIdSet.erase(itr.ID());
// output error for any still listed (not referenced from appropriate table) ids
LootTemplates_Fishing.ReportUnusedIds(lootIdSet);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 2389d8e0fc1..cce2671b69b 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2438,20 +2438,20 @@ uint32 Map::GetAreaId(float x, float y, float z, bool *isOutdoors) const
WMOAreaTableEntry const* wmoEntry = nullptr;
AreaTableEntry const* atEntry = nullptr;
bool haveAreaInfo = false;
+ uint32 areaId = 0;
if (GetAreaInfo(x, y, z, mogpFlags, adtId, rootId, groupId))
{
haveAreaInfo = true;
wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId);
if (wmoEntry)
+ {
+ areaId = wmoEntry->AreaTableID;
atEntry = sAreaTableStore.LookupEntry(wmoEntry->AreaTableID);
+ }
}
- uint32 areaId = 0;
-
- if (atEntry)
- areaId = atEntry->ID;
- else
+ if (!areaId)
{
if (GridMap* gmap = const_cast<Map*>(this)->GetGrid(x, y))
areaId = gmap->getArea(x, y);
@@ -2651,7 +2651,7 @@ bool Map::CheckGridIntegrity(Creature* c, bool moved) const
char const* Map::GetMapName() const
{
- return i_mapEntry ? i_mapEntry->MapName_lang : "UNNAMEDMAP\x0";
+ return i_mapEntry ? i_mapEntry->MapName->Str[sWorld->GetDefaultDbcLocale()] : "UNNAMEDMAP\x0";
}
void Map::UpdateObjectVisibility(WorldObject* obj, Cell cell, CellCoord cellpair)
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index 3acd04543ad..5a31bb822b4 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -148,7 +148,7 @@ Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool
if (player->IsGameMaster())
return Map::CAN_ENTER;
- char const* mapName = entry->MapName_lang;
+ char const* mapName = entry->MapName->Str[sWorld->GetDefaultDbcLocale()];
Group* group = player->GetGroup();
if (entry->IsRaid()) // can only enter in a raid group
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index d5f3c0c5d77..ebf82122e00 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2386,7 +2386,7 @@ void SpellMgr::LoadPetLevelupSpellMap()
if (!spell->SpellLevel)
continue;
- PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[creatureFamily->ID];
+ PetLevelupSpellSet& spellSet = mPetLevelupSpellMap[i];
if (spellSet.empty())
++family_count;
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp
index 6f59e6e40da..f9aca4b607b 100644
--- a/src/server/scripts/Commands/cs_character.cpp
+++ b/src/server/scripts/Commands/cs_character.cpp
@@ -270,7 +270,7 @@ public:
if (titleInfo && target->HasTitle(titleInfo))
{
- std::string name = target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang;
+ std::string name = (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()];
if (name.empty())
continue;
diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index 081280532fb..dd048ce3c57 100644
--- a/src/server/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
@@ -504,12 +504,12 @@ public:
if (map->Instanceable())
{
- handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->AreaName_lang, map->GetId(), map->GetMapName());
+ handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaId, areaEntry->AreaName->Str[handler->GetSessionDbcLocale()], map->GetId(), map->GetMapName());
handler->SetSentErrorMessage(true);
return false;
}
- Zone2MapCoordinates(x, y, zoneEntry->ID);
+ Zone2MapCoordinates(x, y, areaEntry->ParentAreaID ? uint32(areaEntry->ParentAreaID) : areaId);
if (!MapManager::IsValidMapCoord(zoneEntry->MapID, x, y))
{
diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp
index 33356409f17..47588000173 100644
--- a/src/server/scripts/Commands/cs_group.cpp
+++ b/src/server/scripts/Commands/cs_group.cpp
@@ -352,7 +352,7 @@ public:
{
AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID);
if (zone)
- zoneName = zone->AreaName_lang;
+ zoneName = zone->AreaName->Str[handler->GetSessionDbcLocale()];
}
}
else
diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp
index 4ff0d1a70a9..2b3752c00be 100644
--- a/src/server/scripts/Commands/cs_lookup.cpp
+++ b/src/server/scripts/Commands/cs_lookup.cpp
@@ -102,30 +102,48 @@ public:
AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i);
if (areaEntry)
{
- std::string name = areaEntry->AreaName_lang;
+ int32 locale = handler->GetSessionDbcLocale();
+ std::string name = areaEntry->AreaName->Str[locale];
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- continue;
-
- if (maxResults && count++ == maxResults)
{
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
+ locale = 0;
+ for (; locale < TOTAL_LOCALES; ++locale)
+ {
+ if (locale == handler->GetSessionDbcLocale())
+ continue;
+
+ name = areaEntry->AreaName->Str[locale];
+ if (name.empty())
+ continue;
+
+ if (Utf8FitTo(name, wNamePart))
+ break;
+ }
}
- // send area in "id - [name]" format
- std::ostringstream ss;
- if (handler->GetSession())
- ss << i << " - |cffffffff|Harea:" << i << "|h[" << name<< "]|h|r";
- else
- ss << i << " - " << name;
+ if (locale < TOTAL_LOCALES)
+ {
+ if (maxResults && count++ == maxResults)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- handler->SendSysMessage(ss.str().c_str());
+ // send area in "id - [name]" format
+ std::ostringstream ss;
+ if (handler->GetSession())
+ ss << i << " - |cffffffff|Harea:" << i << "|h[" << name << "]|h|r";
+ else
+ ss << i << " - " << name;
- if (!found)
- found = true;
+ handler->SendSysMessage(ss.str().c_str());
+
+ if (!found)
+ found = true;
+ }
}
}
@@ -1091,36 +1109,54 @@ public:
if (target && target->getGender() != gender)
continue;
- std::string name = gender == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang;
+ int32 locale = handler->GetSessionDbcLocale();
+ std::string name = (gender == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[locale];
if (name.empty())
continue;
if (!Utf8FitTo(name, wNamePart))
- continue;
-
- if (maxResults && counter == maxResults)
{
- handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
- return true;
+ locale = 0;
+ for (; locale < TOTAL_LOCALES; ++locale)
+ {
+ if (locale == handler->GetSessionDbcLocale())
+ continue;
+
+ name = (gender == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[locale];
+ if (name.empty())
+ continue;
+
+ if (Utf8FitTo(name, wNamePart))
+ break;
+ }
}
- char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : "";
+ if (locale < TOTAL_LOCALES)
+ {
+ if (maxResults && counter == maxResults)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->MaskID
- ? handler->GetTrinityString(LANG_ACTIVE)
- : "";
+ char const* knownStr = target && target->HasTitle(titleInfo) ? handler->GetTrinityString(LANG_KNOWN) : "";
- char titleNameStr[80];
- snprintf(titleNameStr, 80, name.c_str(), targetName);
+ char const* activeStr = target && target->GetUInt32Value(PLAYER_CHOSEN_TITLE) == titleInfo->MaskID
+ ? handler->GetTrinityString(LANG_ACTIVE)
+ : "";
- // send title in "id (idx:idx) - [namedlink locale]" format
- if (handler->GetSession())
- handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->MaskID, id, titleNameStr, "", knownStr, activeStr);
- else
- handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->MaskID, titleNameStr, "", knownStr, activeStr);
+ char titleNameStr[80];
+ snprintf(titleNameStr, 80, name.c_str(), targetName);
- ++counter;
+ // send title in "id (idx:idx) - [namedlink locale]" format
+ if (handler->GetSession())
+ handler->PSendSysMessage(LANG_TITLE_LIST_CHAT, id, titleInfo->MaskID, id, titleNameStr, "", knownStr, activeStr);
+ else
+ handler->PSendSysMessage(LANG_TITLE_LIST_CONSOLE, id, titleInfo->MaskID, titleNameStr, "", knownStr, activeStr);
+
+ ++counter;
+ }
}
}
}
@@ -1145,18 +1181,35 @@ public:
uint32 counter = 0;
uint32 maxResults = sWorld->getIntConfig(CONFIG_MAX_RESULTS_LOOKUP_COMMANDS);
- uint8 locale = handler->GetSession() ? handler->GetSession()->GetSessionDbcLocale() : sWorld->GetDefaultDbcLocale();
// search in Map.dbc
for (uint32 id = 0; id < sMapStore.GetNumRows(); id++)
{
if (MapEntry const* mapInfo = sMapStore.LookupEntry(id))
{
- std::string name = mapInfo->MapName_lang;
+ int32 locale = handler->GetSessionDbcLocale();
+ std::string name = mapInfo->MapName->Str[locale];
if (name.empty())
continue;
- if (Utf8FitTo(name, wNamePart) && locale < TOTAL_LOCALES)
+ if (!Utf8FitTo(name, wNamePart) && handler->GetSession())
+ {
+ locale = 0;
+ for (; locale < TOTAL_LOCALES; ++locale)
+ {
+ if (locale == handler->GetSessionDbcLocale())
+ continue;
+
+ name = mapInfo->MapName->Str[locale];
+ if (name.empty())
+ continue;
+
+ if (Utf8FitTo(name, wNamePart))
+ break;
+ }
+ }
+
+ if (locale < TOTAL_LOCALES)
{
if (maxResults && counter == maxResults)
{
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index e6fb42853e3..d66a6d24cc2 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -235,9 +235,9 @@ public:
char const* unknown = handler->GetTrinityString(LANG_UNKNOWN);
handler->PSendSysMessage(LANG_MAP_POSITION,
- mapId, (mapEntry ? mapEntry->MapName_lang : unknown),
- zoneId, (zoneEntry ? zoneEntry->AreaName_lang : unknown),
- areaId, (areaEntry ? areaEntry->AreaName_lang : unknown),
+ mapId, (mapEntry ? mapEntry->MapName->Str[handler->GetSessionDbcLocale()] : unknown),
+ zoneId, (zoneEntry ? zoneEntry->AreaName->Str[handler->GetSessionDbcLocale()] : unknown),
+ areaId, (areaEntry ? areaEntry->AreaName->Str[handler->GetSessionDbcLocale()] : unknown),
object->GetPhaseMask(),
object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation());
if (Transport* transport = object->GetTransport())
@@ -1816,15 +1816,15 @@ public:
AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId);
if (area)
{
- areaName = area->AreaName_lang;
+ areaName = area->AreaName->Str[handler->GetSessionDbcLocale()];
AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->ParentAreaID);
if (zone)
- zoneName = zone->AreaName_lang;
+ zoneName = zone->AreaName->Str[handler->GetSessionDbcLocale()];
}
if (target)
- handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->MapName_lang,
+ handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->MapName->Str[handler->GetSessionDbcLocale()],
(!zoneName.empty() ? zoneName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)),
(!areaName.empty() ? areaName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)));
diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp
index 85f4a43b3e4..11c9921a90c 100644
--- a/src/server/scripts/Commands/cs_titles.cpp
+++ b/src/server/scripts/Commands/cs_titles.cpp
@@ -93,7 +93,9 @@ public:
target->SetTitle(titleInfo); // to be sure that title now known
target->SetUInt32Value(PLAYER_CHOSEN_TITLE, titleInfo->MaskID);
- handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang, tNameLink.c_str());
+ handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id,
+ (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()],
+ tNameLink.c_str());
return true;
}
@@ -135,7 +137,9 @@ public:
std::string tNameLink = handler->GetNameLink(target);
char titleNameStr[80];
- snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang, target->GetName().c_str());
+ snprintf(titleNameStr, 80,
+ (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()],
+ target->GetName().c_str());
target->SetTitle(titleInfo);
handler->PSendSysMessage(LANG_TITLE_ADD_RES, id, titleNameStr, tNameLink.c_str());
@@ -183,7 +187,9 @@ public:
std::string tNameLink = handler->GetNameLink(target);
char titleNameStr[80];
- snprintf(titleNameStr, 80, target->getGender() == GENDER_MALE ? titleInfo->NameMale_lang : titleInfo->NameFemale_lang, target->GetName().c_str());
+ snprintf(titleNameStr, 80,
+ (target->getGender() == GENDER_MALE ? titleInfo->NameMale : titleInfo->NameFemale)->Str[handler->GetSessionDbcLocale()],
+ target->GetName().c_str());
handler->PSendSysMessage(LANG_TITLE_REMOVE_RES, id, titleNameStr, tNameLink.c_str());
diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.h b/src/server/shared/DataStores/DB2SparseStorageLoader.h
index 13f31e12d56..ac75e6b82d5 100644
--- a/src/server/shared/DataStores/DB2SparseStorageLoader.h
+++ b/src/server/shared/DataStores/DB2SparseStorageLoader.h
@@ -65,6 +65,7 @@ class DB2SparseFileLoader
uint32 GetNumRows() const { return recordCount; }
uint32 GetCols() const { return fieldCount; }
uint32 GetHash() const { return tableHash; }
+ uint32 GetBuild() const { return build; }
bool IsLoaded() const { return (data != NULL); }
char* AutoProduceData(const char* fmt, IndexTable const& indexTable, uint32 locale, std::vector<char*>& stringPool);
char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale);
diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h
index 67525779ef5..c84f38b74b9 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.h
+++ b/src/server/shared/DataStores/DB2StorageLoader.h
@@ -92,6 +92,7 @@ class TC_SHARED_API DB2FileLoader
uint32 GetCols() const { return fieldCount; }
uint32 GetOffset(size_t id) const { return (fieldsOffset != NULL && id < fieldCount) ? fieldsOffset[id] : 0; }
uint32 GetHash() const { return tableHash; }
+ uint32 GetBuild() const { return build; }
bool IsLoaded() const { return (data != NULL); }
char* AutoProduceData(const char* fmt, uint32& count, char**& indexTable);
char* AutoProduceStringsArrayHolders(const char* fmt, char* dataTable);
diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h
index 570e8174a39..d1542faa194 100644
--- a/src/server/shared/DataStores/DB2Store.h
+++ b/src/server/shared/DataStores/DB2Store.h
@@ -29,7 +29,7 @@ class DB2StorageBase
{
public:
DB2StorageBase(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex)
- : _tableHash(0), _fileName(fileName), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { }
+ : _tableHash(0), _build(0), _fileName(fileName), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { }
virtual ~DB2StorageBase()
{
@@ -41,6 +41,8 @@ public:
uint32 GetHash() const { return _tableHash; }
+ uint32 GetBuild() const { return _build; }
+
virtual bool HasRecord(uint32 id) const = 0;
virtual void WriteRecord(uint32 id, uint32 locale, ByteBuffer& buffer) const = 0;
@@ -114,6 +116,7 @@ protected:
}
uint32 _tableHash;
+ uint32 _build;
std::string _fileName;
uint32 _fieldCount;
char const* _format;
@@ -163,6 +166,7 @@ public:
_fieldCount = db2.GetCols();
_tableHash = db2.GetHash();
+ _build = db2.GetBuild();
// load raw non-string data
_dataTable = db2.AutoProduceData(_format, _indexTableSize, _indexTable.AsChar);
@@ -233,7 +237,17 @@ class DB2SparseStorage : public DB2StorageBase
static_assert(std::is_pod<T>::value, "T in DB2SparseStorage must be POD-type.");
public:
- typedef typename std::unordered_map<uint32, T const*>::const_iterator iterator;
+ typedef struct iterator_wrapper : public std::unordered_map<uint32, T const*>::const_iterator
+ {
+ typedef typename std::unordered_map<uint32, T const*>::const_iterator Base;
+
+ iterator_wrapper() = default;
+ iterator_wrapper(iterator_wrapper const& right) = default;
+ iterator_wrapper(Base const& baseItr) : Base(baseItr) { }
+
+ uint32 ID() const { return (*this)->first; }
+ T const* Data() const { return (*this)->second; }
+ } iterator;
DB2SparseStorage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex)
: DB2StorageBase(fileName, format, preparedStmtIndex)
@@ -273,6 +287,7 @@ public:
_fieldCount = db2.GetCols();
_tableHash = db2.GetHash();
+ _build = db2.GetBuild();
// load raw non-string data
_dataTable = db2.AutoProduceData(_format, IndexTableAdapter<T>(_indexTable), locale, _stringPool);
@@ -312,8 +327,8 @@ public:
DB2SparseDatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, IndexTableAdapter<T>(_indexTable), _stringPool);
}
- iterator begin() const { return _indexTable.begin(); }
- iterator end() const { return _indexTable.end(); }
+ iterator begin() const { return iterator(_indexTable.begin()); }
+ iterator end() const { return iterator(_indexTable.end()); }
private:
std::unordered_map<uint32, T const*> _indexTable;
diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp
index ec3a95f74b9..ace59bb9ebb 100644
--- a/src/server/shared/DataStores/DBCFileLoader.cpp
+++ b/src/server/shared/DataStores/DBCFileLoader.cpp
@@ -182,11 +182,11 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**
if (i >= 0)
{
- int32 maxi = 0;
+ uint32 maxi = 0;
//find max index
for (uint32 y = 0; y < recordCount; ++y)
{
- int32 ind = int32(getRecord(y).getUInt(i));
+ uint32 ind = getRecord(y).getUInt(i);
if (ind > maxi)
maxi = ind;
}
@@ -213,10 +213,7 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**
for (uint32 y = 0; y < recordCount; ++y)
{
if (i >= 0)
- {
- if (int32(getRecord(y).getUInt(i)) >= 0)
- indexTable[getRecord(y).getUInt(i)] = &dataTable[offset];
- }
+ indexTable[getRecord(y).getUInt(i)] = &dataTable[offset];
else
indexTable[y] = &dataTable[offset];
diff --git a/src/server/shared/DataStores/DBStorageIterator.h b/src/server/shared/DataStores/DBStorageIterator.h
index 8e7d03f2756..3f9fa6eed24 100644
--- a/src/server/shared/DataStores/DBStorageIterator.h
+++ b/src/server/shared/DataStores/DBStorageIterator.h
@@ -35,8 +35,8 @@ public:
}
}
- uint32 Key() const { return _pos; }
- T const* Value() const { return _index[_pos]; }
+ uint32 ID() const { return _pos; }
+ T const* Data() const { return _index[_pos]; }
T const* operator->() { return _index[_pos]; }
T const* operator*() { return _index[_pos]; }