diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/common/CMakeLists.txt | 89 | ||||
-rw-r--r-- | src/common/Collision/BoundingIntervalHierarchy.cpp (renamed from src/server/collision/BoundingIntervalHierarchy.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/BoundingIntervalHierarchy.h (renamed from src/server/collision/BoundingIntervalHierarchy.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/BoundingIntervalHierarchyWrapper.h (renamed from src/server/collision/BoundingIntervalHierarchyWrapper.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/DynamicTree.cpp (renamed from src/server/collision/DynamicTree.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/DynamicTree.h (renamed from src/server/collision/DynamicTree.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Management/IVMapManager.h (renamed from src/server/collision/Management/IVMapManager.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Management/MMapFactory.cpp (renamed from src/server/collision/Management/MMapFactory.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/Management/MMapFactory.h (renamed from src/server/collision/Management/MMapFactory.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Management/MMapManager.cpp (renamed from src/server/collision/Management/MMapManager.cpp) | 95 | ||||
-rw-r--r-- | src/common/Collision/Management/MMapManager.h (renamed from src/server/collision/Management/MMapManager.h) | 19 | ||||
-rw-r--r-- | src/common/Collision/Management/VMapFactory.cpp (renamed from src/server/collision/Management/VMapFactory.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/Management/VMapFactory.h (renamed from src/server/collision/Management/VMapFactory.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Management/VMapManager2.cpp (renamed from src/server/collision/Management/VMapManager2.cpp) | 6 | ||||
-rw-r--r-- | src/common/Collision/Management/VMapManager2.h (renamed from src/server/collision/Management/VMapManager2.h) | 2 | ||||
-rw-r--r-- | src/common/Collision/Maps/MapDefines.h | 36 | ||||
-rw-r--r-- | src/common/Collision/Maps/MapTree.cpp (renamed from src/server/collision/Maps/MapTree.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/Maps/MapTree.h (renamed from src/server/collision/Maps/MapTree.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Maps/TileAssembler.cpp (renamed from src/server/collision/Maps/TileAssembler.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/Maps/TileAssembler.h (renamed from src/server/collision/Maps/TileAssembler.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Models/GameObjectModel.cpp (renamed from src/server/collision/Models/GameObjectModel.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/Models/GameObjectModel.h (renamed from src/server/collision/Models/GameObjectModel.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Models/ModelInstance.cpp (renamed from src/server/collision/Models/ModelInstance.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/Models/ModelInstance.h (renamed from src/server/collision/Models/ModelInstance.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/Models/WorldModel.cpp (renamed from src/server/collision/Models/WorldModel.cpp) | 0 | ||||
-rw-r--r-- | src/common/Collision/Models/WorldModel.h (renamed from src/server/collision/Models/WorldModel.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/RegularGrid.h (renamed from src/server/collision/RegularGrid.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/VMapDefinitions.h (renamed from src/server/collision/VMapDefinitions.h) | 0 | ||||
-rw-r--r-- | src/common/Collision/VMapTools.h (renamed from src/server/collision/VMapTools.h) | 0 | ||||
-rw-r--r-- | src/common/Common.cpp (renamed from src/server/shared/Common.cpp) | 0 | ||||
-rw-r--r-- | src/common/Common.h (renamed from src/server/shared/Common.h) | 0 | ||||
-rw-r--r-- | src/common/CompilerDefs.h (renamed from src/server/shared/CompilerDefs.h) | 0 | ||||
-rw-r--r-- | src/common/Configuration/Config.cpp (renamed from src/server/shared/Configuration/Config.cpp) | 0 | ||||
-rw-r--r-- | src/common/Configuration/Config.h (renamed from src/server/shared/Configuration/Config.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/ARC4.cpp (renamed from src/server/shared/Cryptography/ARC4.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/ARC4.h (renamed from src/server/shared/Cryptography/ARC4.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/Authentication/PacketCrypt.cpp (renamed from src/server/shared/Cryptography/Authentication/PacketCrypt.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/Authentication/PacketCrypt.h (renamed from src/server/shared/Cryptography/Authentication/PacketCrypt.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/Authentication/WorldPacketCrypt.cpp (renamed from src/server/shared/Cryptography/Authentication/WorldPacketCrypt.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/Authentication/WorldPacketCrypt.h (renamed from src/server/shared/Cryptography/Authentication/WorldPacketCrypt.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/BigNumber.cpp (renamed from src/server/shared/Cryptography/BigNumber.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/BigNumber.h (renamed from src/server/shared/Cryptography/BigNumber.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/HmacHash.cpp (renamed from src/server/shared/Cryptography/HmacHash.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/HmacHash.h (renamed from src/server/shared/Cryptography/HmacHash.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/OpenSSLCrypto.cpp (renamed from src/server/shared/Cryptography/OpenSSLCrypto.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/OpenSSLCrypto.h (renamed from src/server/shared/Cryptography/OpenSSLCrypto.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/SHA1.cpp (renamed from src/server/shared/Cryptography/SHA1.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/SHA1.h (renamed from src/server/shared/Cryptography/SHA1.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/SHA256.cpp (renamed from src/server/shared/Cryptography/SHA256.cpp) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/SHA256.h (renamed from src/server/shared/Cryptography/SHA256.h) | 0 | ||||
-rw-r--r-- | src/common/Cryptography/WardenKeyGeneration.h (renamed from src/server/shared/Cryptography/WardenKeyGeneration.h) | 0 | ||||
-rw-r--r-- | src/common/Debugging/Errors.cpp (renamed from src/server/shared/Debugging/Errors.cpp) | 0 | ||||
-rw-r--r-- | src/common/Debugging/Errors.h (renamed from src/server/shared/Debugging/Errors.h) | 0 | ||||
-rw-r--r-- | src/common/Debugging/WheatyExceptionReport.cpp (renamed from src/server/shared/Debugging/WheatyExceptionReport.cpp) | 9 | ||||
-rw-r--r-- | src/common/Debugging/WheatyExceptionReport.h (renamed from src/server/shared/Debugging/WheatyExceptionReport.h) | 0 | ||||
-rw-r--r-- | src/common/Define.h (renamed from src/server/shared/Define.h) | 3 | ||||
-rw-r--r-- | src/common/GitRevision.cpp | 83 | ||||
-rw-r--r-- | src/common/GitRevision.h (renamed from src/server/shared/SystemConfig.h) | 43 | ||||
-rw-r--r-- | src/common/Logging/Appender.cpp (renamed from src/server/shared/Logging/Appender.cpp) | 9 | ||||
-rw-r--r-- | src/common/Logging/Appender.h (renamed from src/server/shared/Logging/Appender.h) | 25 | ||||
-rw-r--r-- | src/common/Logging/AppenderConsole.cpp (renamed from src/server/shared/Logging/AppenderConsole.cpp) | 7 | ||||
-rw-r--r-- | src/common/Logging/AppenderConsole.h (renamed from src/server/shared/Logging/AppenderConsole.h) | 7 | ||||
-rw-r--r-- | src/common/Logging/AppenderFile.cpp (renamed from src/server/shared/Logging/AppenderFile.cpp) | 34 | ||||
-rw-r--r-- | src/common/Logging/AppenderFile.h (renamed from src/server/shared/Logging/AppenderFile.h) | 7 | ||||
-rw-r--r-- | src/common/Logging/Log.cpp (renamed from src/server/shared/Logging/Log.cpp) | 91 | ||||
-rw-r--r-- | src/common/Logging/Log.h (renamed from src/server/shared/Logging/Log.h) | 23 | ||||
-rw-r--r-- | src/common/Logging/LogOperation.cpp (renamed from src/server/shared/Logging/LogOperation.cpp) | 0 | ||||
-rw-r--r-- | src/common/Logging/LogOperation.h (renamed from src/server/shared/Logging/LogOperation.h) | 0 | ||||
-rw-r--r-- | src/common/Logging/Logger.cpp (renamed from src/server/shared/Logging/Logger.cpp) | 0 | ||||
-rw-r--r-- | src/common/Logging/Logger.h (renamed from src/server/shared/Logging/Logger.h) | 0 | ||||
-rw-r--r-- | src/common/PrecompiledHeaders/commonPCH.cpp | 1 | ||||
-rw-r--r-- | src/common/PrecompiledHeaders/commonPCH.h (renamed from src/server/collision/PrecompiledHeaders/collisionPCH.h) | 1 | ||||
-rw-r--r-- | src/common/Threading/Callback.h (renamed from src/server/shared/Threading/Callback.h) | 0 | ||||
-rw-r--r-- | src/common/Threading/LockedQueue.h (renamed from src/server/shared/Threading/LockedQueue.h) | 0 | ||||
-rw-r--r-- | src/common/Threading/ProcessPriority.h (renamed from src/server/shared/Threading/ProcessPriority.h) | 0 | ||||
-rw-r--r-- | src/common/Threading/ProducerConsumerQueue.h (renamed from src/server/shared/Threading/ProducerConsumerQueue.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/ByteConverter.h (renamed from src/server/shared/Utilities/ByteConverter.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/Duration.h (renamed from src/server/shared/Utilities/Duration.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/EventMap.cpp (renamed from src/server/shared/Utilities/EventMap.cpp) | 0 | ||||
-rw-r--r-- | src/common/Utilities/EventMap.h (renamed from src/server/shared/Utilities/EventMap.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/EventProcessor.cpp (renamed from src/server/shared/Utilities/EventProcessor.cpp) | 0 | ||||
-rw-r--r-- | src/common/Utilities/EventProcessor.h (renamed from src/server/shared/Utilities/EventProcessor.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/StringFormat.h (renamed from src/server/shared/Utilities/StringFormat.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/TaskScheduler.cpp (renamed from src/server/shared/Utilities/TaskScheduler.cpp) | 0 | ||||
-rw-r--r-- | src/common/Utilities/TaskScheduler.h (renamed from src/server/shared/Utilities/TaskScheduler.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/Timer.h (renamed from src/server/shared/Utilities/Timer.h) | 0 | ||||
-rw-r--r-- | src/common/Utilities/Util.cpp (renamed from src/server/shared/Utilities/Util.cpp) | 0 | ||||
-rw-r--r-- | src/common/Utilities/Util.h (renamed from src/server/shared/Utilities/Util.h) | 0 | ||||
-rw-r--r-- | src/genrev/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/server/CMakeLists.txt | 30 | ||||
-rw-r--r-- | src/server/bnetserver/CMakeLists.txt | 40 | ||||
-rw-r--r-- | src/server/bnetserver/Main.cpp | 15 | ||||
-rw-r--r-- | src/server/bnetserver/Realms/WorldListener.cpp | 13 | ||||
-rw-r--r-- | src/server/bnetserver/bnetserver.rc | 2 | ||||
-rw-r--r-- | src/server/collision/CMakeLists.txt | 98 | ||||
-rw-r--r-- | src/server/collision/PrecompiledHeaders/collisionPCH.cpp | 1 | ||||
-rw-r--r-- | src/server/database/CMakeLists.txt | 75 | ||||
-rw-r--r-- | src/server/database/Database/AdhocStatement.cpp (renamed from src/server/shared/Database/AdhocStatement.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/AdhocStatement.h (renamed from src/server/shared/Database/AdhocStatement.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/DatabaseEnv.h (renamed from src/server/shared/Database/DatabaseEnv.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/DatabaseLoader.cpp (renamed from src/server/shared/Database/DatabaseLoader.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/DatabaseLoader.h (renamed from src/server/shared/Database/DatabaseLoader.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/DatabaseWorker.cpp (renamed from src/server/shared/Database/DatabaseWorker.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/DatabaseWorker.h (renamed from src/server/shared/Database/DatabaseWorker.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/DatabaseWorkerPool.h (renamed from src/server/shared/Database/DatabaseWorkerPool.h) | 4 | ||||
-rw-r--r-- | src/server/database/Database/Field.cpp (renamed from src/server/shared/Database/Field.cpp) | 13 | ||||
-rw-r--r-- | src/server/database/Database/Field.h (renamed from src/server/shared/Database/Field.h) | 80 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp (renamed from src/server/shared/Database/Implementation/CharacterDatabase.cpp) | 24 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.h (renamed from src/server/shared/Database/Implementation/CharacterDatabase.h) | 28 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp (renamed from src/server/shared/Database/Implementation/HotfixDatabase.cpp) | 51 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h (renamed from src/server/shared/Database/Implementation/HotfixDatabase.h) | 58 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/LoginDatabase.cpp (renamed from src/server/shared/Database/Implementation/LoginDatabase.cpp) | 17 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/LoginDatabase.h (renamed from src/server/shared/Database/Implementation/LoginDatabase.h) | 39 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/WorldDatabase.cpp (renamed from src/server/shared/Database/Implementation/WorldDatabase.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/WorldDatabase.h (renamed from src/server/shared/Database/Implementation/WorldDatabase.h) | 28 | ||||
-rw-r--r-- | src/server/database/Database/MySQLConnection.cpp (renamed from src/server/shared/Database/MySQLConnection.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/MySQLConnection.h (renamed from src/server/shared/Database/MySQLConnection.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/MySQLThreading.h (renamed from src/server/shared/Database/MySQLThreading.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/PreparedStatement.cpp (renamed from src/server/shared/Database/PreparedStatement.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/PreparedStatement.h (renamed from src/server/shared/Database/PreparedStatement.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/QueryHolder.cpp (renamed from src/server/shared/Database/QueryHolder.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/QueryHolder.h (renamed from src/server/shared/Database/QueryHolder.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/QueryResult.cpp (renamed from src/server/shared/Database/QueryResult.cpp) | 117 | ||||
-rw-r--r-- | src/server/database/Database/QueryResult.h (renamed from src/server/shared/Database/QueryResult.h) | 11 | ||||
-rw-r--r-- | src/server/database/Database/SQLOperation.h (renamed from src/server/shared/Database/SQLOperation.h) | 0 | ||||
-rw-r--r-- | src/server/database/Database/Transaction.cpp (renamed from src/server/shared/Database/Transaction.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Database/Transaction.h (renamed from src/server/shared/Database/Transaction.h) | 0 | ||||
-rw-r--r-- | src/server/database/Logging/AppenderDB.cpp (renamed from src/server/shared/Logging/AppenderDB.cpp) | 4 | ||||
-rw-r--r-- | src/server/database/Logging/AppenderDB.h (renamed from src/server/shared/Logging/AppenderDB.h) | 7 | ||||
-rw-r--r-- | src/server/database/PrecompiledHeaders/databasePCH.cpp | 1 | ||||
-rw-r--r-- | src/server/database/PrecompiledHeaders/databasePCH.h | 23 | ||||
-rw-r--r-- | src/server/database/Updater/DBUpdater.cpp (renamed from src/server/shared/Updater/DBUpdater.cpp) | 10 | ||||
-rw-r--r-- | src/server/database/Updater/DBUpdater.h (renamed from src/server/shared/Updater/DBUpdater.h) | 0 | ||||
-rw-r--r-- | src/server/database/Updater/UpdateFetcher.cpp (renamed from src/server/shared/Updater/UpdateFetcher.cpp) | 0 | ||||
-rw-r--r-- | src/server/database/Updater/UpdateFetcher.h (renamed from src/server/shared/Updater/UpdateFetcher.h) | 0 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 9 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 3 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.cpp | 469 | ||||
-rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.h | 141 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 1 | ||||
-rw-r--r-- | src/server/game/CMakeLists.txt | 77 | ||||
-rw-r--r-- | src/server/game/Chat/ChatLink.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.h | 5 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 87 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 19 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 251 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2fmt.h | 15 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStores.cpp | 567 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStores.h | 299 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStructure.h | 193 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCfmt.h | 102 | ||||
-rw-r--r-- | src/server/game/Entities/Corpse/Corpse.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 91 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Object/ObjectGuid.h | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 178 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 116 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 44 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 3 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 2 | ||||
-rw-r--r-- | src/server/game/Guilds/GuildMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/BattlePetHandler.cpp | 80 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 226 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/TicketHandler.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/ToyHandler.cpp | 82 | ||||
-rw-r--r-- | src/server/game/Handlers/TradeHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/VoidStorageHandler.cpp | 46 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.h | 10 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Maps/TransportMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 233 | ||||
-rw-r--r-- | src/server/game/Movement/PathGenerator.h | 2 | ||||
-rw-r--r-- | src/server/game/Reputation/ReputationMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.cpp | 440 | ||||
-rw-r--r-- | src/server/game/Server/Packets/BattlePetPackets.cpp | 171 | ||||
-rw-r--r-- | src/server/game/Server/Packets/BattlePetPackets.h | 195 | ||||
-rw-r--r-- | src/server/game/Server/Packets/BattlegroundPackets.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/BattlegroundPackets.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChannelPackets.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ChannelPackets.h | 19 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 85 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 40 | ||||
-rw-r--r-- | src/server/game/Server/Packets/LootPackets.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/LootPackets.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 13 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 3 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SystemPackets.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SystemPackets.h | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TicketPackets.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TicketPackets.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ToyPackets.cpp | 55 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ToyPackets.h | 74 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 46 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 3176 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/PacketLog.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 60 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 62 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 31 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 107 | ||||
-rw-r--r-- | src/server/game/Spells/SpellHistory.cpp | 182 | ||||
-rw-r--r-- | src/server/game/Spells/SpellHistory.h | 29 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.h | 5 | ||||
-rw-r--r-- | src/server/game/Support/SupportMgr.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Tools/PlayerDump.cpp | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 31 | ||||
-rw-r--r-- | src/server/ipc/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/server/scripts/CMakeLists.txt | 62 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_cast.cpp | 91 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_character.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_server.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 2 | ||||
-rw-r--r-- | src/server/shared/CMakeLists.txt | 47 | ||||
-rw-r--r-- | src/server/shared/DataStores/DB2StorageLoader.cpp | 140 | ||||
-rw-r--r-- | src/server/shared/DataStores/DB2StorageLoader.h | 26 | ||||
-rw-r--r-- | src/server/shared/DataStores/DB2Store.h | 23 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCFileLoader.h | 5 | ||||
-rw-r--r-- | src/server/shared/Service/ServiceWin32.cpp (renamed from src/server/shared/Utilities/ServiceWin32.cpp) | 0 | ||||
-rw-r--r-- | src/server/shared/Service/ServiceWin32.h (renamed from src/server/shared/Utilities/ServiceWin32.h) | 0 | ||||
-rw-r--r-- | src/server/worldserver/CMakeLists.txt | 99 | ||||
-rw-r--r-- | src/server/worldserver/Main.cpp | 19 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.rc | 2 | ||||
-rw-r--r-- | src/tools/connection_patcher/CMakeLists.txt | 10 | ||||
-rw-r--r-- | src/tools/connection_patcher/Program.cpp | 22 | ||||
-rw-r--r-- | src/tools/map_extractor/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/tools/map_extractor/System.cpp | 92 | ||||
-rw-r--r-- | src/tools/mmaps_generator/CMakeLists.txt | 16 | ||||
-rw-r--r-- | src/tools/vmap4_assembler/CMakeLists.txt | 12 |
250 files changed, 6459 insertions, 4098 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e6d31ebbaef..a2c50828d37 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,11 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. add_subdirectory(genrev) -add_subdirectory(server) +add_subdirectory(common) + +if(SERVERS) + add_subdirectory(server) +endif(SERVERS) if(TOOLS) add_subdirectory(tools) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt new file mode 100644 index 00000000000..0873bbef7e0 --- /dev/null +++ b/src/common/CMakeLists.txt @@ -0,0 +1,89 @@ +# Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +if( USE_COREPCH ) + include_directories(${CMAKE_CURRENT_BINARY_DIR}) +endif() + +file(GLOB_RECURSE sources_Common Common.cpp Common.h) +file(GLOB_RECURSE sources_Collision Collision/*.cpp Collision/*.h) +file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h) +file(GLOB_RECURSE sources_Utilities Utilities/*.cpp Utilities/*.h) +file(GLOB_RECURSE sources_Configuration Configuration/*.cpp Configuration/*.h) +file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) +file(GLOB_RECURSE sources_Cryptography Cryptography/*.cpp Cryptography/*.h) + +# Manually set sources for Debugging directory as we don't want to include WheatyExceptionReport in common project +# It needs to be included both in authserver and worldserver for the static global variable to be properly initialized +# and to handle crash logs on windows +set(sources_Debugging Debugging/Errors.cpp Debugging/Errors.h) +file(GLOB sources_localdir *.cpp *.h) + +if (USE_COREPCH) + set(common_STAT_PCH_HDR PrecompiledHeaders/commonPCH.h) + set(common_STAT_PCH_SRC PrecompiledHeaders/commonPCH.cpp) +endif (USE_COREPCH) + +set(common_STAT_SRCS + ${common_STAT_SRCS} + ${sources_Common} + ${sources_Collision} + ${sources_Threading} + ${sources_Utilities} + ${sources_Debugging} + ${sources_Configuration} + ${sources_Logging} + ${sources_Cryptography} + ${sources_localdir} +) + +# Do NOT add any extra include directory here, as we don't want the common +# library to depend on anything else than TC deps, and itself. +# This way we ensure that if either a PR does that without modifying this file, +# a compile error will be generated, either this file will be modified so it +# is detected more easily. +# While it is OK to include files from other libs as long as they don't require +# linkage (enums, defines...) it is discouraged to do so unless necessary, as it will pullute +# include_directories leading to further unnoticed dependency aditions +# Linker Depencency requirements: none +include_directories( + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/Collision + ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Management + ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Maps + ${CMAKE_CURRENT_SOURCE_DIR}/Collision/Models + ${CMAKE_CURRENT_SOURCE_DIR}/Configuration + ${CMAKE_CURRENT_SOURCE_DIR}/Cryptography + ${CMAKE_CURRENT_SOURCE_DIR}/Debugging + ${CMAKE_CURRENT_SOURCE_DIR}/Logging + ${CMAKE_CURRENT_SOURCE_DIR}/Utilities + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include + ${CMAKE_SOURCE_DIR}/dep/SFMT + ${CMAKE_SOURCE_DIR}/dep/utf8cpp + ${OPENSSL_INCLUDE_DIR} + ${VALGRIND_INCLUDE_DIR} +) + +GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) + +add_library(common STATIC + ${common_STAT_SRCS} + ${common_STAT_PCH_SRC} +) + +add_dependencies(common revision_data.h) + +# Generate precompiled header +if (USE_COREPCH) + add_cxx_pch(common ${common_STAT_PCH_HDR} ${common_STAT_PCH_SRC}) +endif () diff --git a/src/server/collision/BoundingIntervalHierarchy.cpp b/src/common/Collision/BoundingIntervalHierarchy.cpp index 12af680712e..12af680712e 100644 --- a/src/server/collision/BoundingIntervalHierarchy.cpp +++ b/src/common/Collision/BoundingIntervalHierarchy.cpp diff --git a/src/server/collision/BoundingIntervalHierarchy.h b/src/common/Collision/BoundingIntervalHierarchy.h index d431b7a0605..d431b7a0605 100644 --- a/src/server/collision/BoundingIntervalHierarchy.h +++ b/src/common/Collision/BoundingIntervalHierarchy.h diff --git a/src/server/collision/BoundingIntervalHierarchyWrapper.h b/src/common/Collision/BoundingIntervalHierarchyWrapper.h index 60bb6a569df..60bb6a569df 100644 --- a/src/server/collision/BoundingIntervalHierarchyWrapper.h +++ b/src/common/Collision/BoundingIntervalHierarchyWrapper.h diff --git a/src/server/collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp index 1de2543543d..1de2543543d 100644 --- a/src/server/collision/DynamicTree.cpp +++ b/src/common/Collision/DynamicTree.cpp diff --git a/src/server/collision/DynamicTree.h b/src/common/Collision/DynamicTree.h index 5e905323640..5e905323640 100644 --- a/src/server/collision/DynamicTree.h +++ b/src/common/Collision/DynamicTree.h diff --git a/src/server/collision/Management/IVMapManager.h b/src/common/Collision/Management/IVMapManager.h index b890554257c..b890554257c 100644 --- a/src/server/collision/Management/IVMapManager.h +++ b/src/common/Collision/Management/IVMapManager.h diff --git a/src/server/collision/Management/MMapFactory.cpp b/src/common/Collision/Management/MMapFactory.cpp index 667b8378c56..667b8378c56 100644 --- a/src/server/collision/Management/MMapFactory.cpp +++ b/src/common/Collision/Management/MMapFactory.cpp diff --git a/src/server/collision/Management/MMapFactory.h b/src/common/Collision/Management/MMapFactory.h index 773983f81eb..773983f81eb 100644 --- a/src/server/collision/Management/MMapFactory.h +++ b/src/common/Collision/Management/MMapFactory.h diff --git a/src/server/collision/Management/MMapManager.cpp b/src/common/Collision/Management/MMapManager.cpp index 0b9c1b325b7..f6ccfdf2720 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/common/Collision/Management/MMapManager.cpp @@ -18,8 +18,7 @@ #include "MMapManager.h" #include "Log.h" -#include "World.h" -#include "DBCStores.h" +#include "Config.h" #include "MMapFactory.h" namespace MMAP @@ -37,11 +36,19 @@ namespace MMAP // if we had, tiles in MMapData->mmapLoadedTiles, their actual data is lost! } - void MMapManager::InitializeThreadUnsafe(const std::vector<uint32>& mapIds) + void MMapManager::InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData) { - // the caller must pass the list of all mapIds that will be used in the VMapManager2 lifetime - for (const uint32& mapId : mapIds) - loadedMMaps.insert(MMapDataSet::value_type(mapId, nullptr)); + // the caller must pass the list of all mapIds that will be used in the MMapManager lifetime + for (auto const& p : mapData) + { + loadedMMaps.insert(MMapDataSet::value_type(p.first, nullptr)); + if (!p.second.empty()) + { + phaseMapData[p.first] = p.second; + for (uint32 phasedMapId : p.second) + _phaseTiles.insert(PhaseTileMap::value_type(phasedMapId, PhaseTileContainer())); + } + } thread_safe_environment = false; } @@ -74,7 +81,7 @@ namespace MMAP } // load and init dtNavMesh - read parameters from file - std::string fileName = Trinity::StringFormat(MAP_FILE_NAME_FORMAT, sWorld->GetDataPath().c_str(), mapId); + std::string fileName = Trinity::StringFormat(MAP_FILE_NAME_FORMAT, sConfigMgr->GetStringDefault("DataDir", "./").c_str(), mapId); FILE* file = fopen(fileName.c_str(), "rb"); if (!file) { @@ -130,7 +137,7 @@ namespace MMAP return false; // load this tile :: mmaps/MMMMXXYY.mmtile - std::string fileName = Trinity::StringFormat(TILE_FILE_NAME_FORMAT, sWorld->GetDataPath().c_str(), mapId, x, y); + std::string fileName = Trinity::StringFormat(TILE_FILE_NAME_FORMAT, sConfigMgr->GetStringDefault("DataDir", "./").c_str(), mapId, x, y); FILE* file = fopen(fileName.c_str(), "rb"); if (!file) { @@ -178,7 +185,9 @@ namespace MMAP ++loadedTiles; TC_LOG_DEBUG("maps", "MMAP:loadMap: Loaded mmtile %04i[%02i, %02i] into %04i[%02i, %02i]", mapId, x, y, mapId, header->x, header->y); - LoadPhaseTiles(mapId, x, y); + PhaseChildMapContainer::const_iterator phasedMaps = phaseMapData.find(mapId); + if (phasedMaps != phaseMapData.end()) + LoadPhaseTiles(phasedMaps, x, y); return true; } @@ -191,7 +200,7 @@ namespace MMAP PhasedTile* MMapManager::LoadTile(uint32 mapId, int32 x, int32 y) { // load this tile :: mmaps/MMMXXYY.mmtile - std::string fileName = Trinity::StringFormat(TILE_FILE_NAME_FORMAT, sWorld->GetDataPath().c_str(), mapId, x, y); + std::string fileName = Trinity::StringFormat(TILE_FILE_NAME_FORMAT, sConfigMgr->GetStringDefault("DataDir", "./").c_str(), mapId, x, y); FILE* file = fopen(fileName.c_str(), "rb"); if (!file) { @@ -237,45 +246,43 @@ namespace MMAP return pTile; } - void MMapManager::LoadPhaseTiles(uint32 mapId, int32 x, int32 y) + void MMapManager::LoadPhaseTiles(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y) { - TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loading phased mmtiles for map %u, x: %i, y: %i", mapId, x, y); + TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loading phased mmtiles for map %u, x: %i, y: %i", phasedMapData->first, x, y); uint32 packedGridPos = packTileID(x, y); - for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i) + for (uint32 phaseMapId : phasedMapData->second) { - if (MapEntry const* map = sMapStore.LookupEntry(i)) + // only a few tiles have terrain swaps, do not write error for them + if (PhasedTile* data = LoadTile(phaseMapId, x, y)) { - if (map->ParentMapID == int32(mapId)) - { - PhasedTile* data = LoadTile(map->ID, x, y); - // only a few tiles have terrain swaps, do not write error for them - if (data) - { - TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loaded phased %04u%02i%02i.mmtile for root phase map %u", map->ID, x, y, mapId); - _phaseTiles[map->ID][packedGridPos] = data; - } - } + TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loaded phased %04u%02i%02i.mmtile for root phase map %u", phaseMapId, x, y, phasedMapData->first); + _phaseTiles[phaseMapId][packedGridPos] = data; } } } - void MMapManager::UnloadPhaseTile(uint32 mapId, int32 x, int32 y) + void MMapManager::UnloadPhaseTile(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y) { - TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloading phased mmtile for map %u, x: %i, y: %i", mapId, x, y); + TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloading phased mmtile for map %u, x: %i, y: %i", phasedMapData->first, x, y); uint32 packedGridPos = packTileID(x, y); - const MapEntry* const map = sMapStore.LookupEntry(mapId); // map existence already checked when loading - uint32 rootMapId = map->ParentMapID; - - if (_phaseTiles[mapId][packedGridPos]) + for (uint32 phaseMapId : phasedMapData->second) { - TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloaded phased %04u%02i%02i.mmtile for root phase map %u", mapId, x, y, rootMapId); - delete _phaseTiles[mapId][packedGridPos]->data; - delete _phaseTiles[mapId][packedGridPos]; - _phaseTiles[mapId].erase(packedGridPos); + auto phasedTileItr = _phaseTiles.find(phaseMapId); + if (phasedTileItr == _phaseTiles.end()) + continue; + + auto dataItr = phasedTileItr->second.find(packedGridPos); + if (dataItr != phasedTileItr->second.end()) + { + TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloaded phased %04u%02i%02i.mmtile for root phase map %u", phaseMapId, x, y, phasedMapData->first); + delete dataItr->second->data; + delete dataItr->second; + phasedTileItr->second.erase(dataItr); + } } } @@ -318,7 +325,9 @@ namespace MMAP --loadedTiles; TC_LOG_DEBUG("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %04i", mapId, x, y, mapId); - UnloadPhaseTile(mapId, x, y); + PhaseChildMapContainer::const_iterator phasedMaps = phaseMapData.find(mapId); + if (phasedMaps != phaseMapData.end()) + UnloadPhaseTile(phasedMaps, x, y); return true; } @@ -345,7 +354,9 @@ namespace MMAP TC_LOG_ERROR("maps", "MMAP:unloadMap: Could not unload %04u%02i%02i.mmtile from navmesh", mapId, x, y); else { - UnloadPhaseTile(mapId, x, y); + PhaseChildMapContainer::const_iterator phasedMaps = phaseMapData.find(mapId); + if (phasedMaps != phaseMapData.end()) + UnloadPhaseTile(phasedMaps, x, y); --loadedTiles; TC_LOG_DEBUG("maps", "MMAP:unloadMap: Unloaded mmtile %04i[%02i, %02i] from %04i", mapId, x, y, mapId); } @@ -545,9 +556,9 @@ namespace MMAP { if (!swaps.count(swap)) // swap not active { - PhaseTileContainer ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap); - for (PhaseTileContainer::const_iterator itr = ptc.begin(); itr != ptc.end(); ++itr) - RemoveSwap(itr->second, swap, itr->first); // remove swap + if (PhaseTileContainer const* ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap)) + for (PhaseTileContainer::const_iterator itr = ptc->begin(); itr != ptc->end(); ++itr) + RemoveSwap(itr->second, swap, itr->first); // remove swap } } @@ -557,9 +568,9 @@ namespace MMAP if (!_activeSwaps.count(swap)) // swap not active { // for each of the terrain swap's xy tiles - PhaseTileContainer ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap); - for (PhaseTileContainer::const_iterator itr = ptc.begin(); itr != ptc.end(); ++itr) - AddSwap(itr->second, swap, itr->first); // add swap + if (PhaseTileContainer const* ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap)) + for (PhaseTileContainer::const_iterator itr = ptc->begin(); itr != ptc->end(); ++itr) + AddSwap(itr->second, swap, itr->first); // add swap } } diff --git a/src/server/collision/Management/MMapManager.h b/src/common/Collision/Management/MMapManager.h index 2b3818601af..eaace584b0a 100644 --- a/src/server/collision/Management/MMapManager.h +++ b/src/common/Collision/Management/MMapManager.h @@ -23,10 +23,11 @@ #include "DetourAlloc.h" #include "DetourNavMesh.h" #include "DetourNavMeshQuery.h" -#include "World.h" +#include "MapDefines.h" #include <string> #include <unordered_map> #include <set> +#include <vector> // move map related classes namespace MMAP @@ -95,7 +96,7 @@ namespace MMAP MMapManager() : loadedTiles(0), thread_safe_environment(true) {} ~MMapManager(); - void InitializeThreadUnsafe(const std::vector<uint32>& mapIds); + void InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData); bool loadMap(const std::string& basePath, uint32 mapId, int32 x, int32 y); bool unloadMap(uint32 mapId, int32 x, int32 y); bool unloadMap(uint32 mapId); @@ -108,9 +109,16 @@ namespace MMAP uint32 getLoadedTilesCount() const { return loadedTiles; } uint32 getLoadedMapsCount() const { return loadedMMaps.size(); } - void LoadPhaseTiles(uint32 mapId, int32 x, int32 y); - void UnloadPhaseTile(uint32 mapId, int32 x, int32 y); - PhaseTileContainer GetPhaseTileContainer(uint32 mapId) { return _phaseTiles[mapId]; } + typedef std::unordered_map<uint32, std::vector<uint32>> PhaseChildMapContainer; + void LoadPhaseTiles(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y); + void UnloadPhaseTile(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y); + PhaseTileContainer const* GetPhaseTileContainer(uint32 mapId) const + { + auto itr = _phaseTiles.find(mapId); + if (itr != _phaseTiles.end()) + return &itr->second; + return nullptr; + } private: bool loadMapData(uint32 mapId); @@ -118,6 +126,7 @@ namespace MMAP MMapDataSet::const_iterator GetMMapData(uint32 mapId) const; MMapDataSet loadedMMaps; + PhaseChildMapContainer phaseMapData; uint32 loadedTiles; bool thread_safe_environment; diff --git a/src/server/collision/Management/VMapFactory.cpp b/src/common/Collision/Management/VMapFactory.cpp index 4c2750a9e5c..4c2750a9e5c 100644 --- a/src/server/collision/Management/VMapFactory.cpp +++ b/src/common/Collision/Management/VMapFactory.cpp diff --git a/src/server/collision/Management/VMapFactory.h b/src/common/Collision/Management/VMapFactory.h index 3067c2919d5..3067c2919d5 100644 --- a/src/server/collision/Management/VMapFactory.h +++ b/src/common/Collision/Management/VMapFactory.h diff --git a/src/server/collision/Management/VMapManager2.cpp b/src/common/Collision/Management/VMapManager2.cpp index b2085382725..9a31692593d 100644 --- a/src/server/collision/Management/VMapManager2.cpp +++ b/src/common/Collision/Management/VMapManager2.cpp @@ -52,11 +52,11 @@ namespace VMAP } } - void VMapManager2::InitializeThreadUnsafe(const std::vector<uint32>& mapIds) + void VMapManager2::InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData) { // the caller must pass the list of all mapIds that will be used in the VMapManager2 lifetime - for (const uint32& mapId : mapIds) - iInstanceMapTrees.insert(InstanceTreeMap::value_type(mapId, nullptr)); + for (auto const& p : mapData) + iInstanceMapTrees.insert(InstanceTreeMap::value_type(p.first, nullptr)); thread_safe_environment = false; } diff --git a/src/server/collision/Management/VMapManager2.h b/src/common/Collision/Management/VMapManager2.h index a5891e9642b..553145cda4b 100644 --- a/src/server/collision/Management/VMapManager2.h +++ b/src/common/Collision/Management/VMapManager2.h @@ -101,7 +101,7 @@ namespace VMAP VMapManager2(); ~VMapManager2(void); - void InitializeThreadUnsafe(const std::vector<uint32>& mapIds); + void InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData); int loadMap(const char* pBasePath, unsigned int mapId, int x, int y) override; void unloadMap(unsigned int mapId, int x, int y) override; diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h new file mode 100644 index 00000000000..33746558fe7 --- /dev/null +++ b/src/common/Collision/Maps/MapDefines.h @@ -0,0 +1,36 @@ +#ifndef _MAPDEFINES_H +#define _MAPDEFINES_H + +#include "Define.h" +#include "DetourNavMesh.h" + +const uint32 MMAP_MAGIC = 0x4d4d4150; // 'MMAP' +#define MMAP_VERSION 7 + +struct MmapTileHeader +{ + uint32 mmapMagic; + uint32 dtVersion; + uint32 mmapVersion; + uint32 size; + bool usesLiquids : 1; + + MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION), + mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) { } +}; + +enum NavTerrain +{ + NAV_EMPTY = 0x00, + NAV_GROUND = 0x01, + NAV_MAGMA = 0x02, + NAV_SLIME = 0x04, + NAV_WATER = 0x08, + NAV_UNUSED1 = 0x10, + NAV_UNUSED2 = 0x20, + NAV_UNUSED3 = 0x40, + NAV_UNUSED4 = 0x80 + // we only have 8 bits +}; + +#endif /* _MAPDEFINES_H */ diff --git a/src/server/collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp index 862f3e1cefe..862f3e1cefe 100644 --- a/src/server/collision/Maps/MapTree.cpp +++ b/src/common/Collision/Maps/MapTree.cpp diff --git a/src/server/collision/Maps/MapTree.h b/src/common/Collision/Maps/MapTree.h index e477d1fd43d..e477d1fd43d 100644 --- a/src/server/collision/Maps/MapTree.h +++ b/src/common/Collision/Maps/MapTree.h diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/common/Collision/Maps/TileAssembler.cpp index ce39dc02da8..ce39dc02da8 100644 --- a/src/server/collision/Maps/TileAssembler.cpp +++ b/src/common/Collision/Maps/TileAssembler.cpp diff --git a/src/server/collision/Maps/TileAssembler.h b/src/common/Collision/Maps/TileAssembler.h index 581622c6b73..581622c6b73 100644 --- a/src/server/collision/Maps/TileAssembler.h +++ b/src/common/Collision/Maps/TileAssembler.h diff --git a/src/server/collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp index dbdc0554e06..dbdc0554e06 100644 --- a/src/server/collision/Models/GameObjectModel.cpp +++ b/src/common/Collision/Models/GameObjectModel.cpp diff --git a/src/server/collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h index 17669189af5..17669189af5 100644 --- a/src/server/collision/Models/GameObjectModel.h +++ b/src/common/Collision/Models/GameObjectModel.h diff --git a/src/server/collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp index 025352eeb58..025352eeb58 100644 --- a/src/server/collision/Models/ModelInstance.cpp +++ b/src/common/Collision/Models/ModelInstance.cpp diff --git a/src/server/collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h index dfdb001db0a..dfdb001db0a 100644 --- a/src/server/collision/Models/ModelInstance.h +++ b/src/common/Collision/Models/ModelInstance.h diff --git a/src/server/collision/Models/WorldModel.cpp b/src/common/Collision/Models/WorldModel.cpp index 3af120045cb..3af120045cb 100644 --- a/src/server/collision/Models/WorldModel.cpp +++ b/src/common/Collision/Models/WorldModel.cpp diff --git a/src/server/collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h index 6a901a59fdf..6a901a59fdf 100644 --- a/src/server/collision/Models/WorldModel.h +++ b/src/common/Collision/Models/WorldModel.h diff --git a/src/server/collision/RegularGrid.h b/src/common/Collision/RegularGrid.h index a582f3c081c..a582f3c081c 100644 --- a/src/server/collision/RegularGrid.h +++ b/src/common/Collision/RegularGrid.h diff --git a/src/server/collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h index 7234256f069..7234256f069 100644 --- a/src/server/collision/VMapDefinitions.h +++ b/src/common/Collision/VMapDefinitions.h diff --git a/src/server/collision/VMapTools.h b/src/common/Collision/VMapTools.h index fa7bc394ebc..fa7bc394ebc 100644 --- a/src/server/collision/VMapTools.h +++ b/src/common/Collision/VMapTools.h diff --git a/src/server/shared/Common.cpp b/src/common/Common.cpp index 22560012b49..22560012b49 100644 --- a/src/server/shared/Common.cpp +++ b/src/common/Common.cpp diff --git a/src/server/shared/Common.h b/src/common/Common.h index e83340bdd84..e83340bdd84 100644 --- a/src/server/shared/Common.h +++ b/src/common/Common.h diff --git a/src/server/shared/CompilerDefs.h b/src/common/CompilerDefs.h index c7867be517b..c7867be517b 100644 --- a/src/server/shared/CompilerDefs.h +++ b/src/common/CompilerDefs.h diff --git a/src/server/shared/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index 1e1f8c7c3c6..1e1f8c7c3c6 100644 --- a/src/server/shared/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp diff --git a/src/server/shared/Configuration/Config.h b/src/common/Configuration/Config.h index ee5834fb55a..ee5834fb55a 100644 --- a/src/server/shared/Configuration/Config.h +++ b/src/common/Configuration/Config.h diff --git a/src/server/shared/Cryptography/ARC4.cpp b/src/common/Cryptography/ARC4.cpp index 4915383f8dc..4915383f8dc 100644 --- a/src/server/shared/Cryptography/ARC4.cpp +++ b/src/common/Cryptography/ARC4.cpp diff --git a/src/server/shared/Cryptography/ARC4.h b/src/common/Cryptography/ARC4.h index aa08901f456..aa08901f456 100644 --- a/src/server/shared/Cryptography/ARC4.h +++ b/src/common/Cryptography/ARC4.h diff --git a/src/server/shared/Cryptography/Authentication/PacketCrypt.cpp b/src/common/Cryptography/Authentication/PacketCrypt.cpp index c38bd844327..c38bd844327 100644 --- a/src/server/shared/Cryptography/Authentication/PacketCrypt.cpp +++ b/src/common/Cryptography/Authentication/PacketCrypt.cpp diff --git a/src/server/shared/Cryptography/Authentication/PacketCrypt.h b/src/common/Cryptography/Authentication/PacketCrypt.h index d43cac77e66..d43cac77e66 100644 --- a/src/server/shared/Cryptography/Authentication/PacketCrypt.h +++ b/src/common/Cryptography/Authentication/PacketCrypt.h diff --git a/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.cpp b/src/common/Cryptography/Authentication/WorldPacketCrypt.cpp index 55c9f01908d..55c9f01908d 100644 --- a/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.cpp +++ b/src/common/Cryptography/Authentication/WorldPacketCrypt.cpp diff --git a/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.h b/src/common/Cryptography/Authentication/WorldPacketCrypt.h index dfa54182059..dfa54182059 100644 --- a/src/server/shared/Cryptography/Authentication/WorldPacketCrypt.h +++ b/src/common/Cryptography/Authentication/WorldPacketCrypt.h diff --git a/src/server/shared/Cryptography/BigNumber.cpp b/src/common/Cryptography/BigNumber.cpp index 5be425a3d16..5be425a3d16 100644 --- a/src/server/shared/Cryptography/BigNumber.cpp +++ b/src/common/Cryptography/BigNumber.cpp diff --git a/src/server/shared/Cryptography/BigNumber.h b/src/common/Cryptography/BigNumber.h index f0feebeafb2..f0feebeafb2 100644 --- a/src/server/shared/Cryptography/BigNumber.h +++ b/src/common/Cryptography/BigNumber.h diff --git a/src/server/shared/Cryptography/HmacHash.cpp b/src/common/Cryptography/HmacHash.cpp index 3c16ec3a72a..3c16ec3a72a 100644 --- a/src/server/shared/Cryptography/HmacHash.cpp +++ b/src/common/Cryptography/HmacHash.cpp diff --git a/src/server/shared/Cryptography/HmacHash.h b/src/common/Cryptography/HmacHash.h index 7ff1de9ba05..7ff1de9ba05 100644 --- a/src/server/shared/Cryptography/HmacHash.h +++ b/src/common/Cryptography/HmacHash.h diff --git a/src/server/shared/Cryptography/OpenSSLCrypto.cpp b/src/common/Cryptography/OpenSSLCrypto.cpp index f122888292f..f122888292f 100644 --- a/src/server/shared/Cryptography/OpenSSLCrypto.cpp +++ b/src/common/Cryptography/OpenSSLCrypto.cpp diff --git a/src/server/shared/Cryptography/OpenSSLCrypto.h b/src/common/Cryptography/OpenSSLCrypto.h index 0daa20c4780..0daa20c4780 100644 --- a/src/server/shared/Cryptography/OpenSSLCrypto.h +++ b/src/common/Cryptography/OpenSSLCrypto.h diff --git a/src/server/shared/Cryptography/SHA1.cpp b/src/common/Cryptography/SHA1.cpp index bd7101075de..bd7101075de 100644 --- a/src/server/shared/Cryptography/SHA1.cpp +++ b/src/common/Cryptography/SHA1.cpp diff --git a/src/server/shared/Cryptography/SHA1.h b/src/common/Cryptography/SHA1.h index f59bdc25556..f59bdc25556 100644 --- a/src/server/shared/Cryptography/SHA1.h +++ b/src/common/Cryptography/SHA1.h diff --git a/src/server/shared/Cryptography/SHA256.cpp b/src/common/Cryptography/SHA256.cpp index 2a93aeeab72..2a93aeeab72 100644 --- a/src/server/shared/Cryptography/SHA256.cpp +++ b/src/common/Cryptography/SHA256.cpp diff --git a/src/server/shared/Cryptography/SHA256.h b/src/common/Cryptography/SHA256.h index 1d85545b2e0..1d85545b2e0 100644 --- a/src/server/shared/Cryptography/SHA256.h +++ b/src/common/Cryptography/SHA256.h diff --git a/src/server/shared/Cryptography/WardenKeyGeneration.h b/src/common/Cryptography/WardenKeyGeneration.h index bfa0337d347..bfa0337d347 100644 --- a/src/server/shared/Cryptography/WardenKeyGeneration.h +++ b/src/common/Cryptography/WardenKeyGeneration.h diff --git a/src/server/shared/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp index cebd9d4cf2f..cebd9d4cf2f 100644 --- a/src/server/shared/Debugging/Errors.cpp +++ b/src/common/Debugging/Errors.cpp diff --git a/src/server/shared/Debugging/Errors.h b/src/common/Debugging/Errors.h index 4d4624b63dd..4d4624b63dd 100644 --- a/src/server/shared/Debugging/Errors.h +++ b/src/common/Debugging/Errors.h diff --git a/src/server/shared/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp index 02916ca12d2..7cf109b4070 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.cpp +++ b/src/common/Debugging/WheatyExceptionReport.cpp @@ -20,8 +20,7 @@ #include "WheatyExceptionReport.h" #include "Common.h" -#include "SystemConfig.h" -#include "revision.h" +#include "GitRevision.h" #define CrashFolder _T("Crashes") #pragma comment(linker, "/DEFAULTLIB:dbghelp.lib") @@ -131,10 +130,10 @@ PEXCEPTION_POINTERS pExceptionInfo) SYSTEMTIME systime; GetLocalTime(&systime); sprintf(m_szDumpFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].dmp", - crash_folder_path, _HASH, pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, GitRevision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); sprintf(m_szLogFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].txt", - crash_folder_path, _HASH, pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + crash_folder_path, GitRevision::GetHash(), pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); m_hDumpFile = CreateFile(m_szDumpFileName, GENERIC_WRITE, @@ -440,7 +439,7 @@ PEXCEPTION_POINTERS pExceptionInfo) GetLocalTime(&systime); // Start out with a banner - _tprintf(_T("Revision: %s\r\n"), _FULLVERSION); + _tprintf(_T("Revision: %s\r\n"), GitRevision::GetFullVersion()); _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute); PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord; diff --git a/src/server/shared/Debugging/WheatyExceptionReport.h b/src/common/Debugging/WheatyExceptionReport.h index 8c2479d5232..8c2479d5232 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.h +++ b/src/common/Debugging/WheatyExceptionReport.h diff --git a/src/server/shared/Define.h b/src/common/Define.h index 99c89e584f3..92962bfab79 100644 --- a/src/server/shared/Define.h +++ b/src/common/Define.h @@ -33,6 +33,8 @@ # endif # if defined(HELGRIND) # include <valgrind/helgrind.h> +# undef _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE +# undef _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER # define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) ANNOTATE_HAPPENS_BEFORE(A) # define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) ANNOTATE_HAPPENS_AFTER(A) # endif @@ -109,6 +111,7 @@ 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 diff --git a/src/common/GitRevision.cpp b/src/common/GitRevision.cpp new file mode 100644 index 00000000000..4cc8b621803 --- /dev/null +++ b/src/common/GitRevision.cpp @@ -0,0 +1,83 @@ +#include "GitRevision.h" +#include "CompilerDefs.h" +#include "revision_data.h" + +char const* GitRevision::GetHash() +{ + return _HASH; +} + +char const* GitRevision::GetDate() +{ + return _DATE; +} + +char const* GitRevision::GetBranch() +{ + return _BRANCH; +} + +char const* GitRevision::GetSourceDirectory() +{ + return _SOURCE_DIRECTORY; +} + +char const* GitRevision::GetMySQLExecutable() +{ + return _MYSQL_EXECUTABLE; +} + +char const* GitRevision::GetFullDatabase() +{ + return _FULL_DATABASE; +} + +char const* GitRevision::GetHotfixesDatabase() +{ + return _HOTFIXES_DATABASE; +} + +#define _PACKAGENAME "TrinityCore" + +char const* GitRevision::GetFullVersion() +{ +#if PLATFORM == PLATFORM_WINDOWS +# ifdef _WIN64 + return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win64, " _BUILD_DIRECTIVE ")"; +# else + return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win32, " _BUILD_DIRECTIVE ")"; +# endif +#else + return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Unix, " _BUILD_DIRECTIVE ")"; +#endif +} + +char const* GitRevision::GetCompanyNameStr() +{ + return VER_COMPANYNAME_STR; +} + +char const* GitRevision::GetLegalCopyrightStr() +{ + return VER_LEGALCOPYRIGHT_STR; +} + +char const* GitRevision::GetFileVersionStr() +{ + return VER_FILEVERSION_STR; +} + +char const* GitRevision::GetProductVersionStr() +{ + return VER_PRODUCTVERSION_STR; +} + +char const* GitRevision::GetCompilerCFlags() +{ + return COMPILER_C_FLAGS; +} + +char const* GitRevision::GetCompilerCXXFlags() +{ + return COMPILER_CXX_FLAGS; +} diff --git a/src/server/shared/SystemConfig.h b/src/common/GitRevision.h index 7c519c7de57..143a6aa64b3 100644 --- a/src/server/shared/SystemConfig.h +++ b/src/common/GitRevision.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2015 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 @@ -16,29 +15,27 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -// THIS FILE IS DEPRECATED +#ifndef __GITREVISION_H__ +#define __GITREVISION_H__ -#ifndef TRINITY_SYSTEMCONFIG_H -#define TRINITY_SYSTEMCONFIG_H +#include <string> -#include "Define.h" -#include "revision.h" +namespace GitRevision +{ + char const* GetHash(); + char const* GetDate(); + char const* GetBranch(); + char const* GetSourceDirectory(); + char const* GetMySQLExecutable(); + char const* GetFullDatabase(); + char const* GetHotfixesDatabase(); + char const* GetFullVersion(); + char const* GetCompanyNameStr(); + char const* GetLegalCopyrightStr(); + char const* GetFileVersionStr(); + char const* GetProductVersionStr(); + char const* GetCompilerCFlags(); + char const* GetCompilerCXXFlags(); +} -#define _PACKAGENAME "TrinityCore" - -#if TRINITY_ENDIAN == TRINITY_BIGENDIAN -# define _ENDIAN_STRING "big-endian" -#else -# define _ENDIAN_STRING "little-endian" -#endif - -#if PLATFORM == PLATFORM_WINDOWS -# ifdef _WIN64 -# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win64, " _BUILD_DIRECTIVE ")" -# else -# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win32, " _BUILD_DIRECTIVE ")" -# endif -#else -# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Unix, " _BUILD_DIRECTIVE ")" -#endif #endif diff --git a/src/server/shared/Logging/Appender.cpp b/src/common/Logging/Appender.cpp index 31db3ae1b86..d19ef8cf96f 100644 --- a/src/server/shared/Logging/Appender.cpp +++ b/src/common/Logging/Appender.cpp @@ -37,8 +37,8 @@ std::string LogMessage::getTimeStr() return getTimeStr(mtime); } -Appender::Appender(uint8 _id, std::string const& _name, AppenderType _type /* = APPENDER_NONE*/, LogLevel _level /* = LOG_LEVEL_DISABLED */, AppenderFlags _flags /* = APPENDER_FLAGS_NONE */): -id(_id), name(_name), type(_type), level(_level), flags(_flags) { } +Appender::Appender(uint8 _id, std::string const& _name, LogLevel _level /* = LOG_LEVEL_DISABLED */, AppenderFlags _flags /* = APPENDER_FLAGS_NONE */): +id(_id), name(_name), level(_level), flags(_flags) { } Appender::~Appender() { } @@ -52,11 +52,6 @@ std::string const& Appender::getName() const return name; } -AppenderType Appender::getType() const -{ - return type; -} - LogLevel Appender::getLogLevel() const { return level; diff --git a/src/server/shared/Logging/Appender.h b/src/common/Logging/Appender.h index 73af351e41d..6382399a0b4 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/common/Logging/Appender.h @@ -19,9 +19,12 @@ #define APPENDER_H #include <unordered_map> +#include <stdexcept> #include <string> #include <time.h> #include <type_traits> +#include <vector> +#include <utility> #include "Define.h" // Values assigned have their equivalent in enum ACE_Log_Priority @@ -85,29 +88,45 @@ struct LogMessage class Appender { public: - Appender(uint8 _id, std::string const& name, AppenderType type = APPENDER_NONE, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE); + Appender(uint8 _id, std::string const& name, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE); virtual ~Appender(); uint8 getId() const; std::string const& getName() const; - AppenderType getType() const; + virtual AppenderType getType() const = 0; LogLevel getLogLevel() const; AppenderFlags getFlags() const; void setLogLevel(LogLevel); void write(LogMessage* message); static const char* getLogLevelString(LogLevel level); + virtual void setRealmId(uint32 /*realmId*/) { } private: virtual void _write(LogMessage const* /*message*/) = 0; uint8 id; std::string name; - AppenderType type; LogLevel level; AppenderFlags flags; }; typedef std::unordered_map<uint8, Appender*> AppenderMap; +typedef std::vector<char const*> ExtraAppenderArgs; +typedef Appender*(*AppenderCreatorFn)(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); +typedef std::unordered_map<uint8, AppenderCreatorFn> AppenderCreatorMap; + +template<class AppenderImpl> +Appender* CreateAppender(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs) +{ + return new AppenderImpl(id, name, level, flags, std::forward<ExtraAppenderArgs>(extraArgs)); +} + +class InvalidAppenderArgsException : public std::length_error +{ +public: + explicit InvalidAppenderArgsException(std::string const& message) : std::length_error(message) { } +}; + #endif diff --git a/src/server/shared/Logging/AppenderConsole.cpp b/src/common/Logging/AppenderConsole.cpp index 2efa4db4d2e..531df266aa1 100644 --- a/src/server/shared/Logging/AppenderConsole.cpp +++ b/src/common/Logging/AppenderConsole.cpp @@ -25,11 +25,14 @@ #include <Windows.h> #endif -AppenderConsole::AppenderConsole(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags): -Appender(id, name, APPENDER_CONSOLE, level, flags), _colored(false) +AppenderConsole::AppenderConsole(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs) + : Appender(id, name, level, flags), _colored(false) { for (uint8 i = 0; i < MaxLogLevels; ++i) _colors[i] = ColorTypes(MaxColors); + + if (!extraArgs.empty()) + InitColors(extraArgs[0]); } void AppenderConsole::InitColors(std::string const& str) diff --git a/src/server/shared/Logging/AppenderConsole.h b/src/common/Logging/AppenderConsole.h index 0acf7636e35..6b30505c6bd 100644 --- a/src/server/shared/Logging/AppenderConsole.h +++ b/src/common/Logging/AppenderConsole.h @@ -42,11 +42,14 @@ enum ColorTypes const uint8 MaxColors = uint8(WHITE) + 1; -class AppenderConsole: public Appender +class AppenderConsole : public Appender { public: - AppenderConsole(uint8 _id, std::string const& name, LogLevel level, AppenderFlags flags); + typedef std::integral_constant<AppenderType, APPENDER_CONSOLE>::type TypeIndex; + + AppenderConsole(uint8 _id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); void InitColors(const std::string& init_str); + AppenderType getType() const override { return TypeIndex::value; } private: void SetColor(bool stdout_stream, ColorTypes color); diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/common/Logging/AppenderFile.cpp index c9cc1935c7a..bb15aed5e0b 100644 --- a/src/server/shared/Logging/AppenderFile.cpp +++ b/src/common/Logging/AppenderFile.cpp @@ -17,24 +17,46 @@ #include "AppenderFile.h" #include "Common.h" +#include "StringFormat.h" +#include "Log.h" #if PLATFORM == PLATFORM_WINDOWS # include <Windows.h> #endif -AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* filename, const char* logDir, const char* mode, AppenderFlags flags, uint64 fileSize): - Appender(id, name, APPENDER_FILE, level, flags), +AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs) : + Appender(id, name, level, flags), logfile(NULL), - _fileName(filename), - _logDir(logDir), - _maxFileSize(fileSize), + _logDir(sLog->GetLogsDir()), + _maxFileSize(0), _fileSize(0) { + if (extraArgs.empty()) + throw InvalidAppenderArgsException(Trinity::StringFormat("Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name.c_str())); + + _fileName = extraArgs[0]; + + char const* mode = "a"; + if (extraArgs.size() > 1) + mode = extraArgs[1]; + + if (flags & APPENDER_FLAGS_USE_TIMESTAMP) + { + size_t dot_pos = _fileName.find_last_of("."); + if (dot_pos != std::string::npos) + _fileName.insert(dot_pos, sLog->GetLogsTimestamp()); + else + _fileName += sLog->GetLogsTimestamp(); + } + + if (extraArgs.size() > 2) + _maxFileSize = atoi(extraArgs[2]); + _dynamicName = std::string::npos != _fileName.find("%s"); _backup = (flags & APPENDER_FLAGS_MAKE_FILE_BACKUP) != 0; if (!_dynamicName) - logfile = OpenFile(filename, mode, !strcmp(mode, "w") && _backup); + logfile = OpenFile(_fileName, mode, !strcmp(mode, "w") && _backup); } AppenderFile::~AppenderFile() diff --git a/src/server/shared/Logging/AppenderFile.h b/src/common/Logging/AppenderFile.h index 4082b34a2b4..c2781eb1ee9 100644 --- a/src/server/shared/Logging/AppenderFile.h +++ b/src/common/Logging/AppenderFile.h @@ -21,12 +21,15 @@ #include <atomic> #include "Appender.h" -class AppenderFile: public Appender +class AppenderFile : public Appender { public: - AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* filename, const char* logDir, const char* mode, AppenderFlags flags, uint64 maxSize); + typedef std::integral_constant<AppenderType, APPENDER_FILE>::type TypeIndex; + + AppenderFile(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); ~AppenderFile(); FILE* OpenFile(std::string const& name, std::string const& mode, bool backup); + AppenderType getType() const override { return TypeIndex::value; } private: void CloseFile(); diff --git a/src/server/shared/Logging/Log.cpp b/src/common/Logging/Log.cpp index f9f96c3da75..c9ac4dfb9a2 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/common/Logging/Log.cpp @@ -22,7 +22,6 @@ #include "Util.h" #include "AppenderConsole.h" #include "AppenderFile.h" -#include "AppenderDB.h" #include "LogOperation.h" #include <cstdarg> @@ -32,7 +31,8 @@ Log::Log() : _ioService(nullptr), _strand(nullptr) { m_logsTimestamp = "_" + GetTimestampStr(); - LoadFromConfig(); + RegisterAppender<AppenderConsole>(); + RegisterAppender<AppenderFile>(); } Log::~Log() @@ -102,60 +102,21 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName) if (size > 2) flags = AppenderFlags(atoi(*iter++)); - switch (type) + auto factoryFunction = appenderFactory.find(type); + if (factoryFunction == appenderFactory.end()) { - case APPENDER_CONSOLE: - { - AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags); - appenders[appender->getId()] = appender; - if (size > 3) - appender->InitColors(*iter++); - //fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type CONSOLE, Mask %u\n", appender->getName().c_str(), appender->getId(), appender->getLogLevel()); - break; - } - case APPENDER_FILE: - { - std::string filename; - std::string mode = "a"; - - if (size < 4) - { - fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name.c_str()); - return; - } - - filename = *iter++; - - if (size > 4) - mode = *iter++; - - if (flags & APPENDER_FLAGS_USE_TIMESTAMP) - { - size_t dot_pos = filename.find_last_of("."); - if (dot_pos != filename.npos) - filename.insert(dot_pos, m_logsTimestamp); - else - filename += m_logsTimestamp; - } - - uint64 maxFileSize = 0; - if (size > 5) - maxFileSize = atoi(*iter++); - - uint8 id = NextAppenderId(); - appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags, maxFileSize); - //fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type FILE, Mask %u, File %s, Mode %s\n", name.c_str(), id, level, filename.c_str(), mode.c_str()); - break; - } - case APPENDER_DB: - { - uint8 id = NextAppenderId(); - appenders[id] = new AppenderDB(id, name, level); - break; - } - default: - fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name.c_str()); - break; + fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name.c_str()); + return; + } + + try + { + Appender* appender = factoryFunction->second(NextAppenderId(), name, level, flags, ExtraAppenderArgs(iter, tokens.end())); + appenders[appender->getId()] = appender; + } + catch (InvalidAppenderArgsException const& iaae) + { + fprintf(stderr, "%s", iaae.what()); } } @@ -251,7 +212,7 @@ void Log::ReadLoggersFromConfig() Close(); // Clean any Logger or Appender created - AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE); + AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE, ExtraAppenderArgs()); appenders[appender->getId()] = appender; Logger& logger = loggers[LOGGER_ROOT]; @@ -348,21 +309,29 @@ void Log::outCharDump(char const* str, uint32 accountId, uint64 guid, char const void Log::SetRealmId(uint32 id) { for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) - if (it->second && it->second->getType() == APPENDER_DB) - static_cast<AppenderDB*>(it->second)->setRealmId(id); + it->second->setRealmId(id); } void Log::Close() { loggers.clear(); for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) - { delete it->second; - it->second = NULL; - } + appenders.clear(); } +void Log::Initialize(boost::asio::io_service* ioService) +{ + if (ioService) + { + _ioService = ioService; + _strand = new boost::asio::strand(*ioService); + } + + LoadFromConfig(); +} + void Log::LoadFromConfig() { Close(); diff --git a/src/server/shared/Logging/Log.h b/src/common/Logging/Log.h index ab7b2169ed2..a15bb4ad485 100644 --- a/src/server/shared/Logging/Log.h +++ b/src/common/Logging/Log.h @@ -44,19 +44,13 @@ class Log public: - static Log* instance(boost::asio::io_service* ioService = nullptr) + static Log* instance() { static Log instance; - - if (ioService != nullptr) - { - instance._ioService = ioService; - instance._strand = new boost::asio::strand(*ioService); - } - return &instance; } + void Initialize(boost::asio::io_service* ioService); void LoadFromConfig(); void Close(); bool ShouldLog(std::string const& type, LogLevel level) const; @@ -88,6 +82,18 @@ class Log void SetRealmId(uint32 id); + template<class AppenderImpl> + void RegisterAppender() + { + using Index = typename AppenderImpl::TypeIndex; + auto itr = appenderFactory.find(Index::value); + ASSERT(itr == appenderFactory.end()); + appenderFactory[Index::value] = &CreateAppender<AppenderImpl>; + } + + std::string const& GetLogsDir() const { return m_logsDir; } + std::string const& GetLogsTimestamp() const { return m_logsTimestamp; } + private: static std::string GetTimestampStr(); void write(std::unique_ptr<LogMessage>&& msg) const; @@ -100,6 +106,7 @@ class Log void ReadAppendersFromConfig(); void ReadLoggersFromConfig(); + AppenderCreatorMap appenderFactory; AppenderMap appenders; LoggerMap loggers; uint8 AppenderId; diff --git a/src/server/shared/Logging/LogOperation.cpp b/src/common/Logging/LogOperation.cpp index bcd923c705e..bcd923c705e 100644 --- a/src/server/shared/Logging/LogOperation.cpp +++ b/src/common/Logging/LogOperation.cpp diff --git a/src/server/shared/Logging/LogOperation.h b/src/common/Logging/LogOperation.h index ffdd35c3c09..ffdd35c3c09 100644 --- a/src/server/shared/Logging/LogOperation.h +++ b/src/common/Logging/LogOperation.h diff --git a/src/server/shared/Logging/Logger.cpp b/src/common/Logging/Logger.cpp index 3b02eb47575..3b02eb47575 100644 --- a/src/server/shared/Logging/Logger.cpp +++ b/src/common/Logging/Logger.cpp diff --git a/src/server/shared/Logging/Logger.h b/src/common/Logging/Logger.h index 1aee75c5d72..1aee75c5d72 100644 --- a/src/server/shared/Logging/Logger.h +++ b/src/common/Logging/Logger.h diff --git a/src/common/PrecompiledHeaders/commonPCH.cpp b/src/common/PrecompiledHeaders/commonPCH.cpp new file mode 100644 index 00000000000..3ffac525541 --- /dev/null +++ b/src/common/PrecompiledHeaders/commonPCH.cpp @@ -0,0 +1 @@ +#include "commonPCH.h" diff --git a/src/server/collision/PrecompiledHeaders/collisionPCH.h b/src/common/PrecompiledHeaders/commonPCH.h index ece2ef1b8ef..1d3f8928e82 100644 --- a/src/server/collision/PrecompiledHeaders/collisionPCH.h +++ b/src/common/PrecompiledHeaders/commonPCH.h @@ -7,3 +7,4 @@ #include "RegularGrid.h" #include "BoundingIntervalHierarchyWrapper.h" #include "GameObjectModel.h" +#include "GitRevision.h" diff --git a/src/server/shared/Threading/Callback.h b/src/common/Threading/Callback.h index 23f2807b253..23f2807b253 100644 --- a/src/server/shared/Threading/Callback.h +++ b/src/common/Threading/Callback.h diff --git a/src/server/shared/Threading/LockedQueue.h b/src/common/Threading/LockedQueue.h index 3abb0f4b8bc..3abb0f4b8bc 100644 --- a/src/server/shared/Threading/LockedQueue.h +++ b/src/common/Threading/LockedQueue.h diff --git a/src/server/shared/Threading/ProcessPriority.h b/src/common/Threading/ProcessPriority.h index 9f70ab0ac03..9f70ab0ac03 100644 --- a/src/server/shared/Threading/ProcessPriority.h +++ b/src/common/Threading/ProcessPriority.h diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/common/Threading/ProducerConsumerQueue.h index 223f5109545..223f5109545 100644 --- a/src/server/shared/Threading/ProducerConsumerQueue.h +++ b/src/common/Threading/ProducerConsumerQueue.h diff --git a/src/server/shared/Utilities/ByteConverter.h b/src/common/Utilities/ByteConverter.h index a077de3eb0b..a077de3eb0b 100644 --- a/src/server/shared/Utilities/ByteConverter.h +++ b/src/common/Utilities/ByteConverter.h diff --git a/src/server/shared/Utilities/Duration.h b/src/common/Utilities/Duration.h index 58a08e5842f..58a08e5842f 100644 --- a/src/server/shared/Utilities/Duration.h +++ b/src/common/Utilities/Duration.h diff --git a/src/server/shared/Utilities/EventMap.cpp b/src/common/Utilities/EventMap.cpp index 8c3f60afe82..8c3f60afe82 100644 --- a/src/server/shared/Utilities/EventMap.cpp +++ b/src/common/Utilities/EventMap.cpp diff --git a/src/server/shared/Utilities/EventMap.h b/src/common/Utilities/EventMap.h index 021dffc4940..021dffc4940 100644 --- a/src/server/shared/Utilities/EventMap.h +++ b/src/common/Utilities/EventMap.h diff --git a/src/server/shared/Utilities/EventProcessor.cpp b/src/common/Utilities/EventProcessor.cpp index 34695665443..34695665443 100644 --- a/src/server/shared/Utilities/EventProcessor.cpp +++ b/src/common/Utilities/EventProcessor.cpp diff --git a/src/server/shared/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h index 3d54bd6f9f2..3d54bd6f9f2 100644 --- a/src/server/shared/Utilities/EventProcessor.h +++ b/src/common/Utilities/EventProcessor.h diff --git a/src/server/shared/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h index 67e0100e7c8..67e0100e7c8 100644 --- a/src/server/shared/Utilities/StringFormat.h +++ b/src/common/Utilities/StringFormat.h diff --git a/src/server/shared/Utilities/TaskScheduler.cpp b/src/common/Utilities/TaskScheduler.cpp index 801cc96cf77..801cc96cf77 100644 --- a/src/server/shared/Utilities/TaskScheduler.cpp +++ b/src/common/Utilities/TaskScheduler.cpp diff --git a/src/server/shared/Utilities/TaskScheduler.h b/src/common/Utilities/TaskScheduler.h index f1fe7ea0a21..f1fe7ea0a21 100644 --- a/src/server/shared/Utilities/TaskScheduler.h +++ b/src/common/Utilities/TaskScheduler.h diff --git a/src/server/shared/Utilities/Timer.h b/src/common/Utilities/Timer.h index c54903d7be2..c54903d7be2 100644 --- a/src/server/shared/Utilities/Timer.h +++ b/src/common/Utilities/Timer.h diff --git a/src/server/shared/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index ec67968f11e..ec67968f11e 100644 --- a/src/server/shared/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp diff --git a/src/server/shared/Utilities/Util.h b/src/common/Utilities/Util.h index a96fd21058f..a96fd21058f 100644 --- a/src/server/shared/Utilities/Util.h +++ b/src/common/Utilities/Util.h diff --git a/src/genrev/CMakeLists.txt b/src/genrev/CMakeLists.txt index e72643c6a6b..05db165fe00 100644 --- a/src/genrev/CMakeLists.txt +++ b/src/genrev/CMakeLists.txt @@ -9,7 +9,7 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # Need to pass old ${CMAKE_BINARY_DIR} as param because its different at build stage -add_custom_target(revision.h ALL +add_custom_target(revision_data.h ALL COMMAND "${CMAKE_COMMAND}" -DBUILDDIR="${CMAKE_BINARY_DIR}" -P "${CMAKE_SOURCE_DIR}/cmake/genrev.cmake" "${CMAKE_BINARY_DIR}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 21027af9e04..08e7614e27c 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -16,21 +16,15 @@ if(CMAKE_COMPILER_IS_GNUCXX AND NOT MINGW) add_definitions(-fno-delete-null-pointer-checks) endif() -if( SERVERS ) - set(sources_windows_Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging/WheatyExceptionReport.cpp - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging/WheatyExceptionReport.h - ) - add_subdirectory(shared) - add_subdirectory(game) - add_subdirectory(collision) - add_subdirectory(ipc) - add_subdirectory(bnetserver) - add_subdirectory(scripts) - add_subdirectory(worldserver) -else() - if( TOOLS ) - add_subdirectory(collision) - add_subdirectory(shared) - endif() -endif() + +set(sources_windows_Debugging + ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp + ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h +) +add_subdirectory(database) +add_subdirectory(shared) +add_subdirectory(game) +add_subdirectory(ipc) +add_subdirectory(bnetserver) +add_subdirectory(scripts) +add_subdirectory(worldserver) diff --git a/src/server/bnetserver/CMakeLists.txt b/src/server/bnetserver/CMakeLists.txt index e80e99cdda7..f3089202889 100644 --- a/src/server/bnetserver/CMakeLists.txt +++ b/src/server/bnetserver/CMakeLists.txt @@ -45,28 +45,28 @@ endif() include_directories( ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/Authentication + ${CMAKE_CURRENT_SOURCE_DIR}/Packets + ${CMAKE_CURRENT_SOURCE_DIR}/Realms + ${CMAKE_CURRENT_SOURCE_DIR}/Server ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/zmqpp - ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared/Database - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Cryptography + ${CMAKE_SOURCE_DIR}/src/common/Cryptography/Authentication + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/ipc ${CMAKE_SOURCE_DIR}/src/server/shared/Networking + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${CMAKE_SOURCE_DIR}/src/server/shared/Realm - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/ipc - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/Authentication - ${CMAKE_CURRENT_SOURCE_DIR}/Realms - ${CMAKE_CURRENT_SOURCE_DIR}/Server - ${CMAKE_CURRENT_SOURCE_DIR}/Packets + ${CMAKE_SOURCE_DIR}/src/server/shared/Service ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} @@ -80,8 +80,6 @@ add_executable(bnetserver ${bnetserver_PCH_SRC} ) -add_dependencies(bnetserver revision.h) - if( NOT WIN32 ) set_target_properties(bnetserver PROPERTIES COMPILE_DEFINITIONS _TRINITY_BNET_CONFIG="${CONF_DIR}/bnetserver.conf" @@ -89,6 +87,8 @@ if( NOT WIN32 ) endif() target_link_libraries(bnetserver + common + database ipc shared zmqpp diff --git a/src/server/bnetserver/Main.cpp b/src/server/bnetserver/Main.cpp index 68e647d8b15..e8be7a338f7 100644 --- a/src/server/bnetserver/Main.cpp +++ b/src/server/bnetserver/Main.cpp @@ -31,9 +31,10 @@ #include "Config.h" #include "DatabaseEnv.h" #include "Log.h" +#include "AppenderDB.h" #include "ProcessPriority.h" #include "RealmList.h" -#include "SystemConfig.h" +#include "GitRevision.h" #include "Util.h" #include "ZmqContext.h" #include "DatabaseLoader.h" @@ -104,12 +105,20 @@ int main(int argc, char** argv) return 1; } - TC_LOG_INFO("server.bnetserver", "%s (bnetserver)", _FULLVERSION); + sLog->RegisterAppender<AppenderDB>(); + sLog->Initialize(nullptr); + + TC_LOG_INFO("server.bnetserver", "%s (bnetserver)", GitRevision::GetFullVersion()); TC_LOG_INFO("server.bnetserver", "<Ctrl-C> to stop.\n"); TC_LOG_INFO("server.bnetserver", "Using configuration file %s.", configFile.c_str()); TC_LOG_INFO("server.bnetserver", "Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); TC_LOG_INFO("server.bnetserver", "Using Boost version: %i.%i.%i", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100); + // Seed the OpenSSL's PRNG here. + // That way it won't auto-seed when calling BigNumber::SetRand and slow down the first world login + BigNumber seed; + seed.SetRand(16 * 8); + // bnetserver PID file creation std::string pidFile = sConfigMgr->GetStringDefault("PidFile", ""); if (!pidFile.empty()) @@ -303,7 +312,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile } else if (variablesMap.count("version")) { - std::cout << _FULLVERSION << "\n"; + std::cout << GitRevision::GetFullVersion() << "\n"; } return variablesMap; diff --git a/src/server/bnetserver/Realms/WorldListener.cpp b/src/server/bnetserver/Realms/WorldListener.cpp index bcfc5d685c1..d6a12453644 100644 --- a/src/server/bnetserver/Realms/WorldListener.cpp +++ b/src/server/bnetserver/Realms/WorldListener.cpp @@ -63,9 +63,18 @@ void WorldListener::Run() void WorldListener::HandleOpen() { - _worldSocket->bind(std::string("tcp://*:") + std::to_string(_worldListenPort)); + try + { + _worldSocket->bind(std::string("tcp://*:") + std::to_string(_worldListenPort)); + } + catch (zmqpp::zmq_internal_exception& ex) + { + TC_LOG_FATAL("server.ipc", "Could not bind to WorldserverListenPort %u. Exception: %s. Shutting down bnetserver.", _worldListenPort, ex.what()); + abort(); + } + _poller->add(*_worldSocket); - TC_LOG_INFO("server.ipc", "Listening on connections from worldservers..."); + TC_LOG_INFO("server.ipc", "Listening on connections from worldservers on port %u...", _worldListenPort); } void WorldListener::HandleClose() diff --git a/src/server/bnetserver/bnetserver.rc b/src/server/bnetserver/bnetserver.rc index 434d898e647..6b42665ae0f 100644 --- a/src/server/bnetserver/bnetserver.rc +++ b/src/server/bnetserver/bnetserver.rc @@ -17,7 +17,7 @@ */ #include "resource.h" -#include "revision.h" +#include "revision_data.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// diff --git a/src/server/collision/CMakeLists.txt b/src/server/collision/CMakeLists.txt deleted file mode 100644 index f0f5cef5985..00000000000 --- a/src/server/collision/CMakeLists.txt +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -if( USE_COREPCH ) - include_directories(${CMAKE_CURRENT_BINARY_DIR}) -endif() - -file(GLOB_RECURSE sources_Management Management/*.cpp Management/*.h) -file(GLOB_RECURSE sources_Maps Maps/*.cpp Maps/*.h) -file(GLOB_RECURSE sources_Models Models/*.cpp Models/*.h) -file(GLOB sources_localdir *.cpp *.h) - -if (USE_COREPCH) - set(collision_STAT_PCH_HDR PrecompiledHeaders/collisionPCH.h) - set(collision_STAT_PCH_SRC PrecompiledHeaders/collisionPCH.cpp) -endif () - -set(collision_STAT_SRCS - ${collision_STAT_SRCS} - ${sources_Management} - ${sources_Maps} - ${sources_Models} - ${sources_localdir} -) - -include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Database - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/ipc - ${CMAKE_SOURCE_DIR}/src/server/game/Addons - ${CMAKE_SOURCE_DIR}/src/server/game/Conditions - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit - ${CMAKE_SOURCE_DIR}/src/server/game/Combat - ${CMAKE_SOURCE_DIR}/src/server/game/Loot - ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous - ${CMAKE_SOURCE_DIR}/src/server/game/Grids - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers - ${CMAKE_SOURCE_DIR}/src/server/game/Maps - ${CMAKE_SOURCE_DIR}/src/server/game/DataStores - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline - ${CMAKE_SOURCE_DIR}/src/server/game/Movement - ${CMAKE_SOURCE_DIR}/src/server/game/Server - ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol - ${CMAKE_SOURCE_DIR}/src/server/game/World - ${CMAKE_SOURCE_DIR}/src/server/game/Spells - ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/Management - ${CMAKE_CURRENT_SOURCE_DIR}/Maps - ${CMAKE_CURRENT_SOURCE_DIR}/Models - ${MYSQL_INCLUDE_DIR} - ${VALGRIND_INCLUDE_DIR} -) - -GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) - -add_library(collision STATIC - ${collision_STAT_SRCS} - ${collision_STAT_PCH_SRC} -) - -target_link_libraries(collision - shared -) - -# Generate precompiled header -if (USE_COREPCH) - add_cxx_pch(collision ${collision_STAT_PCH_HDR} ${collision_STAT_PCH_SRC}) -endif () diff --git a/src/server/collision/PrecompiledHeaders/collisionPCH.cpp b/src/server/collision/PrecompiledHeaders/collisionPCH.cpp deleted file mode 100644 index 36eae8e2b0d..00000000000 --- a/src/server/collision/PrecompiledHeaders/collisionPCH.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "collisionPCH.h" diff --git a/src/server/database/CMakeLists.txt b/src/server/database/CMakeLists.txt new file mode 100644 index 00000000000..2375f18d7b5 --- /dev/null +++ b/src/server/database/CMakeLists.txt @@ -0,0 +1,75 @@ +# Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> +# +# This file is free software; as a special exception the author gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +find_package(MySQL REQUIRED) + +if( USE_COREPCH ) + include_directories(${CMAKE_CURRENT_BINARY_DIR}) +endif() + +file(GLOB_RECURSE sources_Database Database/*.cpp Database/*.h) +file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) +file(GLOB_RECURSE sources_Updater Updater/*.cpp Updater/*.h) + +file(GLOB sources_localdir *.cpp *.h) + +# +# Build shared sourcelist +# + +if (USE_COREPCH) + set(database_STAT_PCH_HDR PrecompiledHeaders/databasePCH.h) + set(database_STAT_PCH_SRC PrecompiledHeaders/databasePCH.cpp) +endif() + +set(database_STAT_SRCS + ${database_STAT_SRCS} + ${sources_Database} + ${sources_Logging} + ${sources_Updater} +) + +# Do NOT add any extra include directory unless it does not create unneeded extra dependencies, +# and specially, not add any dependency to neither of these: shared, game, scripts +# This way we ensure that if either a PR does that without modifying this file, +# a compile error will be generated, either this file will be modified so it +# is detected more easily. +# While it is OK to include files from other libs as long as they don't require +# linkage (enums, defines...) it is discouraged to do so unless necessary, as it will pullute +# include_directories leading to further unnoticed dependency aditions +# Linker Depencency requirements: common +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/Database + ${CMAKE_CURRENT_SOURCE_DIR}/Updater + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/process + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${MYSQL_INCLUDE_DIR} + ${OPENSSL_INCLUDE_DIR} + ${VALGRIND_INCLUDE_DIR} +) + +GroupSources(${CMAKE_CURRENT_SOURCE_DIR}) + +add_library(database STATIC + ${database_STAT_SRCS} + ${database_STAT_PCH_SRC} +) + +# Generate precompiled header +if (USE_COREPCH) + add_cxx_pch(database ${database_STAT_PCH_HDR} ${database_STAT_PCH_SRC}) +endif () diff --git a/src/server/shared/Database/AdhocStatement.cpp b/src/server/database/Database/AdhocStatement.cpp index 547ff967efe..547ff967efe 100644 --- a/src/server/shared/Database/AdhocStatement.cpp +++ b/src/server/database/Database/AdhocStatement.cpp diff --git a/src/server/shared/Database/AdhocStatement.h b/src/server/database/Database/AdhocStatement.h index c449e0f6e59..c449e0f6e59 100644 --- a/src/server/shared/Database/AdhocStatement.h +++ b/src/server/database/Database/AdhocStatement.h diff --git a/src/server/shared/Database/DatabaseEnv.h b/src/server/database/Database/DatabaseEnv.h index 5567966b7e0..5567966b7e0 100644 --- a/src/server/shared/Database/DatabaseEnv.h +++ b/src/server/database/Database/DatabaseEnv.h diff --git a/src/server/shared/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp index 1d704100d93..1d704100d93 100644 --- a/src/server/shared/Database/DatabaseLoader.cpp +++ b/src/server/database/Database/DatabaseLoader.cpp diff --git a/src/server/shared/Database/DatabaseLoader.h b/src/server/database/Database/DatabaseLoader.h index 3bbf7e75771..3bbf7e75771 100644 --- a/src/server/shared/Database/DatabaseLoader.h +++ b/src/server/database/Database/DatabaseLoader.h diff --git a/src/server/shared/Database/DatabaseWorker.cpp b/src/server/database/Database/DatabaseWorker.cpp index 1fe638552a0..1fe638552a0 100644 --- a/src/server/shared/Database/DatabaseWorker.cpp +++ b/src/server/database/Database/DatabaseWorker.cpp diff --git a/src/server/shared/Database/DatabaseWorker.h b/src/server/database/Database/DatabaseWorker.h index 0ca476b1e66..0ca476b1e66 100644 --- a/src/server/shared/Database/DatabaseWorker.h +++ b/src/server/database/Database/DatabaseWorker.h diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index 6d35f03451d..fc8391b8f8d 100644 --- a/src/server/shared/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -428,10 +428,12 @@ class DatabaseWorkerPool Other */ + typedef typename T::Statements PreparedStatementIndex; + //! Automanaged (internally) pointer to a prepared statement object for usage in upper level code. //! Pointer is deleted in this->DirectExecute(PreparedStatement*), this->Query(PreparedStatement*) or PreparedStatementTask::~PreparedStatementTask. //! This object is not tied to the prepared statement on the MySQL context yet until execution. - PreparedStatement* GetPreparedStatement(uint32 index) + PreparedStatement* GetPreparedStatement(PreparedStatementIndex index) { return new PreparedStatement(index); } diff --git a/src/server/shared/Database/Field.cpp b/src/server/database/Database/Field.cpp index f7e8d73395e..a5c47e2fce8 100644 --- a/src/server/shared/Database/Field.cpp +++ b/src/server/database/Database/Field.cpp @@ -30,18 +30,11 @@ Field::~Field() CleanUp(); } -void Field::SetByteValue(const void* newValue, const size_t newSize, enum_field_types newType, uint32 length) +void Field::SetByteValue(void* newValue, enum_field_types newType, uint32 length) { - if (data.value) - CleanUp(); - // This value stores raw bytes that have to be explicitly cast later - if (newValue) - { - data.value = new char[newSize]; - memcpy(data.value, newValue, newSize); - data.length = length; - } + data.value = newValue; + data.length = length; data.type = newType; data.raw = true; } diff --git a/src/server/shared/Database/Field.h b/src/server/database/Database/Field.h index 65d1c131e32..4271d7a8d3e 100644 --- a/src/server/shared/Database/Field.h +++ b/src/server/database/Database/Field.h @@ -29,6 +29,8 @@ class Field friend class PreparedResultSet; public: + Field(); + ~Field(); bool GetBool() const // Wrapper, actually gets integer { @@ -43,7 +45,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_TINY)) { - TC_LOG_WARN("sql.sql", "Warning: GetUInt8() on non-tinyint field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetUInt8() on non-tinyint field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -61,7 +64,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_TINY)) { - TC_LOG_WARN("sql.sql", "Warning: GetInt8() on non-tinyint field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetInt8() on non-tinyint field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -79,7 +83,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_SHORT) && !IsType(MYSQL_TYPE_YEAR)) { - TC_LOG_WARN("sql.sql", "Warning: GetUInt16() on non-smallint field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetUInt16() on non-smallint field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -97,7 +102,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_SHORT) && !IsType(MYSQL_TYPE_YEAR)) { - TC_LOG_WARN("sql.sql", "Warning: GetInt16() on non-smallint field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetInt16() on non-smallint field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -115,7 +121,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_INT24) && !IsType(MYSQL_TYPE_LONG)) { - TC_LOG_WARN("sql.sql", "Warning: GetUInt32() on non-(medium)int field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetUInt32() on non-(medium)int field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -133,7 +140,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_INT24) && !IsType(MYSQL_TYPE_LONG)) { - TC_LOG_WARN("sql.sql", "Warning: GetInt32() on non-(medium)int field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetInt32() on non-(medium)int field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -151,7 +159,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_LONGLONG) && !IsType(MYSQL_TYPE_BIT)) { - TC_LOG_WARN("sql.sql", "Warning: GetUInt64() on non-bigint field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetUInt64() on non-bigint field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -169,7 +178,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_LONGLONG) && !IsType(MYSQL_TYPE_BIT)) { - TC_LOG_WARN("sql.sql", "Warning: GetInt64() on non-bigint field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetInt64() on non-bigint field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0; } #endif @@ -187,7 +197,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_FLOAT)) { - TC_LOG_WARN("sql.sql", "Warning: GetFloat() on non-float field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetFloat() on non-float field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0.0f; } #endif @@ -205,7 +216,8 @@ class Field #ifdef TRINITY_DEBUG if (!IsType(MYSQL_TYPE_DOUBLE)) { - TC_LOG_WARN("sql.sql", "Warning: GetDouble() on non-double field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Warning: GetDouble() on non-double field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return 0.0f; } #endif @@ -223,7 +235,8 @@ class Field #ifdef TRINITY_DEBUG if (IsNumeric()) { - TC_LOG_WARN("sql.sql", "Error: GetCString() on numeric field. Using type: %s.", FieldTypeToString(data.type)); + TC_LOG_WARN("sql.sql", "Error: GetCString() on numeric field %s.%s (%s.%s) at index %u. Using type: %s.", + meta.TableAlias, meta.Alias, meta.TableName, meta.Name, meta.Index, meta.Type); return NULL; } #endif @@ -235,16 +248,11 @@ class Field if (!data.value) return ""; - if (data.raw) - { - char const* string = GetCString(); - if (!string) - return ""; - - return std::string(string, data.length); - } + char const* string = GetCString(); + if (!string) + return ""; - return std::string((char*)data.value, data.length); + return std::string(string, data.length); } std::vector<uint8> GetBinary() const @@ -263,10 +271,17 @@ class Field return data.value == NULL; } - protected: - Field(); - ~Field(); + struct Metadata + { + char const* TableName; + char const* TableAlias; + char const* Name; + char const* Alias; + char const* Type; + uint32 Index; + }; + protected: #pragma pack(push, 1) struct { @@ -277,12 +292,14 @@ class Field } data; #pragma pack(pop) - void SetByteValue(void const* newValue, size_t const newSize, enum_field_types newType, uint32 length); + void SetByteValue(void* newValue, enum_field_types newType, uint32 length); void SetStructuredValue(char* newValue, enum_field_types newType, uint32 length); void CleanUp() { - delete[] ((char*)data.value); + // Field does not own the data if fetched with prepared statement + if (!data.raw) + delete[] ((char*)data.value); data.value = NULL; } @@ -387,6 +404,19 @@ class Field default: return "-Unknown-"; } } + + void SetMetadata(MYSQL_FIELD* field, uint32 fieldIndex) + { + meta.TableName = field->org_table; + meta.TableAlias = field->table; + meta.Name = field->org_name; + meta.Alias = field->name; + meta.Type = FieldTypeToString(field->type); + meta.Index = fieldIndex; + } + + Metadata meta; + #endif }; diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 9fa6e7f29ec..940bee4e3a2 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -22,7 +22,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() if (!m_reconnecting) m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS); -#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.bonusListIDs" +#define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.bonusListIDs" PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC); @@ -115,7 +115,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAIL_COUNT, "SELECT COUNT(*) FROM mail WHERE receiver = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, item, time FROM character_spell_cooldown WHERE guid = ? AND time > UNIX_TIMESTAMP()", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, item, time, categoryId, categoryEnd FROM character_spell_cooldown WHERE guid = ? AND time > UNIX_TIMESTAMP()", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SPELL_CHARGES, "SELECT categoryId, rechargeStart, rechargeEnd FROM character_spell_charges WHERE guid = ? AND rechargeEnd > UNIX_TIMESTAMP() ORDER BY rechargeEnd", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_GUILD_MEMBER, "SELECT guildid, rank FROM guild_member WHERE guid = ?", CONNECTION_BOTH); @@ -159,8 +159,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, transmogrification = ?, upgradeId = ?, enchantIllusion = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, transmogrification = ?, upgradeId = ?, enchantIllusion = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC); @@ -338,11 +338,11 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); // Corpse - PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CORPSES_FROM_MAP, "DELETE cp, c FROM corpse_phases cp INNER JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CORPSE_PHASES, "SELECT cp.OwnerGuid, cp.PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_DEL_CORPSES_FROM_MAP, "DELETE cp, c FROM corpse_phases cp INNER JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CORPSE_PHASES, "SELECT cp.OwnerGuid, cp.PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_CORPSE_PHASES, "INSERT INTO corpse_phases (OwnerGuid, PhaseId) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CORPSE_PHASES, "DELETE FROM corpse_phases WHERE OwnerGuid = ?", CONNECTION_ASYNC); @@ -530,7 +530,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET knownTitles = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_RES_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET chosenTitle = 0 WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_SPELL_COOLDOWNS, "DELETE FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_SPELL_COOLDOWN, "INSERT INTO character_spell_cooldown (guid, spell, item, time) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_SPELL_COOLDOWN, "INSERT INTO character_spell_cooldown (guid, spell, item, time, categoryId, categoryEnd) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_SPELL_CHARGES, "DELETE FROM character_spell_charges WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_SPELL_CHARGES, "INSERT INTO character_spell_charges (guid, categoryId, rechargeStart, rechargeEnd) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHARACTER, "DELETE FROM characters WHERE guid = ?", CONNECTION_ASYNC); @@ -585,8 +585,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_CHAR_LIST_SLOT, "UPDATE characters SET slot = ? WHERE guid = ? AND account = ?", CONNECTION_ASYNC); // Void Storage - PrepareStatement(CHAR_SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomProperty, suffixFactor FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomProperty, suffixFactor) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomProperty, suffixFactor, upgradeId, bonusListIDs FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomProperty, suffixFactor, upgradeId, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?", CONNECTION_ASYNC); @@ -631,13 +631,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_PET_AURA, "SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PET_AURA_EFFECT, "SELECT casterGuid, spell, effectMask, effectIndex, amount, baseAmount FROM pet_aura_effect WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PET_SPELL, "SELECT spell, active FROM pet_spell WHERE guid = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time FROM pet_spell_cooldown WHERE guid = ? AND time > UNIX_TIMESTAMP()", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time, categoryId, categoryEnd FROM pet_spell_cooldown WHERE guid = ? AND time > UNIX_TIMESTAMP()", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PET_DECLINED_NAME, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = ? AND id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_PET_AURAS, "DELETE FROM pet_aura WHERE guid = ?", CONNECTION_BOTH); PrepareStatement(CHAR_DEL_PET_AURA_EFFECTS, "DELETE FROM pet_aura_effect WHERE guid = ?", CONNECTION_BOTH); PrepareStatement(CHAR_DEL_PET_SPELLS, "DELETE FROM pet_spell WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PET_SPELL_COOLDOWNS, "DELETE FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_BOTH); - PrepareStatement(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES (?, ?, ?)", CONNECTION_BOTH); + PrepareStatement(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time, categoryId, categoryEnd) VALUES (?, ?, ?, ?, ?)", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_PET_SPELL_CHARGES, "SELECT categoryId, rechargeStart, rechargeEnd FROM pet_spell_charges WHERE guid = ? AND rechargeEnd > UNIX_TIMESTAMP() ORDER BY rechargeEnd", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_PET_SPELL_CHARGES, "DELETE FROM pet_spell_charges WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_PET_SPELL_CHARGES, "INSERT INTO pet_spell_charges (guid, categoryId, rechargeStart, rechargeEnd) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 5fd73b6c494..2054bfa7ca5 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -21,19 +21,6 @@ #include "DatabaseWorkerPool.h" #include "MySQLConnection.h" -class CharacterDatabaseConnection : public MySQLConnection -{ - public: - //- Constructors for sync and async connections - CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } - CharacterDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } - - //- Loads database type specific prepared statements - void DoPrepareStatements() override; -}; - -typedef DatabaseWorkerPool<CharacterDatabaseConnection> CharacterDatabaseWorkerPool; - enum CharacterDatabaseStatements { /* Naming standard for defines: @@ -608,4 +595,19 @@ enum CharacterDatabaseStatements MAX_CHARACTERDATABASE_STATEMENTS }; +class CharacterDatabaseConnection : public MySQLConnection +{ +public: + typedef CharacterDatabaseStatements Statements; + + //- Constructors for sync and async connections + CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } + CharacterDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } + + //- Loads database type specific prepared statements + void DoPrepareStatements() override; +}; + +typedef DatabaseWorkerPool<CharacterDatabaseConnection> CharacterDatabaseWorkerPool; + #endif diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index be2ff140fd8..104b5e2bbc7 100644 --- a/src/server/shared/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -27,6 +27,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() if (!m_reconnecting) m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS); + // Achievement.db2 + PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Faction, MapID, Supercedes, Title, Description, Category, Points, UIOrder, Flags, IconID, " + "Reward, MinimumCriteria, SharesCriteria, CriteriaTree FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title_lang, Description_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH); + // AreaGroup.db2 PrepareStatement(HOTFIX_SEL_AREA_GROUP, "SELECT ID FROM area_group ORDER BY ID DESC", CONNECTION_SYNCH); @@ -42,6 +47,20 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?", CONNECTION_SYNCH); + // BattlePetBreedQuality.db2 + PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, Quality, Modifier FROM battle_pet_breed_quality ORDER BY ID DESC", CONNECTION_SYNCH); + + // BattlePetBreedState.db2 + PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BreedID, State, Value FROM battle_pet_breed_state ORDER BY ID DESC", CONNECTION_SYNCH); + + // BattlePetSpecies.db2 + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, CreatureID, IconFileID, SummonSpellID, PetType, Source, Flags, " + "SourceText, Description FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, SourceText, Description FROM battle_pet_species_locale WHERE locale = ?", CONNECTION_SYNCH); + + // BattlePetSpeciesState.db2 + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, SpeciesID, State, Value FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH); + // BroadcastText.db2 PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " "EmoteDelay3, SoundID, UnkEmoteID, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); @@ -71,6 +90,15 @@ void HotfixDatabaseConnection::DoPrepareStatements() 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); + // Criteria.db2 + PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Type, Asset, StartEvent, StartAsset, StartTimer, FailEvent, FailAsset, ModifierTreeId, Flags, " + "EligibilityWorldStateID, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); + + // CriteriaTree.db2 + PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, CriteriaID, Operator, Parent, Flags, Description, OrderIndex FROM criteria_tree" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?", CONNECTION_SYNCH); + // CurrencyTypes.db2 PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, CategoryID, Name, InventoryIcon1, InventoryIcon2, SpellWeight, SpellCategory, MaxQty, " "MaxEarnablePerWeek, Flags, Quality, Description FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); @@ -263,6 +291,9 @@ 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); @@ -275,8 +306,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body FROM mail_template ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); + // ModifierTree.db2 + PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Type, Asset1, Asset2, Operator, Amount, Parent FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH); + // Mount.db2 - PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Id, MountTypeId, DisplayId, Flags, Name, Description, SourceDescription, Source, SpellId, " + PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Id, SpellId, MountTypeId, DisplayId, Flags, Name, Description, SourceDescription, Source, " "PlayerConditionId FROM mount ORDER BY Id DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT Id, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -284,13 +318,22 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, RequiredRidingSkill, RequiredArea, RequiredAura, RequiredSpell, SpeedModSpell, " "RequiredMap FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); - // MountType.db2 + // MountTypeXCapability.db2 PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, OrderIndex, MountCapabilityID FROM mount_type_x_capability ORDER BY ID DESC", CONNECTION_SYNCH); // NameGen.db2 PrepareStatement(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name, Race, Sex FROM name_gen ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name_lang FROM name_gen_locale WHERE locale = ?", CONNECTION_SYNCH); + // NamesProfanity.db2 + PrepareStatement(HOTFIX_SEL_NAMES_PROFANITY, "SELECT ID, Name, Language FROM names_profanity ORDER BY ID DESC", CONNECTION_SYNCH); + + // NamesReserved.db2 + PrepareStatement(HOTFIX_SEL_NAMES_RESERVED, "SELECT ID, Name FROM names_reserved ORDER BY ID DESC", CONNECTION_SYNCH); + + // NamesReservedLocale.db2 + PrepareStatement(HOTFIX_SEL_NAMES_RESERVED_LOCALE, "SELECT ID, Name, LocaleMask FROM names_reserved_locale ORDER BY ID DESC", CONNECTION_SYNCH); + // OverrideSpellData.db2 PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, SpellID1, SpellID2, SpellID3, SpellID4, SpellID5, SpellID6, SpellID7, SpellID8, " "SpellID9, SpellID10, Flags, PlayerActionbarFileDataID FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); @@ -417,6 +460,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, CategoryType, CategoryMask FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name_lang FROM totem_category_locale WHERE locale = ?", CONNECTION_SYNCH); + // Toy.db2 + PrepareStatement(HOTFIX_SEL_TOY, "SELECT ID, ItemID, Flags, Description, CategoryFilter FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_TOY, "SELECT ID, Description_lang FROM toy_locale WHERE locale = ?", CONNECTION_SYNCH); + // TransportAnimation.db2 PrepareStatement(HOTFIX_SEL_TRANSPORT_ANIMATION, "SELECT ID, TransportID, TimeIndex, PosX, PosY, PosZ, SequenceID FROM transport_animation" " ORDER BY ID DESC", CONNECTION_SYNCH); diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index c92b7b23499..196d7602da7 100644 --- a/src/server/shared/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -21,19 +21,6 @@ #include "DatabaseWorkerPool.h" #include "MySQLConnection.h" -class HotfixDatabaseConnection : public MySQLConnection -{ - public: - //- Constructors for sync and async connections - HotfixDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } - HotfixDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } - - //- Loads database type specific prepared statements - void DoPrepareStatements() override; -}; - -typedef DatabaseWorkerPool<HotfixDatabaseConnection> HotfixDatabaseWorkerPool; - enum HotfixDatabaseStatements { /* Naming standard for defines: @@ -42,6 +29,9 @@ enum HotfixDatabaseStatements name for a suiting suffix. */ + HOTFIX_SEL_ACHIEVEMENT, + HOTFIX_SEL_ACHIEVEMENT_LOCALE, + HOTFIX_SEL_AREA_GROUP, HOTFIX_SEL_AREA_GROUP_MEMBER, @@ -52,6 +42,15 @@ enum HotfixDatabaseStatements HOTFIX_SEL_BARBER_SHOP_STYLE, HOTFIX_SEL_BARBER_SHOP_STYLE_LOCALE, + HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, + + HOTFIX_SEL_BATTLE_PET_BREED_STATE, + + HOTFIX_SEL_BATTLE_PET_SPECIES, + HOTFIX_SEL_BATTLE_PET_SPECIES_LOCALE, + + HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, + HOTFIX_SEL_BROADCAST_TEXT, HOTFIX_SEL_BROADCAST_TEXT_LOCALE, @@ -67,6 +66,11 @@ enum HotfixDatabaseStatements HOTFIX_SEL_CREATURE_TYPE, HOTFIX_SEL_CREATURE_TYPE_LOCALE, + HOTFIX_SEL_CRITERIA, + + HOTFIX_SEL_CRITERIA_TREE, + HOTFIX_SEL_CRITERIA_TREE_LOCALE, + HOTFIX_SEL_CURRENCY_TYPES, HOTFIX_SEL_CURRENCY_TYPES_LOCALE, @@ -164,6 +168,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_ITEM_SPEC_OVERRIDE, + HOTFIX_SEL_ITEM_TO_BATTLE_PET_SPECIES, + HOTFIX_SEL_ITEM_X_BONUS_TREE, HOTFIX_SEL_KEY_CHAIN, @@ -171,6 +177,8 @@ enum HotfixDatabaseStatements HOTFIX_SEL_MAIL_TEMPLATE, HOTFIX_SEL_MAIL_TEMPLATE_LOCALE, + HOTFIX_SEL_MODIFIER_TREE, + HOTFIX_SEL_MOUNT, HOTFIX_SEL_MOUNT_LOCALE, @@ -181,6 +189,12 @@ enum HotfixDatabaseStatements HOTFIX_SEL_NAME_GEN, HOTFIX_SEL_NAME_GEN_LOCALE, + HOTFIX_SEL_NAMES_PROFANITY, + + HOTFIX_SEL_NAMES_RESERVED, + + HOTFIX_SEL_NAMES_RESERVED_LOCALE, + HOTFIX_SEL_OVERRIDE_SPELL_DATA, HOTFIX_SEL_PHASE_X_PHASE_GROUP, @@ -247,6 +261,9 @@ enum HotfixDatabaseStatements HOTFIX_SEL_TOTEM_CATEGORY, HOTFIX_SEL_TOTEM_CATEGORY_LOCALE, + HOTFIX_SEL_TOY, + HOTFIX_SEL_TOY_LOCALE, + HOTFIX_SEL_TRANSPORT_ANIMATION, HOTFIX_SEL_TRANSPORT_ROTATION, @@ -260,4 +277,19 @@ enum HotfixDatabaseStatements MAX_HOTFIXDATABASE_STATEMENTS }; +class HotfixDatabaseConnection : public MySQLConnection +{ +public: + typedef HotfixDatabaseStatements Statements; + + //- Constructors for sync and async connections + HotfixDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } + HotfixDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } + + //- Loads database type specific prepared statements + void DoPrepareStatements() override; +}; + +typedef DatabaseWorkerPool<HotfixDatabaseConnection> HotfixDatabaseWorkerPool; + #endif diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 51a0217ac17..9526e012fa2 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -41,8 +41,8 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, a.expansion, a.mutetime, ba.locale, a.recruiter, ba.os, ba.id, aa.gmLevel, " "bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, r.id " - "FROM account a LEFT JOIN battlenet_accounts ba ON a.battlenet_account = ba.id LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID IN (-1, ?) " - "LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account r ON a.id = r.recruiter " + "FROM account a LEFT JOIN account r ON a.id = r.recruiter LEFT JOIN battlenet_accounts ba ON a.battlenet_account = ba.id " + "LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID IN (-1, ?) LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account_banned ab ON a.id = ab.id " "WHERE a.username = ? ORDER BY aa.RealmID DESC LIMIT 1", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?", CONNECTION_SYNCH); @@ -140,4 +140,17 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_LAST_CHAR_UNDELETE, "SELECT LastCharacterUndelete FROM battlenet_accounts WHERE Id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_LAST_CHAR_UNDELETE, "UPDATE battlenet_accounts SET LastCharacterUndelete = UNIX_TIMESTAMP() WHERE Id = ?", CONNECTION_ASYNC); + + // Account wide toys + PrepareStatement(LOGIN_SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite FROM battlenet_account_toys WHERE accountId = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite) VALUES (?, ?, ?)", CONNECTION_ASYNC); + + // Battle Pets + PrepareStatement(LOGIN_SEL_BATTLE_PETS, "SELECT guid, species, breed, level, exp, health, quality, flags, name FROM battle_pets WHERE battlenetAccountId = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_INS_BATTLE_PETS, "INSERT INTO battle_pets (guid, battlenetAccountId, species, breed, level, exp, health, quality, flags, name) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(LOGIN_DEL_BATTLE_PETS, "DELETE FROM battle_pets WHERE battlenetAccountId = ? AND guid = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_UPD_BATTLE_PETS, "UPDATE battle_pets SET level = ?, exp = ?, health = ?, quality = ?, flags = ?, name = ? WHERE battlenetAccountId = ? AND guid = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_BATTLE_PET_SLOTS, "SELECT id, battlePetGuid, locked FROM battle_pet_slots WHERE battlenetAccountId = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_INS_BATTLE_PET_SLOTS, "INSERT INTO battle_pet_slots (id, battlenetAccountId, battlePetGuid, locked) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(LOGIN_DEL_BATTLE_PET_SLOTS, "DELETE FROM battle_pet_slots WHERE battlenetAccountId = ?", CONNECTION_ASYNC); } diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h index 06d13f29da3..9ef214a3120 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.h +++ b/src/server/database/Database/Implementation/LoginDatabase.h @@ -21,19 +21,6 @@ #include "DatabaseWorkerPool.h" #include "MySQLConnection.h" -class LoginDatabaseConnection : public MySQLConnection -{ - public: - //- Constructors for sync and async connections - LoginDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } - LoginDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } - - //- Loads database type specific prepared statements - void DoPrepareStatements() override; -}; - -typedef DatabaseWorkerPool<LoginDatabaseConnection> LoginDatabaseWorkerPool; - enum LoginDatabaseStatements { /* Naming standard for defines: @@ -143,7 +130,33 @@ enum LoginDatabaseStatements LOGIN_SEL_LAST_CHAR_UNDELETE, LOGIN_UPD_LAST_CHAR_UNDELETE, + LOGIN_SEL_ACCOUNT_TOYS, + LOGIN_REP_ACCOUNT_TOYS, + + LOGIN_SEL_BATTLE_PETS, + LOGIN_INS_BATTLE_PETS, + LOGIN_DEL_BATTLE_PETS, + LOGIN_UPD_BATTLE_PETS, + LOGIN_SEL_BATTLE_PET_SLOTS, + LOGIN_INS_BATTLE_PET_SLOTS, + LOGIN_DEL_BATTLE_PET_SLOTS, + MAX_LOGINDATABASE_STATEMENTS }; +class LoginDatabaseConnection : public MySQLConnection +{ +public: + typedef LoginDatabaseStatements Statements; + + //- Constructors for sync and async connections + LoginDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } + LoginDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } + + //- Loads database type specific prepared statements + void DoPrepareStatements() override; +}; + +typedef DatabaseWorkerPool<LoginDatabaseConnection> LoginDatabaseWorkerPool; + #endif diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp index 4650f43ee0a..4650f43ee0a 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/database/Database/Implementation/WorldDatabase.cpp diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h index 46a43886d6b..9f41b305d43 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.h +++ b/src/server/database/Database/Implementation/WorldDatabase.h @@ -21,19 +21,6 @@ #include "DatabaseWorkerPool.h" #include "MySQLConnection.h" -class WorldDatabaseConnection : public MySQLConnection -{ - public: - //- Constructors for sync and async connections - WorldDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } - WorldDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } - - //- Loads database type specific prepared statements - void DoPrepareStatements() override; -}; - -typedef DatabaseWorkerPool<WorldDatabaseConnection> WorldDatabaseWorkerPool; - enum WorldDatabaseStatements { /* Naming standard for defines: @@ -116,4 +103,19 @@ enum WorldDatabaseStatements MAX_WORLDDATABASE_STATEMENTS }; +class WorldDatabaseConnection : public MySQLConnection +{ +public: + typedef WorldDatabaseStatements Statements; + + //- Constructors for sync and async connections + WorldDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { } + WorldDatabaseConnection(ProducerConsumerQueue<SQLOperation*>* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { } + + //- Loads database type specific prepared statements + void DoPrepareStatements() override; +}; + +typedef DatabaseWorkerPool<WorldDatabaseConnection> WorldDatabaseWorkerPool; + #endif diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp index a16559a55dc..a16559a55dc 100644 --- a/src/server/shared/Database/MySQLConnection.cpp +++ b/src/server/database/Database/MySQLConnection.cpp diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/database/Database/MySQLConnection.h index 78d8d2fb5dd..78d8d2fb5dd 100644 --- a/src/server/shared/Database/MySQLConnection.h +++ b/src/server/database/Database/MySQLConnection.h diff --git a/src/server/shared/Database/MySQLThreading.h b/src/server/database/Database/MySQLThreading.h index 441f30cb6ec..441f30cb6ec 100644 --- a/src/server/shared/Database/MySQLThreading.h +++ b/src/server/database/Database/MySQLThreading.h diff --git a/src/server/shared/Database/PreparedStatement.cpp b/src/server/database/Database/PreparedStatement.cpp index 2c9ce136e6e..2c9ce136e6e 100644 --- a/src/server/shared/Database/PreparedStatement.cpp +++ b/src/server/database/Database/PreparedStatement.cpp diff --git a/src/server/shared/Database/PreparedStatement.h b/src/server/database/Database/PreparedStatement.h index 71d5f1aead5..71d5f1aead5 100644 --- a/src/server/shared/Database/PreparedStatement.h +++ b/src/server/database/Database/PreparedStatement.h diff --git a/src/server/shared/Database/QueryHolder.cpp b/src/server/database/Database/QueryHolder.cpp index 2fdb3825526..2fdb3825526 100644 --- a/src/server/shared/Database/QueryHolder.cpp +++ b/src/server/database/Database/QueryHolder.cpp diff --git a/src/server/shared/Database/QueryHolder.h b/src/server/database/Database/QueryHolder.h index 657496e8196..657496e8196 100644 --- a/src/server/shared/Database/QueryHolder.h +++ b/src/server/database/Database/QueryHolder.h diff --git a/src/server/shared/Database/QueryResult.cpp b/src/server/database/Database/QueryResult.cpp index 61a1a682705..40877890ab1 100644 --- a/src/server/shared/Database/QueryResult.cpp +++ b/src/server/database/Database/QueryResult.cpp @@ -26,7 +26,10 @@ _result(result), _fields(fields) { _currentRow = new Field[_fieldCount]; - ASSERT(_currentRow); +#ifdef TRINITY_DEBUG + for (uint32 i = 0; i < _fieldCount; i++) + _currentRow[i].SetMetadata(&_fields[i], i); +#endif } PreparedResultSet::PreparedResultSet(MYSQL_STMT* stmt, MYSQL_RES *result, uint64 rowCount, uint32 fieldCount) : @@ -35,11 +38,11 @@ m_rowPosition(0), m_fieldCount(fieldCount), m_rBind(NULL), m_stmt(stmt), -m_res(result), +m_metadataResult(result), m_isNull(NULL), m_length(NULL) { - if (!m_res) + if (!m_metadataResult) return; if (m_stmt->bind_result_done) @@ -66,50 +69,52 @@ m_length(NULL) return; } + m_rowCount = mysql_stmt_num_rows(m_stmt); + //- This is where we prepare the buffer based on metadata - uint32 i = 0; - MYSQL_FIELD* field = mysql_fetch_field(m_res); - while (field) + MYSQL_FIELD* field = mysql_fetch_fields(m_metadataResult); + std::size_t rowSize = 0; + for (uint32 i = 0; i < m_fieldCount; ++i) { - size_t size = Field::SizeForType(field); + size_t size = Field::SizeForType(&field[i]); + rowSize += size; - m_rBind[i].buffer_type = field->type; - m_rBind[i].buffer = malloc(size); - memset(m_rBind[i].buffer, 0, size); + m_rBind[i].buffer_type = field[i].type; m_rBind[i].buffer_length = size; m_rBind[i].length = &m_length[i]; m_rBind[i].is_null = &m_isNull[i]; m_rBind[i].error = NULL; - m_rBind[i].is_unsigned = field->flags & UNSIGNED_FLAG; + m_rBind[i].is_unsigned = field[i].flags & UNSIGNED_FLAG; + } - ++i; - field = mysql_fetch_field(m_res); + char* dataBuffer = new char[rowSize * m_rowCount]; + for (uint32 i = 0, offset = 0; i < m_fieldCount; ++i) + { + m_rBind[i].buffer = dataBuffer + offset; + offset += m_rBind[i].buffer_length; } //- This is where we bind the bind the buffer to the statement if (mysql_stmt_bind_result(m_stmt, m_rBind)) { TC_LOG_WARN("sql.sql", "%s:mysql_stmt_bind_result, cannot bind result from MySQL server. Error: %s", __FUNCTION__, mysql_stmt_error(m_stmt)); - delete[] m_rBind; + mysql_stmt_free_result(m_stmt); + CleanUp(); delete[] m_isNull; delete[] m_length; return; } - m_rowCount = mysql_stmt_num_rows(m_stmt); - - m_rows.resize(uint32(m_rowCount)); + m_rows.resize(uint32(m_rowCount) * m_fieldCount); while (_NextRow()) { - m_rows[uint32(m_rowPosition)] = new Field[m_fieldCount]; - for (uint64 fIndex = 0; fIndex < m_fieldCount; ++fIndex) + for (uint32 fIndex = 0; fIndex < m_fieldCount; ++fIndex) { + unsigned long buffer_length = m_rBind[fIndex].buffer_length; + unsigned long fetched_length = *m_rBind[fIndex].length; if (!*m_rBind[fIndex].is_null) - m_rows[uint32(m_rowPosition)][fIndex].SetByteValue(m_rBind[fIndex].buffer, - m_rBind[fIndex].buffer_length, - m_rBind[fIndex].buffer_type, - *m_rBind[fIndex].length); - else + { + void* buffer = m_stmt->bind[fIndex].buffer; switch (m_rBind[fIndex].buffer_type) { case MYSQL_TYPE_TINY_BLOB: @@ -118,24 +123,44 @@ m_length(NULL) case MYSQL_TYPE_BLOB: case MYSQL_TYPE_STRING: case MYSQL_TYPE_VAR_STRING: - m_rows[uint32(m_rowPosition)][fIndex].SetByteValue("", - m_rBind[fIndex].buffer_length, - m_rBind[fIndex].buffer_type, - *m_rBind[fIndex].length); - break; + // warning - the string will not be null-terminated if there is no space for it in the buffer + // when mysql_stmt_fetch returned MYSQL_DATA_TRUNCATED + // we cannot blindly null-terminate the data either as it may be retrieved as binary blob and not specifically a string + // in this case using Field::GetCString will result in garbage + // TODO: remove Field::GetCString and use boost::string_ref (currently proposed for TS as string_view, maybe in C++17) + if (fetched_length < buffer_length) + *((char*)buffer + fetched_length) = '\0'; + break; default: - m_rows[uint32(m_rowPosition)][fIndex].SetByteValue(nullptr, - m_rBind[fIndex].buffer_length, - m_rBind[fIndex].buffer_type, - *m_rBind[fIndex].length); + break; } + + m_rows[uint32(m_rowPosition) * m_fieldCount + fIndex].SetByteValue( + buffer, + m_rBind[fIndex].buffer_type, + fetched_length); + + // move buffer pointer to next part + m_stmt->bind[fIndex].buffer = (char*)buffer + rowSize; + } + else + { + m_rows[uint32(m_rowPosition) * m_fieldCount + fIndex].SetByteValue( + nullptr, + m_rBind[fIndex].buffer_type, + *m_rBind[fIndex].length); + } + +#ifdef TRINITY_DEBUG + m_rows[uint32(m_rowPosition) * m_fieldCount + fIndex].SetMetadata(&field[fIndex], fIndex); +#endif } m_rowPosition++; } m_rowPosition = 0; /// All data is buffered, let go of mysql c api structures - CleanUp(); + mysql_stmt_free_result(m_stmt); } ResultSet::~ResultSet() @@ -145,8 +170,7 @@ ResultSet::~ResultSet() PreparedResultSet::~PreparedResultSet() { - for (uint32 i = 0; i < uint32(m_rowCount); ++i) - delete[] m_rows[i]; + CleanUp(); } bool ResultSet::NextRow() @@ -215,18 +239,13 @@ void ResultSet::CleanUp() void PreparedResultSet::CleanUp() { - /// More of the in our code allocated sources are deallocated by the poorly documented mysql c api - if (m_res) - mysql_free_result(m_res); + if (m_metadataResult) + mysql_free_result(m_metadataResult); - FreeBindBuffer(); - mysql_stmt_free_result(m_stmt); - - delete[] m_rBind; -} - -void PreparedResultSet::FreeBindBuffer() -{ - for (uint32 i = 0; i < m_fieldCount; ++i) - free (m_rBind[i].buffer); + if (m_rBind) + { + delete[](char*)m_rBind->buffer; + delete[] m_rBind; + m_rBind = nullptr; + } } diff --git a/src/server/shared/Database/QueryResult.h b/src/server/database/Database/QueryResult.h index a61fb6331c1..0447ecaae5a 100644 --- a/src/server/shared/Database/QueryResult.h +++ b/src/server/database/Database/QueryResult.h @@ -73,18 +73,18 @@ class PreparedResultSet Field* Fetch() const { ASSERT(m_rowPosition < m_rowCount); - return m_rows[uint32(m_rowPosition)]; + return const_cast<Field*>(&m_rows[uint32(m_rowPosition) * m_fieldCount]); } - const Field & operator [] (uint32 index) const + Field const& operator[](uint32 index) const { ASSERT(m_rowPosition < m_rowCount); ASSERT(index < m_fieldCount); - return m_rows[uint32(m_rowPosition)][index]; + return m_rows[uint32(m_rowPosition) * m_fieldCount + index]; } protected: - std::vector<Field*> m_rows; + std::vector<Field> m_rows; uint64 m_rowCount; uint64 m_rowPosition; uint32 m_fieldCount; @@ -92,12 +92,11 @@ class PreparedResultSet private: MYSQL_BIND* m_rBind; MYSQL_STMT* m_stmt; - MYSQL_RES* m_res; + MYSQL_RES* m_metadataResult; ///< Field metadata, returned by mysql_stmt_result_metadata my_bool* m_isNull; unsigned long* m_length; - void FreeBindBuffer(); void CleanUp(); bool _NextRow(); diff --git a/src/server/shared/Database/SQLOperation.h b/src/server/database/Database/SQLOperation.h index c5667288ec0..c5667288ec0 100644 --- a/src/server/shared/Database/SQLOperation.h +++ b/src/server/database/Database/SQLOperation.h diff --git a/src/server/shared/Database/Transaction.cpp b/src/server/database/Database/Transaction.cpp index f657411f716..f657411f716 100644 --- a/src/server/shared/Database/Transaction.cpp +++ b/src/server/database/Database/Transaction.cpp diff --git a/src/server/shared/Database/Transaction.h b/src/server/database/Database/Transaction.h index 4fbbe1ed45b..4fbbe1ed45b 100644 --- a/src/server/shared/Database/Transaction.h +++ b/src/server/database/Database/Transaction.h diff --git a/src/server/shared/Logging/AppenderDB.cpp b/src/server/database/Logging/AppenderDB.cpp index 8a329ea3a0f..9e6ab1a057c 100644 --- a/src/server/shared/Logging/AppenderDB.cpp +++ b/src/server/database/Logging/AppenderDB.cpp @@ -18,8 +18,8 @@ #include "AppenderDB.h" #include "Database/DatabaseEnv.h" -AppenderDB::AppenderDB(uint8 id, std::string const& name, LogLevel level) - : Appender(id, name, APPENDER_DB, level), realmId(0), enabled(false) { } +AppenderDB::AppenderDB(uint8 id, std::string const& name, LogLevel level, AppenderFlags /*flags*/, ExtraAppenderArgs /*extraArgs*/) + : Appender(id, name, level), realmId(0), enabled(false) { } AppenderDB::~AppenderDB() { } diff --git a/src/server/shared/Logging/AppenderDB.h b/src/server/database/Logging/AppenderDB.h index 09affdb46f1..50607fd8136 100644 --- a/src/server/shared/Logging/AppenderDB.h +++ b/src/server/database/Logging/AppenderDB.h @@ -23,10 +23,13 @@ class AppenderDB: public Appender { public: - AppenderDB(uint8 _id, std::string const& _name, LogLevel level); + typedef std::integral_constant<AppenderType, APPENDER_DB>::type TypeIndex; + + AppenderDB(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags, ExtraAppenderArgs extraArgs); ~AppenderDB(); - void setRealmId(uint32 realmId); + void setRealmId(uint32 realmId) override; + AppenderType getType() const override { return TypeIndex::value; } private: uint32 realmId; diff --git a/src/server/database/PrecompiledHeaders/databasePCH.cpp b/src/server/database/PrecompiledHeaders/databasePCH.cpp new file mode 100644 index 00000000000..f84a52be82a --- /dev/null +++ b/src/server/database/PrecompiledHeaders/databasePCH.cpp @@ -0,0 +1 @@ +#include "PrecompiledHeaders/databasePCH.h" diff --git a/src/server/database/PrecompiledHeaders/databasePCH.h b/src/server/database/PrecompiledHeaders/databasePCH.h new file mode 100644 index 00000000000..d524d52ade0 --- /dev/null +++ b/src/server/database/PrecompiledHeaders/databasePCH.h @@ -0,0 +1,23 @@ +#include "Config.h" +#include "Database/AdhocStatement.h" +#include "Database/DatabaseEnv.h" +#include "Database/DatabaseLoader.h" +#include "Database/DatabaseWorker.h" +#include "Database/DatabaseWorkerPool.h" +#include "Database/Field.h" +#include "Database/MySQLConnection.h" +#include "Database/MySQLThreading.h" +#include "Database/PreparedStatement.h" +#include "Database/QueryHolder.h" +#include "Database/QueryResult.h" +#include "Database/SQLOperation.h" +#include "Database/Transaction.h" +#include "Logging/Appender.h" +#include "Logging/AppenderConsole.h" +#include "Logging/AppenderDB.h" +#include "Logging/AppenderFile.h" +#include "Logging/Log.h" +#include "Logging/LogOperation.h" +#include "Logging/Logger.h" +#include "Updater/DBUpdater.h" +#include "Updater/UpdateFetcher.h" diff --git a/src/server/shared/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 9e3bae11610..c0dfd400efc 100644 --- a/src/server/shared/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -17,7 +17,7 @@ #include "DBUpdater.h" #include "Log.h" -#include "revision.h" +#include "GitRevision.h" #include "UpdateFetcher.h" #include "DatabaseLoader.h" #include "Config.h" @@ -40,7 +40,7 @@ std::string DBUpdater<T>::GetSourceDirectory() if (!entry.empty()) return entry; else - return _SOURCE_DIRECTORY; + return GitRevision::GetSourceDirectory(); } template<class T> @@ -50,7 +50,7 @@ std::string DBUpdater<T>::GetMySqlCli() if (!entry.empty()) return entry; else - return _MYSQL_EXECUTABLE; + return GitRevision::GetMySQLExecutable(); } // Auth Database @@ -95,7 +95,7 @@ std::string DBUpdater<WorldDatabaseConnection>::GetTableName() template<> std::string DBUpdater<WorldDatabaseConnection>::GetBaseFile() { - return _FULL_DATABASE; + return GitRevision::GetFullDatabase(); } template<> @@ -153,7 +153,7 @@ std::string DBUpdater<HotfixDatabaseConnection>::GetTableName() template<> std::string DBUpdater<HotfixDatabaseConnection>::GetBaseFile() { - return _HOTFIXES_DATABASE; + return GitRevision::GetHotfixesDatabase(); } template<> diff --git a/src/server/shared/Updater/DBUpdater.h b/src/server/database/Updater/DBUpdater.h index a2b12bed235..a2b12bed235 100644 --- a/src/server/shared/Updater/DBUpdater.h +++ b/src/server/database/Updater/DBUpdater.h diff --git a/src/server/shared/Updater/UpdateFetcher.cpp b/src/server/database/Updater/UpdateFetcher.cpp index ec023928b99..ec023928b99 100644 --- a/src/server/shared/Updater/UpdateFetcher.cpp +++ b/src/server/database/Updater/UpdateFetcher.cpp diff --git a/src/server/shared/Updater/UpdateFetcher.h b/src/server/database/Updater/UpdateFetcher.h index 4ff8c93bc76..4ff8c93bc76 100644 --- a/src/server/shared/Updater/UpdateFetcher.h +++ b/src/server/database/Updater/UpdateFetcher.h diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index ec37d8c29e2..fa6db60dac2 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -123,13 +123,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u ObjectList* targets = GetTargets(e, unit); Creature* talker = me; Player* targetPlayer = NULL; + Unit* talkTarget = NULL; + if (targets) { for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) { if (IsCreature(*itr) && !(*itr)->ToCreature()->IsPet()) // Prevented sending text to pets. { - talker = (*itr)->ToCreature(); + if (e.action.talk.useTalkTarget) + talkTarget = (*itr)->ToCreature(); + else + talker = (*itr)->ToCreature(); break; } else if (IsPlayer(*itr)) @@ -148,7 +153,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u mTalkerEntry = talker->GetEntry(); mLastTextID = e.action.talk.textGroupID; mTextTimer = e.action.talk.duration; - Unit* talkTarget = NULL; + if (IsPlayer(GetLastInvoker())) // used for $vars in texts and whisper target talkTarget = GetLastInvoker(); else if (targetPlayer) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index b33077be9dd..7a67a34d755 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -427,7 +427,7 @@ enum SMART_SCRIPT_RESPAWN_CONDITION enum SMART_ACTION { SMART_ACTION_NONE = 0, // No action - SMART_ACTION_TALK = 1, // groupID from creature_text, duration to wait before TEXT_OVER event is triggered + SMART_ACTION_TALK = 1, // groupID from creature_text, duration to wait before TEXT_OVER event is triggered, useTalkTarget (0/1) - use target as talk target SMART_ACTION_SET_FACTION = 2, // FactionId (or 0 for default) SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL = 3, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to demorph) SMART_ACTION_SOUND = 4, // SoundId, onlySelf @@ -555,6 +555,7 @@ struct SmartAction { uint32 textGroupID; uint32 duration; + uint32 useTalkTarget; } talk; struct diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 68d76272e22..91d97746ae1 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1057,6 +1057,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: case ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING: + case ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT: SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; // std case: increment at miscValue1 @@ -1164,6 +1165,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: case ACHIEVEMENT_CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER: + case ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET: SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: @@ -1280,8 +1282,6 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_COUNT_OF_LFR_QUEUE_BOOSTS_BY_TANK: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_SCENARIO_COUNT: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_SCENARIO: - case ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET: - case ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT: case ACHIEVEMENT_CRITERIA_TYPE_CAPTURE_BATTLE_PET: case ACHIEVEMENT_CRITERIA_TYPE_WIN_PET_BATTLE: case ACHIEVEMENT_CRITERIA_TYPE_LEVEL_BATTLE_PET: @@ -1444,12 +1444,14 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteria const* achieveme case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: case ACHIEVEMENT_CRITERIA_TYPE_CURRENCY: case ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING: + case ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT: return progress->counter >= requiredAmount; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: case ACHIEVEMENT_CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER: + case ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET: return progress->counter >= 1; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL: return progress->counter >= (requiredAmount * 75); @@ -2533,6 +2535,10 @@ bool AchievementMgr<T>::AdditionalRequirementsSatisfied(ModifierTreeNode const* if (!unit || unit->GetHealthPct() >= reqValue) return false; break; + case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_SPECIES: // 91 + if (miscValue1 != reqValue) + return false; + break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_QUALITY: // 145 { if (!referencePlayer) diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp new file mode 100644 index 00000000000..c8d26781097 --- /dev/null +++ b/src/server/game/BattlePets/BattlePetMgr.cpp @@ -0,0 +1,469 @@ +/* + * Copyright (C) 2008-2015 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 "ObjectMgr.h" +#include "BattlePetMgr.h" +#include "Containers.h" +#include "Player.h" +#include "WorldSession.h" + + +void BattlePetMgr::BattlePet::CalculateStats() +{ + float health = 0.0f; + float power = 0.0f; + float speed = 0.0f; + + // get base breed stats + auto breedState = _battlePetBreedStates.find(PacketInfo.Breed); + if (breedState == _battlePetBreedStates.end()) // non existing breed id + return; + + health = breedState->second[STATE_STAT_STAMINA]; + power = breedState->second[STATE_STAT_POWER]; + speed = breedState->second[STATE_STAT_SPEED]; + + // modify stats depending on species - not all pets have this + auto speciesState = _battlePetSpeciesStates.find(PacketInfo.Species); + if (speciesState != _battlePetSpeciesStates.end()) + { + health += speciesState->second[STATE_STAT_STAMINA]; + power += speciesState->second[STATE_STAT_POWER]; + speed += speciesState->second[STATE_STAT_SPEED]; + } + + // modify stats by quality + for (auto itr : sBattlePetBreedQualityStore) + { + if (itr->Quality == PacketInfo.Quality) + { + health *= itr->Modifier; + power *= itr->Modifier; + speed *= itr->Modifier; + break; + } + // TOOD: add check if pet has existing quality + } + + // scale stats depending on level + health *= PacketInfo.Level; + power *= PacketInfo.Level; + speed *= PacketInfo.Level; + + // set stats + // round, ceil or floor? verify this + PacketInfo.MaxHealth = uint32((round(health / 20) + 100)); + PacketInfo.Power = uint32(round(power / 100)); + PacketInfo.Speed = uint32(round(speed / 100)); +} + +std::unordered_map<uint16 /*BreedID*/, std::unordered_map<BattlePetState /*state*/, int32 /*value*/, std::hash<std::underlying_type<BattlePetState>::type> >> BattlePetMgr::_battlePetBreedStates; +std::unordered_map<uint32 /*SpeciesID*/, std::unordered_map<BattlePetState /*state*/, int32 /*value*/, std::hash<std::underlying_type<BattlePetState>::type> >> BattlePetMgr::_battlePetSpeciesStates; +std::unordered_map<uint32 /*SpeciesID*/, std::unordered_set<uint8 /*breed*/>> BattlePetMgr::_availableBreedsPerSpecies; +std::unordered_map<uint32 /*SpeciesID*/, uint8 /*quality*/> BattlePetMgr::_defaultQualityPerSpecies; + +void BattlePetMgr::Initialize() +{ + if (QueryResult result = LoginDatabase.Query("SELECT MAX(guid) FROM battle_pets")) + sObjectMgr->GetGenerator<HighGuid::BattlePet>().Set((*result)[0].GetUInt64() + 1); + + for (auto itr : sBattlePetBreedStateStore) + _battlePetBreedStates[itr->BreedID][BattlePetState(itr->State)] = itr->Value; + + for (auto itr : sBattlePetSpeciesStateStore) + _battlePetSpeciesStates[itr->SpeciesID][BattlePetState(itr->State)] = itr->Value; + + LoadAvailablePetBreeds(); + LoadDefaultPetQualities(); +} + +void BattlePetMgr::LoadAvailablePetBreeds() +{ + QueryResult result = WorldDatabase.Query("SELECT speciesId, breedId FROM battle_pet_breeds"); + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 battle pet breeds. DB table `battle_pet_breeds` is empty."); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + uint32 speciesId = fields[0].GetUInt32(); + uint16 breedId = fields[1].GetUInt16(); + + if (!sBattlePetSpeciesStore.LookupEntry(speciesId)) + { + TC_LOG_ERROR("sql.sql", "Non-existing BattlePetSpecies.db2 entry %u was referenced in `battle_pet_breeds` by row (%u, %u).", speciesId, speciesId, breedId); + continue; + } + + // TODO: verify breed id (3 - 12 (male) or 3 - 22 (male and female)) if needed + + _availableBreedsPerSpecies[speciesId].insert(breedId); + ++count; + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u battle pet breeds.", count); +} + +void BattlePetMgr::LoadDefaultPetQualities() +{ + QueryResult result = WorldDatabase.Query("SELECT speciesId, quality FROM battle_pet_quality"); + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 battle pet qualities. DB table `battle_pet_quality` is empty."); + return; + } + + do + { + Field* fields = result->Fetch(); + uint32 speciesId = fields[0].GetUInt32(); + uint8 quality = fields[1].GetUInt8(); + + if (!sBattlePetSpeciesStore.LookupEntry(speciesId)) + { + TC_LOG_ERROR("sql.sql", "Non-existing BattlePetSpecies.db2 entry %u was referenced in `battle_pet_quality` by row (%u, %u).", speciesId, speciesId, quality); + continue; + } + + // TODO: verify quality (0 - 3 for player pets or 0 - 5 for both player and tamer pets) if needed + + _defaultQualityPerSpecies[speciesId] = quality; + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u battle pet qualities.", uint32(_defaultQualityPerSpecies.size())); +} + +uint16 BattlePetMgr::RollPetBreed(uint32 species) +{ + auto itr = _availableBreedsPerSpecies.find(species); + if (itr == _availableBreedsPerSpecies.end()) + return 3; // default B/B + + return Trinity::Containers::SelectRandomContainerElement(itr->second); +} + +uint8 BattlePetMgr::GetDefaultPetQuality(uint32 species) +{ + auto itr = _defaultQualityPerSpecies.find(species); + if (itr == _defaultQualityPerSpecies.end()) + return 0; // default poor + + return itr->second; +} + +BattlePetMgr::BattlePetMgr(WorldSession* owner) +{ + _owner = owner; + for (uint8 i = 0; i < MAX_PET_BATTLE_SLOTS; ++i) + { + WorldPackets::BattlePet::BattlePetSlot slot; + slot.Index = i; + _slots.push_back(slot); + } +} + +void BattlePetMgr::LoadFromDB(PreparedQueryResult pets, PreparedQueryResult slots) +{ + if (pets) + { + do + { + Field* fields = pets->Fetch(); + uint32 species = fields[1].GetUInt32(); + + if (BattlePetSpeciesEntry const* speciesEntry = sBattlePetSpeciesStore.LookupEntry(species)) + { + if (GetPetCount(species) >= MAX_BATTLE_PETS_PER_SPECIES) + { + TC_LOG_ERROR("misc", "Battlenet account with id %u has more than 3 battle pets of species %u", _owner->GetBattlenetAccountId(), species); + continue; + } + + BattlePet pet; + pet.PacketInfo.Guid = ObjectGuid::Create<HighGuid::BattlePet>(fields[0].GetUInt64()); + pet.PacketInfo.Species = species; + pet.PacketInfo.Breed = fields[2].GetUInt16(); + pet.PacketInfo.Level = fields[3].GetUInt16(); + pet.PacketInfo.Exp = fields[4].GetUInt16(); + pet.PacketInfo.Health = fields[5].GetUInt32(); + pet.PacketInfo.Quality = fields[6].GetUInt8(); + pet.PacketInfo.Flags = fields[7].GetUInt16(); + pet.PacketInfo.Name = fields[8].GetString(); + pet.PacketInfo.CreatureID = speciesEntry->CreatureID; + pet.SaveInfo = BATTLE_PET_UNCHANGED; + pet.CalculateStats(); + _pets[pet.PacketInfo.Guid.GetCounter()] = pet; + } + } while (pets->NextRow()); + } + + if (slots) + { + uint8 i = 0; // slots->GetRowCount() should equal MAX_BATTLE_PET_SLOTS + + do + { + Field* fields = slots->Fetch(); + _slots[i].Index = fields[0].GetUInt8(); + auto itr = _pets.find(fields[1].GetUInt64()); + if (itr != _pets.end()) + _slots[i].Pet = itr->second.PacketInfo; + _slots[i].Locked = fields[2].GetBool(); + i++; + } while (slots->NextRow()); + } +} + +void BattlePetMgr::SaveToDB(SQLTransaction& trans) +{ + PreparedStatement* stmt = nullptr; + + for (auto itr = _pets.begin(); itr != _pets.end();) + { + switch (itr->second.SaveInfo) + { + case BATTLE_PET_NEW: + stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BATTLE_PETS); + stmt->setUInt64(0, itr->first); + stmt->setUInt32(1, _owner->GetBattlenetAccountId()); + stmt->setUInt32(2, itr->second.PacketInfo.Species); + stmt->setUInt16(3, itr->second.PacketInfo.Breed); + stmt->setUInt16(4, itr->second.PacketInfo.Level); + stmt->setUInt16(5, itr->second.PacketInfo.Exp); + stmt->setUInt32(6, itr->second.PacketInfo.Health); + stmt->setUInt8(7, itr->second.PacketInfo.Quality); + stmt->setUInt16(8, itr->second.PacketInfo.Flags); + stmt->setString(9, itr->second.PacketInfo.Name); + trans->Append(stmt); + itr->second.SaveInfo = BATTLE_PET_UNCHANGED; + ++itr; + break; + case BATTLE_PET_CHANGED: + stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BATTLE_PETS); + stmt->setUInt16(0, itr->second.PacketInfo.Level); + stmt->setUInt16(1, itr->second.PacketInfo.Exp); + stmt->setUInt32(2, itr->second.PacketInfo.Health); + stmt->setUInt8(3, itr->second.PacketInfo.Quality); + stmt->setUInt16(4, itr->second.PacketInfo.Flags); + stmt->setString(5, itr->second.PacketInfo.Name); + stmt->setUInt32(6, _owner->GetBattlenetAccountId()); + stmt->setUInt64(7, itr->first); + trans->Append(stmt); + itr->second.SaveInfo = BATTLE_PET_UNCHANGED; + ++itr; + break; + case BATTLE_PET_REMOVED: + stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BATTLE_PETS); + stmt->setUInt32(0, _owner->GetBattlenetAccountId()); + stmt->setUInt64(1, itr->first); + trans->Append(stmt); + itr = _pets.erase(itr); + break; + default: + ++itr; + break; + } + } + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BATTLE_PET_SLOTS); + stmt->setUInt32(0, _owner->GetBattlenetAccountId()); + trans->Append(stmt); + + for (WorldPackets::BattlePet::BattlePetSlot const& slot : _slots) + { + stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BATTLE_PET_SLOTS); + stmt->setUInt8(0, slot.Index); + stmt->setUInt32(1, _owner->GetBattlenetAccountId()); + stmt->setUInt64(2, slot.Pet.Guid.GetCounter()); + stmt->setBool(3, slot.Locked); + trans->Append(stmt); + } +} + +BattlePetMgr::BattlePet* BattlePetMgr::GetPet(ObjectGuid guid) +{ + auto itr = _pets.find(guid.GetCounter()); + if (itr != _pets.end()) + return &itr->second; + + return nullptr; +} + +void BattlePetMgr::AddPet(uint32 species, uint32 creatureId, uint16 breed, uint8 quality, uint16 level /*= 1*/) +{ + BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(species); + if (!battlePetSpecies) // should never happen + return; + + BattlePet pet; + pet.PacketInfo.Guid = ObjectGuid::Create<HighGuid::BattlePet>(sObjectMgr->GetGenerator<HighGuid::BattlePet>().Generate()); + pet.PacketInfo.Species = species; + pet.PacketInfo.CreatureID = creatureId; + pet.PacketInfo.Level = level; + pet.PacketInfo.Exp = 0; + pet.PacketInfo.Flags = 0; + pet.PacketInfo.Breed = breed; + pet.PacketInfo.Quality = quality; + pet.PacketInfo.Name = ""; + pet.CalculateStats(); + pet.PacketInfo.Health = pet.PacketInfo.MaxHealth; + pet.SaveInfo = BATTLE_PET_NEW; + + _pets[pet.PacketInfo.Guid.GetCounter()] = pet; + + std::vector<BattlePet> updates; + updates.push_back(pet); + SendUpdates(updates, true); + + _owner->GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET, species); +} + +void BattlePetMgr::RemovePet(ObjectGuid guid) +{ + BattlePet* pet = GetPet(guid); + if (!pet) + return; + + pet->SaveInfo = BATTLE_PET_REMOVED; + + // spell is not unlearned on retail + /*if (GetPetCount(pet->PacketInfo.Species) == 0) + if (BattlePetSpeciesEntry const* speciesEntry = sBattlePetSpeciesStore.LookupEntry(pet->PacketInfo.Species)) + _owner->GetPlayer()->RemoveSpell(speciesEntry->SummonSpellID);*/ +} + +uint8 BattlePetMgr::GetPetCount(uint32 species) const +{ + uint8 count = 0; + for (auto& itr : _pets) + if (itr.second.PacketInfo.Species == species && itr.second.SaveInfo != BATTLE_PET_REMOVED) + count++; + + return count; +} + +void BattlePetMgr::UnlockSlot(uint8 slot) +{ + if (!_slots[slot].Locked) + return; + + _slots[slot].Locked = false; + + WorldPackets::BattlePet::PetBattleSlotUpdates updates; + updates.Slots.push_back(_slots[slot]); + updates.AutoSlotted = false; // what's this? + updates.NewSlot = true; // causes the "new slot unlocked" bubble to appear + _owner->SendPacket(updates.Write()); +} + +std::vector<BattlePetMgr::BattlePet> BattlePetMgr::GetLearnedPets() const +{ + std::vector<BattlePet> pets; + for (auto& pet : _pets) + if (pet.second.SaveInfo != BATTLE_PET_REMOVED) + pets.push_back(pet.second); + + return pets; +} + +void BattlePetMgr::CageBattlePet(ObjectGuid guid) +{ + BattlePet* pet = GetPet(guid); + if (!pet) + return; + + ItemPosCountVec dest; + + if (_owner->GetPlayer()->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, BATTLE_PET_CAGE_ITEM_ID, 1) != EQUIP_ERR_OK) + return; + + Item* item = _owner->GetPlayer()->StoreNewItem(dest, BATTLE_PET_CAGE_ITEM_ID, true); + if (!item) + return; + + item->SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, pet->PacketInfo.Species); + item->SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, pet->PacketInfo.Breed | (pet->PacketInfo.Quality << 24)); + item->SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, pet->PacketInfo.Level); + item->SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, pet->PacketInfo.CreatureID); + + // FIXME: "You create: ." - item name missing in chat + _owner->GetPlayer()->SendNewItem(item, 1, true, true); + + RemovePet(guid); + + WorldPackets::BattlePet::BattlePetDeleted deletePet; + deletePet.PetGuid = guid; + _owner->SendPacket(deletePet.Write()); +} + +void BattlePetMgr::HealBattlePetsPct(uint8 pct) +{ + // TODO: After each Pet Battle, any injured companion will automatically + // regain 50 % of the damage that was taken during combat + std::vector<BattlePet> updates; + + for (auto& pet : _pets) + if (pet.second.PacketInfo.Health != pet.second.PacketInfo.MaxHealth) + { + pet.second.PacketInfo.Health += CalculatePct(pet.second.PacketInfo.MaxHealth, pct); + // don't allow Health to be greater than MaxHealth + pet.second.PacketInfo.Health = std::min(pet.second.PacketInfo.Health, pet.second.PacketInfo.MaxHealth); + if (pet.second.SaveInfo != BATTLE_PET_NEW) + pet.second.SaveInfo = BATTLE_PET_CHANGED; + updates.push_back(pet.second); + } + + SendUpdates(updates, false); +} + +void BattlePetMgr::SummonPet(ObjectGuid guid) +{ + BattlePet* pet = GetPet(guid); + if (!pet) + return; + + BattlePetSpeciesEntry const* speciesEntry = sBattlePetSpeciesStore.LookupEntry(pet->PacketInfo.Species); + if (!speciesEntry) + return; + + // TODO: set proper CreatureID for spell DEFAULT_SUMMON_BATTLE_PET_SPELL (default EffectMiscValueA is 40721 - Murkimus the Gladiator) + _owner->GetPlayer()->CastSpell(_owner->GetPlayer(), speciesEntry->SummonSpellID ? speciesEntry->SummonSpellID : DEFAULT_SUMMON_BATTLE_PET_SPELL); + + // TODO: set pet level, quality... update fields +} + +void BattlePetMgr::SendUpdates(std::vector<BattlePet> pets, bool petAdded) +{ + WorldPackets::BattlePet::BattlePetUpdates updates; + for (auto pet : pets) + updates.Pets.push_back(pet.PacketInfo); + + updates.PetAdded = petAdded; + _owner->SendPacket(updates.Write()); +} + +void BattlePetMgr::SendError(BattlePetError error, uint32 creatureId) +{ + WorldPackets::BattlePet::BattlePetError battlePetError; + battlePetError.Result = error; + battlePetError.CreatureID = creatureId; + _owner->SendPacket(battlePetError.Write()); +} diff --git a/src/server/game/BattlePets/BattlePetMgr.h b/src/server/game/BattlePets/BattlePetMgr.h new file mode 100644 index 00000000000..97b1b34c13c --- /dev/null +++ b/src/server/game/BattlePets/BattlePetMgr.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2008-2015 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 BattlePetMgr_h__ +#define BattlePetMgr_h__ + +#include "DB2Stores.h" +#include "BattlePetPackets.h" + +enum BattlePetMisc +{ + MAX_PET_BATTLE_SLOTS = 3, + MAX_BATTLE_PETS_PER_SPECIES = 3, + BATTLE_PET_CAGE_ITEM_ID = 82800, + DEFAULT_SUMMON_BATTLE_PET_SPELL = 118301 +}; + +// TODO: fix values in this enum +enum BattlePetError +{ + BATTLEPETRESULT_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 9, + BATTLEPETRESULT_TOO_HIGH_LEVEL_TO_UNCAGE = 12, + BATTLEPETRESULT_CANT_HAVE_MORE_PETS = 13, + + // wrong order + BATTLEPETRESULT_DUPLICATE_CONVERTED_PET, + BATTLEPETRESULT_NEED_TO_UNLOCK, + BATTLEPETRESULT_BAD_PARAM, + BATTLEPETRESULT_LOCKED_PET_ALREADY_EXISTS, + BATTLEPETRESULT_OK, + BATTLEPETRESULT_UNCAPTURABLE, + BATTLEPETRESULT_CANT_INVALID_CHARACTER_GUID +}; + +// taken from BattlePetState.db2 - it seems to store some initial values for battle pets +// there are only values used in BattlePetSpeciesState.db2 and BattlePetBreedState.db2 +// TODO: expand this enum if needed +enum BattlePetState +{ + STATE_MAX_HEALTH_BONUS = 2, + STATE_INTERNAL_INITIAL_LEVEL = 17, + STATE_STAT_POWER = 18, + STATE_STAT_STAMINA = 19, + STATE_STAT_SPEED = 20, + STATE_MOD_DAMAGE_DEALT_PERCENT = 23, + STATE_GENDER = 78, // 1 - male, 2 - female + STATE_COSMETIC_WATER_BUBBLED = 85, + STATE_SPECIAL_IS_COCKROACH = 93, + STATE_COSMETIC_FLY_TIER = 128, + STATE_COSMETIC_BIGGLESWORTH = 144, + STATE_PASSIVE_ELITE = 153, + STATE_PASSIVE_BOSS = 162, + STATE_COSMETIC_TREASURE_GOBLIN = 176, + // these are not in BattlePetState.db2 but are used in BattlePetSpeciesState.db2 + STATE_START_WITH_BUFF = 183, + STATE_START_WITH_BUFF_2 = 184 +}; + +enum BattlePetSaveInfo +{ + BATTLE_PET_UNCHANGED = 0, + BATTLE_PET_CHANGED = 1, + BATTLE_PET_NEW = 2, + BATTLE_PET_REMOVED = 3 +}; + +class BattlePetMgr +{ +public: + struct BattlePet + { + void CalculateStats(); + + WorldPackets::BattlePet::BattlePet PacketInfo; + BattlePetSaveInfo SaveInfo; + }; + + explicit BattlePetMgr(WorldSession* owner); + + static void Initialize(); + + static uint16 RollPetBreed(uint32 species); + static uint8 GetDefaultPetQuality(uint32 species); + + void LoadFromDB(PreparedQueryResult pets, PreparedQueryResult slots); + void SaveToDB(SQLTransaction& trans); + + BattlePet* GetPet(ObjectGuid guid); + void AddPet(uint32 species, uint32 creatureId, uint16 breed, uint8 quality, uint16 level = 1); + void RemovePet(ObjectGuid guid); + + uint8 GetPetCount(uint32 species) const; + + WorldPackets::BattlePet::BattlePetSlot* GetSlot(uint8 slot) { return &_slots[slot]; } + void UnlockSlot(uint8 slot); + + WorldSession* GetOwner() const { return _owner; } + + uint16 GetTrapLevel() const { return _trapLevel; } + std::vector<BattlePet> GetLearnedPets() const; + std::vector<WorldPackets::BattlePet::BattlePetSlot> GetSlots() const { return _slots; } + + void CageBattlePet(ObjectGuid guid); + void HealBattlePetsPct(uint8 pct); + + void SummonPet(ObjectGuid guid); + + void SendUpdates(std::vector<BattlePet> pets, bool petAdded); + void SendError(BattlePetError error, uint32 creatureId); + +private: + WorldSession* _owner; + uint16 _trapLevel = 0; + std::unordered_map<uint64 /*battlePetGuid*/, BattlePet> _pets; + std::vector<WorldPackets::BattlePet::BattlePetSlot> _slots; + + static void LoadAvailablePetBreeds(); + static void LoadDefaultPetQualities(); + + // hash no longer required in C++14 + static std::unordered_map<uint16 /*BreedID*/, std::unordered_map<BattlePetState /*state*/, int32 /*value*/, std::hash<std::underlying_type<BattlePetState>::type> >> _battlePetBreedStates; + static std::unordered_map<uint32 /*SpeciesID*/, std::unordered_map<BattlePetState /*state*/, int32 /*value*/, std::hash<std::underlying_type<BattlePetState>::type> >> _battlePetSpeciesStates; + static std::unordered_map<uint32 /*SpeciesID*/, std::unordered_set<uint8 /*breed*/>> _availableBreedsPerSpecies; + static std::unordered_map<uint32 /*SpeciesID*/, uint8 /*quality*/> _defaultQualityPerSpecies; +}; + +#endif // BattlePetMgr_h__ diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 3bec1fd89b3..28205d493de 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1334,6 +1334,7 @@ void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPLogData& { playerData.IsInWorld = true; playerData.PrimaryTalentTree = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); + playerData.Race = player->getRace(); } //if (isRated()) diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 9c3646c39ca..14bb8f25389 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -16,6 +16,7 @@ file(GLOB_RECURSE sources_AuctionHouse AuctionHouse/*.cpp AuctionHouse/*.h) file(GLOB_RECURSE sources_AuctionHouseBot AuctionHouseBot/*.cpp AuctionHouseBot/*.h) file(GLOB_RECURSE sources_Battlefield Battlefield/*.cpp Battlefield/*.h) file(GLOB_RECURSE sources_Battlegrounds Battlegrounds/*.cpp Battlegrounds/*.h) +file(GLOB_RECURSE sources_BattlePets BattlePets/*.cpp BattlePets/*.h) file(GLOB_RECURSE sources_Calendar Calendar/*.cpp Calendar/*.h) file(GLOB_RECURSE sources_Chat Chat/*.cpp Chat/*.h) file(GLOB_RECURSE sources_Combat Combat/*.cpp Combat/*.h) @@ -68,6 +69,7 @@ set(game_STAT_SRCS ${sources_AuctionHouseBot} ${sources_Battlefield} ${sources_Battlegrounds} + ${sources_BattlePets} ${sources_Calendar} ${sources_Chat} ${sources_Combat} @@ -105,38 +107,6 @@ set(game_STAT_SRCS ) include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/zlib - ${CMAKE_SOURCE_DIR}/dep/zmqpp - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Models - ${CMAKE_SOURCE_DIR}/src/server/collision/Maps - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/Database - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging - ${CMAKE_SOURCE_DIR}/src/server/shared/Networking - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Realm - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/ipc - ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Accounts ${CMAKE_CURRENT_SOURCE_DIR}/Achievements ${CMAKE_CURRENT_SOURCE_DIR}/Addons @@ -150,6 +120,7 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Battlefield/Zones ${CMAKE_CURRENT_SOURCE_DIR}/Battlegrounds ${CMAKE_CURRENT_SOURCE_DIR}/Battlegrounds/Zones + ${CMAKE_CURRENT_SOURCE_DIR}/BattlePets ${CMAKE_CURRENT_SOURCE_DIR}/Calendar ${CMAKE_CURRENT_SOURCE_DIR}/Chat ${CMAKE_CURRENT_SOURCE_DIR}/Chat/Channels @@ -157,10 +128,9 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Conditions ${CMAKE_CURRENT_SOURCE_DIR}/DataStores ${CMAKE_CURRENT_SOURCE_DIR}/DungeonFinding - ${CMAKE_CURRENT_SOURCE_DIR}/Entities ${CMAKE_CURRENT_SOURCE_DIR}/Entities/AreaTrigger - ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Creature ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Corpse + ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Creature ${CMAKE_CURRENT_SOURCE_DIR}/Entities/DynamicObject ${CMAKE_CURRENT_SOURCE_DIR}/Entities/GameObject ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Item @@ -170,15 +140,15 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Pet ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Player ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Totem + ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Transport ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Unit ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Vehicle - ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Transport ${CMAKE_CURRENT_SOURCE_DIR}/Events ${CMAKE_CURRENT_SOURCE_DIR}/Garrison ${CMAKE_CURRENT_SOURCE_DIR}/Globals + ${CMAKE_CURRENT_SOURCE_DIR}/Grids ${CMAKE_CURRENT_SOURCE_DIR}/Grids/Cells ${CMAKE_CURRENT_SOURCE_DIR}/Grids/Notifiers - ${CMAKE_CURRENT_SOURCE_DIR}/Grids ${CMAKE_CURRENT_SOURCE_DIR}/Groups ${CMAKE_CURRENT_SOURCE_DIR}/Guilds ${CMAKE_CURRENT_SOURCE_DIR}/Handlers @@ -188,29 +158,54 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Maps ${CMAKE_CURRENT_SOURCE_DIR}/Miscellaneous ${CMAKE_CURRENT_SOURCE_DIR}/Movement - ${CMAKE_CURRENT_SOURCE_DIR}/Movement/Spline ${CMAKE_CURRENT_SOURCE_DIR}/Movement/MovementGenerators + ${CMAKE_CURRENT_SOURCE_DIR}/Movement/Spline ${CMAKE_CURRENT_SOURCE_DIR}/Movement/Waypoints ${CMAKE_CURRENT_SOURCE_DIR}/OutdoorPvP ${CMAKE_CURRENT_SOURCE_DIR}/Pools - ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders ${CMAKE_CURRENT_SOURCE_DIR}/Quests ${CMAKE_CURRENT_SOURCE_DIR}/Reputation ${CMAKE_CURRENT_SOURCE_DIR}/Scripting + ${CMAKE_CURRENT_SOURCE_DIR}/Server ${CMAKE_CURRENT_SOURCE_DIR}/Server/Packets ${CMAKE_CURRENT_SOURCE_DIR}/Server/Protocol - ${CMAKE_CURRENT_SOURCE_DIR}/Server ${CMAKE_CURRENT_SOURCE_DIR}/Skills ${CMAKE_CURRENT_SOURCE_DIR}/Spells ${CMAKE_CURRENT_SOURCE_DIR}/Spells/Auras ${CMAKE_CURRENT_SOURCE_DIR}/Support ${CMAKE_CURRENT_SOURCE_DIR}/Texts + ${CMAKE_CURRENT_SOURCE_DIR}/Tickets ${CMAKE_CURRENT_SOURCE_DIR}/Tools ${CMAKE_CURRENT_SOURCE_DIR}/Warden ${CMAKE_CURRENT_SOURCE_DIR}/Warden/Modules ${CMAKE_CURRENT_SOURCE_DIR}/Weather ${CMAKE_CURRENT_SOURCE_DIR}/World - ${CMAKE_SOURCE_DIR}/src/server/scripts/PrecompiledHeaders + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include + ${CMAKE_SOURCE_DIR}/dep/zlib + ${CMAKE_SOURCE_DIR}/dep/zmqpp + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Cryptography + ${CMAKE_SOURCE_DIR}/src/common/Cryptography/Authentication + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/ipc + ${CMAKE_SOURCE_DIR}/src/server/shared + ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference + ${CMAKE_SOURCE_DIR}/src/server/shared/Networking + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} @@ -224,8 +219,6 @@ add_library(game STATIC ${game_STAT_SRCS} ) -add_dependencies(game revision.h) - # Generate precompiled header if (USE_COREPCH) add_cxx_pch(game ${game_STAT_PCH_HDR} ${game_STAT_PCH_SRC}) diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 301b0076dd3..5c54e3146a1 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -411,8 +411,9 @@ bool AchievementChatLink::ValidateName(char* buffer, const char* context) { ChatLink::ValidateName(buffer, context); - if (*_achievement->Title_lang && strcmp(_achievement->Title_lang, buffer) == 0) - return true; + for (uint8 locale = LOCALE_enUS; locale < TOTAL_LOCALES; ++locale) + if (strcmp(_achievement->Title->Str[locale], buffer) == 0) + return true; TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): linked achievement (id: %u) name wasn't found in any localization", context, _achievement->ID); return false; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 7cae9ee2221..8a37012f5f4 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -101,6 +101,7 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND { "Health Value", true, true, false }, { "Health Pct", true, true, false }, { "Realm Achievement", true, false, false }, + { "In Water", false, false, false }, { "Terrain Swap", true, false, false } }; @@ -425,6 +426,12 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) condMeets = true; break; } + case CONDITION_IN_WATER: + { + if (Unit* unit = object->ToUnit()) + condMeets = unit->IsInWater(); + break; + } case CONDITION_TERRAIN_SWAP: { condMeets = object->IsInTerrainSwap(ConditionValue1); @@ -602,6 +609,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() case CONDITION_REALM_ACHIEVEMENT: mask |= GRID_MAP_TYPE_MASK_ALL; break; + case CONDITION_IN_WATER: + mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; + break; case CONDITION_TERRAIN_SWAP: mask |= GRID_MAP_TYPE_MASK_ALL; break; @@ -2120,6 +2130,8 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) } break; } + case CONDITION_IN_WATER: + break; default: break; } diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index f2d27afb5f3..3549b1f2515 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -90,8 +90,9 @@ enum ConditionTypes CONDITION_HP_VAL = 37, // hpVal ComparisonType 0 true if unit's hp matches given value CONDITION_HP_PCT = 38, // hpPct ComparisonType 0 true if unit's hp matches given pct CONDITION_REALM_ACHIEVEMENT = 39, // achievement_id 0 0 true if realm achievement is complete - CONDITION_TERRAIN_SWAP = 40, // terrainSwap 0 0 true if object is in terrainswap - CONDITION_MAX = 41 // MAX + CONDITION_IN_WATER = 40, // 0 0 0 true if unit in water + CONDITION_TERRAIN_SWAP = 41, // terrainSwap 0 0 true if object is in terrainswap + CONDITION_MAX = 42 // MAX }; /*! Documentation on implementing a new ConditionSourceType: diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 5233af5abc9..ae26119986c 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -24,16 +24,23 @@ #include "TransportMgr.h" #include "World.h" +DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementFormat, HOTFIX_SEL_ACHIEVEMENT); DB2Storage<AreaGroupEntry> sAreaGroupStore("AreaGroup.db2", AreaGroupFormat, HOTFIX_SEL_AREA_GROUP); DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); 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<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); DB2Storage<CreatureTypeEntry> sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE); +DB2Storage<CriteriaEntry> sCriteriaStore("Criteria.db2", CriteriaFormat, HOTFIX_SEL_CRITERIA); +DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeFormat, HOTFIX_SEL_CRITERIA_TREE); DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES); DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT); DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); @@ -75,13 +82,18 @@ DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore("ItemRand DB2Storage<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<MailTemplateEntry> sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE); +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); DB2Storage<MountTypeXCapabilityEntry> sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityFormat, HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", NameGenFormat, HOTFIX_SEL_NAME_GEN); +DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfanity.db2", NamesProfanityFormat, HOTFIX_SEL_NAMES_PROFANITY); +DB2Storage<NamesReservedEntry> sNamesReservedStore("NamesReserved.db2", NamesReservedFormat, HOTFIX_SEL_NAMES_RESERVED); +DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleFormat, HOTFIX_SEL_NAMES_RESERVED_LOCALE); DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA); DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP); DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardFormat, HOTFIX_SEL_QUEST_MONEY_REWARD); @@ -112,6 +124,7 @@ DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH); DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE); DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryFormat, HOTFIX_SEL_TOTEM_CATEGORY); +DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyFormat, HOTFIX_SEL_TOY); 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); @@ -130,7 +143,7 @@ typedef std::list<std::string> DB2StoreProblemList; uint32 DB2FilesCount = 0; template<class T> -inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2Storage<T>* storage, std::string const& db2_path) +inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2Storage<T>* storage, std::string const& db2Path, uint32 defaultLocale) { // compatibility format and C++ structure sizes ASSERT(DB2FileLoader::GetFormatRecordSize(storage->GetFormat()) == sizeof(T), @@ -139,17 +152,17 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D ++DB2FilesCount; - if (storage->Load(db2_path, uint32(sWorld->GetDefaultDbcLocale()))) + if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale)) { storage->LoadFromDB(); for (uint32 i = 0; i < TOTAL_LOCALES; ++i) { - if (uint32(sWorld->GetDefaultDbcLocale()) == i) + if (defaultLocale == i) continue; if (availableDb2Locales & (1 << i)) - if (!storage->LoadStringsFrom((db2_path + localeNames[i] + '/'), i)) + if (!storage->LoadStringsFrom((db2Path + localeNames[i] + '/'), i)) availableDb2Locales &= ~(1 << i); // mark as not available for speedup next checks storage->LoadStringsFromDB(i); @@ -158,7 +171,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D else { // sort problematic db2 to (1) non compatible and (2) nonexistent - if (FILE* f = fopen((db2_path + storage->GetFileName()).c_str(), "rb")) + if (FILE* f = fopen((db2Path + storage->GetFileName()).c_str(), "rb")) { std::ostringstream stream; stream << storage->GetFileName() << " exists, and has " << storage->GetFieldCount() << " field(s) (expected " << strlen(storage->GetFormat()) @@ -174,7 +187,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D stores[storage->GetHash()] = storage; } -void DB2Manager::LoadStores(std::string const& dataPath) +void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) { uint32 oldMSTime = getMSTime(); @@ -183,18 +196,25 @@ void DB2Manager::LoadStores(std::string const& dataPath) DB2StoreProblemList bad_db2_files; uint32 availableDb2Locales = 0xFF; -#define LOAD_DB2(store) LoadDB2(availableDb2Locales, bad_db2_files, _stores, &store, db2Path) +#define LOAD_DB2(store) LoadDB2(availableDb2Locales, bad_db2_files, _stores, &store, db2Path, defaultLocale) + LOAD_DB2(sAchievementStore); LOAD_DB2(sAreaGroupMemberStore); LOAD_DB2(sAreaGroupStore); + LOAD_DB2(sBattlePetBreedQualityStore); + LOAD_DB2(sBattlePetBreedStateStore); LOAD_DB2(sAuctionHouseStore); LOAD_DB2(sBarberShopStyleStore); + LOAD_DB2(sBattlePetSpeciesStore); + LOAD_DB2(sBattlePetSpeciesStateStore); LOAD_DB2(sBroadcastTextStore); LOAD_DB2(sCharStartOutfitStore); LOAD_DB2(sChrClassesXPowerTypesStore); LOAD_DB2(sCinematicSequencesStore); LOAD_DB2(sCreatureDisplayInfoStore); LOAD_DB2(sCreatureTypeStore); + LOAD_DB2(sCriteriaStore); + LOAD_DB2(sCriteriaTreeStore); LOAD_DB2(sCurrencyTypesStore); LOAD_DB2(sCurvePointStore); LOAD_DB2(sDestructibleModelDataStore); @@ -236,13 +256,18 @@ void DB2Manager::LoadStores(std::string const& dataPath) LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemSpecStore); LOAD_DB2(sItemStore); + LOAD_DB2(sItemToBattlePetSpeciesStore); LOAD_DB2(sItemXBonusTreeStore); LOAD_DB2(sKeyChainStore); LOAD_DB2(sMailTemplateStore); + LOAD_DB2(sModifierTreeStore); LOAD_DB2(sMountCapabilityStore); LOAD_DB2(sMountStore); LOAD_DB2(sMountTypeXCapabilityStore); LOAD_DB2(sNameGenStore); + LOAD_DB2(sNamesProfanityStore); + LOAD_DB2(sNamesReservedStore); + LOAD_DB2(sNamesReservedLocaleStore); LOAD_DB2(sOverrideSpellDataStore); LOAD_DB2(sPhaseXPhaseGroupStore); LOAD_DB2(sQuestMoneyRewardStore); @@ -273,6 +298,7 @@ void DB2Manager::LoadStores(std::string const& dataPath) LOAD_DB2(sTaxiPathNodeStore); LOAD_DB2(sTaxiPathStore); LOAD_DB2(sTotemCategoryStore); + LOAD_DB2(sToyStore); LOAD_DB2(sTransportAnimationStore); LOAD_DB2(sTransportRotationStore); LOAD_DB2(sUnitPowerBarStore); @@ -347,6 +373,27 @@ void DB2Manager::LoadStores(std::string const& dataPath) for (NameGenEntry const* entry : sNameGenStore) _nameGenData[entry->Race][entry->Sex].push_back(entry); + for (NamesProfanityEntry const* namesProfanity : sNamesProfanityStore) + { + ASSERT(namesProfanity->Language < TOTAL_LOCALES || namesProfanity->Language == -1); + if (namesProfanity->Language != -1) + _nameValidators[namesProfanity->Language].emplace_back(namesProfanity->Name, boost::regex::perl | boost::regex::icase | boost::regex::optimize); + else + for (uint32 i = 0; i < TOTAL_LOCALES; ++i) + _nameValidators[i].emplace_back(namesProfanity->Name, boost::regex::perl | boost::regex::icase | boost::regex::optimize); + } + + for (NamesReservedEntry const* namesReserved : sNamesReservedStore) + _nameValidators[TOTAL_LOCALES].emplace_back(namesReserved->Name, boost::regex::perl | boost::regex::icase | boost::regex::optimize); + + for (NamesReservedLocaleEntry const* namesReserved : sNamesReservedLocaleStore) + { + ASSERT(!(namesReserved->LocaleMask & ~((1 << TOTAL_LOCALES) - 1))); + for (uint32 i = 0; i < TOTAL_LOCALES; ++i) + if (namesReserved->LocaleMask & (1 << i)) + _nameValidators[i].emplace_back(namesReserved->Name, boost::regex::perl | boost::regex::icase | boost::regex::optimize); + } + for (PhaseXPhaseGroupEntry const* group : sPhaseXPhaseGroupStore) if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID)) _phasesByGroup[group->PhaseGroupID].insert(phase->ID); @@ -466,10 +513,13 @@ void DB2Manager::LoadStores(std::string const& dataPath) for (TransportRotationEntry const* rot : sTransportRotationStore) sTransportMgr->AddPathRotationToTransport(rot->TransportID, rot->TimeIndex, rot); + for (ToyEntry const* toy : sToyStore) + _toys.push_back(toy->ItemID); + // error checks if (bad_db2_files.size() >= DB2FilesCount) { - TC_LOG_ERROR("misc", "\nIncorrect DataDir value in worldserver.conf or ALL required *.db2 files (%d) not found by path: %sdb2", DB2FilesCount, dataPath.c_str()); + TC_LOG_ERROR("misc", "\nIncorrect DataDir value in worldserver.conf or ALL required *.db2 files (%d) not found by path: %sdbc/%s/", DB2FilesCount, dataPath.c_str(), localeNames[defaultLocale]); exit(1); } else if (!bad_db2_files.empty()) @@ -706,6 +756,20 @@ DB2Manager::MountTypeXCapabilitySet const* DB2Manager::GetMountCapabilities(uint return nullptr; } +ResponseCodes DB2Manager::ValidateName(std::string const& name, LocaleConstant locale) const +{ + for (boost::regex const& regex : _nameValidators[locale]) + if (boost::regex_search(name, regex)) + return CHAR_NAME_PROFANE; + + // regexes at TOTAL_LOCALES are loaded from NamesReserved which is not locale specific + for (boost::regex const& regex : _nameValidators[TOTAL_LOCALES]) + if (boost::regex_search(name, regex)) + return CHAR_NAME_RESERVED; + + return CHAR_NAME_SUCCESS; +} + std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItems(uint32 questPackageID) const { auto itr = _questPackages.find(questPackageID); @@ -801,6 +865,11 @@ bool DB2Manager::GlyphSlotEntryComparator::Compare(GlyphSlotEntry const* left, G bool DB2Manager::MountTypeXCapabilityEntryComparator::Compare(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right) { if (left->MountTypeID == right->MountTypeID) - return left->OrderIndex > right->OrderIndex; + return left->OrderIndex < right->OrderIndex; return left->ID < right->ID; } + +bool DB2Manager::GetToyItemIdMatch(uint32 toy) const +{ + return std::find(_toys.begin(), _toys.end(), toy) != _toys.end(); +} diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 59931769c4a..4184ab5b5d4 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -21,15 +21,23 @@ #include "DB2Store.h" #include "DB2Structure.h" #include "SharedDefines.h" +#include <boost/regex.hpp> #include <array> +extern DB2Storage<AchievementEntry> sAchievementStore; extern DB2Storage<AuctionHouseEntry> sAuctionHouseStore; extern DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore; +extern DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore; +extern DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore; +extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore; +extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore; extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore; extern DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore; extern DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore; extern DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore; extern DB2Storage<CreatureTypeEntry> sCreatureTypeStore; +extern DB2Storage<CriteriaEntry> sCriteriaStore; +extern DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore; extern DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore; extern DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore; extern DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore; @@ -66,7 +74,9 @@ extern DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore; extern DB2Storage<ItemSparseEntry> sItemSparseStore; extern DB2Storage<ItemSpecEntry> sItemSpecStore; extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore; +extern DB2Storage<ItemToBattlePetSpeciesEntry> sItemToBattlePetSpeciesStore; extern DB2Storage<MailTemplateEntry> sMailTemplateStore; +extern DB2Storage<ModifierTreeEntry> sModifierTreeStore; extern DB2Storage<MountCapabilityEntry> sMountCapabilityStore; extern DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore; extern DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore; @@ -92,6 +102,7 @@ extern DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore; extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore; extern DB2Storage<TaxiPathEntry> sTaxiPathStore; extern DB2Storage<TotemCategoryEntry> sTotemCategoryStore; +extern DB2Storage<ToyEntry> sToyStore; extern DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore; extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore; @@ -141,11 +152,13 @@ public: typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet; typedef std::unordered_map<uint32, MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer; typedef std::unordered_map<uint32, std::array<std::vector<NameGenEntry const*>, 2>> NameGenContainer; + typedef std::array<std::vector<boost::regex>, TOTAL_LOCALES + 1> NameValidationRegexContainer; typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer; typedef std::unordered_map<uint32, std::vector<QuestPackageItemEntry const*>> QuestPackageItemContainer; typedef std::unordered_map<uint32, std::vector<SpecializationSpellsEntry const*>> SpecializationSpellsContainer; 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::vector<uint32> ToyItemIdsContainer; static DB2Manager& Instance() { @@ -153,7 +166,7 @@ public: return instance; } - void LoadStores(std::string const& dataPath); + void LoadStores(std::string const& dataPath, uint32 defaultLocale); DB2StorageBase const* GetStorage(uint32 type) const; void LoadHotfixData(); @@ -174,11 +187,13 @@ public: MountEntry const* GetMount(uint32 spellId) const; MountEntry const* GetMountById(uint32 id) const; MountTypeXCapabilitySet const* GetMountCapabilities(uint32 mountType) const; + ResponseCodes ValidateName(std::string const& name, LocaleConstant locale) const; std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); std::set<uint32> GetPhasesForGroup(uint32 group) const; std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const; std::vector<SpellPowerEntry const*> GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const; + bool GetToyItemIdMatch(uint32 toy) const; private: StorageMap _stores; @@ -197,11 +212,13 @@ private: MountContainer _mountsBySpellId; MountCapabilitiesByTypeContainer _mountCapabilitiesByType; NameGenContainer _nameGenData; + NameValidationRegexContainer _nameValidators; PhaseGroupContainer _phasesByGroup; QuestPackageItemContainer _questPackages; SpecializationSpellsContainer _specializationSpellsBySpec; SpellPowerContainer _spellPowers; SpellPowerDifficultyContainer _spellPowerDifficulties; + ToyItemIdsContainer _toys; }; #define sDB2Manager DB2Manager::Instance() diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index c84996a524e..f2f8bec2b68 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -21,9 +21,29 @@ #include "Common.h" #include "DBCEnums.h" #include "Path.h" +#include "Util.h" #pragma pack(push, 1) +struct AchievementEntry +{ + uint32 ID; // 0 + int32 Faction; // 1 -1=all, 0=horde, 1=alliance + int32 MapID; // 2 -1=none + uint32 Supercedes; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) + LocalizedString* Title; // 4 + LocalizedString* Description; // 5 + uint32 Category; // 6 + uint32 Points; // 7 reward points + uint32 UIOrder; // 8 + uint32 Flags; // 9 + uint32 IconID; // 10 icon (from SpellIcon.dbc) + LocalizedString* Reward; // 11 + uint32 MinimumCriteria; // 12 - need this count of completed criterias (own or referenced achievement criterias) + uint32 SharesCriteria; // 13 - referenced achievement (counting of all completed criterias) + uint32 CriteriaTree; // 14 +}; + struct AreaGroupEntry { uint32 ID; // 0 @@ -57,6 +77,42 @@ struct BarberShopStyleEntry uint32 Data; // 7 (real ID to hair/facial hair) }; +struct BattlePetBreedQualityEntry +{ + uint32 ID; // 0 + uint32 Quality; // 1 + float Modifier; // 2 +}; + +struct BattlePetBreedStateEntry +{ + uint32 ID; // 0 + uint32 BreedID; // 1 + uint32 State; // 2 + int32 Value; // 3 +}; + +struct BattlePetSpeciesEntry +{ + uint32 ID; // 0 + uint32 CreatureID; // 1 + uint32 IconFileID; // 2 + uint32 SummonSpellID; // 3 + uint32 PetType; // 4 + int32 Source; // 5 + uint32 Flags; // 6 + LocalizedString* SourceText; // 7 + LocalizedString* Description; // 8 +}; + +struct BattlePetSpeciesStateEntry +{ + uint32 ID; // 0 + uint32 SpeciesID; // 1 + uint32 State; // 2 + int32 Value; // 3 +}; + #define MAX_BROADCAST_TEXT_EMOTES 3 struct BroadcastTextEntry @@ -131,6 +187,152 @@ struct CreatureTypeEntry uint32 Flags; // 2 no exp? critters, non-combat pets, gas cloud. }; +struct CriteriaEntry +{ + uint32 ID; // 0 + uint32 Type; // 1 + union + { + uint32 ID; + // ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0 + // ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20 + uint32 CreatureID; + + // ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1 + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15 + // ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16 + // ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32 + // ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33 + uint32 MapID; + + // ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7 + // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40 + // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75 + // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112 + uint32 SkillID; + + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8 + uint32 AchievementID; + + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11 + uint32 ZoneID; + + // ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12 + uint32 CurrencyID; + + // ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18 + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19 + uint32 GroupSize; + + // ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26 + uint32 DamageType; + + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27 + uint32 QuestID; + + // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28 + // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69 + // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29 + // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110 + // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34 + uint32 SpellID; + + // ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE + uint32 ObjectiveId; + + // ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31 + // ACHIEVEMENT_CRITERIA_TYPE_ENTER_AREA = 163 + // ACHIEVEMENT_CRITERIA_TYPE_LEAVE_AREA = 164 + uint32 AreaID; + + // ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36 + // ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41 + // ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42 + // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57 + // ACHIEVEMENT_CRITERIA_TYPE_OWN_TOY = 185 + uint32 ItemID; + + // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38 + // ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39 + // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39 + uint32 TeamType; + + // ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43 + uint32 WorldMapOverlayID; + + // ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46 + uint32 FactionID; + + // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49 + uint32 ItemSlot; + + // ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50 + // ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51 + uint32 RollValue; + + // ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52 + uint32 ClassID; + + // ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53 + uint32 RaceID; + + // ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54 + uint32 EmoteID; + + // ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68 + // ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72 + uint32 GameObjectID; + + // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96 + uint32 PowerType; + + // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97 + uint32 StatType; + + // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98 + uint32 SpellSchool; + + // ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109 + uint32 LootType; + + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DUNGEON_ENCOUNTER = 165 + uint32 DungeonEncounterID; + + // ACHIEVEMENT_CRITERIA_TYPE_CONSTRUCT_GARRISON_BUILDING = 169 + uint32 GarrBuildingID; + + // ACHIEVEMENT_CRITERIA_TYPE_UPGRADE_GARRISON = 170 + uint32 GarrisonLevel; + + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_MISSION = 174 + uint32 GarrMissionID; + + // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182 + uint32 CharShipmentContainerID; + } Asset; // 2 + uint32 StartEvent; // 3 + uint32 StartAsset; // 4 + uint32 StartTimer; // 5 + uint32 FailEvent; // 6 + uint32 FailAsset; // 7 + uint32 ModifierTreeId; // 8 + uint32 Flags; // 9 + uint32 EligibilityWorldStateID; // 10 + uint32 EligibilityWorldStateValue; // 11 +}; + +struct CriteriaTreeEntry +{ + uint32 ID; // 0 + uint32 CriteriaID; // 1 + uint64 Amount; // 2 + uint32 Operator; // 3 + uint32 Parent; // 4 + uint32 Flags; // 5 + LocalizedString* Description; // 6 + uint32 OrderIndex; // 7 +}; + struct CurrencyTypesEntry { uint32 ID; // 0 @@ -664,6 +866,12 @@ struct ItemSpecOverrideEntry uint32 SpecID; // 2 }; +struct ItemToBattlePetSpeciesEntry +{ + uint32 ID; // 0 + uint32 BattlePetSpeciesID; // 1 +}; + struct ItemXBonusTreeEntry { uint32 ID; // 0 @@ -685,9 +893,20 @@ struct MailTemplateEntry LocalizedString* Body; // 1 }; +struct ModifierTreeEntry +{ + uint32 ID; // 0 + uint32 Type; // 1 + uint32 Asset[2]; // 2-3 + uint32 Operator; // 4 + uint32 Amount; // 5 + uint32 Parent; // 6 +}; + struct MountEntry { uint32 Id; + uint32 SpellId; uint32 MountTypeId; uint32 DisplayId; uint32 Flags; @@ -695,7 +914,6 @@ struct MountEntry LocalizedString* Description; LocalizedString* SourceDescription; uint32 Source; - uint32 SpellId; uint32 PlayerConditionId; }; @@ -727,6 +945,26 @@ struct NameGenEntry uint32 Sex; // 3 }; +struct NamesProfanityEntry +{ + uint32 ID; // 0 + char const* Name; // 1 + int32 Language; // 2 +}; + +struct NamesReservedEntry +{ + uint32 ID; // 0 + char const* Name; // 1 +}; + +struct NamesReservedLocaleEntry +{ + uint32 ID; // 0 + char const* Name; // 1 + uint32 LocaleMask; // 2 +}; + #define MAX_OVERRIDE_SPELL 10 struct OverrideSpellDataEntry @@ -1037,6 +1275,15 @@ struct TotemCategoryEntry uint32 CategoryMask; // 3 }; +struct ToyEntry +{ + uint32 ID; // 0 + uint32 ItemID; // 1 + uint32 Flags; // 2 + LocalizedString* Description; // 3 + uint32 CategoryFilter; // 4 +}; + struct TransportAnimationEntry { uint32 ID; // 0 @@ -1122,7 +1369,7 @@ struct TaxiPathNodePtr typedef Path<TaxiPathNodePtr, TaxiPathNodeEntry const> TaxiPathNodeList; typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath; -#define TaxiMaskSize 215 +#define TaxiMaskSize 217 typedef uint8 TaxiMask[TaxiMaskSize]; #endif diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index b7f3356176e..ab9e2e0ae4e 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -18,16 +18,23 @@ #ifndef TRINITY_DB2SFRM_H #define TRINITY_DB2SFRM_H +char const AchievementFormat[] = "niiissiiiiisiii"; char const AreaGroupFormat[] = "n"; char const AreaGroupMemberFormat[] = "nii"; char const AuctionHouseFormat[] = "niiis"; char const BarberShopStyleFormat[] = "nissfiii"; +char const BattlePetBreedQualityFormat[] = "nif"; +char const BattlePetBreedStateFormat[] = "niii"; +char const BattlePetSpeciesFormat[] = "niiiiiiss"; +char const BattlePetSpeciesStateFormat[] = "niii"; char const BroadcastTextFormat[] = "nissiiiiiiiii"; char const CharStartOutfitFormat[] = "nbbbbiiiiiiiiiiiiiiiiiiiiiiiiii"; char const ChrClassesXPowerTypesFormat[] = "iii"; char const CinematicSequencesFormat[] = "niiiiiiiii"; char const CreatureDisplayInfoFormat[] = "niiiffissssiiiiiiiiiii"; char const CreatureTypeFormat[] = "nsi"; +char const CriteriaFormat[] = "niiiiiiiiiii"; +char const CriteriaTreeFormat[] = "niliiisi"; char const CurrencyTypesFormat[] = "nisssiiiiiis"; char const CurvePointFormat[] = "niiff"; char const DestructibleModelDataFormat[] = "niiiiiiiiiiiiiiiiiiiiiii"; @@ -69,13 +76,18 @@ char const ItemRandomSuffixFormat[] = "nssiiiiiiiiii"; char const ItemSparseFormat[] = "niiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffffffiiifisssssiiiiiiiiiiiiiiiiiiifiiifiii"; char const ItemSpecFormat[] = "niiiiii"; char const ItemSpecOverrideFormat[] = "nii"; +char const ItemToBattlePetSpeciesFormat[] = "ni"; char const ItemXBonusTreeFormat[] = "nii"; char const KeyChainFormat[] = "nbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; char const MailTemplateFormat[] = "ns"; +char const ModifierTreeFormat[] = "niiiiii"; char const MountCapabilityFormat[] = "niiiiiii"; -char const MountFormat[] = "niiisssiii"; +char const MountFormat[] = "niiiisssii"; char const MountTypeXCapabilityFormat[] = "niii"; char const NameGenFormat[] = "nsii"; +char const NamesProfanityFormat[] = "nSi"; +char const NamesReservedFormat[] = "nS"; +char const NamesReservedLocaleFormat[] = "nSi"; char const OverrideSpellDataFormat[] = "niiiiiiiiiiii"; char const PhaseXPhaseGroupFormat[] = "nii"; char const QuestMoneyRewardFormat[] = "niiiiiiiiii"; @@ -106,6 +118,7 @@ char const TaxiNodesFormat[] = "nifffsiiiiiff"; char const TaxiPathFormat[] = "niii"; char const TaxiPathNodeFormat[] = "niiifffiiii"; char const TotemCategoryFormat[] = "nsii"; +char const ToyFormat[] = "niisi"; char const TransportAnimationFormat[] = "niifffi"; char const TransportRotationFormat[] = "niiffff"; char const UnitPowerBarFormat[] = "niiiiffiiiiiiiiiiiiiissssff"; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index d7125293671..ed1a1470e91 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -159,6 +159,7 @@ enum AchievementCriteriaAdditionalCondition ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_RATED_BATTLEGROUND = 63, // NYI ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_PROJECT_RARITY = 65, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_PROJECT_RACE = 66, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_SPECIES = 91, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_QUALITY = 145, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_LEVEL = 146, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_RARE_MISSION = 147, // NYI diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index f819341a04a..8402c3989b3 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -26,8 +26,6 @@ #include <map> -typedef std::map<uint16, uint32> AreaFlagByAreaID; -typedef std::map<uint32, uint32> AreaFlagByMapID; struct WMOAreaTableTripple { @@ -46,151 +44,140 @@ struct WMOAreaTableTripple int32 adtId; }; -typedef std::map<WMOAreaTableTripple, WMOAreaTableEntry const*> WMOAreaInfoByTripple; +typedef std::map<uint16, uint32> AreaFlagByAreaID; +typedef std::map<uint32, uint32> AreaFlagByMapID; typedef std::multimap<uint32, CharSectionsEntry const*> CharSectionsMap; +typedef std::map<uint32, std::vector<uint32>> FactionTeamMap; +typedef std::map<WMOAreaTableTripple, WMOAreaTableEntry const*> WMOAreaInfoByTripple; -DBCStorage <AreaTableEntry> sAreaStore(AreaTableEntryfmt); -static AreaFlagByAreaID sAreaFlagByAreaID; -static AreaFlagByMapID sAreaFlagByMapID; // for instances without generated *.map files - -static WMOAreaInfoByTripple sWMOAreaInfoByTripple; - -DBCStorage <AchievementEntry> sAchievementStore(Achievementfmt); -DBCStorage <AnimKitEntry> sAnimKitStore(AnimKitfmt); -DBCStorage <AreaTriggerEntry> sAreaTriggerStore(AreaTriggerEntryfmt); -DBCStorage <ArmorLocationEntry> sArmorLocationStore(ArmorLocationfmt); -DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore(BankBagSlotPricesEntryfmt); -DBCStorage <BannedAddOnsEntry> sBannedAddOnsStore(BannedAddOnsfmt); -DBCStorage <BattlemasterListEntry> sBattlemasterListStore(BattlemasterListEntryfmt); -DBCStorage <CharSectionsEntry> sCharSectionsStore(CharSectionsEntryfmt); -CharSectionsMap sCharSectionMap; -DBCStorage <CharTitlesEntry> sCharTitlesStore(CharTitlesEntryfmt); -DBCStorage <ChatChannelsEntry> sChatChannelsStore(ChatChannelsEntryfmt); -DBCStorage <ChrClassesEntry> sChrClassesStore(ChrClassesEntryfmt); -DBCStorage <ChrRacesEntry> sChrRacesStore(ChrRacesEntryfmt); -DBCStorage <ChrSpecializationEntry> sChrSpecializationStore(ChrSpecializationEntryfmt); -ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -DBCStorage <CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt); -DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt); -DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt); -DBCStorage <CriteriaEntry> sCriteriaStore(Criteriafmt); -DBCStorage <CriteriaTreeEntry> sCriteriaTreeStore(CriteriaTreefmt); - -DBCStorage <DifficultyEntry> sDifficultyStore(DifficultyFmt); -DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore(DungeonEncounterfmt); -DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore(DurabilityCostsfmt); - -DBCStorage <EmotesEntry> sEmotesStore(EmotesEntryfmt); -DBCStorage <EmotesTextEntry> sEmotesTextStore(EmotesTextEntryfmt); - -typedef std::map<uint32, SimpleFactionsList> FactionTeamMap; -static FactionTeamMap sFactionTeamMap; -DBCStorage <FactionEntry> sFactionStore(FactionEntryfmt); -DBCStorage <FactionTemplateEntry> sFactionTemplateStore(FactionTemplateEntryfmt); - -DBCStorage <GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt); -DBCStorage <GemPropertiesEntry> sGemPropertiesStore(GemPropertiesEntryfmt); -DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore(GlyphPropertiesfmt); - -GameTable <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); -GameTable <GtCombatRatingsEntry> sGtCombatRatingsStore(GtCombatRatingsfmt); -GameTable <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt); -GameTable <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); -GameTable <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt); -GameTable <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore(GtChanceToSpellCritfmt); -GameTable <GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore(GtItemSocketCostPerLevelfmt); -GameTable <GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore(GtNPCManaCostScalerfmt); -GameTable <GtNpcTotalHpEntry> sGtNpcTotalHpStore(GtNpcTotalHpfmt); -GameTable <GtNpcTotalHpExp1Entry> sGtNpcTotalHpExp1Store(GtNpcTotalHpExp1fmt); -GameTable <GtNpcTotalHpExp2Entry> sGtNpcTotalHpExp2Store(GtNpcTotalHpExp2fmt); -GameTable <GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store(GtNpcTotalHpExp3fmt); -GameTable <GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store(GtNpcTotalHpExp4fmt); -GameTable <GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store(GtNpcTotalHpExp5fmt); -GameTable <GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore(GtOCTLevelExperiencefmt); -GameTable <GtOCTRegenHPEntry> sGtOCTRegenHPStore(GtOCTRegenHPfmt); -GameTable <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt); -GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore(GtRegenMPPerSptfmt); -GameTable <GtSpellScalingEntry> sGtSpellScalingStore(GtSpellScalingfmt); -GameTable <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore(GtOCTBaseHPByClassfmt); -GameTable <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore(GtOCTBaseMPByClassfmt); -DBCStorage <GuildColorBackgroundEntry> sGuildColorBackgroundStore(GuildColorBackgroundfmt); -DBCStorage <GuildColorBorderEntry> sGuildColorBorderStore(GuildColorBorderfmt); -DBCStorage <GuildColorEmblemEntry> sGuildColorEmblemStore(GuildColorEmblemfmt); - -DBCStorage <ItemArmorQualityEntry> sItemArmorQualityStore(ItemArmorQualityfmt); -DBCStorage <ItemArmorShieldEntry> sItemArmorShieldStore(ItemArmorShieldfmt); -DBCStorage <ItemArmorTotalEntry> sItemArmorTotalStore(ItemArmorTotalfmt); -DBCStorage <ItemBagFamilyEntry> sItemBagFamilyStore(ItemBagFamilyfmt); -DBCStorage <ItemDamageEntry> sItemDamageAmmoStore(ItemDamagefmt); -DBCStorage <ItemDamageEntry> sItemDamageOneHandStore(ItemDamagefmt); -DBCStorage <ItemDamageEntry> sItemDamageOneHandCasterStore(ItemDamagefmt); -DBCStorage <ItemDamageEntry> sItemDamageRangedStore(ItemDamagefmt); -DBCStorage <ItemDamageEntry> sItemDamageThrownStore(ItemDamagefmt); -DBCStorage <ItemDamageEntry> sItemDamageTwoHandStore(ItemDamagefmt); -DBCStorage <ItemDamageEntry> sItemDamageTwoHandCasterStore(ItemDamagefmt); -DBCStorage <ItemDamageEntry> sItemDamageWandStore(ItemDamagefmt); -DBCStorage <ItemSetEntry> sItemSetStore(ItemSetEntryfmt); -DBCStorage <ItemSetSpellEntry> sItemSetSpellStore(ItemSetSpellEntryfmt); -ItemSetSpellsStore sItemSetSpellsStore; - -DBCStorage <LFGDungeonEntry> sLFGDungeonStore(LFGDungeonEntryfmt); -DBCStorage <LightEntry> sLightStore(LightEntryfmt); -DBCStorage <LiquidTypeEntry> sLiquidTypeStore(LiquidTypefmt); -DBCStorage <LockEntry> sLockStore(LockEntryfmt); - -DBCStorage <MapEntry> sMapStore(MapEntryfmt); - -// DBC used only for initialization sMapDifficultyMap at startup. -DBCStorage <MapDifficultyEntry> sMapDifficultyStore(MapDifficultyEntryfmt); // only for loading -MapDifficultyMap sMapDifficultyMap; - -DBCStorage <ModifierTreeEntry> sModifierTreeStore(ModifierTreefmt); -DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt); - -DBCStorage <PowerDisplayEntry> sPowerDisplayStore(PowerDisplayfmt); -DBCStorage <PvPDifficultyEntry> sPvPDifficultyStore(PvPDifficultyfmt); - -DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore(QuestFactionRewardfmt); -DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore(RandomPropertiesPointsfmt); - -DBCStorage <SkillLineEntry> sSkillLineStore(SkillLinefmt); -DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore(SkillLineAbilityfmt); -DBCStorage <SkillRaceClassInfoEntry> sSkillRaceClassInfoStore(SkillRaceClassInfofmt); -SkillRaceClassInfoMap SkillRaceClassInfoBySkill; - -DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); -DBCStorage <SpellEntry> sSpellStore(SpellEntryfmt); -DBCStorage <SpellEffectScalingEntry> sSpellEffectScalingStore(SpellEffectScalingfmt); - -SpellCategoryStore sSpellsByCategoryStore; -PetFamilySpellsStore sPetFamilySpellsStore; -SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; - - -DBCStorage <SpellScalingEntry> sSpellScalingStore(SpellScalingEntryfmt); -DBCStorage <SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore(SpellTargetRestrictionsEntryfmt); -DBCStorage <SpellLevelsEntry> sSpellLevelsStore(SpellLevelsEntryfmt); -DBCStorage <SpellInterruptsEntry> sSpellInterruptsStore(SpellInterruptsEntryfmt); -DBCStorage <SpellEquippedItemsEntry> sSpellEquippedItemsStore(SpellEquippedItemsEntryfmt); -DBCStorage <SpellCooldownsEntry> sSpellCooldownsStore(SpellCooldownsEntryfmt); -DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore(SpellAuraOptionsEntryfmt); -DBCStorage <SpellCategoriesEntry> sSpellCategoriesStore(SpellCategoriesEntryfmt); -DBCStorage <SpellCategoryEntry> sSpellCategoryStore(SpellCategoryfmt); -DBCStorage <SpellEffectEntry> sSpellEffectStore(SpellEffectEntryfmt); -DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore(SpellFocusObjectfmt); -DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore(SpellShapeshiftEntryfmt); -DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore(SpellShapeshiftFormfmt); -DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore(StableSlotPricesfmt); -DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore(SummonPropertiesfmt); -DBCStorage <TalentEntry> sTalentStore(TalentEntryfmt); -TalentsByPosition sTalentByPos; - -DBCStorage <VehicleEntry> sVehicleStore(VehicleEntryfmt); -DBCStorage <VehicleSeatEntry> sVehicleSeatStore(VehicleSeatEntryfmt); -DBCStorage <WMOAreaTableEntry> sWMOAreaTableStore(WMOAreaTableEntryfmt); -DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreaEntryfmt); -DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsEntryfmt); -DBCStorage <PhaseEntry> sPhaseStore(PhaseEntryfmt); +DBCStorage<AnimKitEntry> sAnimKitStore(AnimKitfmt); +DBCStorage<AreaTableEntry> sAreaStore(AreaTablefmt); +static AreaFlagByAreaID sAreaFlagByAreaID; +static AreaFlagByMapID sAreaFlagByMapID; // for instances without generated *.map files +DBCStorage<AreaTriggerEntry> sAreaTriggerStore(AreaTriggerfmt); +DBCStorage<ArmorLocationEntry> sArmorLocationStore(ArmorLocationfmt); + +DBCStorage<BankBagSlotPricesEntry> sBankBagSlotPricesStore(BankBagSlotPricesfmt); +DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore(BannedAddOnsfmt); +DBCStorage<BattlemasterListEntry> sBattlemasterListStore(BattlemasterListfmt); + +DBCStorage<CharSectionsEntry> sCharSectionsStore(CharSectionsfmt); +CharSectionsMap sCharSectionMap; +DBCStorage<CharTitlesEntry> sCharTitlesStore(CharTitlesfmt); +DBCStorage<ChatChannelsEntry> sChatChannelsStore(ChatChannelsfmt); +DBCStorage<ChrClassesEntry> sChrClassesStore(ChrClassesfmt); +DBCStorage<ChrRacesEntry> sChrRacesStore(ChrRacesfmt); +DBCStorage<ChrSpecializationEntry> sChrSpecializationStore(ChrSpecializationfmt); +ChrSpecializationByIndexArray sChrSpecializationByIndexStore; +DBCStorage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt); +DBCStorage<CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt); +DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt); + +DBCStorage<DifficultyEntry> sDifficultyStore(DifficultyFmt); +DBCStorage<DungeonEncounterEntry> sDungeonEncounterStore(DungeonEncounterfmt); +DBCStorage<DurabilityCostsEntry> sDurabilityCostsStore(DurabilityCostsfmt); + +DBCStorage<EmotesEntry> sEmotesStore(Emotesfmt); +DBCStorage<EmotesTextEntry> sEmotesTextStore(EmotesTextfmt); + +DBCStorage<FactionEntry> sFactionStore(Factionfmt); +static FactionTeamMap sFactionTeamMap; +DBCStorage<FactionTemplateEntry> sFactionTemplateStore(FactionTemplatefmt); + +DBCStorage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt); +DBCStorage<GemPropertiesEntry> sGemPropertiesStore(GemPropertiesfmt); +DBCStorage<GlyphPropertiesEntry> sGlyphPropertiesStore(GlyphPropertiesfmt); +DBCStorage<GuildColorBackgroundEntry> sGuildColorBackgroundStore(GuildColorBackgroundfmt); +DBCStorage<GuildColorBorderEntry> sGuildColorBorderStore(GuildColorBorderfmt); +DBCStorage<GuildColorEmblemEntry> sGuildColorEmblemStore(GuildColorEmblemfmt); +DBCStorage<ItemArmorQualityEntry> sItemArmorQualityStore(ItemArmorQualityfmt); +DBCStorage<ItemArmorShieldEntry> sItemArmorShieldStore(ItemArmorShieldfmt); +DBCStorage<ItemArmorTotalEntry> sItemArmorTotalStore(ItemArmorTotalfmt); +DBCStorage<ItemBagFamilyEntry> sItemBagFamilyStore(ItemBagFamilyfmt); +DBCStorage<ItemDamageEntry> sItemDamageAmmoStore(ItemDamagefmt); +DBCStorage<ItemDamageEntry> sItemDamageOneHandCasterStore(ItemDamagefmt); +DBCStorage<ItemDamageEntry> sItemDamageOneHandStore(ItemDamagefmt); +DBCStorage<ItemDamageEntry> sItemDamageRangedStore(ItemDamagefmt); +DBCStorage<ItemDamageEntry> sItemDamageThrownStore(ItemDamagefmt); +DBCStorage<ItemDamageEntry> sItemDamageTwoHandCasterStore(ItemDamagefmt); +DBCStorage<ItemDamageEntry> sItemDamageTwoHandStore(ItemDamagefmt); +DBCStorage<ItemDamageEntry> sItemDamageWandStore(ItemDamagefmt); +DBCStorage<ItemSetEntry> sItemSetStore(ItemSetfmt); +DBCStorage<ItemSetSpellEntry> sItemSetSpellStore(ItemSetSpellfmt); +ItemSetSpellsStore sItemSetSpellsStore; + +DBCStorage<LFGDungeonEntry> sLFGDungeonStore(LFGDungeonfmt); +DBCStorage<LightEntry> sLightStore(Lightfmt); +DBCStorage<LiquidTypeEntry> sLiquidTypeStore(LiquidTypefmt); +DBCStorage<LockEntry> sLockStore(Lockfmt); + +DBCStorage<MapEntry> sMapStore(Mapfmt); +DBCStorage<MapDifficultyEntry> sMapDifficultyStore(MapDifficultyfmt); // only for loading +MapDifficultyMap sMapDifficultyMap; +DBCStorage<MovieEntry> sMovieStore(Moviefmt); + +DBCStorage<PhaseEntry> sPhaseStore(Phasefmt); +DBCStorage<PowerDisplayEntry> sPowerDisplayStore(PowerDisplayfmt); +DBCStorage<PvPDifficultyEntry> sPvpDifficultyStore(PvpDifficultyfmt); + +DBCStorage<QuestFactionRewEntry> sQuestFactionRewardStore(QuestFactionRewardfmt); + +DBCStorage<RandomPropertiesPointsEntry> sRandomPropertiesPointsStore(RandPropPointsfmt); + +DBCStorage<SkillLineAbilityEntry> sSkillLineAbilityStore(SkillLineAbilityfmt); +DBCStorage<SkillLineEntry> sSkillLineStore(SkillLinefmt); +DBCStorage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore(SkillRaceClassInfofmt); +SkillRaceClassInfoMap SkillRaceClassInfoBySkill; +DBCStorage<SpellAuraOptionsEntry> sSpellAuraOptionsStore(SpellAuraOptionsfmt); +DBCStorage<SpellCategoriesEntry> sSpellCategoriesStore(SpellCategoriesfmt); +DBCStorage<SpellCategoryEntry> sSpellCategoryStore(SpellCategoryfmt); +DBCStorage<SpellCooldownsEntry> sSpellCooldownsStore(SpellCooldownsfmt); +DBCStorage<SpellEffectEntry> sSpellEffectStore(SpellEffectfmt); +DBCStorage<SpellEffectScalingEntry> sSpellEffectScalingStore(SpellEffectScalingfmt); +SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; +DBCStorage<SpellEntry> sSpellStore(Spellfmt); +DBCStorage<SpellEquippedItemsEntry> sSpellEquippedItemsStore(SpellEquippedItemsfmt); +DBCStorage<SpellFocusObjectEntry> sSpellFocusObjectStore(SpellFocusObjectfmt); +DBCStorage<SpellInterruptsEntry> sSpellInterruptsStore(SpellInterruptsfmt); +DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); +DBCStorage<SpellLevelsEntry> sSpellLevelsStore(SpellLevelsfmt); +DBCStorage<SpellScalingEntry> sSpellScalingStore(SpellScalingfmt); +DBCStorage<SpellShapeshiftEntry> sSpellShapeshiftStore(SpellShapeshiftfmt); +DBCStorage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore(SpellShapeshiftFormfmt); +DBCStorage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore(SpellTargetRestrictionsfmt); +DBCStorage<SummonPropertiesEntry> sSummonPropertiesStore(SummonPropertiesfmt); + +DBCStorage<TalentEntry> sTalentStore(Talentfmt); +TalentsByPosition sTalentByPos; + +DBCStorage<VehicleEntry> sVehicleStore(Vehiclefmt); +DBCStorage<VehicleSeatEntry> sVehicleSeatStore(VehicleSeatfmt); + +DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore(WMOAreaTablefmt); +static WMOAreaInfoByTripple sWMOAreaInfoByTripple; +DBCStorage<WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreafmt); +DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsfmt); + +GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); +GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt); +GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt); +GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt); +GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore(GtChanceToSpellCritfmt); +GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore(GtCombatRatingsfmt); +GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore(GtItemSocketCostPerLevelfmt); +GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore(GtNPCManaCostScalerfmt); +GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore(GtNpcTotalHpfmt); +GameTable<GtNpcTotalHpExp1Entry> sGtNpcTotalHpExp1Store(GtNpcTotalHpExp1fmt); +GameTable<GtNpcTotalHpExp2Entry> sGtNpcTotalHpExp2Store(GtNpcTotalHpExp2fmt); +GameTable<GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store(GtNpcTotalHpExp3fmt); +GameTable<GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store(GtNpcTotalHpExp4fmt); +GameTable<GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store(GtNpcTotalHpExp5fmt); +GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore(GtOCTBaseHPByClassfmt); +GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore(GtOCTBaseMPByClassfmt); +GameTable<GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt); +GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore(GtOCTLevelExperiencefmt); +GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore(GtRegenMPPerSptfmt); +GameTable<GtSpellScalingEntry> sGtSpellScalingStore(GtSpellScalingfmt); typedef std::list<std::string> StoreProblemList; @@ -198,7 +185,7 @@ 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, std::string const* customFormat = NULL, std::string const* customIndexName = NULL) +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), @@ -206,7 +193,7 @@ inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCSt filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T))); ++DBCFileCount; - std::string dbcFilename = dbcPath + filename; + std::string dbcFilename = dbcPath + localeNames[defaultLocale] + '/' + filename; SqlDbc * sql = NULL; if (customFormat) sql = new SqlDbc(&filename, customFormat, customIndexName, storage.GetFormat()); @@ -298,102 +285,98 @@ inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName } } -void LoadDBCStores(const std::string& dataPath) +void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale) { uint32 oldMSTime = getMSTime(); - std::string dbcPath = dataPath+"dbc/"; + 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) - - LOAD_DBC(sAchievementStore, "Achievement.dbc"/*, &CustomAchievementfmt, &CustomAchievementIndex*/);//20201 - LOAD_DBC(sAnimKitStore, "AnimKit.dbc");//20201 - LOAD_DBC(sAreaStore, "AreaTable.dbc");//20201 - LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20201 - LOAD_DBC(sArmorLocationStore, "ArmorLocation.dbc");//20201 - LOAD_DBC(sBankBagSlotPricesStore, "BankBagSlotPrices.dbc");//20201 - LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20201 - LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20201 - LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20201 - LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20201 - LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20201 - LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20201 - LOAD_DBC(sChrRacesStore, "ChrRaces.dbc");//20201 - LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20201 - LOAD_DBC(sCreatureDisplayInfoExtraStore, "CreatureDisplayInfoExtra.dbc");//20201 - LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20201 - LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20201 - LOAD_DBC(sCriteriaStore, "Criteria.dbc");//20201 - LOAD_DBC(sCriteriaTreeStore, "CriteriaTree.dbc");//20201 - LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20201 - LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20201 - LOAD_DBC(sDurabilityCostsStore, "DurabilityCosts.dbc");//20201 - LOAD_DBC(sEmotesStore, "Emotes.dbc");//20201 - LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20201 - LOAD_DBC(sFactionStore, "Faction.dbc");//20201 - LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20201 - LOAD_DBC(sGameObjectDisplayInfoStore, "GameObjectDisplayInfo.dbc");//20201 - LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20201 - LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20201 - LOAD_DBC(sGuildColorBackgroundStore, "GuildColorBackground.dbc");//20201 - LOAD_DBC(sGuildColorBorderStore, "GuildColorBorder.dbc"); //20201 - LOAD_DBC(sGuildColorEmblemStore, "GuildColorEmblem.dbc");//20201 - LOAD_DBC(sItemArmorQualityStore, "ItemArmorQuality.dbc");//20201 - LOAD_DBC(sItemArmorShieldStore, "ItemArmorShield.dbc");//20201 - LOAD_DBC(sItemArmorTotalStore, "ItemArmorTotal.dbc");//20201 - LOAD_DBC(sItemBagFamilyStore, "ItemBagFamily.dbc");//20201 - LOAD_DBC(sItemDamageAmmoStore, "ItemDamageAmmo.dbc");//20201 - LOAD_DBC(sItemDamageOneHandCasterStore, "ItemDamageOneHandCaster.dbc");//20201 - LOAD_DBC(sItemDamageOneHandStore, "ItemDamageOneHand.dbc");//20201 - LOAD_DBC(sItemDamageRangedStore, "ItemDamageRanged.dbc");//20201 - LOAD_DBC(sItemDamageThrownStore, "ItemDamageThrown.dbc");//20201 - LOAD_DBC(sItemDamageTwoHandCasterStore, "ItemDamageTwoHandCaster.dbc");//20201 - LOAD_DBC(sItemDamageTwoHandStore, "ItemDamageTwoHand.dbc");//20201 - LOAD_DBC(sItemDamageWandStore, "ItemDamageWand.dbc");//20201 - LOAD_DBC(sItemSetSpellStore, "ItemSetSpell.dbc");//20201 - LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20201 - LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20201 - LOAD_DBC(sLightStore, "Light.dbc"); //20201 - LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20201 - LOAD_DBC(sLockStore, "Lock.dbc");//20201 - LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20201 - LOAD_DBC(sMapStore, "Map.dbc");//20201 - LOAD_DBC(sModifierTreeStore, "ModifierTree.dbc");//20201 - LOAD_DBC(sMovieStore, "Movie.dbc");//20201 - LOAD_DBC(sPhaseStore, "Phase.dbc"); // 20201 - LOAD_DBC(sPowerDisplayStore, "PowerDisplay.dbc");//20201 - LOAD_DBC(sPvPDifficultyStore, "PvpDifficulty.dbc");//20201 - LOAD_DBC(sQuestFactionRewardStore, "QuestFactionReward.dbc");//20201 - LOAD_DBC(sRandomPropertiesPointsStore, "RandPropPoints.dbc");//20201 - LOAD_DBC(sSkillLineAbilityStore, "SkillLineAbility.dbc");//20201 - LOAD_DBC(sSkillLineStore, "SkillLine.dbc");//20201 - LOAD_DBC(sSkillRaceClassInfoStore, "SkillRaceClassInfo.dbc");//20201 - LOAD_DBC(sSpellAuraOptionsStore, "SpellAuraOptions.dbc");//20201 - LOAD_DBC(sSpellCategoriesStore, "SpellCategories.dbc");//20201 - LOAD_DBC(sSpellCategoryStore, "SpellCategory.dbc");//20201 - LOAD_DBC(sSpellCooldownsStore, "SpellCooldowns.dbc");//20201 - LOAD_DBC(sSpellEffectScalingStore, "SpellEffectScaling.dbc");//20201 - LOAD_DBC(sSpellEffectStore, "SpellEffect.dbc"/*, &CustomSpellEffectEntryfmt, &CustomSpellEffectEntryIndex*/);//20201 - LOAD_DBC(sSpellEquippedItemsStore, "SpellEquippedItems.dbc");//20201 - LOAD_DBC(sSpellFocusObjectStore, "SpellFocusObject.dbc");//20201 - LOAD_DBC(sSpellInterruptsStore, "SpellInterrupts.dbc");//20201 - LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20201 - LOAD_DBC(sSpellLevelsStore, "SpellLevels.dbc");//20201 - LOAD_DBC(sSpellScalingStore, "SpellScaling.dbc");//20201 - LOAD_DBC(sSpellShapeshiftFormStore, "SpellShapeshiftForm.dbc");//20201 - LOAD_DBC(sSpellShapeshiftStore, "SpellShapeshift.dbc");//20201 - LOAD_DBC(sSpellStore, "Spell.dbc"/*, &CustomSpellEntryfmt, &CustomSpellEntryIndex*/);//20201 - LOAD_DBC(sSpellTargetRestrictionsStore, "SpellTargetRestrictions.dbc");//20201 - LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20201 - LOAD_DBC(sTalentStore, "Talent.dbc");//20201 - LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20201 - LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20201 - LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20201 - LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20201 - LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20201 +#define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file, defaultLocale) + + LOAD_DBC(sAnimKitStore, "AnimKit.dbc");//20444 + LOAD_DBC(sAreaStore, "AreaTable.dbc");//20444 + LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20444 + LOAD_DBC(sArmorLocationStore, "ArmorLocation.dbc");//20444 + LOAD_DBC(sBankBagSlotPricesStore, "BankBagSlotPrices.dbc");//20444 + LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20444 + LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20444 + LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20444 + LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20444 + LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20444 + LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20444 + LOAD_DBC(sChrRacesStore, "ChrRaces.dbc");//20444 + LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20444 + LOAD_DBC(sCreatureDisplayInfoExtraStore, "CreatureDisplayInfoExtra.dbc");//20444 + LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20444 + LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20444 + LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20444 + LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20444 + LOAD_DBC(sDurabilityCostsStore, "DurabilityCosts.dbc");//20444 + LOAD_DBC(sEmotesStore, "Emotes.dbc");//20444 + LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20444 + LOAD_DBC(sFactionStore, "Faction.dbc");//20444 + LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20444 + LOAD_DBC(sGameObjectDisplayInfoStore, "GameObjectDisplayInfo.dbc");//20444 + LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20444 + LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20444 + LOAD_DBC(sGuildColorBackgroundStore, "GuildColorBackground.dbc");//20444 + LOAD_DBC(sGuildColorBorderStore, "GuildColorBorder.dbc"); //20444 + LOAD_DBC(sGuildColorEmblemStore, "GuildColorEmblem.dbc");//20444 + LOAD_DBC(sItemArmorQualityStore, "ItemArmorQuality.dbc");//20444 + LOAD_DBC(sItemArmorShieldStore, "ItemArmorShield.dbc");//20444 + LOAD_DBC(sItemArmorTotalStore, "ItemArmorTotal.dbc");//20444 + LOAD_DBC(sItemBagFamilyStore, "ItemBagFamily.dbc");//20444 + LOAD_DBC(sItemDamageAmmoStore, "ItemDamageAmmo.dbc");//20444 + LOAD_DBC(sItemDamageOneHandCasterStore, "ItemDamageOneHandCaster.dbc");//20444 + LOAD_DBC(sItemDamageOneHandStore, "ItemDamageOneHand.dbc");//20444 + LOAD_DBC(sItemDamageRangedStore, "ItemDamageRanged.dbc");//20444 + LOAD_DBC(sItemDamageThrownStore, "ItemDamageThrown.dbc");//20444 + LOAD_DBC(sItemDamageTwoHandCasterStore, "ItemDamageTwoHandCaster.dbc");//20444 + LOAD_DBC(sItemDamageTwoHandStore, "ItemDamageTwoHand.dbc");//20444 + LOAD_DBC(sItemDamageWandStore, "ItemDamageWand.dbc");//20444 + LOAD_DBC(sItemSetSpellStore, "ItemSetSpell.dbc");//20444 + LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20444 + LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20444 + LOAD_DBC(sLightStore, "Light.dbc"); //20444 + LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20444 + LOAD_DBC(sLockStore, "Lock.dbc");//20444 + LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20444 + LOAD_DBC(sMapStore, "Map.dbc");//20444 + LOAD_DBC(sMovieStore, "Movie.dbc");//20444 + LOAD_DBC(sPhaseStore, "Phase.dbc"); // 20444 + LOAD_DBC(sPowerDisplayStore, "PowerDisplay.dbc");//20444 + LOAD_DBC(sPvpDifficultyStore, "PvpDifficulty.dbc");//20444 + LOAD_DBC(sQuestFactionRewardStore, "QuestFactionReward.dbc");//20444 + LOAD_DBC(sRandomPropertiesPointsStore, "RandPropPoints.dbc");//20444 + LOAD_DBC(sSkillLineAbilityStore, "SkillLineAbility.dbc");//20444 + LOAD_DBC(sSkillLineStore, "SkillLine.dbc");//20444 + LOAD_DBC(sSkillRaceClassInfoStore, "SkillRaceClassInfo.dbc");//20444 + LOAD_DBC(sSpellAuraOptionsStore, "SpellAuraOptions.dbc");//20444 + LOAD_DBC(sSpellCategoriesStore, "SpellCategories.dbc");//20444 + LOAD_DBC(sSpellCategoryStore, "SpellCategory.dbc");//20444 + LOAD_DBC(sSpellCooldownsStore, "SpellCooldowns.dbc");//20444 + LOAD_DBC(sSpellEffectScalingStore, "SpellEffectScaling.dbc");//20444 + LOAD_DBC(sSpellEffectStore, "SpellEffect.dbc"/*, &CustomSpellEffectfmt, &CustomSpellEffectEntryIndex*/);//20444 + LOAD_DBC(sSpellEquippedItemsStore, "SpellEquippedItems.dbc");//20444 + LOAD_DBC(sSpellFocusObjectStore, "SpellFocusObject.dbc");//20444 + LOAD_DBC(sSpellInterruptsStore, "SpellInterrupts.dbc");//20444 + LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20444 + LOAD_DBC(sSpellLevelsStore, "SpellLevels.dbc");//20444 + LOAD_DBC(sSpellScalingStore, "SpellScaling.dbc");//20444 + LOAD_DBC(sSpellShapeshiftFormStore, "SpellShapeshiftForm.dbc");//20444 + LOAD_DBC(sSpellShapeshiftStore, "SpellShapeshift.dbc");//20444 + LOAD_DBC(sSpellStore, "Spell.dbc"/*, &CustomSpellfmt, &CustomSpellEntryIndex*/);//20444 + LOAD_DBC(sSpellTargetRestrictionsStore, "SpellTargetRestrictions.dbc");//20444 + LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20444 + LOAD_DBC(sTalentStore, "Talent.dbc");//20444 + LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20444 + LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20444 + LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20444 + LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20444 + LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20444 #undef LOAD_DBC @@ -426,7 +409,7 @@ void LoadDBCStores(const std::string& dataPath) FactionEntry const* faction = sFactionStore.LookupEntry(i); if (faction && faction->ParentFactionID) { - SimpleFactionsList &flist = sFactionTeamMap[faction->ParentFactionID]; + std::vector<uint32> &flist = sFactionTeamMap[faction->ParentFactionID]; flist.push_back(i); } } @@ -453,8 +436,8 @@ void LoadDBCStores(const std::string& dataPath) 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 < sPvPDifficultyStore.GetNumRows(); ++i) - if (PvPDifficultyEntry const* entry = sPvPDifficultyStore.LookupEntry(i)) + for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) + if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) if (entry->BracketID > MAX_BATTLEGROUND_BRACKETS) ASSERT(false && "Need update MAX_BATTLEGROUND_BRACKETS by DBC data"); @@ -463,16 +446,6 @@ void LoadDBCStores(const std::string& dataPath) if (sSkillLineStore.LookupEntry(entry->SkillID)) SkillRaceClassInfoBySkill.emplace(entry->SkillID, entry); - for (uint32 i = 1; i < sSpellStore.GetNumRows(); ++i) - { - SpellEntry const* spell = sSpellStore.LookupEntry(i); - if (!spell) - continue; - - if (SpellCategoriesEntry const* category = sSpellCategoriesStore.LookupEntry(spell->CategoriesID)) - sSpellsByCategoryStore[category->Category].insert(i); - } - for (uint32 j = 0; j < sSpellEffectScalingStore.GetNumRows(); j++) { SpellEffectScalingEntry const* spellEffectScaling = sSpellEffectScalingStore.LookupEntry(j); @@ -501,7 +474,7 @@ void LoadDBCStores(const std::string& dataPath) // 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", DBCFileCount, dataPath.c_str()); + 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()) @@ -515,11 +488,11 @@ void LoadDBCStores(const std::string& dataPath) } // Check loaded DBC files proper version - if (!sAreaStore.LookupEntry(6420) || // last area (areaflag) added in 6.2.0 (20216) - !sCharTitlesStore.LookupEntry(457) || // last char title added in 6.2.0 (20216) - !sGemPropertiesStore.LookupEntry(2544) || // last gem property added in 6.2.0 (20216) - !sMapStore.LookupEntry(1497) || // last map added in 6.2.0 (20216) - !sSpellStore.LookupEntry(191981) ) // last spell added in 6.2.0 (20216) + if (!sAreaStore.LookupEntry(6565) || // last area (areaflag) added in 6.2.2 (20444) + !sCharTitlesStore.LookupEntry(457) || // last char title added in 6.2.2 (20444) + !sGemPropertiesStore.LookupEntry(2544) || // last gem property added in 6.2.2 (20444) + !sMapStore.LookupEntry(1497) || // last map added in 6.2.2 (20444) + !sSpellStore.LookupEntry(197204) ) // last spell added in 6.2.2 (20444) { TC_LOG_ERROR("misc", "You have _outdated_ DBC files. Please extract correct versions from current using client."); exit(1); @@ -528,43 +501,43 @@ void LoadDBCStores(const std::string& dataPath) TC_LOG_INFO("server.loading", ">> Initialized %d DBC data stores in %u ms", DBCFileCount, GetMSTimeDiffToNow(oldMSTime)); } -void LoadGameTables(const std::string& dataPath) +void LoadGameTables(const std::string& dataPath, uint32 defaultLocale) { uint32 oldMSTime = getMSTime(); - std::string dbcPath = dataPath + "dbc/"; + 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"); // 19342 - LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 19342 - LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 19342 - LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 19342 - LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 19342 - LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 19342 - LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 19342 - LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 19342 - LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore, "gtNpcTotalHp.dbc"); // 19445 - LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpExp1Store, "gtNpcTotalHpExp1.dbc"); // 19445 - LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpExp2Store, "gtNpcTotalHpExp2.dbc"); // 19445 - LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpExp3Store, "gtNpcTotalHpExp3.dbc"); // 19445 - LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpExp4Store, "gtNpcTotalHpExp4.dbc"); // 19445 - LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpExp5Store, "gtNpcTotalHpExp5.dbc"); // 19445 - LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 19342 - LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 19342 - LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 19342 - LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 19342 - LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 19342 - LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 19342 + LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 20444 + LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 20444 + LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 20444 + LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 20444 + LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 20444 + LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 20444 + LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 20444 + LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 20444 + LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore, "gtNpcTotalHp.dbc"); // 20444 + LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpExp1Store, "gtNpcTotalHpExp1.dbc"); // 20444 + LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpExp2Store, "gtNpcTotalHpExp2.dbc"); // 20444 + LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpExp3Store, "gtNpcTotalHpExp3.dbc"); // 20444 + LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpExp4Store, "gtNpcTotalHpExp4.dbc"); // 20444 + LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpExp5Store, "gtNpcTotalHpExp5.dbc"); // 20444 + LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 20444 + LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 20444 + LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 20444 + LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 20444 + LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 20444 + LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 20444 #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", DBCFileCount, dataPath.c_str()); + 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()) @@ -580,7 +553,7 @@ void LoadGameTables(const std::string& dataPath) TC_LOG_INFO("server.loading", ">> Initialized %d DBC GameTables data stores in %u ms", GameTableCount, GetMSTimeDiffToNow(oldMSTime)); } -SimpleFactionsList const* GetFactionTeamList(uint32 faction) +std::vector<uint32> const* GetFactionTeamList(uint32 faction) { FactionTeamMap::const_iterator itr = sFactionTeamMap.find(faction); if (itr != sFactionTeamMap.end()) @@ -589,13 +562,15 @@ SimpleFactionsList const* GetFactionTeamList(uint32 faction) return NULL; } -char const* GetPetName(uint32 petfamily, uint32 /*dbclang*/) +char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 /*locale*/) { if (!petfamily) - return NULL; + return nullptr; + CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(petfamily); if (!pet_family) - return NULL; + return nullptr; + return pet_family->Name_lang ? pet_family->Name_lang : NULL; } @@ -672,17 +647,17 @@ uint32 GetMaxLevelForExpansion(uint32 expansion) { switch (expansion) { - case CONTENT_1_60: + case EXPANSION_CLASSIC: return 60; - case CONTENT_61_70: + case EXPANSION_THE_BURNING_CRUSADE: return 70; - case CONTENT_71_80: + case EXPANSION_WRATH_OF_THE_LICH_KING: return 80; - case CONTENT_81_85: + case EXPANSION_CATACLYSM: return 85; - case CONTENT_86_90: + case EXPANSION_MISTS_OF_PANDARIA: return 90; - case CONTENT_91_100: + case EXPANSION_WARLORDS_OF_DRAENOR: return 100; default: break; @@ -726,9 +701,9 @@ bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTo return (itemEntry->CategoryMask & reqEntry->CategoryMask) == reqEntry->CategoryMask; } -void Zone2MapCoordinates(float& x, float& y, uint32 zone) +void Zone2MapCoordinates(float& x, float& y, uint32 worldMapAreaId) { - WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(zone); + WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId); // if not listed then map coordinates (instance) if (!maEntry) @@ -739,9 +714,9 @@ void Zone2MapCoordinates(float& x, float& y, uint32 zone) y = y*((maEntry->LocRight-maEntry->LocLeft)/100)+maEntry->LocLeft; // client y coord from top to down } -void Map2ZoneCoordinates(float& x, float& y, uint32 zone) +void Map2ZoneCoordinates(float& x, float& y, uint32 worldMapAreaId) { - WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(zone); + WorldMapAreaEntry const* maEntry = sWorldMapAreaStore.LookupEntry(worldMapAreaId); // if not listed then map coordinates (instance) if (!maEntry) @@ -821,9 +796,9 @@ MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficult PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level) { PvPDifficultyEntry const* maxEntry = NULL; // used for level > max listed level case - for (uint32 i = 0; i < sPvPDifficultyStore.GetNumRows(); ++i) + for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) { - if (PvPDifficultyEntry const* entry = sPvPDifficultyStore.LookupEntry(i)) + if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) { // skip unrelated and too-high brackets if (entry->MapID != mapid || entry->MinLevel > level) @@ -844,8 +819,8 @@ PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 lev PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id) { - for (uint32 i = 0; i < sPvPDifficultyStore.GetNumRows(); ++i) - if (PvPDifficultyEntry const* entry = sPvPDifficultyStore.LookupEntry(i)) + for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) + if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) if (entry->MapID == mapid && entry->GetBracketId() == id) return entry; diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 0ec7df693ee..c8e03ee95e7 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -24,67 +24,78 @@ #include "DB2Structure.h" #include "SharedDefines.h" -typedef std::list<uint32> SimpleFactionsList; -SimpleFactionsList const* GetFactionTeamList(uint32 faction); - -char const* GetPetName(uint32 petfamily, uint32 dbclang); - +// AreaTable int32 GetAreaFlagByAreaID(uint32 area_id); // -1 if not found AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id); AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_id); uint32 GetAreaFlagByMapId(uint32 mapid); -char const* GetRaceName(uint8 race, uint8 locale); +// CharSections +CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color); + +// ChrClasses char const* GetClassName(uint8 class_, uint8 locale); -WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid); +// ChrRaces +char const* GetRaceName(uint8 race, uint8 locale); -uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); +// ChrSpecialization +typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES][MAX_SPECIALIZATIONS]; -enum ContentLevels -{ - CONTENT_1_60 = 0, - CONTENT_61_70 = 1, - CONTENT_71_80 = 2, - CONTENT_81_85 = 3, - CONTENT_86_90 = 4, - CONTENT_91_100 = 5, - MAX_CONTENT -}; +// CreatureFamilty +char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale); -uint32 GetMaxLevelForExpansion(uint32 expansion); -uint32 GetExpansionForLevel(uint32 level); +// Faction +std::vector<uint32> const* GetFactionTeamList(uint32 faction); -ContentLevels GetContentLevelsForMapAndZone(uint32 mapid, uint32 zoneId); +// ItemSetSpells +typedef std::vector<ItemSetSpellEntry const*> ItemSetSpells; +typedef std::unordered_map<uint32, ItemSetSpells> ItemSetSpellsStore; -bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); +// LfgDungeons +LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty); -void Zone2MapCoordinates(float &x, float &y, uint32 zone); -void Map2ZoneCoordinates(float &x, float &y, uint32 zone); +// Light +uint32 GetDefaultMapLight(uint32 mapId); + +// LiquidType +uint32 GetLiquidFlags(uint32 liquidType); +// MapDifficulty typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyMap; MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr); MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty); MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty); -uint32 GetLiquidFlags(uint32 liquidType); - +// PvpDifficulty PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); -CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color); - -LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty); - -uint32 GetDefaultMapLight(uint32 mapId); - +// SkillRaceClassInfo typedef std::unordered_multimap<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoMap; typedef std::pair<SkillRaceClassInfoMap::iterator, SkillRaceClassInfoMap::iterator> SkillRaceClassInfoBounds; SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); -typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES][MAX_SPECIALIZATIONS]; +// SpellEffectScaling +typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId; + +// Talent typedef std::vector<TalentEntry const*> TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]; -extern TalentsByPosition sTalentByPos; + +// TotemCategory +bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); + +// WMOAreaTable +WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid); + +// WorldMapArea +uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); +void Zone2MapCoordinates(float &x, float &y, uint32 worldMapAreaId); +void Map2ZoneCoordinates(float &x, float &y, uint32 worldMapAreaId); + + +uint32 GetMaxLevelForExpansion(uint32 expansion); +uint32 GetExpansionForLevel(uint32 level); template<class T> class GameTable @@ -114,119 +125,111 @@ private: GameTablesEntry const* _gtEntry; }; -extern DBCStorage <AchievementEntry> sAchievementStore; -extern DBCStorage <AnimKitEntry> sAnimKitStore; -extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions -extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore; -extern DBCStorage <ArmorLocationEntry> sArmorLocationStore; -extern DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore; -extern DBCStorage <BannedAddOnsEntry> sBannedAddOnsStore; -extern DBCStorage <BattlemasterListEntry> sBattlemasterListStore; -extern DBCStorage <ChatChannelsEntry> sChatChannelsStore; -extern DBCStorage <CharSectionsEntry> sCharSectionsStore; -extern DBCStorage <CharTitlesEntry> sCharTitlesStore; -extern DBCStorage <ChrClassesEntry> sChrClassesStore; -extern DBCStorage <ChrRacesEntry> sChrRacesStore; -extern DBCStorage <ChrSpecializationEntry> sChrSpecializationStore; -extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -extern DBCStorage <CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore; -extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore; -extern DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore; -extern DBCStorage <CriteriaEntry> sCriteriaStore; -extern DBCStorage <CriteriaTreeEntry> sCriteriaTreeStore; -extern DBCStorage <DifficultyEntry> sDifficultyStore; -extern DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore; -extern DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore; -extern DBCStorage <EmotesEntry> sEmotesStore; -extern DBCStorage <EmotesTextEntry> sEmotesTextStore; -extern DBCStorage <FactionEntry> sFactionStore; -extern DBCStorage <FactionTemplateEntry> sFactionTemplateStore; -extern DBCStorage <GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore; -extern DBCStorage <GemPropertiesEntry> sGemPropertiesStore; -extern DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore; - -extern GameTable <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; -extern GameTable <GtCombatRatingsEntry> sGtCombatRatingsStore; -extern GameTable <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; -extern GameTable <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; -extern GameTable <GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore; -extern GameTable <GtChanceToSpellCritEntry> sGtChanceToSpellCritStore; -extern GameTable <GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore; -extern GameTable <GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore; -extern GameTable <GtNpcTotalHpEntry> sGtNpcTotalHpStore; -extern GameTable <GtNpcTotalHpExp1Entry> sGtNpcTotalHpExp1Store; -extern GameTable <GtNpcTotalHpExp2Entry> sGtNpcTotalHpExp2Store; -extern GameTable <GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store; -extern GameTable <GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store; -extern GameTable <GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store; -extern GameTable <GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore; -extern GameTable <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore; -extern GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; -extern GameTable <GtSpellScalingEntry> sGtSpellScalingStore; -extern GameTable <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; -extern GameTable <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; -extern DBCStorage <GuildColorBackgroundEntry> sGuildColorBackgroundStore; -extern DBCStorage <GuildColorBorderEntry> sGuildColorBorderStore; -extern DBCStorage <GuildColorEmblemEntry> sGuildColorEmblemStore; -extern DBCStorage <ItemArmorQualityEntry> sItemArmorQualityStore; -extern DBCStorage <ItemArmorShieldEntry> sItemArmorShieldStore; -extern DBCStorage <ItemArmorTotalEntry> sItemArmorTotalStore; -extern DBCStorage <ItemBagFamilyEntry> sItemBagFamilyStore; -extern DBCStorage <ItemDamageEntry> sItemDamageAmmoStore; -extern DBCStorage <ItemDamageEntry> sItemDamageOneHandStore; -extern DBCStorage <ItemDamageEntry> sItemDamageOneHandCasterStore; -extern DBCStorage <ItemDamageEntry> sItemDamageRangedStore; -extern DBCStorage <ItemDamageEntry> sItemDamageThrownStore; -extern DBCStorage <ItemDamageEntry> sItemDamageTwoHandStore; -extern DBCStorage <ItemDamageEntry> sItemDamageTwoHandCasterStore; -extern DBCStorage <ItemDamageEntry> sItemDamageWandStore; -extern DBCStorage <ItemSetEntry> sItemSetStore; -extern DBCStorage <ItemSetSpellEntry> sItemSetSpellStore; -extern ItemSetSpellsStore sItemSetSpellsStore; -extern DBCStorage <LFGDungeonEntry> sLFGDungeonStore; -extern DBCStorage <LiquidTypeEntry> sLiquidTypeStore; -extern DBCStorage <LockEntry> sLockStore; -extern DBCStorage <MapEntry> sMapStore; -extern DBCStorage <MinorTalentEntry> sMinorTalentStore; -extern DBCStorage <ModifierTreeEntry> sModifierTreeStore; -extern DBCStorage <PhaseEntry> sPhaseStore; -extern MapDifficultyMap sMapDifficultyMap; -extern DBCStorage <MovieEntry> sMovieStore; -extern DBCStorage <PowerDisplayEntry> sPowerDisplayStore; -extern DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore; -extern DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore; -extern DBCStorage <SkillLineEntry> sSkillLineStore; -extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore; -extern DBCStorage <SkillRaceClassInfoEntry> sSkillRaceClassInfoStore; -extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; -extern DBCStorage <SpellCategoryEntry> sSpellCategoryStore; -extern DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore; -extern DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore; -extern SpellCategoryStore sSpellsByCategoryStore; -extern PetFamilySpellsStore sPetFamilySpellsStore; -extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore; -extern DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore; -extern DBCStorage <SpellEntry> sSpellStore; -extern DBCStorage <SpellEffectScalingEntry> sSpellEffectScalingStore; -extern DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore; -extern DBCStorage <SpellCategoriesEntry> sSpellCategoriesStore; -extern DBCStorage <SpellCooldownsEntry> sSpellCooldownsStore; -extern DBCStorage <SpellEffectEntry> sSpellEffectStore; -extern DBCStorage <SpellEquippedItemsEntry> sSpellEquippedItemsStore; -extern DBCStorage <SpellInterruptsEntry> sSpellInterruptsStore; -extern DBCStorage <SpellLevelsEntry> sSpellLevelsStore; -extern DBCStorage <SpellScalingEntry> sSpellScalingStore; -extern DBCStorage <SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore; -//extern DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore; -extern DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore; -extern DBCStorage <TalentEntry> sTalentStore; -extern DBCStorage <VehicleEntry> sVehicleStore; -extern DBCStorage <VehicleSeatEntry> sVehicleSeatStore; -extern DBCStorage <WMOAreaTableEntry> sWMOAreaTableStore; -//extern DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore; -- use Zone2MapCoordinates and Map2ZoneCoordinates -extern DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore; - -void LoadDBCStores(const std::string& dataPath); -void LoadGameTables(const std::string& dataPath); +extern DBCStorage<AnimKitEntry> sAnimKitStore; +extern DBCStorage<AreaTableEntry> sAreaStore;// recommend access using functions +extern DBCStorage<AreaTriggerEntry> sAreaTriggerStore; +extern DBCStorage<ArmorLocationEntry> sArmorLocationStore; +extern DBCStorage<BankBagSlotPricesEntry> sBankBagSlotPricesStore; +extern DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore; +extern DBCStorage<BattlemasterListEntry> sBattlemasterListStore; +extern DBCStorage<CharSectionsEntry> sCharSectionsStore; +extern DBCStorage<CharTitlesEntry> sCharTitlesStore; +extern DBCStorage<ChatChannelsEntry> sChatChannelsStore; +extern DBCStorage<ChrClassesEntry> sChrClassesStore; +extern DBCStorage<ChrRacesEntry> sChrRacesStore; +extern DBCStorage<ChrSpecializationEntry> sChrSpecializationStore; +extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore; +extern DBCStorage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore; +extern DBCStorage<CreatureFamilyEntry> sCreatureFamilyStore; +extern DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore; +extern DBCStorage<DifficultyEntry> sDifficultyStore; +extern DBCStorage<DungeonEncounterEntry> sDungeonEncounterStore; +extern DBCStorage<DurabilityCostsEntry> sDurabilityCostsStore; +extern DBCStorage<EmotesEntry> sEmotesStore; +extern DBCStorage<EmotesTextEntry> sEmotesTextStore; +extern DBCStorage<FactionEntry> sFactionStore; +extern DBCStorage<FactionTemplateEntry> sFactionTemplateStore; +extern DBCStorage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore; +extern DBCStorage<GemPropertiesEntry> sGemPropertiesStore; +extern DBCStorage<GlyphPropertiesEntry> sGlyphPropertiesStore; +extern DBCStorage<GuildColorBackgroundEntry> sGuildColorBackgroundStore; +extern DBCStorage<GuildColorBorderEntry> sGuildColorBorderStore; +extern DBCStorage<GuildColorEmblemEntry> sGuildColorEmblemStore; +extern DBCStorage<ItemArmorQualityEntry> sItemArmorQualityStore; +extern DBCStorage<ItemArmorShieldEntry> sItemArmorShieldStore; +extern DBCStorage<ItemArmorTotalEntry> sItemArmorTotalStore; +extern DBCStorage<ItemBagFamilyEntry> sItemBagFamilyStore; +extern DBCStorage<ItemDamageEntry> sItemDamageAmmoStore; +extern DBCStorage<ItemDamageEntry> sItemDamageOneHandCasterStore; +extern DBCStorage<ItemDamageEntry> sItemDamageOneHandStore; +extern DBCStorage<ItemDamageEntry> sItemDamageRangedStore; +extern DBCStorage<ItemDamageEntry> sItemDamageThrownStore; +extern DBCStorage<ItemDamageEntry> sItemDamageTwoHandCasterStore; +extern DBCStorage<ItemDamageEntry> sItemDamageTwoHandStore; +extern DBCStorage<ItemDamageEntry> sItemDamageWandStore; +extern DBCStorage<ItemSetEntry> sItemSetStore; +extern DBCStorage<ItemSetSpellEntry> sItemSetSpellStore; +extern ItemSetSpellsStore sItemSetSpellsStore; +extern DBCStorage<LFGDungeonEntry> sLFGDungeonStore; +extern DBCStorage<LiquidTypeEntry> sLiquidTypeStore; +extern DBCStorage<LockEntry> sLockStore; +extern DBCStorage<MapEntry> sMapStore; +extern MapDifficultyMap sMapDifficultyMap; +extern DBCStorage<MovieEntry> sMovieStore; +extern DBCStorage<PhaseEntry> sPhaseStore; +extern DBCStorage<PowerDisplayEntry> sPowerDisplayStore; +extern DBCStorage<QuestFactionRewEntry> sQuestFactionRewardStore; +extern DBCStorage<RandomPropertiesPointsEntry> sRandomPropertiesPointsStore; +extern DBCStorage<SkillLineAbilityEntry> sSkillLineAbilityStore; +extern DBCStorage<SkillLineEntry> sSkillLineStore; +extern DBCStorage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore; +extern DBCStorage<SpellAuraOptionsEntry> sSpellAuraOptionsStore; +extern DBCStorage<SpellCategoriesEntry> sSpellCategoriesStore; +extern DBCStorage<SpellCategoryEntry> sSpellCategoryStore; +extern DBCStorage<SpellCooldownsEntry> sSpellCooldownsStore; +extern DBCStorage<SpellEffectEntry> sSpellEffectStore; +extern DBCStorage<SpellEffectScalingEntry> sSpellEffectScalingStore; +extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; +extern DBCStorage<SpellEntry> sSpellStore; +extern DBCStorage<SpellEquippedItemsEntry> sSpellEquippedItemsStore; +extern DBCStorage<SpellFocusObjectEntry> sSpellFocusObjectStore; +extern DBCStorage<SpellInterruptsEntry> sSpellInterruptsStore; +extern DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore; +extern DBCStorage<SpellLevelsEntry> sSpellLevelsStore; +extern DBCStorage<SpellScalingEntry> sSpellScalingStore; +extern DBCStorage<SpellShapeshiftEntry> sSpellShapeshiftStore; +extern DBCStorage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore; +extern DBCStorage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore; +extern DBCStorage<SummonPropertiesEntry> sSummonPropertiesStore; +extern DBCStorage<TalentEntry> sTalentStore; +extern TalentsByPosition sTalentByPos; +extern DBCStorage<VehicleEntry> sVehicleStore; +extern DBCStorage<VehicleSeatEntry> sVehicleSeatStore; +extern DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore; +extern DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore; + +extern GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; +extern GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore; +extern GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore; +extern GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore; +extern GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore; +extern GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore; +extern GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore; +extern GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore; +extern GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore; +extern GameTable<GtNpcTotalHpExp1Entry> sGtNpcTotalHpExp1Store; +extern GameTable<GtNpcTotalHpExp2Entry> sGtNpcTotalHpExp2Store; +extern GameTable<GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store; +extern GameTable<GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store; +extern GameTable<GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store; +extern GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; +extern GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; +extern GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore; +extern GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; +extern GameTable<GtSpellScalingEntry> sGtSpellScalingStore; +extern GameTable<GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore; + +void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale); +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 index 774e20bb16d..dc53a316ee7 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -31,25 +31,6 @@ // Structures using to access raw DBC data and required packing to portability #pragma pack(push, 1) -struct AchievementEntry -{ - uint32 ID; // 0 - int32 Faction; // 1 -1=all, 0=horde, 1=alliance - int32 MapID; // 2 -1=none - //uint32 Supercedes; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) - char* Title_lang; // 4 - //char* Description_lang; // 5 - uint32 Category; // 6 - uint32 Points; // 7 reward points - //uint32 UIOrder; // 8 - uint32 Flags; // 9 - //uint32 IconID; // 10 icon (from SpellIcon.dbc) - //char* Reward_lang; // 11 - uint32 MinimumCriteria; // 12 - need this count of completed criterias (own or referenced achievement criterias) - uint32 SharesCriteria; // 13 - referenced achievement (counting of all completed criterias) - uint32 CriteriaTree; // 14 -}; - struct AnimKitEntry { uint32 ID; // 0 @@ -352,152 +333,6 @@ struct CreatureModelDataEntry //float HoverHeight; // 33 }; -struct CriteriaEntry -{ - uint32 ID; // 0 - uint32 Type; // 1 - union - { - uint32 ID; - // ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0 - // ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20 - uint32 CreatureID; - - // ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1 - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15 - // ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16 - // ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32 - // ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33 - uint32 MapID; - - // ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7 - // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40 - // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75 - // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112 - uint32 SkillID; - - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8 - uint32 AchievementID; - - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11 - uint32 ZoneID; - - // ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12 - uint32 CurrencyID; - - // ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18 - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19 - uint32 GroupSize; - - // ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26 - uint32 DamageType; - - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27 - uint32 QuestID; - - // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28 - // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69 - // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29 - // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110 - // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34 - uint32 SpellID; - - // ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE - uint32 ObjectiveId; - - // ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31 - // ACHIEVEMENT_CRITERIA_TYPE_ENTER_AREA = 163 - // ACHIEVEMENT_CRITERIA_TYPE_LEAVE_AREA = 164 - uint32 AreaID; - - // ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36 - // ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41 - // ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42 - // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57 - // ACHIEVEMENT_CRITERIA_TYPE_OWN_TOY = 185 - uint32 ItemID; - - // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38 - // ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39 - // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39 - uint32 TeamType; - - // ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43 - uint32 WorldMapOverlayID; - - // ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46 - uint32 FactionID; - - // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49 - uint32 ItemSlot; - - // ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50 - // ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51 - uint32 RollValue; - - // ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52 - uint32 ClassID; - - // ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53 - uint32 RaceID; - - // ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54 - uint32 EmoteID; - - // ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68 - // ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72 - uint32 GameObjectID; - - // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96 - uint32 PowerType; - - // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97 - uint32 StatType; - - // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98 - uint32 SpellSchool; - - // ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109 - uint32 LootType; - - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DUNGEON_ENCOUNTER = 165 - uint32 DungeonEncounterID; - - // ACHIEVEMENT_CRITERIA_TYPE_CONSTRUCT_GARRISON_BUILDING = 169 - uint32 GarrBuildingID; - - // ACHIEVEMENT_CRITERIA_TYPE_UPGRADE_GARRISON = 170 - uint32 GarrisonLevel; - - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_MISSION = 174 - uint32 GarrMissionID; - - // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182 - uint32 CharShipmentContainerID; - } Asset; // 2 - uint32 StartEvent; // 3 - uint32 StartAsset; // 4 - uint32 StartTimer; // 5 - uint32 FailEvent; // 6 - uint32 FailAsset; // 7 - uint32 ModifierTreeId; // 8 - //uint32 Flags; // 9 - uint32 EligibilityWorldStateID; // 10 - uint32 EligibilityWorldStateValue; // 11 -}; - -struct CriteriaTreeEntry -{ - uint32 ID; // 0 - uint32 CriteriaID; // 1 - uint64 Amount; // 2 - uint32 Operator; // 3 - uint32 Parent; // 4 - //uint32 Flags; // 5 - //char* DescriptionLang; // 6 - //uint32 OrderIndex; // 7 -}; - /* not used struct CurrencyCategoryEntry { @@ -768,7 +603,7 @@ struct GtOCTRegenMPEntry float ratio; }; -struct gtOCTHpPerStaminaEntry +struct GtOCTHpPerStaminaEntry { float ratio; }; @@ -903,9 +738,6 @@ struct ItemSetSpellEntry uint32 ChrSpecID; // 4 }; -typedef std::vector<ItemSetSpellEntry const*> ItemSetSpells; -typedef std::unordered_map<uint32, ItemSetSpells> ItemSetSpellsStore; - struct LFGDungeonEntry { uint32 ID; // 0 @@ -1071,16 +903,6 @@ struct MinorTalentEntry uint32 OrderIndex; // 3 }; -struct ModifierTreeEntry -{ - uint32 ID; // 0 - uint32 Type; // 1 - uint32 Asset[2]; // 2-3 - uint32 Operator; // 4 - uint32 Amount; // 5 - uint32 Parent; // 6 -}; - struct MovieEntry { uint32 ID; // 0 index @@ -1271,12 +1093,6 @@ struct SpellCategoriesEntry uint32 ChargeCategory; // 9 }; -typedef std::set<uint32> SpellCategorySet; -typedef std::map<uint32, SpellCategorySet > SpellCategoryStore; -typedef std::set<uint32> PetFamilySpellsSet; -typedef std::map<uint32, PetFamilySpellsSet > PetFamilySpellsStore; -typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId; - struct SpellCategoryEntry { uint32 ID; // 0 @@ -1550,7 +1366,12 @@ struct VehicleSeatEntry uint32 FlagsC; // 64 uint32 UISkinFileDataID; // 65 - bool CanEnterOrExit() const { return (Flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0; } + bool CanEnterOrExit() const + { + return ((Flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT) != 0 || + //If it has anmation for enter/ride, means it can be entered/exited by logic + (Flags & (VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_ENTER | VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_RIDE)) != 0); + } bool CanSwitchFromSeat() const { return (Flags & VEHICLE_SEAT_FLAG_CAN_SWITCH) != 0; } bool IsUsableByOverride() const { return (Flags & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18) || (FlagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 7ba4c3c293b..6b2163cabca 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -22,36 +22,31 @@ // 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 Achievementfmt[] = "niixsxiixixxiii"; -const std::string CustomAchievementfmt = "pppaaaapapaapp"; -const std::string CustomAchievementIndex = "ID"; char const AnimKitfmt[] = "nxxx"; -char const AreaTableEntryfmt[] = "iiiniixxxxxxisiiiiixxxxxxxxxx"; -char const AreaTriggerEntryfmt[] = "nifffxxxfffffxxxx"; +char const AreaTablefmt[] = "iiiniixxxxxxisiiiiixxxxxxxxxx"; +char const AreaTriggerfmt[] = "nifffxxxfffffxxxx"; char const ArmorLocationfmt[] = "nfffff"; -char const BankBagSlotPricesEntryfmt[] = "ni"; +char const BankBagSlotPricesfmt[] = "ni"; char const BannedAddOnsfmt[] = "nxxxxxxxxxx"; -char const BattlemasterListEntryfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; -char const CharSectionsEntryfmt[] = "diiixxxiii"; -char const CharTitlesEntryfmt[] = "nxssix"; -char const ChatChannelsEntryfmt[] = "nixsx"; -char const ChrClassesEntryfmt[] = "nixsxxxixiiiiixxxxx"; -char const ChrRacesEntryfmt[] = "niixiixxxxxxiisxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const ChrSpecializationEntryfmt[] = "nxiiiiiiiiixxxii"; +char const BattlemasterListfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; +char const CharSectionsfmt[] = "diiixxxiii"; +char const CharTitlesfmt[] = "nxssix"; +char const ChatChannelsfmt[] = "nixsx"; +char const ChrClassesfmt[] = "nixsxxxixiiiiixxxxx"; +char const ChrRacesfmt[] = "niixiixxxxxxiisxxxxxxxxxxxxxxxxxxxxxxxxx"; +char const ChrSpecializationfmt[] = "nxiiiiiiiiixxxii"; char const CreatureDisplayInfoExtrafmt[] = "dixxxxxxxxxxxxxxxxxxxx"; char const CreatureFamilyfmt[] = "nfifiiiiixsx"; char const CreatureModelDatafmt[] = "nixxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; -char const Criteriafmt[] = "niiiiiiiixii"; -char const CriteriaTreefmt[] = "niliixxx"; char const DifficultyFmt[] = "niiiixiixxxxix"; char const DungeonEncounterfmt[] = "niiixsxxx"; char const DurabilityCostsfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; -char const EmotesEntryfmt[] = "nxxiiixx"; -char const EmotesTextEntryfmt[] = "nxixxxxxxxxxxxxxxxx"; -char const FactionEntryfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; -char const FactionTemplateEntryfmt[] = "niiiiiiiiiiiii"; +char const Emotesfmt[] = "nxxiiixx"; +char const EmotesTextfmt[] = "nxixxxxxxxxxxxxxxxx"; +char const Factionfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; +char const FactionTemplatefmt[] = "niiiiiiiiiiiii"; char const GameObjectDisplayInfofmt[] = "nixxxxxxxxxxffffffxxx"; -char const GemPropertiesEntryfmt[] = "nixxii"; +char const GemPropertiesfmt[] = "nixxii"; char const GlyphPropertiesfmt[] = "niiix"; char const GtBarberShopCostBasefmt[] = "xf"; char const GtCombatRatingsfmt[] = "xf"; @@ -69,8 +64,6 @@ char const GtNpcTotalHpExp2fmt[] = "xf"; char const GtNpcTotalHpExp3fmt[] = "xf"; char const GtNpcTotalHpExp4fmt[] = "xf"; char const GtNpcTotalHpExp5fmt[] = "xf"; -char const GtOCTRegenHPfmt[] = "f"; -//char const GtOCTRegenMPfmt[] = "f"; char const GtRegenMPPerSptfmt[] = "xf"; char const GtSpellScalingfmt[] = "df"; char const GtOCTBaseHPByClassfmt[] = "df"; @@ -83,53 +76,50 @@ char const ItemArmorQualityfmt[] = "nfffffffi"; char const ItemArmorShieldfmt[] = "nifffffff"; char const ItemArmorTotalfmt[] = "niffff"; char const ItemDamagefmt[] = "nfffffffi"; -char const ItemSetEntryfmt[] = "nsiiiiiiiiiiiiiiiiiii"; -char const ItemSetSpellEntryfmt[] = "niiii"; -char const LFGDungeonEntryfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; -char const LightEntryfmt[] = "nifffxxxxxxxxxx"; +char const ItemSetfmt[] = "nsiiiiiiiiiiiiiiiiiii"; +char const ItemSetSpellfmt[] = "niiii"; +char const LFGDungeonfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; +char const Lightfmt[] = "nifffxxxxxxxxxx"; char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const LockEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; -char const MapEntryfmt[] = "nxiixxsixxixiffxiiiiix"; -char const MapDifficultyEntryfmt[] = "diisiiii"; -char const MinorTalentEntryfmt[] = "niii"; -char const MovieEntryfmt[] = "nxxxx"; -char const ModifierTreefmt[] = "niiiiii"; -char const NumTalentsAtLevelfmt[] = "df"; -char const PhaseEntryfmt[] = "ni"; +char const Lockfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; +char const Mapfmt[] = "nxiixxsixxixiffxiiiiix"; +char const MapDifficultyfmt[] = "diisiiii"; +char const MinorTalentfmt[] = "niii"; +char const Moviefmt[] = "nxxxx"; +char const Phasefmt[] = "ni"; char const QuestFactionRewardfmt[] = "niiiiiiiiii"; char const PowerDisplayfmt[] = "nixXXX"; -char const PvPDifficultyfmt[] = "diiii"; -char const RandomPropertiesPointsfmt[] = "niiiiiiiiiiiiiii"; +char const PvpDifficultyfmt[] = "diiii"; +char const RandPropPointsfmt[] = "niiiiiiiiiiiiiii"; char const SkillLinefmt[] = "nisxixixx"; char const SkillLineAbilityfmt[] = "niiiiiiiiiiii"; char const SkillRaceClassInfofmt[] = "diiiiiii"; -char const SpellCategoriesEntryfmt[] = "diiiiiiiii"; +char const SpellCategoriesfmt[] = "diiiiiiiii"; char const SpellCategoryfmt[] = "nixxii"; -char const SpellEffectEntryfmt[] = "iiifiiiffiiiiiifiifiiiiifiiiiif"; -const std::string CustomSpellEffectEntryfmt = "ppppppppppppppappppppppppp"; +char const SpellEffectfmt[] = "niifiiiffiiiiiifiifiiiiifiiiiif"; +const std::string CustomSpellEffectfmt = "ppppppppppppppappppppppppp"; const std::string CustomSpellEffectEntryIndex = "Id"; -char const SpellEntryfmt[] = "nsxxxiiiiiiiiiiiiiiiiiii"; -const std::string CustomSpellEntryfmt = "ppppppppppppppapaaaaaaaaapaaaaaapapppaapppaaapa"; +char const Spellfmt[] = "nsxxxiiiiiiiiiiiiiiiiiii"; +const std::string CustomSpellfmt = "ppppppppppppppapaaaaaaaaapaaaaaapapppaapppaaapa"; const std::string CustomSpellEntryIndex = "Id"; char const SpellEffectScalingfmt[] = "nfffi"; char const SpellFocusObjectfmt[] = "nx"; char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiiifff"; -char const SpellScalingEntryfmt[] = "niiiifiii"; -char const SpellTargetRestrictionsEntryfmt[] = "niiffiiii"; -char const SpellInterruptsEntryfmt[] = "diiiiiii"; -char const SpellEquippedItemsEntryfmt[] = "diiiii"; -char const SpellAuraOptionsEntryfmt[] = "niiiiiiii"; -char const SpellCooldownsEntryfmt[] = "diiiii"; -char const SpellLevelsEntryfmt[] = "diiiii"; -char const SpellShapeshiftEntryfmt[] = "niiiix"; +char const SpellScalingfmt[] = "niiiifiii"; +char const SpellTargetRestrictionsfmt[] = "niiffiiii"; +char const SpellInterruptsfmt[] = "diiiiiii"; +char const SpellEquippedItemsfmt[] = "diiiii"; +char const SpellAuraOptionsfmt[] = "niiiiiiii"; +char const SpellCooldownsfmt[] = "diiiii"; +char const SpellLevelsfmt[] = "diiiii"; +char const SpellShapeshiftfmt[] = "niiiix"; char const SpellShapeshiftFormfmt[] = "nxxiixiiiiiiiiiiiiixx"; -char const StableSlotPricesfmt[] = "ni"; char const SummonPropertiesfmt[] = "niiiii"; -char const TalentEntryfmt[] = "niiiiiiiiix"; -char const VehicleEntryfmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; -char const VehicleSeatEntryfmt[] = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiffffffffffffiiiiiiiii"; -char const WMOAreaTableEntryfmt[] = "niiixxxxxiixxxx"; -char const WorldMapAreaEntryfmt[] = "xinxffffixxxxx"; -char const WorldSafeLocsEntryfmt[] = "niffffx"; +char const Talentfmt[] = "niiiiiiiiix"; +char const Vehiclefmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; +char const VehicleSeatfmt[] = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiffffffffffffiiiiiiiii"; +char const WMOAreaTablefmt[] = "niiixxxxxiixxxx"; +char const WorldMapAreafmt[] = "xinxffffixxxxx"; +char const WorldSafeLocsfmt[] = "niffffx"; #endif diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 1265a82f89d..4745a4d4e1b 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -161,7 +161,7 @@ void Corpse::DeleteFromDB(SQLTransaction& trans) bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse + // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? float posX = fields[0].GetFloat(); float posY = fields[1].GetFloat(); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 70d63a853e7..6c7d390c069 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -351,6 +351,10 @@ void Item::SaveToDB(SQLTransaction& trans) stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID) | (GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD) << 24)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_UPGRADE_ID)); stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION)); + stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID)); + stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA)); + stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL)); + stmt->setUInt32(++index, GetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID)); std::ostringstream bonusListIDs; for (uint32 bonusListID : GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS)) @@ -405,8 +409,10 @@ void Item::SaveToDB(SQLTransaction& trans) bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fields, uint32 entry) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - //result = CharacterDatabase.PQuery("SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, bonusListIDs FROM item_instance WHERE guid = '%u'", guid); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + //result = CharacterDatabase.PQuery("SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, + // 13 14 15 16 17 18 19 20 + // transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs FROM item_instance WHERE guid = '%u'", guid); // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB @@ -482,8 +488,12 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie } SetModifier(ITEM_MODIFIER_UPGRADE_ID, fields[14].GetUInt32()); SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION, fields[15].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, fields[16].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, fields[17].GetUInt32()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[18].GetUInt16()); + SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[19].GetUInt32()); - Tokenizer bonusListIDs(fields[16].GetString(), ' '); + Tokenizer bonusListIDs(fields[20].GetString(), ' '); for (char const* token : bonusListIDs) { uint32 bonusListID = atoul(token); @@ -1298,10 +1308,9 @@ bool Item::CheckSoulboundTradeExpire() return false; } -bool Item::CanBeTransmogrified() const +bool Item::CanBeTransmogrified(WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus) { - ItemTemplate const* proto = GetTemplate(); - + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(transmogrifier.ItemID); if (!proto) return false; @@ -1318,7 +1327,7 @@ bool Item::CanBeTransmogrified() const if (proto->GetFlags2() & ITEM_FLAG2_CANNOT_BE_TRANSMOG) return false; - if (!HasStats()) + if (!HasStats(transmogrifier, bonus)) return false; return true; @@ -1327,7 +1336,6 @@ bool Item::CanBeTransmogrified() const bool Item::CanTransmogrify() const { ItemTemplate const* proto = GetTemplate(); - if (!proto) return false; @@ -1353,18 +1361,41 @@ bool Item::CanTransmogrify() const return true; } -bool Item::CanTransmogrifyItemWithItem(Item const* transmogrified, Item const* transmogrifier) +bool Item::HasStats() const { - if (!transmogrifier || !transmogrified) - return false; + if (GetItemRandomPropertyId() != 0) + return true; + + ItemTemplate const* proto = GetTemplate(); + Player const* owner = GetOwner(); + for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) + if ((owner ? GetItemStatValue(i, owner) : proto->GetItemStatValue(i)) != 0) + return true; + + return false; +} + +bool Item::HasStats(WorldPackets::Item::ItemInstance const& itemInstance, BonusData const* bonus) +{ + if (itemInstance.RandomPropertiesID != 0) + return true; + + for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) + if (bonus->ItemStatValue[i] != 0) + return true; + + return false; +} - ItemTemplate const* proto1 = transmogrifier->GetTemplate(); // source +bool Item::CanTransmogrifyItemWithItem(Item const* transmogrified, WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus) +{ + ItemTemplate const* proto1 = sObjectMgr->GetItemTemplate(transmogrifier.ItemID); // source ItemTemplate const* proto2 = transmogrified->GetTemplate(); // dest - if (proto1->GetId() == proto2->GetId()) + if (sDB2Manager.GetItemDisplayId(proto1->GetId(), bonus->AppearanceModID) == transmogrified->GetDisplayId()) return false; - if (!transmogrified->CanTransmogrify() || !transmogrifier->CanBeTransmogrified()) + if (!transmogrified->CanTransmogrify() || !CanBeTransmogrified(transmogrifier, bonus)) return false; if (proto1->GetInventoryType() == INVTYPE_BAG || @@ -1387,19 +1418,6 @@ bool Item::CanTransmogrifyItemWithItem(Item const* transmogrified, Item const* t return true; } -bool Item::HasStats() const -{ - if (GetItemRandomPropertyId() != 0) - return true; - - ItemTemplate const* proto = GetTemplate(); - for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - if (proto->GetItemStatValue(i) != 0) - return true; - - return false; -} - // used by mail items, transmog cost, stationeryinfo and others uint32 Item::GetSellPrice(ItemTemplate const* proto, bool& normalSellPrice) { @@ -1784,8 +1802,8 @@ uint32 Item::GetVisibleEntry() const uint32 Item::GetVisibleAppearanceModId() const { - if (uint32 transmogMod = GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD)) - return transmogMod; + if (GetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID)) + return GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD); return GetAppearanceModId(); } @@ -1823,6 +1841,21 @@ void BonusData::Initialize(ItemTemplate const* proto) AppearanceModID = 0; } +void BonusData::Initialize(WorldPackets::Item::ItemInstance const& itemInstance) +{ + ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemInstance.ItemID); + if (!proto) + return; + + Initialize(proto); + + if (itemInstance.ItemBonus) + for (uint32 bonusListID : itemInstance.ItemBonus->BonusListIDs) + if (DB2Manager::ItemBonusList const* bonuses = sDB2Manager.GetItemBonusList(bonusListID)) + for (ItemBonusEntry const* bonus : *bonuses) + AddBonus(bonus->Type, bonus->Value); +} + void BonusData::AddBonus(uint32 type, int32 const (&values)[2]) { switch (type) diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 7d03a0a68eb..37d7e3613f2 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -28,6 +28,13 @@ class SpellInfo; class Bag; class Unit; +namespace WorldPackets +{ + namespace Item + { + struct ItemInstance; + } +} struct ItemSetEffect { @@ -134,7 +141,8 @@ enum InventoryResult EQUIP_ERR_CANT_BUY_QUANTITY = 93, // You can't buy the specified quantity of that item. EQUIP_ERR_ITEM_IS_BATTLE_PAY_LOCKED = 94, // Your purchased item is still waiting to be unlocked EQUIP_ERR_REAGENT_BANK_FULL = 95, // Your reagent bank is full - EQUIP_ERR_REAGENT_BANK_LOCKED = 96 + EQUIP_ERR_REAGENT_BANK_LOCKED = 96, + EQUIP_ERR_WRONG_BAG_TYPE_3 = 97 }; enum BuyResult @@ -242,6 +250,7 @@ struct BonusData uint32 AppearanceModID; void Initialize(ItemTemplate const* proto); + void Initialize(WorldPackets::Item::ItemInstance const& itemInstance); void AddBonus(uint32 type, int32 const (&values)[2]); }; @@ -256,6 +265,7 @@ class Item : public Object virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemid, Player const* owner); ItemTemplate const* GetTemplate() const; + BonusData const* GetBonus() const { return &_bonusData; } ObjectGuid GetOwnerGUID() const { return GetGuidValue(ITEM_FIELD_OWNER); } void SetOwnerGUID(ObjectGuid guid) { SetGuidValue(ITEM_FIELD_OWNER, guid); } @@ -369,7 +379,6 @@ class Item : public Object bool hasQuest(uint32 quest_id) const override { return GetTemplate()->GetStartQuest() == quest_id; } bool hasInvolvedQuest(uint32 /*quest_id*/) const override { return false; } - bool HasStats() const; bool IsPotion() const { return GetTemplate()->IsPotion(); } bool IsVellum() const { return GetTemplate()->IsVellum(); } bool IsConjuredConsumable() const { return GetTemplate()->IsConjuredConsumable(); } @@ -411,9 +420,11 @@ class Item : public Object uint32 GetScriptId() const { return GetTemplate()->ScriptId; } - bool CanBeTransmogrified() const; + static bool CanBeTransmogrified(WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus); bool CanTransmogrify() const; - static bool CanTransmogrifyItemWithItem(Item const* transmogrified, Item const* transmogrifier); + bool HasStats() const; + static bool HasStats(WorldPackets::Item::ItemInstance const& itemInstance, BonusData const* bonus); + static bool CanTransmogrifyItemWithItem(Item const* transmogrified, WorldPackets::Item::ItemInstance const& transmogrifier, BonusData const* bonus); static uint32 GetSpecialPrice(ItemTemplate const* proto, uint32 minimumPrice = 10000); uint32 GetSpecialPrice(uint32 minimumPrice = 10000) const { return Item::GetSpecialPrice(GetTemplate(), minimumPrice); } diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 23d6b4f4dde..fcfa0b5a810 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -204,7 +204,11 @@ class ObjectGuid static typename std::enable_if<ObjectGuidTraits<type>::MapSpecific, ObjectGuid>::type Create(uint16 mapId, uint32 entry, LowType counter) { return MapSpecific(type, 0, mapId, 0, entry, counter); } ObjectGuid() : _low(0), _high(0) { } - ObjectGuid(ObjectGuid const&) = default; + ObjectGuid(ObjectGuid const& r) : _low(r._low), _high(r._high) { } + ObjectGuid(ObjectGuid&& r) : _low(r._low), _high(r._high) { } + + ObjectGuid& operator=(ObjectGuid const& r) { _low = r._low; _high = r._high; return *this; } + ObjectGuid& operator=(ObjectGuid&& r) { _low = r._low; _high = r._high; return *this; } std::vector<uint8> GetRawValue() const; void SetRawValue(std::vector<uint8> const& guid); diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp index 57b75f43237..00c5ef2404b 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp @@ -2038,6 +2038,8 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+7 UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+8 UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+9 + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+10 + UF_FLAG_PRIVATE, // PLAYER__FIELD_KNOWN_TITLES+11 UF_FLAG_PRIVATE, // PLAYER_FIELD_COINAGE UF_FLAG_PRIVATE, // PLAYER_FIELD_COINAGE+1 UF_FLAG_PRIVATE, // PLAYER_XP @@ -4063,4 +4065,3 @@ uint32 ConversationDynamicUpdateFieldFlags[CONVERSATION_DYNAMIC_END] = UF_FLAG_PUBLIC, // CONVERSATION_DYNAMIC_FIELD_ACTORS UF_FLAG_0x100, // CONVERSATION_DYNAMIC_FIELD_LINES }; - diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index af37984bd98..f7c563f3f92 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -19,7 +19,7 @@ #ifndef _UPDATEFIELDS_H #define _UPDATEFIELDS_H -// Auto generated for version 6, 2, 0, 20182 +// Auto generated for version 6, 2, 2, 20444 enum ObjectFields { @@ -210,94 +210,94 @@ enum PlayerFields PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x334, // Size: 736, Flags: PRIVATE PLAYER_FIELD_END_NOT_SELF = UNIT_END + 0x334, PLAYER_FARSIGHT = UNIT_END + 0x614, // Size: 4, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x618, // Size: 10, Flags: PRIVATE - PLAYER_FIELD_COINAGE = UNIT_END + 0x622, // Size: 2, Flags: PRIVATE - PLAYER_XP = UNIT_END + 0x624, // Size: 1, Flags: PRIVATE - PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x625, // Size: 1, Flags: PRIVATE - PLAYER_SKILL_LINEID = UNIT_END + 0x626, // Size: 448, Flags: PRIVATE - PLAYER_CHARACTER_POINTS = UNIT_END + 0x7E6, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MAX_TALENT_TIERS = UNIT_END + 0x7E7, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_CREATURES = UNIT_END + 0x7E8, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_RESOURCES = UNIT_END + 0x7E9, // Size: 1, Flags: PRIVATE - PLAYER_EXPERTISE = UNIT_END + 0x7EA, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x7EB, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RANGED_EXPERTISE = UNIT_END + 0x7EC, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_EXPERTISE = UNIT_END + 0x7ED, // Size: 1, Flags: PRIVATE - PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x7EE, // Size: 1, Flags: PRIVATE - PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x7EF, // Size: 1, Flags: PRIVATE - PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x7F0, // Size: 1, Flags: PRIVATE - PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x7F1, // Size: 1, Flags: PRIVATE - PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x7F2, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x7F3, // Size: 1, Flags: PRIVATE - PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x7F4, // Size: 7, Flags: PRIVATE - PLAYER_SHIELD_BLOCK = UNIT_END + 0x7FB, // Size: 1, Flags: PRIVATE - PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x7FC, // Size: 1, Flags: PRIVATE - PLAYER_MASTERY = UNIT_END + 0x7FD, // Size: 1, Flags: PRIVATE - PLAYER_AMPLIFY = UNIT_END + 0x7FE, // Size: 1, Flags: PRIVATE - PLAYER_MULTISTRIKE = UNIT_END + 0x7FF, // Size: 1, Flags: PRIVATE - PLAYER_MULTISTRIKE_EFFECT = UNIT_END + 0x800, // Size: 1, Flags: PRIVATE - PLAYER_READINESS = UNIT_END + 0x801, // Size: 1, Flags: PRIVATE - PLAYER_SPEED = UNIT_END + 0x802, // Size: 1, Flags: PRIVATE - PLAYER_LIFESTEAL = UNIT_END + 0x803, // Size: 1, Flags: PRIVATE - PLAYER_AVOIDANCE = UNIT_END + 0x804, // Size: 1, Flags: PRIVATE - PLAYER_STURDINESS = UNIT_END + 0x805, // Size: 1, Flags: PRIVATE - PLAYER_CLEAVE = UNIT_END + 0x806, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY = UNIT_END + 0x807, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY_BONUS = UNIT_END + 0x808, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_DAMAGE = UNIT_END + 0x809, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_HEALING = UNIT_END + 0x80A, // Size: 1, Flags: PRIVATE - PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x80B, // Size: 256, Flags: PRIVATE - PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x90B, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x90C, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x913, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x91A, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x921, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x922, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x923, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT = UNIT_END + 0x924, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS = UNIT_END + 0x925, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS = UNIT_END + 0x928, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_MOD_SPELL_POWER_PCT = UNIT_END + 0x92B, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_RESILIENCE_PERCENT = UNIT_END + 0x92C, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT = UNIT_END + 0x92D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT = UNIT_END + 0x92E, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x92F, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x930, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOCAL_FLAGS = UNIT_END + 0x931, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BYTES = UNIT_END + 0x932, // Size: 1, Flags: PRIVATE - PLAYER_SELF_RES_SPELL = UNIT_END + 0x933, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x934, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x935, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x941, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_KILLS = UNIT_END + 0x94D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x94E, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x94F, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x950, // Size: 32, Flags: PRIVATE - PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x970, // Size: 36, Flags: PRIVATE - PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x994, // Size: 1, Flags: PRIVATE - PLAYER_RUNE_REGEN_1 = UNIT_END + 0x995, // Size: 4, Flags: PRIVATE - PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x999, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x99D, // Size: 6, Flags: PRIVATE - PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x9A3, // Size: 6, Flags: PRIVATE - PLAYER_GLYPHS_ENABLED = UNIT_END + 0x9A9, // Size: 1, Flags: PRIVATE - PLAYER_PET_SPELL_POWER = UNIT_END + 0x9AA, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RESEARCHING_1 = UNIT_END + 0x9AB, // Size: 10, Flags: PRIVATE - PLAYER_PROFESSION_SKILL_LINE_1 = UNIT_END + 0x9B5, // Size: 2, Flags: PRIVATE - PLAYER_FIELD_UI_HIT_MODIFIER = UNIT_END + 0x9B7, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_UI_SPELL_HIT_MODIFIER = UNIT_END + 0x9B8, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_HOME_REALM_TIME_OFFSET = UNIT_END + 0x9B9, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PET_HASTE = UNIT_END + 0x9BA, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_SUMMONED_BATTLE_PET_ID = UNIT_END + 0x9BB, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BYTES2 = UNIT_END + 0x9BF, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_LFG_BONUS_FACTION_ID = UNIT_END + 0x9C0, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOOT_SPEC_ID = UNIT_END + 0x9C1, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE = UNIT_END + 0x9C2, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_ITEM_LEVEL_DELTA = UNIT_END + 0x9C3, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BAG_SLOT_FLAGS = UNIT_END + 0x9C4, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BANK_BAG_SLOT_FLAGS = UNIT_END + 0x9C8, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT = UNIT_END + 0x9CF, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_QUEST_COMPLETED = UNIT_END + 0x9D0, // Size: 875, Flags: PRIVATE - PLAYER_END = UNIT_END + 0xD3B, + PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x618, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_COINAGE = UNIT_END + 0x624, // Size: 2, Flags: PRIVATE + PLAYER_XP = UNIT_END + 0x626, // Size: 1, Flags: PRIVATE + PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x627, // Size: 1, Flags: PRIVATE + PLAYER_SKILL_LINEID = UNIT_END + 0x628, // Size: 448, Flags: PRIVATE + PLAYER_CHARACTER_POINTS = UNIT_END + 0x7E8, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MAX_TALENT_TIERS = UNIT_END + 0x7E9, // Size: 1, Flags: PRIVATE + PLAYER_TRACK_CREATURES = UNIT_END + 0x7EA, // Size: 1, Flags: PRIVATE + PLAYER_TRACK_RESOURCES = UNIT_END + 0x7EB, // Size: 1, Flags: PRIVATE + PLAYER_EXPERTISE = UNIT_END + 0x7EC, // Size: 1, Flags: PRIVATE + PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x7ED, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_RANGED_EXPERTISE = UNIT_END + 0x7EE, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_EXPERTISE = UNIT_END + 0x7EF, // Size: 1, Flags: PRIVATE + PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x7F0, // Size: 1, Flags: PRIVATE + PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x7F1, // Size: 1, Flags: PRIVATE + PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x7F2, // Size: 1, Flags: PRIVATE + PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x7F3, // Size: 1, Flags: PRIVATE + PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x7F4, // Size: 1, Flags: PRIVATE + PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x7F5, // Size: 1, Flags: PRIVATE + PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x7F6, // Size: 7, Flags: PRIVATE + PLAYER_SHIELD_BLOCK = UNIT_END + 0x7FD, // Size: 1, Flags: PRIVATE + PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x7FE, // Size: 1, Flags: PRIVATE + PLAYER_MASTERY = UNIT_END + 0x7FF, // Size: 1, Flags: PRIVATE + PLAYER_AMPLIFY = UNIT_END + 0x800, // Size: 1, Flags: PRIVATE + PLAYER_MULTISTRIKE = UNIT_END + 0x801, // Size: 1, Flags: PRIVATE + PLAYER_MULTISTRIKE_EFFECT = UNIT_END + 0x802, // Size: 1, Flags: PRIVATE + PLAYER_READINESS = UNIT_END + 0x803, // Size: 1, Flags: PRIVATE + PLAYER_SPEED = UNIT_END + 0x804, // Size: 1, Flags: PRIVATE + PLAYER_LIFESTEAL = UNIT_END + 0x805, // Size: 1, Flags: PRIVATE + PLAYER_AVOIDANCE = UNIT_END + 0x806, // Size: 1, Flags: PRIVATE + PLAYER_STURDINESS = UNIT_END + 0x807, // Size: 1, Flags: PRIVATE + PLAYER_CLEAVE = UNIT_END + 0x808, // Size: 1, Flags: PRIVATE + PLAYER_VERSATILITY = UNIT_END + 0x809, // Size: 1, Flags: PRIVATE + PLAYER_VERSATILITY_BONUS = UNIT_END + 0x80A, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_POWER_DAMAGE = UNIT_END + 0x80B, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_POWER_HEALING = UNIT_END + 0x80C, // Size: 1, Flags: PRIVATE + PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x80D, // Size: 256, Flags: PRIVATE + PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x90D, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x90E, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x915, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x91C, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x923, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x924, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x925, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT = UNIT_END + 0x926, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS = UNIT_END + 0x927, // Size: 3, Flags: PRIVATE + PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS = UNIT_END + 0x92A, // Size: 3, Flags: PRIVATE + PLAYER_FIELD_MOD_SPELL_POWER_PCT = UNIT_END + 0x92D, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_RESILIENCE_PERCENT = UNIT_END + 0x92E, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT = UNIT_END + 0x92F, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT = UNIT_END + 0x930, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x931, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x932, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LOCAL_FLAGS = UNIT_END + 0x933, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BYTES = UNIT_END + 0x934, // Size: 1, Flags: PRIVATE + PLAYER_SELF_RES_SPELL = UNIT_END + 0x935, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x936, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x937, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x943, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_KILLS = UNIT_END + 0x94F, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x950, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x951, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x952, // Size: 32, Flags: PRIVATE + PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x972, // Size: 36, Flags: PRIVATE + PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x996, // Size: 1, Flags: PRIVATE + PLAYER_RUNE_REGEN_1 = UNIT_END + 0x997, // Size: 4, Flags: PRIVATE + PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x99B, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x99F, // Size: 6, Flags: PRIVATE + PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x9A5, // Size: 6, Flags: PRIVATE + PLAYER_GLYPHS_ENABLED = UNIT_END + 0x9AB, // Size: 1, Flags: PRIVATE + PLAYER_PET_SPELL_POWER = UNIT_END + 0x9AC, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_RESEARCHING_1 = UNIT_END + 0x9AD, // Size: 10, Flags: PRIVATE + PLAYER_PROFESSION_SKILL_LINE_1 = UNIT_END + 0x9B7, // Size: 2, Flags: PRIVATE + PLAYER_FIELD_UI_HIT_MODIFIER = UNIT_END + 0x9B9, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_UI_SPELL_HIT_MODIFIER = UNIT_END + 0x9BA, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_HOME_REALM_TIME_OFFSET = UNIT_END + 0x9BB, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_PET_HASTE = UNIT_END + 0x9BC, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_SUMMONED_BATTLE_PET_ID = UNIT_END + 0x9BD, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_BYTES2 = UNIT_END + 0x9C1, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY + PLAYER_FIELD_LFG_BONUS_FACTION_ID = UNIT_END + 0x9C2, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LOOT_SPEC_ID = UNIT_END + 0x9C3, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE = UNIT_END + 0x9C4, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY + PLAYER_FIELD_ITEM_LEVEL_DELTA = UNIT_END + 0x9C5, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BAG_SLOT_FLAGS = UNIT_END + 0x9C6, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_BANK_BAG_SLOT_FLAGS = UNIT_END + 0x9CA, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT = UNIT_END + 0x9D1, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_QUEST_COMPLETED = UNIT_END + 0x9D2, // Size: 875, Flags: PRIVATE + PLAYER_END = UNIT_END + 0xD3D, }; enum PlayerDynamicFields diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5b6003bf166..b00b18f2f4f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27,6 +27,7 @@ #include "Battleground.h" #include "BattlegroundMgr.h" #include "BattlegroundScore.h" +#include "BattlePetMgr.h" #include "CellImpl.h" #include "ChannelMgr.h" #include "CharacterDatabaseCleaner.h" @@ -76,7 +77,7 @@ #include "QuestDef.h" #include "QuestPackets.h" #include "ReputationMgr.h" -#include "revision.h" +#include "GitRevision.h" #include "SkillDiscovery.h" #include "SocialMgr.h" #include "Spell.h" @@ -86,6 +87,7 @@ #include "SpellMgr.h" #include "SpellPackets.h" #include "TalentPackets.h" +#include "ToyPackets.h" #include "TradePackets.h" #include "Transport.h" #include "UpdateData.h" @@ -3735,7 +3737,7 @@ bool Player::IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const // note: form passives activated with shapeshift spells be implemented by HandleShapeshiftBoosts instead of spell_learn_spell // talent dependent passives activated at form apply have proper stance data ShapeshiftForm form = GetShapeshiftForm(); - bool need_cast = (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) || + bool need_cast = (!spellInfo->Stances || (form && (spellInfo->Stances & (UI64LIT(1) << (form - 1)))) || (!form && (spellInfo->HasAttribute(SPELL_ATTR2_NOT_NEED_SHAPESHIFT)))); if (spellInfo->HasAttribute(SPELL_ATTR8_MASTERY_SPECIALIZATION)) @@ -8850,8 +8852,6 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) packet.Owner = loot->GetGUID(); packet.LootMethod = _lootMethod; packet.AcquireReason = loot_type; - if (GetGroup() && (_lootMethod == GROUP_LOOT || _lootMethod == PERSONAL_LOOT)) /// @TODO: Need more research - packet.PersonalLooting = true; packet.Acquired = true; // false == No Loot (this too^^) loot->BuildLootResponse(packet, this, permission); SendDirectMessage(packet.Write()); @@ -13700,10 +13700,10 @@ void Player::SendNewItem(Item* item, uint32 quantity, bool pushed, bool created, packet.Quantity = quantity; packet.QuantityInInventory = GetItemCount(item->GetEntry()); //packet.DungeonEncounterID; - //packet.BattlePetBreedID; - //packet.BattlePetBreedQuality; - //packet.BattlePetSpeciesID; - //packet.BattlePetLevel; + packet.BattlePetBreedID = item->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) & 0xFFFFFF; + packet.BattlePetBreedQuality = (item->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) >> 24) & 0xFF; + packet.BattlePetSpeciesID = item->GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID); + packet.BattlePetLevel = item->GetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL); packet.ItemGUID = item->GetGUID(); @@ -14352,6 +14352,10 @@ bool Player::CanCompleteQuest(uint32 quest_id) if (!GetQuestObjectiveData(qInfo, obj.StorageIndex)) return false; break; + case QUEST_OBJECTIVE_LEARNSPELL: + if (!HasSpell(obj.ObjectID)) + return false; + break; default: TC_LOG_ERROR("entities.player.quest", "Player::CanCompleteQuest unknown objective type %u", obj.Type); return false; @@ -14616,8 +14620,8 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK); stmt->setUInt32(0, quest_id); stmt->setUInt64(1, GetGUID().GetCounter()); - stmt->setString(2, _HASH); - stmt->setString(3, _DATE); + stmt->setString(2, GitRevision::GetHash()); + stmt->setString(3, GitRevision::GetDate()); // add to Quest Tracker CharacterDatabase.Execute(stmt); @@ -16712,7 +16716,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) m_name = fields[2].GetString(); // check name limitations - if (ObjectMgr::CheckPlayerName(m_name) != CHAR_NAME_SUCCESS || + if (ObjectMgr::CheckPlayerName(m_name, GetSession()->GetSessionDbcLocale()) != CHAR_NAME_SUCCESS || (!GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(m_name))) { @@ -17229,6 +17233,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) _LoadTalents(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); _LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS)); + _LoadToys(GetSession()->GetAccountToys()); LearnSpecializationSpells(); @@ -17369,7 +17374,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } // RaF stuff. - m_grantableLevels = fields[59].GetUInt8(); + m_grantableLevels = fields[61].GetUInt8(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); @@ -17646,8 +17651,10 @@ void Player::LoadCorpse() void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - // SELECT ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId, ii.enchantIllusion, ii.bonusListIDs, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + // SELECT ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, ii.transmogrification, ii.upgradeId + // 15 16 17 18 19 20 21 22 + // ii.enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, ii.bonusListIDs, bag, slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot //NOTE: the "order by `bag`" is important because it makes sure //the bagMap is filled before items in the bags are loaded //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?) @@ -17669,8 +17676,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid = fields[17].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[17].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[18].GetUInt8(); + ObjectGuid bagGuid = fields[21].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[21].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[22].GetUInt8(); uint8 err = EQUIP_ERR_OK; // Item is not in bag @@ -17783,15 +17790,20 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) do { - // SELECT itemid, itemEntry, slot, creatorGuid FROM character_void_storage WHERE playerGuid = ? + // SELECT itemId, itemEntry, slot, creatorGuid, randomProperty, suffixFactor, upgradeId, bonusListIDs FROM character_void_storage WHERE playerGuid = ? Field* fields = result->Fetch(); uint64 itemId = fields[0].GetUInt64(); uint32 itemEntry = fields[1].GetUInt32(); uint8 slot = fields[2].GetUInt8(); - ObjectGuid creatorGuid = ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()); + ObjectGuid creatorGuid = fields[3].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()) : ObjectGuid::Empty; uint32 randomProperty = fields[4].GetUInt32(); uint32 suffixFactor = fields[5].GetUInt32(); + uint32 upgradeId = fields[6].GetUInt32(); + std::vector<uint32> bonusListIDs; + Tokenizer bonusListIdTokens(fields[7].GetString(), ' '); + for (char const* token : bonusListIdTokens) + bonusListIDs.push_back(atoul(token)); if (!itemId) { @@ -17818,7 +17830,7 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) creatorGuid.Clear(); } - _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomProperty, suffixFactor); + _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomProperty, suffixFactor, upgradeId, bonusListIDs); } while (result->NextRow()); } @@ -17986,7 +17998,7 @@ void Player::_LoadMailedItems(Mail* mail) Item* item = NewItemOrBag(proto); - ObjectGuid ownerGuid = fields[17].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[17].GetUInt64()) : ObjectGuid::Empty; + ObjectGuid ownerGuid = fields[21].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[21].GetUInt64()) : ObjectGuid::Empty; if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry)) { TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: " UI64FMTD ", deleted from mail", mail->messageID, itemGuid); @@ -18362,6 +18374,23 @@ void Player::_LoadSpells(PreparedQueryResult result) } } +void Player::_LoadToys(ToyBoxContainer const& toys) +{ + for (auto const& t : toys) + AddDynamicValue(PLAYER_DYNAMIC_FIELD_TOYS, t.first); +} + +bool Player::AddToy(uint32 itemId, bool isFavourite /*= false*/) +{ + if (GetSession()->UpdateAccountToys(itemId, isFavourite)) + { + AddDynamicValue(PLAYER_DYNAMIC_FIELD_TOYS, itemId); + return true; + } + + return false; +} + void Player::_LoadGroup(PreparedQueryResult result) { //QueryResult* result = CharacterDatabase.PQuery("SELECT guid FROM group_member WHERE memberGuid=%u", GetGUIDLow()); @@ -19162,6 +19191,12 @@ void Player::SaveToDB(bool create /*=false*/) CharacterDatabase.CommitTransaction(trans); + // TODO: Move this out + trans = LoginDatabase.BeginTransaction(); + GetSession()->SaveAccountToys(trans); + GetSession()->GetBattlePetMgr()->SaveToDB(trans); + LoginDatabase.CommitTransaction(trans); + // save pet (hunter pet level and experience and all type pets health/mana). if (Pet* pet = GetPet()) pet->SavePetToDB(PET_SAVE_AS_CURRENT); @@ -19418,7 +19453,7 @@ void Player::_SaveVoidStorage(SQLTransaction& trans) } else { - // REPLACE INTO character_inventory (itemId, playerGuid, itemEntry, slot, creatorGuid) VALUES (?, ?, ?, ?, ?) + // REPLACE INTO character_inventory (itemId, playerGuid, itemEntry, slot, creatorGuid, randomProperty, suffixFactor, upgradeId, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM); stmt->setUInt64(0, _voidStorageItems[i]->ItemId); stmt->setUInt64(1, GetGUID().GetCounter()); @@ -19427,6 +19462,11 @@ void Player::_SaveVoidStorage(SQLTransaction& trans) stmt->setUInt64(4, _voidStorageItems[i]->CreatorGuid.GetCounter()); stmt->setUInt32(5, _voidStorageItems[i]->ItemRandomPropertyId); stmt->setUInt32(6, _voidStorageItems[i]->ItemSuffixFactor); + stmt->setUInt32(7, _voidStorageItems[i]->ItemUpgradeId); + std::ostringstream bonusListIDs; + for (int32 bonusListID : _voidStorageItems[i]->BonusListIDs) + bonusListIDs << bonusListID << ' '; + stmt->setString(8, bonusListIDs.str()); } trans->Append(stmt); @@ -21655,7 +21695,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin if (crItem->maxcount != 0) // bought { - if (pProto->GetQuality() > ITEM_QUALITY_EPIC || (pProto->GetQuality() == ITEM_QUALITY_EPIC && pProto->GetBaseItemLevel() >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) + if (pProto->GetQuality() > ITEM_QUALITY_EPIC || (pProto->GetQuality() == ITEM_QUALITY_EPIC && pProto->GetBaseItemLevel() >= MinNewsItemLevel)) if (Guild* guild = GetGuild()) guild->AddGuildNews(GUILD_NEWS_ITEM_PURCHASED, GetGUID(), 0, item); return true; @@ -22598,6 +22638,10 @@ void Player::SendInitialPacketsBeforeAddToMap() // SMSG_ACCOUNT_MOUNT_UPDATE // SMSG_ACCOUNT_TOYS_UPDATE + WorldPackets::Toy::AccountToysUpdate toysUpdate; + toysUpdate.IsFullUpdate = true; + toysUpdate.Toys = &GetSession()->GetAccountToys(); + SendDirectMessage(toysUpdate.Write()); WorldPackets::Character::InitialSetup initialSetup; initialSetup.ServerExpansionLevel = sWorld->getIntConfig(CONFIG_EXPANSION); @@ -22735,7 +22779,7 @@ void Player::ApplyEquipCooldown(Item* pItem) continue; // Don't replace longer cooldowns by equip cooldown if we have any. - if (GetSpellHistory()->GetRemainingCooldown(effectData->SpellID) > 30 * IN_MILLISECONDS) + if (GetSpellHistory()->GetRemainingCooldown(sSpellMgr->AssertSpellInfo(effectData->SpellID)) > 30 * IN_MILLISECONDS) continue; GetSpellHistory()->AddCooldown(effectData->SpellID, pItem->GetEntry(), std::chrono::seconds(30)); @@ -24697,7 +24741,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) --loot->unlootedCount; if (sObjectMgr->GetItemTemplate(item->itemid)) - if (newitem->GetQuality() > ITEM_QUALITY_EPIC || (newitem->GetQuality() == ITEM_QUALITY_EPIC && newitem->GetItemLevel(this) >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) + if (newitem->GetQuality() > ITEM_QUALITY_EPIC || (newitem->GetQuality() == ITEM_QUALITY_EPIC && newitem->GetItemLevel(this) >= MinNewsItemLevel)) if (Guild* guild = GetGuild()) guild->AddGuildNews(GUILD_NEWS_ITEM_LOOTED, GetGUID(), 0, item->itemid); @@ -26109,7 +26153,7 @@ uint8 Player::GetNumOfVoidStorageFreeSlots() const return count; } -uint8 Player::AddVoidStorageItem(VoidStorageItem const& item) +uint8 Player::AddVoidStorageItem(VoidStorageItem&& item) { uint8 slot = GetNextVoidStorageFreeSlot(); @@ -26119,30 +26163,10 @@ uint8 Player::AddVoidStorageItem(VoidStorageItem const& item) return 255; } - _voidStorageItems[slot] = new VoidStorageItem(item.ItemId, item.ItemEntry, - item.CreatorGuid, item.ItemRandomPropertyId, item.ItemSuffixFactor); + _voidStorageItems[slot] = new VoidStorageItem(std::move(item)); return slot; } -void Player::AddVoidStorageItemAtSlot(uint8 slot, const VoidStorageItem& item) -{ - if (slot >= VOID_STORAGE_MAX_SLOT) - { - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); - return; - } - - if (_voidStorageItems[slot]) - { - TC_LOG_ERROR("misc", "Player::AddVoidStorageItemAtSlot - Player (%s, name: %s) tried to add an item to an used slot (item id: " UI64FMTD ", entry: %u, slot: %u).", GetGUID().ToString().c_str(), GetName().c_str(), _voidStorageItems[slot]->ItemId, _voidStorageItems[slot]->ItemEntry, slot); - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); - return; - } - - _voidStorageItems[slot] = new VoidStorageItem(item.ItemId, item.ItemId, - item.CreatorGuid, item.ItemRandomPropertyId, item.ItemSuffixFactor); -} - void Player::DeleteVoidStorageItem(uint8 slot) { if (slot >= VOID_STORAGE_MAX_SLOT) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 4218a058798..d4973e0f332 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -532,7 +532,7 @@ enum PlayerFlags PLAYER_FLAGS_UNK21 = 0x00200000, PLAYER_FLAGS_COMMENTATOR2 = 0x00400000, PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree, allowed only spells with SPELL_ATTR0_REQ_AMMO, SPELL_EFFECT_ATTACK, checked only for active player - PLAYER_FLAGS_UNK24 = 0x01000000, // disabled all melee ability on tab include autoattack + PLAYER_FLAGS_PET_BATTLES_UNLOCKED = 0x01000000, // enables pet battles PLAYER_FLAGS_NO_XP_GAIN = 0x02000000, PLAYER_FLAGS_UNK26 = 0x04000000, PLAYER_FLAGS_AUTO_DECLINE_GUILD = 0x08000000, // Automatically declines guild invites @@ -542,6 +542,12 @@ enum PlayerFlags PLAYER_FLAGS_UNK31 = 0x80000000 }; +enum PlayerFlagsEx +{ + PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED = 0x0001, + PLAYER_FLAGS_EX_MERCENARY_MODE = 0x0002 +}; + enum PlayerLocalFlags { PLAYER_LOCAL_FLAG_TRACK_STEALTHED = 0x00000002, @@ -596,7 +602,7 @@ static_assert((PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID & 1) == 0, "PLAYER #define PLAYER_BYTES_2_OVERRIDE_SPELLS_UINT16_OFFSET (PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID / 2) -#define KNOWN_TITLES_SIZE 4 +#define KNOWN_TITLES_SIZE 6 #define MAX_TITLE_INDEX (KNOWN_TITLES_SIZE * 64) // 4 uint64 fields // used in PLAYER_FIELD_BYTES2 values @@ -1162,28 +1168,23 @@ struct BGData struct VoidStorageItem { - VoidStorageItem() + VoidStorageItem() : ItemId(0), ItemEntry(0), ItemRandomPropertyId(0), ItemSuffixFactor(0), ItemUpgradeId(0) { } + VoidStorageItem(uint64 id, uint32 entry, ObjectGuid const& creator, uint32 randomPropertyId, uint32 suffixFactor, uint32 upgradeId, std::vector<uint32> const& bonuses) + : ItemId(id), ItemEntry(entry), CreatorGuid(creator), ItemRandomPropertyId(randomPropertyId), + ItemSuffixFactor(suffixFactor), ItemUpgradeId(upgradeId) { - ItemId = 0; - ItemEntry = 0; - ItemRandomPropertyId = 0; - ItemSuffixFactor = 0; - } - - VoidStorageItem(uint64 id, uint32 entry, ObjectGuid creator, uint32 randomPropertyId, uint32 suffixFactor) - { - ItemId = id; - ItemEntry = entry; - CreatorGuid = creator; - ItemRandomPropertyId = randomPropertyId; - ItemSuffixFactor = suffixFactor; + BonusListIDs.insert(BonusListIDs.end(), bonuses.begin(), bonuses.end()); } + VoidStorageItem(VoidStorageItem&& vsi) : ItemId(vsi.ItemId), ItemEntry(vsi.ItemEntry), CreatorGuid(vsi.CreatorGuid), ItemRandomPropertyId(vsi.ItemRandomPropertyId), + ItemSuffixFactor(vsi.ItemSuffixFactor), ItemUpgradeId(vsi.ItemUpgradeId), BonusListIDs(std::move(vsi.BonusListIDs)) { } uint64 ItemId; uint32 ItemEntry; ObjectGuid CreatorGuid; uint32 ItemRandomPropertyId; uint32 ItemSuffixFactor; + uint32 ItemUpgradeId; + std::vector<int32> BonusListIDs; }; class TradeData @@ -2118,8 +2119,8 @@ class Player : public Unit, public GridObject<Player> void SetLastRuneGraceTimer(uint8 index, uint32 timer) { m_lastRuneGraceTimers[index] = timer; } void UpdateAllRunesRegen(); - ObjectGuid GetLootGUID() const { return m_lootGuid; } - void SetLootGUID(ObjectGuid guid) { m_lootGuid = guid; } + ObjectGuid const& GetLootGUID() const { return GetGuidValue(PLAYER_LOOT_TARGET_GUID); } + void SetLootGUID(ObjectGuid const& guid) { SetGuidValue(PLAYER_LOOT_TARGET_GUID, guid); } void RemovedInsignia(Player* looterPlr); @@ -2623,13 +2624,14 @@ class Player : public Unit, public GridObject<Player> void LockVoidStorage() { RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_VOID_UNLOCKED); } uint8 GetNextVoidStorageFreeSlot() const; uint8 GetNumOfVoidStorageFreeSlots() const; - uint8 AddVoidStorageItem(VoidStorageItem const& item); - void AddVoidStorageItemAtSlot(uint8 slot, const VoidStorageItem& item); + uint8 AddVoidStorageItem(VoidStorageItem&& item); void DeleteVoidStorageItem(uint8 slot); bool SwapVoidStorageItem(uint8 oldSlot, uint8 newSlot); VoidStorageItem* GetVoidStorageItem(uint8 slot) const; VoidStorageItem* GetVoidStorageItem(uint64 id, uint8& slot) const; + bool AddToy(uint32 itemId, bool isFavourite /*= false*/); + void OnCombatExit(); void CreateGarrison(uint32 garrSiteId); @@ -2707,6 +2709,7 @@ class Player : public Unit, public GridObject<Player> void _LoadGroup(PreparedQueryResult result); void _LoadSkills(PreparedQueryResult result); void _LoadSpells(PreparedQueryResult result); + void _LoadToys(ToyBoxContainer const& toys); void _LoadFriendList(PreparedQueryResult result); bool _LoadHomeBind(PreparedQueryResult result); void _LoadDeclinedNames(PreparedQueryResult result); @@ -2759,7 +2762,6 @@ class Player : public Unit, public GridObject<Player> time_t m_lastHonorUpdateTime; void outDebugValues() const; - ObjectGuid m_lootGuid; uint32 m_team; uint32 m_nextSave; diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 59053abe46d..f85860dfde3 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -265,7 +265,7 @@ float Player::GetHealthBonusFromStamina() { // Taken from PaperDollFrame.lua - 6.0.3.19085 float ratio = 10.0f; - if (gtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.EvaluateTable(getLevel() - 1, 0)) + if (GtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.EvaluateTable(getLevel() - 1, 0)) ratio = hpBase->ratio; float stamina = GetStat(STAT_STAMINA); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 49b8ff0f330..f5b13122ecf 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10035,9 +10035,9 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo || target->GetReactionTo(this) > REP_NEUTRAL) return false; - // Not all neutral creatures can be attacked + // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar) if (GetReactionTo(target) == REP_NEUTRAL && - target->GetReactionTo(this) == REP_NEUTRAL) + target->GetReactionTo(this) <= REP_NEUTRAL) { if (!(target->GetTypeId() == TYPEID_PLAYER && GetTypeId() == TYPEID_PLAYER) && !(target->GetTypeId() == TYPEID_UNIT && GetTypeId() == TYPEID_UNIT)) @@ -14968,10 +14968,19 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const return 37730; return 21244; case FORM_MOONKIN: - if (getRace() == RACE_TROLL) - return 37174; - if (getRace() == RACE_WORGEN) - return 37173; + switch (getRace()) + { + case RACE_NIGHTELF: + return 15374; + case RACE_TAUREN: + return 15375; + case RACE_WORGEN: + return 37173; + case RACE_TROLL: + return 37174; + default: + break; + } break; case FORM_GHOSTWOLF: if (HasAura(58135)) //! Glyph of Arctic Wolf diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 8789e98561b..de38e50c378 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1120,7 +1120,8 @@ enum ReactStates { REACT_PASSIVE = 0, REACT_DEFENSIVE = 1, - REACT_AGGRESSIVE = 2 + REACT_AGGRESSIVE = 2, + REACT_ASSIST = 3 }; enum CommandStates diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 3f595a2cd69..7f014e22efb 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -5586,7 +5586,7 @@ void ObjectMgr::LoadQuestGreetings() continue; } - uint16 greetEmoteType = fields[2].GetUInt32(); + uint16 greetEmoteType = fields[2].GetUInt16(); uint32 greetEmoteDelay = fields[3].GetUInt32(); std::string greeting = fields[4].GetString(); @@ -6790,7 +6790,7 @@ std::string ObjectMgr::GeneratePetName(uint32 entry) if (!cinfo) return std::string(); - char const* petname = GetPetName(cinfo->family, sWorld->GetDefaultDbcLocale()); + char const* petname = GetCreatureFamilyPetName(cinfo->family, sWorld->GetDefaultDbcLocale()); if (petname) return std::string(petname); else @@ -7509,7 +7509,7 @@ bool isValidString(const std::wstring& wstr, uint32 strictMask, bool numericOrSp return false; } -ResponseCodes ObjectMgr::CheckPlayerName(const std::string& name, bool create) +ResponseCodes ObjectMgr::CheckPlayerName(std::string const& name, LocaleConstant locale, bool create /*= false*/) { std::wstring wname; if (!Utf8toWStr(name, wname)) @@ -7531,7 +7531,7 @@ ResponseCodes ObjectMgr::CheckPlayerName(const std::string& name, bool create) if (wname[i] == wname[i-1] && wname[i] == wname[i-2]) return CHAR_NAME_THREE_CONSECUTIVE; - return CHAR_NAME_SUCCESS; + return sDB2Manager.ValidateName(name, locale); } bool ObjectMgr::IsValidCharterName(const std::string& name) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 1ae3e113331..8e660e3f32c 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1229,7 +1229,7 @@ class ObjectMgr bool IsReservedName(std::string const& name) const; // name with valid structure and symbols - static ResponseCodes CheckPlayerName(std::string const& name, bool create = false); + static ResponseCodes CheckPlayerName(std::string const& name, LocaleConstant locale, bool create = false); static PetNameInvalidReason CheckPetName(std::string const& name); static bool IsValidCharterName(std::string const& name); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index e93a1da83b3..e7347a00732 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -368,7 +368,7 @@ void Guild::BankTab::LoadFromDB(Field* fields) bool Guild::BankTab::LoadItemFromDB(Field* fields) { - uint8 slotId = fields[19].GetUInt8(); + uint8 slotId = fields[23].GetUInt8(); ObjectGuid::LowType itemGuid = fields[0].GetUInt64(); uint32 itemEntry = fields[1].GetUInt32(); if (slotId >= GUILD_BANK_MAX_SLOTS) @@ -2395,7 +2395,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[18].GetUInt8(); + uint8 tabId = fields[22].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { TC_LOG_ERROR("guild", "Invalid tab for item (GUID: %u, id: #%u) in guild bank, skipped.", diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 805e35f0eb3..8dc9a98365b 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -251,7 +251,7 @@ struct GuildReward std::vector<uint32> AchievementsRequired; }; -uint32 const MinNewsItemLevel[MAX_CONTENT] = { 61, 90, 200, 353 }; +uint32 const MinNewsItemLevel = 353; // Guild Challenge #define GUILD_CHALLENGES_TYPES 6 diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 44816f5fd67..6db5b84a696 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -395,10 +395,10 @@ void GuildMgr::LoadGuilds() // Delete orphan guild bank items CharacterDatabase.DirectExecute("DELETE gbi FROM guild_bank_item gbi LEFT JOIN guild g ON gbi.guildId = g.guildId WHERE g.guildId IS NULL"); - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 - // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, bonusListIDs, - // 17 18 19 - // guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, + // 17 18 19 20 21 22 23 + // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); if (!result) @@ -411,7 +411,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[17].GetUInt64(); + uint64 guildId = fields[21].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/BattlePetHandler.cpp b/src/server/game/Handlers/BattlePetHandler.cpp new file mode 100644 index 00000000000..bd44ab73791 --- /dev/null +++ b/src/server/game/Handlers/BattlePetHandler.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2008-2015 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 "WorldSession.h" +#include "BattlePetMgr.h" +#include "BattlePetPackets.h" +#include "Player.h" + +void WorldSession::HandleBattlePetRequestJournal(WorldPackets::BattlePet::BattlePetRequestJournal& /*battlePetRequestJournal*/) +{ + // TODO: Move this to BattlePetMgr::SendJournal() just to have all packets in one file + WorldPackets::BattlePet::BattlePetJournal battlePetJournal; + battlePetJournal.Trap = GetBattlePetMgr()->GetTrapLevel(); + + for (auto itr : GetBattlePetMgr()->GetLearnedPets()) + battlePetJournal.Pets.push_back(itr.PacketInfo); + + battlePetJournal.Slots = GetBattlePetMgr()->GetSlots(); + SendPacket(battlePetJournal.Write()); +} + +void WorldSession::HandleBattlePetSetBattleSlot(WorldPackets::BattlePet::BattlePetSetBattleSlot& battlePetSetBattleSlot) +{ + if (BattlePetMgr::BattlePet* pet = GetBattlePetMgr()->GetPet(battlePetSetBattleSlot.PetGuid)) + GetBattlePetMgr()->GetSlot(battlePetSetBattleSlot.Slot)->Pet = pet->PacketInfo; +} + +void WorldSession::HandleBattlePetModifyName(WorldPackets::BattlePet::BattlePetModifyName& battlePetModifyName) +{ + if (BattlePetMgr::BattlePet* pet = GetBattlePetMgr()->GetPet(battlePetModifyName.PetGuid)) + { + pet->PacketInfo.Name = battlePetModifyName.Name; + + if (pet->SaveInfo != BATTLE_PET_NEW) + pet->SaveInfo = BATTLE_PET_CHANGED; + } +} + +void WorldSession::HandleBattlePetDeletePet(WorldPackets::BattlePet::BattlePetDeletePet& battlePetDeletePet) +{ + GetBattlePetMgr()->RemovePet(battlePetDeletePet.PetGuid); +} + +void WorldSession::HandleBattlePetSetFlags(WorldPackets::BattlePet::BattlePetSetFlags& battlePetSetFlags) +{ + if (BattlePetMgr::BattlePet* pet = GetBattlePetMgr()->GetPet(battlePetSetFlags.PetGuid)) + { + if (battlePetSetFlags.ControlType == 2) // 2 - apply + pet->PacketInfo.Flags |= battlePetSetFlags.Flags; + else // 3 - remove + pet->PacketInfo.Flags &= ~battlePetSetFlags.Flags; + + if (pet->SaveInfo != BATTLE_PET_NEW) + pet->SaveInfo = BATTLE_PET_CHANGED; + } +} + +void WorldSession::HandleCageBattlePet(WorldPackets::BattlePet::CageBattlePet& cageBattlePet) +{ + GetBattlePetMgr()->CageBattlePet(cageBattlePet.PetGuid); +} + +void WorldSession::HandleBattlePetSummon(WorldPackets::BattlePet::BattlePetSummon& battlePetSummon) +{ + GetBattlePetMgr()->SummonPet(battlePetSummon.PetGuid); +} diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 6faeae4004d..d50e721fb1d 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -22,6 +22,7 @@ #include "AuthenticationPackets.h" #include "Battleground.h" #include "BattlenetServerManager.h" +#include "BattlePetPackets.h" #include "CalendarMgr.h" #include "CharacterPackets.h" #include "Chat.h" @@ -44,10 +45,10 @@ #include "Player.h" #include "QueryPackets.h" #include "ReputationMgr.h" +#include "GitRevision.h" #include "ScriptMgr.h" #include "SharedDefines.h" #include "SocialMgr.h" -#include "SystemConfig.h" #include "SystemPackets.h" #include "UpdateMask.h" #include "Util.h" @@ -458,7 +459,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact } // check name limitations - ResponseCodes res = ObjectMgr::CheckPlayerName(charCreate.CreateInfo->Name, true); + ResponseCodes res = ObjectMgr::CheckPlayerName(charCreate.CreateInfo->Name, GetSessionDbcLocale(), true); if (res != CHAR_NAME_SUCCESS) { SendCharCreate(res); @@ -956,7 +957,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) // send server info { if (sWorld->getIntConfig(CONFIG_ENABLE_SINFO_LOGIN) == 1) - chH.PSendSysMessage(_FULLVERSION); + chH.PSendSysMessage(GitRevision::GetFullVersion()); TC_LOG_DEBUG("network", "WORLD: Sent server info"); } @@ -985,6 +986,10 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) hotfixInfo.Hotfixes = sDB2Manager.GetHotfixData(); SendPacket(hotfixInfo.Write()); + // TODO: Move this to BattlePetMgr::SendJournalLock() just to have all packets in one file + WorldPackets::BattlePet::BattlePetJournalLockAcquired lock; + SendPacket(lock.Write()); + pCurrChar->SendInitialPacketsBeforeAddToMap(); //Show cinematic at the first time that player login @@ -1271,7 +1276,7 @@ void WorldSession::HandleCharRenameOpcode(WorldPackets::Character::CharacterRena return; } - ResponseCodes res = ObjectMgr::CheckPlayerName(request.RenameInfo->NewName, true); + ResponseCodes res = ObjectMgr::CheckPlayerName(request.RenameInfo->NewName, GetSessionDbcLocale(), true); if (res != CHAR_NAME_SUCCESS) { SendCharRename(res, request.RenameInfo.get()); @@ -1567,7 +1572,7 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World return; } - ResponseCodes res = ObjectMgr::CheckPlayerName(customizeInfo->CharName, true); + ResponseCodes res = ObjectMgr::CheckPlayerName(customizeInfo->CharName, GetSessionDbcLocale(), true); if (res != CHAR_NAME_SUCCESS) { SendCharCustomize(res, customizeInfo); @@ -1811,7 +1816,7 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res return; } - ResponseCodes res = ObjectMgr::CheckPlayerName(factionChangeInfo->Name, true); + ResponseCodes res = ObjectMgr::CheckPlayerName(factionChangeInfo->Name, GetSessionDbcLocale(), true); if (res != CHAR_NAME_SUCCESS) { SendCharFactionChange(res, factionChangeInfo); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 9c1afcc3785..ccd3dd77109 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -27,6 +27,7 @@ #include "DB2Stores.h" #include "NPCPackets.h" #include "ItemPackets.h" +#include "BattlePetMgr.h" void WorldSession::HandleSplitItemOpcode(WorldPackets::Item::SplitItem& splitItem) { @@ -1109,142 +1110,93 @@ void WorldSession::HandleItemRefund(WorldPacket &recvData) GetPlayer()->RefundItem(item); } -void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) +void WorldSession::HandleTransmogrifyItems(WorldPackets::Item::TransmogrifyItems& transmogrifyItems) { Player* player = GetPlayer(); - - // Read data - uint32 count = recvData.ReadBits(22); - - if (count >= EQUIPMENT_SLOT_END) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) sent a wrong count (%u) when transmogrifying items.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), count); - recvData.rfinish(); - return; - } - - std::vector<ObjectGuid> itemGuids(count, ObjectGuid()); - std::vector<uint32> newEntries(count, 0); - std::vector<uint32> slots(count, 0); - - for (uint8 i = 0; i < count; ++i) - { - itemGuids[i][0] = recvData.ReadBit(); - itemGuids[i][5] = recvData.ReadBit(); - itemGuids[i][6] = recvData.ReadBit(); - itemGuids[i][2] = recvData.ReadBit(); - itemGuids[i][3] = recvData.ReadBit(); - itemGuids[i][7] = recvData.ReadBit(); - itemGuids[i][4] = recvData.ReadBit(); - itemGuids[i][1] = recvData.ReadBit(); - } - - ObjectGuid npcGuid; - npcGuid[7] = recvData.ReadBit(); - npcGuid[3] = recvData.ReadBit(); - npcGuid[5] = recvData.ReadBit(); - npcGuid[6] = recvData.ReadBit(); - npcGuid[1] = recvData.ReadBit(); - npcGuid[4] = recvData.ReadBit(); - npcGuid[0] = recvData.ReadBit(); - npcGuid[2] = recvData.ReadBit(); - - recvData.FlushBits(); - - for (uint32 i = 0; i < count; ++i) - { - recvData >> newEntries[i]; - - recvData.ReadByteSeq(itemGuids[i][1]); - recvData.ReadByteSeq(itemGuids[i][5]); - recvData.ReadByteSeq(itemGuids[i][0]); - recvData.ReadByteSeq(itemGuids[i][4]); - recvData.ReadByteSeq(itemGuids[i][6]); - recvData.ReadByteSeq(itemGuids[i][7]); - recvData.ReadByteSeq(itemGuids[i][3]); - recvData.ReadByteSeq(itemGuids[i][2]); - - recvData >> slots[i]; - } - - recvData.ReadByteSeq(npcGuid[7]); - recvData.ReadByteSeq(npcGuid[2]); - recvData.ReadByteSeq(npcGuid[5]); - recvData.ReadByteSeq(npcGuid[4]); - recvData.ReadByteSeq(npcGuid[3]); - recvData.ReadByteSeq(npcGuid[1]); - recvData.ReadByteSeq(npcGuid[6]); - recvData.ReadByteSeq(npcGuid[0]); - // Validate - - if (!player->GetNPCIfCanInteractWith(npcGuid, UNIT_NPC_FLAG_TRANSMOGRIFIER)) + if (!player->GetNPCIfCanInteractWith(transmogrifyItems.Npc, UNIT_NPC_FLAG_TRANSMOGRIFIER)) { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s not found or player can't interact with it.", npcGuid.ToString().c_str()); + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s not found or player can't interact with it.", transmogrifyItems.Npc.ToString().c_str()); return; } int64 cost = 0; - std::vector<Item*> transmogrifier(count, NULL); - std::vector<Item*> transmogrified(count, NULL); + std::unordered_map<Item*, Item*> transmogItems; + std::unordered_map<Item*, std::pair<VoidStorageItem*, BonusData>> transmogVoidItems; + std::vector<Item*> resetAppearanceItems; - for (uint8 i = 0; i < count; ++i) + for (WorldPackets::Item::TransmogrifyItem const& transmogItem : transmogrifyItems.Items) { // slot of the transmogrified item - if (slots[i] >= EQUIPMENT_SLOT_END) + if (transmogItem.Slot >= EQUIPMENT_SLOT_END) { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify %s with a wrong slot (%u) when transmogrifying items.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), itemGuids[i].ToString().c_str(), slots[i]); + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify wrong slot (%u) when transmogrifying items.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); return; } // transmogrified item - Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]); + Item* itemTransmogrified = player->GetItemByPos(INVENTORY_SLOT_BAG_0, transmogItem.Slot); if (!itemTransmogrified) { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), slots[i]); + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify an invalid item in a valid slot (slot: %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.Slot); return; } - // if not resetting look - Item* itemTransmogrifier = NULL; - if (newEntries[i]) + WorldPackets::Item::ItemInstance itemInstance; + BonusData const* bonus = nullptr; + if (transmogItem.SrcItemGUID) { - // entry of the transmogrifier item - ItemTemplate const* proto = sObjectMgr->GetItemTemplate(newEntries[i]); - if (!proto) + // guid of the transmogrifier item + Item* itemTransmogrifier = player->GetItemByGuid(*transmogItem.SrcItemGUID); + if (!itemTransmogrifier) { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify to an invalid item (entry: %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), newEntries[i]); + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid item (%s).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcItemGUID->ToString().c_str()); return; } + itemInstance.Initialize(itemTransmogrifier); + bonus = itemTransmogrifier->GetBonus(); + transmogItems[itemTransmogrified] = itemTransmogrifier; + } + else if (transmogItem.SrcVoidItemGUID) + { // guid of the transmogrifier item - itemTransmogrifier = player->GetItemByGuid(itemGuids[i]); + uint8 slot; + VoidStorageItem* itemTransmogrifier = player->GetVoidStorageItem(transmogItem.SrcVoidItemGUID->GetCounter(), slot); if (!itemTransmogrifier) { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid item (%s).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), itemGuids[i].ToString().c_str()); + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid void storage item (%s).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcVoidItemGUID->ToString().c_str()); return; } - // entry of transmogrifier and from packet - if (itemTransmogrifier->GetEntry() != newEntries[i]) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid entry (entry: %u) for %s.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), newEntries[i], itemGuids[i].ToString().c_str()); - return; - } + itemInstance.Initialize(itemTransmogrifier); + std::pair<VoidStorageItem*, BonusData>& transmogData = transmogVoidItems[itemTransmogrified]; + transmogData.first = itemTransmogrifier; + transmogData.second.Initialize(itemInstance); + bonus = &transmogData.second; + } + else + { + resetAppearanceItems.push_back(itemTransmogrified); + continue; + } - // validity of the transmogrification items - if (!Item::CanTransmogrifyItemWithItem(itemTransmogrified, itemTransmogrifier)) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) failed CanTransmogrifyItemWithItem (%u with %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), itemTransmogrified->GetEntry(), itemTransmogrifier->GetEntry()); - return; - } + // entry of transmogrifier and from packet + if (itemInstance != transmogItem.Item) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) tried to transmogrify with an invalid item instance data for %s.", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SrcItemGUID->ToString().c_str()); + return; + } - // add cost - cost += itemTransmogrified->GetSpecialPrice(); + // validity of the transmogrification items + if (!Item::CanTransmogrifyItemWithItem(itemTransmogrified, transmogItem.Item, bonus)) + { + TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - Player (%s, name: %s) failed CanTransmogrifyItemWithItem (%u with %u).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), itemTransmogrified->GetEntry(), transmogItem.Item.ItemID); + return; } - transmogrifier[i] = itemTransmogrifier; - transmogrified[i] = itemTransmogrified; + // add cost + cost += itemTransmogrified->GetSpecialPrice(); } if (cost) // 0 cost if reverting look @@ -1255,34 +1207,44 @@ void WorldSession::HandleTransmogrifyItems(WorldPacket& recvData) } // Everything is fine, proceed - - for (uint8 i = 0; i < count; ++i) + for (auto& transmogPair : transmogItems) { - if (transmogrifier[i]) - { - // Transmogrify - transmogrified[i]->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, newEntries[i]); - player->SetVisibleItemSlot(slots[i], transmogrified[i]); + Item* transmogrified = transmogPair.first; + Item* transmogrifier = transmogPair.second; - transmogrified[i]->UpdatePlayedTime(player); + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, transmogrifier->GetEntry()); + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, transmogrifier->GetAppearanceModId()); + player->SetVisibleItemSlot(transmogrified->GetSlot(), transmogrified); - transmogrified[i]->SetOwnerGUID(player->GetGUID()); - transmogrified[i]->SetNotRefundable(player); - transmogrified[i]->ClearSoulboundTradeable(player); + transmogrified->SetNotRefundable(player); + transmogrified->ClearSoulboundTradeable(player); - if (transmogrifier[i]->GetTemplate()->GetBonding() == BIND_WHEN_EQUIPED || transmogrifier[i]->GetTemplate()->GetBonding() == BIND_WHEN_USE) - transmogrifier[i]->SetBinding(true); + transmogrifier->SetNotRefundable(player); + transmogrifier->ClearSoulboundTradeable(player); - transmogrifier[i]->SetOwnerGUID(player->GetGUID()); - transmogrifier[i]->SetNotRefundable(player); - transmogrifier[i]->ClearSoulboundTradeable(player); - } - else - { - // Reset - transmogrified[i]->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, 0); - player->SetVisibleItemSlot(slots[i], transmogrified[i]); - } + if (transmogrifier->GetTemplate()->GetBonding() == BIND_WHEN_EQUIPED || transmogrifier->GetTemplate()->GetBonding() == BIND_WHEN_USE) + transmogrifier->SetBinding(true); + } + + for (auto& transmogVoirPair : transmogVoidItems) + { + Item* transmogrified = transmogVoirPair.first; + VoidStorageItem* transmogrifier = transmogVoirPair.second.first; + BonusData& bonus = transmogVoirPair.second.second; + + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, transmogrifier->ItemEntry); + transmogrified->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, bonus.AppearanceModID); + player->SetVisibleItemSlot(transmogrified->GetSlot(), transmogrified); + + transmogrified->SetNotRefundable(player); + transmogrified->ClearSoulboundTradeable(player); + } + + for (Item* item : resetAppearanceItems) + { + item->SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, 0); + item->SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, 0); + player->SetVisibleItemSlot(item->GetSlot(), item); } } @@ -1303,3 +1265,21 @@ bool WorldSession::CanUseBank(ObjectGuid bankerGUID) const return true; } + +void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useCritterItem) +{ + Item* item = _player->GetItemByGuid(useCritterItem.ItemGuid); + if (!item) + return; + + ItemToBattlePetSpeciesEntry const* itemToBattlePetSpecies = sItemToBattlePetSpeciesStore.LookupEntry(item->GetEntry()); + if (!itemToBattlePetSpecies) + return; + + BattlePetSpeciesEntry const* battlePetSpecies = sBattlePetSpeciesStore.LookupEntry(itemToBattlePetSpecies->BattlePetSpeciesID); + if (!battlePetSpecies) + return; + + 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/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 48ce07f3668..c1762421956 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -700,22 +700,8 @@ void WorldSession::HandlePlayedTime(WorldPackets::Character::RequestPlayedTime& SendPacket(playedTime.Write()); } -void WorldSession::HandleWorldTeleportOpcode(WorldPacket& recvData) +void WorldSession::HandleWorldTeleportOpcode(WorldPackets::Misc::WorldTeleport& worldTeleport) { - uint32 time; - uint32 mapid; - float PositionX; - float PositionY; - float PositionZ; - float Orientation; - - recvData >> time; // time in m.sec. - recvData >> mapid; - recvData >> PositionX; - recvData >> PositionY; - recvData >> PositionZ; - recvData >> Orientation; // o (3.141593 = 180 degrees) - if (GetPlayer()->IsInFlight()) { TC_LOG_DEBUG("network", "Player '%s' (%s) in flight, ignore worldport command.", @@ -723,11 +709,11 @@ void WorldSession::HandleWorldTeleportOpcode(WorldPacket& recvData) return; } - TC_LOG_DEBUG("network", "CMSG_WORLD_TELEPORT: Player = %s, Time = %u, map = %u, x = %f, y = %f, z = %f, o = %f", - GetPlayer()->GetName().c_str(), time, mapid, PositionX, PositionY, PositionZ, Orientation); + TC_LOG_DEBUG("network", "CMSG_WORLD_TELEPORT: Player = %s, map = %u, x = %f, y = %f, z = %f, o = %f", + GetPlayer()->GetName().c_str(), worldTeleport.MapID, worldTeleport.Pos.x, worldTeleport.Pos.y, worldTeleport.Pos.z, worldTeleport.Facing); if (HasPermission(rbac::RBAC_PERM_OPCODE_WORLD_TELEPORT)) - GetPlayer()->TeleportTo(mapid, PositionX, PositionY, PositionZ, Orientation); + GetPlayer()->TeleportTo(worldTeleport.MapID, worldTeleport.Pos.x, worldTeleport.Pos.y, worldTeleport.Pos.z, worldTeleport.Facing); else SendNotification(LANG_YOU_NOT_HAVE_PERMISSION); } diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index ce6abe2fdd5..ec0b40422e0 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -278,7 +278,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) } // check known spell or raid marker spell (which not requires player to know it) - if (caster->GetTypeId() == TYPEID_PLAYER && !caster->ToPlayer()->HasActiveSpell(spellInfo->Id) && !spellInfo->HasEffect(SPELL_EFFECT_CHANGE_RAID_MARKER)) + if (caster->GetTypeId() == TYPEID_PLAYER && !caster->ToPlayer()->HasActiveSpell(spellInfo->Id) && !spellInfo->HasEffect(SPELL_EFFECT_CHANGE_RAID_MARKER) && !spellInfo->HasAttribute(SPELL_ATTR8_RAID_MARKER)) return; // Check possible spell cast overrides diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp index 59a7ceb0efc..bd003d73d1a 100644 --- a/src/server/game/Handlers/TicketHandler.cpp +++ b/src/server/game/Handlers/TicketHandler.cpp @@ -30,7 +30,6 @@ void WorldSession::HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTic { // TODO: Implement GmCase and handle this packet properly WorldPackets::Ticket::GMTicketCaseStatus status; - status.OldestTicketTime = time(nullptr); SendPacket(status.Write()); } diff --git a/src/server/game/Handlers/ToyHandler.cpp b/src/server/game/Handlers/ToyHandler.cpp new file mode 100644 index 00000000000..89ed9426c0f --- /dev/null +++ b/src/server/game/Handlers/ToyHandler.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2008-2015 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 "Item.h" +#include "ToyPackets.h" +#include "WorldSession.h" + +void WorldSession::HandleAddToy(WorldPackets::Toy::AddToy& packet) +{ + if (!packet.Guid) + return; + + Item* item = _player->GetItemByGuid(packet.Guid); + if (!item) + { + _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr); + return; + } + + if (!sDB2Manager.GetToyItemIdMatch(item->GetEntry())) + return; + + InventoryResult msg = _player->CanUseItem(item); + if (msg != EQUIP_ERR_OK) + { + _player->SendEquipError(msg, item, nullptr); + return; + } + + if (_player->AddToy(item->GetEntry(), false)) + _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); +} + +void WorldSession::HandleUseToy(WorldPackets::Toy::UseToy& packet) +{ + ItemTemplate const* item = sObjectMgr->GetItemTemplate(packet.ItemID); + if (!item) + return; + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(packet.Cast.SpellID); + if (!spellInfo) + { + TC_LOG_ERROR("network", "HandleUseToy: unknown spell id: %u used by Toy Item entry %u", packet.Cast.SpellID, packet.ItemID); + return; + } + + if (_player->isPossessing()) + return; + + SpellCastTargets targets(_player, packet.Cast); + + Spell* spell = new Spell(_player, spellInfo, TRIGGERED_NONE, ObjectGuid::Empty, false); + spell->m_castItemEntry = packet.ItemID; + spell->m_cast_count = packet.Cast.CastID; + spell->m_misc.Raw.Data[0] = packet.Cast.Misc[0]; + spell->m_misc.Raw.Data[1] = packet.Cast.Misc[1]; + spell->m_castFlagsEx |= CAST_FLAG_EX_USE_TOY_SPELL; + spell->prepare(&targets); +} + +void WorldSession::HandleToySetFavorite(WorldPackets::Toy::ToySetFavorite& packet) +{ + ToyBoxContainer::iterator itr = _toys.find(packet.ItemID); + if (itr == _toys.end()) + return; + + itr->second = packet.Favorite; +} diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 32ed156b226..678b2b72120 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -651,7 +651,9 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPackets::Trade::InitiateTrade& return; } - if (pOther->GetTeam() != _player->GetTeam() && + if ((pOther->GetTeam() != _player->GetTeam() || + pOther->HasFlag(PLAYER_FLAGS_EX, PLAYER_FLAGS_EX_MERCENARY_MODE) || + _player->HasFlag(PLAYER_FLAGS_EX, PLAYER_FLAGS_EX_MERCENARY_MODE)) && (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && !HasPermission(rbac::RBAC_PERM_ALLOW_TWO_SIDE_TRADE))) { diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index 4ad507895a4..ba8ad1dc056 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -52,7 +52,7 @@ void WorldSession::HandleVoidStorageUnlock(WorldPackets::VoidStorage::UnlockVoid void WorldSession::HandleVoidStorageQuery(WorldPackets::VoidStorage::QueryVoidStorage& queryVoidStorage) { - Creature* unit = _player->GetNPCIfCanInteractWith(queryVoidStorage.Npc, UNIT_NPC_FLAG_VAULTKEEPER); + Creature* unit = _player->GetNPCIfCanInteractWith(queryVoidStorage.Npc, UNIT_NPC_FLAG_TRANSMOGRIFIER | UNIT_NPC_FLAG_VAULTKEEPER); if (!unit) { TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageQuery - %s not found or player can't interact with it.", queryVoidStorage.Npc.ToString().c_str()); @@ -139,7 +139,10 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor return; } - std::pair<VoidStorageItem, uint8> depositItems[VOID_STORAGE_MAX_DEPOSIT]; + WorldPackets::VoidStorage::VoidStorageTransferChanges voidStorageTransferChanges; + voidStorageTransferChanges.AddedItems.reserve(VOID_STORAGE_MAX_DEPOSIT); + voidStorageTransferChanges.RemovedItems.reserve(VOID_STORAGE_MAX_DEPOSIT); + uint8 depositCount = 0; for (uint32 i = 0; i < voidStorageTransfer.Deposits.size(); ++i) { @@ -150,25 +153,25 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor continue; } - // TODO: Save these fields to database - for now disallow storing these items to prevent data loss - if (item->GetUInt32Value(ITEM_FIELD_MODIFIERS_MASK) || !item->GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS).empty()) - continue; - - VoidStorageItem itemVS(sObjectMgr->GenerateVoidStorageItemId(), item->GetEntry(), item->GetGuidValue(ITEM_FIELD_CREATOR), item->GetItemRandomPropertyId(), item->GetItemSuffixFactor()); + VoidStorageItem itemVS(sObjectMgr->GenerateVoidStorageItemId(), item->GetEntry(), item->GetGuidValue(ITEM_FIELD_CREATOR), + item->GetItemRandomPropertyId(), item->GetItemSuffixFactor(), item->GetModifier(ITEM_MODIFIER_UPGRADE_ID), item->GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS)); - uint8 slot = _player->AddVoidStorageItem(itemVS); + WorldPackets::VoidStorage::VoidItem voidItem; + voidItem.Guid = ObjectGuid::Create<HighGuid::Item>(itemVS.ItemId); + voidItem.Creator = item->GetGuidValue(ITEM_FIELD_CREATOR); + voidItem.Item.Initialize(&itemVS); + voidItem.Slot = _player->AddVoidStorageItem(std::move(itemVS)); - depositItems[depositCount++] = std::make_pair(itemVS, slot); + voidStorageTransferChanges.AddedItems.push_back(voidItem); _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); + ++depositCount; } int64 cost = depositCount * VOID_STORAGE_STORE_ITEM_COST; _player->ModifyMoney(-cost); - VoidStorageItem withdrawItems[VOID_STORAGE_MAX_WITHDRAW]; - uint8 withdrawCount = 0; for (uint32 i = 0; i < voidStorageTransfer.Withdrawals.size(); ++i) { uint8 slot = 0; @@ -188,32 +191,17 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor return; } - Item* item = _player->StoreNewItem(dest, itemVS->ItemEntry, true, itemVS->ItemRandomPropertyId); + Item* item = _player->StoreNewItem(dest, itemVS->ItemEntry, true, itemVS->ItemRandomPropertyId, GuidSet(), itemVS->BonusListIDs); item->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, itemVS->ItemSuffixFactor); item->SetGuidValue(ITEM_FIELD_CREATOR, itemVS->CreatorGuid); + item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, itemVS->ItemUpgradeId); item->SetBinding(true); - _player->SendNewItem(item, 1, false, false, false); - withdrawItems[withdrawCount++] = *itemVS; + voidStorageTransferChanges.RemovedItems.push_back(ObjectGuid::Create<HighGuid::Item>(itemVS->ItemId)); _player->DeleteVoidStorageItem(slot); } - WorldPackets::VoidStorage::VoidStorageTransferChanges voidStorageTransferChanges; - voidStorageTransferChanges.AddedItems.resize(depositCount); - voidStorageTransferChanges.RemovedItems.resize(withdrawCount); - - for (uint8 i = 0; i < depositCount; ++i) - { - voidStorageTransferChanges.AddedItems[i].Guid = ObjectGuid::Create<HighGuid::Item>(depositItems[i].first.ItemId); - voidStorageTransferChanges.AddedItems[i].Creator = depositItems[i].first.CreatorGuid; - voidStorageTransferChanges.AddedItems[i].Slot = depositItems[i].second; - voidStorageTransferChanges.AddedItems[i].Item.Initialize(&depositItems[i].first); - } - - for (uint8 i = 0; i < withdrawCount; ++i) - voidStorageTransferChanges.RemovedItems[i] = ObjectGuid::Create<HighGuid::Item>(withdrawItems[i].ItemId); - SendPacket(voidStorageTransferChanges.Write()); SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_NO_ERROR); diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 189b620b805..9ef0f8c7c57 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -913,7 +913,7 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* v WorldPackets::Loot::LootItemData lootItem; lootItem.LootListID = packet.Items.size()+1; - lootItem.LootItemType = slot_type; + lootItem.UIType = slot_type; lootItem.Quantity = items[i].count; lootItem.Loot.Initialize(items[i]); packet.Items.push_back(lootItem); @@ -933,7 +933,7 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* v WorldPackets::Loot::LootItemData lootItem; lootItem.LootListID = packet.Items.size()+1; - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = LOOT_SLOT_TYPE_ALLOW_LOOT; lootItem.Quantity = items[i].count; lootItem.Loot.Initialize(items[i]); packet.Items.push_back(lootItem); @@ -950,7 +950,7 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* v { WorldPackets::Loot::LootItemData lootItem; lootItem.LootListID = packet.Items.size()+1; - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = permission == OWNER_PERMISSION ? LOOT_SLOT_TYPE_OWNER : LOOT_SLOT_TYPE_ALLOW_LOOT; lootItem.Quantity = items[i].count; lootItem.Loot.Initialize(items[i]); packet.Items.push_back(lootItem); @@ -962,6 +962,7 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* v return; } + LootSlotType slotType = permission == OWNER_PERMISSION ? LOOT_SLOT_TYPE_OWNER : LOOT_SLOT_TYPE_ALLOW_LOOT; QuestItemMap const& lootPlayerQuestItems = GetPlayerQuestItems(); QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(viewer->GetGUID().GetCounter()); if (q_itr != lootPlayerQuestItems.end()) @@ -982,25 +983,25 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* v switch (permission) { case MASTER_PERMISSION: - lootItem.LootItemType = LOOT_SLOT_TYPE_MASTER; + lootItem.UIType = LOOT_SLOT_TYPE_MASTER; break; case RESTRICTED_PERMISSION: - lootItem.LootItemType = item.is_blocked ? LOOT_SLOT_TYPE_LOCKED : LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = item.is_blocked ? LOOT_SLOT_TYPE_LOCKED : LOOT_SLOT_TYPE_ALLOW_LOOT; break; case GROUP_PERMISSION: case ROUND_ROBIN_PERMISSION: if (!item.is_blocked) - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = LOOT_SLOT_TYPE_ALLOW_LOOT; else - lootItem.LootItemType = LOOT_SLOT_TYPE_ROLL_ONGOING; + lootItem.UIType = LOOT_SLOT_TYPE_ROLL_ONGOING; break; default: - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = slotType; break; } } else - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = slotType; packet.Items.push_back(lootItem); } @@ -1019,7 +1020,7 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* v { WorldPackets::Loot::LootItemData lootItem; lootItem.LootListID = packet.Items.size()+1; - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = slotType; lootItem.Quantity = item.count; lootItem.Loot.Initialize(item); packet.Items.push_back(lootItem); @@ -1047,25 +1048,25 @@ void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* v switch (permission) { case MASTER_PERMISSION: - lootItem.LootItemType = LOOT_SLOT_TYPE_MASTER; + lootItem.UIType = LOOT_SLOT_TYPE_MASTER; break; case RESTRICTED_PERMISSION: - lootItem.LootItemType = item.is_blocked ? LOOT_SLOT_TYPE_LOCKED : LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = item.is_blocked ? LOOT_SLOT_TYPE_LOCKED : LOOT_SLOT_TYPE_ALLOW_LOOT; break; case GROUP_PERMISSION: case ROUND_ROBIN_PERMISSION: if (!item.is_blocked) - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = LOOT_SLOT_TYPE_ALLOW_LOOT; else - lootItem.LootItemType = LOOT_SLOT_TYPE_ROLL_ONGOING; + lootItem.UIType = LOOT_SLOT_TYPE_ROLL_ONGOING; break; default: - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = slotType; break; } } else - lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT; + lootItem.UIType = slotType; packet.Items.push_back(lootItem); } diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index 0c5bdc496c8..5610c876f2d 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -121,11 +121,11 @@ enum LootError // type of Loot Item in Loot View enum LootSlotType { - LOOT_SLOT_TYPE_ALLOW_LOOT = 0, // player can loot the item. - LOOT_SLOT_TYPE_ROLL_ONGOING = 1, // roll is ongoing. player cannot loot. - LOOT_SLOT_TYPE_MASTER = 2, // item can only be distributed by group loot master. - LOOT_SLOT_TYPE_LOCKED = 3, // item is shown in red. player cannot loot. - LOOT_SLOT_TYPE_OWNER = 4 // ignore binding confirmation and etc, for single player looting (6.x no longer used) + LOOT_SLOT_TYPE_ALLOW_LOOT = 2, // player can loot the item. + LOOT_SLOT_TYPE_ROLL_ONGOING = 6, // roll is ongoing. player cannot loot. + LOOT_SLOT_TYPE_MASTER = 4, // item can only be distributed by group loot master. + LOOT_SLOT_TYPE_LOCKED = 1, // item is shown in red. player cannot loot. + LOOT_SLOT_TYPE_OWNER = 7 // ignore binding confirmation and etc, for single player looting }; class Player; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 1fdd92de91c..b10d6aa6896 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3564,9 +3564,10 @@ void Map::LoadCorpseData() PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CORPSE_PHASES); stmt->setUInt32(0, GetId()); + stmt->setUInt32(1, GetInstanceId()); // 0 1 - // SELECT OwnerGuid, PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? + // SELECT OwnerGuid, PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ? PreparedQueryResult phaseResult = CharacterDatabase.Query(stmt); if (phaseResult) { @@ -3583,9 +3584,10 @@ void Map::LoadCorpseData() stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CORPSES); stmt->setUInt32(0, GetId()); + stmt->setUInt32(1, GetInstanceId()); // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? + // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) return; @@ -3619,8 +3621,10 @@ void Map::LoadCorpseData() void Map::DeleteCorpseData() { + // DELETE cp, c FROM corpse_phases cp INNER JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ? PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CORPSES_FROM_MAP); stmt->setUInt32(0, GetId()); + stmt->setUInt32(1, GetInstanceId()); CharacterDatabase.Execute(stmt); } diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 2df1c9fb0ef..61d08908b78 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -99,7 +99,7 @@ typedef std::map<uint32, TransportAnimation> TransportAnimationContainer; class TransportMgr { - friend void DB2Manager::LoadStores(std::string const&); + friend void DB2Manager::LoadStores(std::string const&, uint32); public: static TransportMgr* instance() diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 2320c6ccc6f..f13630188a9 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -839,7 +839,7 @@ enum SpellAttr13 SPELL_ATTR13_UNK15 = 0x00008000, // 15 SPELL_ATTR13_UNK16 = 0x00010000, // 16 SPELL_ATTR13_UNK17 = 0x00020000, // 17 - SPELL_ATTR13_UNK18 = 0x00040000, // 18 + SPELL_ATTR13_ACTIVATES_REQUIRED_SHAPESHIFT = 0x00040000, // 18 SPELL_ATTR13_UNK19 = 0x00080000, // 19 SPELL_ATTR13_UNK20 = 0x00100000, // 20 SPELL_ATTR13_UNK21 = 0x00200000, // 21 @@ -1262,7 +1262,7 @@ enum SpellEffectName TOTAL_SPELL_EFFECTS = 252, }; -enum SpellCastResult // 20201 +enum SpellCastResult // 20444 { SPELL_FAILED_SUCCESS = 0, SPELL_FAILED_AFFECTING_COMBAT = 1, @@ -1458,81 +1458,83 @@ enum SpellCastResult // 20201 SPELL_FAILED_FLIGHT_MASTER_RIDING_REQUIREMENT = 191, SPELL_FAILED_CS_RIDING_REQUIREMENT = 192, SPELL_FAILED_PANDA_RIDING_REQUIREMENT = 193, - SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 194, - SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 195, - SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 196, - SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 197, - SPELL_FAILED_NOT_IDLE = 198, - SPELL_FAILED_NOT_INACTIVE = 199, - SPELL_FAILED_PARTIAL_PLAYTIME = 200, - SPELL_FAILED_NO_PLAYTIME = 201, - SPELL_FAILED_NOT_IN_BATTLEGROUND = 202, - SPELL_FAILED_NOT_IN_RAID_INSTANCE = 203, - SPELL_FAILED_ONLY_IN_ARENA = 204, - SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 205, - SPELL_FAILED_ON_USE_ENCHANT = 206, - SPELL_FAILED_NOT_ON_GROUND = 207, - SPELL_FAILED_CUSTOM_ERROR = 208, - SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 209, - SPELL_FAILED_TOO_MANY_SOCKETS = 210, - SPELL_FAILED_INVALID_GLYPH = 211, - SPELL_FAILED_UNIQUE_GLYPH = 212, - SPELL_FAILED_GLYPH_SOCKET_LOCKED = 213, - SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 214, - SPELL_FAILED_GLYPH_INVALID_SPEC = 215, - SPELL_FAILED_GLYPH_NO_SPEC = 216, - SPELL_FAILED_NO_VALID_TARGETS = 217, - SPELL_FAILED_ITEM_AT_MAX_CHARGES = 218, - SPELL_FAILED_NOT_IN_BARBERSHOP = 219, - SPELL_FAILED_FISHING_TOO_LOW = 220, - SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 221, - SPELL_FAILED_SUMMON_PENDING = 222, - SPELL_FAILED_MAX_SOCKETS = 223, - SPELL_FAILED_PET_CAN_RENAME = 224, - SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 225, - SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 226, - SPELL_FAILED_NO_ACTIONS = 227, - SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 228, - SPELL_FAILED_WEIGHT_NOT_ENOUGH = 229, - SPELL_FAILED_WEIGHT_TOO_MUCH = 230, - SPELL_FAILED_NO_VACANT_SEAT = 231, - SPELL_FAILED_NO_LIQUID = 232, - SPELL_FAILED_ONLY_NOT_SWIMMING = 233, - SPELL_FAILED_BY_NOT_MOVING = 234, - SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 235, - SPELL_FAILED_NOT_IN_ARENA = 236, - SPELL_FAILED_TARGET_NOT_GROUNDED = 237, - SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 238, - SPELL_FAILED_NOT_IN_LFG_DUNGEON = 239, - SPELL_FAILED_BAD_TARGET_FILTER = 240, - SPELL_FAILED_NOT_ENOUGH_TARGETS = 241, - SPELL_FAILED_NO_SPEC = 242, - SPELL_FAILED_CANT_ADD_BATTLE_PET = 243, - SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 244, - SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 245, - SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 246, - SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 247, - SPELL_FAILED_MAX_LEVEL_TOO_LOW = 248, - SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 249, - GRANT_PET_LEVEL_FAIL = 250, - SPELL_FAILED_SKILL_LINE_NOT_KNOWN = 251, - SPELL_FAILED_BLUEPRINT_KNOWN = 252, - SPELL_FAILED_FOLLOWER_KNOWN = 253, - SPELL_FAILED_CANT_OVERRIDE_ENCHANT_VISUAL = 254, - SPELL_FAILED_ITEM_NOT_A_WEAPON = 255, - SPELL_FAILED_SAME_ENCHANT_VISUAL = 256, - SPELL_FAILED_TOY_USE_LIMIT_REACHED = 257, - SPELL_FAILED_TOY_ALREADY_KNOWN = 258, - SPELL_FAILED_SHIPMENTS_FULL = 259, - SPELL_FAILED_NO_SHIPMENTS_FOR_CONTAINER = 260, - SPELL_FAILED_NO_BUILDING_FOR_SHIPMENT = 261, - SPELL_FAILED_NOT_ENOUGH_SHIPMENTS_FOR_CONTAINER = 262, - SPELL_FAILED_HAS_MISSION = 263, - SPELL_FAILED_BUILDING_ACTIVATE_NOT_READY = 264, - SPELL_FAILED_NOT_SOULBOUND = 265, - SPELL_FAILED_RIDING_VEHICLE = 266, - SPELL_FAILED_VETERAN_TRIAL_ABOVE_SKILL_RANK_MAX = 267, - SPELL_FAILED_UNKNOWN = 268, + SPELL_FAILED_DRAENOR_RIDING_REQUIREMENT = 194, + SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 195, + SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 196, + SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 197, + SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 198, + SPELL_FAILED_NOT_IDLE = 199, + SPELL_FAILED_NOT_INACTIVE = 200, + SPELL_FAILED_PARTIAL_PLAYTIME = 201, + SPELL_FAILED_NO_PLAYTIME = 202, + SPELL_FAILED_NOT_IN_BATTLEGROUND = 203, + SPELL_FAILED_NOT_IN_RAID_INSTANCE = 204, + SPELL_FAILED_ONLY_IN_ARENA = 205, + SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 206, + SPELL_FAILED_ON_USE_ENCHANT = 207, + SPELL_FAILED_NOT_ON_GROUND = 208, + SPELL_FAILED_CUSTOM_ERROR = 209, + SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 210, + SPELL_FAILED_TOO_MANY_SOCKETS = 211, + SPELL_FAILED_INVALID_GLYPH = 212, + SPELL_FAILED_UNIQUE_GLYPH = 213, + SPELL_FAILED_GLYPH_SOCKET_LOCKED = 214, + SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 215, + SPELL_FAILED_GLYPH_INVALID_SPEC = 216, + SPELL_FAILED_GLYPH_NO_SPEC = 217, + SPELL_FAILED_NO_VALID_TARGETS = 218, + SPELL_FAILED_ITEM_AT_MAX_CHARGES = 219, + SPELL_FAILED_NOT_IN_BARBERSHOP = 220, + SPELL_FAILED_FISHING_TOO_LOW = 221, + SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 222, + SPELL_FAILED_SUMMON_PENDING = 223, + SPELL_FAILED_MAX_SOCKETS = 224, + SPELL_FAILED_PET_CAN_RENAME = 225, + SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 226, + SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 227, + SPELL_FAILED_NO_ACTIONS = 228, + SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 229, + SPELL_FAILED_WEIGHT_NOT_ENOUGH = 230, + SPELL_FAILED_WEIGHT_TOO_MUCH = 231, + SPELL_FAILED_NO_VACANT_SEAT = 232, + SPELL_FAILED_NO_LIQUID = 233, + SPELL_FAILED_ONLY_NOT_SWIMMING = 234, + SPELL_FAILED_BY_NOT_MOVING = 235, + SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 236, + SPELL_FAILED_NOT_IN_ARENA = 237, + SPELL_FAILED_TARGET_NOT_GROUNDED = 238, + SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 239, + SPELL_FAILED_NOT_IN_LFG_DUNGEON = 240, + SPELL_FAILED_BAD_TARGET_FILTER = 241, + SPELL_FAILED_NOT_ENOUGH_TARGETS = 242, + SPELL_FAILED_NO_SPEC = 243, + SPELL_FAILED_CANT_ADD_BATTLE_PET = 244, + SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 245, + SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 246, + SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 247, + SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 248, + SPELL_FAILED_MAX_LEVEL_TOO_LOW = 249, + SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 250, + GRANT_PET_LEVEL_FAIL = 251, + SPELL_FAILED_SKILL_LINE_NOT_KNOWN = 252, + SPELL_FAILED_BLUEPRINT_KNOWN = 253, + SPELL_FAILED_FOLLOWER_KNOWN = 254, + SPELL_FAILED_CANT_OVERRIDE_ENCHANT_VISUAL = 255, + SPELL_FAILED_ITEM_NOT_A_WEAPON = 256, + SPELL_FAILED_SAME_ENCHANT_VISUAL = 257, + SPELL_FAILED_TOY_USE_LIMIT_REACHED = 258, + SPELL_FAILED_TOY_ALREADY_KNOWN = 259, + SPELL_FAILED_SHIPMENTS_FULL = 260, + SPELL_FAILED_NO_SHIPMENTS_FOR_CONTAINER = 261, + SPELL_FAILED_NO_BUILDING_FOR_SHIPMENT = 262, + SPELL_FAILED_NOT_ENOUGH_SHIPMENTS_FOR_CONTAINER = 263, + SPELL_FAILED_HAS_MISSION = 264, + SPELL_FAILED_BUILDING_ACTIVATE_NOT_READY = 265, + SPELL_FAILED_NOT_SOULBOUND = 266, + SPELL_FAILED_RIDING_VEHICLE = 267, + SPELL_FAILED_VETERAN_TRIAL_ABOVE_SKILL_RANK_MAX = 268, + SPELL_FAILED_NOT_WHILE_MERCENARY = 269, + SPELL_FAILED_UNKNOWN = 270, SPELL_CAST_OK = 0xFFFF // custom value, must not be sent to client }; @@ -4669,32 +4671,32 @@ enum SpellFamilyNames enum TradeStatus { - TRADE_STATUS_DEAD = 0, - TRADE_STATUS_WRONG_FACTION = 1, - TRADE_STATUS_STATE_CHANGED = 2, - TRADE_STATUS_NOT_ENOUGH_CURRENCY = 3, - TRADE_STATUS_CURRENCY_NOT_TRADABLE = 4, - TRADE_STATUS_TOO_FAR_AWAY = 5, - TRADE_STATUS_RESTRICTED_ACCOUNT = 6, + TRADE_STATUS_CURRENCY_NOT_TRADABLE = 0, + TRADE_STATUS_PROPOSED = 1, + TRADE_STATUS_COMPLETE = 2, + TRADE_STATUS_INITIATED = 3, + TRADE_STATUS_DEAD = 4, + TRADE_STATUS_RESTRICTED_ACCOUNT = 5, + TRADE_STATUS_TOO_FAR_AWAY = 6, + TRADE_STATUS_LOGGING_OUT = 7, TRADE_STATUS_ACCEPTED = 8, - TRADE_STATUS_TARGET_DEAD = 9, - TRADE_STATUS_INITIATED = 10, - TRADE_STATUS_TARGET_STUNNED = 11, - TRADE_STATUS_LOGGING_OUT = 12, - TRADE_STATUS_UNACCEPTED = 13, + TRADE_STATUS_ALREADY_TRADING = 9, + TRADE_STATUS_PETITION = 10, + TRADE_STATUS_TARGET_DEAD = 11, + TRADE_STATUS_STATE_CHANGED = 12, TRADE_STATUS_NOT_ON_TAPLIST = 14, - TRADE_STATUS_COMPLETE = 16, - TRADE_STATUS_PLAYER_IGNORED = 17, - TRADE_STATUS_ALREADY_TRADING = 19, - TRADE_STATUS_TARGET_LOGGING_OUT = 20, - TRADE_STATUS_FAILED = 21, - TRADE_STATUS_PLAYER_BUSY = 22, - TRADE_STATUS_PROPOSED = 23, - TRADE_STATUS_PETITION = 25, - TRADE_STATUS_CANCELLED = 26, - TRADE_STATUS_WRONG_REALM = 28, - TRADE_STATUS_STUNNED = 30, - TRADE_STATUS_NO_TARGET = 31 + TRADE_STATUS_TARGET_LOGGING_OUT = 15, + TRADE_STATUS_WRONG_REALM = 17, + TRADE_STATUS_PLAYER_IGNORED = 18, + TRADE_STATUS_UNACCEPTED = 19, + TRADE_STATUS_TARGET_STUNNED = 21, + TRADE_STATUS_NO_TARGET = 22, + TRADE_STATUS_NOT_ENOUGH_CURRENCY = 23, + TRADE_STATUS_FAILED = 24, + TRADE_STATUS_CANCELLED = 25, + TRADE_STATUS_PLAYER_BUSY = 28, + TRADE_STATUS_WRONG_FACTION = 30, + TRADE_STATUS_STUNNED = 31, }; enum XPColorChar @@ -4887,35 +4889,6 @@ enum PartyResult ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 30 }; -const uint32 MMAP_MAGIC = 0x4d4d4150; // 'MMAP' -#define MMAP_VERSION 7 - -struct MmapTileHeader -{ - uint32 mmapMagic; - uint32 dtVersion; - uint32 mmapVersion; - uint32 size; - bool usesLiquids : 1; - - MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION), - mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) { } -}; - -enum NavTerrain -{ - NAV_EMPTY = 0x00, - NAV_GROUND = 0x01, - NAV_MAGMA = 0x02, - NAV_SLIME = 0x04, - NAV_WATER = 0x08, - NAV_UNUSED1 = 0x10, - NAV_UNUSED2 = 0x20, - NAV_UNUSED3 = 0x40, - NAV_UNUSED4 = 0x80 - // we only have 8 bits -}; - enum DiminishingLevels { DIMINISHING_LEVEL_1 = 0, diff --git a/src/server/game/Movement/PathGenerator.h b/src/server/game/Movement/PathGenerator.h index a9a13c37251..71e0e88f0b2 100644 --- a/src/server/game/Movement/PathGenerator.h +++ b/src/server/game/Movement/PathGenerator.h @@ -19,7 +19,7 @@ #ifndef _PATH_GENERATOR_H #define _PATH_GENERATOR_H -#include "SharedDefines.h" +#include "MapDefines.h" #include "DetourNavMesh.h" #include "DetourNavMeshQuery.h" #include "MoveSplineInitArgs.h" diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index 5fea62655b3..3aff27324a3 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -294,7 +294,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi { float spillOverRepOut = float(standing); // check for sub-factions that receive spillover - SimpleFactionsList const* flist = GetFactionTeamList(factionEntry->ID); + std::vector<uint32> const* flist = GetFactionTeamList(factionEntry->ID); // if has no sub-factions, check for factions with same parent if (!flist && factionEntry->ParentFactionID && factionEntry->ParentFactionModOut != 0.0f) { @@ -316,7 +316,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi if (flist) { // Spillover to affiliated factions - for (SimpleFactionsList::const_iterator itr = flist->begin(); itr != flist->end(); ++itr) + for (std::vector<uint32>::const_iterator itr = flist->begin(); itr != flist->end(); ++itr) { if (FactionEntry const* factionEntryCalc = sFactionStore.LookupEntry(*itr)) { diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 74f558baa73..09df8927144 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -318,258 +318,258 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write() uint8* hmac = hmacHash.GetDigest(); - payload << uint8(PiDigits[31]); - payload << uint8(Haiku[24]); - payload << uint8(address[2]); - payload << uint8(address[1]); - payload << uint8(PiDigits[90]); - payload << uint8(Haiku[28]); - payload << uint8(PiDigits[89]); - payload << uint8(PiDigits[68]); - payload << uint8(PiDigits[39]); + payload << uint8(PiDigits[17]); + payload << uint8(Haiku[63]); + payload << uint8(address[8]); + payload << uint8(hmac[19]); + payload << uint8(PiDigits[104]); + payload << uint8(Haiku[17]); payload << uint8(Payload.PanamaKey[3]); - payload << uint8(PiDigits[64]); - payload << uint8(Payload.PanamaKey[31]); - payload << uint8(PiDigits[73]); - payload << uint8(Payload.PanamaKey[17]); - payload << uint8(hmac[8]); - payload << uint8(Haiku[58]); - payload << uint8(Haiku[16]); - payload << uint8(PiDigits[36]); - payload << uint8(PiDigits[23]); - payload << uint8(PiDigits[84]); - payload << uint8(PiDigits[91]); - payload << uint8(Haiku[42]); - payload << uint8(Haiku[46]); - payload << uint8(PiDigits[81]); - payload << uint8(hmac[5]); - payload << uint8(Haiku[35]); - payload << uint8(Haiku[3]); - payload << uint8(Haiku[54]); - payload << uint8(PiDigits[9]); + payload << uint8(Payload.PanamaKey[20]); + payload << uint8(Haiku[60]); + payload << uint8(Haiku[24]); + payload << uint8(PiDigits[63]); + payload << uint8(Payload.PanamaKey[5]); + payload << uint8(PiDigits[82]); + payload << uint8(Haiku[65]); payload << uint8(PiDigits[26]); - payload << uint8(Haiku[20]); - payload << uint8(Haiku[53]); - payload << uint8(Payload.PanamaKey[2]); payload << uint8(PiDigits[42]); - payload << uint8(PiDigits[99]); - payload << uint8(address[13]); - payload << uint8(PiDigits[59]); - payload << uint8(PiDigits[18]); - payload << uint8(PiDigits[44]); - payload << uint8(PiDigits[49]); - payload << uint8(address[4]); - payload << uint8(PiDigits[106]); - payload << uint8(Payload.PanamaKey[24]); payload << uint8(PiDigits[107]); + payload << uint8(PiDigits[33]); + payload << uint8(PiDigits[60]); + payload << uint8(PiDigits[36]); + payload << uint8(Payload.PanamaKey[30]); + payload << uint8(Haiku[6]); + payload << uint8(PiDigits[49]); + payload << uint8(PiDigits[12]); + payload << uint8(Haiku[43]); + payload << uint8(Haiku[13]); + payload << uint8(Payload.PanamaKey[31]); + payload << uint8(PiDigits[6]); + payload << uint8(PiDigits[15]); + payload << uint8(address[3]); + payload << uint8(PiDigits[76]); + payload << uint8(PiDigits[84]); + payload << uint8(PiDigits[9]); + payload << uint8(Haiku[29]); + payload << uint8(Payload.PanamaKey[15]); + payload << uint8(Payload.XorMagic); + payload << uint8(PiDigits[64]); + payload << uint8(addressType); + payload << uint8(address[0]); + payload << uint8(PiDigits[100]); + payload << uint8(hmac[16]); + payload << uint8(PiDigits[77]); payload << uint8(Payload.PanamaKey[4]); - payload << uint8(Haiku[0]); - payload << uint8(Haiku[7]); - payload << uint8(PiDigits[74]); - payload << uint8(PiDigits[85]); payload << uint8(hmac[2]); - payload << uint8(Haiku[51]); - payload << uint8(PiDigits[22]); - payload << uint8(Payload.PanamaKey[8]); - payload << uint8(PiDigits[92]); - payload << uint8(Haiku[32]); - payload << uint8(Haiku[41]); - payload << uint32(Payload.Adler32); - payload << uint8(PiDigits[52]); - payload << uint8(Haiku[9]); - payload << uint8(PiDigits[61]); - payload << uint8(PiDigits[5]); - payload << uint8(hmac[0]); + payload << uint8(Haiku[59]); + payload << uint8(Haiku[20]); + payload << uint8(PiDigits[54]); + payload << uint8(Haiku[37]); + payload << uint8(PiDigits[35]); + payload << uint8(Payload.PanamaKey[16]); payload << uint8(hmac[7]); + payload << uint8(Payload.PanamaKey[9]); + payload << uint8(Payload.PanamaKey[0]); + payload << uint8(PiDigits[56]); + payload << uint8(PiDigits[90]); payload << uint8(PiDigits[83]); + payload << uint8(PiDigits[23]); + payload << uint8(PiDigits[38]); + payload << uint8(hmac[5]); + payload << uint8(Payload.PanamaKey[23]); + payload << uint8(Haiku[54]); + payload << uint8(Haiku[8]); + payload << uint8(PiDigits[27]); + payload << uint8(Payload.PanamaKey[29]); + payload << uint8(PiDigits[16]); + payload << uint8(PiDigits[96]); + payload << uint8(Haiku[51]); payload << uint8(hmac[10]); - payload << uint8(hmac[3]); payload << uint8(PiDigits[34]); - payload << uint8(address[8]); - payload << uint8(PiDigits[15]); payload << uint8(Haiku[39]); - payload << uint8(PiDigits[103]); - payload << uint8(hmac[15]); - payload << uint8(Haiku[11]); - payload << uint8(PiDigits[54]); - payload << uint8(Haiku[68]); - payload << uint8(PiDigits[4]); - payload << uint8(Haiku[2]); - payload << uint8(addressType); + payload << uint8(Haiku[5]); + payload << uint8(PiDigits[5]); payload << uint8(Haiku[52]); - payload << uint8(PiDigits[105]); - payload << uint8(Payload.PanamaKey[21]); - payload << uint8(Payload.XorMagic); - payload << uint8(hmac[1]); - payload << uint8(PiDigits[30]); - payload << uint8(PiDigits[2]); - payload << uint8(PiDigits[101]); - payload << uint8(PiDigits[8]); - payload << uint8(address[10]); - payload << uint8(Payload.PanamaKey[27]); - payload << uint8(hmac[16]); - payload << uint8(Payload.PanamaKey[6]); + payload << uint8(Haiku[15]); payload << uint8(PiDigits[98]); - payload << uint8(PiDigits[104]); - payload << uint8((port >> 8) & 0xFF); - payload << uint8(address[6]); - payload << uint8(Payload.PanamaKey[12]); - payload << uint8(PiDigits[50]); - payload << uint8(Haiku[19]); - payload << uint8(PiDigits[1]); - payload << uint8(PiDigits[82]); - payload << uint8(PiDigits[35]); - payload << uint8(PiDigits[14]); - payload << uint8(hmac[19]); - payload << uint8(PiDigits[40]); - payload << uint8(PiDigits[62]); - payload << uint8(PiDigits[72]); payload << uint8(PiDigits[80]); - payload << uint8(Haiku[31]); + payload << uint8(hmac[18]); + payload << uint8(PiDigits[62]); + payload << uint8(address[15]); + payload << uint8(Haiku[16]); + payload << uint8(PiDigits[105]); + payload << uint8(Haiku[25]); + payload << uint8(Haiku[48]); + payload << uint8(PiDigits[58]); + payload << uint8((port >> 8) & 0xFF); + payload << uint8(Haiku[46]); + payload << uint8(PiDigits[87]); + payload << uint8(Haiku[34]); + payload << uint8(Haiku[58]); + payload << uint8(Haiku[7]); payload << uint8(PiDigits[47]); - payload << uint8(PiDigits[60]); - payload << uint8(PiDigits[19]); - payload << uint8(Payload.PanamaKey[14]); - payload << uint8(PiDigits[67]); + payload << uint8(PiDigits[2]); + payload << uint8(address[7]); + payload << uint8(PiDigits[93]); + payload << uint8(address[1]); + payload << uint8(PiDigits[73]); + payload << uint8(Haiku[40]); payload << uint8(Payload.PanamaKey[13]); - payload << uint8(Payload.PanamaKey[18]); - payload << uint8(PiDigits[16]); - payload << uint8(address[12]); + payload << uint8(PiDigits[46]); + payload << uint8(address[9]); + payload << uint8(hmac[4]); + payload << uint8(Haiku[28]); + payload << uint8(Haiku[67]); + payload << uint8(Haiku[53]); + payload << uint8(Haiku[56]); + payload << uint8(Payload.PanamaKey[7]); + payload << uint8(Haiku[57]); + payload << uint8(Haiku[45]); + payload << uint8(PiDigits[24]); + payload << uint8(PiDigits[19]); + payload << uint8(PiDigits[10]); + payload << uint8(hmac[12]); + payload << uint8(hmac[8]); + payload << uint8(PiDigits[85]); + payload << uint8(Haiku[32]); + payload << uint8(PiDigits[7]); + payload << uint8(PiDigits[74]); + payload << uint8(PiDigits[21]); + payload << uint8(PiDigits[55]); + payload << uint8(hmac[6]); + payload << uint8(Haiku[2]); + payload << uint8(PiDigits[22]); + payload << uint8(hmac[17]); + payload << uint8(PiDigits[14]); + payload << uint8(hmac[1]); + payload << uint8(PiDigits[99]); + payload << uint8(Haiku[27]); + payload << uint8(Haiku[35]); payload << uint8(port & 0xFF); - payload << uint8(Haiku[36]); - payload << uint8(Haiku[44]); - payload << uint8(PiDigits[77]); + payload << uint8(Payload.PanamaKey[24]); + payload << uint8(Haiku[49]); payload << uint8(Haiku[61]); - payload << uint8(PiDigits[20]); - payload << uint8(PiDigits[0]); - payload << uint8(hmac[12]); - payload << uint8(PiDigits[12]); - payload << uint8(address[9]); - payload << uint8(PiDigits[100]); - payload << uint8(hmac[11]); - payload << uint8(hmac[13]); - payload << uint8(Haiku[37]); + payload << uint8(address[4]); + payload << uint8(Haiku[36]); + payload << uint8(Haiku[22]); + payload << uint8(PiDigits[40]); + payload << uint8(Payload.PanamaKey[22]); + payload << uint8(Haiku[10]); + payload << uint8(PiDigits[31]); + payload << uint8(Payload.PanamaKey[14]); payload << uint8(Haiku[70]); - payload << uint8(Haiku[63]); - payload << uint8(PiDigits[93]); - payload << uint8(Haiku[18]); - payload << uint8(Haiku[15]); - payload << uint8(Payload.PanamaKey[28]); - payload << uint8(Haiku[23]); - payload << uint8(hmac[17]); - payload << uint8(PiDigits[65]); - payload << uint8(PiDigits[27]); + payload << uint8(PiDigits[97]); + payload << uint8(PiDigits[0]); + payload << uint8(Haiku[55]); + payload << uint8(PiDigits[68]); + payload << uint8(PiDigits[81]); + payload << uint32(Payload.Adler32); + payload << uint8(PiDigits[48]); + payload << uint8(Haiku[0]); + payload << uint8(PiDigits[72]); + payload << uint8(Haiku[66]); + payload << uint8(address[13]); + payload << uint8(PiDigits[71]); payload << uint8(PiDigits[57]); - payload << uint8(address[11]); - payload << uint8(PiDigits[17]); - payload << uint8(Payload.PanamaKey[20]); - payload << uint8(Haiku[64]); - payload << uint8(Payload.PanamaKey[5]); - payload << uint8(PiDigits[41]); - payload << uint8(PiDigits[25]); - payload << uint8(address[5]); - payload << uint8(PiDigits[37]); - payload << uint8(PiDigits[46]); - payload << uint8(Haiku[65]); - payload << uint8(Haiku[12]); - payload << uint8(PiDigits[95]); - payload << uint8(PiDigits[96]); - payload << uint8(PiDigits[94]); - payload << uint8(Haiku[43]); - payload << uint8(PiDigits[10]); payload << uint8(PiDigits[86]); - payload << uint8(Haiku[10]); - payload << uint8(Payload.PanamaKey[15]); + payload << uint8(Haiku[1]); + payload << uint8(Haiku[18]); + payload << uint8(address[11]); payload << uint8(PiDigits[75]); - payload << uint8(Haiku[5]); - payload << uint8(Haiku[25]); - payload << uint8(PiDigits[33]); - payload << uint8(Haiku[6]); - payload << uint8(Payload.PanamaKey[30]); - payload << uint8(hmac[6]); - payload << uint8(Haiku[59]); - payload << uint8(PiDigits[45]); - payload << uint8(Haiku[57]); - payload << uint8(Haiku[29]); - payload << uint8(Haiku[14]); - payload << uint8(Haiku[30]); - payload << uint8(PiDigits[66]); - payload << uint8(PiDigits[3]); - payload << uint8(hmac[18]); - payload << uint8(Haiku[17]); - payload << uint8(PiDigits[21]); - payload << uint8(Haiku[4]); - payload << uint8(Haiku[26]); - payload << uint8(Haiku[45]); + payload << uint8(PiDigits[92]); + payload << uint8(Haiku[38]); + payload << uint8(PiDigits[53]); payload << uint8(address[14]); payload << uint8(PiDigits[69]); - payload << uint8(PiDigits[38]); - payload << uint8(Haiku[38]); - payload << uint8(PiDigits[63]); - payload << uint8(PiDigits[6]); - payload << uint8(Haiku[62]); - payload << uint8(Haiku[55]); - payload << uint8(Haiku[60]); - payload << uint8(address[15]); - payload << uint8(PiDigits[97]); - payload << uint8(PiDigits[87]); - payload << uint8(PiDigits[78]); - payload << uint8(Haiku[34]); - payload << uint8(hmac[14]); - payload << uint8(PiDigits[88]); - payload << uint8(Payload.PanamaKey[7]); - payload << uint8(hmac[4]); - payload << uint8(Haiku[8]); - payload << uint8(Payload.PanamaKey[29]); - payload << uint8(PiDigits[24]); - payload << uint8(Payload.PanamaKey[1]); + payload << uint8(Payload.PanamaKey[10]); + payload << uint8(Haiku[26]); + payload << uint8(PiDigits[52]); payload << uint8(Haiku[69]); - payload << uint8(Haiku[47]); - payload << uint8(hmac[9]); - payload << uint8(Payload.PanamaKey[26]); - payload << uint8(Haiku[40]); - payload << uint8(Haiku[48]); + payload << uint8(PiDigits[91]); + payload << uint8(PiDigits[18]); + payload << uint8(PiDigits[45]); + payload << uint8(PiDigits[43]); + payload << uint8(Haiku[3]); + payload << uint8(PiDigits[3]); + payload << uint8(hmac[0]); payload << uint8(PiDigits[28]); - payload << uint8(Haiku[50]); - payload << uint8(Payload.PanamaKey[25]); + payload << uint8(PiDigits[29]); + payload << uint8(PiDigits[67]); + payload << uint8(Haiku[62]); + payload << uint8(Payload.PanamaKey[11]); + payload << uint8(Payload.PanamaKey[1]); + payload << uint8(Haiku[41]); + payload << uint8(Payload.PanamaKey[17]); payload << uint8(PiDigits[102]); - payload << uint8(PiDigits[53]); - payload << uint8(Haiku[56]); - payload << uint8(PiDigits[56]); - payload << uint8(PiDigits[32]); + payload << uint8(PiDigits[101]); + payload << uint8(PiDigits[4]); payload << uint8(PiDigits[79]); - payload << uint8(Payload.PanamaKey[0]); - payload << uint8(Payload.PanamaKey[10]); - payload << uint8(Haiku[21]); - payload << uint8(Haiku[27]); - payload << uint8(PiDigits[7]); - payload << uint8(PiDigits[48]); - payload << uint8(Payload.PanamaKey[22]); - payload << uint8(Payload.PanamaKey[11]); - payload << uint8(PiDigits[43]); - payload << uint8(address[0]); - payload << uint8(Payload.PanamaKey[23]); - payload << uint8(PiDigits[70]); - payload << uint8(Payload.PanamaKey[19]); - payload << uint8(PiDigits[29]); - payload << uint8(PiDigits[71]); - payload << uint8(PiDigits[55]); - payload << uint8(Haiku[49]); + payload << uint8(PiDigits[1]); + payload << uint8(address[2]); + payload << uint8(Haiku[47]); payload << uint8(Haiku[33]); - payload << uint8(Haiku[66]); - payload << uint8(Payload.PanamaKey[16]); + payload << uint8(Haiku[68]); + payload << uint8(PiDigits[59]); + payload << uint8(address[12]); + payload << uint8(hmac[15]); + payload << uint8(Haiku[42]); + payload << uint8(PiDigits[8]); + payload << uint8(Haiku[50]); + payload << uint8(Payload.PanamaKey[21]); payload << uint8(PiDigits[11]); + payload << uint8(PiDigits[41]); + payload << uint8(Haiku[64]); + payload << uint8(PiDigits[37]); + payload << uint8(address[6]); + payload << uint8(PiDigits[70]); + payload << uint8(Haiku[30]); + payload << uint8(hmac[3]); + payload << uint8(Payload.PanamaKey[25]); + payload << uint8(PiDigits[66]); + payload << uint8(PiDigits[89]); + payload << uint8(Payload.PanamaKey[19]); + payload << uint8(PiDigits[61]); + payload << uint8(Haiku[14]); + payload << uint8(hmac[11]); + payload << uint8(PiDigits[95]); + payload << uint8(address[10]); + payload << uint8(Haiku[44]); + payload << uint8(Payload.PanamaKey[8]); + payload << uint8(PiDigits[88]); + payload << uint8(Haiku[11]); + payload << uint8(PiDigits[39]); + payload << uint8(address[5]); + payload << uint8(Haiku[9]); + payload << uint8(PiDigits[25]); + payload << uint8(Haiku[31]); + payload << uint8(Payload.PanamaKey[2]); + payload << uint8(hmac[9]); + payload << uint8(Haiku[19]); + payload << uint8(PiDigits[20]); + payload << uint8(Haiku[12]); + payload << uint8(PiDigits[32]); + payload << uint8(PiDigits[65]); + payload << uint8(Payload.PanamaKey[26]); payload << uint8(PiDigits[13]); + payload << uint8(PiDigits[78]); + payload << uint8(Payload.PanamaKey[12]); + payload << uint8(PiDigits[30]); + payload << uint8(PiDigits[103]); payload << uint8(PiDigits[51]); - payload << uint8(Haiku[13]); - payload << uint8(Haiku[67]); - payload << uint8(Haiku[22]); - payload << uint8(PiDigits[58]); - payload << uint8(Haiku[1]); - payload << uint8(address[7]); - payload << uint8(address[3]); - payload << uint8(PiDigits[76]); - payload << uint8(Payload.PanamaKey[9]); + payload << uint8(Haiku[4]); + payload << uint8(Haiku[23]); + payload << uint8(PiDigits[44]); + payload << uint8(Haiku[21]); + payload << uint8(PiDigits[94]); + payload << uint8(Payload.PanamaKey[27]); + payload << uint8(Payload.PanamaKey[6]); + payload << uint8(hmac[13]); + payload << uint8(PiDigits[50]); + payload << uint8(hmac[14]); + payload << uint8(PiDigits[106]); + payload << uint8(Payload.PanamaKey[18]); + payload << uint8(Payload.PanamaKey[28]); BigNumber bnData; bnData.SetBinary(payload.contents(), payload.size()); diff --git a/src/server/game/Server/Packets/BattlePetPackets.cpp b/src/server/game/Server/Packets/BattlePetPackets.cpp new file mode 100644 index 00000000000..435b9f54338 --- /dev/null +++ b/src/server/game/Server/Packets/BattlePetPackets.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2008-2015 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 "BattlePetPackets.h" +#include "World.h" + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::BattlePet::BattlePetSlot const& slot) +{ + data << (slot.Pet.Guid.IsEmpty() ? ObjectGuid::Create<HighGuid::BattlePet>(0) : slot.Pet.Guid); + data << slot.CollarID; + data << slot.Index; + data.WriteBit(slot.Locked); + data.FlushBits(); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::BattlePet::BattlePet const& pet) +{ + data << pet.Guid; + data << pet.Species; + data << pet.CreatureID; + data << pet.CollarID; + data << pet.Breed; + data << pet.Level; + data << pet.Exp; + data << pet.Flags; + data << pet.Power; + data << pet.Health; + data << pet.MaxHealth; + data << pet.Speed; + data << pet.Quality; + data.WriteBits(pet.Name.size(), 7); + data.WriteBit(!pet.Owner.IsEmpty()); // HasOwnerInfo + data.WriteBit(pet.Name.empty()); // NoRename + data.FlushBits(); + + if (!pet.Owner.IsEmpty()) + { + data << pet.Owner; + data << GetVirtualRealmAddress(); // Virtual + data << GetVirtualRealmAddress(); // Native + } + + data.WriteString(pet.Name); + + return data; +} + +WorldPacket const* WorldPackets::BattlePet::BattlePetJournal::Write() +{ + _worldPacket << Trap; + _worldPacket << Slots.size(); + _worldPacket << Pets.size(); + + for (auto const& slot : Slots) + _worldPacket << slot; + + for (auto const& pet : Pets) + _worldPacket << pet; + + _worldPacket.WriteBit(1); // HasJournalLock + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::BattlePet::BattlePetUpdates::Write() +{ + _worldPacket << Pets.size(); + + for (auto const& pet : Pets) + _worldPacket << pet; + + _worldPacket.WriteBit(PetAdded); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + + +WorldPacket const* WorldPackets::BattlePet::PetBattleSlotUpdates::Write() +{ + _worldPacket << Slots.size(); + + for (auto const& slot : Slots) + _worldPacket << slot; + + _worldPacket.WriteBit(NewSlot); + _worldPacket.WriteBit(AutoSlotted); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +void WorldPackets::BattlePet::BattlePetSetBattleSlot::Read() +{ + _worldPacket >> PetGuid; + _worldPacket >> Slot; +} + +void WorldPackets::BattlePet::BattlePetModifyName::Read() +{ + _worldPacket >> PetGuid; + uint32 nameLength = _worldPacket.ReadBits(7); + bool hasDeclinedNames = _worldPacket.ReadBit(); + Name = _worldPacket.ReadString(nameLength); + + if (hasDeclinedNames) + { + uint8 declinedNameLengths[MAX_DECLINED_NAME_CASES]; + + for (uint8 i = 0; i < 5; ++i) + declinedNameLengths[i] = _worldPacket.ReadBits(7); + + for (uint8 i = 0; i < 5; ++i) + Declined.name[i] = _worldPacket.ReadString(declinedNameLengths[i]); + } +} + +void WorldPackets::BattlePet::BattlePetDeletePet::Read() +{ + _worldPacket >> PetGuid; +} + +void WorldPackets::BattlePet::BattlePetSetFlags::Read() +{ + _worldPacket >> PetGuid; + _worldPacket >> Flags; + ControlType = _worldPacket.ReadBits(2); +} + +void WorldPackets::BattlePet::CageBattlePet::Read() +{ + _worldPacket >> PetGuid; +} + +WorldPacket const* WorldPackets::BattlePet::BattlePetDeleted::Write() +{ + _worldPacket << PetGuid; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::BattlePet::BattlePetError::Write() +{ + _worldPacket.WriteBits(Result, 4); + _worldPacket.FlushBits(); + _worldPacket << CreatureID; + + return &_worldPacket; +} + +void WorldPackets::BattlePet::BattlePetSummon::Read() +{ + _worldPacket >> PetGuid; +} diff --git a/src/server/game/Server/Packets/BattlePetPackets.h b/src/server/game/Server/Packets/BattlePetPackets.h new file mode 100644 index 00000000000..98112f23d5d --- /dev/null +++ b/src/server/game/Server/Packets/BattlePetPackets.h @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2008-2015 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 BattlePetPackets_h__ +#define BattlePetPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" +#include "Unit.h" + +namespace WorldPackets +{ + namespace BattlePet + { + struct BattlePet + { + ObjectGuid Guid; + uint32 Species = 0; + uint32 CreatureID = 0; + uint32 CollarID = 0; // what's this? + uint16 Breed = 0; + uint16 Level = 0; + uint16 Exp = 0; + uint16 Flags = 0; + uint32 Power = 0; + uint32 Health = 0; + uint32 MaxHealth = 0; + uint32 Speed = 0; + uint8 Quality = 0; + ObjectGuid Owner; // for non-account wide pets only? (Guild Page, Guild Herald) + std::string Name; + }; + + struct BattlePetSlot + { + BattlePet Pet; + uint32 CollarID = 0; // what's this? + uint8 Index = 0; + bool Locked = true; + }; + + class BattlePetJournal final : public ServerPacket + { + public: + BattlePetJournal() : ServerPacket(SMSG_BATTLE_PET_JOURNAL) { } + + WorldPacket const* Write() override; + + uint16 Trap = 0; + std::vector<BattlePetSlot> Slots; + std::vector<BattlePet> Pets; + }; + + class BattlePetJournalLockAcquired final : public ServerPacket + { + public: + BattlePetJournalLockAcquired() : ServerPacket(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class BattlePetRequestJournal final : public ClientPacket + { + public: + BattlePetRequestJournal(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_REQUEST_JOURNAL, std::move(packet)) { } + + void Read() override { } + }; + + class BattlePetUpdates final : public ServerPacket + { + public: + BattlePetUpdates() : ServerPacket(SMSG_BATTLE_PET_UPDATES) { } + + WorldPacket const* Write() override; + + std::vector<BattlePet> Pets; + bool PetAdded = false; + }; + + class PetBattleSlotUpdates final : public ServerPacket + { + public: + PetBattleSlotUpdates() : ServerPacket(SMSG_PET_BATTLE_SLOT_UPDATES) { } + + WorldPacket const* Write() override; + + std::vector<BattlePetSlot> Slots; + bool AutoSlotted = false; + bool NewSlot = false; + }; + + class BattlePetSetBattleSlot final : public ClientPacket + { + public: + BattlePetSetBattleSlot(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_SET_BATTLE_SLOT, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGuid; + uint8 Slot = 0; + }; + + class BattlePetModifyName final : public ClientPacket + { + public: + BattlePetModifyName(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_MODIFY_NAME, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGuid; + std::string Name; + DeclinedName Declined; + }; + + class BattlePetDeletePet final : public ClientPacket + { + public: + BattlePetDeletePet(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_DELETE_PET, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGuid; + }; + + class BattlePetSetFlags final : public ClientPacket + { + public: + BattlePetSetFlags(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_SET_FLAGS, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGuid; + uint32 Flags = 0; + uint8 ControlType = 0; + }; + + class CageBattlePet final : public ClientPacket + { + public: + CageBattlePet(WorldPacket&& packet) : ClientPacket(CMSG_CAGE_BATTLE_PET, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGuid; + }; + + class BattlePetDeleted final : public ServerPacket + { + public: + BattlePetDeleted() : ServerPacket(SMSG_BATTLE_PET_DELETED, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid PetGuid; + }; + + class BattlePetError final : public ServerPacket + { + public: + BattlePetError() : ServerPacket(SMSG_BATTLE_PET_ERROR, 5) { } + + WorldPacket const* Write() override; + + uint8 Result = 0; + uint32 CreatureID = 0; + }; + + class BattlePetSummon final : public ClientPacket + { + public: + BattlePetSummon(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_SUMMON, std::move(packet)) { } + + void Read() override; + + ObjectGuid PetGuid; + }; + } +} + +#endif // BattlePetPackets_h__ diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 7bd1bbe5d66..11ff844a900 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -60,6 +60,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData: data << uint32(playerData.Stats.size()); data << int32(playerData.PrimaryTalentTree); data << uint32(playerData.PrimaryTalentTreeNameIndex); + data << uint32(playerData.Race); if (!playerData.Stats.empty()) data.append(playerData.Stats.data(), playerData.Stats.size()); diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 971bbfd24cb..304f3f60779 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -112,6 +112,7 @@ namespace WorldPackets std::vector<int32> Stats; int32 PrimaryTalentTree = 0; uint32 PrimaryTalentTreeNameIndex = 0; // controls which name field from ChrSpecialization.dbc will be sent to lua + uint32 Race; }; Optional<uint8> Winner; diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp index cc6406b81bc..54441919b84 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -21,7 +21,7 @@ WorldPacket const* WorldPackets::Channel::ChannelListResponse::Write() { _worldPacket.WriteBit(_Display); _worldPacket.WriteBits(_Channel.length(), 7); - _worldPacket << uint8(_ChannelFlags); + _worldPacket << uint32(_ChannelFlags); _worldPacket << uint32(_Members.size()); _worldPacket.WriteString(_Channel); @@ -64,7 +64,7 @@ WorldPacket const* WorldPackets::Channel::ChannelNotifyJoined::Write() { _worldPacket.WriteBits(_Channel.length(), 7); _worldPacket.WriteBits(ChannelWelcomeMsg.length(), 10); - _worldPacket << uint8(_ChannelFlags); + _worldPacket << uint32(_ChannelFlags); _worldPacket << int32(ChatChannelID); _worldPacket << uint64(InstanceID); _worldPacket.WriteString(_Channel); @@ -86,11 +86,9 @@ WorldPacket const* WorldPackets::Channel::ChannelNotifyLeft::Write() WorldPacket const* WorldPackets::Channel::UserlistAdd::Write() { _worldPacket << AddedUserGUID; - _worldPacket << uint8(_ChannelFlags); _worldPacket << uint8(UserFlags); - + _worldPacket << uint32(_ChannelFlags); _worldPacket << uint32(ChannelID); - _worldPacket.WriteBits(ChannelName.length(), 7); _worldPacket.FlushBits(); _worldPacket.WriteString(ChannelName); @@ -100,11 +98,8 @@ WorldPacket const* WorldPackets::Channel::UserlistAdd::Write() WorldPacket const* WorldPackets::Channel::UserlistRemove::Write() { _worldPacket << RemovedUserGUID; - - _worldPacket << uint8(_ChannelFlags); - + _worldPacket << uint32(_ChannelFlags); _worldPacket << uint32(ChannelID); - _worldPacket.WriteBits(ChannelName.length(), 7); _worldPacket.FlushBits(); _worldPacket.WriteString(ChannelName); @@ -114,12 +109,9 @@ WorldPacket const* WorldPackets::Channel::UserlistRemove::Write() WorldPacket const* WorldPackets::Channel::UserlistUpdate::Write() { _worldPacket << UpdatedUserGUID; - - _worldPacket << uint8(_ChannelFlags); _worldPacket << uint8(UserFlags); - + _worldPacket << uint32(_ChannelFlags); _worldPacket << uint32(ChannelID); - _worldPacket.WriteBits(ChannelName.length(), 7); _worldPacket.FlushBits(); _worldPacket.WriteString(ChannelName); diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index b41be6e93d1..161bcfe0f99 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -45,7 +45,7 @@ namespace WorldPackets std::vector<ChannelPlayer> _Members; std::string _Channel; ///< Channel Name - uint8 _ChannelFlags = 0; ///< @see enum ChannelFlags + uint32 _ChannelFlags = 0; ///< @see enum ChannelFlags bool _Display = false; }; @@ -79,7 +79,7 @@ namespace WorldPackets std::string ChannelWelcomeMsg; int32 ChatChannelID = 0; int32 InstanceID = 0; - uint8 _ChannelFlags = 0; ///< @see enum ChannelFlags + uint32 _ChannelFlags = 0; ///< @see enum ChannelFlags std::string _Channel; ///< Channel Name }; @@ -103,12 +103,9 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid AddedUserGUID; - - uint8 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags + uint32 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags uint8 UserFlags = MEMBER_FLAG_NONE; - int32 ChannelID = 0; - std::string ChannelName; }; @@ -120,11 +117,8 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid RemovedUserGUID; - - uint8 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags - + uint32 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags uint32 ChannelID = 0; - std::string ChannelName; }; @@ -136,12 +130,9 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid UpdatedUserGUID; - - uint8 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags + uint32 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags uint8 UserFlags = MEMBER_FLAG_NONE; - int32 ChannelID = 0; - std::string ChannelName; }; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 26dda8e646e..b6b69b84eac 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -18,6 +18,17 @@ #include "ItemPackets.h" #include "Player.h" +bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData const& r) const +{ + if (Context != r.Context) + return false; + + if (BonusListIDs.size() != r.BonusListIDs.size()) + return false; + + return std::is_permutation(BonusListIDs.begin(), BonusListIDs.end(), r.BonusListIDs.begin()); +} + void WorldPackets::Item::BuyBackItem::Read() { _worldPacket >> VendorGUID @@ -185,14 +196,13 @@ void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) ItemBonus->Context = item->GetUInt32Value(ITEM_FIELD_CONTEXT); } - uint32 mask = item->GetUInt32Value(ITEM_FIELD_MODIFIERS_MASK); - if (mask != 0) - Modifications = WorldPackets::CompactArray<int32>(); - - for (size_t i = 0; mask != 0; mask >>= 1, ++i) + if (uint32 mask = item->GetUInt32Value(ITEM_FIELD_MODIFIERS_MASK)) { - if ((mask & 1) != 0) - Modifications->Insert(i, item->GetModifier(ItemModifier(i))); + Modifications = boost::in_place(); + + for (size_t i = 0; mask != 0; mask >>= 1, ++i) + if ((mask & 1) != 0) + Modifications->Insert(i, item->GetModifier(ItemModifier(i))); } } @@ -216,6 +226,34 @@ void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidI ItemID = voidItem->ItemEntry; RandomPropertiesID = voidItem->ItemRandomPropertyId; RandomPropertiesSeed = voidItem->ItemSuffixFactor; + if (voidItem->ItemUpgradeId) + { + Modifications = boost::in_place(); + Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, voidItem->ItemUpgradeId); + } + + if (!voidItem->BonusListIDs.empty()) + { + ItemBonus = boost::in_place(); + ItemBonus->BonusListIDs = voidItem->BonusListIDs; + } +} + +bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const +{ + if (ItemID != r.ItemID || RandomPropertiesID != r.RandomPropertiesID || RandomPropertiesSeed != r.RandomPropertiesSeed) + return false; + + if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized() || Modifications.is_initialized() != r.Modifications.is_initialized()) + return false; + + if (Modifications.is_initialized() && *Modifications != *r.Modifications) + return false; + + if (ItemBonus.is_initialized() && *ItemBonus != *r.ItemBonus) + return false; + + return true; } WorldPacket const* WorldPackets::Item::InventoryChangeFailure::Write() @@ -395,3 +433,36 @@ WorldPacket const* WorldPackets::Item::ItemEnchantTimeUpdate::Write() return &_worldPacket; } + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::TransmogrifyItem& transmogItem) +{ + if (data.ReadBit()) + transmogItem.SrcItemGUID = boost::in_place(); + + if (data.ReadBit()) + transmogItem.SrcVoidItemGUID = boost::in_place(); + + data >> transmogItem.Item; + data >> transmogItem.Slot; + + if (transmogItem.SrcItemGUID.is_initialized()) + data >> *transmogItem.SrcItemGUID; + + if (transmogItem.SrcVoidItemGUID.is_initialized()) + data >> *transmogItem.SrcVoidItemGUID; + + return data; +} + +void WorldPackets::Item::TransmogrifyItems::Read() +{ + Items.resize(_worldPacket.read<uint32>()); + _worldPacket >> Npc; + for (TransmogrifyItem& item : Items) + _worldPacket >> item; +} + +void WorldPackets::Item::UseCritterItem::Read() +{ + _worldPacket >> ItemGuid; +} diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index d179f03b041..db7e9a01c0a 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -32,6 +32,9 @@ namespace WorldPackets { uint8 Context = 0; std::vector<int32> BonusListIDs; + + bool operator==(ItemBonusInstanceData const& r) const; + bool operator!=(ItemBonusInstanceData const& r) const { return !(*this == r); } }; struct ItemInstance @@ -45,6 +48,9 @@ namespace WorldPackets uint32 RandomPropertiesID = 0; Optional<ItemBonusInstanceData> ItemBonus; Optional<CompactArray<int32>> Modifications; + + bool operator==(ItemInstance const& r) const; + bool operator!=(ItemInstance const& r) const { return !(*this == r); } }; class BuyBackItem final : public ClientPacket @@ -398,6 +404,40 @@ namespace WorldPackets uint32 Slot = 0; }; + struct TransmogrifyItem + { + Optional<ObjectGuid> SrcItemGUID; + Optional<ObjectGuid> SrcVoidItemGUID; + ItemInstance Item; + uint32 Slot = 0; + }; + + class TransmogrifyItems final : public ClientPacket + { + public: + enum + { + MAX_TRANSMOGRIFY_ITEMS = 11 + }; + + TransmogrifyItems(WorldPacket&& packet) : ClientPacket(CMSG_TRANSMOGRIFY_ITEMS, std::move(packet)) { } + + void Read() override; + + ObjectGuid Npc; + Array<TransmogrifyItem, MAX_TRANSMOGRIFY_ITEMS> Items; + }; + + class UseCritterItem final : public ClientPacket + { + public: + UseCritterItem(WorldPacket&& packet) : ClientPacket(CMSG_USE_CRITTER_ITEM, std::move(packet)) { } + + void Read() override; + + ObjectGuid ItemGuid; + }; + ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); } } diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index ce0d267778f..ec7a475df7a 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -57,8 +57,8 @@ WorldPacket const* WorldPackets::Loot::LootResponse::Write() } _worldPacket.WriteBit(Acquired); - _worldPacket.WriteBit(PersonalLooting); _worldPacket.WriteBit(AELooting); + _worldPacket.WriteBit(PersonalLooting); _worldPacket.FlushBits(); return &_worldPacket; diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index 9bdd8bd3a4f..d9e3a0cd948 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -39,7 +39,7 @@ namespace WorldPackets struct LootItemData { uint8 Type = 2; - uint8 UIType = 4; + uint8 UIType = 7; uint32 Quantity = 0; uint8 LootItemType = 0; uint8 LootListID = 0; diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 7c45810bc13..b1799a1aa64 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -545,3 +545,11 @@ void WorldPackets::Misc::SetPvP::Read() { EnablePVP = _worldPacket.ReadBit(); } + +void WorldPackets::Misc::WorldTeleport::Read() +{ + _worldPacket >> MapID; + _worldPacket >> TransportGUID; + _worldPacket >> Pos; + _worldPacket >> Facing; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index ea1d32b73cc..749b9516e82 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -712,6 +712,19 @@ namespace WorldPackets bool EnablePVP = false; }; + + class WorldTeleport final : public ClientPacket + { + public: + WorldTeleport(WorldPacket&& packet) : ClientPacket(CMSG_WORLD_TELEPORT, std::move(packet)) { } + + void Read() override; + + uint32 MapID = 0; + ObjectGuid TransportGUID; + G3D::Vector3 Pos; + float Facing = 0.0f; + }; } } diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 4837ee9e69c..4f39e264efb 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -178,6 +178,16 @@ namespace WorldPackets _contents.clear(); } + bool operator==(CompactArray const& r) const + { + if (_mask != r._mask) + return false; + + return _contents == r._contents; + } + + bool operator!=(CompactArray const& r) const { return !(*this == r); } + private: uint32 _mask; std::vector<T> _contents; diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 2f7bec3d3ba..9fc835b00c3 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -554,7 +554,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHistoryEntry data << uint32(historyEntry.Category); data << int32(historyEntry.RecoveryTime); data << int32(historyEntry.CategoryRecoveryTime); + data.WriteBit(historyEntry.unused622_1.is_initialized()); + data.WriteBit(historyEntry.unused622_2.is_initialized()); data.WriteBit(historyEntry.OnHold); + if (historyEntry.unused622_1) + data << uint32(*historyEntry.unused622_1); + if (historyEntry.unused622_2) + data << uint32(*historyEntry.unused622_2); data.FlushBits(); return data; diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index fbd53c0527c..9a258a3be7e 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -512,6 +512,8 @@ namespace WorldPackets int32 RecoveryTime = 0; int32 CategoryRecoveryTime = 0; bool OnHold = false; + Optional<uint32> unused622_1; ///< This field is not used for anything in the client in 6.2.2.20444 + Optional<uint32> unused622_2; ///< This field is not used for anything in the client in 6.2.2.20444 }; class SendSpellHistory final : public ServerPacket @@ -784,5 +786,6 @@ namespace WorldPackets } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData); +ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastRequest& request); #endif // SpellPackets_h__ diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index c4cbfc6d378..58d0426d89c 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -93,6 +93,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write() _worldPacket.WriteBit(CommerceSystemEnabled); _worldPacket.WriteBit(Unk14); _worldPacket.WriteBit(WillKickFromWorld); + _worldPacket.WriteBit(IsExpansionPreorderInStore); _worldPacket.FlushBits(); _worldPacket << int32(TokenPollTimeSeconds); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 9b19258b838..f6ae348fec5 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -101,6 +101,7 @@ namespace WorldPackets bool CommerceSystemEnabled = false; // NYI bool Unk14 = false; // NYI bool WillKickFromWorld = false; // NYI + bool IsExpansionPreorderInStore = false; int32 TokenPollTimeSeconds = 0; // NYI int32 TokenRedeemIndex = 0; // NYI }; diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index e6d15c0da4c..443692d5ebb 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -39,9 +39,6 @@ WorldPacket const* WorldPackets::Ticket::GMTicketSystemStatus::Write() WorldPacket const* WorldPackets::Ticket::GMTicketCaseStatus::Write() { - _worldPacket.AppendPackedTime(OldestTicketTime); - _worldPacket.AppendPackedTime(UpdateTime); - _worldPacket << int32(Cases.size()); for (auto const& c : Cases) diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h index c25c02b7619..08e7c5fac63 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -78,8 +78,6 @@ namespace WorldPackets WorldPacket const* Write() override; - time_t OldestTicketTime = 0; - time_t UpdateTime = 0; std::vector<GMTicketCase> Cases; }; diff --git a/src/server/game/Server/Packets/ToyPackets.cpp b/src/server/game/Server/Packets/ToyPackets.cpp new file mode 100644 index 00000000000..9d0f7b519b9 --- /dev/null +++ b/src/server/game/Server/Packets/ToyPackets.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2008-2015 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 "ToyPackets.h" + +void WorldPackets::Toy::AddToy::Read() +{ + _worldPacket >> Guid; +} + +void WorldPackets::Toy::UseToy::Read() +{ + _worldPacket >> ItemID; + _worldPacket >> Cast; +} + +WorldPacket const* WorldPackets::Toy::AccountToysUpdate::Write() +{ + _worldPacket.WriteBit(IsFullUpdate); + _worldPacket.FlushBits(); + + // both lists have to have the same size + _worldPacket << int32(Toys->size()); + _worldPacket << int32(Toys->size()); + + for (auto const& item : *Toys) + _worldPacket << uint32(item.first); + + for (auto const& favourite : *Toys) + _worldPacket.WriteBit(favourite.second); + + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +void WorldPackets::Toy::ToySetFavorite::Read() +{ + _worldPacket >> ItemID; + Favorite = _worldPacket.ReadBit(); +} diff --git a/src/server/game/Server/Packets/ToyPackets.h b/src/server/game/Server/Packets/ToyPackets.h new file mode 100644 index 00000000000..11b0f47ddda --- /dev/null +++ b/src/server/game/Server/Packets/ToyPackets.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2008-2015 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 ToyPackets_h__ +#define ToyPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" +#include "SpellPackets.h" + +namespace WorldPackets +{ + namespace Toy + { + class AddToy final : public ClientPacket + { + public: + AddToy(WorldPacket&& packet) : ClientPacket(CMSG_ADD_TOY, std::move(packet)) { } + + void Read() override; + + ObjectGuid Guid; + }; + + class UseToy final : public ClientPacket + { + public: + UseToy(WorldPacket&& packet) : ClientPacket(CMSG_USE_TOY, std::move(packet)) { } + + void Read() override; + + WorldPackets::Spells::SpellCastRequest Cast; + uint32 ItemID = 0; + }; + + class AccountToysUpdate final : public ServerPacket + { + public: + AccountToysUpdate() : ServerPacket(SMSG_ACCOUNT_TOYS_UPDATE, 1 + 4 + 1) { } + + WorldPacket const* Write() override; + + bool IsFullUpdate = false; + ToyBoxContainer const* Toys = nullptr; + }; + + class ToySetFavorite final : public ClientPacket + { + public: + ToySetFavorite(WorldPacket&& packet) : ClientPacket(CMSG_TOY_SET_FAVORITE, std::move(packet)) { } + + void Read() override; + + uint32 ItemID = 0; + bool Favorite = false; + }; + } +} + +#endif // ToyPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 22be0707a90..a214fd44556 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -22,6 +22,7 @@ #include "Packets/AuctionHousePackets.h" #include "Packets/BankPackets.h" #include "Packets/BattlegroundPackets.h" +#include "Packets/BattlePetPackets.h" #include "Packets/BlackMarketPackets.h" #include "Packets/CalendarPackets.h" #include "Packets/ChannelPackets.h" @@ -54,6 +55,7 @@ #include "Packets/TicketPackets.h" #include "Packets/TokenPackets.h" #include "Packets/TotemPackets.h" +#include "Packets/ToyPackets.h" #include "Packets/TradePackets.h" #include "Packets/VehiclePackets.h" #include "Packets/VoidStoragePackets.h" @@ -163,7 +165,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ADD_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddFriend, &WorldSession::HandleAddFriendOpcode); DEFINE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddIgnore, &WorldSession::HandleAddIgnoreOpcode); - DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::AddToy, &WorldSession::HandleAddToy); DEFINE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::AlterApperance, &WorldSession::HandleAlterAppearance); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQuery, &WorldSession::HandleAreaSpiritHealerQueryOpcode); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQueue, &WorldSession::HandleAreaSpiritHealerQueueOpcode); @@ -204,14 +206,14 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PAY_GET_PURCHASE_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_START_PURCHASE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_START_VAS_PURCHASE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::BattlePetDeletePet, &WorldSession::HandleBattlePetDeletePet); DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PET_MODIFY_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PET_REQUEST_JOURNAL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PET_MODIFY_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::BattlePetModifyName, &WorldSession::HandleBattlePetModifyName); + DEFINE_HANDLER(CMSG_BATTLE_PET_REQUEST_JOURNAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::BattlePetRequestJournal, &WorldSession::HandleBattlePetRequestJournal); DEFINE_HANDLER(CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PET_SET_BATTLE_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PET_SET_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PET_SUMMON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PET_SET_BATTLE_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::BattlePetSetBattleSlot, &WorldSession::HandleBattlePetSetBattleSlot); + DEFINE_HANDLER(CMSG_BATTLE_PET_SET_FLAGS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::BattlePetSetFlags, &WorldSession::HandleBattlePetSetFlags); + DEFINE_HANDLER(CMSG_BATTLE_PET_SUMMON, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::BattlePet::BattlePetSummon, &WorldSession::HandleBattlePetSummon); DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BeginTrade, &WorldSession::HandleBeginTradeOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfEntryInviteResponse ); @@ -230,7 +232,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BUY_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_START, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CAGE_BATTLE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_CAGE_BATTLE_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BattlePet::CageBattlePet, &WorldSession::HandleCageBattlePet); DEFINE_HANDLER(CMSG_CALENDAR_ADD_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarAddEvent, &WorldSession::HandleCalendarAddEvent); DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_COMPLAIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarComplain ); DEFINE_HANDLER(CMSG_CALENDAR_COPY_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarCopyEvent, &WorldSession::HandleCalendarCopyEvent); @@ -255,7 +257,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CANCEL_MOUNT_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelMountAura, &WorldSession::HandleCancelMountAuraOpcode); DEFINE_HANDLER(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::CancelTempEnchantment, &WorldSession::HandleCancelTempEnchantmentOpcode); + DEFINE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::CancelTempEnchantment, &WorldSession::HandleCancelTempEnchantmentOpcode); DEFINE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, WorldPackets::Trade::CancelTrade, &WorldSession::HandleCancelTradeOpcode); DEFINE_HANDLER(CMSG_CAN_DUEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Duel::CanDuel, &WorldSession::HandleCanDuel); DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::CastSpell, &WorldSession::HandleCastSpellOpcode); @@ -369,7 +371,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_ENGINE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ENUM_CHARACTERS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharEnumOpcode); DEFINE_HANDLER(CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharUndeleteEnumOpcode); - DEFINE_HANDLER(CMSG_FAR_SIGHT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::FarSight, &WorldSession::HandleFarSightOpcode); + DEFINE_HANDLER(CMSG_FAR_SIGHT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::FarSight, &WorldSession::HandleFarSightOpcode); DEFINE_HANDLER(CMSG_GAME_OBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjReportUse, &WorldSession::HandleGameobjectReportUse); DEFINE_HANDLER(CMSG_GAME_OBJ_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjUse, &WorldSession::HandleGameObjectUseOpcode); DEFINE_HANDLER(CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -786,10 +788,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TOGGLE_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TogglePvP, &WorldSession::HandleTogglePvP); DEFINE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Totem::TotemDestroyed, &WorldSession::HandleTotemDestroyed); - DEFINE_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::ToySetFavorite, &WorldSession::HandleToySetFavorite); DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode); DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); + DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::TurnInPetition, &WorldSession::HandleTurnInPetition); DEFINE_HANDLER(CMSG_TUTORIAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_HANDLER(CMSG_TWITTER_CHECK_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -812,10 +814,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPGRADE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::UseCritterItem, &WorldSession::HandleUseCritterItem); DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet); DEFINE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UseItem, &WorldSession::HandleUseItemOpcode); - DEFINE_HANDLER(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_USE_TOY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Toy::UseToy, &WorldSession::HandleUseToy); DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel); DEFINE_HANDLER(CMSG_VOICE_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -825,7 +827,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoRequestPkt, &WorldSession::HandleWhoOpcode); DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoIsRequest, &WorldSession::HandleWhoIsOpcode); DEFINE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortResponse, &WorldSession::HandleMoveWorldportAckOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode ); + DEFINE_HANDLER(CMSG_WORLD_TELEPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::WorldTeleport, &WorldSession::HandleWorldTeleportOpcode); DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem); #undef DEFINE_OPCODE_HANDLER_OLD @@ -840,7 +842,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_HEIRLOOM_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_TAXI_REPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -915,16 +917,16 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PETS_HEALED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_CAGE_DATE_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_LICENSE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_REVOKED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_TRAP_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_UPDATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_UPDATES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_DROP_TIMER_CANCELLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_DROP_TIMER_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_EJECTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1457,7 +1459,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_REPLACEMENTS_MADE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_REQUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_ROUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_SLOT_UPDATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_SLOT_UPDATES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CLEAR_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_DISMISS_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index a82116e9daa..f14db518f1d 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -45,1598 +45,1598 @@ enum OpcodeMisc : uint32 enum OpcodeClient : uint32 { - CMSG_ACCEPT_GUILD_INVITE = 0x00A6, - CMSG_ACCEPT_LEVEL_GRANT = 0x04D8, - CMSG_ACCEPT_TRADE = 0x10D4, - CMSG_ACCEPT_WARGAME_INVITE = 0x0A11, - CMSG_ACTIVATE_TAXI = 0x024F, - CMSG_ADD_BATTLENET_FRIEND = 0x04B2, - CMSG_ADD_FRIEND = 0x0035, - CMSG_ADD_IGNORE = 0x00D6, - CMSG_ADD_TOY = 0x16B7, - CMSG_ALTER_APPEARANCE = 0x068F, - CMSG_AREA_SPIRIT_HEALER_QUERY = 0x021B, - CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x02DF, - CMSG_AREA_TRIGGER = 0x1044, - CMSG_ATTACK_STOP = 0x022B, - CMSG_ATTACK_SWING = 0x1D58, - CMSG_AUCTION_HELLO_REQUEST = 0x04A0, - CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x0293, - CMSG_AUCTION_LIST_ITEMS = 0x0848, - CMSG_AUCTION_LIST_OWNER_ITEMS = 0x0810, - CMSG_AUCTION_LIST_PENDING_SALES = 0x0887, - CMSG_AUCTION_PLACE_BID = 0x00D3, - CMSG_AUCTION_REMOVE_ITEM = 0x061C, - CMSG_AUCTION_REPLICATE_ITEMS = 0x00DF, - CMSG_AUCTION_SELL_ITEM = 0x0A08, - CMSG_AUTH_CONTINUED_SESSION = 0x06DA, - CMSG_AUTH_SESSION = 0x045A, - CMSG_AUTOBANK_ITEM = 0x0263, - CMSG_AUTOBANK_REAGENT = 0x0352, - CMSG_AUTOSTORE_BANK_ITEM = 0x0364, - CMSG_AUTOSTORE_BANK_REAGENT = 0x076C, - CMSG_AUTO_EQUIP_ITEM = 0x0A64, - CMSG_AUTO_EQUIP_ITEM_SLOT = 0x0612, - CMSG_AUTO_STORE_BAG_ITEM = 0x0245, - CMSG_BANKER_ACTIVATE = 0x0298, - CMSG_BATTLEFIELD_LEAVE = 0x13F3, - CMSG_BATTLEFIELD_LIST = 0x1553, - CMSG_BATTLEFIELD_PORT = 0x08CB, - CMSG_BATTLEMASTER_HELLO = 0x0C45, - CMSG_BATTLEMASTER_JOIN = 0x02E0, - CMSG_BATTLEMASTER_JOIN_ARENA = 0x00E0, - CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x025C, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x0725, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x0721, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x0621, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x0FB5, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x0B02, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x0C21, - CMSG_BATTLE_PAY_START_PURCHASE = 0x0935, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x01A2, - CMSG_BATTLE_PET_DELETE_PET = 0x0AD1, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x0095, - CMSG_BATTLE_PET_MODIFY_NAME = 0x0A92, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x0BB1, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x03B1, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x08D6, - CMSG_BATTLE_PET_SET_FLAGS = 0x07A5, - CMSG_BATTLE_PET_SUMMON = 0x03C1, - CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x0CC2, - CMSG_BEGIN_TRADE = 0x1661, - CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0x00B1, - CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0x0BB6, - CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0x01A1, - CMSG_BF_MGR_QUEUE_REQUEST = 0x12E6, - CMSG_BINDER_ACTIVATE = 0x0604, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0x0853, - CMSG_BLACK_MARKET_OPEN = 0x0297, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x0A44, - CMSG_BUG_REPORT = 0x0836, - CMSG_BUSY_TRADE = 0x1731, - CMSG_BUY_BACK_ITEM = 0x008C, - CMSG_BUY_BANK_SLOT = 0x0813, - CMSG_BUY_ITEM = 0x08DF, - CMSG_BUY_REAGENT_BANK = 0x00CF, - CMSG_BUY_WOW_TOKEN_CONFIRM = 0x09A2, - CMSG_BUY_WOW_TOKEN_START = 0x0952, - CMSG_CAGE_BATTLE_PET = 0x1448, - CMSG_CALENDAR_ADD_EVENT = 0x0955, - CMSG_CALENDAR_COMPLAIN = 0x0BD5, - CMSG_CALENDAR_COPY_EVENT = 0x0956, - CMSG_CALENDAR_EVENT_INVITE = 0x0FA1, - CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x09A5, - CMSG_CALENDAR_EVENT_RSVP = 0x03C2, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x0826, - CMSG_CALENDAR_EVENT_STATUS = 0x01D6, - CMSG_CALENDAR_GET = 0x0B41, - CMSG_CALENDAR_GET_EVENT = 0x06A1, - CMSG_CALENDAR_GET_NUM_PENDING = 0x0AB1, - CMSG_CALENDAR_GUILD_FILTER = 0x0531, - CMSG_CALENDAR_REMOVE_EVENT = 0x03A1, - CMSG_CALENDAR_REMOVE_INVITE = 0x0026, - CMSG_CALENDAR_UPDATE_EVENT = 0x0922, - CMSG_CANCEL_AURA = 0x14D3, - CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x04D0, - CMSG_CANCEL_CAST = 0x1458, - CMSG_CANCEL_CHANNELLING = 0x17F1, - CMSG_CANCEL_GROWTH_AURA = 0x1C04, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x1375, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x1A31, - CMSG_CANCEL_MOUNT_AURA = 0x1518, - CMSG_CANCEL_QUEUED_SPELL = 0x1225, - CMSG_CANCEL_TEMP_ENCHANTMENT = 0x0697, - CMSG_CANCEL_TRADE = 0x1223, - CMSG_CAN_DUEL = 0x0096, - CMSG_CAST_SPELL = 0x1632, - CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x0A09, - CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x0B49, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x10D8, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x1C13, - CMSG_CHANGE_SUB_GROUP = 0x04B1, - CMSG_CHARACTER_RENAME_REQUEST = 0x0B06, - CMSG_CHAR_CUSTOMIZE = 0x0DB2, - CMSG_CHAR_DELETE = 0x0DA2, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x09D5, - CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x04E9, - CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x0C39, - CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x05EE, - CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x0139, - CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x0A7A, - CMSG_CHAT_ADDON_MESSAGE_RAID = 0x0379, - CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x04AA, - CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x05BE, - CMSG_CHAT_CHANNEL_BAN = 0x057E, - CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x067E, - CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x0C6D, - CMSG_CHAT_CHANNEL_INVITE = 0x07AE, - CMSG_CHAT_CHANNEL_KICK = 0x062E, - CMSG_CHAT_CHANNEL_LIST = 0x00BE, - CMSG_CHAT_CHANNEL_MODERATE = 0x036E, - CMSG_CHAT_CHANNEL_MODERATOR = 0x016D, - CMSG_CHAT_CHANNEL_MUTE = 0x002D, - CMSG_CHAT_CHANNEL_OWNER = 0x0ABD, - CMSG_CHAT_CHANNEL_PASSWORD = 0x09ED, - CMSG_CHAT_CHANNEL_SET_OWNER = 0x08A9, - CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x016A, - CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x03AA, - CMSG_CHAT_CHANNEL_UNBAN = 0x0BF9, - CMSG_CHAT_CHANNEL_UNMODERATOR = 0x02FA, - CMSG_CHAT_CHANNEL_UNMUTE = 0x0629, - CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x096E, - CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x07B9, - CMSG_CHAT_CHANNEL_VOICE_OFF = 0x04A9, - CMSG_CHAT_CHANNEL_VOICE_ON = 0x07BD, - CMSG_CHAT_JOIN_CHANNEL = 0x0829, - CMSG_CHAT_LEAVE_CHANNEL = 0x03EE, - CMSG_CHAT_MESSAGE_AFK = 0x05A9, - CMSG_CHAT_MESSAGE_CHANNEL = 0x0479, - CMSG_CHAT_MESSAGE_DND = 0x093D, - CMSG_CHAT_MESSAGE_EMOTE = 0x01BA, - CMSG_CHAT_MESSAGE_GUILD = 0x06FA, - CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x012E, - CMSG_CHAT_MESSAGE_OFFICER = 0x02A9, - CMSG_CHAT_MESSAGE_PARTY = 0x007D, - CMSG_CHAT_MESSAGE_RAID = 0x0BB9, - CMSG_CHAT_MESSAGE_RAID_WARNING = 0x07BE, - CMSG_CHAT_MESSAGE_SAY = 0x0AE9, - CMSG_CHAT_MESSAGE_WHISPER = 0x09FE, - CMSG_CHAT_MESSAGE_YELL = 0x046E, - CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x0569, - CMSG_CHAT_REPORT_FILTERED = 0x092D, - CMSG_CHAT_REPORT_IGNORED = 0x097D, - CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x0C7E, - CMSG_CHECK_RAF_EMAIL_ENABLED = 0x0C31, - CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x0946, - CMSG_CHOICE_RESPONSE = 0x17A2, - CMSG_CLEAR_RAID_MARKER = 0x0B2B, - CMSG_CLEAR_TRADE_ITEM = 0x1674, - CMSG_CLIENT_PORT_GRAVEYARD = 0x06A0, - CMSG_CLOSE_INTERACTION = 0x04E0, - CMSG_COMMENTATOR_ENABLE = 0x09C1, - CMSG_COMMENTATOR_ENTER_INSTANCE = 0x0731, - CMSG_COMMENTATOR_EXIT_INSTANCE = 0x0426, - CMSG_COMMENTATOR_GET_MAP_INFO = 0x0916, - CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x02B6, - CMSG_COMMENTATOR_START_WARGAME = 0x0FB1, - CMSG_COMPLAINT = 0x0BD1, - CMSG_COMPLETE_CINEMATIC = 0x06D4, - CMSG_COMPLETE_MOVIE = 0x08DB, - CMSG_CONFIRM_RESPEC_WIPE = 0x1364, - CMSG_CONNECT_TO_FAILED = 0x0821, - CMSG_CONVERT_RAID = 0x02A6, - CMSG_CREATE_CHARACTER = 0x0FA5, - CMSG_CREATE_SHIPMENT = 0x0E16, - CMSG_DB_QUERY_BULK = 0x0A42, - CMSG_DECLINE_GUILD_INVITES = 0x084C, - CMSG_DECLINE_PETITION = 0x02CF, - CMSG_DELETE_EQUIPMENT_SET = 0x0620, - CMSG_DEL_FRIEND = 0x0CB1, - CMSG_DEL_IGNORE = 0x0532, - CMSG_DEPOSIT_REAGENT_BANK = 0x1A73, - CMSG_DESTROY_ITEM = 0x1331, - CMSG_DF_BOOT_PLAYER_VOTE = 0x0911, - CMSG_DF_GET_JOIN_STATUS = 0x07B6, - CMSG_DF_GET_SYSTEM_INFO = 0x04A6, - CMSG_DF_JOIN = 0x0B15, - CMSG_DF_LEAVE = 0x0942, - CMSG_DF_PROPOSAL_RESPONSE = 0x0806, - CMSG_DF_READY_CHECK_RESPONSE = 0x0092, - CMSG_DF_SEARCH_JOIN = 0x0F22, - CMSG_DF_SEARCH_LEAVE = 0x0906, - CMSG_DF_SET_COMMENT = 0x0E21, - CMSG_DF_SET_ROLES = 0x0B56, - CMSG_DF_TELEPORT = 0x0635, - CMSG_DISCARDED_TIME_SYNC_ACKS = 0x1217, - CMSG_DISMISS_CRITTER = 0x0653, - CMSG_DO_MASTER_LOOT_ROLL = 0x08C5, - CMSG_DO_READY_CHECK = 0x0AD6, - CMSG_DUEL_RESPONSE = 0x0248, - CMSG_EJECT_PASSENGER = 0x1D03, - CMSG_EMOTE = 0x0488, - CMSG_ENABLE_NAGLE = 0x065D, - CMSG_ENABLE_TAXI_NODE = 0x0857, - CMSG_ENGINE_SURVEY = 0x0025, - CMSG_ENUM_CHARACTERS = 0x03C6, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x0C22, - CMSG_FAR_SIGHT = 0x040F, - CMSG_GAME_OBJ_REPORT_USE = 0x02D4, - CMSG_GAME_OBJ_USE = 0x068B, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x0928, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x1635, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x1048, - CMSG_GARRISON_COMPLETE_MISSION = 0x0B2F, - CMSG_GARRISON_GENERATE_RECRUITS = 0x0C81, - CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x072B, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x1738, - CMSG_GARRISON_PURCHASE_BUILDING = 0x1A77, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x1D97, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x1C84, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x032B, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x12A3, - CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x12E4, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x16F4, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x1807, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x0155, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x1C54, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x1987, - CMSG_GARRISON_START_MISSION = 0x1508, - CMSG_GARRISON_SWAP_BUILDINGS = 0x0824, - CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x0336, - CMSG_GET_CHALLENGE_MODE_REWARDS = 0x0709, - CMSG_GET_GARRISON_INFO = 0x17E3, - CMSG_GET_ITEM_PURCHASE_DATA = 0x0897, - CMSG_GET_MIRROR_IMAGE_DATA = 0x1113, - CMSG_GET_PVP_OPTIONS_ENABLED = 0x0726, - CMSG_GET_REMAINING_GAME_TIME = 0x0032, - CMSG_GET_TROPHY_LIST = 0x12B2, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x0332, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x0326, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x0892, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x0B21, - CMSG_GOSSIP_SELECT_OPTION = 0x0420, - CMSG_GRANT_LEVEL = 0x0890, - CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x0A5A, - CMSG_GUILD_ADD_RANK = 0x0409, - CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x04C9, - CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x001E, - CMSG_GUILD_BANK_ACTIVATE = 0x0250, - CMSG_GUILD_BANK_BUY_TAB = 0x025F, - CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x04C8, - CMSG_GUILD_BANK_LOG_QUERY = 0x091E, - CMSG_GUILD_BANK_QUERY_TAB = 0x0850, - CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x004A, - CMSG_GUILD_BANK_SET_TAB_TEXT = 0x060D, - CMSG_GUILD_BANK_SWAP_ITEMS = 0x0847, - CMSG_GUILD_BANK_TEXT_QUERY = 0x0C0D, - CMSG_GUILD_BANK_UPDATE_TAB = 0x0A48, - CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x080F, - CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x0B1D, - CMSG_GUILD_CHANGE_NAME_REQUEST = 0x021A, - CMSG_GUILD_DECLINE_INVITATION = 0x085D, - CMSG_GUILD_DELETE = 0x054E, - CMSG_GUILD_DELETE_RANK = 0x095D, - CMSG_GUILD_DEMOTE_MEMBER = 0x040E, - CMSG_GUILD_EVENT_LOG_QUERY = 0x07CD, - CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x004D, - CMSG_GUILD_GET_RANKS = 0x030E, - CMSG_GUILD_GET_ROSTER = 0x015A, - CMSG_GUILD_INVITE_BY_NAME = 0x0845, - CMSG_GUILD_LEAVE = 0x044E, - CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x0A0D, - CMSG_GUILD_NEWS_UPDATE_STICKY = 0x0B4E, - CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x011E, - CMSG_GUILD_PERMISSIONS_QUERY = 0x010A, - CMSG_GUILD_PROMOTE_MEMBER = 0x011A, - CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x04CD, - CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x010D, - CMSG_GUILD_QUERY_NEWS = 0x080A, - CMSG_GUILD_QUERY_RECIPES = 0x094A, - CMSG_GUILD_REPLACE_GUILD_MASTER = 0x090E, - CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x014E, - CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x034E, - CMSG_GUILD_SET_GUILD_MASTER = 0x07A2, - CMSG_GUILD_SET_MEMBER_NOTE = 0x0B59, - CMSG_GUILD_SET_RANK_PERMISSIONS = 0x0A0A, - CMSG_GUILD_SHIFT_RANK = 0x015D, - CMSG_GUILD_UPDATE_INFO_TEXT = 0x0049, - CMSG_GUILD_UPDATE_MOTD_TEXT = 0x05CD, - CMSG_HEARTH_AND_RESURRECT = 0x08CF, - CMSG_IGNORE_TRADE = 0x18C3, - CMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x0282, - CMSG_INITIATE_ROLE_POLL = 0x02A1, - CMSG_INITIATE_TRADE = 0x12F4, - CMSG_INSPECT = 0x004C, - CMSG_INSPECT_PVP = 0x0AB2, - CMSG_INSTANCE_LOCK_RESPONSE = 0x06C7, - CMSG_ITEM_PURCHASE_REFUND = 0x028B, - CMSG_ITEM_TEXT_QUERY = 0x1774, - CMSG_JOIN_PET_BATTLE_QUEUE = 0x0185, - CMSG_JOIN_RATED_BATTLEGROUND = 0x1584, - CMSG_KEEP_ALIVE = 0x0325, - CMSG_KEYBOUND_OVERRIDE = 0x13F5, - CMSG_LEARN_PET_SPECIALIZATION_GROUP = 0x15C8, - CMSG_LEARN_TALENTS = 0x16A3, - CMSG_LEAVE_GROUP = 0x01C2, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0x1637, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x00D2, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x0A22, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x0131, - CMSG_LFG_LIST_GET_STATUS = 0x0D26, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x0931, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x0536, - CMSG_LFG_LIST_JOIN = 0x01B6, - CMSG_LFG_LIST_LEAVE = 0x0E36, - CMSG_LFG_LIST_SEARCH = 0x03D5, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x0FB2, - CMSG_LF_GUILD_ADD_RECRUIT = 0x0941, - CMSG_LF_GUILD_BROWSE = 0x0022, - CMSG_LF_GUILD_DECLINE_RECRUIT = 0x068A, - CMSG_LF_GUILD_GET_APPLICATIONS = 0x080E, - CMSG_LF_GUILD_GET_GUILD_POST = 0x0849, - CMSG_LF_GUILD_GET_RECRUITS = 0x078A, - CMSG_LF_GUILD_REMOVE_RECRUIT = 0x0449, - CMSG_LF_GUILD_SET_GUILD_POST = 0x0926, - CMSG_LIST_INVENTORY = 0x001F, - CMSG_LOADING_SCREEN_NOTIFY = 0x0735, - CMSG_LOAD_SELECTED_TROPHY = 0x1328, - CMSG_LOGOUT_CANCEL = 0x00C8, - CMSG_LOGOUT_INSTANT = 0x0410, - CMSG_LOGOUT_REQUEST = 0x085C, - CMSG_LOG_DISCONNECT = 0x045D, - CMSG_LOG_STREAMING_ERROR = 0x0DD9, - CMSG_LOOT_ITEM = 0x11C3, - CMSG_LOOT_MONEY = 0x0D24, - CMSG_LOOT_RELEASE = 0x17F6, - CMSG_LOOT_ROLL = 0x0B28, - CMSG_LOOT_UNIT = 0x14C8, - CMSG_LOW_LEVEL_RAID1 = 0x0CB6, - CMSG_LOW_LEVEL_RAID2 = 0x0618, - CMSG_MAIL_CREATE_TEXT_ITEM = 0x0660, - CMSG_MAIL_DELETE = 0x1984, - CMSG_MAIL_GET_LIST = 0x0090, - CMSG_MAIL_MARK_AS_READ = 0x029F, - CMSG_MAIL_RETURN_TO_SENDER = 0x0A36, - CMSG_MAIL_TAKE_ITEM = 0x0244, - CMSG_MAIL_TAKE_MONEY = 0x00CC, - CMSG_MASTER_LOOT_ITEM = 0x11C8, - CMSG_MINIMAP_PING = 0x02D2, - CMSG_MISSILE_TRAJECTORY_COLLISION = 0x0568, - CMSG_MOUNT_SET_FAVORITE = 0x01A5, - CMSG_MOUNT_SPECIAL_ANIM = 0x0E28, - CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x1B07, - CMSG_MOVE_CHANGE_TRANSPORT = 0x1B13, - CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x1B58, - CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x1604, - CMSG_MOVE_DISMISS_VEHICLE = 0x1A84, - CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x1794, - CMSG_MOVE_FALL_LAND = 0x12C8, - CMSG_MOVE_FALL_RESET = 0x1BC8, - CMSG_MOVE_FEATHER_FALL_ACK = 0x1707, - CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x1397, - CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x1A44, - CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x12C4, - CMSG_MOVE_FORCE_ROOT_ACK = 0x1747, - CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x1A04, - CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x1383, - CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x1B83, - CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x1314, - CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x1683, - CMSG_MOVE_FORCE_UNROOT_ACK = 0x1744, - CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x1E18, - CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x13D4, - CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x1394, - CMSG_MOVE_HEARTBEAT = 0x1B18, - CMSG_MOVE_HOVER_ACK = 0x1284, - CMSG_MOVE_JUMP = 0x1A18, - CMSG_MOVE_KNOCK_BACK_ACK = 0x1244, - CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x1688, - CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x1E07, - CMSG_MOVE_SET_CAN_FLY_ACK = 0x1798, - CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x17C7, - CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x1BC7, - CMSG_MOVE_SET_FACING = 0x1A13, - CMSG_MOVE_SET_FLY = 0x1384, - CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x1A97, - CMSG_MOVE_SET_PITCH = 0x1797, - CMSG_MOVE_SET_RELATIVE_POSITION = 0x1388, - CMSG_MOVE_SET_RUN_MODE = 0x1287, - CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x1BD7, - CMSG_MOVE_SET_WALK_MODE = 0x16C4, - CMSG_MOVE_SPLINE_DONE = 0x16C8, - CMSG_MOVE_START_ASCEND = 0x17C4, - CMSG_MOVE_START_BACKWARD = 0x1294, - CMSG_MOVE_START_DESCEND = 0x1B43, - CMSG_MOVE_START_FORWARD = 0x1B97, - CMSG_MOVE_START_PITCH_DOWN = 0x1704, - CMSG_MOVE_START_PITCH_UP = 0x12D7, - CMSG_MOVE_START_STRAFE_LEFT = 0x1A53, - CMSG_MOVE_START_STRAFE_RIGHT = 0x1657, - CMSG_MOVE_START_SWIM = 0x13C8, - CMSG_MOVE_START_TURN_LEFT = 0x1298, - CMSG_MOVE_START_TURN_RIGHT = 0x1A03, - CMSG_MOVE_STOP = 0x1A08, - CMSG_MOVE_STOP_ASCEND = 0x1303, - CMSG_MOVE_STOP_PITCH = 0x1A98, - CMSG_MOVE_STOP_STRAFE = 0x1218, - CMSG_MOVE_STOP_SWIM = 0x1247, - CMSG_MOVE_STOP_TURN = 0x16D7, - CMSG_MOVE_TELEPORT_ACK = 0x17C8, - CMSG_MOVE_TELEPORT_CHEAT = 0x1A57, - CMSG_MOVE_TIME_SKIPPED = 0x1317, - CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x1608, - CMSG_MOVE_WATER_WALK_ACK = 0x1754, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x1237, - CMSG_NEXT_CINEMATIC_CAMERA = 0x0057, - CMSG_OBJECT_UPDATE_FAILED = 0x1C87, - CMSG_OBJECT_UPDATE_RESCUED = 0x1988, - CMSG_OFFER_PETITION = 0x08B1, - CMSG_OPENING_CINEMATIC = 0x0650, - CMSG_OPEN_ITEM = 0x16F2, - CMSG_OPEN_MISSION_NPC = 0x0D64, - CMSG_OPEN_SHIPMENT_NPC = 0x0E92, - CMSG_OPEN_TRADESKILL_NPC = 0x0B24, - CMSG_OPT_OUT_OF_LOOT = 0x0A17, - CMSG_PARTY_INVITE = 0x10C1, - CMSG_PARTY_INVITE_RESPONSE = 0x0736, - CMSG_PARTY_UNINVITE = 0x01B2, - CMSG_PETITION_BUY = 0x00DB, - CMSG_PETITION_RENAME_GUILD = 0x0F26, - CMSG_PETITION_SHOW_LIST = 0x0208, - CMSG_PETITION_SHOW_SIGNATURES = 0x0658, - CMSG_PET_ABANDON = 0x02C3, - CMSG_PET_ACTION = 0x000B, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0x10C8, - CMSG_PET_BATTLE_INPUT = 0x0C25, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x1808, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0x1594, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x0D31, - CMSG_PET_BATTLE_REQUEST_PVP = 0x1DC8, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0x16A8, - CMSG_PET_BATTLE_REQUEST_WILD = 0x13F8, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x1C88, - CMSG_PET_CANCEL_AURA = 0x0A4F, - CMSG_PET_CAST_SPELL = 0x13E2, - CMSG_PET_RENAME = 0x09A1, - CMSG_PET_SET_ACTION = 0x06D8, - CMSG_PET_SPELL_AUTOCAST = 0x0083, - CMSG_PET_STOP_ATTACK = 0x0694, - CMSG_PING = 0x0659, - CMSG_PLAYER_LOGIN = 0x0921, - CMSG_PROTOCOL_MISMATCH = 0x0419, - CMSG_PUSH_QUEST_TO_PARTY = 0x044F, - CMSG_PVP_LOG_DATA = 0x1CC3, - CMSG_QUERY_BATTLE_PET_NAME = 0x0B23, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x05A1, - CMSG_QUERY_CORPSE_TRANSPORT = 0x0B32, - CMSG_QUERY_COUNTDOWN_TIMER = 0x1376, - CMSG_QUERY_CREATURE = 0x1408, - CMSG_QUERY_GAME_OBJECT = 0x17F8, - CMSG_QUERY_GARRISON_CREATURE_NAME = 0x1D14, - CMSG_QUERY_GUILD_INFO = 0x08B5, - CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x0A4B, - CMSG_QUERY_NEXT_MAIL_TIME = 0x0883, - CMSG_QUERY_NPC_TEXT = 0x1C47, - CMSG_QUERY_PAGE_TEXT = 0x1D94, - CMSG_QUERY_PETITION = 0x1675, - CMSG_QUERY_PET_NAME = 0x17E8, - CMSG_QUERY_PLAYER_NAME = 0x0DA6, - CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x1488, - CMSG_QUERY_QUEST_INFO = 0x0A24, - CMSG_QUERY_REALM_NAME = 0x0951, - CMSG_QUERY_SCENARIO_POI = 0x0236, - CMSG_QUERY_TIME = 0x025B, - CMSG_QUERY_VOID_STORAGE = 0x1814, - CMSG_QUEST_CONFIRM_ACCEPT = 0x0807, - CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x0014, - CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x0084, - CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x0017, - CMSG_QUEST_GIVER_HELLO = 0x009C, - CMSG_QUEST_GIVER_QUERY_QUEST = 0x0A43, - CMSG_QUEST_GIVER_REQUEST_REWARD = 0x0894, - CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x065C, - CMSG_QUEST_GIVER_STATUS_QUERY = 0x0493, - CMSG_QUEST_LOG_REMOVE_QUEST = 0x060B, - CMSG_QUEST_POI_QUERY = 0x05B5, - CMSG_QUEST_PUSH_RESULT = 0x089C, - CMSG_QUEUED_MESSAGES_END = 0x069A, - CMSG_RANDOM_ROLL = 0x0231, - CMSG_READY_CHECK_RESPONSE = 0x0B46, - CMSG_READ_ITEM = 0x1D43, - CMSG_RECLAIM_CORPSE = 0x0287, - CMSG_RECRUIT_A_FRIEND = 0x0031, - CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x0801, - CMSG_REDEEM_WOW_TOKEN_START = 0x09C6, - CMSG_REORDER_CHARACTERS = 0x0A45, - CMSG_REPAIR_ITEM = 0x0498, - CMSG_REPLACE_TROPHY = 0x0982, - CMSG_REPOP_REQUEST = 0x089F, - CMSG_REPORT_PVP_PLAYER_AFK = 0x04C7, - CMSG_REQUEST_ACCOUNT_DATA = 0x0A46, - CMSG_REQUEST_BATTLEFIELD_STATUS = 0x0122, - CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x0D23, - CMSG_REQUEST_CEMETERY_LIST = 0x15D3, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x0E02, - CMSG_REQUEST_FORCED_REACTIONS = 0x12E8, - CMSG_REQUEST_GUILD_PARTY_STATE = 0x0868, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0x1407, - CMSG_REQUEST_HONOR_STATS = 0x0146, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x1C94, - CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x0121, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0x0851, - CMSG_REQUEST_PET_INFO = 0x0288, - CMSG_REQUEST_PLAYED_TIME = 0x18D8, - CMSG_REQUEST_PVP_REWARDS = 0x1361, - CMSG_REQUEST_RAID_INFO = 0x0A12, - CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x1185, - CMSG_REQUEST_RESEARCH_HISTORY = 0x1768, - CMSG_REQUEST_STABLED_PETS = 0x04C4, - CMSG_REQUEST_VEHICLE_EXIT = 0x1843, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x1636, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x1737, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x14C4, - CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x05B1, - CMSG_RESET_CHALLENGE_MODE = 0x1A75, - CMSG_RESET_INSTANCES = 0x03B2, - CMSG_RESURRECT_RESPONSE = 0x0535, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x062C, - CMSG_RIDE_VEHICLE_INTERACT = 0x1A34, - CMSG_SAVE_CUF_PROFILES = 0x1267, - CMSG_SAVE_EQUIPMENT_SET = 0x04CF, - CMSG_SAVE_GUILD_EMBLEM = 0x0A2B, - CMSG_SCENE_PLAYBACK_CANCELED = 0x0145, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x0F2F, - CMSG_SCENE_TRIGGER_EVENT = 0x1621, - CMSG_SELF_RES = 0x0484, - CMSG_SELL_ITEM = 0x045B, - CMSG_SELL_WOW_TOKEN_CONFIRM = 0x0222, - CMSG_SELL_WOW_TOKEN_START = 0x06B1, - CMSG_SEND_CONTACT_LIST = 0x02D5, - CMSG_SEND_MAIL = 0x0DA1, - CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x02B2, - CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0x07B2, - CMSG_SEND_TEXT_EMOTE = 0x0A53, - CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x1723, - CMSG_SET_ACTION_BAR_TOGGLES = 0x0418, - CMSG_SET_ACTION_BUTTON = 0x03A5, - CMSG_SET_ACTIVE_MOVER = 0x12C3, - CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x0D32, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x0E12, - CMSG_SET_ASSISTANT_LEADER = 0x0C26, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x1233, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x0330, - CMSG_SET_BANK_BAG_SLOT_FLAG = 0x1507, - CMSG_SET_CONTACT_NOTES = 0x0901, - CMSG_SET_CURRENCY_FLAGS = 0x0E85, - CMSG_SET_DIFFICULTY_ID = 0x1634, - CMSG_SET_DUNGEON_DIFFICULTY = 0x0EA6, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x0432, - CMSG_SET_FACTION_AT_WAR = 0x028F, - CMSG_SET_FACTION_INACTIVE = 0x009B, - CMSG_SET_FACTION_NOT_AT_WAR = 0x0A10, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x0D63, - CMSG_SET_LFG_BONUS_FACTION_ID = 0x1363, - CMSG_SET_LOOT_METHOD = 0x05A2, - CMSG_SET_LOOT_SPECIALIZATION = 0x0048, - CMSG_SET_PARTY_ASSIGNMENT = 0x0636, - CMSG_SET_PARTY_LEADER = 0x0856, - CMSG_SET_PET_SLOT = 0x0C41, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x0522, - CMSG_SET_PREFERRED_CEMETERY = 0x1C08, - CMSG_SET_PVP = 0x13A1, - CMSG_SET_RAID_DIFFICULTY = 0x0F25, - CMSG_SET_ROLE = 0x0A25, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x0521, - CMSG_SET_SELECTION = 0x0610, - CMSG_SET_SHEATHED = 0x06DC, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x1268, - CMSG_SET_SPECIALIZATION = 0x17A7, - CMSG_SET_TAXI_BENCHMARK_MODE = 0x04D7, - CMSG_SET_TITLE = 0x1676, - CMSG_SET_TRADE_CURRENCY = 0x0886, - CMSG_SET_TRADE_GOLD = 0x1761, - CMSG_SET_TRADE_ITEM = 0x0152, - CMSG_SET_USING_PARTY_GARRISON = 0x1338, - CMSG_SET_WATCHED_FACTION = 0x0007, - CMSG_SHOWING_CLOAK = 0x0843, - CMSG_SHOWING_HELM = 0x0A5B, - CMSG_SHOW_TRADE_SKILL = 0x01D2, - CMSG_SIGN_PETITION = 0x08D4, - CMSG_SILENCE_PARTY_TALKER = 0x0925, - CMSG_SOCKET_GEMS = 0x0260, - CMSG_SORT_BAGS = 0x16A1, - CMSG_SORT_BANK_BAGS = 0x1A74, - CMSG_SORT_REAGENT_BANK_BAGS = 0x18C8, - CMSG_SPELL_CLICK = 0x0403, - CMSG_SPIRIT_HEALER_ACTIVATE = 0x0A54, - CMSG_SPLIT_ITEM = 0x0370, - CMSG_STAND_STATE_CHANGE = 0x1913, - CMSG_START_SPECTATOR_WAR_GAME = 0x0891, - CMSG_START_WAR_GAME = 0x03A6, - CMSG_SUMMON_RESPONSE = 0x0E25, - CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x0B55, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x0F35, - CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x03D6, - CMSG_SUSPEND_COMMS_ACK = 0x0C99, - CMSG_SUSPEND_TOKEN_RESPONSE = 0x0C9E, - CMSG_SWAP_INV_ITEM = 0x0651, - CMSG_SWAP_ITEM = 0x066C, - CMSG_SWAP_SUB_GROUPS = 0x0A52, - CMSG_SWAP_VOID_ITEM = 0x0ED2, - CMSG_TABARD_VENDOR_ACTIVATE = 0x1625, - CMSG_TALK_TO_GOSSIP = 0x04D3, - CMSG_TAXI_NODE_STATUS_QUERY = 0x0284, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x0218, - CMSG_TAXI_REQUEST_EARLY_LANDING = 0x088F, - CMSG_TELEPORT_TO_UNIT = 0x0A21, - CMSG_TIME_ADJUSTMENT_RESPONSE = 0x1344, - CMSG_TIME_SYNC_RESPONSE = 0x1A94, - CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x1283, - CMSG_TIME_SYNC_RESPONSE_FAILED = 0x13C7, - CMSG_TOGGLE_DIFFICULTY = 0x0AB6, - CMSG_TOGGLE_PVP = 0x16E4, - CMSG_TOTEM_DESTROYED = 0x0614, - CMSG_TOY_SET_FAVORITE = 0x02D6, - CMSG_TRAINER_BUY_SPELL = 0x0207, - CMSG_TRAINER_LIST = 0x0258, - CMSG_TRANSMOGRIFY_ITEMS = 0x1147, - CMSG_TURN_IN_PETITION = 0x069F, - CMSG_TUTORIAL = 0x0842, - CMSG_TWITTER_CHECK_STATUS = 0x08F4, - CMSG_TWITTER_CONNECT = 0x04A3, - CMSG_TWITTER_DISCONNECT = 0x00AB, - CMSG_TWITTER_POST = 0x12A4, - CMSG_UI_TIME_REQUEST = 0x0905, - CMSG_UNACCEPT_TRADE = 0x1666, - CMSG_UNDELETE_CHARACTER = 0x0DB1, - CMSG_UNLEARN_SKILL = 0x04DB, - CMSG_UNLEARN_SPECIALIZATION = 0x1778, - CMSG_UNLOCK_VOID_STORAGE = 0x032C, - CMSG_UPDATE_ACCOUNT_DATA = 0x0FA2, - CMSG_UPDATE_CLIENT_SETTINGS = 0x0812, - CMSG_UPDATE_MISSILE_TRAJECTORY = 0x13B2, - CMSG_UPDATE_RAID_TARGET = 0x0BD6, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x0722, - CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x0E26, - CMSG_UPDATE_WOW_TOKEN_COUNT = 0x08B2, - CMSG_UPGRADE_GARRISON = 0x1117, - CMSG_UPGRADE_ITEM = 0x1047, - CMSG_USED_FOLLOW = 0x0C46, - CMSG_USE_CRITTER_ITEM = 0x1018, - CMSG_USE_EQUIPMENT_SET = 0x0668, - CMSG_USE_ITEM = 0x1144, - CMSG_USE_TOY = 0x16F1, - CMSG_VIOLENCE_LEVEL = 0x1118, - CMSG_VOICE_ADD_IGNORE = 0x00D5, - CMSG_VOICE_DEL_IGNORE = 0x0425, - CMSG_VOICE_SESSION_ENABLE = 0x08A5, - CMSG_VOID_STORAGE_TRANSFER = 0x0A82, - CMSG_WARDEN_DATA = 0x0AA6, - CMSG_WHO = 0x03A2, - CMSG_WHO_IS = 0x0126, - CMSG_WORLD_PORT_RESPONSE = 0x04B6, - CMSG_WORLD_TELEPORT = 0x0A35, - CMSG_WRAP_ITEM = 0x0363 + CMSG_ACCEPT_GUILD_INVITE = 0x08E3, + CMSG_ACCEPT_LEVEL_GRANT = 0x0FCE, + CMSG_ACCEPT_TRADE = 0x1ACF, + CMSG_ACCEPT_WARGAME_INVITE = 0x097C, + CMSG_ACTIVATE_TAXI = 0x0815, + CMSG_ADD_BATTLENET_FRIEND = 0x0273, + CMSG_ADD_FRIEND = 0x09AC, + CMSG_ADD_IGNORE = 0x0862, + CMSG_ADD_TOY = 0x0144, + CMSG_ALTER_APPEARANCE = 0x0F1D, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x068A, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x0C31, + CMSG_AREA_TRIGGER = 0x12D0, + CMSG_ATTACK_STOP = 0x1020, + CMSG_ATTACK_SWING = 0x17A0, + CMSG_AUCTION_HELLO_REQUEST = 0x0F0D, + CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x0F5D, + CMSG_AUCTION_LIST_ITEMS = 0x051E, + CMSG_AUCTION_LIST_OWNER_ITEMS = 0x1C22, + CMSG_AUCTION_LIST_PENDING_SALES = 0x0C95, + CMSG_AUCTION_PLACE_BID = 0x0609, + CMSG_AUCTION_REMOVE_ITEM = 0x0E71, + CMSG_AUCTION_REPLICATE_ITEMS = 0x040D, + CMSG_AUCTION_SELL_ITEM = 0x058E, + CMSG_AUTH_CONTINUED_SESSION = 0x1926, + CMSG_AUTH_SESSION = 0x116D, + CMSG_AUTOBANK_ITEM = 0x10CC, + CMSG_AUTOBANK_REAGENT = 0x10DB, + CMSG_AUTOSTORE_BANK_ITEM = 0x111C, + CMSG_AUTOSTORE_BANK_REAGENT = 0x108B, + CMSG_AUTO_EQUIP_ITEM = 0x1119, + CMSG_AUTO_EQUIP_ITEM_SLOT = 0x121C, + CMSG_AUTO_STORE_BAG_ITEM = 0x1109, + CMSG_BANKER_ACTIVATE = 0x0E9A, + CMSG_BATTLEFIELD_LEAVE = 0x0D08, + CMSG_BATTLEFIELD_LIST = 0x0103, + CMSG_BATTLEFIELD_PORT = 0x0C96, + CMSG_BATTLEMASTER_HELLO = 0x0191, + CMSG_BATTLEMASTER_JOIN = 0x1E22, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x06DD, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x0C9E, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x0971, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x086A, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x03BC, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x00AA, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x0973, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x03B9, + CMSG_BATTLE_PAY_START_PURCHASE = 0x03A3, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x0164, + CMSG_BATTLE_PET_DELETE_PET = 0x09A3, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x0173, + CMSG_BATTLE_PET_MODIFY_NAME = 0x092C, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x08A9, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x0924, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x02E9, + CMSG_BATTLE_PET_SET_FLAGS = 0x01BA, + CMSG_BATTLE_PET_SUMMON = 0x01B9, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x0D55, + CMSG_BEGIN_TRADE = 0x0812, + CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0x09A9, + CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0x08FC, + CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0x0931, + CMSG_BF_MGR_QUEUE_REQUEST = 0x11CE, + CMSG_BINDER_ACTIVATE = 0x0D5A, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x0E1A, + CMSG_BLACK_MARKET_OPEN = 0x065D, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x0897, + CMSG_BUG_REPORT = 0x00FA, + CMSG_BUSY_TRADE = 0x1C5E, + CMSG_BUY_BACK_ITEM = 0x064A, + CMSG_BUY_BANK_SLOT = 0x0C09, + CMSG_BUY_ITEM = 0x078D, + CMSG_BUY_REAGENT_BANK = 0x0C19, + CMSG_BUY_WOW_TOKEN_CONFIRM = 0x09FA, + CMSG_BUY_WOW_TOKEN_START = 0x08B2, + CMSG_CAGE_BATTLE_PET = 0x16DE, + CMSG_CALENDAR_ADD_EVENT = 0x02FA, + CMSG_CALENDAR_COMPLAIN = 0x017C, + CMSG_CALENDAR_COPY_EVENT = 0x00BB, + CMSG_CALENDAR_EVENT_INVITE = 0x006A, + CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x086B, + CMSG_CALENDAR_EVENT_RSVP = 0x097A, + CMSG_CALENDAR_EVENT_SIGN_UP = 0x022C, + CMSG_CALENDAR_EVENT_STATUS = 0x00F9, + CMSG_CALENDAR_GET = 0x0A39, + CMSG_CALENDAR_GET_EVENT = 0x0821, + CMSG_CALENDAR_GET_NUM_PENDING = 0x083A, + CMSG_CALENDAR_GUILD_FILTER = 0x02B9, + CMSG_CALENDAR_REMOVE_EVENT = 0x0271, + CMSG_CALENDAR_REMOVE_INVITE = 0x0239, + CMSG_CALENDAR_UPDATE_EVENT = 0x0261, + CMSG_CANCEL_AURA = 0x15DD, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x0D0D, + CMSG_CANCEL_CAST = 0x10DF, + CMSG_CANCEL_CHANNELLING = 0x14D0, + CMSG_CANCEL_GROWTH_AURA = 0x0915, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x1A8E, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x0826, + CMSG_CANCEL_MOUNT_AURA = 0x1CCF, + CMSG_CANCEL_QUEUED_SPELL = 0x148E, + CMSG_CANCEL_TEMP_ENCHANTMENT = 0x0C59, + CMSG_CANCEL_TRADE = 0x115F, + CMSG_CAN_DUEL = 0x09F2, + CMSG_CAST_SPELL = 0x191D, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x08C0, + CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x006D, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x09D4, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x0184, + CMSG_CHANGE_SUB_GROUP = 0x00AC, + CMSG_CHARACTER_RENAME_REQUEST = 0x01FC, + CMSG_CHAR_CUSTOMIZE = 0x01F9, + CMSG_CHAR_DELETE = 0x093C, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x01B2, + CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x0BF5, + CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x0A53, + CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x11B8, + CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x11C0, + CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x11BF, + CMSG_CHAT_ADDON_MESSAGE_RAID = 0x1E0F, + CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x13AF, + CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x161D, + CMSG_CHAT_CHANNEL_BAN = 0x148B, + CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x0A55, + CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x09A8, + CMSG_CHAT_CHANNEL_INVITE = 0x13E6, + CMSG_CHAT_CHANNEL_KICK = 0x01FE, + CMSG_CHAT_CHANNEL_LIST = 0x01A6, + CMSG_CHAT_CHANNEL_MODERATE = 0x13BF, + CMSG_CHAT_CHANNEL_MODERATOR = 0x14CB, + CMSG_CHAT_CHANNEL_MUTE = 0x1619, + CMSG_CHAT_CHANNEL_OWNER = 0x17CC, + CMSG_CHAT_CHANNEL_PASSWORD = 0x09F5, + CMSG_CHAT_CHANNEL_SET_OWNER = 0x03A6, + CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x149B, + CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x165D, + CMSG_CHAT_CHANNEL_UNBAN = 0x11B0, + CMSG_CHAT_CHANNEL_UNMODERATOR = 0x03BD, + CMSG_CHAT_CHANNEL_UNMUTE = 0x1E4A, + CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x13A5, + CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x1E59, + CMSG_CHAT_CHANNEL_VOICE_OFF = 0x158B, + CMSG_CHAT_CHANNEL_VOICE_ON = 0x1AD8, + CMSG_CHAT_JOIN_CHANNEL = 0x15CA, + CMSG_CHAT_LEAVE_CHANNEL = 0x1499, + CMSG_CHAT_MESSAGE_AFK = 0x1857, + CMSG_CHAT_MESSAGE_CHANNEL = 0x11ED, + CMSG_CHAT_MESSAGE_DND = 0x0A52, + CMSG_CHAT_MESSAGE_EMOTE = 0x159B, + CMSG_CHAT_MESSAGE_GUILD = 0x18D1, + CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x13C0, + CMSG_CHAT_MESSAGE_OFFICER = 0x0A00, + CMSG_CHAT_MESSAGE_PARTY = 0x03F5, + CMSG_CHAT_MESSAGE_RAID = 0x0A57, + CMSG_CHAT_MESSAGE_RAID_WARNING = 0x01AF, + CMSG_CHAT_MESSAGE_SAY = 0x1AD3, + CMSG_CHAT_MESSAGE_WHISPER = 0x0BC0, + CMSG_CHAT_MESSAGE_YELL = 0x0BA7, + CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x16DA, + CMSG_CHAT_REPORT_FILTERED = 0x17CB, + CMSG_CHAT_REPORT_IGNORED = 0x14DA, + CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x160E, + CMSG_CHECK_RAF_EMAIL_ENABLED = 0x0021, + CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x03A9, + CMSG_CHOICE_RESPONSE = 0x0558, + CMSG_CLEAR_RAID_MARKER = 0x19DE, + CMSG_CLEAR_TRADE_ITEM = 0x0114, + CMSG_CLIENT_PORT_GRAVEYARD = 0x0A17, + CMSG_CLOSE_INTERACTION = 0x0559, + CMSG_COMMENTATOR_ENABLE = 0x08AA, + CMSG_COMMENTATOR_ENTER_INSTANCE = 0x01F1, + CMSG_COMMENTATOR_EXIT_INSTANCE = 0x022B, + CMSG_COMMENTATOR_GET_MAP_INFO = 0x0139, + CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x0179, + CMSG_COMMENTATOR_START_WARGAME = 0x0223, + CMSG_COMPLAINT = 0x0874, + CMSG_COMPLETE_CINEMATIC = 0x0FDA, + CMSG_COMPLETE_MOVIE = 0x0C69, + CMSG_CONFIRM_RESPEC_WIPE = 0x0151, + CMSG_CONNECT_TO_FAILED = 0x0272, + CMSG_CONVERT_RAID = 0x02AB, + CMSG_CREATE_CHARACTER = 0x00B2, + CMSG_CREATE_SHIPMENT = 0x0275, + CMSG_DB_QUERY_BULK = 0x03E2, + CMSG_DECLINE_GUILD_INVITES = 0x0E8E, + CMSG_DECLINE_PETITION = 0x0499, + CMSG_DELETE_EQUIPMENT_SET = 0x1E69, + CMSG_DEL_FRIEND = 0x0962, + CMSG_DEL_IGNORE = 0x02A2, + CMSG_DEPOSIT_REAGENT_BANK = 0x114D, + CMSG_DESTROY_ITEM = 0x1C5A, + CMSG_DF_BOOT_PLAYER_VOTE = 0x01B1, + CMSG_DF_GET_JOIN_STATUS = 0x013C, + CMSG_DF_GET_SYSTEM_INFO = 0x002B, + CMSG_DF_JOIN = 0x00BA, + CMSG_DF_LEAVE = 0x0A21, + CMSG_DF_PROPOSAL_RESPONSE = 0x03AB, + CMSG_DF_READY_CHECK_RESPONSE = 0x0A3A, + CMSG_DF_SEARCH_JOIN = 0x0232, + CMSG_DF_SEARCH_LEAVE = 0x0A32, + CMSG_DF_SET_COMMENT = 0x01F4, + CMSG_DF_SET_ROLES = 0x03FB, + CMSG_DF_TELEPORT = 0x00E1, + CMSG_DISCARDED_TIME_SYNC_ACKS = 0x0387, + CMSG_DISMISS_CRITTER = 0x0EDD, + CMSG_DO_MASTER_LOOT_ROLL = 0x1460, + CMSG_DO_READY_CHECK = 0x00FB, + CMSG_DUEL_RESPONSE = 0x045D, + CMSG_EJECT_PASSENGER = 0x0917, + CMSG_EMOTE = 0x0F0A, + CMSG_ENABLE_NAGLE = 0x017D, + CMSG_ENABLE_TAXI_NODE = 0x1C62, + CMSG_ENGINE_SURVEY = 0x0824, + CMSG_ENUM_CHARACTERS = 0x09FB, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x003C, + CMSG_FAR_SIGHT = 0x0E97, + CMSG_GAME_OBJ_REPORT_USE = 0x06CE, + CMSG_GAME_OBJ_USE = 0x05DA, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x0067, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x1A9F, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x14E0, + CMSG_GARRISON_COMPLETE_MISSION = 0x0C11, + CMSG_GARRISON_GENERATE_RECRUITS = 0x09C5, + CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x14CE, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x191E, + CMSG_GARRISON_PURCHASE_BUILDING = 0x121D, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x1DCD, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x0505, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x1A5F, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x100E, + CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x1C0E, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x17DE, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x0814, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x0182, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x0554, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x1B0E, + CMSG_GARRISON_START_MISSION = 0x0187, + CMSG_GARRISON_SWAP_BUILDINGS = 0x0997, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x02F4, + CMSG_GET_CHALLENGE_MODE_REWARDS = 0x02A6, + CMSG_GET_GARRISON_INFO = 0x1235, + CMSG_GET_ITEM_PURCHASE_DATA = 0x061E, + CMSG_GET_MIRROR_IMAGE_DATA = 0x1A8D, + CMSG_GET_PVP_OPTIONS_ENABLED = 0x03BA, + CMSG_GET_REMAINING_GAME_TIME = 0x032A, + CMSG_GET_TROPHY_LIST = 0x1290, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x0921, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x0964, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x03E1, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x02EB, + CMSG_GOSSIP_SELECT_OPTION = 0x0CDE, + CMSG_GRANT_LEVEL = 0x0E17, + CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x187D, + CMSG_GUILD_ADD_RANK = 0x102E, + CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x02AF, + CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x0A3D, + CMSG_GUILD_BANK_ACTIVATE = 0x0E18, + CMSG_GUILD_BANK_BUY_TAB = 0x0619, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x0C72, + CMSG_GUILD_BANK_LOG_QUERY = 0x10A6, + CMSG_GUILD_BANK_QUERY_TAB = 0x048A, + CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x0AAE, + CMSG_GUILD_BANK_SET_TAB_TEXT = 0x102D, + CMSG_GUILD_BANK_SWAP_ITEMS = 0x0E5D, + CMSG_GUILD_BANK_TEXT_QUERY = 0x0CD1, + CMSG_GUILD_BANK_UPDATE_TAB = 0x1E32, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x0ECA, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x087D, + CMSG_GUILD_CHANGE_NAME_REQUEST = 0x10A5, + CMSG_GUILD_DECLINE_INVITATION = 0x00AE, + CMSG_GUILD_DELETE = 0x122E, + CMSG_GUILD_DELETE_RANK = 0x1A3E, + CMSG_GUILD_DEMOTE_MEMBER = 0x0ED1, + CMSG_GUILD_EVENT_LOG_QUERY = 0x007D, + CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x026D, + CMSG_GUILD_GET_RANKS = 0x0ED2, + CMSG_GUILD_GET_ROSTER = 0x082E, + CMSG_GUILD_INVITE_BY_NAME = 0x023B, + CMSG_GUILD_LEAVE = 0x08B8, + CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x10A8, + CMSG_GUILD_NEWS_UPDATE_STICKY = 0x00AD, + CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x1ED2, + CMSG_GUILD_PERMISSIONS_QUERY = 0x003E, + CMSG_GUILD_PROMOTE_MEMBER = 0x0ABD, + CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x0C53, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x0AA6, + CMSG_GUILD_QUERY_NEWS = 0x10B0, + CMSG_GUILD_QUERY_RECIPES = 0x022E, + CMSG_GUILD_REPLACE_GUILD_MASTER = 0x10AF, + CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x1A2E, + CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x02B0, + CMSG_GUILD_SET_GUILD_MASTER = 0x0071, + CMSG_GUILD_SET_MEMBER_NOTE = 0x00A6, + CMSG_GUILD_SET_RANK_PERMISSIONS = 0x0ABE, + CMSG_GUILD_SHIFT_RANK = 0x0C52, + CMSG_GUILD_UPDATE_INFO_TEXT = 0x002D, + CMSG_GUILD_UPDATE_MOTD_TEXT = 0x0ED8, + CMSG_HEARTH_AND_RESURRECT = 0x055E, + CMSG_IGNORE_TRADE = 0x09D5, + CMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x188F, + CMSG_INITIATE_ROLE_POLL = 0x02BA, + CMSG_INITIATE_TRADE = 0x0544, + CMSG_INSPECT = 0x07CD, + CMSG_INSPECT_PVP = 0x03A4, + CMSG_INSTANCE_LOCK_RESPONSE = 0x054A, + CMSG_ITEM_PURCHASE_REFUND = 0x0FD9, + CMSG_ITEM_TEXT_QUERY = 0x0A78, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x180E, + CMSG_JOIN_RATED_BATTLEGROUND = 0x1B5D, + CMSG_KEEP_ALIVE = 0x00A1, + CMSG_KEYBOUND_OVERRIDE = 0x1BD0, + CMSG_LEARN_PET_SPECIALIZATION_GROUP = 0x0982, + CMSG_LEARN_TALENTS = 0x1A35, + CMSG_LEAVE_GROUP = 0x02E2, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x15D0, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x09F3, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x0022, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x0333, + CMSG_LFG_LIST_GET_STATUS = 0x09BB, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x08F1, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x0262, + CMSG_LFG_LIST_JOIN = 0x09EC, + CMSG_LFG_LIST_LEAVE = 0x0932, + CMSG_LFG_LIST_SEARCH = 0x01E1, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x08F2, + CMSG_LF_GUILD_ADD_RECRUIT = 0x0279, + CMSG_LF_GUILD_BROWSE = 0x0379, + CMSG_LF_GUILD_DECLINE_RECRUIT = 0x0AA5, + CMSG_LF_GUILD_GET_APPLICATIONS = 0x0A7D, + CMSG_LF_GUILD_GET_GUILD_POST = 0x1ED1, + CMSG_LF_GUILD_GET_RECRUITS = 0x1CD4, + CMSG_LF_GUILD_REMOVE_RECRUIT = 0x00BD, + CMSG_LF_GUILD_SET_GUILD_POST = 0x087A, + CMSG_LIST_INVENTORY = 0x0E9D, + CMSG_LOADING_SCREEN_NOTIFY = 0x00FC, + CMSG_LOAD_SELECTED_TROPHY = 0x189F, + CMSG_LOGOUT_CANCEL = 0x050E, + CMSG_LOGOUT_INSTANT = 0x049A, + CMSG_LOGOUT_REQUEST = 0x0C5E, + CMSG_LOG_DISCONNECT = 0x117E, + CMSG_LOG_STREAMING_ERROR = 0x1170, + CMSG_LOOT_ITEM = 0x09C6, + CMSG_LOOT_MONEY = 0x05C1, + CMSG_LOOT_RELEASE = 0x1A5D, + CMSG_LOOT_ROLL = 0x15CD, + CMSG_LOOT_UNIT = 0x1ACE, + CMSG_LOW_LEVEL_RAID1 = 0x092A, + CMSG_LOW_LEVEL_RAID2 = 0x0C9D, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x0E0E, + CMSG_MAIL_DELETE = 0x14DD, + CMSG_MAIL_GET_LIST = 0x048D, + CMSG_MAIL_MARK_AS_READ = 0x0C99, + CMSG_MAIL_RETURN_TO_SENDER = 0x0A3C, + CMSG_MAIL_TAKE_ITEM = 0x0E0A, + CMSG_MAIL_TAKE_MONEY = 0x0E39, + CMSG_MASTER_LOOT_ITEM = 0x138E, + CMSG_MINIMAP_PING = 0x09BC, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x05C3, + CMSG_MOUNT_SET_FAVORITE = 0x09A4, + CMSG_MOUNT_SPECIAL_ANIM = 0x0948, + CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x0781, + CMSG_MOVE_CHANGE_TRANSPORT = 0x0397, + CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x0703, + CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x0F08, + CMSG_MOVE_DISMISS_VEHICLE = 0x0315, + CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x07D8, + CMSG_MOVE_FALL_LAND = 0x07D2, + CMSG_MOVE_FALL_RESET = 0x0B91, + CMSG_MOVE_FEATHER_FALL_ACK = 0x0F04, + CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x0B13, + CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x0F05, + CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x0718, + CMSG_MOVE_FORCE_ROOT_ACK = 0x0382, + CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x0745, + CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x03C7, + CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x0B42, + CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x0F01, + CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x07C3, + CMSG_MOVE_FORCE_UNROOT_ACK = 0x03D7, + CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x0793, + CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x0711, + CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x03C5, + CMSG_MOVE_HEARTBEAT = 0x0306, + CMSG_MOVE_HOVER_ACK = 0x0704, + CMSG_MOVE_JUMP = 0x0B94, + CMSG_MOVE_KNOCK_BACK_ACK = 0x0BC6, + CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x0F07, + CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x0311, + CMSG_MOVE_SET_CAN_FLY_ACK = 0x03D6, + CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x0342, + CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x07D7, + CMSG_MOVE_SET_FACING = 0x0B15, + CMSG_MOVE_SET_FLY = 0x0B43, + CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x0B88, + CMSG_MOVE_SET_PITCH = 0x0747, + CMSG_MOVE_SET_RELATIVE_POSITION = 0x0352, + CMSG_MOVE_SET_RUN_MODE = 0x0BC2, + CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x0707, + CMSG_MOVE_SET_WALK_MODE = 0x0712, + CMSG_MOVE_SPLINE_DONE = 0x0741, + CMSG_MOVE_START_ASCEND = 0x0B58, + CMSG_MOVE_START_BACKWARD = 0x0BD5, + CMSG_MOVE_START_DESCEND = 0x0754, + CMSG_MOVE_START_FORWARD = 0x0B14, + CMSG_MOVE_START_PITCH_DOWN = 0x0BD6, + CMSG_MOVE_START_PITCH_UP = 0x0302, + CMSG_MOVE_START_STRAFE_LEFT = 0x0B47, + CMSG_MOVE_START_STRAFE_RIGHT = 0x0B06, + CMSG_MOVE_START_SWIM = 0x0B48, + CMSG_MOVE_START_TURN_LEFT = 0x03D2, + CMSG_MOVE_START_TURN_RIGHT = 0x0782, + CMSG_MOVE_STOP = 0x0351, + CMSG_MOVE_STOP_ASCEND = 0x0B82, + CMSG_MOVE_STOP_PITCH = 0x0792, + CMSG_MOVE_STOP_STRAFE = 0x0753, + CMSG_MOVE_STOP_SWIM = 0x0715, + CMSG_MOVE_STOP_TURN = 0x07D4, + CMSG_MOVE_TELEPORT_ACK = 0x0B05, + CMSG_MOVE_TELEPORT_CHEAT = 0x0303, + CMSG_MOVE_TIME_SKIPPED = 0x0787, + CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x0757, + CMSG_MOVE_WATER_WALK_ACK = 0x07C7, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x1BCD, + CMSG_NEXT_CINEMATIC_CAMERA = 0x0E32, + CMSG_OBJECT_UPDATE_FAILED = 0x11E0, + CMSG_OBJECT_UPDATE_RESCUED = 0x1C4F, + CMSG_OFFER_PETITION = 0x08A3, + CMSG_OPENING_CINEMATIC = 0x0FDD, + CMSG_OPEN_ITEM = 0x1310, + CMSG_OPEN_MISSION_NPC = 0x1FA0, + CMSG_OPEN_SHIPMENT_NPC = 0x118D, + CMSG_OPEN_TRADESKILL_NPC = 0x1236, + CMSG_OPT_OUT_OF_LOOT = 0x1E3A, + CMSG_PARTY_INVITE = 0x0974, + CMSG_PARTY_INVITE_RESPONSE = 0x036B, + CMSG_PARTY_UNINVITE = 0x02B1, + CMSG_PETITION_BUY = 0x1E21, + CMSG_PETITION_RENAME_GUILD = 0x02FB, + CMSG_PETITION_SHOW_LIST = 0x0E19, + CMSG_PETITION_SHOW_SIGNATURES = 0x0F99, + CMSG_PET_ABANDON = 0x0F59, + CMSG_PET_ACTION = 0x0C79, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x11DE, + CMSG_PET_BATTLE_INPUT = 0x026C, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x0D98, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x1A1D, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x03A1, + CMSG_PET_BATTLE_REQUEST_PVP = 0x128E, + CMSG_PET_BATTLE_REQUEST_UPDATE = 0x141F, + CMSG_PET_BATTLE_REQUEST_WILD = 0x111F, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x0147, + CMSG_PET_CANCEL_AURA = 0x0C49, + CMSG_PET_CAST_SPELL = 0x16CF, + CMSG_PET_RENAME = 0x0133, + CMSG_PET_SET_ACTION = 0x0789, + CMSG_PET_SPELL_AUTOCAST = 0x065A, + CMSG_PET_STOP_ATTACK = 0x0E1E, + CMSG_PING = 0x0930, + CMSG_PLAYER_LOGIN = 0x03F9, + CMSG_PROTOCOL_MISMATCH = 0x0137, + CMSG_PUSH_QUEST_TO_PARTY = 0x0E69, + CMSG_PVP_LOG_DATA = 0x0143, + CMSG_QUERY_BATTLE_PET_NAME = 0x0278, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x09A1, + CMSG_QUERY_CORPSE_TRANSPORT = 0x0039, + CMSG_QUERY_COUNTDOWN_TIMER = 0x134E, + CMSG_QUERY_CREATURE = 0x0511, + CMSG_QUERY_GAME_OBJECT = 0x0995, + CMSG_QUERY_GARRISON_CREATURE_NAME = 0x118E, + CMSG_QUERY_GUILD_INFO = 0x033B, + CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x0D5E, + CMSG_QUERY_NEXT_MAIL_TIME = 0x0FCA, + CMSG_QUERY_NPC_TEXT = 0x13CF, + CMSG_QUERY_PAGE_TEXT = 0x1920, + CMSG_QUERY_PETITION = 0x124E, + CMSG_QUERY_PET_NAME = 0x0867, + CMSG_QUERY_PLAYER_NAME = 0x0929, + CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x0592, + CMSG_QUERY_QUEST_INFO = 0x1CDE, + CMSG_QUERY_REALM_NAME = 0x08B9, + CMSG_QUERY_SCENARIO_POI = 0x01F2, + CMSG_QUERY_TIME = 0x0C1E, + CMSG_QUERY_VOID_STORAGE = 0x05C2, + CMSG_QUEST_CONFIRM_ACCEPT = 0x1E2A, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x0817, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x0E59, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x0709, + CMSG_QUEST_GIVER_HELLO = 0x0FCD, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x07C9, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x0D0A, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x055D, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x075E, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x0E5A, + CMSG_QUEST_POI_QUERY = 0x082A, + CMSG_QUEST_PUSH_RESULT = 0x0D0E, + CMSG_QUEUED_MESSAGES_END = 0x0130, + CMSG_RANDOM_ROLL = 0x032B, + CMSG_READY_CHECK_RESPONSE = 0x0061, + CMSG_READ_ITEM = 0x199E, + CMSG_RECLAIM_CORPSE = 0x0C39, + CMSG_RECRUIT_A_FRIEND = 0x0373, + CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x0934, + CMSG_REDEEM_WOW_TOKEN_START = 0x0A2C, + CMSG_REORDER_CHARACTERS = 0x0233, + CMSG_REPAIR_ITEM = 0x0759, + CMSG_REPLACE_TROPHY = 0x1C5D, + CMSG_REPOP_REQUEST = 0x0F8D, + CMSG_REPORT_PVP_PLAYER_AFK = 0x05CA, + CMSG_REQUEST_ACCOUNT_DATA = 0x09F9, + CMSG_REQUEST_BATTLEFIELD_STATUS = 0x09EB, + CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x1BA0, + CMSG_REQUEST_CEMETERY_LIST = 0x0957, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x1C1F, + CMSG_REQUEST_FORCED_REACTIONS = 0x1C9D, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x1ADD, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x105F, + CMSG_REQUEST_HONOR_STATS = 0x0504, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x1960, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x0263, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x0171, + CMSG_REQUEST_PET_INFO = 0x0F9E, + CMSG_REQUEST_PLAYED_TIME = 0x0158, + CMSG_REQUEST_PVP_REWARDS = 0x190D, + CMSG_REQUEST_RAID_INFO = 0x01B4, + CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x0864, + CMSG_REQUEST_RESEARCH_HISTORY = 0x0265, + CMSG_REQUEST_STABLED_PETS = 0x0C9A, + CMSG_REQUEST_VEHICLE_EXIT = 0x09C1, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x0277, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x0036, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x1A20, + CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x01A2, + CMSG_RESET_CHALLENGE_MODE = 0x0918, + CMSG_RESET_INSTANCES = 0x03F4, + CMSG_RESURRECT_RESPONSE = 0x01E3, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x01C6, + CMSG_RIDE_VEHICLE_INTERACT = 0x0893, + CMSG_SAVE_CUF_PROFILES = 0x0195, + CMSG_SAVE_EQUIPMENT_SET = 0x060A, + CMSG_SAVE_GUILD_EMBLEM = 0x1AE0, + CMSG_SCENE_PLAYBACK_CANCELED = 0x0118, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x14DF, + CMSG_SCENE_TRIGGER_EVENT = 0x110F, + CMSG_SELF_RES = 0x05DE, + CMSG_SELL_ITEM = 0x0D1A, + CMSG_SELL_WOW_TOKEN_CONFIRM = 0x02B4, + CMSG_SELL_WOW_TOKEN_START = 0x03AA, + CMSG_SEND_CONTACT_LIST = 0x0961, + CMSG_SEND_MAIL = 0x00F3, + CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x03F3, + CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0x00E3, + CMSG_SEND_TEXT_EMOTE = 0x0D59, + CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x0907, + CMSG_SET_ACTION_BAR_TOGGLES = 0x0E49, + CMSG_SET_ACTION_BUTTON = 0x093B, + CMSG_SET_ACTIVE_MOVER = 0x0B96, + CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x0122, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x1EDF, + CMSG_SET_ASSISTANT_LEADER = 0x03B4, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x1B5E, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x16A0, + CMSG_SET_BANK_BAG_SLOT_FLAG = 0x1A9E, + CMSG_SET_CONTACT_NOTES = 0x037B, + CMSG_SET_CURRENCY_FLAGS = 0x12DF, + CMSG_SET_DIFFICULTY_ID = 0x125D, + CMSG_SET_DUNGEON_DIFFICULTY = 0x00B3, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x08A2, + CMSG_SET_FACTION_AT_WAR = 0x0699, + CMSG_SET_FACTION_INACTIVE = 0x0C71, + CMSG_SET_FACTION_NOT_AT_WAR = 0x0599, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x0077, + CMSG_SET_LFG_BONUS_FACTION_ID = 0x1910, + CMSG_SET_LOOT_METHOD = 0x02A4, + CMSG_SET_LOOT_SPECIALIZATION = 0x0449, + CMSG_SET_PARTY_ASSIGNMENT = 0x0329, + CMSG_SET_PARTY_LEADER = 0x037A, + CMSG_SET_PET_SLOT = 0x0DD7, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x00B4, + CMSG_SET_PREFERRED_CEMETERY = 0x1C8E, + CMSG_SET_PVP = 0x0A35, + CMSG_SET_RAID_DIFFICULTY = 0x09E9, + CMSG_SET_ROLE = 0x02F3, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x0923, + CMSG_SET_SELECTION = 0x0C98, + CMSG_SET_SHEATHED = 0x058D, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x1090, + CMSG_SET_SPECIALIZATION = 0x1320, + CMSG_SET_TAXI_BENCHMARK_MODE = 0x048E, + CMSG_SET_TITLE = 0x11CF, + CMSG_SET_TRADE_CURRENCY = 0x1C4B, + CMSG_SET_TRADE_GOLD = 0x145F, + CMSG_SET_TRADE_ITEM = 0x0157, + CMSG_SET_USING_PARTY_GARRISON = 0x0193, + CMSG_SET_WATCHED_FACTION = 0x06DA, + CMSG_SHOWING_CLOAK = 0x0E09, + CMSG_SHOWING_HELM = 0x0F5E, + CMSG_SHOW_TRADE_SKILL = 0x026A, + CMSG_SIGN_PETITION = 0x1C3A, + CMSG_SILENCE_PARTY_TALKER = 0x0224, + CMSG_SOCKET_GEMS = 0x0F9A, + CMSG_SORT_BAGS = 0x05C6, + CMSG_SORT_BANK_BAGS = 0x1C1A, + CMSG_SORT_REAGENT_BANK_BAGS = 0x1BCE, + CMSG_SPELL_CLICK = 0x1C7A, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x0C7A, + CMSG_SPLIT_ITEM = 0x120A, + CMSG_STAND_STATE_CHANGE = 0x1B4F, + CMSG_START_SPECTATOR_WAR_GAME = 0x08BC, + CMSG_START_WAR_GAME = 0x0063, + CMSG_SUMMON_RESPONSE = 0x082B, + CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x0939, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x02F2, + CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x0374, + CMSG_SUSPEND_COMMS_ACK = 0x092E, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x0978, + CMSG_SWAP_INV_ITEM = 0x1019, + CMSG_SWAP_ITEM = 0x119C, + CMSG_SWAP_SUB_GROUPS = 0x02A3, + CMSG_SWAP_VOID_ITEM = 0x1250, + CMSG_TABARD_VENDOR_ACTIVATE = 0x0D04, + CMSG_TALK_TO_GOSSIP = 0x079D, + CMSG_TAXI_NODE_STATUS_QUERY = 0x0C6A, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x0E8A, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x0F5A, + CMSG_TELEPORT_TO_UNIT = 0x01EB, + CMSG_TIME_ADJUSTMENT_RESPONSE = 0x0758, + CMSG_TIME_SYNC_RESPONSE = 0x0312, + CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x0392, + CMSG_TIME_SYNC_RESPONSE_FAILED = 0x0346, + CMSG_TOGGLE_DIFFICULTY = 0x0079, + CMSG_TOGGLE_PVP = 0x13DD, + CMSG_TOTEM_DESTROYED = 0x0E98, + CMSG_TOY_SET_FAVORITE = 0x016C, + CMSG_TRAINER_BUY_SPELL = 0x1C72, + CMSG_TRAINER_LIST = 0x0D5D, + CMSG_TRANSMOGRIFY_ITEMS = 0x1836, + CMSG_TURN_IN_PETITION = 0x0DC9, + CMSG_TUTORIAL = 0x09E2, + CMSG_TWITTER_CHECK_STATUS = 0x0DA6, + CMSG_TWITTER_CONNECT = 0x0DB9, + CMSG_TWITTER_DISCONNECT = 0x1DBA, + CMSG_TWITTER_POST = 0x0066, + CMSG_UI_TIME_REQUEST = 0x0339, + CMSG_UNACCEPT_TRADE = 0x05D2, + CMSG_UNDELETE_CHARACTER = 0x02B2, + CMSG_UNLEARN_SKILL = 0x1E29, + CMSG_UNLEARN_SPECIALIZATION = 0x145A, + CMSG_UNLOCK_VOID_STORAGE = 0x0D16, + CMSG_UPDATE_ACCOUNT_DATA = 0x02E3, + CMSG_UPDATE_CLIENT_SETTINGS = 0x0369, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x1B10, + CMSG_UPDATE_RAID_TARGET = 0x0969, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x0222, + CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x0371, + CMSG_UPDATE_WOW_TOKEN_COUNT = 0x01A1, + CMSG_UPGRADE_GARRISON = 0x0501, + CMSG_UPGRADE_ITEM = 0x13D0, + CMSG_USED_FOLLOW = 0x18E0, + CMSG_USE_CRITTER_ITEM = 0x1010, + CMSG_USE_EQUIPMENT_SET = 0x104C, + CMSG_USE_ITEM = 0x1490, + CMSG_USE_TOY = 0x0811, + CMSG_VIOLENCE_LEVEL = 0x0A76, + CMSG_VOICE_ADD_IGNORE = 0x02BB, + CMSG_VOICE_DEL_IGNORE = 0x002A, + CMSG_VOICE_SESSION_ENABLE = 0x0A29, + CMSG_VOID_STORAGE_TRANSFER = 0x0985, + CMSG_WARDEN_DATA = 0x01E2, + CMSG_WHO = 0x0829, + CMSG_WHO_IS = 0x03B2, + CMSG_WORLD_PORT_RESPONSE = 0x0069, + CMSG_WORLD_TELEPORT = 0x0062, + CMSG_WRAP_ITEM = 0x124C, }; enum OpcodeServer : uint32 { - SMSG_ABORT_NEW_WORLD = 0x0895, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x09C5, - SMSG_ACCOUNT_DATA_TIMES = 0x000C, - SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x0521, - SMSG_ACCOUNT_MOUNT_UPDATE = 0x085C, - SMSG_ACCOUNT_TOYS_UPDATE = 0x0ACF, - SMSG_ACHIEVEMENT_DELETED = 0x0093, - SMSG_ACHIEVEMENT_EARNED = 0x01A1, - SMSG_ACTIVATE_TAXI_REPLY = 0x0A90, - SMSG_ADDON_INFO = 0x0B21, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x03A5, - SMSG_ADD_ITEM_PASSIVE = 0x04C7, - SMSG_ADD_LOSS_OF_CONTROL = 0x0CB6, - SMSG_ADD_RUNE_POWER = 0x0288, - SMSG_ADJUST_SPLINE_DURATION = 0x025B, - SMSG_AE_LOOT_TARGETS = 0x02C7, - SMSG_AE_LOOT_TARGET_ACK = 0x0221, - SMSG_AI_REACTION = 0x080B, - SMSG_ALL_ACCOUNT_CRITERIA = 0x0887, - SMSG_ALL_ACHIEVEMENT_DATA = 0x0457, - SMSG_ALL_GUILD_ACHIEVEMENTS = 0x08E3, - SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x0825, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x03D5, - SMSG_AREA_TRIGGER_DENIED = 0x0436, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x0E90, - SMSG_AREA_TRIGGER_RE_PATH = 0x05A5, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x0C13, - SMSG_ARENA_ERROR = 0x0816, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x0E50, - SMSG_ATTACKER_STATE_UPDATE = 0x0813, - SMSG_ATTACK_START = 0x01B5, - SMSG_ATTACK_STOP = 0x0C57, - SMSG_ATTACK_SWING_ERROR = 0x0A95, - SMSG_ATTACK_SWING_LANDED_LOG = 0x0526, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x0C18, - SMSG_AUCTION_COMMAND_RESULT = 0x0B16, - SMSG_AUCTION_HELLO_RESPONSE = 0x0C5B, - SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x04A0, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x0847, - SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x0287, - SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x0EC3, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x04DB, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x0418, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x0ECB, - SMSG_AUCTION_WON_NOTIFICATION = 0x0636, - SMSG_AURA_POINTS_DEPLETED = 0x0C6D, - SMSG_AURA_UPDATE = 0x0ABD, - SMSG_AUTH_CHALLENGE = 0x1102, - SMSG_AUTH_RESPONSE = 0x0403, - SMSG_AVAILABLE_VOICE_CHANNEL = 0x1659, - SMSG_BARBER_SHOP_RESULT = 0x0E44, - SMSG_BATTLEFIELD_LIST = 0x0454, - SMSG_BATTLEFIELD_PORT_DENIED = 0x0058, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x065F, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x0525, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x06C8, - SMSG_BATTLEFIELD_STATUS_NONE = 0x0E22, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x0888, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x0B26, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x0B11, - SMSG_BATTLEGROUND_INIT = 0x0A11, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x00C8, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x0018, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x0C98, - SMSG_BATTLEGROUND_POINTS = 0x00D6, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x0532, - SMSG_BATTLENET_CHALLENGE_START = 0x0A18, - SMSG_BATTLE_PAY_ACK_FAILED = 0x0F25, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x0608, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x07A2, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x0ED3, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x06D0, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x04CF, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x0295, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x0EC4, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x0E14, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x0614, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x0858, - SMSG_BATTLE_PETS_HEALED = 0x0254, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x068F, - SMSG_BATTLE_PET_DELETED = 0x0AD8, - SMSG_BATTLE_PET_ERROR = 0x09A6, - SMSG_BATTLE_PET_JOURNAL = 0x060F, - SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x0AA0, - SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x02C4, - SMSG_BATTLE_PET_LICENSE_CHANGED = 0x05B1, - SMSG_BATTLE_PET_RESTORED = 0x0A51, - SMSG_BATTLE_PET_REVOKED = 0x0854, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x0247, - SMSG_BATTLE_PET_UPDATES = 0x0AD5, - SMSG_BF_MGR_DROP_TIMER_CANCELLED = 0x04D4, - SMSG_BF_MGR_DROP_TIMER_STARTED = 0x0617, - SMSG_BF_MGR_EJECTED = 0x0AD2, - SMSG_BF_MGR_EJECT_PENDING = 0x0603, - SMSG_BF_MGR_ENTERING = 0x028B, - SMSG_BF_MGR_ENTRY_INVITE = 0x0FA2, - SMSG_BF_MGR_QUEUE_INVITE = 0x0CC7, - SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0x0250, - SMSG_BF_MGR_QUEUE_STATUS_UPDATE = 0x0684, - SMSG_BF_MGR_STATE_CHANGED = 0x0C20, - SMSG_BINDER_CONFIRM = 0x0497, - SMSG_BIND_POINT_UPDATE = 0x00C4, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x0921, - SMSG_BLACK_MARKET_OPEN_RESULT = 0x0A58, - SMSG_BLACK_MARKET_OUTBID = 0x0226, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x0A14, - SMSG_BLACK_MARKET_WON = 0x01C5, - SMSG_BONUS_ROLL_EMPTY = 0x000F, - SMSG_BOSS_KILL_CREDIT = 0x06C4, - SMSG_BREAK_TARGET = 0x0A44, - SMSG_BUY_FAILED = 0x0604, - SMSG_BUY_SUCCEEDED = 0x0E26, - SMSG_CACHE_VERSION = 0x0932, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x09C2, - SMSG_CALENDAR_COMMAND_RESULT = 0x0722, - SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x0C48, - SMSG_CALENDAR_EVENT_INVITE = 0x0284, - SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x0C93, - SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x0735, - SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x0C53, - SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x0243, - SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x0484, - SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x00D8, - SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x0235, - SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x088C, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x09B6, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x0A87, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x0232, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x0C1B, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x0CC4, - SMSG_CALENDAR_SEND_CALENDAR = 0x088B, - SMSG_CALENDAR_SEND_EVENT = 0x05B2, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x08B5, - SMSG_CAMERA_SHAKE = 0x0C43, - SMSG_CANCEL_AUTO_REPEAT = 0x0814, - SMSG_CANCEL_COMBAT = 0x020F, - SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x01BD, - SMSG_CANCEL_SCENE = 0x0A15, - SMSG_CANCEL_SPELL_VISUAL = 0x006D, - SMSG_CANCEL_SPELL_VISUAL_KIT = 0x0BFA, - SMSG_CAN_DUEL_RESULT = 0x0098, - SMSG_CAST_FAILED = 0x066E, - SMSG_CATEGORY_COOLDOWN = 0x0C7E, - SMSG_CHALLEGE_MODE_REWARDS = 0x00E0, - SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x0A22, - SMSG_CHALLENGE_MODE_COMPLETE = 0x0935, - SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x0810, - SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x02D1, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x0453, - SMSG_CHALLENGE_MODE_RESET = 0x0E83, - SMSG_CHALLENGE_MODE_START = 0x068B, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x03B6, - SMSG_CHANNEL_LIST = 0x14DA, - SMSG_CHANNEL_NOTIFY = 0x1699, - SMSG_CHANNEL_NOTIFY_JOINED = 0x1519, - SMSG_CHANNEL_NOTIFY_LEFT = 0x145A, - SMSG_CHARACTER_LOGIN_FAILED = 0x0488, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x0CE0, - SMSG_CHARACTER_RENAME_RESULT = 0x00A6, - SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN = 0x00D3, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x0893, - SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x0860, - SMSG_CHARACTER_UPGRADE_STARTED = 0x07B5, - SMSG_CHAR_CUSTOMIZE = 0x0A1B, - SMSG_CHAR_CUSTOMIZE_FAILED = 0x041F, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x0C22, - SMSG_CHAT = 0x144A, - SMSG_CHAT_AUTO_RESPONDED = 0x15D9, - SMSG_CHAT_DOWN = 0x1CDA, - SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x1C89, - SMSG_CHAT_IS_DOWN = 0x1C8A, - SMSG_CHAT_NOT_IN_PARTY = 0x1719, - SMSG_CHAT_PLAYER_AMBIGUOUS = 0x1459, - SMSG_CHAT_PLAYER_NOTFOUND = 0x17D9, - SMSG_CHAT_RECONNECT = 0x179A, - SMSG_CHAT_RESTRICTED = 0x16DA, - SMSG_CHAT_SERVER_MESSAGE = 0x1D49, - SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x067D, - SMSG_CHECK_WARGAME_ENTRY = 0x0BB2, - SMSG_CHUNKED_PACKET = 0x1201, - SMSG_CLEAR_ALL_SPELL_CHARGES = 0x016D, - SMSG_CLEAR_BOSS_EMOTES = 0x0048, - SMSG_CLEAR_COOLDOWN = 0x0ED7, - SMSG_CLEAR_COOLDOWNS = 0x05BE, - SMSG_CLEAR_LOSS_OF_CONTROL = 0x0883, - SMSG_CLEAR_SPELL_CHARGES = 0x08A9, - SMSG_CLEAR_TARGET = 0x02D5, - SMSG_COIN_REMOVED = 0x0846, - SMSG_COMBAT_EVENT_FAILED = 0x0A46, - SMSG_COMMENTATOR_MAP_INFO = 0x061F, - SMSG_COMMENTATOR_PLAYER_INFO = 0x0A4C, - SMSG_COMMENTATOR_STATE_CHANGED = 0x0856, - SMSG_COMPLAINT_RESULT = 0x0D31, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x0643, - SMSG_COMPRESSED_PACKET = 0x1806, - SMSG_CONNECT_TO = 0x1101, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x0906, - SMSG_CONSOLE_WRITE = 0x06D3, - SMSG_CONTACT_LIST = 0x0B05, - SMSG_CONTROL_UPDATE = 0x004B, - SMSG_CONVERT_RUNE = 0x0822, - SMSG_COOLDOWN_CHEAT = 0x0E87, - SMSG_COOLDOWN_EVENT = 0x021F, - SMSG_CORPSE_LOCATION = 0x0905, - SMSG_CORPSE_RECLAIM_DELAY = 0x0031, - SMSG_CORPSE_TRANSPORT_QUERY = 0x02A0, - SMSG_CREATE_CHAR = 0x0A16, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x0220, - SMSG_CRITERIA_DELETED = 0x0EE0, - SMSG_CRITERIA_UPDATE = 0x0BA5, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x08D6, - SMSG_CUSTOM_LOAD_SCREEN = 0x02D6, - SMSG_DAILY_QUESTS_RESET = 0x090A, - SMSG_DAMAGE_CALC_LOG = 0x0CC3, - SMSG_DANCE_STUDIO_CREATE_RESULT = 0x0945, - SMSG_DB_REPLY = 0x0C5F, - SMSG_DEATH_RELEASE_LOC = 0x0A5C, - SMSG_DEFENSE_MESSAGE = 0x1CD9, - SMSG_DELETE_CHAR = 0x0E9B, - SMSG_DESTROY_ARENA_UNIT = 0x0322, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x02C8, - SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x03A2, - SMSG_DISENCHANT_CREDIT = 0x02DB, - SMSG_DISMOUNT = 0x02DF, - SMSG_DISMOUNT_RESULT = 0x0AB2, - SMSG_DISPEL_FAILED = 0x057E, - SMSG_DISPLAY_GAME_ERROR = 0x07B1, - SMSG_DISPLAY_PLAYER_CHOICE = 0x0244, - SMSG_DISPLAY_PROMOTION = 0x0B06, - SMSG_DISPLAY_QUEST_POPUP = 0x060D, - SMSG_DISPLAY_TOAST = 0x0B25, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x0931, - SMSG_DROP_NEW_CONNECTION = 0x1002, - SMSG_DUEL_COMPLETE = 0x03D2, - SMSG_DUEL_COUNTDOWN = 0x0450, - SMSG_DUEL_IN_BOUNDS = 0x069F, - SMSG_DUEL_OUT_OF_BOUNDS = 0x08B6, - SMSG_DUEL_REQUESTED = 0x0941, - SMSG_DUEL_WINNER = 0x0B15, - SMSG_DURABILITY_DAMAGE_DEATH = 0x0698, - SMSG_EMOTE = 0x0531, - SMSG_ENABLE_BARBER_SHOP = 0x09C6, - SMSG_ENCHANTMENT_LOG = 0x0926, - SMSG_ENCOUNTER_END = 0x08DF, - SMSG_ENCOUNTER_START = 0x08D7, - SMSG_ENUM_CHARACTERS_RESULT = 0x0290, - SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x093D, - SMSG_EQUIPMENT_SET_ID = 0x0843, - SMSG_EXPECTED_SPAM_RECORDS = 0x1C9A, - SMSG_EXPLORATION_EXPERIENCE = 0x0C90, - SMSG_FACTION_BONUS_INFO = 0x041C, - SMSG_FAILED_PLAYER_CONDITION = 0x0DA5, - SMSG_FEATURE_SYSTEM_STATUS = 0x0090, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x0683, - SMSG_FEIGN_DEATH_RESISTED = 0x0DB5, - SMSG_FINAL_CHUNK = 0x1305, - SMSG_FISH_ESCAPED = 0x0087, - SMSG_FISH_NOT_HOOKED = 0x0955, - SMSG_FLIGHT_SPLINE_SYNC = 0x0F23, - SMSG_FORCED_DEATH_UPDATE = 0x089F, - SMSG_FORCE_ANIM = 0x029F, - SMSG_FORCE_OBJECT_RELINK = 0x0E9F, - SMSG_FRIEND_STATUS = 0x0084, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x0335, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x0FB2, - SMSG_GAME_OBJECT_DESPAWN = 0x0E88, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x037D, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x0AAE, - SMSG_GAME_OBJECT_RESET_STATE = 0x07A6, - SMSG_GAME_SPEED_SET = 0x0125, - SMSG_GAME_TIME_SET = 0x0421, - SMSG_GAME_TIME_UPDATE = 0x0207, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x05E2, - SMSG_GARRISON_ADD_MISSION_RESULT = 0x0366, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x0272, - SMSG_GARRISON_BUILDING_ACTIVATED = 0x0662, - SMSG_GARRISON_BUILDING_LANDMARKS = 0x0B61, - SMSG_GARRISON_BUILDING_REMOVED = 0x04F5, - SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x0876, - SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x0361, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x03E6, - SMSG_GARRISON_CREATE_RESULT = 0x0976, - SMSG_GARRISON_DELETE_RESULT = 0x0BF5, - SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x0871, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x0466, - SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x0775, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x0AE2, - SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x07E1, - SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x089C, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x0176, - SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x0076, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x0462, - SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x0661, - SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x04E1, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x01F2, - SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x0BE2, - SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x0862, - SMSG_GARRISON_OPEN_ARCHITECT = 0x0A65, - SMSG_GARRISON_OPEN_MISSION_NPC = 0x0566, - SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x0576, - SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x0C65, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x08F1, - SMSG_GARRISON_PLOT_PLACED = 0x0172, - SMSG_GARRISON_PLOT_REMOVED = 0x0866, - SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x00E5, - SMSG_GARRISON_RECALL_PORTAL_USED = 0x07F1, - SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x00E2, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x0162, - SMSG_GARRISON_REMOTE_INFO = 0x01F5, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x06E5, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x08F5, - SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x05F5, - SMSG_GARRISON_START_MISSION_RESULT = 0x07E6, - SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x0861, - SMSG_GARRISON_UPGRADE_RESULT = 0x0165, - SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x0693, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x0008, - SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x06F2, - SMSG_GET_GARRISON_INFO_RESULT = 0x0B75, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x03A6, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x024F, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x005C, - SMSG_GM_PLAYER_INFO = 0x0E25, - SMSG_GM_REQUEST_PLAYER_INFO = 0x0946, - SMSG_GM_TICKET_CASE_STATUS = 0x005F, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x0ADF, - SMSG_GOD_MODE = 0x04A5, - SMSG_GOSSIP_COMPLETE = 0x0D89, - SMSG_GOSSIP_MESSAGE = 0x0E0A, - SMSG_GOSSIP_POI = 0x0925, - SMSG_GROUP_ACTION_THROTTLED = 0x06DC, - SMSG_GROUP_DECLINE = 0x0E1F, - SMSG_GROUP_DESTROYED = 0x08D4, - SMSG_GROUP_NEW_LEADER = 0x009F, - SMSG_GROUP_UNINVITE = 0x0126, - SMSG_GUILD_ACHIEVEMENT_DELETED = 0x06AC, - SMSG_GUILD_ACHIEVEMENT_EARNED = 0x04FC, - SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x08FB, - SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x06EB, - SMSG_GUILD_BANK_QUERY_RESULTS = 0x06FC, - SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x0CA4, - SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x02E4, - SMSG_GUILD_CHALLENGE_COMPLETED = 0x00BC, - SMSG_GUILD_CHALLENGE_UPDATE = 0x02AB, - SMSG_GUILD_CHANGE_NAME_RESULT = 0x08AC, - SMSG_GUILD_COMMAND_RESULT = 0x04F4, - SMSG_GUILD_CRITERIA_DELETED = 0x00AB, - SMSG_GUILD_CRITERIA_UPDATE = 0x06AB, - SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x00F3, - SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x0AF4, - SMSG_GUILD_EVENT_DISBANDED = 0x06F3, - SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x08B4, - SMSG_GUILD_EVENT_MOTD = 0x02A3, - SMSG_GUILD_EVENT_NEW_LEADER = 0x02F3, - SMSG_GUILD_EVENT_PLAYER_JOINED = 0x06E4, - SMSG_GUILD_EVENT_PLAYER_LEFT = 0x06A4, - SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x06F4, - SMSG_GUILD_EVENT_RANKS_UPDATED = 0x00F4, - SMSG_GUILD_EVENT_RANK_CHANGED = 0x08A3, - SMSG_GUILD_EVENT_TAB_ADDED = 0x0AA4, - SMSG_GUILD_EVENT_TAB_DELETED = 0x04B4, - SMSG_GUILD_EVENT_TAB_MODIFIED = 0x04A3, - SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x08F4, - SMSG_GUILD_FLAGGED_FOR_RENAME = 0x02F4, - SMSG_GUILD_INVITE = 0x08BB, - SMSG_GUILD_INVITE_DECLINED = 0x02E3, - SMSG_GUILD_INVITE_EXPIRED = 0x0AA3, - SMSG_GUILD_KNOWN_RECIPES = 0x04BB, - SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x04E4, - SMSG_GUILD_MEMBER_DAILY_RESET = 0x0AFB, - SMSG_GUILD_MEMBER_RECIPES = 0x08EC, - SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x02FB, - SMSG_GUILD_MOVED = 0x0AE4, - SMSG_GUILD_MOVE_STARTING = 0x08EB, - SMSG_GUILD_NAME_CHANGED = 0x0AAB, - SMSG_GUILD_NEWS = 0x00A3, - SMSG_GUILD_NEWS_DELETED = 0x0AEC, - SMSG_GUILD_PARTY_STATE = 0x0ABC, - SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x00EC, - SMSG_GUILD_RANKS = 0x06FB, - SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x00E3, - SMSG_GUILD_RESET = 0x0AFC, - SMSG_GUILD_REWARD_LIST = 0x0AF3, - SMSG_GUILD_ROSTER = 0x04B3, - SMSG_GUILD_ROSTER_UPDATE = 0x00BB, - SMSG_GUILD_SEND_RANK_CHANGE = 0x00B4, - SMSG_HEALTH_UPDATE = 0x06D4, - SMSG_HIGHEST_THREAT_UPDATE = 0x0B36, - SMSG_HOTFIX_NOTIFY = 0x0AA1, - SMSG_HOTFIX_NOTIFY_BLOB = 0x0095, - SMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x036E, - SMSG_INITIALIZE_FACTIONS = 0x04E0, - SMSG_INITIAL_SETUP = 0x02CC, - SMSG_INIT_WORLD_STATES = 0x0E53, - SMSG_INSPECT_HONOR_STATS = 0x0AC7, - SMSG_INSPECT_PVP = 0x08D3, - SMSG_INSPECT_RESULT = 0x01B2, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x0094, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x0648, - SMSG_INSTANCE_ENCOUNTER_END = 0x0901, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x0CDF, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x0ECC, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x0E07, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x084B, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x0625, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x0B01, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x0447, - SMSG_INSTANCE_ENCOUNTER_START = 0x06CC, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x09A2, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x0B55, - SMSG_INSTANCE_INFO = 0x025F, - SMSG_INSTANCE_RESET = 0x0E31, - SMSG_INSTANCE_RESET_FAILED = 0x03D6, - SMSG_INSTANCE_SAVE_CREATED = 0x00DB, - SMSG_INVALIDATE_PLAYER = 0x07A1, - SMSG_INVALID_PROMOTION_CODE = 0x0AC3, - SMSG_INVENTORY_CHANGE_FAILURE = 0x0C4B, - SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x0D0A, - SMSG_ITEM_CHANGED = 0x0A91, - SMSG_ITEM_COOLDOWN = 0x0A32, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x0236, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x0426, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x0047, - SMSG_ITEM_PUSH_RESULT = 0x0690, - SMSG_ITEM_TIME_UPDATE = 0x0EB2, - SMSG_KICK_REASON = 0x02D4, - SMSG_LEARNED_SPELLS = 0x092A, - SMSG_LEARN_TALENT_FAILED = 0x0AA2, - SMSG_LEVEL_UP_INFO = 0x01D2, - SMSG_LFG_BOOT_PLAYER = 0x0611, - SMSG_LFG_DISABLED = 0x0C6C, - SMSG_LFG_JOIN_RESULT = 0x0363, - SMSG_LFG_LIST_JOIN_RESULT = 0x0252, - SMSG_LFG_LIST_SEARCH_RESULTS = 0x052C, - SMSG_LFG_LIST_SEARCH_STATUS = 0x012B, - SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x086C, - SMSG_LFG_LIST_UPDATE_STATUS = 0x0241, - SMSG_LFG_OFFER_CONTINUE = 0x046B, - SMSG_LFG_PARTY_INFO = 0x0256, - SMSG_LFG_PLAYER_INFO = 0x0356, - SMSG_LFG_PLAYER_REWARD = 0x066B, - SMSG_LFG_PROPOSAL_UPDATE = 0x0D6B, - SMSG_LFG_QUEUE_STATUS = 0x0255, - SMSG_LFG_READY_CHECK_RESULT = 0x0770, - SMSG_LFG_READY_CHECK_UPDATE = 0x016B, - SMSG_LFG_ROLE_CHECK_UPDATE = 0x0368, - SMSG_LFG_SEARCH_RESULTS = 0x06D1, - SMSG_LFG_SLOT_INVALID = 0x0341, - SMSG_LFG_TELEPORT_DENIED = 0x0364, - SMSG_LFG_UPDATE_STATUS = 0x076B, - SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x00FC, - SMSG_LF_GUILD_APPLICATIONS = 0x04EB, - SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x0AB3, - SMSG_LF_GUILD_BROWSE = 0x08FC, - SMSG_LF_GUILD_COMMAND_RESULT = 0x06EC, - SMSG_LF_GUILD_POST = 0x02B4, - SMSG_LF_GUILD_RECRUITS = 0x08E4, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x0A42, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x0E8F, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x0135, - SMSG_LOAD_CUF_PROFILES = 0x0848, - SMSG_LOAD_EQUIPMENT_SET = 0x048B, - SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x02A2, - SMSG_LOGIN_SET_TIME_SPEED = 0x0C47, - SMSG_LOGIN_VERIFY_WORLD = 0x0CD3, - SMSG_LOGOUT_CANCEL_ACK = 0x0817, - SMSG_LOGOUT_COMPLETE = 0x0618, - SMSG_LOGOUT_RESPONSE = 0x0535, - SMSG_LOG_XP_GAIN = 0x0C84, - SMSG_LOOT_ALL_PASSED = 0x089B, - SMSG_LOOT_CONTENTS = 0x0490, - SMSG_LOOT_ITEM_LIST = 0x0832, - SMSG_LOOT_LIST = 0x0AB6, - SMSG_LOOT_MONEY_NOTIFY = 0x0E94, - SMSG_LOOT_RELEASE = 0x0404, - SMSG_LOOT_RELEASE_ALL = 0x06A5, - SMSG_LOOT_REMOVED = 0x0FA6, - SMSG_LOOT_RESPONSE = 0x0DB1, - SMSG_LOOT_ROLL = 0x008F, - SMSG_LOOT_ROLLS_COMPLETE = 0x0C0C, - SMSG_LOOT_ROLL_WON = 0x0DB2, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x0217, - SMSG_MAIL_COMMAND_RESULT = 0x04B1, - SMSG_MAIL_LIST_RESULT = 0x025C, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x01A2, - SMSG_MAP_OBJECTIVES_INIT = 0x0E58, - SMSG_MAP_OBJ_EVENTS = 0x0694, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x0EC8, - SMSG_MESSAGE_BOX = 0x0AC8, - SMSG_MINIMAP_PING = 0x0CA0, - SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x092D, - SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x097D, - SMSG_MISSILE_CANCEL = 0x00D1, - SMSG_MODIFY_COOLDOWN = 0x0892, - SMSG_MOTD = 0x1649, - SMSG_MOUNT_RESULT = 0x0AB1, - SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x1C53, - SMSG_MOVE_DISABLE_COLLISION = 0x02C6, - SMSG_MOVE_DISABLE_GRAVITY = 0x0A27, - SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x1D84, - SMSG_MOVE_ENABLE_COLLISION = 0x0564, - SMSG_MOVE_ENABLE_GRAVITY = 0x1453, - SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x1143, - SMSG_MOVE_KNOCK_BACK = 0x19D3, - SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x19C3, - SMSG_MOVE_ROOT = 0x0AC6, - SMSG_MOVE_SET_ACTIVE_MOVER = 0x0ED1, - SMSG_MOVE_SET_CAN_FLY = 0x0824, - SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x1488, - SMSG_MOVE_SET_COLLISION_HEIGHT = 0x1918, - SMSG_MOVE_SET_COMPOUND_STATE = 0x0C46, - SMSG_MOVE_SET_FEATHER_FALL = 0x1D04, - SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x0ED6, - SMSG_MOVE_SET_FLIGHT_SPEED = 0x1C43, - SMSG_MOVE_SET_HOVERING = 0x1054, - SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x1884, - SMSG_MOVE_SET_LAND_WALK = 0x0C82, - SMSG_MOVE_SET_NORMAL_FALL = 0x1513, - SMSG_MOVE_SET_PITCH_RATE = 0x0F30, - SMSG_MOVE_SET_RUN_BACK_SPEED = 0x1CC8, - SMSG_MOVE_SET_RUN_SPEED = 0x1C04, - SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x1227, - SMSG_MOVE_SET_SWIM_SPEED = 0x10D3, - SMSG_MOVE_SET_TURN_RATE = 0x032C, - SMSG_MOVE_SET_VEHICLE_REC_ID = 0x1276, - SMSG_MOVE_SET_WALK_SPEED = 0x1954, - SMSG_MOVE_SET_WATER_WALK = 0x1508, - SMSG_MOVE_SKIP_TIME = 0x0E06, - SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x0E28, - SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x0827, - SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x1D57, - SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x12F5, - SMSG_MOVE_SPLINE_ROOT = 0x12E3, - SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x1335, - SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x1264, - SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x18C7, - SMSG_MOVE_SPLINE_SET_FLYING = 0x1048, - SMSG_MOVE_SPLINE_SET_HOVER = 0x0E91, - SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x0B24, - SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x0281, - SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x1908, - SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x1058, - SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x0C91, - SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x12E1, - SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x1D17, - SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x1588, - SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x1557, - SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x12F1, - SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x062F, - SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x0C45, - SMSG_MOVE_SPLINE_START_SWIM = 0x1044, - SMSG_MOVE_SPLINE_STOP_SWIM = 0x0CC1, - SMSG_MOVE_SPLINE_UNROOT = 0x0141, - SMSG_MOVE_SPLINE_UNSET_FLYING = 0x1483, - SMSG_MOVE_SPLINE_UNSET_HOVER = 0x0627, - SMSG_MOVE_TELEPORT = 0x1157, - SMSG_MOVE_UNROOT = 0x1271, - SMSG_MOVE_UNSET_CAN_FLY = 0x0A81, - SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x0B2F, - SMSG_MOVE_UNSET_HOVERING = 0x0082, - SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x0468, - SMSG_MOVE_UPDATE = 0x1325, - SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x0C95, - SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x1D44, - SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x0C51, - SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x1104, - SMSG_MOVE_UPDATE_KNOCK_BACK = 0x1D18, - SMSG_MOVE_UPDATE_PITCH_RATE = 0x0423, - SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x02C2, - SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x0623, - SMSG_MOVE_UPDATE_RUN_SPEED = 0x0630, - SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x0E92, - SMSG_MOVE_UPDATE_SWIM_SPEED = 0x0C64, - SMSG_MOVE_UPDATE_TELEPORT = 0x1958, - SMSG_MOVE_UPDATE_TURN_RATE = 0x0196, - SMSG_MOVE_UPDATE_WALK_SPEED = 0x1188, - SMSG_MULTIPLE_PACKETS = 0x1206, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x0C9F, - SMSG_NEW_TAXI_PATH = 0x02B5, - SMSG_NEW_WORLD = 0x0026, - SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x0AAD, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x0A03, - SMSG_NOTIFY_MONEY = 0x01D1, - SMSG_NOTIFY_RECEIVED_MAIL = 0x06B5, - SMSG_OFFER_PETITION_ERROR = 0x0C35, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x081C, - SMSG_ON_MONSTER_MOVE = 0x0C28, - SMSG_OPEN_CONTAINER = 0x09B1, - SMSG_OPEN_LFG_DUNGEON_FINDER = 0x0370, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x0A97, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x0121, - SMSG_OVERRIDE_LIGHT = 0x08DC, - SMSG_PAGE_TEXT = 0x0A4B, - SMSG_PARTY_COMMAND_RESULT = 0x045F, - SMSG_PARTY_INVITE = 0x0208, - SMSG_PARTY_KILL_LOG = 0x00A0, - SMSG_PARTY_MEMBER_STATE = 0x06CF, - SMSG_PARTY_UPDATE = 0x0736, - SMSG_PAUSE_MIRROR_TIMER = 0x00C3, - SMSG_PENDING_RAID_LOCK = 0x0802, - SMSG_PETITION_ALREADY_SIGNED = 0x0C60, - SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x08AB, - SMSG_PETITION_SHOW_LIST = 0x0C08, - SMSG_PETITION_SHOW_SIGNATURES = 0x0222, - SMSG_PETITION_SIGN_RESULTS = 0x08A2, - SMSG_PET_ACTION_FEEDBACK = 0x0091, - SMSG_PET_ACTION_SOUND = 0x0050, - SMSG_PET_ADDED = 0x0493, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x0894, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x0A02, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x0EA6, - SMSG_PET_BATTLE_FINAL_ROUND = 0x0A1C, - SMSG_PET_BATTLE_FINISHED = 0x0B51, - SMSG_PET_BATTLE_FIRST_ROUND = 0x0522, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0x0136, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x0BA6, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0x000B, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x069B, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x0631, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x08C4, - SMSG_PET_BATTLE_REQUEST_FAILED = 0x04C4, - SMSG_PET_BATTLE_ROUND_RESULT = 0x029C, - SMSG_PET_BATTLE_SLOT_UPDATES = 0x0025, - SMSG_PET_CAST_FAILED = 0x07FE, - SMSG_PET_CLEAR_SPELLS = 0x09ED, - SMSG_PET_DISMISS_SOUND = 0x0BA2, - SMSG_PET_GOD_MODE = 0x04D3, - SMSG_PET_GUIDS = 0x06A0, - SMSG_PET_LEARNED_SPELLS = 0x08B9, - SMSG_PET_MODE = 0x049F, - SMSG_PET_NAME_INVALID = 0x0D25, - SMSG_PET_SLOT_UPDATED = 0x0CD8, - SMSG_PET_SPELLS_MESSAGE = 0x016A, - SMSG_PET_STABLE_LIST = 0x0A48, - SMSG_PET_STABLE_RESULT = 0x0054, - SMSG_PET_TAME_FAILURE = 0x09D1, - SMSG_PET_UNLEARNED_SPELLS = 0x06BE, - SMSG_PHASE_SHIFT_CHANGE = 0x0C36, - SMSG_PLAYED_TIME = 0x0842, - SMSG_PLAYER_BOUND = 0x08A0, - SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x02EB, - SMSG_PLAYER_SKINNED = 0x02B6, - SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x0E48, - SMSG_PLAY_MUSIC = 0x0942, - SMSG_PLAY_OBJECT_SOUND = 0x061B, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x0017, - SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x04FE, - SMSG_PLAY_SCENE = 0x0BD6, - SMSG_PLAY_SOUND = 0x0044, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x0912, - SMSG_PLAY_SPELL_VISUAL = 0x002E, - SMSG_PLAY_SPELL_VISUAL_KIT = 0x0B3E, - SMSG_PLAY_TIME_WARNING = 0x0A50, - SMSG_PONG = 0x1805, - SMSG_POWER_UPDATE = 0x004F, - SMSG_PRE_RESSURECT = 0x01A5, - SMSG_PRINT_NOTIFICATION = 0x0E20, - SMSG_PROC_RESIST = 0x0951, - SMSG_PROPOSE_LEVEL_GRANT = 0x07B2, - SMSG_PVP_CREDIT = 0x0726, - SMSG_PVP_LOG_DATA = 0x01C1, - SMSG_PVP_OPTIONS_ENABLED = 0x0B56, - SMSG_PVP_SEASON = 0x0CB2, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x080C, - SMSG_QUERY_CREATURE_RESPONSE = 0x0EDB, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x04CC, - SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x0C76, - SMSG_QUERY_GUILD_INFO_RESPONSE = 0x04A4, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x0CDB, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x049B, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x0022, - SMSG_QUERY_PETITION_RESPONSE = 0x00A2, - SMSG_QUERY_PET_NAME_RESPONSE = 0x064F, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x0331, - SMSG_QUERY_QUEST_INFO_RESPONSE = 0x0C09, - SMSG_QUERY_TIME_RESPONSE = 0x05A6, - SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x0E8A, - SMSG_QUEST_CONFIRM_ACCEPT = 0x0589, - SMSG_QUEST_FORCE_REMOVED = 0x085A, - SMSG_QUEST_GIVER_INVALID_QUEST = 0x0689, - SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x0949, - SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x021A, - SMSG_QUEST_GIVER_QUEST_DETAILS = 0x015D, - SMSG_QUEST_GIVER_QUEST_FAILED = 0x040E, - SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x05C9, - SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x06CA, - SMSG_QUEST_GIVER_STATUS = 0x084D, - SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x000D, - SMSG_QUEST_LOG_FULL = 0x06CE, - SMSG_QUEST_POI_QUERY_RESPONSE = 0x0409, - SMSG_QUEST_PUSH_RESULT = 0x035A, - SMSG_QUEST_UPDATE_ADD_CREDIT = 0x005E, - SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x1218, - SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x1203, - SMSG_QUEST_UPDATE_COMPLETE = 0x1344, - SMSG_QUEST_UPDATE_FAILED = 0x044A, - SMSG_QUEST_UPDATE_FAILED_TIMER = 0x0919, - SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x0836, - SMSG_RAID_DIFFICULTY_SET = 0x0296, - SMSG_RAID_GROUP_ONLY = 0x0ED8, - SMSG_RAID_INSTANCE_MESSAGE = 0x171A, - SMSG_RAID_MARKERS_CHANGED = 0x0E5F, - SMSG_RANDOM_ROLL = 0x0844, - SMSG_RATED_BATTLEFIELD_INFO = 0x0621, - SMSG_READY_CHECK_COMPLETED = 0x0E84, - SMSG_READY_CHECK_RESPONSE = 0x029B, - SMSG_READY_CHECK_STARTED = 0x0010, - SMSG_READ_ITEM_RESULT_FAILED = 0x0283, - SMSG_READ_ITEM_RESULT_OK = 0x0826, - SMSG_REALM_QUERY_RESPONSE = 0x0E0F, - SMSG_REALM_SPLIT = 0x0CDC, - SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x0815, - SMSG_REFER_A_FRIEND_EXPIRED = 0x021C, - SMSG_REFER_A_FRIEND_FAILURE = 0x0C44, - SMSG_REFRESH_COMPONENT = 0x045B, - SMSG_REFRESH_SPELL_HISTORY = 0x07AE, - SMSG_REMOVE_ITEM_PASSIVE = 0x02B1, - SMSG_REMOVE_LOSS_OF_CONTROL = 0x0097, - SMSG_REPLACE_TROPHY_RESPONSE = 0x04D0, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x0225, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x00A1, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x0820, - SMSG_RESEARCH_COMPLETE = 0x0297, - SMSG_RESET_COMPRESSION_CONTEXT = 0x1006, - SMSG_RESET_FAILED_NOTIFY = 0x088F, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x0C8F, - SMSG_RESET_WEEKLY_CURRENCY = 0x0D26, - SMSG_RESPEC_WIPE_CONFIRM = 0x0E21, - SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x0B32, - SMSG_RESUME_CAST_BAR = 0x0379, - SMSG_RESUME_COMMS = 0x1302, - SMSG_RESUME_TOKEN = 0x0E08, - SMSG_RESURRECT_REQUEST = 0x08A6, - SMSG_RESYNC_RUNES = 0x0806, - SMSG_ROLE_CHANGED_INFORM = 0x0E8C, - SMSG_ROLE_CHOSEN = 0x066F, - SMSG_ROLE_POLL_INFORM = 0x0731, - SMSG_RUNE_REGEN_DEBUG = 0x0EB1, - SMSG_SCENARIO_BOOT = 0x00B6, - SMSG_SCENARIO_COMPLETED = 0x0EA2, - SMSG_SCENARIO_OUT_OF_BOUNDS = 0x0410, - SMSG_SCENARIO_POIS = 0x00CC, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x0AA5, - SMSG_SCENARIO_STATE = 0x0E35, - SMSG_SCENE_OBJECT_EVENT = 0x0644, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x0C8B, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x0DA2, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x06B6, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x0A36, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x0417, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x0896, - SMSG_SCRIPT_CAST = 0x00AE, - SMSG_SELL_RESPONSE = 0x08DB, - SMSG_SEND_ITEM_PASSIVES = 0x0E8B, - SMSG_SEND_KNOWN_SPELLS = 0x096E, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x001F, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x049C, - SMSG_SEND_SPELL_CHARGES = 0x0BF9, - SMSG_SEND_SPELL_HISTORY = 0x0629, - SMSG_SEND_UNLEARN_SPELLS = 0x03AA, - SMSG_SERVER_FIRST_ACHIEVEMENT = 0x154A, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x0487, - SMSG_SERVER_TIME = 0x0658, - SMSG_SETUP_CURRENCY = 0x0B45, - SMSG_SETUP_RESEARCH_HISTORY = 0x0325, - SMSG_SET_AI_ANIM_KIT = 0x0E36, - SMSG_SET_ALL_TASK_PROGRESS = 0x0E04, - SMSG_SET_ANIM_TIER = 0x0F22, - SMSG_SET_CURRENCY = 0x0214, - SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x026F, - SMSG_SET_DUNGEON_DIFFICULTY = 0x0A94, - SMSG_SET_FACTION_AT_WAR = 0x0EA5, - SMSG_SET_FACTION_NOT_VISIBLE = 0x0C4C, - SMSG_SET_FACTION_STANDING = 0x06DF, - SMSG_SET_FACTION_VISIBLE = 0x04DC, - SMSG_SET_FLAT_SPELL_MODIFIER = 0x0AE9, - SMSG_SET_FORCED_REACTIONS = 0x08D1, - SMSG_SET_ITEM_PURCHASE_DATA = 0x1085, - SMSG_SET_LOOT_METHOD_FAILED = 0x0536, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0x0853, - SMSG_SET_MELEE_ANIM_KIT = 0x0C83, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x0688, - SMSG_SET_PCT_SPELL_MODIFIER = 0x01BA, - SMSG_SET_PET_SPECIALIZATION = 0x0132, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x0CA2, - SMSG_SET_PLAY_HOVER_ANIM = 0x0F35, - SMSG_SET_PROFICIENCY = 0x0A53, - SMSG_SET_SPELL_CHARGES = 0x002D, - SMSG_SET_TASK_COMPLETE = 0x0C9B, - SMSG_SET_TIME_ZONE_INFORMATION = 0x0E9C, - SMSG_SET_VEHICLE_REC_ID = 0x0952, - SMSG_SHOW_BANK = 0x01C2, - SMSG_SHOW_MAILBOX = 0x02D2, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x068C, - SMSG_SHOW_TAXI_NODES = 0x1086, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x0C97, - SMSG_SOCKET_GEMS = 0x061C, - SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x0448, - SMSG_SPECIAL_MOUNT_ANIM = 0x0E13, - SMSG_SPELL_ABSORB_LOG = 0x0139, - SMSG_SPELL_CHANNEL_START = 0x07BD, - SMSG_SPELL_CHANNEL_UPDATE = 0x067E, - SMSG_SPELL_COOLDOWN = 0x0569, - SMSG_SPELL_DAMAGE_SHIELD = 0x07B9, - SMSG_SPELL_DELAYED = 0x012E, - SMSG_SPELL_DISPELL_LOG = 0x04AA, - SMSG_SPELL_ENERGIZE_LOG = 0x05EE, - SMSG_SPELL_EXECUTE_LOG = 0x0C39, - SMSG_SPELL_FAILED_OTHER = 0x0BAA, - SMSG_SPELL_FAILURE = 0x00EA, - SMSG_SPELL_GO = 0x046E, - SMSG_SPELL_HEAL_LOG = 0x02A9, - SMSG_SPELL_INSTAKILL_LOG = 0x02FA, - SMSG_SPELL_INTERRUPT_LOG = 0x05A9, - SMSG_SPELL_MISS_LOG = 0x07BE, - SMSG_SPELL_MULTISTRIKE_EFFECT = 0x02EE, - SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x062E, - SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x00BE, - SMSG_SPELL_PERIODIC_AURA_LOG = 0x06FA, - SMSG_SPELL_START = 0x007D, - SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x04A9, - SMSG_SPIRIT_HEALER_CONFIRM = 0x0E4C, - SMSG_STAND_STATE_UPDATE = 0x0A52, - SMSG_START_ELAPSED_TIMER = 0x0498, - SMSG_START_ELAPSED_TIMERS = 0x048F, - SMSG_START_LOOT_ROLL = 0x0B42, - SMSG_START_MIRROR_TIMER = 0x0E32, - SMSG_START_TIMER = 0x0F26, - SMSG_STOP_ELAPSED_TIMER = 0x0A8C, - SMSG_STOP_MIRROR_TIMER = 0x0293, - SMSG_STOP_SPEAKERBOT_SOUND = 0x0831, - SMSG_STREAMING_MOVIES = 0x0A35, - SMSG_SUMMON_CANCEL = 0x00B5, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x0A10, - SMSG_SUMMON_REQUEST = 0x0053, - SMSG_SUPERCEDED_SPELLS = 0x023A, - SMSG_SUPPRESS_NPC_GREETINGS = 0x0B22, - SMSG_SUSPEND_COMMS = 0x1105, - SMSG_SUSPEND_TOKEN = 0x0FA5, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x00B1, - SMSG_TAXI_NODE_STATUS = 0x00DF, - SMSG_TEXT_EMOTE = 0x0C54, - SMSG_THREAT_CLEAR = 0x0C9C, - SMSG_THREAT_REMOVE = 0x0A83, - SMSG_THREAT_UPDATE = 0x0660, - SMSG_TIME_ADJUSTMENT = 0x1DC7, - SMSG_TIME_SYNC_REQUEST = 0x1097, - SMSG_TITLE_EARNED = 0x0A0C, - SMSG_TITLE_LOST = 0x0852, - SMSG_TOTEM_CREATED = 0x0851, - SMSG_TOTEM_MOVED = 0x03B2, - SMSG_TRADE_STATUS = 0x0A9C, - SMSG_TRADE_UPDATED = 0x0EA0, - SMSG_TRAINER_BUY_FAILED = 0x0C1F, - SMSG_TRAINER_LIST = 0x03C6, - SMSG_TRANSFER_ABORTED = 0x03C2, - SMSG_TRANSFER_PENDING = 0x05B5, - SMSG_TRIGGER_CINEMATIC = 0x0422, - SMSG_TRIGGER_MOVIE = 0x045C, - SMSG_TURN_IN_PETITION_RESULT = 0x0C88, - SMSG_TUTORIAL_FLAGS = 0x0C5C, - SMSG_TWITTER_STATUS = 0x04DA, - SMSG_UI_TIME = 0x0B52, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x0A47, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x0620, - SMSG_UNLEARNED_SPELLS = 0x04B9, - SMSG_UPDATE_ACCOUNT_DATA = 0x02C3, - SMSG_UPDATE_ACTION_BUTTONS = 0x0A0B, - SMSG_UPDATE_CHARACTER_FLAGS = 0x0CCF, - SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x0642, - SMSG_UPDATE_EXPANSION_LEVEL = 0x009C, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x03D1, - SMSG_UPDATE_LAST_INSTANCE = 0x0C0F, - SMSG_UPDATE_OBJECT = 0x0D36, - SMSG_UPDATE_TALENT_DATA = 0x0057, - SMSG_UPDATE_TASK_PROGRESS = 0x0E98, - SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x09FE, - SMSG_UPDATE_WORLD_STATE = 0x0036, - SMSG_USERLIST_ADD = 0x1C59, - SMSG_USERLIST_REMOVE = 0x1D5A, - SMSG_USERLIST_UPDATE = 0x1489, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x0897, - SMSG_VENDOR_INVENTORY = 0x0AD4, - SMSG_VIGNETTE_UPDATE = 0x08CC, - SMSG_VOICE_CHAT_STATUS = 0x168A, - SMSG_VOICE_PARENTAL_CONTROLS = 0x1DC9, - SMSG_VOICE_SESSION_LEAVE = 0x1D9A, - SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x1409, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x0004, - SMSG_VOID_STORAGE_CONTENTS = 0x08D2, - SMSG_VOID_STORAGE_FAILED = 0x008B, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x00D5, - SMSG_VOID_TRANSFER_RESULT = 0x0D35, - SMSG_WAIT_QUEUE_FINISH = 0x0A84, - SMSG_WAIT_QUEUE_UPDATE = 0x0A56, - SMSG_WARDEN_DATA = 0x0EDC, - SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x0613, - SMSG_WEATHER = 0x0131, - SMSG_WEEKLY_SPELL_USAGE = 0x04E9, - SMSG_WHO = 0x16CA, - SMSG_WHO_IS = 0x0841, - SMSG_WORLD_SERVER_INFO = 0x0626, - SMSG_WORLD_TEXT = 0x0258, - SMSG_WOW_TOKEN_AUCTION_SOLD = 0x0007, - SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x0855, - SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x024C, - SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x0BC5, - SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x0420, - SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x0203, - SMSG_WOW_TOKEN_REDEEM_RESULT = 0x008C, - SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x0898, - SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x06A6, - SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x028F, - SMSG_XP_GAIN_ABORTED = 0x01A6, - SMSG_XP_GAIN_ENABLED = 0x02DC, - SMSG_ZONE_UNDER_ATTACK = 0x1419, + SMSG_ABORT_NEW_WORLD = 0x01F3, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x1E2A, + SMSG_ACCOUNT_DATA_TIMES = 0x09FB, + SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0xBADD, // no client handler + SMSG_ACCOUNT_MOUNT_UPDATE = 0x03B4, + SMSG_ACCOUNT_TOYS_UPDATE = 0x013B, + SMSG_ACHIEVEMENT_DELETED = 0x0064, + SMSG_ACHIEVEMENT_EARNED = 0x0E97, + SMSG_ACTIVATE_TAXI_REPLY = 0x0C16, + SMSG_ADDON_INFO = 0x08B1, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x06CD, + SMSG_ADD_ITEM_PASSIVE = 0x08AB, + SMSG_ADD_LOSS_OF_CONTROL = 0x01E3, + SMSG_ADD_RUNE_POWER = 0x03FA, + SMSG_ADJUST_SPLINE_DURATION = 0x0A62, + SMSG_AE_LOOT_TARGETS = 0x0519, + SMSG_AE_LOOT_TARGET_ACK = 0x045E, + SMSG_AI_REACTION = 0x0F9D, + SMSG_ALL_ACCOUNT_CRITERIA = 0x0A39, + SMSG_ALL_ACHIEVEMENT_DATA = 0x0033, + SMSG_ALL_GUILD_ACHIEVEMENTS = 0x092E, + SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x0E9D, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x0A2A, + SMSG_AREA_TRIGGER_DENIED = 0x0E8D, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x0AAB, + SMSG_AREA_TRIGGER_RE_PATH = 0x072A, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x012C, + SMSG_ARENA_ERROR = 0x02A3, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x0E49, + SMSG_ATTACKER_STATE_UPDATE = 0x049E, + SMSG_ATTACK_START = 0x0F0A, + SMSG_ATTACK_STOP = 0x00FC, + SMSG_ATTACK_SWING_ERROR = 0x00BA, + SMSG_ATTACK_SWING_LANDED_LOG = 0x01EA, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x0969, + SMSG_AUCTION_COMMAND_RESULT = 0x0F99, + SMSG_AUCTION_HELLO_RESPONSE = 0x08B4, + SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x07D9, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x003A, + SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x0B6A, + SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x06CA, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x0031, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x0831, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x037C, + SMSG_AUCTION_WON_NOTIFICATION = 0x08B3, + SMSG_AURA_POINTS_DEPLETED = 0x09A8, + SMSG_AURA_UPDATE = 0x01A6, + SMSG_AUTH_CHALLENGE = 0x1028, + SMSG_AUTH_RESPONSE = 0x09B3, + SMSG_AVAILABLE_VOICE_CHANNEL = 0x10D9, + SMSG_BARBER_SHOP_RESULT = 0x0379, + SMSG_BATTLEFIELD_LIST = 0x0AF9, + SMSG_BATTLEFIELD_PORT_DENIED = 0x03EB, + SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x07CD, + SMSG_BATTLEFIELD_STATUS_FAILED = 0x03F9, + SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x059A, + SMSG_BATTLEFIELD_STATUS_NONE = 0x0A6C, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x03BC, + SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x0C6A, + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x00FB, + SMSG_BATTLEGROUND_INIT = 0x065E, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x0BBB, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x0024, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x0CCD, + SMSG_BATTLEGROUND_POINTS = 0x0AB3, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x0BB2, + SMSG_BATTLENET_CHALLENGE_START = 0x0C1A, + SMSG_BATTLE_PAY_ACK_FAILED = 0x056A, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x0324, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x0699, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x0BBA, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x0C79, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x0E21, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x0ED9, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x050A, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x01BA, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x152A, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x0974, + SMSG_BATTLE_PETS_HEALED = 0x086B, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x0332, + SMSG_BATTLE_PET_DELETED = 0x01A1, + SMSG_BATTLE_PET_ERROR = 0x03F4, + SMSG_BATTLE_PET_JOURNAL = 0x0A17, + SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x00EA, + SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x0459, + SMSG_BATTLE_PET_LICENSE_CHANGED = 0x086C, + SMSG_BATTLE_PET_RESTORED = 0x0D9E, + SMSG_BATTLE_PET_REVOKED = 0x09F3, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x0F1A, + SMSG_BATTLE_PET_UPDATES = 0x0264, + SMSG_BF_MGR_DROP_TIMER_CANCELLED = 0x0934, + SMSG_BF_MGR_DROP_TIMER_STARTED = 0x002A, + SMSG_BF_MGR_EJECTED = 0x0B73, + SMSG_BF_MGR_EJECT_PENDING = 0x0A95, + SMSG_BF_MGR_ENTERING = 0x061A, + SMSG_BF_MGR_ENTRY_INVITE = 0x0D99, + SMSG_BF_MGR_QUEUE_INVITE = 0x0823, + SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0x074D, + SMSG_BF_MGR_QUEUE_STATUS_UPDATE = 0x0F5E, + SMSG_BF_MGR_STATE_CHANGED = 0x1C7A, + SMSG_BINDER_CONFIRM = 0x0DCE, + SMSG_BIND_POINT_UPDATE = 0x04C9, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x02EA, + SMSG_BLACK_MARKET_OPEN_RESULT = 0x0063, + SMSG_BLACK_MARKET_OUTBID = 0x0A97, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x0BEB, + SMSG_BLACK_MARKET_WON = 0x03E4, + SMSG_BONUS_ROLL_EMPTY = 0x0822, + SMSG_BOSS_KILL_CREDIT = 0x093B, + SMSG_BREAK_TARGET = 0x1529, + SMSG_BUY_FAILED = 0x0815, + SMSG_BUY_SUCCEEDED = 0x02FB, + SMSG_CACHE_VERSION = 0x0E31, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x0022, + SMSG_CALENDAR_COMMAND_RESULT = 0x0C31, + SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x0F9A, + SMSG_CALENDAR_EVENT_INVITE = 0x0F1E, + SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x177A, + SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x02B2, + SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x068A, + SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x033C, + SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x0132, + SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x061D, + SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x0AA9, + SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x0E6A, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x0F89, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x003C, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x0D5A, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x074E, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x0D59, + SMSG_CALENDAR_SEND_CALENDAR = 0x0B2C, + SMSG_CALENDAR_SEND_EVENT = 0x0C29, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x00F3, + SMSG_CAMERA_SHAKE = 0x0719, + SMSG_CANCEL_AUTO_REPEAT = 0x0B74, + SMSG_CANCEL_COMBAT = 0x00E2, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x0AD6, + SMSG_CANCEL_SCENE = 0x0C62, + SMSG_CANCEL_SPELL_VISUAL = 0x1E5F, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x0BB6, + SMSG_CAN_DUEL_RESULT = 0x0C1E, + SMSG_CAST_FAILED = 0x1895, + SMSG_CATEGORY_COOLDOWN = 0x1A56, + SMSG_CHALLEGE_MODE_REWARDS = 0x02A1, + SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x0E09, + SMSG_CHALLENGE_MODE_COMPLETE = 0x08E9, + SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x0AEB, + SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x073A, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x02F3, + SMSG_CHALLENGE_MODE_RESET = 0x0C0D, + SMSG_CHALLENGE_MODE_START = 0x0AE2, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x0331, + SMSG_CHANNEL_LIST = 0x1259, + SMSG_CHANNEL_NOTIFY = 0x111B, + SMSG_CHANNEL_NOTIFY_JOINED = 0x10DA, + SMSG_CHANNEL_NOTIFY_LEFT = 0x1099, + SMSG_CHARACTER_LOGIN_FAILED = 0x0BA2, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x092A, + SMSG_CHARACTER_RENAME_RESULT = 0x082A, + SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN = 0x0789, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x1C79, + SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x0F1D, + SMSG_CHARACTER_UPGRADE_STARTED = 0x0896, + SMSG_CHAR_CUSTOMIZE = 0x079D, + SMSG_CHAR_CUSTOMIZE_FAILED = 0x00E9, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x0AFC, + SMSG_CHAT = 0x1299, + SMSG_CHAT_AUTO_RESPONDED = 0x10C9, + SMSG_CHAT_DOWN = 0x128B, + SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x111A, + SMSG_CHAT_IS_DOWN = 0x108B, + SMSG_CHAT_NOT_IN_PARTY = 0x120C, + SMSG_CHAT_PLAYER_AMBIGUOUS = 0x12DA, + SMSG_CHAT_PLAYER_NOTFOUND = 0x118B, + SMSG_CHAT_RECONNECT = 0x12C9, + SMSG_CHAT_RESTRICTED = 0x11CB, + SMSG_CHAT_SERVER_MESSAGE = 0x104C, + SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x1855, + SMSG_CHECK_WARGAME_ENTRY = 0x0B64, + SMSG_CHUNKED_PACKET = 0x0028, + SMSG_CLEAR_ALL_SPELL_CHARGES = 0x1E5B, + SMSG_CLEAR_BOSS_EMOTES = 0x0E89, + SMSG_CLEAR_COOLDOWN = 0x01A2, + SMSG_CLEAR_COOLDOWNS = 0x16CC, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x059D, + SMSG_CLEAR_SPELL_CHARGES = 0x03BD, + SMSG_CLEAR_TARGET = 0x0649, + SMSG_COIN_REMOVED = 0x01B2, + SMSG_COMBAT_EVENT_FAILED = 0x0821, + SMSG_COMMENTATOR_MAP_INFO = 0x0E19, + SMSG_COMMENTATOR_PLAYER_INFO = 0x023C, + SMSG_COMMENTATOR_STATE_CHANGED = 0x0ABB, + SMSG_COMPLAINT_RESULT = 0x0BFC, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x0E15, + SMSG_COMPRESSED_PACKET = 0x0827, + SMSG_CONNECT_TO = 0x0A27, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x0D49, + SMSG_CONSOLE_WRITE = 0x0E39, + SMSG_CONTACT_LIST = 0x02A2, + SMSG_CONTROL_UPDATE = 0x0C3A, + SMSG_CONVERT_RUNE = 0x04DE, + SMSG_COOLDOWN_CHEAT = 0x058D, + SMSG_COOLDOWN_EVENT = 0x0E1E, + SMSG_CORPSE_LOCATION = 0x01BB, + SMSG_CORPSE_RECLAIM_DELAY = 0x04CD, + SMSG_CORPSE_TRANSPORT_QUERY = 0x0029, + SMSG_CREATE_CHAR = 0x1C71, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x0121, + SMSG_CRITERIA_DELETED = 0x064E, + SMSG_CRITERIA_UPDATE = 0x0B62, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x069E, + SMSG_CUSTOM_LOAD_SCREEN = 0x0E98, + SMSG_DAILY_QUESTS_RESET = 0x1172, + SMSG_DAMAGE_CALC_LOG = 0x0923, + SMSG_DANCE_STUDIO_CREATE_RESULT = 0x0922, + SMSG_DB_REPLY = 0x0C9A, + SMSG_DEATH_RELEASE_LOC = 0x016A, + SMSG_DEFENSE_MESSAGE = 0x1289, + SMSG_DELETE_CHAR = 0x0272, + SMSG_DESTROY_ARENA_UNIT = 0x0729, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x0ECA, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x03E3, + SMSG_DISENCHANT_CREDIT = 0x0862, + SMSG_DISMOUNT = 0x1E6A, + SMSG_DISMOUNT_RESULT = 0x08EA, + SMSG_DISPEL_FAILED = 0x161D, + SMSG_DISPLAY_GAME_ERROR = 0x0161, + SMSG_DISPLAY_PLAYER_CHOICE = 0x01FC, + SMSG_DISPLAY_PROMOTION = 0x00B2, + SMSG_DISPLAY_QUEST_POPUP = 0x11E1, + SMSG_DISPLAY_TOAST = 0x0873, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x0E59, + SMSG_DROP_NEW_CONNECTION = 0x0837, + SMSG_DUEL_COMPLETE = 0x0AEA, + SMSG_DUEL_COUNTDOWN = 0x0E99, + SMSG_DUEL_IN_BOUNDS = 0x157A, + SMSG_DUEL_OUT_OF_BOUNDS = 0x08E2, + SMSG_DUEL_REQUESTED = 0x0659, + SMSG_DUEL_WINNER = 0x0F4A, + SMSG_DURABILITY_DAMAGE_DEATH = 0x173A, + SMSG_EMOTE = 0x0599, + SMSG_ENABLE_BARBER_SHOP = 0x0E8E, + SMSG_ENCHANTMENT_LOG = 0x0AF4, + SMSG_ENCOUNTER_END = 0x02E2, + SMSG_ENCOUNTER_START = 0x05CE, + SMSG_ENUM_CHARACTERS_RESULT = 0x096B, + SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x0852, + SMSG_EQUIPMENT_SET_ID = 0x0A3B, + SMSG_EXPECTED_SPAM_RECORDS = 0x11CC, + SMSG_EXPLORATION_EXPERIENCE = 0x0224, + SMSG_FACTION_BONUS_INFO = 0x0032, + SMSG_FAILED_PLAYER_CONDITION = 0x0A96, + SMSG_FEATURE_SYSTEM_STATUS = 0x0E96, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x02E9, + SMSG_FEIGN_DEATH_RESISTED = 0x05A6, + SMSG_FINAL_CHUNK = 0x0238, + SMSG_FISH_ESCAPED = 0x02F4, + SMSG_FISH_NOT_HOOKED = 0x06DD, + SMSG_FLIGHT_SPLINE_SYNC = 0x191D, + SMSG_FORCED_DEATH_UPDATE = 0x037B, + SMSG_FORCE_ANIM = 0x075E, + SMSG_FORCE_OBJECT_RELINK = 0x036C, + SMSG_FRIEND_STATUS = 0x0898, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x0AA1, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x0074, + SMSG_GAME_OBJECT_DESPAWN = 0x0AE9, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x1E09, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x11FF, + SMSG_GAME_OBJECT_RESET_STATE = 0x03E1, + SMSG_GAME_SPEED_SET = 0x02E4, + SMSG_GAME_TIME_SET = 0x0963, + SMSG_GAME_TIME_UPDATE = 0x0AF3, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x0712, + SMSG_GARRISON_ADD_MISSION_RESULT = 0x0352, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x0F01, + SMSG_GARRISON_BUILDING_ACTIVATED = 0x0BD6, + SMSG_GARRISON_BUILDING_LANDMARKS = 0x0B42, + SMSG_GARRISON_BUILDING_REMOVED = 0x0B06, + SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x0B94, + SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x03C7, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x0B48, + SMSG_GARRISON_CREATE_RESULT = 0x0792, + SMSG_GARRISON_DELETE_RESULT = 0x0707, + SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x0B15, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x0757, + SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x0747, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x0BC1, + SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x0705, + SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x0A7C, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x03D2, + SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x0753, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x0F08, + SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x0B98, + SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x03D1, + SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x0742, + SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x0394, + SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x0745, + SMSG_GARRISON_OPEN_ARCHITECT = 0x0781, + SMSG_GARRISON_OPEN_MISSION_NPC = 0x0F07, + SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x0F02, + SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x0311, + SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x0B47, + SMSG_GARRISON_PLOT_PLACED = 0x0BD5, + SMSG_GARRISON_PLOT_REMOVED = 0x0351, + SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x0715, + SMSG_GARRISON_RECALL_PORTAL_USED = 0x0B02, + SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x0BC6, + SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x0704, + SMSG_GARRISON_REMOTE_INFO = 0x0302, + SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x0382, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x0303, + SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x07D4, + SMSG_GARRISON_START_MISSION_RESULT = 0x0B05, + SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x0782, + SMSG_GARRISON_UPGRADE_RESULT = 0x0BC2, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x070E, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x02EB, + SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x07C7, + SMSG_GET_GARRISON_INFO_RESULT = 0x0B14, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x052A, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x027A, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x07C9, + SMSG_GM_PLAYER_INFO = 0x0A15, + SMSG_GM_REQUEST_PLAYER_INFO = 0x053A, + SMSG_GM_TICKET_CASE_STATUS = 0x0EDA, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x0B31, + SMSG_GOD_MODE = 0x0274, + SMSG_GOSSIP_COMPLETE = 0x187B, + SMSG_GOSSIP_MESSAGE = 0x127B, + SMSG_GOSSIP_POI = 0x00FA, + SMSG_GROUP_ACTION_THROTTLED = 0x079E, + SMSG_GROUP_DECLINE = 0x0223, + SMSG_GROUP_DESTROYED = 0x0D1D, + SMSG_GROUP_NEW_LEADER = 0x04CA, + SMSG_GROUP_UNINVITE = 0x0B3A, + SMSG_GUILD_ACHIEVEMENT_DELETED = 0x1180, + SMSG_GUILD_ACHIEVEMENT_EARNED = 0x0977, + SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x1165, + SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x0170, + SMSG_GUILD_BANK_QUERY_RESULTS = 0x1166, + SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x1176, + SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x096F, + SMSG_GUILD_CHALLENGE_COMPLETED = 0x016D, + SMSG_GUILD_CHALLENGE_UPDATE = 0x017E, + SMSG_GUILD_CHANGE_NAME_RESULT = 0x1135, + SMSG_GUILD_COMMAND_RESULT = 0x1926, + SMSG_GUILD_CRITERIA_DELETED = 0x0965, + SMSG_GUILD_CRITERIA_UPDATE = 0x1128, + SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x0976, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x0970, + SMSG_GUILD_EVENT_DISBANDED = 0x0165, + SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x013E, + SMSG_GUILD_EVENT_MOTD = 0x0937, + SMSG_GUILD_EVENT_NEW_LEADER = 0x0925, + SMSG_GUILD_EVENT_PLAYER_JOINED = 0x012E, + SMSG_GUILD_EVENT_PLAYER_LEFT = 0x113E, + SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x112E, + SMSG_GUILD_EVENT_RANKS_UPDATED = 0x0168, + SMSG_GUILD_EVENT_RANK_CHANGED = 0x1136, + SMSG_GUILD_EVENT_TAB_ADDED = 0x012D, + SMSG_GUILD_EVENT_TAB_DELETED = 0x092D, + SMSG_GUILD_EVENT_TAB_MODIFIED = 0x097F, + SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x0135, + SMSG_GUILD_FLAGGED_FOR_RENAME = 0x1925, + SMSG_GUILD_INVITE = 0x013D, + SMSG_GUILD_INVITE_DECLINED = 0x1138, + SMSG_GUILD_INVITE_EXPIRED = 0x112D, + SMSG_GUILD_KNOWN_RECIPES = 0x017D, + SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x0130, + SMSG_GUILD_MEMBER_DAILY_RESET = 0x0980, + SMSG_GUILD_MEMBER_RECIPES = 0x0978, + SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x0175, + SMSG_GUILD_MOVED = 0x0140, + SMSG_GUILD_MOVE_STARTING = 0x0975, + SMSG_GUILD_NAME_CHANGED = 0x0180, + SMSG_GUILD_NEWS = 0x0137, + SMSG_GUILD_NEWS_DELETED = 0x116E, + SMSG_GUILD_PARTY_STATE = 0x097E, + SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x0127, + SMSG_GUILD_RANKS = 0x0967, + SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x112F, + SMSG_GUILD_RESET = 0x117D, + SMSG_GUILD_REWARD_LIST = 0x1170, + SMSG_GUILD_ROSTER = 0x0930, + SMSG_GUILD_ROSTER_UPDATE = 0x117E, + SMSG_GUILD_SEND_RANK_CHANGE = 0x116D, + SMSG_HEALTH_UPDATE = 0x0A33, + SMSG_HIGHEST_THREAT_UPDATE = 0x0579, + SMSG_HOTFIX_NOTIFY = 0x02EC, + SMSG_HOTFIX_NOTIFY_BLOB = 0x017C, + SMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x13BF, + SMSG_INITIALIZE_FACTIONS = 0x0924, + SMSG_INITIAL_SETUP = 0x0B3B, + SMSG_INIT_WORLD_STATES = 0x0F8E, + SMSG_INSPECT_HONOR_STATS = 0x0BAB, + SMSG_INSPECT_PVP = 0x0262, + SMSG_INSPECT_RESULT = 0x02BA, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x0F09, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x0932, + SMSG_INSTANCE_ENCOUNTER_END = 0x01BC, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x02B9, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x0B79, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x03F1, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x0B34, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x08AA, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x05A2, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x1C22, + SMSG_INSTANCE_ENCOUNTER_START = 0x0D5D, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x0864, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x044A, + SMSG_INSTANCE_INFO = 0x08FA, + SMSG_INSTANCE_RESET = 0x03B3, + SMSG_INSTANCE_RESET_FAILED = 0x01FA, + SMSG_INSTANCE_SAVE_CREATED = 0x0895, + SMSG_INVALIDATE_PLAYER = 0x0EDE, + SMSG_INVALID_PROMOTION_CODE = 0x0CDD, + SMSG_INVENTORY_CHANGE_FAILURE = 0x1C62, + SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x12A1, + SMSG_ITEM_CHANGED = 0x01A3, + SMSG_ITEM_COOLDOWN = 0x055D, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x0374, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x002B, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x00E3, + SMSG_ITEM_PUSH_RESULT = 0x00E1, + SMSG_ITEM_TIME_UPDATE = 0x017B, + SMSG_KICK_REASON = 0x0B24, + SMSG_LEARNED_SPELLS = 0x1812, + SMSG_LEARN_TALENT_FAILED = 0x0DD9, + SMSG_LEVEL_UP_INFO = 0x0E72, + SMSG_LFG_BOOT_PLAYER = 0x0ED6, + SMSG_LFG_DISABLED = 0x0A2D, + SMSG_LFG_JOIN_RESULT = 0x1C56, + SMSG_LFG_LIST_JOIN_RESULT = 0x086D, + SMSG_LFG_LIST_SEARCH_RESULTS = 0x102E, + SMSG_LFG_LIST_SEARCH_STATUS = 0x1C58, + SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x0A7E, + SMSG_LFG_LIST_UPDATE_STATUS = 0x0CD3, + SMSG_LFG_OFFER_CONTINUE = 0x1C57, + SMSG_LFG_PARTY_INFO = 0x0E55, + SMSG_LFG_PLAYER_INFO = 0x026D, + SMSG_LFG_PLAYER_REWARD = 0x0CD4, + SMSG_LFG_PROPOSAL_UPDATE = 0x1E53, + SMSG_LFG_QUEUE_STATUS = 0x0A6E, + SMSG_LFG_READY_CHECK_RESULT = 0x0A6D, + SMSG_LFG_READY_CHECK_UPDATE = 0x0ED5, + SMSG_LFG_ROLE_CHECK_UPDATE = 0x1ED4, + SMSG_LFG_SEARCH_RESULTS = 0x0ED1, + SMSG_LFG_SLOT_INVALID = 0x007D, + SMSG_LFG_TELEPORT_DENIED = 0x0E53, + SMSG_LFG_UPDATE_STATUS = 0x087E, + SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x113D, + SMSG_LF_GUILD_APPLICATIONS = 0x092F, + SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x0138, + SMSG_LF_GUILD_BROWSE = 0x1167, + SMSG_LF_GUILD_COMMAND_RESULT = 0x1175, + SMSG_LF_GUILD_POST = 0x1127, + SMSG_LF_GUILD_RECRUITS = 0x0167, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x0271, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x0AB4, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x03A3, + SMSG_LOAD_CUF_PROFILES = 0x044E, + SMSG_LOAD_EQUIPMENT_SET = 0x0C69, + SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x00BB, + SMSG_LOGIN_SET_TIME_SPEED = 0x0CCA, + SMSG_LOGIN_VERIFY_WORLD = 0x03AB, + SMSG_LOGOUT_CANCEL_ACK = 0x1E22, + SMSG_LOGOUT_COMPLETE = 0x0C7A, + SMSG_LOGOUT_RESPONSE = 0x00E4, + SMSG_LOG_XP_GAIN = 0x0C71, + SMSG_LOOT_ALL_PASSED = 0x0BE2, + SMSG_LOOT_CONTENTS = 0x048A, + SMSG_LOOT_ITEM_LIST = 0x01E4, + SMSG_LOOT_LIST = 0x0D0A, + SMSG_LOOT_MONEY_NOTIFY = 0x0B2B, + SMSG_LOOT_RELEASE = 0x0E61, + SMSG_LOOT_RELEASE_ALL = 0x0B72, + SMSG_LOOT_REMOVED = 0x05D9, + SMSG_LOOT_RESPONSE = 0x0972, + SMSG_LOOT_ROLL = 0x0489, + SMSG_LOOT_ROLLS_COMPLETE = 0x0AE4, + SMSG_LOOT_ROLL_WON = 0x0A73, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x0179, + SMSG_MAIL_COMMAND_RESULT = 0x07CE, + SMSG_MAIL_LIST_RESULT = 0x0CDA, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x1E29, + SMSG_MAP_OBJECTIVES_INIT = 0x0832, + SMSG_MAP_OBJ_EVENTS = 0x0B7C, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x0C95, + SMSG_MESSAGE_BOX = 0x08F9, + SMSG_MINIMAP_PING = 0x0AAA, + SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x16CB, + SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x1E5E, + SMSG_MISSILE_CANCEL = 0x0079, + SMSG_MODIFY_COOLDOWN = 0x0C2A, + SMSG_MOTD = 0x111C, + SMSG_MOUNT_RESULT = 0x0F49, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x1320, + SMSG_MOVE_DISABLE_COLLISION = 0x191E, + SMSG_MOVE_DISABLE_GRAVITY = 0x0894, + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x131E, + SMSG_MOVE_ENABLE_COLLISION = 0x0891, + SMSG_MOVE_ENABLE_GRAVITY = 0x0584, + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x191F, + SMSG_MOVE_KNOCK_BACK = 0x19CE, + SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x0E91, + SMSG_MOVE_ROOT = 0x09D4, + SMSG_MOVE_SET_ACTIVE_MOVER = 0x0DD7, + SMSG_MOVE_SET_CAN_FLY = 0x0158, + SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x198E, + SMSG_MOVE_SET_COLLISION_HEIGHT = 0x0505, + SMSG_MOVE_SET_COMPOUND_STATE = 0x1C1D, + SMSG_MOVE_SET_FEATHER_FALL = 0x189E, + SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x0A91, + SMSG_MOVE_SET_FLIGHT_SPEED = 0x104F, + SMSG_MOVE_SET_HOVERING = 0x1B9D, + SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x120E, + SMSG_MOVE_SET_LAND_WALK = 0x0918, + SMSG_MOVE_SET_NORMAL_FALL = 0x0153, + SMSG_MOVE_SET_PITCH_RATE = 0x1950, + SMSG_MOVE_SET_RUN_BACK_SPEED = 0x1459, + SMSG_MOVE_SET_RUN_SPEED = 0x0553, + SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x190F, + SMSG_MOVE_SET_SWIM_SPEED = 0x0D43, + SMSG_MOVE_SET_TURN_RATE = 0x101E, + SMSG_MOVE_SET_VEHICLE_REC_ID = 0x129E, + SMSG_MOVE_SET_WALK_SPEED = 0x1449, + SMSG_MOVE_SET_WATER_WALK = 0x0114, + SMSG_MOVE_SKIP_TIME = 0x1C20, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x18D0, + SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x0551, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x181E, + SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x0E92, + SMSG_MOVE_SPLINE_ROOT = 0x1B10, + SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x1C1E, + SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x0118, + SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x1110, + SMSG_MOVE_SPLINE_SET_FLYING = 0x0E13, + SMSG_MOVE_SPLINE_SET_HOVER = 0x0DD8, + SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x0145, + SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x0193, + SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x05D1, + SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x1850, + SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x10D0, + SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x1A20, + SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x1A4D, + SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x0554, + SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x18DD, + SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x0511, + SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x0D14, + SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x0907, + SMSG_MOVE_SPLINE_START_SWIM = 0x0181, + SMSG_MOVE_SPLINE_STOP_SWIM = 0x1890, + SMSG_MOVE_SPLINE_UNROOT = 0x111D, + SMSG_MOVE_SPLINE_UNSET_FLYING = 0x18E0, + SMSG_MOVE_SPLINE_UNSET_HOVER = 0x114F, + SMSG_MOVE_TELEPORT = 0x09C3, + SMSG_MOVE_UNROOT = 0x13D0, + SMSG_MOVE_UNSET_CAN_FLY = 0x05C7, + SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x05D7, + SMSG_MOVE_UNSET_HOVERING = 0x100D, + SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x12DF, + SMSG_MOVE_UPDATE = 0x18A0, + SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x0917, + SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x1C1F, + SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x10DF, + SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x0946, + SMSG_MOVE_UPDATE_KNOCK_BACK = 0x1BCE, + SMSG_MOVE_UPDATE_PITCH_RATE = 0x145C, + SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x0D95, + SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x0192, + SMSG_MOVE_UPDATE_RUN_SPEED = 0x195E, + SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x0D11, + SMSG_MOVE_UPDATE_SWIM_SPEED = 0x0901, + SMSG_MOVE_UPDATE_TELEPORT = 0x19DF, + SMSG_MOVE_UPDATE_TURN_RATE = 0x05C4, + SMSG_MOVE_UPDATE_WALK_SPEED = 0x1820, + SMSG_MULTIPLE_PACKETS = 0x1038, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x0979, + SMSG_NEW_TAXI_PATH = 0x023A, + SMSG_NEW_WORLD = 0x061E, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x09B6, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x049D, + SMSG_NOTIFY_MONEY = 0x0E0A, + SMSG_NOTIFY_RECEIVED_MAIL = 0x09EA, + SMSG_OFFER_PETITION_ERROR = 0x0A63, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x026C, + SMSG_ON_MONSTER_MOVE = 0x1310, + SMSG_OPEN_CONTAINER = 0x03E9, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x083D, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x08B9, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x0A34, + SMSG_OVERRIDE_LIGHT = 0x0239, + SMSG_PAGE_TEXT = 0x06CE, + SMSG_PARTY_COMMAND_RESULT = 0x0F19, + SMSG_PARTY_INVITE = 0x01EB, + SMSG_PARTY_KILL_LOG = 0x0172, + SMSG_PARTY_MEMBER_STATE = 0x0164, + SMSG_PARTY_UPDATE = 0x0263, + SMSG_PAUSE_MIRROR_TIMER = 0x1C39, + SMSG_PENDING_RAID_LOCK = 0x08A1, + SMSG_PETITION_ALREADY_SIGNED = 0x078D, + SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x016E, + SMSG_PETITION_SHOW_LIST = 0x08EB, + SMSG_PETITION_SHOW_SIGNATURES = 0x1E32, + SMSG_PETITION_SIGN_RESULTS = 0x0139, + SMSG_PET_ACTION_FEEDBACK = 0x045D, + SMSG_PET_ACTION_SOUND = 0x0C4E, + SMSG_PET_ADDED = 0x1C72, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x083A, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x0C98, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x0071, + SMSG_PET_BATTLE_FINAL_ROUND = 0x0BF2, + SMSG_PET_BATTLE_FINISHED = 0x0171, + SMSG_PET_BATTLE_FIRST_ROUND = 0x0FD9, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x05A5, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x0C61, + SMSG_PET_BATTLE_PVP_CHALLENGE = 0x0E62, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x03B2, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x0AE3, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x01A9, + SMSG_PET_BATTLE_REQUEST_FAILED = 0x09EC, + SMSG_PET_BATTLE_ROUND_RESULT = 0x08BB, + SMSG_PET_BATTLE_SLOT_UPDATES = 0x0BA4, + SMSG_PET_CAST_FAILED = 0x1AD8, + SMSG_PET_CLEAR_SPELLS = 0x09F5, + SMSG_PET_DISMISS_SOUND = 0x0233, + SMSG_PET_GOD_MODE = 0x03AC, + SMSG_PET_GUIDS = 0x0129, + SMSG_PET_LEARNED_SPELLS = 0x0BB5, + SMSG_PET_MODE = 0x1E62, + SMSG_PET_NAME_INVALID = 0x0231, + SMSG_PET_SLOT_UPDATED = 0x0221, + SMSG_PET_SPELLS_MESSAGE = 0x03A6, + SMSG_PET_STABLE_LIST = 0x0AB9, + SMSG_PET_STABLE_RESULT = 0x0131, + SMSG_PET_TAME_FAILURE = 0x0AF1, + SMSG_PET_UNLEARNED_SPELLS = 0x148A, + SMSG_PHASE_SHIFT_CHANGE = 0x0871, + SMSG_PLAYED_TIME = 0x0E5D, + SMSG_PLAYER_BOUND = 0x0DCD, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x093F, + SMSG_PLAYER_SKINNED = 0x00EB, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x079A, + SMSG_PLAY_MUSIC = 0x0A79, + SMSG_PLAY_OBJECT_SOUND = 0x0AEC, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x0EC9, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x13B0, + SMSG_PLAY_SCENE = 0x09A4, + SMSG_PLAY_SOUND = 0x0AF2, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x09E4, + SMSG_PLAY_SPELL_VISUAL = 0x01EF, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x0BF6, + SMSG_PLAY_TIME_WARNING = 0x02BC, + SMSG_PONG = 0x0237, + SMSG_POWER_UPDATE = 0x0779, + SMSG_PRE_RESSURECT = 0x026A, + SMSG_PRINT_NOTIFICATION = 0x0E3A, + SMSG_PROC_RESIST = 0x05DE, + SMSG_PROPOSE_LEVEL_GRANT = 0x02A4, + SMSG_PVP_CREDIT = 0x06DE, + SMSG_PVP_LOG_DATA = 0x00BC, + SMSG_PVP_OPTIONS_ENABLED = 0x01F2, + SMSG_PVP_SEASON = 0x0A29, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x0BF1, + SMSG_QUERY_CREATURE_RESPONSE = 0x022A, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x0E2A, + SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x0793, + SMSG_QUERY_GUILD_INFO_RESPONSE = 0x0178, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x1579, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x0799, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x0816, + SMSG_QUERY_PETITION_RESPONSE = 0x0BEA, + SMSG_QUERY_PET_NAME_RESPONSE = 0x00B4, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x0B2A, + SMSG_QUERY_QUEST_INFO_RESPONSE = 0x11F1, + SMSG_QUERY_TIME_RESPONSE = 0x0261, + SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x1834, + SMSG_QUEST_CONFIRM_ACCEPT = 0x10E2, + SMSG_QUEST_FORCE_REMOVED = 0x1073, + SMSG_QUEST_GIVER_INVALID_QUEST = 0x12F1, + SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x1034, + SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x18A1, + SMSG_QUEST_GIVER_QUEST_DETAILS = 0x12E3, + SMSG_QUEST_GIVER_QUEST_FAILED = 0x11A3, + SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x1333, + SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x12F9, + SMSG_QUEST_GIVER_STATUS = 0x1363, + SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x1264, + SMSG_QUEST_LOG_FULL = 0x132B, + SMSG_QUEST_POI_QUERY_RESPONSE = 0x116A, + SMSG_QUEST_PUSH_RESULT = 0x123B, + SMSG_QUEST_UPDATE_ADD_CREDIT = 0x10B1, + SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x18AC, + SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x11A9, + SMSG_QUEST_UPDATE_COMPLETE = 0x11FA, + SMSG_QUEST_UPDATE_FAILED = 0x10FB, + SMSG_QUEST_UPDATE_FAILED_TIMER = 0x1139, + SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x0818, + SMSG_RAID_DIFFICULTY_SET = 0x0A32, + SMSG_RAID_GROUP_ONLY = 0x0F4D, + SMSG_RAID_INSTANCE_MESSAGE = 0x12DC, + SMSG_RAID_MARKERS_CHANGED = 0x033B, + SMSG_RANDOM_ROLL = 0x0929, + SMSG_RATED_BATTLEFIELD_INFO = 0x0163, + SMSG_READY_CHECK_COMPLETED = 0x03EA, + SMSG_READY_CHECK_RESPONSE = 0x0962, + SMSG_READY_CHECK_STARTED = 0x0F5D, + SMSG_READ_ITEM_RESULT_FAILED = 0x048D, + SMSG_READ_ITEM_RESULT_OK = 0x09BA, + SMSG_REALM_QUERY_RESPONSE = 0x074A, + SMSG_REALM_SPLIT = 0x1C21, + SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x044D, + SMSG_REFER_A_FRIEND_EXPIRED = 0x0769, + SMSG_REFER_A_FRIEND_FAILURE = 0x03FC, + SMSG_REFRESH_COMPONENT = 0x097A, + SMSG_REFRESH_SPELL_HISTORY = 0x01FE, + SMSG_REMOVE_ITEM_PASSIVE = 0x01B4, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x054A, + SMSG_REPLACE_TROPHY_RESPONSE = 0x03E2, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x0C97, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x0E71, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x02F9, + SMSG_RESEARCH_COMPLETE = 0x055E, + SMSG_RESET_COMPRESSION_CONTEXT = 0x0228, + SMSG_RESET_FAILED_NOTIFY = 0x065A, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x0C19, + SMSG_RESET_WEEKLY_CURRENCY = 0x050D, + SMSG_RESPEC_WIPE_CONFIRM = 0x0039, + SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x0839, + SMSG_RESUME_CAST_BAR = 0x164F, + SMSG_RESUME_COMMS = 0x1037, + SMSG_RESUME_TOKEN = 0x0169, + SMSG_RESURRECT_REQUEST = 0x08E1, + SMSG_RESYNC_RUNES = 0x071E, + SMSG_ROLE_CHANGED_INFORM = 0x070A, + SMSG_ROLE_CHOSEN = 0x0C54, + SMSG_ROLE_POLL_INFORM = 0x0ECE, + SMSG_RUNE_REGEN_DEBUG = 0x093C, + SMSG_SCENARIO_BOOT = 0x00A1, + SMSG_SCENARIO_COMPLETED = 0x0D1A, + SMSG_SCENARIO_OUT_OF_BOUNDS = 0x07DE, + SMSG_SCENARIO_POIS = 0x0F59, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x0971, + SMSG_SCENARIO_STATE = 0x054D, + SMSG_SCENE_OBJECT_EVENT = 0x0964, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x0C9D, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x01B9, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x1E71, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x1E61, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x172A, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x040D, + SMSG_SCRIPT_CAST = 0x13F6, + SMSG_SELL_RESPONSE = 0x0B32, + SMSG_SEND_ITEM_PASSIVES = 0x08F4, + SMSG_SEND_KNOWN_SPELLS = 0x1E0A, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x0BFB, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x071D, + SMSG_SEND_SPELL_CHARGES = 0x1E4B, + SMSG_SEND_SPELL_HISTORY = 0x13E6, + SMSG_SEND_UNLEARN_SPELLS = 0x11B0, + SMSG_SERVER_FIRST_ACHIEVEMENT = 0x120B, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x09F4, + SMSG_SERVER_TIME = 0x0A18, + SMSG_SETUP_CURRENCY = 0x0D19, + SMSG_SETUP_RESEARCH_HISTORY = 0x03A4, + SMSG_SET_AI_ANIM_KIT = 0x057A, + SMSG_SET_ALL_TASK_PROGRESS = 0x0023, + SMSG_SET_ANIM_TIER = 0x0C39, + SMSG_SET_CURRENCY = 0x051D, + SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x0CD5, + SMSG_SET_DUNGEON_DIFFICULTY = 0x0E9A, + SMSG_SET_FACTION_AT_WAR = 0x01AA, + SMSG_SET_FACTION_NOT_VISIBLE = 0x007A, + SMSG_SET_FACTION_STANDING = 0x1E39, + SMSG_SET_FACTION_VISIBLE = 0x03EC, + SMSG_SET_FLAT_SPELL_MODIFIER = 0x18D3, + SMSG_SET_FORCED_REACTIONS = 0x05DD, + SMSG_SET_ITEM_PURCHASE_DATA = 0x0C49, + SMSG_SET_LOOT_METHOD_FAILED = 0x083C, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x01AB, + SMSG_SET_MELEE_ANIM_KIT = 0x03F2, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x00F1, + SMSG_SET_PCT_SPELL_MODIFIER = 0x149B, + SMSG_SET_PET_SPECIALIZATION = 0x049A, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x0329, + SMSG_SET_PLAY_HOVER_ANIM = 0x093A, + SMSG_SET_PROFICIENCY = 0x0E1A, + SMSG_SET_SPELL_CHARGES = 0x1AD1, + SMSG_SET_TASK_COMPLETE = 0x08FC, + SMSG_SET_TIME_ZONE_INFORMATION = 0x09A2, + SMSG_SET_VEHICLE_REC_ID = 0x0229, + SMSG_SHOW_BANK = 0x0939, + SMSG_SHOW_MAILBOX = 0x0A61, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x0334, + SMSG_SHOW_TAXI_NODES = 0x0C99, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x0E69, + SMSG_SOCKET_GEMS = 0x082C, + SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x0072, + SMSG_SPECIAL_MOUNT_ANIM = 0x02BB, + SMSG_SPELL_ABSORB_LOG = 0x11C0, + SMSG_SPELL_CHANNEL_START = 0x18D8, + SMSG_SPELL_CHANNEL_UPDATE = 0x0855, + SMSG_SPELL_COOLDOWN = 0x15DA, + SMSG_SPELL_DAMAGE_SHIELD = 0x1E19, + SMSG_SPELL_DELAYED = 0x13C0, + SMSG_SPELL_DISPELL_LOG = 0x13AF, + SMSG_SPELL_ENERGIZE_LOG = 0x0853, + SMSG_SPELL_EXECUTE_LOG = 0x11B8, + SMSG_SPELL_FAILED_OTHER = 0x1E5A, + SMSG_SPELL_FAILURE = 0x13E5, + SMSG_SPELL_GO = 0x0BA7, + SMSG_SPELL_HEAL_LOG = 0x0A00, + SMSG_SPELL_INSTAKILL_LOG = 0x13A5, + SMSG_SPELL_INTERRUPT_LOG = 0x0A57, + SMSG_SPELL_MISS_LOG = 0x01AF, + SMSG_SPELL_MULTISTRIKE_EFFECT = 0x1A53, + SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x1E4F, + SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x1AD5, + SMSG_SPELL_PERIODIC_AURA_LOG = 0x0AD1, + SMSG_SPELL_START = 0x03F5, + SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x148B, + SMSG_SPIRIT_HEALER_CONFIRM = 0x0BAA, + SMSG_STAND_STATE_UPDATE = 0x01B1, + SMSG_START_ELAPSED_TIMER = 0x176A, + SMSG_START_ELAPSED_TIMERS = 0x0134, + SMSG_START_LOOT_ROLL = 0x033A, + SMSG_START_MIRROR_TIMER = 0x09B4, + SMSG_START_TIMER = 0x078A, + SMSG_STOP_ELAPSED_TIMER = 0x09AA, + SMSG_STOP_MIRROR_TIMER = 0x0F0E, + SMSG_STOP_SPEAKERBOT_SOUND = 0x03FB, + SMSG_STREAMING_MOVIES = 0x041A, + SMSG_SUMMON_CANCEL = 0x0829, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x003B, + SMSG_SUMMON_REQUEST = 0x02AC, + SMSG_SUPERCEDED_SPELLS = 0x13B7, + SMSG_SUPPRESS_NPC_GREETINGS = 0x0E4A, + SMSG_SUSPEND_COMMS = 0x0A38, + SMSG_SUSPEND_TOKEN = 0x0549, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x0D09, + SMSG_TAXI_NODE_STATUS = 0x0A3A, + SMSG_TEXT_EMOTE = 0x0B23, + SMSG_THREAT_CLEAR = 0x0A7A, + SMSG_THREAT_REMOVE = 0x0B3C, + SMSG_THREAT_UPDATE = 0x04CE, + SMSG_TIME_ADJUSTMENT = 0x0D04, + SMSG_TIME_SYNC_REQUEST = 0x1A8D, + SMSG_TITLE_EARNED = 0x09B2, + SMSG_TITLE_LOST = 0x02F2, + SMSG_TOTEM_CREATED = 0x0FDA, + SMSG_TOTEM_MOVED = 0x0A16, + SMSG_TRADE_STATUS = 0x0CC9, + SMSG_TRADE_UPDATED = 0x0739, + SMSG_TRAINER_BUY_FAILED = 0x1E31, + SMSG_TRAINER_LIST = 0x0C96, + SMSG_TRANSFER_ABORTED = 0x02F1, + SMSG_TRANSFER_PENDING = 0x087C, + SMSG_TRIGGER_CINEMATIC = 0x058E, + SMSG_TRIGGER_MOVIE = 0x083B, + SMSG_TURN_IN_PETITION_RESULT = 0x026B, + SMSG_TUTORIAL_FLAGS = 0x03A1, + SMSG_TWITTER_STATUS = 0x02BF, + SMSG_UI_TIME = 0x1C2A, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x0589, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x096A, + SMSG_UNLEARNED_SPELLS = 0x17CB, + SMSG_UPDATE_ACCOUNT_DATA = 0x0C5A, + SMSG_UPDATE_ACTION_BUTTONS = 0x0BE4, + SMSG_UPDATE_CHARACTER_FLAGS = 0x0FCD, + SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x003D, + SMSG_UPDATE_EXPANSION_LEVEL = 0x0824, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x0569, + SMSG_UPDATE_LAST_INSTANCE = 0x156A, + SMSG_UPDATE_OBJECT = 0x0C59, + SMSG_UPDATE_TALENT_DATA = 0x1739, + SMSG_UPDATE_TASK_PROGRESS = 0x055A, + SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x0BC0, + SMSG_UPDATE_WORLD_STATE = 0x0C17, + SMSG_USERLIST_ADD = 0x1059, + SMSG_USERLIST_REMOVE = 0x11DA, + SMSG_USERLIST_UPDATE = 0x121B, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x060D, + SMSG_VENDOR_INVENTORY = 0x07CA, + SMSG_VIGNETTE_UPDATE = 0x0419, + SMSG_VOICE_CHAT_STATUS = 0x101C, + SMSG_VOICE_PARENTAL_CONTROLS = 0x129C, + SMSG_VOICE_SESSION_LEAVE = 0x129A, + SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x104B, + SMSG_VOID_ITEM_SWAP_RESPONSE = 0x0872, + SMSG_VOID_STORAGE_CONTENTS = 0x0122, + SMSG_VOID_STORAGE_FAILED = 0x05C9, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x0E4D, + SMSG_VOID_TRANSFER_RESULT = 0x0EDD, + SMSG_WAIT_QUEUE_FINISH = 0x0FDD, + SMSG_WAIT_QUEUE_UPDATE = 0x0D1E, + SMSG_WARDEN_DATA = 0x0AE1, + SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x0C1D, + SMSG_WEATHER = 0x013C, + SMSG_WEEKLY_SPELL_USAGE = 0x0BF5, + SMSG_WHO = 0x130A, + SMSG_WHO_IS = 0x00AA, + SMSG_WORLD_SERVER_INFO = 0x01E1, + SMSG_WORLD_TEXT = 0x05A1, + SMSG_WOW_TOKEN_AUCTION_SOLD = 0x0A6B, + SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x0BEC, + SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x0322, + SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x08F2, + SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x0D5E, + SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x0C0E, + SMSG_WOW_TOKEN_REDEEM_RESULT = 0x051E, + SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x0A22, + SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x09F2, + SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x09BC, + SMSG_XP_GAIN_ABORTED = 0x0C8D, + SMSG_XP_GAIN_ENABLED = 0x0371, + SMSG_ZONE_UNDER_ATTACK = 0x1189, // Deleted opcodes, here only to allow compile SMSG_ARENA_TEAM_STATS = 0xBADD, diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp index 35e02ab9d0c..0f0e0f68f87 100644 --- a/src/server/game/Server/Protocol/PacketLog.cpp +++ b/src/server/game/Server/Protocol/PacketLog.cpp @@ -86,7 +86,7 @@ void PacketLog::Initialize() header.Signature[0] = 'P'; header.Signature[1] = 'K'; header.Signature[2] = 'T'; header.FormatVersion = 0x0301; header.SnifferId = 'T'; - header.Build = 20173; // 6.2.0 + header.Build = 20444; // 6.2.2 header.Locale[0] = 'e'; header.Locale[1] = 'n'; header.Locale[2] = 'U'; header.Locale[3] = 'S'; std::memset(header.SessionKey, 0, sizeof(header.SessionKey)); header.SniffStartUnixtime = time(NULL); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index bc5b2ef69b6..4e60c366a66 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -48,6 +48,7 @@ #include "ClientConfigPackets.h" #include "MiscPackets.h" #include "ChatPackets.h" +#include "BattlePetMgr.h" #include "PacketUtilities.h" #include <zlib.h> @@ -130,7 +131,8 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccoun _RBACData(NULL), expireTime(60000), // 1 min after socket loss, session is deleted forceExit(false), - m_currentBankerGUID() + m_currentBankerGUID(), + _battlePetMgr(Trinity::make_unique<BattlePetMgr>(this)) { memset(_tutorials, 0, sizeof(_tutorials)); @@ -748,6 +750,40 @@ void WorldSession::LoadAccountData(PreparedQueryResult result, uint32 mask) while (result->NextRow()); } +void WorldSession::LoadAccountToys(PreparedQueryResult result) +{ + if (!result) + return; + + do + { + Field* fields = result->Fetch(); + uint32 itemId = fields[0].GetUInt32(); + bool isFavourite = fields[1].GetBool(); + + _toys[itemId] = isFavourite; + } + while (result->NextRow()); +} + +void WorldSession::SaveAccountToys(SQLTransaction& trans) +{ + PreparedStatement* stmt = NULL; + for (ToyBoxContainer::const_iterator itr = _toys.begin(); itr != _toys.end(); ++itr) + { + stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_ACCOUNT_TOYS); + stmt->setUInt32(0, GetBattlenetAccountId()); + stmt->setUInt32(1, itr->first); + stmt->setBool(2, itr->second); + trans->Append(stmt); + } +} + +bool WorldSession::UpdateAccountToys(uint32 itemId, bool isFavourite /*= false*/) +{ + return _toys.insert(ToyBoxContainer::value_type(itemId, isFavourite)).second; +} + void WorldSession::SetAccountData(AccountDataType type, uint32 time, std::string const& data) { if ((1 << type) & GLOBAL_CACHE_MASK) @@ -1156,15 +1192,31 @@ class AccountInfoQueryHolder : public SQLQueryHolder public: enum { + GLOBAL_ACCOUNT_TOYS = 0, + BATTLE_PETS, + BATTLE_PET_SLOTS, + MAX_QUERIES }; AccountInfoQueryHolder() { SetSize(MAX_QUERIES); } - bool Initialize(uint32 /*accountId*/, uint32 /*battlenetAccountId*/) + bool Initialize(uint32 /*accountId*/, uint32 battlenetAccountId) { bool ok = true; + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_TOYS); + stmt->setUInt32(0, battlenetAccountId); + ok = SetPreparedQuery(GLOBAL_ACCOUNT_TOYS, stmt) && ok; + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BATTLE_PETS); + stmt->setUInt32(0, battlenetAccountId); + ok = SetPreparedQuery(BATTLE_PETS, stmt) && ok; + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BATTLE_PET_SLOTS); + stmt->setUInt32(0, battlenetAccountId); + ok = SetPreparedQuery(BATTLE_PET_SLOTS, stmt) && ok; + return ok; } }; @@ -1196,6 +1248,7 @@ void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQue { LoadAccountData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::GLOBAL_ACCOUNT_DATA), GLOBAL_CACHE_MASK); LoadTutorialsData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::TUTORIALS)); + LoadAccountToys(holder->GetPreparedResult(AccountInfoQueryHolder::GLOBAL_ACCOUNT_TOYS)); if (!m_inQueue) SendAuthResponse(AUTH_OK, false); @@ -1211,6 +1264,9 @@ void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQue SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION)); SendTutorialsData(); + _battlePetMgr->LoadFromDB(holder->GetPreparedResult(AccountInfoQueryHolder::BATTLE_PETS), + holder->GetPreparedResult(AccountInfoQueryHolder::BATTLE_PET_SLOTS)); + delete realmHolder; delete holder; } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 18f7afab82f..54c794ad0ca 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -33,6 +33,7 @@ #include "AccountMgr.h" #include <unordered_set> +class BattlePetMgr; class Channel; class Creature; class GameObject; @@ -117,6 +118,17 @@ namespace WorldPackets class ReportPvPPlayerAFK; } + namespace BattlePet + { + class BattlePetRequestJournal; + class BattlePetSetBattleSlot; + class BattlePetModifyName; + class BattlePetDeletePet; + class BattlePetSetFlags; + class BattlePetSummon; + class CageBattlePet; + } + namespace BlackMarket { class BlackMarketOpen; @@ -319,6 +331,8 @@ namespace WorldPackets class SwapItem; class WrapItem; class CancelTempEnchantment; + class TransmogrifyItems; + class UseCritterItem; } namespace Loot @@ -371,6 +385,7 @@ namespace WorldPackets class OpeningCinematic; class TogglePvP; class SetPvP; + class WorldTeleport; } namespace Movement @@ -492,6 +507,14 @@ namespace WorldPackets class RequestForcedReactions; } + namespace Toy + { + class AccountToysUpdate; + class AddToy; + class ToySetFavorite; + class UseToy; + } + namespace Scenes { class SceneTriggerEvent; @@ -627,9 +650,9 @@ enum AccountDataType enum TutorialAction : uint8 { - TUTORIAL_ACTION_RESET = 1, - TUTORIAL_ACTION_CLEAR = 2, - TUTORIAL_ACTION_UPDATE = 3 + TUTORIAL_ACTION_UPDATE = 0, + TUTORIAL_ACTION_CLEAR = 1, + TUTORIAL_ACTION_RESET = 2 }; /* @@ -660,6 +683,8 @@ enum Tutorials #define MAX_ACCOUNT_TUTORIAL_VALUES 8 +typedef std::map<uint32, bool> ToyBoxContainer; + struct AccountData { time_t Time = 0; @@ -883,6 +908,12 @@ class WorldSession void SetAccountData(AccountDataType type, uint32 time, std::string const& data); void LoadAccountData(PreparedQueryResult result, uint32 mask); + // Account Toys + void LoadAccountToys(PreparedQueryResult result); + void SaveAccountToys(SQLTransaction& trans); + bool UpdateAccountToys(uint32 itemId, bool isFavourite /*= false*/); + ToyBoxContainer const& GetAccountToys() const { return _toys; } + void LoadTutorialsData(PreparedQueryResult result); void SendTutorialsData(); void SaveTutorialsData(SQLTransaction& trans); @@ -969,6 +1000,9 @@ class WorldSession uint32 GetRecruiterId() const { return recruiterId; } bool IsARecruiter() const { return isRecruiter; } + // Battle Pets + BattlePetMgr* GetBattlePetMgr() const { return _battlePetMgr.get(); } + public: // opcodes handlers void Handle_NULL(WorldPackets::Null& null); // not used @@ -1288,6 +1322,7 @@ class WorldSession void HandleSwapItem(WorldPackets::Item::SwapItem& swapItem); void HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet); void HandleWrapItem(WorldPackets::Item::WrapItem& packet); + void HandleUseCritterItem(WorldPackets::Item::UseCritterItem& packet); void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet); void HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& packet); @@ -1414,7 +1449,7 @@ class WorldSession void HandleBfExitRequest(WorldPacket& recvData); void HandleWardenDataOpcode(WorldPacket& recvData); - void HandleWorldTeleportOpcode(WorldPacket& recvData); + void HandleWorldTeleportOpcode(WorldPackets::Misc::WorldTeleport& worldTeleport); void HandleMinimapPingOpcode(WorldPackets::Party::MinimapPingClient& packet); void HandleRandomRollOpcode(WorldPackets::Misc::RandomRollClient& packet); void HandleFarSightOpcode(WorldPackets::Misc::FarSight& packet); @@ -1518,7 +1553,7 @@ class WorldSession void SendVoidStorageTransferResult(VoidTransferError result); // Transmogrification - void HandleTransmogrifyItems(WorldPacket& recvData); + void HandleTransmogrifyItems(WorldPackets::Item::TransmogrifyItems& transmogrifyItems); // Miscellaneous void HandleSpellClick(WorldPackets::Spells::SpellClick& spellClick); @@ -1538,6 +1573,11 @@ class WorldSession void HandleObjectUpdateRescuedOpcode(WorldPackets::Misc::ObjectUpdateRescued& objectUpdateRescued); void HandleRequestCategoryCooldowns(WorldPackets::Spells::RequestCategoryCooldowns& requestCategoryCooldowns); + // Toys + void HandleAddToy(WorldPackets::Toy::AddToy& packet); + void HandleToySetFavorite(WorldPackets::Toy::ToySetFavorite& packet); + void HandleUseToy(WorldPackets::Toy::UseToy& packet); + // Scenes void HandleSceneTriggerEvent(WorldPackets::Scenes::SceneTriggerEvent& sceneTriggerEvent); void HandleScenePlaybackComplete(WorldPackets::Scenes::ScenePlaybackComplete& scenePlaybackComplete); @@ -1558,6 +1598,15 @@ class WorldSession void HandleGarrisonRequestBlueprintAndSpecializationData(WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationData& garrisonRequestBlueprintAndSpecializationData); void HandleGarrisonGetBuildingLandmarks(WorldPackets::Garrison::GarrisonGetBuildingLandmarks& garrisonGetBuildingLandmarks); + // Battle Pets + void HandleBattlePetRequestJournal(WorldPackets::BattlePet::BattlePetRequestJournal& battlePetRequestJournal); + void HandleBattlePetSetBattleSlot(WorldPackets::BattlePet::BattlePetSetBattleSlot& battlePetSetBattleSlot); + void HandleBattlePetModifyName(WorldPackets::BattlePet::BattlePetModifyName& battlePetModifyName); + void HandleBattlePetDeletePet(WorldPackets::BattlePet::BattlePetDeletePet& battlePetDeletePet); + void HandleBattlePetSetFlags(WorldPackets::BattlePet::BattlePetSetFlags& battlePetSetFlags); + void HandleBattlePetSummon(WorldPackets::BattlePet::BattlePetSummon& battlePetSummon); + void HandleCageBattlePet(WorldPackets::BattlePet::CageBattlePet& cageBattlePet); + private: void InitializeQueryCallbackParameters(); void ProcessQueryCallbacks(); @@ -1669,6 +1718,9 @@ class WorldSession uint32 expireTime; bool forceExit; ObjectGuid m_currentBankerGUID; + ToyBoxContainer _toys; + + std::unique_ptr<BattlePetMgr> _battlePetMgr; WorldSession(WorldSession const& right) = delete; WorldSession& operator=(WorldSession const& right) = delete; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 34852d04a49..c60397d8ca8 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1374,7 +1374,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const if ((spellInfo->HasAttribute(SPELL_ATTR8_MASTERY_SPECIALIZATION)) && !plrTarget->IsCurrentSpecMasterySpell(spellInfo)) continue; - if (spellInfo->Stances & (1<<(GetMiscValue()-1))) + if (spellInfo->Stances & (UI64LIT(1) << (GetMiscValue() - 1))) target->CastSpell(target, itr->first, true, NULL, this); } @@ -1389,7 +1389,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE))) continue; - if (spellInfo->Stances & (1 << (GetMiscValue() - 1))) + if (spellInfo->Stances & (UI64LIT(1) << (GetMiscValue() - 1))) target->CastSpell(target, glyph->SpellID, true, NULL, this); } } @@ -1399,7 +1399,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const if (plrTarget->HasSpell(17007)) { SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(24932); - if (spellInfo && spellInfo->Stances & (1 << (GetMiscValue() -1))) + if (spellInfo && spellInfo->Stances & (UI64LIT(1) << (GetMiscValue() -1))) target->CastSpell(target, 24932, true, NULL, this); } @@ -1475,7 +1475,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const for (Unit::AuraApplicationMap::iterator itr = tAuras.begin(); itr != tAuras.end();) { // Use the new aura to see on what stance the target will be - uint32 newStance = (1 << ((newAura ? newAura->GetMiscValue() : 0) -1)); + uint64 newStance = newAura ? (UI64LIT(1) << (newAura->GetMiscValue() - 1)) : 0; // If the stances are not compatible with the spell, remove it if (itr->second->GetBase()->IsRemovedOnShapeLost(target) && !(itr->second->GetBase()->GetSpellInfo()->Stances & newStance)) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 8098c8db3d5..1cad126e116 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1485,7 +1485,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b { // This additional check is needed to add a minimal delay before cooldown in in effect // to allow all bubbles broken by a single damage source proc mana return - if (caster->GetSpellHistory()->GetRemainingCooldown(aura->GetId()) <= 11) + if (caster->GetSpellHistory()->GetRemainingCooldown(aura->GetSpellInfo()) <= 11) break; } else // and add if needed diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 97250169a8a..80d90bfa543 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -569,6 +569,7 @@ m_spellValue(new SpellValue(caster->GetMap()->GetDifficultyID(), m_spellInfo)), m_CastItem = NULL; m_castItemGUID.Clear(); m_castItemEntry = 0; + m_castFlagsEx = 0; unitTarget = NULL; itemTarget = NULL; @@ -2858,11 +2859,6 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered m_castItemGUID = m_CastItem->GetGUID(); m_castItemEntry = m_CastItem->GetEntry(); } - else - { - m_castItemGUID.Clear(); - m_castItemEntry = 0; - } InitExplicitTargets(*targets); @@ -3477,7 +3473,10 @@ void Spell::_handle_finish_phase() void Spell::SendSpellCooldown() { - m_caster->GetSpellHistory()->HandleCooldowns(m_spellInfo, m_CastItem, this); + if (m_CastItem) + m_caster->GetSpellHistory()->HandleCooldowns(m_spellInfo, m_CastItem, this); + else + m_caster->GetSpellHistory()->HandleCooldowns(m_spellInfo, m_castItemEntry, this); } void Spell::update(uint32 difftime) @@ -3836,6 +3835,7 @@ void Spell::SendSpellStart() castData.SpellID = m_spellInfo->Id; castData.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; + castData.CastFlagsEx = m_castFlagsEx; castData.CastTime = m_casttime; m_targets.Write(castData.Target); @@ -3952,6 +3952,7 @@ void Spell::SendSpellGo() castData.SpellID = m_spellInfo->Id; castData.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; + castData.CastFlagsEx = m_castFlagsEx; castData.CastTime = getMSTime(); UpdateSpellCastDataTargets(castData); @@ -4697,7 +4698,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_NOT_READY; } - if (!m_caster->GetSpellHistory()->IsReady(m_spellInfo)) + if (!m_caster->GetSpellHistory()->IsReady(m_spellInfo, m_castItemEntry)) { if (m_triggeredByAuraSpell) return SPELL_FAILED_DONT_REPORT; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 183f4039711..d5ed0a3c0a8 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -83,6 +83,31 @@ enum SpellCastFlags CAST_FLAG_UNKNOWN_32 = 0x80000000 }; +enum SpellCastFlagsEx +{ + CAST_FLAG_EX_NONE = 0x00000, + CAST_FLAG_EX_UNKNOWN_1 = 0x00001, + CAST_FLAG_EX_UNKNOWN_2 = 0x00002, + CAST_FLAG_EX_UNKNOWN_3 = 0x00004, + CAST_FLAG_EX_UNKNOWN_4 = 0x00008, + CAST_FLAG_EX_UNKNOWN_5 = 0x00010, + CAST_FLAG_EX_UNKNOWN_6 = 0x00020, + CAST_FLAG_EX_UNKNOWN_7 = 0x00040, + CAST_FLAG_EX_UNKNOWN_8 = 0x00080, + CAST_FLAG_EX_UNKNOWN_9 = 0x00100, + CAST_FLAG_EX_UNKNOWN_10 = 0x00200, + CAST_FLAG_EX_UNKNOWN_11 = 0x00400, + CAST_FLAG_EX_UNKNOWN_12 = 0x00800, + CAST_FLAG_EX_UNKNOWN_13 = 0x01000, + CAST_FLAG_EX_UNKNOWN_14 = 0x02000, + CAST_FLAG_EX_UNKNOWN_15 = 0x04000, + CAST_FLAG_EX_USE_TOY_SPELL = 0x08000, // Starts cooldown on toy + CAST_FLAG_EX_UNKNOWN_17 = 0x10000, + CAST_FLAG_EX_UNKNOWN_18 = 0x20000, + CAST_FLAG_EX_UNKNOWN_19 = 0x40000, + CAST_FLAG_EX_UNKNOWN_20 = 0x80000 +}; + enum SpellRangeFlag { SPELL_RANGE_DEFAULT = 0, @@ -409,6 +434,9 @@ class Spell void EffectCreateGarrison(SpellEffIndex effIndex); void EffectAddGarrisonFollower(SpellEffIndex effIndex); void EffectActivateGarrisonBuilding(SpellEffIndex effIndex); + void EffectHealBattlePetPct(SpellEffIndex effIndex); + void EffectEnableBattlePets(SpellEffIndex effIndex); + void EffectUncageBattlePet(SpellEffIndex effIndex); typedef std::set<Aura*> UsedSpellMods; @@ -519,6 +547,7 @@ class Spell ObjectGuid m_castItemGUID; uint32 m_castItemEntry; uint8 m_cast_count; + uint32 m_castFlagsEx; union { // Alternate names for this value @@ -690,6 +719,8 @@ class Spell // Targets store structures and data struct TargetInfo { + // a bug in gcc-4.7 needs a destructor to call move operator instead of copy operator in std::vector remove + ~TargetInfo() { } ObjectGuid targetGUID; uint64 timeDelay; SpellMissInfo missCondition:8; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 7dad460ddcc..1cb344da5aa 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -56,6 +56,7 @@ #include "Guild.h" #include "ReputationMgr.h" #include "AreaTrigger.h" +#include "BattlePetMgr.h" #include "Garrison.h" #include "CombatLogPackets.h" #include "DuelPackets.h" @@ -256,7 +257,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //189 SPELL_EFFECT_LOOT &Spell::EffectNULL, //190 SPELL_EFFECT_190 &Spell::EffectNULL, //191 SPELL_EFFECT_TELEPORT_TO_DIGSITE - &Spell::EffectNULL, //192 SPELL_EFFECT_UNCAGE_BATTLEPET + &Spell::EffectUncageBattlePet, //192 SPELL_EFFECT_UNCAGE_BATTLEPET &Spell::EffectNULL, //193 SPELL_EFFECT_START_PET_BATTLE &Spell::EffectNULL, //194 SPELL_EFFECT_194 &Spell::EffectNULL, //195 SPELL_EFFECT_195 @@ -264,8 +265,8 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //197 SPELL_EFFECT_197 &Spell::EffectNULL, //198 SPELL_EFFECT_198 &Spell::EffectNULL, //199 SPELL_EFFECT_199 - &Spell::EffectNULL, //200 SPELL_EFFECT_HEAL_BATTLEPET_PCT - &Spell::EffectNULL, //201 SPELL_EFFECT_ENABLE_BATTLE_PETS + &Spell::EffectHealBattlePetPct, //200 SPELL_EFFECT_HEAL_BATTLEPET_PCT + &Spell::EffectEnableBattlePets, //201 SPELL_EFFECT_ENABLE_BATTLE_PETS &Spell::EffectNULL, //202 SPELL_EFFECT_202 &Spell::EffectNULL, //203 SPELL_EFFECT_203 &Spell::EffectNULL, //204 SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY @@ -1508,7 +1509,7 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) // send info to the client player->SendNewItem(pItem, num_to_add, true, bgType == 0); - if (pItem->GetQuality() > ITEM_QUALITY_EPIC || (pItem->GetQuality() == ITEM_QUALITY_EPIC && pItem->GetItemLevel(player) >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)])) + if (pItem->GetQuality() > ITEM_QUALITY_EPIC || (pItem->GetQuality() == ITEM_QUALITY_EPIC && pItem->GetItemLevel(player) >= MinNewsItemLevel)) if (Guild* guild = player->GetGuild()) guild->AddGuildNews(GUILD_NEWS_ITEM_CRAFTED, player->GetGUID(), 0, pProto->GetId()); @@ -2259,6 +2260,22 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex) uint32 spellToLearn = (m_spellInfo->Id == 483 || m_spellInfo->Id == 55884) ? damage : effectInfo->TriggerSpell; player->LearnSpell(spellToLearn, false); + if (m_spellInfo->Id == 55884) + { + if (BattlePetMgr* battlePetMgr = player->GetSession()->GetBattlePetMgr()) + { + for (auto entry : sBattlePetSpeciesStore) + { + if (entry->SummonSpellID == spellToLearn) + { + battlePetMgr->AddPet(entry->ID, entry->CreatureID, BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID)); + player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT); + break; + } + } + } + } + TC_LOG_DEBUG("spells", "Spell: %s has learned spell %u from %s", player->GetGUID().ToString().c_str(), spellToLearn, m_caster->GetGUID().ToString().c_str()); } @@ -5861,3 +5878,85 @@ void Spell::EffectActivateGarrisonBuilding(SpellEffIndex effIndex) if (Garrison* garrison = unitTarget->ToPlayer()->GetGarrison()) garrison->ActivateBuilding(GetEffect(effIndex)->MiscValue); } + +void Spell::EffectHealBattlePetPct(SpellEffIndex effIndex) +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + if (BattlePetMgr* battlePetMgr = unitTarget->ToPlayer()->GetSession()->GetBattlePetMgr()) + battlePetMgr->HealBattlePetsPct(GetEffect(effIndex)->BasePoints); +} + +void Spell::EffectEnableBattlePets(SpellEffIndex /*effIndex*/) +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + Player* plr = unitTarget->ToPlayer(); + plr->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_PET_BATTLES_UNLOCKED); + plr->GetSession()->GetBattlePetMgr()->UnlockSlot(0); +} + +void Spell::EffectUncageBattlePet(SpellEffIndex /*effIndex*/) +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (!m_CastItem || !m_caster || m_caster->GetTypeId() != TYPEID_PLAYER) + return; + + Player* plr = m_caster->ToPlayer(); + + // are we allowed to learn battle pets without it? + /*if (plr->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_PET_BATTLES_UNLOCKED)) + return; // send some error*/ + + uint32 speciesId = m_CastItem->GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID); + uint16 breed = m_CastItem->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) & 0xFFFFFF; + uint8 quality = (m_CastItem->GetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA) >> 24) & 0xFF; + uint16 level = m_CastItem->GetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL); + uint32 creatureId = m_CastItem->GetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID); + + BattlePetSpeciesEntry const* speciesEntry = sBattlePetSpeciesStore.LookupEntry(speciesId); + if (!speciesEntry) + return; + + BattlePetMgr* battlePetMgr = plr->GetSession()->GetBattlePetMgr(); + if (!battlePetMgr) + return; + + uint16 maxLearnedLevel = 0; + + for (auto pet : battlePetMgr->GetLearnedPets()) + maxLearnedLevel = std::max(pet.PacketInfo.Level, maxLearnedLevel); + + // TODO: This means if you put your highest lvl pet into cage, you won't be able to uncage it again which is probably wrong. + // We will need to store maxLearnedLevel somewhere to avoid this behaviour. + if (maxLearnedLevel < level) + { + battlePetMgr->SendError(BATTLEPETRESULT_TOO_HIGH_LEVEL_TO_UNCAGE, creatureId); // or speciesEntry.CreatureID + SendCastResult(SPELL_FAILED_CANT_ADD_BATTLE_PET); + return; + } + + if (battlePetMgr->GetPetCount(speciesId) >= MAX_BATTLE_PETS_PER_SPECIES) + { + battlePetMgr->SendError(BATTLEPETRESULT_CANT_HAVE_MORE_PETS_OF_THAT_TYPE, creatureId); // or speciesEntry.CreatureID + SendCastResult(SPELL_FAILED_CANT_ADD_BATTLE_PET); + return; + } + + if (!plr->HasSpell(speciesEntry->SummonSpellID)) + plr->LearnSpell(speciesEntry->SummonSpellID, false); + + battlePetMgr->AddPet(speciesId, creatureId, breed, quality, level); + plr->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true); + m_CastItem = nullptr; +} diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index 64902febc77..3b86e3d594b 100644 --- a/src/server/game/Spells/SpellHistory.cpp +++ b/src/server/game/Spells/SpellHistory.cpp @@ -42,6 +42,8 @@ struct SpellHistory::PersistenceHelper<Player> cooldownEntry->CooldownEnd = Clock::from_time_t(time_t(fields[2].GetUInt32())); cooldownEntry->ItemId = fields[1].GetUInt32(); + cooldownEntry->CategoryId = fields[3].GetUInt32(); + cooldownEntry->CategoryEnd = Clock::from_time_t(time_t(fields[4].GetUInt32())); return true; } @@ -61,6 +63,8 @@ struct SpellHistory::PersistenceHelper<Player> stmt->setUInt32(index++, cooldown.first); stmt->setUInt32(index++, cooldown.second.ItemId); stmt->setUInt32(index++, uint32(Clock::to_time_t(cooldown.second.CooldownEnd))); + stmt->setUInt32(index++, cooldown.second.CategoryId); + stmt->setUInt32(index++, uint32(Clock::to_time_t(cooldown.second.CategoryEnd))); } static void WriteCharge(PreparedStatement* stmt, uint8& index, uint32 chargeCategory, ChargeEntry const& charge) @@ -89,6 +93,8 @@ struct SpellHistory::PersistenceHelper<Pet> cooldownEntry->CooldownEnd = Clock::from_time_t(time_t(fields[1].GetUInt32())); cooldownEntry->ItemId = 0; + cooldownEntry->CategoryId = fields[2].GetUInt32(); + cooldownEntry->CategoryEnd = Clock::from_time_t(time_t(fields[3].GetUInt32())); return true; } @@ -107,6 +113,8 @@ struct SpellHistory::PersistenceHelper<Pet> { stmt->setUInt32(index++, cooldown.first); stmt->setUInt32(index++, uint32(Clock::to_time_t(cooldown.second.CooldownEnd))); + stmt->setUInt32(index++, cooldown.second.CategoryId); + stmt->setUInt32(index++, uint32(Clock::to_time_t(cooldown.second.CategoryEnd))); } static void WriteCharge(PreparedStatement* stmt, uint8& index, uint32 chargeCategory, ChargeEntry const& charge) @@ -129,7 +137,11 @@ void SpellHistory::LoadFromDB(PreparedQueryResult cooldownsResult, PreparedQuery uint32 spellId; CooldownEntry cooldown; if (StatementInfo::ReadCooldown(cooldownsResult->Fetch(), &spellId, &cooldown)) + { _spellCooldowns[spellId] = cooldown; + if (cooldown.CategoryId) + _categoryCooldowns[cooldown.CategoryId] = &_spellCooldowns[spellId]; + } } while (cooldownsResult->NextRow()); } @@ -191,10 +203,18 @@ void SpellHistory::Update() { SQLTransaction t; Clock::time_point now = Clock::now(); + for (auto itr = _categoryCooldowns.begin(); itr != _categoryCooldowns.end();) + { + if (itr->second->CategoryEnd < now) + itr = _categoryCooldowns.erase(itr); + else + ++itr; + } + for (auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end();) { if (itr->second.CooldownEnd < now) - itr = _spellCooldowns.erase(itr); + itr = EraseCooldown(itr); else ++itr; } @@ -209,32 +229,40 @@ void SpellHistory::Update() void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, Item const* item, Spell* spell /*= nullptr*/) { + HandleCooldowns(spellInfo, item ? item->GetEntry() : 0, spell); +} + +void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, uint32 itemID, Spell* spell /*= nullptr*/) +{ if (ConsumeCharge(spellInfo->ChargeCategoryEntry)) return; if (Player* player = _owner->ToPlayer()) { // potions start cooldown until exiting combat - if (item && (item->IsPotion() || spellInfo->IsCooldownStartedOnEvent())) + if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemID)) { - player->SetLastPotionId(item->GetEntry()); - return; + if (itemTemplate->IsPotion() || spellInfo->IsCooldownStartedOnEvent()) + { + player->SetLastPotionId(itemID); + return; + } } } if (spellInfo->IsCooldownStartedOnEvent() || spellInfo->IsPassive() || (spell && spell->IsIgnoringCooldowns())) return; - StartCooldown(spellInfo, item ? item->GetEntry() : 0, spell); + StartCooldown(spellInfo, itemID, spell); } -bool SpellHistory::IsReady(SpellInfo const* spellInfo) const +bool SpellHistory::IsReady(SpellInfo const* spellInfo, uint32 itemId /*= 0*/) const { if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE) if (IsSchoolLocked(spellInfo->GetSchoolMask())) return false; - if (HasCooldown(spellInfo->Id)) + if (HasCooldown(spellInfo->Id, itemId)) return false; if (!HasCharge(spellInfo->ChargeCategoryEntry)) @@ -257,11 +285,9 @@ void SpellHistory::WritePacket(WorldPackets::Spells::SendSpellHistory* sendSpell Clock::time_point now = Clock::now(); for (auto const& p : _spellCooldowns) { - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(p.first); WorldPackets::Spells::SpellHistoryEntry historyEntry; historyEntry.SpellID = p.first; historyEntry.ItemID = p.second.ItemId; - historyEntry.Category = spellInfo->GetCategory(); if (p.second.OnHold) historyEntry.OnHold = true; @@ -271,10 +297,13 @@ void SpellHistory::WritePacket(WorldPackets::Spells::SendSpellHistory* sendSpell if (cooldownDuration.count() <= 0) continue; - if (spellInfo->GetCategory()) - historyEntry.CategoryRecoveryTime = uint32(cooldownDuration.count()); - else - historyEntry.RecoveryTime = uint32(cooldownDuration.count()); + historyEntry.RecoveryTime = uint32(cooldownDuration.count()); + std::chrono::milliseconds categoryDuration = std::chrono::duration_cast<std::chrono::milliseconds>(p.second.CategoryEnd - now); + if (categoryDuration.count() > 0) + { + historyEntry.Category = p.second.CategoryId; + historyEntry.CategoryRecoveryTime = uint32(categoryDuration.count()); + } } sendSpellHistory->Entries.push_back(historyEntry); @@ -316,7 +345,7 @@ void SpellHistory::WritePacket(WorldPackets::Pet::PetSpells* petSpells) SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(p.first); WorldPackets::Pet::PetSpellCooldown petSpellCooldown; petSpellCooldown.SpellID = p.first; - petSpellCooldown.Category = spellInfo->GetCategory(); + petSpellCooldown.Category = p.second.CategoryId; if (!p.second.OnHold) { @@ -324,10 +353,10 @@ void SpellHistory::WritePacket(WorldPackets::Pet::PetSpells* petSpells) if (cooldownDuration.count() <= 0) continue; - if (spellInfo->GetCategory()) - petSpellCooldown.CategoryDuration = uint32(cooldownDuration.count()); - else - petSpellCooldown.Duration = uint32(cooldownDuration.count()); + petSpellCooldown.Duration = uint32(cooldownDuration.count()); + std::chrono::milliseconds categoryDuration = std::chrono::duration_cast<std::chrono::milliseconds>(p.second.CategoryEnd - now); + if (categoryDuration.count() > 0) + petSpellCooldown.CategoryDuration = uint32(categoryDuration.count()); } petSpells->Cooldowns.push_back(historyEntry); @@ -463,7 +492,7 @@ void SpellHistory::StartCooldown(SpellInfo const* spellInfo, uint32 itemId, Spel // self spell cooldown if (recTime != curTime) { - AddCooldown(spellInfo->Id, itemId, recTime, onHold); + AddCooldown(spellInfo->Id, itemId, recTime, categoryId, catrecTime, onHold); if (needsCooldownPacket) { @@ -477,22 +506,6 @@ void SpellHistory::StartCooldown(SpellInfo const* spellInfo, uint32 itemId, Spel } } } - - // category spells - if (categoryId && catrecTime != curTime) - { - SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(categoryId); - if (i_scstore != sSpellsByCategoryStore.end()) - { - for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset) - { - if (*i_scset == spellInfo->Id) // skip main spell, already handled above - continue; - - AddCooldown(*i_scset, itemId, catrecTime, onHold); - } - } - } } void SpellHistory::SendCooldownEvent(SpellInfo const* spellInfo, uint32 itemId /*= 0*/, Spell* spell /*= nullptr*/, bool startCooldown /*= true*/) @@ -501,43 +514,22 @@ void SpellHistory::SendCooldownEvent(SpellInfo const* spellInfo, uint32 itemId / if (startCooldown) StartCooldown(spellInfo, itemId, spell); + // Send activate cooldown timer (possible 0) at client side if (Player* player = GetPlayerOwner()) - { - // Send activate cooldown timer (possible 0) at client side player->SendDirectMessage(WorldPackets::Spells::CooldownEvent(player != _owner, spellInfo->Id).Write()); - - uint32 category = spellInfo->GetCategory(); - if (category && spellInfo->CategoryRecoveryTime) - { - SpellCategoryStore::const_iterator ct = sSpellsByCategoryStore.find(category); - if (ct != sSpellsByCategoryStore.end()) - { - for (auto const& cooldownPair : _spellCooldowns) - { - uint32 categorySpell = cooldownPair.first; - if (!ct->second.count(categorySpell)) - continue; - - if (categorySpell == spellInfo->Id) // skip main spell, already handled above - continue; - - SpellInfo const* spellInfo2 = sSpellMgr->AssertSpellInfo(categorySpell); - if (!spellInfo2->IsCooldownStartedOnEvent()) - continue; - - player->SendDirectMessage(WorldPackets::Spells::CooldownEvent(player != _owner, categorySpell).Write()); - } - } - } - } } -void SpellHistory::AddCooldown(uint32 spellId, uint32 itemId, Clock::time_point cooldownEnd, bool onHold /*= false*/) +void SpellHistory::AddCooldown(uint32 spellId, uint32 itemId, Clock::time_point cooldownEnd, uint32 categoryId, Clock::time_point categoryEnd, bool onHold /*= false*/) { CooldownEntry& cooldownEntry = _spellCooldowns[spellId]; cooldownEntry.CooldownEnd = cooldownEnd; cooldownEntry.ItemId = itemId; + cooldownEntry.CategoryId = categoryId; + cooldownEntry.CategoryEnd = categoryEnd; cooldownEntry.OnHold = onHold; + + if (categoryId) + _categoryCooldowns[categoryId] = &cooldownEntry; } void SpellHistory::ModifyCooldown(uint32 spellId, int32 cooldownModMs) @@ -551,7 +543,7 @@ void SpellHistory::ModifyCooldown(uint32 spellId, int32 cooldownModMs) if (itr->second.CooldownEnd + offset > now) itr->second.CooldownEnd += offset; else - _spellCooldowns.erase(itr); + EraseCooldown(itr); if (Player* playerOwner = GetPlayerOwner()) { @@ -586,7 +578,7 @@ void SpellHistory::ResetCooldown(CooldownStorageType::iterator& itr, bool update } } - itr = _spellCooldowns.erase(itr); + itr = EraseCooldown(itr); } void SpellHistory::ResetAllCooldowns() @@ -601,31 +593,69 @@ void SpellHistory::ResetAllCooldowns() SendClearCooldowns(cooldowns); } + _categoryCooldowns.clear(); _spellCooldowns.clear(); } -bool SpellHistory::HasCooldown(uint32 spellId) const +bool SpellHistory::HasCooldown(SpellInfo const* spellInfo, uint32 itemId /*= 0*/) const +{ + if (_spellCooldowns.count(spellInfo->Id) != 0) + return true; + + uint32 category = 0; + if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId)) + { + for (ItemEffectEntry const* itemEffect : itemTemplate->Effects) + { + if (itemEffect->SpellID == spellInfo->Id) + { + category = itemEffect->Category; + break; + } + } + } + + if (!category) + category = spellInfo->GetCategory(); + + if (!category) + return false; + + return _categoryCooldowns.count(category) != 0; +} + +bool SpellHistory::HasCooldown(uint32 spellId, uint32 itemId /*= 0*/) const { - return _spellCooldowns.count(spellId) != 0; + return HasCooldown(sSpellMgr->AssertSpellInfo(spellId), itemId); } -uint32 SpellHistory::GetRemainingCooldown(uint32 spellId) const +uint32 SpellHistory::GetRemainingCooldown(SpellInfo const* spellInfo) const { - auto itr = _spellCooldowns.find(spellId); - if (itr == _spellCooldowns.end()) - return 0; + Clock::time_point end; + auto itr = _spellCooldowns.find(spellInfo->Id); + if (itr != _spellCooldowns.end()) + end = itr->second.CooldownEnd; + else + { + auto catItr = _categoryCooldowns.find(spellInfo->GetCategory()); + if (catItr == _categoryCooldowns.end()) + return 0; + + end = catItr->second->CategoryEnd; + } Clock::time_point now = Clock::now(); - if (itr->second.CooldownEnd < now) + if (end < now) return 0; - Clock::duration remaining = itr->second.CooldownEnd - now; + Clock::duration remaining = end - now; return uint32(std::chrono::duration_cast<std::chrono::milliseconds>(remaining).count()); } void SpellHistory::LockSpellSchool(SpellSchoolMask schoolMask, uint32 lockoutTime) { - Clock::time_point lockoutEnd = Clock::now() + std::chrono::duration_cast<Clock::duration>(std::chrono::milliseconds(lockoutTime)); + Clock::time_point now = Clock::now(); + Clock::time_point lockoutEnd = now + std::chrono::duration_cast<Clock::duration>(std::chrono::milliseconds(lockoutTime)); for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) if (SpellSchoolMask(1 << i) & schoolMask) _schoolLockouts[i] = lockoutEnd; @@ -663,10 +693,10 @@ void SpellHistory::LockSpellSchool(SpellSchoolMask schoolMask, uint32 lockoutTim if (spellInfo->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) continue; - if ((schoolMask & spellInfo->GetSchoolMask()) && GetRemainingCooldown(spellId) < lockoutTime) + if ((schoolMask & spellInfo->GetSchoolMask()) && GetRemainingCooldown(spellInfo) < lockoutTime) { spellCooldown.SpellCooldowns.emplace_back(spellId, lockoutTime); - AddCooldown(spellId, 0, lockoutEnd); + AddCooldown(spellId, 0, lockoutEnd, 0, now); } } diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h index a55f57aa9f4..0a504668997 100644 --- a/src/server/game/Spells/SpellHistory.h +++ b/src/server/game/Spells/SpellHistory.h @@ -46,12 +46,11 @@ public: struct CooldownEntry { - CooldownEntry() : ItemId(0), OnHold(false) { } - CooldownEntry(Clock::time_point endTime, uint32 itemId) : CooldownEnd(endTime), ItemId(itemId), OnHold(false) { } - Clock::time_point CooldownEnd; - uint32 ItemId; - bool OnHold; + uint32 ItemId = 0; + uint32 CategoryId = 0; + Clock::time_point CategoryEnd; + bool OnHold = false; }; struct ChargeEntry @@ -65,6 +64,7 @@ public: }; typedef std::unordered_map<uint32 /*spellId*/, CooldownEntry> CooldownStorageType; + typedef std::unordered_map<uint32 /*categoryId*/, CooldownEntry*> CategoryCooldownStorageType; typedef std::unordered_map<uint32 /*categoryId*/, std::deque<ChargeEntry>> ChargeStorageType; typedef std::unordered_map<uint32 /*categoryId*/, Clock::time_point> GlobalCooldownStorageType; @@ -79,7 +79,8 @@ public: void Update(); void HandleCooldowns(SpellInfo const* spellInfo, Item const* item, Spell* spell = nullptr); - bool IsReady(SpellInfo const* spellInfo) const; + void HandleCooldowns(SpellInfo const* spellInfo, uint32 itemID, Spell* spell = nullptr); + bool IsReady(SpellInfo const* spellInfo, uint32 itemId = 0) const; template<class PacketType> void WritePacket(PacketType* packet) const; @@ -92,10 +93,11 @@ public: template<class Type, class Period> void AddCooldown(uint32 spellId, uint32 itemId, std::chrono::duration<Type, Period> cooldownDuration) { - AddCooldown(spellId, itemId, Clock::now() + std::chrono::duration_cast<Clock::duration>(cooldownDuration)); + Clock::time_point now = Clock::now(); + AddCooldown(spellId, itemId, now + std::chrono::duration_cast<Clock::duration>(cooldownDuration), 0, now); } - void AddCooldown(uint32 spellId, uint32 itemId, Clock::time_point cooldownEnd, bool onHold = false); + void AddCooldown(uint32 spellId, uint32 itemId, Clock::time_point cooldownEnd, uint32 categoryId, Clock::time_point categoryEnd, bool onHold = false); void ModifyCooldown(uint32 spellId, int32 cooldownModMs); void ResetCooldown(uint32 spellId, bool update = false); void ResetCooldown(CooldownStorageType::iterator& itr, bool update = false); @@ -120,8 +122,9 @@ public: } void ResetAllCooldowns(); - bool HasCooldown(uint32 spellId) const; - uint32 GetRemainingCooldown(uint32 spellId) const; + bool HasCooldown(SpellInfo const* spellInfo, uint32 itemId = 0) const; + bool HasCooldown(uint32 spellId, uint32 itemId = 0) const; + uint32 GetRemainingCooldown(SpellInfo const* spellInfo) const; // School lockouts void LockSpellSchool(SpellSchoolMask schoolMask, uint32 lockoutTime); @@ -144,9 +147,15 @@ public: private: Player* GetPlayerOwner() const; void SendClearCooldowns(std::vector<int32> const& cooldowns) const; + CooldownStorageType::iterator EraseCooldown(CooldownStorageType::iterator itr) + { + _categoryCooldowns.erase(itr->second.CategoryId); + return _spellCooldowns.erase(itr); + } Unit* _owner; CooldownStorageType _spellCooldowns; + CategoryCooldownStorageType _categoryCooldowns; Clock::time_point _schoolLockouts[MAX_SPELL_SCHOOL]; ChargeStorageType _categoryCharges; GlobalCooldownStorageType _globalCooldowns; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 94fc49a2c3d..50921c28a61 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1126,9 +1126,8 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef // SpellShapeshiftEntry SpellShapeshiftEntry const* _shapeshift = GetSpellShapeshift(); - // TODO: 6.x these maks have 2 parts - Stances = _shapeshift ? _shapeshift->ShapeshiftMask[0] : 0; - StancesNot = _shapeshift ? _shapeshift->ShapeshiftExclude[0] : 0; + Stances = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftMask[0], _shapeshift->ShapeshiftMask[1]) : 0; + StancesNot = _shapeshift ? MAKE_PAIR64(_shapeshift->ShapeshiftExclude[0], _shapeshift->ShapeshiftExclude[1]) : 0; // SpellTargetRestrictionsEntry SpellTargetRestrictionsEntry const* _target = GetSpellTargetRestrictions(); @@ -1668,7 +1667,10 @@ SpellCastResult SpellInfo::CheckShapeshift(uint32 form) const (Effects[0].Effect == SPELL_EFFECT_LEARN_SPELL || Effects[1].Effect == SPELL_EFFECT_LEARN_SPELL || Effects[2].Effect == SPELL_EFFECT_LEARN_SPELL)) return SPELL_CAST_OK;*/ - uint32 stanceMask = (form ? 1 << (form - 1) : 0); + //if (HasAttribute(SPELL_ATTR13_ACTIVATES_REQUIRED_SHAPESHIFT)) + // return SPELL_CAST_OK; + + uint64 stanceMask = (form ? UI64LIT(1) << (form - 1) : 0); if (stanceMask & StancesNot) // can explicitly not be cast in this stance return SPELL_FAILED_NOT_SHAPESHIFT; @@ -2918,6 +2920,7 @@ bool SpellInfo::_IsPositiveEffect(uint32 effIndex, bool deep) const case 62344: // Fists of Stone case 61819: // Manabonked! (item) case 61834: // Manabonked! (minigob) + case 73523: // Rigor Mortis return true; default: break; diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 5fd960066f0..86d8addfbdb 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -345,8 +345,8 @@ public: uint32 AttributesEx12; uint32 AttributesEx13; uint32 AttributesCu; - uint32 Stances; - uint32 StancesNot; + uint64 Stances; + uint64 StancesNot; uint32 Targets; uint32 TargetCreatureType; uint32 RequiresSpellFocus; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index e893ab1b7f8..9d5237fa591 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -28,6 +28,8 @@ #include "BattlefieldMgr.h" #include "Player.h" +PetFamilySpellsStore sPetFamilySpellsStore; + bool IsPrimaryProfessionSkill(uint32 skill) { SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(skill); @@ -3481,7 +3483,7 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CAST | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_JUMP; break; case 5420: // Tree of Life (Passive) - spellInfo->Stances = 1 << (FORM_TREE - 1); + spellInfo->Stances = UI64LIT(1) << (FORM_TREE - 1); break; case 49376: // Feral Charge (Cat Form) spellInfo->AttributesEx3 &= ~SPELL_ATTR3_CANT_TRIGGER_PROC; diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index cf501df98c2..6264aafb021 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -547,6 +547,9 @@ typedef std::pair<SpellLearnSpellMap::const_iterator, SpellLearnSpellMap::const_ typedef std::multimap<uint32, SkillLineAbilityEntry const*> SkillLineAbilityMap; typedef std::pair<SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator> SkillLineAbilityMapBounds; +typedef std::set<uint32> PetFamilySpellsSet; +typedef std::map<uint32, PetFamilySpellsSet> PetFamilySpellsStore; + typedef std::multimap<uint32, uint32> PetLevelupSpellSet; typedef std::map<uint32, PetLevelupSpellSet> PetLevelupSpellMap; @@ -591,6 +594,8 @@ DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group); DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group); int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto); +extern PetFamilySpellsStore sPetFamilySpellsStore; + class SpellMgr { // Constructors diff --git a/src/server/game/Support/SupportMgr.cpp b/src/server/game/Support/SupportMgr.cpp index 43b754575ca..af6c2dce5c1 100644 --- a/src/server/game/Support/SupportMgr.cpp +++ b/src/server/game/Support/SupportMgr.cpp @@ -67,7 +67,7 @@ void BugTicket::LoadFromDB(Field* fields) _playerGuid = ObjectGuid::Create<HighGuid::Player>(fields[++idx].GetUInt64()); _note = fields[++idx].GetString(); _createTime = fields[++idx].GetUInt32(); - _mapId = fields[++idx].GetUInt32(); + _mapId = fields[++idx].GetUInt16(); _pos.x = fields[++idx].GetFloat(); _pos.y = fields[++idx].GetFloat(); _pos.z = fields[++idx].GetFloat(); @@ -97,7 +97,7 @@ void BugTicket::SaveToDB() const stmt->setUInt32(idx, _id); stmt->setUInt64(++idx, _playerGuid.GetCounter()); stmt->setString(++idx, _note); - stmt->setUInt32(++idx, _mapId); + stmt->setUInt16(++idx, _mapId); stmt->setFloat(++idx, _pos.x); stmt->setFloat(++idx, _pos.y); stmt->setFloat(++idx, _pos.z); @@ -153,7 +153,7 @@ void ComplaintTicket::LoadFromDB(Field* fields) _playerGuid = ObjectGuid::Create<HighGuid::Player>(fields[++idx].GetUInt64()); _note = fields[++idx].GetString(); _createTime = fields[++idx].GetUInt32(); - _mapId = fields[++idx].GetUInt32(); + _mapId = fields[++idx].GetUInt16(); _pos.x = fields[++idx].GetFloat(); _pos.y = fields[++idx].GetFloat(); _pos.z = fields[++idx].GetFloat(); @@ -195,7 +195,7 @@ void ComplaintTicket::SaveToDB() const stmt->setUInt32(idx, _id); stmt->setUInt64(++idx, _playerGuid.GetCounter()); stmt->setString(++idx, _note); - stmt->setUInt32(++idx, _mapId); + stmt->setUInt16(++idx, _mapId); stmt->setFloat(++idx, _pos.x); stmt->setFloat(++idx, _pos.y); stmt->setFloat(++idx, _pos.z); @@ -276,7 +276,7 @@ void SuggestionTicket::LoadFromDB(Field* fields) _playerGuid = ObjectGuid::Create<HighGuid::Player>(fields[++idx].GetUInt64()); _note = fields[++idx].GetString(); _createTime = fields[++idx].GetUInt32(); - _mapId = fields[++idx].GetUInt32(); + _mapId = fields[++idx].GetUInt16(); _pos.x = fields[++idx].GetFloat(); _pos.y = fields[++idx].GetFloat(); _pos.z = fields[++idx].GetFloat(); @@ -306,7 +306,7 @@ void SuggestionTicket::SaveToDB() const stmt->setUInt32(idx, _id); stmt->setUInt64(++idx, _playerGuid.GetCounter()); stmt->setString(++idx, _note); - stmt->setUInt32(++idx, _mapId); + stmt->setUInt16(++idx, _mapId); stmt->setFloat(++idx, _pos.x); stmt->setFloat(++idx, _pos.y); stmt->setFloat(++idx, _pos.z); diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 71719c19b3a..900be2ba44a 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -435,7 +435,7 @@ DumpReturn PlayerDumpReader::LoadDump(std::string const& file, uint32 account, s if (!normalizePlayerName(name)) name.clear(); - if (ObjectMgr::CheckPlayerName(name, true) == CHAR_NAME_SUCCESS) + if (ObjectMgr::CheckPlayerName(name, sWorld->GetDefaultDbcLocale(), true) == CHAR_NAME_SUCCESS) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME); stmt->setString(0, name); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 96c5f2eff1b..d6cceac46fb 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -27,6 +27,7 @@ #include "AuctionHouseMgr.h" #include "BattlefieldMgr.h" #include "BattlegroundMgr.h" +#include "BattlePetMgr.h" #include "CalendarMgr.h" #include "Channel.h" #include "CharacterDatabaseCleaner.h" @@ -53,11 +54,11 @@ #include "OutdoorPvPMgr.h" #include "Player.h" #include "PoolMgr.h" +#include "GitRevision.h" #include "ScriptMgr.h" #include "SkillDiscovery.h" #include "SkillExtraItems.h" #include "SmartAI.h" -#include "SystemConfig.h" #include "SupportMgr.h" #include "TransportMgr.h" #include "Unit.h" @@ -419,7 +420,7 @@ void World::LoadConfigSettings(bool reload) m_defaultDbcLocale = LocaleConstant(sConfigMgr->GetIntDefault("DBC.Locale", 0)); - if (m_defaultDbcLocale >= TOTAL_LOCALES) + if (m_defaultDbcLocale >= TOTAL_LOCALES || m_defaultDbcLocale < LOCALE_enUS) { TC_LOG_ERROR("server.loading", "Incorrect DBC.Locale! Must be >= 0 and < %d (set to 0)", TOTAL_LOCALES); m_defaultDbcLocale = LOCALE_enUS; @@ -1459,28 +1460,31 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Initialize data stores..."); ///- Load DBCs - LoadDBCStores(m_dataPath); + LoadDBCStores(m_dataPath, m_defaultDbcLocale); ///- Load DB2s - sDB2Manager.LoadStores(m_dataPath); + sDB2Manager.LoadStores(m_dataPath, m_defaultDbcLocale); TC_LOG_INFO("misc", "Loading hotfix info..."); sDB2Manager.LoadHotfixData(); ///- Close hotfix database - it is only used during DB2 loading HotfixDatabase.Close(); ///- Load GameTables - LoadGameTables(m_dataPath); + LoadGameTables(m_dataPath, m_defaultDbcLocale); sSpellMgr->LoadPetFamilySpellsStore(); - std::vector<uint32> mapIds; - for (uint32 mapId = 0; mapId < sMapStore.GetNumRows(); mapId++) - if (sMapStore.LookupEntry(mapId)) - mapIds.push_back(mapId); + std::unordered_map<uint32, std::vector<uint32>> mapData; + for (MapEntry const* mapEntry : sMapStore) + { + mapData.insert(std::unordered_map<uint32, std::vector<uint32>>::value_type(mapEntry->ID, std::vector<uint32>())); + if (mapEntry->ParentMapID != -1) + mapData[mapEntry->ParentMapID].push_back(mapEntry->ID); + } if (VMAP::VMapManager2* vmmgr2 = dynamic_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())) - vmmgr2->InitializeThreadUnsafe(mapIds); + vmmgr2->InitializeThreadUnsafe(mapData); MMAP::MMapManager* mmmgr = MMAP::MMapFactory::createOrGetMMapManager(); - mmmgr->InitializeThreadUnsafe(mapIds); + mmmgr->InitializeThreadUnsafe(mapData); TC_LOG_INFO("server.loading", "Loading SpellInfo store..."); sSpellMgr->LoadSpellInfoStore(); @@ -1910,7 +1914,7 @@ void World::SetInitialWorldSettings() m_startTime = m_gameTime; LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES(%u, %u, 0, '%s')", - realmHandle.Index, uint32(m_startTime), _FULLVERSION); // One-time query + realmHandle.Index, uint32(m_startTime), GitRevision::GetFullVersion()); // One-time query m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); @@ -2023,6 +2027,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading realm names..."); sObjectMgr->LoadRealmNames(); + TC_LOG_INFO("server.loading", "Loading battle pets info..."); + BattlePetMgr::Initialize(); + uint32 startupDuration = GetMSTimeDiffToNow(startupBegin); TC_LOG_INFO("server.worldserver", "World initialized in %u minutes %u seconds", (startupDuration / 60000), ((startupDuration % 60000) / 1000)); diff --git a/src/server/ipc/CMakeLists.txt b/src/server/ipc/CMakeLists.txt index 95e5e2fc0da..e9f38f20c17 100644 --- a/src/server/ipc/CMakeLists.txt +++ b/src/server/ipc/CMakeLists.txt @@ -8,6 +8,8 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +find_package(ZMQ REQUIRED) + file(GLOB_RECURSE sources_ipc *.cpp *.h) set(ipc_SRCS @@ -17,7 +19,7 @@ set(ipc_SRCS include_directories( ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/dep/zmqpp - ${CMAKE_SOURCE_DIR}/src/server/shared/ + ${CMAKE_SOURCE_DIR}/src/common/ ${ZMQ_INCLUDE_DIR} ) diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index 694a36cb229..44f17bd2ac5 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -44,34 +44,20 @@ message(STATUS "SCRIPT PREPARATION COMPLETE") message("") include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include - ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/SFMT ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/zlib - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Database - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/ipc - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Models - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Database + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/database/Database ${CMAKE_SOURCE_DIR}/src/server/game/Accounts ${CMAKE_SOURCE_DIR}/src/server/game/Achievements ${CMAKE_SOURCE_DIR}/src/server/game/Addons @@ -85,21 +71,19 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Battlefield/Zones ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds/Zones - ${CMAKE_SOURCE_DIR}/src/server/game/Calendar ${CMAKE_SOURCE_DIR}/src/server/game/Chat ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels - ${CMAKE_SOURCE_DIR}/src/server/game/Conditions - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration ${CMAKE_SOURCE_DIR}/src/server/game/Combat + ${CMAKE_SOURCE_DIR}/src/server/game/Conditions ${CMAKE_SOURCE_DIR}/src/server/game/DataStores ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding ${CMAKE_SOURCE_DIR}/src/server/game/Entities/AreaTrigger ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature ${CMAKE_SOURCE_DIR}/src/server/game/Entities/DynamicObject + ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item/Container - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Pet @@ -116,19 +100,16 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Guilds ${CMAKE_SOURCE_DIR}/src/server/game/Handlers ${CMAKE_SOURCE_DIR}/src/server/game/Instances - ${CMAKE_SOURCE_DIR}/src/server/game/LookingForGroup ${CMAKE_SOURCE_DIR}/src/server/game/Loot ${CMAKE_SOURCE_DIR}/src/server/game/Mails - ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous ${CMAKE_SOURCE_DIR}/src/server/game/Maps + ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous ${CMAKE_SOURCE_DIR}/src/server/game/Movement ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints - ${CMAKE_SOURCE_DIR}/src/server/game/Opcodes ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP ${CMAKE_SOURCE_DIR}/src/server/game/Pools - ${CMAKE_SOURCE_DIR}/src/server/game/PrecompiledHeaders ${CMAKE_SOURCE_DIR}/src/server/game/Quests ${CMAKE_SOURCE_DIR}/src/server/game/Reputation ${CMAKE_SOURCE_DIR}/src/server/game/Scripting @@ -140,12 +121,17 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras ${CMAKE_SOURCE_DIR}/src/server/game/Support ${CMAKE_SOURCE_DIR}/src/server/game/Texts + ${CMAKE_SOURCE_DIR}/src/server/game/Tickets ${CMAKE_SOURCE_DIR}/src/server/game/Tools ${CMAKE_SOURCE_DIR}/src/server/game/Warden - ${CMAKE_SOURCE_DIR}/src/server/game/Warden/Modules ${CMAKE_SOURCE_DIR}/src/server/game/Weather ${CMAKE_SOURCE_DIR}/src/server/game/World - ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders + ${CMAKE_SOURCE_DIR}/src/server/ipc + ${CMAKE_SOURCE_DIR}/src/server/shared + ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} @@ -158,8 +144,6 @@ add_library(scripts STATIC ${scripts_STAT_PCH_SRC} ) -add_dependencies(scripts revision.h) - # Generate precompiled header if (USE_SCRIPTPCH) add_cxx_pch(scripts ${scripts_STAT_PCH_HDR} ${scripts_STAT_PCH_SRC}) diff --git a/src/server/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp index dfd0bb36755..d5c7470a0ec 100644 --- a/src/server/scripts/Commands/cs_cast.cpp +++ b/src/server/scripts/Commands/cs_cast.cpp @@ -53,6 +53,25 @@ public: return commandTable; } + static bool CheckSpellExistsAndIsValid(ChatHandler* handler, uint32 spellId) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); + if (!spellInfo) + { + handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); + handler->SetSentErrorMessage(true); + return false; + } + + if (!SpellMgr::IsSpellValid(spellInfo, handler->GetSession()->GetPlayer())) + { + handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); + handler->SetSentErrorMessage(true); + return false; + } + return true; + } + static bool HandleCastCommand(ChatHandler* handler, char const* args) { if (!*args) @@ -71,20 +90,8 @@ public: if (!spellId) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + if (!CheckSpellExistsAndIsValid(handler, spellId)) return false; - } - - if (!SpellMgr::IsSpellValid(spellInfo, handler->GetSession()->GetPlayer())) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } char* triggeredStr = strtok(NULL, " "); if (triggeredStr) @@ -111,15 +118,13 @@ public: return false; } - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form uint32 spellId = handler->extractSpellIdFromLink((char*)args); - if (!spellId || !sSpellMgr->GetSpellInfo(spellId)) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + if (!spellId) + return false; + + if (!CheckSpellExistsAndIsValid(handler, spellId)) return false; - } char* triggeredStr = strtok(NULL, " "); if (triggeredStr) @@ -146,20 +151,8 @@ public: if (!spellId) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + if (!CheckSpellExistsAndIsValid(handler, spellId)) return false; - } - - if (!SpellMgr::IsSpellValid(spellInfo, handler->GetSession()->GetPlayer())) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); - return false; - } char* distStr = strtok(NULL, " "); @@ -192,28 +185,14 @@ public: return false; Unit* target = handler->getSelectedUnit(); - if (!target) - { - handler->SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); - handler->SetSentErrorMessage(true); - return false; - } // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form uint32 spellId = handler->extractSpellIdFromLink((char*)args); if (!spellId) return false; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); - if (!spellInfo) - return false; - - if (!SpellMgr::IsSpellValid(spellInfo, handler->GetSession()->GetPlayer())) - { - handler->PSendSysMessage(LANG_COMMAND_SPELL_BROKEN, spellId); - handler->SetSentErrorMessage(true); + if (!CheckSpellExistsAndIsValid(handler, spellId)) return false; - } target->CastSpell(target, spellId, false); @@ -239,12 +218,11 @@ public: // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form uint32 spellId = handler->extractSpellIdFromLink((char*)args); - if (!spellId || !sSpellMgr->GetSpellInfo(spellId)) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + if (!spellId) + return false; + + if (!CheckSpellExistsAndIsValid(handler, spellId)) return false; - } char* triggeredStr = strtok(NULL, " "); if (triggeredStr) @@ -273,12 +251,11 @@ public: // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form uint32 spellId = handler->extractSpellIdFromLink((char*)args); - if (!spellId || !sSpellMgr->GetSpellInfo(spellId)) - { - handler->PSendSysMessage(LANG_COMMAND_NOSPELLFOUND); - handler->SetSentErrorMessage(true); + if (!spellId) + return false; + + if (!CheckSpellExistsAndIsValid(handler, spellId)) return false; - } char* posX = strtok(NULL, " "); char* posY = strtok(NULL, " "); diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 93a4a526786..ef39e2feb98 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -336,7 +336,7 @@ public: return false; } - if (ObjectMgr::CheckPlayerName(newName, true) != CHAR_NAME_SUCCESS) + if (ObjectMgr::CheckPlayerName(newName, target ? target->GetSession()->GetSessionDbcLocale() : sWorld->GetDefaultDbcLocale(), true) != CHAR_NAME_SUCCESS) { handler->SendSysMessage(LANG_BAD_VALUE); handler->SetSentErrorMessage(true); @@ -896,7 +896,7 @@ public: return false; } - if (ObjectMgr::CheckPlayerName(name, true) != CHAR_NAME_SUCCESS) + if (ObjectMgr::CheckPlayerName(name, sWorld->GetDefaultDbcLocale(), true) != CHAR_NAME_SUCCESS) { handler->PSendSysMessage(LANG_INVALID_CHARACTER_NAME); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp index 7ecf1337ee5..e65ac5f2105 100644 --- a/src/server/scripts/Commands/cs_server.cpp +++ b/src/server/scripts/Commands/cs_server.cpp @@ -28,7 +28,7 @@ EndScriptData */ #include "ObjectAccessor.h" #include "Player.h" #include "ScriptMgr.h" -#include "SystemConfig.h" +#include "GitRevision.h" class server_commandscript : public CommandScript { @@ -115,7 +115,7 @@ public: std::string uptime = secsToTimeString(sWorld->GetUptime()); uint32 updateTime = sWorld->GetUpdateTime(); - handler->SendSysMessage(_FULLVERSION); + handler->SendSysMessage(GitRevision::GetFullVersion()); handler->PSendSysMessage(LANG_CONNECTED_PLAYERS, playersNum, maxPlayersNum); handler->PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum); handler->PSendSysMessage(LANG_UPTIME, uptime.c_str()); diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 98c6781e866..c1aecf6ed4d 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -149,7 +149,7 @@ class spell_dk_anti_magic_shell : public SpellScriptLoader { // Cannot reduce cooldown by more than 50% int32 val = std::min(glyph->GetAmount(), int32(absorbedAmount) * 100 / maxHealth); - player->GetSpellHistory()->ModifyCooldown(GetId(), -int32(player->GetSpellHistory()->GetRemainingCooldown(GetId()) * val / 100)); + player->GetSpellHistory()->ModifyCooldown(GetId(), -int32(player->GetSpellHistory()->GetRemainingCooldown(GetSpellInfo()) * val / 100)); } } diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index f91c684110a..0d2d9ceb2ab 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -12,18 +12,15 @@ if( USE_COREPCH ) include_directories(${CMAKE_CURRENT_BINARY_DIR}) endif() -file(GLOB_RECURSE sources_Configuration Configuration/*.cpp Configuration/*.h) file(GLOB_RECURSE sources_Cryptography Cryptography/*.cpp Cryptography/*.h) -file(GLOB_RECURSE sources_Database Database/*.cpp Database/*.h) file(GLOB_RECURSE sources_DataStores DataStores/*.cpp DataStores/*.h) file(GLOB_RECURSE sources_Dynamic Dynamic/*.cpp Dynamic/*.h) -file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h) file(GLOB_RECURSE sources_Networking Networking/*.cpp Networking/*.h) file(GLOB_RECURSE sources_Packets Packets/*.cpp Packets/*.h) file(GLOB_RECURSE sources_Realm Realm/*.cpp Realm/*.h) -file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h) -file(GLOB_RECURSE sources_Updater Updater/*.cpp Updater/*.h) -file(GLOB_RECURSE sources_Utilities Utilities/*.cpp Utilities/*.h) +if(WIN32) + file(GLOB_RECURSE sources_Service Service/*.cpp Service/*.h) +endif(WIN32) file(GLOB sources_localdir *.cpp *.h) @@ -43,45 +40,27 @@ endif() set(shared_STAT_SRCS ${shared_STAT_SRCS} - ${sources_Configuration} ${sources_Cryptography} - ${sources_Database} ${sources_DataStores} - ${sources_Debugging} ${sources_Dynamic} - ${sources_Logging} ${sources_Networking} ${sources_Packets} ${sources_Realm} - ${sources_Threading} - ${sources_Updater} - ${sources_Utilities} + ${sources_Service} ${sources_localdir} ) include_directories( - ${CMAKE_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/cppformat - ${CMAKE_SOURCE_DIR}/dep/utf8cpp - ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/Configuration - ${CMAKE_CURRENT_SOURCE_DIR}/Cryptography - ${CMAKE_CURRENT_SOURCE_DIR}/Database - ${CMAKE_CURRENT_SOURCE_DIR}/DataStores - ${CMAKE_CURRENT_SOURCE_DIR}/Debugging ${CMAKE_CURRENT_SOURCE_DIR}/Dynamic - ${CMAKE_CURRENT_SOURCE_DIR}/Logging ${CMAKE_CURRENT_SOURCE_DIR}/Networking - ${CMAKE_CURRENT_SOURCE_DIR}/Packets - ${CMAKE_CURRENT_SOURCE_DIR}/Realm - ${CMAKE_CURRENT_SOURCE_DIR}/Threading - ${CMAKE_CURRENT_SOURCE_DIR}/Utilities - ${CMAKE_CURRENT_SOURCE_DIR}/Updater - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object + ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/database + ${CMAKE_SOURCE_DIR}/src/server/database/Database ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} @@ -94,6 +73,8 @@ add_library(shared STATIC ${shared_STAT_PCH_SRC} ) +add_dependencies(shared revision_data.h) + # Generate precompiled header if (USE_COREPCH) add_cxx_pch(shared ${shared_STAT_PCH_HDR} ${shared_STAT_PCH_SRC}) diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index f4a1518a255..347d3dfab5b 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -22,13 +22,14 @@ DB2FileLoader::DB2FileLoader() { + fileName = nullptr; recordSize = 0; recordCount = 0; fieldCount = 0; stringSize = 0; - fieldsOffset = NULL; - data = NULL; - stringTable = NULL; + fieldsOffset = nullptr; + data = nullptr; + stringTable = nullptr; tableHash = 0; build = 0; @@ -36,7 +37,7 @@ DB2FileLoader::DB2FileLoader() unk1 = 0; minIndex = 0; maxIndex = 0; - locale = 0; + localeMask = 0; unk5 = 0; } @@ -44,14 +45,15 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) { if (data) { - delete [] data; - data = NULL; + delete[] data; + data = nullptr; } FILE* f = fopen(filename, "rb"); if (!f) return false; + fileName = filename; uint32 header; if (fread(&header, 4, 1, f) != 1) // Signature { @@ -140,13 +142,13 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(maxIndex); - if (fread(&locale, 4, 1, f) != 1) // Locales + if (fread(&localeMask, 4, 1, f) != 1) // Locales { fclose(f); return false; } - EndianConvert(locale); + EndianConvert(localeMask); if (fread(&unk5, 4, 1, f) != 1) // Unknown WDB2 { @@ -213,6 +215,7 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) recordsize += 4; break; case FT_STRING: + case FT_STRING_NOT_LOCALIZED: recordsize += sizeof(char*); break; case FT_SORT: @@ -225,6 +228,9 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) case FT_BYTE: recordsize += 1; break; + case FT_LONG: + recordsize += 8; + break; } } @@ -234,7 +240,17 @@ uint32 DB2FileLoader::GetFormatRecordSize(const char * format, int32* index_pos) return recordsize; } -uint32 DB2FileLoader::GetFormatStringFieldCount(char const* format) +uint32 DB2FileLoader::GetFormatStringFieldCount(const char* format) +{ + uint32 stringfields = 0; + for (uint32 x = 0; format[x]; ++x) + if (format[x] == FT_STRING || format[x] == FT_STRING_NOT_LOCALIZED) + ++stringfields; + + return stringfields; +} + +uint32 DB2FileLoader::GetFormatLocalizedStringFieldCount(char const* format) { uint32 stringfields = 0; for (uint32 x = 0; format[x]; ++x) @@ -304,8 +320,13 @@ char* DB2FileLoader::AutoProduceData(const char* format, uint32& records, char** *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x); offset += 1; break; + case FT_LONG: + *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x); + offset += 8; + break; case FT_STRING: - *((char**)(&dataTable[offset])) = NULL; // will be replaces non-empty or "" strings in AutoProduceStrings + case FT_STRING_NOT_LOCALIZED: + *((char**)(&dataTable[offset])) = nullptr; // will be replaces non-empty or "" strings in AutoProduceStrings offset += sizeof(char*); break; } @@ -323,19 +344,21 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da return nullptr; // we store flat holders pool as single memory block - size_t stringFields = GetFormatStringFieldCount(format); + std::size_t stringFields = GetFormatStringFieldCount(format); if (!stringFields) return nullptr; + std::size_t localizedStringFields = GetFormatLocalizedStringFieldCount(format); + // each string field at load have array of string for each locale - size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; - size_t stringHoldersRecordPoolSize = stringFields * stringHolderSize; - size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * recordCount; + std::size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES; + std::size_t stringHoldersRecordPoolSize = localizedStringFields * stringHolderSize + (stringFields - localizedStringFields) * sizeof(char*); + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * recordCount; char* stringHoldersPool = new char[stringHoldersPoolSize]; // DB2 strings expected to have at least empty string - for (size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) + for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) ((char const**)stringHoldersPool)[i] = nullStr; uint32 offset = 0; @@ -343,7 +366,7 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da // assign string holders to string field slots for (uint32 y = 0; y < recordCount; y++) { - uint32 stringFieldNum = 0; + uint32 stringFieldOffset = 0; for (uint32 x = 0; x < fieldCount; x++) { @@ -357,12 +380,20 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da case FT_BYTE: offset += 1; break; + case FT_LONG: + offset += 8; + break; case FT_STRING: + case FT_STRING_NOT_LOCALIZED: { // init db2 string field slots by pointers to string holders char const*** slot = (char const***)(&dataTable[offset]); - *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringHolderSize*stringFieldNum]); - ++stringFieldNum; + *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]); + if (format[x] == FT_STRING) + stringFieldOffset += stringHolderSize; + else + ++stringFieldOffset; + offset += sizeof(char*); break; } @@ -379,7 +410,24 @@ char* DB2FileLoader::AutoProduceStringsArrayHolders(const char* format, char* da char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uint32 locale) { if (strlen(format) != fieldCount) - return NULL; + return nullptr; + + if (!(localeMask & (1 << locale))) + { + char const* sep = ""; + std::ostringstream str; + for (uint32 i = 0; i < TOTAL_LOCALES; ++i) + { + if (localeMask & (1 << i)) + { + str << sep << localeNames[i]; + sep = ", "; + } + } + + TC_LOG_ERROR("", "Attempted to load %s which has locales %s as %s. Check if you placed your localized db2 files in correct directory.", fileName, str.str().c_str(), localeNames[locale]); + return nullptr; + } char* stringPool = new char[stringSize]; memcpy(stringPool, stringTable, stringSize); @@ -400,19 +448,30 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin case FT_BYTE: offset += 1; break; + case FT_LONG: + offset += 8; + break; case FT_STRING: { // fill only not filled entries LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]); if (db2str->Str[locale] == nullStr) { - const char * st = getRecord(y).getString(x); - db2str->Str[locale] = stringPool + (st - (const char*)stringTable); + char const* st = getRecord(y).getString(x); + db2str->Str[locale] = stringPool + (st - (char const*)stringTable); } offset += sizeof(char*); break; } + case FT_STRING_NOT_LOCALIZED: + { + char** db2str = (char**)(&dataTable[offset]); + char const* st = getRecord(y).getString(x); + *db2str = stringPool + (st - (char const*)stringTable); + offset += sizeof(char*); + break; + } } } } @@ -420,7 +479,7 @@ char* DB2FileLoader::AutoProduceStrings(const char* format, char* dataTable, uin return stringPool; } -char* DB2DatabaseLoader::Load(const char* format, uint32 preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool) +char* DB2DatabaseLoader::Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool) { // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement)); @@ -517,6 +576,10 @@ char* DB2DatabaseLoader::Load(const char* format, uint32 preparedStatement, uint *((int8*)(&dataValue[offset])) = fields[f].GetInt8(); offset += 1; break; + case FT_LONG: + *((int64*)(&dataValue[offset])) = fields[f].GetInt64(); + offset += 8; + break; case FT_STRING: { LocalizedString** slot = (LocalizedString**)(&dataValue[offset]); @@ -524,7 +587,21 @@ char* DB2DatabaseLoader::Load(const char* format, uint32 preparedStatement, uint ASSERT(*slot); // Value in database in main table field must be for enUS locale - if (char* str = AddLocaleString(*slot, LOCALE_enUS, fields[f].GetString())) + if (char* str = AddString(&(*slot)->Str[LOCALE_enUS], fields[f].GetString())) + stringPool.push_back(str); + + ++stringFieldNumInRecord; + offset += sizeof(char*); + break; + } + case FT_STRING_NOT_LOCALIZED: + { + char const** slot = (char const**)(&dataValue[offset]); + *slot = (char*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringHolderSize * stringFieldNumInRecord]); + ASSERT(*slot); + + // Value in database in main table field must be for enUS locale + if (char* str = AddString(slot, fields[f].GetString())) stringPool.push_back(str); ++stringFieldNumInRecord; @@ -561,7 +638,7 @@ char* DB2DatabaseLoader::Load(const char* format, uint32 preparedStatement, uint return dataTable; } -void DB2DatabaseLoader::LoadStrings(const char* format, uint32 preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool) +void DB2DatabaseLoader::LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool) { PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); stmt->setString(0, localeNames[locale]); @@ -569,7 +646,7 @@ void DB2DatabaseLoader::LoadStrings(const char* format, uint32 preparedStatement if (!result) return; - size_t stringFields = DB2FileLoader::GetFormatStringFieldCount(format); + size_t stringFields = DB2FileLoader::GetFormatLocalizedStringFieldCount(format); if (result->GetFieldCount() != stringFields + 1 /*ID*/) return; @@ -600,12 +677,15 @@ void DB2DatabaseLoader::LoadStrings(const char* format, uint32 preparedStatement case FT_BYTE: offset += 1; break; + case FT_LONG: + offset += 8; + break; case FT_STRING: { // fill only not filled entries LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]); if (db2str->Str[locale] == nullStr) - if (char* str = AddLocaleString(db2str, locale, fields[1 + stringFieldNumInRecord].GetString())) + if (char* str = AddString(&db2str->Str[locale], fields[1 + stringFieldNumInRecord].GetString())) stringPool.push_back(str); ++stringFieldNumInRecord; @@ -625,15 +705,15 @@ void DB2DatabaseLoader::LoadStrings(const char* format, uint32 preparedStatement return; } -char* DB2DatabaseLoader::AddLocaleString(LocalizedString* holder, uint32 locale, std::string const& value) +char* DB2DatabaseLoader::AddString(char const** holder, std::string const& value) { if (!value.empty()) { - std::size_t existingLength = strlen(holder->Str[locale]); + std::size_t existingLength = strlen(*holder); if (existingLength >= value.length()) { // Reuse existing storage if there is enough space - char* str = const_cast<char*>(holder->Str[locale]); + char* str = const_cast<char*>(*holder); memcpy(str, value.c_str(), value.length()); str[value.length()] = '\0'; return nullptr; @@ -642,7 +722,7 @@ char* DB2DatabaseLoader::AddLocaleString(LocalizedString* holder, uint32 locale, char* str = new char[value.length() + 1]; memcpy(str, value.c_str(), value.length()); str[value.length()] = '\0'; - holder->Str[locale] = str; + *holder = str; return str; } diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h index 31fc1d1e979..14c5964e7d5 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2StorageLoader.h @@ -20,7 +20,7 @@ #include "Define.h" #include "Utilities/ByteConverter.h" - +#include "Implementation/HotfixDatabase.h" #include <cassert> #include <list> @@ -38,23 +38,29 @@ class DB2FileLoader float getFloat(size_t field) const { assert(field < file.fieldCount); - float val = *reinterpret_cast<float*>(offset+file.GetOffset(field)); + 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)); + 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)); + 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); @@ -85,7 +91,9 @@ class DB2FileLoader char* AutoProduceStrings(const char* fmt, char* dataTable, uint32 locale); static uint32 GetFormatRecordSize(const char * format, int32 * index_pos = NULL); static uint32 GetFormatStringFieldCount(const char * format); + static uint32 GetFormatLocalizedStringFieldCount(const char * format); private: + char const* fileName; uint32 recordSize; uint32 recordCount; @@ -102,7 +110,7 @@ private: int unk1; // WDB2 (Unix time in WCH2) int minIndex; // WDB2 int maxIndex; // WDB2 (index table) - int locale; // WDB2 + int localeMask; // WDB2 int unk5; // WDB2 }; @@ -111,9 +119,9 @@ class DB2DatabaseLoader public: explicit DB2DatabaseLoader(std::string const& storageName) : _storageName(storageName) { } - char* Load(const char* format, uint32 preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool); - void LoadStrings(const char* format, uint32 preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool); - static char* AddLocaleString(LocalizedString* holder, uint32 locale, std::string const& value); + char* Load(const char* format, HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool); + void LoadStrings(const char* format, HotfixDatabaseStatements preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool); + static char* AddString(char const** holder, std::string const& value); private: std::string _storageName; diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index b4ae20ce1da..5ae7be4d046 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -48,7 +48,7 @@ class DB2Storage : public DB2StorageBase public: typedef DBStorageIterator<T> iterator; - DB2Storage(char const* fileName, char const* format, uint32 preparedStmtIndex) + DB2Storage(char const* fileName, char const* format, HotfixDatabaseStatements preparedStmtIndex) : _fileName(fileName), _indexTableSize(0), _fieldCount(0), _format(format), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { _indexTable.AsT = NULL; @@ -105,6 +105,19 @@ public: entry += sizeof(LocalizedString*); break; } + case FT_STRING_NOT_LOCALIZED: + { + char const* str = *(char const**)entry; + std::size_t len = strlen(str); + buffer << uint16(len ? len + 1 : 0); + if (len) + { + buffer.append(str, len); + buffer << uint8(0); + } + entry += sizeof(char const*); + break; + } } } } @@ -157,7 +170,7 @@ public: return false; // load strings from another locale db2 data - if (DB2FileLoader::GetFormatStringFieldCount(_format)) + if (DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) if (char* stringBlock = db2.AutoProduceStrings(_format, (char*)_dataTable, locale)) _stringPoolList.push_back(stringBlock); return true; @@ -175,10 +188,10 @@ public: void LoadStringsFromDB(uint32 locale) { - if (!DB2FileLoader::GetFormatStringFieldCount(_format)) + if (!DB2FileLoader::GetFormatLocalizedStringFieldCount(_format)) return; - DB2DatabaseLoader(_fileName).LoadStrings(_format, _hotfixStatement + 1, locale, _indexTable.AsChar, _stringPoolList); + DB2DatabaseLoader(_fileName).LoadStrings(_format, HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTable.AsChar, _stringPoolList); } typedef bool(*SortFunc)(T const* left, T const* right); @@ -205,7 +218,7 @@ private: T* _dataTable; T* _dataTableEx; StringPoolList _stringPoolList; - uint32 _hotfixStatement; + HotfixDatabaseStatements _hotfixStatement; }; #endif diff --git a/src/server/shared/DataStores/DBCFileLoader.h b/src/server/shared/DataStores/DBCFileLoader.h index 8a5d0b5de71..d9aa34f65a3 100644 --- a/src/server/shared/DataStores/DBCFileLoader.h +++ b/src/server/shared/DataStores/DBCFileLoader.h @@ -56,9 +56,10 @@ class DBCFileLoader uint64 getUInt64(size_t field) const { assert(field < file.fieldCount); - return *reinterpret_cast<uint64*>(offset + file.GetOffset(field)); + uint64 val = *reinterpret_cast<uint64*>(offset + file.GetOffset(field)); + EndianConvert(val); + return val; } - const char *getString(size_t field) const { assert(field < file.fieldCount); diff --git a/src/server/shared/Utilities/ServiceWin32.cpp b/src/server/shared/Service/ServiceWin32.cpp index 3e5e416b1a3..3e5e416b1a3 100644 --- a/src/server/shared/Utilities/ServiceWin32.cpp +++ b/src/server/shared/Service/ServiceWin32.cpp diff --git a/src/server/shared/Utilities/ServiceWin32.h b/src/server/shared/Service/ServiceWin32.h index 9d9c732cd20..9d9c732cd20 100644 --- a/src/server/shared/Utilities/ServiceWin32.h +++ b/src/server/shared/Service/ServiceWin32.h diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index f76da8e87fa..e153226c3c9 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -41,57 +41,39 @@ endif() include_directories( ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine + ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess + ${CMAKE_CURRENT_SOURCE_DIR}/TCSoap + ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour - ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include ${CMAKE_SOURCE_DIR}/dep/gsoap - ${CMAKE_SOURCE_DIR}/dep/sockets/include - ${CMAKE_SOURCE_DIR}/dep/SFMT - ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include ${CMAKE_SOURCE_DIR}/dep/zmqpp - ${CMAKE_SOURCE_DIR}/dep/process - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Models - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Configuration - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography/Authentication - ${CMAKE_SOURCE_DIR}/src/server/shared/Database - ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference - ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic - ${CMAKE_SOURCE_DIR}/src/server/shared/Logging - ${CMAKE_SOURCE_DIR}/src/server/shared/Networking - ${CMAKE_SOURCE_DIR}/src/server/shared/Packets - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading - ${CMAKE_SOURCE_DIR}/src/server/shared/Updater - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/ipc + ${CMAKE_SOURCE_DIR}/src/common/ + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Configuration + ${CMAKE_SOURCE_DIR}/src/common/Cryptography + ${CMAKE_SOURCE_DIR}/src/common/Cryptography/Authentication + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Logging + ${CMAKE_SOURCE_DIR}/src/common/Threading + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/server/authserver/Realms + ${CMAKE_SOURCE_DIR}/src/server/database/ + ${CMAKE_SOURCE_DIR}/src/server/database/Database + ${CMAKE_SOURCE_DIR}/src/server/database/Logging ${CMAKE_SOURCE_DIR}/src/server/game ${CMAKE_SOURCE_DIR}/src/server/game/Accounts - ${CMAKE_SOURCE_DIR}/src/server/game/Achievements ${CMAKE_SOURCE_DIR}/src/server/game/Addons - ${CMAKE_SOURCE_DIR}/src/server/game/AI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI - ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts - ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse - ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse/AuctionHouseBot ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds - ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds/Zones - ${CMAKE_SOURCE_DIR}/src/server/game/Calendar ${CMAKE_SOURCE_DIR}/src/server/game/Chat - ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels ${CMAKE_SOURCE_DIR}/src/server/game/Combat ${CMAKE_SOURCE_DIR}/src/server/game/Conditions ${CMAKE_SOURCE_DIR}/src/server/game/DataStores - ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding - ${CMAKE_SOURCE_DIR}/src/server/game/Entities - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/AreaTrigger - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse + ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature ${CMAKE_SOURCE_DIR}/src/server/game/Entities/DynamicObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item @@ -100,17 +82,12 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Pet ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Player - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Totem ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Vehicle - ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Transport - ${CMAKE_SOURCE_DIR}/src/server/game/Events ${CMAKE_SOURCE_DIR}/src/server/game/Globals - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells - ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers ${CMAKE_SOURCE_DIR}/src/server/game/Grids + ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells ${CMAKE_SOURCE_DIR}/src/server/game/Groups - ${CMAKE_SOURCE_DIR}/src/server/game/Guilds ${CMAKE_SOURCE_DIR}/src/server/game/Handlers ${CMAKE_SOURCE_DIR}/src/server/game/Instances ${CMAKE_SOURCE_DIR}/src/server/game/Loot @@ -118,31 +95,24 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Maps ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous ${CMAKE_SOURCE_DIR}/src/server/game/Movement - ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints - ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP - ${CMAKE_SOURCE_DIR}/src/server/game/Pools - ${CMAKE_SOURCE_DIR}/src/server/game/PrecompiledHeaders ${CMAKE_SOURCE_DIR}/src/server/game/Quests - ${CMAKE_SOURCE_DIR}/src/server/game/Reputation ${CMAKE_SOURCE_DIR}/src/server/game/Scripting - ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol ${CMAKE_SOURCE_DIR}/src/server/game/Server - ${CMAKE_SOURCE_DIR}/src/server/game/Skills + ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol ${CMAKE_SOURCE_DIR}/src/server/game/Spells ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras - ${CMAKE_SOURCE_DIR}/src/server/game/Tools - ${CMAKE_SOURCE_DIR}/src/server/game/Warden - ${CMAKE_SOURCE_DIR}/src/server/game/Warden/Modules ${CMAKE_SOURCE_DIR}/src/server/game/Weather ${CMAKE_SOURCE_DIR}/src/server/game/World - ${CMAKE_SOURCE_DIR}/src/server/bnetserver/Server - ${CMAKE_SOURCE_DIR}/src/server/bnetserver/Realms - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine - ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess - ${CMAKE_CURRENT_SOURCE_DIR}/TCSoap + ${CMAKE_SOURCE_DIR}/src/server/ipc + ${CMAKE_SOURCE_DIR}/src/server/shared + ${CMAKE_SOURCE_DIR}/src/server/shared/DataStores + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic + ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference + ${CMAKE_SOURCE_DIR}/src/server/shared/Networking + ${CMAKE_SOURCE_DIR}/src/server/shared/Packets + ${CMAKE_SOURCE_DIR}/src/server/shared/Service ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} @@ -162,8 +132,6 @@ if( NOT WIN32 ) ) endif() -add_dependencies(worldserver revision.h) - if( UNIX AND NOT NOJEM AND NOT APPLE ) set(worldserver_LINK_FLAGS "-pthread -lncurses ${worldserver_LINK_FLAGS}") endif() @@ -172,10 +140,11 @@ set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAG target_link_libraries(worldserver game - ipc + common shared + database scripts - collision + ipc g3dlib gsoap Detour diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index e09f28d416f..5ff8e3b6279 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -39,12 +39,13 @@ #include "BattlegroundMgr.h" #include "TCSoap.h" #include "CliRunnable.h" -#include "SystemConfig.h" +#include "GitRevision.h" #include "WorldSocket.h" #include "WorldSocketMgr.h" #include "BattlenetServerManager.h" #include "Realm/Realm.h" #include "DatabaseLoader.h" +#include "AppenderDB.h" #include <openssl/opensslv.h> #include <openssl/crypto.h> #include <boost/asio/io_service.hpp> @@ -125,13 +126,11 @@ extern int main(int argc, char** argv) return 1; } - if (sConfigMgr->GetBoolDefault("Log.Async.Enable", false)) - { - // If logs are supposed to be handled async then we need to pass the io_service into the Log singleton - Log::instance(&_ioService); - } + sLog->RegisterAppender<AppenderDB>(); + // If logs are supposed to be handled async then we need to pass the io_service into the Log singleton + sLog->Initialize(sConfigMgr->GetBoolDefault("Log.Async.Enable", false) ? &_ioService : nullptr); - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", _FULLVERSION); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon)", GitRevision::GetFullVersion()); TC_LOG_INFO("server.worldserver", "<Ctrl-C> to stop.\n"); TC_LOG_INFO("server.worldserver", " ______ __"); TC_LOG_INFO("server.worldserver", "/\\__ _\\ __ __/\\ \\__"); @@ -248,7 +247,7 @@ extern int main(int argc, char** argv) sBattlenetServer.InitializeConnection(); - TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", _FULLVERSION); + TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", GitRevision::GetFullVersion()); sScriptMgr->OnStartup(); @@ -557,7 +556,7 @@ bool StartDB() ClearOnlineAccounts(); ///- Insert version info into DB - WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", _FULLVERSION, _HASH); // One-time query + WorldDatabase.PExecute("UPDATE version SET core_version = '%s', core_revision = '%s'", GitRevision::GetFullVersion(), GitRevision::GetHash()); // One-time query sWorld->LoadDBVersion(); @@ -625,7 +624,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile } else if (vm.count("version")) { - std::cout << _FULLVERSION << "\n"; + std::cout << GitRevision::GetFullVersion() << "\n"; } return vm; diff --git a/src/server/worldserver/worldserver.rc b/src/server/worldserver/worldserver.rc index cc5545741d3..9af2db46ce0 100644 --- a/src/server/worldserver/worldserver.rc +++ b/src/server/worldserver/worldserver.rc @@ -17,7 +17,7 @@ */ #include "resource.h" -#include "revision.h" +#include "revision_data.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// diff --git a/src/tools/connection_patcher/CMakeLists.txt b/src/tools/connection_patcher/CMakeLists.txt index f10a89ad3e5..74934919dde 100644 --- a/src/tools/connection_patcher/CMakeLists.txt +++ b/src/tools/connection_patcher/CMakeLists.txt @@ -10,10 +10,10 @@ include_directories( ${CMAKE_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Cryptography - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Cryptography + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Utilities ${OPENSSL_INCLUDE_DIR} ) @@ -42,7 +42,7 @@ if (MSVC) endif () target_link_libraries(connection_patcher - shared + common ${OPENSSL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} diff --git a/src/tools/connection_patcher/Program.cpp b/src/tools/connection_patcher/Program.cpp index 7321871b5ba..e0ba3fdd76e 100644 --- a/src/tools/connection_patcher/Program.cpp +++ b/src/tools/connection_patcher/Program.cpp @@ -32,6 +32,8 @@ #if PLATFORM == PLATFORM_WINDOWS #include <Shlobj.h> +#elif PLATFORM == PLATFORM_UNIX +#include <pwd.h> #endif namespace po = boost::program_options; @@ -141,6 +143,7 @@ namespace Connection_Patcher ("help,h", "print usage message") ("path", po::value<std::string>()->required(), "Path to the Wow.exe") ("extra,e", po::value<uint32_t>()->implicit_value(0), "Enable patching of versions file download path. Version can be specified explicitly.") + ("modulePath,m", po::value<std::string>(), "Path to the Battle.net module download destination.") ; po::positional_options_description pos; @@ -187,11 +190,22 @@ int main(int argc, char** argv) std::string const binary_path(std::move(vm["path"].as<std::string>())); std::string renamed_binary_path(binary_path); + std::wstring appDataPath; - wchar_t* commonAppData(nullptr); #if PLATFORM == PLATFORM_WINDOWS - SHGetKnownFolderPath(FOLDERID_ProgramData, 0, NULL, &commonAppData); + wchar_t* tempPath(nullptr); + SHGetKnownFolderPath(FOLDERID_ProgramData, 0, NULL, &tempPath); + appDataPath = std::wstring(tempPath); +#elif PLATFORM == PLATFORM_UNIX + char* tempPath(nullptr); + if ((tempPath = getenv("HOME")) == nullptr) + tempPath = getpwuid(getuid())->pw_dir; + std::string tempPathStr(tempPath); + appDataPath.assign(tempPathStr.begin(), tempPathStr.end()); + appDataPath += std::wstring(L"/.wine/drive_c/users/Public/Application Data"); #endif + if (vm.count("modulePath")) + appDataPath.assign(vm["modulePath"].as<std::string>().begin(), vm["modulePath"].as<std::string>().end()); std::cout << "Creating patched binary..." << std::endl; @@ -222,7 +236,7 @@ int main(int argc, char** argv) do_module<Patches::Windows::x86, Patterns::Windows::x86> ( "8f52906a2c85b416a595702251570f96d3522f39237603115f2f1ab24962043c.auth" - , std::wstring(commonAppData) + std::wstring(L"/Blizzard Entertainment/Battle.net/Cache/") + , std::wstring(appDataPath) + std::wstring(L"/Blizzard Entertainment/Battle.net/Cache/") ); break; @@ -235,7 +249,7 @@ int main(int argc, char** argv) do_module<Patches::Windows::x64, Patterns::Windows::x64> ( "0a3afee2cade3a0e8b458c4b4660104cac7fc50e2ca9bef0d708942e77f15c1d.auth" - , std::wstring(commonAppData) + std::wstring(L"/Blizzard Entertainment/Battle.net/Cache/") + , std::wstring(appDataPath) + std::wstring(L"/Blizzard Entertainment/Battle.net/Cache/") ); break; diff --git a/src/tools/map_extractor/CMakeLists.txt b/src/tools/map_extractor/CMakeLists.txt index d2e88ab97a9..2a3e2676a4f 100644 --- a/src/tools/map_extractor/CMakeLists.txt +++ b/src/tools/map_extractor/CMakeLists.txt @@ -12,6 +12,7 @@ file(GLOB_RECURSE sources *.cpp *.h) include_directories ( + ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/server/shared ${CMAKE_SOURCE_DIR}/dep/CascLib/src ${CMAKE_CURRENT_SOURCE_DIR} @@ -26,6 +27,7 @@ add_executable(mapextractor target_link_libraries(mapextractor casc + common ${BZIP2_LIBRARIES} ${ZLIB_LIBRARIES} ${Boost_LIBRARIES} diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 9059867dce4..b5bbe71adb4 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -36,6 +36,10 @@ #include <boost/filesystem/path.hpp> #include <boost/filesystem/operations.hpp> +#include "Common.h" +#ifdef PLATFORM_WINDOWS +#undef PLATFORM_WINDOWS +#endif #include "DBFilesClientList.h" #include "CascLib.h" #include "dbcfile.h" @@ -98,8 +102,8 @@ map_id *map_ids; uint16 *areas; uint16 *LiqType; #define MAX_PATH_LENGTH 128 -char output_path[MAX_PATH_LENGTH] = "."; -char input_path[MAX_PATH_LENGTH] = "."; +char output_path[MAX_PATH_LENGTH]; +char input_path[MAX_PATH_LENGTH]; uint32 maxAreaId = 0; // ************************************************** @@ -127,9 +131,9 @@ float CONF_flat_liquid_delta_limit = 0.001f; // If max - min less this value - l uint32 CONF_Locale = 0; -#define LOCALES_COUNT 17 +#define CASC_LOCALES_COUNT 17 -char const* Locales[LOCALES_COUNT] = +char const* CascLocaleNames[CASC_LOCALES_COUNT] = { "none", "enUS", "koKR", "unknown", @@ -142,12 +146,28 @@ char const* Locales[LOCALES_COUNT] = "ptPT" }; +uint32 WowLocaleToCascLocaleFlags[12] = +{ + CASC_LOCALE_ENUS | CASC_LOCALE_ENGB, + CASC_LOCALE_KOKR, + CASC_LOCALE_FRFR, + CASC_LOCALE_DEDE, + CASC_LOCALE_ZHCN, + CASC_LOCALE_ZHTW, + CASC_LOCALE_ESES, + CASC_LOCALE_ESMX, + CASC_LOCALE_RURU, + 0, + CASC_LOCALE_PTBR | CASC_LOCALE_PTPT, + CASC_LOCALE_ITIT, +}; + void CreateDir(std::string const& path) { if (chdir(path.c_str()) == 0) { - chdir("../"); - return; + chdir("../"); + return; } #ifdef _WIN32 @@ -178,6 +198,7 @@ void Usage(char const* prg) "-o set output path (max %d characters)\n"\ "-e extract only MAP(1)/DBC(2) - standard: both(3)\n"\ "-f height stored as int (less map size but lost some accuracy) 1 by default\n"\ + "-l dbc locale\n"\ "Example: %s -f 0 -i \"c:\\games\\game\"\n", prg, MAX_PATH_LENGTH - 1, MAX_PATH_LENGTH - 1, prg); exit(1); } @@ -234,8 +255,8 @@ void HandleArgs(int argc, char* arg[]) case 'l': if (c + 1 < argc) // all ok { - for (uint32 i = 0; i < LOCALES_COUNT; ++i) - if (!strcmp(arg[c + 1], Locales[i])) + for (uint32 i = 0; i < TOTAL_LOCALES; ++i) + if (!strcmp(arg[c + 1], localeNames[i])) CONF_Locale = 1 << i; ++c; } @@ -254,13 +275,13 @@ void HandleArgs(int argc, char* arg[]) uint32 ReadBuild(int locale) { // include build info file also - std::string filename = std::string("component.wow-") + Locales[locale] + ".txt"; + std::string filename = std::string("component.wow-") + localeNames[locale] + ".txt"; //printf("Read %s file... ", filename.c_str()); HANDLE dbcFile; if (!CascOpenFile(CascStorage, filename.c_str(), CASC_LOCALE_ALL, 0, &dbcFile)) { - printf("Locale %s not installed.\n", Locales[locale]); + printf("Locale %s not installed.\n", localeNames[locale]); return 0; } @@ -1124,7 +1145,7 @@ void ExtractMaps(uint32 build) bool ExtractFile(HANDLE fileInArchive, char const* filename) { FILE* output = fopen(filename, "wb"); - if(!output) + if (!output) { printf("Can't create the output file '%s'\n", filename); return false; @@ -1152,10 +1173,12 @@ void ExtractDBFilesClient(int l) outputPath += "/dbc/"; CreateDir(outputPath); - outputPath += Locales[l]; + outputPath += localeNames[l]; outputPath += "/"; CreateDir(outputPath); + printf("locale %s output path %s\n", localeNames[l], outputPath.c_str()); + uint32 index = 0; uint32 count = 0; char const* fileName = DBFilesClientList[index]; @@ -1163,8 +1186,8 @@ void ExtractDBFilesClient(int l) while (fileName) { std::string filename = fileName; - if (CascOpenFile(CascStorage, (filename = (filename + ".db2")).c_str(), 1 << l, 0, &dbcFile) || - CascOpenFile(CascStorage, (filename = (filename.substr(0, filename.length() - 4) + ".dbc")).c_str(), 1 << l, 0, &dbcFile)) + if (CascOpenFile(CascStorage, (filename = (filename + ".db2")).c_str(), WowLocaleToCascLocaleFlags[l], 0, &dbcFile) || + CascOpenFile(CascStorage, (filename = (filename.substr(0, filename.length() - 4) + ".dbc")).c_str(), WowLocaleToCascLocaleFlags[l], 0, &dbcFile)) { filename = outputPath + filename.substr(filename.rfind('\\') + 1); @@ -1175,7 +1198,7 @@ void ExtractDBFilesClient(int l) CascCloseFile(dbcFile); } else - printf("Unable to open file %s in the archive for locale %s: %s\n", fileName, Locales[l], HumanReadableCASCError(GetLastError())); + printf("Unable to open file %s in the archive for locale %s: %s\n", fileName, localeNames[l], HumanReadableCASCError(GetLastError())); fileName = DBFilesClientList[++index]; } @@ -1183,17 +1206,17 @@ void ExtractDBFilesClient(int l) printf("Extracted %u files\n\n", count); } -bool OpenCascStorage() +bool OpenCascStorage(int locale) { try { boost::filesystem::path const storage_dir(boost::filesystem::canonical(input_path) / "Data"); - if (!CascOpenStorage(storage_dir.string().c_str(), 0, &CascStorage)) + if (!CascOpenStorage(storage_dir.string().c_str(), WowLocaleToCascLocaleFlags[locale], &CascStorage)) { - printf("error opening casc storage '%s': %s\n", storage_dir.string().c_str(), HumanReadableCASCError(GetLastError())); + printf("error opening casc storage '%s' locale %s: %s\n", storage_dir.string().c_str(), localeNames[locale], HumanReadableCASCError(GetLastError())); return false; } - printf("opened casc storage '%s'\n", storage_dir.string().c_str()); + printf("opened casc storage '%s' locale %s\n", storage_dir.string().c_str(), localeNames[locale]); return true; } catch (boost::filesystem::filesystem_error& error) @@ -1208,27 +1231,35 @@ int main(int argc, char * arg[]) printf("Map & DBC Extractor\n"); printf("===================\n"); + boost::filesystem::path current(boost::filesystem::current_path()); + strcpy(input_path, current.string().c_str()); + strcpy(output_path, current.string().c_str()); + HandleArgs(argc, arg); int FirstLocale = -1; uint32 build = 0; - if (!OpenCascStorage()) - { - return 1; - } - - for (int i = 0; i < LOCALES_COUNT; ++i) + for (int i = 0; i < TOTAL_LOCALES; ++i) { if (CONF_Locale && !(CONF_Locale & (1 << i))) continue; + if (i == LOCALE_none) + continue; + + if (!OpenCascStorage(i)) + continue; + if ((CONF_extract & EXTRACT_DBC) == 0) { FirstLocale = i; build = ReadBuild(i); if (!build) + { + CascCloseStorage(CascStorage); continue; + } printf("Detected client build: %u\n\n", build); break; @@ -1237,10 +1268,14 @@ int main(int argc, char * arg[]) //Extract DBC files uint32 tempBuild = ReadBuild(i); if (!tempBuild) + { + CascCloseStorage(CascStorage); continue; + } - printf("Detected client build %u for locale %s\n\n", tempBuild, Locales[i]); + printf("Detected client build %u for locale %s\n\n", tempBuild, localeNames[i]); ExtractDBFilesClient(i); + CascCloseStorage(CascStorage); if (FirstLocale < 0) { @@ -1257,11 +1292,10 @@ int main(int argc, char * arg[]) if (CONF_extract & EXTRACT_MAP) { - printf("Using locale: %s\n", Locales[FirstLocale]); - + OpenCascStorage(0); ExtractMaps(build); + CascCloseStorage(CascStorage); } - CascCloseStorage(CascStorage); return 0; } diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt index 4dfe106bd3e..dd86677e289 100644 --- a/src/tools/mmaps_generator/CMakeLists.txt +++ b/src/tools/mmaps_generator/CMakeLists.txt @@ -20,14 +20,14 @@ set(mmap_gen_Includes ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities - ${CMAKE_SOURCE_DIR}/src/server/shared/Threading + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Threading ${CMAKE_SOURCE_DIR}/src/server/game/Conditions - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Management - ${CMAKE_SOURCE_DIR}/src/server/collision/Maps - ${CMAKE_SOURCE_DIR}/src/server/collision/Models + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Management + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models ) include_directories(${mmap_gen_Includes}) @@ -35,7 +35,7 @@ include_directories(${mmap_gen_Includes}) add_executable(mmaps_generator ${mmap_gen_sources}) target_link_libraries(mmaps_generator - collision + common g3dlib Recast Detour diff --git a/src/tools/vmap4_assembler/CMakeLists.txt b/src/tools/vmap4_assembler/CMakeLists.txt index 52da7f0166d..56c122f27df 100644 --- a/src/tools/vmap4_assembler/CMakeLists.txt +++ b/src/tools/vmap4_assembler/CMakeLists.txt @@ -11,11 +11,11 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/g3dlite/include - ${CMAKE_SOURCE_DIR}/src/server/shared - ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging - ${CMAKE_SOURCE_DIR}/src/server/collision - ${CMAKE_SOURCE_DIR}/src/server/collision/Maps - ${CMAKE_SOURCE_DIR}/src/server/collision/Models + ${CMAKE_SOURCE_DIR}/src/common + ${CMAKE_SOURCE_DIR}/src/common/Debugging + ${CMAKE_SOURCE_DIR}/src/common/Collision + ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps + ${CMAKE_SOURCE_DIR}/src/common/Collision/Models ${ZLIB_INCLUDE_DIR} ) @@ -23,7 +23,7 @@ add_executable(vmap4assembler VMapAssembler.cpp) add_dependencies(vmap4assembler casc) target_link_libraries(vmap4assembler - collision + common g3dlib ${ZLIB_LIBRARIES} ) |