aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-04-25 22:03:34 +0200
committerShauren <shauren.trinity@gmail.com>2016-05-20 23:49:53 +0200
commit70102f32fe38ae7d49acbd5ddee0239602d3cb94 (patch)
tree22dcecc33942c7f60e2edb5402f6f7feaf559ece
parent885d9b53c38662e00e3b4977b82e9cf36d197f94 (diff)
Core/DataStores: Updated opcodes and db2 to 7.0.3.21414
-rw-r--r--sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql2
-rw-r--r--sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql801
-rw-r--r--src/common/Define.h22
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp192
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h49
-rw-r--r--src/server/game/Addons/AddonMgr.cpp2
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp1
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h1
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp1
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp2
-rw-r--r--src/server/game/Chat/ChatLink.cpp1
-rw-r--r--src/server/game/Combat/HostileRefManager.cpp1
-rw-r--r--src/server/game/Conditions/DisableMgr.cpp8
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp344
-rw-r--r--src/server/game/DataStores/DB2Stores.h62
-rw-r--r--src/server/game/DataStores/DB2Structure.h613
-rw-r--r--src/server/game/DataStores/DB2fmt.h69
-rw-r--r--src/server/game/DataStores/DBCEnums.h21
-rw-r--r--src/server/game/DataStores/DBCStores.cpp564
-rw-r--r--src/server/game/DataStores/DBCStores.h131
-rw-r--r--src/server/game/DataStores/DBCStructure.h614
-rw-r--r--src/server/game/DataStores/DBCfmt.h18
-rw-r--r--src/server/game/DataStores/GameTables.cpp133
-rw-r--r--src/server/game/DataStores/GameTables.h228
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp23
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h13
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.cpp2
-rw-r--r--src/server/game/Entities/Item/Item.cpp5
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.cpp1
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.cpp1
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h3
-rw-r--r--src/server/game/Entities/Player/Player.cpp324
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Taxi/TaxiPathGraph.cpp1
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp1
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp13
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp27
-rw-r--r--src/server/game/Entities/Unit/Unit.h25
-rw-r--r--src/server/game/Garrison/Garrison.cpp26
-rw-r--r--src/server/game/Garrison/Garrison.h1
-rw-r--r--src/server/game/Garrison/GarrisonMgr.cpp20
-rw-r--r--src/server/game/Garrison/GarrisonMgr.h6
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp47
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/game/Groups/Group.cpp4
-rw-r--r--src/server/game/Groups/GroupMgr.cpp1
-rw-r--r--src/server/game/Guilds/Guild.cpp6
-rw-r--r--src/server/game/Guilds/Guild.h1
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp16
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp17
-rw-r--r--src/server/game/Handlers/MailHandler.cpp1
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp2
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp4
-rw-r--r--src/server/game/Handlers/ReferAFriendHandler.cpp24
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp1
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp18
-rw-r--r--src/server/game/Loot/LootMgr.cpp6
-rw-r--r--src/server/game/Maps/Map.cpp72
-rw-r--r--src/server/game/Maps/Map.h61
-rw-r--r--src/server/game/Maps/MapInstanced.cpp2
-rw-r--r--src/server/game/Maps/MapManager.cpp2
-rw-r--r--src/server/game/Maps/TransportMgr.h1
-rw-r--r--src/server/game/Miscellaneous/Formulas.h30
-rw-r--r--src/server/game/Reputation/ReputationMgr.cpp11
-rw-r--r--src/server/game/Reputation/ReputationMgr.h1
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp1
-rw-r--r--src/server/game/Scripting/ScriptMgr.h3
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp10
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h20
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.h3
-rw-r--r--src/server/game/Server/Packets/TaxiPackets.h1
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h1534
-rw-r--r--src/server/game/Server/WorldSession.h6
-rw-r--r--src/server/game/Spells/SpellEffects.cpp2
-rw-r--r--src/server/game/Spells/SpellInfo.cpp26
-rw-r--r--src/server/game/Spells/SpellInfo.h3
-rw-r--r--src/server/game/Spells/SpellMgr.cpp1
-rw-r--r--src/server/game/Spells/SpellMgr.h1
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp1
-rw-r--r--src/server/game/World/World.cpp7
-rw-r--r--src/server/scripts/Commands/cs_character.cpp2
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp6
-rw-r--r--src/server/scripts/Commands/cs_go.cpp2
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp97
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp10
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp4
-rw-r--r--src/server/scripts/ScriptPCH.h3
-rw-r--r--src/server/scripts/Spells/spell_item.cpp1
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp2
-rw-r--r--src/server/scripts/Spells/spell_pet.cpp24
-rw-r--r--src/server/shared/DataStores/DB2SparseStorageLoader.cpp19
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.cpp65
-rw-r--r--src/server/shared/DataStores/DB2Store.h4
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.cpp314
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.h105
-rw-r--r--src/server/shared/DataStores/DBCStore.h325
-rw-r--r--src/server/shared/DataStores/DBStorageIterator.h3
98 files changed, 3721 insertions, 3592 deletions
diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql
index f90c81333a9..5011a0bd29d 100644
--- a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql
+++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_01.sql
@@ -2132,7 +2132,7 @@ ALTER TABLE `spell_power`
-- Table structure for table `spell_power_difficulty`
--
ALTER TABLE `spell_power_difficulty` DROP PRIMARY KEY;
-ALTER TABLE `spell_power_difficulty` ADD `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST,
+ALTER TABLE `spell_power_difficulty`
MODIFY `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SpellPowerID`,
MODIFY `PowerIndex` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `DifficultyID`;
ALTER TABLE `spell_power_difficulty` ADD PRIMARY KEY (`ID`);
diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql
new file mode 100644
index 00000000000..d8bf16bf9d6
--- /dev/null
+++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_04.sql
@@ -0,0 +1,801 @@
+--
+-- Table structure for table `area_table`
+--
+ALTER TABLE `area_table` CHANGE `UWIntroMusic` `UWIntroMusic` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `LiquidTypeID4`;
+
+--
+-- Table structure for table `banned_addons`
+--
+DROP TABLE IF EXISTS `banned_addons`;
+CREATE TABLE `banned_addons` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Name` text,
+ `Version` text,
+ `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `battlemaster_list`
+--
+DROP TABLE IF EXISTS `battlemaster_list`;
+CREATE TABLE `battlemaster_list` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Name` text,
+ `IconFileDataID` int(10) unsigned NOT NULL DEFAULT '0',
+ `GameType` text,
+ `MapID1` smallint(6) NOT NULL DEFAULT '0',
+ `MapID2` smallint(6) NOT NULL DEFAULT '0',
+ `MapID3` smallint(6) NOT NULL DEFAULT '0',
+ `MapID4` smallint(6) NOT NULL DEFAULT '0',
+ `MapID5` smallint(6) NOT NULL DEFAULT '0',
+ `MapID6` smallint(6) NOT NULL DEFAULT '0',
+ `MapID7` smallint(6) NOT NULL DEFAULT '0',
+ `MapID8` smallint(6) NOT NULL DEFAULT '0',
+ `MapID9` smallint(6) NOT NULL DEFAULT '0',
+ `MapID10` smallint(6) NOT NULL DEFAULT '0',
+ `MapID11` smallint(6) NOT NULL DEFAULT '0',
+ `MapID12` smallint(6) NOT NULL DEFAULT '0',
+ `MapID13` smallint(6) NOT NULL DEFAULT '0',
+ `MapID14` smallint(6) NOT NULL DEFAULT '0',
+ `MapID15` smallint(6) NOT NULL DEFAULT '0',
+ `MapID16` smallint(6) NOT NULL DEFAULT '0',
+ `HolidayWorldState` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `InstanceType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `GroupsAllowed` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MaxGroupSize` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `RatedPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MinPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MaxPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `battlemaster_list_locale`
+--
+DROP TABLE IF EXISTS `battlemaster_list_locale`;
+CREATE TABLE `battlemaster_list_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Name_lang` text,
+ `GameType_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `char_sections`
+--
+DROP TABLE IF EXISTS `char_sections`;
+CREATE TABLE `char_sections` (
+ `Id` int(10) unsigned NOT NULL DEFAULT '0',
+ `TextureFileDataID1` int(10) unsigned NOT NULL DEFAULT '0',
+ `TextureFileDataID2` int(10) unsigned NOT NULL DEFAULT '0',
+ `TextureFileDataID3` int(10) unsigned NOT NULL DEFAULT '0',
+ `Flags` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Race` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Gender` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `GenType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Type` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Color` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`Id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `chr_classes`
+--
+DROP TABLE IF EXISTS `chr_classes`;
+CREATE TABLE `chr_classes` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `PowerType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `PetNameToken` text,
+ `Name` text,
+ `NameFemale` text,
+ `NameMale` text,
+ `Filename` text,
+ `CreateScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0',
+ `SelectScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0',
+ `LowResScreenFileDataID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Flags` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `CinematicSequenceID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `DefaultSpec` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SpellClassSet` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `AttackPowerPerStrength` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `AttackPowerPerAgility` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `RangedAttackPowerPerAgility` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `IconFileDataID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Unk1` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `chr_classes_locale`
+--
+DROP TABLE IF EXISTS `chr_classes_locale`;
+CREATE TABLE `chr_classes_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Name_lang` text,
+ `NameFemale_lang` text,
+ `NameMale_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `chr_races`
+--
+ALTER TABLE `chr_races` ADD `ItemAppearanceFrameRaceID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `NeutralRaceID`;
+
+--
+-- Table structure for table `creature_display_info`
+--
+ALTER TABLE `creature_display_info` ADD `InstanceOtherPlayerPetScale` float NOT NULL DEFAULT '0' AFTER `StateSpellVisualKitID`;
+
+--
+-- Table structure for table `creature_model_data`
+--
+DROP TABLE IF EXISTS `creature_model_data`;
+CREATE TABLE `creature_model_data` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Flags` int(10) unsigned NOT NULL DEFAULT '0',
+ `FileDataID` int(10) unsigned NOT NULL DEFAULT '0',
+ `ModelScale` float NOT NULL DEFAULT '0',
+ `FootprintTextureLength` float NOT NULL DEFAULT '0',
+ `FootprintTextureWidth` float NOT NULL DEFAULT '0',
+ `FootprintParticleScale` float NOT NULL DEFAULT '0',
+ `CollisionWidth` float NOT NULL DEFAULT '0',
+ `CollisionHeight` float NOT NULL DEFAULT '0',
+ `MountHeight` float NOT NULL DEFAULT '0',
+ `GeoBoxMin1` float NOT NULL DEFAULT '0',
+ `GeoBoxMin2` float NOT NULL DEFAULT '0',
+ `GeoBoxMin3` float NOT NULL DEFAULT '0',
+ `GeoBoxMax1` float NOT NULL DEFAULT '0',
+ `GeoBoxMax2` float NOT NULL DEFAULT '0',
+ `GeoBoxMax3` float NOT NULL DEFAULT '0',
+ `WorldEffectScale` float NOT NULL DEFAULT '0',
+ `AttachedEffectScale` float NOT NULL DEFAULT '0',
+ `MissileCollisionRadius` float NOT NULL DEFAULT '0',
+ `MissileCollisionPush` float NOT NULL DEFAULT '0',
+ `MissileCollisionRaise` float NOT NULL DEFAULT '0',
+ `OverrideLootEffectScale` float NOT NULL DEFAULT '0',
+ `OverrideNameScale` float NOT NULL DEFAULT '0',
+ `OverrideSelectionRadius` float NOT NULL DEFAULT '0',
+ `TamedPetBaseScale` float NOT NULL DEFAULT '0',
+ `HoverHeight` float NOT NULL DEFAULT '0',
+ `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `CreatureGeosetDataID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SizeClass` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `BloodID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `FootprintTextureID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `FoleyMaterialID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Unk700_1` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Unk700_2` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `FootstepShakeSize` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DeathThudShakeSize` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `emotes`
+--
+ALTER TABLE `emotes`
+ ADD `Unk703_1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EmoteFlags`,
+ ADD `Unk703_2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unk703_1`,
+ CHANGE `EmoteSpecProcParam` `EmoteSpecProcParam` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `AnimID`;
+
+--
+-- Table structure for table `faction`
+--
+DROP TABLE IF EXISTS `faction`;
+CREATE TABLE `faction` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `ReputationRaceMask1` int(10) unsigned NOT NULL DEFAULT '0',
+ `ReputationRaceMask2` int(10) unsigned NOT NULL DEFAULT '0',
+ `ReputationRaceMask3` int(10) unsigned NOT NULL DEFAULT '0',
+ `ReputationRaceMask4` int(10) unsigned NOT NULL DEFAULT '0',
+ `ReputationBase1` int(11) NOT NULL DEFAULT '0',
+ `ReputationBase2` int(11) NOT NULL DEFAULT '0',
+ `ReputationBase3` int(11) NOT NULL DEFAULT '0',
+ `ReputationBase4` int(11) NOT NULL DEFAULT '0',
+ `ParentFactionModIn` float NOT NULL DEFAULT '0',
+ `ParentFactionModOut` float NOT NULL DEFAULT '0',
+ `Name` text,
+ `Description` text,
+ `ReputationIndex` smallint(6) NOT NULL DEFAULT '0',
+ `ReputationClassMask1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ReputationClassMask2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ReputationClassMask3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ReputationClassMask4` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ReputationFlags1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ReputationFlags2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ReputationFlags3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ReputationFlags4` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ParentFactionID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ParentFactionCapIn` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ParentFactionCapOut` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Expansion` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `FriendshipRepID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `faction_locale`
+--
+DROP TABLE IF EXISTS `faction_locale`;
+CREATE TABLE `faction_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Name_lang` text,
+ `Description_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `faction_template`
+--
+DROP TABLE IF EXISTS `faction_template`;
+CREATE TABLE `faction_template` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Faction` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Flags` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Enemies1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Enemies2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Enemies3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Enemies4` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Friends1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Friends2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Friends3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Friends4` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Mask` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `FriendMask` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `EnemyMask` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `garr_ability`
+--
+ALTER TABLE `garr_ability` CHANGE `Flags` `Flags` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`;
+
+--
+-- Table structure for table `garr_ability`
+--
+ALTER TABLE `garr_class_spec`
+ ADD `Limit` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrFollItemSetID`,
+ CHANGE `Unknown700` `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Limit`;
+
+--
+-- Table structure for table `garr_follower`
+--
+ALTER TABLE `garr_follower`
+ ADD `MaxDurability` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `GarrTypeID`,
+ ADD `Class` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `MaxDurability`;
+
+--
+-- Table structure for table `garr_plot`
+--
+ALTER TABLE `garr_plot` CHANGE `MinCount` `MinCount` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `HordeConstructionGameObjectID`;
+ALTER TABLE `garr_plot` CHANGE `MaxCount` `MaxCount` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `MinCount`;
+
+--
+-- Table structure for table `gem_properties`
+--
+ALTER TABLE `gem_properties`
+ DROP `MaxCountInv`,
+ DROP COLUMN `MaxCountItem`;
+
+--
+-- Table structure for table `glyph_slot`
+--
+ALTER TABLE `glyph_slot` MODIFY COLUMN `Tooltip` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ID`;
+
+--
+-- Table structure for table `guild_perk_spells`
+--
+ALTER TABLE `guild_perk_spells` DROP COLUMN `GuildLevel`;
+
+--
+-- Table structure for table `item_appearance`
+--
+ALTER TABLE `item_appearance` ADD COLUMN `UIOrder` int(10) unsigned NOT NULL DEFAULT '0' AFTER `IconFileDataID`;
+
+--
+-- Table structure for table `item_modified_appearance`
+--
+ALTER TABLE `item_modified_appearance` ADD COLUMN `SourceType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `Index`;
+
+--
+-- Table structure for table `item_set`
+--
+ALTER TABLE `item_set` ADD COLUMN `Unknown703` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ItemID17`;
+
+--
+-- Table structure for table `item_sparse`
+--
+ALTER TABLE `item_sparse` ADD COLUMN `RequiredExpansion` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ArtifactID`;
+
+--
+-- Table structure for table `lfg_dungeons`
+--
+DROP TABLE IF EXISTS `lfg_dungeons`;
+CREATE TABLE `lfg_dungeons` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Name` text,
+ `Flags` int(10) unsigned NOT NULL DEFAULT '0',
+ `TextureFilename` text,
+ `Description` text,
+ `MaxLevel` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `TargetLevelMax` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `MapID` smallint(6) NOT NULL DEFAULT '0',
+ `RandomID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ScenarioID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LastBossJournalEncounterID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `BonusReputationAmount` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `MentorItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `TargetLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `TargetLevelMin` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Type` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Faction` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Expansion` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `OrderIndex` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `GroupID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `CountTank` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `CountHealer` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `CountDamage` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MinCountTank` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MinCountHealer` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MinCountDamage` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `SubType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MentorCharLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `lfg_dungeons_locale`
+--
+DROP TABLE IF EXISTS `lfg_dungeons_locale`;
+CREATE TABLE `lfg_dungeons_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Name_lang` text,
+ `Description_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `light`
+--
+DROP TABLE IF EXISTS `light`;
+CREATE TABLE `light` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `PosX` float NOT NULL DEFAULT '0',
+ `PosY` float NOT NULL DEFAULT '0',
+ `PosZ` float NOT NULL DEFAULT '0',
+ `FalloffStart` float NOT NULL DEFAULT '0',
+ `FalloffEnd` float NOT NULL DEFAULT '0',
+ `MapID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID4` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID5` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID6` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID7` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LightParamsID8` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `liquid_type`
+--
+DROP TABLE IF EXISTS `liquid_type`;
+CREATE TABLE `liquid_type` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Name` text,
+ `SpellID` int(10) unsigned NOT NULL DEFAULT '0',
+ `MaxDarkenDepth` float NOT NULL DEFAULT '0',
+ `FogDarkenIntensity` float NOT NULL DEFAULT '0',
+ `AmbDarkenIntensity` float NOT NULL DEFAULT '0',
+ `DirDarkenIntensity` float NOT NULL DEFAULT '0',
+ `ParticleScale` float NOT NULL DEFAULT '0',
+ `Texture1` text,
+ `Texture2` text,
+ `Texture3` text,
+ `Texture4` text,
+ `Texture5` text,
+ `Texture6` text,
+ `Color1` int(10) unsigned NOT NULL DEFAULT '0',
+ `Color2` int(10) unsigned NOT NULL DEFAULT '0',
+ `Float1` float NOT NULL DEFAULT '0',
+ `Float2` float NOT NULL DEFAULT '0',
+ `Float3` float NOT NULL DEFAULT '0',
+ `Float4` float NOT NULL DEFAULT '0',
+ `Float5` float NOT NULL DEFAULT '0',
+ `Float6` float NOT NULL DEFAULT '0',
+ `Float7` float NOT NULL DEFAULT '0',
+ `Float8` float NOT NULL DEFAULT '0',
+ `Float9` float NOT NULL DEFAULT '0',
+ `Float10` float NOT NULL DEFAULT '0',
+ `Float11` float NOT NULL DEFAULT '0',
+ `Float12` float NOT NULL DEFAULT '0',
+ `Float13` float NOT NULL DEFAULT '0',
+ `Float14` float NOT NULL DEFAULT '0',
+ `Float15` float NOT NULL DEFAULT '0',
+ `Float16` float NOT NULL DEFAULT '0',
+ `Float17` float NOT NULL DEFAULT '0',
+ `Float18` float NOT NULL DEFAULT '0',
+ `Int1` int(10) unsigned NOT NULL DEFAULT '0',
+ `Int2` int(10) unsigned NOT NULL DEFAULT '0',
+ `Int3` int(10) unsigned NOT NULL DEFAULT '0',
+ `Int4` int(10) unsigned NOT NULL DEFAULT '0',
+ `Flags` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SoundID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Type` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `LightID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ParticleMovement` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ParticleTexSlots` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MaterialID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DepthTexCount1` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DepthTexCount2` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DepthTexCount3` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DepthTexCount4` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DepthTexCount5` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `DepthTexCount6` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `liquid_type_locale`
+--
+DROP TABLE IF EXISTS `liquid_type_locale`;
+CREATE TABLE `liquid_type_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Name_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `map`
+--
+ALTER TABLE `map` DROP `RaidOffset`;
+
+--
+-- Table structure for table `map_difficulty`
+--
+DROP TABLE IF EXISTS `map_difficulty`;
+CREATE TABLE `map_difficulty` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Message` text,
+ `Context` int(10) unsigned NOT NULL DEFAULT '0',
+ `MapID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `DifficultyID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `RaidDurationType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MaxPlayers` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `LockID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ItemBonusTreeModID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `map_difficulty_locale`
+--
+DROP TABLE IF EXISTS `map_difficulty_locale`;
+CREATE TABLE `map_difficulty_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Message_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `mount_capability`
+--
+ALTER TABLE `mount_capability` MODIFY COLUMN `RequiredAura` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`;
+
+--
+-- Table structure for table `quest_sort`
+--
+ALTER TABLE `quest_sort` ADD COLUMN `SortOrder` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `SortName`;
+
+--
+-- Table structure for table `rand_prop_points`
+--
+ALTER TABLE `rand_prop_points`
+ CHANGE `EpicPropertiesPoints1` `EpicPropertiesPoints1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`,
+ CHANGE `EpicPropertiesPoints2` `EpicPropertiesPoints2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints1`,
+ CHANGE `EpicPropertiesPoints3` `EpicPropertiesPoints3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints2`,
+ CHANGE `EpicPropertiesPoints4` `EpicPropertiesPoints4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints3`,
+ CHANGE `EpicPropertiesPoints5` `EpicPropertiesPoints5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints4`,
+ CHANGE `RarePropertiesPoints1` `RarePropertiesPoints1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EpicPropertiesPoints5`,
+ CHANGE `RarePropertiesPoints2` `RarePropertiesPoints2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints1`,
+ CHANGE `RarePropertiesPoints3` `RarePropertiesPoints3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints2`,
+ CHANGE `RarePropertiesPoints4` `RarePropertiesPoints4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints3`,
+ CHANGE `RarePropertiesPoints5` `RarePropertiesPoints5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints4`,
+ CHANGE `UncommonPropertiesPoints1` `UncommonPropertiesPoints1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `RarePropertiesPoints5`,
+ CHANGE `UncommonPropertiesPoints2` `UncommonPropertiesPoints2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints1`,
+ CHANGE `UncommonPropertiesPoints3` `UncommonPropertiesPoints3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints2`,
+ CHANGE `UncommonPropertiesPoints4` `UncommonPropertiesPoints4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints3`,
+ CHANGE `UncommonPropertiesPoints5` `UncommonPropertiesPoints5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UncommonPropertiesPoints4`;
+
+--
+-- Table structure for table `skill_race_class_info`
+--
+ALTER TABLE `skill_race_class_info` MODIFY COLUMN `ClassMask` int(11) NOT NULL DEFAULT '0' AFTER `RaceMask`;
+
+--
+-- Table structure for table `sound_kit`
+--
+ALTER TABLE `sound_kit`
+ CHANGE `BusOverwriteID` `BusOverwriteID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `SoundEntriesAdvancedID`,
+ CHANGE `SoundType` `SoundType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `BusOverwriteID`;
+
+--
+-- Table structure for table `spell_category`
+--
+ALTER TABLE `spell_category` ADD COLUMN `Unk703` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ChargeRecoveryTime`;
+
+--
+-- Table structure for table `spell_item_enchantment`
+--
+DROP TABLE IF EXISTS `spell_item_enchantment`;
+CREATE TABLE `spell_item_enchantment` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `EffectSpellID1` int(10) unsigned NOT NULL DEFAULT '0',
+ `EffectSpellID2` int(10) unsigned NOT NULL DEFAULT '0',
+ `EffectSpellID3` int(10) unsigned NOT NULL DEFAULT '0',
+ `Name` text,
+ `EffectScalingPoints1` float NOT NULL DEFAULT '0',
+ `EffectScalingPoints2` float NOT NULL DEFAULT '0',
+ `EffectScalingPoints3` float NOT NULL DEFAULT '0',
+ `PlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0',
+ `TransmogCost` int(10) unsigned NOT NULL DEFAULT '0',
+ `TextureFileDataID` int(10) unsigned NOT NULL DEFAULT '0',
+ `EffectPointsMin1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `EffectPointsMin2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `EffectPointsMin3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ItemVisual` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Flags` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `RequiredSkillID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `RequiredSkillRank` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Charges` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Effect1` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Effect2` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Effect3` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ConditionID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ScalingClass` tinyint(4) NOT NULL DEFAULT '0',
+ `ScalingClassRestricted` tinyint(4) NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `spell_item_enchantment_locale`
+--
+DROP TABLE IF EXISTS `spell_item_enchantment_locale`;
+CREATE TABLE `spell_item_enchantment_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Name_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `spell_scaling`
+--
+ALTER TABLE `spell_scaling` ADD COLUMN `MinScalingLevel` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `ScalingClass`;
+
+--
+-- Table structure for table `talent`
+--
+DROP TABLE IF EXISTS `talent`;
+CREATE TABLE `talent` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `SpellID` int(10) unsigned NOT NULL DEFAULT '0',
+ `OverridesSpellID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Description` text,
+ `SpecID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `TierID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ColumnIndex` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `CategoryMask1` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `CategoryMask2` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `ClassID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `talent_locale`
+--
+DROP TABLE IF EXISTS `talent_locale`;
+CREATE TABLE `talent_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `Description_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `vehicle`
+--
+DROP TABLE IF EXISTS `vehicle`;
+CREATE TABLE `vehicle` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `Flags` int(10) unsigned NOT NULL DEFAULT '0',
+ `TurnSpeed` float NOT NULL DEFAULT '0',
+ `PitchSpeed` float NOT NULL DEFAULT '0',
+ `PitchMin` float NOT NULL DEFAULT '0',
+ `PitchMax` float NOT NULL DEFAULT '0',
+ `MouseLookOffsetPitch` float NOT NULL DEFAULT '0',
+ `CameraFadeDistScalarMin` float NOT NULL DEFAULT '0',
+ `CameraFadeDistScalarMax` float NOT NULL DEFAULT '0',
+ `CameraPitchOffset` float NOT NULL DEFAULT '0',
+ `FacingLimitRight` float NOT NULL DEFAULT '0',
+ `FacingLimitLeft` float NOT NULL DEFAULT '0',
+ `MsslTrgtTurnLingering` float NOT NULL DEFAULT '0',
+ `MsslTrgtPitchLingering` float NOT NULL DEFAULT '0',
+ `MsslTrgtMouseLingering` float NOT NULL DEFAULT '0',
+ `MsslTrgtEndOpacity` float NOT NULL DEFAULT '0',
+ `MsslTrgtArcSpeed` float NOT NULL DEFAULT '0',
+ `MsslTrgtArcRepeat` float NOT NULL DEFAULT '0',
+ `MsslTrgtArcWidth` float NOT NULL DEFAULT '0',
+ `MsslTrgtImpactRadius1` float NOT NULL DEFAULT '0',
+ `MsslTrgtImpactRadius2` float NOT NULL DEFAULT '0',
+ `MsslTrgtArcTexture` text,
+ `MsslTrgtImpactTexture` text,
+ `MsslTrgtImpactModel1` text,
+ `MsslTrgtImpactModel2` text,
+ `CameraYawOffset` float NOT NULL DEFAULT '0',
+ `MsslTrgtImpactTexRadius` float NOT NULL DEFAULT '0',
+ `SeatID1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SeatID2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SeatID3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SeatID4` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SeatID5` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SeatID6` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SeatID7` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `SeatID8` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `VehicleUIIndicatorID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `PowerDisplayID1` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `PowerDisplayID2` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `PowerDisplayID3` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `FlagsB` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `UILocomotionType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `vehicle_seat`
+--
+ALTER TABLE `vehicle_seat`
+ CHANGE `EnterUISoundID` `EnterUISoundID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `VehicleExitAnimDelay`,
+ CHANGE `ExitUISoundID` `ExitUISoundID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `EnterUISoundID`;
+
+--
+-- Table structure for table `wmo_area_table`
+--
+DROP TABLE IF EXISTS `wmo_area_table`;
+CREATE TABLE `wmo_area_table` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `WMOGroupID` int(11) NOT NULL DEFAULT '0',
+ `AreaName` text,
+ `WMOID` smallint(6) NOT NULL DEFAULT '0',
+ `AmbienceID` int(10) unsigned NOT NULL DEFAULT '0',
+ `ZoneMusic` int(10) unsigned NOT NULL DEFAULT '0',
+ `IntroSound` int(10) unsigned NOT NULL DEFAULT '0',
+ `AreaTableID` int(10) unsigned NOT NULL DEFAULT '0',
+ `UWIntroSound` int(10) unsigned NOT NULL DEFAULT '0',
+ `UWAmbience` int(10) unsigned NOT NULL DEFAULT '0',
+ `NameSet` tinyint(4) NOT NULL DEFAULT '0',
+ `SoundProviderPref` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `SoundProviderPrefUnderwater` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `UWZoneMusic` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `wmo_area_table_locale`
+--
+DROP TABLE IF EXISTS `wmo_area_table_locale`;
+CREATE TABLE `wmo_area_table_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `AreaName_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `world_map_area`
+--
+DROP TABLE IF EXISTS `world_map_area`;
+CREATE TABLE `world_map_area` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `AreaName` text,
+ `LocLeft` float NOT NULL DEFAULT '0',
+ `LocRight` float NOT NULL DEFAULT '0',
+ `LocTop` float NOT NULL DEFAULT '0',
+ `LocBottom` float NOT NULL DEFAULT '0',
+ `MapID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `AreaID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `DisplayMapID` smallint(6) NOT NULL DEFAULT '0',
+ `DefaultDungeonFloor` smallint(6) NOT NULL DEFAULT '0',
+ `ParentWorldMapID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `Flags` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `PlayerConditionID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `LevelRangeMin` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `LevelRangeMax` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `BountySetID` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `BountyBoardLocation` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `world_map_overlay`
+--
+ALTER TABLE `world_map_overlay` ADD `Flags` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`;
+
+--
+-- Table structure for table `world_safe_locs`
+--
+DROP TABLE IF EXISTS `world_safe_locs`;
+CREATE TABLE `world_safe_locs` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `LocX` float NOT NULL DEFAULT '0',
+ `LocY` float NOT NULL DEFAULT '0',
+ `LocZ` float NOT NULL DEFAULT '0',
+ `Facing` float NOT NULL DEFAULT '0',
+ `AreaName` text,
+ `MapID` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Table structure for table `world_safe_locs_locale`
+--
+DROP TABLE IF EXISTS `world_safe_locs_locale`;
+CREATE TABLE `world_safe_locs_locale` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `locale` varchar(4) NOT NULL,
+ `AreaName_lang` text,
+ `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`,`locale`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DROP TABLE `game_tables`;
+DROP TABLE `game_tables_locale`;
+DROP TABLE `item_to_battle_pet_species`;
diff --git a/src/common/Define.h b/src/common/Define.h
index c9eb42791e9..5bbb77916f5 100644
--- a/src/common/Define.h
+++ b/src/common/Define.h
@@ -159,19 +159,15 @@ typedef uint8_t uint8;
enum DBCFormer
{
- FT_NA = 'x', //not used or unknown, 4 byte size
- FT_NA_BYTE = 'X', //not used or unknown, byte
- FT_STRING = 's', //char*
- FT_STRING_NOT_LOCALIZED = 'S', //char* but without locale in DB2
- FT_FLOAT = 'f', //float
- FT_INT = 'i', //uint32
- FT_BYTE = 'b', //uint8
- FT_LONG = 'l', //uint64
- FT_SHORT = 'h', //uint16
- FT_SORT = 'd', //sorted by this field, field is not included
- FT_IND = 'n', //the same, but parsed to data
- FT_SQL_PRESENT = 'p', //Used in sql format to mark column present in sql dbc
- FT_SQL_ABSENT = 'a' //Used in sql format to mark column absent in sql dbc
+ FT_STRING = 's', // LocalizedString*
+ FT_STRING_NOT_LOCALIZED = 'S', // char*
+ FT_FLOAT = 'f', // float
+ FT_INT = 'i', // uint32
+ FT_BYTE = 'b', // uint8
+ FT_LONG = 'l', // uint64
+ FT_SHORT = 'h', // uint16
+ FT_SORT = 'd', // sorted by this field but not present in DB2 data block (calculated)
+ FT_IND = 'n' // sorted by this field
};
#endif //TRINITY_DEFINE_H
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index 9b9363f6724..e40be4e167a 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -43,8 +43,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// 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, "
+ "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UWIntroMusic, UWZoneMusic, UWAmbience, "
+ "PvPCombastWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, "
"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);
@@ -62,6 +62,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// BankBagSlotPrices.db2
PrepareStatement(HOTFIX_SEL_BANK_BAG_SLOT_PRICES, "SELECT ID, Cost FROM bank_bag_slot_prices ORDER BY ID DESC", CONNECTION_SYNCH);
+ // BannedAddons.db2
+ PrepareStatement(HOTFIX_SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons ORDER BY ID DESC", CONNECTION_SYNCH);
+
// BarberShopStyle.db2
PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName, Description, CostModifier, Type, Race, Sex, Data FROM barber_shop_style"
" ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -81,11 +84,21 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// BattlePetSpeciesState.db2
PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, Value, SpeciesID, State FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH);
+ // BattlemasterList.db2
+ PrepareStatement(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name, IconFileDataID, GameType, MapID1, MapID2, MapID3, MapID4, MapID5, MapID6, "
+ "MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16, HolidayWorldState, PlayerConditionID, InstanceType, "
+ "GroupsAllowed, MaxGroupSize, MinLevel, MaxLevel, RatedPlayers, MinPlayers, MaxPlayers, Flags FROM battlemaster_list ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name_lang, GameType_lang FROM battlemaster_list_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// BroadcastText.db2
PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, "
"EmoteDelay3, SoundID, UnkEmoteID, Language, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_lang, FemaleText_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH);
+ // CharSections.db2
+ PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT Id, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3, Flags, Race, Gender, GenType, "
+ "Type, Color FROM char_sections ORDER BY Id DESC", CONNECTION_SYNCH);
+
// CharStartOutfit.db2
PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, "
"ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, "
@@ -99,6 +112,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()
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);
+ // ChrClasses.db2
+ PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, PowerType, PetNameToken, Name, NameFemale, NameMale, Filename, CreateScreenFileDataID, "
+ "SelectScreenFileDataID, LowResScreenFileDataID, Flags, CinematicSequenceID, DefaultSpec, SpellClassSet, AttackPowerPerStrength, "
+ "AttackPowerPerAgility, RangedAttackPowerPerAgility, IconFileDataID, Unk1 FROM chr_classes ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_classes_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// ChrClassesXPowerTypes.db2
PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, ClassID, PowerType FROM chr_classes_x_power_types ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -108,8 +127,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, FactionID, "
"ExplorationSoundID, MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, UAMaleCreatureSoundDataID, "
"UAFemaleCreatureSoundDataID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk, BaseLanguage, CreatureType, TeamID, RaceRelated, "
- "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, CharComponentTexLayoutHiResID FROM chr_races"
- " ORDER BY ID DESC", CONNECTION_SYNCH);
+ "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, "
+ "CharComponentTexLayoutHiResID FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH);
// ChrSpecialization.db2
@@ -125,8 +144,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// CreatureDisplayInfo.db2
PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ExtendedDisplayInfoID, CreatureModelScale, PlayerModelScale, TextureVariation1, "
"TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, CreatureGeosetData, StateSpellVisualKitID, "
- "ModelID, SoundID, NPCSoundID, ParticleColorID, ObjectEffectPackageID, AnimReplacementSetID, CreatureModelAlpha, SizeClass, BloodID, Flags, "
- "Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH);
+ "InstanceOtherPlayerPetScale, ModelID, SoundID, NPCSoundID, ParticleColorID, ObjectEffectPackageID, AnimReplacementSetID, CreatureModelAlpha, "
+ "SizeClass, BloodID, Flags, Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH);
// CreatureDisplayInfoExtra.db2
PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, FileDataID, HDFileDataID, DisplayRaceID, DisplaySexID, DisplayClassID, "
@@ -138,6 +157,14 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"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);
+ // CreatureModelData.db2
+ PrepareStatement(HOTFIX_SEL_CREATURE_MODEL_DATA, "SELECT ID, Flags, FileDataID, ModelScale, FootprintTextureLength, FootprintTextureWidth, "
+ "FootprintParticleScale, CollisionWidth, CollisionHeight, MountHeight, GeoBoxMin1, GeoBoxMin2, GeoBoxMin3, GeoBoxMax1, GeoBoxMax2, "
+ "GeoBoxMax3, WorldEffectScale, AttachedEffectScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, "
+ "OverrideLootEffectScale, OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale, HoverHeight, SoundID, CreatureGeosetDataID, "
+ "SizeClass, BloodID, FootprintTextureID, FoleyMaterialID, Unk700_1, Unk700_2, FootstepShakeSize, DeathThudShakeSize FROM creature_model_data"
+ " ORDER BY ID DESC", 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);
@@ -190,8 +217,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, QualityMod FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH);
// Emotes.db2
- PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, AnimID, EmoteSoundID, EmoteSpecProc, "
- "EmoteSpecProcParam FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, EmoteSlashCommand, SpellVisualKitID, EmoteFlags, Unk703_1, Unk703_2, AnimID, EmoteSpecProcParam, "
+ "EmoteSoundID, EmoteSpecProc 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);
@@ -200,6 +227,18 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// 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);
+ // Faction.db2
+ PrepareStatement(HOTFIX_SEL_FACTION, "SELECT ID, ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, "
+ "ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ParentFactionModIn, ParentFactionModOut, Name, Description, "
+ "ReputationIndex, ReputationClassMask1, ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, "
+ "ReputationFlags3, ReputationFlags4, ParentFactionID, ParentFactionCapIn, ParentFactionCapOut, Expansion, Flags, FriendshipRepID FROM faction"
+ " ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_FACTION, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE locale = ?", CONNECTION_SYNCH);
+
+ // FactionTemplate.db2
+ PrepareStatement(HOTFIX_SEL_FACTION_TEMPLATE, "SELECT ID, Faction, Flags, Enemies1, Enemies2, Enemies3, Enemies4, Friends1, Friends2, Friends3, "
+ "Friends4, Mask, FriendMask, EnemyMask FROM faction_template ORDER BY ID DESC", CONNECTION_SYNCH);
+
// Gameobjects.db2
PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Size, Data1, "
"Data2, Data3, Data4, Data5, Data6, Data7, Data8, Name, MapID, DisplayID, PhaseID, PhaseGroupID, PhaseUseFlags, Type FROM gameobjects"
@@ -210,12 +249,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, FileDataID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, "
"GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH);
- // GameTables.db2
- PrepareStatement(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name, NumRows, NumColumns FROM game_tables ORDER BY ID DESC", CONNECTION_SYNCH);
- PREPARE_LOCALE_STMT(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name_lang FROM game_tables_locale WHERE locale = ?", CONNECTION_SYNCH);
-
// GarrAbility.db2
- PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, Flags, GarrAbilityCategoryID, "
+ PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name, Description, IconFileDataID, Flags, OtherFactionGarrAbilityID, GarrAbilityCategoryID, "
"FollowerTypeID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -232,7 +267,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"GarrSiteLevelPlotInstID, GarrBuildingID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH);
// GarrClassSpec.db2
- PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID, Unknown700"
+ PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID, `Limit`, Flags"
" FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale_lang, NameFemale_lang, NameGenderless_lang FROM garr_class_spec_locale"
" WHERE locale = ?", CONNECTION_SYNCH);
@@ -241,8 +276,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeCreatureID, AllianceCreatureID, HordeSourceText, AllianceSourceText, "
"HordePortraitIconID, AlliancePortraitIconID, ItemLevelWeapon, ItemLevelArmor, FollowerTypeID, HordeUiAnimRaceInfoID, "
"AllianceUiAnimRaceInfoID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, Level, "
- "Unknown1, Flags, Unknown2, Unknown3, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, GarrTypeID FROM garr_follower"
- " ORDER BY ID DESC", CONNECTION_SYNCH);
+ "Unknown1, Flags, Unknown2, Unknown3, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, GarrTypeID, MaxDurability, Class"
+ " FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang FROM garr_follower_locale WHERE locale = ?", CONNECTION_SYNCH);
// GarrFollowerXAbility.db2
@@ -250,8 +285,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" ORDER BY ID DESC", CONNECTION_SYNCH);
// GarrPlot.db2
- PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, GarrPlotUICategoryID, "
- "PlotType, Flags, MinCount, MaxCount FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructionGameObjectID, HordeConstructionGameObjectID, MinCount, MaxCount, "
+ "GarrPlotUICategoryID, PlotType, Flags FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name_lang FROM garr_plot_locale WHERE locale = ?", CONNECTION_SYNCH);
// GarrPlotBuilding.db2
@@ -270,15 +305,14 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH);
// GemProperties.db2
- PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, Type, EnchantID, MinItemLevel, MaxCountInv, MaxCountItem FROM gem_properties"
- " ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, Type, EnchantID, MinItemLevel FROM gem_properties ORDER BY ID DESC", CONNECTION_SYNCH);
// GlyphProperties.db2
PrepareStatement(HOTFIX_SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, SpellIconID, Type, GlyphExclusiveCategoryID FROM glyph_properties"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// GlyphSlot.db2
- PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Type, Tooltip FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Tooltip, Type FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH);
// GuildColorBackground.db2
PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Green, Blue FROM guild_color_background ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -290,7 +324,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_GUILD_COLOR_EMBLEM, "SELECT ID, Red, Green, Blue FROM guild_color_emblem ORDER BY ID DESC", CONNECTION_SYNCH);
// GuildPerkSpells.db2
- PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID, GuildLevel FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH);
// Heirloom.db2
PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT ID, ItemID, SourceText, OldItem1, OldItem2, NextDifficultyItemID, UpgradeItemID1, UpgradeItemID2, "
@@ -322,7 +356,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM item ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemAppearance.db2
- PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID, ObjectComponentSlot FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID, UIOrder, ObjectComponentSlot FROM item_appearance"
+ " ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemArmorQuality.db2
PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_QUALITY, "SELECT ID, QualityMod1, QualityMod2, QualityMod3, QualityMod4, QualityMod5, QualityMod6, "
@@ -393,8 +428,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?", CONNECTION_SYNCH);
// ItemModifiedAppearance.db2
- PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceID, AppearanceModID, `Index` FROM item_modified_appearance"
- " ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceID, AppearanceModID, `Index`, SourceType"
+ " FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemPriceBase.db2
PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ArmorFactor, WeaponFactor, ItemLevel FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -411,7 +446,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// ItemSet.db2
PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, "
- "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, RequiredSkillRank, RequiredSkill FROM item_set"
+ "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, Unknown703, RequiredSkillRank, RequiredSkill FROM item_set"
" ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -431,7 +466,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"HolidayID, ItemNameDescriptionID, Quality, BuyCount, InventoryType, RequiredLevel, RequiredHonorRank, RequiredCityRank, "
"RequiredReputationRank, ContainerSlots, ItemStatType1, ItemStatType2, ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, "
"ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, DamageType, Bonding, LanguageID, PageMaterial, Material, Sheath, TotemCategory, "
- "SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH);
+ "SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID, RequiredExpansion FROM item_sparse"
+ " ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Name_lang, Name2_lang, Name3_lang, Name4_lang, Description_lang FROM item_sparse_locale"
" WHERE locale = ?", CONNECTION_SYNCH);
@@ -442,9 +478,6 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// ItemSpecOverride.db2
PrepareStatement(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, ItemID, SpecID FROM item_spec_override ORDER BY ID DESC", CONNECTION_SYNCH);
- // ItemToBattlePetSpecies.db2
- PrepareStatement(HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES, "SELECT ID, BattlePetSpeciesID FROM item_to_battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH);
-
// ItemXBonusTree.db2
PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemID, BonusTreeID FROM item_x_bonus_tree ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -453,6 +486,25 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"Key15, Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM key_chain"
" ORDER BY ID DESC", CONNECTION_SYNCH);
+ // LfgDungeons.db2
+ PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name, Flags, TextureFilename, Description, MaxLevel, TargetLevelMax, MapID, RandomID, "
+ "ScenarioID, LastBossJournalEncounterID, BonusReputationAmount, MentorItemLevel, MinLevel, TargetLevel, TargetLevelMin, DifficultyID, Type, "
+ "Faction, Expansion, OrderIndex, GroupID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, SubType, "
+ "MentorCharLevel FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?", CONNECTION_SYNCH);
+
+ // Light.db2
+ PrepareStatement(HOTFIX_SEL_LIGHT, "SELECT ID, PosX, PosY, PosZ, FalloffStart, FalloffEnd, MapID, LightParamsID1, LightParamsID2, LightParamsID3, "
+ "LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light ORDER BY ID DESC", CONNECTION_SYNCH);
+
+ // LiquidType.db2
+ PrepareStatement(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name, SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, "
+ "ParticleScale, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, "
+ "Float7, `Float8`, Float9, Float10, Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, Flags, "
+ "SoundID, Type, LightID, ParticleMovement, ParticleTexSlots, MaterialID, DepthTexCount1, DepthTexCount2, DepthTexCount3, DepthTexCount4, "
+ "DepthTexCount5, DepthTexCount6 FROM liquid_type ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name_lang FROM liquid_type_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// Lock.db2
PrepareStatement(HOTFIX_SEL_LOCK, "SELECT ID, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, "
"Skill5, Skill6, Skill7, Skill8, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Action1, Action2, Action3, Action4, Action5, "
@@ -463,11 +515,16 @@ void HotfixDatabaseConnection::DoPrepareStatements()
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);
+ PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags, MapType, MinimapIconScale, CorpsePosX, CorpsePosY, 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);
+ // MapDifficulty.db2
+ PrepareStatement(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message, Context, MapID, DifficultyID, RaidDurationType, MaxPlayers, LockID, "
+ "ItemBonusTreeModID FROM map_difficulty ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message_lang FROM map_difficulty_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);
@@ -477,8 +534,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH);
// MountCapability.db2
- PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, RequiredMap, Flags, "
- "RequiredAura FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, RequiredAura, RequiredSpell, SpeedModSpell, RequiredRidingSkill, RequiredArea, "
+ "RequiredMap, Flags FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH);
// MountTypeXCapability.db2
PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability"
@@ -548,7 +605,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, ItemID, QuestPackageID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH);
// QuestSort.db2
- PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName, SortOrder FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName_lang FROM quest_sort_locale WHERE locale = ?", CONNECTION_SYNCH);
// QuestV2.db2
@@ -579,13 +636,13 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" ORDER BY ID DESC", CONNECTION_SYNCH);
// SkillRaceClassInfo.db2
- PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, SkillTierID, Availability, MinLevel"
+ PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, ClassMask, SkillID, Flags, SkillTierID, Availability, MinLevel"
" FROM skill_race_class_info ORDER BY ID DESC", CONNECTION_SYNCH);
// SoundKit.db2
- PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, SoundType, Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, "
- "VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, EAXDef, DialogType, "
- "BusOverwriteID, Unk700 FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name, VolumeFloat, MinDistance, DistanceCutoff, VolumeVariationPlus, VolumeVariationMinus, "
+ "PitchVariationPlus, PitchVariationMinus, PitchAdjust, Flags, SoundEntriesAdvancedID, BusOverwriteID, SoundType, EAXDef, DialogType, Unk700"
+ " FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_KIT, "SELECT ID, Name_lang FROM sound_kit_locale WHERE locale = ?", CONNECTION_SYNCH);
// SpecializationSpells.db2
@@ -620,7 +677,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"DispelType, Mechanic, PreventionType FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellCategory.db2
- PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges FROM spell_category"
+ PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Unk703, Flags, UsesPerWeek, MaxCharges FROM spell_category"
" ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -658,6 +715,13 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_SPELL_INTERRUPTS, "SELECT ID, SpellID, AuraInterruptFlags1, AuraInterruptFlags2, ChannelInterruptFlags1, "
"ChannelInterruptFlags2, InterruptFlags, DifficultyID FROM spell_interrupts ORDER BY ID DESC", CONNECTION_SYNCH);
+ // SpellItemEnchantment.db2
+ PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, EffectSpellID1, EffectSpellID2, EffectSpellID3, Name, EffectScalingPoints1, "
+ "EffectScalingPoints2, EffectScalingPoints3, PlayerConditionID, TransmogCost, TextureFileDataID, EffectPointsMin1, EffectPointsMin2, "
+ "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ConditionID, "
+ "MinLevel, MaxLevel, ScalingClass, ScalingClassRestricted FROM spell_item_enchantment ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name_lang FROM spell_item_enchantment_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// SpellItemEnchantmentCondition.db2
PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LTOperandType1, LTOperandType2, LTOperandType3, LTOperandType4, "
"LTOperandType5, LTOperand1, LTOperand2, LTOperand3, LTOperand4, LTOperand5, Operator1, Operator2, Operator3, Operator4, Operator5, "
@@ -682,8 +746,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellPowerDifficulty.db2
- PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT ID, SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty"
- " ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty"
+ " ORDER BY SpellPowerID DESC", CONNECTION_SYNCH);
// SpellProcsPerMinute.db2
PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -706,8 +770,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellScaling.db2
- PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MaxScalingLevel FROM spell_scaling"
- " ORDER BY ID DESC", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, ScalingClass, MinScalingLevel, MaxScalingLevel"
+ " FROM spell_scaling ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellShapeshift.db2
PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, ShapeshiftMask2, "
@@ -735,6 +799,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SummonProperties.db2
PrepareStatement(HOTFIX_SEL_SUMMON_PROPERTIES, "SELECT ID, Category, Faction, Type, Slot, Flags FROM summon_properties ORDER BY ID DESC", CONNECTION_SYNCH);
+ // Talent.db2
+ PrepareStatement(HOTFIX_SEL_TALENT, "SELECT ID, SpellID, OverridesSpellID, Description, SpecID, TierID, ColumnIndex, Flags, CategoryMask1, "
+ "CategoryMask2, ClassID FROM talent ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_TALENT, "SELECT ID, Description_lang FROM talent_locale WHERE locale = ?", CONNECTION_SYNCH);
+
// TaxiNodes.db2
PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, MapID, "
"ConditionID, LearnableIndex, Flags FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -769,24 +838,45 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale"
" WHERE locale = ?", CONNECTION_SYNCH);
+ // Vehicle.db2
+ PrepareStatement(HOTFIX_SEL_VEHICLE, "SELECT ID, Flags, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, CameraFadeDistScalarMin, "
+ "CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, MsslTrgtTurnLingering, MsslTrgtPitchLingering, "
+ "MsslTrgtMouseLingering, MsslTrgtEndOpacity, MsslTrgtArcSpeed, MsslTrgtArcRepeat, MsslTrgtArcWidth, MsslTrgtImpactRadius1, "
+ "MsslTrgtImpactRadius2, MsslTrgtArcTexture, MsslTrgtImpactTexture, MsslTrgtImpactModel1, MsslTrgtImpactModel2, CameraYawOffset, "
+ "MsslTrgtImpactTexRadius, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, VehicleUIIndicatorID, PowerDisplayID1, "
+ "PowerDisplayID2, PowerDisplayID3, FlagsB, UILocomotionType FROM vehicle ORDER BY ID DESC", CONNECTION_SYNCH);
+
// VehicleSeat.db2
PrepareStatement(HOTFIX_SEL_VEHICLE_SEAT, "SELECT ID, Flags1, Flags2, Flags3, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, "
"EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, EnterMinArcHeight, EnterMaxArcHeight, ExitPreDelay, ExitSpeed, "
"ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, PassengerYaw, PassengerPitch, PassengerRoll, "
- "VehicleEnterAnimDelay, VehicleExitAnimDelay, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, "
- "CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, "
- "CameraSeatZoomMax, UISkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, "
- "ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterUISoundID, ExitUISoundID, "
- "EnterAnimKitID, RideAnimKitID, ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, "
+ "VehicleEnterAnimDelay, VehicleExitAnimDelay, EnterUISoundID, ExitUISoundID, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, "
+ "CameraExitingDuration, CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, "
+ "CameraSeatZoomMin, CameraSeatZoomMax, UISkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, "
+ "RideUpperAnimLoop, ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterAnimKitID, "
+ "RideAnimKitID, ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, "
"PassengerAttachmentID, VehicleEnterAnimBone, VehicleExitAnimBone, VehicleRideAnimLoopBone, VehicleAbilityDisplay FROM vehicle_seat"
" ORDER BY ID DESC", CONNECTION_SYNCH);
+ // WmoAreaTable.db2
+ PrepareStatement(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT ID, WMOGroupID, AreaName, WMOID, AmbienceID, ZoneMusic, IntroSound, AreaTableID, "
+ "UWIntroSound, UWAmbience, NameSet, SoundProviderPref, SoundProviderPrefUnderwater, Flags, UWZoneMusic FROM wmo_area_table ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT ID, AreaName_lang FROM wmo_area_table_locale WHERE locale = ?", CONNECTION_SYNCH);
+
+ // WorldMapArea.db2
+ PrepareStatement(HOTFIX_SEL_WORLD_MAP_AREA, "SELECT ID, AreaName, LocLeft, LocRight, LocTop, LocBottom, MapID, AreaID, DisplayMapID, "
+ "DefaultDungeonFloor, ParentWorldMapID, Flags, PlayerConditionID, LevelRangeMin, LevelRangeMax FROM world_map_area ORDER BY ID DESC", CONNECTION_SYNCH);
+
// WorldMapOverlay.db2
PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureWidth, "
- "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID FROM world_map_overlay"
+ "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID, Flags FROM world_map_overlay"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// WorldMapTransforms.db2
PrepareStatement(HOTFIX_SEL_WORLD_MAP_TRANSFORMS, "SELECT ID, RegionMinX, RegionMinY, RegionMinZ, RegionMaxX, RegionMaxY, RegionMaxZ, "
"RegionOffsetX, RegionOffsetY, RegionScale, MapID, NewMapID, NewDungeonMapID, NewAreaID, Flags FROM world_map_transforms ORDER BY ID DESC", CONNECTION_SYNCH);
+
+ // WorldSafeLocs.db2
+ PrepareStatement(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, LocX, LocY, LocZ, Facing, AreaName, MapID FROM world_safe_locs ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName_lang FROM world_safe_locs_locale WHERE locale = ?", CONNECTION_SYNCH);
}
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index 0c915c06b92..f9ef5610ca3 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -51,6 +51,8 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_BANK_BAG_SLOT_PRICES,
+ HOTFIX_SEL_BANNED_ADDONS,
+
HOTFIX_SEL_BARBER_SHOP_STYLE,
HOTFIX_SEL_BARBER_SHOP_STYLE_LOCALE,
@@ -63,9 +65,14 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_BATTLE_PET_SPECIES_STATE,
+ HOTFIX_SEL_BATTLEMASTER_LIST,
+ HOTFIX_SEL_BATTLEMASTER_LIST_LOCALE,
+
HOTFIX_SEL_BROADCAST_TEXT,
HOTFIX_SEL_BROADCAST_TEXT_LOCALE,
+ HOTFIX_SEL_CHAR_SECTIONS,
+
HOTFIX_SEL_CHAR_START_OUTFIT,
HOTFIX_SEL_CHAR_TITLES,
@@ -74,6 +81,9 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_CHAT_CHANNELS,
HOTFIX_SEL_CHAT_CHANNELS_LOCALE,
+ HOTFIX_SEL_CHR_CLASSES,
+ HOTFIX_SEL_CHR_CLASSES_LOCALE,
+
HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES,
HOTFIX_SEL_CHR_RACES,
@@ -91,6 +101,8 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_CREATURE_FAMILY,
HOTFIX_SEL_CREATURE_FAMILY_LOCALE,
+ HOTFIX_SEL_CREATURE_MODEL_DATA,
+
HOTFIX_SEL_CREATURE_TYPE,
HOTFIX_SEL_CREATURE_TYPE_LOCALE,
@@ -123,14 +135,16 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_EMOTES_TEXT_SOUND,
+ HOTFIX_SEL_FACTION,
+ HOTFIX_SEL_FACTION_LOCALE,
+
+ HOTFIX_SEL_FACTION_TEMPLATE,
+
HOTFIX_SEL_GAMEOBJECTS,
HOTFIX_SEL_GAMEOBJECTS_LOCALE,
HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO,
- HOTFIX_SEL_GAME_TABLES,
- HOTFIX_SEL_GAME_TABLES_LOCALE,
-
HOTFIX_SEL_GARR_ABILITY,
HOTFIX_SEL_GARR_ABILITY_LOCALE,
@@ -249,12 +263,18 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_ITEM_SPEC_OVERRIDE,
- HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES,
-
HOTFIX_SEL_ITEM_X_BONUS_TREE,
HOTFIX_SEL_KEY_CHAIN,
+ HOTFIX_SEL_LFG_DUNGEONS,
+ HOTFIX_SEL_LFG_DUNGEONS_LOCALE,
+
+ HOTFIX_SEL_LIGHT,
+
+ HOTFIX_SEL_LIQUID_TYPE,
+ HOTFIX_SEL_LIQUID_TYPE_LOCALE,
+
HOTFIX_SEL_LOCK,
HOTFIX_SEL_MAIL_TEMPLATE,
@@ -263,6 +283,9 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_MAP,
HOTFIX_SEL_MAP_LOCALE,
+ HOTFIX_SEL_MAP_DIFFICULTY,
+ HOTFIX_SEL_MAP_DIFFICULTY_LOCALE,
+
HOTFIX_SEL_MODIFIER_TREE,
HOTFIX_SEL_MOUNT,
@@ -359,6 +382,9 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_SPELL_INTERRUPTS,
+ HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT,
+ HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_LOCALE,
+
HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION,
HOTFIX_SEL_SPELL_LEARN_SPELL,
@@ -397,6 +423,9 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_SUMMON_PROPERTIES,
+ HOTFIX_SEL_TALENT,
+ HOTFIX_SEL_TALENT_LOCALE,
+
HOTFIX_SEL_TAXI_NODES,
HOTFIX_SEL_TAXI_NODES_LOCALE,
@@ -417,12 +446,22 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_UNIT_POWER_BAR,
HOTFIX_SEL_UNIT_POWER_BAR_LOCALE,
+ HOTFIX_SEL_VEHICLE,
+
HOTFIX_SEL_VEHICLE_SEAT,
+ HOTFIX_SEL_WMO_AREA_TABLE,
+ HOTFIX_SEL_WMO_AREA_TABLE_LOCALE,
+
+ HOTFIX_SEL_WORLD_MAP_AREA,
+
HOTFIX_SEL_WORLD_MAP_OVERLAY,
HOTFIX_SEL_WORLD_MAP_TRANSFORMS,
+ HOTFIX_SEL_WORLD_SAFE_LOCS,
+ HOTFIX_SEL_WORLD_SAFE_LOCS_LOCALE,
+
MAX_HOTFIXDATABASE_STATEMENTS
};
diff --git a/src/server/game/Addons/AddonMgr.cpp b/src/server/game/Addons/AddonMgr.cpp
index c9aa3a7966a..55728de5bd1 100644
--- a/src/server/game/Addons/AddonMgr.cpp
+++ b/src/server/game/Addons/AddonMgr.cpp
@@ -18,7 +18,7 @@
#include "AddonMgr.h"
#include "DatabaseEnv.h"
-#include "DBCStores.h"
+#include "DB2Stores.h"
#include "Log.h"
#include "Timer.h"
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index 3e2ec0ef7ff..53cc4d57033 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -23,7 +23,6 @@
#include "WorldPacket.h"
#include "WorldSession.h"
#include "DatabaseEnv.h"
-#include "DBCStores.h"
#include "ScriptMgr.h"
#include "AccountMgr.h"
#include "AuctionHouseMgr.h"
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index 160cab40771..233459de97b 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
@@ -21,7 +21,6 @@
#include "Common.h"
#include "DatabaseEnv.h"
-#include "DBCStructure.h"
#include "ObjectGuid.h"
#include "AuctionHousePackets.h"
#include <set>
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
index d7e17b266f3..d5d5816f4c1 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
@@ -16,7 +16,6 @@
*/
#include "Log.h"
-#include "DBCStores.h"
#include "ObjectMgr.h"
#include "AuctionHouseMgr.h"
#include "AuctionHouseBotSeller.h"
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index a35d9d3ad5a..8585aa42a03 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -446,7 +446,7 @@ bool BattlegroundMgr::CreateBattleground(BattlegroundTemplate const* bgTemplate)
}
bg->SetMapId(bgTemplate->BattlemasterEntry->MapID[0]);
- bg->SetName(bgTemplate->BattlemasterEntry->Name_lang);
+ bg->SetName(bgTemplate->BattlemasterEntry->Name->Str[sWorld->GetDefaultDbcLocale()]);
bg->SetInstanceID(0);
bg->SetArenaorBGType(bgTemplate->IsArena());
bg->SetMinPlayersPerTeam(bgTemplate->MinPlayersPerTeam);
diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp
index c11c25219a5..483981261be 100644
--- a/src/server/game/Chat/ChatLink.cpp
+++ b/src/server/game/Chat/ChatLink.cpp
@@ -19,7 +19,6 @@
#include "SpellMgr.h"
#include "ObjectMgr.h"
#include "SpellInfo.h"
-#include "DBCStores.h"
#include "AchievementMgr.h"
// Supported shift-links (client generated and server side)
diff --git a/src/server/game/Combat/HostileRefManager.cpp b/src/server/game/Combat/HostileRefManager.cpp
index 0265a4c05b2..4da808c83e5 100644
--- a/src/server/game/Combat/HostileRefManager.cpp
+++ b/src/server/game/Combat/HostileRefManager.cpp
@@ -19,7 +19,6 @@
#include "HostileRefManager.h"
#include "ThreatManager.h"
#include "Unit.h"
-#include "DBCStructure.h"
#include "SpellInfo.h"
HostileRefManager::~HostileRefManager()
diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp
index 62d5ecfa88a..21957198bac 100644
--- a/src/server/game/Conditions/DisableMgr.cpp
+++ b/src/server/game/Conditions/DisableMgr.cpp
@@ -144,11 +144,11 @@ void LoadDisables()
break;
case MAP_INSTANCE:
case MAP_RAID:
- if (flags & DUNGEON_STATUSFLAG_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_HEROIC))
+ if (flags & DUNGEON_STATUSFLAG_HEROIC && !sDB2Manager.GetMapDifficultyData(entry, DIFFICULTY_HEROIC))
flags -= DUNGEON_STATUSFLAG_HEROIC;
- if (flags & RAID_STATUSFLAG_10MAN_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_10_HC))
+ if (flags & RAID_STATUSFLAG_10MAN_HEROIC && !sDB2Manager.GetMapDifficultyData(entry, DIFFICULTY_10_HC))
flags -= RAID_STATUSFLAG_10MAN_HEROIC;
- if (flags & RAID_STATUSFLAG_25MAN_HEROIC && !GetMapDifficultyData(entry, DIFFICULTY_25_HC))
+ if (flags & RAID_STATUSFLAG_25MAN_HEROIC && !sDB2Manager.GetMapDifficultyData(entry, DIFFICULTY_25_HC))
flags -= RAID_STATUSFLAG_25MAN_HEROIC;
if (!flags)
isFlagInvalid = true;
@@ -334,7 +334,7 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags
{
uint8 disabledModes = itr->second.flags;
Difficulty targetDifficulty = player->GetDifficultyID(mapEntry);
- GetDownscaledMapDifficultyData(entry, targetDifficulty);
+ sDB2Manager.GetDownscaledMapDifficultyData(entry, targetDifficulty);
switch (targetDifficulty)
{
case DIFFICULTY_NORMAL:
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index f985a266e29..7899b4ada83 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -18,8 +18,8 @@
#include "DB2Stores.h"
#include "Common.h"
#include "Containers.h"
-#include "DBCStores.h"
#include "DB2fmt.h"
+#include "HotfixDatabase.h"
#include "Log.h"
#include "TransportMgr.h"
#include "World.h"
@@ -32,15 +32,19 @@ DB2Storage<AreaTriggerEntry> sAreaTriggerStore("AreaTrigger.d
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);
+DB2Storage<BannedAddOnsEntry> sBannedAddOnsStore("BannedAddOns.db2", BannedAddOnsFormat, HOTFIX_SEL_BANNED_ADDONS);
DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleFormat, HOTFIX_SEL_BARBER_SHOP_STYLE);
DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityFormat, HOTFIX_SEL_BATTLE_PET_BREED_QUALITY);
DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateFormat, HOTFIX_SEL_BATTLE_PET_BREED_STATE);
DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesFormat, HOTFIX_SEL_BATTLE_PET_SPECIES);
DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateFormat, HOTFIX_SEL_BATTLE_PET_SPECIES_STATE);
+DB2Storage<BattlemasterListEntry> sBattlemasterListStore("BattlemasterList.db2", BattlemasterListFormat, HOTFIX_SEL_BATTLEMASTER_LIST);
DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT);
-DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS);
+DB2Storage<CharSectionsEntry> sCharSectionsStore("CharSections.db2", CharSectionsFormat, HOTFIX_SEL_CHAR_SECTIONS);
DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT);
DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2", CharTitlesFormat, HOTFIX_SEL_CHAR_TITLES);
+DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsFormat, HOTFIX_SEL_CHAT_CHANNELS);
+DB2Storage<ChrClassesEntry> sChrClassesStore("ChrClasses.db2", ChrClassesFormat, HOTFIX_SEL_CHR_CLASSES);
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);
@@ -48,6 +52,7 @@ DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("Cinema
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<CreatureModelDataEntry> sCreatureModelDataStore("CreatureModelData.db2", CreatureModelDataFormat, HOTFIX_SEL_CREATURE_MODEL_DATA);
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);
@@ -61,9 +66,10 @@ DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("Durabil
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<FactionEntry> sFactionStore("Faction.db2", FactionFormat, HOTFIX_SEL_FACTION);
+DB2Storage<FactionTemplateEntry> sFactionTemplateStore("FactionTemplate.db2", FactionTemplateFormat, HOTFIX_SEL_FACTION_TEMPLATE);
DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS);
DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoFormat, HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO);
-DB2Storage<GameTablesEntry> sGameTablesStore("GameTables.db2", GameTablesFormat, HOTFIX_SEL_GAME_TABLES);
DB2Storage<GarrAbilityEntry> sGarrAbilityStore("GarrAbility.db2", GarrAbilityFormat, HOTFIX_SEL_GARR_ABILITY);
DB2Storage<GarrBuildingEntry> sGarrBuildingStore("GarrBuilding.db2", GarrBuildingFormat, HOTFIX_SEL_GARR_BUILDING);
DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstFormat, HOTFIX_SEL_GARR_BUILDING_PLOT_INST);
@@ -116,12 +122,15 @@ DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell
DB2SparseStorage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE);
DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecFormat, HOTFIX_SEL_ITEM_SPEC);
DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideFormat, HOTFIX_SEL_ITEM_SPEC_OVERRIDE);
-DB2Storage<ItemToBattlePetSpeciesEntry> sItemToBattlePetSpeciesStore("ItemToBattlePetSpecies.db2", ItemToBattlePetSpeciesFormat, HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES);
DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeFormat, HOTFIX_SEL_ITEM_X_BONUS_TREE);
DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN);
+DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsFormat, HOTFIX_SEL_LFG_DUNGEONS);
+DB2Storage<LightEntry> sLightStore("Light.db2", LightFormat, HOTFIX_SEL_LIGHT);
+DB2Storage<LiquidTypeEntry> sLiquidTypeStore("LiquidType.db2", LiquidTypeFormat, HOTFIX_SEL_LIQUID_TYPE);
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<MapDifficultyEntry> sMapDifficultyStore("MapDifficulty.db2", MapDifficultyFormat, HOTFIX_SEL_MAP_DIFFICULTY);
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);
@@ -165,6 +174,7 @@ DB2Storage<SpellEffectScalingEntry> sSpellEffectScalingStore("SpellE
DB2Storage<SpellEquippedItemsEntry> sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsFormat, HOTFIX_SEL_SPELL_EQUIPPED_ITEMS);
DB2Storage<SpellFocusObjectEntry> sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectFormat, HOTFIX_SEL_SPELL_FOCUS_OBJECT);
DB2Storage<SpellInterruptsEntry> sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsFormat, HOTFIX_SEL_SPELL_INTERRUPTS);
+DB2Storage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore("SpellItemEnchantment.db2", SpellItemEnchantmentFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT);
DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION);
DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL);
DB2Storage<SpellLevelsEntry> sSpellLevelsStore("SpellLevels.db2", SpellLevelsFormat, HOTFIX_SEL_SPELL_LEVELS);
@@ -183,6 +193,7 @@ DB2Storage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore("S
DB2Storage<SpellTotemsEntry> sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS);
DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualFormat, HOTFIX_SEL_SPELL_X_SPELL_VISUAL);
DB2Storage<SummonPropertiesEntry> sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesFormat, HOTFIX_SEL_SUMMON_PROPERTIES);
+DB2Storage<TalentEntry> sTalentStore("Talent.db2", TalentFormat, HOTFIX_SEL_TALENT);
DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES);
DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH);
DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE);
@@ -191,9 +202,13 @@ DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyFormat,
DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationFormat, HOTFIX_SEL_TRANSPORT_ANIMATION);
DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationFormat, HOTFIX_SEL_TRANSPORT_ROTATION);
DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarFormat, HOTFIX_SEL_UNIT_POWER_BAR);
+DB2Storage<VehicleEntry> sVehicleStore("Vehicle.db2", VehicleFormat, HOTFIX_SEL_VEHICLE);
DB2Storage<VehicleSeatEntry> sVehicleSeatStore("VehicleSeat.db2", VehicleSeatFormat, HOTFIX_SEL_VEHICLE_SEAT);
+DB2Storage<WMOAreaTableEntry> sWMOAreaTableStore("WMOAreaTable.db2", WMOAreaTableFormat, HOTFIX_SEL_WMO_AREA_TABLE);
+DB2Storage<WorldMapAreaEntry> sWorldMapAreaStore("WorldMapArea.db2", WorldMapAreaFormat, HOTFIX_SEL_WORLD_MAP_AREA);
DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayFormat, HOTFIX_SEL_WORLD_MAP_OVERLAY);
DB2Storage<WorldMapTransformsEntry> sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsFormat, HOTFIX_SEL_WORLD_MAP_TRANSFORMS);
+DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsFormat, HOTFIX_SEL_WORLD_SAFE_LOCS);
TaxiMask sTaxiNodesMask;
TaxiMask sOldContinentsNodesMask;
@@ -216,7 +231,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D
++DB2FilesCount;
-#define EXPECTED_DB2_BUILD 20950
+#define EXPECTED_DB2_BUILD 21414
if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale))
{
@@ -243,7 +258,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D
else
{
// sort problematic db2 to (1) non compatible and (2) nonexistent
- if (FILE* f = fopen((db2Path + storage->GetFileName()).c_str(), "rb"))
+ if (FILE* f = fopen((db2Path + localeNames[defaultLocale] + '/' + storage->GetFileName()).c_str(), "rb"))
{
std::ostringstream stream;
stream << storage->GetFileName() << " exists, and has " << storage->GetFieldCount() << " field(s) (expected " << strlen(storage->GetFormat())
@@ -278,21 +293,25 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sAchievementStore);
LOAD_DB2(sAnimKitStore);
- LOAD_DB2(sArmorLocationStore);
LOAD_DB2(sAreaGroupMemberStore);
LOAD_DB2(sAreaTableStore);
LOAD_DB2(sAreaTriggerStore);
+ LOAD_DB2(sArmorLocationStore);
+ LOAD_DB2(sAuctionHouseStore);
LOAD_DB2(sBankBagSlotPricesStore);
+ LOAD_DB2(sBannedAddOnsStore);
+ LOAD_DB2(sBarberShopStyleStore);
LOAD_DB2(sBattlePetBreedQualityStore);
LOAD_DB2(sBattlePetBreedStateStore);
- LOAD_DB2(sAuctionHouseStore);
- LOAD_DB2(sBarberShopStyleStore);
LOAD_DB2(sBattlePetSpeciesStore);
LOAD_DB2(sBattlePetSpeciesStateStore);
+ LOAD_DB2(sBattlemasterListStore);
LOAD_DB2(sBroadcastTextStore);
+ LOAD_DB2(sCharSectionsStore);
LOAD_DB2(sCharStartOutfitStore);
LOAD_DB2(sCharTitlesStore);
LOAD_DB2(sChatChannelsStore);
+ LOAD_DB2(sChrClassesStore);
LOAD_DB2(sChrClassesXPowerTypesStore);
LOAD_DB2(sChrRacesStore);
LOAD_DB2(sChrSpecializationStore);
@@ -300,6 +319,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sCreatureDisplayInfoStore);
LOAD_DB2(sCreatureDisplayInfoExtraStore);
LOAD_DB2(sCreatureFamilyStore);
+ LOAD_DB2(sCreatureModelDataStore);
LOAD_DB2(sCreatureTypeStore);
LOAD_DB2(sCriteriaStore);
LOAD_DB2(sCriteriaTreeStore);
@@ -313,20 +333,21 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sEmotesStore);
LOAD_DB2(sEmotesTextStore);
LOAD_DB2(sEmotesTextSoundStore);
+ LOAD_DB2(sFactionStore);
+ LOAD_DB2(sFactionTemplateStore);
LOAD_DB2(sGameObjectsStore);
LOAD_DB2(sGameObjectDisplayInfoStore);
- LOAD_DB2(sGameTablesStore);
LOAD_DB2(sGarrAbilityStore);
- LOAD_DB2(sGarrBuildingPlotInstStore);
LOAD_DB2(sGarrBuildingStore);
+ LOAD_DB2(sGarrBuildingPlotInstStore);
LOAD_DB2(sGarrClassSpecStore);
LOAD_DB2(sGarrFollowerStore);
LOAD_DB2(sGarrFollowerXAbilityStore);
LOAD_DB2(sGarrPlotBuildingStore);
- LOAD_DB2(sGarrPlotInstanceStore);
LOAD_DB2(sGarrPlotStore);
- LOAD_DB2(sGarrSiteLevelPlotInstStore);
+ LOAD_DB2(sGarrPlotInstanceStore);
LOAD_DB2(sGarrSiteLevelStore);
+ LOAD_DB2(sGarrSiteLevelPlotInstStore);
LOAD_DB2(sGemPropertiesStore);
LOAD_DB2(sGlyphPropertiesStore);
LOAD_DB2(sGlyphSlotStore);
@@ -350,12 +371,13 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sItemClassStore);
LOAD_DB2(sItemCurrencyCostStore);
LOAD_DB2(sItemDamageAmmoStore);
- LOAD_DB2(sItemDamageOneHandCasterStore);
LOAD_DB2(sItemDamageOneHandStore);
- LOAD_DB2(sItemDamageTwoHandCasterStore);
+ LOAD_DB2(sItemDamageOneHandCasterStore);
LOAD_DB2(sItemDamageTwoHandStore);
+ LOAD_DB2(sItemDamageTwoHandCasterStore);
LOAD_DB2(sItemDisenchantLootStore);
LOAD_DB2(sItemEffectStore);
+ LOAD_DB2(sItemStore);
LOAD_DB2(sItemExtendedCostStore);
LOAD_DB2(sItemLimitCategoryStore);
LOAD_DB2(sItemModifiedAppearanceStore);
@@ -365,15 +387,17 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sItemSetStore);
LOAD_DB2(sItemSetSpellStore);
LOAD_DB2(sItemSparseStore);
- LOAD_DB2(sItemSpecOverrideStore);
LOAD_DB2(sItemSpecStore);
- LOAD_DB2(sItemStore);
- LOAD_DB2(sItemToBattlePetSpeciesStore);
+ LOAD_DB2(sItemSpecOverrideStore);
LOAD_DB2(sItemXBonusTreeStore);
LOAD_DB2(sKeyChainStore);
+ LOAD_DB2(sLfgDungeonsStore);
+ LOAD_DB2(sLightStore);
+ LOAD_DB2(sLiquidTypeStore);
LOAD_DB2(sLockStore);
LOAD_DB2(sMailTemplateStore);
LOAD_DB2(sMapStore);
+ LOAD_DB2(sMapDifficultyStore);
LOAD_DB2(sModifierTreeStore);
LOAD_DB2(sMountCapabilityStore);
LOAD_DB2(sMountStore);
@@ -395,6 +419,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sQuestSortStore);
LOAD_DB2(sQuestV2Store);
LOAD_DB2(sQuestXPStore);
+ LOAD_DB2(sRandPropPointsStore);
LOAD_DB2(sScalingStatDistributionStore);
LOAD_DB2(sSkillLineStore);
LOAD_DB2(sSkillLineAbilityStore);
@@ -411,11 +436,12 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sSpellClassOptionsStore);
LOAD_DB2(sSpellCooldownsStore);
LOAD_DB2(sSpellDurationStore);
- LOAD_DB2(sSpellEffectScalingStore);
LOAD_DB2(sSpellEffectStore);
+ LOAD_DB2(sSpellEffectScalingStore);
LOAD_DB2(sSpellEquippedItemsStore);
LOAD_DB2(sSpellFocusObjectStore);
LOAD_DB2(sSpellInterruptsStore);
+ LOAD_DB2(sSpellItemEnchantmentStore);
LOAD_DB2(sSpellItemEnchantmentConditionStore);
LOAD_DB2(sSpellLearnSpellStore);
LOAD_DB2(sSpellLevelsStore);
@@ -428,29 +454,38 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sSpellRangeStore);
LOAD_DB2(sSpellReagentsStore);
LOAD_DB2(sSpellScalingStore);
- LOAD_DB2(sSpellShapeshiftFormStore);
LOAD_DB2(sSpellShapeshiftStore);
+ LOAD_DB2(sSpellShapeshiftFormStore);
LOAD_DB2(sSpellTargetRestrictionsStore);
LOAD_DB2(sSpellTotemsStore);
LOAD_DB2(sSpellXSpellVisualStore);
LOAD_DB2(sSummonPropertiesStore);
+ LOAD_DB2(sTalentStore);
LOAD_DB2(sTaxiNodesStore);
- LOAD_DB2(sTaxiPathNodeStore);
LOAD_DB2(sTaxiPathStore);
+ LOAD_DB2(sTaxiPathNodeStore);
LOAD_DB2(sTotemCategoryStore);
LOAD_DB2(sToyStore);
LOAD_DB2(sTransportAnimationStore);
LOAD_DB2(sTransportRotationStore);
LOAD_DB2(sUnitPowerBarStore);
+ LOAD_DB2(sVehicleStore);
LOAD_DB2(sVehicleSeatStore);
+ LOAD_DB2(sWMOAreaTableStore);
+ LOAD_DB2(sWorldMapAreaStore);
LOAD_DB2(sWorldMapOverlayStore);
LOAD_DB2(sWorldMapTransformsStore);
+ LOAD_DB2(sWorldSafeLocsStore);
#undef LOAD_DB2
for (AreaGroupMemberEntry const* areaGroupMember : sAreaGroupMemberStore)
_areaGroupMembers[areaGroupMember->AreaGroupID].push_back(areaGroupMember->AreaID);
+ for (CharSectionsEntry const* charSection : sCharSectionsStore)
+ if (charSection->Race && ((1 << (charSection->Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0) //ignore Nonplayable races
+ _charSections.insert({ charSection->GenType | (charSection->Gender << 8) | (charSection->Race << 16), charSection });
+
for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore)
_charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit;
@@ -476,14 +511,11 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
}
memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex));
- for (uint32 i = 0; i < sChrSpecializationStore.GetNumRows(); ++i)
+ for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore)
{
- if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(i))
- {
- ASSERT(chrSpec->ClassID < MAX_CLASSES);
- ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS);
- _chrSpecializationsByIndex[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec;
- }
+ ASSERT(chrSpec->ClassID < MAX_CLASSES);
+ ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS);
+ _chrSpecializationsByIndex[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec;
}
ASSERT(MAX_DIFFICULTY >= sDifficultyStore.GetNumRows(),
@@ -493,6 +525,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (EmotesTextSoundEntry const* emoteTextSound : sEmotesTextSoundStore)
_emoteTextSounds[EmotesTextSoundContainer::key_type(emoteTextSound->EmotesTextId, emoteTextSound->RaceId, emoteTextSound->SexId, emoteTextSound->ClassId)] = emoteTextSound;
+ for (FactionEntry const* faction : sFactionStore)
+ if (faction->ParentFactionID)
+ _factionTeams[faction->ParentFactionID].push_back(faction->ID);
+
for (GameObjectDisplayInfoEntry const* gameObjectDisplayInfo : sGameObjectDisplayInfoStore)
{
if (gameObjectDisplayInfo->GeoBoxMax.X < gameObjectDisplayInfo->GeoBoxMin.X)
@@ -530,11 +566,11 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID))
_itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID;
- for (ItemSetSpellEntry const* entry : sItemSetSpellStore)
- _itemSetSpells[entry->ItemSetID].push_back(entry);
+ for (ItemSetSpellEntry const* itemSetSpell : sItemSetSpellStore)
+ _itemSetSpells[itemSetSpell->ItemSetID].push_back(itemSetSpell);
- for (ItemSpecOverrideEntry const* entry : sItemSpecOverrideStore)
- _itemSpecOverrides[entry->ItemID].push_back(entry);
+ for (ItemSpecOverrideEntry const* itemSpecOverride : sItemSpecOverrideStore)
+ _itemSpecOverrides[itemSpecOverride->ItemID].push_back(itemSpecOverride);
for (ItemXBonusTreeEntry const* itemBonusTreeAssignment : sItemXBonusTreeStore)
_itemToBonusTree.insert({ itemBonusTreeAssignment->ItemID, itemBonusTreeAssignment->BonusTreeID });
@@ -549,14 +585,18 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
_heirloomCurvePoints[curvePoint->CurveID][curvePoint->Index] = curvePoint;
}
+ for (MapDifficultyEntry const* entry : sMapDifficultyStore)
+ _mapDifficulties[entry->MapID][entry->DifficultyID] = entry;
+ _mapDifficulties[0][0] = _mapDifficulties[1][0]; // map 0 is missing from MapDifficulty.dbc so we cheat a bit
+
for (MountEntry const* mount : sMountStore)
_mountsBySpellId[mount->SpellId] = mount;
- for (MountTypeXCapabilityEntry const* mount : sMountTypeXCapabilityStore)
- _mountCapabilitiesByType[mount->MountTypeID].insert(mount);
+ for (MountTypeXCapabilityEntry const* mountTypeCapability : sMountTypeXCapabilityStore)
+ _mountCapabilitiesByType[mountTypeCapability->MountTypeID].insert(mountTypeCapability);
- for (NameGenEntry const* entry : sNameGenStore)
- _nameGenData[entry->Race][entry->Sex].push_back(entry);
+ for (NameGenEntry const* nameGen : sNameGenStore)
+ _nameGenData[nameGen->Race][nameGen->Sex].push_back(nameGen);
for (NamesProfanityEntry const* namesProfanity : sNamesProfanityStore)
{
@@ -633,6 +673,15 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (SpellProcsPerMinuteModEntry const* ppmMod : sSpellProcsPerMinuteModStore)
_spellProcsPerMinuteMods[ppmMod->SpellProcsPerMinuteID].push_back(ppmMod);
+ for (TalentEntry const* talentInfo : sTalentStore)
+ {
+ ASSERT(talentInfo->ClassID < MAX_CLASSES);
+ ASSERT(talentInfo->TierID < MAX_TALENT_TIERS, "MAX_TALENT_TIERS must be at least %u", MAX_TALENT_TIERS);
+ ASSERT(talentInfo->ColumnIndex < MAX_TALENT_COLUMNS, "MAX_TALENT_COLUMNS must be at least %u", MAX_TALENT_COLUMNS);
+
+ _talentsByPosition[talentInfo->ClassID][talentInfo->TierID][talentInfo->ColumnIndex].push_back(talentInfo);
+ }
+
for (TaxiPathEntry const* entry : sTaxiPathStore)
sTaxiPathSetBySource[entry->From][entry->To] = TaxiPathBySourceAndDestination(entry->ID, entry->Cost);
@@ -699,6 +748,12 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (ToyEntry const* toy : sToyStore)
_toys.insert(toy->ItemID);
+ for (WMOAreaTableEntry const* entry : sWMOAreaTableStore)
+ _wmoAreaTableLookup[WMOAreaTableKey(entry->WMOID, entry->NameSet, entry->WMOGroupID)] = entry;
+
+ for (WorldMapAreaEntry const* worldMapArea : sWorldMapAreaStore)
+ _worldMapAreaByAreaID[worldMapArea->AreaID] = worldMapArea;
+
// error checks
if (bad_db2_files.size() >= DB2FilesCount)
{
@@ -716,13 +771,13 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
}
// Check loaded DB2 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)
- !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)
- !sMapStore.LookupEntry(1602) || // last map added in 7.0.1 (20810)
- !sSpellStore.LookupEntry(207511)) // last spell added in 7.0.1 (20810)
+ if (!sAreaTableStore.LookupEntry(8343) || // last area (areaflag) added in 7.0.3 (21414)
+ !sCharTitlesStore.LookupEntry(480) || // last char title added in 7.0.3 (21414)
+ !sGemPropertiesStore.LookupEntry(3217) || // last gem property added in 7.0.3 (21414)
+ !sItemStore.LookupEntry(139410) || // last item added in 7.0.3 (21414)
+ !sItemExtendedCostStore.LookupEntry(6038) || // last item extended cost added in 7.0.3 (21414)
+ !sMapStore.LookupEntry(1632) || // last map added in 7.0.3 (21414)
+ !sSpellStore.LookupEntry(220019)) // last spell added in 7.0.3 (21414)
{
TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client.");
exit(1);
@@ -815,6 +870,16 @@ char const* DB2Manager::GetBroadcastTextValue(BroadcastTextEntry const* broadcas
return broadcastText->MaleText->Str[DEFAULT_LOCALE];
}
+CharSectionsEntry const* DB2Manager::GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color) const
+{
+ auto eqr = _charSections.equal_range(uint32(genType) | uint32(gender << 8) | uint32(race << 16));
+ for (auto itr = eqr.first; itr != eqr.second; ++itr)
+ if (itr->second->Type == type && itr->second->Color == color)
+ return itr->second;
+
+ return nullptr;
+}
+
CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const
{
auto itr = _charStartOutfits.find(race | (class_ << 8) | (gender << 16));
@@ -824,9 +889,16 @@ CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint
return itr->second;
}
-ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 class_, uint32 index) const
+char const* DB2Manager::GetClassName(uint8 class_, LocaleConstant locale /*= DEFAULT_LOCALE*/)
{
- return _chrSpecializationsByIndex[class_][index];
+ ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_);
+ if (!classEntry)
+ return "";
+
+ if (classEntry->Name->Str[locale][0] != '\0')
+ return classEntry->Name->Str[locale];
+
+ return classEntry->Name->Str[DEFAULT_LOCALE];
}
uint32 DB2Manager::GetPowerIndexByClass(uint32 powerType, uint32 classId) const
@@ -846,6 +918,11 @@ char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEF
return raceEntry->Name->Str[DEFAULT_LOCALE];
}
+ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 class_, uint32 index) const
+{
+ return _chrSpecializationsByIndex[class_][index];
+}
+
char const* DB2Manager::GetCreatureFamilyPetName(uint32 petfamily, uint32 locale)
{
if (!petfamily)
@@ -871,6 +948,15 @@ EmotesTextSoundEntry const* DB2Manager::GetTextSoundEmoteFor(uint32 emote, uint8
return nullptr;
}
+std::vector<uint32> const* DB2Manager::GetFactionTeamList(uint32 faction) const
+{
+ auto itr = _factionTeams.find(faction);
+ if (itr != _factionTeams.end())
+ return &itr->second;
+
+ return nullptr;
+}
+
uint32 DB2Manager::GetHeirloomItemLevel(uint32 curveId, uint32 level) const
{
// Assuming linear item level scaling for heirlooms
@@ -964,21 +1050,102 @@ std::vector<ItemSpecOverrideEntry const*> const* DB2Manager::GetItemSpecOverride
return nullptr;
}
-std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const
+LfgDungeonsEntry const* DB2Manager::GetLfgDungeon(uint32 mapId, Difficulty difficulty)
{
- ASSERT(gender < GENDER_NONE);
- auto ritr = _nameGenData.find(race);
- if (ritr == _nameGenData.end())
- return "";
+ for (LfgDungeonsEntry const* dungeon : sLfgDungeonsStore)
+ if (dungeon->MapID == int32(mapId) && Difficulty(dungeon->DifficultyID) == difficulty)
+ return dungeon;
- if (ritr->second[gender].empty())
- return "";
+ return nullptr;
+}
- LocalizedString* data = Trinity::Containers::SelectRandomContainerElement(ritr->second[gender])->Name;
- if (*data->Str[locale] != '\0')
- return data->Str[locale];
+uint32 DB2Manager::GetDefaultMapLight(uint32 mapId)
+{
+ for (int32 i = sLightStore.GetNumRows(); i >= 0; --i)
+ {
+ LightEntry const* light = sLightStore.LookupEntry(uint32(i));
+ if (!light)
+ continue;
- return data->Str[sWorld->GetDefaultDbcLocale()];
+ if (light->MapID == mapId && light->Pos.X == 0.0f && light->Pos.Y == 0.0f && light->Pos.Z == 0.0f)
+ return uint32(i);
+ }
+
+ return 0;
+}
+
+uint32 DB2Manager::GetLiquidFlags(uint32 liquidType)
+{
+ if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType))
+ return 1 << liq->Type;
+
+ return 0;
+}
+
+MapDifficultyEntry const* DB2Manager::GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty /*= nullptr*/) const
+{
+ auto itr = _mapDifficulties.find(mapId);
+ if (itr == _mapDifficulties.end())
+ return nullptr;
+
+ if (itr->second.empty())
+ return nullptr;
+
+ for (auto& p : itr->second)
+ {
+ DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(p.first);
+ if (!difficultyEntry)
+ continue;
+
+ if (difficultyEntry->Flags & DIFFICULTY_FLAG_DEFAULT)
+ {
+ if (difficulty)
+ *difficulty = Difficulty(p.first);
+
+ return p.second;
+ }
+ }
+
+ if (difficulty)
+ *difficulty = Difficulty(itr->second.begin()->first);
+
+ return itr->second.begin()->second;
+}
+
+MapDifficultyEntry const* DB2Manager::GetMapDifficultyData(uint32 mapId, Difficulty difficulty) const
+{
+ auto itr = _mapDifficulties.find(mapId);
+ if (itr == _mapDifficulties.end())
+ return nullptr;
+
+ auto diffItr = itr->second.find(difficulty);
+ if (diffItr == itr->second.end())
+ return nullptr;
+
+ return diffItr->second;
+}
+
+MapDifficultyEntry const* DB2Manager::GetDownscaledMapDifficultyData(uint32 mapId, Difficulty& difficulty) const
+{
+ DifficultyEntry const* diffEntry = sDifficultyStore.LookupEntry(difficulty);
+ if (!diffEntry)
+ return GetDefaultMapDifficulty(mapId, &difficulty);
+
+ uint32 tmpDiff = difficulty;
+ MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff));
+ while (!mapDiff)
+ {
+ tmpDiff = diffEntry->FallbackDifficultyID;
+ diffEntry = sDifficultyStore.LookupEntry(tmpDiff);
+ if (!diffEntry)
+ return GetDefaultMapDifficulty(mapId, &difficulty);
+
+ // pull new data
+ mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); // we are 10 normal or 25 normal
+ }
+
+ difficulty = Difficulty(tmpDiff);
+ return mapDiff;
}
MountEntry const* DB2Manager::GetMount(uint32 spellId) const
@@ -1004,6 +1171,23 @@ DB2Manager::MountTypeXCapabilitySet const* DB2Manager::GetMountCapabilities(uint
return nullptr;
}
+std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const
+{
+ ASSERT(gender < GENDER_NONE);
+ auto ritr = _nameGenData.find(race);
+ if (ritr == _nameGenData.end())
+ return "";
+
+ if (ritr->second[gender].empty())
+ return "";
+
+ LocalizedString* data = Trinity::Containers::SelectRandomContainerElement(ritr->second[gender])->Name;
+ if (*data->Str[locale] != '\0')
+ return data->Str[locale];
+
+ return data->Str[sWorld->GetDefaultDbcLocale()];
+}
+
ResponseCodes DB2Manager::ValidateName(std::string const& name, LocaleConstant locale) const
{
for (boost::regex const& regex : _nameValidators[locale])
@@ -1155,6 +1339,11 @@ std::vector<SpellProcsPerMinuteModEntry const*> DB2Manager::GetSpellProcsPerMinu
return std::vector<SpellProcsPerMinuteModEntry const*>();
}
+std::vector<TalentEntry const*> const& DB2Manager::GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const
+{
+ return _talentsByPosition[class_][tier][column];
+}
+
bool DB2Manager::IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId)
{
if (requiredTotemCategoryId == 0)
@@ -1180,6 +1369,49 @@ bool DB2Manager::IsToyItem(uint32 toy) const
return _toys.count(toy) > 0;
}
+WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const
+{
+ auto i = _wmoAreaTableLookup.find(WMOAreaTableKey(int8(rootId), int16(adtId), groupId));
+ if (i != _wmoAreaTableLookup.end())
+ return i->second;
+
+ return nullptr;
+}
+
+uint32 DB2Manager::GetVirtualMapForMapAndZone(uint32 mapId, uint32 zoneId) const
+{
+ if (mapId != 530 && mapId != 571 && mapId != 732) // speed for most cases
+ return mapId;
+
+ auto itr = _worldMapAreaByAreaID.find(zoneId);
+ if (itr != _worldMapAreaByAreaID.end())
+ return itr->second->DisplayMapID >= 0 ? itr->second->DisplayMapID : itr->second->MapID;
+
+ return mapId;
+}
+
+void DB2Manager::Zone2MapCoordinates(uint32 areaId, float& x, float& y) const
+{
+ auto itr = _worldMapAreaByAreaID.find(areaId);
+ if (itr == _worldMapAreaByAreaID.end())
+ return;
+
+ std::swap(x, y); // at client map coords swapped
+ x = x*((itr->second->LocBottom - itr->second->LocTop) / 100) + itr->second->LocTop;
+ y = y*((itr->second->LocRight - itr->second->LocLeft) / 100) + itr->second->LocLeft; // client y coord from top to down
+}
+
+void DB2Manager::Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const
+{
+ auto itr = _worldMapAreaByAreaID.find(areaId);
+ if (itr == _worldMapAreaByAreaID.end())
+ return;
+
+ x = (x - itr->second->LocTop) / ((itr->second->LocBottom - itr->second->LocTop) / 100);
+ y = (y - itr->second->LocLeft) / ((itr->second->LocRight - itr->second->LocLeft) / 100); // client y coord from top to down
+ std::swap(x, y); // client have map coords swapped
+}
+
void DB2Manager::DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/)
{
ASSERT(newMapId || newPos);
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 5dbd24dacf6..59bb91b4a30 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -31,21 +31,25 @@ TC_GAME_API extern DB2Storage<AreaTriggerEntry> sAreaTrigger
TC_GAME_API extern DB2Storage<ArmorLocationEntry> sArmorLocationStore;
TC_GAME_API extern DB2Storage<AuctionHouseEntry> sAuctionHouseStore;
TC_GAME_API extern DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore;
+TC_GAME_API extern DB2Storage<BannedAddOnsEntry> sBannedAddOnsStore;
TC_GAME_API extern DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore;
TC_GAME_API extern DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore;
TC_GAME_API extern DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore;
TC_GAME_API extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore;
TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore;
+TC_GAME_API extern DB2Storage<BattlemasterListEntry> sBattlemasterListStore;
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<ChrClassesEntry> sChrClassesStore;
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<CreatureModelDataEntry> sCreatureModelDataStore;
TC_GAME_API extern DB2Storage<CreatureTypeEntry> sCreatureTypeStore;
TC_GAME_API extern DB2Storage<CriteriaEntry> sCriteriaStore;
TC_GAME_API extern DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore;
@@ -57,9 +61,10 @@ TC_GAME_API extern DB2Storage<DurabilityCostsEntry> sDurabilityC
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<FactionEntry> sFactionStore;
+TC_GAME_API extern DB2Storage<FactionTemplateEntry> sFactionTemplateStore;
TC_GAME_API extern DB2Storage<GameObjectsEntry> sGameObjectsStore;
TC_GAME_API extern DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore;
-TC_GAME_API extern DB2Storage<GameTablesEntry> sGameTablesStore;
TC_GAME_API extern DB2Storage<GarrAbilityEntry> sGarrAbilityStore;
TC_GAME_API extern DB2Storage<GarrBuildingEntry> sGarrBuildingStore;
TC_GAME_API extern DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore;
@@ -106,7 +111,8 @@ TC_GAME_API extern DB2Storage<ItemSetSpellEntry> sItemSetSpel
TC_GAME_API extern DB2SparseStorage<ItemSparseEntry> sItemSparseStore;
TC_GAME_API extern DB2Storage<ItemSpecEntry> sItemSpecStore;
TC_GAME_API extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore;
-TC_GAME_API extern DB2Storage<ItemToBattlePetSpeciesEntry> sItemToBattlePetSpeciesStore;
+TC_GAME_API extern DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore;
+TC_GAME_API extern DB2Storage<LiquidTypeEntry> sLiquidTypeStore;
TC_GAME_API extern DB2Storage<LockEntry> sLockStore;
TC_GAME_API extern DB2Storage<MailTemplateEntry> sMailTemplateStore;
TC_GAME_API extern DB2Storage<MapEntry> sMapStore;
@@ -142,6 +148,7 @@ TC_GAME_API extern DB2Storage<SpellEffectScalingEntry> sSpellEffect
TC_GAME_API extern DB2Storage<SpellEquippedItemsEntry> sSpellEquippedItemsStore;
TC_GAME_API extern DB2Storage<SpellFocusObjectEntry> sSpellFocusObjectStore;
TC_GAME_API extern DB2Storage<SpellInterruptsEntry> sSpellInterruptsStore;
+TC_GAME_API extern DB2Storage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore;
TC_GAME_API extern DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore;
TC_GAME_API extern DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore;
TC_GAME_API extern DB2Storage<SpellLevelsEntry> sSpellLevelsStore;
@@ -158,11 +165,32 @@ TC_GAME_API extern DB2Storage<SpellTargetRestrictionsEntry> sSpellTarget
TC_GAME_API extern DB2Storage<SpellTotemsEntry> sSpellTotemsStore;
TC_GAME_API extern DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore;
TC_GAME_API extern DB2Storage<SummonPropertiesEntry> sSummonPropertiesStore;
+TC_GAME_API extern DB2Storage<TalentEntry> sTalentStore;
TC_GAME_API extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore;
TC_GAME_API extern DB2Storage<TaxiPathEntry> sTaxiPathStore;
TC_GAME_API extern DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore;
+TC_GAME_API extern DB2Storage<VehicleEntry> sVehicleStore;
TC_GAME_API extern DB2Storage<VehicleSeatEntry> sVehicleSeatStore;
TC_GAME_API extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore;
+TC_GAME_API extern DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore;
+
+struct TaxiPathBySourceAndDestination
+{
+ TaxiPathBySourceAndDestination() : ID(0), price(0) { }
+ TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { }
+
+ uint32 ID;
+ uint32 price;
+};
+
+typedef std::map<uint32, TaxiPathBySourceAndDestination> TaxiPathSetForSource;
+typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource;
+
+typedef std::vector<TaxiPathNodeEntry const*> TaxiPathNodeList;
+typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath;
+
+#define TaxiMaskSize 232
+typedef std::array<uint8, TaxiMaskSize> TaxiMask;
TC_GAME_API extern TaxiMask sTaxiNodesMask;
TC_GAME_API extern TaxiMask sOldContinentsNodesMask;
@@ -196,9 +224,11 @@ public:
typedef std::map<uint32 /*hash*/, DB2StorageBase*> StorageMap;
typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer;
+ typedef std::unordered_multimap<uint32, CharSectionsEntry const*> CharSectionsContainer;
typedef std::unordered_map<uint32, CharStartOutfitEntry const*> CharStartOutfitContainer;
typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES][MAX_SPECIALIZATIONS];
typedef std::map<std::tuple<uint32, uint8, uint8, uint8>, EmotesTextSoundEntry const*> EmotesTextSoundContainer;
+ typedef std::unordered_map<uint32, std::vector<uint32>> FactionTeamContainer;
typedef std::set<GlyphSlotEntry const*, GlyphSlotEntryComparator> GlyphSlotContainer;
typedef std::map<uint32 /*curveID*/, std::map<uint32/*index*/, CurvePointEntry const*, std::greater<uint32>>> HeirloomCurvesContainer;
typedef std::unordered_map<uint32, HeirloomEntry const*> HeirloomItemsContainer;
@@ -209,6 +239,7 @@ public:
typedef std::unordered_map<uint32, std::set<ItemBonusTreeNodeEntry const*>> ItemBonusTreeContainer;
typedef std::unordered_map<uint32, std::vector<ItemSetSpellEntry const*>> ItemSetSpellContainer;
typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer;
+ typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyContainer;
typedef std::unordered_map<uint32, MountEntry const*> MountContainer;
typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet;
typedef std::unordered_map<uint32, MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer;
@@ -221,7 +252,11 @@ public:
typedef std::unordered_map<uint32, std::vector<SpellPowerEntry const*>> SpellPowerContainer;
typedef std::unordered_map<uint32, std::unordered_map<uint32, std::vector<SpellPowerEntry const*>>> SpellPowerDifficultyContainer;
typedef std::unordered_map<uint32, std::vector<SpellProcsPerMinuteModEntry const*>> SpellProcsPerMinuteModContainer;
+ typedef std::vector<TalentEntry const*> TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS];
typedef std::unordered_set<uint32> ToyItemIdsContainer;
+ typedef std::tuple<int16, int8, int32> WMOAreaTableKey;
+ typedef std::map<WMOAreaTableKey, WMOAreaTableEntry const*> WMOAreaTableLookupContainer;
+ typedef std::unordered_map<uint32, WorldMapAreaEntry const*> WorldMapAreaByAreaIDContainer;
static DB2Manager& Instance();
@@ -234,12 +269,15 @@ public:
std::vector<uint32> GetAreasForGroup(uint32 areaGroupId) const;
static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false);
+ CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color) const;
CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const;
- ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const;
+ static char const* GetClassName(uint8 class_, LocaleConstant locale = DEFAULT_LOCALE);
uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const;
static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE);
+ ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const;
static char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale);
EmotesTextSoundEntry const* GetTextSoundEmoteFor(uint32 emote, uint8 race, uint8 gender, uint8 class_) const;
+ std::vector<uint32> const* GetFactionTeamList(uint32 faction) const;
GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; }
uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const;
HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const;
@@ -249,6 +287,13 @@ public:
uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const;
std::vector<ItemSetSpellEntry const*> const* GetItemSetSpells(uint32 itemSetId) const;
std::vector<ItemSpecOverrideEntry const*> const* GetItemSpecOverrides(uint32 itemId) const;
+ static LfgDungeonsEntry const* GetLfgDungeon(uint32 mapId, Difficulty difficulty);
+ static uint32 GetDefaultMapLight(uint32 mapId);
+ static uint32 GetLiquidFlags(uint32 liquidType);
+ MapDifficultyContainer const& GetMapDifficulties() const { return _mapDifficulties; }
+ MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr) const;
+ MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty) const;
+ MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty) const;
std::string GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const;
MountEntry const* GetMount(uint32 spellId) const;
MountEntry const* GetMountById(uint32 id) const;
@@ -263,8 +308,13 @@ public:
std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const;
std::vector<SpellPowerEntry const*> GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const;
std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const;
+ std::vector<TalentEntry const*> const& GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const;
static bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId);
bool IsToyItem(uint32 toy) const;
+ WMOAreaTableEntry const* GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const;
+ uint32 GetVirtualMapForMapAndZone(uint32 mapId, uint32 zoneId) const;
+ void Zone2MapCoordinates(uint32 areaId, float& x, float& y) const;
+ void Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const;
static void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr);
private:
@@ -272,10 +322,12 @@ private:
HotfixData _hotfixData;
AreaGroupMemberContainer _areaGroupMembers;
+ CharSectionsContainer _charSections;
CharStartOutfitContainer _charStartOutfits;
uint32 _powersByClass[MAX_CLASSES][MAX_POWERS];
ChrSpecializationByIndexContainer _chrSpecializationsByIndex;
EmotesTextSoundContainer _emoteTextSounds;
+ FactionTeamContainer _factionTeams;
GlyphSlotContainer _glyphSlots;
HeirloomItemsContainer _heirlooms;
HeirloomCurvesContainer _heirloomCurvePoints;
@@ -286,6 +338,7 @@ private:
ItemToBonusTreeContainer _itemToBonusTree;
ItemSetSpellContainer _itemSetSpells;
ItemSpecOverridesContainer _itemSpecOverrides;
+ MapDifficultyContainer _mapDifficulties;
MountContainer _mountsBySpellId;
MountCapabilitiesByTypeContainer _mountCapabilitiesByType;
NameGenContainer _nameGenData;
@@ -297,7 +350,10 @@ private:
SpellPowerContainer _spellPowers;
SpellPowerDifficultyContainer _spellPowerDifficulties;
SpellProcsPerMinuteModContainer _spellProcsPerMinuteMods;
+ TalentsByPosition _talentsByPosition;
ToyItemIdsContainer _toys;
+ WMOAreaTableLookupContainer _wmoAreaTableLookup;
+ WorldMapAreaByAreaIDContainer _worldMapAreaByAreaID;
};
#define sDB2Manager DB2Manager::Instance()
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 692ae88847e..ab29ec77c11 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -45,6 +45,7 @@ struct AchievementEntry
struct AnimKitEntry
{
+ uint32 ID;
uint32 OneShotDuration;
uint16 OneShotStopAnimKitID;
uint16 LowDefAnimKitID;
@@ -52,12 +53,14 @@ struct AnimKitEntry
struct AreaGroupMemberEntry
{
+ uint32 ID;
uint16 AreaGroupID;
uint16 AreaID;
};
struct AreaTableEntry
{
+ uint32 ID;
uint32 Flags[2];
char const* ZoneName;
float AmbientMultiplier;
@@ -69,6 +72,7 @@ struct AreaTableEntry
uint16 ZoneMusic;
uint16 IntroSound;
uint16 LiquidTypeID[4];
+ uint16 UWIntroMusic;
uint16 UWZoneMusic;
uint16 UWAmbience;
uint16 PvPCombastWorldStateID;
@@ -77,7 +81,6 @@ struct AreaTableEntry
uint8 ExplorationLevel;
uint8 FactionGroupMask;
uint8 MountFlags;
- uint8 UWIntroMusic;
uint8 WildBattlePetLevelMin;
uint8 WildBattlePetLevelMax;
uint8 WindSettingsID;
@@ -112,11 +115,13 @@ struct AreaTriggerEntry
struct ArmorLocationEntry
{
+ uint32 ID;
float Modifier[5];
};
struct AuctionHouseEntry
{
+ uint32 ID;
LocalizedString* Name;
uint16 FactionID; // id of faction.dbc for player factions associated with city
uint8 DepositRate;
@@ -125,9 +130,18 @@ struct AuctionHouseEntry
struct BankBagSlotPricesEntry
{
+ uint32 ID;
uint32 Cost;
};
+struct BannedAddOnsEntry
+{
+ uint32 ID;
+ char const* Name;
+ char const* Version;
+ uint8 Flags;
+};
+
struct BarberShopStyleEntry
{
uint32 ID;
@@ -142,6 +156,7 @@ struct BarberShopStyleEntry
struct BattlePetBreedQualityEntry
{
+ uint32 ID;
float Modifier;
uint8 Quality;
};
@@ -175,10 +190,31 @@ struct BattlePetSpeciesStateEntry
uint8 State;
};
+struct BattlemasterListEntry
+{
+ uint32 ID;
+ LocalizedString* Name;
+ uint32 IconFileDataID;
+ LocalizedString* GameType;
+ int16 MapID[16];
+ uint16 HolidayWorldState;
+ uint16 PlayerConditionID;
+ uint8 InstanceType;
+ uint8 GroupsAllowed;
+ uint8 MaxGroupSize;
+ uint8 MinLevel;
+ uint8 MaxLevel;
+ uint8 RatedPlayers;
+ uint8 MinPlayers;
+ uint8 MaxPlayers;
+ uint8 Flags;
+};
+
#define MAX_BROADCAST_TEXT_EMOTES 3
struct BroadcastTextEntry
{
+ uint32 ID;
LocalizedString* MaleText;
LocalizedString* FemaleText;
uint16 EmoteID[MAX_BROADCAST_TEXT_EMOTES];
@@ -189,10 +225,23 @@ struct BroadcastTextEntry
uint8 Type;
};
+struct CharSectionsEntry
+{
+ uint32 Id;
+ uint32 TextureFileDataID[3];
+ uint16 Flags;
+ uint8 Race;
+ uint8 Gender;
+ uint8 GenType;
+ uint8 Type;
+ uint8 Color;
+};
+
#define MAX_OUTFIT_ITEMS 24
struct CharStartOutfitEntry
{
+ uint32 ID;
int32 ItemID[MAX_OUTFIT_ITEMS];
uint32 PetDisplayID; // Pet Model ID for starting pet
uint8 RaceID;
@@ -204,6 +253,7 @@ struct CharStartOutfitEntry
struct CharTitlesEntry
{
+ uint32 ID;
LocalizedString* NameMale;
LocalizedString* NameFemale;
uint16 ConditionID;
@@ -213,14 +263,39 @@ struct CharTitlesEntry
struct ChatChannelsEntry
{
+ uint32 ID;
uint32 Flags;
LocalizedString* Name;
LocalizedString* Shortcut;
uint8 FactionGroup;
};
+struct ChrClassesEntry
+{
+ uint32 ID;
+ uint8 PowerType;
+ char const* PetNameToken;
+ LocalizedString* Name;
+ LocalizedString* NameFemale;
+ LocalizedString* NameMale;
+ char const* Filename;
+ uint32 CreateScreenFileDataID;
+ uint32 SelectScreenFileDataID;
+ uint32 LowResScreenFileDataID;
+ uint16 Flags;
+ uint16 CinematicSequenceID;
+ uint16 DefaultSpec;
+ uint8 SpellClassSet;
+ uint8 AttackPowerPerStrength;
+ uint8 AttackPowerPerAgility;
+ uint8 RangedAttackPowerPerAgility;
+ uint8 IconFileDataID;
+ uint8 Unk1;
+};
+
struct ChrClassesXPowerTypesEntry
{
+ uint32 ID;
uint8 ClassID;
uint8 PowerType;
};
@@ -261,6 +336,7 @@ struct ChrRacesEntry
uint8 CharComponentTextureLayoutID;
uint8 DefaultClassID;
uint8 NeutralRaceID;
+ uint8 ItemAppearanceFrameRaceID;
uint8 CharComponentTexLayoutHiResID;
};
@@ -286,6 +362,7 @@ struct ChrSpecializationEntry
struct CinematicSequencesEntry
{
+ uint32 ID;
uint16 SoundID;
uint16 Camera[8];
};
@@ -301,6 +378,7 @@ struct CreatureDisplayInfoEntry
uint32 PortraitCreatureDisplayInfoID;
uint32 CreatureGeosetData;
uint32 StateSpellVisualKitID;
+ float InstanceOtherPlayerPetScale; // scale of not own player pets inside dungeons/raids/scenarios
uint16 ModelID;
uint16 SoundID;
uint16 NPCSoundID;
@@ -317,6 +395,7 @@ struct CreatureDisplayInfoEntry
struct CreatureDisplayInfoExtraEntry
{
+ uint32 ID;
uint32 FileDataID;
uint32 HDFileDataID;
uint8 DisplayRaceID;
@@ -333,6 +412,7 @@ struct CreatureDisplayInfoExtraEntry
struct CreatureFamilyEntry
{
+ uint32 ID;
float MinScale;
float MaxScale;
LocalizedString* Name;
@@ -345,14 +425,52 @@ struct CreatureFamilyEntry
uint8 CategoryEnumID;
};
+struct CreatureModelDataEntry
+{
+ uint32 ID;
+ uint32 Flags;
+ uint32 FileDataID;
+ float ModelScale;
+ float FootprintTextureLength;
+ float FootprintTextureWidth;
+ float FootprintParticleScale;
+ float CollisionWidth;
+ float CollisionHeight;
+ float MountHeight;
+ float GeoBoxMin[3];
+ float GeoBoxMax[3];
+ float WorldEffectScale;
+ float AttachedEffectScale;
+ float MissileCollisionRadius;
+ float MissileCollisionPush;
+ float MissileCollisionRaise;
+ float OverrideLootEffectScale;
+ float OverrideNameScale;
+ float OverrideSelectionRadius;
+ float TamedPetBaseScale;
+ float HoverHeight;
+ uint16 SoundID;
+ uint16 CreatureGeosetDataID;
+ uint8 SizeClass;
+ uint8 BloodID;
+ uint8 FootprintTextureID;
+ uint8 FoleyMaterialID;
+ uint8 Unk700_1;
+ uint8 Unk700_2;
+ uint8 FootstepShakeSize;
+ uint8 DeathThudShakeSize;
+};
+
struct CreatureTypeEntry
{
+ uint32 ID;
LocalizedString* Name;
uint8 Flags; // no exp? critters, non-combat pets, gas cloud.
};
struct CriteriaEntry
{
+ uint32 ID;
union
{
uint32 ID;
@@ -486,6 +604,7 @@ struct CriteriaEntry
struct CriteriaTreeEntry
{
+ uint32 ID;
uint32 Amount;
LocalizedString* Description;
uint16 CriteriaID;
@@ -512,6 +631,7 @@ struct CurrencyTypesEntry
struct CurvePointEntry
{
+ uint32 ID;
float X;
float Y;
uint16 CurveID;
@@ -520,6 +640,7 @@ struct CurvePointEntry
struct DestructibleModelDataEntry
{
+ uint32 ID;
uint16 StateDamagedDisplayID;
uint16 StateDestroyedDisplayID;
uint16 StateRebuildingDisplayID;
@@ -564,6 +685,7 @@ struct DifficultyEntry
struct DungeonEncounterEntry
{
+ uint32 ID;
LocalizedString* Name;
uint32 CreatureDisplayID;
uint16 MapID;
@@ -576,34 +698,41 @@ struct DungeonEncounterEntry
struct DurabilityCostsEntry
{
+ uint32 ID;
uint16 WeaponSubClassCost[21];
uint16 ArmorSubClassCost[8];
};
struct DurabilityQualityEntry
{
+ uint32 ID;
float QualityMod;
};
struct EmotesEntry
{
+ uint32 ID;
char const* EmoteSlashCommand;
uint32 SpellVisualKitID;
uint32 EmoteFlags;
+ int32 Unk703_1;
+ int32 Unk703_2;
uint16 AnimID;
+ uint16 EmoteSpecProcParam;
uint16 EmoteSoundID;
uint8 EmoteSpecProc;
- uint8 EmoteSpecProcParam;
};
struct EmotesTextEntry
{
+ uint32 ID;
LocalizedString* Name;
uint16 EmoteID;
};
struct EmotesTextSoundEntry
{
+ uint32 ID;
uint16 EmotesTextId;
uint16 SoundId;
uint8 RaceId;
@@ -611,6 +740,89 @@ struct EmotesTextSoundEntry
uint8 ClassId;
};
+struct FactionEntry
+{
+ uint32 ID;
+ uint32 ReputationRaceMask[4];
+ int32 ReputationBase[4];
+ float ParentFactionModIn; // Faction gains incoming rep * ParentFactionModIn
+ float ParentFactionModOut; // Faction outputs rep * ParentFactionModOut as spillover reputation
+ LocalizedString* Name;
+ LocalizedString* Description;
+ int16 ReputationIndex;
+ uint16 ReputationClassMask[4];
+ uint16 ReputationFlags[4];
+ uint16 ParentFactionID;
+ uint8 ParentFactionCapIn; // The highest rank the faction will profit from incoming spillover
+ uint8 ParentFactionCapOut;
+ uint8 Expansion;
+ uint8 Flags;
+ uint8 FriendshipRepID;
+
+ // helpers
+ bool CanHaveReputation() const
+ {
+ return ReputationIndex >= 0;
+ }
+};
+
+#define MAX_FACTION_RELATIONS 4
+
+struct FactionTemplateEntry
+{
+ uint32 ID;
+ uint16 Faction;
+ uint16 Flags;
+ uint16 Enemies[MAX_FACTION_RELATIONS];
+ uint16 Friends[MAX_FACTION_RELATIONS];
+ uint8 Mask;
+ uint8 FriendMask;
+ uint8 EnemyMask;
+
+ //------------------------------------------------------- end structure
+
+ // helpers
+ bool IsFriendlyTo(FactionTemplateEntry const* entry) const
+ {
+ if (this == entry)
+ return true;
+ if (entry->Faction)
+ {
+ for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i)
+ if (Enemies[i] == entry->Faction)
+ return false;
+ for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i)
+ if (Friends[i] == entry->Faction)
+ return true;
+ }
+ return (FriendMask & entry->Mask) || (Mask & entry->FriendMask);
+ }
+ bool IsHostileTo(FactionTemplateEntry const* entry) const
+ {
+ if (this == entry)
+ return false;
+ if (entry->Faction)
+ {
+ for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i)
+ if (Enemies[i] == entry->Faction)
+ return true;
+ for (int32 i = 0; i < MAX_FACTION_RELATIONS; ++i)
+ if (Friends[i] == entry->Faction)
+ return false;
+ }
+ return (EnemyMask & entry->Mask) != 0;
+ }
+ bool IsHostileToPlayers() const { return (EnemyMask & FACTION_MASK_PLAYER) !=0; }
+ bool IsNeutralToAll() const
+ {
+ for (int i = 0; i < MAX_FACTION_RELATIONS; ++i)
+ if (Enemies[i] != 0)
+ return false;
+ return EnemyMask == 0 && FriendMask == 0;
+ }
+ bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; }
+};
+
struct GameObjectsEntry
{
uint32 ID;
@@ -632,6 +844,7 @@ struct GameObjectsEntry
struct GameObjectDisplayInfoEntry
{
+ uint32 ID;
uint32 FileDataID;
DBCPosition3D GeoBoxMin;
DBCPosition3D GeoBoxMax;
@@ -640,27 +853,21 @@ struct GameObjectDisplayInfoEntry
uint16 ObjectEffectPackageID;
};
-struct GameTablesEntry
-{
- LocalizedString* Name;
- uint16 NumRows;
- uint8 NumColumns;
-};
-
struct GarrAbilityEntry
{
uint32 ID;
LocalizedString* Name;
LocalizedString* Description;
uint32 IconFileDataID;
+ uint16 Flags;
uint16 OtherFactionGarrAbilityID;
- uint8 Flags;
uint8 GarrAbilityCategoryID;
uint8 FollowerTypeID;
};
struct GarrBuildingEntry
{
+ uint32 ID;
uint32 HordeGameObjectID;
uint32 AllianceGameObjectID;
LocalizedString* NameAlliance;
@@ -704,11 +911,13 @@ struct GarrClassSpecEntry
LocalizedString* NameGenderless;
uint16 ClassAtlasID; // UiTextureAtlasMember.db2 ref
uint8 GarrFollItemSetID;
- uint8 Unknown700;
+ uint8 Limit;
+ uint8 Flags;
};
struct GarrFollowerEntry
{
+ uint32 ID;
uint32 HordeCreatureID;
uint32 AllianceCreatureID;
LocalizedString* HordeSourceText;
@@ -733,10 +942,13 @@ struct GarrFollowerEntry
uint8 HordeListPortraitTextureKitID;
uint8 AllianceListPortraitTextureKitID;
uint8 GarrTypeID;
+ uint8 MaxDurability;
+ uint8 Class;
};
struct GarrFollowerXAbilityEntry
{
+ uint32 ID;
uint16 GarrFollowerID;
uint16 GarrAbilityID;
uint8 FactionIndex;
@@ -744,30 +956,34 @@ struct GarrFollowerXAbilityEntry
struct GarrPlotEntry
{
+ uint32 ID;
LocalizedString* Name;
uint32 AllianceConstructionGameObjectID;
uint32 HordeConstructionGameObjectID;
+ uint16 MinCount;
+ uint16 MaxCount;
uint8 GarrPlotUICategoryID;
uint8 PlotType;
uint8 Flags;
- uint8 MinCount;
- uint8 MaxCount;
};
struct GarrPlotBuildingEntry
{
+ uint32 ID;
uint8 GarrPlotID;
uint8 GarrBuildingID;
};
struct GarrPlotInstanceEntry
{
+ uint32 ID;
LocalizedString* Name;
uint8 GarrPlotID;
};
struct GarrSiteLevelEntry
{
+ uint32 ID;
DBCPosition2D TownHall;
uint16 MapID;
uint16 UpgradeResourceCost;
@@ -781,6 +997,7 @@ struct GarrSiteLevelEntry
struct GarrSiteLevelPlotInstEntry
{
+ uint32 ID;
DBCPosition2D Landmark;
uint16 GarrSiteLevelID;
uint8 GarrPlotInstanceID;
@@ -789,15 +1006,15 @@ struct GarrSiteLevelPlotInstEntry
struct GemPropertiesEntry
{
+ uint32 ID;
uint32 Type;
uint16 EnchantID;
uint16 MinItemLevel;
- uint8 MaxCountInv;
- uint8 MaxCountItem;
};
struct GlyphPropertiesEntry
{
+ uint32 ID;
uint32 SpellID;
uint16 SpellIconID;
uint8 Type;
@@ -806,12 +1023,14 @@ struct GlyphPropertiesEntry
struct GlyphSlotEntry
{
+ uint32 ID;
+ uint16 Tooltip;
uint8 Type;
- uint8 Tooltip;
};
struct GuildColorBackgroundEntry
{
+ uint32 ID;
uint8 Red;
uint8 Green;
uint8 Blue;
@@ -819,6 +1038,7 @@ struct GuildColorBackgroundEntry
struct GuildColorBorderEntry
{
+ uint32 ID;
uint8 Red;
uint8 Green;
uint8 Blue;
@@ -826,6 +1046,7 @@ struct GuildColorBorderEntry
struct GuildColorEmblemEntry
{
+ uint32 ID;
uint8 Red;
uint8 Green;
uint8 Blue;
@@ -833,8 +1054,8 @@ struct GuildColorEmblemEntry
struct GuildPerkSpellsEntry
{
+ uint32 ID;
uint32 SpellID;
- uint8 GuildLevel;
};
struct HeirloomEntry
@@ -856,6 +1077,7 @@ struct HeirloomEntry
struct HolidaysEntry
{
+ uint32 ID;
uint32 Date[MAX_HOLIDAY_DATES]; // dates in unix time starting at January, 1, 2000
char const* TextureFilename;
uint16 Duration[MAX_HOLIDAY_DURATIONS];
@@ -871,6 +1093,7 @@ struct HolidaysEntry
struct ImportPriceArmorEntry
{
+ uint32 ID;
float ClothFactor;
float LeatherFactor;
float MailFactor;
@@ -879,21 +1102,25 @@ struct ImportPriceArmorEntry
struct ImportPriceQualityEntry
{
+ uint32 ID;
float Factor;
};
struct ImportPriceShieldEntry
{
+ uint32 ID;
float Factor;
};
struct ImportPriceWeaponEntry
{
+ uint32 ID;
float Factor;
};
struct ItemEntry
{
+ uint32 ID;
uint32 FileDataID;
uint8 Class;
uint8 SubClass;
@@ -906,31 +1133,37 @@ struct ItemEntry
struct ItemAppearanceEntry
{
+ uint32 ID;
uint32 DisplayID;
uint32 IconFileDataID;
+ uint32 UIOrder;
uint8 ObjectComponentSlot;
};
struct ItemArmorQualityEntry
{
+ uint32 ID;
float QualityMod[7];
uint16 ItemLevel;
};
struct ItemArmorShieldEntry
{
+ uint32 ID;
float Quality[7];
uint16 ItemLevel;
};
struct ItemArmorTotalEntry
{
+ uint32 ID;
float Value[4];
uint16 ItemLevel;
};
struct ItemBagFamilyEntry
{
+ uint32 ID;
LocalizedString* Name;
};
@@ -945,6 +1178,7 @@ struct ItemBonusEntry
struct ItemBonusTreeNodeEntry
{
+ uint32 ID;
uint16 BonusTreeID;
uint16 SubTreeID;
uint16 BonusListID;
@@ -953,6 +1187,7 @@ struct ItemBonusTreeNodeEntry
struct ItemClassEntry
{
+ uint32 ID;
float PriceMod;
LocalizedString* Name;
uint8 Flags;
@@ -960,41 +1195,48 @@ struct ItemClassEntry
struct ItemCurrencyCostEntry
{
+ uint32 ID;
uint32 ItemId;
};
struct ItemDamageAmmoEntry
{
+ uint32 ID;
float DPS[7];
uint16 ItemLevel;
};
struct ItemDamageOneHandEntry
{
+ uint32 ID;
float DPS[7];
uint16 ItemLevel;
};
struct ItemDamageOneHandCasterEntry
{
+ uint32 ID;
float DPS[7];
uint16 ItemLevel;
};
struct ItemDamageTwoHandEntry
{
+ uint32 ID;
float DPS[7];
uint16 ItemLevel;
};
struct ItemDamageTwoHandCasterEntry
{
+ uint32 ID;
float DPS[7];
uint16 ItemLevel;
};
struct ItemDisenchantLootEntry
{
+ uint32 ID;
uint16 MinItemLevel;
uint16 MaxItemLevel;
uint16 RequiredDisenchantSkill;
@@ -1005,6 +1247,7 @@ struct ItemDisenchantLootEntry
struct ItemEffectEntry
{
+ uint32 ID;
uint32 ItemID;
uint32 SpellID;
int32 Cooldown;
@@ -1021,6 +1264,7 @@ struct ItemEffectEntry
struct ItemExtendedCostEntry
{
+ uint32 ID;
uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // required item id
uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // required curency count
uint32 RequiredMoney;
@@ -1036,6 +1280,7 @@ struct ItemExtendedCostEntry
struct ItemLimitCategoryEntry
{
+ uint32 ID;
LocalizedString* Name;
uint8 Quantity;
uint8 Flags;
@@ -1048,10 +1293,12 @@ struct ItemModifiedAppearanceEntry
uint16 AppearanceID;
uint8 AppearanceModID;
uint8 Index;
+ uint8 SourceType;
};
struct ItemPriceBaseEntry
{
+ uint32 ID;
float ArmorFactor;
float WeaponFactor;
uint16 ItemLevel;
@@ -1061,12 +1308,14 @@ struct ItemPriceBaseEntry
struct ItemRandomPropertiesEntry
{
+ uint32 ID;
LocalizedString* Name;
uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES];
};
struct ItemRandomSuffixEntry
{
+ uint32 ID;
LocalizedString* Name;
LocalizedString* InternalName;
uint16 Enchantment[MAX_ITEM_RANDOM_PROPERTIES];
@@ -1077,14 +1326,17 @@ struct ItemRandomSuffixEntry
struct ItemSetEntry
{
+ uint32 ID;
LocalizedString* Name;
uint32 ItemID[MAX_ITEM_SET_ITEMS];
+ uint32 Unknown703;
uint16 RequiredSkillRank;
uint8 RequiredSkill;
};
struct ItemSetSpellEntry
{
+ uint32 ID;
uint32 SpellID;
uint16 ItemSetID;
uint16 ChrSpecID;
@@ -1097,6 +1349,7 @@ struct ItemSetSpellEntry
struct ItemSparseEntry
{
+ uint32 ID;
uint32 Flags[MAX_ITEM_PROTO_FLAGS];
float Unk1;
float Unk2;
@@ -1159,10 +1412,12 @@ struct ItemSparseEntry
uint8 CurrencySubstitutionID;
uint8 CurrencySubstitutionCount;
uint8 ArtifactID;
+ uint8 RequiredExpansion;
};
struct ItemSpecEntry
{
+ uint32 ID;
uint16 SpecID;
uint8 MinLevel;
uint8 MaxLevel;
@@ -1173,17 +1428,14 @@ struct ItemSpecEntry
struct ItemSpecOverrideEntry
{
+ uint32 ID;
uint32 ItemID;
uint16 SpecID;
};
-struct ItemToBattlePetSpeciesEntry
-{
- uint16 BattlePetSpeciesID;
-};
-
struct ItemXBonusTreeEntry
{
+ uint32 ID;
uint32 ItemID;
uint16 BonusTreeID;
};
@@ -1192,13 +1444,86 @@ struct ItemXBonusTreeEntry
struct KeyChainEntry
{
+ uint32 ID;
uint8 Key[KEYCHAIN_SIZE];
};
+struct LfgDungeonsEntry
+{
+ uint32 ID;
+ LocalizedString* Name;
+ uint32 Flags;
+ char const* TextureFilename;
+ LocalizedString* Description;
+ uint16 MaxLevel;
+ uint16 TargetLevelMax;
+ int16 MapID;
+ uint16 RandomID;
+ uint16 ScenarioID;
+ uint16 LastBossJournalEncounterID;
+ uint16 BonusReputationAmount;
+ uint16 MentorItemLevel;
+ uint8 MinLevel;
+ uint8 TargetLevel;
+ uint8 TargetLevelMin;
+ uint8 DifficultyID;
+ uint8 Type;
+ uint8 Faction;
+ uint8 Expansion;
+ uint8 OrderIndex;
+ uint8 GroupID;
+ uint8 CountTank;
+ uint8 CountHealer;
+ uint8 CountDamage;
+ uint8 MinCountTank;
+ uint8 MinCountHealer;
+ uint8 MinCountDamage;
+ uint8 SubType;
+ uint8 MentorCharLevel;
+
+ // Helpers
+ uint32 Entry() const { return ID + (Type << 24); }
+};
+
+struct LightEntry
+{
+ uint32 ID;
+ DBCPosition3D Pos;
+ float FalloffStart;
+ float FalloffEnd;
+ uint16 MapID;
+ uint16 LightParamsID[8];
+};
+
+struct LiquidTypeEntry
+{
+ uint32 ID;
+ LocalizedString* Name;
+ uint32 SpellID;
+ float MaxDarkenDepth;
+ float FogDarkenIntensity;
+ float AmbDarkenIntensity;
+ float DirDarkenIntensity;
+ float ParticleScale;
+ char const* Texture[6];
+ uint32 Color[2];
+ float Float[18];
+ uint32 Int[4];
+ uint16 Flags;
+ uint16 SoundID;
+ uint8 Type;
+ uint8 LightID;
+ uint8 ParticleMovement;
+ uint8 ParticleTexSlots;
+ uint8 MaterialID;
+ uint8 DepthTexCount[6];
+};
+
#define MAX_LOCK_CASE 8
struct LockEntry
{
+ uint32 ID;
uint32 Index[MAX_LOCK_CASE];
uint16 Skill[MAX_LOCK_CASE];
uint8 Type[MAX_LOCK_CASE];
@@ -1207,6 +1532,7 @@ struct LockEntry
struct MailTemplateEntry
{
+ uint32 ID;
LocalizedString* Body;
};
@@ -1218,7 +1544,6 @@ struct MapEntry
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
@@ -1266,8 +1591,31 @@ struct MapEntry
bool IsGarrison() const { return (Flags & MAP_FLAG_GARRISON) != 0; }
};
+struct MapDifficultyEntry
+{
+ uint32 ID;
+ LocalizedString* Message_lang; // m_message_lang (text showed when transfer to map failed)
+ uint32 Context;
+ uint16 MapID;
+ uint8 DifficultyID;
+ uint8 RaidDurationType; // 1 means daily reset, 2 means weekly
+ uint8 MaxPlayers; // m_maxPlayers some heroic versions have 0 when expected same amount as in normal version
+ uint8 LockID;
+ uint8 ItemBonusTreeModID;
+
+ uint32 GetRaidDuration() const
+ {
+ if (RaidDurationType == 1)
+ return 86400;
+ if (RaidDurationType == 2)
+ return 604800;
+ return 0;
+ }
+};
+
struct ModifierTreeEntry
{
+ uint32 ID;
uint32 Asset[2];
uint16 Parent;
uint8 Type;
@@ -1293,17 +1641,18 @@ struct MountEntry
struct MountCapabilityEntry
{
uint32 ID;
+ uint32 RequiredAura;
uint32 RequiredSpell;
uint32 SpeedModSpell;
uint16 RequiredRidingSkill;
uint16 RequiredArea;
int16 RequiredMap;
uint8 Flags;
- uint8 RequiredAura;
};
struct MountTypeXCapabilityEntry
{
+ uint32 ID;
uint16 MountTypeID;
uint16 MountCapabilityID;
uint8 OrderIndex;
@@ -1311,6 +1660,7 @@ struct MountTypeXCapabilityEntry
struct MovieEntry
{
+ uint32 ID;
uint32 AudioFileDataID;
uint32 SubtitleFileDataID;
uint8 Volume;
@@ -1319,6 +1669,7 @@ struct MovieEntry
struct NameGenEntry
{
+ uint32 ID;
LocalizedString* Name;
uint8 Race;
uint8 Sex;
@@ -1326,17 +1677,20 @@ struct NameGenEntry
struct NamesProfanityEntry
{
+ uint32 ID;
char const* Name;
int8 Language;
};
struct NamesReservedEntry
{
+ uint32 ID;
char const* Name;
};
struct NamesReservedLocaleEntry
{
+ uint32 ID;
char const* Name;
uint8 LocaleMask;
};
@@ -1345,6 +1699,7 @@ struct NamesReservedLocaleEntry
struct OverrideSpellDataEntry
{
+ uint32 ID;
uint32 SpellID[MAX_OVERRIDE_SPELL];
uint32 PlayerActionbarFileDataID;
uint8 Flags;
@@ -1352,17 +1707,20 @@ struct OverrideSpellDataEntry
struct PhaseEntry
{
+ uint32 ID;
uint16 Flags;
};
struct PhaseXPhaseGroupEntry
{
+ uint32 ID;
uint16 PhaseID;
uint16 PhaseGroupID;
};
struct PlayerConditionEntry
{
+ uint32 ID;
uint32 RaceMask;
uint32 SkillLogic;
uint32 ReputationLogic;
@@ -1447,6 +1805,7 @@ struct PlayerConditionEntry
struct PowerDisplayEntry
{
+ uint32 ID;
char const* GlobalStringBaseTag;
uint8 PowerType;
uint8 Red;
@@ -1456,6 +1815,7 @@ struct PowerDisplayEntry
struct PvPDifficultyEntry
{
+ uint32 ID;
uint16 MapID;
uint8 BracketID;
uint8 MinLevel;
@@ -1467,16 +1827,19 @@ struct PvPDifficultyEntry
struct QuestFactionRewardEntry
{
+ uint32 ID;
int16 QuestRewFactionValue[10];
};
struct QuestMoneyRewardEntry
{
+ uint32 ID;
uint32 Money[10];
};
struct QuestPackageItemEntry
{
+ uint32 ID;
uint32 ItemID;
uint16 QuestPackageID;
uint8 ItemCount;
@@ -1485,28 +1848,34 @@ struct QuestPackageItemEntry
struct QuestSortEntry
{
+ uint32 ID;
LocalizedString* SortName;
+ uint8 SortOrder;
};
struct QuestV2Entry
{
+ uint32 ID;
uint16 UniqueBitFlag;
};
struct QuestXPEntry
{
+ uint32 ID;
uint16 Exp[10];
};
struct RandPropPointsEntry
{
- uint16 EpicPropertiesPoints[5];
- uint16 RarePropertiesPoints[5];
- uint16 UncommonPropertiesPoints[5];
+ uint32 ID;
+ uint32 EpicPropertiesPoints[5];
+ uint32 RarePropertiesPoints[5];
+ uint32 UncommonPropertiesPoints[5];
};
struct ScalingStatDistributionEntry
{
+ uint32 ID;
uint16 ItemLevelCurveID;
uint8 MinLevel;
uint8 MaxLevel;
@@ -1514,6 +1883,7 @@ struct ScalingStatDistributionEntry
struct SkillLineEntry
{
+ uint32 ID;
LocalizedString* DisplayName;
LocalizedString* Description;
LocalizedString* AlternateVerb;
@@ -1526,6 +1896,7 @@ struct SkillLineEntry
struct SkillLineAbilityEntry
{
+ uint32 ID;
uint32 SpellID;
uint32 RaceMask;
uint32 ClassMask;
@@ -1542,9 +1913,10 @@ struct SkillLineAbilityEntry
struct SkillRaceClassInfoEntry
{
+ uint32 ID;
int32 RaceMask;
+ int32 ClassMask;
uint16 SkillID;
- int16 ClassMask;
uint16 Flags;
uint16 SkillTierID;
uint8 Availability;
@@ -1554,7 +1926,6 @@ struct SkillRaceClassInfoEntry
struct SoundKitEntry
{
uint32 ID;
- uint8 SoundType;
LocalizedString* Name;
float VolumeFloat;
float MinDistance;
@@ -1566,9 +1937,10 @@ struct SoundKitEntry
float PitchAdjust;
uint16 Flags;
uint16 SoundEntriesAdvancedID;
+ uint16 BusOverwriteID;
+ uint8 SoundType;
uint8 EAXDef;
uint8 DialogType;
- uint8 BusOverwriteID;
uint8 Unk700;
};
@@ -1595,6 +1967,7 @@ struct SpellEntry
struct SpellAuraOptionsEntry
{
+ uint32 ID;
uint32 SpellID;
uint32 ProcCharges;
uint32 ProcTypeMask;
@@ -1607,6 +1980,7 @@ struct SpellAuraOptionsEntry
struct SpellAuraRestrictionsEntry
{
+ uint32 ID;
uint32 SpellID;
uint32 CasterAuraSpell;
uint32 TargetAuraSpell;
@@ -1621,6 +1995,7 @@ struct SpellAuraRestrictionsEntry
struct SpellCastTimesEntry
{
+ uint32 ID;
int32 CastTime;
int32 MinCastTime;
int16 CastTimePerLevel;
@@ -1628,6 +2003,7 @@ struct SpellCastTimesEntry
struct SpellCastingRequirementsEntry
{
+ uint32 ID;
uint32 SpellID;
uint16 MinFactionID;
uint16 RequiredAreasID;
@@ -1639,6 +2015,7 @@ struct SpellCastingRequirementsEntry
struct SpellCategoriesEntry
{
+ uint32 ID;
uint32 SpellID;
uint16 Category;
uint16 StartRecoveryCategory;
@@ -1652,8 +2029,10 @@ struct SpellCategoriesEntry
struct SpellCategoryEntry
{
+ uint32 ID;
LocalizedString* Name;
int32 ChargeRecoveryTime;
+ uint32 Unk703;
uint8 Flags;
uint8 UsesPerWeek;
uint8 MaxCharges;
@@ -1661,6 +2040,7 @@ struct SpellCategoryEntry
struct SpellClassOptionsEntry
{
+ uint32 ID;
uint32 SpellID;
flag128 SpellClassMask;
uint16 ModalNextSpell;
@@ -1669,6 +2049,7 @@ struct SpellClassOptionsEntry
struct SpellCooldownsEntry
{
+ uint32 ID;
uint32 SpellID;
uint32 CategoryRecoveryTime;
uint32 RecoveryTime;
@@ -1678,6 +2059,7 @@ struct SpellCooldownsEntry
struct SpellDurationEntry
{
+ uint32 ID;
int32 Duration;
int32 MaxDuration;
int16 DurationPerLevel;
@@ -1719,6 +2101,7 @@ struct SpellEffectEntry
struct SpellEffectScalingEntry
{
+ uint32 ID;
float Coefficient;
float Variance;
float ResourceCoefficient;
@@ -1727,6 +2110,7 @@ struct SpellEffectScalingEntry
struct SpellEquippedItemsEntry
{
+ uint32 ID;
uint32 SpellID;
int32 EquippedItemInventoryTypeMask;
int32 EquippedItemSubClassMask;
@@ -1735,11 +2119,13 @@ struct SpellEquippedItemsEntry
struct SpellFocusObjectEntry
{
+ uint32 ID;
LocalizedString* Name;
};
struct SpellInterruptsEntry
{
+ uint32 ID;
uint32 SpellID;
uint32 AuraInterruptFlags[2];
uint32 ChannelInterruptFlags[2];
@@ -1747,8 +2133,35 @@ struct SpellInterruptsEntry
uint8 DifficultyID;
};
+#define MAX_ITEM_ENCHANTMENT_EFFECTS 3
+
+struct SpellItemEnchantmentEntry
+{
+ uint32 ID;
+ uint32 EffectSpellID[MAX_ITEM_ENCHANTMENT_EFFECTS];
+ LocalizedString* Name;
+ float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];
+ uint32 PlayerConditionID;
+ uint32 TransmogCost;
+ uint32 TextureFileDataID;
+ uint16 EffectPointsMin[MAX_ITEM_ENCHANTMENT_EFFECTS];
+ uint16 ItemVisual;
+ uint16 Flags;
+ uint16 RequiredSkillID;
+ uint16 RequiredSkillRank;
+ uint16 ItemLevel;
+ uint8 Charges;
+ uint8 Effect[MAX_ITEM_ENCHANTMENT_EFFECTS];
+ uint8 ConditionID;
+ uint8 MinLevel;
+ uint8 MaxLevel;
+ int8 ScalingClass;
+ int8 ScalingClassRestricted;
+};
+
struct SpellItemEnchantmentConditionEntry
{
+ uint32 ID;
uint8 LTOperandType[5];
uint8 LTOperand[5];
uint8 Operator[5];
@@ -1759,6 +2172,7 @@ struct SpellItemEnchantmentConditionEntry
struct SpellLearnSpellEntry
{
+ uint32 ID;
uint32 LearnSpellID;
uint32 SpellID;
uint32 OverridesSpellID;
@@ -1766,6 +2180,7 @@ struct SpellLearnSpellEntry
struct SpellLevelsEntry
{
+ uint32 ID;
uint32 SpellID;
uint16 BaseLevel;
uint16 MaxLevel;
@@ -1776,6 +2191,7 @@ struct SpellLevelsEntry
struct SpellMiscEntry
{
+ uint32 ID;
uint32 Attributes;
uint32 AttributesEx;
uint32 AttributesExB;
@@ -1844,6 +2260,7 @@ struct SpellProcsPerMinuteModEntry
struct SpellRadiusEntry
{
+ uint32 ID;
float Radius;
float RadiusPerLevel;
float RadiusMin;
@@ -1852,6 +2269,7 @@ struct SpellRadiusEntry
struct SpellRangeEntry
{
+ uint32 ID;
float MinRangeHostile;
float MinRangeFriend;
float MaxRangeHostile;
@@ -1865,6 +2283,7 @@ struct SpellRangeEntry
struct SpellReagentsEntry
{
+ uint32 ID;
uint32 SpellID;
int32 Reagent[MAX_SPELL_REAGENTS];
uint16 ReagentCount[MAX_SPELL_REAGENTS];
@@ -1872,14 +2291,17 @@ struct SpellReagentsEntry
struct SpellScalingEntry
{
+ uint32 ID;
uint32 SpellID;
uint16 ScalesFromItemLevel;
int8 ScalingClass;
+ uint8 MinScalingLevel;
uint8 MaxScalingLevel;
};
struct SpellShapeshiftEntry
{
+ uint32 ID;
uint32 SpellID;
uint32 ShapeshiftExclude[2];
uint32 ShapeshiftMask[2];
@@ -1890,6 +2312,7 @@ struct SpellShapeshiftEntry
struct SpellShapeshiftFormEntry
{
+ uint32 ID;
LocalizedString* Name;
float WeaponDamageVariance;
uint32 Flags;
@@ -1904,6 +2327,7 @@ struct SpellShapeshiftFormEntry
struct SpellTargetRestrictionsEntry
{
+ uint32 ID;
uint32 SpellID;
float ConeAngle;
float Width;
@@ -1918,6 +2342,7 @@ struct SpellTargetRestrictionsEntry
struct SpellTotemsEntry
{
+ uint32 ID;
uint32 SpellID;
uint32 Totem[MAX_SPELL_TOTEMS];
uint8 RequiredTotemCategoryID[MAX_SPELL_TOTEMS];
@@ -1936,6 +2361,7 @@ struct SpellXSpellVisualEntry
struct SummonPropertiesEntry
{
+ uint32 ID;
uint32 Category;
uint32 Faction;
uint32 Type;
@@ -1943,6 +2369,23 @@ struct SummonPropertiesEntry
uint32 Flags;
};
+#define MAX_TALENT_TIERS 7
+#define MAX_TALENT_COLUMNS 3
+
+struct TalentEntry
+{
+ uint32 ID;
+ uint32 SpellID;
+ uint32 OverridesSpellID;
+ LocalizedString* Description;
+ uint16 SpecID;
+ uint8 TierID;
+ uint8 ColumnIndex;
+ uint8 Flags;
+ uint8 CategoryMask[2];
+ uint8 ClassID;
+};
+
struct TaxiNodesEntry
{
uint32 ID;
@@ -1979,6 +2422,7 @@ struct TaxiPathNodeEntry
struct TotemCategoryEntry
{
+ uint32 ID;
LocalizedString* Name;
uint32 CategoryMask;
uint8 CategoryType;
@@ -1995,6 +2439,7 @@ struct ToyEntry
struct TransportAnimationEntry
{
+ uint32 ID;
uint32 TransportID;
uint32 TimeIndex;
DBCPosition3D Pos;
@@ -2003,6 +2448,7 @@ struct TransportAnimationEntry
struct TransportRotationEntry
{
+ uint32 ID;
uint32 TransportID;
uint32 TimeIndex;
float X;
@@ -2013,6 +2459,7 @@ struct TransportRotationEntry
struct UnitPowerBarEntry
{
+ uint32 ID;
uint32 MaxPower;
float RegenerationPeace;
float RegenerationCombat;
@@ -2031,8 +2478,45 @@ struct UnitPowerBarEntry
uint8 BarType;
};
+#define MAX_VEHICLE_SEATS 8
+
+struct VehicleEntry
+{
+ uint32 ID;
+ uint32 Flags;
+ float TurnSpeed;
+ float PitchSpeed;
+ float PitchMin;
+ float PitchMax;
+ float MouseLookOffsetPitch;
+ float CameraFadeDistScalarMin;
+ float CameraFadeDistScalarMax;
+ float CameraPitchOffset;
+ float FacingLimitRight;
+ float FacingLimitLeft;
+ float MsslTrgtTurnLingering;
+ float MsslTrgtPitchLingering;
+ float MsslTrgtMouseLingering;
+ float MsslTrgtEndOpacity;
+ float MsslTrgtArcSpeed;
+ float MsslTrgtArcRepeat;
+ float MsslTrgtArcWidth;
+ float MsslTrgtImpactRadius[2];
+ char const* MsslTrgtArcTexture;
+ char const* MsslTrgtImpactTexture;
+ char const* MsslTrgtImpactModel[2];
+ float CameraYawOffset;
+ float MsslTrgtImpactTexRadius;
+ uint16 SeatID[MAX_VEHICLE_SEATS];
+ uint16 VehicleUIIndicatorID;
+ uint16 PowerDisplayID[3];
+ uint8 FlagsB;
+ uint8 UILocomotionType;
+};
+
struct VehicleSeatEntry
{
+ uint32 ID;
uint32 Flags[3];
DBCPosition3D AttachmentOffset;
float EnterPreDelay;
@@ -2054,6 +2538,8 @@ struct VehicleSeatEntry
float PassengerRoll;
float VehicleEnterAnimDelay;
float VehicleExitAnimDelay;
+ uint32 EnterUISoundID;
+ uint32 ExitUISoundID;
float CameraEnteringDelay;
float CameraEnteringDuration;
float CameraExitingDelay;
@@ -2077,8 +2563,6 @@ struct VehicleSeatEntry
int16 VehicleEnterAnim;
int16 VehicleExitAnim;
int16 VehicleRideAnimLoop;
- uint16 EnterUISoundID;
- uint16 ExitUISoundID;
uint16 EnterAnimKitID;
uint16 RideAnimKitID;
uint16 ExitAnimKitID;
@@ -2109,10 +2593,51 @@ struct VehicleSeatEntry
bool IsEjectable() const { return (Flags[1] & VEHICLE_SEAT_FLAG_B_EJECTABLE) != 0; }
};
+struct WMOAreaTableEntry
+{
+ uint32 ID;
+ int32 WMOGroupID; // used in group WMO
+ LocalizedString* AreaName;
+ int16 WMOID; // used in root WMO
+ uint16 AmbienceID;
+ uint16 ZoneMusic;
+ uint16 IntroSound;
+ uint16 AreaTableID;
+ uint16 UWIntroSound;
+ uint16 UWAmbience;
+ int8 NameSet; // used in adt file
+ uint8 SoundProviderPref;
+ uint8 SoundProviderPrefUnderwater;
+ uint8 Flags;
+ uint8 UWZoneMusic;
+};
+
+struct WorldMapAreaEntry
+{
+ uint32 ID;
+ char const* AreaName;
+ float LocLeft;
+ float LocRight;
+ float LocTop;
+ float LocBottom;
+ uint16 MapID;
+ uint16 AreaID;
+ int16 DisplayMapID;
+ int16 DefaultDungeonFloor;
+ uint16 ParentWorldMapID;
+ uint16 Flags;
+ uint16 PlayerConditionID;
+ uint8 LevelRangeMin;
+ uint8 LevelRangeMax;
+ uint8 BountySetID;
+ uint8 BountyBoardLocation;
+};
+
#define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4
struct WorldMapOverlayEntry
{
+ uint32 ID;
char const* TextureName;
uint16 MapAreaID; // idx in WorldMapArea.dbc
uint16 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX];
@@ -2125,10 +2650,12 @@ struct WorldMapOverlayEntry
uint16 HitRectBottom;
uint16 HitRectRight;
uint16 PlayerConditionID;
+ uint8 Flags;
};
struct WorldMapTransformsEntry
{
+ uint32 ID;
DBCPosition3D RegionMin;
DBCPosition3D RegionMax;
DBCPosition2D RegionOffset;
@@ -2140,24 +2667,14 @@ struct WorldMapTransformsEntry
uint8 Flags;
};
-#pragma pack(pop)
-
-struct TaxiPathBySourceAndDestination
+struct WorldSafeLocsEntry
{
- TaxiPathBySourceAndDestination() : ID(0), price(0) { }
- TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { }
-
uint32 ID;
- uint32 price;
+ DBCPosition3D Loc;
+ float Facing;
+ LocalizedString* AreaName;
+ uint16 MapID;
};
-typedef std::map<uint32, TaxiPathBySourceAndDestination> TaxiPathSetForSource;
-typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource;
-
-typedef std::vector<TaxiPathNodeEntry const*> TaxiPathNodeList;
-typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath;
-
-#define TaxiMaskSize 226
-typedef std::array<uint8, TaxiMaskSize> TaxiMask;
-
+#pragma pack(pop)
#endif
diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h
index 58ab1319b98..5e2bf12a12a 100644
--- a/src/server/game/DataStores/DB2fmt.h
+++ b/src/server/game/DataStores/DB2fmt.h
@@ -21,27 +21,32 @@
char const AchievementFormat[] = "nssishhhhhhhbbb";
char const AnimKitFormat[] = "dihh";
char const AreaGroupMemberFormat[] = "dhh";
-char const AreaTableFormat[] = "diiSfshhhhhhhhhhhhhbbbbbbbbb";
+char const AreaTableFormat[] = "diiSfshhhhhhhhhhhhhhbbbbbbbb";
char const AreaTriggerFormat[] = "nffffffffhhhhhbbb";
char const ArmorLocationFormat[] = "dfffff";
char const AuctionHouseFormat[] = "dshbb";
char const BankBagSlotPricesFormat[] = "di";
+char const BannedAddOnsFormat[] = "dSSb";
char const BarberShopStyleFormat[] = "nssfbbbb";
char const BattlePetBreedQualityFormat[] = "dfb";
char const BattlePetBreedStateFormat[] = "nhbb";
char const BattlePetSpeciesFormat[] = "niiisshbb";
char const BattlePetSpeciesStateFormat[] = "nihb";
+char const BattlemasterListFormat[] = "nsishhhhhhhhhhhhhhhhhhbbbbbbbbb";
char const BroadcastTextFormat[] = "dsshhhhhhhhbb";
char const CharStartOutfitFormat[] = "diiiiiiiiiiiiiiiiiiiiiiiiibbbbb";
+char const CharSectionsFormat[] = "niiihbbbbb";
char const CharTitlesFormat[] = "dsshhb";
char const ChatChannelsFormat[] = "dissb";
+char const ChrClassesFormat[] = "nSsssSiiihhhbbbbbbb";
char const ChrClassesXPowerTypesFormat[] = "dbb";
-char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbb";
+char const ChrRacesFormat[] = "niSSsssSSSiiffffffihhhhhhhhhhhhbbbbbbbbbb";
char const ChrSpecializationFormat[] = "niiiisssShbbbbb";
char const CinematicSequencesFormat[] = "dhhhhhhhhh";
-char const CreatureDisplayInfoFormat[] = "niffiiiSiiihhhhhhbbbbbb";
+char const CreatureDisplayInfoFormat[] = "diffiiiSiiifhhhhhhbbbbbb";
char const CreatureDisplayInfoExtraFormat[] = "diibbbbbbbbbbbb";
char const CreatureFamilyFormat[] = "dffsshhhbbbb";
+char const CreatureModelDataFormat[] = "diifffffffffffffffffffffffhhbbbbbbbb";
char const CreatureTypeFormat[] = "dsb";
char const CriteriaFormat[] = "diiihhhbbbbb";
char const CriteriaTreeFormat[] = "dishhhhb";
@@ -52,30 +57,31 @@ char const DifficultyFormat[] = "nsbbbbbbbbbbbb";
char const DungeonEncounterFormat[] = "dsihhhbbb";
char const DurabilityCostsFormat[] = "dhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
char const DurabilityQualityFormat[] = "df";
-char const EmotesFormat[] = "dSiihhbb";
+char const EmotesFormat[] = "dSiiiihhhb";
char const EmotesTextFormat[] = "dsh";
char const EmotesTextSoundFormat[] = "dhhbbb";
+char const FactionFormat[] = "diiiiiiiiffsshhhhhhhhhhbbbbb";
+char const FactionTemplateFormat[] = "dhhhhhhhhhhbbb";
char const GameObjectsFormat[] = "nffffffffiiiiiiiishhhhbb";
char const GameObjectDisplayInfoFormat[] = "diffffffffh";
-char const GameTablesFormat[] = "dshb";
-char const GarrAbilityFormat[] = "nssihbbb";
+char const GarrAbilityFormat[] = "nssihhbb";
char const GarrBuildingFormat[] = "diissssihhhhhhbbbbbbbbbbb";
char const GarrBuildingPlotInstFormat[] = "nffhhb";
-char const GarrClassSpecFormat[] = "nssshbb";
-char const GarrFollowerFormat[] = "diissiihhbbbbbbbbbbbbbbbb";
+char const GarrClassSpecFormat[] = "nssshbbb";
+char const GarrFollowerFormat[] = "niissiihhbbbbbbbbbbbbbbbbbb";
char const GarrFollowerXAbilityFormat[] = "dhhb";
-char const GarrPlotFormat[] = "dsiibbbbb";
+char const GarrPlotFormat[] = "dsiihhbbb";
char const GarrPlotBuildingFormat[] = "dbb";
char const GarrPlotInstanceFormat[] = "dsb";
char const GarrSiteLevelFormat[] = "dffhhhbbbbb";
char const GarrSiteLevelPlotInstFormat[] = "dffhbb";
-char const GemPropertiesFormat[] = "dihhbb";
+char const GemPropertiesFormat[] = "dihh";
char const GlyphPropertiesFormat[] = "dihbb";
-char const GlyphSlotFormat[] = "dbb";
+char const GlyphSlotFormat[] = "dhb";
char const GuildColorBackgroundFormat[] = "dbbb";
char const GuildColorBorderFormat[] = "dbbb";
char const GuildColorEmblemFormat[] = "dbbb";
-char const GuildPerkSpellsFormat[] = "dib";
+char const GuildPerkSpellsFormat[] = "di";
char const HeirloomFormat[] = "nisiiiiihhbb";
char const HolidaysEntryFormat[] = "diiiiiiiiiiiiiiiiShhhhhhhhhhhbbbbbbbbbbbbbbbb";
char const ImportPriceArmorFormat[] = "dffff";
@@ -83,7 +89,7 @@ char const ImportPriceQualityFormat[] = "df";
char const ImportPriceShieldFormat[] = "df";
char const ImportPriceWeaponFormat[] = "df";
char const ItemFormat[] = "dibbbbbbb";
-char const ItemAppearanceFormat[] = "diib";
+char const ItemAppearanceFormat[] = "diiib";
char const ItemArmorQualityFormat[] = "dfffffffh";
char const ItemArmorShieldFormat[] = "dfffffffh";
char const ItemArmorTotalFormat[] = "dffffh";
@@ -101,24 +107,27 @@ char const ItemDisenchantLootFormat[] = "dhhhbbb";
char const ItemEffectFormat[] = "diiiihhhbb";
char const ItemExtendedCostFormat[] = "diiiiiiiiiiihhhhhhhhhhhbbbbb";
char const ItemLimitCategoryFormat[] = "dsbb";
-char const ItemModifiedAppearanceFormat[] = "nihbb";
+char const ItemModifiedAppearanceFormat[] = "nihbbb";
char const ItemPriceBaseFormat[] = "dffh";
char const ItemRandomPropertiesFormat[] = "dshhhhh";
char const ItemRandomSuffixFormat[] = "dsshhhhhhhhhh";
-char const ItemSetFormat[] = "dsiiiiiiiiiiiiiiiiihb";
+char const ItemSetFormat[] = "dsiiiiiiiiiiiiiiiiiihb";
char const ItemSetSpellFormat[] = "dihhb";
-char const ItemSparseFormat[] = "iiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
+char const ItemSparseFormat[] = "diiiffiiiiiiiiiiiiiiiiifffffffffffsssssififhhhhhhhhhhhhhhhhhhhhhhhhhhhhhbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
char const ItemSpecFormat[] = "dhbbbbb";
char const ItemSpecOverrideFormat[] = "dih";
-char const ItemToBattlePetSpeciesFormat[] = "dh";
char const ItemXBonusTreeFormat[] = "dih";
char const KeyChainFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
+char const LfgDungeonsFormat[] = "nsiSshhhhhhhhbbbbbbbbbbbbbbbbb";
+char const LightFormat[] = "dfffffhhhhhhhhh";
+char const LiquidTypeFormat[] = "dsifffffssssssiiffffffffffffffffffiiiihhbbbbbbbbbbb";
char const LockFormat[] = "diiiiiiiihhhhhhhhbbbbbbbbbbbbbbbb";
char const MailTemplateFormat[] = "ds";
-char const MapFormat[] = "nsiifffissshhhhhhbbbbb";
+char const MapFormat[] = "dsiifffssshhhhhhbbbbb";
+char const MapDifficultyFormat[] = "dsihbbbbb";
char const ModifierTreeFormat[] = "diihbbbb";
char const MountFormat[] = "niissshhhb";
-char const MountCapabilityFormat[] = "niihhhbb";
+char const MountCapabilityFormat[] = "niiihhhb";
char const MountTypeXCapabilityFormat[] = "dhhb";
char const MovieFormat[] = "diibb";
char const NameGenFormat[] = "dsbb";
@@ -134,15 +143,15 @@ char const PvpDifficultyFormat[] = "dhbbb";
char const QuestFactionRewardFormat[] = "dhhhhhhhhhh";
char const QuestMoneyRewardFormat[] = "diiiiiiiiii";
char const QuestPackageItemFormat[] = "dihbb";
-char const QuestSortFormat[] = "ds";
+char const QuestSortFormat[] = "dsb";
char const QuestV2Format[] = "dh";
char const QuestXPFormat[] = "dhhhhhhhhhh";
-char const RandPropPointsFormat[] = "dhhhhhhhhhhhhhhh";
+char const RandPropPointsFormat[] = "diiiiiiiiiiiiiii";
char const ScalingStatDistributionFormat[] = "dhbb";
char const SkillLineFormat[] = "dssshhbbb";
char const SkillLineAbilityFormat[] = "diiiihhhhhhbb";
-char const SkillRaceClassInfoFormat[] = "dihhhhbb";
-char const SoundKitFormat[] = "nsffffffffhhbbbbb";
+char const SkillRaceClassInfoFormat[] = "diihhhbb";
+char const SoundKitFormat[] = "nsffffffffhhhbbbb";
char const SpecializationSpellsFormat[] = "niishb";
char const SpellFormat[] = "nssssih";
char const SpellAuraOptionsFormat[] = "diiiihbbb";
@@ -150,7 +159,7 @@ char const SpellAuraRestrictionsFormat[] = "diiiiibbbbb";
char const SpellCastTimesFormat[] = "diih";
char const SpellCastingRequirementsFormat[] = "dihhhbbb";
char const SpellCategoriesFormat[] = "dihhhbbbbb";
-char const SpellCategoryFormat[] = "dsibbb";
+char const SpellCategoryFormat[] = "dsiibbb";
char const SpellClassOptionsFormat[] = "diiiiihb";
char const SpellCooldownsFormat[] = "diiiib";
char const SpellDurationFormat[] = "diih";
@@ -159,6 +168,7 @@ char const SpellEffectScalingFormat[] = "dfffi";
char const SpellEquippedItemsFormat[] = "diiib";
char const SpellFocusObjectFormat[] = "ds";
char const SpellInterruptsFormat[] = "diiiiihb";
+char const SpellItemEnchantmentFormat[] = "diiisfffiiihhhhhhhhbbbbbbbbb";
char const SpellItemEnchantmentConditionFormat[] = "dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
char const SpellLearnSpellFormat[] = "diii";
char const SpellLevelsFormat[] = "dihhhbb";
@@ -168,13 +178,14 @@ char const SpellPowerDifficultyFormat[] = "nbb";
char const SpellRadiusFormat[] = "dffff";
char const SpellRangeFormat[] = "dffffssb";
char const SpellReagentsFormat[] = "diiiiiiiiihhhhhhhh";
-char const SpellScalingFormat[] = "dihbb";
+char const SpellScalingFormat[] = "dihbbb";
char const SpellShapeshiftFormat[] = "diiiiib";
char const SpellShapeshiftFormFormat[] = "dsfihhhhhhhhhhhhhhbbb";
char const SpellTargetRestrictionsFormat[] = "diffihhbb";
char const SpellTotemsFormat[] = "diiibb";
char const SpellXSpellVisualFormat[] = "nifhhhbb";
char const SummonPropertiesFormat[] = "diiiii";
+char const TalentFormat[] = "diishbbbbbb";
char const TaxiNodesFormat[] = "nfffsiiffhhhb";
char const TaxiPathFormat[] = "nhhh";
char const TaxiPathNodeFormat[] = "nfffihhhhbb";
@@ -183,8 +194,12 @@ char const ToyFormat[] = "nisbb";
char const TransportAnimationFormat[] = "diifffb";
char const TransportRotationFormat[] = "diiffff";
char const UnitPowerBarFormat[] = "diffiiiiiiiiiiiissssffhhbbb";
-char const VehicleSeatFormat[] = "diiiffffffffffffffffffffffffffffffffffihhhhhhhhhhhhhhhhhhhhhbbbbbb";
-char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhh";
+char const VehicleFormat[] = "difffffffffffffffffffSSSSffhhhhhhhhhhhhbb";
+char const VehicleSeatFormat[] = "diiiffffffffffffffffffffffiiffffffffffffihhhhhhhhhhhhhhhhhhhbbbbbb";
+char const WMOAreaTableFormat[] = "nishhhhhhhbbbbb";
+char const WorldMapAreaFormat[] = "nSffffhhhhhhhbbbb";
+char const WorldMapOverlayFormat[] = "dShhhhhhhhhhhhhhb";
char const WorldMapTransformsFormat[] = "dfffffffffhhhhb";
+char const WorldSafeLocsFormat[] = "dffffsh";
#endif
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index f1f391f39ab..f71e105a62b 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -57,7 +57,7 @@ enum LevelLimit
enum BattlegroundBracketId // bracketId for level ranges
{
BG_BRACKET_ID_FIRST = 0,
- BG_BRACKET_ID_LAST = 10,
+ BG_BRACKET_ID_LAST = 11,
// must be max value in PvPDificulty slot + 1
MAX_BATTLEGROUND_BRACKETS
@@ -413,6 +413,25 @@ enum CriteriaTreeOperator
CRITERIA_TREE_OPERATOR_ANY = 8
};
+enum CharSectionFlags
+{
+ SECTION_FLAG_PLAYER = 0x01,
+ SECTION_FLAG_DEATH_KNIGHT = 0x04,
+ SECTION_FLAG_DEMON_HUNTER = 0x40
+};
+
+enum CharSectionType
+{
+ SECTION_TYPE_SKIN = 0,
+ SECTION_TYPE_FACE = 1,
+ SECTION_TYPE_FACIAL_HAIR = 2,
+ SECTION_TYPE_HAIR = 3,
+ SECTION_TYPE_UNDERWEAR = 4,
+ SECTION_TYPE_CUSTOM_DISPLAY_1 = 10,
+ SECTION_TYPE_CUSTOM_DISPLAY_2 = 12,
+ SECTION_TYPE_CUSTOM_DISPLAY_3 = 14
+};
+
enum Difficulty : uint8
{
DIFFICULTY_NONE = 0,
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
deleted file mode 100644
index 03e1c365bc7..00000000000
--- a/src/server/game/DataStores/DBCStores.cpp
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "DBCStores.h"
-#include "Log.h"
-#include "SharedDefines.h"
-#include "SpellInfo.h"
-#include "DBCfmt.h"
-#include "Timer.h"
-#include "DB2Stores.h"
-#include <map>
-
-struct WMOAreaTableTripple
-{
- WMOAreaTableTripple(int32 r, int32 a, int32 g) : groupId(g), rootId(r), adtId(a)
- {
- }
-
- bool operator <(const WMOAreaTableTripple& b) const
- {
- return memcmp(this, &b, sizeof(WMOAreaTableTripple))<0;
- }
-
- // ordered by entropy; that way memcmp will have a minimal medium runtime
- int32 groupId;
- int32 rootId;
- int32 adtId;
-};
-
-typedef std::multimap<uint32, CharSectionsEntry const*> CharSectionsMap;
-typedef std::map<uint32, std::vector<uint32>> FactionTeamMap;
-typedef std::map<WMOAreaTableTripple, WMOAreaTableEntry const*> WMOAreaInfoByTripple;
-
-DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore(BannedAddOnsfmt);
-DBCStorage<BattlemasterListEntry> sBattlemasterListStore(BattlemasterListfmt);
-
-DBCStorage<CharSectionsEntry> sCharSectionsStore(CharSectionsfmt);
-CharSectionsMap sCharSectionMap;
-DBCStorage<ChrClassesEntry> sChrClassesStore(ChrClassesfmt);
-DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt);
-
-DBCStorage<FactionEntry> sFactionStore(Factionfmt);
-static FactionTeamMap sFactionTeamMap;
-DBCStorage<FactionTemplateEntry> sFactionTemplateStore(FactionTemplatefmt);
-
-DBCStorage<LFGDungeonEntry> sLFGDungeonStore(LFGDungeonfmt);
-DBCStorage<LightEntry> sLightStore(Lightfmt);
-DBCStorage<LiquidTypeEntry> sLiquidTypeStore(LiquidTypefmt);
-
-DBCStorage<MapDifficultyEntry> sMapDifficultyStore(MapDifficultyfmt); // only for loading
-MapDifficultyMap sMapDifficultyMap;
-
-DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt);
-
-DBCStorage<TalentEntry> sTalentStore(Talentfmt);
-TalentsByPosition sTalentByPos;
-
-DBCStorage<VehicleEntry> sVehicleStore(Vehiclefmt);
-
-DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore(WMOAreaTablefmt);
-static WMOAreaInfoByTripple sWMOAreaInfoByTripple;
-DBCStorage<WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreafmt);
-DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsfmt);
-
-GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore;
-GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore;
-GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore;
-GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore;
-GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore;
-GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore;
-GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore;
-GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore;
-GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore[MAX_EXPANSIONS];
-GameTable<GtNpcDamageByClassEntry> sGtNpcDamageByClassStore[MAX_EXPANSIONS];
-GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore;
-GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore;
-GameTable<GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore;
-GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore;
-GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore;
-GameTable<GtSpellScalingEntry> sGtSpellScalingStore;
-
-typedef std::list<std::string> StoreProblemList;
-
-uint32 DBCFileCount = 0;
-uint32 GameTableCount = 0;
-
-template<class T>
-inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage<T>& storage, std::string const& dbcPath, std::string const& filename, uint32 defaultLocale, std::string const* customFormat = NULL, std::string const* customIndexName = NULL)
-{
- // compatibility format and C++ structure sizes
- ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T),
- "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).",
- filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T)));
-
- ++DBCFileCount;
- std::string dbcFilename = dbcPath + localeNames[defaultLocale] + '/' + filename;
- SqlDbc * sql = NULL;
- if (customFormat)
- sql = new SqlDbc(&filename, customFormat, customIndexName, storage.GetFormat());
-
- if (storage.Load(dbcFilename.c_str(), sql))
- {
- for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
- {
- if (i == LOCALE_none || !(availableDbcLocales & (1 << i)))
- continue;
-
- std::string localizedName(dbcPath);
- localizedName.append(localeNames[i]);
- localizedName.push_back('/');
- localizedName.append(filename);
-
- if (!storage.LoadStringsFrom(localizedName.c_str()))
- availableDbcLocales &= ~(1<<i); // mark as not available for speedup next checks
- }
- }
- else
- {
- // sort problematic dbc to (1) non compatible and (2) non-existed
- if (FILE* f = fopen(dbcFilename.c_str(), "rb"))
- {
- std::ostringstream stream;
- stream << dbcFilename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten.";
- std::string buf = stream.str();
- errors.push_back(buf);
- fclose(f);
- }
- else
- errors.push_back(dbcFilename);
- }
-
- delete sql;
-}
-
-template<class T>
-inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName, GameTable<T>& storage, std::string const& dbcPath, std::string const& filename)
-{
- // compatibility format and C++ structure sizes
- ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T),
- "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).",
- filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T)));
-
- ++GameTableCount;
- std::string dbcFilename = dbcPath + filename;
-
- if (storage.Load(dbcFilename.c_str()))
- {
- bool found = false;
- // Find table definition in GameTables.db2
- for (uint32 i = 0; i < sGameTablesStore.GetNumRows(); ++i)
- {
- GameTablesEntry const* gt = sGameTablesStore.LookupEntry(i);
- if (!gt)
- continue;
-
- for (uint32 l = 0; l < TOTAL_LOCALES; ++l)
- {
- if (l != LOCALE_none && tableName == gt->Name->Str[l])
- {
- found = true;
- storage.SetGameTableEntry(gt);
- break;
- }
- }
-
- if (found)
- break;
- }
-
- ASSERT(found, "Game table %s definition not found in GameTables.db2", tableName.c_str());
- }
- else
- {
- // sort problematic dbc to (1) non compatible and (2) non-existed
- if (FILE* f = fopen(dbcFilename.c_str(), "rb"))
- {
- std::ostringstream stream;
- stream << dbcFilename << " exists, and has " << storage.GetFieldCount() << " field(s) (expected " << strlen(storage.GetFormat()) << "). Extracted file might be from wrong client version or a database-update has been forgotten.";
- std::string buf = stream.str();
- errors.push_back(buf);
- fclose(f);
- }
- else
- errors.push_back(dbcFilename);
- }
-}
-
-void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale)
-{
- uint32 oldMSTime = getMSTime();
-
- std::string dbcPath = dataPath + "dbc/";
-
- StoreProblemList bad_dbc_files;
- uint32 availableDbcLocales = 0xFFFFFFFF;
-
-#define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file, defaultLocale)
-
- LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20810
- LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20810
- LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20810
- LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20810
- LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.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(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20810
- LOAD_DBC(sTalentStore, "Talent.dbc");//20810
- LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20810
- LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20810
- LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20810
- LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20810
-
-#undef LOAD_DBC
-
- for (uint32 i = 0; i < sCharSectionsStore.GetNumRows(); ++i)
- if (CharSectionsEntry const* entry = sCharSectionsStore.LookupEntry(i))
- 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 });
-
- for (uint32 i = 0; i < sFactionStore.GetNumRows(); ++i)
- {
- FactionEntry const* faction = sFactionStore.LookupEntry(i);
- if (faction && faction->ParentFactionID)
- sFactionTeamMap[faction->ParentFactionID].push_back(i);
- }
-
- // fill data
- for (uint32 i = 0; i < sMapDifficultyStore.GetNumRows(); ++i)
- if (MapDifficultyEntry const* entry = sMapDifficultyStore.LookupEntry(i))
- sMapDifficultyMap[entry->MapID][entry->DifficultyID] = entry;
- sMapDifficultyMap[0][0] = sMapDifficultyMap[1][0]; //map 0 is missing from MapDifficulty.dbc use this till its ported to sql
-
- for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i)
- {
- if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(i))
- {
- if (talentInfo->ClassID < MAX_CLASSES && talentInfo->TierID < MAX_TALENT_TIERS && talentInfo->ColumnIndex < MAX_TALENT_COLUMNS)
- sTalentByPos[talentInfo->ClassID][talentInfo->TierID][talentInfo->ColumnIndex].push_back(talentInfo);
- else
- TC_LOG_ERROR("server.loading", "Value of class (found: %u, max allowed %u) or (found: %u, max allowed %u) tier or column (found: %u, max allowed %u) is invalid.",
- talentInfo->ClassID, MAX_CLASSES, talentInfo->TierID, MAX_TALENT_TIERS, talentInfo->ColumnIndex, MAX_TALENT_COLUMNS);
- }
- }
-
- for (uint32 i = 0; i < sWMOAreaTableStore.GetNumRows(); ++i)
- if (WMOAreaTableEntry const* entry = sWMOAreaTableStore.LookupEntry(i))
- sWMOAreaInfoByTripple.insert(WMOAreaInfoByTripple::value_type(WMOAreaTableTripple(entry->WMOID, entry->NameSet, entry->WMOGroupID), entry));
-
- // error checks
- if (bad_dbc_files.size() >= DBCFileCount)
- {
- TC_LOG_ERROR("misc", "Incorrect DataDir value in worldserver.conf or ALL required *.dbc files (%d) not found by path: %sdbc/%s/", DBCFileCount, dataPath.c_str(), localeNames[defaultLocale]);
- exit(1);
- }
- else if (!bad_dbc_files.empty())
- {
- std::string str;
- for (StoreProblemList::iterator i = bad_dbc_files.begin(); i != bad_dbc_files.end(); ++i)
- str += *i + "\n";
-
- TC_LOG_ERROR("misc", "Some required *.dbc files (%u from %d) not found or not compatible:\n%s", (uint32)bad_dbc_files.size(), DBCFileCount, str.c_str());
- exit(1);
- }
-
- TC_LOG_INFO("server.loading", ">> Initialized %d DBC data stores in %u ms", DBCFileCount, GetMSTimeDiffToNow(oldMSTime));
-}
-
-void LoadGameTables(const std::string& dataPath, uint32 defaultLocale)
-{
- uint32 oldMSTime = getMSTime();
-
- std::string dbcPath = dataPath + "dbc/" + localeNames[defaultLocale] + '/';
-
- StoreProblemList bad_dbc_files;
-
-#define LOAD_GT(tableName, store, file) LoadGameTable(bad_dbc_files, tableName, store, dbcPath, file)
-
- LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20810
- LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20810
- LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20810
- LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 20810
- LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 20810
- LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 20810
- LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 20810
- LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 20810
- LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore[0], "gtNpcTotalHp.dbc"); // 20810
- LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpStore[1], "gtNpcTotalHpExp1.dbc"); // 20810
- LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpStore[2], "gtNpcTotalHpExp2.dbc"); // 20810
- LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpStore[3], "gtNpcTotalHpExp3.dbc"); // 20810
- LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpStore[4], "gtNpcTotalHpExp4.dbc"); // 20810
- LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpStore[5], "gtNpcTotalHpExp5.dbc"); // 20810
- LOAD_GT("NpcTotalHpExp6", sGtNpcTotalHpStore[6], "gtNpcTotalHpExp6.dbc"); // 20810
- LOAD_GT("NpcDamageByClass", sGtNpcDamageByClassStore[0], "gtNpcDamageByClass.dbc"); // 20810
- LOAD_GT("NpcDamageByClassExp1", sGtNpcDamageByClassStore[1], "gtNpcDamageByClassExp1.dbc"); // 20810
- LOAD_GT("NpcDamageByClassExp2", sGtNpcDamageByClassStore[2], "gtNpcDamageByClassExp2.dbc"); // 20810
- LOAD_GT("NpcDamageByClassExp3", sGtNpcDamageByClassStore[3], "gtNpcDamageByClassExp3.dbc"); // 20810
- LOAD_GT("NpcDamageByClassExp4", sGtNpcDamageByClassStore[4], "gtNpcDamageByClassExp4.dbc"); // 20810
- LOAD_GT("NpcDamageByClassExp5", sGtNpcDamageByClassStore[5], "gtNpcDamageByClassExp5.dbc"); // 20810
- LOAD_GT("NpcDamageByClassExp6", sGtNpcDamageByClassStore[6], "gtNpcDamageByClassExp6.dbc"); // 20810
- LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 20810
- LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 20810
- LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 20810
- LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 20810
- LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 20810
- LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 20810
-
-#undef LOAD_GT
-
- // error checks
- if (bad_dbc_files.size() >= GameTableCount)
- {
- TC_LOG_ERROR("misc", "Incorrect DataDir value in worldserver.conf or ALL required *.dbc GameTable files (%d) not found by path: %sdbc/%s/", DBCFileCount, dataPath.c_str(), localeNames[defaultLocale]);
- exit(1);
- }
- else if (!bad_dbc_files.empty())
- {
- std::string str;
- for (StoreProblemList::iterator i = bad_dbc_files.begin(); i != bad_dbc_files.end(); ++i)
- str += *i + "\n";
-
- TC_LOG_ERROR("misc", "Some required *.dbc GameTable files (%u from %d) not found or not compatible:\n%s", (uint32)bad_dbc_files.size(), GameTableCount, str.c_str());
- exit(1);
- }
-
- TC_LOG_INFO("server.loading", ">> Initialized %d DBC GameTables data stores in %u ms", GameTableCount, GetMSTimeDiffToNow(oldMSTime));
-}
-
-std::vector<uint32> const* GetFactionTeamList(uint32 faction)
-{
- FactionTeamMap::const_iterator itr = sFactionTeamMap.find(faction);
- if (itr != sFactionTeamMap.end())
- return &itr->second;
-
- return NULL;
-}
-
-WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid)
-{
- WMOAreaInfoByTripple::iterator i = sWMOAreaInfoByTripple.find(WMOAreaTableTripple(rootid, adtid, groupid));
- if (i == sWMOAreaInfoByTripple.end())
- return NULL;
- return i->second;
-}
-
-char const* GetClassName(uint8 class_, uint8 /*locale*/)
-{
- ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(class_);
- return classEntry ? classEntry->Name_lang : NULL;
-}
-
-uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
-{
- if (mapid != 530 && mapid != 571 && mapid != 732) // speed for most cases
- return mapid;
-
- if (WorldMapAreaEntry const* wma = sWorldMapAreaStore.LookupEntry(zoneId))
- return wma->DisplayMapID >= 0 ? wma->DisplayMapID : wma->MapID;
-
- return mapid;
-}
-
-uint32 GetMaxLevelForExpansion(uint32 expansion)
-{
- switch (expansion)
- {
- case EXPANSION_CLASSIC:
- return 60;
- case EXPANSION_THE_BURNING_CRUSADE:
- return 70;
- case EXPANSION_WRATH_OF_THE_LICH_KING:
- return 80;
- case EXPANSION_CATACLYSM:
- return 85;
- case EXPANSION_MISTS_OF_PANDARIA:
- return 90;
- case EXPANSION_WARLORDS_OF_DRAENOR:
- return 100;
- case EXPANSION_LEGION:
- return 110;
- default:
- break;
- }
- return 0;
-}
-
-uint32 GetExpansionForLevel(uint32 level)
-{
- if (level < 60)
- return EXPANSION_CLASSIC;
- else if (level < 70)
- return EXPANSION_THE_BURNING_CRUSADE;
- else if (level < 80)
- return EXPANSION_WRATH_OF_THE_LICH_KING;
- else if (level < 85)
- return EXPANSION_CATACLYSM;
- else if (level < 90)
- return EXPANSION_MISTS_OF_PANDARIA;
- else if (level < 100)
- return EXPANSION_WARLORDS_OF_DRAENOR;
- else
- return CURRENT_EXPANSION;
-}
-
-void Zone2MapCoordinates(float& x, float& y, uint32 worldMapAreaId)
-{
- WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId);
-
- // if not listed then map coordinates (instance)
- if (!maEntry)
- return;
-
- std::swap(x, y); // at client map coords swapped
- x = x*((maEntry->LocBottom-maEntry->LocTop)/100)+maEntry->LocTop;
- y = y*((maEntry->LocRight-maEntry->LocLeft)/100)+maEntry->LocLeft; // client y coord from top to down
-}
-
-void Map2ZoneCoordinates(float& x, float& y, uint32 worldMapAreaId)
-{
- WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId);
-
- // if not listed then map coordinates (instance)
- if (!maEntry)
- return;
-
- x = (x - maEntry->LocTop) / ((maEntry->LocBottom - maEntry->LocTop) / 100);
- y = (y - maEntry->LocLeft) / ((maEntry->LocRight - maEntry->LocLeft) / 100); // client y coord from top to down
- std::swap(x, y); // client have map coords swapped
-}
-
-MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty /*= nullptr*/)
-{
- auto itr = sMapDifficultyMap.find(mapId);
- if (itr == sMapDifficultyMap.end())
- return nullptr;
-
- if (itr->second.empty())
- return nullptr;
-
- for (auto& p : itr->second)
- {
- DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(p.first);
- if (!difficultyEntry)
- continue;
-
- if (difficultyEntry->Flags & DIFFICULTY_FLAG_DEFAULT)
- {
- if (difficulty)
- *difficulty = Difficulty(p.first);
-
- return p.second;
- }
- }
-
- if (difficulty)
- *difficulty = Difficulty(itr->second.begin()->first);
-
- return itr->second.begin()->second;
-}
-
-MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
-{
- auto itr = sMapDifficultyMap.find(mapId);
- if (itr == sMapDifficultyMap.end())
- return nullptr;
-
- auto diffItr = itr->second.find(difficulty);
- if (diffItr == itr->second.end())
- return nullptr;
-
- return diffItr->second;
-}
-
-MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
-{
- DifficultyEntry const* diffEntry = sDifficultyStore.LookupEntry(difficulty);
- if (!diffEntry)
- return GetDefaultMapDifficulty(mapId, &difficulty);
-
- uint32 tmpDiff = difficulty;
- MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff));
- while (!mapDiff)
- {
- tmpDiff = diffEntry->FallbackDifficultyID;
- diffEntry = sDifficultyStore.LookupEntry(tmpDiff);
- if (!diffEntry)
- return GetDefaultMapDifficulty(mapId, &difficulty);
-
- // pull new data
- mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); // we are 10 normal or 25 normal
- }
-
- difficulty = Difficulty(tmpDiff);
- return mapDiff;
-}
-
-uint32 GetLiquidFlags(uint32 liquidType)
-{
- if (LiquidTypeEntry const* liq = sLiquidTypeStore.LookupEntry(liquidType))
- return 1 << liq->Type;
-
- return 0;
-}
-
-CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color)
-{
- std::pair<CharSectionsMap::const_iterator, CharSectionsMap::const_iterator> eqr = sCharSectionMap.equal_range(uint32(genType) | uint32(gender << 8) | uint32(race << 16));
- for (CharSectionsMap::const_iterator itr = eqr.first; itr != eqr.second; ++itr)
- {
- if (itr->second->Type == type && itr->second->Color == color)
- return itr->second;
- }
-
- return NULL;
-}
-
-/// Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple dungeons use the same map (such as Scarlet Monastery)
-LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty)
-{
- for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i)
- {
- LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i);
- if (!dungeon)
- continue;
-
- if (dungeon->MapID == int32(mapId) && Difficulty(dungeon->DifficultyID) == difficulty)
- return dungeon;
- }
-
- return NULL;
-}
-
-uint32 GetDefaultMapLight(uint32 mapId)
-{
- for (int32 i = sLightStore.GetNumRows(); i >= 0; --i)
- {
- LightEntry const* light = sLightStore.LookupEntry(uint32(i));
- if (!light)
- continue;
-
- if (light->MapID == mapId && light->Pos.X == 0.0f && light->Pos.Y == 0.0f && light->Pos.Z == 0.0f)
- return light->ID;
- }
-
- return 0;
-}
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
deleted file mode 100644
index ef8056a06fc..00000000000
--- a/src/server/game/DataStores/DBCStores.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TRINITY_DBCSTORES_H
-#define TRINITY_DBCSTORES_H
-
-#include "DBCStore.h"
-#include "DBCStructure.h"
-#include "DB2Structure.h"
-#include "SharedDefines.h"
-
-// CharSections
-TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color);
-
-// ChrClasses
-TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale);
-
-// Faction
-TC_GAME_API std::vector<uint32> const* GetFactionTeamList(uint32 faction);
-
-// LfgDungeons
-TC_GAME_API LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty);
-
-// Light
-TC_GAME_API uint32 GetDefaultMapLight(uint32 mapId);
-
-// LiquidType
-TC_GAME_API uint32 GetLiquidFlags(uint32 liquidType);
-
-// MapDifficulty
-typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyMap;
-TC_GAME_API MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr);
-TC_GAME_API MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty);
-TC_GAME_API MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty);
-
-// Talent
-typedef std::vector<TalentEntry const*> TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS];
-
-// WMOAreaTable
-TC_GAME_API WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid);
-
-// WorldMapArea
-TC_GAME_API uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId);
-TC_GAME_API void Zone2MapCoordinates(float &x, float &y, uint32 worldMapAreaId);
-TC_GAME_API void Map2ZoneCoordinates(float &x, float &y, uint32 worldMapAreaId);
-
-TC_GAME_API uint32 GetMaxLevelForExpansion(uint32 expansion);
-TC_GAME_API uint32 GetExpansionForLevel(uint32 level);
-
-template<class T>
-class GameTable
-{
-public:
- GameTable() : _storage("df"), _gtEntry(nullptr) { }
-
- void SetGameTableEntry(GameTablesEntry const* gtEntry) { _gtEntry = gtEntry; }
-
- T const* EvaluateTable(uint32 row, uint32 column) const
- {
- ASSERT(row < _gtEntry->NumRows, "Requested row %u from GameTable %s but there are only %u rows!", row, _gtEntry->Name->Str[0], _gtEntry->NumRows);
- ASSERT(column < _gtEntry->NumColumns, "Requested column %u from GameTable %s but there are only %u columns!", column, _gtEntry->Name->Str[0], _gtEntry->NumColumns);
-
- return _storage.LookupEntry(_gtEntry->NumRows * column + row);
- }
-
- char const* GetFormat() const { return _storage.GetFormat(); }
- uint32 GetFieldCount() const { return _storage.GetFieldCount(); }
- bool Load(char const* fileName) { return _storage.Load(fileName, nullptr); }
-
- uint32 GetTableRowCount() const { return _gtEntry->NumRows; }
- uint32 GetTableColumnCount() const { return _gtEntry->NumColumns; }
-
-private:
- DBCStorage<T> _storage;
- GameTablesEntry const* _gtEntry;
-};
-
-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<ChrClassesEntry> sChrClassesStore;
-TC_GAME_API extern DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore;
-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 MapDifficultyMap sMapDifficultyMap;
-TC_GAME_API extern DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore;
-TC_GAME_API extern DBCStorage<TalentEntry> sTalentStore;
-TC_GAME_API extern TalentsByPosition sTalentByPos;
-TC_GAME_API extern DBCStorage<VehicleEntry> sVehicleStore;
-TC_GAME_API extern DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore;
-TC_GAME_API extern DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore;
-
-TC_GAME_API extern GameTable<GtArmorMitigationByLvlEntry> sGtArmorMitigationByLvlStore;
-TC_GAME_API extern GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore;
-TC_GAME_API extern GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore;
-TC_GAME_API extern GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore;
-TC_GAME_API extern GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore;
-TC_GAME_API extern GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore;
-TC_GAME_API extern GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore;
-TC_GAME_API extern GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore;
-TC_GAME_API extern GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore;
-TC_GAME_API extern GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore[MAX_EXPANSIONS];
-TC_GAME_API extern GameTable<GtNpcDamageByClassEntry> sGtNpcDamageByClassStore[MAX_EXPANSIONS];
-TC_GAME_API extern GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore;
-TC_GAME_API extern GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore;
-TC_GAME_API extern GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore;
-TC_GAME_API extern GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore;
-TC_GAME_API extern GameTable<GtSpellScalingEntry> sGtSpellScalingStore;
-TC_GAME_API extern GameTable<GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore;
-
-TC_GAME_API void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale);
-TC_GAME_API void LoadGameTables(const std::string& dataPath, uint32 defaultLocale);
-
-#endif
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
deleted file mode 100644
index d831231cb88..00000000000
--- a/src/server/game/DataStores/DBCStructure.h
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TRINITY_DBCSTRUCTURE_H
-#define TRINITY_DBCSTRUCTURE_H
-
-#include "Common.h"
-#include "DBCEnums.h"
-#include "Util.h"
-
-// Structures using to access raw DBC data and required packing to portability
-#pragma pack(push, 1)
-
-struct BannedAddOnsEntry
-{
- uint32 ID; // 0
- //uint32 NameMD5[4]; // 1
- //uint32 VersionMD5[4]; // 2
- //uint32 LastModified; // 3
- //uint32 Flags; // 4
-};
-
-struct BattlemasterListEntry
-{
- uint32 ID; // 0
- int32 MapID[16]; // 1-16 mapid
- uint32 InstanceType; // 17 map type (3 - BG, 4 - arena)
- //uint32 GroupsAllowed; // 18 (0 or 1)
- char* Name_lang; // 19
- uint32 MaxGroupSize; // 20 maxGroupSize, used for checking if queue as group
- uint32 HolidayWorldState; // 21 new 3.1
- uint32 MinLevel; // 22, min level (sync with PvPDifficulty.dbc content)
- uint32 MaxLevel; // 23, max level (sync with PvPDifficulty.dbc content)
- //uint32 RatedPlayers; // 24 4.0.1
- //uint32 MinPlayers; // 25 - 4.0.6.13596
- //uint32 MaxPlayers; // 26 4.0.1
- //uint32 Flags; // 27 4.0.3, value 2 for Rated Battlegrounds
- //uint32 IconFileDataID; // 28
- //char* GameType_lang; // 29
- //uint32 PlayerConditionID; // 30
-};
-
-enum CharSectionFlags
-{
- SECTION_FLAG_PLAYER = 0x01,
- SECTION_FLAG_DEATH_KNIGHT = 0x04,
- SECTION_FLAG_DEMON_HUNTER = 0x40
-};
-
-enum CharSectionType
-{
- SECTION_TYPE_SKIN = 0,
- SECTION_TYPE_FACE = 1,
- SECTION_TYPE_FACIAL_HAIR = 2,
- SECTION_TYPE_HAIR = 3,
- SECTION_TYPE_UNDERWEAR = 4,
- SECTION_TYPE_CUSTOM_DISPLAY_1 = 10,
- SECTION_TYPE_CUSTOM_DISPLAY_2 = 12,
- SECTION_TYPE_CUSTOM_DISPLAY_3 = 14
-};
-
-struct CharSectionsEntry
-{
- //uint32 Id;
- uint32 Race;
- uint32 Gender;
- uint32 GenType;
- //uint32 TextureFileDataID[3];
- uint32 Flags;
- uint32 Type;
- uint32 Color;
-};
-
-struct ChrClassesEntry
-{
- uint32 ID; // 0
- uint32 PowerType; // 1
- //char* PetNameToken // 2
- char* Name_lang; // 3
- //char* NameFemale_lang; // 4
- //char* NameMale_lang; // 5
- //char* Filename; // 6
- uint32 SpellClassSet; // 7
- //uint32 Flags; // 8
- uint32 CinematicSequenceID; // 9
- uint32 AttackPowerPerStrength; // 10 Attack Power bonus per point of strength
- uint32 AttackPowerPerAgility; // 11 Attack Power bonus per point of agility
- uint32 RangedAttackPowerPerAgility; // 12 Ranged Attack Power bonus per point of agility
- uint32 DefaultSpec; // 13
- //uint32 CreateScreenFileDataID; // 14
- //uint32 SelectScreenFileDataID; // 15
- //uint32 LowResScreenFileDataID; // 16
- //uint32 IconFileDataID; // 17
- //uint32 Unk1; // 18
-};
-
-struct CreatureModelDataEntry
-{
- uint32 ID; // 0
- uint32 Flags; // 1
- uint32 FileDataID; // 2
- //uint32 SizeClass; // 3
- //float ModelScale; // 4
- //uint32 BloodID; // 5
- //uint32 FootprintTextureID; // 6
- //float FootprintTextureLength; // 7
- //float FootprintTextureWidth; // 8
- //float FootprintParticleScale; // 9
- //uint32 FoleyMaterialID; // 10
- //uint32 Unk700_1; // 11
- //uint32 Unk700_2; // 12
- //uint32 FootstepShakeSize; // 13
- //uint32 DeathThudShakeSize; // 14
- //uint32 SoundID; // 15
- //float CollisionWidth; // 16
- float CollisionHeight; // 17
- float MountHeight; // 18
- //float GeoBoxMin[3]; // 19-21
- //float GeoBoxMax[3]; // 22-24
- //float WorldEffectScale; // 25
- //float AttachedEffectScale; // 26
- //float MissileCollisionRadius; // 27
- //float MissileCollisionPush; // 28
- //float MissileCollisionRaise; // 29
- //float OverrideLootEffectScale; // 30
- //float OverrideNameScale; // 31
- //float OverrideSelectionRadius; // 32
- //float TamedPetBaseScale; // 33
- //uint32 CreatureGeosetDataID; // 34
- //float HoverHeight; // 35
-};
-
-/* not used
-struct CurrencyCategoryEntry
-{
- uint32 ID; // 0
- uint32 Unk1; // 1 0 for known categories and 3 for unknown one (3.0.9)
- char* Name[16]; // 2-17 name
- // // 18 string flags
-};
-*/
-
-struct FactionEntry
-{
- uint32 ID; // 0
- int32 ReputationIndex; // 1
- uint32 ReputationRaceMask[4]; // 2-5
- uint32 ReputationClassMask[4]; // 6-9
- int32 ReputationBase[4]; // 10-13
- uint32 ReputationFlags[4]; // 14-17
- uint32 ParentFactionID; // 18
- float ParentFactionModIn; // 19 Faction gains incoming rep * ParentFactionModIn
- float ParentFactionModOut; // 20 Faction outputs rep * ParentFactionModOut as spillover reputation
- uint32 ParentFactionCapIn; // 21 The highest rank the faction will profit from incoming spillover
- //uint32 ParentFactionCapOut; // 22
- char* Name_lang; // 23
- //char* Description_lang; // 24
- uint32 Expansion; // 25
- //uint32 Flags; // 26
- //uint32 FriendshipRepID; // 27
-
- // helpers
- bool CanHaveReputation() const
- {
- return ReputationIndex >= 0;
- }
-};
-
-#define MAX_FACTION_RELATIONS 4
-
-struct FactionTemplateEntry
-{
- uint32 ID; // 0
- uint32 Faction; // 1
- uint32 Flags; // 2
- uint32 Mask; // 3 m_factionGroup
- uint32 FriendMask; // 4 m_friendGroup
- uint32 EnemyMask; // 5 m_enemyGroup
- uint32 Enemies[MAX_FACTION_RELATIONS]; // 6
- uint32 Friends[MAX_FACTION_RELATIONS]; // 10
- //------------------------------------------------------- end structure
-
- // helpers
- bool IsFriendlyTo(FactionTemplateEntry const& entry) const
- {
- if (ID == entry.ID)
- return true;
- if (entry.Faction)
- {
- for (int i = 0; i < MAX_FACTION_RELATIONS; ++i)
- if (Enemies[i] == entry.Faction)
- return false;
- for (int i = 0; i < MAX_FACTION_RELATIONS; ++i)
- if (Friends[i] == entry.Faction)
- return true;
- }
- return (FriendMask & entry.Mask) || (Mask & entry.FriendMask);
- }
- bool IsHostileTo(FactionTemplateEntry const& entry) const
- {
- if (ID == entry.ID)
- return false;
- if (entry.Faction)
- {
- for (int i = 0; i < MAX_FACTION_RELATIONS; ++i)
- if (Enemies[i] == entry.Faction)
- return true;
- for (int i = 0; i < MAX_FACTION_RELATIONS; ++i)
- if (Friends[i] == entry.Faction)
- return false;
- }
- return (EnemyMask & entry.Mask) != 0;
- }
- bool IsHostileToPlayers() const { return (EnemyMask & FACTION_MASK_PLAYER) !=0; }
- bool IsNeutralToAll() const
- {
- for (int i = 0; i < MAX_FACTION_RELATIONS; ++i)
- if (Enemies[i] != 0)
- return false;
- return EnemyMask == 0 && FriendMask == 0;
- }
- bool IsContestedGuardFaction() const { return (Flags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD) != 0; }
-};
-
-struct GtArmorMitigationByLvlEntry
-{
- //uint32 level;
- float KFactor;
-};
-
-struct GtBarberShopCostBaseEntry
-{
- //uint32 level;
- float cost;
-};
-
-struct GtCombatRatingsEntry
-{
- //uint32 level;
- float ratio;
-};
-
-struct GtChanceToMeleeCritBaseEntry
-{
- //uint32 level;
- float base;
-};
-
-struct GtChanceToMeleeCritEntry
-{
- //uint32 level;
- float ratio;
-};
-
-struct GtChanceToSpellCritBaseEntry
-{
- float base;
-};
-
-struct GtItemSocketCostPerLevelEntry
-{
- float ratio;
-};
-
-struct GtNPCManaCostScalerEntry
-{
- float ratio;
-};
-
-struct GtNpcDamageByClassEntry
-{
- float Damage;
-};
-
-struct GtNpcTotalHpEntry
-{
- float HP;
-};
-
-struct GtChanceToSpellCritEntry
-{
- float ratio;
-};
-
-struct GtOCTLevelExperienceEntry
-{
- float Data;
-};
-
-struct GtOCTRegenHPEntry
-{
- float ratio;
-};
-
-struct GtOCTRegenMPEntry
-{
- float ratio;
-};
-
-struct GtOCTHpPerStaminaEntry
-{
- float ratio;
-};
-
-struct GtRegenHPPerSptEntry
-{
- float ratio;
-};
-
-struct GtRegenMPPerSptEntry
-{
- float ratio;
-};
-
-struct GtSpellScalingEntry
-{
- float value;
-};
-
-struct GtOCTBaseHPByClassEntry
-{
- float ratio;
-};
-
-struct GtOCTBaseMPByClassEntry
-{
- float ratio;
-};
-
-struct ItemDisplayInfoEntry
-{
- uint32 ID; // 0
- //char* ModelName[2]; // 1-2
- //char* ModelTexture[2]; // 3-4
- //uint32 GeoSetGroup[3]; // 5-7
- //uint32 Flags; // 8
- //uint32 SpellVisualID; // 9
- //uint32 HelmetGeosetVis[2]; // 10-11
- //char* Texture[9]; // 12-20
- //uint32 ItemVisual; // 21
- //uint32 ParticleColorID; // 22
-};
-
-struct LFGDungeonEntry
-{
- uint32 ID; // 0
- char* Name_lang; // 1
- uint32 MinLevel; // 2
- uint32 MaxLevel; // 3
- uint32 TargetLevel; // 4
- //uint32 TargetLevelMin; // 5
- //uint32 TargetLevelMax; // 6
- int32 MapID; // 7
- uint32 DifficultyID; // 8
- uint32 Flags; // 9
- uint32 Type; // 10
- //uint32 Faction; // 11
- //char* TextureFilename; // 12
- uint32 Expansion; // 13
- //uint32 OrderIndex; // 14
- uint32 GroupID; // 15
- //char* Description_lang; // 16
- //uint32 RandomID; // 17
- //uint32 CountTank; // 18
- //uint32 CountHealer; // 19
- //uint32 CountDamage; // 20
- //uint32 MinCountTank; // 21
- //uint32 MinCountHealer; // 22
- //uint32 MinCountDamage; // 23
- //uint32 ScenarioID; // 24
- //uint32 SubType; // 25
- //uint32 LastBossJournalEncounterID; // 26
- //uint32 BonusReputationAmount; // 27
- //uint32 MentorCharLevel; // 28
- //uint32 MentorItemLevel; // 29
-
- // Helpers
- uint32 Entry() const { return ID + (Type << 24); }
-};
-
-struct LightEntry
-{
- uint32 ID; // 0
- uint32 MapID; // 1
- DBCPosition3D Pos; // 2-4
- //float FalloffStart; // 5
- //float FalloffEnd; // 6
- //uint32 LightParamsID[8]; // 7-14
-};
-
-struct LiquidTypeEntry
-{
- uint32 ID; // 0
- //char* Name; // 1
- //uint32 Flags; // 2
- uint32 Type; // 3 m_soundBank
- //uint32 SoundID; // 4
- uint32 SpellID; // 5
- //float MaxDarkenDepth; // 6
- //float FogDarkenIntensity; // 7
- //float AmbDarkenIntensity; // 8
- //float DirDarkenIntensity; // 9
- //uint32 LightID; // 10
- //float ParticleScale; // 11
- //uint32 ParticleMovement; // 12
- //uint32 ParticleTexSlots; // 13
- //uint32 MaterialID; // 14
- //char* Texture[6]; // 15-20
- //uint32 DepthTexCount[6] // 21-26
- //uint32 Color[2]; // 27-28
- //float Float[18]; // 29-46
- //uint32 Int[4]; // 47-50
-};
-
-struct MapDifficultyEntry
-{
- //uint32 ID; // 0
- uint32 MapID; // 1
- uint32 DifficultyID; // 2 (for arenas: arena slot)
- char* Message_lang; // 3 m_message_lang (text showed when transfer to map failed)
- uint32 RaidDuration; // 4 m_raidDuration in secs, 0 if no fixed reset time
- uint32 MaxPlayers; // 5 m_maxPlayers some heroic versions have 0 when expected same amount as in normal version
- uint32 LockID; // 6
- uint32 ItemBonusTreeModID; // 7
-
- bool HasMessage() const { return Message_lang[0] != '\0'; }
-};
-
-#define MAX_ITEM_ENCHANTMENT_EFFECTS 3
-
-struct SpellItemEnchantmentEntry
-{
- uint32 ID; // 0
- uint32 Charges; // 1
- uint32 Effect[MAX_ITEM_ENCHANTMENT_EFFECTS]; // 2-4
- uint32 EffectPointsMin[MAX_ITEM_ENCHANTMENT_EFFECTS]; // 5-7
- uint32 EffectSpellID[MAX_ITEM_ENCHANTMENT_EFFECTS]; // 8-10
- //char* Name_lang // 11
- uint32 ItemVisual; // 12
- uint32 Flags; // 13
- uint32 ConditionID; // 14
- uint32 RequiredSkillID; // 15
- uint32 RequiredSkillRank; // 16
- uint32 MinLevel; // 17
- uint32 MaxLevel; // 18
- uint32 ItemLevel; // 19
- int32 ScalingClass; // 20
- int32 ScalingClassRestricted; // 21
- float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];//22-24
- //uint32 PlayerConditionID; // 25
- //uint32 TransmogCost; // 26
- //uint32 TextureFileDataID; // 27
-};
-
-struct StableSlotPricesEntry
-{
- uint32 Slot;
- uint32 Price;
-};
-
-#define MAX_TALENT_TIERS 7
-#define MAX_TALENT_COLUMNS 3
-
-struct TalentEntry
-{
- uint32 ID; // 0
- uint32 SpecID; // 1 0 - any specialization
- uint32 TierID; // 2 0-6
- uint32 ColumnIndex; // 3 0-2
- uint32 SpellID; // 4
- uint32 Flags; // 5 All 0
- uint32 CategoryMask[2]; // 6 All 0
- uint32 ClassID; // 7
- uint32 OverridesSpellID; // 8 spellid that is replaced by talent
- //char* Description_lang
-};
-
-#define MAX_VEHICLE_SEATS 8
-
-struct VehicleEntry
-{
- uint32 ID; // 0
- uint32 Flags; // 1
- uint32 FlagsB; // 2
- float TurnSpeed; // 3
- float PitchSpeed; // 4
- float PitchMin; // 5
- float PitchMax; // 6
- uint32 SeatID[MAX_VEHICLE_SEATS]; // 7-14
- float MouseLookOffsetPitch; // 15
- float CameraFadeDistScalarMin; // 16
- float CameraFadeDistScalarMax; // 17
- float CameraPitchOffset; // 18
- float FacingLimitRight; // 19
- float FacingLimitLeft; // 20
- float MsslTrgtTurnLingering; // 21
- float MsslTrgtPitchLingering; // 22
- float MsslTrgtMouseLingering; // 23
- float MsslTrgtEndOpacity; // 24
- float MsslTrgtArcSpeed; // 25
- float MsslTrgtArcRepeat; // 26
- float MsslTrgtArcWidth; // 27
- float MsslTrgtImpactRadius[2]; // 28-29
- //char* MsslTrgtArcTexture; // 30
- //char* MsslTrgtImpactTexture; // 31
- //char* MsslTrgtImpactModel; // 32-33
- float CameraYawOffset; // 34
- uint32 UILocomotionType; // 35
- float MsslTrgtImpactTexRadius; // 36
- uint32 VehicleUIIndicatorID; // 37
- uint32 PowerDisplayID[3]; // 38-40
-};
-
-struct WMOAreaTableEntry
-{
- uint32 ID; // 0 index
- int32 WMOID; // 1 used in root WMO
- int32 NameSet; // 2 used in adt file
- int32 WMOGroupID; // 3 used in group WMO
- //uint32 SoundProviderPref; // 4
- //uint32 SoundProviderPrefUnderwater; // 5
- //uint32 AmbienceID; // 6
- //uint32 ZoneMusic; // 7
- //uint32 IntroSound; // 8
- uint32 Flags; // 9 used for indoor/outdoor determination
- uint32 AreaTableID; // 10 link to AreaTableEntry.ID
- //char* AreaName_lang; // 11 m_AreaName_lang
- //uint32 UWIntroSound; // 12
- //uint32 UWZoneMusic; // 13
- //uint32 UWAmbience; // 14
-};
-
-struct WorldMapAreaEntry
-{
- //uint32 ID; // 0
- uint32 MapID; // 1
- uint32 AreaID; // 2 index (continent 0 areas ignored)
- //char* AreaName // 3
- float LocLeft; // 4
- float LocRight; // 5
- float LocTop; // 6
- float LocBottom; // 7
- int32 DisplayMapID; // 8 -1 (map_id have correct map) other: virtual map where zone show (map_id - where zone in fact internally)
- //int32 DefaultDungeonFloor; // 9 pointer to DungeonMap.dbc (owerride loc coordinates)
- //uint32 ParentWorldMapID; // 10
- //uint32 Flags; // 11
- //uint32 LevelRangeMin; // 12 Minimum recommended level displayed on world map
- //uint32 LevelRangeMax; // 13 Maximum recommended level displayed on world map
-};
-
-struct WorldSafeLocsEntry
-{
- uint32 ID; // 0
- uint32 MapID; // 1
- DBCPosition3D Loc; // 2-4
- float Facing; // 5 values are in degrees
- //char* AreaName_lang; // 6
-};
-
-/*
-struct WorldStateSounds
-{
- uint32 ID; // 0 Worldstate
- uint32 unk; // 1
- uint32 areaTable; // 2
- uint32 WMOAreaTable; // 3
- uint32 zoneIntroMusicTable; // 4
- uint32 zoneIntroMusic; // 5
- uint32 zoneMusic; // 6
- uint32 soundAmbience; // 7
- uint32 soundProviderPreferences; // 8
-};
-*/
-
-/*
-struct WorldStateUI
-{
- uint32 ID; // 0
- uint32 map_id; // 1 Can be -1 to show up everywhere.
- uint32 zone; // 2 Can be zero for "everywhere".
- uint32 phaseMask; // 3 Phase this WorldState is avaliable in
- uint32 icon; // 4 The icon that is used in the interface.
- char* textureFilename; // 5
- char* text; // 6-21 The worldstate text
- char* description; // 22-38 Text shown when hovering mouse on icon
- uint32 worldstateID; // 39 This is the actual ID used
- uint32 type; // 40 0 = unknown, 1 = unknown, 2 = not shown in ui, 3 = wintergrasp
- uint32 unk1; // 41
- uint32 unk2; // 43
- uint32 unk3; // 44-58
- uint32 unk4; // 59-61 Used for some progress bars.
- uint32 unk7; // 62 Unused in 3.3.5a
-};
-*/
-
-#pragma pack(pop)
-
-typedef std::map<uint32, uint32> TalentSpellPosMap;
-#endif
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 8b2e729a2be..3027402f596 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -22,23 +22,5 @@
// 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 BannedAddOnsfmt[] = "nxxxxxxxxxx";
-char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx";
-char const CharSectionsfmt[] = "diiixxxiii";
-char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx";
-char const CreatureModelDatafmt[] = "niixxxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx";
-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 MapDifficultyfmt[] = "diisiiii";
-char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiifffxxx";
-char const Talentfmt[] = "niiiiiiiiix";
-char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii";
-char const WMOAreaTablefmt[] = "niiixxxxxiixxxx";
-char const WorldMapAreafmt[] = "xinxffffixxxxx";
-char const WorldSafeLocsfmt[] = "niffffx";
#endif
diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp
new file mode 100644
index 00000000000..23319e27734
--- /dev/null
+++ b/src/server/game/DataStores/GameTables.cpp
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "GameTables.h"
+#include "Timer.h"
+#include "Log.h"
+#include "Util.h"
+#include <boost/filesystem/path.hpp>
+#include <fstream>
+
+GameTable<GtBarberShopCostBaseEntry> sBarberShopCostBaseGameTable;
+GameTable<GtBaseMPEntry> sBaseMPGameTable;
+GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable;
+GameTable<GtHpPerStaEntry> sHpPerStaGameTable;
+GameTable<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable;
+GameTable<GtNpcDamageByClassEntry> sNpcDamageByClassGameTable[MAX_EXPANSIONS];
+GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable;
+GameTable<GtNpcTotalHpEntry> sNpcTotalHpGameTable[MAX_EXPANSIONS];
+GameTable<GtSpellScalingEntry> sSpellScalingGameTable;
+GameTable<GtXpEntry> sXpGameTable;
+
+template<class T>
+inline uint32 LoadGameTable(std::vector<std::string>& errors, GameTable<T>& storage, boost::filesystem::path const& path)
+{
+ std::ifstream stream(path.string());
+ if (!stream)
+ {
+ errors.push_back(Trinity::StringFormat("GameTable file %s cannot be opened.", path.string().c_str()));
+ return 0;
+ }
+
+ std::string headers;
+ if (!std::getline(stream, headers))
+ {
+ errors.push_back(Trinity::StringFormat("GameTable file %s is empty.", path.string().c_str()));
+ return 0;
+ }
+
+ Tokenizer columnDefs(headers, '\t');
+
+ ASSERT(columnDefs.size() - 1 == sizeof(T) / sizeof(float),
+ "GameTable '%s' has different count of columns " SZFMTD " than expected by size of C++ structure (" SZFMTD ").",
+ path.string().c_str(), columnDefs.size() - 1, sizeof(T) / sizeof(float));
+
+ std::vector<T> data;
+ data.emplace_back(); // row id 0, unused
+
+ std::string line;
+ while (std::getline(stream, line))
+ {
+ if (line.empty())
+ break;
+
+ Tokenizer values(line, '\t', columnDefs.size());
+ ASSERT(values.size() == columnDefs.size());
+
+ ASSERT(strtol(values[0], nullptr, 10) == data.size(),
+ "Unexpected row identifier %u at row " SZFMTD " (expected " SZFMTD ")",
+ strtol(values[0], nullptr, 10), data.size(), data.size());
+
+ data.emplace_back();
+ float* row = reinterpret_cast<float*>(&data.back());
+ for (std::size_t col = 1; col < columnDefs.size(); ++col)
+ *row++ = strtof(values[col], nullptr);
+ }
+
+ storage.SetData(std::move(data));
+ return 1;
+}
+
+void LoadGameTables(std::string const& dataPath)
+{
+ uint32 oldMSTime = getMSTime();
+
+ boost::filesystem::path gtPath(dataPath);
+ gtPath /= "gt";
+
+ std::vector<std::string> bad_gt_files;
+ uint32 gameTableCount = 0;
+
+#define LOAD_GT(store, file) gameTableCount += LoadGameTable(bad_gt_files, store, gtPath / file)
+
+ LOAD_GT(sBarberShopCostBaseGameTable, "BarberShopCostBase.txt");
+ LOAD_GT(sBaseMPGameTable, "BaseMp.txt");
+ LOAD_GT(sCombatRatingsGameTable, "CombatRatings.txt");
+ LOAD_GT(sItemSocketCostPerLevelGameTable, "ItemSocketCostPerLevel.txt");
+ LOAD_GT(sHpPerStaGameTable, "HpPerSta.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[0], "NpcDamageByClass.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[1], "NpcDamageByClassExp1.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[2], "NpcDamageByClassExp2.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[3], "NpcDamageByClassExp3.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[4], "NpcDamageByClassExp4.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[5], "NpcDamageByClassExp5.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[6], "NpcDamageByClassExp6.txt");
+ LOAD_GT(sNpcManaCostScalerGameTable, "NpcManaCostScaler.txt");
+ LOAD_GT(sNpcTotalHpGameTable[0], "NpcTotalHp.txt");
+ LOAD_GT(sNpcTotalHpGameTable[1], "NpcTotalHpExp1.txt");
+ LOAD_GT(sNpcTotalHpGameTable[2], "NpcTotalHpExp2.txt");
+ LOAD_GT(sNpcTotalHpGameTable[3], "NpcTotalHpExp3.txt");
+ LOAD_GT(sNpcTotalHpGameTable[4], "NpcTotalHpExp4.txt");
+ LOAD_GT(sNpcTotalHpGameTable[5], "NpcTotalHpExp5.txt");
+ LOAD_GT(sNpcTotalHpGameTable[6], "NpcTotalHpExp6.txt");
+ LOAD_GT(sSpellScalingGameTable, "SpellScaling.txt");
+ LOAD_GT(sXpGameTable, "xp.txt");
+
+#undef LOAD_GT
+
+ // error checks
+ if (!bad_gt_files.empty())
+ {
+ std::ostringstream str;
+ for (std::string const& err : bad_gt_files)
+ str << err << std::endl;
+
+ WPFatal("misc", "Some required *.txt GameTable files (" SZFMTD ") not found or not compatible:\n%s", bad_gt_files.size(), str.str().c_str());
+ }
+
+ TC_LOG_INFO("server.loading", ">> Initialized %d GameTables in %u ms", gameTableCount, GetMSTimeDiffToNow(oldMSTime));
+}
diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h
new file mode 100644
index 00000000000..ad79a7e699a
--- /dev/null
+++ b/src/server/game/DataStores/GameTables.h
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GameTables_h__
+#define GameTables_h__
+
+#include "SharedDefines.h"
+#include "Common.h"
+
+struct GtBarberShopCostBaseEntry
+{
+ float Cost = 0.0f;
+};
+
+struct GtBaseMPEntry
+{
+ float Rogue = 0.0f;
+ float Druid = 0.0f;
+ float Hunter = 0.0f;
+ float Mage = 0.0f;
+ float Paladin = 0.0f;
+ float Priest = 0.0f;
+ float Shaman = 0.0f;
+ float Warlock = 0.0f;
+ float Warrior = 0.0f;
+ float DeathKnight = 0.0f;
+ float Monk = 0.0f;
+ float DemonHunter = 0.0f;
+};
+
+struct GtCombatRatingsEntry
+{
+ float Amplify = 0.0f;
+ float DefenseSkill = 0.0f;
+ float Dodge = 0.0f;
+ float Parry = 0.0f;
+ float Block = 0.0f;
+ float HitMelee = 0.0f;
+ float HitRanged = 0.0f;
+ float HitSpell = 0.0f;
+ float CritMelee = 0.0f;
+ float CritRanged = 0.0f;
+ float CritSpell = 0.0f;
+ float MultiStrike = 0.0f;
+ float Readiness = 0.0f;
+ float Speed = 0.0f;
+ float ResilienceCritTaken = 0.0f;
+ float ResiliencePlayerDamage = 0.0f;
+ float Lifesteal = 0.0f;
+ float HasteMelee = 0.0f;
+ float HasteRanged = 0.0f;
+ float HasteSpell = 0.0f;
+ float Avoidance = 0.0f;
+ float Sturdiness = 0.0f;
+ float Unused7 = 0.0f;
+ float Expertise = 0.0f;
+ float ArmorPenetration = 0.0f;
+ float Mastery = 0.0f;
+ float PvPPower = 0.0f;
+ float Cleave = 0.0f;
+ float VersatilityDamageDone = 0.0f;
+ float VersatilityHealingDone = 0.0f;
+ float VersatilityDamageTaken = 0.0f;
+ float Unused12 = 0.0f;
+};
+
+struct GtHpPerStaEntry
+{
+ float Health = 0.0f;
+};
+
+struct GtItemSocketCostPerLevelEntry
+{
+ float SocketCost = 0.0f;
+};
+
+struct GtNpcDamageByClassEntry
+{
+ float Rogue = 0.0f;
+ float Druid = 0.0f;
+ float Hunter = 0.0f;
+ float Mage = 0.0f;
+ float Paladin = 0.0f;
+ float Priest = 0.0f;
+ float Shaman = 0.0f;
+ float Warlock = 0.0f;
+ float Warrior = 0.0f;
+ float DeathKnight = 0.0f;
+ float Monk = 0.0f;
+ float DemonHunter = 0.0f;
+};
+
+struct GtNpcManaCostScalerEntry
+{
+ float Scaler = 0.0f;
+};
+
+struct GtNpcTotalHpEntry
+{
+ float Rogue = 0.0f;
+ float Druid = 0.0f;
+ float Hunter = 0.0f;
+ float Mage = 0.0f;
+ float Paladin = 0.0f;
+ float Priest = 0.0f;
+ float Shaman = 0.0f;
+ float Warlock = 0.0f;
+ float Warrior = 0.0f;
+ float DeathKnight = 0.0f;
+ float Monk = 0.0f;
+ float DemonHunter = 0.0f;
+};
+
+struct GtSpellScalingEntry
+{
+ float Rogue = 0.0f;
+ float Druid = 0.0f;
+ float Hunter = 0.0f;
+ float Mage = 0.0f;
+ float Paladin = 0.0f;
+ float Priest = 0.0f;
+ float Shaman = 0.0f;
+ float Warlock = 0.0f;
+ float Warrior = 0.0f;
+ float DeathKnight = 0.0f;
+ float Monk = 0.0f;
+ float DemonHunter = 0.0f;
+ float Item = 0.0f;
+ float Consumable = 0.0f;
+ float Gem1 = 0.0f;
+ float Gem2 = 0.0f;
+ float Gem3 = 0.0f;
+ float Health = 0.0f;
+};
+
+struct GtXpEntry
+{
+ float Total = 0.0f;
+ float PerKill = 0.0f;
+ float Junk = 0.0f;
+ float Stats = 0.0f;
+ float Divisor = 0.0f;
+};
+
+template<class T>
+class GameTable
+{
+public:
+ T const* GetRow(uint32 row) const
+ {
+ if (row >= _data.size())
+ return nullptr;
+
+ return &_data[row];
+ }
+
+ std::size_t GetTableRowCount() const { return _data.size(); }
+
+ void SetData(std::vector<T> data) { _data = std::move(data); }
+
+private:
+ std::vector<T> _data;
+};
+
+TC_GAME_API extern GameTable<GtBarberShopCostBaseEntry> sBarberShopCostBaseGameTable;
+TC_GAME_API extern GameTable<GtBaseMPEntry> sBaseMPGameTable;
+TC_GAME_API extern GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable;
+TC_GAME_API extern GameTable<GtHpPerStaEntry> sHpPerStaGameTable;
+TC_GAME_API extern GameTable<GtItemSocketCostPerLevelEntry> sItemSocketCostPerLevelGameTable;
+TC_GAME_API extern GameTable<GtNpcDamageByClassEntry> sNpcDamageByClassGameTable[MAX_EXPANSIONS];
+TC_GAME_API extern GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable;
+TC_GAME_API extern GameTable<GtNpcTotalHpEntry> sNpcTotalHpGameTable[MAX_EXPANSIONS];
+TC_GAME_API extern GameTable<GtSpellScalingEntry> sSpellScalingGameTable;
+TC_GAME_API extern GameTable<GtXpEntry> sXpGameTable;
+
+TC_GAME_API void LoadGameTables(std::string const& dataPath);
+
+template<class T>
+inline float GetGameTableColumnForClass(T const* row, uint32 class_)
+{
+ switch (class_)
+ {
+ case CLASS_WARRIOR:
+ return row->Warrior;
+ case CLASS_PALADIN:
+ return row->Paladin;
+ case CLASS_HUNTER:
+ return row->Hunter;
+ case CLASS_ROGUE:
+ return row->Rogue;
+ case CLASS_PRIEST:
+ return row->Priest;
+ case CLASS_DEATH_KNIGHT:
+ return row->DeathKnight;
+ case CLASS_SHAMAN:
+ return row->Shaman;
+ case CLASS_MAGE:
+ return row->Mage;
+ case CLASS_WARLOCK:
+ return row->Warlock;
+ case CLASS_MONK:
+ return row->Monk;
+ case CLASS_DRUID:
+ return row->Druid;
+ case CLASS_DEMON_HUNTER:
+ return row->DemonHunter;
+ default:
+ break;
+ }
+
+ return 0.0f;
+}
+
+#endif // GameTables_h__
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 94885deeffe..7cd1751d589 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -17,7 +17,6 @@
#include "Common.h"
#include "SharedDefines.h"
-#include "DBCStores.h"
#include "DisableMgr.h"
#include "ObjectMgr.h"
#include "SocialMgr.h"
@@ -37,7 +36,21 @@
namespace lfg
{
-LFGMgr::LFGMgr(): m_QueueTimer(0), m_lfgProposalId(1),
+LFGDungeonData::LFGDungeonData() : id(0), name(""), map(0), type(0), expansion(0), group(0), minlevel(0),
+maxlevel(0), difficulty(DIFFICULTY_NONE), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f),
+requiredItemLevel(0)
+{
+}
+
+LFGDungeonData::LFGDungeonData(LfgDungeonsEntry const* dbc) : id(dbc->ID), name(dbc->Name->Str[sWorld->GetDefaultDbcLocale()]), map(dbc->MapID),
+type(uint8(dbc->Type)), expansion(uint8(dbc->Expansion)), group(uint8(dbc->GroupID)),
+minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->DifficultyID)),
+seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f),
+requiredItemLevel(0)
+{
+}
+
+LFGMgr::LFGMgr() : m_QueueTimer(0), m_lfgProposalId(1),
m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK))
{
}
@@ -174,9 +187,9 @@ void LFGMgr::LoadLFGDungeons(bool reload /* = false */)
LfgDungeonStore.clear();
// Initialize Dungeon map with data from dbcs
- for (uint32 i = 0; i < sLFGDungeonStore.GetNumRows(); ++i)
+ for (uint32 i = 0; i < sLfgDungeonsStore.GetNumRows(); ++i)
{
- LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(i);
+ LfgDungeonsEntry const* dungeon = sLfgDungeonsStore.LookupEntry(i);
if (!dungeon)
continue;
@@ -1597,7 +1610,7 @@ LfgLockMap const LFGMgr::GetLockedDungeons(ObjectGuid guid)
for (LfgDungeonSet::const_iterator it = dungeons.begin(); it != dungeons.end(); ++it)
{
LFGDungeonData const* dungeon = GetLFGDungeon(*it);
- if (!dungeon) // should never happen - We provide a list from sLFGDungeonStore
+ if (!dungeon) // should never happen - We provide a list from sLfgDungeonsStore
continue;
uint32 lockStatus = 0;
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index f38812549a6..63770e31d8f 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -18,7 +18,6 @@
#ifndef _LFGMGR_H
#define _LFGMGR_H
-#include "DBCStructure.h"
#include "Field.h"
#include "LFG.h"
#include "LFGQueue.h"
@@ -267,16 +266,8 @@ struct LfgPlayerBoot
struct LFGDungeonData
{
- LFGDungeonData(): id(0), name(""), map(0), type(0), expansion(0), group(0), minlevel(0),
- maxlevel(0), difficulty(DIFFICULTY_NONE), seasonal(false), x(0.0f), y(0.0f), z(0.0f), o(0.0f),
- requiredItemLevel(0)
- { }
- LFGDungeonData(LFGDungeonEntry const* dbc): id(dbc->ID), name(dbc->Name_lang), map(dbc->MapID),
- type(uint8(dbc->Type)), expansion(uint8(dbc->Expansion)), group(uint8(dbc->GroupID)),
- minlevel(uint8(dbc->MinLevel)), maxlevel(uint8(dbc->MaxLevel)), difficulty(Difficulty(dbc->DifficultyID)),
- seasonal((dbc->Flags & LFG_FLAG_SEASONAL) != 0), x(0.0f), y(0.0f), z(0.0f), o(0.0f),
- requiredItemLevel(0)
- { }
+ LFGDungeonData();
+ LFGDungeonData(LfgDungeonsEntry const* dbc);
uint32 id;
std::string name;
diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp
index d80485afbf4..9288b7404fb 100644
--- a/src/server/game/DungeonFinding/LFGQueue.cpp
+++ b/src/server/game/DungeonFinding/LFGQueue.cpp
@@ -17,8 +17,6 @@
#include "ObjectDefines.h"
#include "Containers.h"
-#include "DBCStructure.h"
-#include "DBCStores.h"
#include "Group.h"
#include "LFGQueue.h"
#include "LFGMgr.h"
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 3eba4d58d80..84138cf0b45 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -31,6 +31,7 @@
#include "WorldSession.h"
#include "ItemPackets.h"
#include "TradeData.h"
+#include "GameTables.h"
void AddItemsSetItem(Player* player, Item* item)
{
@@ -1856,8 +1857,8 @@ int32 Item::GetItemStatValue(uint32 index, Player const* owner) const
if (uint32 randomPropPoints = GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate()->GetInventoryType(), GetTemplate()->GetSubClass()))
{
float statValue = float(_bonusData.ItemStatAllocation[index] * randomPropPoints) * 0.0001f;
- if (GtItemSocketCostPerLevelEntry const* gtCost = sGtItemSocketCostPerLevelStore.EvaluateTable(itemLevel - 1, 0))
- statValue -= float(int32(_bonusData.ItemStatSocketCostMultiplier[index] * gtCost->ratio));
+ if (GtItemSocketCostPerLevelEntry const* gtCost = sItemSocketCostPerLevelGameTable.GetRow(itemLevel))
+ statValue -= float(int32(_bonusData.ItemStatSocketCostMultiplier[index] * gtCost->SocketCost));
return int32(std::floor(statValue + 0.5f));
}
diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
index 2f82071f66f..a36a4a4c246 100644
--- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
+++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
@@ -21,7 +21,6 @@
#include "Log.h"
#include "ObjectMgr.h"
#include "Util.h"
-#include "DBCStores.h"
#include <list>
#include <vector>
diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp
index 04873bdddcf..67f683849a9 100644
--- a/src/server/game/Entities/Item/ItemTemplate.cpp
+++ b/src/server/game/Entities/Item/ItemTemplate.cpp
@@ -16,7 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "DBCStores.h"
#include "DB2Stores.h"
#include "World.h"
#include "ItemTemplate.h"
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index 38265cc9fed..5fa6b5583af 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -660,11 +660,10 @@ class Player;
struct TC_GAME_API ItemTemplate
{
- uint32 Id;
ItemEntry const* BasicData;
ItemSparseEntry const* ExtendedData;
- uint32 GetId() const { return Id; }
+ uint32 GetId() const { return BasicData->ID; }
uint32 GetClass() const { return BasicData->Class; }
uint32 GetSubClass() const { return BasicData->SubClass; }
uint32 GetQuality() const { return ExtendedData->Quality; }
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 303ef5d4c5d..2809cf121d1 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -101,7 +101,6 @@
#include "WorldPacket.h"
#include "WorldSession.h"
#include "WorldStatePackets.h"
-#include "DBCStructure.h"
#define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)
@@ -2402,12 +2401,12 @@ void Player::GiveLevel(uint8 level)
PlayerLevelInfo info;
sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), level, &info);
- uint32 basehp = 0, basemana = 0;
- sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, basehp, basemana);
+ uint32 basemana = 0;
+ sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, basemana);
WorldPackets::Misc::LevelUpInfo packet;
packet.Level = level;
- packet.HealthDelta = int32(basehp) - int32(GetCreateHealth());
+ packet.HealthDelta = 0;
/// @todo find some better solution
// for (int i = 0; i < MAX_STORED_POWERS; ++i)
@@ -2444,7 +2443,7 @@ void Player::GiveLevel(uint8 level)
for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
SetCreateStat(Stats(i), info.stats[i]);
- SetCreateHealth(basehp);
+ SetCreateHealth(0);
SetCreateMana(basemana);
InitTalentForLevel();
@@ -2522,7 +2521,7 @@ void Player::InitTalentForLevel()
if (!GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_MORE_TALENTS_THAN_ALLOWED))
for (uint32 t = talentTiers; t < MAX_TALENT_TIERS; ++t)
for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c)
- for (TalentEntry const* talent : sTalentByPos[getClass()][t][c])
+ for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), t, c))
RemoveTalent(talent);
}
@@ -2537,8 +2536,8 @@ void Player::InitStatsForLevel(bool reapplyMods)
if (reapplyMods) //reapply stats values only on .reset stats (level) command
_RemoveAllStatBonuses();
- uint32 basehp = 0, basemana = 0;
- sObjectMgr->GetPlayerClassLevelInfo(getClass(), getLevel(), basehp, basemana);
+ uint32 basemana = 0;
+ sObjectMgr->GetPlayerClassLevelInfo(getClass(), getLevel(), basemana);
PlayerLevelInfo info;
sObjectMgr->GetPlayerLevelInfo(getRace(), getClass(), getLevel(), &info);
@@ -2568,7 +2567,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
SetStat(Stats(i), info.stats[i]);
- SetCreateHealth(basehp);
+ SetCreateHealth(0);
//set create powers
SetCreateMana(basemana);
@@ -2662,7 +2661,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
SetMaxPower(Powers(i), GetCreatePowers(Powers(i)));
- SetMaxHealth(basehp); // stamina bonus will applied later
+ SetMaxHealth(0); // stamina bonus will applied later
// cleanup mounted state (it will set correctly at aura loading if player saved at mount.
SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
@@ -4831,111 +4830,151 @@ float Player::GetTotalBaseModValue(BaseModGroup modGroup) const
return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
}
-float Player::GetMeleeCritFromAgility() const
-{
- uint8 level = getLevel();
- uint32 pclass = getClass();
-
- if (level >= sGtChanceToMeleeCritStore.GetTableRowCount())
- level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1;
-
- GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.EvaluateTable(pclass - 1, 0);
- GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1);
- if (critBase == nullptr || critRatio == nullptr)
- return 0.0f;
-
- float crit = critBase->base + GetStat(STAT_AGILITY)*critRatio->ratio;
- return crit*100.0f;
-}
-
void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) const
{
- // Table for base dodge values
- const float dodge_base[MAX_CLASSES] =
- {
- 0.037580f, // Warrior
- 0.036520f, // Paladin
- -0.054500f, // Hunter
- -0.005900f, // Rogue
- 0.031830f, // Priest
- 0.036640f, // DK
- 0.016750f, // Shaman
- 0.034575f, // Mage
- 0.020350f, // Warlock
- 0.0f, // ??
- 0.049510f // Druid
- };
- // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
- const float crit_to_dodge[MAX_CLASSES] =
- {
- 0.85f/1.15f, // Warrior
- 1.00f/1.15f, // Paladin
- 1.11f/1.15f, // Hunter
- 2.00f/1.15f, // Rogue
- 1.00f/1.15f, // Priest
- 0.85f/1.15f, // DK
- 1.60f/1.15f, // Shaman
- 1.00f/1.15f, // Mage
- 0.97f/1.15f, // Warlock (?)
- 0.0f, // ??
- 2.00f/1.15f // Druid
- };
+ //// Table for base dodge values
+ //const float dodge_base[MAX_CLASSES] =
+ //{
+ // 0.037580f, // Warrior
+ // 0.036520f, // Paladin
+ // -0.054500f, // Hunter
+ // -0.005900f, // Rogue
+ // 0.031830f, // Priest
+ // 0.036640f, // DK
+ // 0.016750f, // Shaman
+ // 0.034575f, // Mage
+ // 0.020350f, // Warlock
+ // 0.0f, // ??
+ // 0.049510f // Druid
+ //};
+ //// Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
+ //const float crit_to_dodge[MAX_CLASSES] =
+ //{
+ // 0.85f/1.15f, // Warrior
+ // 1.00f/1.15f, // Paladin
+ // 1.11f/1.15f, // Hunter
+ // 2.00f/1.15f, // Rogue
+ // 1.00f/1.15f, // Priest
+ // 0.85f/1.15f, // DK
+ // 1.60f/1.15f, // Shaman
+ // 1.00f/1.15f, // Mage
+ // 0.97f/1.15f, // Warlock (?)
+ // 0.0f, // ??
+ // 2.00f/1.15f // Druid
+ //};
- uint8 level = getLevel();
- uint32 pclass = getClass();
+ //uint8 level = getLevel();
+ //uint32 pclass = getClass();
- if (level >= sGtChanceToMeleeCritStore.GetTableRowCount())
- level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1;
+ //if (level >= sGtChanceToMeleeCritStore.GetTableRowCount())
+ // level = sGtChanceToMeleeCritStore.GetTableRowCount() - 1;
- // Dodge per agility is proportional to crit per agility, which is available from DBC files
- GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1);
- if (dodgeRatio == nullptr || pclass > MAX_CLASSES)
- return;
+ //// Dodge per agility is proportional to crit per agility, which is available from DBC files
+ //GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.EvaluateTable(level - 1, pclass - 1);
+ //if (dodgeRatio == nullptr || pclass > MAX_CLASSES)
+ // return;
- /// @todo research if talents/effects that increase total agility by x% should increase non-diminishing part
- float base_agility = GetCreateStat(STAT_AGILITY) * m_auraModifiersGroup[UNIT_MOD_STAT_START + STAT_AGILITY][BASE_PCT];
- float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
+ ///// @todo research if talents/effects that increase total agility by x% should increase non-diminishing part
+ //float base_agility = GetCreateStat(STAT_AGILITY) * m_auraModifiersGroup[UNIT_MOD_STAT_START + STAT_AGILITY][BASE_PCT];
+ //float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
- // calculate diminishing (green in char screen) and non-diminishing (white) contribution
- diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1];
- nondiminishing = 100.0f * (dodge_base[pclass-1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]);
+ //// calculate diminishing (green in char screen) and non-diminishing (white) contribution
+ //diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1];
+ //nondiminishing = 100.0f * (dodge_base[pclass-1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]);
}
-float Player::GetSpellCritFromIntellect() const
+inline float GetGameTableColumnForCombatRating(GtCombatRatingsEntry const* row, uint32 rating)
{
- uint8 level = getLevel();
- uint32 pclass = getClass();
-
- if (level >= sGtChanceToSpellCritStore.GetTableRowCount())
- level = sGtChanceToSpellCritStore.GetTableRowCount() - 1;
-
- GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.EvaluateTable(pclass - 1, 0);
- GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.EvaluateTable(level - 1, pclass - 1);
- if (critBase == nullptr || critRatio == nullptr)
- return 0.0f;
+ switch (rating)
+ {
+ case CR_AMPLIFY:
+ return row->Amplify;
+ case CR_DEFENSE_SKILL:
+ return row->DefenseSkill;
+ case CR_DODGE:
+ return row->Dodge;
+ case CR_PARRY:
+ return row->Parry;
+ case CR_BLOCK:
+ return row->Block;
+ case CR_HIT_MELEE:
+ return row->HitMelee;
+ case CR_HIT_RANGED:
+ return row->HitRanged;
+ case CR_HIT_SPELL:
+ return row->HitSpell;
+ case CR_CRIT_MELEE:
+ return row->CritMelee;
+ case CR_CRIT_RANGED:
+ return row->CritRanged;
+ case CR_CRIT_SPELL:
+ return row->CritSpell;
+ case CR_MULTISTRIKE:
+ return row->MultiStrike;
+ case CR_READINESS:
+ return row->Readiness;
+ case CR_SPEED:
+ return row->Speed;
+ case CR_RESILIENCE_CRIT_TAKEN:
+ return row->ResilienceCritTaken;
+ case CR_RESILIENCE_PLAYER_DAMAGE:
+ return row->ResiliencePlayerDamage;
+ case CR_LIFESTEAL:
+ return row->Lifesteal;
+ case CR_HASTE_MELEE:
+ return row->HasteMelee;
+ case CR_HASTE_RANGED:
+ return row->HasteRanged;
+ case CR_HASTE_SPELL:
+ return row->HasteSpell;
+ case CR_AVOIDANCE:
+ return row->Avoidance;
+ case CR_STURDINESS:
+ return row->Sturdiness;
+ case CR_UNUSED_7:
+ return row->Unused7;
+ case CR_EXPERTISE:
+ return row->Expertise;
+ case CR_ARMOR_PENETRATION:
+ return row->ArmorPenetration;
+ case CR_MASTERY:
+ return row->Mastery;
+ case CR_PVP_POWER:
+ return row->PvPPower;
+ case CR_CLEAVE:
+ return row->Cleave;
+ case CR_VERSATILITY_DAMAGE_DONE:
+ return row->VersatilityDamageDone;
+ case CR_VERSATILITY_HEALING_DONE:
+ return row->VersatilityHealingDone;
+ case CR_VERSATILITY_DAMAGE_TAKEN:
+ return row->VersatilityDamageTaken;
+ case CR_UNUSED_12:
+ return row->Unused12;
+ default:
+ break;
+ }
- float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio;
- return crit * 100.0f;
+ return 1.0f;
}
float Player::GetRatingMultiplier(CombatRating cr) const
{
- uint8 level = getLevel();
-
- if (level >= sGtCombatRatingsStore.GetTableRowCount())
- level = sGtCombatRatingsStore.GetTableRowCount() - 1;
+ GtCombatRatingsEntry const* Rating = sCombatRatingsGameTable.GetRow(getLevel());
+ if (!Rating)
+ return 1.0f;
- GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.EvaluateTable(level - 1, cr);
- if (!Rating || !Rating->ratio)
+ float value = GetGameTableColumnForCombatRating(Rating, cr);
+ if (!value)
return 1.0f; // By default use minimum coefficient (not must be called)
- return 1.0f / Rating->ratio;
+ return 1.0f / value;
}
float Player::GetRatingBonusValue(CombatRating cr) const
{
float baseResult = float(GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr)) * GetRatingMultiplier(cr);
- if (cr != CR_RESILIENCE_PLAYER_DAMAGE_TAKEN)
+ if (cr != CR_RESILIENCE_PLAYER_DAMAGE)
return baseResult;
return float(1.0f - pow(0.99f, baseResult)) * 100.0f;
}
@@ -4955,24 +4994,6 @@ float Player::GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const
return 0.0f;
}
-float Player::OCTRegenMPPerSpirit() const
-{
- uint8 level = getLevel();
- uint32 pclass = getClass();
-
- if (level >= sGtRegenMPPerSptStore.GetTableRowCount())
- level = sGtRegenMPPerSptStore.GetTableRowCount() - 1;
-
- GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.EvaluateTable(level - 1, pclass - 1);
- if (moreRatio == nullptr)
- return 0.0f;
-
- // Formula get from PaperDollFrame script
- float spirit = GetStat(STAT_SPIRIT);
- float regen = spirit * moreRatio->ratio;
- return regen;
-}
-
void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply)
{
float oldRating = m_baseRatingValue[combatRating];
@@ -5024,7 +5045,7 @@ void Player::UpdateRating(CombatRating cr)
switch (cr)
{
- case CR_UNUSED_1:
+ case CR_AMPLIFY:
case CR_DEFENSE_SKILL:
break;
case CR_DODGE:
@@ -5063,7 +5084,7 @@ void Player::UpdateRating(CombatRating cr)
case CR_MULTISTRIKE:
case CR_READINESS:
case CR_SPEED:
- case CR_RESILIENCE_PLAYER_DAMAGE_TAKEN:
+ case CR_RESILIENCE_PLAYER_DAMAGE:
case CR_RESILIENCE_CRIT_TAKEN:
case CR_LIFESTEAL:
break;
@@ -5072,8 +5093,8 @@ void Player::UpdateRating(CombatRating cr)
case CR_HASTE_SPELL:
break;
case CR_AVOIDANCE:
- case CR_UNUSED_2:
- case CR_WEAPON_SKILL_RANGED:
+ case CR_STURDINESS:
+ case CR_UNUSED_7:
break;
case CR_EXPERTISE:
if (affectStats)
@@ -5089,8 +5110,8 @@ void Player::UpdateRating(CombatRating cr)
case CR_MASTERY:
UpdateMastery();
break;
- case CR_UNUSED_3:
- case CR_UNUSED_4:
+ case CR_PVP_POWER:
+ case CR_CLEAVE:
case CR_VERSATILITY_DAMAGE_DONE:
case CR_VERSATILITY_DAMAGE_TAKEN:
break;
@@ -6085,7 +6106,7 @@ void Player::RewardReputation(Unit* victim, float rate)
// support for: Championing - http://www.wowwiki.com/Championing
Map const* map = GetMap();
if (map->IsNonRaidDungeon())
- if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficultyID()))
+ if (LfgDungeonsEntry const* dungeon = DB2Manager::GetLfgDungeon(map->GetId(), map->GetDifficultyID()))
if (dungeon->TargetLevel == 80)
ChampioningFaction = GetChampioningFaction();
}
@@ -7235,7 +7256,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
// ApplyRatingMod(CR_CRIT_TAKEN_MELEE, int32(val), apply);
// break;
case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
- ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, int32(val), apply);
+ ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, int32(val), apply);
break;
// case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
// ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(val), apply);
@@ -7270,7 +7291,7 @@ void Player::_ApplyItemBonuses(Item* item, uint8 slot, bool apply)
// ApplyRatingMod(CR_CRIT_TAKEN_SPELL, int32(val), apply);
// break;
case ITEM_MOD_RESILIENCE_RATING:
- ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, int32(val), apply);
+ ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, int32(val), apply);
break;
case ITEM_MOD_HASTE_RATING:
ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
@@ -7723,7 +7744,7 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32
if (!spellInfo)
{
TC_LOG_ERROR("entities.player.items", "Player::CastItemCombatSpell: Player '%s' (%s) cast unknown spell (EnchantID: %u, SpellID: %i), ignoring",
- GetName().c_str(), GetGUID().ToString().c_str(), pEnchant->ID, pEnchant->EffectSpellID[s]);
+ GetName().c_str(), GetGUID().ToString().c_str(), enchant_id, pEnchant->EffectSpellID[s]);
continue;
}
@@ -7823,7 +7844,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->EffectSpellID[s]);
if (!spellInfo)
{
- TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Enchant %i, cast unknown spell %i", pEnchant->ID, pEnchant->EffectSpellID[s]);
+ TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Enchant %i, cast unknown spell %i", enchant_id, pEnchant->EffectSpellID[s]);
continue;
}
@@ -13011,7 +13032,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
// ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
// break;
case ITEM_MOD_RESILIENCE_RATING:
- ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, enchant_amount, apply);
+ ApplyRatingMod(CR_RESILIENCE_PLAYER_DAMAGE, enchant_amount, apply);
TC_LOG_DEBUG("entities.player.items", "+ %u RESILIENCE", enchant_amount);
break;
case ITEM_MOD_HASTE_RATING:
@@ -18076,7 +18097,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result)
}
else
{
- MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(difficulty));
+ MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapId, Difficulty(difficulty));
if (!mapDiff)
{
TC_LOG_ERROR("entities.player", "Player::_LoadBoundInstances: player '%s' (%s) has bind to not existed difficulty %d instance for map %u (%s)",
@@ -18114,7 +18135,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result)
InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty, bool withExpired)
{
// some instances only have one difficulty
- MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty);
+ MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(mapid, difficulty);
if (!mapDiff)
return nullptr;
@@ -18128,7 +18149,7 @@ InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty
InstancePlayerBind const* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty) const
{
// some instances only have one difficulty
- MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty);
+ MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(mapid, difficulty);
if (!mapDiff)
return nullptr;
@@ -18360,14 +18381,14 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report
missingAchievement = ar->achievement;
Difficulty target_difficulty = GetDifficultyID(mapEntry);
- MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
+ MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(target_map, target_difficulty);
if (LevelMin || LevelMax || missingItem || missingQuest || missingAchievement)
{
if (report)
{
if (missingQuest && !ar->questFailedText.empty())
ChatHandler(GetSession()).PSendSysMessage("%s", ar->questFailedText.c_str());
- else if (mapDiff->HasMessage()) // if (missingAchievement) covered by this case
+ else if (mapDiff->Message_lang->Str[sWorld->GetDefaultDbcLocale()][0] != '\0') // if (missingAchievement) covered by this case
SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
else if (missingItem)
GetSession()->SendNotification(GetSession()->GetTrinityString(LANG_LEVEL_MINREQUIRED_AND_ITEM), LevelMin, ASSERT_NOTNULL(sObjectMgr->GetItemTemplate(missingItem))->GetName(GetSession()->GetSessionDbcLocale()));
@@ -19608,7 +19629,7 @@ void Player::_SaveStats(SQLTransaction& trans) const
stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_ATTACK_POWER));
stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER));
stmt->setUInt32(index++, GetBaseSpellPowerBonus());
- stmt->setUInt32(index, GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + CR_RESILIENCE_PLAYER_DAMAGE_TAKEN));
+ stmt->setUInt32(index, GetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + CR_RESILIENCE_PLAYER_DAMAGE));
trans->Append(stmt);
}
@@ -23789,7 +23810,7 @@ void Player::UpdateUnderwaterState(Map* m, float x, float y, float z)
if (uint32 liqEntry = liquid_status.entry)
{
LiquidTypeEntry const* liquid = sLiquidTypeStore.LookupEntry(liqEntry);
- if (_lastLiquid && _lastLiquid->SpellID && _lastLiquid->ID != liqEntry)
+ if (_lastLiquid && _lastLiquid->SpellID && _lastLiquid != liquid)
RemoveAurasDueToSpell(_lastLiquid->SpellID);
if (liquid && liquid->SpellID)
@@ -23940,7 +23961,7 @@ bool Player::CanUseBattlegroundObject(GameObject* gameobject) const
FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry();
FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION));
- if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction))
+ if (playerFaction && faction && !playerFaction->IsFriendlyTo(faction))
return false;
}
@@ -23960,11 +23981,6 @@ bool Player::CanCaptureTowerPoint() const
uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 newHairColor, BarberShopStyleEntry const* newFacialHair, BarberShopStyleEntry const* newSkin /*= nullptr*/, BarberShopStyleEntry const* newFace /*= nullptr*/) const
{
- uint8 level = getLevel();
-
- if (level >= sGtBarberShopCostBaseStore.GetTableRowCount())
- level = sGtBarberShopCostBaseStore.GetTableRowCount() - 1;
-
uint8 hairstyle = GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID);
uint8 haircolor = GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID);
uint8 facialhair = GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE);
@@ -23974,26 +23990,26 @@ uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8
if ((hairstyle == newHairStyle->Data) && (haircolor == newHairColor) && (facialhair == newFacialHair->Data) && (!newSkin || (newSkin->Data == skincolor)) && (!newFace || (newFace->Data == face)))
return 0;
- GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.EvaluateTable(level - 1, 0);
+ GtBarberShopCostBaseEntry const* bsc = sBarberShopCostBaseGameTable.GetRow(getLevel());
if (!bsc) // shouldn't happen
return 0xFFFFFFFF;
uint32 cost = 0;
if (hairstyle != newHairStyle->Data)
- cost += uint32(bsc->cost * newHairStyle->CostModifier);
+ cost += uint32(bsc->Cost * newHairStyle->CostModifier);
if ((haircolor != newHairColor) && (hairstyle == newHairStyle->Data))
- cost += uint32(bsc->cost * 0.5f); // +1/2 of price
+ cost += uint32(bsc->Cost * 0.5f); // +1/2 of price
if (facialhair != newFacialHair->Data)
- cost += uint32(bsc->cost * newFacialHair->CostModifier);
+ cost += uint32(bsc->Cost * newFacialHair->CostModifier);
if (newSkin && skincolor != newSkin->Data)
- cost += uint32(bsc->cost * newSkin->CostModifier);
+ cost += uint32(bsc->Cost * newSkin->CostModifier);
if (newFace && face != newFace->Data)
- cost += uint32(bsc->cost * newFace->CostModifier);
+ cost += uint32(bsc->Cost * newFace->CostModifier);
return cost;
}
@@ -24302,7 +24318,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
bool Player::CanFlyInZone(uint32 mapid, uint32 zone) const
{
// continent checked in SpellInfo::CheckLocation at cast and area update
- uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
+ uint32 v_map = sDB2Manager.GetVirtualMapForMapAndZone(mapid, zone);
return v_map != 571 || HasSpell(54197); // 54197 = Cold Weather Flying
}
@@ -24632,7 +24648,7 @@ bool Player::LearnTalent(uint32 talentId)
// but only 2 out of 3 have SpecID != 0
// We need to make sure that if player is in one of these defined specs he will not learn the other choice
TalentEntry const* bestSlotMatch = nullptr;
- for (TalentEntry const* talent : sTalentByPos[getClass()][talentInfo->TierID][talentInfo->ColumnIndex])
+ for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), talentInfo->TierID, talentInfo->ColumnIndex))
{
if (!talent->SpecID)
bestSlotMatch = talent;
@@ -24648,7 +24664,7 @@ bool Player::LearnTalent(uint32 talentId)
// Check if player doesn't have any talent in current tier
for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c)
- for (TalentEntry const* talent : sTalentByPos[getClass()][talentInfo->TierID][c])
+ for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(getClass(), talentInfo->TierID, c))
if (HasTalent(talent->ID, GetActiveTalentGroup()))
return false;
@@ -24686,8 +24702,8 @@ void Player::LearnTalentSpecialization(uint32 talentSpec)
uint32 class_ = getClass();
for (uint32 t = 0; t < MAX_TALENT_TIERS; ++t)
for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c)
- if (sTalentByPos[class_][t][c].size() > 1)
- for (TalentEntry const* talent : sTalentByPos[class_][t][c])
+ if (sDB2Manager.GetTalentsByPosition(class_, t, c).size() > 1)
+ for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(class_, t, c))
RemoveTalent(talent);
LearnSpecializationSpells();
@@ -24707,8 +24723,8 @@ void Player::ResetTalentSpecialization()
uint32 class_ = getClass();
for (uint32 t = 0; t < MAX_TALENT_TIERS; ++t)
for (uint32 c = 0; c < MAX_TALENT_COLUMNS; ++c)
- if (sTalentByPos[class_][t][c].size() > 1)
- for (TalentEntry const* talent : sTalentByPos[class_][t][c])
+ if (sDB2Manager.GetTalentsByPosition(class_, t, c).size() > 1)
+ for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(class_, t, c))
RemoveTalent(talent);
RemoveSpecializationSpells();
@@ -26042,7 +26058,7 @@ Difficulty Player::GetDifficultyID(MapEntry const* mapEntry) const
if (!mapEntry->IsRaid())
return m_dungeonDifficulty;
- MapDifficultyEntry const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID);
+ MapDifficultyEntry const* defaultDifficulty = sDB2Manager.GetDefaultMapDifficulty(mapEntry->ID);
if (!defaultDifficulty)
return m_legacyRaidDifficulty;
@@ -26191,9 +26207,9 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha
{
// Check skin color
// For Skin type is always 0
- if (CharSectionsEntry const* entry = GetCharSectionEntry(race, SECTION_TYPE_SKIN, gender, 0, skinColor))
+ if (CharSectionsEntry const* entry = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_SKIN, gender, 0, skinColor))
{ // Skin Color defined as Face color, too, we check skin & face in one pass
- if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACE, gender, faceID, skinColor))
+ if (CharSectionsEntry const* entry2 = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_FACE, gender, faceID, skinColor))
{
if (!IsSectionFlagValid(entry, class_, create))
return false;
@@ -26210,14 +26226,14 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha
bool excludeCheck = (race == RACE_TAUREN) || (race == RACE_DRAENEI) || (gender == GENDER_FEMALE && race != RACE_NIGHTELF && race != RACE_UNDEAD_PLAYER);
// Check Hair
- if (CharSectionsEntry const* entry = GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, hairID, hairColor))
+ if (CharSectionsEntry const* entry = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_HAIR, gender, hairID, hairColor))
{
if (!IsSectionFlagValid(entry, class_, create))
return false;
if (!excludeCheck)
{
- if (CharSectionsEntry const* entry2 = GetCharSectionEntry(race, SECTION_TYPE_FACIAL_HAIR, gender, facialHair, hairColor))
+ if (CharSectionsEntry const* entry2 = sDB2Manager.GetCharSectionEntry(race, SECTION_TYPE_FACIAL_HAIR, gender, facialHair, hairColor))
{
if (!IsSectionFlagValid(entry2, class_, create))
return false;
@@ -26235,7 +26251,7 @@ bool Player::ValidateAppearance(uint8 race, uint8 class_, uint8 gender, uint8 ha
return false;
for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i)
- if (CharSectionsEntry const* entry = GetCharSectionEntry(race, CharSectionType(SECTION_TYPE_CUSTOM_DISPLAY_1 + i * 2), gender, customDisplay[i], 0))
+ if (CharSectionsEntry const* entry = sDB2Manager.GetCharSectionEntry(race, CharSectionType(SECTION_TYPE_CUSTOM_DISPLAY_1 + i * 2), gender, customDisplay[i], 0))
if (!IsSectionFlagValid(entry, class_, create))
return false;
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index b538bbbe05c..e943672c4f0 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -19,7 +19,6 @@
#ifndef _PLAYER_H
#define _PLAYER_H
-#include "DBCStores.h"
#include "DB2Stores.h"
#include "GroupReference.h"
#include "MapReference.h"
@@ -1940,10 +1939,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) override;
void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);}
- float GetMeleeCritFromAgility() const;
void GetDodgeFromAgility(float &diminishing, float &nondiminishing) const;
- float GetSpellCritFromIntellect() const;
- float OCTRegenMPPerSpirit() const;
float GetRatingMultiplier(CombatRating cr) const;
float GetRatingBonusValue(CombatRating cr) const;
diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
index 22af722d592..709a5debf4d 100644
--- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
+++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
@@ -18,7 +18,6 @@
#include "TaxiPathGraph.h"
#include "ObjectMgr.h"
#include "Player.h"
-#include "DBCStores.h"
#include "DB2Stores.h"
#include "Config.h"
#include "Util.h"
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index d2a8a31817d..58a9b68e0e5 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -21,7 +21,6 @@
#include "MapManager.h"
#include "ObjectMgr.h"
#include "ScriptMgr.h"
-#include "DBCStores.h"
#include "GameObjectAI.h"
#include "Vehicle.h"
#include "Player.h"
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index da04c39c289..ed6b9ec3696 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -20,6 +20,7 @@
#include "Player.h"
#include "Pet.h"
#include "Creature.h"
+#include "GameTables.h"
#include "SharedDefines.h"
#include "SpellAuras.h"
#include "SpellAuraEffects.h"
@@ -265,8 +266,8 @@ float Player::GetHealthBonusFromStamina()
{
// Taken from PaperDollFrame.lua - 6.0.3.19085
float ratio = 10.0f;
- if (GtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.EvaluateTable(getLevel() - 1, 0))
- ratio = hpBase->ratio;
+ if (GtHpPerStaEntry const* hpBase = sHpPerStaGameTable.GetRow(getLevel()))
+ ratio = hpBase->Health;
float stamina = GetStat(STAT_STAMINA);
@@ -512,7 +513,7 @@ void Player::UpdateCritPercentage(WeaponAttackType attType)
void Player::UpdateAllCritPercentages()
{
- float value = GetMeleeCritFromAgility();
+ float value = 5.0f;
SetBaseModValue(CRIT_PERCENTAGE, PCT_MOD, value);
SetBaseModValue(OFFHAND_CRIT_PERCENTAGE, PCT_MOD, value);
@@ -654,9 +655,7 @@ void Player::UpdateSpellCritChance(uint32 school)
return;
}
// For others recalculate it from:
- float crit = 0.0f;
- // Crit from Intellect
- crit += GetSpellCritFromIntellect();
+ float crit = 5.0f;
// Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
crit += GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE);
// Increase crit from SPELL_AURA_MOD_CRIT_PCT
@@ -754,7 +753,7 @@ void Player::UpdateManaRegen()
return;
// Mana regen from spirit
- float spirit_regen = OCTRegenMPPerSpirit();
+ float spirit_regen = 0.0f;
// Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
spirit_regen *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 2bf8d161798..964572e5f02 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1430,7 +1430,7 @@ void Unit::HandleEmoteCommand(uint32 anim_id)
SendMessageToSet(packet.Write(), true);
}
-bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo, uint8 effIndex)
+bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* spellInfo /*= nullptr*/, int8 effIndex /*= -1*/)
{
// only physical spells damage gets reduced by armor
if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
@@ -1441,13 +1441,16 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s
if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
return false;
- // bleeding effects are not reduced by armor
- if (SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficultyID(), effIndex))
+ if (effIndex != -1)
{
- if (effect->ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
- effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
- if (spellInfo->GetEffectMechanicMask(effIndex) & (1<<MECHANIC_BLEED))
- return false;
+ // bleeding effects are not reduced by armor
+ if (SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficultyID(), effIndex))
+ {
+ if (effect->ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
+ effect->Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
+ if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
+ return false;
+ }
}
}
return true;
@@ -6733,11 +6736,11 @@ ReputationRank Unit::GetFactionReactionTo(FactionTemplateEntry const* factionTem
}
// common faction based check
- if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
+ if (factionTemplateEntry->IsHostileTo(targetFactionTemplateEntry))
return REP_HOSTILE;
- if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
+ if (factionTemplateEntry->IsFriendlyTo(targetFactionTemplateEntry))
return REP_FRIENDLY;
- if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
+ if (targetFactionTemplateEntry->IsFriendlyTo(factionTemplateEntry))
return REP_FRIENDLY;
if (factionTemplateEntry->Flags & FACTION_TEMPLATE_FLAG_HOSTILE_BY_DEFAULT)
return REP_HOSTILE;
@@ -8952,7 +8955,7 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT
{
if (Player* player = ToPlayer())
{
- float mod = player->GetRatingBonusValue(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN) * (-8.0f);
+ float mod = player->GetRatingBonusValue(CR_RESILIENCE_PLAYER_DAMAGE) * (-8.0f);
AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
}
}
@@ -15739,7 +15742,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target)
{
FactionTemplateEntry const* ft1 = GetFactionTemplateEntry();
FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
- if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
+ if (ft1 && ft2 && !ft1->IsFriendlyTo(ft2))
{
if (index == UNIT_FIELD_BYTES_2)
// Allow targetting opposite faction in party when enabled in config
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 5ba84c271be..68b27049f71 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -19,7 +19,6 @@
#ifndef __UNIT_H
#define __UNIT_H
-#include "DBCStructure.h"
#include "EventProcessor.h"
#include "FollowerReference.h"
#include "FollowerRefManager.h"
@@ -381,6 +380,7 @@ enum InventorySlot
};
struct FactionTemplateEntry;
+struct LiquidTypeEntry;
struct MountCapabilityEntry;
struct SpellValue;
@@ -623,8 +623,8 @@ enum WeaponAttackType : uint8
enum CombatRating
{
- CR_UNUSED_1 = 0,
- CR_DEFENSE_SKILL = 1, // Removed in 4.0.1
+ CR_AMPLIFY = 0,
+ CR_DEFENSE_SKILL = 1,
CR_DODGE = 2,
CR_PARRY = 3,
CR_BLOCK = 4,
@@ -638,22 +638,23 @@ enum CombatRating
CR_READINESS = 12,
CR_SPEED = 13,
CR_RESILIENCE_CRIT_TAKEN = 14,
- CR_RESILIENCE_PLAYER_DAMAGE_TAKEN = 15,
+ CR_RESILIENCE_PLAYER_DAMAGE = 15,
CR_LIFESTEAL = 16,
CR_HASTE_MELEE = 17,
CR_HASTE_RANGED = 18,
CR_HASTE_SPELL = 19,
CR_AVOIDANCE = 20,
- CR_UNUSED_2 = 21,
- CR_WEAPON_SKILL_RANGED = 22,
+ CR_STURDINESS = 21,
+ CR_UNUSED_7 = 22,
CR_EXPERTISE = 23,
CR_ARMOR_PENETRATION = 24,
CR_MASTERY = 25,
- CR_UNUSED_3 = 26,
- CR_UNUSED_4 = 27,
+ CR_PVP_POWER = 26,
+ CR_CLEAVE = 27,
CR_VERSATILITY_DAMAGE_DONE = 28,
- // placeholder = 29,
- CR_VERSATILITY_DAMAGE_TAKEN = 30
+ CR_VERSATILITY_HEALING_DONE = 29,
+ CR_VERSATILITY_DAMAGE_TAKEN = 30,
+ CR_UNUSED_12 = 31
};
#define MAX_COMBAT_RATING 31
@@ -1539,7 +1540,7 @@ class TC_GAME_API Unit : public WorldObject
void DealSpellDamage(SpellNonMeleeDamage const* damageInfo, bool durabilityLoss);
// player or player's pet resilience (-1%)
- uint32 GetDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, 1.0f, 100.0f, damage); }
+ uint32 GetDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_RESILIENCE_PLAYER_DAMAGE, 1.0f, 100.0f, damage); }
void ApplyResilience(Unit const* victim, int32* damage) const;
@@ -2079,7 +2080,7 @@ class TC_GAME_API Unit : public WorldObject
bool IsImmunedToDamage(SpellInfo const* spellInfo) const;
virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; // redefined in Creature
- bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = NULL, uint8 effIndex = MAX_SPELL_EFFECTS);
+ bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = nullptr, int8 effIndex = -1);
uint32 CalcArmorReducedDamage(Unit* attacker, Unit* victim, const uint32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = MAX_ATTACK);
uint32 CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, SpellInfo const* spellInfo) const;
void CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffectType damagetype, uint32 const damage, uint32* absorb, uint32* resist, SpellInfo const* spellInfo = NULL);
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp
index 7ba412f5a69..2789978a7fe 100644
--- a/src/server/game/Garrison/Garrison.cpp
+++ b/src/server/game/Garrison/Garrison.cpp
@@ -23,7 +23,7 @@
#include "ObjectMgr.h"
#include "VehicleDefines.h"
-Garrison::Garrison(Player* owner) : _owner(owner), _siteLevelId(0), _siteLevel(nullptr), _followerActivationsRemainingToday(1)
+Garrison::Garrison(Player* owner) : _owner(owner), _siteLevel(nullptr), _followerActivationsRemainingToday(1)
{
}
@@ -34,8 +34,7 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue
return false;
Field* fields = garrison->Fetch();
- _siteLevelId = fields[0].GetUInt32();
- _siteLevel = sGarrSiteLevelStore.LookupEntry(_siteLevelId);
+ _siteLevel = sGarrSiteLevelStore.LookupEntry(_siteLevel->ID);
_followerActivationsRemainingToday = fields[1].GetUInt32();
if (!_siteLevel)
return false;
@@ -142,7 +141,7 @@ void Garrison::SaveToDB(SQLTransaction trans)
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON);
stmt->setUInt64(0, _owner->GetGUID().GetCounter());
- stmt->setUInt32(1, _siteLevelId);
+ stmt->setUInt32(1, _siteLevel->ID);
stmt->setUInt32(2, _followerActivationsRemainingToday);
trans->Append(stmt);
@@ -220,17 +219,16 @@ void Garrison::DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans)
bool Garrison::Create(uint32 garrSiteId)
{
- DBStorageIterator<GarrSiteLevelEntry> siteLevelItr = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1);
- if (siteLevelItr == sGarrSiteLevelStore.end())
+ GarrSiteLevelEntry const* siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1);
+ if (!siteLevel)
return false;
- _siteLevelId = siteLevelItr.ID();
- _siteLevel = siteLevelItr.Data();
+ _siteLevel = siteLevel;
InitializePlots();
WorldPackets::Garrison::GarrisonCreateResult garrisonCreateResult;
- garrisonCreateResult.GarrSiteLevelID = _siteLevelId;
+ garrisonCreateResult.GarrSiteLevelID = _siteLevel->ID;
_owner->SendDirectMessage(garrisonCreateResult.Write());
_owner->SendUpdatePhasing();
SendRemoteInfo();
@@ -251,11 +249,11 @@ void Garrison::Delete()
void Garrison::InitializePlots()
{
- if (std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevelId))
+ if (std::vector<GarrSiteLevelPlotInstEntry const*> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevel->ID))
{
for (std::size_t i = 0; i < plots->size(); ++i)
{
- uint32 garrPlotInstanceId = plots->at(i).second->GarrPlotInstanceID;
+ uint32 garrPlotInstanceId = plots->at(i)->GarrPlotInstanceID;
GarrPlotInstanceEntry const* plotInstance = sGarrPlotInstanceStore.LookupEntry(garrPlotInstanceId);
GameObjectsEntry const* gameObject = sGarrisonMgr.GetPlotGameObject(_siteLevel->MapID, garrPlotInstanceId);
if (!plotInstance || !gameObject)
@@ -270,7 +268,7 @@ void Garrison::InitializePlots()
plotInfo.PacketInfo.PlotPos.Relocate(gameObject->Position.X, gameObject->Position.Y, gameObject->Position.Z, 2 * std::acos(gameObject->RotationW));
plotInfo.PacketInfo.PlotType = plot->PlotType;
plotInfo.EmptyGameObjectId = gameObject->ID;
- plotInfo.GarrSiteLevelPlotInstId = plots->at(i).first;
+ plotInfo.GarrSiteLevelPlotInstId = plots->at(i)->ID;
}
}
}
@@ -531,7 +529,7 @@ void Garrison::SendInfo()
{
WorldPackets::Garrison::GetGarrisonInfoResult garrisonInfo;
garrisonInfo.GarrSiteID = _siteLevel->SiteID;
- garrisonInfo.GarrSiteLevelID = _siteLevelId;
+ garrisonInfo.GarrSiteLevelID = _siteLevel->ID;
garrisonInfo.FactionIndex = GetFaction();
garrisonInfo.NumFollowerActivationsRemaining = _followerActivationsRemainingToday;
for (auto& p : _plots)
@@ -558,7 +556,7 @@ void Garrison::SendRemoteInfo() const
remoteInfo.Sites.resize(1);
WorldPackets::Garrison::GarrisonRemoteSiteInfo& remoteSiteInfo = remoteInfo.Sites[0];
- remoteSiteInfo.GarrSiteLevelID = _siteLevelId;
+ remoteSiteInfo.GarrSiteLevelID = _siteLevel->ID;
for (auto const& p : _plots)
if (p.second.BuildingInfo.PacketInfo)
remoteSiteInfo.Buildings.emplace_back(p.first, p.second.BuildingInfo.PacketInfo->GarrBuildingID);
diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h
index 68ebbc4c0b9..2aa38ee6ad3 100644
--- a/src/server/game/Garrison/Garrison.h
+++ b/src/server/game/Garrison/Garrison.h
@@ -157,7 +157,6 @@ private:
GarrisonError CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 garrBuildingId) const;
GarrisonError CheckBuildingRemoval(uint32 garrPlotInstanceId) const;
Player* _owner;
- uint32 _siteLevelId;
GarrSiteLevelEntry const* _siteLevel;
uint32 _followerActivationsRemainingToday;
diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp
index c07d9a82c45..5836ee2da4b 100644
--- a/src/server/game/Garrison/GarrisonMgr.cpp
+++ b/src/server/game/Garrison/GarrisonMgr.cpp
@@ -32,8 +32,8 @@ GarrisonMgr& GarrisonMgr::Instance()
void GarrisonMgr::Initialize()
{
- for (auto itr = sGarrSiteLevelPlotInstStore.begin(); itr != sGarrSiteLevelPlotInstStore.end(); ++itr)
- _garrisonPlotInstBySiteLevel[itr->GarrSiteLevelID].push_back(std::make_pair(itr.ID(), itr.Data()));
+ for (GarrSiteLevelPlotInstEntry const* siteLevelPlotInst : sGarrSiteLevelPlotInstStore)
+ _garrisonPlotInstBySiteLevel[siteLevelPlotInst->GarrSiteLevelID].push_back(siteLevelPlotInst);
for (GameObjectsEntry const* gameObject : sGameObjectsStore)
if (gameObject->Type == GAMEOBJECT_TYPE_GARRISON_PLOT)
@@ -45,8 +45,8 @@ void GarrisonMgr::Initialize()
for (GarrBuildingPlotInstEntry const* buildingPlotInst : sGarrBuildingPlotInstStore)
_garrisonBuildingPlotInstances[MAKE_PAIR64(buildingPlotInst->GarrBuildingID, buildingPlotInst->GarrSiteLevelPlotInstID)] = buildingPlotInst->ID;
- for (auto itr = sGarrBuildingStore.begin(); itr != sGarrBuildingStore.end(); ++itr)
- _garrisonBuildingsByType[itr->Type].push_back(itr.ID());
+ for (GarrBuildingEntry const* building : sGarrBuildingStore)
+ _garrisonBuildingsByType[building->Type].push_back(building->ID);
for (GarrFollowerXAbilityEntry const* followerAbility : sGarrFollowerXAbilityStore)
{
@@ -73,16 +73,16 @@ void GarrisonMgr::Initialize()
LoadFollowerClassSpecAbilities();
}
-DBStorageIterator<GarrSiteLevelEntry> GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const
+GarrSiteLevelEntry const* GarrisonMgr::GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const
{
- for (auto itr = sGarrSiteLevelStore.begin(); itr != sGarrSiteLevelStore.end(); ++itr)
- if (itr->SiteID == garrSiteId && itr->Level == level)
- return itr;
+ for (GarrSiteLevelEntry const* siteLevel : sGarrSiteLevelStore)
+ if (siteLevel->SiteID == garrSiteId && siteLevel->Level == level)
+ return siteLevel;
- return sGarrSiteLevelStore.end();
+ return nullptr;
}
-std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>> const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const
+std::vector<GarrSiteLevelPlotInstEntry const*> const* GarrisonMgr::GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const
{
auto itr = _garrisonPlotInstBySiteLevel.find(garrSiteLevelId);
if (itr != _garrisonPlotInstBySiteLevel.end())
diff --git a/src/server/game/Garrison/GarrisonMgr.h b/src/server/game/Garrison/GarrisonMgr.h
index 7a93941d59b..b5bb0628ab1 100644
--- a/src/server/game/Garrison/GarrisonMgr.h
+++ b/src/server/game/Garrison/GarrisonMgr.h
@@ -45,8 +45,8 @@ public:
void Initialize();
- DBStorageIterator<GarrSiteLevelEntry> GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const;
- std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>> const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const;
+ GarrSiteLevelEntry const* GetGarrSiteLevelEntry(uint32 garrSiteId, uint32 level) const;
+ std::vector<GarrSiteLevelPlotInstEntry const*> const* GetGarrPlotInstForSiteLevel(uint32 garrSiteLevelId) const;
GameObjectsEntry const* GetPlotGameObject(uint32 mapId, uint32 garrPlotInstanceId) const;
bool IsPlotMatchingBuilding(uint32 garrPlotId, uint32 garrBuildingId) const;
uint32 GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSiteLevelPlotInstId) const;
@@ -61,7 +61,7 @@ private:
void LoadPlotFinalizeGOInfo();
void LoadFollowerClassSpecAbilities();
- std::unordered_map<uint32 /*garrSiteId*/, std::vector<std::pair<uint32, GarrSiteLevelPlotInstEntry const*>>> _garrisonPlotInstBySiteLevel;
+ std::unordered_map<uint32 /*garrSiteId*/, std::vector<GarrSiteLevelPlotInstEntry const*>> _garrisonPlotInstBySiteLevel;
std::unordered_map<uint32 /*mapId*/, std::unordered_map<uint32 /*garrPlotId*/, GameObjectsEntry const*>> _garrisonPlots;
std::unordered_map<uint32 /*garrPlotId*/, std::unordered_set<uint32/*garrBuildingId*/>> _garrisonBuildingsByPlot;
std::unordered_map<uint64 /*garrBuildingId | garrSiteLevelPlotInstId << 32*/, uint32 /*garrBuildingPlotInstId*/> _garrisonBuildingPlotInstances;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index aec1bba1e65..0e93e93a136 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -16,6 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ObjectMgr.h"
#include "AccountMgr.h"
#include "AchievementMgr.h"
#include "ArenaTeam.h"
@@ -24,9 +25,9 @@
#include "Chat.h"
#include "Common.h"
#include "DatabaseEnv.h"
-#include "DB2Structure.h"
#include "DB2Stores.h"
#include "DisableMgr.h"
+#include "GameTables.h"
#include "GossipDef.h"
#include "GroupMgr.h"
#include "GuildMgr.h"
@@ -36,7 +37,6 @@
#include "Log.h"
#include "MapManager.h"
#include "Object.h"
-#include "ObjectMgr.h"
#include "PoolMgr.h"
#include "ReputationMgr.h"
#include "ScriptMgr.h"
@@ -1734,7 +1734,7 @@ void ObjectMgr::LoadCreatures()
// Build single time for check spawnmask
std::map<uint32, uint32> spawnMasks;
- for (auto& mapDifficultyPair : sMapDifficultyMap)
+ for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties())
for (auto& difficultyPair : mapDifficultyPair.second)
spawnMasks[mapDifficultyPair.first] |= (1 << difficultyPair.first);
@@ -2046,7 +2046,7 @@ void ObjectMgr::LoadGameobjects()
// build single time for check spawnmask
std::map<uint32, uint32> spawnMasks;
- for (auto& mapDifficultyPair : sMapDifficultyMap)
+ for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties())
for (auto& difficultyPair : mapDifficultyPair.second)
spawnMasks[mapDifficultyPair.first] |= (1 << difficultyPair.first);
@@ -2622,15 +2622,13 @@ void ObjectMgr::LoadItemTemplates()
uint32 oldMSTime = getMSTime();
uint32 sparseCount = 0;
- for (auto itr = sItemSparseStore.begin(); itr != sItemSparseStore.end(); ++itr)
+ for (ItemSparseEntry const* sparse : sItemSparseStore)
{
- ItemSparseEntry const* sparse = itr.Data();
- ItemEntry const* db2Data = sItemStore.LookupEntry(itr.ID());
+ ItemEntry const* db2Data = sItemStore.LookupEntry(sparse->ID);
if (!db2Data)
continue;
- ItemTemplate& itemTemplate = _itemTemplateStore[itr.ID()];
- itemTemplate.Id = itr.ID();
+ ItemTemplate& itemTemplate = _itemTemplateStore[sparse->ID];
itemTemplate.BasicData = db2Data;
itemTemplate.ExtendedData = sparse;
@@ -2644,7 +2642,7 @@ void ObjectMgr::LoadItemTemplates()
itemTemplate.FlagsCu = 0;
itemTemplate.SpellPPMRate = 0.0f;
- if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(itemTemplate.Id))
+ if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID))
{
for (ItemSpecOverrideEntry const* itemSpecOverride : *itemSpecOverrides)
itemTemplate.Specializations[0].insert(itemSpecOverride->SpecID);
@@ -3481,18 +3479,14 @@ void ObjectMgr::LoadPlayerInfo()
{
uint32 oldMSTime = getMSTime();
- _playerXPperLevel.resize(sGtOCTLevelExperienceStore.GetTableRowCount() + 1, 0);
+ _playerXPperLevel.resize(sXpGameTable.GetTableRowCount() + 1, 0);
// 0 1
QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level");
// load the DBC's levels at first...
- GtOCTLevelExperienceEntry const* exp;
- for (uint32 level = 0; level < sGtOCTLevelExperienceStore.GetTableRowCount(); ++level)
- {
- exp = sGtOCTLevelExperienceStore.EvaluateTable(level, 0);
- _playerXPperLevel[level + 1] = exp->Data;
- }
+ for (uint32 level = 0; level < sXpGameTable.GetTableRowCount(); ++level)
+ _playerXPperLevel[level + 1] = sXpGameTable.GetRow(level)->Total;
uint32 count = 0;
@@ -3537,7 +3531,7 @@ void ObjectMgr::LoadPlayerInfo()
}
}
-void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseHP, uint32& baseMana) const
+void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana) const
{
if (level < 1 || class_ >= MAX_CLASSES)
return;
@@ -3545,17 +3539,14 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& base
if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
- GtOCTBaseHPByClassEntry const* hp = sGtOCTBaseHPByClassStore.EvaluateTable(level - 1, class_ - 1);
- GtOCTBaseMPByClassEntry const* mp = sGtOCTBaseMPByClassStore.EvaluateTable(level - 1, class_ - 1);
-
- if (!hp || !mp)
+ GtBaseMPEntry const* mp = sBaseMPGameTable.GetRow(level);
+ if (!mp)
{
TC_LOG_ERROR("misc", "Tried to get non-existant Class-Level combination data for base hp/mp. Class %u Level %u", class_, level);
return;
}
- baseHP = uint32(hp->ratio);
- baseMana = uint32(mp->ratio);
+ baseMana = uint32(GetGameTableColumnForClass(mp, class_));
}
void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const
@@ -5349,7 +5340,7 @@ void ObjectMgr::LoadInstanceEncounters()
{
for (uint32 i = 0; i < MAX_DIFFICULTY; ++i)
{
- if (GetMapDifficultyData(dungeonEncounter->MapID, Difficulty(i)))
+ if (sDB2Manager.GetMapDifficultyData(dungeonEncounter->MapID, Difficulty(i)))
{
DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR64(dungeonEncounter->MapID, i)];
encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
@@ -6242,7 +6233,7 @@ void ObjectMgr::LoadAccessRequirements()
}
uint32 difficulty = fields[1].GetUInt8();
- if (!GetMapDifficultyData(mapid, Difficulty(difficulty)))
+ if (!sDB2Manager.GetMapDifficultyData(mapid, Difficulty(difficulty)))
{
TC_LOG_ERROR("sql.sql", "Map %u referenced in `access_requirement` does not have difficulty %u, skipped", mapid, difficulty);
continue;
@@ -8718,8 +8709,8 @@ void ObjectMgr::LoadCreatureClassLevelStats()
for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
{
- stats.BaseHealth[0] = sGtNpcTotalHpStore[i].EvaluateTable(Level - 1, Class - 1)->HP;
- stats.BaseDamage[0] = sGtNpcDamageByClassStore[i].EvaluateTable(Level - 1, Class - 1)->Damage;
+ stats.BaseHealth[i] = GetGameTableColumnForClass(sNpcTotalHpGameTable[i].GetRow(Level), Class);
+ stats.BaseDamage[i] = GetGameTableColumnForClass(sNpcDamageByClassGameTable[i].GetRow(Level), Class);
if (stats.BaseDamage[i] < 0.0f)
{
TC_LOG_ERROR("sql.sql", "Creature base stats for class %u, level %u has invalid negative base damage[%u] - set to 0.0", Class, Level, i);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 31eff02b3dc..c1a77bdd6f9 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -762,7 +762,7 @@ class TC_GAME_API ObjectMgr
PetLevelInfo const* GetPetLevelInfo(uint32 creature_id, uint8 level) const;
- void GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseHP, uint32& baseMana) const;
+ void GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana) const;
PlayerInfo const* GetPlayerInfo(uint32 race, uint32 class_) const;
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 93e301bf548..7883a445ebd 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -2082,7 +2082,7 @@ Difficulty Group::GetDifficultyID(MapEntry const* mapEntry) const
if (!mapEntry->IsRaid())
return m_dungeonDifficulty;
- MapDifficultyEntry const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID);
+ MapDifficultyEntry const* defaultDifficulty = sDB2Manager.GetDefaultMapDifficulty(mapEntry->ID);
if (!defaultDifficulty)
return m_legacyRaidDifficulty;
@@ -2212,7 +2212,7 @@ InstanceGroupBind* Group::GetBoundInstance(MapEntry const* mapEntry)
InstanceGroupBind* Group::GetBoundInstance(Difficulty difficulty, uint32 mapId)
{
// some instances only have one difficulty
- GetDownscaledMapDifficultyData(mapId, difficulty);
+ sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty);
BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapId);
if (itr != m_boundInstances[difficulty].end())
diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp
index c6046c3a9aa..ad112c59a61 100644
--- a/src/server/game/Groups/GroupMgr.cpp
+++ b/src/server/game/Groups/GroupMgr.cpp
@@ -19,7 +19,6 @@
#include "GroupMgr.h"
#include "InstanceSaveMgr.h"
#include "World.h"
-#include "DBCStores.h"
GroupMgr::GroupMgr()
{
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index e0d15e8def0..9c217ea6888 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -2159,8 +2159,7 @@ void Guild::SendLoginInfo(WorldSession* session)
}
for (GuildPerkSpellsEntry const* entry : sGuildPerkSpellsStore)
- if (entry->GuildLevel <= GetLevel())
- player->LearnSpell(entry->SpellID, true);
+ player->LearnSpell(entry->SpellID, true);
m_achievementMgr.SendAllData(player);
@@ -2696,8 +2695,7 @@ void Guild::DeleteMember(ObjectGuid guid, bool isDisbanding, bool isKicked, bool
player->SetGuildLevel(0);
for (GuildPerkSpellsEntry const* entry : sGuildPerkSpellsStore)
- if (entry->GuildLevel <= GetLevel())
- player->RemoveSpell(entry->SpellID, false, false);
+ player->RemoveSpell(entry->SpellID, false, false);
}
_DeleteMemberFromDB(guid.GetCounter());
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index db20f48c3e7..c365a4bbcbb 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -25,7 +25,6 @@
#include "WorldPacket.h"
#include "ObjectMgr.h"
#include "Player.h"
-#include "DBCStore.h"
class Item;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 95a99736563..d4ea3927f6c 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1243,22 +1243,6 @@ void WorldSession::HandleRequestForcedReactionsOpcode(WorldPackets::Reputation::
_player->GetReputationMgr().SendForceReactions();
}
-void WorldSession::HandleShowingHelmOpcode(WorldPackets::Character::ShowingHelm& packet)
-{
- if (packet.ShowHelm)
- _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM);
- else
- _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM);
-}
-
-void WorldSession::HandleShowingCloakOpcode(WorldPackets::Character::ShowingCloak& packet)
-{
- if (packet.ShowCloak)
- _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK);
- else
- _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK);
-}
-
void WorldSession::HandleCharRenameOpcode(WorldPackets::Character::CharacterRenameRequest& request)
{
if (!IsLegitCharacterForAccount(request.RenameInfo->Guid))
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 80ee0918616..54bbfddb5fa 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -1278,14 +1278,19 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC
if (!item)
return;
- ItemToBattlePetSpeciesEntry const* itemToBattlePetSpecies = sItemToBattlePetSpeciesStore.LookupEntry(item->GetEntry());
- if (!itemToBattlePetSpecies)
+ if (item->GetTemplate()->Effects.size() < 2)
return;
- BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(itemToBattlePetSpecies->BattlePetSpeciesID);
- if (!battlePetSpecies)
- return;
+ uint32 spellToLearn = item->GetTemplate()->Effects[1]->SpellID;
+ for (BattlePetSpeciesEntry const* entry : sBattlePetSpeciesStore)
+ {
+ if (entry->SummonSpellID == spellToLearn)
+ {
+ GetBattlePetMgr()->AddPet(entry->ID, entry->CreatureID, BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID));
+ _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT);
+ break;
+ }
+ }
- GetBattlePetMgr()->AddPet(battlePetSpecies->ID, battlePetSpecies->CreatureID, BattlePetMgr::RollPetBreed(battlePetSpecies->ID), BattlePetMgr::GetDefaultPetQuality(battlePetSpecies->ID));
_player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
}
diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index 81221599b2c..69bafe9bc11 100644
--- a/src/server/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
@@ -26,7 +26,6 @@
#include "Player.h"
#include "MailPackets.h"
#include "Language.h"
-#include "DBCStores.h"
#include "Item.h"
#include "AccountMgr.h"
#include "BattlenetAccountMgr.h"
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index a2634390cbc..0d37806d170 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -577,7 +577,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::Misc::AreaTrigger& pack
case Map::CANNOT_ENTER_INSTANCE_BIND_MISMATCH:
if (MapEntry const* entry = sMapStore.LookupEntry(at->target_mapId))
{
- char const* mapName = entry->MapName_lang;
+ char const* mapName = entry->MapName->Str[player->GetSession()->GetSessionDbcLocale()];
TC_LOG_DEBUG("maps", "MAP: Player '%s' cannot enter instance map '%s' because their permanent bind is incompatible with their group's", player->GetName().c_str(), mapName);
// is there a special opcode for this?
// @todo figure out how to get player localized difficulty string (e.g. "10 player", "Heroic" etc)
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index ae0dcc586ef..0349fad420a 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -170,9 +170,9 @@ void WorldSession::HandleMoveWorldportAckOpcode()
{
// check if this instance has a reset time and send it to player if so
Difficulty diff = GetPlayer()->GetDifficultyID(mEntry);
- if (MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mEntry->ID, diff))
+ if (MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mEntry->ID, diff))
{
- if (mapDiff->RaidDuration)
+ if (mapDiff->GetRaidDuration())
{
if (time_t timeReset = sInstanceSaveMgr->GetResetTimeFor(mEntry->ID, diff))
{
diff --git a/src/server/game/Handlers/ReferAFriendHandler.cpp b/src/server/game/Handlers/ReferAFriendHandler.cpp
index 23d432ed67c..d4b57b366be 100644
--- a/src/server/game/Handlers/ReferAFriendHandler.cpp
+++ b/src/server/game/Handlers/ReferAFriendHandler.cpp
@@ -21,6 +21,30 @@
#include "Log.h"
#include "ReferAFriendPackets.h"
+inline uint32 GetMaxLevelForExpansion(uint32 expansion)
+{
+ switch (expansion)
+ {
+ case EXPANSION_CLASSIC:
+ return 60;
+ case EXPANSION_THE_BURNING_CRUSADE:
+ return 70;
+ case EXPANSION_WRATH_OF_THE_LICH_KING:
+ return 80;
+ case EXPANSION_CATACLYSM:
+ return 85;
+ case EXPANSION_MISTS_OF_PANDARIA:
+ return 90;
+ case EXPANSION_WARLORDS_OF_DRAENOR:
+ return 100;
+ case EXPANSION_LEGION:
+ return 110;
+ default:
+ break;
+ }
+ return 0;
+}
+
void WorldSession::HandleGrantLevel(WorldPackets::RaF::GrantLevel& grantLevel)
{
Player* target = ObjectAccessor::GetPlayer(*_player, grantLevel.Target);
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 7d639d57f80..12dcfcb77df 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -19,7 +19,6 @@
#include "WorldSession.h"
#include "Common.h"
#include "Config.h"
-#include "DBCStores.h"
#include "GameObjectAI.h"
#include "GameObjectPackets.h"
#include "GuildMgr.h"
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index 4d979ecb9b3..3a5c65a0932 100644
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -376,7 +376,7 @@ void InstanceSaveManager::LoadResetTimes()
Difficulty difficulty = Difficulty(fields[1].GetUInt8());
uint64 oldresettime = fields[2].GetUInt32();
- MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty);
+ MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapid, difficulty);
if (!mapDiff)
{
TC_LOG_ERROR("misc", "InstanceSaveManager::LoadResetTimes: invalid mapid(%u)/difficulty(%u) pair in instance_reset!", mapid, difficulty);
@@ -395,7 +395,7 @@ void InstanceSaveManager::LoadResetTimes()
// calculate new global reset times for expired instances and those that have never been reset yet
// add the global reset times to the priority queue
- for (auto& mapDifficultyPair : sMapDifficultyMap)
+ for (auto& mapDifficultyPair : sDB2Manager.GetMapDifficulties())
{
uint32 mapid = mapDifficultyPair.first;
@@ -403,11 +403,11 @@ void InstanceSaveManager::LoadResetTimes()
{
Difficulty difficulty = Difficulty(difficultyPair.first);
MapDifficultyEntry const* mapDiff = difficultyPair.second;
- if (!mapDiff->RaidDuration)
+ if (!mapDiff->GetRaidDuration())
continue;
// the reset_delay must be at least one day
- uint32 period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY);
+ uint32 period = uint32(((mapDiff->GetRaidDuration() * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY);
if (period < DAY)
period = DAY;
@@ -447,15 +447,15 @@ void InstanceSaveManager::LoadResetTimes()
time_t InstanceSaveManager::GetSubsequentResetTime(uint32 mapid, Difficulty difficulty, time_t resetTime) const
{
- MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty);
- if (!mapDiff || !mapDiff->RaidDuration)
+ MapDifficultyEntry const* mapDiff = sDB2Manager.GetMapDifficultyData(mapid, difficulty);
+ if (!mapDiff || !mapDiff->GetRaidDuration())
{
TC_LOG_ERROR("misc", "InstanceSaveManager::GetSubsequentResetTime: not valid difficulty or no reset delay for map %u", mapid);
return 0;
}
time_t diff = sWorld->getIntConfig(CONFIG_INSTANCE_RESET_TIME_HOUR) * HOUR;
- time_t period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY);
+ time_t period = uint32(((mapDiff->GetRaidDuration() * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY);
if (period < DAY)
period = DAY;
@@ -501,7 +501,7 @@ void InstanceSaveManager::ScheduleReset(bool add, time_t time, InstResetEvent ev
void InstanceSaveManager::ForceGlobalReset(uint32 mapId, Difficulty difficulty)
{
- if (!GetDownscaledMapDifficultyData(mapId, difficulty))
+ if (!sDB2Manager.GetDownscaledMapDifficultyData(mapId, difficulty))
return;
// remove currently scheduled reset times
ScheduleReset(false, 0, InstResetEvent(1, mapId, difficulty, 0));
@@ -627,7 +627,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b
MapEntry const* mapEntry = sMapStore.LookupEntry(mapid);
if (!mapEntry->Instanceable())
return;
- TC_LOG_DEBUG("misc", "InstanceSaveManager::ResetOrWarnAll: Processing map %s (%u) on difficulty %u (warn? %u)", mapEntry->MapName_lang, mapid, uint8(difficulty), warn);
+ TC_LOG_DEBUG("misc", "InstanceSaveManager::ResetOrWarnAll: Processing map %s (%u) on difficulty %u (warn? %u)", mapEntry->MapName->Str[sWorld->GetDefaultDbcLocale()], mapid, uint8(difficulty), warn);
time_t now = time(NULL);
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index 2452c8f913e..f110425c1a4 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -1586,9 +1586,9 @@ void LoadLootTemplates_Fishing()
uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(lootIdSet);
// remove real entries and check existence loot
- for (auto itr = sAreaTableStore.begin(); itr != sAreaTableStore.end(); ++itr)
- if (lootIdSet.find(itr.ID()) != lootIdSet.end())
- lootIdSet.erase(itr.ID());
+ for (AreaTableEntry const* areaTable : sAreaTableStore)
+ if (lootIdSet.find(areaTable->ID) != lootIdSet.end())
+ lootIdSet.erase(areaTable->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 cce2671b69b..37321344782 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -239,7 +239,7 @@ m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE),
m_VisibilityNotifyPeriod(DEFAULT_VISIBILITY_NOTIFY_PERIOD),
m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()),
i_gridExpiry(expiry),
-i_scriptLock(false), _defaultLight(GetDefaultMapLight(id))
+i_scriptLock(false), _defaultLight(DB2Manager::GetDefaultMapLight(id))
{
m_parentMap = (_parent ? _parent : this);
for (unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx)
@@ -2403,7 +2403,7 @@ bool Map::IsOutdoors(float x, float y, float z) const
return true;
AreaTableEntry const* atEntry = nullptr;
- WMOAreaTableEntry const* wmoEntry= GetWMOAreaTableEntryByTripple(rootId, adtId, groupId);
+ WMOAreaTableEntry const* wmoEntry= sDB2Manager.GetWMOAreaTable(rootId, adtId, groupId);
if (wmoEntry)
{
TC_LOG_DEBUG("maps", "Got WMOAreaTableEntry! flag %u, areaid %u", wmoEntry->Flags, wmoEntry->AreaTableID);
@@ -2443,7 +2443,7 @@ uint32 Map::GetAreaId(float x, float y, float z, bool *isOutdoors) const
if (GetAreaInfo(x, y, z, mogpFlags, adtId, rootId, groupId))
{
haveAreaInfo = true;
- wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId);
+ wmoEntry = sDB2Manager.GetWMOAreaTable(rootId, adtId, groupId);
if (wmoEntry)
{
areaId = wmoEntry->AreaTableID;
@@ -3413,7 +3413,7 @@ void InstanceMap::SetResetSchedule(bool on)
MapDifficultyEntry const* Map::GetMapDifficulty() const
{
- return GetMapDifficultyData(GetId(), GetDifficultyID());
+ return sDB2Manager.GetMapDifficultyData(GetId(), GetDifficultyID());
}
uint32 Map::GetDifficultyLootBonusTreeMod() const
@@ -3428,6 +3428,36 @@ uint32 Map::GetDifficultyLootBonusTreeMod() const
return 0;
}
+uint32 Map::GetId() const
+{
+ return i_mapEntry->ID;
+}
+
+bool Map::Instanceable() const
+{
+ return i_mapEntry && i_mapEntry->Instanceable();
+}
+
+bool Map::IsDungeon() const
+{
+ return i_mapEntry && i_mapEntry->IsDungeon();
+}
+
+bool Map::IsNonRaidDungeon() const
+{
+ return i_mapEntry && i_mapEntry->IsNonRaidDungeon();
+}
+
+bool Map::IsRaid() const
+{
+ return i_mapEntry && i_mapEntry->IsRaid();
+}
+
+bool Map::IsRaidOrHeroicDungeon() const
+{
+ return IsRaid() || IsHeroic();
+}
+
bool Map::IsHeroic() const
{
if (DifficultyEntry const* difficulty = sDifficultyStore.LookupEntry(i_spawnMode))
@@ -3435,6 +3465,38 @@ bool Map::IsHeroic() const
return false;
}
+bool Map::Is25ManRaid() const
+{
+ return IsRaid() && (i_spawnMode == DIFFICULTY_25_N || i_spawnMode == DIFFICULTY_25_HC);
+}
+
+bool Map::IsBattleground() const
+{
+ return i_mapEntry && i_mapEntry->IsBattleground();
+}
+
+bool Map::IsBattleArena() const
+{
+ return i_mapEntry && i_mapEntry->IsBattleArena();
+}
+
+bool Map::IsBattlegroundOrArena() const
+{
+ return i_mapEntry && i_mapEntry->IsBattlegroundOrArena();
+}
+
+bool Map::IsGarrison() const
+{
+ return i_mapEntry && i_mapEntry->IsGarrison();
+}
+
+bool Map::GetEntrancePos(int32 &mapid, float &x, float &y)
+{
+ if (!i_mapEntry)
+ return false;
+ return i_mapEntry->GetEntrancePos(mapid, x, y);
+}
+
bool InstanceMap::HasPermBoundPlayers() const
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PERM_BIND_BY_INSTANCE);
@@ -3454,7 +3516,7 @@ uint32 InstanceMap::GetMaxPlayers() const
uint32 InstanceMap::GetMaxResetDelay() const
{
MapDifficultyEntry const* mapDiff = GetMapDifficulty();
- return mapDiff ? mapDiff->RaidDuration : 0;
+ return mapDiff ? mapDiff->GetRaidDuration() : 0;
}
/* ******* Battleground Instance Maps ******* */
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 7d73d9b6625..89edf9823b7 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -21,8 +21,6 @@
#include "Define.h"
-#include "DBCStructure.h"
-#include "DB2Structure.h"
#include "GridDefines.h"
#include "Cell.h"
#include "Timer.h"
@@ -37,24 +35,28 @@
#include <list>
#include <memory>
-class Unit;
-class WorldPacket;
-class InstanceScript;
+class Battleground;
+class BattlegroundMap;
+class CreatureGroup;
class Group;
+class InstanceMap;
class InstanceSave;
+class InstanceScript;
+class MapInstanced;
class Object;
-class WorldObject;
-class TempSummon;
class Player;
-class CreatureGroup;
-struct ScriptInfo;
-struct ScriptAction;
+class TempSummon;
+class Unit;
+class WorldObject;
+class WorldPacket;
+struct MapDifficultyEntry;
+struct MapEntry;
struct Position;
-class Battleground;
-class MapInstanced;
-class BattlegroundMap;
-class InstanceMap;
+struct ScriptAction;
+struct ScriptInfo;
+struct SummonPropertiesEntry;
class Transport;
+enum Difficulty : uint8;
enum WeatherState : uint32;
namespace Trinity { struct ObjectUpdater; }
@@ -323,8 +325,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
grid.ResetTimeTracker(time_t(float(i_gridExpiry)*factor));
}
- time_t GetGridExpiry(void) const { return i_gridExpiry; }
- uint32 GetId(void) const { return i_mapEntry->ID; }
+ time_t GetGridExpiry() const { return i_gridExpiry; }
static bool ExistMap(uint32 mapid, int gx, int gy);
static bool ExistVMap(uint32 mapid, int gx, int gy);
@@ -393,23 +394,19 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
MapDifficultyEntry const* GetMapDifficulty() const;
uint32 GetDifficultyLootBonusTreeMod() const;
- bool Instanceable() const { return i_mapEntry && i_mapEntry->Instanceable(); }
- bool IsDungeon() const { return i_mapEntry && i_mapEntry->IsDungeon(); }
- bool IsNonRaidDungeon() const { return i_mapEntry && i_mapEntry->IsNonRaidDungeon(); }
- bool IsRaid() const { return i_mapEntry && i_mapEntry->IsRaid(); }
- bool IsRaidOrHeroicDungeon() const { return IsRaid() || IsHeroic(); }
+ uint32 GetId() const;
+ bool Instanceable() const;
+ bool IsDungeon() const;
+ bool IsNonRaidDungeon() const;
+ bool IsRaid() const;
+ bool IsRaidOrHeroicDungeon() const;
bool IsHeroic() const;
- bool Is25ManRaid() const { return IsRaid() && (i_spawnMode == DIFFICULTY_25_N || i_spawnMode == DIFFICULTY_25_HC); } // since 25man difficulties are 1 and 3, we can check them like that
- bool IsBattleground() const { return i_mapEntry && i_mapEntry->IsBattleground(); }
- bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); }
- bool IsBattlegroundOrArena() const { return i_mapEntry && i_mapEntry->IsBattlegroundOrArena(); }
- bool IsGarrison() const { return i_mapEntry && i_mapEntry->IsGarrison(); }
- bool GetEntrancePos(int32 &mapid, float &x, float &y)
- {
- if (!i_mapEntry)
- return false;
- return i_mapEntry->GetEntrancePos(mapid, x, y);
- }
+ bool Is25ManRaid() const; // since 25man difficulties are 1 and 3, we can check them like that
+ bool IsBattleground() const;
+ bool IsBattleArena() const;
+ bool IsBattlegroundOrArena() const;
+ bool IsGarrison() const;
+ bool GetEntrancePos(int32 &mapid, float &x, float &y);
void AddObjectToRemoveList(WorldObject* obj);
void AddObjectToSwitchList(WorldObject* obj, bool on);
diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp
index 12cec6d8633..f80c04d7c8c 100644
--- a/src/server/game/Maps/MapInstanced.cpp
+++ b/src/server/game/Maps/MapInstanced.cpp
@@ -225,7 +225,7 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save,
}
// some instances only have one difficulty
- GetDownscaledMapDifficultyData(GetId(), difficulty);
+ sDB2Manager.GetDownscaledMapDifficultyData(GetId(), difficulty);
TC_LOG_DEBUG("maps", "MapInstanced::CreateInstance: %s map instance %d for %d created with difficulty %s", save ? "" : "new ", InstanceId, GetId(), difficulty ? "heroic" : "normal");
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index 5a31bb822b4..d85d198fe9c 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -140,7 +140,7 @@ Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool
Difficulty targetDifficulty, requestedDifficulty;
targetDifficulty = requestedDifficulty = player->GetDifficultyID(entry);
// Get the highest available difficulty if current setting is higher than the instance allows
- MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(entry->ID, targetDifficulty);
+ MapDifficultyEntry const* mapDiff = sDB2Manager.GetDownscaledMapDifficultyData(mapid, targetDifficulty);
if (!mapDiff)
return Map::CANNOT_ENTER_DIFFICULTY_UNAVAILABLE;
diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h
index d058c0bb111..625f78b53bd 100644
--- a/src/server/game/Maps/TransportMgr.h
+++ b/src/server/game/Maps/TransportMgr.h
@@ -20,7 +20,6 @@
#include <G3D/Quat.h>
#include "Spline.h"
-#include "DBCStores.h"
#include "DB2Stores.h"
#include "ObjectGuid.h"
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index 94aa48168da..41d0e4b8a15 100644
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -23,9 +23,28 @@
#include "SharedDefines.h"
#include "ScriptMgr.h"
#include "Player.h"
+#include "GameTables.h"
namespace Trinity
{
+ inline uint32 GetExpansionForLevel(uint32 level)
+ {
+ if (level < 60)
+ return EXPANSION_CLASSIC;
+ else if (level < 70)
+ return EXPANSION_THE_BURNING_CRUSADE;
+ else if (level < 80)
+ return EXPANSION_WRATH_OF_THE_LICH_KING;
+ else if (level < 85)
+ return EXPANSION_CATACLYSM;
+ else if (level < 90)
+ return EXPANSION_MISTS_OF_PANDARIA;
+ else if (level < 100)
+ return EXPANSION_WARLORDS_OF_DRAENOR;
+ else
+ return CURRENT_EXPANSION;
+ }
+
namespace Honor
{
inline float hk_honor_at_level_f(uint8 level, float multiplier = 1.0f)
@@ -120,11 +139,8 @@ namespace Trinity
{
uint32 baseGain;
- GtOCTLevelExperienceEntry const* BaseExpPlayer = sGtOCTLevelExperienceStore.EvaluateTable(pl_level - 1, 1);
- GtOCTLevelExperienceEntry const* BaseExpMob = sGtOCTLevelExperienceStore.EvaluateTable(mob_level - 1, 1);
-
- GtOCTLevelExperienceEntry const* CoefPlayer = sGtOCTLevelExperienceStore.EvaluateTable(pl_level - 1, 4);
- GtOCTLevelExperienceEntry const* CoefMob = sGtOCTLevelExperienceStore.EvaluateTable(mob_level - 1, 4);
+ GtXpEntry const* xpPlayer = sXpGameTable.GetRow(pl_level);
+ GtXpEntry const* xpMob = sXpGameTable.GetRow(mob_level);
if (mob_level >= pl_level)
{
@@ -132,7 +148,7 @@ namespace Trinity
if (nLevelDiff > 4)
nLevelDiff = 4;
- baseGain = uint32(round(BaseExpPlayer->Data * (1 + 0.05f * nLevelDiff)));
+ baseGain = uint32(round(xpPlayer->PerKill * (1 + 0.05f * nLevelDiff)));
}
else
{
@@ -140,7 +156,7 @@ namespace Trinity
if (mob_level > gray_level)
{
uint8 ZD = GetZeroDifference(pl_level);
- baseGain = uint32(round(BaseExpMob->Data * ((1 - ((pl_level - mob_level) / float(ZD))) * (CoefMob->Data / CoefPlayer->Data))));
+ baseGain = uint32(round(xpMob->PerKill * ((1 - ((pl_level - mob_level) / float(ZD))) * (xpMob->Divisor / xpPlayer->Divisor))));
}
else
baseGain = 0;
diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index ceecf1a9b85..46ceb14df3d 100644
--- a/src/server/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
@@ -19,7 +19,6 @@
#include "DatabaseEnv.h"
#include "ReputationMgr.h"
#include "ReputationPackets.h"
-#include "DBCStores.h"
#include "Player.h"
#include "WorldPacket.h"
#include "World.h"
@@ -235,11 +234,9 @@ void ReputationMgr::Initialize()
_exaltedFactionCount = 0;
_sendFactionIncreased = false;
- for (unsigned int i = 1; i < sFactionStore.GetNumRows(); i++)
+ for (FactionEntry const* factionEntry : sFactionStore)
{
- FactionEntry const* factionEntry = sFactionStore.LookupEntry(i);
-
- if (factionEntry && factionEntry->CanHaveReputation())
+ if (factionEntry->CanHaveReputation())
{
FactionState newFaction;
newFaction.ID = factionEntry->ID;
@@ -283,7 +280,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi
{
float spillOverRepOut = float(standing);
// check for sub-factions that receive spillover
- std::vector<uint32> const* flist = GetFactionTeamList(factionEntry->ID);
+ std::vector<uint32> const* flist = sDB2Manager.GetFactionTeamList(factionEntry->ID);
// if has no sub-factions, check for factions with same parent
if (!flist && factionEntry->ParentFactionID && factionEntry->ParentFactionModOut != 0.0f)
{
@@ -298,7 +295,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi
}
else // spill to "sister" factions
{
- flist = GetFactionTeamList(factionEntry->ParentFactionID);
+ flist = sDB2Manager.GetFactionTeamList(factionEntry->ParentFactionID);
}
}
}
diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h
index f2a5f3ba1f3..3486a533d54 100644
--- a/src/server/game/Reputation/ReputationMgr.h
+++ b/src/server/game/Reputation/ReputationMgr.h
@@ -22,7 +22,6 @@
#include "Common.h"
#include "SharedDefines.h"
#include "Language.h"
-#include "DBCStructure.h"
#include "QueryResult.h"
#include <map>
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 5d3297b009d..70f0e717e7c 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -20,7 +20,6 @@
#include "ScriptReloadMgr.h"
#include "Config.h"
#include "DatabaseEnv.h"
-#include "DBCStores.h"
#include "ObjectMgr.h"
#include "OutdoorPvPMgr.h"
#include "ScriptSystem.h"
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index c3deab43ee6..17583bd9b5e 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -21,7 +21,6 @@
#include "Common.h"
#include <atomic>
-#include "DBCStores.h"
#include "QuestDef.h"
#include "SharedDefines.h"
#include "World.h"
@@ -62,10 +61,12 @@ class WorldSocket;
class WorldObject;
class WorldSession;
+struct AreaTriggerEntry;
struct AuctionEntry;
struct ConditionSourceInfo;
struct Condition;
struct ItemTemplate;
+struct MapEntry;
struct OutdoorPvPData;
#define VISIBLE_RANGE 166.0f //MAX visible range (size of grid)
diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp
index dfa4bbb3bfa..a12818f2281 100644
--- a/src/server/game/Server/Packets/CharacterPackets.cpp
+++ b/src/server/game/Server/Packets/CharacterPackets.cpp
@@ -434,16 +434,6 @@ WorldPacket const* WorldPackets::Character::PlayedTime::Write()
return &_worldPacket;
}
-void WorldPackets::Character::ShowingCloak::Read()
-{
- ShowCloak = _worldPacket.ReadBit();
-}
-
-void WorldPackets::Character::ShowingHelm::Read()
-{
- ShowHelm = _worldPacket.ReadBit();
-}
-
void WorldPackets::Character::SetTitle::Read()
{
_worldPacket >> TitleID;
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index 6edf7bc097c..be4f1153ab2 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -570,26 +570,6 @@ namespace WorldPackets
bool TriggerEvent = false;
};
- class ShowingCloak final : public ClientPacket
- {
- public:
- ShowingCloak(WorldPacket&& packet) : ClientPacket(CMSG_SHOWING_CLOAK, std::move(packet)) { }
-
- void Read() override;
-
- bool ShowCloak = false;
- };
-
- class ShowingHelm final : public ClientPacket
- {
- public:
- ShowingHelm(WorldPacket&& packet) : ClientPacket(CMSG_SHOWING_HELM, std::move(packet)) { }
-
- void Read() override;
-
- bool ShowHelm = false;
- };
-
class SetTitle final : public ClientPacket
{
public:
diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h
index a5ce42d7488..2b92ab1311f 100644
--- a/src/server/game/Server/Packets/GarrisonPackets.h
+++ b/src/server/game/Server/Packets/GarrisonPackets.h
@@ -22,7 +22,8 @@
#include "ObjectGuid.h"
#include "Position.h"
#include "PacketUtilities.h"
-#include "DB2Structure.h"
+
+struct GarrAbilityEntry;
namespace WorldPackets
{
diff --git a/src/server/game/Server/Packets/TaxiPackets.h b/src/server/game/Server/Packets/TaxiPackets.h
index c4d4cac3046..0f5bd82d079 100644
--- a/src/server/game/Server/Packets/TaxiPackets.h
+++ b/src/server/game/Server/Packets/TaxiPackets.h
@@ -20,7 +20,6 @@
#include "Packet.h"
#include "ObjectGuid.h"
-#include "DB2Structure.h"
namespace WorldPackets
{
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 900092c126b..23f6a576876 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -710,8 +710,6 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeItem, &WorldSession::HandleSetTradeItemOpcode);
DEFINE_HANDLER(CMSG_SET_USING_PARTY_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_WATCHED_FACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetWatchedFaction, &WorldSession::HandleSetWatchedFactionOpcode);
- DEFINE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingCloak, &WorldSession::HandleShowingCloakOpcode);
- DEFINE_HANDLER(CMSG_SHOWING_HELM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingHelm, &WorldSession::HandleShowingHelmOpcode);
DEFINE_HANDLER(CMSG_SHOW_TRADE_SKILL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SIGN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::SignPetition, &WorldSession::HandleSignPetition);
DEFINE_HANDLER(CMSG_SILENCE_PARTY_TALKER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 715799294de..01d5134a472 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -49,77 +49,80 @@ enum OpcodeClient : uint32
CMSG_ACCEPT_LEVEL_GRANT = 0x34E8,
CMSG_ACCEPT_TRADE = 0x315A,
CMSG_ACCEPT_WARGAME_INVITE = 0x35DF,
- CMSG_ACTIVATE_TAXI = 0x34A4,
- CMSG_ADD_BATTLENET_FRIEND = 0x365F,
- CMSG_ADD_FRIEND = 0x36D4,
- CMSG_ADD_IGNORE = 0x36D8,
+ CMSG_ACTIVATE_TAXI = 0x34A6,
CMSG_ADDON_LIST = 0x35D7,
- CMSG_ADD_TOY = 0x3270,
+ CMSG_ADD_BATTLENET_FRIEND = 0x365F,
+ CMSG_ADD_FRIEND = 0x36D5,
+ CMSG_ADD_IGNORE = 0x36D9,
+ CMSG_ADD_TOY = 0x3274,
CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x31EA,
- CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x3308,
+ CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x331B,
CMSG_ALTER_APPEARANCE = 0x34E4,
- CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34A9,
- CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34AA,
+ CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34AB,
+ CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34AC,
CMSG_AREA_TRIGGER = 0x31C1,
CMSG_ARTIFACT_ADD_POWER = 0x31A5,
- CMSG_ARTIFACT_REMOVE_ALL_POWERS = 0x31A6,
CMSG_ARTIFACT_SET_APPEARANCE = 0x31A7,
- CMSG_ATTACK_STOP = 0x3237,
- CMSG_ATTACK_SWING = 0x3236,
- CMSG_AUCTION_HELLO_REQUEST = 0x34B9,
- CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34BF,
- CMSG_AUCTION_LIST_ITEMS = 0x34BC,
- CMSG_AUCTION_LIST_OWNER_ITEMS = 0x34BE,
- CMSG_AUCTION_LIST_PENDING_SALES = 0x34C1,
- CMSG_AUCTION_PLACE_BID = 0x34C0,
- CMSG_AUCTION_REMOVE_ITEM = 0x34BB,
- CMSG_AUCTION_REPLICATE_ITEMS = 0x34BD,
- CMSG_AUCTION_SELL_ITEM = 0x34BA,
+ CMSG_ATTACK_STOP = 0x323A,
+ CMSG_ATTACK_SWING = 0x3239,
+ CMSG_AUCTION_HELLO_REQUEST = 0x34BB,
+ CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34C1,
+ CMSG_AUCTION_LIST_ITEMS = 0x34BE,
+ CMSG_AUCTION_LIST_OWNER_ITEMS = 0x34C0,
+ CMSG_AUCTION_LIST_PENDING_SALES = 0x34C3,
+ CMSG_AUCTION_PLACE_BID = 0x34C2,
+ CMSG_AUCTION_REMOVE_ITEM = 0x34BD,
+ CMSG_AUCTION_REPLICATE_ITEMS = 0x34BF,
+ CMSG_AUCTION_SELL_ITEM = 0x34BC,
CMSG_AUTH_CONTINUED_SESSION = 0x3766,
CMSG_AUTH_SESSION = 0x3765,
- CMSG_AUTOBANK_ITEM = 0x3997,
- CMSG_AUTOBANK_REAGENT = 0x3999,
- CMSG_AUTOSTORE_BANK_ITEM = 0x3996,
- CMSG_AUTOSTORE_BANK_REAGENT = 0x3998,
+ CMSG_AUTOBANK_ITEM = 0x3996,
+ CMSG_AUTOBANK_REAGENT = 0x3998,
+ CMSG_AUTOSTORE_BANK_ITEM = 0x3997,
+ CMSG_AUTOSTORE_BANK_REAGENT = 0x3999,
CMSG_AUTO_EQUIP_ITEM = 0x399A,
CMSG_AUTO_EQUIP_ITEM_SLOT = 0x399F,
CMSG_AUTO_STORE_BAG_ITEM = 0x399B,
- CMSG_BANKER_ACTIVATE = 0x34AC,
+ CMSG_BANKER_ACTIVATE = 0x34AE,
CMSG_BATTLEFIELD_LEAVE = 0x3171,
CMSG_BATTLEFIELD_LIST = 0x317C,
- CMSG_BATTLEFIELD_PORT = 0x350E,
- CMSG_BATTLEMASTER_HELLO = 0x3285,
- CMSG_BATTLEMASTER_JOIN = 0x350B,
- CMSG_BATTLEMASTER_JOIN_ARENA = 0x350C,
- CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x350D,
- CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D7,
- CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CE,
- CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CD,
+ CMSG_BATTLEFIELD_PORT = 0x3512,
+ CMSG_BATTLEMASTER_HELLO = 0x3289,
+ CMSG_BATTLEMASTER_JOIN = 0x350F,
+ CMSG_BATTLEMASTER_JOIN_ARENA = 0x3510,
+ CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3511,
+ CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D8,
+ CMSG_BATTLENET_REQUEST = 0x36FC,
+ CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36FD,
+ CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CF,
+ CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CE,
CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C7,
CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36C2,
CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36C3,
- CMSG_BATTLE_PAY_START_PURCHASE = 0x36CC,
- CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F8,
- CMSG_BATTLE_PET_DELETE_PET = 0x3625,
- CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3626,
- CMSG_BATTLE_PET_MODIFY_NAME = 0x3628,
- CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3624,
- CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3623,
- CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362C,
+ CMSG_BATTLE_PAY_START_PURCHASE = 0x36F8,
+ CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F9,
+ CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C8,
+ CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C,
+ CMSG_BATTLE_PET_DELETE_PET = 0x3624,
+ CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3625,
+ CMSG_BATTLE_PET_MODIFY_NAME = 0x3627,
+ CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3623,
+ CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3622,
+ CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362B,
CMSG_BATTLE_PET_SET_FLAGS = 0x362F,
- CMSG_BATTLE_PET_SUMMON = 0x3629,
+ CMSG_BATTLE_PET_SUMMON = 0x3628,
CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31CA,
CMSG_BEGIN_TRADE = 0x3157,
- CMSG_BINDER_ACTIVATE = 0x34AB,
- CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3515,
- CMSG_BLACK_MARKET_OPEN = 0x3513,
- CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3514,
+ CMSG_BINDER_ACTIVATE = 0x34AD,
+ CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3519,
+ CMSG_BLACK_MARKET_OPEN = 0x3517,
+ CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3518,
CMSG_BUG_REPORT = 0x368C,
CMSG_BUSY_TRADE = 0x3158,
- CMSG_BUY_BACK_ITEM = 0x349D,
- CMSG_BUY_BANK_SLOT = 0x34AD,
- CMSG_BUY_ITEM = 0x349C,
- CMSG_BUY_REAGENT_BANK = 0x34AE,
+ CMSG_BUY_BACK_ITEM = 0x349F,
+ CMSG_BUY_BANK_SLOT = 0x34AF,
+ CMSG_BUY_ITEM = 0x349E,
+ CMSG_BUY_REAGENT_BANK = 0x34B0,
CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36F1,
CMSG_BUY_WOW_TOKEN_START = 0x36F0,
CMSG_CAGE_BATTLE_PET = 0x31DA,
@@ -139,22 +142,22 @@ enum OpcodeClient : uint32
CMSG_CALENDAR_REMOVE_INVITE = 0x3679,
CMSG_CALENDAR_UPDATE_EVENT = 0x3684,
CMSG_CANCEL_AURA = 0x31A9,
- CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34D4,
- CMSG_CANCEL_CAST = 0x3275,
- CMSG_CANCEL_CHANNELLING = 0x3244,
- CMSG_CANCEL_GROWTH_AURA = 0x3249,
- CMSG_CANCEL_MASTER_LOOT_ROLL = 0x31F6,
+ CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34D6,
+ CMSG_CANCEL_CAST = 0x3279,
+ CMSG_CANCEL_CHANNELLING = 0x3247,
+ CMSG_CANCEL_GROWTH_AURA = 0x324C,
+ CMSG_CANCEL_MASTER_LOOT_ROLL = 0x31F8,
CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31A8,
- CMSG_CANCEL_MOUNT_AURA = 0x3259,
+ CMSG_CANCEL_MOUNT_AURA = 0x325D,
CMSG_CANCEL_QUEUED_SPELL = 0x317D,
CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34E1,
CMSG_CANCEL_TRADE = 0x315C,
CMSG_CAN_DUEL = 0x3668,
- CMSG_CAST_SPELL = 0x3273,
+ CMSG_CAST_SPELL = 0x3277,
CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F,
CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308E,
- CMSG_CHANGE_BAG_SLOT_FLAG = 0x32EE,
- CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32D0,
+ CMSG_CHANGE_BAG_SLOT_FLAG = 0x32FD,
+ CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32DD,
CMSG_CHANGE_SUB_GROUP = 0x364D,
CMSG_CHARACTER_RENAME_REQUEST = 0x36C5,
CMSG_CHAR_CUSTOMIZE = 0x3694,
@@ -208,13 +211,13 @@ enum OpcodeClient : uint32
CMSG_CHAT_REPORT_FILTERED = 0x37CC,
CMSG_CHAT_REPORT_IGNORED = 0x37CB,
CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x37CE,
- CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36CF,
+ CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36D0,
CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36EF,
- CMSG_CHOICE_RESPONSE = 0x3277,
+ CMSG_CHOICE_RESPONSE = 0x327B,
CMSG_CLEAR_RAID_MARKER = 0x319F,
CMSG_CLEAR_TRADE_ITEM = 0x315E,
- CMSG_CLIENT_PORT_GRAVEYARD = 0x3510,
- CMSG_CLOSE_INTERACTION = 0x348A,
+ CMSG_CLIENT_PORT_GRAVEYARD = 0x3514,
+ CMSG_CLOSE_INTERACTION = 0x348B,
CMSG_COMMENTATOR_ENABLE = 0x35EF,
CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F2,
CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F3,
@@ -222,95 +225,99 @@ enum OpcodeClient : uint32
CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F1,
CMSG_COMMENTATOR_START_WARGAME = 0x35EE,
CMSG_COMPLAINT = 0x3672,
- CMSG_COMPLETE_CINEMATIC = 0x352D,
- CMSG_COMPLETE_MOVIE = 0x34CB,
- CMSG_CONFIRM_RESPEC_WIPE = 0x31F0,
+ CMSG_COMPLETE_CINEMATIC = 0x3531,
+ CMSG_COMPLETE_MOVIE = 0x34CD,
+ CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31A6,
+ CMSG_CONFIRM_RESPEC_WIPE = 0x31F2,
CMSG_CONNECT_TO_FAILED = 0x35D4,
CMSG_CONVERT_RAID = 0x364F,
CMSG_CREATE_CHARACTER = 0x3644,
- CMSG_CREATE_SHIPMENT = 0x32BF,
+ CMSG_CREATE_SHIPMENT = 0x32C9,
CMSG_DB_QUERY_BULK = 0x35E5,
- CMSG_DECLINE_GUILD_INVITES = 0x3509,
- CMSG_DECLINE_PETITION = 0x351C,
- CMSG_DELETE_EQUIPMENT_SET = 0x34FA,
- CMSG_DEL_FRIEND = 0x36D5,
- CMSG_DEL_IGNORE = 0x36D9,
- CMSG_DEPOSIT_REAGENT_BANK = 0x32F7,
- CMSG_DESTROY_ITEM = 0x326A,
- CMSG_DF_BOOT_PLAYER_VOTE = 0x3616,
- CMSG_DF_GET_JOIN_STATUS = 0x3614,
- CMSG_DF_GET_SYSTEM_INFO = 0x3613,
- CMSG_DF_JOIN = 0x3607,
- CMSG_DF_LEAVE = 0x3612,
- CMSG_DF_PROPOSAL_RESPONSE = 0x3606,
- CMSG_DF_READY_CHECK_RESPONSE = 0x3619,
- CMSG_DF_SET_ROLES = 0x3615,
- CMSG_DF_TELEPORT = 0x3617,
+ CMSG_DECLINE_GUILD_INVITES = 0x350D,
+ CMSG_DECLINE_PETITION = 0x3520,
+ CMSG_DELETE_EQUIPMENT_SET = 0x34FB,
+ CMSG_DEL_FRIEND = 0x36D6,
+ CMSG_DEL_IGNORE = 0x36DA,
+ CMSG_DEPOSIT_REAGENT_BANK = 0x3306,
+ CMSG_DESTROY_ITEM = 0x326E,
+ CMSG_DF_BOOT_PLAYER_VOTE = 0x3615,
+ CMSG_DF_GET_JOIN_STATUS = 0x3613,
+ CMSG_DF_GET_SYSTEM_INFO = 0x3612,
+ CMSG_DF_JOIN = 0x3606,
+ CMSG_DF_LEAVE = 0x3611,
+ CMSG_DF_PROPOSAL_RESPONSE = 0x3605,
+ CMSG_DF_READY_CHECK_RESPONSE = 0x3618,
+ CMSG_DF_SET_ROLES = 0x3614,
+ CMSG_DF_TELEPORT = 0x3616,
CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A3C,
CMSG_DISMISS_CRITTER = 0x34EA,
- CMSG_DO_MASTER_LOOT_ROLL = 0x31F5,
+ CMSG_DO_MASTER_LOOT_ROLL = 0x31F7,
CMSG_DO_READY_CHECK = 0x3634,
- CMSG_DUEL_RESPONSE = 0x34D0,
- CMSG_EJECT_PASSENGER = 0x321D,
- CMSG_EMOTE = 0x3529,
+ CMSG_DUEL_RESPONSE = 0x34D2,
+ CMSG_EJECT_PASSENGER = 0x3220,
+ CMSG_EMOTE = 0x352D,
CMSG_ENABLE_NAGLE = 0x376A,
- CMSG_ENABLE_TAXI_NODE = 0x34A2,
+ CMSG_ENABLE_TAXI_NODE = 0x34A4,
CMSG_ENGINE_SURVEY = 0x36E9,
CMSG_ENUM_CHARACTERS = 0x35E7,
CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36E3,
- CMSG_FAR_SIGHT = 0x34D5,
+ CMSG_FAR_SIGHT = 0x34D7,
CMSG_GAME_OBJ_REPORT_USE = 0x34DE,
CMSG_GAME_OBJ_USE = 0x34DD,
- CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32B0,
- CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32A2,
- CMSG_GARRISON_CHECK_UPGRADEABLE = 0x32EA,
- CMSG_GARRISON_COMPLETE_MISSION = 0x32DD,
- CMSG_GARRISON_GENERATE_RECRUITS = 0x32B3,
- CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32BB,
- CMSG_GARRISON_MISSION_BONUS_ROLL = 0x32DF,
- CMSG_GARRISON_PURCHASE_BUILDING = 0x329E,
- CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32B5,
- CMSG_GARRISON_REMOVE_FOLLOWER = 0x32D4,
- CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32B1,
- CMSG_GARRISON_RENAME_FOLLOWER = 0x32B2,
- CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x329D,
- CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32BE,
- CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32BD,
- CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x329F,
- CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32AF,
- CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32AB,
- CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32B4,
- CMSG_GARRISON_START_MISSION = 0x32DC,
- CMSG_GARRISON_SWAP_BUILDINGS = 0x32A3,
+ CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32B5,
+ CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32A6,
+ CMSG_GARRISON_CHANGE_ZONE_SUPPORT_SPELL_FOR_FOLLOWER = 0x32B4,
+ CMSG_GARRISON_CHECK_UPGRADEABLE = 0x32F9,
+ CMSG_GARRISON_COMPLETE_MISSION = 0x32EA,
+ CMSG_GARRISON_GENERATE_RECRUITS = 0x32B8,
+ CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32C5,
+ CMSG_GARRISON_MISSION_BONUS_ROLL = 0x32EC,
+ CMSG_GARRISON_PURCHASE_BUILDING = 0x32A2,
+ CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32BA,
+ CMSG_GARRISON_REMOVE_FOLLOWER = 0x32E1,
+ CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32B6,
+ CMSG_GARRISON_RENAME_FOLLOWER = 0x32B7,
+ CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32A1,
+ CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32BE,
+ CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32C8,
+ CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32C7,
+ CMSG_GARRISON_RESEARCH_TALENT = 0x32BB,
+ CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32A3,
+ CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32B3,
+ CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32AF,
+ CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32B9,
+ CMSG_GARRISON_START_MISSION = 0x32E9,
+ CMSG_GARRISON_SWAP_BUILDINGS = 0x32A7,
CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E6,
CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3091,
- CMSG_GET_GARRISON_INFO = 0x3298,
- CMSG_GET_ITEM_PURCHASE_DATA = 0x3517,
- CMSG_GET_MIRROR_IMAGE_DATA = 0x326E,
+ CMSG_GET_GARRISON_INFO = 0x329C,
+ CMSG_GET_ITEM_PURCHASE_DATA = 0x351B,
+ CMSG_GET_MIRROR_IMAGE_DATA = 0x3272,
CMSG_GET_PVP_OPTIONS_ENABLED = 0x35ED,
CMSG_GET_REMAINING_GAME_TIME = 0x36F2,
- CMSG_GET_TROPHY_LIST = 0x32CD,
+ CMSG_GET_TROPHY_LIST = 0x32DA,
CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E5,
CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3698,
CMSG_GM_TICKET_GET_CASE_STATUS = 0x3697,
CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3696,
- CMSG_GOSSIP_SELECT_OPTION = 0x348B,
+ CMSG_GOSSIP_SELECT_OPTION = 0x348C,
CMSG_GRANT_LEVEL = 0x34E6,
CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308D,
CMSG_GUILD_ADD_RANK = 0x3064,
CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x305F,
CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x3061,
- CMSG_GUILD_BANK_ACTIVATE = 0x34AF,
- CMSG_GUILD_BANK_BUY_TAB = 0x34B2,
- CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34B4,
+ CMSG_GUILD_BANK_ACTIVATE = 0x34B1,
+ CMSG_GUILD_BANK_BUY_TAB = 0x34B4,
+ CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34B6,
CMSG_GUILD_BANK_LOG_QUERY = 0x3082,
- CMSG_GUILD_BANK_QUERY_TAB = 0x34B1,
+ CMSG_GUILD_BANK_QUERY_TAB = 0x34B3,
CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3083,
CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3086,
- CMSG_GUILD_BANK_SWAP_ITEMS = 0x34B0,
+ CMSG_GUILD_BANK_SWAP_ITEMS = 0x34B2,
CMSG_GUILD_BANK_TEXT_QUERY = 0x3087,
- CMSG_GUILD_BANK_UPDATE_TAB = 0x34B3,
- CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34B5,
+ CMSG_GUILD_BANK_UPDATE_TAB = 0x34B5,
+ CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34B7,
CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x307B,
CMSG_GUILD_CHANGE_NAME_REQUEST = 0x307E,
CMSG_GUILD_DECLINE_INVITATION = 0x3060,
@@ -321,7 +328,7 @@ enum OpcodeClient : uint32
CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x3071,
CMSG_GUILD_GET_RANKS = 0x306D,
CMSG_GUILD_GET_ROSTER = 0x3073,
- CMSG_GUILD_INVITE_BY_NAME = 0x3605,
+ CMSG_GUILD_INVITE_BY_NAME = 0x3604,
CMSG_GUILD_LEAVE = 0x3062,
CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x308C,
CMSG_GUILD_NEWS_UPDATE_STICKY = 0x306E,
@@ -335,77 +342,78 @@ enum OpcodeClient : uint32
CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3088,
CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x306F,
CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3070,
- CMSG_GUILD_SET_GUILD_MASTER = 0x36C9,
+ CMSG_GUILD_SET_GUILD_MASTER = 0x36CA,
CMSG_GUILD_SET_MEMBER_NOTE = 0x3072,
CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3067,
CMSG_GUILD_SHIFT_RANK = 0x3066,
CMSG_GUILD_UPDATE_INFO_TEXT = 0x3075,
CMSG_GUILD_UPDATE_MOTD_TEXT = 0x3074,
- CMSG_HEARTH_AND_RESURRECT = 0x34F6,
+ CMSG_HEARTH_AND_RESURRECT = 0x34F7,
CMSG_IGNORE_TRADE = 0x3159,
CMSG_INITIATE_ROLE_POLL = 0x35D9,
CMSG_INITIATE_TRADE = 0x3156,
- CMSG_INSPECT = 0x3512,
+ CMSG_INSPECT = 0x3516,
CMSG_INSPECT_PVP = 0x36A7,
- CMSG_INSTANCE_LOCK_RESPONSE = 0x34FB,
- CMSG_ITEM_PURCHASE_REFUND = 0x3518,
- CMSG_ITEM_TEXT_QUERY = 0x32EB,
+ CMSG_INSTANCE_LOCK_RESPONSE = 0x34FC,
+ CMSG_ITEM_PURCHASE_REFUND = 0x351C,
+ CMSG_ITEM_TEXT_QUERY = 0x32FA,
CMSG_JOIN_PET_BATTLE_QUEUE = 0x31C8,
CMSG_JOIN_RATED_BATTLEGROUND = 0x3175,
CMSG_KEEP_ALIVE = 0x3685,
- CMSG_KEYBOUND_OVERRIDE = 0x3207,
+ CMSG_KEYBOUND_OVERRIDE = 0x3209,
CMSG_LEARN_PVP_TALENTS = 0x31A4,
CMSG_LEARN_TALENTS = 0x31A3,
CMSG_LEAVE_GROUP = 0x364A,
CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31C9,
- CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360D,
- CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360E,
- CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360F,
- CMSG_LFG_LIST_GET_STATUS = 0x360B,
- CMSG_LFG_LIST_INVITE_APPLICANT = 0x3610,
- CMSG_LFG_LIST_INVITE_RESPONSE = 0x3611,
- CMSG_LFG_LIST_JOIN = 0x3608,
- CMSG_LFG_LIST_LEAVE = 0x360A,
- CMSG_LFG_LIST_SEARCH = 0x360C,
- CMSG_LFG_LIST_UPDATE_REQUEST = 0x3609,
- CMSG_LF_GUILD_ADD_RECRUIT = 0x361C,
- CMSG_LF_GUILD_BROWSE = 0x361E,
+ CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360C,
+ CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360D,
+ CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360E,
+ CMSG_LFG_LIST_GET_STATUS = 0x360A,
+ CMSG_LFG_LIST_INVITE_APPLICANT = 0x360F,
+ CMSG_LFG_LIST_INVITE_RESPONSE = 0x3610,
+ CMSG_LFG_LIST_JOIN = 0x3607,
+ CMSG_LFG_LIST_LEAVE = 0x3609,
+ CMSG_LFG_LIST_SEARCH = 0x360B,
+ CMSG_LFG_LIST_UPDATE_REQUEST = 0x3608,
+ CMSG_LF_GUILD_ADD_RECRUIT = 0x361B,
+ CMSG_LF_GUILD_BROWSE = 0x361D,
CMSG_LF_GUILD_DECLINE_RECRUIT = 0x3078,
CMSG_LF_GUILD_GET_APPLICATIONS = 0x3079,
CMSG_LF_GUILD_GET_GUILD_POST = 0x3076,
CMSG_LF_GUILD_GET_RECRUITS = 0x3077,
CMSG_LF_GUILD_REMOVE_RECRUIT = 0x307A,
- CMSG_LF_GUILD_SET_GUILD_POST = 0x361D,
- CMSG_LIST_INVENTORY = 0x349A,
+ CMSG_LF_GUILD_SET_GUILD_POST = 0x361C,
+ CMSG_LIST_INVENTORY = 0x349C,
CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36C1,
CMSG_LIVE_REGION_CHARACTER_COPY = 0x36C0,
CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36BF,
CMSG_LOADING_SCREEN_NOTIFY = 0x35F6,
- CMSG_LOAD_SELECTED_TROPHY = 0x32CE,
- CMSG_LOGOUT_CANCEL = 0x34C6,
- CMSG_LOGOUT_INSTANT = 0x34C7,
- CMSG_LOGOUT_REQUEST = 0x34C5,
+ CMSG_LOAD_SELECTED_TROPHY = 0x32DB,
+ CMSG_LOGOUT_CANCEL = 0x34C8,
+ CMSG_LOGOUT_INSTANT = 0x34C9,
+ CMSG_LOGOUT_REQUEST = 0x34C7,
CMSG_LOG_DISCONNECT = 0x3768,
CMSG_LOG_STREAMING_ERROR = 0x376C,
- CMSG_LOOT_ITEM = 0x31F3,
- CMSG_LOOT_MONEY = 0x31F2,
- CMSG_LOOT_RELEASE = 0x31F7,
- CMSG_LOOT_ROLL = 0x31F8,
- CMSG_LOOT_UNIT = 0x31F1,
+ CMSG_LOOT_ITEM = 0x31F5,
+ CMSG_LOOT_MONEY = 0x31F4,
+ CMSG_LOOT_RELEASE = 0x31F9,
+ CMSG_LOOT_ROLL = 0x31FA,
+ CMSG_LOOT_UNIT = 0x31F3,
CMSG_LOW_LEVEL_RAID1 = 0x36A5,
- CMSG_LOW_LEVEL_RAID2 = 0x3501,
- CMSG_MAIL_CREATE_TEXT_ITEM = 0x3523,
- CMSG_MAIL_DELETE = 0x3209,
- CMSG_MAIL_GET_LIST = 0x351E,
- CMSG_MAIL_MARK_AS_READ = 0x3522,
+ CMSG_LOW_LEVEL_RAID2 = 0x3502,
+ CMSG_MAIL_CREATE_TEXT_ITEM = 0x3527,
+ CMSG_MAIL_DELETE = 0x320B,
+ CMSG_MAIL_GET_LIST = 0x3522,
+ CMSG_MAIL_MARK_AS_READ = 0x3526,
CMSG_MAIL_RETURN_TO_SENDER = 0x3659,
- CMSG_MAIL_TAKE_ITEM = 0x3520,
- CMSG_MAIL_TAKE_MONEY = 0x351F,
- CMSG_MASTER_LOOT_ITEM = 0x31F4,
+ CMSG_MAIL_TAKE_ITEM = 0x3524,
+ CMSG_MAIL_TAKE_MONEY = 0x3523,
+ CMSG_MASTER_LOOT_ITEM = 0x31F6,
CMSG_MINIMAP_PING = 0x364C,
CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3188,
+ CMSG_MOUNT_CLEAR_FANFARE = 0x312D,
CMSG_MOUNT_SET_FAVORITE = 0x3631,
- CMSG_MOUNT_SPECIAL_ANIM = 0x325A,
+ CMSG_MOUNT_SPECIAL_ANIM = 0x325E,
CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A12,
CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2C,
CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A31,
@@ -469,28 +477,28 @@ enum OpcodeClient : uint32
CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x3A05,
CMSG_MOVE_WATER_WALK_ACK = 0x3A1A,
CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31BE,
- CMSG_NEXT_CINEMATIC_CAMERA = 0x352C,
+ CMSG_NEXT_CINEMATIC_CAMERA = 0x3530,
CMSG_OBJECT_UPDATE_FAILED = 0x317E,
CMSG_OBJECT_UPDATE_RESCUED = 0x317F,
CMSG_OFFER_PETITION = 0x36B6,
- CMSG_OPENING_CINEMATIC = 0x352B,
- CMSG_OPEN_ITEM = 0x32EC,
- CMSG_OPEN_MISSION_NPC = 0x32B7,
- CMSG_OPEN_SHIPMENT_NPC = 0x32BC,
- CMSG_OPEN_TRADESKILL_NPC = 0x32C4,
+ CMSG_OPENING_CINEMATIC = 0x352F,
+ CMSG_OPEN_ITEM = 0x32FB,
+ CMSG_OPEN_MISSION_NPC = 0x32C0,
+ CMSG_OPEN_SHIPMENT_NPC = 0x32C6,
+ CMSG_OPEN_TRADESKILL_NPC = 0x32D1,
CMSG_OPT_OUT_OF_LOOT = 0x34E5,
CMSG_PARTY_INVITE = 0x3600,
CMSG_PARTY_INVITE_RESPONSE = 0x3601,
CMSG_PARTY_UNINVITE = 0x3648,
- CMSG_PETITION_BUY = 0x34B7,
- CMSG_PETITION_RENAME_GUILD = 0x36CA,
- CMSG_PETITION_SHOW_LIST = 0x34B6,
- CMSG_PETITION_SHOW_SIGNATURES = 0x34B8,
- CMSG_PET_ABANDON = 0x3484,
- CMSG_PET_ACTION = 0x3482,
+ CMSG_PETITION_BUY = 0x34B9,
+ CMSG_PETITION_RENAME_GUILD = 0x36CB,
+ CMSG_PETITION_SHOW_LIST = 0x34B8,
+ CMSG_PETITION_SHOW_SIGNATURES = 0x34BA,
+ CMSG_PET_ABANDON = 0x3485,
+ CMSG_PET_ACTION = 0x3483,
CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31CC,
CMSG_PET_BATTLE_INPUT = 0x3641,
- CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3208,
+ CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x320A,
CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31CB,
CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3642,
CMSG_PET_BATTLE_REQUEST_PVP = 0x31C6,
@@ -498,163 +506,163 @@ enum OpcodeClient : uint32
CMSG_PET_BATTLE_REQUEST_WILD = 0x31C4,
CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31CD,
CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31C5,
- CMSG_PET_CANCEL_AURA = 0x3485,
- CMSG_PET_CAST_SPELL = 0x3272,
+ CMSG_PET_CANCEL_AURA = 0x3486,
+ CMSG_PET_CAST_SPELL = 0x3276,
CMSG_PET_RENAME = 0x368B,
- CMSG_PET_SET_ACTION = 0x3481,
- CMSG_PET_SPELL_AUTOCAST = 0x3486,
- CMSG_PET_STOP_ATTACK = 0x3483,
+ CMSG_PET_SET_ACTION = 0x3482,
+ CMSG_PET_SPELL_AUTOCAST = 0x3487,
+ CMSG_PET_STOP_ATTACK = 0x3484,
CMSG_PING = 0x3767,
CMSG_PLAYER_LOGIN = 0x35E9,
CMSG_PROTOCOL_MISMATCH = 0x376D,
- CMSG_PUSH_QUEST_TO_PARTY = 0x3498,
+ CMSG_PUSH_QUEST_TO_PARTY = 0x349A,
CMSG_PVP_LOG_DATA = 0x3179,
- CMSG_PVP_PRESTIGE_RANK_UP = 0x330C,
- CMSG_QUERY_BATTLE_PET_NAME = 0x3250,
+ CMSG_PVP_PRESTIGE_RANK_UP = 0x331F,
+ CMSG_QUERY_BATTLE_PET_NAME = 0x3253,
CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3666,
CMSG_QUERY_CORPSE_TRANSPORT = 0x3667,
CMSG_QUERY_COUNTDOWN_TIMER = 0x31A2,
- CMSG_QUERY_CREATURE = 0x324A,
- CMSG_QUERY_GAME_OBJECT = 0x324B,
- CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3251,
+ CMSG_QUERY_CREATURE = 0x324D,
+ CMSG_QUERY_GAME_OBJECT = 0x324E,
+ CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3254,
CMSG_QUERY_GUILD_INFO = 0x3693,
CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x34F1,
- CMSG_QUERY_NEXT_MAIL_TIME = 0x3521,
- CMSG_QUERY_NPC_TEXT = 0x324C,
- CMSG_QUERY_PAGE_TEXT = 0x324E,
- CMSG_QUERY_PETITION = 0x3252,
- CMSG_QUERY_PET_NAME = 0x324F,
+ CMSG_QUERY_NEXT_MAIL_TIME = 0x3525,
+ CMSG_QUERY_NPC_TEXT = 0x324F,
+ CMSG_QUERY_PAGE_TEXT = 0x3251,
+ CMSG_QUERY_PETITION = 0x3255,
+ CMSG_QUERY_PET_NAME = 0x3252,
CMSG_QUERY_PLAYER_NAME = 0x3691,
CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3172,
- CMSG_QUERY_QUEST_INFO = 0x324D,
+ CMSG_QUERY_QUEST_INFO = 0x3250,
+ CMSG_QUERY_QUEST_REWARDS = 0x3322,
CMSG_QUERY_REALM_NAME = 0x3692,
CMSG_QUERY_SCENARIO_POI = 0x365A,
- CMSG_QUERY_TIME = 0x34C4,
+ CMSG_QUERY_TIME = 0x34C6,
CMSG_QUERY_VOID_STORAGE = 0x319B,
- CMSG_QUEST_CONFIRM_ACCEPT = 0x3497,
- CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3490,
- CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x3493,
- CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3491,
- CMSG_QUEST_GIVER_HELLO = 0x348D,
- CMSG_QUEST_GIVER_QUERY_QUEST = 0x348E,
- CMSG_QUEST_GIVER_REQUEST_REWARD = 0x3494,
- CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3496,
- CMSG_QUEST_GIVER_STATUS_QUERY = 0x3495,
- CMSG_QUEST_LOG_REMOVE_QUEST = 0x3516,
+ CMSG_QUEST_CONFIRM_ACCEPT = 0x3499,
+ CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3491,
+ CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x3495,
+ CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3493,
+ CMSG_QUEST_GIVER_HELLO = 0x348E,
+ CMSG_QUEST_GIVER_INGORE_QUEST = 0x3492,
+ CMSG_QUEST_GIVER_QUERY_QUEST = 0x348F,
+ CMSG_QUEST_GIVER_REQUEST_REWARD = 0x3496,
+ CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3498,
+ CMSG_QUEST_GIVER_STATUS_QUERY = 0x3497,
+ CMSG_QUEST_LOG_REMOVE_QUEST = 0x351A,
CMSG_QUEST_POI_QUERY = 0x36B7,
- CMSG_QUEST_PUSH_RESULT = 0x3499,
+ CMSG_QUEST_PUSH_RESULT = 0x349B,
CMSG_QUEUED_MESSAGES_END = 0x376B,
CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36EA,
CMSG_RANDOM_ROLL = 0x3655,
CMSG_READY_CHECK_RESPONSE = 0x3635,
- CMSG_READ_ITEM = 0x32ED,
- CMSG_RECLAIM_CORPSE = 0x34C9,
- CMSG_RECRUIT_A_FRIEND = 0x36D0,
+ CMSG_READ_ITEM = 0x32FC,
+ CMSG_RECLAIM_CORPSE = 0x34CB,
+ CMSG_RECRUIT_A_FRIEND = 0x36D1,
CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F4,
CMSG_REDEEM_WOW_TOKEN_START = 0x36F3,
CMSG_REORDER_CHARACTERS = 0x35E8,
- CMSG_REPAIR_ITEM = 0x34D9,
- CMSG_REPLACE_TROPHY = 0x32CF,
- CMSG_REPOP_REQUEST = 0x350F,
+ CMSG_REPAIR_ITEM = 0x34DB,
+ CMSG_REPLACE_TROPHY = 0x32DC,
+ CMSG_REPOP_REQUEST = 0x3513,
CMSG_REPORT_PVP_PLAYER_AFK = 0x34E3,
CMSG_REQUEST_ACCOUNT_DATA = 0x369B,
CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DB,
CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317B,
CMSG_REQUEST_CEMETERY_LIST = 0x3173,
- CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x3288,
- CMSG_REQUEST_FORCED_REACTIONS = 0x31EE,
+ CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x328C,
+ CMSG_REQUEST_FORCED_REACTIONS = 0x31EF,
CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A1,
CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A0,
CMSG_REQUEST_HONOR_STATS = 0x3178,
- CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x3279,
+ CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x327D,
CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F5,
CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3654,
- CMSG_REQUEST_PET_INFO = 0x3487,
- CMSG_REQUEST_PLAYED_TIME = 0x3255,
+ CMSG_REQUEST_PET_INFO = 0x3488,
+ CMSG_REQUEST_PLAYED_TIME = 0x3258,
CMSG_REQUEST_PVP_REWARDS = 0x318F,
- CMSG_REQUEST_RAID_INFO = 0x36CB,
+ CMSG_REQUEST_RAID_INFO = 0x36CC,
CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E3,
CMSG_REQUEST_RESEARCH_HISTORY = 0x3167,
- CMSG_REQUEST_STABLED_PETS = 0x3488,
- CMSG_REQUEST_VEHICLE_EXIT = 0x3218,
- CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321A,
- CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3219,
- CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321B,
+ CMSG_REQUEST_STABLED_PETS = 0x3489,
+ CMSG_REQUEST_VEHICLE_EXIT = 0x321B,
+ CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321D,
+ CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x321C,
+ CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321E,
CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EC,
CMSG_RESET_CHALLENGE_MODE = 0x31EC,
CMSG_RESET_INSTANCES = 0x366E,
CMSG_RESURRECT_RESPONSE = 0x368A,
- CMSG_REVERT_MONUMENT_APPEARANCE = 0x32D1,
- CMSG_RIDE_VEHICLE_INTERACT = 0x321C,
+ CMSG_REVERT_MONUMENT_APPEARANCE = 0x32DE,
+ CMSG_RIDE_VEHICLE_INTERACT = 0x321F,
CMSG_SAVE_CUF_PROFILES = 0x3189,
- CMSG_SAVE_EQUIPMENT_SET = 0x34F9,
- CMSG_SAVE_GUILD_EMBLEM = 0x327D,
- CMSG_SCENE_PLAYBACK_CANCELED = 0x3204,
- CMSG_SCENE_PLAYBACK_COMPLETE = 0x3203,
- CMSG_SCENE_TRIGGER_EVENT = 0x3205,
- CMSG_SELF_RES = 0x3519,
- CMSG_SELL_ITEM = 0x349B,
+ CMSG_SAVE_EQUIPMENT_SET = 0x34FA,
+ CMSG_SAVE_GUILD_EMBLEM = 0x3281,
+ CMSG_SCENE_PLAYBACK_CANCELED = 0x3206,
+ CMSG_SCENE_PLAYBACK_COMPLETE = 0x3205,
+ CMSG_SCENE_TRIGGER_EVENT = 0x3207,
+ CMSG_SELF_RES = 0x351D,
+ CMSG_SELL_ITEM = 0x349D,
CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36EE,
CMSG_SELL_WOW_TOKEN_START = 0x36ED,
- CMSG_SEND_CONTACT_LIST = 0x36D3,
+ CMSG_SEND_CONTACT_LIST = 0x36D4,
CMSG_SEND_MAIL = 0x35F8,
- CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3621,
- CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0x3622,
- CMSG_SEND_TEXT_EMOTE = 0x347E,
- CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x320A,
- CMSG_SET_ACTION_BAR_TOGGLES = 0x351A,
+ CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3620,
+ CMSG_SEND_TEXT_EMOTE = 0x347F,
+ CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x320C,
+ CMSG_SET_ACTION_BAR_TOGGLES = 0x351E,
CMSG_SET_ACTION_BUTTON = 0x3636,
CMSG_SET_ACTIVE_MOVER = 0x3A37,
CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3656,
- CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x3289,
+ CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x328D,
CMSG_SET_ASSISTANT_LEADER = 0x3650,
- CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x32F0,
- CMSG_SET_BANK_AUTOSORT_DISABLED = 0x32F1,
- CMSG_SET_BANK_BAG_SLOT_FLAG = 0x32EF,
- CMSG_SET_CONTACT_NOTES = 0x36D6,
+ CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x32FF,
+ CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3300,
+ CMSG_SET_BANK_BAG_SLOT_FLAG = 0x32FE,
+ CMSG_SET_CONTACT_NOTES = 0x36D7,
CMSG_SET_CURRENCY_FLAGS = 0x3169,
- CMSG_SET_DIFFICULTY_ID = 0x3206,
+ CMSG_SET_DIFFICULTY_ID = 0x3208,
CMSG_SET_DUNGEON_DIFFICULTY = 0x3688,
- CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3618,
- CMSG_SET_FACTION_AT_WAR = 0x34CC,
- CMSG_SET_FACTION_INACTIVE = 0x34CE,
- CMSG_SET_FACTION_NOT_AT_WAR = 0x34CD,
- CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x32F3,
- CMSG_SET_LFG_BONUS_FACTION_ID = 0x3278,
+ CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3617,
+ CMSG_SET_FACTION_AT_WAR = 0x34CE,
+ CMSG_SET_FACTION_INACTIVE = 0x34D0,
+ CMSG_SET_FACTION_NOT_AT_WAR = 0x34CF,
+ CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3302,
+ CMSG_SET_LFG_BONUS_FACTION_ID = 0x327C,
CMSG_SET_LOOT_METHOD = 0x3649,
- CMSG_SET_LOOT_SPECIALIZATION = 0x3527,
+ CMSG_SET_LOOT_SPECIALIZATION = 0x352B,
CMSG_SET_PARTY_ASSIGNMENT = 0x3652,
CMSG_SET_PARTY_LEADER = 0x364B,
CMSG_SET_PET_SLOT = 0x3168,
CMSG_SET_PLAYER_DECLINED_NAMES = 0x3690,
CMSG_SET_PREFERRED_CEMETERY = 0x3174,
- CMSG_SET_PVP = 0x3281,
+ CMSG_SET_PVP = 0x3285,
CMSG_SET_RAID_DIFFICULTY = 0x36E1,
CMSG_SET_ROLE = 0x35D8,
CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368E,
- CMSG_SET_SELECTION = 0x3511,
- CMSG_SET_SHEATHED = 0x347F,
- CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x32F2,
+ CMSG_SET_SELECTION = 0x3515,
+ CMSG_SET_SHEATHED = 0x3480,
+ CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3301,
CMSG_SET_TAXI_BENCHMARK_MODE = 0x34E2,
- CMSG_SET_TITLE = 0x3258,
+ CMSG_SET_TITLE = 0x325C,
CMSG_SET_TRADE_CURRENCY = 0x3160,
CMSG_SET_TRADE_GOLD = 0x315F,
CMSG_SET_TRADE_ITEM = 0x315D,
- CMSG_SET_USING_PARTY_GARRISON = 0x32B8,
- CMSG_SET_WATCHED_FACTION = 0x34CF,
- CMSG_SHOWING_CLOAK = 0x34DB,
- CMSG_SHOWING_HELM = 0x34DA,
+ CMSG_SET_USING_PARTY_GARRISON = 0x32C2,
+ CMSG_SET_WATCHED_FACTION = 0x34D1,
CMSG_SHOW_TRADE_SKILL = 0x36C6,
- CMSG_SIGN_PETITION = 0x351B,
+ CMSG_SIGN_PETITION = 0x351F,
CMSG_SILENCE_PARTY_TALKER = 0x3653,
- CMSG_SOCKET_GEMS = 0x34D8,
- CMSG_SORT_BAGS = 0x32F4,
- CMSG_SORT_BANK_BAGS = 0x32F5,
- CMSG_SORT_REAGENT_BANK_BAGS = 0x32F6,
- CMSG_SPELL_CLICK = 0x348C,
- CMSG_SPIRIT_HEALER_ACTIVATE = 0x34A8,
+ CMSG_SOCKET_GEMS = 0x34DA,
+ CMSG_SORT_BAGS = 0x3303,
+ CMSG_SORT_BANK_BAGS = 0x3304,
+ CMSG_SORT_REAGENT_BANK_BAGS = 0x3305,
+ CMSG_SPELL_CLICK = 0x348D,
+ CMSG_SPIRIT_HEALER_ACTIVATE = 0x34AA,
CMSG_SPLIT_ITEM = 0x399E,
CMSG_STAND_STATE_CHANGE = 0x3187,
+ CMSG_START_CHALLENGE_MODE = 0x3536,
CMSG_START_SPECTATOR_WAR_GAME = 0x35DE,
CMSG_START_WAR_GAME = 0x35DD,
CMSG_SUMMON_RESPONSE = 0x3670,
@@ -667,11 +675,11 @@ enum OpcodeClient : uint32
CMSG_SWAP_ITEM = 0x399C,
CMSG_SWAP_SUB_GROUPS = 0x364E,
CMSG_SWAP_VOID_ITEM = 0x319D,
- CMSG_TABARD_VENDOR_ACTIVATE = 0x327E,
- CMSG_TALK_TO_GOSSIP = 0x3489,
- CMSG_TAXI_NODE_STATUS_QUERY = 0x34A1,
- CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34A3,
- CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34A5,
+ CMSG_TABARD_VENDOR_ACTIVATE = 0x3282,
+ CMSG_TALK_TO_GOSSIP = 0x348A,
+ CMSG_TAXI_NODE_STATUS_QUERY = 0x34A3,
+ CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34A5,
+ CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34A7,
CMSG_TELEPORT_TO_GUID = 0x39F5,
CMSG_TELEPORT_TO_UNIT = 0x3669,
CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A3B,
@@ -679,40 +687,40 @@ enum OpcodeClient : uint32
CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3A,
CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A39,
CMSG_TOGGLE_DIFFICULTY = 0x365B,
- CMSG_TOGGLE_PVP = 0x3280,
+ CMSG_TOGGLE_PVP = 0x3284,
CMSG_TOTEM_DESTROYED = 0x34E9,
CMSG_TOY_SET_FAVORITE = 0x3632,
- CMSG_TRADE_SKILL_SET_FAVORITE = 0x330E,
- CMSG_TRAINER_BUY_SPELL = 0x34A7,
- CMSG_TRAINER_LIST = 0x34A6,
+ CMSG_TRADE_SKILL_SET_FAVORITE = 0x3321,
+ CMSG_TRAINER_BUY_SPELL = 0x34A9,
+ CMSG_TRAINER_LIST = 0x34A8,
CMSG_TRANSMOGRIFY_ITEMS = 0x3190,
CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE = 0x3633,
- CMSG_TURN_IN_PETITION = 0x351D,
+ CMSG_TURN_IN_PETITION = 0x3521,
CMSG_TUTORIAL = 0x36E2,
CMSG_TWITTER_CHECK_STATUS = 0x312A,
CMSG_TWITTER_CONNECT = 0x3127,
CMSG_TWITTER_DISCONNECT = 0x312B,
- CMSG_TWITTER_POST = 0x32F8,
+ CMSG_TWITTER_POST = 0x3307,
CMSG_UI_TIME_REQUEST = 0x36A0,
CMSG_UNACCEPT_TRADE = 0x315B,
CMSG_UNDELETE_CHARACTER = 0x36E4,
- CMSG_UNLEARN_SKILL = 0x34D2,
+ CMSG_UNLEARN_SKILL = 0x34D4,
CMSG_UNLEARN_SPECIALIZATION = 0x319E,
CMSG_UNLOCK_VOID_STORAGE = 0x319A,
CMSG_UPDATE_ACCOUNT_DATA = 0x369C,
CMSG_UPDATE_CLIENT_SETTINGS = 0x366A,
CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3E,
CMSG_UPDATE_RAID_TARGET = 0x3651,
- CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F9,
+ CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36FA,
CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F5,
CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36EB,
- CMSG_UPGRADE_GARRISON = 0x3291,
- CMSG_UPGRADE_ITEM = 0x320B,
+ CMSG_UPGRADE_GARRISON = 0x3295,
+ CMSG_UPGRADE_ITEM = 0x320D,
CMSG_USED_FOLLOW = 0x3184,
- CMSG_USE_CRITTER_ITEM = 0x3223,
+ CMSG_USE_CRITTER_ITEM = 0x3226,
CMSG_USE_EQUIPMENT_SET = 0x3995,
- CMSG_USE_ITEM = 0x326F,
- CMSG_USE_TOY = 0x3271,
+ CMSG_USE_ITEM = 0x3273,
+ CMSG_USE_TOY = 0x3275,
CMSG_VIOLENCE_LEVEL = 0x3182,
CMSG_VOICE_ADD_IGNORE = 0x3657,
CMSG_VOICE_DEL_IGNORE = 0x3658,
@@ -733,93 +741,96 @@ enum OpcodeClient : uint32
enum OpcodeServer : uint32
{
- SMSG_ABORT_NEW_WORLD = 0x25AC,
+ SMSG_ABORT_NEW_WORLD = 0x25AB,
SMSG_ACCOUNT_CRITERIA_UPDATE = 0x264F,
- SMSG_ACCOUNT_DATA_TIMES = 0x2746,
- SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C2,
- SMSG_ACCOUNT_TOYS_UPDATE = 0x25C3,
- SMSG_ACHIEVEMENT_DELETED = 0x271C,
+ SMSG_ACCOUNT_DATA_TIMES = 0x2745,
+ SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C1,
+ SMSG_ACCOUNT_TOYS_UPDATE = 0x25C2,
+ SMSG_ACHIEVEMENT_DELETED = 0x271B,
SMSG_ACHIEVEMENT_EARNED = 0x265D,
SMSG_ACTIVATE_TAXI_REPLY = 0x26A3,
- SMSG_ADDON_INFO = 0x277A,
SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2657,
- SMSG_ADD_ITEM_PASSIVE = 0x25BE,
+ SMSG_ADD_ITEM_PASSIVE = 0x25BD,
SMSG_ADD_LOSS_OF_CONTROL = 0x2693,
SMSG_ADD_RUNE_POWER = 0x26E0,
- SMSG_ADJUST_SPLINE_DURATION = 0x25E6,
+ SMSG_ADJUST_SPLINE_DURATION = 0x25E5,
SMSG_AE_LOOT_TARGETS = 0x262A,
SMSG_AE_LOOT_TARGET_ACK = 0x262B,
SMSG_AI_REACTION = 0x26DD,
- SMSG_ALL_ACCOUNT_CRITERIA = 0x2571,
- SMSG_ALL_ACHIEVEMENT_DATA = 0x2570,
+ SMSG_ALL_ACCOUNT_CRITERIA = 0x2570,
+ SMSG_ALL_ACHIEVEMENT_DATA = 0x256F,
SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8,
- SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2587,
+ SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2586,
SMSG_AREA_SPIRIT_HEALER_TIME = 0x277F,
SMSG_AREA_TRIGGER_DENIED = 0x269A,
- SMSG_AREA_TRIGGER_NO_CORPSE = 0x2752,
+ SMSG_AREA_TRIGGER_NO_CORPSE = 0x2751,
SMSG_AREA_TRIGGER_RE_PATH = 0x263D,
SMSG_AREA_TRIGGER_RE_SHAPE = 0x263B,
- SMSG_ARENA_ERROR = 0x270F,
+ SMSG_ARENA_ERROR = 0x270E,
SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2662,
- SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27DC,
- SMSG_ARTIFACT_FORGE_OPENED = 0x27DA,
- SMSG_ARTIFACT_POWERS_UPDATED = 0x27DB,
- SMSG_ARTIFACT_XP_GAIN = 0x2819,
- SMSG_ATTACKER_STATE_UPDATE = 0x27C7,
+ SMSG_ARTIFACT_APPEARANCE_CHANGED = 0x27DF,
+ SMSG_ARTIFACT_FORGE_OPENED = 0x27DD,
+ SMSG_ARTIFACT_POWERS_UPDATED = 0x27DE,
+ SMSG_ARTIFACT_XP_GAIN = 0x281D,
+ SMSG_ATTACKER_STATE_UPDATE = 0x27CA,
SMSG_ATTACK_START = 0x266A,
SMSG_ATTACK_STOP = 0x266B,
- SMSG_ATTACK_SWING_ERROR = 0x2731,
- SMSG_ATTACK_SWING_LANDED_LOG = 0x2732,
- SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2726,
- SMSG_AUCTION_COMMAND_RESULT = 0x2723,
- SMSG_AUCTION_HELLO_RESPONSE = 0x2721,
- SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x272A,
- SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2728,
- SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x2729,
- SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x272B,
- SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2725,
- SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2727,
- SMSG_AUCTION_REPLICATE_RESPONSE = 0x2722,
- SMSG_AUCTION_WON_NOTIFICATION = 0x2724,
+ SMSG_ATTACK_SWING_ERROR = 0x2730,
+ SMSG_ATTACK_SWING_LANDED_LOG = 0x2731,
+ SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2725,
+ SMSG_AUCTION_COMMAND_RESULT = 0x2722,
+ SMSG_AUCTION_HELLO_RESPONSE = 0x2720,
+ SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x2729,
+ SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2727,
+ SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x2728,
+ SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x272A,
+ SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2724,
+ SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2726,
+ SMSG_AUCTION_REPLICATE_RESPONSE = 0x2721,
+ SMSG_AUCTION_WON_NOTIFICATION = 0x2723,
SMSG_AURA_POINTS_DEPLETED = 0x2C22,
SMSG_AURA_UPDATE = 0x2C21,
SMSG_AUTH_CHALLENGE = 0x3048,
- SMSG_AUTH_RESPONSE = 0x256D,
+ SMSG_AUTH_RESPONSE = 0x256C,
SMSG_AVAILABLE_VOICE_CHANNEL = 0x2BB2,
- SMSG_BAN_REASON = 0x281C,
- SMSG_BARBER_SHOP_RESULT = 0x26E7,
- SMSG_BATTLEFIELD_LIST = 0x2595,
- SMSG_BATTLEFIELD_PORT_DENIED = 0x259B,
- SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2591,
- SMSG_BATTLEFIELD_STATUS_FAILED = 0x2594,
- SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x2590,
- SMSG_BATTLEFIELD_STATUS_NONE = 0x2593,
- SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2592,
- SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A4,
- SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259C,
- SMSG_BATTLEGROUND_INIT = 0x279C,
- SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2599,
- SMSG_BATTLEGROUND_PLAYER_LEFT = 0x259A,
- SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2596,
- SMSG_BATTLEGROUND_POINTS = 0x279B,
- SMSG_BATTLENET_CHALLENGE_ABORT = 0x27C6,
- SMSG_BATTLENET_CHALLENGE_START = 0x27C5,
- SMSG_BATTLE_PAY_ACK_FAILED = 0x27BE,
- SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27BD,
- SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B4,
- SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B3,
- SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B2,
- SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B0,
- SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27AE,
- SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27AF,
- SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27BC,
- SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27BA,
- SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27B9,
- SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B1,
- SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x281D,
- SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x281F,
- SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2820,
- SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x281E,
+ SMSG_BAN_REASON = 0x26AF,
+ SMSG_BARBER_SHOP_RESULT = 0x26E6,
+ SMSG_BATTLEFIELD_LIST = 0x2594,
+ SMSG_BATTLEFIELD_PORT_DENIED = 0x259A,
+ SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2590,
+ SMSG_BATTLEFIELD_STATUS_FAILED = 0x2593,
+ SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x258F,
+ SMSG_BATTLEFIELD_STATUS_NONE = 0x2592,
+ SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2591,
+ SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A3,
+ SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259B,
+ SMSG_BATTLEGROUND_INIT = 0x279D,
+ SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2598,
+ SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2599,
+ SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2595,
+ SMSG_BATTLEGROUND_POINTS = 0x279C,
+ SMSG_BATTLENET_CHALLENGE_ABORT = 0x27C9,
+ SMSG_BATTLENET_CHALLENGE_START = 0x27C8,
+ SMSG_BATTLENET_NOTIFICATION = 0x2831,
+ SMSG_BATTLENET_REALM_LIST_TICKET = 0x2833,
+ SMSG_BATTLENET_RESPONSE = 0x2830,
+ SMSG_BATTLENET_SET_SESSION_STATE = 0x2832,
+ SMSG_BATTLE_PAY_ACK_FAILED = 0x27C1,
+ SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27C0,
+ SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B7,
+ SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B6,
+ SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B5,
+ SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B3,
+ SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B1,
+ SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B2,
+ SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27BF,
+ SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27BD,
+ SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27BC,
+ SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B4,
+ SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2821,
+ SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x2824,
+ SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2825,
+ SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2823,
SMSG_BATTLE_PETS_HEALED = 0x2608,
SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x269D,
SMSG_BATTLE_PET_DELETED = 0x2605,
@@ -828,23 +839,24 @@ enum OpcodeServer : uint32
SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2602,
SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2603,
SMSG_BATTLE_PET_LICENSE_CHANGED = 0x2609,
+ SMSG_BATTLE_PET_MAX_COUNT_CHANGED = 0x2600,
SMSG_BATTLE_PET_RESTORED = 0x2607,
SMSG_BATTLE_PET_REVOKED = 0x2606,
- SMSG_BATTLE_PET_TRAP_LEVEL = 0x2600,
- SMSG_BATTLE_PET_UPDATES = 0x25FF,
- SMSG_BINDER_CONFIRM = 0x2737,
- SMSG_BIND_POINT_UPDATE = 0x257D,
+ SMSG_BATTLE_PET_TRAP_LEVEL = 0x25FF,
+ SMSG_BATTLE_PET_UPDATES = 0x25FE,
+ SMSG_BINDER_CONFIRM = 0x2736,
+ SMSG_BIND_POINT_UPDATE = 0x257C,
SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2642,
SMSG_BLACK_MARKET_OPEN_RESULT = 0x2640,
SMSG_BLACK_MARKET_OUTBID = 0x2643,
SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2641,
SMSG_BLACK_MARKET_WON = 0x2644,
SMSG_BONUS_ROLL_EMPTY = 0x265F,
- SMSG_BOSS_KILL_CREDIT = 0x27B8,
+ SMSG_BOSS_KILL_CREDIT = 0x27BB,
SMSG_BREAK_TARGET = 0x2669,
- SMSG_BUY_FAILED = 0x26F0,
- SMSG_BUY_SUCCEEDED = 0x26EF,
- SMSG_CACHE_VERSION = 0x2740,
+ SMSG_BUY_FAILED = 0x26EF,
+ SMSG_BUY_SUCCEEDED = 0x26EE,
+ SMSG_CACHE_VERSION = 0x273F,
SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26C3,
SMSG_CALENDAR_COMMAND_RESULT = 0x26C4,
SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26B3,
@@ -867,8 +879,8 @@ enum OpcodeServer : uint32
SMSG_CALENDAR_SEND_NUM_PENDING = 0x26C2,
SMSG_CAMERA_EFFECT = 0x2763,
SMSG_CAMERA_SHAKE = 0x2764,
- SMSG_CANCEL_AUTO_REPEAT = 0x2710,
- SMSG_CANCEL_COMBAT = 0x272F,
+ SMSG_CANCEL_AUTO_REPEAT = 0x270F,
+ SMSG_CANCEL_COMBAT = 0x272E,
SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C45,
SMSG_CANCEL_SCENE = 0x2651,
SMSG_CANCEL_SPELL_VISUAL = 0x2C43,
@@ -884,21 +896,21 @@ enum OpcodeServer : uint32
SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2622,
SMSG_CHALLENGE_MODE_RESET = 0x261D,
SMSG_CHALLENGE_MODE_START = 0x261C,
- SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2733,
+ SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2732,
SMSG_CHANNEL_LIST = 0x2BC8,
SMSG_CHANNEL_NOTIFY = 0x2BC5,
SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC6,
SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC7,
- SMSG_CHARACTER_LOGIN_FAILED = 0x2741,
- SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27C4,
- SMSG_CHARACTER_RENAME_RESULT = 0x27A2,
- SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27F3,
- SMSG_CHARACTER_UPGRADE_QUEUED = 0x27F2,
- SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F4,
- SMSG_CHARACTER_UPGRADE_STARTED = 0x27F1,
- SMSG_CHAR_CUSTOMIZE = 0x2717,
- SMSG_CHAR_CUSTOMIZE_FAILED = 0x2716,
- SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E0,
+ SMSG_CHARACTER_LOGIN_FAILED = 0x2740,
+ SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27C7,
+ SMSG_CHARACTER_RENAME_RESULT = 0x27A3,
+ SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27F7,
+ SMSG_CHARACTER_UPGRADE_QUEUED = 0x27F6,
+ SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F3,
+ SMSG_CHARACTER_UPGRADE_STARTED = 0x27F5,
+ SMSG_CHAR_CUSTOMIZE = 0x2716,
+ SMSG_CHAR_CUSTOMIZE_FAILED = 0x2715,
+ SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27E4,
SMSG_CHAT = 0x2BAD,
SMSG_CHAT_AUTO_RESPONDED = 0x2BBD,
SMSG_CHAT_DOWN = 0x2BC2,
@@ -911,57 +923,57 @@ enum OpcodeServer : uint32
SMSG_CHAT_RESTRICTED = 0x2BB8,
SMSG_CHAT_SERVER_MESSAGE = 0x2BC9,
SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x2C12,
- SMSG_CHECK_WARGAME_ENTRY = 0x259F,
+ SMSG_CHECK_WARGAME_ENTRY = 0x259E,
SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C26,
- SMSG_CLEAR_BOSS_EMOTES = 0x25CC,
- SMSG_CLEAR_COOLDOWN = 0x26E3,
+ SMSG_CLEAR_BOSS_EMOTES = 0x25CA,
+ SMSG_CLEAR_COOLDOWN = 0x26E2,
SMSG_CLEAR_COOLDOWNS = 0x2C25,
SMSG_CLEAR_LOSS_OF_CONTROL = 0x2695,
SMSG_CLEAR_SPELL_CHARGES = 0x2C27,
SMSG_CLEAR_TARGET = 0x26D9,
SMSG_COIN_REMOVED = 0x2629,
SMSG_COMBAT_EVENT_FAILED = 0x266C,
- SMSG_COMMENTATOR_MAP_INFO = 0x2743,
- SMSG_COMMENTATOR_PLAYER_INFO = 0x2744,
- SMSG_COMMENTATOR_STATE_CHANGED = 0x2742,
+ SMSG_COMMENTATOR_MAP_INFO = 0x2742,
+ SMSG_COMMENTATOR_PLAYER_INFO = 0x2743,
+ SMSG_COMMENTATOR_STATE_CHANGED = 0x2741,
SMSG_COMPLAINT_RESULT = 0x26D1,
- SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27D6,
+ SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27D9,
SMSG_CONNECT_TO = 0x304C,
- SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27BF,
+ SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C2,
SMSG_CONSOLE_WRITE = 0x264E,
- SMSG_CONTACT_LIST = 0x27C2,
+ SMSG_CONTACT_LIST = 0x27C5,
SMSG_CONTROL_UPDATE = 0x2661,
- SMSG_COOLDOWN_CHEAT = 0x2777,
- SMSG_COOLDOWN_EVENT = 0x26E2,
+ SMSG_COOLDOWN_CHEAT = 0x2778,
+ SMSG_COOLDOWN_EVENT = 0x26E1,
SMSG_CORPSE_LOCATION = 0x2668,
- SMSG_CORPSE_RECLAIM_DELAY = 0x278A,
- SMSG_CORPSE_TRANSPORT_QUERY = 0x274E,
- SMSG_CREATE_CHAR = 0x273C,
- SMSG_CREATE_SHIPMENT_RESPONSE = 0x27D5,
- SMSG_CRITERIA_DELETED = 0x271B,
- SMSG_CRITERIA_UPDATE = 0x2715,
- SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26EB,
- SMSG_CUSTOM_LOAD_SCREEN = 0x25E2,
+ SMSG_CORPSE_RECLAIM_DELAY = 0x278B,
+ SMSG_CORPSE_TRANSPORT_QUERY = 0x274D,
+ SMSG_CREATE_CHAR = 0x273B,
+ SMSG_CREATE_SHIPMENT_RESPONSE = 0x27D8,
+ SMSG_CRITERIA_DELETED = 0x271A,
+ SMSG_CRITERIA_UPDATE = 0x2714,
+ SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26EA,
+ SMSG_CUSTOM_LOAD_SCREEN = 0x25E0,
SMSG_DAILY_QUESTS_RESET = 0x2A80,
- SMSG_DAMAGE_CALC_LOG = 0x27FA,
- SMSG_DANCE_STUDIO_CREATE_RESULT = 0x279F,
- SMSG_DB_REPLY = 0x25A1,
- SMSG_DEATH_RELEASE_LOC = 0x2703,
+ SMSG_DAMAGE_CALC_LOG = 0x27FE,
+ SMSG_DANCE_STUDIO_CREATE_RESULT = 0x27A0,
+ SMSG_DB_REPLY = 0x25A0,
+ SMSG_DEATH_RELEASE_LOC = 0x2702,
SMSG_DEFENSE_MESSAGE = 0x2BBB,
- SMSG_DELETE_CHAR = 0x273D,
+ SMSG_DELETE_CHAR = 0x273C,
SMSG_DESTROY_ARENA_UNIT = 0x2781,
- SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x2730,
- SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258B,
- SMSG_DISENCHANT_CREDIT = 0x25BB,
+ SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x272F,
+ SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258A,
+ SMSG_DISENCHANT_CREDIT = 0x25BA,
SMSG_DISMOUNT = 0x26D8,
- SMSG_DISMOUNT_RESULT = 0x257C,
+ SMSG_DISMOUNT_RESULT = 0x257B,
SMSG_DISPEL_FAILED = 0x2C2F,
- SMSG_DISPLAY_GAME_ERROR = 0x25B4,
+ SMSG_DISPLAY_GAME_ERROR = 0x25B3,
SMSG_DISPLAY_PLAYER_CHOICE = 0x269E,
SMSG_DISPLAY_PROMOTION = 0x2665,
SMSG_DISPLAY_QUEST_POPUP = 0x2A9B,
SMSG_DISPLAY_TOAST = 0x2637,
- SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F6,
+ SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F5,
SMSG_DROP_NEW_CONNECTION = 0x304B,
SMSG_DUEL_COMPLETE = 0x2671,
SMSG_DUEL_COUNTDOWN = 0x2670,
@@ -969,238 +981,242 @@ enum OpcodeServer : uint32
SMSG_DUEL_OUT_OF_BOUNDS = 0x266E,
SMSG_DUEL_REQUESTED = 0x266D,
SMSG_DUEL_WINNER = 0x2672,
- SMSG_DURABILITY_DAMAGE_DEATH = 0x2786,
- SMSG_EMOTE = 0x27FB,
- SMSG_ENABLE_BARBER_SHOP = 0x26E6,
- SMSG_ENCHANTMENT_LOG = 0x274F,
- SMSG_ENCOUNTER_END = 0x27B7,
- SMSG_ENCOUNTER_START = 0x27B6,
- SMSG_ENUM_CHARACTERS_RESULT = 0x2583,
+ SMSG_DURABILITY_DAMAGE_DEATH = 0x2787,
+ SMSG_EMOTE = 0x27FF,
+ SMSG_ENABLE_BARBER_SHOP = 0x26E5,
+ SMSG_ENCHANTMENT_LOG = 0x274E,
+ SMSG_ENCOUNTER_END = 0x27BA,
+ SMSG_ENCOUNTER_START = 0x27B9,
+ SMSG_ENUM_CHARACTERS_RESULT = 0x2582,
SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C20,
SMSG_EQUIPMENT_SET_ID = 0x26DA,
SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1,
- SMSG_EXPLORATION_EXPERIENCE = 0x279E,
+ SMSG_EXPLORATION_EXPERIENCE = 0x279F,
SMSG_FACTION_BONUS_INFO = 0x2762,
- SMSG_FAILED_PLAYER_CONDITION = 0x25E1,
- SMSG_FEATURE_SYSTEM_STATUS = 0x25D1,
- SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D2,
- SMSG_FEIGN_DEATH_RESISTED = 0x2783,
- SMSG_FISH_ESCAPED = 0x26F8,
- SMSG_FISH_NOT_HOOKED = 0x26F7,
+ SMSG_FAILED_PLAYER_CONDITION = 0x25DF,
+ SMSG_FEATURE_SYSTEM_STATUS = 0x25CF,
+ SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D0,
+ SMSG_FEIGN_DEATH_RESISTED = 0x2784,
+ SMSG_FISH_ESCAPED = 0x26F7,
+ SMSG_FISH_NOT_HOOKED = 0x26F6,
SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7,
- SMSG_FORCED_DEATH_UPDATE = 0x2704,
- SMSG_FORCE_ANIM = 0x2790,
+ SMSG_FORCED_DEATH_UPDATE = 0x2703,
+ SMSG_FORCE_ANIM = 0x2791,
SMSG_FORCE_OBJECT_RELINK = 0x2664,
- SMSG_FRIEND_STATUS = 0x27C3,
- SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D5,
- SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D6,
- SMSG_GAME_OBJECT_DESPAWN = 0x25D7,
+ SMSG_FRIEND_STATUS = 0x27C6,
+ SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D3,
+ SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D4,
+ SMSG_GAME_OBJECT_DESPAWN = 0x25D5,
SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4A,
SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C49,
SMSG_GAME_OBJECT_RESET_STATE = 0x2759,
+ SMSG_GAME_OBJECT_SET_STATE = 0x282F,
SMSG_GAME_OBJECT_UI_ACTION = 0x2756,
SMSG_GAME_SPEED_SET = 0x26A7,
- SMSG_GAME_TIME_SET = 0x2748,
- SMSG_GAME_TIME_UPDATE = 0x2747,
- SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x28FE,
- SMSG_GARRISON_ADD_MISSION_RESULT = 0x2901,
- SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2912,
+ SMSG_GAME_TIME_SET = 0x2747,
+ SMSG_GAME_TIME_UPDATE = 0x2746,
+ SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2902,
+ SMSG_GARRISON_ADD_MISSION_RESULT = 0x2906,
+ SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2918,
SMSG_GARRISON_BUILDING_ACTIVATED = 0x28FB,
- SMSG_GARRISON_BUILDING_LANDMARKS = 0x2925,
+ SMSG_GARRISON_BUILDING_LANDMARKS = 0x292C,
SMSG_GARRISON_BUILDING_REMOVED = 0x28F4,
SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x28F6,
- SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x2910,
- SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2903,
+ SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x2916,
+ SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2909,
SMSG_GARRISON_CREATE_RESULT = 0x28FC,
- SMSG_GARRISON_DELETE_RESULT = 0x2919,
- SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x290E,
- SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x290D,
- SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x290F,
- SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x290C,
- SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2922,
- SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27D8,
+ SMSG_GARRISON_DELETE_RESULT = 0x2920,
+ SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x2914,
+ SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x2913,
+ SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x2915,
+ SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x2912,
+ SMSG_GARRISON_FOLLOWER_DURABILITY_CHANGED = 0x2904,
+ SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2929,
+ SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27DB,
SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x28F7,
SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x28F5,
- SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2900,
- SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x2923,
- SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x290A,
- SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x2907,
- SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x290B,
- SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x2911,
- SMSG_GARRISON_OPEN_ARCHITECT = 0x291A,
- SMSG_GARRISON_OPEN_MISSION_NPC = 0x291C,
- SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x2916,
- SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x291B,
+ SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2905,
+ SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x292A,
+ SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x2910,
+ SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x290C,
+ SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x2911,
+ SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x2917,
+ SMSG_GARRISON_OPEN_ARCHITECT = 0x2921,
+ SMSG_GARRISON_OPEN_MISSION_NPC = 0x2923,
+ SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x291C,
+ SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x2922,
SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x28F3,
SMSG_GARRISON_PLOT_PLACED = 0x28F1,
SMSG_GARRISON_PLOT_REMOVED = 0x28F2,
- SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x2905,
- SMSG_GARRISON_RECALL_PORTAL_USED = 0x2906,
- SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x2917,
- SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x2918,
+ SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x290A,
+ SMSG_GARRISON_RECALL_PORTAL_USED = 0x290B,
+ SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x291E,
+ SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x291F,
SMSG_GARRISON_REMOTE_INFO = 0x28FA,
- SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2913,
- SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x28FF,
+ SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2919,
+ SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x2903,
SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x28F9,
- SMSG_GARRISON_START_MISSION_RESULT = 0x2902,
+ SMSG_GARRISON_START_MISSION_RESULT = 0x2907,
SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x28F8,
SMSG_GARRISON_UPGRADE_RESULT = 0x28FD,
- SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2584,
- SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A0,
- SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2921,
+ SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2583,
+ SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A1,
+ SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928,
SMSG_GET_GARRISON_INFO_RESULT = 0x28F0,
- SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27D7,
- SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27D3,
- SMSG_GET_TROPHY_LIST_RESPONSE = 0x27F6,
- SMSG_GM_PLAYER_INFO = 0x2776,
- SMSG_GM_REQUEST_PLAYER_INFO = 0x25EB,
+ SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27DA,
+ SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27D6,
+ SMSG_GET_TROPHY_LIST_RESPONSE = 0x27FA,
+ SMSG_GM_PLAYER_INFO = 0x2777,
+ SMSG_GM_REQUEST_PLAYER_INFO = 0x25EA,
SMSG_GM_TICKET_CASE_STATUS = 0x26CA,
SMSG_GM_TICKET_SYSTEM_STATUS = 0x26C9,
- SMSG_GOD_MODE = 0x2736,
+ SMSG_GOD_MODE = 0x2735,
SMSG_GOSSIP_COMPLETE = 0x2A95,
SMSG_GOSSIP_MESSAGE = 0x2A96,
- SMSG_GOSSIP_POI = 0x27D0,
- SMSG_GROUP_ACTION_THROTTLED = 0x259D,
- SMSG_GROUP_DECLINE = 0x27CB,
- SMSG_GROUP_DESTROYED = 0x27CD,
+ SMSG_GOSSIP_POI = 0x27D3,
+ SMSG_GROUP_ACTION_THROTTLED = 0x259C,
+ SMSG_GROUP_DECLINE = 0x27CE,
+ SMSG_GROUP_DESTROYED = 0x27D0,
SMSG_GROUP_NEW_LEADER = 0x2647,
- SMSG_GROUP_UNINVITE = 0x27CC,
+ SMSG_GROUP_UNINVITE = 0x27CF,
SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5,
SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4,
SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7,
- SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x29DE,
- SMSG_GUILD_BANK_QUERY_RESULTS = 0x29DD,
- SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x29DF,
- SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x29E2,
+ SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x29DF,
+ SMSG_GUILD_BANK_QUERY_RESULTS = 0x29DE,
+ SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x29E0,
+ SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x29E3,
SMSG_GUILD_CHALLENGE_COMPLETED = 0x29D3,
SMSG_GUILD_CHALLENGE_UPDATE = 0x29D2,
- SMSG_GUILD_CHANGE_NAME_RESULT = 0x29DC,
+ SMSG_GUILD_CHANGE_NAME_RESULT = 0x29DD,
SMSG_GUILD_COMMAND_RESULT = 0x29BA,
SMSG_GUILD_CRITERIA_DELETED = 0x29C6,
SMSG_GUILD_CRITERIA_UPDATE = 0x29C3,
- SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x29F4,
- SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x29F3,
- SMSG_GUILD_EVENT_DISBANDED = 0x29EA,
- SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x29E1,
- SMSG_GUILD_EVENT_MOTD = 0x29EB,
- SMSG_GUILD_EVENT_NEW_LEADER = 0x29E9,
- SMSG_GUILD_EVENT_PLAYER_JOINED = 0x29E7,
- SMSG_GUILD_EVENT_PLAYER_LEFT = 0x29E8,
- SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x29EC,
- SMSG_GUILD_EVENT_RANKS_UPDATED = 0x29ED,
- SMSG_GUILD_EVENT_RANK_CHANGED = 0x29EE,
- SMSG_GUILD_EVENT_TAB_ADDED = 0x29EF,
- SMSG_GUILD_EVENT_TAB_DELETED = 0x29F0,
- SMSG_GUILD_EVENT_TAB_MODIFIED = 0x29F1,
- SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x29F2,
- SMSG_GUILD_FLAGGED_FOR_RENAME = 0x29DB,
+ SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x29F5,
+ SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x29F4,
+ SMSG_GUILD_EVENT_DISBANDED = 0x29EB,
+ SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x29E2,
+ SMSG_GUILD_EVENT_MOTD = 0x29EC,
+ SMSG_GUILD_EVENT_NEW_LEADER = 0x29EA,
+ SMSG_GUILD_EVENT_PLAYER_JOINED = 0x29E8,
+ SMSG_GUILD_EVENT_PLAYER_LEFT = 0x29E9,
+ SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x29ED,
+ SMSG_GUILD_EVENT_RANKS_UPDATED = 0x29EE,
+ SMSG_GUILD_EVENT_RANK_CHANGED = 0x29EF,
+ SMSG_GUILD_EVENT_TAB_ADDED = 0x29F0,
+ SMSG_GUILD_EVENT_TAB_DELETED = 0x29F1,
+ SMSG_GUILD_EVENT_TAB_MODIFIED = 0x29F2,
+ SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x29F3,
+ SMSG_GUILD_FLAGGED_FOR_RENAME = 0x29DC,
SMSG_GUILD_INVITE = 0x29CA,
- SMSG_GUILD_INVITE_DECLINED = 0x29E5,
- SMSG_GUILD_INVITE_EXPIRED = 0x29E6,
+ SMSG_GUILD_INVITE_DECLINED = 0x29E6,
+ SMSG_GUILD_INVITE_EXPIRED = 0x29E7,
+ SMSG_GUILD_ITEM_LOOTED = 0x29D4,
SMSG_GUILD_KNOWN_RECIPES = 0x29BE,
SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x29BF,
- SMSG_GUILD_MEMBER_DAILY_RESET = 0x29E3,
+ SMSG_GUILD_MEMBER_DAILY_RESET = 0x29E4,
SMSG_GUILD_MEMBER_RECIPES = 0x29BD,
SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x29C9,
- SMSG_GUILD_MOVED = 0x29D9,
- SMSG_GUILD_MOVE_STARTING = 0x29D8,
- SMSG_GUILD_NAME_CHANGED = 0x29DA,
+ SMSG_GUILD_MOVED = 0x29DA,
+ SMSG_GUILD_MOVE_STARTING = 0x29D9,
+ SMSG_GUILD_NAME_CHANGED = 0x29DB,
SMSG_GUILD_NEWS = 0x29C1,
SMSG_GUILD_NEWS_DELETED = 0x29C2,
SMSG_GUILD_PARTY_STATE = 0x29CB,
- SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x29E0,
+ SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x29E1,
SMSG_GUILD_RANKS = 0x29C8,
SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x29CC,
- SMSG_GUILD_RESET = 0x29D7,
+ SMSG_GUILD_RESET = 0x29D8,
SMSG_GUILD_REWARD_LIST = 0x29C0,
SMSG_GUILD_ROSTER = 0x29BB,
SMSG_GUILD_ROSTER_UPDATE = 0x29BC,
SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9,
- SMSG_HEALTH_UPDATE = 0x26FB,
- SMSG_HIGHEST_THREAT_UPDATE = 0x270A,
- SMSG_HOTFIX_NOTIFY = 0x25A2,
- SMSG_HOTFIX_NOTIFY_BLOB = 0x25A3,
+ SMSG_HEALTH_UPDATE = 0x26FA,
+ SMSG_HIGHEST_THREAT_UPDATE = 0x2709,
+ SMSG_HOTFIX_NOTIFY = 0x25A1,
+ SMSG_HOTFIX_NOTIFY_BLOB = 0x25A2,
SMSG_INITIALIZE_FACTIONS = 0x2761,
- SMSG_INITIAL_SETUP = 0x2580,
- SMSG_INIT_WORLD_STATES = 0x2787,
- SMSG_INSPECT_HONOR_STATS = 0x25B1,
+ SMSG_INITIAL_SETUP = 0x257F,
+ SMSG_INIT_WORLD_STATES = 0x2788,
+ SMSG_INSPECT_HONOR_STATS = 0x25B0,
SMSG_INSPECT_PVP = 0x275D,
SMSG_INSPECT_RESULT = 0x264B,
- SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27E6,
- SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27E5,
- SMSG_INSTANCE_ENCOUNTER_END = 0x27EC,
- SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27E4,
- SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27EE,
- SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27ED,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27E9,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27E8,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27EB,
- SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27EF,
- SMSG_INSTANCE_ENCOUNTER_START = 0x27EA,
- SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27E7,
- SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2734,
+ SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27EA,
+ SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27E9,
+ SMSG_INSTANCE_ENCOUNTER_END = 0x27F0,
+ SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27E8,
+ SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27F2,
+ SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27F1,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27ED,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27EC,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27EF,
+ SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27F3,
+ SMSG_INSTANCE_ENCOUNTER_START = 0x27EE,
+ SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27EB,
+ SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2733,
SMSG_INSTANCE_INFO = 0x264D,
SMSG_INSTANCE_RESET = 0x26AC,
SMSG_INSTANCE_RESET_FAILED = 0x26AD,
- SMSG_INSTANCE_SAVE_CREATED = 0x27B5,
+ SMSG_INSTANCE_SAVE_CREATED = 0x27B8,
SMSG_INVALIDATE_PLAYER = 0x26D0,
- SMSG_INVALID_PROMOTION_CODE = 0x2791,
+ SMSG_INVALID_PROMOTION_CODE = 0x2792,
SMSG_INVENTORY_CHANGE_FAILURE = 0x275F,
SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A83,
- SMSG_ITEM_CHANGED = 0x271E,
- SMSG_ITEM_COOLDOWN = 0x27F9,
- SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2793,
- SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25B0,
- SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AE,
+ SMSG_ITEM_CHANGED = 0x271D,
+ SMSG_ITEM_COOLDOWN = 0x27FD,
+ SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2794,
+ SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25AF,
+ SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AD,
SMSG_ITEM_PUSH_RESULT = 0x2636,
- SMSG_ITEM_TIME_UPDATE = 0x2792,
- SMSG_KICK_REASON = 0x26AF,
+ SMSG_ITEM_TIME_UPDATE = 0x2793,
+ SMSG_KICK_REASON = 0x2820,
SMSG_LEARNED_SPELLS = 0x2C4C,
- SMSG_LEARN_PVP_TALENT_FAILED = 0x25E8,
- SMSG_LEARN_TALENT_FAILED = 0x25E7,
- SMSG_LEVEL_UPDATE = 0x2588,
- SMSG_LEVEL_UP_INFO = 0x271D,
- SMSG_LFG_BOOT_PLAYER = 0x2A35,
- SMSG_LFG_DISABLED = 0x2A33,
+ SMSG_LEARN_PVP_TALENT_FAILED = 0x25E7,
+ SMSG_LEARN_TALENT_FAILED = 0x25E6,
+ SMSG_LEVEL_UPDATE = 0x2587,
+ SMSG_LEVEL_UP_INFO = 0x271C,
+ SMSG_LFG_BOOT_PLAYER = 0x2A36,
+ SMSG_LFG_DISABLED = 0x2A34,
+ SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x2A25,
SMSG_LFG_JOIN_RESULT = 0x2A1C,
SMSG_LFG_LIST_JOIN_RESULT = 0x2A1D,
SMSG_LFG_LIST_SEARCH_RESULTS = 0x2A1E,
SMSG_LFG_LIST_SEARCH_STATUS = 0x2A1F,
- SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x2A29,
- SMSG_LFG_LIST_UPDATE_STATUS = 0x2A25,
- SMSG_LFG_OFFER_CONTINUE = 0x2A34,
- SMSG_LFG_PARTY_INFO = 0x2A36,
- SMSG_LFG_PLAYER_INFO = 0x2A37,
- SMSG_LFG_PLAYER_REWARD = 0x2A38,
- SMSG_LFG_PROPOSAL_UPDATE = 0x2A2C,
+ SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x2A2A,
+ SMSG_LFG_LIST_UPDATE_STATUS = 0x2A26,
+ SMSG_LFG_OFFER_CONTINUE = 0x2A35,
+ SMSG_LFG_PARTY_INFO = 0x2A37,
+ SMSG_LFG_PLAYER_INFO = 0x2A38,
+ SMSG_LFG_PLAYER_REWARD = 0x2A39,
+ SMSG_LFG_PROPOSAL_UPDATE = 0x2A2D,
SMSG_LFG_QUEUE_STATUS = 0x2A20,
- SMSG_LFG_READY_CHECK_RESULT = 0x2A3A,
+ SMSG_LFG_READY_CHECK_RESULT = 0x2A3B,
SMSG_LFG_READY_CHECK_UPDATE = 0x2A22,
SMSG_LFG_ROLE_CHECK_UPDATE = 0x2A21,
- SMSG_LFG_SLOT_INVALID = 0x2A2F,
- SMSG_LFG_TELEPORT_DENIED = 0x2A32,
+ SMSG_LFG_SLOT_INVALID = 0x2A30,
+ SMSG_LFG_TELEPORT_DENIED = 0x2A33,
SMSG_LFG_UPDATE_STATUS = 0x2A24,
- SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x29D4,
+ SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x29D5,
SMSG_LF_GUILD_APPLICATIONS = 0x29D1,
- SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x29D5,
+ SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x29D6,
SMSG_LF_GUILD_BROWSE = 0x29CE,
SMSG_LF_GUILD_COMMAND_RESULT = 0x29D0,
SMSG_LF_GUILD_POST = 0x29CD,
SMSG_LF_GUILD_RECRUITS = 0x29CF,
- SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27AC,
- SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AA,
- SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A1,
- SMSG_LOAD_CUF_PROFILES = 0x25CD,
- SMSG_LOAD_EQUIPMENT_SET = 0x274A,
- SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x27F7,
- SMSG_LOGIN_SET_TIME_SPEED = 0x2749,
- SMSG_LOGIN_VERIFY_WORLD = 0x25AB,
+ SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27AF,
+ SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AD,
+ SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A2,
+ SMSG_LOAD_CUF_PROFILES = 0x25CB,
+ SMSG_LOAD_EQUIPMENT_SET = 0x2749,
+ SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x27FB,
+ SMSG_LOGIN_SET_TIME_SPEED = 0x2748,
+ SMSG_LOGIN_VERIFY_WORLD = 0x25AA,
SMSG_LOGOUT_CANCEL_ACK = 0x26AB,
SMSG_LOGOUT_COMPLETE = 0x26AA,
SMSG_LOGOUT_RESPONSE = 0x26A9,
- SMSG_LOG_XP_GAIN = 0x2719,
+ SMSG_LOG_XP_GAIN = 0x2718,
SMSG_LOOT_ALL_PASSED = 0x2634,
- SMSG_LOOT_CONTENTS = 0x25EF,
+ SMSG_LOOT_CONTENTS = 0x25EE,
SMSG_LOOT_ITEM_LIST = 0x2632,
SMSG_LOOT_LIST = 0x2780,
SMSG_LOOT_MONEY_NOTIFY = 0x262E,
@@ -1213,19 +1229,19 @@ enum OpcodeServer : uint32
SMSG_LOOT_ROLL_WON = 0x2635,
SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2692,
SMSG_MAIL_COMMAND_RESULT = 0x2655,
- SMSG_MAIL_LIST_RESULT = 0x2794,
- SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2795,
- SMSG_MAP_OBJECTIVES_INIT = 0x279D,
- SMSG_MAP_OBJ_EVENTS = 0x25D8,
+ SMSG_MAIL_LIST_RESULT = 0x2795,
+ SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2796,
+ SMSG_MAP_OBJECTIVES_INIT = 0x279E,
+ SMSG_MAP_OBJ_EVENTS = 0x25D6,
SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x2631,
- SMSG_MESSAGE_BOX = 0x2576,
- SMSG_MINIMAP_PING = 0x26F6,
+ SMSG_MESSAGE_BOX = 0x2575,
+ SMSG_MINIMAP_PING = 0x26F5,
SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14,
SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13,
- SMSG_MISSILE_CANCEL = 0x25D9,
- SMSG_MODIFY_COOLDOWN = 0x27A3,
+ SMSG_MISSILE_CANCEL = 0x25D7,
+ SMSG_MODIFY_COOLDOWN = 0x27A4,
SMSG_MOTD = 0x2BAF,
- SMSG_MOUNT_RESULT = 0x257B,
+ SMSG_MOUNT_RESULT = 0x257A,
SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1,
SMSG_MOVE_DISABLE_COLLISION = 0x2DDD,
SMSG_MOVE_DISABLE_GRAVITY = 0x2DDB,
@@ -1306,37 +1322,37 @@ enum OpcodeServer : uint32
SMSG_MOVE_UPDATE_TELEPORT = 0x2DAF,
SMSG_MOVE_UPDATE_TURN_RATE = 0x2DAB,
SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DA6,
- SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25F1,
+ SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25F0,
SMSG_NEW_TAXI_PATH = 0x26A4,
- SMSG_NEW_WORLD = 0x25AA,
+ SMSG_NEW_WORLD = 0x25A9,
SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C42,
SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26CF,
- SMSG_NOTIFY_MONEY = 0x25AD,
+ SMSG_NOTIFY_MONEY = 0x25AC,
SMSG_NOTIFY_RECEIVED_MAIL = 0x2656,
SMSG_OFFER_PETITION_ERROR = 0x26DE,
- SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x271A,
+ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2719,
SMSG_ON_MONSTER_MOVE = 0x2DA2,
SMSG_OPEN_CONTAINER = 0x2760,
- SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A31,
- SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D2,
- SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27D4,
- SMSG_OVERRIDE_LIGHT = 0x26E5,
+ SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A32,
+ SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27D5,
+ SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27D7,
+ SMSG_OVERRIDE_LIGHT = 0x26E4,
SMSG_PAGE_TEXT = 0x2755,
- SMSG_PARTY_COMMAND_RESULT = 0x27CF,
- SMSG_PARTY_INVITE = 0x25CF,
- SMSG_PARTY_KILL_LOG = 0x2799,
- SMSG_PARTY_MEMBER_STATE = 0x2797,
+ SMSG_PARTY_COMMAND_RESULT = 0x27D2,
+ SMSG_PARTY_INVITE = 0x25CD,
+ SMSG_PARTY_KILL_LOG = 0x279A,
+ SMSG_PARTY_MEMBER_STATE = 0x2798,
SMSG_PARTY_UPDATE = 0x260A,
- SMSG_PAUSE_MIRROR_TIMER = 0x274C,
- SMSG_PENDING_RAID_LOCK = 0x272E,
- SMSG_PETITION_ALREADY_SIGNED = 0x25B7,
- SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F6,
- SMSG_PETITION_SHOW_LIST = 0x26E8,
- SMSG_PETITION_SHOW_SIGNATURES = 0x26E9,
- SMSG_PETITION_SIGN_RESULTS = 0x278B,
- SMSG_PET_ACTION_FEEDBACK = 0x2789,
+ SMSG_PAUSE_MIRROR_TIMER = 0x274B,
+ SMSG_PENDING_RAID_LOCK = 0x272D,
+ SMSG_PETITION_ALREADY_SIGNED = 0x25B6,
+ SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F7,
+ SMSG_PETITION_SHOW_LIST = 0x26E7,
+ SMSG_PETITION_SHOW_SIGNATURES = 0x26E8,
+ SMSG_PETITION_SIGN_RESULTS = 0x278C,
+ SMSG_PET_ACTION_FEEDBACK = 0x278A,
SMSG_PET_ACTION_SOUND = 0x26C6,
- SMSG_PET_ADDED = 0x25A7,
+ SMSG_PET_ADDED = 0x25A6,
SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2617,
SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2699,
SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x2610,
@@ -1356,55 +1372,57 @@ enum OpcodeServer : uint32
SMSG_PET_CLEAR_SPELLS = 0x2C23,
SMSG_PET_DISMISS_SOUND = 0x26C7,
SMSG_PET_GOD_MODE = 0x26A1,
- SMSG_PET_GUIDS = 0x273F,
+ SMSG_PET_GUIDS = 0x273E,
SMSG_PET_LEARNED_SPELLS = 0x2C4E,
- SMSG_PET_MODE = 0x258A,
- SMSG_PET_NAME_INVALID = 0x26ED,
- SMSG_PET_SLOT_UPDATED = 0x2589,
+ SMSG_PET_MODE = 0x2589,
+ SMSG_PET_NAME_INVALID = 0x26EC,
+ SMSG_PET_SLOT_UPDATED = 0x2588,
SMSG_PET_SPELLS_MESSAGE = 0x2C24,
- SMSG_PET_STABLE_LIST = 0x25A8,
- SMSG_PET_STABLE_RESULT = 0x25A9,
+ SMSG_PET_STABLE_LIST = 0x25A7,
+ SMSG_PET_STABLE_RESULT = 0x25A8,
SMSG_PET_TAME_FAILURE = 0x26DB,
SMSG_PET_UNLEARNED_SPELLS = 0x2C4F,
- SMSG_PHASE_SHIFT_CHANGE = 0x2578,
- SMSG_PLAYED_TIME = 0x2706,
- SMSG_PLAYER_BOUND = 0x257E,
- SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F5,
- SMSG_PLAYER_SKINNED = 0x2784,
- SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x2798,
- SMSG_PLAY_MUSIC = 0x27A6,
- SMSG_PLAY_OBJECT_SOUND = 0x27A7,
- SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x276E,
+ SMSG_PHASE_SHIFT_CHANGE = 0x2577,
+ SMSG_PLAYED_TIME = 0x2705,
+ SMSG_PLAYER_BOUND = 0x257D,
+ SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F6,
+ SMSG_PLAYER_SKINNED = 0x2785,
+ SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x2799,
+ SMSG_PLAY_MUSIC = 0x27A9,
+ SMSG_PLAY_OBJECT_SOUND = 0x27AA,
+ SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x276F,
SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C46,
SMSG_PLAY_SCENE = 0x2650,
- SMSG_PLAY_SOUND = 0x27A5,
- SMSG_PLAY_SPEAKERBOT_SOUND = 0x27A8,
+ SMSG_PLAY_SOUND = 0x27A8,
+ SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AB,
SMSG_PLAY_SPELL_VISUAL = 0x2C44,
SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C48,
- SMSG_PLAY_TIME_WARNING = 0x2738,
+ SMSG_PLAY_TIME_WARNING = 0x2737,
SMSG_PONG = 0x304D,
- SMSG_POWER_UPDATE = 0x26FC,
- SMSG_PRE_RESSURECT = 0x27A4,
- SMSG_PRINT_NOTIFICATION = 0x25E0,
- SMSG_PROC_RESIST = 0x279A,
- SMSG_PROPOSE_LEVEL_GRANT = 0x270E,
- SMSG_PVP_CREDIT = 0x2714,
- SMSG_PVP_LOG_DATA = 0x25B2,
- SMSG_PVP_OPTIONS_ENABLED = 0x25B5,
- SMSG_PVP_SEASON = 0x25D3,
- SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2701,
- SMSG_QUERY_CREATURE_RESPONSE = 0x26F9,
- SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26FA,
- SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x2924,
- SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E4,
- SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27F8,
- SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FD,
- SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26FF,
- SMSG_QUERY_PETITION_RESPONSE = 0x2702,
- SMSG_QUERY_PET_NAME_RESPONSE = 0x2700,
- SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FE,
+ SMSG_POWER_UPDATE = 0x26FB,
+ SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2754,
+ SMSG_PRE_RESSURECT = 0x27A7,
+ SMSG_PRINT_NOTIFICATION = 0x25DE,
+ SMSG_PROC_RESIST = 0x279B,
+ SMSG_PROPOSE_LEVEL_GRANT = 0x270D,
+ SMSG_PVP_CREDIT = 0x2713,
+ SMSG_PVP_LOG_DATA = 0x25B1,
+ SMSG_PVP_OPTIONS_ENABLED = 0x25B4,
+ SMSG_PVP_SEASON = 0x25D1,
+ SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2700,
+ SMSG_QUERY_CREATURE_RESPONSE = 0x26F8,
+ SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26F9,
+ SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B,
+ SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5,
+ SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27FC,
+ SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FC,
+ SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26FE,
+ SMSG_QUERY_PETITION_RESPONSE = 0x2701,
+ SMSG_QUERY_PET_NAME_RESPONSE = 0x26FF,
+ SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FD,
SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A94,
- SMSG_QUERY_TIME_RESPONSE = 0x2718,
+ SMSG_QUERY_QUEST_REWARD_RESPONSE = 0x2834,
+ SMSG_QUERY_TIME_RESPONSE = 0x2717,
SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81,
SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8D,
SMSG_QUEST_FORCE_REMOVED = 0x2A99,
@@ -1427,65 +1445,64 @@ enum OpcodeServer : uint32
SMSG_QUEST_UPDATE_COMPLETE = 0x2A87,
SMSG_QUEST_UPDATE_FAILED = 0x2A88,
SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A89,
- SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C0,
- SMSG_RAID_DIFFICULTY_SET = 0x27E1,
- SMSG_RAID_GROUP_ONLY = 0x27E3,
+ SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C3,
+ SMSG_RAID_DIFFICULTY_SET = 0x27E5,
+ SMSG_RAID_GROUP_ONLY = 0x27E7,
SMSG_RAID_INSTANCE_MESSAGE = 0x2BB9,
- SMSG_RAID_MARKERS_CHANGED = 0x25B8,
+ SMSG_RAID_MARKERS_CHANGED = 0x25B7,
SMSG_RANDOM_ROLL = 0x264A,
- SMSG_RATED_BATTLEFIELD_INFO = 0x25A5,
+ SMSG_RATED_BATTLEFIELD_INFO = 0x25A4,
SMSG_READY_CHECK_COMPLETED = 0x260D,
SMSG_READY_CHECK_RESPONSE = 0x260C,
SMSG_READY_CHECK_STARTED = 0x260B,
- SMSG_READ_ITEM_RESULT_FAILED = 0x27DD,
- SMSG_READ_ITEM_RESULT_OK = 0x27D9,
- SMSG_REALM_QUERY_RESPONSE = 0x26E4,
- SMSG_REALM_SPLIT = 0x26E1,
- SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C1,
+ SMSG_READ_ITEM_RESULT_FAILED = 0x27E1,
+ SMSG_READ_ITEM_RESULT_OK = 0x27DC,
+ SMSG_REALM_QUERY_RESPONSE = 0x26E3,
+ SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C4,
SMSG_REFER_A_FRIEND_EXPIRED = 0x275E,
- SMSG_REFER_A_FRIEND_FAILURE = 0x26EA,
+ SMSG_REFER_A_FRIEND_FAILURE = 0x26E9,
SMSG_REFRESH_COMPONENT = 0x2675,
SMSG_REFRESH_SPELL_HISTORY = 0x2C2B,
- SMSG_REMOVE_ITEM_PASSIVE = 0x25BF,
+ SMSG_REMOVE_ITEM_PASSIVE = 0x25BE,
SMSG_REMOVE_LOSS_OF_CONTROL = 0x2694,
- SMSG_REPLACE_TROPHY_RESPONSE = 0x27F5,
+ SMSG_REPLACE_TROPHY_RESPONSE = 0x27F9,
SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26D7,
SMSG_REQUEST_ADDON_LIST = 0x265C,
- SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259E,
- SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D4,
- SMSG_RESEARCH_COMPLETE = 0x2586,
+ SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259D,
+ SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D2,
+ SMSG_RESEARCH_COMPLETE = 0x2585,
SMSG_RESET_AREA_TRIGGER = 0x263E,
SMSG_RESET_COMPRESSION_CONTEXT = 0x304E,
SMSG_RESET_FAILED_NOTIFY = 0x26DF,
- SMSG_RESET_RANGED_COMBAT_TIMER = 0x2711,
- SMSG_RESET_WEEKLY_CURRENCY = 0x2575,
+ SMSG_RESET_RANGED_COMBAT_TIMER = 0x2710,
+ SMSG_RESET_WEEKLY_CURRENCY = 0x2574,
SMSG_RESPEC_WIPE_CONFIRM = 0x2624,
- SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2572,
+ SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2571,
SMSG_RESUME_CAST_BAR = 0x2C3D,
SMSG_RESUME_COMMS = 0x304A,
- SMSG_RESUME_TOKEN = 0x25BD,
- SMSG_RESURRECT_REQUEST = 0x257F,
- SMSG_RESYNC_RUNES = 0x273B,
- SMSG_ROLE_CHANGED_INFORM = 0x258D,
- SMSG_ROLE_CHOSEN = 0x2A39,
- SMSG_ROLE_POLL_INFORM = 0x258E,
- SMSG_RUNE_REGEN_DEBUG = 0x25C7,
- SMSG_SCENARIO_BOOT = 0x27DE,
- SMSG_SCENARIO_COMPLETED = 0x2818,
+ SMSG_RESUME_TOKEN = 0x25BC,
+ SMSG_RESURRECT_REQUEST = 0x257E,
+ SMSG_RESYNC_RUNES = 0x273A,
+ SMSG_ROLE_CHANGED_INFORM = 0x258C,
+ SMSG_ROLE_CHOSEN = 0x2A3A,
+ SMSG_ROLE_POLL_INFORM = 0x258D,
+ SMSG_RUNE_REGEN_DEBUG = 0x25C5,
+ SMSG_SCENARIO_BOOT = 0x27E2,
+ SMSG_SCENARIO_COMPLETED = 0x281C,
SMSG_SCENARIO_POIS = 0x264C,
SMSG_SCENARIO_PROGRESS_UPDATE = 0x2646,
- SMSG_SCENARIO_SPELL_UPDATE = 0x2823,
+ SMSG_SCENARIO_SPELL_UPDATE = 0x2828,
SMSG_SCENARIO_STATE = 0x2645,
- SMSG_SCENE_OBJECT_EVENT = 0x25F7,
- SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FC,
- SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FD,
- SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25F9,
- SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F8,
- SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25FB,
- SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25FA,
+ SMSG_SCENE_OBJECT_EVENT = 0x25F6,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FB,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FC,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25F8,
+ SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F7,
+ SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25FA,
+ SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25F9,
SMSG_SCRIPT_CAST = 0x2C53,
- SMSG_SELL_RESPONSE = 0x26EE,
- SMSG_SEND_ITEM_PASSIVES = 0x25C0,
+ SMSG_SELL_RESPONSE = 0x26ED,
+ SMSG_SEND_ITEM_PASSIVES = 0x25BF,
SMSG_SEND_KNOWN_SPELLS = 0x2C29,
SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x2648,
SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x2649,
@@ -1495,45 +1512,46 @@ enum OpcodeServer : uint32
SMSG_SERVER_FIRST_ACHIEVEMENT = 0x2BC1,
SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x2667,
SMSG_SERVER_TIME = 0x26A8,
- SMSG_SETUP_CURRENCY = 0x2573,
- SMSG_SETUP_RESEARCH_HISTORY = 0x2585,
- SMSG_SET_ACTIVE_SPEC_ID = 0x263F,
- SMSG_SET_AI_ANIM_KIT = 0x276D,
- SMSG_SET_ALL_TASK_PROGRESS = 0x27C9,
- SMSG_SET_ANIM_TIER = 0x2771,
- SMSG_SET_CURRENCY = 0x2574,
- SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2D,
+ SMSG_SETUP_CURRENCY = 0x2572,
+ SMSG_SETUP_RESEARCH_HISTORY = 0x2584,
+ SMSG_SET_AI_ANIM_KIT = 0x276E,
+ SMSG_SET_ALL_TASK_PROGRESS = 0x27CC,
+ SMSG_SET_ANIM_TIER = 0x2772,
+ SMSG_SET_CURRENCY = 0x2573,
+ SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E,
SMSG_SET_DUNGEON_DIFFICULTY = 0x26CB,
- SMSG_SET_FACTION_AT_WAR = 0x273A,
- SMSG_SET_FACTION_NOT_VISIBLE = 0x2768,
- SMSG_SET_FACTION_STANDING = 0x2769,
- SMSG_SET_FACTION_VISIBLE = 0x2767,
+ SMSG_SET_FACTION_AT_WAR = 0x2739,
+ SMSG_SET_FACTION_NOT_VISIBLE = 0x2769,
+ SMSG_SET_FACTION_STANDING = 0x276A,
+ SMSG_SET_FACTION_VISIBLE = 0x2768,
SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36,
SMSG_SET_FORCED_REACTIONS = 0x2758,
- SMSG_SET_ITEM_PURCHASE_DATA = 0x25AF,
- SMSG_SET_LOOT_METHOD_FAILED = 0x2804,
- SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B6,
- SMSG_SET_MELEE_ANIM_KIT = 0x2770,
- SMSG_SET_MOVEMENT_ANIM_KIT = 0x276F,
+ SMSG_SET_ITEM_PURCHASE_DATA = 0x25AE,
+ SMSG_SET_LOOT_METHOD_FAILED = 0x2808,
+ SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B5,
+ SMSG_SET_MELEE_ANIM_KIT = 0x2771,
+ SMSG_SET_MOVEMENT_ANIM_KIT = 0x2770,
SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37,
- SMSG_SET_PET_SPECIALIZATION = 0x25EA,
- SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2705,
- SMSG_SET_PLAY_HOVER_ANIM = 0x25CB,
- SMSG_SET_PROFICIENCY = 0x2772,
+ SMSG_SET_PET_SPECIALIZATION = 0x263F,
+ SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2704,
+ SMSG_SET_PLAY_HOVER_ANIM = 0x25C9,
+ SMSG_SET_PROFICIENCY = 0x2773,
SMSG_SET_SPELL_CHARGES = 0x2C28,
- SMSG_SET_TASK_COMPLETE = 0x27CA,
+ SMSG_SET_TASK_COMPLETE = 0x27CD,
SMSG_SET_TIME_ZONE_INFORMATION = 0x269C,
- SMSG_SET_VEHICLE_REC_ID = 0x272D,
- SMSG_SHOW_ADVENTURE_MAP = 0x2821,
+ SMSG_SET_VEHICLE_REC_ID = 0x272C,
+ SMSG_SHOW_ADVENTURE_MAP = 0x2826,
SMSG_SHOW_BANK = 0x26A5,
- SMSG_SHOW_MAILBOX = 0x27DF,
- SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25F0,
- SMSG_SHOW_TAXI_NODES = 0x26F5,
- SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27AD,
+ SMSG_SHOW_MAILBOX = 0x27E3,
+ SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25EF,
+ SMSG_SHOW_TAXI_NODES = 0x26F4,
+ SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27B0,
SMSG_SOCKET_GEMS = 0x2765,
- SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25F2,
+ SMSG_SOCKET_GEMS_FAILURE = 0x2766,
+ SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25F1,
+ SMSG_SPECIALIZATION_CHANGED = 0x25E9,
SMSG_SPECIAL_MOUNT_ANIM = 0x26C5,
- SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2754,
+ SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2753,
SMSG_SPELL_ABSORB_LOG = 0x2C1E,
SMSG_SPELL_CHANNEL_START = 0x2C34,
SMSG_SPELL_CHANNEL_UPDATE = 0x2C35,
@@ -1555,103 +1573,106 @@ enum OpcodeServer : uint32
SMSG_SPELL_PERIODIC_AURA_LOG = 0x2C1B,
SMSG_SPELL_START = 0x2C3A,
SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x2C33,
- SMSG_SPIRIT_HEALER_CONFIRM = 0x2751,
+ SMSG_SPIRIT_HEALER_CONFIRM = 0x2750,
SMSG_STAND_STATE_UPDATE = 0x2757,
SMSG_START_ELAPSED_TIMER = 0x2619,
SMSG_START_ELAPSED_TIMERS = 0x261B,
SMSG_START_LOOT_ROLL = 0x262F,
- SMSG_START_MIRROR_TIMER = 0x274B,
- SMSG_START_TIMER = 0x25BA,
+ SMSG_START_MIRROR_TIMER = 0x274A,
+ SMSG_START_TIMER = 0x25B9,
SMSG_STOP_ELAPSED_TIMER = 0x261A,
- SMSG_STOP_MIRROR_TIMER = 0x274D,
- SMSG_STOP_SPEAKERBOT_SOUND = 0x27A9,
- SMSG_STREAMING_MOVIES = 0x25B9,
+ SMSG_STOP_MIRROR_TIMER = 0x274C,
+ SMSG_STOP_SPEAKERBOT_SOUND = 0x27AC,
+ SMSG_STREAMING_MOVIES = 0x25B8,
SMSG_SUMMON_CANCEL = 0x26D6,
- SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258F,
+ SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258E,
SMSG_SUMMON_REQUEST = 0x275C,
SMSG_SUPERCEDED_SPELLS = 0x2C4B,
- SMSG_SUPPRESS_NPC_GREETINGS = 0x25CE,
+ SMSG_SUPPRESS_NPC_GREETINGS = 0x25CC,
SMSG_SUSPEND_COMMS = 0x3049,
- SMSG_SUSPEND_TOKEN = 0x25BC,
- SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2753,
+ SMSG_SUSPEND_TOKEN = 0x25BB,
+ SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2752,
SMSG_TAXI_NODE_STATUS = 0x26A2,
SMSG_TEXT_EMOTE = 0x26A0,
- SMSG_THREAT_CLEAR = 0x270D,
- SMSG_THREAT_REMOVE = 0x270C,
- SMSG_THREAT_UPDATE = 0x270B,
+ SMSG_THREAT_CLEAR = 0x270C,
+ SMSG_THREAT_REMOVE = 0x270B,
+ SMSG_THREAT_UPDATE = 0x270A,
SMSG_TIME_ADJUSTMENT = 0x2DA1,
SMSG_TIME_SYNC_REQUEST = 0x2DA0,
- SMSG_TITLE_EARNED = 0x2708,
- SMSG_TITLE_LOST = 0x2709,
- SMSG_TOTEM_CREATED = 0x26F1,
- SMSG_TOTEM_MOVED = 0x26F2,
- SMSG_TRADE_STATUS = 0x2582,
- SMSG_TRADE_UPDATED = 0x2581,
- SMSG_TRAINER_BUY_FAILED = 0x2713,
- SMSG_TRAINER_LIST = 0x2712,
- SMSG_TRANSFER_ABORTED = 0x273E,
- SMSG_TRANSFER_PENDING = 0x25E3,
- SMSG_TRIGGER_CINEMATIC = 0x27FC,
- SMSG_TRIGGER_MOVIE = 0x26F3,
- SMSG_TURN_IN_PETITION_RESULT = 0x278D,
- SMSG_TUTORIAL_FLAGS = 0x27F0,
+ SMSG_TITLE_EARNED = 0x2707,
+ SMSG_TITLE_LOST = 0x2708,
+ SMSG_TOTEM_CREATED = 0x26F0,
+ SMSG_TOTEM_MOVED = 0x26F1,
+ SMSG_TRADE_STATUS = 0x2581,
+ SMSG_TRADE_UPDATED = 0x2580,
+ SMSG_TRAINER_BUY_FAILED = 0x2712,
+ SMSG_TRAINER_LIST = 0x2711,
+ SMSG_TRANSFER_ABORTED = 0x273D,
+ SMSG_TRANSFER_PENDING = 0x25E2,
+ SMSG_TRANSMOG_COLLECTION_UPDATE = 0x25C4,
+ SMSG_TRIGGER_CINEMATIC = 0x2800,
+ SMSG_TRIGGER_MOVIE = 0x26F2,
+ SMSG_TURN_IN_PETITION_RESULT = 0x278E,
+ SMSG_TUTORIAL_FLAGS = 0x27F4,
+ SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x282E,
+ SMSG_TUTORIAL_UNHIGHLIGHT_SPELL = 0x282D,
SMSG_TWITTER_STATUS = 0x2FFD,
- SMSG_UI_TIME = 0x2750,
- SMSG_UNDELETE_CHARACTER_RESPONSE = 0x27FF,
- SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2800,
+ SMSG_UI_TIME = 0x274F,
+ SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2803,
+ SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2804,
SMSG_UNLEARNED_SPELLS = 0x2C4D,
- SMSG_UPDATE_ACCOUNT_DATA = 0x2745,
- SMSG_UPDATE_ACTION_BUTTONS = 0x25F5,
- SMSG_UPDATE_CHARACTER_FLAGS = 0x27F4,
- SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x2A30,
+ SMSG_UPDATE_ACCOUNT_DATA = 0x2744,
+ SMSG_UPDATE_ACTION_BUTTONS = 0x25F4,
+ SMSG_UPDATE_CHARACTER_FLAGS = 0x27F8,
+ SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x2A31,
SMSG_UPDATE_EXPANSION_LEVEL = 0x2660,
SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26CE,
SMSG_UPDATE_LAST_INSTANCE = 0x26AE,
- SMSG_UPDATE_OBJECT = 0x27FD,
- SMSG_UPDATE_TALENT_DATA = 0x25E9,
- SMSG_UPDATE_TASK_PROGRESS = 0x27C8,
+ SMSG_UPDATE_OBJECT = 0x2801,
+ SMSG_UPDATE_TALENT_DATA = 0x25E8,
+ SMSG_UPDATE_TASK_PROGRESS = 0x27CB,
SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19,
- SMSG_UPDATE_WORLD_STATE = 0x2788,
+ SMSG_UPDATE_WORLD_STATE = 0x2789,
SMSG_USERLIST_ADD = 0x2BBE,
SMSG_USERLIST_REMOVE = 0x2BBF,
SMSG_USERLIST_UPDATE = 0x2BC0,
- SMSG_USE_EQUIPMENT_SET_RESULT = 0x278E,
- SMSG_VENDOR_INVENTORY = 0x25C9,
- SMSG_VIGNETTE_UPDATE = 0x27AB,
+ SMSG_USE_EQUIPMENT_SET_RESULT = 0x278F,
+ SMSG_VENDOR_INVENTORY = 0x25C7,
+ SMSG_VIGNETTE_UPDATE = 0x27AE,
SMSG_VOICE_CHAT_STATUS = 0x2BB3,
SMSG_VOICE_PARENTAL_CONTROLS = 0x2BB4,
SMSG_VOICE_SESSION_LEAVE = 0x2BB6,
SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x2BB5,
- SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25DE,
- SMSG_VOID_STORAGE_CONTENTS = 0x25DB,
- SMSG_VOID_STORAGE_FAILED = 0x25DA,
- SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x25DC,
- SMSG_VOID_TRANSFER_RESULT = 0x25DD,
- SMSG_WAIT_QUEUE_FINISH = 0x256F,
- SMSG_WAIT_QUEUE_UPDATE = 0x256E,
- SMSG_WARDEN_DATA = 0x2577,
- SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B3,
+ SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25DC,
+ SMSG_VOID_STORAGE_CONTENTS = 0x25D9,
+ SMSG_VOID_STORAGE_FAILED = 0x25D8,
+ SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x25DA,
+ SMSG_VOID_TRANSFER_RESULT = 0x25DB,
+ SMSG_WAIT_QUEUE_FINISH = 0x256E,
+ SMSG_WAIT_QUEUE_UPDATE = 0x256D,
+ SMSG_WARDEN_DATA = 0x2576,
+ SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B2,
SMSG_WEATHER = 0x26CD,
SMSG_WEEKLY_SPELL_USAGE = 0x2C18,
SMSG_WHO = 0x2BAE,
SMSG_WHO_IS = 0x26CC,
- SMSG_WORLD_SERVER_INFO = 0x25C1,
- SMSG_WORLD_TEXT = 0x281A,
- SMSG_WOW_TOKEN_AUCTION_SOLD = 0x280A,
- SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x280C,
- SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x280D,
- SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x280B,
- SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2805,
- SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x2806,
- SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x2807,
- SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x280E,
- SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x280F,
- SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2810,
- SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x2808,
- SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x2809,
- SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2811,
- SMSG_XP_GAIN_ABORTED = 0x25DF,
- SMSG_XP_GAIN_ENABLED = 0x27E2,
+ SMSG_WORLD_SERVER_INFO = 0x25C0,
+ SMSG_WORLD_TEXT = 0x281E,
+ SMSG_WOW_TOKEN_AUCTION_SOLD = 0x280E,
+ SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2810,
+ SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2811,
+ SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x280F,
+ SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2809,
+ SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x280A,
+ SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x280B,
+ SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2812,
+ SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2813,
+ SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2814,
+ SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x280C,
+ SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x280D,
+ SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2815,
+ SMSG_XP_GAIN_ABORTED = 0x25DD,
+ SMSG_XP_GAIN_ENABLED = 0x27E6,
SMSG_ZONE_UNDER_ATTACK = 0x2BBA,
SMSG_ZZZ_GLYPH_RELATED_LEGION = 0x2C51,
@@ -1661,6 +1682,7 @@ enum OpcodeServer : uint32
SMSG_MULTIPLE_PACKETS = 0x3050,
// Deleted opcodes, here only to allow compile
+ SMSG_ADDON_INFO = 0xBADD,
SMSG_ARENA_TEAM_STATS = 0xBADD,
SMSG_BUY_BANK_SLOT_RESULT = 0xBADD,
SMSG_BF_MGR_EJECTED = 0xBADD,
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 3d661e1a8ff..5becf594568 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -201,8 +201,6 @@ namespace WorldPackets
class LoadingScreenNotify;
class SetActionBarToggles;
class RequestPlayedTime;
- class ShowingCloak;
- class ShowingHelm;
class SetTitle;
class SetFactionAtWar;
class SetFactionNotAtWar;
@@ -1162,10 +1160,6 @@ class TC_GAME_API WorldSession
void HandleMountSpecialAnimOpcode(WorldPackets::Misc::MountSpecial& mountSpecial);
- // character view
- void HandleShowingHelmOpcode(WorldPackets::Character::ShowingHelm& packet);
- void HandleShowingCloakOpcode(WorldPackets::Character::ShowingCloak& packet);
-
// repair
void HandleRepairItemOpcode(WorldPackets::Item::RepairItem& packet);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 31e0b126be6..d22b6df71e4 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -5291,7 +5291,7 @@ void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/)
FactionTemplateEntry const* casterFaction = caster->GetFactionTemplateEntry();
FactionTemplateEntry const* targetFaction = sFactionTemplateStore.LookupEntry(gameObjTarget->GetUInt32Value(GAMEOBJECT_FACTION));
// Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons)
- if (!targetFaction || (casterFaction && targetFaction && !casterFaction->IsFriendlyTo(*targetFaction)))
+ if (!targetFaction || (casterFaction && targetFaction && !casterFaction->IsFriendlyTo(targetFaction)))
gameObjTarget->ModifyHealth(-damage, caster, GetSpellInfo()->Id);
}
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 031ab5bdbdf..ec1c63076aa 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -20,8 +20,8 @@
#include "SpellAuraEffects.h"
#include "SpellMgr.h"
#include "Spell.h"
-#include "DBCStores.h"
#include "ConditionMgr.h"
+#include "GameTables.h"
#include "Player.h"
#include "Battleground.h"
#include "Vehicle.h"
@@ -468,6 +468,9 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const*
if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) && _spellInfo->HasAttribute(SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING))
level = _spellInfo->BaseLevel;
+ if (_spellInfo->Scaling.MinScalingLevel && _spellInfo->Scaling.MinScalingLevel > level)
+ level = _spellInfo->Scaling.MinScalingLevel;
+
if (_spellInfo->Scaling.MaxScalingLevel && _spellInfo->Scaling.MaxScalingLevel < level)
level = _spellInfo->Scaling.MaxScalingLevel;
@@ -481,8 +484,11 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const*
{
if (!_spellInfo->HasAttribute(SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL))
{
- if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.EvaluateTable(level - 1, (_spellInfo->Scaling.Class > 0 ? _spellInfo->Scaling.Class : ((MAX_CLASSES - 1 /*last class*/) - _spellInfo->Scaling.Class)) - 1))
- value = gtScaling->value;
+ GtSpellScalingEntry const* gtScaling = sSpellScalingGameTable.GetRow(level);
+ if (_spellInfo->Scaling.Class > 0)
+ value = GetGameTableColumnForClass(gtScaling, _spellInfo->Scaling.Class);
+ else
+ value = gtScaling->Item;
}
else
value = GetRandomPropertyPoints(itemLevel != -1 ? uint32(itemLevel) : 1u, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
@@ -600,10 +606,10 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const*
if (canEffectScale)
{
- GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.EvaluateTable(_spellInfo->SpellLevel - 1, 0);
- GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.EvaluateTable(caster->getLevel() - 1, 0);
+ GtNpcManaCostScalerEntry const* spellScaler = sNpcManaCostScalerGameTable.GetRow(_spellInfo->SpellLevel);
+ GtNpcManaCostScalerEntry const* casterScaler = sNpcManaCostScalerGameTable.GetRow(caster->getLevel());
if (spellScaler && casterScaler)
- value *= casterScaler->ratio / spellScaler->ratio;
+ value *= casterScaler->Scaler / spellScaler->Scaler;
}
}
}
@@ -1729,7 +1735,7 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a
// continent limitation (virtual continent)
if (AttributesEx4 & SPELL_ATTR4_CAST_ONLY_IN_OUTLAND)
{
- uint32 v_map = GetVirtualMapForMapAndZone(map_id, zone_id);
+ uint32 v_map = sDB2Manager.GetVirtualMapForMapAndZone(map_id, zone_id);
MapEntry const* mapEntry = sMapStore.LookupEntry(v_map);
if (!mapEntry || mapEntry->ExpansionID < 1 || !mapEntry->IsContinent())
return SPELL_FAILED_INCORRECT_AREA;
@@ -2676,10 +2682,10 @@ std::vector<SpellInfo::CostData> SpellInfo::CalcPowerCost(Unit const* caster, Sp
{
if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)
{
- GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.EvaluateTable(SpellLevel - 1, 0);
- GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.EvaluateTable(caster->getLevel() - 1, 0);
+ GtNpcManaCostScalerEntry const* spellScaler = sNpcManaCostScalerGameTable.GetRow(SpellLevel);
+ GtNpcManaCostScalerEntry const* casterScaler = sNpcManaCostScalerGameTable.GetRow(caster->getLevel());
if (spellScaler && casterScaler)
- powerCost *= casterScaler->ratio / spellScaler->ratio;
+ powerCost *= casterScaler->Scaler / spellScaler->Scaler;
}
}
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 764760ddffa..a5d620571a3 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -20,8 +20,6 @@
#include "SharedDefines.h"
#include "Util.h"
-#include "DBCStructure.h"
-#include "DB2Structure.h"
#include "Object.h"
#include "SpellAuraDefines.h"
@@ -409,6 +407,7 @@ public:
struct ScalingInfo
{
int32 Class;
+ uint32 MinScalingLevel;
uint32 MaxScalingLevel;
uint32 ScalesFromItemLevel;
} Scaling;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index ebf82122e00..a7ad0e55d5b 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -21,7 +21,6 @@
#include "ObjectMgr.h"
#include "SpellAuraDefines.h"
#include "SharedDefines.h"
-#include "DBCStores.h"
#include "Chat.h"
#include "BattlegroundMgr.h"
#include "BattlefieldWG.h"
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index e9488d8ecbb..4d15043a220 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -22,7 +22,6 @@
// For static or at-server-startup loaded spell data
#include "Define.h"
-#include "DBCStructure.h"
#include "SharedDefines.h"
#include "Util.h"
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
index 255900b5414..04614d65ded 100644
--- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
@@ -23,7 +23,6 @@
#include "Database/DatabaseEnv.h"
#include "SpellMgr.h"
#include "SpellInfo.h"
-#include "DBCStores.h"
void CharacterDatabaseCleaner::CleanDatabase()
{
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 61e1755b4e4..28dabaefeb6 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -41,6 +41,7 @@
#include "DatabaseEnv.h"
#include "DisableMgr.h"
#include "GameEventMgr.h"
+#include "GameTables.h"
#include "GarrisonMgr.h"
#include "GridNotifiersImpl.h"
#include "GroupMgr.h"
@@ -1468,7 +1469,7 @@ void World::SetInitialWorldSettings()
///- Initialize VMapManager function pointers (to untangle game/collision circular deps)
if (VMAP::VMapManager2* vmmgr2 = dynamic_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager()))
{
- vmmgr2->GetLiquidFlagsPtr = &GetLiquidFlags;
+ vmmgr2->GetLiquidFlagsPtr = &DB2Manager::GetLiquidFlags;
vmmgr2->IsVMAPDisabledForPtr = &DisableMgr::IsVMAPDisabledFor;
}
@@ -1518,8 +1519,6 @@ void World::SetInitialWorldSettings()
LoginDatabase.PExecute("UPDATE realmlist SET icon = %u, timezone = %u WHERE id = '%d'", server_type, realm_zone, realm.Id.Realm); // One-time query
TC_LOG_INFO("server.loading", "Initialize data stores...");
- ///- Load DBCs
- LoadDBCStores(m_dataPath, m_defaultDbcLocale);
///- Load DB2s
sDB2Manager.LoadStores(m_dataPath, m_defaultDbcLocale);
TC_LOG_INFO("misc", "Loading hotfix info...");
@@ -1527,7 +1526,7 @@ void World::SetInitialWorldSettings()
///- Close hotfix database - it is only used during DB2 loading
HotfixDatabase.Close();
///- Load GameTables
- LoadGameTables(m_dataPath, m_defaultDbcLocale);
+ LoadGameTables(m_dataPath);
//Load weighted graph on taxi nodes path
sTaxiPathGraph.Initialize();
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp
index f9aca4b607b..b482716e059 100644
--- a/src/server/scripts/Commands/cs_character.cpp
+++ b/src/server/scripts/Commands/cs_character.cpp
@@ -559,7 +559,7 @@ public:
{
FactionState const& faction = itr->second;
FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction.ID);
- char const* factionName = factionEntry ? factionEntry->Name_lang : "#Not found#";
+ char const* factionName = factionEntry ? factionEntry->Name->Str[loc] : "#Not found#";
ReputationRank rank = target->GetReputationMgr().GetRank(factionEntry);
std::string rankName = handler->GetTrinityString(ReputationRankStrIndex[rank]);
std::ostringstream ss;
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 59eb97d1476..245aa60b846 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -1540,11 +1540,11 @@ public:
if (difficulty == -1)
for (uint8 diff = 0; diff < MAX_DIFFICULTY; ++diff)
{
- if (GetMapDifficultyData(mEntry->ID, Difficulty(diff)))
- sInstanceSaveMgr->ForceGlobalReset(mEntry->ID, Difficulty(diff));
+ if (sDB2Manager.GetMapDifficultyData(map, Difficulty(diff)))
+ sInstanceSaveMgr->ForceGlobalReset(map, Difficulty(diff));
}
else
- sInstanceSaveMgr->ForceGlobalReset(mEntry->ID, Difficulty(difficulty));
+ sInstanceSaveMgr->ForceGlobalReset(map, Difficulty(difficulty));
return true;
}
};
diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index dd048ce3c57..05b6a5c9713 100644
--- a/src/server/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
@@ -509,7 +509,7 @@ public:
return false;
}
- Zone2MapCoordinates(x, y, areaEntry->ParentAreaID ? uint32(areaEntry->ParentAreaID) : areaId);
+ sDB2Manager.Zone2MapCoordinates(areaEntry->ParentAreaID ? uint32(areaEntry->ParentAreaID) : areaId, x, y);
if (!MapManager::IsValidMapCoord(zoneEntry->MapID, x, y))
{
diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp
index 2b3752c00be..01844aa937e 100644
--- a/src/server/scripts/Commands/cs_lookup.cpp
+++ b/src/server/scripts/Commands/cs_lookup.cpp
@@ -309,58 +309,77 @@ public:
for (uint32 id = 0; id < sFactionStore.GetNumRows(); ++id)
{
- if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(id))
+ FactionEntry const* factionEntry = sFactionStore.LookupEntry(id);
+ if (factionEntry)
{
FactionState const* factionState = target ? target->GetReputationMgr().GetState(factionEntry) : NULL;
- std::string name = factionEntry->Name_lang;
+ int locale = handler->GetSessionDbcLocale();
+ std::string name = factionEntry->Name->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;
- // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format
- // or "id - [faction] [no reputation]" format
- std::ostringstream ss;
- if (handler->GetSession())
- ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << "]|h|r";
- else
- ss << id << " - " << name;
+ name = factionEntry->Name->Str[locale];
+ if (name.empty())
+ continue;
- if (factionState) // and then target != NULL also
- {
- uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry);
- std::string rankName = handler->GetTrinityString(index);
-
- ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')';
-
- if (factionState->Flags & FACTION_FLAG_VISIBLE)
- ss << handler->GetTrinityString(LANG_FACTION_VISIBLE);
- if (factionState->Flags & FACTION_FLAG_AT_WAR)
- ss << handler->GetTrinityString(LANG_FACTION_ATWAR);
- if (factionState->Flags & FACTION_FLAG_PEACE_FORCED)
- ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED);
- if (factionState->Flags & FACTION_FLAG_HIDDEN)
- ss << handler->GetTrinityString(LANG_FACTION_HIDDEN);
- if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED)
- ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED);
- if (factionState->Flags & FACTION_FLAG_INACTIVE)
- ss << handler->GetTrinityString(LANG_FACTION_INACTIVE);
+ if (Utf8FitTo(name, wNamePart))
+ break;
+ }
}
- else
- ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION);
- handler->SendSysMessage(ss.str().c_str());
+ if (locale < TOTAL_LOCALES)
+ {
+ if (maxResults && count++ == maxResults)
+ {
+ handler->PSendSysMessage(LANG_COMMAND_LOOKUP_MAX_RESULTS, maxResults);
+ return true;
+ }
- if (!found)
- found = true;
+ // send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format
+ // or "id - [faction] [no reputation]" format
+ std::ostringstream ss;
+ if (handler->GetSession())
+ ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << ' ' << localeNames[locale] << "]|h|r";
+ else
+ ss << id << " - " << name << ' ' << localeNames[locale];
+
+ if (factionState) // and then target != NULL also
+ {
+ uint32 index = target->GetReputationMgr().GetReputationRankStrIndex(factionEntry);
+ std::string rankName = handler->GetTrinityString(index);
+
+ ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')';
+
+ if (factionState->Flags & FACTION_FLAG_VISIBLE)
+ ss << handler->GetTrinityString(LANG_FACTION_VISIBLE);
+ if (factionState->Flags & FACTION_FLAG_AT_WAR)
+ ss << handler->GetTrinityString(LANG_FACTION_ATWAR);
+ if (factionState->Flags & FACTION_FLAG_PEACE_FORCED)
+ ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED);
+ if (factionState->Flags & FACTION_FLAG_HIDDEN)
+ ss << handler->GetTrinityString(LANG_FACTION_HIDDEN);
+ if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED)
+ ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED);
+ if (factionState->Flags & FACTION_FLAG_INACTIVE)
+ ss << handler->GetTrinityString(LANG_FACTION_INACTIVE);
+ }
+ else
+ ss << handler->GetTrinityString(LANG_FACTION_NOREPUTATION);
+
+ handler->SendSysMessage(ss.str().c_str());
+
+ if (!found)
+ found = true;
+ }
}
}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index d66a6d24cc2..236197b84c9 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -207,7 +207,7 @@ public:
float zoneX = object->GetPositionX();
float zoneY = object->GetPositionY();
- Map2ZoneCoordinates(zoneX, zoneY, zoneId);
+ sDB2Manager.Map2ZoneCoordinates(zoneId, zoneX, zoneY);
Map const* map = object->GetMap();
float groundZ = map->GetHeight(object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), MAX_HEIGHT);
@@ -1168,10 +1168,10 @@ public:
if (itemNameStr && itemNameStr[0])
{
std::string itemName = itemNameStr+1;
- auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](std::pair<uint32, ItemSparseEntry const*> kv)
+ auto itr = std::find_if(sItemSparseStore.begin(), sItemSparseStore.end(), [&itemName](ItemSparseEntry const* sparse)
{
for (uint32 i = 0; i < MAX_LOCALES; ++i)
- if (itemName == kv.second->Name->Str[i])
+ if (itemName == sparse->Name->Str[i])
return true;
return false;
});
@@ -1183,7 +1183,7 @@ public:
return false;
}
- itemId = itr->first;
+ itemId = itr->ID;
}
else
return false;
@@ -1795,7 +1795,7 @@ public:
// Output XI. LANG_PINFO_CHR_RACE
raceStr = DB2Manager::GetChrRaceName(raceid, locale);
- classStr = GetClassName(classid, locale);
+ classStr = DB2Manager::GetClassName(classid, locale);
handler->PSendSysMessage(LANG_PINFO_CHR_RACE, (gender == 0 ? handler->GetTrinityString(LANG_CHARACTER_GENDER_MALE) : handler->GetTrinityString(LANG_CHARACTER_GENDER_FEMALE)), raceStr.c_str(), classStr.c_str());
// Output XII. LANG_PINFO_CHR_ALIVE
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index 47f1212f80a..435c3c74231 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1008,14 +1008,14 @@ public:
if (factionEntry->ReputationIndex < 0)
{
- handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->Name_lang, factionId);
+ handler->PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->Name->Str[handler->GetSessionDbcLocale()], factionId);
handler->SetSentErrorMessage(true);
return false;
}
target->GetReputationMgr().SetOneFactionReputation(factionEntry, amount, false);
target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry));
- handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->Name_lang, factionId,
+ handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->Name->Str[handler->GetSessionDbcLocale()], factionId,
handler->GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry));
return true;
}
diff --git a/src/server/scripts/ScriptPCH.h b/src/server/scripts/ScriptPCH.h
index 1cd25309055..cf31742f830 100644
--- a/src/server/scripts/ScriptPCH.h
+++ b/src/server/scripts/ScriptPCH.h
@@ -19,8 +19,7 @@
#include "CombatAI.h"
#include "PassiveAI.h"
#include "Chat.h"
-#include "DBCStructure.h"
-#include "DBCStores.h"
+#include "DB2Stores.h"
#include "ObjectMgr.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 7dcd3a4fbb9..6619a108009 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -29,7 +29,6 @@
#include "SpellHistory.h"
#include "SkillDiscovery.h"
#include "Battleground.h"
-#include "DBCStores.h"
// Generic script for handling item dummy effects which trigger another spell.
class spell_item_trigger_spell : public SpellScriptLoader
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index a13d6da8fae..31c20ccece9 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -745,6 +745,8 @@ class spell_mage_living_bomb : public SpellScriptLoader
bool Validate(SpellInfo const* spellInfo) override
{
+ if (!spellInfo->GetEffect(EFFECT_1))
+ return false;
if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->GetEffect(EFFECT_1)->CalcValue())))
return false;
return true;
diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp
index 7852043a796..a56001cfe6a 100644
--- a/src/server/scripts/Spells/spell_pet.cpp
+++ b/src/server/scripts/Spells/spell_pet.cpp
@@ -107,9 +107,7 @@ class spell_gen_pet_calculate : public SpellScriptLoader
if (Player* owner = GetCaster()->GetOwner()->ToPlayer())
{
// For others recalculate it from:
- float CritSpell = 0.0f;
- // Crit from Intellect
- CritSpell += owner->GetSpellCritFromIntellect();
+ float CritSpell = 5.0f;
// Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
CritSpell += owner->GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE);
// Increase crit from SPELL_AURA_MOD_CRIT_PCT
@@ -126,9 +124,7 @@ class spell_gen_pet_calculate : public SpellScriptLoader
if (Player* owner = GetCaster()->GetOwner()->ToPlayer())
{
// For others recalculate it from:
- float CritMelee = 0.0f;
- // Crit from Agility
- CritMelee += owner->GetMeleeCritFromAgility();
+ float CritMelee = 5.0f;
// Increase crit from SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
CritMelee += owner->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT);
// Increase crit from SPELL_AURA_MOD_CRIT_PCT
@@ -676,9 +672,7 @@ public:
if (Player* owner = GetCaster()->GetOwner()->ToPlayer())
{
// For others recalculate it from:
- float CritSpell = 0.0f;
- // Crit from Intellect
- CritSpell += owner->GetSpellCritFromIntellect();
+ float CritSpell = 5.0f;
// Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
CritSpell += owner->GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE);
// Increase crit from SPELL_AURA_MOD_CRIT_PCT
@@ -698,9 +692,7 @@ public:
if (Player* owner = GetCaster()->GetOwner()->ToPlayer())
{
// For others recalculate it from:
- float CritMelee = 0.0f;
- // Crit from Agility
- CritMelee += owner->GetMeleeCritFromAgility();
+ float CritMelee = 5.0f;
// Increase crit from SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
CritMelee += owner->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT);
// Increase crit from SPELL_AURA_MOD_CRIT_PCT
@@ -1266,9 +1258,7 @@ public:
if (GetCaster()->GetOwner()->ToPlayer())
{
// For others recalculate it from:
- float CritSpell = 0.0f;
- // Crit from Intellect
- // CritSpell += owner->GetSpellCritFromIntellect();
+ float CritSpell = 5.0f;
// Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
// CritSpell += owner->GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_CRIT_CHANCE);
// Increase crit from SPELL_AURA_MOD_CRIT_PCT
@@ -1287,9 +1277,7 @@ public:
if (GetCaster()->GetOwner()->ToPlayer())
{
// For others recalculate it from:
- float CritMelee = 0.0f;
- // Crit from Agility
- // CritMelee += owner->GetMeleeCritFromAgility();
+ float CritMelee = 5.0f;
// Increase crit from SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
// CritMelee += owner->GetTotalAuraModifier(SPELL_AURA_MOD_WEAPON_CRIT_PERCENT);
// Increase crit from SPELL_AURA_MOD_CRIT_PCT
diff --git a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp
index 42914b4da17..2d5c11b9d5d 100644
--- a/src/server/shared/DataStores/DB2SparseStorageLoader.cpp
+++ b/src/server/shared/DataStores/DB2SparseStorageLoader.cpp
@@ -17,7 +17,7 @@
#include "Common.h"
#include "DB2SparseStorageLoader.h"
-#include "Database/DatabaseEnv.h"
+#include "DatabaseEnv.h"
#include "Log.h"
DB2SparseFileLoader::DB2SparseFileLoader()
@@ -201,6 +201,7 @@ uint32 DB2SparseFileLoader::GetFormatRecordSize(const char * format)
{
case FT_FLOAT:
case FT_INT:
+ case FT_SORT:
recordsize += 4;
break;
case FT_STRING:
@@ -247,7 +248,7 @@ static char const* const nullStr = "";
char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const& indexTable, uint32 locale, std::vector<char*>& stringPool)
{
typedef char* ptr;
- if (strlen(format) != fieldCount)
+ if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0))
return NULL;
//get struct size and index pos
@@ -283,8 +284,8 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const&
for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i)
((char const**)stringHoldersPool)[i] = nullStr;
- char* stringTable = new char[expandedDataSize - records * (recordsize - stringFields * sizeof(char*))];
- memset(stringTable, 0, expandedDataSize - records * (recordsize - stringFields * sizeof(char*)));
+ char* stringTable = new char[expandedDataSize - records * ((recordsize - (format[0] == FT_SORT ? 4 : 0)) - stringFields * sizeof(char*))];
+ memset(stringTable, 0, expandedDataSize - records * ((recordsize - (format[0] == FT_SORT ? 4 : 0)) - stringFields * sizeof(char*)));
stringPool.push_back(stringTable);
char* stringPtr = stringTable;
@@ -298,7 +299,7 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const&
indexTable.Insert(y + minIndex, &dataTable[offset]);
uint32 fieldOffset = 0;
uint32 stringFieldOffset = 0;
- for (uint32 x = 0; x < fieldCount; x++)
+ for (uint32 x = 0; x < (fieldCount + (format[0] == FT_SORT ? 1 : 0)); x++)
{
switch (format[x])
{
@@ -352,6 +353,10 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const&
offset += sizeof(char*);
break;
}
+ case FT_SORT:
+ *((uint32*)(&dataTable[offset])) = y + minIndex;
+ offset += 4;
+ break;
}
}
@@ -363,7 +368,7 @@ char* DB2SparseFileLoader::AutoProduceData(const char* format, IndexTable const&
char* DB2SparseFileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale)
{
- if (strlen(format) != fieldCount)
+ if (strlen(format) != fieldCount + (format[0] == FT_SORT ? 1 : 0))
return nullptr;
if (!(localeMask & (1 << locale)))
@@ -513,6 +518,7 @@ char* DB2SparseDatabaseLoader::Load(const char* format, HotfixDatabaseStatements
break;
case FT_IND:
case FT_INT:
+ case FT_SORT:
*((int32*)(&dataValue[offset])) = fields[f].GetInt32();
offset += 4;
break;
@@ -617,6 +623,7 @@ void DB2SparseDatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStat
case FT_FLOAT:
case FT_IND:
case FT_INT:
+ case FT_SORT:
offset += 4;
break;
case FT_BYTE:
diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp
index d101d12a52e..56a8dbbed65 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.cpp
+++ b/src/server/shared/DataStores/DB2StorageLoader.cpp
@@ -253,8 +253,6 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos)
recordsize += sizeof(char*);
break;
case FT_SORT:
- i = x;
- break;
case FT_IND:
i = x;
recordsize += 4;
@@ -322,7 +320,6 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char**
}
else
{
- ASSERT(indexField == 0);
for (uint32 y = 0; y < recordCount; ++y)
{
uint32 ind = ((uint32*)idTable)[y];
@@ -353,48 +350,51 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char**
uint32 offset = 0;
- if (idTableSize)
- {
- ASSERT(format[0] == 'd');
- ++format;
- }
-
for (uint32 y = 0; y < recordCount; y++)
{
+ uint32 indexVal;
if (indexField >= 0)
- indexTable[!idTableSize ? getRecord(y).getUInt(indexField) : ((uint32*)idTable)[y]] = &dataTable[offset];
+ indexVal = !idTableSize ? getRecord(y).getUInt(indexField) : ((uint32*)idTable)[y];
else
- indexTable[y] = &dataTable[offset];
+ indexVal = y;
- for (uint32 x = 0; x < fieldCount; x++)
+ indexTable[indexVal] = &dataTable[offset];
+
+ uint32 x = 0;
+ for (char const* fmt = format; *fmt != '\0'; ++fmt)
{
- switch (format[x])
+ switch (*fmt)
{
case FT_FLOAT:
- *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x);
+ *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x++);
offset += 4;
break;
case FT_IND:
case FT_INT:
- *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x);
+ *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x++);
offset += 4;
break;
case FT_BYTE:
- *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x);
+ *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x++);
offset += 1;
break;
case FT_LONG:
- *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x);
+ *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x++);
offset += 8;
break;
case FT_SHORT:
- *((uint16*)(&dataTable[offset])) = getRecord(y).getUInt16(x);
+ *((uint16*)(&dataTable[offset])) = getRecord(y).getUInt16(x++);
offset += 2;
break;
case FT_STRING:
case FT_STRING_NOT_LOCALIZED:
*((char**)(&dataTable[offset])) = nullptr; // will be replaces non-empty or "" strings in AutoProduceStrings
offset += sizeof(char*);
+ ++x;
+ break;
+ case FT_SORT:
+ *((uint32*)(&dataTable[offset])) = indexVal;
+ offset += 4;
break;
}
}
@@ -444,21 +444,19 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da
uint32 offset = 0;
- if (idTableSize)
- ++format;
-
// assign string holders to string field slots
for (uint32 y = 0; y < recordCount; y++)
{
uint32 stringFieldOffset = 0;
- for (uint32 x = 0; x < fieldCount; x++)
+ for (char const* fmt = format; *fmt != '\0'; ++fmt)
{
- switch (format[x])
+ switch (*fmt)
{
case FT_FLOAT:
case FT_IND:
case FT_INT:
+ case FT_SORT:
offset += 4;
break;
case FT_BYTE:
@@ -476,7 +474,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da
// init db2 string field slots by pointers to string holders
char const*** slot = (char const***)(&dataTable[offset]);
*slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]);
- if (format[x] == FT_STRING)
+ if (*fmt == FT_STRING)
stringFieldOffset += stringHolderSize;
else
++stringFieldOffset;
@@ -485,7 +483,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da
break;
}
default:
- ASSERT(false, "unknown format character %c", format[x]);
+ ASSERT(false, "unknown format character %c", *fmt);
}
}
}
@@ -521,18 +519,17 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin
uint32 offset = 0;
- if (idTableSize)
- ++format;
-
for (uint32 y = 0; y < recordCount; y++)
{
- for (uint32 x = 0; x < fieldCount; x++)
+ uint32 x = 0;
+ for (char const* fmt = format; *fmt != '\0'; ++fmt)
{
- switch (format[x])
+ switch (*fmt)
{
case FT_FLOAT:
case FT_IND:
case FT_INT:
+ case FT_SORT:
offset += 4;
break;
case FT_BYTE:
@@ -566,6 +563,9 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin
break;
}
}
+
+ if (*fmt != FT_SORT)
+ ++x;
}
}
@@ -705,6 +705,10 @@ char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements prepa
offset += sizeof(char*);
break;
}
+ case FT_SORT:
+ *((int32*)(&dataValue[offset])) = indexValue;
+ offset += 4;
+ break;
}
}
@@ -769,6 +773,7 @@ void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements
case FT_FLOAT:
case FT_IND:
case FT_INT:
+ case FT_SORT:
offset += 4;
break;
case FT_BYTE:
diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h
index d1542faa194..e1c05cfbbe7 100644
--- a/src/server/shared/DataStores/DB2Store.h
+++ b/src/server/shared/DataStores/DB2Store.h
@@ -245,8 +245,8 @@ public:
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; }
+ T const* operator->() const { return Base::operator->()->second; }
+ T const* operator*() const { return Base::operator*().second; }
} iterator;
DB2SparseStorage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex)
diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp
deleted file mode 100644
index ace59bb9ebb..00000000000
--- a/src/server/shared/DataStores/DBCFileLoader.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "DBCFileLoader.h"
-#include "Errors.h"
-
-DBCFileLoader::DBCFileLoader() : recordSize(0), recordCount(0), fieldCount(0), stringSize(0), fieldsOffset(NULL), data(NULL), stringTable(NULL) { }
-
-bool DBCFileLoader::Load(const char* filename, const char* fmt)
-{
- uint32 header;
- if (data)
- {
- delete [] data;
- data = NULL;
- }
-
- FILE* f = fopen(filename, "rb");
- if (!f)
- return false;
-
- if (fread(&header, 4, 1, f) != 1) // Number of records
- {
- fclose(f);
- return false;
- }
-
-
- EndianConvert(header);
-
- if (header != 0x43424457) //'WDBC'
- {
- fclose(f);
- return false;
- }
-
- if (fread(&recordCount, 4, 1, f) != 1) // Number of records
- {
- fclose(f);
- return false;
- }
-
- EndianConvert(recordCount);
-
- if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields
- {
- fclose(f);
- return false;
- }
-
- EndianConvert(fieldCount);
-
- if (fread(&recordSize, 4, 1, f) != 1) // Size of a record
- {
- fclose(f);
- return false;
- }
-
- EndianConvert(recordSize);
-
- if (fread(&stringSize, 4, 1, f) != 1) // String size
- {
- fclose(f);
- return false;
- }
-
- EndianConvert(stringSize);
-
- fieldsOffset = new uint32[fieldCount];
- fieldsOffset[0] = 0;
- for (uint32 i = 1; i < fieldCount; ++i)
- {
- fieldsOffset[i] = fieldsOffset[i - 1];
- if (fmt[i - 1] == FT_BYTE || fmt[i - 1] == FT_NA_BYTE) // byte fields
- fieldsOffset[i] += sizeof(uint8);
- else if (fmt[i - 1] == FT_LONG)
- fieldsOffset[i] += sizeof(uint64);
- else // 4 byte fields (int32/float/strings)
- fieldsOffset[i] += sizeof(uint32);
- }
-
- data = new unsigned char[recordSize * recordCount + stringSize];
- stringTable = data + recordSize*recordCount;
-
- if (fread(data, recordSize * recordCount + stringSize, 1, f) != 1)
- {
- fclose(f);
- return false;
- }
-
- fclose(f);
-
- return true;
-}
-
-DBCFileLoader::~DBCFileLoader()
-{
- delete[] data;
-
- delete[] fieldsOffset;
-}
-
-DBCFileLoader::Record DBCFileLoader::getRecord(size_t id)
-{
- assert(data);
- return Record(*this, data + id * recordSize);
-}
-
-uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos)
-{
- uint32 recordsize = 0;
- int32 i = -1;
- for (uint32 x = 0; format[x]; ++x)
- {
- switch (format[x])
- {
- case FT_FLOAT:
- recordsize += sizeof(float);
- break;
- case FT_INT:
- recordsize += sizeof(uint32);
- break;
- case FT_STRING:
- recordsize += sizeof(char*);
- break;
- case FT_SORT:
- i = x;
- break;
- case FT_IND:
- i = x;
- recordsize += sizeof(uint32);
- break;
- case FT_BYTE:
- recordsize += sizeof(uint8);
- break;
- case FT_LONG:
- recordsize += sizeof(uint64);
- break;
- case FT_NA:
- case FT_NA_BYTE:
- break;
- default:
- ASSERT(false && "Unknown field format character in DBCfmt.h");
- break;
- }
- }
-
- if (index_pos)
- *index_pos = i;
-
- return recordsize;
-}
-
-char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char*& sqlDataTable)
-{
- typedef char* ptr;
- if (strlen(format) != fieldCount)
- return NULL;
-
- //get struct size and index pos
- int32 i;
- uint32 recordsize = GetFormatRecordSize(format, &i);
-
- if (i >= 0)
- {
- uint32 maxi = 0;
- //find max index
- for (uint32 y = 0; y < recordCount; ++y)
- {
- uint32 ind = getRecord(y).getUInt(i);
- if (ind > maxi)
- maxi = ind;
- }
-
- // If higher index avalible from sql - use it instead of dbcs
- if (sqlHighestIndex > maxi)
- maxi = sqlHighestIndex;
-
- ++maxi;
- records = maxi;
- indexTable = new ptr[maxi];
- memset(indexTable, 0, maxi * sizeof(ptr));
- }
- else
- {
- records = recordCount + sqlRecordCount;
- indexTable = new ptr[recordCount + sqlRecordCount];
- }
-
- char* dataTable = new char[(recordCount + sqlRecordCount) * recordsize];
-
- uint32 offset = 0;
-
- for (uint32 y = 0; y < recordCount; ++y)
- {
- if (i >= 0)
- indexTable[getRecord(y).getUInt(i)] = &dataTable[offset];
- else
- indexTable[y] = &dataTable[offset];
-
- for (uint32 x=0; x < fieldCount; ++x)
- {
- switch (format[x])
- {
- case FT_FLOAT:
- *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x);
- offset += sizeof(float);
- break;
- case FT_IND:
- case FT_INT:
- *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x);
- offset += sizeof(uint32);
- break;
- case FT_BYTE:
- *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x);
- offset += sizeof(uint8);
- break;
- case FT_LONG:
- *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x);
- offset += sizeof(uint64);
- break;
- case FT_STRING:
- *((char**)(&dataTable[offset])) = NULL; // will replace non-empty or "" strings in AutoProduceStrings
- offset += sizeof(char*);
- break;
- case FT_NA:
- case FT_NA_BYTE:
- case FT_SORT:
- break;
- default:
- ASSERT(false && "Unknown field format character in DBCfmt.h");
- break;
- }
- }
- }
-
- sqlDataTable = dataTable + offset;
-
- return dataTable;
-}
-
-char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable)
-{
- if (strlen(format) != fieldCount)
- return NULL;
-
- char* stringPool = new char[stringSize];
- memcpy(stringPool, stringTable, stringSize);
-
- uint32 offset = 0;
-
- for (uint32 y = 0; y < recordCount; ++y)
- {
- for (uint32 x = 0; x < fieldCount; ++x)
- {
- switch (format[x])
- {
- case FT_FLOAT:
- offset += sizeof(float);
- break;
- case FT_IND:
- case FT_INT:
- offset += sizeof(uint32);
- break;
- case FT_BYTE:
- offset += sizeof(uint8);
- break;
- case FT_LONG:
- offset += sizeof(uint64);
- break;
- case FT_STRING:
- {
- // fill only not filled entries
- char** slot = (char**)(&dataTable[offset]);
- if (!*slot || !**slot)
- {
- const char * st = getRecord(y).getString(x);
- *slot=stringPool+(st-(const char*)stringTable);
- }
- offset += sizeof(char*);
- break;
- }
- case FT_NA:
- case FT_NA_BYTE:
- case FT_SORT:
- break;
- default:
- ASSERT(false && "Unknown field format character in DBCfmt.h");
- break;
- }
- }
- }
-
- return stringPool;
-}
diff --git a/src/server/shared/DataStores/DBCFileLoader.h b/src/server/shared/DataStores/DBCFileLoader.h
deleted file mode 100644
index e58031e6ccc..00000000000
--- a/src/server/shared/DataStores/DBCFileLoader.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef DBC_FILE_LOADER_H
-#define DBC_FILE_LOADER_H
-
-#include "Define.h"
-#include "Utilities/ByteConverter.h"
-#include <cassert>
-
-class TC_SHARED_API DBCFileLoader
-{
- public:
- DBCFileLoader();
- ~DBCFileLoader();
-
- bool Load(const char *filename, const char *fmt);
-
- class Record
- {
- public:
- float getFloat(size_t field) const
- {
- assert(field < file.fieldCount);
- float val = *reinterpret_cast<float*>(offset + file.GetOffset(field));
- EndianConvert(val);
- return val;
- }
- uint32 getUInt(size_t field) const
- {
- assert(field < file.fieldCount);
- uint32 val = *reinterpret_cast<uint32*>(offset + file.GetOffset(field));
- EndianConvert(val);
- return val;
- }
- uint8 getUInt8(size_t field) const
- {
- assert(field < file.fieldCount);
- return *reinterpret_cast<uint8*>(offset + file.GetOffset(field));
- }
- uint64 getUInt64(size_t field) const
- {
- assert(field < file.fieldCount);
- uint64 val = *reinterpret_cast<uint64*>(offset + file.GetOffset(field));
- EndianConvert(val);
- return val;
- }
- const char *getString(size_t field) const
- {
- assert(field < file.fieldCount);
- size_t stringOffset = getUInt(field);
- assert(stringOffset < file.stringSize);
- return reinterpret_cast<char*>(file.stringTable + stringOffset);
- }
-
- private:
- Record(DBCFileLoader &file_, unsigned char *offset_): offset(offset_), file(file_) { }
- unsigned char* offset;
- DBCFileLoader& file;
-
- friend class DBCFileLoader;
-
- };
-
- // Get record by id
- Record getRecord(size_t id);
- /// Get begin iterator over records
-
- uint32 GetNumRows() const { return recordCount; }
- uint32 GetRowSize() const { return recordSize; }
- uint32 GetCols() const { return fieldCount; }
- uint32 GetOffset(size_t id) const { return (fieldsOffset != NULL && id < fieldCount) ? fieldsOffset[id] : 0; }
- bool IsLoaded() const { return data != NULL; }
- char* AutoProduceData(const char* fmt, uint32& count, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char *& sqlDataTable);
- char* AutoProduceStrings(const char* fmt, char* dataTable);
- static uint32 GetFormatRecordSize(const char * format, int32 * index_pos = NULL);
- private:
-
- uint32 recordSize;
- uint32 recordCount;
- uint32 fieldCount;
- uint32 stringSize;
- uint32 *fieldsOffset;
- unsigned char *data;
- unsigned char *stringTable;
-
- DBCFileLoader(DBCFileLoader const& right) = delete;
- DBCFileLoader& operator=(DBCFileLoader const& right) = delete;
-};
-#endif
diff --git a/src/server/shared/DataStores/DBCStore.h b/src/server/shared/DataStores/DBCStore.h
deleted file mode 100644
index c53d2a563fe..00000000000
--- a/src/server/shared/DataStores/DBCStore.h
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef DBCSTORE_H
-#define DBCSTORE_H
-
-#include "DBCFileLoader.h"
-#include "DBStorageIterator.h"
-#include "Log.h"
-#include "Field.h"
-#include "DatabaseWorkerPool.h"
-#include "Implementation/WorldDatabase.h"
-#include "DatabaseEnv.h"
-
-struct SqlDbc
-{
- std::string const* formatString;
- std::string const* indexName;
- std::string sqlTableName;
- int32 indexPos;
- int32 sqlIndexPos;
- SqlDbc(std::string const* _filename, std::string const* _format, std::string const* _idname, char const* fmt)
- : formatString(_format), indexName (_idname), sqlIndexPos(0)
- {
- // Convert dbc file name to sql table name
- sqlTableName = *_filename;
- for (uint32 i = 0; i< sqlTableName.size(); ++i)
- {
- if (isalpha(sqlTableName[i]))
- sqlTableName[i] = char(tolower(sqlTableName[i]));
- else if (sqlTableName[i] == '.')
- sqlTableName[i] = '_';
- }
-
- // Get sql index position
- DBCFileLoader::GetFormatRecordSize(fmt, &indexPos);
- if (indexPos >= 0)
- {
- uint32 uindexPos = uint32(indexPos);
- for (uint32 x = 0; x < formatString->size(); ++x)
- {
- // Count only fields present in sql
- if ((*formatString)[x] == FT_SQL_PRESENT)
- {
- if (x == uindexPos)
- break;
- ++sqlIndexPos;
- }
- }
- }
- }
-
-private:
- SqlDbc(SqlDbc const& right) = delete;
- SqlDbc& operator=(SqlDbc const& right) = delete;
-};
-
-template<class T>
-class DBCStorage
-{
- typedef std::list<char*> StringPoolList;
-
- public:
- typedef DBStorageIterator<T> iterator;
-
- explicit DBCStorage(char const* f)
- : fmt(f), nCount(0), fieldCount(0), dataTable(NULL)
- {
- indexTable.asT = NULL;
- }
-
- ~DBCStorage() { Clear(); }
-
- T const* LookupEntry(uint32 id) const
- {
- return (id >= nCount) ? NULL : indexTable.asT[id];
- }
-
- T const* AssertEntry(uint32 id) const
- {
- T const* entry = LookupEntry(id);
- ASSERT(entry);
- return entry;
- }
-
- uint32 GetNumRows() const { return nCount; }
- char const* GetFormat() const { return fmt; }
- uint32 GetFieldCount() const { return fieldCount; }
-
- bool Load(char const* fn, SqlDbc* sql)
- {
- DBCFileLoader dbc;
- // Check if load was successful, only then continue
- if (!dbc.Load(fn, fmt))
- return false;
-
- uint32 sqlRecordCount = 0;
- uint32 sqlHighestIndex = 0;
- Field* fields = NULL;
- QueryResult result = QueryResult(NULL);
- // Load data from sql
- if (sql)
- {
- std::string query = "SELECT * FROM " + sql->sqlTableName;
- if (sql->indexPos >= 0)
- query +=" ORDER BY " + *sql->indexName + " DESC";
- query += ';';
-
-
- result = WorldDatabase.Query(query.c_str());
- if (result)
- {
- sqlRecordCount = uint32(result->GetRowCount());
- if (sql->indexPos >= 0)
- {
- fields = result->Fetch();
- sqlHighestIndex = fields[sql->sqlIndexPos].GetUInt32();
- }
-
- // Check if sql index pos is valid
- if (int32(result->GetFieldCount() - 1) < sql->sqlIndexPos)
- {
- TC_LOG_ERROR("server.loading", "Invalid index pos for dbc:'%s'", sql->sqlTableName.c_str());
- return false;
- }
- }
- }
-
- char* sqlDataTable = NULL;
- fieldCount = dbc.GetCols();
-
- dataTable = reinterpret_cast<T*>(dbc.AutoProduceData(fmt, nCount, indexTable.asChar,
- sqlRecordCount, sqlHighestIndex, sqlDataTable));
-
- stringPoolList.push_back(dbc.AutoProduceStrings(fmt, reinterpret_cast<char*>(dataTable)));
-
- // Insert sql data into arrays
- if (result)
- {
- if (indexTable.asT)
- {
- uint32 offset = 0;
- uint32 rowIndex = dbc.GetNumRows();
- do
- {
- if (!fields)
- fields = result->Fetch();
-
- if (sql->indexPos >= 0)
- {
- uint32 id = fields[sql->sqlIndexPos].GetUInt32();
- if (indexTable.asT[id])
- {
- TC_LOG_ERROR("server.loading", "Index %d already exists in dbc:'%s'", id, sql->sqlTableName.c_str());
- return false;
- }
-
- indexTable.asT[id] = reinterpret_cast<T*>(&sqlDataTable[offset]);
- }
- else
- indexTable.asT[rowIndex]= reinterpret_cast<T*>(&sqlDataTable[offset]);
-
- uint32 columnNumber = 0;
- uint32 sqlColumnNumber = 0;
-
- for (; columnNumber < sql->formatString->size(); ++columnNumber)
- {
- if ((*sql->formatString)[columnNumber] == FT_SQL_ABSENT)
- {
- switch (fmt[columnNumber])
- {
- case FT_FLOAT:
- *reinterpret_cast<float*>(&sqlDataTable[offset]) = 0.0f;
- offset += 4;
- break;
- case FT_IND:
- case FT_INT:
- *reinterpret_cast<uint32*>(&sqlDataTable[offset]) = uint32(0);
- offset += 4;
- break;
- case FT_BYTE:
- *reinterpret_cast<uint8*>(&sqlDataTable[offset]) = uint8(0);
- offset += 1;
- break;
- case FT_LONG:
- *reinterpret_cast<uint64*>(&sqlDataTable[offset]) = uint64(0);
- offset += 8;
- break;
- case FT_STRING:
- // Beginning of the pool - empty string
- *reinterpret_cast<char**>(&sqlDataTable[offset]) = stringPoolList.back();
- offset += sizeof(char*);
- break;
- }
- }
- else if ((*sql->formatString)[columnNumber] == FT_SQL_PRESENT)
- {
- bool validSqlColumn = true;
- switch (fmt[columnNumber])
- {
- case FT_FLOAT:
- *reinterpret_cast<float*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetFloat();
- offset += 4;
- break;
- case FT_IND:
- case FT_INT:
- *reinterpret_cast<uint32*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt32();
- offset += 4;
- break;
- case FT_BYTE:
- *reinterpret_cast<uint8*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt8();
- offset += 1;
- break;
- case FT_LONG:
- *reinterpret_cast<uint64*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt64();
- offset += 8;
- break;
- case FT_STRING:
- TC_LOG_ERROR("server.loading", "Unsupported data type in table '%s' at char %d", sql->sqlTableName.c_str(), columnNumber);
- return false;
- case FT_SORT:
- break;
- default:
- validSqlColumn = false;
- break;
- }
- if (validSqlColumn && (columnNumber != (sql->formatString->size()-1)))
- sqlColumnNumber++;
- }
- else
- {
- TC_LOG_ERROR("server.loading", "Incorrect sql format string '%s' at char %d", sql->sqlTableName.c_str(), columnNumber);
- return false;
- }
- }
-
- if (sqlColumnNumber != (result->GetFieldCount() - 1))
- {
- TC_LOG_ERROR("server.loading", "SQL and DBC format strings are not matching for table: '%s'", sql->sqlTableName.c_str());
- return false;
- }
-
- fields = NULL;
- ++rowIndex;
- } while (result->NextRow());
- }
- }
-
- // error in dbc file at loading if NULL
- return indexTable.asT != NULL;
- }
-
- bool LoadStringsFrom(char const* fn)
- {
- // DBC must be already loaded using Load
- if (!indexTable.asT)
- return false;
-
- DBCFileLoader dbc;
- // Check if load was successful, only then continue
- if (!dbc.Load(fn, fmt))
- return false;
-
- stringPoolList.push_back(dbc.AutoProduceStrings(fmt, reinterpret_cast<char*>(dataTable)));
-
- return true;
- }
-
- void Clear()
- {
- if (!indexTable.asT)
- return;
-
- delete[] reinterpret_cast<char*>(indexTable.asT);
- indexTable.asT = NULL;
- delete[] reinterpret_cast<char*>(dataTable);
- dataTable = NULL;
-
- while (!stringPoolList.empty())
- {
- delete[] stringPoolList.front();
- stringPoolList.pop_front();
- }
-
- nCount = 0;
- }
-
- iterator begin() { return iterator(indexTable.asT, nCount); }
- iterator end() { return iterator(indexTable.asT, nCount, nCount); }
-
- private:
- char const* fmt;
- uint32 nCount;
- uint32 fieldCount;
-
- union
- {
- T** asT;
- char** asChar;
- }
- indexTable;
-
- T* dataTable;
- StringPoolList stringPoolList;
-
- DBCStorage(DBCStorage const& right) = delete;
- DBCStorage& operator=(DBCStorage const& right) = delete;
-};
-
-#endif
diff --git a/src/server/shared/DataStores/DBStorageIterator.h b/src/server/shared/DataStores/DBStorageIterator.h
index 3f9fa6eed24..5568397b245 100644
--- a/src/server/shared/DataStores/DBStorageIterator.h
+++ b/src/server/shared/DataStores/DBStorageIterator.h
@@ -35,9 +35,6 @@ public:
}
}
- uint32 ID() const { return _pos; }
- T const* Data() const { return _index[_pos]; }
-
T const* operator->() { return _index[_pos]; }
T const* operator*() { return _index[_pos]; }