diff options
Diffstat (limited to 'src')
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]; } |