aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/CMakeLists.txt111
-rw-r--r--src/common/Collision/BoundingIntervalHierarchy.h2
-rw-r--r--src/common/Collision/DynamicTree.h2
-rw-r--r--src/common/Collision/Management/IVMapManager.h2
-rw-r--r--src/common/Collision/Management/MMapFactory.h2
-rw-r--r--src/common/Collision/Management/MMapManager.h8
-rw-r--r--src/common/Collision/Management/VMapFactory.h2
-rw-r--r--src/common/Collision/Management/VMapManager2.h4
-rw-r--r--src/common/Collision/Maps/MapTree.h6
-rw-r--r--src/common/Collision/Maps/TileAssembler.h10
-rw-r--r--src/common/Collision/Models/GameObjectModel.h6
-rw-r--r--src/common/Collision/Models/ModelInstance.h4
-rw-r--r--src/common/Collision/Models/WorldModel.h8
-rw-r--r--src/common/Collision/RegularGrid.h2
-rw-r--r--src/common/Collision/VMapTools.h4
-rw-r--r--src/common/Common.cpp2
-rw-r--r--src/common/Common.h6
-rw-r--r--src/common/Configuration/BuiltInConfig.h9
-rw-r--r--src/common/Configuration/Config.cpp6
-rw-r--r--src/common/Configuration/Config.h10
-rw-r--r--src/common/Cryptography/ARC4.h2
-rw-r--r--src/common/Cryptography/Authentication/PacketCrypt.h2
-rw-r--r--src/common/Cryptography/Authentication/WorldPacketCrypt.h2
-rw-r--r--src/common/Cryptography/BigNumber.h2
-rw-r--r--src/common/Cryptography/HmacHash.cpp4
-rw-r--r--src/common/Cryptography/HmacHash.h2
-rw-r--r--src/common/Cryptography/OpenSSLCrypto.h8
-rw-r--r--src/common/Cryptography/SHA1.h5
-rw-r--r--src/common/Cryptography/SHA256.h5
-rw-r--r--src/common/Cryptography/SessionKeyGeneration.h (renamed from src/common/Cryptography/WardenKeyGeneration.h)37
-rw-r--r--src/common/Debugging/Errors.h14
-rw-r--r--src/common/Define.h39
-rw-r--r--src/common/GitRevision.cpp1
-rw-r--r--src/common/GitRevision.h29
-rw-r--r--src/common/Logging/Appender.h6
-rw-r--r--src/common/Logging/AppenderConsole.h2
-rw-r--r--src/common/Logging/AppenderFile.h2
-rw-r--r--src/common/Logging/Log.cpp6
-rw-r--r--src/common/Logging/Log.h8
-rw-r--r--src/common/Logging/LogOperation.h3
-rw-r--r--src/common/Logging/Logger.h2
-rw-r--r--src/common/Platform/ServiceWin32.cpp (renamed from src/server/shared/Service/ServiceWin32.cpp)1
-rw-r--r--src/common/Platform/ServiceWin32.h (renamed from src/server/shared/Service/ServiceWin32.h)1
-rw-r--r--src/common/Utilities/Containers.h1
-rw-r--r--src/common/Utilities/EventMap.h2
-rw-r--r--src/common/Utilities/EventProcessor.h4
-rw-r--r--src/common/Utilities/Random.h16
-rw-r--r--src/common/Utilities/StringFormat.h2
-rw-r--r--src/common/Utilities/TaskScheduler.h6
-rw-r--r--src/common/Utilities/Util.cpp19
-rw-r--r--src/common/Utilities/Util.h56
-rw-r--r--src/genrev/CMakeLists.txt5
-rw-r--r--src/server/CMakeLists.txt15
-rw-r--r--src/server/bnetserver/CMakeLists.txt106
-rw-r--r--src/server/bnetserver/Main.cpp15
-rw-r--r--src/server/bnetserver/Realms/RealmList.cpp11
-rw-r--r--src/server/bnetserver/Realms/RealmList.h4
-rw-r--r--src/server/bnetserver/Realms/WorldListener.cpp132
-rw-r--r--src/server/bnetserver/Realms/WorldListener.h63
-rw-r--r--src/server/bnetserver/bnetserver.conf.dist7
-rw-r--r--src/server/database/CMakeLists.txt91
-rw-r--r--src/server/database/Database/AdhocStatement.h2
-rw-r--r--src/server/database/Database/DatabaseEnv.cpp (renamed from src/server/ipc/ZmqWorker.h)31
-rw-r--r--src/server/database/Database/DatabaseEnv.h13
-rw-r--r--src/server/database/Database/DatabaseLoader.cpp16
-rw-r--r--src/server/database/Database/DatabaseLoader.h4
-rw-r--r--src/server/database/Database/DatabaseWorker.h2
-rw-r--r--src/server/database/Database/DatabaseWorkerPool.cpp8
-rw-r--r--src/server/database/Database/Field.h2
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp8
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.h2
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h2
-rw-r--r--src/server/database/Database/Implementation/LoginDatabase.cpp2
-rw-r--r--src/server/database/Database/Implementation/LoginDatabase.h2
-rw-r--r--src/server/database/Database/Implementation/WorldDatabase.h2
-rw-r--r--src/server/database/Database/MySQLConnection.h4
-rw-r--r--src/server/database/Database/MySQLThreading.h2
-rw-r--r--src/server/database/Database/PreparedStatement.h6
-rw-r--r--src/server/database/Database/QueryHolder.h4
-rw-r--r--src/server/database/Database/QueryResult.h4
-rw-r--r--src/server/database/Database/SQLOperation.h2
-rw-r--r--src/server/database/Database/Transaction.h4
-rw-r--r--src/server/database/Logging/AppenderDB.h2
-rw-r--r--src/server/database/Updater/DBUpdater.cpp8
-rw-r--r--src/server/database/Updater/DBUpdater.h6
-rw-r--r--src/server/database/Updater/UpdateFetcher.h2
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.h12
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.h4
-rw-r--r--src/server/game/AI/CoreAI/GuardAI.cpp2
-rw-r--r--src/server/game/AI/CoreAI/GuardAI.h4
-rw-r--r--src/server/game/AI/CoreAI/PassiveAI.cpp6
-rw-r--r--src/server/game/AI/CoreAI/PassiveAI.h16
-rw-r--r--src/server/game/AI/CoreAI/PetAI.cpp8
-rw-r--r--src/server/game/AI/CoreAI/PetAI.h4
-rw-r--r--src/server/game/AI/CoreAI/ReactorAI.h2
-rw-r--r--src/server/game/AI/CoreAI/TotemAI.cpp2
-rw-r--r--src/server/game/AI/CoreAI/TotemAI.h4
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h12
-rw-r--r--src/server/game/AI/CreatureAI.cpp108
-rw-r--r--src/server/game/AI/CreatureAI.h31
-rw-r--r--src/server/game/AI/CreatureAISelector.h6
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp70
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h37
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.h4
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h4
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h10
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp12
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h16
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp6
-rw-r--r--src/server/game/Accounts/AccountMgr.h8
-rw-r--r--src/server/game/Accounts/BattlenetAccountMgr.h24
-rw-r--r--src/server/game/Accounts/RBAC.h5
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp22
-rw-r--r--src/server/game/Achievements/AchievementMgr.h41
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp129
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h23
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBot.cpp28
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBot.h31
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h2
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp28
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotSeller.h8
-rw-r--r--src/server/game/Battlefield/Battlefield.h6
-rw-r--r--src/server/game/Battlefield/BattlefieldMgr.cpp6
-rw-r--r--src/server/game/Battlefield/BattlefieldMgr.h8
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.h6
-rw-r--r--src/server/game/Battlegrounds/Arena.h2
-rw-r--r--src/server/game/Battlegrounds/ArenaScore.h4
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.h4
-rw-r--r--src/server/game/Battlegrounds/ArenaTeamMgr.cpp6
-rw-r--r--src/server/game/Battlegrounds/ArenaTeamMgr.h8
-rw-r--r--src/server/game/Battlegrounds/Battleground.h2
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp6
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h8
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.h6
-rw-r--r--src/server/game/CMakeLists.txt252
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp6
-rw-r--r--src/server/game/Calendar/CalendarMgr.h12
-rw-r--r--src/server/game/Chat/Channels/Channel.h2
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.h2
-rw-r--r--src/server/game/Chat/Chat.h6
-rw-r--r--src/server/game/Chat/ChatLink.h20
-rw-r--r--src/server/game/Combat/HostileRefManager.h2
-rw-r--r--src/server/game/Combat/ThreatManager.h8
-rw-r--r--src/server/game/Combat/UnitEvents.h2
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp6
-rw-r--r--src/server/game/Conditions/ConditionMgr.h12
-rw-r--r--src/server/game/Conditions/DisableMgr.h10
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp6
-rw-r--r--src/server/game/DataStores/DB2Stores.h188
-rw-r--r--src/server/game/DataStores/DBCStores.h256
-rw-r--r--src/server/game/DungeonFinding/LFG.h8
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.h2
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp6
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h8
-rw-r--r--src/server/game/DungeonFinding/LFGPlayerData.h2
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.h2
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.h4
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h2
-rw-r--r--src/server/game/Entities/Corpse/Corpse.h2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp13
-rw-r--r--src/server/game/Entities/Creature/Creature.h14
-rw-r--r--src/server/game/Entities/Creature/CreatureGroups.cpp6
-rw-r--r--src/server/game/Entities/Creature/CreatureGroups.h10
-rw-r--r--src/server/game/Entities/Creature/GossipDef.h6
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.h10
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.h2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/Item/Container/Bag.h2
-rw-r--r--src/server/game/Entities/Item/Item.h2
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.cpp8
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.h8
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h2
-rw-r--r--src/server/game/Entities/Object/Object.h6
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp26
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h24
-rw-r--r--src/server/game/Entities/Object/ObjectPosSelector.h2
-rw-r--r--src/server/game/Entities/Object/Position.h16
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFieldFlags.h24
-rw-r--r--src/server/game/Entities/Pet/Pet.h2
-rw-r--r--src/server/game/Entities/Player/CollectionMgr.h2
-rw-r--r--src/server/game/Entities/Player/KillRewarder.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp179
-rw-r--r--src/server/game/Entities/Player/Player.h25
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.h2
-rw-r--r--src/server/game/Entities/Player/SocialMgr.cpp6
-rw-r--r--src/server/game/Entities/Player/SocialMgr.h8
-rw-r--r--src/server/game/Entities/Player/TradeData.h2
-rw-r--r--src/server/game/Entities/Taxi/TaxiPathGraph.cpp6
-rw-r--r--src/server/game/Entities/Taxi/TaxiPathGraph.h8
-rw-r--r--src/server/game/Entities/Totem/Totem.h2
-rw-r--r--src/server/game/Entities/Transport/Transport.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp26
-rw-r--r--src/server/game/Entities/Unit/Unit.h15
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h4
-rw-r--r--src/server/game/Events/GameEventMgr.cpp6
-rw-r--r--src/server/game/Events/GameEventMgr.h12
-rw-r--r--src/server/game/Garrison/Garrison.h2
-rw-r--r--src/server/game/Garrison/GarrisonMap.h2
-rw-r--r--src/server/game/Garrison/GarrisonMgr.cpp6
-rw-r--r--src/server/game/Garrison/GarrisonMgr.h8
-rw-r--r--src/server/game/Globals/ObjectAccessor.cpp51
-rw-r--r--src/server/game/Globals/ObjectAccessor.h85
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp6
-rw-r--r--src/server/game/Globals/ObjectMgr.h26
-rw-r--r--src/server/game/Grids/GridStates.h10
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h16
-rw-r--r--src/server/game/Grids/ObjectGridLoader.h6
-rw-r--r--src/server/game/Groups/Group.cpp45
-rw-r--r--src/server/game/Groups/Group.h3
-rw-r--r--src/server/game/Groups/GroupMgr.cpp6
-rw-r--r--src/server/game/Groups/GroupMgr.h8
-rw-r--r--src/server/game/Groups/GroupReference.h2
-rw-r--r--src/server/game/Guilds/Guild.h4
-rw-r--r--src/server/game/Guilds/GuildFinderMgr.cpp6
-rw-r--r--src/server/game/Guilds/GuildFinderMgr.h6
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp6
-rw-r--r--src/server/game/Guilds/GuildMgr.h8
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp7
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp3
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp63
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp19
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp39
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp6
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.h10
-rw-r--r--src/server/game/Instances/InstanceScript.cpp37
-rw-r--r--src/server/game/Instances/InstanceScript.h54
-rw-r--r--src/server/game/Loot/LootMgr.cpp17
-rw-r--r--src/server/game/Loot/LootMgr.h81
-rw-r--r--src/server/game/Mails/Mail.h8
-rw-r--r--src/server/game/Maps/AreaBoundary.cpp124
-rw-r--r--src/server/game/Maps/AreaBoundary.h153
-rw-r--r--src/server/game/Maps/Map.cpp84
-rw-r--r--src/server/game/Maps/Map.h34
-rw-r--r--src/server/game/Maps/MapInstanced.cpp35
-rw-r--r--src/server/game/Maps/MapInstanced.h8
-rw-r--r--src/server/game/Maps/MapManager.cpp70
-rw-r--r--src/server/game/Maps/MapManager.h12
-rw-r--r--src/server/game/Maps/MapUpdater.h2
-rw-r--r--src/server/game/Maps/TransportMgr.cpp6
-rw-r--r--src/server/game/Maps/TransportMgr.h10
-rw-r--r--src/server/game/Miscellaneous/Language.h7
-rw-r--r--src/server/game/Movement/MotionMaster.h2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerator.h2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/IdleMovementGenerator.h2
-rw-r--r--src/server/game/Movement/PathGenerator.h2
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.h2
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h4
-rw-r--r--src/server/game/Movement/Spline/MovementTypedefs.h8
-rw-r--r--src/server/game/Movement/Waypoints/WaypointManager.cpp6
-rw-r--r--src/server/game/Movement/Waypoints/WaypointManager.h8
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.h4
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp6
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.h8
-rw-r--r--src/server/game/Pools/PoolMgr.cpp11
-rw-r--r--src/server/game/Pools/PoolMgr.h12
-rw-r--r--src/server/game/Quests/QuestDef.h2
-rw-r--r--src/server/game/Reputation/ReputationMgr.h2
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp82
-rw-r--r--src/server/game/Scripting/ScriptMgr.h76
-rw-r--r--src/server/game/Scripting/ScriptSystem.cpp8
-rw-r--r--src/server/game/Scripting/ScriptSystem.h8
-rw-r--r--src/server/game/Server/BattlenetServerManager.cpp74
-rw-r--r--src/server/game/Server/BattlenetServerManager.h61
-rw-r--r--src/server/game/Server/Packet.h2
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp295
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h33
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h3
-rw-r--r--src/server/game/Server/Packets/ChatPackets.h4
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h4
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h4
-rw-r--r--src/server/game/Server/Packets/NPCPackets.h2
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp250
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h13
-rw-r--r--src/server/game/Server/Packets/ScenePackets.h2
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp14
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h25
-rw-r--r--src/server/game/Server/Packets/TicketPackets.cpp3
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp25
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h3187
-rw-r--r--src/server/game/Server/Protocol/PacketLog.cpp6
-rw-r--r--src/server/game/Server/Protocol/PacketLog.h8
-rw-r--r--src/server/game/Server/Protocol/ServerPktHeader.h6
-rw-r--r--src/server/game/Server/WorldSession.cpp11
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/Server/WorldSocket.cpp413
-rw-r--r--src/server/game/Server/WorldSocket.h18
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp6
-rw-r--r--src/server/game/Server/WorldSocketMgr.h8
-rw-r--r--src/server/game/Skills/SkillDiscovery.h9
-rw-r--r--src/server/game/Skills/SkillExtraItems.h10
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp5
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h10
-rw-r--r--src/server/game/Spells/Spell.cpp4
-rw-r--r--src/server/game/Spells/Spell.h18
-rw-r--r--src/server/game/Spells/SpellEffects.cpp48
-rw-r--r--src/server/game/Spells/SpellHistory.h2
-rw-r--r--src/server/game/Spells/SpellInfo.h6
-rw-r--r--src/server/game/Spells/SpellMgr.cpp8
-rw-r--r--src/server/game/Spells/SpellMgr.h22
-rw-r--r--src/server/game/Spells/SpellScript.h60
-rw-r--r--src/server/game/Support/SupportMgr.cpp34
-rw-r--r--src/server/game/Support/SupportMgr.h16
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp6
-rw-r--r--src/server/game/Texts/CreatureTextMgr.h8
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.h22
-rw-r--r--src/server/game/Tools/PlayerDump.h6
-rw-r--r--src/server/game/Warden/Warden.h2
-rw-r--r--src/server/game/Warden/WardenCheckMgr.cpp6
-rw-r--r--src/server/game/Warden/WardenCheckMgr.h8
-rw-r--r--src/server/game/Warden/WardenMac.cpp5
-rw-r--r--src/server/game/Warden/WardenMac.h2
-rw-r--r--src/server/game/Warden/WardenWin.cpp5
-rw-r--r--src/server/game/Warden/WardenWin.h2
-rw-r--r--src/server/game/Weather/Weather.cpp2
-rw-r--r--src/server/game/Weather/Weather.h2
-rw-r--r--src/server/game/Weather/WeatherMgr.h12
-rw-r--r--src/server/game/World/World.cpp38
-rw-r--r--src/server/game/World/World.h15
-rw-r--r--src/server/ipc/CMakeLists.txt27
-rw-r--r--src/server/ipc/Commands.cpp81
-rw-r--r--src/server/ipc/Commands.h80
-rw-r--r--src/server/ipc/ZMQTask.cpp94
-rw-r--r--src/server/ipc/ZMQTask.h52
-rw-r--r--src/server/ipc/ZmqContext.cpp55
-rw-r--r--src/server/ipc/ZmqContext.h55
-rw-r--r--src/server/ipc/ZmqListener.cpp69
-rw-r--r--src/server/ipc/ZmqListener.h51
-rw-r--r--src/server/ipc/ZmqMux.cpp68
-rw-r--r--src/server/ipc/ZmqMux.h47
-rw-r--r--src/server/ipc/ZmqWorker.cpp69
-rw-r--r--src/server/scripts/CMakeLists.txt158
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp28
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp12
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp6
-rw-r--r--src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp4
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp4
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp26
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp13
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp6
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp4
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp4
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp4
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp4
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp10
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp2
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp7
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp11
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp28
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp11
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp51
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp17
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp4
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp9
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp14
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp6
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp2
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp6
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp2
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp12
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp11
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp14
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp7
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp11
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp6
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp73
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp8
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_noth.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp4
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp102
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp10
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp6
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp68
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h3
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp6
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp12
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp2
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp6
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp4
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp8
-rw-r--r--src/server/scripts/Outland/BlackTemple/illidari_council.cpp4
-rw-r--r--src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp24
-rw-r--r--src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp6
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp14
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp6
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp4
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp6
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp8
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp6
-rw-r--r--src/server/scripts/Outland/zone_hellfire_peninsula.cpp4
-rw-r--r--src/server/scripts/Pet/pet_mage.cpp186
-rw-r--r--src/server/scripts/Pet/pet_priest.cpp2
-rw-r--r--src/server/scripts/ScriptLoader.cpp (renamed from src/server/game/Scripting/ScriptLoader.cpp)2
-rw-r--r--src/server/scripts/ScriptLoader.h (renamed from src/server/game/Scripting/ScriptLoader.h)0
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp39
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp75
-rw-r--r--src/server/scripts/World/npc_taxi.cpp186
-rw-r--r--src/server/scripts/World/npcs_special.cpp4
-rw-r--r--src/server/shared/CMakeLists.txt103
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.h4
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.h2
-rw-r--r--src/server/shared/Networking/AsyncAcceptor.h1
-rw-r--r--src/server/shared/Networking/Socket.h25
-rw-r--r--src/server/shared/Packets/ByteBuffer.h8
-rw-r--r--src/server/shared/Realm/Realm.h4
-rw-r--r--src/server/worldserver/CMakeLists.txt163
-rw-r--r--src/server/worldserver/Main.cpp19
-rw-r--r--src/server/worldserver/worldserver.conf.dist64
-rw-r--r--src/tools/connection_patcher/CMakeLists.txt15
-rw-r--r--src/tools/connection_patcher/Program.cpp51
-rw-r--r--src/tools/map_extractor/CMakeLists.txt46
-rw-r--r--src/tools/mmaps_generator/CMakeLists.txt57
-rw-r--r--src/tools/vmap4_assembler/CMakeLists.txt21
-rw-r--r--src/tools/vmap4_extractor/CMakeLists.txt37
469 files changed, 6060 insertions, 6499 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 8bf86b57139..4250df6d1f1 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -8,40 +8,33 @@
# 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)
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/Debugging
+ ${CMAKE_CURRENT_SOURCE_DIR}/Platform
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
# 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)
+list(APPEND PRIVATE_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/Debugging/Errors.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/Debugging/Errors.h)
if (USE_COREPCH)
- set(common_STAT_PCH_HDR PrecompiledHeaders/commonPCH.h)
- set(common_STAT_PCH_SRC PrecompiledHeaders/commonPCH.cpp)
+ set(PRIVATE_PCH_HEADER PrecompiledHeaders/commonPCH.h)
+ set(PRIVATE_PCH_SOURCE 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}
+GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+
+add_definitions(-DTRINITY_API_EXPORT_COMMON)
+
+add_library(common
+ ${PRIVATE_SOURCES}
+ ${PRIVATE_PCH_SOURCE}
)
# Do NOT add any extra include directory here, as we don't want the common
@@ -53,37 +46,53 @@ set(common_STAT_SRCS
# 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}
+CollectIncludeDirectories(
${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}
-)
+ PUBLIC_INCLUDES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
-GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(common
+ PUBLIC
+ # Provide the binary dir for all child targets
+ ${CMAKE_BINARY_DIR}
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
-add_library(common STATIC
- ${common_STAT_SRCS}
- ${common_STAT_PCH_SRC}
-)
+target_link_libraries(common
+ PUBLIC
+ boost
+ cppformat
+ g3dlib
+ Detour
+ sfmt
+ utf8cpp
+ openssl
+ valgrind
+ threads
+ jemalloc)
add_dependencies(common revision_data.h)
+set_target_properties(common
+ PROPERTIES
+ FOLDER
+ "server")
+
+if( BUILD_SHARED_LIBS )
+ if( UNIX )
+ install(TARGETS common
+ LIBRARY
+ DESTINATION lib)
+ elseif( WIN32 )
+ install(TARGETS common
+ RUNTIME
+ DESTINATION "${CMAKE_INSTALL_PREFIX}")
+ endif()
+endif()
+
# Generate precompiled header
if (USE_COREPCH)
- add_cxx_pch(common ${common_STAT_PCH_HDR} ${common_STAT_PCH_SRC})
+ add_cxx_pch(common ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE})
endif ()
diff --git a/src/common/Collision/BoundingIntervalHierarchy.h b/src/common/Collision/BoundingIntervalHierarchy.h
index 22ea36ec2e6..d84ee3f6bf3 100644
--- a/src/common/Collision/BoundingIntervalHierarchy.h
+++ b/src/common/Collision/BoundingIntervalHierarchy.h
@@ -67,7 +67,7 @@ struct AABound
Copyright (c) 2003-2007 Christopher Kulla
*/
-class BIH
+class TC_COMMON_API BIH
{
private:
void init_empty()
diff --git a/src/common/Collision/DynamicTree.h b/src/common/Collision/DynamicTree.h
index 0f18bb265f8..85707efebd2 100644
--- a/src/common/Collision/DynamicTree.h
+++ b/src/common/Collision/DynamicTree.h
@@ -31,7 +31,7 @@ namespace G3D
class GameObjectModel;
struct DynTreeImpl;
-class DynamicMapTree
+class TC_COMMON_API DynamicMapTree
{
DynTreeImpl *impl;
diff --git a/src/common/Collision/Management/IVMapManager.h b/src/common/Collision/Management/IVMapManager.h
index 1e64551956c..35437b7b816 100644
--- a/src/common/Collision/Management/IVMapManager.h
+++ b/src/common/Collision/Management/IVMapManager.h
@@ -42,7 +42,7 @@ namespace VMAP
#define VMAP_INVALID_HEIGHT_VALUE -200000.0f // real assigned value in unknown height case
//===========================================================
- class IVMapManager
+ class TC_COMMON_API IVMapManager
{
private:
bool iEnableLineOfSightCalc;
diff --git a/src/common/Collision/Management/MMapFactory.h b/src/common/Collision/Management/MMapFactory.h
index edd074fc93d..6dda7a40a22 100644
--- a/src/common/Collision/Management/MMapFactory.h
+++ b/src/common/Collision/Management/MMapFactory.h
@@ -38,7 +38,7 @@ namespace MMAP
// static class
// holds all mmap global data
// access point to MMapManager singleton
- class MMapFactory
+ class TC_COMMON_API MMapFactory
{
public:
static MMapManager* createOrGetMMapManager();
diff --git a/src/common/Collision/Management/MMapManager.h b/src/common/Collision/Management/MMapManager.h
index 45a60d88dc7..8aa28ec7ab4 100644
--- a/src/common/Collision/Management/MMapManager.h
+++ b/src/common/Collision/Management/MMapManager.h
@@ -38,7 +38,7 @@ namespace MMAP
typedef std::set<uint32> TerrainSet;
- struct NavMeshHolder
+ struct TC_COMMON_API NavMeshHolder
{
// Pre-built navMesh
dtNavMesh* navMesh;
@@ -49,7 +49,7 @@ namespace MMAP
MMapTileSet loadedTileRefs;
};
- struct PhasedTile
+ struct TC_COMMON_API PhasedTile
{
unsigned char* data;
MmapTileHeader fileHeader;
@@ -62,7 +62,7 @@ namespace MMAP
typedef std::unordered_map<uint32, TerrainSet> TerrainSetMap;
- class MMapData
+ class TC_COMMON_API MMapData
{
public:
MMapData(dtNavMesh* mesh, uint32 mapId);
@@ -90,7 +90,7 @@ namespace MMAP
// singleton class
// holds all all access to mmap loading unloading and meshes
- class MMapManager
+ class TC_COMMON_API MMapManager
{
public:
MMapManager() : loadedTiles(0), thread_safe_environment(true) {}
diff --git a/src/common/Collision/Management/VMapFactory.h b/src/common/Collision/Management/VMapFactory.h
index 1a45bd5094b..a730fa12ef2 100644
--- a/src/common/Collision/Management/VMapFactory.h
+++ b/src/common/Collision/Management/VMapFactory.h
@@ -29,7 +29,7 @@ namespace VMAP
{
//===========================================================
- class VMapFactory
+ class TC_COMMON_API VMapFactory
{
public:
static IVMapManager* createOrGetVMapManager();
diff --git a/src/common/Collision/Management/VMapManager2.h b/src/common/Collision/Management/VMapManager2.h
index 4125970f757..a3b383bdc10 100644
--- a/src/common/Collision/Management/VMapManager2.h
+++ b/src/common/Collision/Management/VMapManager2.h
@@ -51,7 +51,7 @@ namespace VMAP
class StaticMapTree;
class WorldModel;
- class ManagedModel
+ class TC_COMMON_API ManagedModel
{
public:
ManagedModel() : iModel(nullptr), iRefCount(0) { }
@@ -75,7 +75,7 @@ namespace VMAP
VMAP_DISABLE_LIQUIDSTATUS = 0x8
};
- class VMapManager2 : public IVMapManager
+ class TC_COMMON_API VMapManager2 : public IVMapManager
{
protected:
// Tree to check collision
diff --git a/src/common/Collision/Maps/MapTree.h b/src/common/Collision/Maps/MapTree.h
index 58b58bf3073..0227a982b4c 100644
--- a/src/common/Collision/Maps/MapTree.h
+++ b/src/common/Collision/Maps/MapTree.h
@@ -29,7 +29,7 @@ namespace VMAP
class GroupModel;
class VMapManager2;
- struct LocationInfo
+ struct TC_COMMON_API LocationInfo
{
LocationInfo(): hitInstance(nullptr), hitModel(nullptr), ground_Z(-G3D::finf()) { }
const ModelInstance* hitInstance;
@@ -37,7 +37,7 @@ namespace VMAP
float ground_Z;
};
- class StaticMapTree
+ class TC_COMMON_API StaticMapTree
{
typedef std::unordered_map<uint32, bool> loadedTileMap;
typedef std::unordered_map<uint32, uint32> loadedSpawnMap;
@@ -87,7 +87,7 @@ namespace VMAP
StaticMapTree& operator=(StaticMapTree const& right) = delete;
};
- struct AreaInfo
+ struct TC_COMMON_API AreaInfo
{
AreaInfo(): result(false), ground_Z(-G3D::finf()), flags(0), adtId(0),
rootId(0), groupId(0) { }
diff --git a/src/common/Collision/Maps/TileAssembler.h b/src/common/Collision/Maps/TileAssembler.h
index 1e2dc1924f1..74111f69910 100644
--- a/src/common/Collision/Maps/TileAssembler.h
+++ b/src/common/Collision/Maps/TileAssembler.h
@@ -35,7 +35,7 @@ namespace VMAP
*/
//===============================================
- class ModelPosition
+ class TC_COMMON_API ModelPosition
{
private:
G3D::Matrix3 iRotation;
@@ -55,7 +55,7 @@ namespace VMAP
typedef std::map<uint32, ModelSpawn> UniqueEntryMap;
typedef std::multimap<uint32, uint32> TileMap;
- struct MapSpawns
+ struct TC_COMMON_API MapSpawns
{
UniqueEntryMap UniqueEntries;
TileMap TileEntries;
@@ -64,7 +64,7 @@ namespace VMAP
typedef std::map<uint32, MapSpawns*> MapData;
//===============================================
- struct GroupModel_Raw
+ struct TC_COMMON_API GroupModel_Raw
{
uint32 mogpflags;
uint32 GroupWMOID;
@@ -82,7 +82,7 @@ namespace VMAP
bool Read(FILE* f);
};
- struct WorldModel_Raw
+ struct TC_COMMON_API WorldModel_Raw
{
uint32 RootWMOID;
std::vector<GroupModel_Raw> groupsArray;
@@ -90,7 +90,7 @@ namespace VMAP
bool Read(const char * path);
};
- class TileAssembler
+ class TC_COMMON_API TileAssembler
{
private:
std::string iDestDir;
diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h
index 9d8687233c1..37f11af20ac 100644
--- a/src/common/Collision/Models/GameObjectModel.h
+++ b/src/common/Collision/Models/GameObjectModel.h
@@ -35,7 +35,7 @@ namespace VMAP
class GameObject;
struct GameObjectDisplayInfoEntry;
-class GameObjectModelOwnerBase
+class TC_COMMON_API GameObjectModelOwnerBase
{
public:
virtual bool IsSpawned() const { return false; }
@@ -47,7 +47,7 @@ public:
virtual void DebugVisualizeCorner(G3D::Vector3 const& /*corner*/) const { }
};
-class GameObjectModel /*, public Intersectable*/
+class TC_COMMON_API GameObjectModel /*, public Intersectable*/
{
GameObjectModel() : phasemask(0), iInvScale(0), iScale(0), iModel(NULL) { }
public:
@@ -84,4 +84,6 @@ private:
std::unique_ptr<GameObjectModelOwnerBase> owner;
};
+TC_COMMON_API void LoadGameObjectModelList(std::string const& dataPath);
+
#endif // _GAMEOBJECT_MODEL_H
diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h
index d101630d1e9..84a41b15ce6 100644
--- a/src/common/Collision/Models/ModelInstance.h
+++ b/src/common/Collision/Models/ModelInstance.h
@@ -39,7 +39,7 @@ namespace VMAP
MOD_HAS_BOUND = 1<<2
};
- class ModelSpawn
+ class TC_COMMON_API ModelSpawn
{
public:
//mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, name
@@ -60,7 +60,7 @@ namespace VMAP
static bool writeToFile(FILE* rw, const ModelSpawn &spawn);
};
- class ModelInstance: public ModelSpawn
+ class TC_COMMON_API ModelInstance: public ModelSpawn
{
public:
ModelInstance(): iInvScale(0.0f), iModel(nullptr) { }
diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h
index 39787f6c664..bfc0367627f 100644
--- a/src/common/Collision/Models/WorldModel.h
+++ b/src/common/Collision/Models/WorldModel.h
@@ -33,7 +33,7 @@ namespace VMAP
struct AreaInfo;
struct LocationInfo;
- class MeshTriangle
+ class TC_COMMON_API MeshTriangle
{
public:
MeshTriangle() : idx0(0), idx1(0), idx2(0) { }
@@ -44,7 +44,7 @@ namespace VMAP
uint32 idx2;
};
- class WmoLiquid
+ class TC_COMMON_API WmoLiquid
{
public:
WmoLiquid(uint32 width, uint32 height, const G3D::Vector3 &corner, uint32 type);
@@ -70,7 +70,7 @@ namespace VMAP
};
/*! holding additional info for WMO group files */
- class GroupModel
+ class TC_COMMON_API GroupModel
{
public:
GroupModel() : iBound(), iMogpFlags(0), iGroupWMOID(0), iLiquid(NULL) { }
@@ -103,7 +103,7 @@ namespace VMAP
};
/*! Holds a model (converted M2 or WMO) in its original coordinate space */
- class WorldModel
+ class TC_COMMON_API WorldModel
{
public:
WorldModel(): RootWMOID(0) { }
diff --git a/src/common/Collision/RegularGrid.h b/src/common/Collision/RegularGrid.h
index a582f3c081c..2f3819c872c 100644
--- a/src/common/Collision/RegularGrid.h
+++ b/src/common/Collision/RegularGrid.h
@@ -20,7 +20,7 @@ class NodeCreatorFunc = NodeCreator<Node>,
/*class BoundsFunc = BoundsTrait<T>,*/
class PositionFunc = PositionTrait<T>
>
-class RegularGrid2D
+class TC_COMMON_API RegularGrid2D
{
public:
diff --git a/src/common/Collision/VMapTools.h b/src/common/Collision/VMapTools.h
index 54b8fcd0032..86ec498f72a 100644
--- a/src/common/Collision/VMapTools.h
+++ b/src/common/Collision/VMapTools.h
@@ -22,6 +22,8 @@
#include <G3D/CollisionDetection.h>
#include <G3D/AABox.h>
+#include "Define.h"
+
#include "NodeValueAccess.h"
/**
@@ -48,7 +50,7 @@ namespace VMAP
//==============================================================
//==============================================================
- class MyCollisionDetection
+ class TC_COMMON_API MyCollisionDetection
{
private:
public:
diff --git a/src/common/Common.cpp b/src/common/Common.cpp
index 4555f00a76c..eb4316edd69 100644
--- a/src/common/Common.cpp
+++ b/src/common/Common.cpp
@@ -18,7 +18,7 @@
#include "Common.h"
-char const* localeNames[TOTAL_LOCALES] =
+TC_COMMON_API char const* localeNames[TOTAL_LOCALES] =
{
"enUS",
"koKR",
diff --git a/src/common/Common.h b/src/common/Common.h
index ad48358ca8d..a6e2a8635cf 100644
--- a/src/common/Common.h
+++ b/src/common/Common.h
@@ -135,15 +135,15 @@ const uint8 OLD_TOTAL_LOCALES = 9; /// @todo convert in simple system
#define MAX_LOCALES 11
-extern char const* localeNames[TOTAL_LOCALES];
+extern "C" TC_COMMON_API char const* localeNames[TOTAL_LOCALES];
-LocaleConstant GetLocaleByName(const std::string& name);
+TC_COMMON_API LocaleConstant GetLocaleByName(const std::string& name);
typedef std::vector<std::string> StringVector;
#pragma pack(push, 1)
-struct LocalizedString
+struct TC_COMMON_API LocalizedString
{
char const* Str[TOTAL_LOCALES];
};
diff --git a/src/common/Configuration/BuiltInConfig.h b/src/common/Configuration/BuiltInConfig.h
index 4ae4ed40189..0ffa059bc41 100644
--- a/src/common/Configuration/BuiltInConfig.h
+++ b/src/common/Configuration/BuiltInConfig.h
@@ -19,6 +19,7 @@
#define BUILT_IN_CONFIG_H
#include <string>
+#include "Define.h"
/// Provides helper functions to access built-in values
/// which can be overwritten in config
@@ -26,16 +27,16 @@ namespace BuiltInConfig
{
/// Returns the CMake command when any is specified in the config,
/// returns the built-in path otherwise
- std::string GetCMakeCommand();
+ TC_COMMON_API std::string GetCMakeCommand();
/// Returns the build directory path when any is specified in the config,
/// returns the built-in one otherwise
- std::string GetBuildDirectory();
+ TC_COMMON_API std::string GetBuildDirectory();
/// Returns the source directory path when any is specified in the config,
/// returns the built-in one otherwise
- std::string GetSourceDirectory();
+ TC_COMMON_API std::string GetSourceDirectory();
/// Returns the path to the mysql executable (`mysql`) when any is specified
/// in the config, returns the built-in one otherwise
- std::string GetMySQLExecutable();
+ TC_COMMON_API std::string GetMySQLExecutable();
} // namespace BuiltInConfig
diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp
index 196c128532e..bc21bb47b48 100644
--- a/src/common/Configuration/Config.cpp
+++ b/src/common/Configuration/Config.cpp
@@ -57,6 +57,12 @@ bool ConfigMgr::LoadInitial(std::string const& file, std::string& error)
return true;
}
+ConfigMgr* ConfigMgr::instance()
+{
+ static ConfigMgr instance;
+ return &instance;
+}
+
bool ConfigMgr::Reload(std::string& error)
{
return LoadInitial(_filename, error);
diff --git a/src/common/Configuration/Config.h b/src/common/Configuration/Config.h
index 77150e9b436..d8dfeb230a7 100644
--- a/src/common/Configuration/Config.h
+++ b/src/common/Configuration/Config.h
@@ -19,12 +19,14 @@
#ifndef CONFIG_H
#define CONFIG_H
+#include "Define.h"
+
#include <string>
#include <list>
#include <mutex>
#include <boost/property_tree/ptree.hpp>
-class ConfigMgr
+class TC_COMMON_API ConfigMgr
{
ConfigMgr() { }
~ConfigMgr() { }
@@ -33,11 +35,7 @@ public:
/// Method used only for loading main configuration files
bool LoadInitial(std::string const& file, std::string& error);
- static ConfigMgr* instance()
- {
- static ConfigMgr instance;
- return &instance;
- }
+ static ConfigMgr* instance();
bool Reload(std::string& error);
diff --git a/src/common/Cryptography/ARC4.h b/src/common/Cryptography/ARC4.h
index 5b5fbf4a020..df412944ef6 100644
--- a/src/common/Cryptography/ARC4.h
+++ b/src/common/Cryptography/ARC4.h
@@ -22,7 +22,7 @@
#include <openssl/evp.h>
#include "Define.h"
-class ARC4
+class TC_COMMON_API ARC4
{
public:
ARC4(uint32 len);
diff --git a/src/common/Cryptography/Authentication/PacketCrypt.h b/src/common/Cryptography/Authentication/PacketCrypt.h
index 9e13cb02529..8af6c7ae926 100644
--- a/src/common/Cryptography/Authentication/PacketCrypt.h
+++ b/src/common/Cryptography/Authentication/PacketCrypt.h
@@ -22,7 +22,7 @@
class BigNumber;
-class PacketCrypt
+class TC_COMMON_API PacketCrypt
{
public:
PacketCrypt(uint32 rc4InitSize);
diff --git a/src/common/Cryptography/Authentication/WorldPacketCrypt.h b/src/common/Cryptography/Authentication/WorldPacketCrypt.h
index 2b19fb54188..d296b049af2 100644
--- a/src/common/Cryptography/Authentication/WorldPacketCrypt.h
+++ b/src/common/Cryptography/Authentication/WorldPacketCrypt.h
@@ -23,7 +23,7 @@
class BigNumber;
-class WorldPacketCrypt : public PacketCrypt
+class TC_COMMON_API WorldPacketCrypt : public PacketCrypt
{
public:
WorldPacketCrypt();
diff --git a/src/common/Cryptography/BigNumber.h b/src/common/Cryptography/BigNumber.h
index 56fc2196fde..baf338552d0 100644
--- a/src/common/Cryptography/BigNumber.h
+++ b/src/common/Cryptography/BigNumber.h
@@ -25,7 +25,7 @@
struct bignum_st;
-class BigNumber
+class TC_COMMON_API BigNumber
{
public:
BigNumber();
diff --git a/src/common/Cryptography/HmacHash.cpp b/src/common/Cryptography/HmacHash.cpp
index d9bb28d3e0b..bd50a2fc708 100644
--- a/src/common/Cryptography/HmacHash.cpp
+++ b/src/common/Cryptography/HmacHash.cpp
@@ -62,5 +62,5 @@ uint8* HmacHash<HashCreator, DigestLength>::ComputeHash(BigNumber* bn)
return _digest;
}
-template class HmacHash<EVP_sha1, SHA_DIGEST_LENGTH>;
-template class HmacHash<EVP_sha256, SHA256_DIGEST_LENGTH>;
+template class TC_COMMON_API HmacHash<EVP_sha1, SHA_DIGEST_LENGTH>;
+template class TC_COMMON_API HmacHash<EVP_sha256, SHA256_DIGEST_LENGTH>;
diff --git a/src/common/Cryptography/HmacHash.h b/src/common/Cryptography/HmacHash.h
index f61bf251abc..5156d03a18a 100644
--- a/src/common/Cryptography/HmacHash.h
+++ b/src/common/Cryptography/HmacHash.h
@@ -31,7 +31,7 @@ class BigNumber;
typedef EVP_MD const* (*HashCreateFn)();
template<HashCreateFn HashCreator, uint32 DigestLength>
-class HmacHash
+class TC_COMMON_API HmacHash
{
public:
HmacHash(uint32 len, uint8 const* seed);
diff --git a/src/common/Cryptography/OpenSSLCrypto.h b/src/common/Cryptography/OpenSSLCrypto.h
index df1b14b5eda..65155df9af8 100644
--- a/src/common/Cryptography/OpenSSLCrypto.h
+++ b/src/common/Cryptography/OpenSSLCrypto.h
@@ -18,6 +18,8 @@
#ifndef OPENSSL_CRYPTO_H
#define OPENSSL_CRYPTO_H
+#include "Define.h"
+
/**
* A group of functions which setup openssl crypto module to work properly in multithreaded enviroment
* If not setup properly - it will crash
@@ -25,9 +27,9 @@
namespace OpenSSLCrypto
{
/// Needs to be called before threads using openssl are spawned
- void threadsSetup();
+ TC_COMMON_API void threadsSetup();
/// Needs to be called after threads using openssl are despawned
- void threadsCleanup();
+ TC_COMMON_API void threadsCleanup();
}
-#endif \ No newline at end of file
+#endif
diff --git a/src/common/Cryptography/SHA1.h b/src/common/Cryptography/SHA1.h
index ffa02176a2d..f943e1d2de8 100644
--- a/src/common/Cryptography/SHA1.h
+++ b/src/common/Cryptography/SHA1.h
@@ -21,13 +21,16 @@
#include "Define.h"
#include <string>
+#include <type_traits>
#include <openssl/sha.h>
class BigNumber;
-class SHA1Hash
+class TC_COMMON_API SHA1Hash
{
public:
+ typedef std::integral_constant<uint32, SHA_DIGEST_LENGTH> DigestLength;
+
SHA1Hash();
~SHA1Hash();
diff --git a/src/common/Cryptography/SHA256.h b/src/common/Cryptography/SHA256.h
index d31c24ed93b..22d8a9870cf 100644
--- a/src/common/Cryptography/SHA256.h
+++ b/src/common/Cryptography/SHA256.h
@@ -20,13 +20,16 @@
#include "Define.h"
#include <string>
+#include <type_traits>
#include <openssl/sha.h>
class BigNumber;
-class SHA256Hash
+class TC_COMMON_API SHA256Hash
{
public:
+ typedef std::integral_constant<uint32, SHA256_DIGEST_LENGTH> DigestLength;
+
SHA256Hash();
~SHA256Hash();
diff --git a/src/common/Cryptography/WardenKeyGeneration.h b/src/common/Cryptography/SessionKeyGeneration.h
index 18118ece649..0ec4479b765 100644
--- a/src/common/Cryptography/WardenKeyGeneration.h
+++ b/src/common/Cryptography/SessionKeyGeneration.h
@@ -16,17 +16,16 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "SHA1.h"
+#ifndef SessionKeyGeneration_h__
+#define SessionKeyGeneration_h__
-#include <cstring>
+#include "Common.h"
-#ifndef _WARDEN_KEY_GENERATION_H
-#define _WARDEN_KEY_GENERATION_H
-
-class SHA1Randx
+template<class Hash>
+class SessionKeyGenerator
{
public:
- SHA1Randx(uint8* buff, uint32 size)
+ SessionKeyGenerator(uint8* buff, uint32 size)
{
uint32 halfSize = size / 2;
@@ -34,15 +33,15 @@ public:
sh.UpdateData(buff, halfSize);
sh.Finalize();
- memcpy(o1, sh.GetDigest(), 20);
+ memcpy(o1, sh.GetDigest(), Hash::DigestLength::value);
sh.Initialize();
sh.UpdateData(buff + halfSize, size - halfSize);
sh.Finalize();
- memcpy(o2, sh.GetDigest(), 20);
+ memcpy(o2, sh.GetDigest(), Hash::DigestLength::value);
- memset(o0, 0x00, 20);
+ memset(o0, 0x00, Hash::DigestLength::value);
FillUp();
}
@@ -51,7 +50,7 @@ public:
{
for (uint32 i = 0; i < sz; ++i)
{
- if (taken == 20)
+ if (taken == Hash::DigestLength::value)
FillUp();
buf[i] = o0[taken];
@@ -63,19 +62,21 @@ private:
void FillUp()
{
sh.Initialize();
- sh.UpdateData(o1, 20);
- sh.UpdateData(o0, 20);
- sh.UpdateData(o2, 20);
+ sh.UpdateData(o1, Hash::DigestLength::value);
+ sh.UpdateData(o0, Hash::DigestLength::value);
+ sh.UpdateData(o2, Hash::DigestLength::value);
sh.Finalize();
- memcpy(o0, sh.GetDigest(), 20);
+ memcpy(o0, sh.GetDigest(), Hash::DigestLength::value);
taken = 0;
}
- SHA1Hash sh;
+ Hash sh;
uint32 taken;
- uint8 o0[20], o1[20], o2[20];
+ uint8 o0[Hash::DigestLength::value];
+ uint8 o1[Hash::DigestLength::value];
+ uint8 o2[Hash::DigestLength::value];
};
-#endif
+#endif // SessionKeyGeneration_h__
diff --git a/src/common/Debugging/Errors.h b/src/common/Debugging/Errors.h
index 37d247ada82..e4b3563ca96 100644
--- a/src/common/Debugging/Errors.h
+++ b/src/common/Debugging/Errors.h
@@ -23,18 +23,18 @@
namespace Trinity
{
- DECLSPEC_NORETURN void Assert(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
- DECLSPEC_NORETURN void Assert(char const* file, int line, char const* function, char const* message, char const* format, ...) ATTR_NORETURN ATTR_PRINTF(5, 6);
+ DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
+ DECLSPEC_NORETURN TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message, char const* format, ...) ATTR_NORETURN ATTR_PRINTF(5, 6);
- DECLSPEC_NORETURN void Fatal(char const* file, int line, char const* function, char const* message, ...) ATTR_NORETURN ATTR_PRINTF(4, 5);
+ DECLSPEC_NORETURN TC_COMMON_API void Fatal(char const* file, int line, char const* function, char const* message, ...) ATTR_NORETURN ATTR_PRINTF(4, 5);
- DECLSPEC_NORETURN void Error(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
+ DECLSPEC_NORETURN TC_COMMON_API void Error(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
- DECLSPEC_NORETURN void Abort(char const* file, int line, char const* function) ATTR_NORETURN;
+ DECLSPEC_NORETURN TC_COMMON_API void Abort(char const* file, int line, char const* function) ATTR_NORETURN;
- void Warning(char const* file, int line, char const* function, char const* message);
+ TC_COMMON_API void Warning(char const* file, int line, char const* function, char const* message);
- DECLSPEC_NORETURN void AbortHandler(int sigval) ATTR_NORETURN;
+ DECLSPEC_NORETURN TC_COMMON_API void AbortHandler(int sigval) ATTR_NORETURN;
} // namespace Trinity
diff --git a/src/common/Define.h b/src/common/Define.h
index 061a6bc2f5e..07b79252074 100644
--- a/src/common/Define.h
+++ b/src/common/Define.h
@@ -95,6 +95,45 @@
#endif
#endif //COMPILER == COMPILER_GNU
+#ifdef TRINITY_API_USE_DYNAMIC_LINKING
+# if COMPILER == COMPILER_MICROSOFT
+# define TC_API_EXPORT __declspec(dllexport)
+# define TC_API_IMPORT __declspec(dllimport)
+# elif COMPILER == COMPILER_GNU
+# define TC_API_EXPORT __attribute__((visibility("default")))
+# define TC_API_IMPORT
+# else
+# error compiler not supported!
+# endif
+#else
+# define TC_API_EXPORT
+# define TC_API_IMPORT
+#endif
+
+#ifdef TRINITY_API_EXPORT_COMMON
+# define TC_COMMON_API TC_API_EXPORT
+#else
+# define TC_COMMON_API TC_API_IMPORT
+#endif
+
+#ifdef TRINITY_API_EXPORT_DATABASE
+# define TC_DATABASE_API TC_API_EXPORT
+#else
+# define TC_DATABASE_API TC_API_IMPORT
+#endif
+
+#ifdef TRINITY_API_EXPORT_SHARED
+# define TC_SHARED_API TC_API_EXPORT
+#else
+# define TC_SHARED_API TC_API_IMPORT
+#endif
+
+#ifdef TRINITY_API_EXPORT_GAME
+# define TC_GAME_API TC_API_EXPORT
+#else
+# define TC_GAME_API TC_API_IMPORT
+#endif
+
#define UI64FMTD "%" PRIu64
#define UI64LIT(N) UINT64_C(N)
diff --git a/src/common/GitRevision.cpp b/src/common/GitRevision.cpp
index 3dd6b543013..2b4537db448 100644
--- a/src/common/GitRevision.cpp
+++ b/src/common/GitRevision.cpp
@@ -1,5 +1,4 @@
#include "GitRevision.h"
-#include "CompilerDefs.h"
#include "revision_data.h"
char const* GitRevision::GetHash()
diff --git a/src/common/GitRevision.h b/src/common/GitRevision.h
index c65c8fb6cff..ffe8884eb0a 100644
--- a/src/common/GitRevision.h
+++ b/src/common/GitRevision.h
@@ -19,23 +19,24 @@
#define __GITREVISION_H__
#include <string>
+#include "Define.h"
namespace GitRevision
{
- char const* GetHash();
- char const* GetDate();
- char const* GetBranch();
- char const* GetCMakeCommand();
- char const* GetBuildDirectory();
- 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();
+ TC_COMMON_API char const* GetHash();
+ TC_COMMON_API char const* GetDate();
+ TC_COMMON_API char const* GetBranch();
+ TC_COMMON_API char const* GetCMakeCommand();
+ TC_COMMON_API char const* GetBuildDirectory();
+ TC_COMMON_API char const* GetSourceDirectory();
+ TC_COMMON_API char const* GetMySQLExecutable();
+ TC_COMMON_API char const* GetFullDatabase();
+ TC_COMMON_API char const* GetHotfixesDatabase();
+ TC_COMMON_API char const* GetFullVersion();
+ TC_COMMON_API char const* GetCompanyNameStr();
+ TC_COMMON_API char const* GetLegalCopyrightStr();
+ TC_COMMON_API char const* GetFileVersionStr();
+ TC_COMMON_API char const* GetProductVersionStr();
}
#endif
diff --git a/src/common/Logging/Appender.h b/src/common/Logging/Appender.h
index f0bfe423a66..22fe1112239 100644
--- a/src/common/Logging/Appender.h
+++ b/src/common/Logging/Appender.h
@@ -59,7 +59,7 @@ enum AppenderFlags
APPENDER_FLAGS_MAKE_FILE_BACKUP = 0x10 // only used by FileAppender
};
-struct LogMessage
+struct TC_COMMON_API LogMessage
{
LogMessage(LogLevel _level, std::string const& _type, std::string&& _text)
: level(_level), type(_type), text(std::forward<std::string>(_text)), mtime(time(NULL))
@@ -85,7 +85,7 @@ struct LogMessage
}
};
-class Appender
+class TC_COMMON_API Appender
{
public:
Appender(uint8 _id, std::string const& name, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE);
@@ -123,7 +123,7 @@ Appender* CreateAppender(uint8 id, std::string const& name, LogLevel level, Appe
return new AppenderImpl(id, name, level, flags, std::forward<ExtraAppenderArgs>(extraArgs));
}
-class InvalidAppenderArgsException : public std::length_error
+class TC_COMMON_API InvalidAppenderArgsException : public std::length_error
{
public:
explicit InvalidAppenderArgsException(std::string const& message) : std::length_error(message) { }
diff --git a/src/common/Logging/AppenderConsole.h b/src/common/Logging/AppenderConsole.h
index 5d7eae36b40..96d17207158 100644
--- a/src/common/Logging/AppenderConsole.h
+++ b/src/common/Logging/AppenderConsole.h
@@ -42,7 +42,7 @@ enum ColorTypes
const uint8 MaxColors = uint8(WHITE) + 1;
-class AppenderConsole : public Appender
+class TC_COMMON_API AppenderConsole : public Appender
{
public:
typedef std::integral_constant<AppenderType, APPENDER_CONSOLE>::type TypeIndex;
diff --git a/src/common/Logging/AppenderFile.h b/src/common/Logging/AppenderFile.h
index 9ba5d59259c..956b7a70b93 100644
--- a/src/common/Logging/AppenderFile.h
+++ b/src/common/Logging/AppenderFile.h
@@ -21,7 +21,7 @@
#include <atomic>
#include "Appender.h"
-class AppenderFile : public Appender
+class TC_COMMON_API AppenderFile : public Appender
{
public:
typedef std::integral_constant<AppenderType, APPENDER_FILE>::type TypeIndex;
diff --git a/src/common/Logging/Log.cpp b/src/common/Logging/Log.cpp
index dff0351d52d..b350a41b482 100644
--- a/src/common/Logging/Log.cpp
+++ b/src/common/Logging/Log.cpp
@@ -321,6 +321,12 @@ void Log::Close()
appenders.clear();
}
+Log* Log::instance()
+{
+ static Log instance;
+ return &instance;
+}
+
void Log::Initialize(boost::asio::io_service* ioService)
{
if (ioService)
diff --git a/src/common/Logging/Log.h b/src/common/Logging/Log.h
index eafd7412a94..6460e404c90 100644
--- a/src/common/Logging/Log.h
+++ b/src/common/Logging/Log.h
@@ -34,7 +34,7 @@
#define LOGGER_ROOT "root"
-class Log
+class TC_COMMON_API Log
{
typedef std::unordered_map<std::string, Logger> LoggerMap;
@@ -44,11 +44,7 @@ class Log
public:
- static Log* instance()
- {
- static Log instance;
- return &instance;
- }
+ static Log* instance();
void Initialize(boost::asio::io_service* ioService);
void SetSynchronous(); // Not threadsafe - should only be called from main() after all threads are joined
diff --git a/src/common/Logging/LogOperation.h b/src/common/Logging/LogOperation.h
index 618629b5423..56e2307d492 100644
--- a/src/common/Logging/LogOperation.h
+++ b/src/common/Logging/LogOperation.h
@@ -19,11 +19,12 @@
#define LOGOPERATION_H
#include <memory>
+#include "Define.h"
class Logger;
struct LogMessage;
-class LogOperation
+class TC_COMMON_API LogOperation
{
public:
LogOperation(Logger const* _logger, std::unique_ptr<LogMessage>&& _msg)
diff --git a/src/common/Logging/Logger.h b/src/common/Logging/Logger.h
index 67eab4295a4..4ac2e4494cc 100644
--- a/src/common/Logging/Logger.h
+++ b/src/common/Logging/Logger.h
@@ -20,7 +20,7 @@
#include "Appender.h"
-class Logger
+class TC_COMMON_API Logger
{
public:
Logger();
diff --git a/src/server/shared/Service/ServiceWin32.cpp b/src/common/Platform/ServiceWin32.cpp
index b6a1682993b..3c34f3e322c 100644
--- a/src/server/shared/Service/ServiceWin32.cpp
+++ b/src/common/Platform/ServiceWin32.cpp
@@ -261,4 +261,3 @@ bool WinServiceRun()
return true;
}
#endif
-
diff --git a/src/server/shared/Service/ServiceWin32.h b/src/common/Platform/ServiceWin32.h
index 3d67bfe5445..b892ba4e3b6 100644
--- a/src/server/shared/Service/ServiceWin32.h
+++ b/src/common/Platform/ServiceWin32.h
@@ -26,4 +26,3 @@ bool WinServiceRun();
#endif // _WIN32_SERVICE_
#endif // _WIN32
-
diff --git a/src/common/Utilities/Containers.h b/src/common/Utilities/Containers.h
index 9818712c0cb..e8a40ede4c7 100644
--- a/src/common/Utilities/Containers.h
+++ b/src/common/Utilities/Containers.h
@@ -20,6 +20,7 @@
#include "Define.h"
#include "Random.h"
+#include "Util.h"
#include <algorithm>
#include <functional>
#include <list>
diff --git a/src/common/Utilities/EventMap.h b/src/common/Utilities/EventMap.h
index a1aaa9af269..bb40980181d 100644
--- a/src/common/Utilities/EventMap.h
+++ b/src/common/Utilities/EventMap.h
@@ -22,7 +22,7 @@
#include "Duration.h"
#include "Util.h"
-class EventMap
+class TC_COMMON_API EventMap
{
/**
* Internal storage type.
diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h
index e5eafed79b9..e10558e6a21 100644
--- a/src/common/Utilities/EventProcessor.h
+++ b/src/common/Utilities/EventProcessor.h
@@ -25,7 +25,7 @@
// Note. All times are in milliseconds here.
-class BasicEvent
+class TC_COMMON_API BasicEvent
{
public:
BasicEvent()
@@ -55,7 +55,7 @@ class BasicEvent
typedef std::multimap<uint64, BasicEvent*> EventList;
-class EventProcessor
+class TC_COMMON_API EventProcessor
{
public:
EventProcessor();
diff --git a/src/common/Utilities/Random.h b/src/common/Utilities/Random.h
index dee0bfbfcf0..da3df620af8 100644
--- a/src/common/Utilities/Random.h
+++ b/src/common/Utilities/Random.h
@@ -23,25 +23,25 @@
#include <random>
/* Return a random number in the range min..max. */
-int32 irand(int32 min, int32 max);
+TC_COMMON_API int32 irand(int32 min, int32 max);
/* Return a random number in the range min..max (inclusive). */
-uint32 urand(uint32 min, uint32 max);
+TC_COMMON_API uint32 urand(uint32 min, uint32 max);
/* Return a random millisecond value between min and max seconds. Functionally equivalent to urand(min*IN_MILLISECONDS, max*IN_MILLISECONDS). */
-uint32 urandms(uint32 min, uint32 max);
+TC_COMMON_API uint32 urandms(uint32 min, uint32 max);
/* Return a random number in the range 0 .. UINT32_MAX. */
-uint32 rand32();
+TC_COMMON_API uint32 rand32();
/* Return a random number in the range min..max */
-float frand(float min, float max);
+TC_COMMON_API float frand(float min, float max);
/* Return a random double from 0.0 to 1.0 (exclusive). */
-double rand_norm();
+TC_COMMON_API double rand_norm();
/* Return a random double from 0.0 to 100.0 (exclusive). */
-double rand_chance();
+TC_COMMON_API double rand_chance();
/* Return true if a random roll fits in the specified chance (range 0-100). */
inline bool roll_chance_f(float chance)
@@ -58,7 +58,7 @@ inline bool roll_chance_i(int chance)
/*
* SFMT wrapper satisfying UniformRandomNumberGenerator concept for use in <random> algorithms
*/
-class SFMTEngine
+class TC_COMMON_API SFMTEngine
{
public:
typedef uint32 result_type;
diff --git a/src/common/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h
index d85523bc11f..e21b1024e87 100644
--- a/src/common/Utilities/StringFormat.h
+++ b/src/common/Utilities/StringFormat.h
@@ -19,7 +19,7 @@
#ifndef TRINITYCORE_STRING_FORMAT_H
#define TRINITYCORE_STRING_FORMAT_H
-#include "format.h"
+#include "cppformat/format.h"
namespace Trinity
{
diff --git a/src/common/Utilities/TaskScheduler.h b/src/common/Utilities/TaskScheduler.h
index 8cf5d914128..c5163ef33d5 100644
--- a/src/common/Utilities/TaskScheduler.h
+++ b/src/common/Utilities/TaskScheduler.h
@@ -46,7 +46,7 @@ class TaskContext;
/// with the same duration or a new one.
/// It also provides access to the repeat counter which is useful for task that repeat itself often
/// but behave different every time (spoken event dialogs for example).
-class TaskScheduler
+class TC_COMMON_API TaskScheduler
{
friend class TaskContext;
@@ -131,7 +131,7 @@ class TaskScheduler
};
};
- class TaskQueue
+ class TC_COMMON_API TaskQueue
{
std::multiset<TaskContainer, Compare> container;
@@ -408,7 +408,7 @@ private:
void Dispatch(success_t const& callback);
};
-class TaskContext
+class TC_COMMON_API TaskContext
{
friend class TaskScheduler;
diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp
index 5e36bfeb3b7..25bd935de92 100644
--- a/src/common/Utilities/Util.cpp
+++ b/src/common/Utilities/Util.cpp
@@ -219,22 +219,29 @@ bool IsIPAddress(char const* ipaddress)
}
/// create PID file
-uint32 CreatePIDFile(const std::string& filename)
+uint32 CreatePIDFile(std::string const& filename)
{
- FILE* pid_file = fopen (filename.c_str(), "w" );
+ FILE* pid_file = fopen(filename.c_str(), "w");
if (pid_file == NULL)
return 0;
+ uint32 pid = GetPID();
+
+ fprintf(pid_file, "%u", pid);
+ fclose(pid_file);
+
+ return pid;
+}
+
+uint32 GetPID()
+{
#ifdef _WIN32
DWORD pid = GetCurrentProcessId();
#else
pid_t pid = getpid();
#endif
- fprintf(pid_file, "%u", pid );
- fclose(pid_file);
-
- return (uint32)pid;
+ return uint32(pid);
}
size_t utf8length(std::string& utf8str)
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h
index 486c86f9182..ffc35a6894b 100644
--- a/src/common/Utilities/Util.h
+++ b/src/common/Utilities/Util.h
@@ -41,7 +41,7 @@ template<typename T, class S> struct Finder
bool operator()(const std::pair<int, S> &obj) { return obj.second.*idMember_ == val_; }
};
-class Tokenizer
+class TC_COMMON_API Tokenizer
{
public:
typedef std::vector<char const*> StorageType;
@@ -69,15 +69,15 @@ private:
StorageType m_storage;
};
-void stripLineInvisibleChars(std::string &src);
+TC_COMMON_API void stripLineInvisibleChars(std::string &src);
-int64 MoneyStringToMoney(const std::string& moneyString);
+TC_COMMON_API int64 MoneyStringToMoney(const std::string& moneyString);
-struct tm* localtime_r(const time_t* time, struct tm *result);
+TC_COMMON_API struct tm* localtime_r(const time_t* time, struct tm *result);
-std::string secsToTimeString(uint64 timeInSecs, bool shortText = false, bool hoursOnly = false);
-uint32 TimeStringToSecs(const std::string& timestring);
-std::string TimeToTimestampStr(time_t t);
+TC_COMMON_API std::string secsToTimeString(uint64 timeInSecs, bool shortText = false, bool hoursOnly = false);
+TC_COMMON_API uint32 TimeStringToSecs(const std::string& timestring);
+TC_COMMON_API std::string TimeToTimestampStr(time_t t);
inline void ApplyPercentModFloatVar(float& var, float val, bool apply)
{
@@ -112,20 +112,23 @@ inline T RoundToInterval(T& num, T floor, T ceil)
}
// UTF8 handling
-bool Utf8toWStr(const std::string& utf8str, std::wstring& wstr);
+TC_COMMON_API bool Utf8toWStr(const std::string& utf8str, std::wstring& wstr);
+
// in wsize==max size of buffer, out wsize==real string size
-bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize);
+TC_COMMON_API bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize);
+
inline bool Utf8toWStr(const std::string& utf8str, wchar_t* wstr, size_t& wsize)
{
return Utf8toWStr(utf8str.c_str(), utf8str.size(), wstr, wsize);
}
-bool WStrToUtf8(std::wstring const& wstr, std::string& utf8str);
+TC_COMMON_API bool WStrToUtf8(std::wstring const& wstr, std::string& utf8str);
// size==real string size
-bool WStrToUtf8(wchar_t* wstr, size_t size, std::string& utf8str);
+TC_COMMON_API bool WStrToUtf8(wchar_t* wstr, size_t size, std::string& utf8str);
-size_t utf8length(std::string& utf8str); // set string to "" if invalid utf8 sequence
-void utf8truncate(std::string& utf8str, size_t len);
+// set string to "" if invalid utf8 sequence
+TC_COMMON_API size_t utf8length(std::string& utf8str);
+TC_COMMON_API void utf8truncate(std::string& utf8str, size_t len);
inline bool isBasicLatinCharacter(wchar_t wchar)
{
@@ -304,23 +307,24 @@ inline void wstrToLower(std::wstring& str)
std::transform( str.begin(), str.end(), str.begin(), wcharToLower );
}
-std::wstring GetMainPartOfName(std::wstring const& wname, uint32 declension);
+TC_COMMON_API std::wstring GetMainPartOfName(std::wstring const& wname, uint32 declension);
-bool utf8ToConsole(const std::string& utf8str, std::string& conStr);
-bool consoleToUtf8(const std::string& conStr, std::string& utf8str);
-bool Utf8FitTo(const std::string& str, std::wstring const& search);
-void utf8printf(FILE* out, const char *str, ...);
-void vutf8printf(FILE* out, const char *str, va_list* ap);
-bool Utf8ToUpperOnlyLatin(std::string& utf8String);
+TC_COMMON_API bool utf8ToConsole(const std::string& utf8str, std::string& conStr);
+TC_COMMON_API bool consoleToUtf8(const std::string& conStr, std::string& utf8str);
+TC_COMMON_API bool Utf8FitTo(const std::string& str, std::wstring const& search);
+TC_COMMON_API void utf8printf(FILE* out, const char *str, ...);
+TC_COMMON_API void vutf8printf(FILE* out, const char *str, va_list* ap);
+TC_COMMON_API bool Utf8ToUpperOnlyLatin(std::string& utf8String);
-bool IsIPAddress(char const* ipaddress);
+TC_COMMON_API bool IsIPAddress(char const* ipaddress);
-uint32 CreatePIDFile(const std::string& filename);
+TC_COMMON_API uint32 CreatePIDFile(std::string const& filename);
+TC_COMMON_API uint32 GetPID();
-std::string ByteArrayToHexStr(uint8 const* bytes, uint32 length, bool reverse = false);
-void HexStrToByteArray(std::string const& str, uint8* out, bool reverse = false);
+TC_COMMON_API std::string ByteArrayToHexStr(uint8 const* bytes, uint32 length, bool reverse = false);
+TC_COMMON_API void HexStrToByteArray(std::string const& str, uint8* out, bool reverse = false);
-bool StringToBool(std::string const& str);
+TC_COMMON_API bool StringToBool(std::string const& str);
// simple class for not-modifyable list
template <typename T>
@@ -354,7 +358,7 @@ class HookList
}
};
-class flag128
+class TC_COMMON_API flag128
{
private:
uint32 part[4];
diff --git a/src/genrev/CMakeLists.txt b/src/genrev/CMakeLists.txt
index 91a13609037..355e2043b51 100644
--- a/src/genrev/CMakeLists.txt
+++ b/src/genrev/CMakeLists.txt
@@ -13,3 +13,8 @@ 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}"
)
+
+set_target_properties(revision_data.h
+ PROPERTIES
+ FOLDER
+ "server")
diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt
index d10425db8f6..f4a7246d9b0 100644
--- a/src/server/CMakeLists.txt
+++ b/src/server/CMakeLists.txt
@@ -16,15 +16,18 @@ if(CMAKE_COMPILER_IS_GNUCXX AND NOT MINGW)
add_definitions(-fno-delete-null-pointer-checks)
endif()
+if(WIN32)
+ set(sources_windows
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h
+ ${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.cpp
+ ${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.h
+ )
+endif(WIN32)
-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(game)
add_subdirectory(scripts)
add_subdirectory(worldserver)
diff --git a/src/server/bnetserver/CMakeLists.txt b/src/server/bnetserver/CMakeLists.txt
index 6d19b9ca95e..7aa861499d9 100644
--- a/src/server/bnetserver/CMakeLists.txt
+++ b/src/server/bnetserver/CMakeLists.txt
@@ -10,74 +10,29 @@
########### bnetserver ###############
-file(GLOB_RECURSE sources_authentication Authentication/*.cpp Authentication/*.h)
-file(GLOB_RECURSE sources_realms Realms/*.cpp Realms/*.h)
-file(GLOB_RECURSE sources_server Server/*.cpp Server/*.h)
-file(GLOB_RECURSE sources_packets Packets/*.cpp Packets/*.h)
-file(GLOB sources_localdir *.cpp *.h)
-
-if (USE_COREPCH)
- set(bnetserver_PCH_HDR PrecompiledHeaders/bnetPCH.h)
- set(bnetserver_PCH_SRC PrecompiledHeaders/bnetPCH.cpp)
-endif()
-
-set(bnetserver_SRCS
- ${bnetserver_SRCS}
- ${sources_authentication}
- ${sources_realms}
- ${sources_server}
- ${sources_packets}
- ${sources_localdir}
-)
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if( WIN32 )
- set(bnetserver_SRCS
- ${bnetserver_SRCS}
- ${sources_windows_Debugging}
- )
+ list(APPEND PRIVATE_SOURCES ${sources_windows})
if ( MSVC )
- set(bnetserver_SRCS
- ${bnetserver_SRCS}
- bnetserver.rc
- )
- endif ()
+ list(APPEND PRIVATE_SOURCES bnetserver.rc)
+ endif()
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}/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
- ${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}
- ${ZMQ_INCLUDE_DIR}
-)
+if (USE_COREPCH)
+ set(PRIVATE_PCH_HEADER PrecompiledHeaders/bnetPCH.h)
+ set(PRIVATE_PCH_SOURCE PrecompiledHeaders/bnetPCH.cpp)
+endif()
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
add_executable(bnetserver
- ${bnetserver_SRCS}
- ${bnetserver_PCH_SRC}
+ ${PRIVATE_SOURCES}
+ ${PRIVATE_PCH_SOURCE}
)
if( NOT WIN32 )
@@ -87,18 +42,25 @@ if( NOT WIN32 )
endif()
target_link_libraries(bnetserver
- shared
- database
- ipc
- common
- zmqpp
- format
- ${MYSQL_LIBRARY}
- ${OPENSSL_LIBRARIES}
- ${ZMQ_LIBRARY}
- ${CMAKE_THREAD_LIBS_INIT}
- ${Boost_LIBRARIES}
-)
+ PUBLIC
+ shared)
+
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
+
+target_include_directories(bnetserver
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
+
+set_target_properties(bnetserver
+ PROPERTIES
+ FOLDER
+ "server")
if( WIN32 )
if ( MSVC )
@@ -124,5 +86,5 @@ endif()
# Generate precompiled header
if (USE_COREPCH)
- add_cxx_pch(bnetserver ${bnetserver_PCH_HDR} ${bnetserver_PCH_SRC})
+ add_cxx_pch(bnetserver ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE})
endif()
diff --git a/src/server/bnetserver/Main.cpp b/src/server/bnetserver/Main.cpp
index c367a1f7d40..65b8d6e772b 100644
--- a/src/server/bnetserver/Main.cpp
+++ b/src/server/bnetserver/Main.cpp
@@ -36,7 +36,6 @@
#include "RealmList.h"
#include "GitRevision.h"
#include "Util.h"
-#include "ZmqContext.h"
#include "DatabaseLoader.h"
#include <cstdlib>
#include <iostream>
@@ -81,7 +80,6 @@ static boost::asio::deadline_timer* _dbPingTimer;
static uint32 _dbPingInterval;
static boost::asio::deadline_timer* _banExpiryCheckTimer;
static uint32 _banExpiryCheckInterval;
-LoginDatabaseWorkerPool LoginDatabase;
int main(int argc, char** argv)
{
@@ -137,23 +135,14 @@ int main(int argc, char** argv)
}
}
- int32 worldListenPort = sConfigMgr->GetIntDefault("WorldserverListenPort", 1118);
- if (worldListenPort < 0 || worldListenPort > 0xFFFF)
- {
- TC_LOG_ERROR("server.bnetserver", "Specified worldserver listen port (%d) out of allowed range (1-65535)", worldListenPort);
- return 1;
- }
-
// Initialize the database connection
if (!StartDB())
return 1;
- sIpcContext->Initialize();
-
_ioService = new boost::asio::io_service();
// Get the list of realms for the server
- sRealmList->Initialize(*_ioService, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 10), worldListenPort);
+ sRealmList->Initialize(*_ioService, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 10));
// Start the listening port (acceptor) for auth connections
int32 bnport = sConfigMgr->GetIntDefault("BattlenetPort", 1119);
@@ -210,8 +199,6 @@ int main(int argc, char** argv)
sSessionMgr.StopNetwork();
- sIpcContext->Close();
-
sRealmList->Close();
// Close the Database Pool and library
diff --git a/src/server/bnetserver/Realms/RealmList.cpp b/src/server/bnetserver/Realms/RealmList.cpp
index d3f40a8cc97..056ddef39d4 100644
--- a/src/server/bnetserver/Realms/RealmList.cpp
+++ b/src/server/bnetserver/Realms/RealmList.cpp
@@ -20,23 +20,20 @@
#include "Database/DatabaseEnv.h"
#include "SessionManager.h"
#include "Util.h"
-#include "Commands.h"
#include "RealmList.h"
#include <boost/asio/ip/tcp.hpp>
-RealmList::RealmList() : _updateInterval(0), _updateTimer(nullptr), _resolver(nullptr), _worldListener(nullptr)
+RealmList::RealmList() : _updateInterval(0), _updateTimer(nullptr), _resolver(nullptr)
{
}
RealmList::~RealmList()
{
delete _updateTimer;
- delete _resolver;
- delete _worldListener;
}
// Load the realm list from the database
-void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInterval, uint16 worldListenPort)
+void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInterval)
{
_updateInterval = updateInterval;
_updateTimer = new boost::asio::deadline_timer(ioService);
@@ -44,14 +41,10 @@ void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInte
// Get the content of the realmlist table in the database
UpdateRealms(boost::system::error_code());
-
- _worldListener = new WorldListener(worldListenPort);
- _worldListener->Start();
}
void RealmList::Close()
{
- _worldListener->End();
_updateTimer->cancel();
}
diff --git a/src/server/bnetserver/Realms/RealmList.h b/src/server/bnetserver/Realms/RealmList.h
index 388d4d5e1aa..fe3c9185ccf 100644
--- a/src/server/bnetserver/Realms/RealmList.h
+++ b/src/server/bnetserver/Realms/RealmList.h
@@ -21,7 +21,6 @@
#include "Common.h"
#include "Realm/Realm.h"
-#include "WorldListener.h"
#include <boost/asio/ip/address.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/io_service.hpp>
@@ -43,7 +42,7 @@ public:
~RealmList();
- void Initialize(boost::asio::io_service& ioService, uint32 updateInterval, uint16 worldListenPort);
+ void Initialize(boost::asio::io_service& ioService, uint32 updateInterval);
void Close();
RealmMap const& GetRealms() const { return _realms; }
@@ -60,7 +59,6 @@ private:
uint32 _updateInterval;
boost::asio::deadline_timer* _updateTimer;
boost::asio::ip::tcp::resolver* _resolver;
- WorldListener* _worldListener;
};
#define sRealmList RealmList::instance()
diff --git a/src/server/bnetserver/Realms/WorldListener.cpp b/src/server/bnetserver/Realms/WorldListener.cpp
deleted file mode 100644
index 2dd9bcdfa2f..00000000000
--- a/src/server/bnetserver/Realms/WorldListener.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "Log.h"
-#include "SessionManager.h"
-#include "WoWRealmPackets.h"
-#include "ZmqContext.h"
-#include "WorldListener.h"
-
-WorldListener::HandlerTable const WorldListener::_handlers;
-
-WorldListener::HandlerTable::HandlerTable()
-{
-#define DEFINE_HANDLER(opc, func) _handlers[opc] = { func, #opc }
-
- DEFINE_HANDLER(BNET_CHANGE_TOON_ONLINE_STATE, &WorldListener::HandleToonOnlineStatusChange);
-
-#undef DEFINE_HANDLER
-}
-
-WorldListener::WorldListener(uint16 worldListenPort) : _worldListenPort(worldListenPort)
-{
- _worldSocket = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull);
-}
-
-WorldListener::~WorldListener()
-{
- delete _worldSocket;
-}
-
-void WorldListener::Run()
-{
- while (!ProcessExit())
- {
- _poller->poll();
- if (_poller->events(*_worldSocket) & zmqpp::poller::poll_in)
- {
- int32 op1;
- do
- {
- zmqpp::message msg;
- _worldSocket->receive(msg);
- Dispatch(msg);
- _worldSocket->get(zmqpp::socket_option::events, op1);
- } while (op1 & zmqpp::poller::poll_in);
- }
- }
-}
-
-void WorldListener::HandleOpen()
-{
- 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 on port %u...", _worldListenPort);
-}
-
-void WorldListener::HandleClose()
-{
- _worldSocket->close();
- TC_LOG_INFO("server.ipc", "Shutting down connections from worldservers...");
-}
-
-void WorldListener::Dispatch(zmqpp::message& msg) const
-{
- IPC::BattlenetComm::Header ipcHeader;
- msg >> ipcHeader;
-
- if (ipcHeader.Ipc.Channel != IPC_CHANNEL_BNET)
- return;
-
- if (ipcHeader.Ipc.Command < IPC_BNET_MAX_COMMAND)
- (this->*_handlers[ipcHeader.Ipc.Command].Handler)(ipcHeader.Realm, msg);
-}
-
-void WorldListener::HandleToonOnlineStatusChange(Battlenet::RealmHandle const& realm, zmqpp::message& msg) const
-{
- IPC::BattlenetComm::ToonHandle toonHandle;
- bool online;
- msg >> toonHandle;
- msg >> online;
-
- if (Battlenet::Session* session = sSessionMgr.GetSession(toonHandle.AccountId, toonHandle.GameAccountId))
- {
- if (online)
- {
- if (!session->IsToonOnline())
- {
- Battlenet::WoWRealm::ToonReady* toonReady = new Battlenet::WoWRealm::ToonReady();
- toonReady->Name.Region = realm.Region;
- toonReady->Name.ProgramId = "WoW";
- toonReady->Name.Realm = realm.GetAddress();
- toonReady->Name.Name = toonHandle.Name;
-
- toonReady->Handle.Region = realm.Region;
- toonReady->Handle.ProgramId = "WoW";
- toonReady->Handle.Realm = realm.GetAddress();
- toonReady->Handle.Id = toonHandle.Guid;
-
- session->SetToonOnline(true);
- session->AsyncWrite(toonReady);
- }
- }
- else if (session->IsToonOnline())
- {
- session->AsyncWrite(new Battlenet::WoWRealm::ToonLoggedOut());
- session->SetToonOnline(false);
- }
- }
-}
diff --git a/src/server/bnetserver/Realms/WorldListener.h b/src/server/bnetserver/Realms/WorldListener.h
deleted file mode 100644
index e5b1ff41201..00000000000
--- a/src/server/bnetserver/Realms/WorldListener.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef WorldListener_h__
-#define WorldListener_h__
-
-#include "ZMQTask.h"
-#include "Commands.h"
-
-class WorldListener : public ZMQTask
-{
-public:
- explicit WorldListener(uint16 worldListenPort);
- ~WorldListener();
- void Run() override;
-
-protected:
- void HandleOpen() override;
- void HandleClose() override;
-
-private:
- void Dispatch(zmqpp::message& msg) const;
-
- typedef void(WorldListener::*PacketHandler)(Battlenet::RealmHandle const& realm, zmqpp::message& msg) const;
- class HandlerTable
- {
- public:
- HandlerTable();
-
- struct HandlerInfo
- {
- PacketHandler Handler;
- char const* Name;
- };
-
- HandlerInfo const& operator[](uint8 opcode) const { return _handlers[opcode]; }
-
- private:
- HandlerInfo _handlers[IPC_BNET_MAX_COMMAND];
- };
-
- void HandleToonOnlineStatusChange(Battlenet::RealmHandle const& realm, zmqpp::message& msg) const;
-
- zmqpp::socket* _worldSocket;
- uint16 _worldListenPort;
- static HandlerTable const _handlers;
-};
-
-#endif // WorldListener_h__
diff --git a/src/server/bnetserver/bnetserver.conf.dist b/src/server/bnetserver/bnetserver.conf.dist
index cf5d27699d8..252a29440b5 100644
--- a/src/server/bnetserver/bnetserver.conf.dist
+++ b/src/server/bnetserver/bnetserver.conf.dist
@@ -48,13 +48,6 @@ LogsDir = ""
MaxPingTime = 30
#
-# WorldserverListenPort
-# Description: TCP port to listen on for incoming worldserver IPC.
-# Default: 1118
-
-WorldserverListenPort = 1118
-
-#
# BattlenetPort
# Description: TCP port to reach the auth server for battle.net connections.
# Default: 1119
diff --git a/src/server/database/CMakeLists.txt b/src/server/database/CMakeLists.txt
index 5a53899f4cb..06772cd5309 100644
--- a/src/server/database/CMakeLists.txt
+++ b/src/server/database/CMakeLists.txt
@@ -8,34 +8,22 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-if (NOT MYSQL_FOUND)
- message(SEND_ERROR "MySQL wasn't found on your system but it's required to build the servers!")
-endif()
-
-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
-#
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if (USE_COREPCH)
- set(database_STAT_PCH_HDR PrecompiledHeaders/databasePCH.h)
- set(database_STAT_PCH_SRC PrecompiledHeaders/databasePCH.cpp)
+ set(PRIVATE_PCH_HEADER PrecompiledHeaders/databasePCH.h)
+ set(PRIVATE_PCH_SOURCE PrecompiledHeaders/databasePCH.cpp)
endif()
-set(database_STAT_SRCS
- ${database_STAT_SRCS}
- ${sources_Database}
- ${sources_Logging}
- ${sources_Updater}
+GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+
+add_library(database
+ ${PRIVATE_SOURCES}
+ ${PRIVATE_PCH_SOURCE}
)
# Do NOT add any extra include directory unless it does not create unneeded extra dependencies,
@@ -47,31 +35,44 @@ set(database_STAT_SRCS
# 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(
+CollectIncludeDirectories(
${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}
-)
+ PUBLIC_INCLUDES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
-GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(database
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
-add_library(database STATIC
- ${database_STAT_SRCS}
- ${database_STAT_PCH_SRC}
-)
+add_definitions(-DTRINITY_API_EXPORT_DATABASE)
+
+target_link_libraries(database
+ PUBLIC
+ common
+ process
+ mysql)
+
+set_target_properties(database
+ PROPERTIES
+ FOLDER
+ "server")
+
+if( BUILD_SHARED_LIBS )
+ if( UNIX )
+ install(TARGETS database
+ LIBRARY
+ DESTINATION lib)
+ elseif( WIN32 )
+ install(TARGETS database
+ RUNTIME
+ DESTINATION "${CMAKE_INSTALL_PREFIX}")
+ endif()
+endif()
# Generate precompiled header
if (USE_COREPCH)
- add_cxx_pch(database ${database_STAT_PCH_HDR} ${database_STAT_PCH_SRC})
+ add_cxx_pch(database ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE})
endif ()
diff --git a/src/server/database/Database/AdhocStatement.h b/src/server/database/Database/AdhocStatement.h
index ab85493a14e..9315038bce1 100644
--- a/src/server/database/Database/AdhocStatement.h
+++ b/src/server/database/Database/AdhocStatement.h
@@ -25,7 +25,7 @@ typedef std::future<QueryResult> QueryResultFuture;
typedef std::promise<QueryResult> QueryResultPromise;
/*! Raw, ad-hoc query. */
-class BasicStatementTask : public SQLOperation
+class TC_DATABASE_API BasicStatementTask : public SQLOperation
{
public:
BasicStatementTask(const char* sql, bool async = false);
diff --git a/src/server/ipc/ZmqWorker.h b/src/server/database/Database/DatabaseEnv.cpp
index 21d2d95ac18..693158b7c9e 100644
--- a/src/server/ipc/ZmqWorker.h
+++ b/src/server/database/Database/DatabaseEnv.cpp
@@ -15,30 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __ZMQWORKER_H
-#define __ZMQWORKER_H
+#include "DatabaseEnv.h"
-#include "ZMQTask.h"
-#include <zmqpp/zmqpp.hpp>
-
-class ZmqWorker : public ZMQTask
-{
-public:
- ZmqWorker(std::string const& taskUri, std::string const& resUri);
- ~ZmqWorker();
- void Run() override;
-
-protected:
- void HandleOpen() override;
- void HandleClose() override;
- zmqpp::socket* _results = nullptr;
-
-private:
- void PerformWork();
- virtual void Dispatch(zmqpp::message const&) = 0;
- zmqpp::socket* _taskQueue = nullptr;
- std::string _taskUri;
- std::string _resultsUri;
-};
-
-#endif
+WorldDatabaseWorkerPool WorldDatabase;
+CharacterDatabaseWorkerPool CharacterDatabase;
+LoginDatabaseWorkerPool LoginDatabase;
+HotfixDatabaseWorkerPool HotfixDatabase;
diff --git a/src/server/database/Database/DatabaseEnv.h b/src/server/database/Database/DatabaseEnv.h
index 27b2bce744b..3d1700bfeba 100644
--- a/src/server/database/Database/DatabaseEnv.h
+++ b/src/server/database/Database/DatabaseEnv.h
@@ -39,10 +39,13 @@
#include "Implementation/WorldDatabase.h"
#include "Implementation/HotfixDatabase.h"
-extern WorldDatabaseWorkerPool WorldDatabase;
-extern CharacterDatabaseWorkerPool CharacterDatabase;
-extern LoginDatabaseWorkerPool LoginDatabase;
-extern HotfixDatabaseWorkerPool HotfixDatabase;
+/// Accessor to the world database
+TC_DATABASE_API extern WorldDatabaseWorkerPool WorldDatabase;
+/// Accessor to the character database
+TC_DATABASE_API extern CharacterDatabaseWorkerPool CharacterDatabase;
+/// Accessor to the realm/login database
+TC_DATABASE_API extern LoginDatabaseWorkerPool LoginDatabase;
+/// Accessor to the hotfix database
+TC_DATABASE_API extern HotfixDatabaseWorkerPool HotfixDatabase;
#endif
-
diff --git a/src/server/database/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp
index 2cbf31dbef8..89428561524 100644
--- a/src/server/database/Database/DatabaseLoader.cpp
+++ b/src/server/database/Database/DatabaseLoader.cpp
@@ -177,11 +177,11 @@ bool DatabaseLoader::Process(std::queue<Predicate>& queue)
return true;
}
-template
-DatabaseLoader& DatabaseLoader::AddDatabase<LoginDatabaseConnection>(DatabaseWorkerPool<LoginDatabaseConnection>& pool, std::string const& name);
-template
-DatabaseLoader& DatabaseLoader::AddDatabase<WorldDatabaseConnection>(DatabaseWorkerPool<WorldDatabaseConnection>& pool, std::string const& name);
-template
-DatabaseLoader& DatabaseLoader::AddDatabase<CharacterDatabaseConnection>(DatabaseWorkerPool<CharacterDatabaseConnection>& pool, std::string const& name);
-template
-DatabaseLoader& DatabaseLoader::AddDatabase<HotfixDatabaseConnection>(DatabaseWorkerPool<HotfixDatabaseConnection>& pool, std::string const& name);
+template TC_DATABASE_API
+DatabaseLoader& DatabaseLoader::AddDatabase<LoginDatabaseConnection>(LoginDatabaseWorkerPool&, std::string const&);
+template TC_DATABASE_API
+DatabaseLoader& DatabaseLoader::AddDatabase<CharacterDatabaseConnection>(CharacterDatabaseWorkerPool&, std::string const&);
+template TC_DATABASE_API
+DatabaseLoader& DatabaseLoader::AddDatabase<HotfixDatabaseConnection>(HotfixDatabaseWorkerPool&, std::string const&);
+template TC_DATABASE_API
+DatabaseLoader& DatabaseLoader::AddDatabase<WorldDatabaseConnection>(WorldDatabaseWorkerPool&, std::string const&);
diff --git a/src/server/database/Database/DatabaseLoader.h b/src/server/database/Database/DatabaseLoader.h
index 1b31d3691c4..4b0c670c3b7 100644
--- a/src/server/database/Database/DatabaseLoader.h
+++ b/src/server/database/Database/DatabaseLoader.h
@@ -19,7 +19,7 @@
#define DatabaseLoader_h__
#include "DatabaseWorkerPool.h"
-#include "DatabaseEnv.h"
+#include "DBUpdater.h"
#include <functional>
#include <stack>
@@ -27,7 +27,7 @@
// A helper class to initiate all database worker pools,
// handles updating, delays preparing of statements and cleans up on failure.
-class DatabaseLoader
+class TC_DATABASE_API DatabaseLoader
{
public:
DatabaseLoader(std::string const& logger, uint32 const defaultUpdateMask);
diff --git a/src/server/database/Database/DatabaseWorker.h b/src/server/database/Database/DatabaseWorker.h
index c21a3d2a343..d6b43943f7d 100644
--- a/src/server/database/Database/DatabaseWorker.h
+++ b/src/server/database/Database/DatabaseWorker.h
@@ -24,7 +24,7 @@
class MySQLConnection;
class SQLOperation;
-class DatabaseWorker
+class TC_DATABASE_API DatabaseWorker
{
public:
DatabaseWorker(ProducerConsumerQueue<SQLOperation*>* newQueue, MySQLConnection* connection);
diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp
index 6c352bb11b8..daf54d271b2 100644
--- a/src/server/database/Database/DatabaseWorkerPool.cpp
+++ b/src/server/database/Database/DatabaseWorkerPool.cpp
@@ -317,7 +317,7 @@ T* DatabaseWorkerPool<T>::GetFreeConnection()
return connection;
}
-template class DatabaseWorkerPool<LoginDatabaseConnection>;
-template class DatabaseWorkerPool<WorldDatabaseConnection>;
-template class DatabaseWorkerPool<CharacterDatabaseConnection>;
-template class DatabaseWorkerPool<HotfixDatabaseConnection>;
+template class TC_DATABASE_API DatabaseWorkerPool<LoginDatabaseConnection>;
+template class TC_DATABASE_API DatabaseWorkerPool<WorldDatabaseConnection>;
+template class TC_DATABASE_API DatabaseWorkerPool<CharacterDatabaseConnection>;
+template class TC_DATABASE_API DatabaseWorkerPool<HotfixDatabaseConnection>;
diff --git a/src/server/database/Database/Field.h b/src/server/database/Database/Field.h
index abbe9253c2f..cd05023f417 100644
--- a/src/server/database/Database/Field.h
+++ b/src/server/database/Database/Field.h
@@ -53,7 +53,7 @@
| SUM, AVG | DECIMAL |
| COUNT | BIGINT |
*/
-class Field
+class TC_DATABASE_API Field
{
friend class ResultSet;
friend class PreparedResultSet;
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index babf39ec3e5..8b7baf385ce 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -45,21 +45,21 @@ void CharacterDatabaseConnection::DoPrepareStatements()
"subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, "
- "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot "
+ "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time "
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, "
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, "
- "cb.guid, c.slot, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? "
+ "cb.guid, c.slot, c.logout_time, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? "
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, "
- "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot "
+ "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time "
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, "
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, "
- "cb.guid, c.slot, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? "
+ "cb.guid, c.slot, c.logout_time, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? "
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC);
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h
index ebc63f1cb6e..192a7e5f8dd 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.h
+++ b/src/server/database/Database/Implementation/CharacterDatabase.h
@@ -595,7 +595,7 @@ enum CharacterDatabaseStatements
MAX_CHARACTERDATABASE_STATEMENTS
};
-class CharacterDatabaseConnection : public MySQLConnection
+class TC_DATABASE_API CharacterDatabaseConnection : public MySQLConnection
{
public:
typedef CharacterDatabaseStatements Statements;
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index 35f08d98c77..438485156d5 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -281,7 +281,7 @@ enum HotfixDatabaseStatements
MAX_HOTFIXDATABASE_STATEMENTS
};
-class HotfixDatabaseConnection : public MySQLConnection
+class TC_DATABASE_API HotfixDatabaseConnection : public MySQLConnection
{
public:
typedef HotfixDatabaseStatements Statements;
diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp
index 964748a2682..2ca59c05ecc 100644
--- a/src/server/database/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/database/Database/Implementation/LoginDatabase.cpp
@@ -39,7 +39,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH);
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, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, ba.os, ba.id, aa.gmLevel, "
+ PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, a.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 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 AND ab.active = 1 "
diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h
index 749e7c2c9bb..94111d66388 100644
--- a/src/server/database/Database/Implementation/LoginDatabase.h
+++ b/src/server/database/Database/Implementation/LoginDatabase.h
@@ -147,7 +147,7 @@ enum LoginDatabaseStatements
MAX_LOGINDATABASE_STATEMENTS
};
-class LoginDatabaseConnection : public MySQLConnection
+class TC_DATABASE_API LoginDatabaseConnection : public MySQLConnection
{
public:
typedef LoginDatabaseStatements Statements;
diff --git a/src/server/database/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h
index 0cc876c4a6d..60ac17b5f4a 100644
--- a/src/server/database/Database/Implementation/WorldDatabase.h
+++ b/src/server/database/Database/Implementation/WorldDatabase.h
@@ -103,7 +103,7 @@ enum WorldDatabaseStatements
MAX_WORLDDATABASE_STATEMENTS
};
-class WorldDatabaseConnection : public MySQLConnection
+class TC_DATABASE_API WorldDatabaseConnection : public MySQLConnection
{
public:
typedef WorldDatabaseStatements Statements;
diff --git a/src/server/database/Database/MySQLConnection.h b/src/server/database/Database/MySQLConnection.h
index a0b908593df..566995988c0 100644
--- a/src/server/database/Database/MySQLConnection.h
+++ b/src/server/database/Database/MySQLConnection.h
@@ -35,7 +35,7 @@ enum ConnectionFlags
CONNECTION_BOTH = CONNECTION_ASYNC | CONNECTION_SYNCH
};
-struct MySQLConnectionInfo
+struct TC_DATABASE_API MySQLConnectionInfo
{
explicit MySQLConnectionInfo(std::string const& infoString)
{
@@ -62,7 +62,7 @@ struct MySQLConnectionInfo
typedef std::map<uint32 /*index*/, std::pair<std::string /*query*/, ConnectionFlags /*sync/async*/> > PreparedStatementMap;
-class MySQLConnection
+class TC_DATABASE_API MySQLConnection
{
template <class T> friend class DatabaseWorkerPool;
friend class PingOperation;
diff --git a/src/server/database/Database/MySQLThreading.h b/src/server/database/Database/MySQLThreading.h
index 1cfa11d7e5b..b6083500989 100644
--- a/src/server/database/Database/MySQLThreading.h
+++ b/src/server/database/Database/MySQLThreading.h
@@ -20,7 +20,7 @@
#include "Log.h"
-class MySQL
+class TC_DATABASE_API MySQL
{
public:
static void Library_Init()
diff --git a/src/server/database/Database/PreparedStatement.h b/src/server/database/Database/PreparedStatement.h
index 2079a5b78b8..d7508dbae1f 100644
--- a/src/server/database/Database/PreparedStatement.h
+++ b/src/server/database/Database/PreparedStatement.h
@@ -71,7 +71,7 @@ struct PreparedStatementData
class MySQLPreparedStatement;
//- Upper-level class that is used in code
-class PreparedStatement
+class TC_DATABASE_API PreparedStatement
{
friend class PreparedStatementTask;
friend class MySQLPreparedStatement;
@@ -111,7 +111,7 @@ class PreparedStatement
//- Class of which the instances are unique per MySQLConnection
//- access to these class objects is only done when a prepared statement task
//- is executed.
-class MySQLPreparedStatement
+class TC_DATABASE_API MySQLPreparedStatement
{
friend class MySQLConnection;
friend class PreparedStatement;
@@ -159,7 +159,7 @@ typedef std::future<PreparedQueryResult> PreparedQueryResultFuture;
typedef std::promise<PreparedQueryResult> PreparedQueryResultPromise;
//- Lower-level class, enqueuable operation
-class PreparedStatementTask : public SQLOperation
+class TC_DATABASE_API PreparedStatementTask : public SQLOperation
{
public:
PreparedStatementTask(PreparedStatement* stmt, bool async = false);
diff --git a/src/server/database/Database/QueryHolder.h b/src/server/database/Database/QueryHolder.h
index f78f88f4c1e..34887767dea 100644
--- a/src/server/database/Database/QueryHolder.h
+++ b/src/server/database/Database/QueryHolder.h
@@ -20,7 +20,7 @@
#include <future>
-class SQLQueryHolder
+class TC_DATABASE_API SQLQueryHolder
{
friend class SQLQueryHolderTask;
private:
@@ -46,7 +46,7 @@ class SQLQueryHolder
typedef std::future<SQLQueryHolder*> QueryResultHolderFuture;
typedef std::promise<SQLQueryHolder*> QueryResultHolderPromise;
-class SQLQueryHolderTask : public SQLOperation
+class TC_DATABASE_API SQLQueryHolderTask : public SQLOperation
{
private:
SQLQueryHolder* m_holder;
diff --git a/src/server/database/Database/QueryResult.h b/src/server/database/Database/QueryResult.h
index d4d63b5ec85..3b1691db1a6 100644
--- a/src/server/database/Database/QueryResult.h
+++ b/src/server/database/Database/QueryResult.h
@@ -27,7 +27,7 @@
#endif
#include <mysql.h>
-class ResultSet
+class TC_DATABASE_API ResultSet
{
public:
ResultSet(MYSQL_RES* result, MYSQL_FIELD* fields, uint64 rowCount, uint32 fieldCount);
@@ -60,7 +60,7 @@ class ResultSet
typedef std::shared_ptr<ResultSet> QueryResult;
-class PreparedResultSet
+class TC_DATABASE_API PreparedResultSet
{
public:
PreparedResultSet(MYSQL_STMT* stmt, MYSQL_RES* result, uint64 rowCount, uint32 fieldCount);
diff --git a/src/server/database/Database/SQLOperation.h b/src/server/database/Database/SQLOperation.h
index f0500d1f232..5b3032eab87 100644
--- a/src/server/database/Database/SQLOperation.h
+++ b/src/server/database/Database/SQLOperation.h
@@ -53,7 +53,7 @@ union SQLResultSetUnion
class MySQLConnection;
-class SQLOperation
+class TC_DATABASE_API SQLOperation
{
public:
SQLOperation(): m_conn(NULL) { }
diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h
index 5780c0363d9..7b5b6addfe4 100644
--- a/src/server/database/Database/Transaction.h
+++ b/src/server/database/Database/Transaction.h
@@ -25,7 +25,7 @@
class PreparedStatement;
/*! Transactions, high level class. */
-class Transaction
+class TC_DATABASE_API Transaction
{
friend class TransactionTask;
friend class MySQLConnection;
@@ -58,7 +58,7 @@ class Transaction
typedef std::shared_ptr<Transaction> SQLTransaction;
/*! Low level class*/
-class TransactionTask : public SQLOperation
+class TC_DATABASE_API TransactionTask : public SQLOperation
{
template <class T> friend class DatabaseWorkerPool;
friend class DatabaseWorker;
diff --git a/src/server/database/Logging/AppenderDB.h b/src/server/database/Logging/AppenderDB.h
index a6acc66b48c..225ae969802 100644
--- a/src/server/database/Logging/AppenderDB.h
+++ b/src/server/database/Logging/AppenderDB.h
@@ -20,7 +20,7 @@
#include "Appender.h"
-class AppenderDB: public Appender
+class TC_DATABASE_API AppenderDB: public Appender
{
public:
typedef std::integral_constant<AppenderType, APPENDER_DB>::type TypeIndex;
diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp
index ab4b767b104..ef4a0d407cb 100644
--- a/src/server/database/Updater/DBUpdater.cpp
+++ b/src/server/database/Updater/DBUpdater.cpp
@@ -468,7 +468,7 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos
}
}
-template class DBUpdater<LoginDatabaseConnection>;
-template class DBUpdater<WorldDatabaseConnection>;
-template class DBUpdater<CharacterDatabaseConnection>;
-template class DBUpdater<HotfixDatabaseConnection>;
+template class TC_DATABASE_API DBUpdater<LoginDatabaseConnection>;
+template class TC_DATABASE_API DBUpdater<WorldDatabaseConnection>;
+template class TC_DATABASE_API DBUpdater<CharacterDatabaseConnection>;
+template class TC_DATABASE_API DBUpdater<HotfixDatabaseConnection>;
diff --git a/src/server/database/Updater/DBUpdater.h b/src/server/database/Updater/DBUpdater.h
index dbb897d2527..cc5d3aad68b 100644
--- a/src/server/database/Updater/DBUpdater.h
+++ b/src/server/database/Updater/DBUpdater.h
@@ -23,7 +23,7 @@
#include <string>
#include <boost/filesystem.hpp>
-class UpdateException : public std::exception
+class TC_DATABASE_API UpdateException : public std::exception
{
public:
UpdateException(std::string const& msg) : _msg(msg) { }
@@ -41,7 +41,7 @@ enum BaseLocation
LOCATION_DOWNLOAD
};
-struct UpdateResult
+struct TC_DATABASE_API UpdateResult
{
UpdateResult()
: updated(0), recent(0), archived(0) { }
@@ -66,7 +66,7 @@ private:
};
template <class T>
-class DBUpdater
+class TC_DATABASE_API DBUpdater
{
public:
using Path = boost::filesystem::path;
diff --git a/src/server/database/Updater/UpdateFetcher.h b/src/server/database/Updater/UpdateFetcher.h
index c87efea2b02..a17658818ce 100644
--- a/src/server/database/Updater/UpdateFetcher.h
+++ b/src/server/database/Updater/UpdateFetcher.h
@@ -25,7 +25,7 @@
#include <memory>
#include <vector>
-class UpdateFetcher
+class TC_DATABASE_API UpdateFetcher
{
typedef boost::filesystem::path Path;
diff --git a/src/server/game/AI/CoreAI/CombatAI.h b/src/server/game/AI/CoreAI/CombatAI.h
index 55b91b6969e..f1718fbdb6a 100644
--- a/src/server/game/AI/CoreAI/CombatAI.h
+++ b/src/server/game/AI/CoreAI/CombatAI.h
@@ -25,7 +25,7 @@
class Creature;
-class AggressorAI : public CreatureAI
+class TC_GAME_API AggressorAI : public CreatureAI
{
public:
explicit AggressorAI(Creature* c) : CreatureAI(c) { }
@@ -36,7 +36,7 @@ class AggressorAI : public CreatureAI
typedef std::vector<uint32> SpellVct;
-class CombatAI : public CreatureAI
+class TC_GAME_API CombatAI : public CreatureAI
{
public:
explicit CombatAI(Creature* c) : CreatureAI(c) { }
@@ -55,7 +55,7 @@ class CombatAI : public CreatureAI
SpellVct spells;
};
-class CasterAI : public CombatAI
+class TC_GAME_API CasterAI : public CombatAI
{
public:
explicit CasterAI(Creature* c) : CombatAI(c) { m_attackDist = MELEE_RANGE; }
@@ -67,7 +67,7 @@ class CasterAI : public CombatAI
float m_attackDist;
};
-struct ArcherAI : public CreatureAI
+struct TC_GAME_API ArcherAI : public CreatureAI
{
public:
explicit ArcherAI(Creature* c);
@@ -80,7 +80,7 @@ struct ArcherAI : public CreatureAI
float m_minRange;
};
-struct TurretAI : public CreatureAI
+struct TC_GAME_API TurretAI : public CreatureAI
{
public:
explicit TurretAI(Creature* c);
@@ -97,7 +97,7 @@ struct TurretAI : public CreatureAI
#define VEHICLE_CONDITION_CHECK_TIME 1000
#define VEHICLE_DISMISS_TIME 5000
-struct VehicleAI : public CreatureAI
+struct TC_GAME_API VehicleAI : public CreatureAI
{
public:
explicit VehicleAI(Creature* creature);
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h
index 4f256a5de31..7a2f23ac804 100644
--- a/src/server/game/AI/CoreAI/GameObjectAI.h
+++ b/src/server/game/AI/CoreAI/GameObjectAI.h
@@ -26,7 +26,7 @@
#include "GameObject.h"
#include "CreatureAI.h"
-class GameObjectAI
+class TC_GAME_API GameObjectAI
{
protected:
GameObject* const go;
@@ -63,7 +63,7 @@ class GameObjectAI
virtual void EventInform(uint32 /*eventId*/) { }
};
-class NullGameObjectAI : public GameObjectAI
+class TC_GAME_API NullGameObjectAI : public GameObjectAI
{
public:
explicit NullGameObjectAI(GameObject* g);
diff --git a/src/server/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp
index 176dd41fdae..c7d618a9918 100644
--- a/src/server/game/AI/CoreAI/GuardAI.cpp
+++ b/src/server/game/AI/CoreAI/GuardAI.cpp
@@ -43,7 +43,7 @@ bool GuardAI::CanSeeAlways(WorldObject const* obj)
return false;
}
-void GuardAI::EnterEvadeMode()
+void GuardAI::EnterEvadeMode(EvadeReason /*why*/)
{
if (!me->IsAlive())
{
diff --git a/src/server/game/AI/CoreAI/GuardAI.h b/src/server/game/AI/CoreAI/GuardAI.h
index 01d54e47b9a..a6aa4b6624a 100644
--- a/src/server/game/AI/CoreAI/GuardAI.h
+++ b/src/server/game/AI/CoreAI/GuardAI.h
@@ -23,7 +23,7 @@
class Creature;
-class GuardAI : public ScriptedAI
+class TC_GAME_API GuardAI : public ScriptedAI
{
public:
explicit GuardAI(Creature* creature);
@@ -31,7 +31,7 @@ class GuardAI : public ScriptedAI
static int Permissible(Creature const* creature);
bool CanSeeAlways(WorldObject const* obj) override;
- void EnterEvadeMode() override;
+ void EnterEvadeMode(EvadeReason /*why*/) override;
void JustDied(Unit* killer) override;
};
#endif
diff --git a/src/server/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp
index 1a6af99b11d..f283afe77a8 100644
--- a/src/server/game/AI/CoreAI/PassiveAI.cpp
+++ b/src/server/game/AI/CoreAI/PassiveAI.cpp
@@ -26,7 +26,7 @@ NullCreatureAI::NullCreatureAI(Creature* c) : CreatureAI(c) { me->SetReactState(
void PassiveAI::UpdateAI(uint32)
{
if (me->IsInCombat() && me->getAttackers().empty())
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_NO_HOSTILES);
}
void PossessedAI::AttackStart(Unit* target)
@@ -64,11 +64,11 @@ void CritterAI::DamageTaken(Unit* /*done_by*/, uint32&)
me->SetControlled(true, UNIT_STATE_FLEEING);
}
-void CritterAI::EnterEvadeMode()
+void CritterAI::EnterEvadeMode(EvadeReason why)
{
if (me->HasUnitState(UNIT_STATE_FLEEING))
me->SetControlled(false, UNIT_STATE_FLEEING);
- CreatureAI::EnterEvadeMode();
+ CreatureAI::EnterEvadeMode(why);
}
void TriggerAI::IsSummonedBy(Unit* summoner)
diff --git a/src/server/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h
index 28a73cff5de..5a6dba7046d 100644
--- a/src/server/game/AI/CoreAI/PassiveAI.h
+++ b/src/server/game/AI/CoreAI/PassiveAI.h
@@ -21,7 +21,7 @@
#include "CreatureAI.h"
-class PassiveAI : public CreatureAI
+class TC_GAME_API PassiveAI : public CreatureAI
{
public:
explicit PassiveAI(Creature* c);
@@ -33,7 +33,7 @@ class PassiveAI : public CreatureAI
static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; }
};
-class PossessedAI : public CreatureAI
+class TC_GAME_API PossessedAI : public CreatureAI
{
public:
explicit PossessedAI(Creature* c);
@@ -41,7 +41,7 @@ class PossessedAI : public CreatureAI
void MoveInLineOfSight(Unit*) override { }
void AttackStart(Unit* target) override;
void UpdateAI(uint32) override;
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
void JustDied(Unit*) override;
void KilledUnit(Unit* victim) override;
@@ -49,7 +49,7 @@ class PossessedAI : public CreatureAI
static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; }
};
-class NullCreatureAI : public CreatureAI
+class TC_GAME_API NullCreatureAI : public CreatureAI
{
public:
explicit NullCreatureAI(Creature* c);
@@ -57,22 +57,22 @@ class NullCreatureAI : public CreatureAI
void MoveInLineOfSight(Unit*) override { }
void AttackStart(Unit*) override { }
void UpdateAI(uint32) override { }
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
void OnCharmed(bool /*apply*/) override { }
static int Permissible(const Creature*) { return PERMIT_BASE_IDLE; }
};
-class CritterAI : public PassiveAI
+class TC_GAME_API CritterAI : public PassiveAI
{
public:
explicit CritterAI(Creature* c) : PassiveAI(c) { }
void DamageTaken(Unit* done_by, uint32& /*damage*/) override;
- void EnterEvadeMode() override;
+ void EnterEvadeMode(EvadeReason why) override;
};
-class TriggerAI : public NullCreatureAI
+class TC_GAME_API TriggerAI : public NullCreatureAI
{
public:
explicit TriggerAI(Creature* c) : NullCreatureAI(c) { }
diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp
index 2bf31a8be06..46a0342fea5 100644
--- a/src/server/game/AI/CoreAI/PetAI.cpp
+++ b/src/server/game/AI/CoreAI/PetAI.cpp
@@ -148,15 +148,15 @@ void PetAI::UpdateAI(uint32 diff)
if (me->GetCharmInfo() && me->GetSpellHistory()->HasGlobalCooldown(spellInfo))
continue;
+
+ // check spell cooldown
+ if (!me->GetSpellHistory()->IsReady(spellInfo))
+ continue;
if (spellInfo->IsPositive())
{
if (spellInfo->CanBeUsedInCombat())
{
- // check spell cooldown
- if (!me->GetSpellHistory()->IsReady(spellInfo))
- continue;
-
// Check if we're in combat or commanded to attack
if (!me->IsInCombat() && !me->GetCharmInfo()->IsCommandAttack())
continue;
diff --git a/src/server/game/AI/CoreAI/PetAI.h b/src/server/game/AI/CoreAI/PetAI.h
index 9f220e64bfb..3ad34047b01 100644
--- a/src/server/game/AI/CoreAI/PetAI.h
+++ b/src/server/game/AI/CoreAI/PetAI.h
@@ -25,7 +25,7 @@
class Creature;
class Spell;
-class PetAI : public CreatureAI
+class TC_GAME_API PetAI : public CreatureAI
{
public:
@@ -47,7 +47,7 @@ class PetAI : public CreatureAI
//
void MoveInLineOfSight(Unit* /*who*/) override { } // CreatureAI interferes with returning pets
void MoveInLineOfSight_Safe(Unit* /*who*/) { } // CreatureAI interferes with returning pets
- void EnterEvadeMode() override { } // For fleeing, pets don't use this type of Evade mechanic
+ void EnterEvadeMode(EvadeReason /*why*/) override { } // For fleeing, pets don't use this type of Evade mechanic
private:
bool _isVisible(Unit*) const;
diff --git a/src/server/game/AI/CoreAI/ReactorAI.h b/src/server/game/AI/CoreAI/ReactorAI.h
index e5abaac2f00..d281ca11fdf 100644
--- a/src/server/game/AI/CoreAI/ReactorAI.h
+++ b/src/server/game/AI/CoreAI/ReactorAI.h
@@ -23,7 +23,7 @@
class Unit;
-class ReactorAI : public CreatureAI
+class TC_GAME_API ReactorAI : public CreatureAI
{
public:
diff --git a/src/server/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp
index 3c34ea88e39..48459ce0cd1 100644
--- a/src/server/game/AI/CoreAI/TotemAI.cpp
+++ b/src/server/game/AI/CoreAI/TotemAI.cpp
@@ -40,7 +40,7 @@ TotemAI::TotemAI(Creature* c) : CreatureAI(c), i_victimGuid()
void TotemAI::MoveInLineOfSight(Unit* /*who*/) { }
-void TotemAI::EnterEvadeMode()
+void TotemAI::EnterEvadeMode(EvadeReason /*why*/)
{
me->CombatStop(true);
}
diff --git a/src/server/game/AI/CoreAI/TotemAI.h b/src/server/game/AI/CoreAI/TotemAI.h
index fdde303c7b2..a0e796ed7e0 100644
--- a/src/server/game/AI/CoreAI/TotemAI.h
+++ b/src/server/game/AI/CoreAI/TotemAI.h
@@ -25,7 +25,7 @@
class Creature;
class Totem;
-class TotemAI : public CreatureAI
+class TC_GAME_API TotemAI : public CreatureAI
{
public:
@@ -33,7 +33,7 @@ class TotemAI : public CreatureAI
void MoveInLineOfSight(Unit* who) override;
void AttackStart(Unit* victim) override;
- void EnterEvadeMode() override;
+ void EnterEvadeMode(EvadeReason /*why*/) override;
void UpdateAI(uint32 diff) override;
static int Permissible(Creature const* creature);
diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h
index b43e61b6c6e..ea001ceda32 100644
--- a/src/server/game/AI/CoreAI/UnitAI.h
+++ b/src/server/game/AI/CoreAI/UnitAI.h
@@ -40,7 +40,7 @@ enum SelectAggroTarget
};
// default predicate function to select target based on distance, player and/or aura criteria
-struct DefaultTargetSelector : public std::unary_function<Unit*, bool>
+struct TC_GAME_API DefaultTargetSelector : public std::unary_function<Unit*, bool>
{
const Unit* me;
float m_dist;
@@ -90,7 +90,7 @@ struct DefaultTargetSelector : public std::unary_function<Unit*, bool>
// Target selector for spell casts checking range, auras and attributes
/// @todo Add more checks from Spell::CheckCast
-struct SpellTargetSelector : public std::unary_function<Unit*, bool>
+struct TC_GAME_API SpellTargetSelector : public std::unary_function<Unit*, bool>
{
public:
SpellTargetSelector(Unit* caster, uint32 spellId);
@@ -104,7 +104,7 @@ struct SpellTargetSelector : public std::unary_function<Unit*, bool>
// Very simple target selector, will just skip main target
// NOTE: When passing to UnitAI::SelectTarget remember to use 0 as position for random selection
// because tank will not be in the temporary list
-struct NonTankTargetSelector : public std::unary_function<Unit*, bool>
+struct TC_GAME_API NonTankTargetSelector : public std::unary_function<Unit*, bool>
{
public:
NonTankTargetSelector(Creature* source, bool playerOnly = true) : _source(source), _playerOnly(playerOnly) { }
@@ -115,7 +115,7 @@ struct NonTankTargetSelector : public std::unary_function<Unit*, bool>
bool _playerOnly;
};
-class UnitAI
+class TC_GAME_API UnitAI
{
protected:
Unit* const me;
@@ -264,7 +264,7 @@ class UnitAI
UnitAI& operator=(UnitAI const& right) = delete;
};
-class PlayerAI : public UnitAI
+class TC_GAME_API PlayerAI : public UnitAI
{
protected:
Player* const me;
@@ -274,7 +274,7 @@ class PlayerAI : public UnitAI
void OnCharmed(bool apply) override;
};
-class SimpleCharmedAI : public PlayerAI
+class TC_GAME_API SimpleCharmedAI : public PlayerAI
{
public:
void UpdateAI(uint32 diff) override;
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index e94f5a037a3..8ef8940e89f 100644
--- a/src/server/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
@@ -26,6 +26,7 @@
#include "MapReference.h"
#include "Player.h"
#include "CreatureTextMgr.h"
+#include "Language.h"
//Disable CreatureAI when charmed
void CreatureAI::OnCharmed(bool /*apply*/)
@@ -164,9 +165,9 @@ void CreatureAI::TriggerAlert(Unit const* who) const
me->GetMotionMaster()->MoveDistract(5 * IN_MILLISECONDS);
}
-void CreatureAI::EnterEvadeMode()
+void CreatureAI::EnterEvadeMode(EvadeReason why)
{
- if (!_EnterEvadeMode())
+ if (!_EnterEvadeMode(why))
return;
TC_LOG_DEBUG("entities.unit", "Creature %u enters evade mode.", me->GetEntry());
@@ -241,14 +242,14 @@ bool CreatureAI::UpdateVictim()
}
else if (me->getThreatManager().isThreatListEmpty())
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_NO_HOSTILES);
return false;
}
return true;
}
-bool CreatureAI::_EnterEvadeMode()
+bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/)
{
if (!me->IsAlive())
return false;
@@ -271,6 +272,105 @@ bool CreatureAI::_EnterEvadeMode()
return true;
}
+#define BOUNDARY_VISUALIZE_CREATURE 15425
+#define BOUNDARY_VISUALIZE_CREATURE_SCALE 0.25f
+#define BOUNDARY_VISUALIZE_STEP_SIZE 1
+#define BOUNDARY_VISUALIZE_FAILSAFE_LIMIT 750
+#define BOUNDARY_VISUALIZE_SPAWN_HEIGHT 5
+int32 CreatureAI::VisualizeBoundary(uint32 duration, Unit* owner, bool fill) const
+{
+ typedef std::pair<int32, int32> coordinate;
+
+ if (!owner)
+ return -1;
+
+ if (!_boundary || _boundary->empty())
+ return LANG_CREATURE_MOVEMENT_NOT_BOUNDED;
+
+ std::queue<coordinate> Q;
+ std::unordered_set<coordinate> alreadyChecked;
+ std::unordered_set<coordinate> outOfBounds;
+
+ Position startPosition = owner->GetPosition();
+ if (!CheckBoundary(&startPosition)) // fall back to creature position
+ {
+ startPosition = me->GetPosition();
+ if (!CheckBoundary(&startPosition))
+ {
+ startPosition = me->GetHomePosition();
+ if (!CheckBoundary(&startPosition)) // fall back to creature home position
+ return LANG_CREATURE_NO_INTERIOR_POINT_FOUND;
+ }
+ }
+ float spawnZ = startPosition.GetPositionZ() + BOUNDARY_VISUALIZE_SPAWN_HEIGHT;
+
+ bool boundsWarning = false;
+ Q.push({ 0,0 });
+ while (!Q.empty())
+ {
+ coordinate front = Q.front();
+ bool hasOutOfBoundsNeighbor = false;
+ for (coordinate off : std::initializer_list<coordinate>{{1,0}, {0,1}, {-1,0}, {0,-1}})
+ {
+ coordinate next(front.first + off.first, front.second + off.second);
+ if (next.first > BOUNDARY_VISUALIZE_FAILSAFE_LIMIT || next.first < -BOUNDARY_VISUALIZE_FAILSAFE_LIMIT || next.second > BOUNDARY_VISUALIZE_FAILSAFE_LIMIT || next.second < -BOUNDARY_VISUALIZE_FAILSAFE_LIMIT)
+ {
+ boundsWarning = true;
+ continue;
+ }
+ if (alreadyChecked.find(next) == alreadyChecked.end()) // never check a coordinate twice
+ {
+ Position nextPos(startPosition.GetPositionX() + next.first*BOUNDARY_VISUALIZE_STEP_SIZE, startPosition.GetPositionY() + next.second*BOUNDARY_VISUALIZE_STEP_SIZE, startPosition.GetPositionZ());
+ if (CheckBoundary(&nextPos))
+ Q.push(next);
+ else
+ {
+ outOfBounds.insert(next);
+ hasOutOfBoundsNeighbor = true;
+ }
+ alreadyChecked.insert(next);
+ }
+ else
+ if (outOfBounds.find(next) != outOfBounds.end())
+ hasOutOfBoundsNeighbor = true;
+ }
+ if (fill || hasOutOfBoundsNeighbor)
+ if (TempSummon* point = owner->SummonCreature(BOUNDARY_VISUALIZE_CREATURE, Position(startPosition.GetPositionX() + front.first*BOUNDARY_VISUALIZE_STEP_SIZE, startPosition.GetPositionY() + front.second*BOUNDARY_VISUALIZE_STEP_SIZE, spawnZ), TEMPSUMMON_TIMED_DESPAWN, duration * IN_MILLISECONDS))
+ {
+ point->SetObjectScale(BOUNDARY_VISUALIZE_CREATURE_SCALE);
+ point->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_STUNNED | UNIT_FLAG_IMMUNE_TO_NPC);
+ if (!hasOutOfBoundsNeighbor)
+ point->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+ Q.pop();
+ }
+ return boundsWarning ? LANG_CREATURE_MOVEMENT_MAYBE_UNBOUNDED : 0;
+}
+
+bool CreatureAI::CheckBoundary(Position* who) const
+{
+ if (!who)
+ who = me;
+
+ if (_boundary)
+ for (CreatureBoundary::const_iterator it = _boundary->begin(); it != _boundary->end(); ++it)
+ if (!(*it)->IsWithinBoundary(who))
+ return false;
+
+ return true;
+}
+
+bool CreatureAI::CheckInRoom()
+{
+ if (CheckBoundary())
+ return true;
+ else
+ {
+ EnterEvadeMode(EVADE_REASON_BOUNDARY);
+ return false;
+ }
+}
+
Creature* CreatureAI::DoSummon(uint32 entry, const Position& pos, uint32 despawnTime, TempSummonType summonType)
{
return me->SummonCreature(entry, pos, summonType, despawnTime);
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index 0a2cce723dc..f2108ef2b3f 100644
--- a/src/server/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
@@ -21,6 +21,7 @@
#include "Creature.h"
#include "UnitAI.h"
+#include "AreaBoundary.h"
#include "Common.h"
class WorldObject;
@@ -63,7 +64,8 @@ enum SCEquip
EQUIP_UNEQUIP = 0
};
-class CreatureAI : public UnitAI
+typedef std::set<AreaBoundary const*> CreatureBoundary;
+class TC_GAME_API CreatureAI : public UnitAI
{
protected:
Creature* const me;
@@ -77,10 +79,20 @@ class CreatureAI : public UnitAI
Creature* DoSummon(uint32 entry, WorldObject* obj, float radius = 5.0f, uint32 despawnTime = 30000, TempSummonType summonType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
Creature* DoSummonFlyer(uint32 entry, WorldObject* obj, float flightZ, float radius = 5.0f, uint32 despawnTime = 30000, TempSummonType summonType = TEMPSUMMON_CORPSE_TIMED_DESPAWN);
+ bool CheckBoundary(Position* who = nullptr) const;
+ void SetBoundary(CreatureBoundary const* boundary) { _boundary = boundary; me->DoImmediateBoundaryCheck(); }
public:
+ enum EvadeReason
+ {
+ EVADE_REASON_NO_HOSTILES, // the creature's threat list is empty
+ EVADE_REASON_BOUNDARY, // the creature has moved outside its evade boundary
+ EVADE_REASON_SEQUENCE_BREAK, // this is a boss and the pre-requisite encounters for engaging it are not defeated yet
+ EVADE_REASON_OTHER
+ };
+
void Talk(uint8 id, WorldObject const* whisperTarget = nullptr);
- explicit CreatureAI(Creature* creature) : UnitAI(creature), me(creature), m_MoveInLineOfSight_locked(false) { }
+ explicit CreatureAI(Creature* creature) : UnitAI(creature), me(creature), _boundary(nullptr), m_MoveInLineOfSight_locked(false) { }
virtual ~CreatureAI() { }
@@ -96,7 +108,7 @@ class CreatureAI : public UnitAI
virtual bool CanRespawn() { return true; }
// Called for reaction at stopping attack at no attackers or targets
- virtual void EnterEvadeMode();
+ virtual void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER);
// Called for reaction at enter to combat if not in combat yet (enemy can be NULL)
virtual void EnterCombat(Unit* /*victim*/) { }
@@ -124,8 +136,8 @@ class CreatureAI : public UnitAI
virtual void AttackedBy(Unit* /*attacker*/) { }
virtual bool IsEscorted() const { return false; }
- // Called when creature is spawned or respawned (for reseting variables)
- virtual void JustRespawned() { Reset(); }
+ // Called when creature is spawned or respawned
+ virtual void JustRespawned() { }
// Called at waypoint reached or point movement finished
virtual void MovementInform(uint32 /*type*/, uint32 /*id*/) { }
@@ -174,10 +186,17 @@ class CreatureAI : public UnitAI
virtual bool CanSeeAlways(WorldObject const* /*obj*/) { return false; }
+ // intended for encounter design/debugging. do not use for other purposes. expensive.
+ int32 VisualizeBoundary(uint32 duration, Unit* owner=nullptr, bool fill=false) const;
+ virtual bool CheckInRoom();
+ CreatureBoundary const* GetBoundary() const { return _boundary; }
+
protected:
virtual void MoveInLineOfSight(Unit* /*who*/);
- bool _EnterEvadeMode();
+ bool _EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER);
+
+ CreatureBoundary const* _boundary;
private:
bool m_MoveInLineOfSight_locked;
diff --git a/src/server/game/AI/CreatureAISelector.h b/src/server/game/AI/CreatureAISelector.h
index 7c7bc705ade..0e3be1a8604 100644
--- a/src/server/game/AI/CreatureAISelector.h
+++ b/src/server/game/AI/CreatureAISelector.h
@@ -27,9 +27,9 @@ class GameObject;
namespace FactorySelector
{
- CreatureAI* selectAI(Creature*);
- MovementGenerator* selectMovementGenerator(Creature*);
- GameObjectAI* SelectGameObjectAI(GameObject*);
+ TC_GAME_API CreatureAI* selectAI(Creature*);
+ TC_GAME_API MovementGenerator* selectMovementGenerator(Creature*);
+ TC_GAME_API GameObjectAI* SelectGameObjectAI(GameObject*);
}
#endif
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index c2ddd1e9e8e..87c7f2083af 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -23,6 +23,7 @@
#include "Cell.h"
#include "CellImpl.h"
#include "ObjectMgr.h"
+#include "AreaBoundary.h"
// Spell summary for ScriptedAI::SelectSpell
struct TSpellSummary
@@ -98,7 +99,6 @@ bool SummonList::HasEntry(uint32 entry) const
ScriptedAI::ScriptedAI(Creature* creature) : CreatureAI(creature),
IsFleeing(false),
- _evadeCheckCooldown(2500),
_isCombatMovementAllowed(true)
{
_isHeroic = me->GetMap()->IsHeroic();
@@ -394,7 +394,7 @@ enum NPCs
// Hacklike storage used for misc creatures that are expected to evade of outside of a certain area.
// It is assumed the information is found elswehere and can be handled by the core. So far no luck finding such information/way to extract it.
-bool ScriptedAI::EnterEvadeIfOutOfCombatArea(uint32 const diff)
+/*bool ScriptedAI::EnterEvadeIfOutOfCombatArea(uint32 const diff)
{
if (_evadeCheckCooldown <= diff)
_evadeCheckCooldown = 2500;
@@ -438,15 +438,16 @@ bool ScriptedAI::EnterEvadeIfOutOfCombatArea(uint32 const diff)
EnterEvadeMode();
return true;
-}
+}*/
// BossAI - for instanced bosses
BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature),
instance(creature->GetInstanceScript()),
summons(creature),
- _boundary(instance ? instance->GetBossBoundary(bossId) : NULL),
_bossId(bossId)
{
+ if (instance)
+ SetBoundary(instance->GetBossBoundary(bossId));
scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
@@ -483,7 +484,7 @@ void BossAI::_EnterCombat()
// bosses do not respawn, check only on enter combat
if (!instance->CheckRequiredBosses(_bossId))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_SEQUENCE_BREAK);
return;
}
instance->SetBossState(_bossId, IN_PROGRESS);
@@ -507,55 +508,6 @@ void BossAI::TeleportCheaters()
target->NearTeleportTo(x, y, z, 0);
}
-bool BossAI::CheckBoundary(Unit* who)
-{
- if (!GetBoundary() || !who)
- return true;
-
- for (BossBoundaryMap::const_iterator itr = GetBoundary()->begin(); itr != GetBoundary()->end(); ++itr)
- {
- switch (itr->first)
- {
- case BOUNDARY_N:
- if (who->GetPositionX() > itr->second)
- return false;
- break;
- case BOUNDARY_S:
- if (who->GetPositionX() < itr->second)
- return false;
- break;
- case BOUNDARY_E:
- if (who->GetPositionY() < itr->second)
- return false;
- break;
- case BOUNDARY_W:
- if (who->GetPositionY() > itr->second)
- return false;
- break;
- case BOUNDARY_NW:
- if (who->GetPositionX() + who->GetPositionY() > itr->second)
- return false;
- break;
- case BOUNDARY_SE:
- if (who->GetPositionX() + who->GetPositionY() < itr->second)
- return false;
- break;
- case BOUNDARY_NE:
- if (who->GetPositionX() - who->GetPositionY() > itr->second)
- return false;
- break;
- case BOUNDARY_SW:
- if (who->GetPositionX() - who->GetPositionY() < itr->second)
- return false;
- break;
- default:
- break;
- }
- }
-
- return true;
-}
-
void BossAI::JustSummoned(Creature* summon)
{
summons.Summon(summon);
@@ -656,27 +608,27 @@ void WorldBossAI::UpdateAI(uint32 diff)
}
// SD2 grid searchers.
-Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float maxSearchRange, bool alive /*= true*/)
+TC_GAME_API Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float maxSearchRange, bool alive /*= true*/)
{
return source->FindNearestCreature(entry, maxSearchRange, alive);
}
-GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange)
+TC_GAME_API GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange)
{
return source->FindNearestGameObject(entry, maxSearchRange);
}
-void GetCreatureListWithEntryInGrid(std::list<Creature*>& list, WorldObject* source, uint32 entry, float maxSearchRange)
+TC_GAME_API void GetCreatureListWithEntryInGrid(std::list<Creature*>& list, WorldObject* source, uint32 entry, float maxSearchRange)
{
source->GetCreatureListWithEntryInGrid(list, entry, maxSearchRange);
}
-void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& list, WorldObject* source, uint32 entry, float maxSearchRange)
+TC_GAME_API void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& list, WorldObject* source, uint32 entry, float maxSearchRange)
{
source->GetGameObjectListWithEntryInGrid(list, entry, maxSearchRange);
}
-void GetPlayerListInGrid(std::list<Player*>& list, WorldObject* source, float maxSearchRange)
+TC_GAME_API void GetPlayerListInGrid(std::list<Player*>& list, WorldObject* source, float maxSearchRange)
{
source->GetPlayerListInGrid(list, maxSearchRange);
}
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
index 87c1a63d4e4..56e4b8bf780 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
@@ -38,7 +38,7 @@ T* EnsureAI(U* ai)
class InstanceScript;
-class SummonList
+class TC_GAME_API SummonList
{
public:
typedef GuidList StorageType;
@@ -123,7 +123,7 @@ private:
StorageType storage_;
};
-class EntryCheckPredicate
+class TC_GAME_API EntryCheckPredicate
{
public:
EntryCheckPredicate(uint32 entry) : _entry(entry) { }
@@ -133,13 +133,13 @@ class EntryCheckPredicate
uint32 _entry;
};
-class DummyEntryCheckPredicate
+class TC_GAME_API DummyEntryCheckPredicate
{
public:
bool operator()(ObjectGuid) { return true; }
};
-struct ScriptedAI : public CreatureAI
+struct TC_GAME_API ScriptedAI : public CreatureAI
{
explicit ScriptedAI(Creature* creature);
virtual ~ScriptedAI() { }
@@ -260,8 +260,6 @@ struct ScriptedAI : public CreatureAI
void SetCombatMovement(bool allowMovement);
bool IsCombatMovementAllowed() const { return _isCombatMovementAllowed; }
- bool EnterEvadeIfOutOfCombatArea(uint32 const diff);
-
// return true for heroic mode. i.e.
// - for dungeon in mode 10-heroic,
// - for raid in mode 10-Heroic
@@ -329,19 +327,17 @@ struct ScriptedAI : public CreatureAI
private:
Difficulty _difficulty;
- uint32 _evadeCheckCooldown;
bool _isCombatMovementAllowed;
bool _isHeroic;
};
-class BossAI : public ScriptedAI
+class TC_GAME_API BossAI : public ScriptedAI
{
public:
BossAI(Creature* creature, uint32 bossId);
virtual ~BossAI() { }
InstanceScript* const instance;
- BossBoundaryMap const* GetBoundary() const { return _boundary; }
void JustSummoned(Creature* summon) override;
void SummonedCreatureDespawn(Creature* summon) override;
@@ -368,16 +364,6 @@ class BossAI : public ScriptedAI
void _JustReachedHome() { me->setActive(false); }
void _DespawnAtEvade();
- virtual bool CheckInRoom()
- {
- if (CheckBoundary(me))
- return true;
-
- EnterEvadeMode();
- return false;
- }
-
- bool CheckBoundary(Unit* who);
void TeleportCheaters();
EventMap events;
@@ -385,11 +371,10 @@ class BossAI : public ScriptedAI
TaskScheduler scheduler;
private:
- BossBoundaryMap const* const _boundary;
uint32 const _bossId;
};
-class WorldBossAI : public ScriptedAI
+class TC_GAME_API WorldBossAI : public ScriptedAI
{
public:
WorldBossAI(Creature* creature);
@@ -420,10 +405,10 @@ class WorldBossAI : public ScriptedAI
};
// SD2 grid searchers.
-Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float maxSearchRange, bool alive = true);
-GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange);
-void GetCreatureListWithEntryInGrid(std::list<Creature*>& list, WorldObject* source, uint32 entry, float maxSearchRange);
-void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& list, WorldObject* source, uint32 entry, float maxSearchRange);
-void GetPlayerListInGrid(std::list<Player*>& list, WorldObject* source, float maxSearchRange);
+TC_GAME_API Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float maxSearchRange, bool alive = true);
+TC_GAME_API GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange);
+TC_GAME_API void GetCreatureListWithEntryInGrid(std::list<Creature*>& list, WorldObject* source, uint32 entry, float maxSearchRange);
+TC_GAME_API void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& list, WorldObject* source, uint32 entry, float maxSearchRange);
+TC_GAME_API void GetPlayerListInGrid(std::list<Player*>& list, WorldObject* source, float maxSearchRange);
#endif // SCRIPTEDCREATURE_H_
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index cd2288364c1..6e8a2def3e3 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -184,7 +184,7 @@ void npc_escortAI::ReturnToLastPoint()
me->GetMotionMaster()->MovePoint(POINT_LAST_POINT, x, y, z);
}
-void npc_escortAI::EnterEvadeMode()
+void npc_escortAI::EnterEvadeMode(EvadeReason /*why*/)
{
me->RemoveAllAuras();
me->DeleteThreatList();
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
index 3b7428e2b9e..37a1464d812 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
@@ -49,7 +49,7 @@ enum eEscortState
STATE_ESCORT_PAUSED = 0x004 //will not proceed with waypoints before state is removed
};
-struct npc_escortAI : public ScriptedAI
+struct TC_GAME_API npc_escortAI : public ScriptedAI
{
public:
explicit npc_escortAI(Creature* creature);
@@ -66,7 +66,7 @@ struct npc_escortAI : public ScriptedAI
void ReturnToLastPoint();
- void EnterEvadeMode() override;
+ void EnterEvadeMode(EvadeReason /*why*/ = EVADE_REASON_OTHER) override;
void UpdateAI(uint32 diff) override; // the "internal" update, calls UpdateEscortAI()
virtual void UpdateEscortAI(uint32 diff); // used when it's needed to add code in update (abilities, scripted events, etc)
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
index 3fbd6b9a834..583e99b9d10 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
@@ -176,7 +176,7 @@ void FollowerAI::JustRespawned()
Reset();
}
-void FollowerAI::EnterEvadeMode()
+void FollowerAI::EnterEvadeMode(EvadeReason /*why*/)
{
me->RemoveAllAuras();
me->DeleteThreatList();
diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
index f3919ea63bc..e17fb7c8507 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
@@ -32,7 +32,7 @@ enum eFollowState
STATE_FOLLOW_POSTEVENT = 0x020 //can be set at complete and allow post event to run
};
-class FollowerAI : public ScriptedAI
+class TC_GAME_API FollowerAI : public ScriptedAI
{
public:
explicit FollowerAI(Creature* creature);
@@ -46,7 +46,7 @@ class FollowerAI : public ScriptedAI
void MoveInLineOfSight(Unit*) override;
- void EnterEvadeMode() override;
+ void EnterEvadeMode(EvadeReason /*why*/ = EVADE_REASON_OTHER) override;
void JustDied(Unit*) override;
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 001fd259996..2dec1d0fc4c 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -408,7 +408,7 @@ void SmartAI::MovementInform(uint32 MovementType, uint32 Data)
MovepointReached(Data);
}
-void SmartAI::EnterEvadeMode()
+void SmartAI::EnterEvadeMode(EvadeReason /*why*/)
{
if (!me->IsAlive() || me->IsInEvadeMode())
return;
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index cfc8fbe785d..aa7c9ace0b3 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -42,7 +42,7 @@ enum SmartEscortVars
SMART_MAX_AID_DIST = SMART_ESCORT_MAX_PLAYER_DIST / 2
};
-class SmartAI : public CreatureAI
+class TC_GAME_API SmartAI : public CreatureAI
{
public:
~SmartAI(){ }
@@ -79,7 +79,7 @@ class SmartAI : public CreatureAI
void EnterCombat(Unit* enemy) override;
// Called for reaction at stopping attack at no attackers or targets
- void EnterEvadeMode() override;
+ void EnterEvadeMode(EvadeReason why = EVADE_REASON_OTHER) override;
// Called when the creature is killed
void JustDied(Unit* killer) override;
@@ -230,7 +230,7 @@ class SmartAI : public CreatureAI
bool mJustReset;
};
-class SmartGameObjectAI : public GameObjectAI
+class TC_GAME_API SmartGameObjectAI : public GameObjectAI
{
public:
SmartGameObjectAI(GameObject* g) : GameObjectAI(g) { }
@@ -257,4 +257,8 @@ class SmartGameObjectAI : public GameObjectAI
private:
SmartScript mScript;
};
+
+/// Registers scripts required by the SAI scripting system
+void AddSC_SmartScripts();
+
#endif
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 95792fead3c..0ea3afa08f9 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -28,7 +28,7 @@
#include "SmartScriptMgr.h"
//#include "SmartAI.h"
-class SmartScript
+class TC_GAME_API SmartScript
{
public:
SmartScript();
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index b02906a7164..d249bf8c42c 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -28,6 +28,12 @@
#include "SmartScriptMgr.h"
+SmartWaypointMgr* SmartWaypointMgr::instance()
+{
+ static SmartWaypointMgr instance;
+ return &instance;
+}
+
void SmartWaypointMgr::LoadFromDB()
{
uint32 oldMSTime = getMSTime();
@@ -99,6 +105,12 @@ SmartWaypointMgr::~SmartWaypointMgr()
}
}
+SmartAIMgr* SmartAIMgr::instance()
+{
+ static SmartAIMgr instance;
+ return &instance;
+}
+
void SmartAIMgr::LoadSmartAIFromDB()
{
LoadHelperStores();
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 00d3e97e19f..87d23b077b1 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -1435,18 +1435,14 @@ public:
};
typedef std::unordered_map<uint32, ObjectGuidList*> ObjectListMap;
-class SmartWaypointMgr
+class TC_GAME_API SmartWaypointMgr
{
private:
SmartWaypointMgr() { }
~SmartWaypointMgr();
public:
- static SmartWaypointMgr* instance()
- {
- static SmartWaypointMgr instance;
- return &instance;
- }
+ static SmartWaypointMgr* instance();
void LoadFromDB();
@@ -1471,18 +1467,14 @@ typedef std::unordered_map<int64, SmartAIEventList> SmartAIEventMap;
typedef std::map<uint32 /*entry*/, std::pair<uint32 /*spellId*/, SpellEffIndex /*effIndex*/> > CacheSpellContainer;
typedef std::pair<CacheSpellContainer::const_iterator, CacheSpellContainer::const_iterator> CacheSpellContainerBounds;
-class SmartAIMgr
+class TC_GAME_API SmartAIMgr
{
private:
SmartAIMgr() { }
~SmartAIMgr() { }
public:
- static SmartAIMgr* instance()
- {
- static SmartAIMgr instance;
- return &instance;
- }
+ static SmartAIMgr* instance();
void LoadSmartAIFromDB();
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index d5d62908e53..81d071881fe 100644
--- a/src/server/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
@@ -33,6 +33,12 @@ AccountMgr::~AccountMgr()
ClearRBAC();
}
+AccountMgr* AccountMgr::instance()
+{
+ static AccountMgr instance;
+ return &instance;
+}
+
AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password, std::string email /*= ""*/, uint32 bnetAccountId /*= 0*/, uint8 bnetIndex /*= 0*/)
{
if (utf8length(username) > MAX_ACCOUNT_STR)
diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h
index 1addf82e986..d0a80f983db 100644
--- a/src/server/game/Accounts/AccountMgr.h
+++ b/src/server/game/Accounts/AccountMgr.h
@@ -50,18 +50,14 @@ typedef std::map<uint32, rbac::RBACPermission*> RBACPermissionsContainer;
typedef std::map<uint8, rbac::RBACPermissionContainer> RBACDefaultPermissionsContainer;
}
-class AccountMgr
+class TC_GAME_API AccountMgr
{
private:
AccountMgr();
~AccountMgr();
public:
- static AccountMgr* instance()
- {
- static AccountMgr instance;
- return &instance;
- }
+ static AccountMgr* instance();
AccountOpResult CreateAccount(std::string username, std::string password, std::string email = "", uint32 bnetAccountId = 0, uint8 bnetIndex = 0);
static AccountOpResult DeleteAccount(uint32 accountId);
diff --git a/src/server/game/Accounts/BattlenetAccountMgr.h b/src/server/game/Accounts/BattlenetAccountMgr.h
index ef47a3e5c93..1888e782616 100644
--- a/src/server/game/Accounts/BattlenetAccountMgr.h
+++ b/src/server/game/Accounts/BattlenetAccountMgr.h
@@ -29,18 +29,18 @@ namespace Battlenet
{
namespace AccountMgr
{
- AccountOpResult CreateBattlenetAccount(std::string email, std::string password, bool withGameAccount = true);
- AccountOpResult ChangePassword(uint32 accountId, std::string newPassword);
- bool CheckPassword(uint32 accountId, std::string password);
- AccountOpResult LinkWithGameAccount(std::string const& email, std::string const& gameAccountName);
- AccountOpResult UnlinkGameAccount(std::string const& gameAccountName);
-
- uint32 GetId(std::string const& username);
- bool GetName(uint32 accountId, std::string& name);
- uint32 GetIdByGameAccount(uint32 gameAccountId);
- uint8 GetMaxIndex(uint32 accountId);
-
- std::string CalculateShaPassHash(std::string const& name, std::string const& password);
+ TC_GAME_API AccountOpResult CreateBattlenetAccount(std::string email, std::string password, bool withGameAccount = true);
+ TC_GAME_API AccountOpResult ChangePassword(uint32 accountId, std::string newPassword);
+ TC_GAME_API bool CheckPassword(uint32 accountId, std::string password);
+ TC_GAME_API AccountOpResult LinkWithGameAccount(std::string const& email, std::string const& gameAccountName);
+ TC_GAME_API AccountOpResult UnlinkGameAccount(std::string const& gameAccountName);
+
+ TC_GAME_API uint32 GetId(std::string const& username);
+ TC_GAME_API bool GetName(uint32 accountId, std::string& name);
+ TC_GAME_API uint32 GetIdByGameAccount(uint32 gameAccountId);
+ TC_GAME_API uint8 GetMaxIndex(uint32 accountId);
+
+ TC_GAME_API std::string CalculateShaPassHash(std::string const& name, std::string const& password);
}
}
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index d355d4fdfd3..07ad2a2fd4b 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -727,6 +727,7 @@ enum RBACPermissions
RBAC_PERM_COMMAND_TICKET_RESET_SUGGESTION = 833,
RBAC_PERM_COMMAND_GO_QUEST = 834,
RBAC_PERM_COMMAND_DEBUG_LOADCELLS = 835,
+ RBAC_PERM_COMMAND_DEBUG_BOUNDARY = 836,
// custom permissions 1000+
RBAC_PERM_MAX
@@ -744,7 +745,7 @@ enum RBACCommandResult
typedef std::set<uint32> RBACPermissionContainer;
-class RBACPermission
+class TC_GAME_API RBACPermission
{
public:
RBACPermission(uint32 id = 0, std::string const& name = ""):
@@ -779,7 +780,7 @@ class RBACPermission
* - Granted permissions: through linked permissions and directly assigned
* - Denied permissions: through linked permissions and directly assigned
*/
-class RBACData
+class TC_GAME_API RBACData
{
public:
RBACData(uint32 id, std::string const& name, int32 realmId, uint8 secLevel = 255):
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 6462c89a694..219745e0444 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -488,13 +488,7 @@ void AchievementMgr<Guild>::ResetAchievementCriteria(AchievementCriteriaTypes /*
// Not needed
}
-template<class T>
-void AchievementMgr<T>::DeleteFromDB(ObjectGuid /*guid*/)
-{
-}
-
-template<>
-void AchievementMgr<Player>::DeleteFromDB(ObjectGuid guid)
+void DeletePlayerAchievementsFromDB(ObjectGuid guid)
{
SQLTransaction trans = CharacterDatabase.BeginTransaction();
@@ -509,8 +503,7 @@ void AchievementMgr<Player>::DeleteFromDB(ObjectGuid guid)
CharacterDatabase.CommitTransaction(trans);
}
-template<>
-void AchievementMgr<Guild>::DeleteFromDB(ObjectGuid guid)
+void DeleteGuildAchievementsFromDB(ObjectGuid guid)
{
SQLTransaction trans = CharacterDatabase.BeginTransaction();
@@ -529,6 +522,7 @@ template<class T>
void AchievementMgr<T>::SaveToDB(SQLTransaction& /*trans*/)
{
}
+
template<>
void AchievementMgr<Player>::SaveToDB(SQLTransaction& trans)
{
@@ -2584,6 +2578,9 @@ bool AchievementMgr<T>::AdditionalRequirementsSatisfied(ModifierTreeNode const*
return true;
}
+template class TC_GAME_API AchievementMgr<Player>;
+template class TC_GAME_API AchievementMgr<Guild>;
+
char const* AchievementGlobalMgr::GetCriteriaTypeString(uint32 type)
{
return GetCriteriaTypeString(AchievementCriteriaTypes(type));
@@ -2887,8 +2884,11 @@ char const* AchievementGlobalMgr::GetCriteriaTypeString(AchievementCriteriaTypes
return "MISSING_TYPE";
}
-template class AchievementMgr<Guild>;
-template class AchievementMgr<Player>;
+AchievementGlobalMgr* AchievementGlobalMgr::instance()
+{
+ static AchievementGlobalMgr instance;
+ return &instance;
+}
//==========================================================
AchievementGlobalMgr::~AchievementGlobalMgr()
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 60c563683fb..16f4d20614a 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -30,6 +30,7 @@
class Unit;
class Player;
+class Guild;
class WorldPacket;
struct ModifierTreeNode
@@ -233,7 +234,7 @@ struct AchievementCriteriaData
bool Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscValue1 = 0) const;
};
-struct AchievementCriteriaDataSet
+struct TC_GAME_API AchievementCriteriaDataSet
{
AchievementCriteriaDataSet() : criteria_id(0) { }
typedef std::vector<AchievementCriteriaData> Storage;
@@ -284,15 +285,41 @@ enum ProgressType
PROGRESS_HIGHEST
};
+// Hackfix to solve an unresolved issue in clang that the visibility
+// flag is ignored in some explicit template specializations,
+// which prevents clang from exporting the `DeleteFromDB` symbol.
+// https://llvm.org/bugs/show_bug.cgi?id=24815
+// https://llvm.org/bugs/show_bug.cgi?id=23667
+TC_GAME_API void DeletePlayerAchievementsFromDB(ObjectGuid guid);
+TC_GAME_API void DeleteGuildAchievementsFromDB(ObjectGuid guid);
+
+template<typename T>
+struct AchievementMgrDeleterBase;
+
+template<>
+struct AchievementMgrDeleterBase<Player>
+{
+ static void DeleteFromDB(ObjectGuid lowguid) { DeletePlayerAchievementsFromDB(lowguid); }
+};
+
+template<>
+struct AchievementMgrDeleterBase<Guild>
+{
+ static void DeleteFromDB(ObjectGuid lowguid) { DeleteGuildAchievementsFromDB(lowguid); }
+};
+
template<class T>
-class AchievementMgr
+class TC_GAME_API AchievementMgr
+ : public AchievementMgrDeleterBase<T>
{
public:
AchievementMgr(T* owner);
~AchievementMgr();
void Reset();
- static void DeleteFromDB(ObjectGuid lowguid);
+
+ using AchievementMgrDeleterBase<T>::DeleteFromDB;
+
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
void SaveToDB(SQLTransaction& trans);
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
@@ -335,7 +362,7 @@ class AchievementMgr
uint32 _achievementPoints;
};
-class AchievementGlobalMgr
+class TC_GAME_API AchievementGlobalMgr
{
AchievementGlobalMgr() { }
~AchievementGlobalMgr();
@@ -344,11 +371,7 @@ class AchievementGlobalMgr
static char const* GetCriteriaTypeString(AchievementCriteriaTypes type);
static char const* GetCriteriaTypeString(uint32 type);
- static AchievementGlobalMgr* instance()
- {
- static AchievementGlobalMgr instance;
- return &instance;
- }
+ static AchievementGlobalMgr* instance();
AchievementCriteriaTreeList const* GetAchievementCriteriaTreesByCriteria(uint32 criteriaId) const
{
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index b86f00e3295..ce8815dee07 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -45,6 +45,12 @@ AuctionHouseMgr::~AuctionHouseMgr()
delete itr->second;
}
+AuctionHouseMgr* AuctionHouseMgr::instance()
+{
+ static AuctionHouseMgr instance;
+ return &instance;
+}
+
AuctionHouseObject* AuctionHouseMgr::GetAuctionsMap(uint32 factionTemplateId)
{
if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
@@ -71,12 +77,23 @@ uint32 AuctionHouseMgr::GetAuctionDeposit(AuctionHouseEntry const* entry, uint32
float multiplier = CalculatePct(float(entry->DepositRate), 3);
uint32 timeHr = (((time / 60) / 60) / 12);
- uint32 deposit = uint32(((multiplier * MSV * count / 3) * timeHr * 3) * sWorld->getRate(RATE_AUCTION_DEPOSIT));
+ uint32 deposit = uint32(MSV * multiplier * sWorld->getRate(RATE_AUCTION_DEPOSIT));
+ float remainderbase = float(MSV * multiplier * sWorld->getRate(RATE_AUCTION_DEPOSIT)) - deposit;
+
+ deposit *= timeHr * count;
+
+ int i = count;
+ while (i > 0 && (remainderbase * i) != uint32(remainderbase * i))
+ i--;
+
+ if (i)
+ deposit += remainderbase * i * timeHr;
TC_LOG_DEBUG("auctionHouse", "MSV: %u", MSV);
TC_LOG_DEBUG("auctionHouse", "Items: %u", count);
TC_LOG_DEBUG("auctionHouse", "Multiplier: %f", multiplier);
TC_LOG_DEBUG("auctionHouse", "Deposit: %u", deposit);
+ TC_LOG_DEBUG("auctionHouse", "Deposit rm: %f", remainderbase * count);
if (deposit < AH_MINIMUM_DEPOSIT * sWorld->getRate(RATE_AUCTION_DEPOSIT))
return AH_MINIMUM_DEPOSIT * sWorld->getRate(RATE_AUCTION_DEPOSIT);
@@ -379,6 +396,116 @@ bool AuctionHouseMgr::RemoveAItem(ObjectGuid::LowType id, bool deleteItem)
return true;
}
+void AuctionHouseMgr::PendingAuctionAdd(Player* player, AuctionEntry* aEntry)
+{
+ PlayerAuctions* thisAH;
+ auto itr = pendingAuctionMap.find(player->GetGUID());
+ if (itr != pendingAuctionMap.end())
+ thisAH = itr->second.first;
+ else
+ {
+ thisAH = new PlayerAuctions;
+ pendingAuctionMap[player->GetGUID()] = AuctionPair(thisAH, 0);
+ }
+ thisAH->push_back(aEntry);
+}
+
+uint32 AuctionHouseMgr::PendingAuctionCount(const Player* player) const
+{
+ auto const itr = pendingAuctionMap.find(player->GetGUID());
+ if (itr != pendingAuctionMap.end())
+ return itr->second.first->size();
+
+ return 0;
+}
+
+void AuctionHouseMgr::PendingAuctionProcess(Player* player)
+{
+ auto iterMap = pendingAuctionMap.find(player->GetGUID());
+ if (iterMap == pendingAuctionMap.end())
+ return;
+
+ PlayerAuctions* thisAH = iterMap->second.first;
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ uint32 totalItems = 0;
+ for (auto itrAH = thisAH->begin(); itrAH != thisAH->end(); ++itrAH)
+ {
+ AuctionEntry* AH = (*itrAH);
+ totalItems += AH->itemCount;
+ }
+
+ uint32 totaldeposit = 0;
+ auto itr = (*thisAH->begin());
+
+ if (Item* item = GetAItem(itr->itemGUIDLow))
+ totaldeposit = GetAuctionDeposit(itr->auctionHouseEntry, itr->etime, item, totalItems);
+
+ uint32 depositremain = totaldeposit;
+ for (auto itr = thisAH->begin(); itr != thisAH->end(); ++itr)
+ {
+ AuctionEntry* AH = (*itr);
+
+ if (next(itr) == thisAH->end())
+ AH->deposit = depositremain;
+ else
+ {
+ AH->deposit = totaldeposit / thisAH->size();
+ depositremain -= AH->deposit;
+ }
+
+ AH->DeleteFromDB(trans);
+ AH->SaveToDB(trans);
+ }
+
+ CharacterDatabase.CommitTransaction(trans);
+ pendingAuctionMap.erase(player->GetGUID());
+ delete thisAH;
+ player->ModifyMoney(-int32(totaldeposit));
+}
+
+void AuctionHouseMgr::UpdatePendingAuctions()
+{
+ for (auto itr = pendingAuctionMap.begin(); itr != pendingAuctionMap.end();)
+ {
+ ObjectGuid playerGUID = itr->first;
+ if (Player* player = ObjectAccessor::FindConnectedPlayer(playerGUID))
+ {
+ // Check if there were auctions since last update process if not
+ if (PendingAuctionCount(player) == itr->second.second)
+ {
+ ++itr;
+ PendingAuctionProcess(player);
+ }
+ else
+ {
+ ++itr;
+ pendingAuctionMap[playerGUID].second = PendingAuctionCount(player);
+ }
+ }
+ else
+ {
+ // Expire any auctions that we couldn't get a deposit for
+ TC_LOG_WARN("auctionHouse", "Player %s was offline, unable to retrieve deposit!", playerGUID.ToString().c_str());
+ PlayerAuctions* thisAH = itr->second.first;
+ ++itr;
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+ for (auto AHitr = thisAH->begin(); AHitr != thisAH->end();)
+ {
+ AuctionEntry* AH = (*AHitr);
+ ++AHitr;
+ AH->expire_time = time(NULL);
+ AH->DeleteFromDB(trans);
+ AH->SaveToDB(trans);
+ }
+ CharacterDatabase.CommitTransaction(trans);
+ pendingAuctionMap.erase(playerGUID);
+ delete thisAH;
+ }
+ }
+}
+
void AuctionHouseMgr::Update()
{
mHordeAuctions.Update();
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index 3f747608d9e..ae9a6c1e894 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
@@ -24,6 +24,7 @@
#include "DBCStructure.h"
#include "ObjectGuid.h"
#include "AuctionHousePackets.h"
+#include <set>
class Item;
class Player;
@@ -63,7 +64,7 @@ enum MailAuctionAnswers
AUCTION_SALE_PENDING = 6
};
-struct AuctionEntry
+struct TC_GAME_API AuctionEntry
{
uint32 Id;
ObjectGuid::LowType auctioneer; // creature low guid
@@ -77,6 +78,7 @@ struct AuctionEntry
time_t expire_time;
ObjectGuid::LowType bidder;
uint32 deposit; //deposit can be calculated only when creating auction
+ uint32 etime;
AuctionHouseEntry const* auctionHouseEntry; // in AuctionHouse.dbc
uint32 factionTemplateId;
@@ -95,7 +97,7 @@ struct AuctionEntry
};
//this class is used as auctionhouse instance
-class AuctionHouseObject
+class TC_GAME_API AuctionHouseObject
{
public:
~AuctionHouseObject()
@@ -133,20 +135,18 @@ class AuctionHouseObject
AuctionEntryMap AuctionsMap;
};
-class AuctionHouseMgr
+class TC_GAME_API AuctionHouseMgr
{
private:
AuctionHouseMgr();
~AuctionHouseMgr();
public:
- static AuctionHouseMgr* instance()
- {
- static AuctionHouseMgr instance;
- return &instance;
- }
+ static AuctionHouseMgr* instance();
typedef std::unordered_map<ObjectGuid::LowType, Item*> ItemMap;
+ typedef std::vector<AuctionEntry*> PlayerAuctions;
+ typedef std::pair<PlayerAuctions*, uint32> AuctionPair;
AuctionHouseObject* GetAuctionsMap(uint32 factionTemplateId);
AuctionHouseObject* GetBidsMap(uint32 factionTemplateId);
@@ -179,7 +179,10 @@ class AuctionHouseMgr
void AddAItem(Item* it);
bool RemoveAItem(ObjectGuid::LowType id, bool deleteItem = false);
-
+ void PendingAuctionAdd(Player* player, AuctionEntry* aEntry);
+ uint32 PendingAuctionCount(const Player* player) const;
+ void PendingAuctionProcess(Player* player);
+ void UpdatePendingAuctions();
void Update();
private:
@@ -188,6 +191,8 @@ class AuctionHouseMgr
AuctionHouseObject mAllianceAuctions;
AuctionHouseObject mNeutralAuctions;
+ std::map<ObjectGuid, AuctionPair> pendingAuctionMap;
+
ItemMap mAitems;
};
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp
index eb00798ed54..1f0274572d7 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp
@@ -24,6 +24,12 @@
#include "AuctionHouseBotBuyer.h"
#include "AuctionHouseBotSeller.h"
+AuctionBotConfig* AuctionBotConfig::instance()
+{
+ static AuctionBotConfig instance;
+ return &instance;
+}
+
bool AuctionBotConfig::Initialize()
{
GetConfigFromFile();
@@ -242,6 +248,22 @@ void AuctionBotConfig::GetConfigFromFile()
SetConfig(CONFIG_AHBOT_CLASS_TRADEGOOD_MAX_ITEM_LEVEL, "AuctionHouseBot.Class.TradeGood.ItemLevel.Max", 0);
SetConfig(CONFIG_AHBOT_CLASS_CONTAINER_MIN_ITEM_LEVEL, "AuctionHouseBot.Class.Container.ItemLevel.Min", 0);
SetConfig(CONFIG_AHBOT_CLASS_CONTAINER_MAX_ITEM_LEVEL, "AuctionHouseBot.Class.Container.ItemLevel.Max", 0);
+
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONSUMABLE, "AuctionHouseBot.Class.RandomStackRatio.Consumable", 20);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONTAINER, "AuctionHouseBot.Class.RandomStackRatio.Container", 0);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_WEAPON, "AuctionHouseBot.Class.RandomStackRatio.Weapon", 0);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GEM, "AuctionHouseBot.Class.RandomStackRatio.Gem", 20);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_ARMOR, "AuctionHouseBot.Class.RandomStackRatio.Armor", 0);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_REAGENT, "AuctionHouseBot.Class.RandomStackRatio.Reagent", 100);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_PROJECTILE, "AuctionHouseBot.Class.RandomStackRatio.Projectile", 100);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_TRADEGOOD, "AuctionHouseBot.Class.RandomStackRatio.TradeGood", 50);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GENERIC, "AuctionHouseBot.Class.RandomStackRatio.Generic", 100);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_RECIPE, "AuctionHouseBot.Class.RandomStackRatio.Recipe", 0);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUIVER, "AuctionHouseBot.Class.RandomStackRatio.Quiver", 0);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUEST, "AuctionHouseBot.Class.RandomStackRatio.Quest", 100);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_KEY, "AuctionHouseBot.Class.RandomStackRatio.Key", 100);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_MISC, "AuctionHouseBot.Class.RandomStackRatio.Misc", 100);
+ SetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GLYPH, "AuctionHouseBot.Class.RandomStackRatio.Glyph", 0);
}
char const* AuctionBotConfig::GetHouseTypeName(AuctionHouseType houseType)
@@ -410,6 +432,12 @@ void AuctionHouseBot::Rebuild(bool all)
}
}
+AuctionHouseBot* AuctionHouseBot::instance()
+{
+ static AuctionHouseBot instance;
+ return &instance;
+}
+
void AuctionHouseBot::Update()
{
// nothing do...
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBot.h b/src/server/game/AuctionHouseBot/AuctionHouseBot.h
index 63641fc7da2..1a438e01cdb 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBot.h
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBot.h
@@ -137,6 +137,21 @@ enum AuctionBotConfigUInt32Values
CONFIG_AHBOT_CLASS_TRADEGOOD_MAX_ITEM_LEVEL,
CONFIG_AHBOT_CLASS_CONTAINER_MIN_ITEM_LEVEL,
CONFIG_AHBOT_CLASS_CONTAINER_MAX_ITEM_LEVEL,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONSUMABLE,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONTAINER,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_WEAPON,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GEM,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_ARMOR,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_REAGENT,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_PROJECTILE,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_TRADEGOOD,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GENERIC,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_RECIPE,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUIVER,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUEST,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_KEY,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_MISC,
+ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GLYPH,
CONFIG_UINT32_AHBOT_UINT32_COUNT
};
@@ -181,7 +196,7 @@ enum AuctionBotConfigFloatValues
};
// All basic config data used by other AHBot classes for self-configure.
-class AuctionBotConfig
+class TC_GAME_API AuctionBotConfig
{
private:
AuctionBotConfig(): _itemsPerCycleBoost(1000), _itemsPerCycleNormal(20) {}
@@ -190,11 +205,7 @@ private:
AuctionBotConfig& operator=(const AuctionBotConfig&);
public:
- static AuctionBotConfig* instance()
- {
- static AuctionBotConfig instance;
- return &instance;
- }
+ static AuctionBotConfig* instance();
bool Initialize();
const std::string& GetAHBotIncludes() const { return _AHBotIncludes; }
@@ -259,7 +270,7 @@ typedef AuctionHouseBotStatusInfoPerType AuctionHouseBotStatusInfo[MAX_AUCTION_H
// This class handle both Selling and Buying method
// (holder of AuctionBotBuyer and AuctionBotSeller objects)
-class AuctionHouseBot
+class TC_GAME_API AuctionHouseBot
{
private:
AuctionHouseBot();
@@ -268,11 +279,7 @@ private:
AuctionHouseBot& operator=(const AuctionHouseBot&);
public:
- static AuctionHouseBot* instance()
- {
- static AuctionHouseBot instance;
- return &instance;
- }
+ static AuctionHouseBot* instance();
void Update();
void Initialize();
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h
index e1b6b425c48..979f73c0099 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h
@@ -67,7 +67,7 @@ private:
// This class handle all Buyer method
// (holder of AuctionBotConfig for each auction house type)
-class AuctionBotBuyer : public AuctionBotAgent
+class TC_GAME_API AuctionBotBuyer : public AuctionBotAgent
{
public:
AuctionBotBuyer();
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
index d3215f10db5..2800167add7 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
@@ -533,6 +533,23 @@ void AuctionBotSeller::LoadItemsQuantity(SellerConfiguration& config)
config.SetItemsQuantityPerClass(AUCTION_QUALITY_YELLOW, ITEM_CLASS_GLYPH, 0);
// ============================================================================================
+ // Set Stack Quantities
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_CONSUMABLE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONSUMABLE));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_CONTAINER, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONTAINER));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_WEAPON, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_WEAPON));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_GEM, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GEM));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_ARMOR, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_ARMOR));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_REAGENT, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_REAGENT));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_PROJECTILE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_PROJECTILE));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_TRADE_GOODS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_TRADEGOOD));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_GENERIC, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GENERIC));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_RECIPE, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_RECIPE));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_QUIVER, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUIVER));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_QUEST, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUEST));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_KEY, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_KEY));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_MISCELLANEOUS, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_MISC));
+ config.SetRandomStackRatioPerClass(ITEM_CLASS_GLYPH, sAuctionBotConfig->GetConfig(CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GLYPH));
+
// Set the best value to get nearest amount of items wanted
for (uint32 j = 0; j < MAX_AUCTION_QUALITY; ++j)
{
@@ -719,6 +736,15 @@ void AuctionBotSeller::SetPricesOfItem(ItemTemplate const* itemProto, SellerConf
bidp = urand(basePrice - range, basePrice + range) + 1;
}
+// Determines the stack size to use for the item
+uint32 AuctionBotSeller::GetStackSizeForItem(ItemTemplate const* itemProto, SellerConfiguration& config) const
+{
+ if (config.GetRandomStackRatioPerClass(ItemClass(itemProto->GetClass())) > urand(0, 99))
+ return urand(1, itemProto->GetMaxStackSize());
+ else
+ return 1;
+}
+
// Determine the multiplier for the sell price of any weapon without a buy price.
uint32 AuctionBotSeller::GetSellModifier(ItemTemplate const* prototype)
{
@@ -950,7 +976,7 @@ void AuctionBotSeller::AddNewAuctions(SellerConfiguration& config)
continue;
}
- uint32 stackCount = urand(1, prototype->GetMaxStackSize());
+ uint32 stackCount = GetStackSizeForItem(prototype, config);
Item* item = Item::CreateItem(itemId, stackCount);
if (!item)
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.h b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.h
index 7168915ec75..3e6f263707f 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.h
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.h
@@ -33,12 +33,13 @@ typedef std::vector<std::vector<uint32>> AllItemsArray;
struct SellerItemClassInfo
{
- SellerItemClassInfo(): AmountOfItems(0), MissItems(0), Quantity(0), PriceRatio(0) {}
+ SellerItemClassInfo(): AmountOfItems(0), MissItems(0), Quantity(0), PriceRatio(0), RandomStackRatio(100) {}
uint32 AmountOfItems;
uint32 MissItems;
uint32 Quantity;
uint32 PriceRatio;
+ uint32 RandomStackRatio;
};
struct SellerItemInfo
@@ -102,6 +103,8 @@ public:
uint32 GetPriceRatioPerQuality(AuctionQuality quality) const { return _ItemInfo[quality].PriceRatio; }
void SetPriceRatioPerClass(ItemClass item, uint32 value) { _ItemInfo[0].ItemClassInfos[item].PriceRatio = value; }
uint32 GetPriceRatioPerClass(ItemClass item) const { return _ItemInfo[0].ItemClassInfos[item].PriceRatio; }
+ void SetRandomStackRatioPerClass(ItemClass item, uint32 value) { _ItemInfo[0].ItemClassInfos[item].RandomStackRatio = value; }
+ uint32 GetRandomStackRatioPerClass(ItemClass item) const { return _ItemInfo[0].ItemClassInfos[item].RandomStackRatio; }
private:
AuctionHouseType _houseType;
@@ -112,7 +115,7 @@ private:
// This class handle all Selling method
// (holder of AHB_Seller_Config data for each auction house type)
-class AuctionBotSeller : public AuctionBotAgent
+class TC_GAME_API AuctionBotSeller : public AuctionBotAgent
{
public:
typedef std::vector<uint32> ItemPool;
@@ -139,6 +142,7 @@ private:
uint32 SetStat(SellerConfiguration& config);
bool GetItemsToSell(SellerConfiguration& config, ItemsToSellArray& itemsToSellArray, AllItemsArray const& addedItem);
void SetPricesOfItem(ItemTemplate const* itemProto, SellerConfiguration& config, uint32& buyp, uint32& bidp, uint32 stackcnt);
+ uint32 GetStackSizeForItem(ItemTemplate const* itemProto, SellerConfiguration& config) const;
void LoadItemsQuantity(SellerConfiguration& config);
static uint32 GetBuyModifier(ItemTemplate const* prototype);
static uint32 GetSellModifier(ItemTemplate const* itemProto);
diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h
index 0159ba95eeb..ad5770e2ad0 100644
--- a/src/server/game/Battlefield/Battlefield.h
+++ b/src/server/game/Battlefield/Battlefield.h
@@ -78,7 +78,7 @@ class BfGraveyard;
typedef std::vector<BfGraveyard*> GraveyardVect;
typedef std::map<ObjectGuid, time_t> PlayerTimerMap;
-class BfCapturePoint
+class TC_GAME_API BfCapturePoint
{
public:
BfCapturePoint(Battlefield* bf);
@@ -146,7 +146,7 @@ class BfCapturePoint
ObjectGuid m_capturePointGUID;
};
-class BfGraveyard
+class TC_GAME_API BfGraveyard
{
public:
BfGraveyard(Battlefield* Bf);
@@ -193,7 +193,7 @@ class BfGraveyard
Battlefield* m_Bf;
};
-class Battlefield : public ZoneScript
+class TC_GAME_API Battlefield : public ZoneScript
{
friend class BattlefieldMgr;
diff --git a/src/server/game/Battlefield/BattlefieldMgr.cpp b/src/server/game/Battlefield/BattlefieldMgr.cpp
index 8e105f95604..b92b2e64318 100644
--- a/src/server/game/Battlefield/BattlefieldMgr.cpp
+++ b/src/server/game/Battlefield/BattlefieldMgr.cpp
@@ -32,6 +32,12 @@ BattlefieldMgr::~BattlefieldMgr()
_battlefieldMap.clear();
}
+BattlefieldMgr* BattlefieldMgr::instance()
+{
+ static BattlefieldMgr instance;
+ return &instance;
+}
+
void BattlefieldMgr::InitBattlefield()
{
Battlefield* wg = new BattlefieldWG();
diff --git a/src/server/game/Battlefield/BattlefieldMgr.h b/src/server/game/Battlefield/BattlefieldMgr.h
index b68e4df46f7..623f1dadb91 100644
--- a/src/server/game/Battlefield/BattlefieldMgr.h
+++ b/src/server/game/Battlefield/BattlefieldMgr.h
@@ -24,14 +24,10 @@ class Player;
class ZoneScript;
// class to handle player enter / leave / areatrigger / GO use events
-class BattlefieldMgr
+class TC_GAME_API BattlefieldMgr
{
public:
- static BattlefieldMgr* instance()
- {
- static BattlefieldMgr instance;
- return &instance;
- }
+ static BattlefieldMgr* instance();
// create battlefield events
void InitBattlefield();
diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h
index 087f20e9224..e849c2f33d1 100644
--- a/src/server/game/Battlefield/Zones/BattlefieldWG.h
+++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h
@@ -266,7 +266,7 @@ class WintergraspCapturePoint : public BfCapturePoint
* WinterGrasp Battlefield *
* ######################### */
-class BattlefieldWG : public Battlefield
+class TC_GAME_API BattlefieldWG : public Battlefield
{
public:
~BattlefieldWG();
@@ -1098,7 +1098,7 @@ StaticWintergraspWorkshopInfo const WorkshopData[WG_MAX_WORKSHOP] =
// ********************************************************************
// Structure for different buildings that can be destroyed during battle
-struct BfWGGameObjectBuilding
+struct TC_GAME_API BfWGGameObjectBuilding
{
private:
// WG object
@@ -1150,7 +1150,7 @@ public:
};
// Structure for the 6 workshop
-struct WintergraspWorkshop
+struct TC_GAME_API WintergraspWorkshop
{
private:
BattlefieldWG* _wg; // Pointer to wintergrasp
diff --git a/src/server/game/Battlegrounds/Arena.h b/src/server/game/Battlegrounds/Arena.h
index d0ed3a86af7..80745d2658c 100644
--- a/src/server/game/Battlegrounds/Arena.h
+++ b/src/server/game/Battlegrounds/Arena.h
@@ -36,7 +36,7 @@ enum ArenaWorldStates
ARENA_WORLD_STATE_ALIVE_PLAYERS_GOLD = 3601
};
-class Arena : public Battleground
+class TC_GAME_API Arena : public Battleground
{
protected:
Arena();
diff --git a/src/server/game/Battlegrounds/ArenaScore.h b/src/server/game/Battlegrounds/ArenaScore.h
index 683b216dd42..c9a9419dc2c 100644
--- a/src/server/game/Battlegrounds/ArenaScore.h
+++ b/src/server/game/Battlegrounds/ArenaScore.h
@@ -23,7 +23,7 @@
#include "Player.h"
#include "ObjectAccessor.h"
-struct ArenaScore : public BattlegroundScore
+struct TC_GAME_API ArenaScore : public BattlegroundScore
{
friend class Arena;
@@ -43,7 +43,7 @@ struct ArenaScore : public BattlegroundScore
uint8 TeamId; // BattlegroundTeamId
};
-struct ArenaTeamScore
+struct TC_GAME_API ArenaTeamScore
{
friend class Arena;
friend class Battleground;
diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
index db5d63a8915..df966a632cb 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.h
+++ b/src/server/game/Battlegrounds/ArenaTeam.h
@@ -81,7 +81,7 @@ enum ArenaTeamTypes
ARENA_TEAM_5v5 = 5
};
-struct ArenaTeamMember
+struct TC_GAME_API ArenaTeamMember
{
ObjectGuid Guid;
std::string Name;
@@ -109,7 +109,7 @@ struct ArenaTeamStats
#define MAX_ARENA_SLOT 3 // 0..2 slots
-class ArenaTeam
+class TC_GAME_API ArenaTeam
{
public:
ArenaTeam();
diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
index 3f3502b9aa6..ecf0ae6c6d1 100644
--- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
@@ -33,6 +33,12 @@ ArenaTeamMgr::~ArenaTeamMgr()
delete itr->second;
}
+ArenaTeamMgr* ArenaTeamMgr::instance()
+{
+ static ArenaTeamMgr instance;
+ return &instance;
+}
+
// Arena teams collection
ArenaTeam* ArenaTeamMgr::GetArenaTeamById(uint32 arenaTeamId) const
{
diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.h b/src/server/game/Battlegrounds/ArenaTeamMgr.h
index 8a36dfa7324..131a2cc8899 100644
--- a/src/server/game/Battlegrounds/ArenaTeamMgr.h
+++ b/src/server/game/Battlegrounds/ArenaTeamMgr.h
@@ -20,18 +20,14 @@
#include "ArenaTeam.h"
-class ArenaTeamMgr
+class TC_GAME_API ArenaTeamMgr
{
private:
ArenaTeamMgr();
~ArenaTeamMgr();
public:
- static ArenaTeamMgr* instance()
- {
- static ArenaTeamMgr instance;
- return &instance;
- }
+ static ArenaTeamMgr* instance();
typedef std::unordered_map<uint32, ArenaTeam*> ArenaTeamContainer;
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 1f33b0d5d7c..cb2fb68d9dd 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -232,7 +232,7 @@ This class is used to:
3. some certain cases, same for all battlegrounds
4. It has properties same for all battlegrounds
*/
-class Battleground
+class TC_GAME_API Battleground
{
public:
Battleground();
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index 57f61c0e195..514242011b3 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -75,6 +75,12 @@ void BattlegroundMgr::DeleteAllBattlegrounds()
bgDataStore.clear();
}
+BattlegroundMgr* BattlegroundMgr::instance()
+{
+ static BattlegroundMgr instance;
+ return &instance;
+}
+
// used to update running battlegrounds, and delete finished ones
void BattlegroundMgr::Update(uint32 diff)
{
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h
index 354f37b8cd8..d35b239a725 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.h
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h
@@ -67,18 +67,14 @@ namespace WorldPackets
}
}
-class BattlegroundMgr
+class TC_GAME_API BattlegroundMgr
{
private:
BattlegroundMgr();
~BattlegroundMgr();
public:
- static BattlegroundMgr* instance()
- {
- static BattlegroundMgr instance;
- return &instance;
- }
+ static BattlegroundMgr* instance();
void Update(uint32 diff);
diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h
index 9291adf9e8d..5eac6a8f51a 100644
--- a/src/server/game/Battlegrounds/BattlegroundQueue.h
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.h
@@ -72,7 +72,7 @@ enum BattlegroundQueueInvitationType
};
class Battleground;
-class BattlegroundQueue
+class TC_GAME_API BattlegroundQueue
{
public:
BattlegroundQueue();
@@ -142,7 +142,7 @@ class BattlegroundQueue
This class is used to invite player to BG again, when minute lasts from his first invitation
it is capable to solve all possibilities
*/
-class BGQueueInviteEvent : public BasicEvent
+class TC_GAME_API BGQueueInviteEvent : public BasicEvent
{
public:
BGQueueInviteEvent(ObjectGuid pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint8 arenaType, uint32 removeTime) :
@@ -165,7 +165,7 @@ class BGQueueInviteEvent : public BasicEvent
We must store removeInvite time in case player left queue and joined and is invited again
We must store bgQueueTypeId, because battleground can be deleted already, when player entered it
*/
-class BGQueueRemoveEvent : public BasicEvent
+class TC_GAME_API BGQueueRemoveEvent : public BasicEvent
{
public:
BGQueueRemoveEvent(ObjectGuid pl_guid, uint32 bgInstanceGUID, BattlegroundTypeId BgTypeId, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, uint32 removeTime)
diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt
index f439e0efc9a..df0d2b7cc2a 100644
--- a/src/server/game/CMakeLists.txt
+++ b/src/server/game/CMakeLists.txt
@@ -8,219 +8,63 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-file(GLOB_RECURSE sources_Accounts Accounts/*.cpp Accounts/*.h)
-file(GLOB_RECURSE sources_Achievements Achievements/*.cpp Achievements/*.h)
-file(GLOB_RECURSE sources_Addons Addons/*.cpp Addons/*.h)
-file(GLOB_RECURSE sources_AI AI/*.cpp AI/*.h)
-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)
-file(GLOB_RECURSE sources_Conditions Conditions/*.cpp Conditions/*.h)
-file(GLOB_RECURSE sources_DataStores DataStores/*.cpp DataStores/*.h)
-file(GLOB_RECURSE sources_DungeonFinding DungeonFinding/*.cpp DungeonFinding/*.h)
-file(GLOB_RECURSE sources_Entities Entities/*.cpp Entities/*.h)
-file(GLOB_RECURSE sources_Events Events/*.cpp Events/*.h)
-file(GLOB_RECURSE sources_Garrison Garrison/*.cpp Garrison/*.h)
-file(GLOB_RECURSE sources_Globals Globals/*.cpp Globals/*.h)
-file(GLOB_RECURSE sources_Grids Grids/*.cpp Grids/*.h)
-file(GLOB_RECURSE sources_Groups Groups/*.cpp Groups/*.h)
-file(GLOB_RECURSE sources_Guilds Guilds/*.cpp Guilds/*.h)
-file(GLOB_RECURSE sources_Handlers Handlers/*.cpp Handlers/*.h)
-file(GLOB_RECURSE sources_Instances Instances/*.cpp Instances/*.h)
-file(GLOB_RECURSE sources_Loot Loot/*.cpp Loot/*.h)
-file(GLOB_RECURSE sources_Mails Mails/*.cpp Mails/*.h)
-file(GLOB_RECURSE sources_Maps Maps/*.cpp Maps/*.h)
-file(GLOB_RECURSE sources_Miscellaneous Miscellaneous/*.cpp Miscellaneous/*.h)
-file(GLOB_RECURSE sources_Movement Movement/*.cpp Movement/*.h)
-file(GLOB_RECURSE sources_OutdoorPvP OutdoorPvP/*.cpp OutdoorPvP/*.h)
-file(GLOB_RECURSE sources_Pools Pools/*.cpp Pools/*.h)
-file(GLOB_RECURSE sources_Quests Quests/*.cpp Quests/*.h)
-file(GLOB_RECURSE sources_Reputation Reputation/*.cpp Reputation/*.h)
-file(GLOB_RECURSE sources_Scripting Scripting/*.cpp Scripting/*.h)
-file(GLOB_RECURSE sources_Server Server/*.cpp Server/*.h)
-file(GLOB_RECURSE sources_Skills Skills/*.cpp Skills/*.h)
-file(GLOB_RECURSE sources_Spells Spells/*.cpp Spells/*.h)
-file(GLOB_RECURSE sources_Support Support/*.cpp Support/*.h)
-file(GLOB_RECURSE sources_Texts Texts/*.cpp Texts/*.h)
-file(GLOB_RECURSE sources_Tools Tools/*.cpp Tools/*.h)
-file(GLOB_RECURSE sources_Warden Warden/*.cpp Warden/*.h)
-file(GLOB_RECURSE sources_Weather Weather/*.cpp Weather/*.h)
-file(GLOB_RECURSE sources_World World/*.cpp World/*.h)
-
-# Create game-libary
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if (USE_COREPCH)
- set(game_STAT_PCH_HDR PrecompiledHeaders/gamePCH.h)
- set(game_STAT_PCH_SRC PrecompiledHeaders/gamePCH.cpp)
+ set(PRIVATE_PCH_HEADER PrecompiledHeaders/gamePCH.h)
+ set(PRIVATE_PCH_SOURCE PrecompiledHeaders/gamePCH.cpp)
endif ()
-set(game_STAT_SRCS
- ${game_STAT_SRCS}
- ${sources_Accounts}
- ${sources_Achievements}
- ${sources_Addons}
- ${sources_AI}
- ${sources_AuctionHouse}
- ${sources_AuctionHouseBot}
- ${sources_Battlefield}
- ${sources_Battlegrounds}
- ${sources_BattlePets}
- ${sources_Calendar}
- ${sources_Chat}
- ${sources_Combat}
- ${sources_Conditions}
- ${sources_DataStores}
- ${sources_DungeonFinding}
- ${sources_Entities}
- ${sources_Events}
- ${sources_Garrison}
- ${sources_Globals}
- ${sources_Grids}
- ${sources_Groups}
- ${sources_Guilds}
- ${sources_Handlers}
- ${sources_Instances}
- ${sources_Loot}
- ${sources_Mails}
- ${sources_Maps}
- ${sources_Miscellaneous}
- ${sources_Movement}
- ${sources_OutdoorPvP}
- ${sources_Pools}
- ${sources_Quests}
- ${sources_Reputation}
- ${sources_Scripting}
- ${sources_Server}
- ${sources_Skills}
- ${sources_Spells}
- ${sources_Support}
- ${sources_Texts}
- ${sources_Tools}
- ${sources_Warden}
- ${sources_Weather}
- ${sources_World}
-)
+GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
-include_directories(
- ${CMAKE_CURRENT_SOURCE_DIR}/Accounts
- ${CMAKE_CURRENT_SOURCE_DIR}/Achievements
- ${CMAKE_CURRENT_SOURCE_DIR}/Addons
- ${CMAKE_CURRENT_SOURCE_DIR}/AI
- ${CMAKE_CURRENT_SOURCE_DIR}/AI/CoreAI
- ${CMAKE_CURRENT_SOURCE_DIR}/AI/ScriptedAI
- ${CMAKE_CURRENT_SOURCE_DIR}/AI/SmartScripts
- ${CMAKE_CURRENT_SOURCE_DIR}/AuctionHouse
- ${CMAKE_CURRENT_SOURCE_DIR}/AuctionHouseBot
- ${CMAKE_CURRENT_SOURCE_DIR}/Battlefield
- ${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
- ${CMAKE_CURRENT_SOURCE_DIR}/Combat
- ${CMAKE_CURRENT_SOURCE_DIR}/Conditions
- ${CMAKE_CURRENT_SOURCE_DIR}/DataStores
- ${CMAKE_CURRENT_SOURCE_DIR}/DungeonFinding
- ${CMAKE_CURRENT_SOURCE_DIR}/Entities/AreaTrigger
- ${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
- ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Item/Container
- ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Object
- ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Object/Updates
- ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Pet
- ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Player
- ${CMAKE_CURRENT_SOURCE_DIR}/Entities/Taxi
- ${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}/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}/Groups
- ${CMAKE_CURRENT_SOURCE_DIR}/Guilds
- ${CMAKE_CURRENT_SOURCE_DIR}/Handlers
- ${CMAKE_CURRENT_SOURCE_DIR}/Instances
- ${CMAKE_CURRENT_SOURCE_DIR}/Loot
- ${CMAKE_CURRENT_SOURCE_DIR}/Mails
- ${CMAKE_CURRENT_SOURCE_DIR}/Maps
- ${CMAKE_CURRENT_SOURCE_DIR}/Miscellaneous
- ${CMAKE_CURRENT_SOURCE_DIR}/Movement
- ${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}/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}/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}/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}
- ${ZMQ_INCLUDE_DIR}
+add_definitions(-DTRINITY_API_EXPORT_GAME)
+
+add_library(game
+ ${PRIVATE_SOURCES}
+ ${PRIVATE_PCH_SOURCE}
)
-GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
-add_library(game STATIC
- ${game_STAT_PCH_SRC}
- ${game_STAT_SRCS}
-)
+target_include_directories(game
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
+
+target_link_libraries(game
+ PUBLIC
+ shared
+ Detour
+ PRIVATE
+ efsw)
+
+set_target_properties(game
+ PROPERTIES
+ FOLDER
+ "server")
+
+if( BUILD_SHARED_LIBS )
+ if( UNIX )
+ install(TARGETS game
+ LIBRARY
+ DESTINATION lib)
+ elseif( WIN32 )
+ install(TARGETS game
+ RUNTIME
+ DESTINATION "${CMAKE_INSTALL_PREFIX}")
+ endif()
+endif()
# Generate precompiled header
if (USE_COREPCH)
- add_cxx_pch(game ${game_STAT_PCH_HDR} ${game_STAT_PCH_SRC})
+ add_cxx_pch(game ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE})
endif ()
diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp
index 83bcdf733e2..92df0ea6ea2 100644
--- a/src/server/game/Calendar/CalendarMgr.cpp
+++ b/src/server/game/Calendar/CalendarMgr.cpp
@@ -46,6 +46,12 @@ CalendarMgr::~CalendarMgr()
delete *itr2;
}
+CalendarMgr* CalendarMgr::instance()
+{
+ static CalendarMgr instance;
+ return &instance;
+}
+
void CalendarMgr::LoadFromDB()
{
uint32 count = 0;
diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h
index e22482323c7..e7594823d51 100644
--- a/src/server/game/Calendar/CalendarMgr.h
+++ b/src/server/game/Calendar/CalendarMgr.h
@@ -128,7 +128,7 @@ enum CalendarError
#define CALENDAR_MAX_INVITES 100
#define CALENDAR_DEFAULT_RESPONSE_TIME 946684800 // 01/01/2000 00:00:00
-struct CalendarInvite
+struct TC_GAME_API CalendarInvite
{
public:
CalendarInvite(CalendarInvite const& calendarInvite, uint64 inviteId, uint64 eventId)
@@ -188,7 +188,7 @@ struct CalendarInvite
std::string _note;
};
-struct CalendarEvent
+struct TC_GAME_API CalendarEvent
{
public:
CalendarEvent(CalendarEvent const& calendarEvent, uint64 eventId)
@@ -268,7 +268,7 @@ typedef std::vector<CalendarInvite*> CalendarInviteStore;
typedef std::set<CalendarEvent*> CalendarEventStore;
typedef std::map<uint64 /* eventID */, CalendarInviteStore > CalendarEventInviteStore;
-class CalendarMgr
+class TC_GAME_API CalendarMgr
{
private:
CalendarMgr();
@@ -283,11 +283,7 @@ class CalendarMgr
uint64 _maxInviteId;
public:
- static CalendarMgr* instance()
- {
- static CalendarMgr instance;
- return &instance;
- }
+ static CalendarMgr* instance();
void LoadFromDB();
diff --git a/src/server/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h
index 5683a876f6d..f309f3c7936 100644
--- a/src/server/game/Chat/Channels/Channel.h
+++ b/src/server/game/Chat/Channels/Channel.h
@@ -123,7 +123,7 @@ enum ChannelMemberFlags
// 0x80
};
-class Channel
+class TC_GAME_API Channel
{
struct PlayerInfo
{
diff --git a/src/server/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h
index 835a4cdcaaa..cdaf6b8565c 100644
--- a/src/server/game/Chat/Channels/ChannelMgr.h
+++ b/src/server/game/Chat/Channels/ChannelMgr.h
@@ -24,7 +24,7 @@
#define MAX_CHANNEL_NAME_STR 0x31
#define MAX_CHANNEL_PASS_STR 31
-class ChannelMgr
+class TC_GAME_API ChannelMgr
{
typedef std::map<std::wstring, Channel*> ChannelMap;
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index 63166b6ae91..226ec1fe6ad 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -37,7 +37,7 @@ class WorldObject;
struct GameTele;
-class ChatCommand
+class TC_GAME_API ChatCommand
{
typedef bool(*pHandler)(ChatHandler*, char const*);
@@ -53,7 +53,7 @@ class ChatCommand
std::vector<ChatCommand> ChildCommands;
};
-class ChatHandler
+class TC_GAME_API ChatHandler
{
public:
WorldSession* GetSession() { return m_session; }
@@ -154,7 +154,7 @@ class ChatHandler
bool sentErrorMessage;
};
-class CliHandler : public ChatHandler
+class TC_GAME_API CliHandler : public ChatHandler
{
public:
typedef void Print(void*, char const*);
diff --git a/src/server/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h
index 1a0310118d2..ae6932b5d27 100644
--- a/src/server/game/Chat/ChatLink.h
+++ b/src/server/game/Chat/ChatLink.h
@@ -35,7 +35,7 @@ class Quest;
///////////////////////////////////////////////////////////////////////////////////////////////////
// ChatLink - abstract base class for various links
-class ChatLink
+class TC_GAME_API ChatLink
{
public:
ChatLink() : _color(0), _startPos(0), _endPos(0) { }
@@ -55,7 +55,7 @@ protected:
};
// ItemChatLink - link to item
-class ItemChatLink : public ChatLink
+class TC_GAME_API ItemChatLink : public ChatLink
{
public:
ItemChatLink() : ChatLink(), _item(NULL), _suffix(NULL), _property(NULL)
@@ -76,7 +76,7 @@ protected:
};
// QuestChatLink - link to quest
-class QuestChatLink : public ChatLink
+class TC_GAME_API QuestChatLink : public ChatLink
{
public:
QuestChatLink() : ChatLink(), _quest(nullptr), _questLevel(0) { }
@@ -89,7 +89,7 @@ protected:
};
// SpellChatLink - link to quest
-class SpellChatLink : public ChatLink
+class TC_GAME_API SpellChatLink : public ChatLink
{
public:
SpellChatLink() : ChatLink(), _spell(nullptr) { }
@@ -101,7 +101,7 @@ protected:
};
// AchievementChatLink - link to quest
-class AchievementChatLink : public ChatLink
+class TC_GAME_API AchievementChatLink : public ChatLink
{
public:
AchievementChatLink() : ChatLink(), _guid(0), _achievement(NULL)
@@ -118,7 +118,7 @@ protected:
};
// TradeChatLink - link to trade info
-class TradeChatLink : public SpellChatLink
+class TC_GAME_API TradeChatLink : public SpellChatLink
{
public:
TradeChatLink() : SpellChatLink(), _minSkillLevel(0), _maxSkillLevel(0), _guid(0) { }
@@ -131,7 +131,7 @@ private:
};
// TalentChatLink - link to talent
-class TalentChatLink : public SpellChatLink
+class TC_GAME_API TalentChatLink : public SpellChatLink
{
public:
TalentChatLink() : SpellChatLink(), _talentId(0), _rankId(0) { }
@@ -143,7 +143,7 @@ private:
};
// EnchantmentChatLink - link to enchantment
-class EnchantmentChatLink : public SpellChatLink
+class TC_GAME_API EnchantmentChatLink : public SpellChatLink
{
public:
EnchantmentChatLink() : SpellChatLink() { }
@@ -151,7 +151,7 @@ public:
};
// GlyphChatLink - link to glyph
-class GlyphChatLink : public SpellChatLink
+class TC_GAME_API GlyphChatLink : public SpellChatLink
{
public:
GlyphChatLink() : SpellChatLink(), _slotId(0), _glyph(NULL) { }
@@ -161,7 +161,7 @@ private:
GlyphPropertiesEntry const* _glyph;
};
-class LinkExtractor
+class TC_GAME_API LinkExtractor
{
public:
explicit LinkExtractor(const char* msg);
diff --git a/src/server/game/Combat/HostileRefManager.h b/src/server/game/Combat/HostileRefManager.h
index 96152ed46f7..855f9e3d272 100644
--- a/src/server/game/Combat/HostileRefManager.h
+++ b/src/server/game/Combat/HostileRefManager.h
@@ -29,7 +29,7 @@ class SpellInfo;
//=================================================
-class HostileRefManager : public RefManager<Unit, ThreatManager>
+class TC_GAME_API HostileRefManager : public RefManager<Unit, ThreatManager>
{
private:
Unit* iOwner;
diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h
index 7d20e99c128..8b28779569a 100644
--- a/src/server/game/Combat/ThreatManager.h
+++ b/src/server/game/Combat/ThreatManager.h
@@ -39,14 +39,14 @@ class SpellInfo;
//==============================================================
// Class to calculate the real threat based
-struct ThreatCalcHelper
+struct TC_GAME_API ThreatCalcHelper
{
static float calcThreat(Unit* hatedUnit, Unit* hatingUnit, float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* threatSpell = NULL);
static bool isValidProcess(Unit* hatedUnit, Unit* hatingUnit, SpellInfo const* threatSpell = NULL);
};
//==============================================================
-class HostileReference : public Reference<Unit, ThreatManager>
+class TC_GAME_API HostileReference : public Reference<Unit, ThreatManager>
{
public:
HostileReference(Unit* refUnit, ThreatManager* threatManager, float threat);
@@ -141,7 +141,7 @@ class HostileReference : public Reference<Unit, ThreatManager>
//==============================================================
class ThreatManager;
-class ThreatContainer
+class TC_GAME_API ThreatContainer
{
friend class ThreatManager;
@@ -198,7 +198,7 @@ class ThreatContainer
//=================================================
-class ThreatManager
+class TC_GAME_API ThreatManager
{
public:
friend class HostileReference;
diff --git a/src/server/game/Combat/UnitEvents.h b/src/server/game/Combat/UnitEvents.h
index e501cdaa4a2..f50edcf3c7d 100644
--- a/src/server/game/Combat/UnitEvents.h
+++ b/src/server/game/Combat/UnitEvents.h
@@ -81,7 +81,7 @@ class UnitBaseEvent
//==============================================================
-class ThreatRefStatusChangeEvent : public UnitBaseEvent
+class TC_GAME_API ThreatRefStatusChangeEvent : public UnitBaseEvent
{
private:
HostileReference* iHostileReference;
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 3dfbb2a12e1..c0c4c7c485c 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -926,6 +926,12 @@ bool ConditionMgr::IsObjectMeetingVendorItemConditions(uint32 creatureId, uint32
return true;
}
+ConditionMgr* ConditionMgr::instance()
+{
+ static ConditionMgr instance;
+ return &instance;
+}
+
void ConditionMgr::LoadConditions(bool isReload)
{
uint32 oldMSTime = getMSTime();
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 601dc8dbda9..db5b78215b3 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -178,7 +178,7 @@ enum MaxConditionTargets
MAX_CONDITION_TARGETS = 3
};
-struct ConditionSourceInfo
+struct TC_GAME_API ConditionSourceInfo
{
WorldObject* mConditionTargets[MAX_CONDITION_TARGETS]; // an array of targets available for conditions
Condition const* mLastFailedCondition;
@@ -191,7 +191,7 @@ struct ConditionSourceInfo
}
};
-struct Condition
+struct TC_GAME_API Condition
{
ConditionSourceType SourceType; //SourceTypeOrReferenceId
uint32 SourceGroup;
@@ -243,18 +243,14 @@ typedef std::unordered_map<uint32, ConditionsByEntryMap> ConditionEntriesByCreat
typedef std::unordered_map<std::pair<int32, uint32 /*SAI source_type*/>, ConditionsByEntryMap> SmartEventConditionContainer;
typedef std::unordered_map<uint32, ConditionContainer> ConditionReferenceContainer;//only used for references
-class ConditionMgr
+class TC_GAME_API ConditionMgr
{
private:
ConditionMgr();
~ConditionMgr();
public:
- static ConditionMgr* instance()
- {
- static ConditionMgr instance;
- return &instance;
- }
+ static ConditionMgr* instance();
void LoadConditions(bool isReload = false);
bool isConditionTypeValid(Condition* cond) const;
diff --git a/src/server/game/Conditions/DisableMgr.h b/src/server/game/Conditions/DisableMgr.h
index e74b7a9c319..cae1e0329e8 100644
--- a/src/server/game/Conditions/DisableMgr.h
+++ b/src/server/game/Conditions/DisableMgr.h
@@ -57,11 +57,11 @@ enum MMapDisableTypes
namespace DisableMgr
{
- void LoadDisables();
- bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags = 0);
- void CheckQuestDisables();
- bool IsVMAPDisabledFor(uint32 entry, uint8 flags);
- bool IsPathfindingEnabled(uint32 mapId);
+ TC_GAME_API void LoadDisables();
+ TC_GAME_API bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags = 0);
+ TC_GAME_API void CheckQuestDisables();
+ TC_GAME_API bool IsVMAPDisabledFor(uint32 entry, uint8 flags);
+ TC_GAME_API bool IsPathfindingEnabled(uint32 mapId);
}
#endif //TRINITY_DISABLEMGR_H
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 91f770d3c13..09799921258 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -187,6 +187,12 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D
stores[storage->GetHash()] = storage;
}
+DB2Manager& DB2Manager::Instance()
+{
+ static DB2Manager instance;
+ return instance;
+}
+
void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
{
uint32 oldMSTime = getMSTime();
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 5c7c4128137..5088b750de4 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -24,96 +24,96 @@
#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;
-extern DB2Storage<GameObjectsEntry> sGameObjectsStore;
-extern DB2Storage<GameTablesEntry> sGameTablesStore;
-extern DB2Storage<GarrAbilityEntry> sGarrAbilityStore;
-extern DB2Storage<GarrBuildingEntry> sGarrBuildingStore;
-extern DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore;
-extern DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore;
-extern DB2Storage<GarrFollowerEntry> sGarrFollowerStore;
-extern DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore;
-extern DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore;
-extern DB2Storage<GarrPlotEntry> sGarrPlotStore;
-extern DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore;
-extern DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore;
-extern DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore;
-extern DB2Storage<GlyphSlotEntry> sGlyphSlotStore;
-extern DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore;
-extern DB2Storage<HeirloomEntry> sHeirloomStore;
-extern DB2Storage<HolidaysEntry> sHolidaysStore;
-extern DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore;
-extern DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore;
-extern DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore;
-extern DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore;
-extern DB2Storage<ItemClassEntry> sItemClassStore;
-extern DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore;
-extern DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore;
-extern DB2Storage<ItemEffectEntry> sItemEffectStore;
-extern DB2Storage<ItemEntry> sItemStore;
-extern DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore;
-extern DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore;
-extern DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore;
-extern DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore;
-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<PlayerConditionEntry> sPlayerConditionStore;
-extern DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore;
-extern DB2Storage<QuestSortEntry> sQuestSortStore;
-extern DB2Storage<QuestXPEntry> sQuestXPStore;
-extern DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore;
-extern DB2Storage<SoundEntriesEntry> sSoundEntriesStore;
-extern DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore;
-extern DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore;
-extern DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore;
-extern DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore;
-extern DB2Storage<SpellDurationEntry> sSpellDurationStore;
-extern DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore;
-extern DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore;
-extern DB2Storage<SpellMiscEntry> sSpellMiscStore;
-extern DB2Storage<SpellPowerEntry> sSpellPowerStore;
-extern DB2Storage<SpellRadiusEntry> sSpellRadiusStore;
-extern DB2Storage<SpellRangeEntry> sSpellRangeStore;
-extern DB2Storage<SpellReagentsEntry> sSpellReagentsStore;
-extern DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore;
-extern DB2Storage<SpellTotemsEntry> sSpellTotemsStore;
-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;
-
-extern TaxiMask sTaxiNodesMask;
-extern TaxiMask sOldContinentsNodesMask;
-extern TaxiMask sHordeTaxiNodesMask;
-extern TaxiMask sAllianceTaxiNodesMask;
-extern TaxiPathSetBySource sTaxiPathSetBySource;
-extern TaxiPathNodesByPath sTaxiPathNodesByPath;
+TC_GAME_API extern DB2Storage<AchievementEntry> sAchievementStore;
+TC_GAME_API extern DB2Storage<AuctionHouseEntry> sAuctionHouseStore;
+TC_GAME_API extern DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore;
+TC_GAME_API extern DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore;
+TC_GAME_API extern DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore;
+TC_GAME_API extern DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore;
+TC_GAME_API extern DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore;
+TC_GAME_API extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore;
+TC_GAME_API extern DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore;
+TC_GAME_API extern DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore;
+TC_GAME_API extern DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore;
+TC_GAME_API extern DB2Storage<CreatureTypeEntry> sCreatureTypeStore;
+TC_GAME_API extern DB2Storage<CriteriaEntry> sCriteriaStore;
+TC_GAME_API extern DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore;
+TC_GAME_API extern DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore;
+TC_GAME_API extern DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore;
+TC_GAME_API extern DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore;
+TC_GAME_API extern DB2Storage<GameObjectsEntry> sGameObjectsStore;
+TC_GAME_API extern DB2Storage<GameTablesEntry> sGameTablesStore;
+TC_GAME_API extern DB2Storage<GarrAbilityEntry> sGarrAbilityStore;
+TC_GAME_API extern DB2Storage<GarrBuildingEntry> sGarrBuildingStore;
+TC_GAME_API extern DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore;
+TC_GAME_API extern DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore;
+TC_GAME_API extern DB2Storage<GarrFollowerEntry> sGarrFollowerStore;
+TC_GAME_API extern DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore;
+TC_GAME_API extern DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore;
+TC_GAME_API extern DB2Storage<GarrPlotEntry> sGarrPlotStore;
+TC_GAME_API extern DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore;
+TC_GAME_API extern DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore;
+TC_GAME_API extern DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore;
+TC_GAME_API extern DB2Storage<GlyphSlotEntry> sGlyphSlotStore;
+TC_GAME_API extern DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore;
+TC_GAME_API extern DB2Storage<HeirloomEntry> sHeirloomStore;
+TC_GAME_API extern DB2Storage<HolidaysEntry> sHolidaysStore;
+TC_GAME_API extern DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore;
+TC_GAME_API extern DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore;
+TC_GAME_API extern DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore;
+TC_GAME_API extern DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore;
+TC_GAME_API extern DB2Storage<ItemClassEntry> sItemClassStore;
+TC_GAME_API extern DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore;
+TC_GAME_API extern DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore;
+TC_GAME_API extern DB2Storage<ItemEffectEntry> sItemEffectStore;
+TC_GAME_API extern DB2Storage<ItemEntry> sItemStore;
+TC_GAME_API extern DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore;
+TC_GAME_API extern DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore;
+TC_GAME_API extern DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore;
+TC_GAME_API extern DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore;
+TC_GAME_API extern DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore;
+TC_GAME_API extern DB2Storage<ItemSparseEntry> sItemSparseStore;
+TC_GAME_API extern DB2Storage<ItemSpecEntry> sItemSpecStore;
+TC_GAME_API extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore;
+TC_GAME_API extern DB2Storage<ItemToBattlePetSpeciesEntry> sItemToBattlePetSpeciesStore;
+TC_GAME_API extern DB2Storage<MailTemplateEntry> sMailTemplateStore;
+TC_GAME_API extern DB2Storage<ModifierTreeEntry> sModifierTreeStore;
+TC_GAME_API extern DB2Storage<MountCapabilityEntry> sMountCapabilityStore;
+TC_GAME_API extern DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore;
+TC_GAME_API extern DB2Storage<PlayerConditionEntry> sPlayerConditionStore;
+TC_GAME_API extern DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore;
+TC_GAME_API extern DB2Storage<QuestSortEntry> sQuestSortStore;
+TC_GAME_API extern DB2Storage<QuestXPEntry> sQuestXPStore;
+TC_GAME_API extern DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore;
+TC_GAME_API extern DB2Storage<SoundEntriesEntry> sSoundEntriesStore;
+TC_GAME_API extern DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore;
+TC_GAME_API extern DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore;
+TC_GAME_API extern DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore;
+TC_GAME_API extern DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore;
+TC_GAME_API extern DB2Storage<SpellDurationEntry> sSpellDurationStore;
+TC_GAME_API extern DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore;
+TC_GAME_API extern DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore;
+TC_GAME_API extern DB2Storage<SpellMiscEntry> sSpellMiscStore;
+TC_GAME_API extern DB2Storage<SpellPowerEntry> sSpellPowerStore;
+TC_GAME_API extern DB2Storage<SpellRadiusEntry> sSpellRadiusStore;
+TC_GAME_API extern DB2Storage<SpellRangeEntry> sSpellRangeStore;
+TC_GAME_API extern DB2Storage<SpellReagentsEntry> sSpellReagentsStore;
+TC_GAME_API extern DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore;
+TC_GAME_API extern DB2Storage<SpellTotemsEntry> sSpellTotemsStore;
+TC_GAME_API extern DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore;
+TC_GAME_API extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore;
+TC_GAME_API extern DB2Storage<TaxiPathEntry> sTaxiPathStore;
+TC_GAME_API extern DB2Storage<TotemCategoryEntry> sTotemCategoryStore;
+TC_GAME_API extern DB2Storage<ToyEntry> sToyStore;
+TC_GAME_API extern DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore;
+TC_GAME_API extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore;
+
+TC_GAME_API extern TaxiMask sTaxiNodesMask;
+TC_GAME_API extern TaxiMask sOldContinentsNodesMask;
+TC_GAME_API extern TaxiMask sHordeTaxiNodesMask;
+TC_GAME_API extern TaxiMask sAllianceTaxiNodesMask;
+TC_GAME_API extern TaxiPathSetBySource sTaxiPathSetBySource;
+TC_GAME_API extern TaxiPathNodesByPath sTaxiPathNodesByPath;
struct HotfixNotify
{
@@ -131,7 +131,7 @@ typedef std::vector<HotfixNotify> HotfixData;
static bool Compare(structure const* left, structure const* right); \
};
-class DB2Manager
+class TC_GAME_API DB2Manager
{
public:
DEFINE_DB2_SET_COMPARATOR(ChrClassesXPowerTypesEntry);
@@ -162,11 +162,7 @@ public:
typedef std::unordered_map<uint32, std::unordered_map<uint32, std::vector<SpellPowerEntry const*>>> SpellPowerDifficultyContainer;
typedef std::unordered_set<uint32> ToyItemIdsContainer;
- static DB2Manager& Instance()
- {
- static DB2Manager instance;
- return instance;
- }
+ static DB2Manager& Instance();
void LoadStores(std::string const& dataPath, uint32 defaultLocale);
DB2StorageBase const* GetStorage(uint32 type) const;
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index d8af7418be4..2f30a00d3c0 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -25,50 +25,50 @@
#include "SharedDefines.h"
// CharSections
-CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color);
+TC_GAME_API CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color);
// ChrClasses
-char const* GetClassName(uint8 class_, uint8 locale);
+TC_GAME_API char const* GetClassName(uint8 class_, uint8 locale);
// ChrRaces
-char const* GetRaceName(uint8 race, uint8 locale);
+TC_GAME_API char const* GetRaceName(uint8 race, uint8 locale);
// ChrSpecialization
typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES][MAX_SPECIALIZATIONS];
// CreatureFamilty
-char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale);
+TC_GAME_API char const* GetCreatureFamilyPetName(uint32 petfamily, uint32 locale);
// Faction
-std::vector<uint32> const* GetFactionTeamList(uint32 faction);
+TC_GAME_API std::vector<uint32> const* GetFactionTeamList(uint32 faction);
// ItemSetSpells
typedef std::vector<ItemSetSpellEntry const*> ItemSetSpells;
typedef std::unordered_map<uint32, ItemSetSpells> ItemSetSpellsStore;
// LfgDungeons
-LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty);
+TC_GAME_API LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty);
// Light
-uint32 GetDefaultMapLight(uint32 mapId);
+TC_GAME_API uint32 GetDefaultMapLight(uint32 mapId);
// LiquidType
-uint32 GetLiquidFlags(uint32 liquidType);
+TC_GAME_API 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);
+TC_GAME_API MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr);
+TC_GAME_API MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty);
+TC_GAME_API MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty);
// PvpDifficulty
-PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level);
-PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id);
+TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level);
+TC_GAME_API PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id);
// 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_);
+TC_GAME_API SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_);
// SpellEffectScaling
typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId;
@@ -77,21 +77,21 @@ typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId;
typedef std::vector<TalentEntry const*> TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS];
// TotemCategory
-bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId);
+TC_GAME_API bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId);
// WMOAreaTable
-WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid);
+TC_GAME_API 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);
+TC_GAME_API uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId);
+TC_GAME_API void Zone2MapCoordinates(float &x, float &y, uint32 worldMapAreaId);
+TC_GAME_API void Map2ZoneCoordinates(float &x, float &y, uint32 worldMapAreaId);
// WorldMapTransforms
-void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr);
+TC_GAME_API void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr);
-uint32 GetMaxLevelForExpansion(uint32 expansion);
-uint32 GetExpansionForLevel(uint32 level);
+TC_GAME_API uint32 GetMaxLevelForExpansion(uint32 expansion);
+TC_GAME_API uint32 GetExpansionForLevel(uint32 level);
template<class T>
class GameTable
@@ -121,111 +121,111 @@ private:
GameTablesEntry const* _gtEntry;
};
-extern DBCStorage<AnimKitEntry> sAnimKitStore;
-extern DBCStorage<AreaTableEntry> sAreaTableStore;
-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);
+TC_GAME_API extern DBCStorage<AnimKitEntry> sAnimKitStore;
+TC_GAME_API extern DBCStorage<AreaTableEntry> sAreaTableStore;
+TC_GAME_API extern DBCStorage<AreaTriggerEntry> sAreaTriggerStore;
+TC_GAME_API extern DBCStorage<ArmorLocationEntry> sArmorLocationStore;
+TC_GAME_API extern DBCStorage<BankBagSlotPricesEntry> sBankBagSlotPricesStore;
+TC_GAME_API extern DBCStorage<BannedAddOnsEntry> sBannedAddOnsStore;
+TC_GAME_API extern DBCStorage<BattlemasterListEntry> sBattlemasterListStore;
+TC_GAME_API extern DBCStorage<CharSectionsEntry> sCharSectionsStore;
+TC_GAME_API extern DBCStorage<CharTitlesEntry> sCharTitlesStore;
+TC_GAME_API extern DBCStorage<ChatChannelsEntry> sChatChannelsStore;
+TC_GAME_API extern DBCStorage<ChrClassesEntry> sChrClassesStore;
+TC_GAME_API extern DBCStorage<ChrRacesEntry> sChrRacesStore;
+TC_GAME_API extern DBCStorage<ChrSpecializationEntry> sChrSpecializationStore;
+TC_GAME_API extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore;
+TC_GAME_API extern DBCStorage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore;
+TC_GAME_API extern DBCStorage<CreatureFamilyEntry> sCreatureFamilyStore;
+TC_GAME_API extern DBCStorage<CreatureModelDataEntry> sCreatureModelDataStore;
+TC_GAME_API extern DBCStorage<DifficultyEntry> sDifficultyStore;
+TC_GAME_API extern DBCStorage<DungeonEncounterEntry> sDungeonEncounterStore;
+TC_GAME_API extern DBCStorage<DurabilityCostsEntry> sDurabilityCostsStore;
+TC_GAME_API extern DBCStorage<EmotesEntry> sEmotesStore;
+TC_GAME_API extern DBCStorage<EmotesTextEntry> sEmotesTextStore;
+TC_GAME_API extern DBCStorage<FactionEntry> sFactionStore;
+TC_GAME_API extern DBCStorage<FactionTemplateEntry> sFactionTemplateStore;
+TC_GAME_API extern DBCStorage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore;
+TC_GAME_API extern DBCStorage<GemPropertiesEntry> sGemPropertiesStore;
+TC_GAME_API extern DBCStorage<GlyphPropertiesEntry> sGlyphPropertiesStore;
+TC_GAME_API extern DBCStorage<GuildColorBackgroundEntry> sGuildColorBackgroundStore;
+TC_GAME_API extern DBCStorage<GuildColorBorderEntry> sGuildColorBorderStore;
+TC_GAME_API extern DBCStorage<GuildColorEmblemEntry> sGuildColorEmblemStore;
+TC_GAME_API extern DBCStorage<ItemArmorQualityEntry> sItemArmorQualityStore;
+TC_GAME_API extern DBCStorage<ItemArmorShieldEntry> sItemArmorShieldStore;
+TC_GAME_API extern DBCStorage<ItemArmorTotalEntry> sItemArmorTotalStore;
+TC_GAME_API extern DBCStorage<ItemBagFamilyEntry> sItemBagFamilyStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageAmmoStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageOneHandCasterStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageOneHandStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageRangedStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageThrownStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageTwoHandCasterStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageTwoHandStore;
+TC_GAME_API extern DBCStorage<ItemDamageEntry> sItemDamageWandStore;
+TC_GAME_API extern DBCStorage<ItemSetEntry> sItemSetStore;
+TC_GAME_API extern DBCStorage<ItemSetSpellEntry> sItemSetSpellStore;
+TC_GAME_API extern ItemSetSpellsStore sItemSetSpellsStore;
+TC_GAME_API extern DBCStorage<LFGDungeonEntry> sLFGDungeonStore;
+TC_GAME_API extern DBCStorage<LiquidTypeEntry> sLiquidTypeStore;
+TC_GAME_API extern DBCStorage<LockEntry> sLockStore;
+TC_GAME_API extern DBCStorage<MapEntry> sMapStore;
+TC_GAME_API extern MapDifficultyMap sMapDifficultyMap;
+TC_GAME_API extern DBCStorage<MovieEntry> sMovieStore;
+TC_GAME_API extern DBCStorage<PhaseEntry> sPhaseStore;
+TC_GAME_API extern DBCStorage<PowerDisplayEntry> sPowerDisplayStore;
+TC_GAME_API extern DBCStorage<QuestFactionRewEntry> sQuestFactionRewardStore;
+TC_GAME_API extern DBCStorage<RandomPropertiesPointsEntry> sRandomPropertiesPointsStore;
+TC_GAME_API extern DBCStorage<SkillLineAbilityEntry> sSkillLineAbilityStore;
+TC_GAME_API extern DBCStorage<SkillLineEntry> sSkillLineStore;
+TC_GAME_API extern DBCStorage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore;
+TC_GAME_API extern DBCStorage<SpellAuraOptionsEntry> sSpellAuraOptionsStore;
+TC_GAME_API extern DBCStorage<SpellCategoriesEntry> sSpellCategoriesStore;
+TC_GAME_API extern DBCStorage<SpellCategoryEntry> sSpellCategoryStore;
+TC_GAME_API extern DBCStorage<SpellCooldownsEntry> sSpellCooldownsStore;
+TC_GAME_API extern DBCStorage<SpellEffectEntry> sSpellEffectStore;
+TC_GAME_API extern DBCStorage<SpellEffectScalingEntry> sSpellEffectScalingStore;
+TC_GAME_API extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId;
+TC_GAME_API extern DBCStorage<SpellEntry> sSpellStore;
+TC_GAME_API extern DBCStorage<SpellEquippedItemsEntry> sSpellEquippedItemsStore;
+TC_GAME_API extern DBCStorage<SpellFocusObjectEntry> sSpellFocusObjectStore;
+TC_GAME_API extern DBCStorage<SpellInterruptsEntry> sSpellInterruptsStore;
+TC_GAME_API extern DBCStorage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore;
+TC_GAME_API extern DBCStorage<SpellLevelsEntry> sSpellLevelsStore;
+TC_GAME_API extern DBCStorage<SpellScalingEntry> sSpellScalingStore;
+TC_GAME_API extern DBCStorage<SpellShapeshiftEntry> sSpellShapeshiftStore;
+TC_GAME_API extern DBCStorage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore;
+TC_GAME_API extern DBCStorage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore;
+TC_GAME_API extern DBCStorage<SummonPropertiesEntry> sSummonPropertiesStore;
+TC_GAME_API extern DBCStorage<TalentEntry> sTalentStore;
+TC_GAME_API extern TalentsByPosition sTalentByPos;
+TC_GAME_API extern DBCStorage<VehicleEntry> sVehicleStore;
+TC_GAME_API extern DBCStorage<VehicleSeatEntry> sVehicleSeatStore;
+TC_GAME_API extern DBCStorage<WMOAreaTableEntry> sWMOAreaTableStore;
+TC_GAME_API extern DBCStorage<WorldSafeLocsEntry> sWorldSafeLocsStore;
+
+TC_GAME_API extern GameTable<GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore;
+TC_GAME_API extern GameTable<GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore;
+TC_GAME_API extern GameTable<GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore;
+TC_GAME_API extern GameTable<GtChanceToSpellCritBaseEntry> sGtChanceToSpellCritBaseStore;
+TC_GAME_API extern GameTable<GtChanceToSpellCritEntry> sGtChanceToSpellCritStore;
+TC_GAME_API extern GameTable<GtCombatRatingsEntry> sGtCombatRatingsStore;
+TC_GAME_API extern GameTable<GtItemSocketCostPerLevelEntry> sGtItemSocketCostPerLevelStore;
+TC_GAME_API extern GameTable<GtNPCManaCostScalerEntry> sGtNPCManaCostScalerStore;
+TC_GAME_API extern GameTable<GtNpcTotalHpEntry> sGtNpcTotalHpStore;
+TC_GAME_API extern GameTable<GtNpcTotalHpExp1Entry> sGtNpcTotalHpExp1Store;
+TC_GAME_API extern GameTable<GtNpcTotalHpExp2Entry> sGtNpcTotalHpExp2Store;
+TC_GAME_API extern GameTable<GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store;
+TC_GAME_API extern GameTable<GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store;
+TC_GAME_API extern GameTable<GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store;
+TC_GAME_API extern GameTable<GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore;
+TC_GAME_API extern GameTable<GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore;
+TC_GAME_API extern GameTable<GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore;
+TC_GAME_API extern GameTable<GtRegenMPPerSptEntry> sGtRegenMPPerSptStore;
+TC_GAME_API extern GameTable<GtSpellScalingEntry> sGtSpellScalingStore;
+TC_GAME_API extern GameTable<GtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore;
+
+TC_GAME_API void LoadDBCStores(const std::string& dataPath, uint32 defaultLocale);
+TC_GAME_API void LoadGameTables(const std::string& dataPath, uint32 defaultLocale);
#endif
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h
index 9aae994f168..b76c5e08d32 100644
--- a/src/server/game/DungeonFinding/LFG.h
+++ b/src/server/game/DungeonFinding/LFG.h
@@ -99,7 +99,7 @@ enum LfgAnswer
LFG_ANSWER_AGREE = 1
};
-struct LfgLockInfoData
+struct TC_GAME_API LfgLockInfoData
{
LfgLockInfoData(uint32 _lockStatus = 0, uint16 _requiredItemLevel = 0, float _currentItemLevel = 0) :
lockStatus(_lockStatus), requiredItemLevel(_requiredItemLevel), currentItemLevel(_currentItemLevel) { }
@@ -115,9 +115,9 @@ typedef std::map<ObjectGuid, LfgLockMap> LfgLockPartyMap;
typedef std::map<ObjectGuid, uint8> LfgRolesMap;
typedef std::map<ObjectGuid, ObjectGuid> LfgGroupsMap;
-std::string ConcatenateDungeons(LfgDungeonSet const& dungeons);
-std::string GetRolesString(uint8 roles);
-std::string GetStateString(LfgState state);
+TC_GAME_API std::string ConcatenateDungeons(LfgDungeonSet const& dungeons);
+TC_GAME_API std::string GetRolesString(uint8 roles);
+TC_GAME_API std::string GetStateString(LfgState state);
} // namespace lfg
diff --git a/src/server/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h
index 7ae4777cd4d..62a41b6b350 100644
--- a/src/server/game/DungeonFinding/LFGGroupData.h
+++ b/src/server/game/DungeonFinding/LFGGroupData.h
@@ -31,7 +31,7 @@ enum LfgGroupEnum
/**
Stores all lfg data needed about a group.
*/
-class LfgGroupData
+class TC_GAME_API LfgGroupData
{
public:
LfgGroupData();
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 0bf31636697..e328732c0c5 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -258,6 +258,12 @@ void LFGMgr::LoadLFGDungeons(bool reload /* = false */)
CachedDungeonMapStore.clear();
}
+LFGMgr* LFGMgr::instance()
+{
+ static LFGMgr instance;
+ return &instance;
+}
+
void LFGMgr::Update(uint32 diff)
{
if (!isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index e092cbdee02..f38812549a6 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -295,18 +295,14 @@ struct LFGDungeonData
uint32 Entry() const { return id + (type << 24); }
};
-class LFGMgr
+class TC_GAME_API LFGMgr
{
private:
LFGMgr();
~LFGMgr();
public:
- static LFGMgr* instance()
- {
- static LFGMgr instance;
- return &instance;
- }
+ static LFGMgr* instance();
// Functions used outside lfg namespace
void Update(uint32 diff);
diff --git a/src/server/game/DungeonFinding/LFGPlayerData.h b/src/server/game/DungeonFinding/LFGPlayerData.h
index 859317ca956..91e4153a6d5 100644
--- a/src/server/game/DungeonFinding/LFGPlayerData.h
+++ b/src/server/game/DungeonFinding/LFGPlayerData.h
@@ -26,7 +26,7 @@ namespace lfg
/**
Stores all lfg data needed about the player.
*/
-class LfgPlayerData
+class TC_GAME_API LfgPlayerData
{
public:
LfgPlayerData();
diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h
index c9e2af7f480..c69b3cecb64 100644
--- a/src/server/game/DungeonFinding/LFGQueue.h
+++ b/src/server/game/DungeonFinding/LFGQueue.h
@@ -83,7 +83,7 @@ typedef std::map<ObjectGuid, LfgQueueData> LfgQueueDataContainer;
/**
Stores all data related to queue
*/
-class LFGQueue
+class TC_GAME_API LFGQueue
{
public:
diff --git a/src/server/game/DungeonFinding/LFGScripts.h b/src/server/game/DungeonFinding/LFGScripts.h
index 377614bc55d..ec64604a282 100644
--- a/src/server/game/DungeonFinding/LFGScripts.h
+++ b/src/server/game/DungeonFinding/LFGScripts.h
@@ -29,7 +29,7 @@ class Group;
namespace lfg
{
-class LFGPlayerScript : public PlayerScript
+class TC_GAME_API LFGPlayerScript : public PlayerScript
{
public:
LFGPlayerScript();
@@ -40,7 +40,7 @@ class LFGPlayerScript : public PlayerScript
void OnMapChanged(Player* player) override;
};
-class LFGGroupScript : public GroupScript
+class TC_GAME_API LFGGroupScript : public GroupScript
{
public:
LFGGroupScript();
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index 7a6581e13c4..e3caa6d2e95 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -23,7 +23,7 @@
class Unit;
class SpellInfo;
-class AreaTrigger : public WorldObject, public GridObject<AreaTrigger>
+class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigger>
{
public:
AreaTrigger();
diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h
index 4d2775789eb..f961a966796 100644
--- a/src/server/game/Entities/Corpse/Corpse.h
+++ b/src/server/game/Entities/Corpse/Corpse.h
@@ -46,7 +46,7 @@ enum CorpseFlags
CORPSE_FLAG_LOOTABLE = 0x20
};
-class Corpse : public WorldObject, public GridObject<Corpse>
+class TC_GAME_API Corpse : public WorldObject, public GridObject<Corpse>
{
public:
explicit Corpse(CorpseType type = CORPSE_BONES);
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 594d2e81afe..47ef22b2df0 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -182,7 +182,7 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(),
m_groupLootTimer(0), m_PlayerDamageReq(0),
_pickpocketLootRestore(0), m_corpseRemoveTime(0), m_respawnTime(0),
-m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE),
+m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE),
m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(UI64LIT(0)), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false),
m_AlreadySearchedAssistance(false), m_regenHealth(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),
m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(NULL), m_creatureData(NULL), m_waypointID(0), m_path_id(0), m_formation(NULL)
@@ -586,6 +586,17 @@ void Creature::Update(uint32 diff)
LastCharmerGUID.Clear();
}
+ // periodic check to see if the creature has passed an evade boundary
+ if (IsAIEnabled && !IsInEvadeMode() && IsInCombat())
+ {
+ if (diff >= m_boundaryCheckTime)
+ {
+ AI()->CheckInRoom();
+ m_boundaryCheckTime = 2500;
+ } else
+ m_boundaryCheckTime -= diff;
+ }
+
// if periodic combat pulse is enabled and we are both in combat and in a dungeon, do this now
if (m_combatPulseDelay > 0 && IsInCombat() && GetMap()->IsDungeon())
{
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 8ae94e51451..96b04b32f84 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -74,7 +74,7 @@ enum CreatureFlagsExtra
#define MAX_CREATURE_DIFFICULTIES 3
// from `creature_template` table
-struct CreatureTemplate
+struct TC_GAME_API CreatureTemplate
{
uint32 Entry;
uint32 DifficultyEntry[MAX_CREATURE_DIFFICULTIES];
@@ -213,7 +213,7 @@ typedef std::unordered_map<uint32, CreatureTemplate> CreatureTemplateContainer;
#pragma pack(push, 1)
// Defines base stats for creatures (used to calculate HP/mana/armor/attackpower/rangedattackpower/all damage).
-struct CreatureBaseStats
+struct TC_GAME_API CreatureBaseStats
{
uint32 BaseHealth[MAX_EXPANSIONS];
uint32 BaseMana;
@@ -440,7 +440,7 @@ struct TrainerSpell
typedef std::unordered_map<uint32 /*spellid*/, TrainerSpell> TrainerSpellMap;
-struct TrainerSpellData
+struct TC_GAME_API TrainerSpellData
{
TrainerSpellData() : trainerType(0) { }
~TrainerSpellData() { spellList.clear(); }
@@ -462,7 +462,7 @@ typedef std::map<uint32, time_t> CreatureSpellCooldowns;
typedef std::vector<uint8> CreatureTextRepeatIds;
typedef std::unordered_map<uint8, CreatureTextRepeatIds> CreatureTextRepeatGroup;
-class Creature : public Unit, public GridObject<Creature>, public MapObject
+class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public MapObject
{
public:
@@ -638,6 +638,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
float GetRespawnRadius() const { return m_respawnradius; }
void SetRespawnRadius(float dist) { m_respawnradius = dist; }
+ void DoImmediateBoundaryCheck() { m_boundaryCheckTime = 0; }
uint32 GetCombatPulseDelay() const { return m_combatPulseDelay; }
void SetCombatPulseDelay(uint32 delay) // (secs) interval at which the creature pulses the entire zone into combat (only works in dungeons)
{
@@ -731,6 +732,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
uint32 m_respawnDelay; // (secs) delay between corpse disappearance and respawning
uint32 m_corpseDelay; // (secs) delay between death and corpse disappearance
float m_respawnradius;
+ uint32 m_boundaryCheckTime; // (msecs) remaining time for next evade boundary check
uint32 m_combatPulseTime; // (msecs) remaining time for next zone-in-combat pulse
uint32 m_combatPulseDelay; // (secs) how often the creature puts the entire zone in combat (only works in dungeons)
@@ -781,7 +783,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
CreatureTextRepeatGroup m_textRepeat;
};
-class AssistDelayEvent : public BasicEvent
+class TC_GAME_API AssistDelayEvent : public BasicEvent
{
public:
AssistDelayEvent(ObjectGuid victim, Unit& owner) : BasicEvent(), m_victim(victim), m_owner(owner) { }
@@ -796,7 +798,7 @@ class AssistDelayEvent : public BasicEvent
Unit& m_owner;
};
-class ForcedDespawnDelayEvent : public BasicEvent
+class TC_GAME_API ForcedDespawnDelayEvent : public BasicEvent
{
public:
ForcedDespawnDelayEvent(Creature& owner) : BasicEvent(), m_owner(owner) { }
diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp
index 666ee0a82d0..b33777eb1fa 100644
--- a/src/server/game/Entities/Creature/CreatureGroups.cpp
+++ b/src/server/game/Entities/Creature/CreatureGroups.cpp
@@ -30,6 +30,12 @@ FormationMgr::~FormationMgr()
delete itr->second;
}
+FormationMgr* FormationMgr::instance()
+{
+ static FormationMgr instance;
+ return &instance;
+}
+
void FormationMgr::AddCreatureToGroup(ObjectGuid::LowType leaderGuid, Creature* creature)
{
Map* map = creature->FindMap();
diff --git a/src/server/game/Entities/Creature/CreatureGroups.h b/src/server/game/Entities/Creature/CreatureGroups.h
index ca0aea431d8..36e72b66753 100644
--- a/src/server/game/Entities/Creature/CreatureGroups.h
+++ b/src/server/game/Entities/Creature/CreatureGroups.h
@@ -38,18 +38,14 @@ struct FormationInfo
typedef std::unordered_map<ObjectGuid::LowType/*memberDBGUID*/, FormationInfo*> CreatureGroupInfoType;
-class FormationMgr
+class TC_GAME_API FormationMgr
{
private:
FormationMgr() { }
~FormationMgr();
public:
- static FormationMgr* instance()
- {
- static FormationMgr instance;
- return &instance;
- }
+ static FormationMgr* instance();
void AddCreatureToGroup(ObjectGuid::LowType leaderGuid, Creature* creature);
void RemoveCreatureFromGroup(CreatureGroup* group, Creature* creature);
@@ -57,7 +53,7 @@ class FormationMgr
CreatureGroupInfoType CreatureGroupMap;
};
-class CreatureGroup
+class TC_GAME_API CreatureGroup
{
private:
Creature* m_leader; //Important do not forget sometimes to work with pointers instead synonims :D:D
diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h
index ba5a2e1f6ba..ebd3045be67 100644
--- a/src/server/game/Entities/Creature/GossipDef.h
+++ b/src/server/game/Entities/Creature/GossipDef.h
@@ -158,7 +158,7 @@ struct QuestMenuItem
typedef std::vector<QuestMenuItem> QuestMenuItemList;
-class GossipMenu
+class TC_GAME_API GossipMenu
{
public:
GossipMenu();
@@ -216,7 +216,7 @@ class GossipMenu
LocaleConstant _locale;
};
-class QuestMenu
+class TC_GAME_API QuestMenu
{
public:
QuestMenu();
@@ -233,7 +233,7 @@ class QuestMenu
QuestMenuItemList _questMenuItems;
};
-class PlayerMenu
+class TC_GAME_API PlayerMenu
{
public:
explicit PlayerMenu(WorldSession* session);
diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h
index f3c7b0eda2e..d43e7fcf626 100644
--- a/src/server/game/Entities/Creature/TemporarySummon.h
+++ b/src/server/game/Entities/Creature/TemporarySummon.h
@@ -37,7 +37,7 @@ struct TempSummonData
uint32 time; ///< Despawn time, usable only with certain temp summon types
};
-class TempSummon : public Creature
+class TC_GAME_API TempSummon : public Creature
{
public:
explicit TempSummon(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject);
@@ -63,7 +63,7 @@ class TempSummon : public Creature
ObjectGuid m_summonerGUID;
};
-class Minion : public TempSummon
+class TC_GAME_API Minion : public TempSummon
{
public:
Minion(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject);
@@ -80,7 +80,7 @@ class Minion : public TempSummon
float m_followAngle;
};
-class Guardian : public Minion
+class TC_GAME_API Guardian : public Minion
{
public:
Guardian(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject);
@@ -104,7 +104,7 @@ class Guardian : public Minion
float m_statFromOwner[MAX_STATS];
};
-class Puppet : public Minion
+class TC_GAME_API Puppet : public Minion
{
public:
Puppet(SummonPropertiesEntry const* properties, Unit* owner);
@@ -114,7 +114,7 @@ class Puppet : public Minion
void RemoveFromWorld() override;
};
-class ForcedUnsummonDelayEvent : public BasicEvent
+class TC_GAME_API ForcedUnsummonDelayEvent : public BasicEvent
{
public:
ForcedUnsummonDelayEvent(TempSummon& owner) : BasicEvent(), m_owner(owner) { }
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h
index 78ef5ca935f..09426a3c044 100644
--- a/src/server/game/Entities/DynamicObject/DynamicObject.h
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.h
@@ -32,7 +32,7 @@ enum DynamicObjectType
DYNAMIC_OBJECT_FARSIGHT_FOCUS = 0x2
};
-class DynamicObject : public WorldObject, public GridObject<DynamicObject>, public MapObject
+class TC_GAME_API DynamicObject : public WorldObject, public GridObject<DynamicObject>, public MapObject
{
public:
DynamicObject(bool isWorldObject);
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 010ea09347f..47d06e1492b 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -877,7 +877,7 @@ class GameObjectModel;
// 5 sec for bobber catch
#define FISHING_BOBBER_READY_TIME 5
-class GameObject : public WorldObject, public GridObject<GameObject>, public MapObject
+class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>, public MapObject
{
public:
explicit GameObject();
diff --git a/src/server/game/Entities/Item/Container/Bag.h b/src/server/game/Entities/Item/Container/Bag.h
index 449301ee5ce..128213af4b4 100644
--- a/src/server/game/Entities/Item/Container/Bag.h
+++ b/src/server/game/Entities/Item/Container/Bag.h
@@ -25,7 +25,7 @@
#include "Item.h"
#include "ItemTemplate.h"
-class Bag : public Item
+class TC_GAME_API Bag : public Item
{
public:
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 7d1c3761430..4836c7b7246 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -256,7 +256,7 @@ struct BonusData
void AddBonus(uint32 type, int32 const (&values)[2]);
};
-class Item : public Object
+class TC_GAME_API Item : public Object
{
public:
static Item* CreateItem(uint32 itemEntry, uint32 count, Player const* player = NULL);
diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
index 99fe78bea2f..daf3473c5a8 100644
--- a/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
+++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
@@ -44,7 +44,7 @@ typedef std::unordered_map<uint32, EnchStoreList> EnchantmentStore;
static EnchantmentStore RandomItemEnch;
-void LoadRandomEnchantmentsTable()
+TC_GAME_API void LoadRandomEnchantmentsTable()
{
uint32 oldMSTime = getMSTime();
@@ -77,7 +77,7 @@ void LoadRandomEnchantmentsTable()
TC_LOG_ERROR("server.loading", ">> Loaded 0 Item Enchantment definitions. DB table `item_enchantment_template` is empty.");
}
-uint32 GetItemEnchantMod(int32 entry)
+TC_GAME_API uint32 GetItemEnchantMod(int32 entry)
{
if (!entry)
return 0;
@@ -118,7 +118,7 @@ uint32 GetItemEnchantMod(int32 entry)
return 0;
}
-uint32 GenerateEnchSuffixFactor(uint32 item_id)
+TC_GAME_API uint32 GenerateEnchSuffixFactor(uint32 item_id)
{
ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(item_id);
@@ -130,7 +130,7 @@ uint32 GenerateEnchSuffixFactor(uint32 item_id)
return GetRandomPropertyPoints(itemProto->GetBaseItemLevel(), itemProto->GetQuality(), itemProto->GetInventoryType(), itemProto->GetSubClass());
}
-uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass)
+TC_GAME_API uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass)
{
uint32 propIndex;
diff --git a/src/server/game/Entities/Item/ItemEnchantmentMgr.h b/src/server/game/Entities/Item/ItemEnchantmentMgr.h
index 25278caa512..ec84b13dec5 100644
--- a/src/server/game/Entities/Item/ItemEnchantmentMgr.h
+++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.h
@@ -21,9 +21,9 @@
#include "Common.h"
-void LoadRandomEnchantmentsTable();
-uint32 GetItemEnchantMod(int32 entry);
-uint32 GenerateEnchSuffixFactor(uint32 item_id);
-uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subclass);
+TC_GAME_API void LoadRandomEnchantmentsTable();
+TC_GAME_API uint32 GetItemEnchantMod(int32 entry);
+TC_GAME_API uint32 GenerateEnchSuffixFactor(uint32 item_id);
+TC_GAME_API uint32 GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subclass);
#endif
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index 46584e1b5d3..aa65fdd3d6e 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -644,7 +644,7 @@ const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] =
class Player;
-struct ItemTemplate
+struct TC_GAME_API ItemTemplate
{
ItemEntry const* BasicData;
ItemSparseEntry const* ExtendedData;
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 4d54de20277..e3f22a41275 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -92,7 +92,7 @@ class ZoneScript;
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
-class Object
+class TC_GAME_API Object
{
public:
virtual ~Object();
@@ -395,7 +395,7 @@ enum MapObjectCellMoveState
MAP_OBJECT_CELL_MOVE_INACTIVE, //in move list but should not move
};
-class MapObject
+class TC_GAME_API MapObject
{
friend class Map; //map for moving creatures
friend class ObjectGridLoader; //grid loader for loading creatures
@@ -420,7 +420,7 @@ class MapObject
}
};
-class WorldObject : public Object, public WorldLocation
+class TC_GAME_API WorldObject : public Object, public WorldLocation
{
protected:
explicit WorldObject(bool isWorldObject); //note: here it means if it is in grid object list or world object list
diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp
index 5d7c19d48e7..6d063a901bd 100644
--- a/src/server/game/Entities/Object/ObjectGuid.cpp
+++ b/src/server/game/Entities/Object/ObjectGuid.cpp
@@ -177,3 +177,29 @@ void ObjectGuidGeneratorBase::HandleCounterOverflow(HighGuid high)
TC_LOG_ERROR("misc", "%s guid overflow!! Can't continue, shutting down server. ", ObjectGuid::GetTypeName(high));
World::StopNow(ERROR_EXIT_CODE);
}
+
+#define GUID_TRAIT_INSTANTIATE_GUID( HIGH_GUID ) \
+ template class TC_GAME_API ObjectGuidGenerator< HIGH_GUID >;
+
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Player)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Item)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Transport)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Guild)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Conversation)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Creature)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Vehicle)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Pet)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::GameObject)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::DynamicObject)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AreaTrigger)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Corpse)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::LootObject)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::SceneObject)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Scenario)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AIGroup)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::DynamicDoor)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::Vignette)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::CallForHelp)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AIResource)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AILock)
+GUID_TRAIT_INSTANTIATE_GUID(HighGuid::AILockTicket)
diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h
index def19abca78..8bc2ee4df28 100644
--- a/src/server/game/Entities/Object/ObjectGuid.h
+++ b/src/server/game/Entities/Object/ObjectGuid.h
@@ -180,11 +180,11 @@ class PackedGuid;
#pragma pack(push, 1)
-class ObjectGuid
+class TC_GAME_API ObjectGuid
{
- friend std::ostream& operator<<(std::ostream& stream, ObjectGuid const& guid);
- friend ByteBuffer& operator<<(ByteBuffer& buf, ObjectGuid const& guid);
- friend ByteBuffer& operator>>(ByteBuffer& buf, ObjectGuid& guid);
+ friend TC_GAME_API std::ostream& operator<<(std::ostream& stream, ObjectGuid const& guid);
+ friend TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, ObjectGuid const& guid);
+ friend TC_GAME_API ByteBuffer& operator>>(ByteBuffer& buf, ObjectGuid& guid);
public:
static ObjectGuid const Empty;
@@ -332,9 +332,9 @@ typedef std::unordered_set<ObjectGuid> GuidUnorderedSet;
// maximum buffer size for packed guid is 18 bytes
#define PACKED_GUID_MIN_BUFFER_SIZE 18
-class PackedGuid
+class TC_GAME_API PackedGuid
{
- friend ByteBuffer& operator<<(ByteBuffer& buf, PackedGuid const& guid);
+ friend TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, PackedGuid const& guid);
public:
explicit PackedGuid() : _packedGuid(PACKED_GUID_MIN_BUFFER_SIZE) { _packedGuid << uint16(0); }
@@ -348,7 +348,7 @@ class PackedGuid
ByteBuffer _packedGuid;
};
-class ObjectGuidGeneratorBase
+class TC_GAME_API ObjectGuidGeneratorBase
{
public:
ObjectGuidGeneratorBase(ObjectGuid::LowType start = UI64LIT(1)) : _nextGuid(start) { }
@@ -363,7 +363,7 @@ protected:
};
template<HighGuid high>
-class ObjectGuidGenerator : public ObjectGuidGeneratorBase
+class TC_GAME_API ObjectGuidGenerator : public ObjectGuidGeneratorBase
{
public:
explicit ObjectGuidGenerator(ObjectGuid::LowType start = UI64LIT(1)) : ObjectGuidGeneratorBase(start) { }
@@ -376,12 +376,12 @@ public:
}
};
-ByteBuffer& operator<<(ByteBuffer& buf, ObjectGuid const& guid);
-ByteBuffer& operator>>(ByteBuffer& buf, ObjectGuid& guid);
+TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, ObjectGuid const& guid);
+TC_GAME_API ByteBuffer& operator>>(ByteBuffer& buf, ObjectGuid& guid);
-ByteBuffer& operator<<(ByteBuffer& buf, PackedGuid const& guid);
+TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, PackedGuid const& guid);
-std::ostream& operator<<(std::ostream& stream, ObjectGuid const& guid);
+TC_GAME_API std::ostream& operator<<(std::ostream& stream, ObjectGuid const& guid);
namespace std
{
diff --git a/src/server/game/Entities/Object/ObjectPosSelector.h b/src/server/game/Entities/Object/ObjectPosSelector.h
index 26a23678009..84c694abf08 100644
--- a/src/server/game/Entities/Object/ObjectPosSelector.h
+++ b/src/server/game/Entities/Object/ObjectPosSelector.h
@@ -30,7 +30,7 @@ inline UsedPosType operator ~(UsedPosType uptype)
return uptype==USED_POS_PLUS ? USED_POS_MINUS : USED_POS_PLUS;
}
-struct ObjectPosSelector
+struct TC_GAME_API ObjectPosSelector
{
struct UsedPos
{
diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h
index cc528b973f8..a941a2141f1 100644
--- a/src/server/game/Entities/Object/Position.h
+++ b/src/server/game/Entities/Object/Position.h
@@ -24,7 +24,7 @@
class ByteBuffer;
-struct Position
+struct TC_GAME_API Position
{
Position(float x = 0, float y = 0, float z = 0, float o = 0)
: m_positionX(x), m_positionY(y), m_positionZ(z), m_orientation(NormalizeOrientation(o)) { }
@@ -225,7 +225,7 @@ public:
#define MAPID_INVALID 0xFFFFFFFF
-class WorldLocation : public Position
+class TC_GAME_API WorldLocation : public Position
{
public:
explicit WorldLocation(uint32 mapId = MAPID_INVALID, float x = 0.f, float y = 0.f, float z = 0.f, float o = 0.f)
@@ -256,11 +256,11 @@ public:
uint32 m_mapId;
};
-ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYStreamer const& streamer);
-ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYStreamer const& streamer);
-ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
-ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
-ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
-ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
+TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYStreamer const& streamer);
+TC_GAME_API ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYStreamer const& streamer);
+TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
+TC_GAME_API ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZStreamer const& streamer);
+TC_GAME_API ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
+TC_GAME_API ByteBuffer& operator>>(ByteBuffer& buf, Position::PositionXYZOStreamer const& streamer);
#endif // Trinity_game_Position_h__
diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h
index 6d0d2fecca5..046916ea9d1 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h
@@ -37,17 +37,17 @@ enum UpdatefieldFlags
UF_FLAG_URGENT_SELF_ONLY = 0x400
};
-extern uint32 ItemUpdateFieldFlags[CONTAINER_END];
-extern uint32 ItemDynamicUpdateFieldFlags[CONTAINER_DYNAMIC_END];
-extern uint32 UnitUpdateFieldFlags[PLAYER_END];
-extern uint32 UnitDynamicUpdateFieldFlags[PLAYER_DYNAMIC_END];
-extern uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END];
-extern uint32 GameObjectDynamicUpdateFieldFlags[GAMEOBJECT_DYNAMIC_END];
-extern uint32 DynamicObjectUpdateFieldFlags[DYNAMICOBJECT_END];
-extern uint32 CorpseUpdateFieldFlags[CORPSE_END];
-extern uint32 AreaTriggerUpdateFieldFlags[AREATRIGGER_END];
-extern uint32 SceneObjectUpdateFieldFlags[SCENEOBJECT_END];
-extern uint32 ConversationUpdateFieldFlags[CONVERSATION_END];
-extern uint32 ConversationDynamicUpdateFieldFlags[CONVERSATION_DYNAMIC_END];
+TC_GAME_API extern uint32 ItemUpdateFieldFlags[CONTAINER_END];
+TC_GAME_API extern uint32 ItemDynamicUpdateFieldFlags[CONTAINER_DYNAMIC_END];
+TC_GAME_API extern uint32 UnitUpdateFieldFlags[PLAYER_END];
+TC_GAME_API extern uint32 UnitDynamicUpdateFieldFlags[PLAYER_DYNAMIC_END];
+TC_GAME_API extern uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END];
+TC_GAME_API extern uint32 GameObjectDynamicUpdateFieldFlags[GAMEOBJECT_DYNAMIC_END];
+TC_GAME_API extern uint32 DynamicObjectUpdateFieldFlags[DYNAMICOBJECT_END];
+TC_GAME_API extern uint32 CorpseUpdateFieldFlags[CORPSE_END];
+TC_GAME_API extern uint32 AreaTriggerUpdateFieldFlags[AREATRIGGER_END];
+TC_GAME_API extern uint32 SceneObjectUpdateFieldFlags[SCENEOBJECT_END];
+TC_GAME_API extern uint32 ConversationUpdateFieldFlags[CONVERSATION_END];
+TC_GAME_API extern uint32 ConversationDynamicUpdateFieldFlags[CONVERSATION_DYNAMIC_END];
#endif // _UPDATEFIELDFLAGS_H
diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h
index bc989b515eb..170b881fa50 100644
--- a/src/server/game/Entities/Pet/Pet.h
+++ b/src/server/game/Entities/Pet/Pet.h
@@ -43,7 +43,7 @@ typedef std::vector<uint32> AutoSpellList;
class Player;
-class Pet : public Guardian
+class TC_GAME_API Pet : public Guardian
{
public:
explicit Pet(Player* owner, PetType type = MAX_PET_TYPE);
diff --git a/src/server/game/Entities/Player/CollectionMgr.h b/src/server/game/Entities/Player/CollectionMgr.h
index 6870cd5732d..aa2f70d4df9 100644
--- a/src/server/game/Entities/Player/CollectionMgr.h
+++ b/src/server/game/Entities/Player/CollectionMgr.h
@@ -45,7 +45,7 @@ struct HeirloomData
typedef std::map<uint32, bool> ToyBoxContainer;
typedef std::map<uint32, HeirloomData> HeirloomContainer;
-class CollectionMgr
+class TC_GAME_API CollectionMgr
{
public:
explicit CollectionMgr(WorldSession* owner) : _owner(owner) { }
diff --git a/src/server/game/Entities/Player/KillRewarder.h b/src/server/game/Entities/Player/KillRewarder.h
index 08530de900c..210e5ff0246 100644
--- a/src/server/game/Entities/Player/KillRewarder.h
+++ b/src/server/game/Entities/Player/KillRewarder.h
@@ -24,7 +24,7 @@ class Player;
class Unit;
class Group;
-class KillRewarder
+class TC_GAME_API KillRewarder
{
public:
KillRewarder(Player* killer, Unit* victim, bool isBattleGround);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 60ae8d6b075..950a1ff0841 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -167,8 +167,6 @@ Player::Player(WorldSession* session) : Unit(true)
m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
- _resurrectionData = nullptr;
-
memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
m_social = nullptr;
@@ -403,8 +401,6 @@ Player::~Player()
for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i)
delete _voidStorageItems[i];
- ClearResurrectRequestData();
-
sWorld->DecreasePlayerCount();
}
@@ -1366,6 +1362,7 @@ void Player::Update(uint32 p_time)
//because we don't want player's ghost teleported from graveyard
if (IsHasDelayedTeleport() && IsAlive())
TeleportTo(m_teleport_dest, m_teleport_options);
+
}
void Player::setDeathState(DeathState s)
@@ -1562,7 +1559,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
// Check enter rights before map getting to avoid creating instance copy for player
// this check not dependent from map instance copy and same for all instance copies of selected map
- if (!sMapMgr->CanPlayerEnter(mapid, this, false))
+ if (sMapMgr->PlayerCannotEnter(mapid, this, false))
return false;
// Seamless teleport can happen only if cosmetic maps match
@@ -1706,28 +1703,7 @@ void Player::ProcessDelayedOperations()
return;
if (m_DelayedOperations & DELAYED_RESURRECT_PLAYER)
- {
- ResurrectPlayer(0.0f, false);
-
- if (GetMaxHealth() > _resurrectionData->Health)
- SetHealth(_resurrectionData->Health);
- else
- SetFullHealth();
-
- if (uint32(GetMaxPower(POWER_MANA)) > _resurrectionData->Mana)
- SetPower(POWER_MANA, _resurrectionData->Mana);
- else
- SetPower(POWER_MANA, GetMaxPower(POWER_MANA));
-
- SetPower(POWER_RAGE, 0);
- SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY));
- SetPower(POWER_ECLIPSE, 0);
-
- if (uint32 aura = _resurrectionData->Aura)
- CastSpell(this, aura, true, nullptr, nullptr, _resurrectionData->GUID);
-
- SpawnCorpseBones();
- }
+ ResurrectUsingRequestDataImpl();
if (m_DelayedOperations & DELAYED_SAVE_PLAYER)
SaveToDB();
@@ -2298,7 +2274,7 @@ void Player::SetGameMaster(bool on)
bool Player::CanBeGameMaster() const
{
- return m_session && m_session->HasPermission(rbac::RBAC_PERM_COMMAND_GM);
+ return GetSession()->HasPermission(rbac::RBAC_PERM_COMMAND_GM);
}
void Player::SetGMVisible(bool on)
@@ -6894,6 +6870,7 @@ void Player::UpdateArea(uint32 newArea)
UpdatePvPState(true);
UpdateAreaDependentAuras(newArea);
+ UpdateAreaPhase();
// previously this was in UpdateZone (but after UpdateArea) so nothing will break
pvpInfo.IsInNoPvPArea = false;
@@ -15069,13 +15046,7 @@ QuestStatus Player::GetQuestStatus(uint32 quest_id) const
bool Player::CanShareQuest(uint32 quest_id) const
{
Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
- if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE))
- {
- QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
- if (itr != m_QuestStatus.end())
- return itr->second.Status == QUEST_STATUS_INCOMPLETE;
- }
- return false;
+ return qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE) && IsActiveQuest(quest_id);
}
void Player::SetQuestStatus(uint32 questId, QuestStatus status, bool update /*= true*/)
@@ -16658,7 +16629,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
// NOW player must have valid map
// load the player's map here if it's not already loaded
- Map* map = sMapMgr->CreateMap(mapId, this);
+ Map* map = sMapMgr->CreateMap(mapId, this, instanceId);
AreaTriggerStruct const* areaTrigger = nullptr;
bool check = false;
@@ -16669,8 +16640,28 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
}
else if (map->IsDungeon()) // if map is dungeon...
{
- if (!((InstanceMap*)map)->CanEnter(this) || !CheckInstanceLoginValid(map)) // ... and can't enter map, then look for entry point.
+ if (Map::EnterState denyReason = ((InstanceMap*)map)->CannotEnter(this)) // ... and can't enter map, then look for entry point.
{
+ switch (denyReason)
+ {
+ case Map::CANNOT_ENTER_DIFFICULTY_UNAVAILABLE:
+ SendTransferAborted(map->GetId(), TRANSFER_ABORT_DIFFICULTY, map->GetDifficultyID());
+ break;
+ case Map::CANNOT_ENTER_INSTANCE_BIND_MISMATCH:
+ ChatHandler(GetSession()).PSendSysMessage(GetSession()->GetTrinityString(LANG_INSTANCE_BIND_MISMATCH), map->GetMapName());
+ break;
+ case Map::CANNOT_ENTER_TOO_MANY_INSTANCES:
+ SendTransferAborted(map->GetId(), TRANSFER_ABORT_TOO_MANY_INSTANCES);
+ break;
+ case Map::CANNOT_ENTER_MAX_PLAYERS:
+ SendTransferAborted(map->GetId(), TRANSFER_ABORT_MAX_PLAYERS);
+ break;
+ case Map::CANNOT_ENTER_ZONE_IN_COMBAT:
+ SendTransferAborted(map->GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);
+ break;
+ default:
+ break;
+ }
areaTrigger = sObjectMgr->GetGoBackTrigger(mapId);
check = true;
}
@@ -16716,6 +16707,10 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
SetMap(map);
+ // now that map position is determined, check instance validity
+ if (!CheckInstanceValidity(true) && !IsInstanceLoginGameMasterException())
+ m_InstanceValid = false;
+
// randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
// this must help in case next save after mass player load after server startup
m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2);
@@ -18314,31 +18309,6 @@ void Player::SendRaidInfo()
GetSession()->SendPacket(instanceInfo.Write());
}
-/// convert the player's binds to the group
-void Player::ConvertInstancesToGroup(Player* player, Group* group, bool switchLeader)
-{
- // copy all binds to the group, when changing leader it's assumed the character
- // will not have any solo binds
-
- for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
- {
- for (BoundInstancesMap::iterator itr = player->m_boundInstances[i].begin(); itr != player->m_boundInstances[i].end();)
- {
- if (!switchLeader || !group->GetBoundInstance(itr->second.save->GetDifficultyID(), itr->first))
- group->BindToInstance(itr->second.save, itr->second.perm, false);
-
- // permanent binds are not removed
- if (switchLeader && !itr->second.perm)
- {
- // increments itr in call
- player->UnbindInstance(itr, Difficulty(i), false);
- }
- else
- ++itr;
- }
- }
-}
-
bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report)
{
if (!IsGameMaster() && ar)
@@ -18411,37 +18381,68 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report
return true;
}
-bool Player::CheckInstanceLoginValid(Map* map)
+bool Player::IsInstanceLoginGameMasterException() const
{
- if (!map->IsDungeon() || IsGameMaster())
- return true;
-
- if (map->IsRaid())
+ if (CanBeGameMaster())
{
- // cannot be in raid instance without a group
- if (!GetGroup())
- return IsInstanceLoginGameMasterException();
+ ChatHandler(GetSession()).SendSysMessage(LANG_INSTANCE_LOGIN_GAMEMASTER_EXCEPTION);
+ return true;
}
else
- {
- // cannot be in normal instance without a group and more players than 1 in instance
- if (!GetGroup() && map->GetPlayersCountExceptGMs() > 1)
- return IsInstanceLoginGameMasterException();
- }
-
- // do checks for satisfy accessreqs, instance full, encounter in progress (raid), perm bind group != perm bind player
- return sMapMgr->CanPlayerEnter(map->GetId(), this, true) || IsInstanceLoginGameMasterException();
+ return false;
}
-bool Player::IsInstanceLoginGameMasterException() const
+bool Player::CheckInstanceValidity(bool /*isLogin*/)
{
- if (CanBeGameMaster())
- {
- ChatHandler(GetSession()).PSendSysMessage("You didn't get kicked out of the instance even if Player::CheckInstanceLoginValid() returned false and without .gm on flag");
+ // game masters' instances are always valid
+ if (IsGameMaster())
+ return true;
+
+ // non-instances are always valid
+ Map* map = GetMap();
+ if (!map || !map->IsDungeon())
return true;
+
+ // raid instances require the player to be in a raid group to be valid
+ if (map->IsRaid() && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
+ if (!GetGroup() || !GetGroup()->isRaidGroup())
+ return false;
+
+ if (Group* group = GetGroup())
+ {
+ // check if player's group is bound to this instance
+ InstanceGroupBind* bind = group->GetBoundInstance(map->GetDifficultyID(), map->GetId());
+ if (!bind || !bind->save || bind->save->GetInstanceId() != map->GetInstanceId())
+ return false;
+
+ Map::PlayerList const& players = map->GetPlayers();
+ if (!players.isEmpty())
+ for (Map::PlayerList::const_iterator it = players.begin(); it != players.end(); ++it)
+ {
+ if (Player* otherPlayer = it->GetSource())
+ {
+ if (otherPlayer->IsGameMaster())
+ continue;
+ if (!otherPlayer->m_InstanceValid) // ignore players that currently have a homebind timer active
+ continue;
+ if (group != otherPlayer->GetGroup())
+ return false;
+ }
+ }
}
else
- return false;
+ {
+ // instance is invalid if we are not grouped and there are other players
+ if (map->GetPlayersCountExceptGMs() > 1)
+ return false;
+
+ // check if the player is bound to this instance
+ InstancePlayerBind* bind = GetBoundInstance(map->GetId(), map->GetDifficultyID());
+ if (!bind || !bind->save || bind->save->GetInstanceId() != map->GetInstanceId())
+ return false;
+ }
+
+ return true;
}
bool Player::CheckInstanceCount(uint32 instanceId) const
@@ -21511,13 +21512,14 @@ void Player::UpdatePotionCooldown(Spell* spell)
void Player::SetResurrectRequestData(Unit* caster, uint32 health, uint32 mana, uint32 appliedAura)
{
ASSERT(!IsResurrectRequested());
- _resurrectionData = new ResurrectionData();
+ _resurrectionData.reset(new ResurrectionData());
_resurrectionData->GUID = caster->GetGUID();
_resurrectionData->Location.WorldRelocate(*caster);
_resurrectionData->Health = health;
_resurrectionData->Mana = mana;
_resurrectionData->Aura = appliedAura;
}
+
//slot to be excluded while counting
bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) const
{
@@ -23429,9 +23431,7 @@ bool Player::IsAtRecruitAFriendDistance(WorldObject const* pOther) const
void Player::ResurrectUsingRequestData()
{
/// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse
- float x, y, z, o;
- _resurrectionData->Location.GetPosition(x, y, z, o);
- TeleportTo(_resurrectionData->Location.GetMapId(), x, y, z, o);
+ TeleportTo(_resurrectionData->Location);
if (IsBeingTeleported())
{
@@ -23439,6 +23439,11 @@ void Player::ResurrectUsingRequestData()
return;
}
+ ResurrectUsingRequestDataImpl();
+}
+
+void Player::ResurrectUsingRequestDataImpl()
+{
ResurrectPlayer(0.0f, false);
if (GetMaxHealth() > _resurrectionData->Health)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 07d7c80a5e2..3fc5a7d76fd 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -115,7 +115,7 @@ struct PlayerSpell
bool disabled : 1; // first rank has been learned in result talent learn but currently talent unlearned, save max learned ranks
};
-extern uint32 const MasterySpells[MAX_CLASSES];
+TC_GAME_API extern uint32 const MasterySpells[MAX_CLASSES];
enum TalentSpecialization // talent tabs
{
@@ -1012,7 +1012,7 @@ enum PlayerDelayedOperations
// Player summoning auto-decline time (in secs)
#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
// Maximum money amount : 2^31 - 1
-extern uint64 const MAX_MONEY_AMOUNT;
+TC_GAME_API extern uint64 const MAX_MONEY_AMOUNT;
struct InstancePlayerBind
{
@@ -1146,7 +1146,7 @@ struct ResurrectionData
static uint32 const DefaultTalentRowLevels[MAX_TALENT_TIERS] = { 15, 30, 45, 60, 75, 90, 100 };
static uint32 const DKTalentRowLevels[MAX_TALENT_TIERS] = { 57, 58, 59, 60, 75, 90, 100 };
-struct PlayerTalentInfo
+struct TC_GAME_API PlayerTalentInfo
{
PlayerTalentInfo() :
ResetTalentsCost(0), ResetTalentsTime(0),
@@ -1182,7 +1182,7 @@ private:
PlayerTalentInfo(PlayerTalentInfo const&);
};
-class Player : public Unit, public GridObject<Player>
+class TC_GAME_API Player : public Unit, public GridObject<Player>
{
friend class WorldSession;
friend void Item::AddToUpdateQueueOf(Player* player);
@@ -1813,11 +1813,10 @@ class Player : public Unit, public GridObject<Player>
void SetResurrectRequestData(Unit* caster, uint32 health, uint32 mana, uint32 appliedAura);
void ClearResurrectRequestData()
{
- delete _resurrectionData;
- _resurrectionData = nullptr;
+ _resurrectionData.reset();
}
- bool IsResurrectRequestedBy(ObjectGuid guid) const
+ bool IsResurrectRequestedBy(ObjectGuid const& guid) const
{
if (!IsResurrectRequested())
return false;
@@ -1825,8 +1824,9 @@ class Player : public Unit, public GridObject<Player>
return !_resurrectionData->GUID.IsEmpty() && _resurrectionData->GUID == guid;
}
- bool IsResurrectRequested() const { return _resurrectionData != nullptr; }
+ bool IsResurrectRequested() const { return _resurrectionData.get() != nullptr; }
void ResurrectUsingRequestData();
+ void ResurrectUsingRequestDataImpl();
uint8 getCinematic() const { return m_cinematic; }
void setCinematic(uint8 cine) { m_cinematic = cine; }
@@ -2353,9 +2353,8 @@ class Player : public Unit, public GridObject<Player>
void SetPendingBind(uint32 instanceId, uint32 bindTimer);
bool HasPendingBind() const { return _pendingBindId > 0; }
void SendRaidInfo();
- static void ConvertInstancesToGroup(Player* player, Group* group, bool switchLeader);
bool Satisfy(AccessRequirement const* ar, uint32 target_map, bool report = false);
- bool CheckInstanceLoginValid(Map* map);
+ bool CheckInstanceValidity(bool /*isLogin*/);
bool CheckInstanceCount(uint32 instanceId) const;
void AddInstanceEnterTime(uint32 instanceId, time_t enterTime);
@@ -2685,7 +2684,7 @@ class Player : public Unit, public GridObject<Player>
void ResetTimeSync();
void SendTimeSync();
- ResurrectionData* _resurrectionData;
+ std::unique_ptr<ResurrectionData> _resurrectionData;
WorldSession* m_session;
@@ -2838,8 +2837,8 @@ class Player : public Unit, public GridObject<Player>
WorldLocation _corpseLocation;
};
-void AddItemsSetItem(Player* player, Item* item);
-void RemoveItemsSetItem(Player* player, ItemTemplate const* proto);
+TC_GAME_API void AddItemsSetItem(Player* player, Item* item);
+TC_GAME_API void RemoveItemsSetItem(Player* player, ItemTemplate const* proto);
// "the bodies of template functions must be made available in a header file"
template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell* spell)
diff --git a/src/server/game/Entities/Player/PlayerTaxi.h b/src/server/game/Entities/Player/PlayerTaxi.h
index fb73042cb84..13aeed19ef8 100644
--- a/src/server/game/Entities/Player/PlayerTaxi.h
+++ b/src/server/game/Entities/Player/PlayerTaxi.h
@@ -6,7 +6,7 @@
#include "WorldSession.h"
#include <map>
-class PlayerTaxi
+class TC_GAME_API PlayerTaxi
{
public:
PlayerTaxi() { m_taximask.fill(0); }
diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp
index 6244475c458..7870c754ffc 100644
--- a/src/server/game/Entities/Player/SocialMgr.cpp
+++ b/src/server/game/Entities/Player/SocialMgr.cpp
@@ -161,6 +161,12 @@ bool PlayerSocial::HasIgnore(ObjectGuid const& ignoreGuid)
return _HasContact(ignoreGuid, SOCIAL_FLAG_IGNORED);
}
+SocialMgr* SocialMgr::instance()
+{
+ static SocialMgr instance;
+ return &instance;
+}
+
void SocialMgr::GetFriendInfo(Player* player, ObjectGuid const& friendGUID, FriendInfo& friendInfo)
{
if (!player)
diff --git a/src/server/game/Entities/Player/SocialMgr.h b/src/server/game/Entities/Player/SocialMgr.h
index d2237e328a7..df409106bdc 100644
--- a/src/server/game/Entities/Player/SocialMgr.h
+++ b/src/server/game/Entities/Player/SocialMgr.h
@@ -100,7 +100,7 @@ enum FriendsResult : uint8
#define SOCIALMGR_FRIEND_LIMIT 50u
#define SOCIALMGR_IGNORE_LIMIT 50u
-class PlayerSocial
+class TC_GAME_API PlayerSocial
{
friend class SocialMgr;
@@ -138,11 +138,7 @@ class SocialMgr
~SocialMgr() { }
public:
- static SocialMgr* instance()
- {
- static SocialMgr instance;
- return &instance;
- }
+ static SocialMgr* instance();
// Misc
void RemovePlayerSocial(ObjectGuid const& guid) { _socialMap.erase(guid); }
diff --git a/src/server/game/Entities/Player/TradeData.h b/src/server/game/Entities/Player/TradeData.h
index 0dfded6c4aa..365f7a9fa82 100644
--- a/src/server/game/Entities/Player/TradeData.h
+++ b/src/server/game/Entities/Player/TradeData.h
@@ -31,7 +31,7 @@ enum TradeSlots
class Item;
class Player;
-class TradeData
+class TC_GAME_API TradeData
{
public:
TradeData(Player* player, Player* trader) :
diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
index 5fe2db46fa5..6617267be6a 100644
--- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
+++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
@@ -25,6 +25,12 @@
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/property_map/transform_value_property_map.hpp>
+TaxiPathGraph& TaxiPathGraph::Instance()
+{
+ static TaxiPathGraph instance;
+ return instance;
+}
+
void TaxiPathGraph::Initialize()
{
if (GetVertexCount() > 0)
diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.h b/src/server/game/Entities/Taxi/TaxiPathGraph.h
index 0da1090ef8f..24ec3ce9a7e 100644
--- a/src/server/game/Entities/Taxi/TaxiPathGraph.h
+++ b/src/server/game/Entities/Taxi/TaxiPathGraph.h
@@ -25,14 +25,10 @@
class Player;
struct TaxiNodesEntry;
-class TaxiPathGraph
+class TC_GAME_API TaxiPathGraph
{
public:
- static TaxiPathGraph& Instance()
- {
- static TaxiPathGraph instance;
- return instance;
- }
+ static TaxiPathGraph& Instance();
void Initialize();
std::size_t GetCompleteNodeRoute(TaxiNodesEntry const* from, TaxiNodesEntry const* to, Player const* player, std::vector<uint32>& shortestPath);
diff --git a/src/server/game/Entities/Totem/Totem.h b/src/server/game/Entities/Totem/Totem.h
index f0a4af3a3d7..14bb60f916f 100644
--- a/src/server/game/Entities/Totem/Totem.h
+++ b/src/server/game/Entities/Totem/Totem.h
@@ -35,7 +35,7 @@ enum TotemSpells
SPELL_TOTEMIC_WRATH = 77747
};
-class Totem : public Minion
+class TC_GAME_API Totem : public Minion
{
public:
Totem(SummonPropertiesEntry const* properties, Unit* owner);
diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index 9385d262ad8..f4d2866fbb3 100644
--- a/src/server/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
@@ -25,7 +25,7 @@
struct CreatureData;
-class Transport : public GameObject, public TransportBase
+class TC_GAME_API Transport : public GameObject, public TransportBase
{
friend Transport* TransportMgr::CreateTransport(uint32, ObjectGuid::LowType, Map*, uint32, uint32);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 0e61c3d0df9..9a2a955d74d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -10746,7 +10746,7 @@ void Unit::TauntFadeOut(Unit* taunter)
if (m_ThreatManager.isThreatListEmpty())
{
if (creature->IsAIEnabled)
- creature->AI()->EnterEvadeMode();
+ creature->AI()->EnterEvadeMode(CreatureAI::EVADE_REASON_NO_HOSTILES);
return;
}
@@ -10887,7 +10887,7 @@ Unit* Creature::SelectVictim()
}
// enter in evade mode in other case
- AI()->EnterEvadeMode();
+ AI()->EnterEvadeMode(CreatureAI::EVADE_REASON_NO_HOSTILES);
return NULL;
}
@@ -11048,9 +11048,6 @@ void Unit::ModSpellCastTime(SpellInfo const* spellInfo, int32 & castTime, Spell*
if (!spellInfo || castTime < 0)
return;
- if (spellInfo->IsChanneled() && !spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
- return;
-
// called from caster
if (Player* modOwner = GetSpellModOwner())
modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell);
@@ -11064,6 +11061,25 @@ void Unit::ModSpellCastTime(SpellInfo const* spellInfo, int32 & castTime, Spell*
castTime = 500;
}
+void Unit::ModSpellDurationTime(SpellInfo const* spellInfo, int32 & duration, Spell* spell)
+{
+ if (!spellInfo || duration < 0)
+ return;
+
+ if (spellInfo->IsChanneled() && !spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
+ return;
+
+ // called from caster
+ if (Player* modOwner = GetSpellModOwner())
+ modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, duration, spell);
+
+ if (!(spellInfo->HasAttribute(SPELL_ATTR0_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) &&
+ ((GetTypeId() == TYPEID_PLAYER && spellInfo->SpellFamilyName) || GetTypeId() == TYPEID_UNIT))
+ duration = int32(float(duration) * GetFloatValue(UNIT_MOD_CAST_SPEED));
+ else if (spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
+ duration = int32(float(duration) * m_modAttackSpeedPct[RANGED_ATTACK]);
+}
+
DiminishingLevels Unit::GetDiminishing(DiminishingGroup group)
{
for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 9902b2a2af9..d6e3d01b09a 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -609,8 +609,8 @@ enum UnitMoveType
#define MAX_MOVE_TYPE 9
-extern float baseMoveSpeed[MAX_MOVE_TYPE];
-extern float playerBaseMoveSpeed[MAX_MOVE_TYPE];
+TC_GAME_API extern float baseMoveSpeed[MAX_MOVE_TYPE];
+TC_GAME_API extern float playerBaseMoveSpeed[MAX_MOVE_TYPE];
enum WeaponAttackType : uint16
{
@@ -918,7 +918,7 @@ struct CleanDamage
struct CalcDamageInfo;
-class DamageInfo
+class TC_GAME_API DamageInfo
{
private:
Unit* const m_attacker;
@@ -981,7 +981,7 @@ public:
SpellSchoolMask GetSchoolMask() const { return _schoolMask; };
};
-class ProcEventInfo
+class TC_GAME_API ProcEventInfo
{
public:
ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget, uint32 typeMask,
@@ -1039,7 +1039,7 @@ struct CalcDamageInfo
};
// Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode
-struct SpellNonMeleeDamage
+struct TC_GAME_API SpellNonMeleeDamage
{
SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask);
@@ -1198,7 +1198,7 @@ enum ActionBarIndex
#define MAX_UNIT_ACTION_BAR_INDEX (ACTION_BAR_INDEX_END-ACTION_BAR_INDEX_START)
-struct CharmInfo
+struct TC_GAME_API CharmInfo
{
public:
explicit CharmInfo(Unit* unit);
@@ -1302,7 +1302,7 @@ enum PlayerTotemType
struct SpellProcEventEntry; // used only privately
-class Unit : public WorldObject
+class TC_GAME_API Unit : public WorldObject
{
public:
typedef std::set<Unit*> AttackerSet;
@@ -2091,6 +2091,7 @@ class Unit : public WorldObject
int32 CalcSpellDuration(SpellInfo const* spellProto);
int32 ModSpellDuration(SpellInfo const* spellProto, Unit const* target, int32 duration, bool positive, uint32 effectMask);
void ModSpellCastTime(SpellInfo const* spellProto, int32& castTime, Spell* spell = NULL);
+ void ModSpellDurationTime(SpellInfo const* spellProto, int32& castTime, Spell* spell = NULL);
float CalculateLevelPenalty(SpellInfo const* spellProto) const;
void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); }
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 10341a7c029..dbaaa3b7b9f 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -29,7 +29,7 @@ struct VehicleEntry;
class Unit;
class VehicleJoinEvent;
-class Vehicle : public TransportBase
+class TC_GAME_API Vehicle : public TransportBase
{
protected:
friend bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry, bool);
@@ -118,7 +118,7 @@ class Vehicle : public TransportBase
PendingJoinEventContainer _pendingJoinEvents; ///< Collection of delayed join events for prospective passengers
};
-class VehicleJoinEvent : public BasicEvent
+class TC_GAME_API VehicleJoinEvent : public BasicEvent
{
friend class Vehicle;
protected:
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 89d2a53c071..879e5032b73 100644
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -29,6 +29,12 @@
#include "GameObjectAI.h"
#include "WorldStatePackets.h"
+GameEventMgr* GameEventMgr::instance()
+{
+ static GameEventMgr instance;
+ return &instance;
+}
+
bool GameEventMgr::CheckOneGameEvent(uint16 entry) const
{
switch (mGameEvent[entry].state)
diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index aaff9c3700f..312f4de4b80 100644
--- a/src/server/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
@@ -94,18 +94,14 @@ class Player;
class Creature;
class Quest;
-class GameEventMgr
+class TC_GAME_API GameEventMgr
{
private:
GameEventMgr();
~GameEventMgr() { }
public:
- static GameEventMgr* instance()
- {
- static GameEventMgr instance;
- return &instance;
- }
+ static GameEventMgr* instance();
typedef std::set<uint16> ActiveEvents;
typedef std::vector<GameEventData> GameEventDataMap;
@@ -187,8 +183,8 @@ class GameEventMgr
#define sGameEventMgr GameEventMgr::instance()
-bool IsHolidayActive(HolidayIds id);
-bool IsEventActive(uint16 event_id);
+TC_GAME_API bool IsHolidayActive(HolidayIds id);
+TC_GAME_API bool IsEventActive(uint16 event_id);
#endif
diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h
index e35df29997b..2aa38ee6ad3 100644
--- a/src/server/game/Garrison/Garrison.h
+++ b/src/server/game/Garrison/Garrison.h
@@ -80,7 +80,7 @@ enum GarrisonFollowerStatus
class GameObject;
class Map;
-class Garrison
+class TC_GAME_API Garrison
{
public:
struct Building
diff --git a/src/server/game/Garrison/GarrisonMap.h b/src/server/game/Garrison/GarrisonMap.h
index 57bc114970c..c04cf9d9a24 100644
--- a/src/server/game/Garrison/GarrisonMap.h
+++ b/src/server/game/Garrison/GarrisonMap.h
@@ -23,7 +23,7 @@
class Garrison;
class Player;
-class GarrisonMap : public Map
+class TC_GAME_API GarrisonMap : public Map
{
public:
GarrisonMap(uint32 id, time_t, uint32 instanceId, Map* parent, ObjectGuid const& owner);
diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp
index 9be49fec2ad..5c9bef62fc3 100644
--- a/src/server/game/Garrison/GarrisonMgr.cpp
+++ b/src/server/game/Garrison/GarrisonMgr.cpp
@@ -24,6 +24,12 @@
#include "GameObject.h"
#include "ObjectMgr.h"
+GarrisonMgr& GarrisonMgr::Instance()
+{
+ static GarrisonMgr instance;
+ return instance;
+}
+
void GarrisonMgr::Initialize()
{
for (GarrSiteLevelPlotInstEntry const* plotInstance : sGarrSiteLevelPlotInstStore)
diff --git a/src/server/game/Garrison/GarrisonMgr.h b/src/server/game/Garrison/GarrisonMgr.h
index 91c133af0cd..6130fd67b25 100644
--- a/src/server/game/Garrison/GarrisonMgr.h
+++ b/src/server/game/Garrison/GarrisonMgr.h
@@ -38,14 +38,10 @@ struct GarrAbilities
std::unordered_set<GarrAbilityEntry const*> Traits;
};
-class GarrisonMgr
+class TC_GAME_API GarrisonMgr
{
public:
- static GarrisonMgr& Instance()
- {
- static GarrisonMgr instance;
- return instance;
- }
+ static GarrisonMgr& Instance();
void Initialize();
diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp
index 695591fb1c7..7cb21321f04 100644
--- a/src/server/game/Globals/ObjectAccessor.cpp
+++ b/src/server/game/Globals/ObjectAccessor.cpp
@@ -34,6 +34,48 @@
#include <boost/thread/shared_mutex.hpp>
#include <boost/thread/locks.hpp>
+template<class T>
+void HashMapHolder<T>::Insert(T* o)
+{
+ boost::unique_lock<boost::shared_mutex> lock(*GetLock());
+
+ GetContainer()[o->GetGUID()] = o;
+}
+
+template<class T>
+void HashMapHolder<T>::Remove(T* o)
+{
+ boost::unique_lock<boost::shared_mutex> lock(*GetLock());
+
+ GetContainer().erase(o->GetGUID());
+}
+
+template<class T>
+T* HashMapHolder<T>::Find(ObjectGuid guid)
+{
+ boost::shared_lock<boost::shared_mutex> lock(*GetLock());
+
+ typename MapType::iterator itr = GetContainer().find(guid);
+ return (itr != GetContainer().end()) ? itr->second : NULL;
+}
+
+template<class T>
+auto HashMapHolder<T>::GetContainer() -> MapType&
+{
+ static MapType _objectMap;
+ return _objectMap;
+}
+
+template<class T>
+boost::shared_mutex* HashMapHolder<T>::GetLock()
+{
+ static boost::shared_mutex _lock;
+ return &_lock;
+}
+
+template class TC_GAME_API HashMapHolder<Player>;
+template class TC_GAME_API HashMapHolder<Transport>;
+
WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, ObjectGuid const& guid)
{
switch (guid.GetHigh())
@@ -226,12 +268,3 @@ void ObjectAccessor::SaveAllPlayers()
for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
itr->second->SaveToDB();
}
-
-/// Define the static members of HashMapHolder
-
-template <class T> typename HashMapHolder<T>::MapType HashMapHolder<T>::_objectMap;
-template <class T> boost::shared_mutex HashMapHolder<T>::_lock;
-
-/// Global definitions for the hashmap storage
-template class HashMapHolder<Player>;
-template class HashMapHolder<Transport>;
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index 1c1ec6b3451..83bbdf42239 100644
--- a/src/server/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
@@ -42,77 +42,57 @@ class WorldRunnable;
class Transport;
template <class T>
-class HashMapHolder
+class TC_GAME_API HashMapHolder
{
- public:
- static_assert(std::is_same<Player, T>::value
- || std::is_same<Transport, T>::value,
- "Only Player and Transport can be registered in global HashMapHolder");
+ //Non instanceable only static
+ HashMapHolder() { }
- typedef std::unordered_map<ObjectGuid, T*> MapType;
+public:
+ static_assert(std::is_same<Player, T>::value
+ || std::is_same<Transport, T>::value,
+ "Only Player and Transport can be registered in global HashMapHolder");
- static void Insert(T* o)
- {
- boost::unique_lock<boost::shared_mutex> lock(_lock);
+ typedef std::unordered_map<ObjectGuid, T*> MapType;
- _objectMap[o->GetGUID()] = o;
- }
+ static void Insert(T* o);
- static void Remove(T* o)
- {
- boost::unique_lock<boost::shared_mutex> lock(_lock);
+ static void Remove(T* o);
- _objectMap.erase(o->GetGUID());
- }
+ static T* Find(ObjectGuid guid);
- static T* Find(ObjectGuid guid)
- {
- boost::shared_lock<boost::shared_mutex> lock(_lock);
+ static MapType& GetContainer();
- typename MapType::iterator itr = _objectMap.find(guid);
- return (itr != _objectMap.end()) ? itr->second : NULL;
- }
-
- static MapType& GetContainer() { return _objectMap; }
-
- static boost::shared_mutex* GetLock() { return &_lock; }
-
- private:
- //Non instanceable only static
- HashMapHolder() { }
-
- static boost::shared_mutex _lock;
- static MapType _objectMap;
+ static boost::shared_mutex* GetLock();
};
namespace ObjectAccessor
{
// these functions return objects only if in map of specified object
- WorldObject* GetWorldObject(WorldObject const&, ObjectGuid const&);
- Object* GetObjectByTypeMask(WorldObject const&, ObjectGuid const&, uint32 typemask);
- Corpse* GetCorpse(WorldObject const& u, ObjectGuid const& guid);
- GameObject* GetGameObject(WorldObject const& u, ObjectGuid const& guid);
- Transport* GetTransport(WorldObject const& u, ObjectGuid const& guid);
- DynamicObject* GetDynamicObject(WorldObject const& u, ObjectGuid const& guid);
- AreaTrigger* GetAreaTrigger(WorldObject const& u, ObjectGuid const& guid);
- Unit* GetUnit(WorldObject const&, ObjectGuid const& guid);
- Creature* GetCreature(WorldObject const& u, ObjectGuid const& guid);
- Pet* GetPet(WorldObject const&, ObjectGuid const& guid);
- Player* GetPlayer(Map const*, ObjectGuid const& guid);
- Player* GetPlayer(WorldObject const&, ObjectGuid const& guid);
- Creature* GetCreatureOrPetOrVehicle(WorldObject const&, ObjectGuid const&);
+ TC_GAME_API WorldObject* GetWorldObject(WorldObject const&, ObjectGuid const&);
+ TC_GAME_API Object* GetObjectByTypeMask(WorldObject const&, ObjectGuid const&, uint32 typemask);
+ TC_GAME_API Corpse* GetCorpse(WorldObject const& u, ObjectGuid const& guid);
+ TC_GAME_API GameObject* GetGameObject(WorldObject const& u, ObjectGuid const& guid);
+ TC_GAME_API Transport* GetTransport(WorldObject const& u, ObjectGuid const& guid);
+ TC_GAME_API DynamicObject* GetDynamicObject(WorldObject const& u, ObjectGuid const& guid);
+ TC_GAME_API AreaTrigger* GetAreaTrigger(WorldObject const& u, ObjectGuid const& guid);
+ TC_GAME_API Unit* GetUnit(WorldObject const&, ObjectGuid const& guid);
+ TC_GAME_API Creature* GetCreature(WorldObject const& u, ObjectGuid const& guid);
+ TC_GAME_API Pet* GetPet(WorldObject const&, ObjectGuid const& guid);
+ TC_GAME_API Player* GetPlayer(Map const*, ObjectGuid const& guid);
+ TC_GAME_API Player* GetPlayer(WorldObject const&, ObjectGuid const& guid);
+ TC_GAME_API Creature* GetCreatureOrPetOrVehicle(WorldObject const&, ObjectGuid const&);
// these functions return objects if found in whole world
// ACCESS LIKE THAT IS NOT THREAD SAFE
- Player* FindPlayer(ObjectGuid const&);
- Player* FindPlayerByName(std::string const& name);
+ TC_GAME_API Player* FindPlayer(ObjectGuid const&);
+ TC_GAME_API Player* FindPlayerByName(std::string const& name);
// this returns Player even if he is not in world, for example teleporting
- Player* FindConnectedPlayer(ObjectGuid const&);
- Player* FindConnectedPlayerByName(std::string const& name);
+ TC_GAME_API Player* FindConnectedPlayer(ObjectGuid const&);
+ TC_GAME_API Player* FindConnectedPlayerByName(std::string const& name);
// when using this, you must use the hashmapholder's lock
- HashMapHolder<Player>::MapType const& GetPlayers();
+ TC_GAME_API HashMapHolder<Player>::MapType const& GetPlayers();
template<class T>
void AddObject(T* object)
@@ -126,7 +106,8 @@ namespace ObjectAccessor
HashMapHolder<T>::Remove(object);
}
- void SaveAllPlayers();
+ TC_GAME_API void SaveAllPlayers();
};
#endif
+
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 2efcc71ae75..85adc2764ab 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -251,6 +251,12 @@ ObjectMgr::ObjectMgr():
_playerInfo[j][i] = NULL;
}
+ObjectMgr* ObjectMgr::instance()
+{
+ static ObjectMgr instance;
+ return &instance;
+}
+
ObjectMgr::~ObjectMgr()
{
for (QuestMap::iterator i = _questTemplates.begin(); i != _questTemplates.end(); ++i)
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 7fb35c15504..f67d753cf7c 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -376,15 +376,15 @@ typedef std::multimap<uint32, ScriptInfo> ScriptMap;
typedef std::map<uint32, ScriptMap > ScriptMapMap;
typedef std::multimap<uint32, uint32> SpellScriptsContainer;
typedef std::pair<SpellScriptsContainer::iterator, SpellScriptsContainer::iterator> SpellScriptsBounds;
-extern ScriptMapMap sSpellScripts;
-extern ScriptMapMap sEventScripts;
-extern ScriptMapMap sWaypointScripts;
+TC_GAME_API extern ScriptMapMap sSpellScripts;
+TC_GAME_API extern ScriptMapMap sEventScripts;
+TC_GAME_API extern ScriptMapMap sWaypointScripts;
std::string GetScriptsTableNameByType(ScriptsType type);
ScriptMapMap* GetScriptsMapByType(ScriptsType type);
std::string GetScriptCommandName(ScriptCommands command);
-struct SpellClickInfo
+struct TC_GAME_API SpellClickInfo
{
uint32 spellId;
uint8 castFlags;
@@ -646,7 +646,7 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry);
#define MAX_PET_NAME 12 // max allowed by client name length
#define MAX_CHARTER_NAME 24 // max allowed by client name length
-bool normalizePlayerName(std::string& name);
+TC_GAME_API bool normalizePlayerName(std::string& name);
struct ExtendedPlayerName
{
@@ -664,7 +664,7 @@ struct LanguageDesc
uint32 skill_id;
};
-extern LanguageDesc lang_description[LANGUAGES_COUNT];
+TC_GAME_API extern LanguageDesc lang_description[LANGUAGES_COUNT];
LanguageDesc const* GetLanguageDescByID(uint32 lang);
enum EncounterCreditType
@@ -699,7 +699,7 @@ typedef std::unordered_map<uint32, std::vector<PhaseInfoStruct>> PhaseInfo; // p
class PlayerDumpReader;
-class ObjectMgr
+class TC_GAME_API ObjectMgr
{
friend class PlayerDumpReader;
@@ -708,11 +708,13 @@ class ObjectMgr
~ObjectMgr();
public:
- static ObjectMgr* instance()
- {
- static ObjectMgr instance;
- return &instance;
- }
+ ObjectMgr(ObjectMgr const&) = delete;
+ ObjectMgr(ObjectMgr&&) = delete;
+
+ ObjectMgr& operator= (ObjectMgr const&) = delete;
+ ObjectMgr& operator= (ObjectMgr&&) = delete;
+
+ static ObjectMgr* instance();
typedef std::unordered_map<uint32, Item*> ItemMap;
diff --git a/src/server/game/Grids/GridStates.h b/src/server/game/Grids/GridStates.h
index 9420bef4b9d..b567da43b69 100644
--- a/src/server/game/Grids/GridStates.h
+++ b/src/server/game/Grids/GridStates.h
@@ -24,32 +24,32 @@
class Map;
-class GridState
+class TC_GAME_API GridState
{
public:
virtual ~GridState() { };
virtual void Update(Map &, NGridType&, GridInfo &, uint32 t_diff) const = 0;
};
-class InvalidState : public GridState
+class TC_GAME_API InvalidState : public GridState
{
public:
void Update(Map &, NGridType &, GridInfo &, uint32 t_diff) const override;
};
-class ActiveState : public GridState
+class TC_GAME_API ActiveState : public GridState
{
public:
void Update(Map &, NGridType &, GridInfo &, uint32 t_diff) const override;
};
-class IdleState : public GridState
+class TC_GAME_API IdleState : public GridState
{
public:
void Update(Map &, NGridType &, GridInfo &, uint32 t_diff) const override;
};
-class RemovalState : public GridState
+class TC_GAME_API RemovalState : public GridState
{
public:
void Update(Map &, NGridType &, GridInfo &, uint32 t_diff) const override;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 553de2f1a1f..66540add24b 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -40,7 +40,7 @@ class Player;
namespace Trinity
{
- struct VisibleNotifier
+ struct TC_GAME_API VisibleNotifier
{
Player &i_player;
UpdateData i_data;
@@ -63,7 +63,7 @@ namespace Trinity
void Visit(DynamicObjectMapType &);
};
- struct PlayerRelocationNotifier : public VisibleNotifier
+ struct TC_GAME_API PlayerRelocationNotifier : public VisibleNotifier
{
PlayerRelocationNotifier(Player &player) : VisibleNotifier(player) { }
@@ -72,7 +72,7 @@ namespace Trinity
void Visit(PlayerMapType &);
};
- struct CreatureRelocationNotifier
+ struct TC_GAME_API CreatureRelocationNotifier
{
Creature &i_creature;
CreatureRelocationNotifier(Creature &c) : i_creature(c) { }
@@ -81,7 +81,7 @@ namespace Trinity
void Visit(PlayerMapType &);
};
- struct DelayedUnitRelocation
+ struct TC_GAME_API DelayedUnitRelocation
{
Map &i_map;
Cell &cell;
@@ -94,7 +94,7 @@ namespace Trinity
void Visit(PlayerMapType &);
};
- struct AIRelocationNotifier
+ struct TC_GAME_API AIRelocationNotifier
{
Unit &i_unit;
bool isCreature;
@@ -123,7 +123,7 @@ namespace Trinity
void Visit(AreaTriggerMapType &m) { updateObjects<AreaTrigger>(m); }
};
- struct MessageDistDeliverer
+ struct TC_GAME_API MessageDistDeliverer
{
WorldObject* i_source;
WorldPacket const* i_message;
@@ -580,7 +580,7 @@ namespace Trinity
// WorldObject check classes
- class AnyDeadUnitObjectInRangeCheck
+ class TC_GAME_API AnyDeadUnitObjectInRangeCheck
{
public:
AnyDeadUnitObjectInRangeCheck(Unit* searchObj, float range) : i_searchObj(searchObj), i_range(range) { }
@@ -593,7 +593,7 @@ namespace Trinity
float i_range;
};
- class AnyDeadUnitSpellTargetInRangeCheck : public AnyDeadUnitObjectInRangeCheck
+ class TC_GAME_API AnyDeadUnitSpellTargetInRangeCheck : public AnyDeadUnitObjectInRangeCheck
{
public:
AnyDeadUnitSpellTargetInRangeCheck(Unit* searchObj, float range, SpellInfo const* spellInfo, SpellTargetCheckTypes check)
diff --git a/src/server/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h
index 11a54a3e7b0..d70f830ea68 100644
--- a/src/server/game/Grids/ObjectGridLoader.h
+++ b/src/server/game/Grids/ObjectGridLoader.h
@@ -27,7 +27,7 @@
class ObjectWorldLoader;
-class ObjectGridLoader
+class TC_GAME_API ObjectGridLoader
{
friend class ObjectWorldLoader;
@@ -56,7 +56,7 @@ class ObjectGridLoader
};
//Stop the creatures before unloading the NGrid
-class ObjectGridStoper
+class TC_GAME_API ObjectGridStoper
{
public:
void Visit(CreatureMapType &m);
@@ -64,7 +64,7 @@ class ObjectGridStoper
};
//Move the foreign creatures back to respawn positions before unloading the NGrid
-class ObjectGridEvacuator
+class TC_GAME_API ObjectGridEvacuator
{
public:
void Visit(CreatureMapType &m);
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 5f8813c2071..e3528d053f5 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -157,10 +157,9 @@ bool Group::Create(Player* leader)
CharacterDatabase.Execute(stmt);
+ Group::ConvertLeaderInstancesToGroup(leader, this, false);
ASSERT(AddMember(leader)); // If the leader can't be added to a new group because it appears full, something is clearly wrong.
-
- Player::ConvertInstancesToGroup(leader, this, false);
}
else if (!AddMember(leader))
return false;
@@ -410,9 +409,7 @@ bool Group::AddMember(Player* player)
player->SetGroup(this, subGroup);
// if the same group invites the player back, cancel the homebind timer
- InstanceGroupBind* bind = GetBoundInstance(player);
- if (bind && bind->save->GetInstanceId() == player->GetInstanceId())
- player->m_InstanceValid = true;
+ player->m_InstanceValid = player->CheckInstanceValidity(false);
if (!isRaidGroup()) // reset targetIcons for non-raid-groups
{
@@ -693,7 +690,7 @@ void Group::ChangeLeader(ObjectGuid newLeaderGuid, int8 partyIndex)
}
// Copy the permanent binds from the new leader to the group
- Player::ConvertInstancesToGroup(newLeader, this, true);
+ Group::ConvertLeaderInstancesToGroup(newLeader, this, true);
// Update the group leader
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_LEADER);
@@ -720,6 +717,42 @@ void Group::ChangeLeader(ObjectGuid newLeaderGuid, int8 partyIndex)
BroadcastPacket(groupNewLeader.Write(), true);
}
+/// convert the player's binds to the group
+void Group::ConvertLeaderInstancesToGroup(Player* player, Group* group, bool switchLeader)
+{
+ // copy all binds to the group, when changing leader it's assumed the character
+ // will not have any solo binds
+ for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
+ {
+ for (Player::BoundInstancesMap::iterator itr = player->m_boundInstances[i].begin(); itr != player->m_boundInstances[i].end();)
+ {
+ if (!switchLeader || !group->GetBoundInstance(itr->second.save->GetDifficultyID(), itr->first))
+ group->BindToInstance(itr->second.save, itr->second.perm, false);
+
+ // permanent binds are not removed
+ if (switchLeader && !itr->second.perm)
+ {
+ // increments itr in call
+ player->UnbindInstance(itr, Difficulty(i), false);
+ }
+ else
+ ++itr;
+ }
+ }
+
+ /* if group leader is in a non-raid dungeon map and nobody is actually bound to this map then the group can "take over" the instance *
+ * (example: two-player group disbanded by disconnect where the player reconnects within 60 seconds and the group is reformed) */
+ if (Map* playerMap = player->GetMap())
+ if (!switchLeader && playerMap->IsNonRaidDungeon())
+ if (InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(playerMap->GetInstanceId()))
+ if (save->GetGroupCount() == 0 && save->GetPlayerCount() == 0)
+ {
+ TC_LOG_DEBUG("maps", "Group::ConvertLeaderInstancesToGroup: Group for player %s is taking over unbound instance map %d with Id %d", player->GetName().c_str(), playerMap->GetId(), playerMap->GetInstanceId());
+ // if nobody is saved to this, then the save wasn't permanent
+ group->BindToInstance(save, false, false);
+ }
+}
+
void Group::Disband(bool hideDestroy /* = false */)
{
sScriptMgr->OnGroupDisband(this);
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index fab6edd5603..3c75bf6739f 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -188,7 +188,7 @@ struct RaidMarker
/** request member stats checken **/
/// @todo uninvite people that not accepted invite
-class Group
+class TC_GAME_API Group
{
public:
struct MemberSlot
@@ -226,6 +226,7 @@ class Group
bool AddMember(Player* player);
bool RemoveMember(ObjectGuid guid, const RemoveMethod &method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, const char* reason = NULL);
void ChangeLeader(ObjectGuid guid, int8 partyIndex = 0);
+ static void ConvertLeaderInstancesToGroup(Player* player, Group* group, bool switchLeader);
void SetLootMethod(LootMethod method);
void SetLooterGuid(ObjectGuid guid);
void SetMasterLooterGuid(ObjectGuid guid);
diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp
index 24d4983a1e0..c6046c3a9aa 100644
--- a/src/server/game/Groups/GroupMgr.cpp
+++ b/src/server/game/Groups/GroupMgr.cpp
@@ -92,6 +92,12 @@ ObjectGuid::LowType GroupMgr::GenerateGroupId()
return NextGroupId++;
}
+GroupMgr* GroupMgr::instance()
+{
+ static GroupMgr instance;
+ return &instance;
+}
+
Group* GroupMgr::GetGroupByGUID(ObjectGuid const& groupId) const
{
GroupContainer::const_iterator itr = GroupStore.find(groupId.GetCounter());
diff --git a/src/server/game/Groups/GroupMgr.h b/src/server/game/Groups/GroupMgr.h
index 25dd1275908..f3031493782 100644
--- a/src/server/game/Groups/GroupMgr.h
+++ b/src/server/game/Groups/GroupMgr.h
@@ -20,18 +20,14 @@
#include "Group.h"
-class GroupMgr
+class TC_GAME_API GroupMgr
{
private:
GroupMgr();
~GroupMgr();
public:
- static GroupMgr* instance()
- {
- static GroupMgr instance;
- return &instance;
- }
+ static GroupMgr* instance();
typedef std::map<ObjectGuid::LowType, Group*> GroupContainer;
typedef std::vector<Group*> GroupDbContainer;
diff --git a/src/server/game/Groups/GroupReference.h b/src/server/game/Groups/GroupReference.h
index 4718dda1832..6e7373de7d7 100644
--- a/src/server/game/Groups/GroupReference.h
+++ b/src/server/game/Groups/GroupReference.h
@@ -24,7 +24,7 @@
class Group;
class Player;
-class GroupReference : public Reference<Group, Player>
+class TC_GAME_API GroupReference : public Reference<Group, Player>
{
protected:
uint8 iSubGroup;
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index e5ecef91649..d41a4f7c726 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -261,7 +261,7 @@ const uint32 GuildChallengeMaxLevelGoldReward[GUILD_CHALLENGES_TYPES] = { 0, 125
const uint32 GuildChallengesMaxCount[GUILD_CHALLENGES_TYPES] = { 0, 7, 1, 3, 0, 3 };
// Emblem info
-class EmblemInfo
+class TC_GAME_API EmblemInfo
{
public:
EmblemInfo() : m_style(0), m_color(0), m_borderStyle(0), m_borderColor(0), m_backgroundColor(0) { }
@@ -317,7 +317,7 @@ typedef std::vector <GuildBankRightsAndSlots> GuildBankRightsAndSlotsVec;
typedef std::set <uint8> SlotIds;
-class Guild
+class TC_GAME_API Guild
{
private:
// Class representing guild member
diff --git a/src/server/game/Guilds/GuildFinderMgr.cpp b/src/server/game/Guilds/GuildFinderMgr.cpp
index de355712be4..961827c9d3b 100644
--- a/src/server/game/Guilds/GuildFinderMgr.cpp
+++ b/src/server/game/Guilds/GuildFinderMgr.cpp
@@ -339,3 +339,9 @@ void GuildFinderMgr::SendMembershipRequestListUpdate(Player* player)
{
player->SendDirectMessage(WorldPackets::GuildFinder::LFGuildApplicationsListChanged().Write());
}
+
+GuildFinderMgr* GuildFinderMgr::instance()
+{
+ static GuildFinderMgr instance;
+ return &instance;
+}
diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h
index 6a705a5b4ef..d0cd29b0bee 100644
--- a/src/server/game/Guilds/GuildFinderMgr.h
+++ b/src/server/game/Guilds/GuildFinderMgr.h
@@ -265,11 +265,7 @@ class GuildFinderMgr
static void SendApplicantListUpdate(Guild* guild);
static void SendMembershipRequestListUpdate(Player* player);
- static GuildFinderMgr* instance()
- {
- static GuildFinderMgr instance;
- return &instance;
- }
+ static GuildFinderMgr* instance();
};
#define sGuildFinderMgr GuildFinderMgr::instance()
diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index d8969d73e72..8cafc8cdd2f 100644
--- a/src/server/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
@@ -96,6 +96,12 @@ std::string GuildMgr::GetGuildNameById(ObjectGuid::LowType guildId) const
return "";
}
+GuildMgr* GuildMgr::instance()
+{
+ static GuildMgr instance;
+ return &instance;
+}
+
Guild* GuildMgr::GetGuildByLeader(ObjectGuid guid) const
{
for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr)
diff --git a/src/server/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h
index 069f4e165eb..66aed6ad1a7 100644
--- a/src/server/game/Guilds/GuildMgr.h
+++ b/src/server/game/Guilds/GuildMgr.h
@@ -20,18 +20,14 @@
#include "Guild.h"
-class GuildMgr
+class TC_GAME_API GuildMgr
{
private:
GuildMgr();
~GuildMgr();
public:
- static GuildMgr* instance()
- {
- static GuildMgr instance;
- return &instance;
- }
+ static GuildMgr* instance();
Guild* GetGuildByLeader(ObjectGuid guid) const;
Guild* GetGuildById(ObjectGuid::LowType guildId) const;
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index a92298981ec..347ae3d0b03 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -258,18 +258,21 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell
AH->buyout = packet.BuyoutPrice;
AH->expire_time = time(NULL) + auctionTime;
AH->deposit = deposit;
+ AH->etime = packet.RunTime;
AH->auctionHouseEntry = auctionHouseEntry;
TC_LOG_INFO("network", "CMSG_AUCTION_SELL_ITEM: %s %s is selling item %s %s to auctioneer " UI64FMTD " with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u",
_player->GetGUID().ToString().c_str(), _player->GetName().c_str(), item->GetGUID().ToString().c_str(), item->GetTemplate()->GetDefaultLocaleName(), AH->auctioneer, item->GetCount(), packet.MinBid, packet.BuyoutPrice, auctionTime, AH->GetHouseId());
sAuctionMgr->AddAItem(item);
auctionHouse->AddAuction(AH);
+ sAuctionMgr->PendingAuctionAdd(_player, AH);
_player->MoveItemFromInventory(item->GetBagSlot(), item->GetSlot(), true);
SQLTransaction trans = CharacterDatabase.BeginTransaction();
item->DeleteFromInventoryDB(trans);
item->SaveToDB(trans);
+
AH->SaveToDB(trans);
_player->SaveInventoryAndGoldToDB(trans);
CharacterDatabase.CommitTransaction(trans);
@@ -306,12 +309,14 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell
AH->buyout = packet.BuyoutPrice;
AH->expire_time = time(NULL) + auctionTime;
AH->deposit = deposit;
+ AH->etime = packet.RunTime;
AH->auctionHouseEntry = auctionHouseEntry;
TC_LOG_INFO("network", "CMSG_AUCTION_SELL_ITEM: %s %s is selling %s %s to auctioneer " UI64FMTD " with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u",
_player->GetGUID().ToString().c_str(), _player->GetName().c_str(), newItem->GetGUID().ToString().c_str(), newItem->GetTemplate()->GetDefaultLocaleName(), AH->auctioneer, newItem->GetCount(), packet.MinBid, packet.BuyoutPrice, auctionTime, AH->GetHouseId());
sAuctionMgr->AddAItem(newItem);
auctionHouse->AddAuction(AH);
+ sAuctionMgr->PendingAuctionAdd(_player, AH);
for (auto const& packetItem : packet.Items)
{
@@ -351,8 +356,6 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell
GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1);
}
-
- _player->ModifyMoney(-int32(deposit));
}
// this function is called when client bids or buys out auction
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index ef197cbe541..dff529891b6 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -21,7 +21,6 @@
#include "ArenaTeamMgr.h"
#include "AuthenticationPackets.h"
#include "Battleground.h"
-#include "BattlenetServerManager.h"
#include "BattlePetPackets.h"
#include "CalendarMgr.h"
#include "CharacterPackets.h"
@@ -1138,8 +1137,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
sScriptMgr->OnPlayerLogin(pCurrChar, firstLogin);
- sBattlenetServer.SendChangeToonOnlineState(GetBattlenetAccountId(), GetAccountId(), _player->GetGUID(), _player->GetName(), true);
-
delete holder;
}
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index b94b4ce838e..a9db9d52572 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -534,8 +534,69 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::Misc::AreaTrigger& pack
bool teleported = false;
if (player->GetMapId() != at->target_mapId)
{
- if (!sMapMgr->CanPlayerEnter(at->target_mapId, player, false))
+ if (Map::EnterState denyReason = sMapMgr->PlayerCannotEnter(at->target_mapId, player, false))
+ {
+ bool reviveAtTrigger = false; // should we revive the player if he is trying to enter the correct instance?
+ switch (denyReason)
+ {
+ case Map::CANNOT_ENTER_NO_ENTRY:
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' attempted to enter map with id %d which has no entry", player->GetName().c_str(), at->target_mapId);
+ break;
+ case Map::CANNOT_ENTER_UNINSTANCED_DUNGEON:
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' attempted to enter dungeon map %d but no instance template was found", player->GetName().c_str(), at->target_mapId);
+ break;
+ case Map::CANNOT_ENTER_DIFFICULTY_UNAVAILABLE:
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' attempted to enter instance map %d but the requested difficulty was not found", player->GetName().c_str(), at->target_mapId);
+ if (MapEntry const* entry = sMapStore.LookupEntry(at->target_mapId))
+ player->SendTransferAborted(entry->ID, TRANSFER_ABORT_DIFFICULTY, player->GetDifficultyID(entry));
+ break;
+ case Map::CANNOT_ENTER_NOT_IN_RAID:
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' must be in a raid group to enter map %d", player->GetName().c_str(), at->target_mapId);
+ player->SendRaidGroupOnlyMessage(RAID_GROUP_ERR_ONLY, 0);
+ reviveAtTrigger = true;
+ break;
+ case Map::CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE:
+ player->GetSession()->SendPacket(WorldPackets::Misc::AreaTriggerNoCorpse().Write());
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' does not have a corpse in instance map %d and cannot enter", player->GetName().c_str(), at->target_mapId);
+ break;
+ case Map::CANNOT_ENTER_INSTANCE_BIND_MISMATCH:
+ if (MapEntry const* entry = sMapStore.LookupEntry(at->target_mapId))
+ {
+ char const* mapName = entry->MapName_lang;
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' cannot enter instance map '%s' because their permanent bind is incompatible with their group's", player->GetName().c_str(), mapName);
+ // is there a special opcode for this?
+ // @todo figure out how to get player localized difficulty string (e.g. "10 player", "Heroic" etc)
+ ChatHandler(player->GetSession()).PSendSysMessage(player->GetSession()->GetTrinityString(LANG_INSTANCE_BIND_MISMATCH), mapName);
+ }
+ reviveAtTrigger = true;
+ break;
+ case Map::CANNOT_ENTER_TOO_MANY_INSTANCES:
+ player->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_TOO_MANY_INSTANCES);
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' cannot enter instance map %d because he has exceeded the maximum number of instances per hour.", player->GetName().c_str(), at->target_mapId);
+ reviveAtTrigger = true;
+ break;
+ case Map::CANNOT_ENTER_MAX_PLAYERS:
+ player->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_MAX_PLAYERS);
+ reviveAtTrigger = true;
+ break;
+ case Map::CANNOT_ENTER_ZONE_IN_COMBAT:
+ player->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_ZONE_IN_COMBAT);
+ reviveAtTrigger = true;
+ break;
+ default:
+ break;
+ }
+
+ if (reviveAtTrigger) // check if the player is touching the areatrigger leading to the map his corpse is on
+ if (!player->IsAlive() && player->HasCorpse())
+ if (player->GetCorpseLocation().GetMapId() == at->target_mapId)
+ {
+ player->ResurrectPlayer(0.5f);
+ player->SpawnCorpseBones();
+ }
+
return;
+ }
if (Group* group = player->GetGroup())
if (group->isLFGGroup() && player->GetMap()->IsDungeon())
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 3ab9f683dea..697060078bc 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -77,9 +77,9 @@ void WorldSession::HandleMoveWorldportAckOpcode()
}
// relocate the player to the teleport destination
- // the CanEnter checks are done in TeleporTo but conditions may change
+ // the CannotEnter checks are done in TeleporTo but conditions may change
// while the player is in transit, for example the map may get full
- if (!newMap || !newMap->CanEnter(GetPlayer()))
+ if (!newMap || newMap->CannotEnter(GetPlayer()))
{
TC_LOG_ERROR("network", "Map %d (%s) could not be created for %s (%s), porting player to homebind", loc.GetMapId(), newMap ? newMap->GetMapName() : "Unknown", GetPlayer()->GetGUID().ToString().c_str(), GetPlayer()->GetName().c_str());
GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation());
@@ -157,19 +157,18 @@ void WorldSession::HandleMoveWorldportAckOpcode()
}
// resurrect character at enter into instance where his corpse exist after add to map
- Corpse* corpse = GetPlayer()->GetMap()->GetCorpseByPlayer(GetPlayer()->GetGUID());
- if (corpse && corpse->GetType() != CORPSE_BONES)
- {
- if (mEntry->IsDungeon())
+
+ if (mEntry->IsDungeon() && !GetPlayer()->IsAlive())
+ if (GetPlayer()->GetCorpseLocation().GetMapId() == mEntry->ID)
{
GetPlayer()->ResurrectPlayer(0.5f, false);
GetPlayer()->SpawnCorpseBones();
}
- }
bool allowMount = !mEntry->IsDungeon() || mEntry->IsBattlegroundOrArena();
if (mInstance)
{
+ // check if this instance has a reset time and send it to player if so
Difficulty diff = GetPlayer()->GetDifficultyID(mEntry);
if (MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mEntry->ID, diff))
{
@@ -182,6 +181,12 @@ void WorldSession::HandleMoveWorldportAckOpcode()
}
}
}
+
+ // check if instance is valid
+ if (!GetPlayer()->CheckInstanceValidity(false))
+ GetPlayer()->m_InstanceValid = false;
+
+ // instance mounting is handled in InstanceTemplate
allowMount = mInstance->AllowMount;
}
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 0b496100346..cb56a81e5d9 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -98,7 +98,11 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST %s, quest = %u, startcheat = %u", packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.StartCheat);
- Object* object = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM | TYPEMASK_PLAYER);
+ Object* object;
+ if (!packet.QuestGiverGUID.IsPlayer())
+ object = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM);
+ else
+ object = ObjectAccessor::FindPlayer(packet.QuestGiverGUID);
#define CLOSE_GOSSIP_CLEAR_DIVIDER() \
do { \
@@ -120,6 +124,11 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG
CLOSE_GOSSIP_CLEAR_DIVIDER();
return;
}
+ if (!_player->IsInSameRaidWith(playerQuestObject))
+ {
+ CLOSE_GOSSIP_CLEAR_DIVIDER();
+ return;
+ }
}
else
{
@@ -132,7 +141,10 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG
// some kind of WPE protection
if (!_player->CanInteractWithQuestGiver(object))
+ {
+ CLOSE_GOSSIP_CLEAR_DIVIDER();
return;
+ }
if (Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID))
{
@@ -190,7 +202,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG
}
}
- _player->PlayerTalkClass->SendCloseGossip();
+ CLOSE_GOSSIP_CLEAR_DIVIDER();
#undef CLOSE_GOSSIP_CLEAR_DIVIDER
}
@@ -462,17 +474,22 @@ void WorldSession::HandleQuestConfirmAccept(WorldPackets::Quest::QuestConfirmAcc
if (!_player->IsInSameRaidWith(originalPlayer))
return;
- if (!originalPlayer->CanShareQuest(packet.QuestID))
+ if (!originalPlayer->IsActiveQuest(packet.QuestID))
return;
if (!_player->CanTakeQuest(quest, true))
return;
if (_player->CanAddQuest(quest, true))
+ {
_player->AddQuestAndCheckCompletion(quest, NULL); // NULL, this prevent DB script from duplicate running
- _player->SetDivider(ObjectGuid::Empty);
+ if (quest->GetSrcSpell() > 0)
+ _player->CastSpell(_player, quest->GetSrcSpell(), true);
+ }
}
+
+ _player->SetDivider(ObjectGuid::Empty);
}
void WorldSession::HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiverCompleteQuest& packet)
@@ -605,20 +622,20 @@ void WorldSession::HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty&
else
{
receiver->SetDivider(sender->GetGUID());
- receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, sender->GetGUID(), true);
+ receiver->PlayerTalkClass->SendQuestGiverQuestDetails(quest, receiver->GetGUID(), true);
}
}
}
void WorldSession::HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet)
{
- if (!_player->GetDivider().IsEmpty() && _player->GetDivider() == packet.SenderGUID)
+ if (!_player->GetDivider().IsEmpty())
{
- if (Player* player = ObjectAccessor::FindPlayer(_player->GetDivider()))
- {
- player->SendPushToPartyResponse(_player, static_cast<QuestPushReason>(packet.Result));
- _player->SetDivider(ObjectGuid::Empty);
- }
+ if (_player->GetDivider() == packet.SenderGUID)
+ if (Player* player = ObjectAccessor::FindPlayer(_player->GetDivider()))
+ player->SendPushToPartyResponse(_player, static_cast<QuestPushReason>(packet.Result));
+
+ _player->SetDivider(ObjectGuid::Empty);
}
}
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index 7d0c9241a51..fc65a1da82f 100644
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -38,6 +38,12 @@ InstanceSaveManager::~InstanceSaveManager()
{
}
+InstanceSaveManager* InstanceSaveManager::instance()
+{
+ static InstanceSaveManager instance;
+ return &instance;
+}
+
void InstanceSaveManager::Unload()
{
lock_instLists = true;
diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h
index a09325e9ce7..21b5c3ca5c3 100644
--- a/src/server/game/Instances/InstanceSaveMgr.h
+++ b/src/server/game/Instances/InstanceSaveMgr.h
@@ -41,7 +41,7 @@ class Group;
- player-instance binds for permanent heroic/raid saves
- group-instance binds (both solo and permanent) cache the player binds for the group leader
*/
-class InstanceSave
+class TC_GAME_API InstanceSave
{
friend class InstanceSaveManager;
public:
@@ -147,7 +147,7 @@ class InstanceSave
typedef std::unordered_map<uint64 /*PAIR64(map, difficulty)*/, time_t /*resetTime*/> ResetTimeByMapDifficultyMap;
-class InstanceSaveManager
+class TC_GAME_API InstanceSaveManager
{
friend class InstanceSave;
@@ -158,11 +158,7 @@ class InstanceSaveManager
public:
typedef std::unordered_map<uint32 /*InstanceId*/, InstanceSave*> InstanceSaveHashMap;
- static InstanceSaveManager* instance()
- {
- static InstanceSaveManager instance;
- return &instance;
- }
+ static InstanceSaveManager* instance();
void Unload();
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index 6700ca07646..8892be38d37 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -30,6 +30,12 @@
#include "WorldSession.h"
#include "Opcodes.h"
+BossBoundaryData::~BossBoundaryData()
+{
+ for (const_iterator it = begin(); it != end(); ++it)
+ delete it->Boundary;
+}
+
void InstanceScript::SaveToDB()
{
std::string data = GetSaveData();
@@ -96,6 +102,13 @@ void InstanceScript::SetHeaders(std::string const& dataHeaders)
headers.push_back(header);
}
+void InstanceScript::LoadBossBoundaries(const BossBoundaryData& data)
+{
+ for (BossBoundaryEntry const& entry : data)
+ if (entry.BossId < bosses.size())
+ bosses[entry.BossId].boundary.insert(entry.Boundary);
+}
+
void InstanceScript::LoadMinionData(const MinionData* data)
{
while (data->entry)
@@ -113,7 +126,7 @@ void InstanceScript::LoadDoorData(const DoorData* data)
while (data->entry)
{
if (data->bossId < bosses.size())
- doors.insert(std::make_pair(data->entry, DoorInfo(&bosses[data->bossId], data->type, BoundaryType(data->boundary))));
+ doors.insert(std::make_pair(data->entry, DoorInfo(&bosses[data->bossId], data->type)));
++data;
}
@@ -236,28 +249,6 @@ void InstanceScript::AddDoor(GameObject* door, bool add)
if (add)
{
data.bossInfo->door[data.type].insert(door->GetGUID());
- switch (data.boundary)
- {
- default:
- case BOUNDARY_NONE:
- break;
- case BOUNDARY_N:
- case BOUNDARY_S:
- data.bossInfo->boundary[data.boundary] = door->GetPositionX();
- break;
- case BOUNDARY_E:
- case BOUNDARY_W:
- data.bossInfo->boundary[data.boundary] = door->GetPositionY();
- break;
- case BOUNDARY_NW:
- case BOUNDARY_SE:
- data.bossInfo->boundary[data.boundary] = door->GetPositionX() + door->GetPositionY();
- break;
- case BOUNDARY_NE:
- case BOUNDARY_SW:
- data.bossInfo->boundary[data.boundary] = door->GetPositionX() - door->GetPositionY();
- break;
- }
}
else
data.bossInfo->door[data.type].erase(door->GetGUID());
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 56e97217e2a..2bb2f14ca12 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -19,9 +19,11 @@
#ifndef TRINITY_INSTANCE_DATA_H
#define TRINITY_INSTANCE_DATA_H
+#include <set>
#include "ZoneScript.h"
#include "World.h"
#include "ObjectMgr.h"
+#include "CreatureAI.h"
#include "Packets/WorldStatePackets.h"
#define OUT_SAVE_INST_DATA TC_LOG_DEBUG("scripts", "Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
@@ -69,30 +71,30 @@ enum DoorType
MAX_DOOR_TYPES
};
-enum BoundaryType
+struct DoorData
{
- BOUNDARY_NONE = 0,
- BOUNDARY_N,
- BOUNDARY_S,
- BOUNDARY_E,
- BOUNDARY_W,
- BOUNDARY_NE,
- BOUNDARY_NW,
- BOUNDARY_SE,
- BOUNDARY_SW,
- BOUNDARY_MAX_X = BOUNDARY_N,
- BOUNDARY_MIN_X = BOUNDARY_S,
- BOUNDARY_MAX_Y = BOUNDARY_W,
- BOUNDARY_MIN_Y = BOUNDARY_E
+ uint32 entry, bossId;
+ DoorType type;
};
-typedef std::map<BoundaryType, float> BossBoundaryMap;
+struct BossBoundaryEntry
+{
+ uint32 BossId;
+ AreaBoundary const* Boundary;
+};
-struct DoorData
+struct TC_GAME_API BossBoundaryData
{
- uint32 entry, bossId;
- DoorType type;
- uint32 boundary;
+ typedef std::vector<BossBoundaryEntry> StorageType;
+ typedef StorageType::const_iterator const_iterator;
+
+ BossBoundaryData(std::initializer_list<BossBoundaryEntry> data) : _data(data) { }
+ ~BossBoundaryData();
+ const_iterator begin() const { return _data.begin(); }
+ const_iterator end() const { return _data.end(); }
+
+ private:
+ StorageType _data;
};
struct MinionData
@@ -112,16 +114,15 @@ struct BossInfo
EncounterState state;
GuidSet door[MAX_DOOR_TYPES];
GuidSet minion;
- BossBoundaryMap boundary;
+ CreatureBoundary boundary;
};
struct DoorInfo
{
- explicit DoorInfo(BossInfo* _bossInfo, DoorType _type, BoundaryType _boundary)
- : bossInfo(_bossInfo), type(_type), boundary(_boundary) { }
+ explicit DoorInfo(BossInfo* _bossInfo, DoorType _type)
+ : bossInfo(_bossInfo), type(_type) { }
BossInfo* bossInfo;
DoorType type;
- BoundaryType boundary;
};
struct MinionInfo
@@ -137,7 +138,7 @@ typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap;
typedef std::map<uint32 /*type*/, ObjectGuid /*guid*/> ObjectGuidMap;
typedef std::map<uint32 /*entry*/, uint32 /*type*/> ObjectInfoMap;
-class InstanceScript : public ZoneScript
+class TC_GAME_API InstanceScript : public ZoneScript
{
public:
explicit InstanceScript(Map* map) : instance(map), completedEncounters(0) { }
@@ -161,7 +162,7 @@ class InstanceScript : public ZoneScript
virtual void Update(uint32 /*diff*/) { }
- // Used by the map's CanEnter function.
+ // Used by the map's CannotEnter function.
// This is to prevent players from entering during boss encounters.
virtual bool IsEncounterInProgress() const;
@@ -225,7 +226,7 @@ class InstanceScript : public ZoneScript
virtual bool SetBossState(uint32 id, EncounterState state);
EncounterState GetBossState(uint32 id) const { return id < bosses.size() ? bosses[id].state : TO_BE_DECIDED; }
static std::string GetBossStateName(uint8 state);
- BossBoundaryMap const* GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; }
+ CreatureBoundary const* GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; }
// Achievement criteria additional requirements check
// NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType
@@ -255,6 +256,7 @@ class InstanceScript : public ZoneScript
protected:
void SetHeaders(std::string const& dataHeaders);
void SetBossNumber(uint32 number) { bosses.resize(number); }
+ void LoadBossBoundaries(BossBoundaryData const& data);
void LoadDoorData(DoorData const* data);
void LoadMinionData(MinionData const* data);
void LoadObjectData(ObjectData const* creatureData, ObjectData const* gameObjectData);
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index e57bf681b8a..a7e11e81970 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -1877,3 +1877,20 @@ void LoadLootTemplates_Reference()
TC_LOG_INFO("server.loading", ">> Loaded refence loot templates in %u ms", GetMSTimeDiffToNow(oldMSTime));
}
+
+void LoadLootTables()
+{
+ LoadLootTemplates_Creature();
+ LoadLootTemplates_Fishing();
+ LoadLootTemplates_Gameobject();
+ LoadLootTemplates_Item();
+ LoadLootTemplates_Mail();
+ LoadLootTemplates_Milling();
+ LoadLootTemplates_Pickpocketing();
+ LoadLootTemplates_Skinning();
+ LoadLootTemplates_Disenchant();
+ LoadLootTemplates_Prospecting();
+ LoadLootTemplates_Spell();
+
+ LoadLootTemplates_Reference();
+}
diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h
index 05e045f4a2f..db12250f443 100644
--- a/src/server/game/Loot/LootMgr.h
+++ b/src/server/game/Loot/LootMgr.h
@@ -131,7 +131,7 @@ enum LootSlotType
class Player;
class LootStore;
-struct LootStoreItem
+struct TC_GAME_API LootStoreItem
{
uint32 itemid; // id of the item
uint32 reference; // referenced TemplateleId
@@ -154,7 +154,7 @@ struct LootStoreItem
bool IsValid(LootStore const& store, uint32 entry) const; // Checks correctness of values
};
-struct LootItem
+struct TC_GAME_API LootItem
{
uint32 itemid;
uint32 randomSuffix;
@@ -210,7 +210,7 @@ typedef std::unordered_map<uint32, LootTemplate*> LootTemplateMap;
typedef std::set<uint32> LootIdSet;
-class LootStore
+class TC_GAME_API LootStore
{
public:
explicit LootStore(char const* name, char const* entryName, bool ratesAllowed)
@@ -247,7 +247,7 @@ class LootStore
bool m_ratesAllowed;
};
-class LootTemplate
+class TC_GAME_API LootTemplate
{
class LootGroup; // A set of loot definitions for items (refs are not allowed inside)
typedef std::vector<LootGroup*> LootGroups;
@@ -311,7 +311,7 @@ class LootValidatorRefManager : public RefManager<Loot, LootValidatorRef>
//=====================================================
-struct Loot
+struct TC_GAME_API Loot
{
QuestItemMap const& GetPlayerQuestItems() const { return PlayerQuestItems; }
QuestItemMap const& GetPlayerFFAItems() const { return PlayerFFAItems; }
@@ -414,48 +414,33 @@ private:
uint32 _difficultyBonusTreeMod;
};
-extern LootStore LootTemplates_Creature;
-extern LootStore LootTemplates_Fishing;
-extern LootStore LootTemplates_Gameobject;
-extern LootStore LootTemplates_Item;
-extern LootStore LootTemplates_Mail;
-extern LootStore LootTemplates_Milling;
-extern LootStore LootTemplates_Pickpocketing;
-extern LootStore LootTemplates_Reference;
-extern LootStore LootTemplates_Skinning;
-extern LootStore LootTemplates_Disenchant;
-extern LootStore LootTemplates_Prospecting;
-extern LootStore LootTemplates_Spell;
-
-void LoadLootTemplates_Creature();
-void LoadLootTemplates_Fishing();
-void LoadLootTemplates_Gameobject();
-void LoadLootTemplates_Item();
-void LoadLootTemplates_Mail();
-void LoadLootTemplates_Milling();
-void LoadLootTemplates_Pickpocketing();
-void LoadLootTemplates_Skinning();
-void LoadLootTemplates_Disenchant();
-void LoadLootTemplates_Prospecting();
-
-void LoadLootTemplates_Spell();
-void LoadLootTemplates_Reference();
-
-inline void LoadLootTables()
-{
- LoadLootTemplates_Creature();
- LoadLootTemplates_Fishing();
- LoadLootTemplates_Gameobject();
- LoadLootTemplates_Item();
- LoadLootTemplates_Mail();
- LoadLootTemplates_Milling();
- LoadLootTemplates_Pickpocketing();
- LoadLootTemplates_Skinning();
- LoadLootTemplates_Disenchant();
- LoadLootTemplates_Prospecting();
- LoadLootTemplates_Spell();
-
- LoadLootTemplates_Reference();
-}
+TC_GAME_API extern LootStore LootTemplates_Creature;
+TC_GAME_API extern LootStore LootTemplates_Fishing;
+TC_GAME_API extern LootStore LootTemplates_Gameobject;
+TC_GAME_API extern LootStore LootTemplates_Item;
+TC_GAME_API extern LootStore LootTemplates_Mail;
+TC_GAME_API extern LootStore LootTemplates_Milling;
+TC_GAME_API extern LootStore LootTemplates_Pickpocketing;
+TC_GAME_API extern LootStore LootTemplates_Reference;
+TC_GAME_API extern LootStore LootTemplates_Skinning;
+TC_GAME_API extern LootStore LootTemplates_Disenchant;
+TC_GAME_API extern LootStore LootTemplates_Prospecting;
+TC_GAME_API extern LootStore LootTemplates_Spell;
+
+TC_GAME_API void LoadLootTemplates_Creature();
+TC_GAME_API void LoadLootTemplates_Fishing();
+TC_GAME_API void LoadLootTemplates_Gameobject();
+TC_GAME_API void LoadLootTemplates_Item();
+TC_GAME_API void LoadLootTemplates_Mail();
+TC_GAME_API void LoadLootTemplates_Milling();
+TC_GAME_API void LoadLootTemplates_Pickpocketing();
+TC_GAME_API void LoadLootTemplates_Skinning();
+TC_GAME_API void LoadLootTemplates_Disenchant();
+TC_GAME_API void LoadLootTemplates_Prospecting();
+
+TC_GAME_API void LoadLootTemplates_Spell();
+TC_GAME_API void LoadLootTemplates_Reference();
+
+TC_GAME_API void LoadLootTables();
#endif
diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h
index 8bbd378f5d7..0031d3f7c3e 100644
--- a/src/server/game/Mails/Mail.h
+++ b/src/server/game/Mails/Mail.h
@@ -80,7 +80,7 @@ enum MailShowFlags
MAIL_SHOW_RETURN = 0x0010
};
-class MailSender
+class TC_GAME_API MailSender
{
public: // Constructors
MailSender(MailMessageType messageType, ObjectGuid::LowType sender_guidlow_or_entry, MailStationery stationery = MAIL_STATIONERY_DEFAULT)
@@ -101,7 +101,7 @@ class MailSender
MailStationery m_stationery;
};
-class MailReceiver
+class TC_GAME_API MailReceiver
{
public: // Constructors
explicit MailReceiver(ObjectGuid::LowType receiver_lowguid) : m_receiver(NULL), m_receiver_lowguid(receiver_lowguid) { }
@@ -115,7 +115,7 @@ class MailReceiver
ObjectGuid::LowType m_receiver_lowguid;
};
-class MailDraft
+class TC_GAME_API MailDraft
{
typedef std::map<ObjectGuid::LowType, Item*> MailItemMap;
@@ -163,7 +163,7 @@ struct MailItemInfo
};
typedef std::vector<MailItemInfo> MailItemInfoVec;
-struct Mail
+struct TC_GAME_API Mail
{
uint32 messageID;
uint8 messageType;
diff --git a/src/server/game/Maps/AreaBoundary.cpp b/src/server/game/Maps/AreaBoundary.cpp
new file mode 100644
index 00000000000..e09b252179e
--- /dev/null
+++ b/src/server/game/Maps/AreaBoundary.cpp
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "AreaBoundary.h"
+#include "Unit.h"
+#include "TemporarySummon.h"
+
+// ---== RECTANGLE ==---
+RectangleBoundary::RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted) :
+ AreaBoundary(BoundaryType::BOUNDARY_RECTANGLE, isInverted), _minX(southX), _maxX(northX), _minY(eastY), _maxY(westY) { }
+bool RectangleBoundary::IsWithinBoundaryArea(const Position* pos) const
+{
+ if (!pos)
+ return false;
+
+ return !(
+ pos->GetPositionX() < _minX ||
+ pos->GetPositionX() > _maxX ||
+ pos->GetPositionY() < _minY ||
+ pos->GetPositionY() > _maxY
+ );
+}
+
+
+// ---== CIRCLE ==---
+CircleBoundary::CircleBoundary(Position const& center, double radius, bool isInverted) :
+ CircleBoundary(DoublePosition(center), radius, isInverted) { }
+CircleBoundary::CircleBoundary(DoublePosition const& center, double radius, bool isInverted) :
+ AreaBoundary(BoundaryType::BOUNDARY_CIRCLE, isInverted), _center(center), _radiusSq(radius*radius) { }
+CircleBoundary::CircleBoundary(Position const& center, Position const& pointOnCircle, bool isInverted) :
+ CircleBoundary(DoublePosition(center), DoublePosition(pointOnCircle), isInverted) { }
+CircleBoundary::CircleBoundary(DoublePosition const& center, DoublePosition const& pointOnCircle, bool isInverted) :
+ AreaBoundary(BoundaryType::BOUNDARY_CIRCLE, isInverted), _center(center), _radiusSq(center.GetDoubleExactDist2dSq(pointOnCircle)) { }
+bool CircleBoundary::IsWithinBoundaryArea(const Position* pos) const
+{
+ if (!pos)
+ return false;
+
+ double offX = _center.GetDoublePositionX() - pos->GetPositionX();
+ double offY = _center.GetDoublePositionY() - pos->GetPositionY();
+ return offX*offX+offY*offY <= _radiusSq;
+}
+
+
+// ---== ELLIPSE ==---
+EllipseBoundary::EllipseBoundary(Position const& center, double radiusX, double radiusY, bool isInverted) :
+ EllipseBoundary(DoublePosition(center), radiusX, radiusY, isInverted) { }
+EllipseBoundary::EllipseBoundary(DoublePosition const& center, double radiusX, double radiusY, bool isInverted) :
+ AreaBoundary(BoundaryType::BOUNDARY_ELLIPSE, isInverted), _center(center), _radiusYSq(radiusY*radiusY), _scaleXSq(_radiusYSq / (radiusX*radiusX)) { }
+bool EllipseBoundary::IsWithinBoundaryArea(const Position* pos) const
+{
+ if (!pos)
+ return false;
+
+ double offX = _center.GetDoublePositionX()-pos->GetPositionX(), offY = _center.GetDoublePositionY()-pos->GetPositionY();
+ return (offX*offX)*_scaleXSq + (offY*offY) <= _radiusYSq;
+}
+
+
+// ---== TRIANGLE ==---
+TriangleBoundary::TriangleBoundary(Position const& pointA, Position const& pointB, Position const& pointC, bool isInverted) :
+ TriangleBoundary(DoublePosition(pointA), DoublePosition(pointB), DoublePosition(pointC), isInverted) { }
+TriangleBoundary::TriangleBoundary(DoublePosition const& pointA, DoublePosition const& pointB, DoublePosition const& pointC, bool isInverted) :
+ AreaBoundary(BoundaryType::BOUNDARY_TRIANGLE, isInverted), _a(pointA), _b(pointB), _c(pointC), _abx(_b.GetDoublePositionX()-_a.GetDoublePositionX()), _bcx(_c.GetDoublePositionX()-_b.GetDoublePositionX()), _cax(_a.GetDoublePositionX() - _c.GetDoublePositionX()), _aby(_b.GetDoublePositionY()-_a.GetDoublePositionY()), _bcy(_c.GetDoublePositionY()-_b.GetDoublePositionY()), _cay(_a.GetDoublePositionY() - _c.GetDoublePositionY()) { }
+bool TriangleBoundary::IsWithinBoundaryArea(const Position* pos) const
+{
+ if (!pos)
+ return false;
+
+ // half-plane signs
+ bool sign1 = ((-_b.GetDoublePositionX() + pos->GetPositionX()) * _aby - (-_b.GetDoublePositionY() + pos->GetPositionY()) * _abx) < 0;
+ bool sign2 = ((-_c.GetDoublePositionX() + pos->GetPositionX()) * _bcy - (-_c.GetDoublePositionY() + pos->GetPositionY()) * _bcx) < 0;
+ bool sign3 = ((-_a.GetDoublePositionX() + pos->GetPositionX()) * _cay - (-_a.GetDoublePositionY() + pos->GetPositionY()) * _cax) < 0;
+
+ // if all signs are the same, the point is inside the triangle
+ return ((sign1 == sign2) && (sign2 == sign3));
+}
+
+
+// ---== PARALLELOGRAM ==---
+ParallelogramBoundary::ParallelogramBoundary(Position const& cornerA, Position const& cornerB, Position const& cornerD, bool isInverted) :
+ ParallelogramBoundary(DoublePosition(cornerA), DoublePosition(cornerB), DoublePosition(cornerD), isInverted) { }
+ParallelogramBoundary::ParallelogramBoundary(DoublePosition const& cornerA, DoublePosition const& cornerB, DoublePosition const& cornerD, bool isInverted) :
+ AreaBoundary(BoundaryType::BOUNDARY_PARALLELOGRAM, isInverted), _a(cornerA), _b(cornerB), _d(cornerD), _c(DoublePosition(_d.GetDoublePositionX() + (_b.GetDoublePositionX() - _a.GetDoublePositionX()), _d.GetDoublePositionY() + (_b.GetDoublePositionY() - _a.GetDoublePositionY()))), _abx(_b.GetDoublePositionX() - _a.GetDoublePositionX()), _dax(_a.GetDoublePositionX() - _d.GetDoublePositionX()), _aby(_b.GetDoublePositionY() - _a.GetDoublePositionY()), _day(_a.GetDoublePositionY() - _d.GetDoublePositionY()) { }
+bool ParallelogramBoundary::IsWithinBoundaryArea(const Position* pos) const
+{
+ if (!pos)
+ return false;
+
+ // half-plane signs
+ bool sign1 = ((-_b.GetDoublePositionX() + pos->GetPositionX()) * _aby - (-_b.GetDoublePositionY() + pos->GetPositionY()) * _abx) < 0;
+ bool sign2 = ((-_a.GetDoublePositionX() + pos->GetPositionX()) * _day - (-_a.GetDoublePositionY() + pos->GetPositionY()) * _dax) < 0;
+ bool sign3 = ((-_d.GetDoublePositionY() + pos->GetPositionY()) * _abx - (-_d.GetDoublePositionX() + pos->GetPositionX()) * _aby) < 0; // AB = -CD
+ bool sign4 = ((-_c.GetDoublePositionY() + pos->GetPositionY()) * _dax - (-_c.GetDoublePositionX() + pos->GetPositionX()) * _day) < 0; // DA = -BC
+
+ // if all signs are equal, the point is inside
+ return ((sign1 == sign2) && (sign2 == sign3) && (sign3 == sign4));
+}
+
+
+// ---== Z RANGE ==---
+ZRangeBoundary::ZRangeBoundary(float minZ, float maxZ, bool isInverted) :
+ AreaBoundary(BoundaryType::BOUNDARY_Z_RANGE, isInverted), _minZ(minZ), _maxZ(maxZ) { }
+bool ZRangeBoundary::IsWithinBoundaryArea(const Position* pos) const
+{
+ if (!pos)
+ return false;
+
+ return !(pos->GetPositionZ() < _minZ || pos->GetPositionZ() > _maxZ);
+}
diff --git a/src/server/game/Maps/AreaBoundary.h b/src/server/game/Maps/AreaBoundary.h
new file mode 100644
index 00000000000..a8780ddb60f
--- /dev/null
+++ b/src/server/game/Maps/AreaBoundary.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITY_AREA_BOUNDARY_H
+#define TRINITY_AREA_BOUNDARY_H
+
+#include "Position.h"
+
+class TC_GAME_API AreaBoundary
+{
+ public:
+ enum BoundaryType
+ {
+ BOUNDARY_RECTANGLE, // Rectangle aligned with the coordinate axis
+ BOUNDARY_CIRCLE,
+ BOUNDARY_ELLIPSE,
+ BOUNDARY_TRIANGLE,
+ BOUNDARY_PARALLELOGRAM,
+ BOUNDARY_Z_RANGE,
+ };
+ virtual ~AreaBoundary() { }
+ BoundaryType GetBoundaryType() const { return m_boundaryType; }
+ bool IsWithinBoundary(const Position* pos) const { return (IsWithinBoundaryArea(pos) != m_isInvertedBoundary); }
+
+ struct DoublePosition : Position
+ {
+ double d_positionX, d_positionY, d_positionZ;
+ DoublePosition(double x = 0.0, double y = 0.0, double z = 0.0, float o = 0.0f)
+ : Position(x, y, z, o), d_positionX(x), d_positionY(y), d_positionZ(z) { }
+ DoublePosition(float x, float y = 0.0f, float z = 0.0f, float o = 0.0f)
+ : Position(x, y, z, o), d_positionX(x), d_positionY(y), d_positionZ(z) { }
+ DoublePosition(const Position& pos)
+ : DoublePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()) { }
+
+ double GetDoublePositionX() const { return d_positionX; }
+ double GetDoublePositionY() const { return d_positionY; }
+ double GetDoublePositionZ() const { return d_positionZ; }
+
+ double GetDoubleExactDist2dSq(DoublePosition const& pos) const {
+ double offX = GetDoublePositionX() - pos.GetDoublePositionX();
+ double offY = GetDoublePositionY() - pos.GetDoublePositionY();
+ return (offX*offX) + (offY*offY);
+ }
+
+ Position* sync() { m_positionX = (float)d_positionX; m_positionY = (float)d_positionY; m_positionZ = (float)d_positionZ; return this; }
+ };
+
+ protected:
+ AreaBoundary(BoundaryType bType, bool isInverted) : m_boundaryType(bType), m_isInvertedBoundary(isInverted) { }
+ virtual bool IsWithinBoundaryArea(const Position* pos) const = 0;
+ const BoundaryType m_boundaryType;
+ bool m_isInvertedBoundary;
+};
+
+class TC_GAME_API RectangleBoundary : public AreaBoundary
+{
+ public:
+ // X axis is north/south, Y axis is east/west, larger values are northwest
+ RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted = false);
+
+ protected:
+ bool IsWithinBoundaryArea(const Position* pos) const override;
+
+ private:
+ const float _minX, _maxX, _minY, _maxY;
+};
+
+class TC_GAME_API CircleBoundary : public AreaBoundary
+{
+ public:
+ CircleBoundary(Position const& center, double radius, bool isInverted = false);
+ CircleBoundary(DoublePosition const& center, double radius, bool isInverted = false);
+ CircleBoundary(Position const& center, Position const& pointOnCircle, bool isInverted = false);
+ CircleBoundary(DoublePosition const& center, DoublePosition const& pointOnCircle, bool isInverted = false);
+
+ protected:
+ bool IsWithinBoundaryArea(const Position* pos) const override;
+
+ private:
+ const DoublePosition _center;
+ const double _radiusSq;
+};
+
+class TC_GAME_API EllipseBoundary : public AreaBoundary
+{
+ public:
+ EllipseBoundary(Position const& center, double radiusX, double radiusY, bool isInverted = false);
+ EllipseBoundary(DoublePosition const& center, double radiusX, double radiusY, bool isInverted = false);
+
+ protected:
+ bool IsWithinBoundaryArea(const Position* pos) const override;
+
+ private:
+ const DoublePosition _center;
+ const double _radiusYSq, _scaleXSq;
+};
+
+class TC_GAME_API TriangleBoundary : public AreaBoundary
+{
+ public:
+ TriangleBoundary(Position const& pointA, Position const& pointB, Position const& pointC, bool isInverted = false);
+ TriangleBoundary(DoublePosition const& pointA, DoublePosition const& pointB, DoublePosition const& pointC, bool isInverted = false);
+
+ protected:
+ bool IsWithinBoundaryArea(const Position* pos) const override;
+
+ private:
+ const DoublePosition _a, _b, _c;
+ const double _abx, _bcx, _cax, _aby, _bcy, _cay;
+};
+
+class TC_GAME_API ParallelogramBoundary : public AreaBoundary
+{
+ public:
+ // Note: AB must be orthogonal to AD
+ ParallelogramBoundary(Position const& cornerA, Position const& cornerB, Position const& cornerD, bool isInverted = false);
+ ParallelogramBoundary(DoublePosition const& cornerA, DoublePosition const& cornerB, DoublePosition const& cornerD, bool isInverted = false);
+
+ protected:
+ bool IsWithinBoundaryArea(const Position* pos) const override;
+
+ private:
+ const DoublePosition _a, _b, _d, _c;
+ const double _abx, _dax, _aby, _day;
+};
+
+class TC_GAME_API ZRangeBoundary : public AreaBoundary
+{
+ public:
+ ZRangeBoundary(float minZ, float maxZ, bool isInverted = false);
+
+ protected:
+ bool IsWithinBoundaryArea(const Position* pos) const override;
+
+ private:
+ const float _minZ, _maxZ;
+};
+
+#endif //TRINITY_AREA_BOUNDARY_H
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 90c02b10477..d1d13e428f9 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3019,17 +3019,17 @@ void Map::RemoveFromActive(DynamicObject* obj)
RemoveFromActiveHelper(obj);
}
-template bool Map::AddToMap(Corpse*);
-template bool Map::AddToMap(Creature*);
-template bool Map::AddToMap(GameObject*);
-template bool Map::AddToMap(DynamicObject*);
-template bool Map::AddToMap(AreaTrigger*);
-
-template void Map::RemoveFromMap(Corpse*, bool);
-template void Map::RemoveFromMap(Creature*, bool);
-template void Map::RemoveFromMap(GameObject*, bool);
-template void Map::RemoveFromMap(DynamicObject*, bool);
-template void Map::RemoveFromMap(AreaTrigger*, bool);
+template TC_GAME_API bool Map::AddToMap(Corpse*);
+template TC_GAME_API bool Map::AddToMap(Creature*);
+template TC_GAME_API bool Map::AddToMap(GameObject*);
+template TC_GAME_API bool Map::AddToMap(DynamicObject*);
+template TC_GAME_API bool Map::AddToMap(AreaTrigger*);
+
+template TC_GAME_API void Map::RemoveFromMap(Corpse*, bool);
+template TC_GAME_API void Map::RemoveFromMap(Creature*, bool);
+template TC_GAME_API void Map::RemoveFromMap(GameObject*, bool);
+template TC_GAME_API void Map::RemoveFromMap(DynamicObject*, bool);
+template TC_GAME_API void Map::RemoveFromMap(AreaTrigger*, bool);
/* ******* Dungeon Instance Maps ******* */
@@ -3062,62 +3062,38 @@ void InstanceMap::InitVisibilityDistance()
/*
Do map specific checks to see if the player can enter
*/
-bool InstanceMap::CanEnter(Player* player)
+Map::EnterState InstanceMap::CannotEnter(Player* player)
{
if (player->GetMapRef().getTarget() == this)
{
- TC_LOG_ERROR("maps", "InstanceMap::CanEnter - player %s(%s) already in map %d, %d, %d!", player->GetName().c_str(), player->GetGUID().ToString().c_str(), GetId(), GetInstanceId(), GetSpawnMode());
+ TC_LOG_ERROR("maps", "InstanceMap::CannotEnter - player %s(%s) already in map %d, %d, %d!", player->GetName().c_str(), player->GetGUID().ToString().c_str(), GetId(), GetInstanceId(), GetSpawnMode());
ABORT();
- return false;
+ return CANNOT_ENTER_ALREADY_IN_MAP;
}
// allow GM's to enter
if (player->IsGameMaster())
- return Map::CanEnter(player);
+ return Map::CannotEnter(player);
// cannot enter if the instance is full (player cap), GMs don't count
uint32 maxPlayers = GetMaxPlayers();
if (GetPlayersCountExceptGMs() >= maxPlayers)
{
TC_LOG_WARN("maps", "MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), maxPlayers, player->GetName().c_str());
- player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
- return false;
+ return CANNOT_ENTER_MAX_PLAYERS;
}
- // cannot enter while an encounter is in progress
- // allow if just loading
+ // cannot enter while an encounter is in progress (unless this is a relog, in which case it is permitted)
if (!player->IsLoading() && IsRaid() && GetInstanceScript() && GetInstanceScript()->IsEncounterInProgress())
- {
- player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);
- return false;
- }
+ return CANNOT_ENTER_ZONE_IN_COMBAT;
- // cannot enter if instance is in use by another party/soloer that have a
- // permanent save in the same instance id
+ // cannot enter if player is permanent saved to a different instance id
+ if (InstancePlayerBind* playerBind = player->GetBoundInstance(GetId(), GetDifficultyID()))
+ if (playerBind->perm && playerBind->save)
+ if (playerBind->save->GetInstanceId() != GetInstanceId())
+ return CANNOT_ENTER_INSTANCE_BIND_MISMATCH;
- PlayerList const &playerList = GetPlayers();
-
- if (!playerList.isEmpty())
- for (PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i)
- if (Player* iPlayer = i->GetSource())
- {
- if (iPlayer->IsGameMaster()) // bypass GMs
- continue;
- if (!player->GetGroup()) // player has not group and there is someone inside, deny entry
- {
- player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
- return false;
- }
- // player inside instance has no group or his groups is different to entering player's one, deny entry
- if (!iPlayer->GetGroup() || iPlayer->GetGroup() != player->GetGroup())
- {
- player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
- return false;
- }
- break;
- }
-
- return Map::CanEnter(player);
+ return Map::CannotEnter(player);
}
/*
@@ -3169,7 +3145,7 @@ bool InstanceMap::AddPlayerToMap(Player* player, bool initPlayer /*= true*/)
{
if (group)
{
- // solo saves should be reset when entering a group
+ // solo saves should have been reset when the map was loaded
InstanceGroupBind* groupBind = group->GetBoundInstance(this);
if (playerBind && playerBind->save != mapSave)
{
@@ -3474,21 +3450,21 @@ void BattlegroundMap::InitVisibilityDistance()
m_VisibilityNotifyPeriod = World::GetVisibilityNotifyPeriodInBGArenas();
}
-bool BattlegroundMap::CanEnter(Player* player)
+Map::EnterState BattlegroundMap::CannotEnter(Player* player)
{
if (player->GetMapRef().getTarget() == this)
{
- TC_LOG_ERROR("maps", "BGMap::CanEnter - %s is already in map!", player->GetGUID().ToString().c_str());
+ TC_LOG_ERROR("maps", "BGMap::CannotEnter - player %s is already in map!", player->GetGUID().ToString().c_str());
ABORT();
- return false;
+ return CANNOT_ENTER_ALREADY_IN_MAP;
}
if (player->GetBattlegroundId() != GetInstanceId())
- return false;
+ return CANNOT_ENTER_INSTANCE_BIND_MISMATCH;
// player number limit is checked in bgmgr, no need to do it here
- return Map::CanEnter(player);
+ return Map::CannotEnter(player);
}
bool BattlegroundMap::AddPlayerToMap(Player* player, bool initPlayer /*= true*/)
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 34aa00e4bf9..75d184b19a6 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -156,7 +156,7 @@ struct LiquidData
float depth_level;
};
-class GridMap
+class TC_GAME_API GridMap
{
uint32 _flags;
union{
@@ -256,7 +256,7 @@ typedef std::unordered_map<uint32 /*zoneId*/, ZoneDynamicInfo> ZoneDynamicInfoMa
typedef TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid> MapStoredObjectTypesContainer;
-class Map : public GridRefManager<NGridType>
+class TC_GAME_API Map : public GridRefManager<NGridType>
{
friend class MapReference;
public:
@@ -280,6 +280,7 @@ class Map : public GridRefManager<NGridType>
virtual bool AddPlayerToMap(Player* player, bool initPlayer = true);
virtual void RemovePlayerFromMap(Player*, bool);
+
template<class T> bool AddToMap(T *);
template<class T> void RemoveFromMap(T *, bool);
@@ -295,7 +296,8 @@ class Map : public GridRefManager<NGridType>
void GameObjectRelocation(GameObject* go, float x, float y, float z, float orientation, bool respawnRelocationOnFail = true);
void DynamicObjectRelocation(DynamicObject* go, float x, float y, float z, float orientation);
- template<class T, class CONTAINER> void Visit(const Cell& cell, TypeContainerVisitor<T, CONTAINER> &visitor);
+ template<class T, class CONTAINER>
+ void Visit(const Cell& cell, TypeContainerVisitor<T, CONTAINER> &visitor);
bool IsRemovalGrid(float x, float y) const
{
@@ -365,7 +367,23 @@ class Map : public GridRefManager<NGridType>
uint32 GetInstanceId() const { return i_InstanceId; }
uint8 GetSpawnMode() const { return (i_spawnMode); }
- virtual bool CanEnter(Player* /*player*/) { return true; }
+
+ enum EnterState
+ {
+ CAN_ENTER = 0,
+ CANNOT_ENTER_ALREADY_IN_MAP = 1, // Player is already in the map
+ CANNOT_ENTER_NO_ENTRY, // No map entry was found for the target map ID
+ CANNOT_ENTER_UNINSTANCED_DUNGEON, // No instance template was found for dungeon map
+ CANNOT_ENTER_DIFFICULTY_UNAVAILABLE, // Requested instance difficulty is not available for target map
+ CANNOT_ENTER_NOT_IN_RAID, // Target instance is a raid instance and the player is not in a raid group
+ CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE, // Player is dead and their corpse is not in target instance
+ CANNOT_ENTER_INSTANCE_BIND_MISMATCH, // Player's permanent instance save is not compatible with their group's current instance bind
+ CANNOT_ENTER_TOO_MANY_INSTANCES, // Player has entered too many instances recently
+ CANNOT_ENTER_MAX_PLAYERS, // Target map already has the maximum number of players allowed
+ CANNOT_ENTER_ZONE_IN_COMBAT, // A boss encounter is currently in progress on the target map
+ CANNOT_ENTER_UNSPECIFIED_REASON
+ };
+ virtual EnterState CannotEnter(Player* /*player*/) { return CAN_ENTER; }
const char* GetMapName() const;
// have meaning only for instanced map (that have set real difficulty)
@@ -737,7 +755,7 @@ enum InstanceResetMethod
INSTANCE_RESET_RESPAWN_DELAY
};
-class InstanceMap : public Map
+class TC_GAME_API InstanceMap : public Map
{
public:
InstanceMap(uint32 id, time_t, uint32 InstanceId, uint8 SpawnMode, Map* _parent);
@@ -751,7 +769,7 @@ class InstanceMap : public Map
InstanceScript* GetInstanceScript() { return i_data; }
void PermBindAllPlayers(Player* source);
void UnloadAll() override;
- bool CanEnter(Player* player) override;
+ EnterState CannotEnter(Player* player) override;
void SendResetWarnings(uint32 timeLeft) const;
void SetResetSchedule(bool on);
@@ -766,7 +784,7 @@ class InstanceMap : public Map
uint32 i_script_id;
};
-class BattlegroundMap : public Map
+class TC_GAME_API BattlegroundMap : public Map
{
public:
BattlegroundMap(uint32 id, time_t, uint32 InstanceId, Map* _parent, uint8 spawnMode);
@@ -774,7 +792,7 @@ class BattlegroundMap : public Map
bool AddPlayerToMap(Player* player, bool initPlayer = true) override;
void RemovePlayerFromMap(Player*, bool) override;
- bool CanEnter(Player* player) override;
+ EnterState CannotEnter(Player* player) override;
void SetUnload();
//void UnloadAll(bool pForce);
void RemoveAllPlayers() override;
diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp
index 70623e1d7ab..e277746290a 100644
--- a/src/server/game/Maps/MapInstanced.cpp
+++ b/src/server/game/Maps/MapInstanced.cpp
@@ -111,12 +111,12 @@ void MapInstanced::UnloadAll()
- create the instance if it's not created already
- the player is not actually added to the instance (only in InstanceMap::Add)
*/
-Map* MapInstanced::CreateInstanceForPlayer(const uint32 mapId, Player* player)
+Map* MapInstanced::CreateInstanceForPlayer(const uint32 mapId, Player* player, uint32 loginInstanceId)
{
if (GetId() != mapId || !player)
- return NULL;
+ return nullptr;
- Map* map = NULL;
+ Map* map = nullptr;
uint32 newInstanceId = 0; // instanceId of the resulting map
if (IsBattlegroundOrArena())
@@ -125,7 +125,7 @@ Map* MapInstanced::CreateInstanceForPlayer(const uint32 mapId, Player* player)
// the instance id is set in battlegroundid
newInstanceId = player->GetBattlegroundId();
if (!newInstanceId)
- return NULL;
+ return nullptr;
map = sMapMgr->FindMap(mapId, newInstanceId);
if (!map)
@@ -135,27 +135,40 @@ Map* MapInstanced::CreateInstanceForPlayer(const uint32 mapId, Player* player)
else
{
player->TeleportToBGEntryPoint();
- return NULL;
+ return nullptr;
}
}
}
else if (!IsGarrison())
{
InstancePlayerBind* pBind = player->GetBoundInstance(GetId(), player->GetDifficultyID(GetEntry()));
- InstanceSave* pSave = pBind ? pBind->save : NULL;
+ InstanceSave* pSave = pBind ? pBind->save : nullptr;
- // the player's permanent player bind is taken into consideration first
- // then the player's group bind and finally the solo bind.
+ // priority:
+ // 1. player's permanent bind
+ // 2. player's current instance id if this is at login
+ // 3. group's current bind
+ // 4. player's current bind
if (!pBind || !pBind->perm)
{
- InstanceGroupBind* groupBind = NULL;
+ if (loginInstanceId) // if the player has a saved instance id on login, we either use this instance or relocate him out (return null)
+ {
+ map = FindInstanceMap(loginInstanceId);
+ return (map && map->GetId() == GetId()) ? map : nullptr; // is this check necessary? or does MapInstanced only find instances of itself?
+ }
+
+ InstanceGroupBind* groupBind = nullptr;
Group* group = player->GetGroup();
// use the player's difficulty setting (it may not be the same as the group's)
if (group)
{
groupBind = group->GetBoundInstance(this);
if (groupBind)
+ {
+ // solo saves should be reset when entering a group's instance
+ player->UnbindInstance(GetId(), player->GetDifficultyID(GetEntry()));
pSave = groupBind->save;
+ }
}
}
if (pSave)
@@ -288,8 +301,8 @@ bool MapInstanced::DestroyInstance(InstancedMaps::iterator &itr)
return true;
}
-bool MapInstanced::CanEnter(Player* /*player*/)
+Map::EnterState MapInstanced::CannotEnter(Player* /*player*/)
{
//ABORT();
- return true;
+ return CAN_ENTER;
}
diff --git a/src/server/game/Maps/MapInstanced.h b/src/server/game/Maps/MapInstanced.h
index f0d185bd796..7d89d446846 100644
--- a/src/server/game/Maps/MapInstanced.h
+++ b/src/server/game/Maps/MapInstanced.h
@@ -25,7 +25,7 @@
class GarrisonMap;
-class MapInstanced : public Map
+class TC_GAME_API MapInstanced : public Map
{
friend class MapManager;
public:
@@ -39,13 +39,13 @@ class MapInstanced : public Map
void DelayedUpdate(const uint32 diff) override;
//void RelocationNotify();
void UnloadAll() override;
- bool CanEnter(Player* player) override;
+ EnterState CannotEnter(Player* /*player*/) override;
- Map* CreateInstanceForPlayer(const uint32 mapId, Player* player);
+ Map* CreateInstanceForPlayer(const uint32 mapId, Player* player, uint32 loginInstanceId=0);
Map* FindInstanceMap(uint32 instanceId) const
{
InstancedMaps::const_iterator i = m_InstancedMaps.find(instanceId);
- return(i == m_InstancedMaps.end() ? NULL : i->second);
+ return(i == m_InstancedMaps.end() ? nullptr : i->second);
}
bool DestroyInstance(InstancedMaps::iterator &itr);
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index bed31834842..184af8fc360 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -62,6 +62,12 @@ void MapManager::InitializeVisibilityDistanceInfo()
(*iter).second->InitVisibilityDistance();
}
+MapManager* MapManager::instance()
+{
+ static MapManager instance;
+ return &instance;
+}
+
Map* MapManager::CreateBaseMap(uint32 id)
{
Map* map = FindBaseMap(id);
@@ -97,12 +103,12 @@ Map* MapManager::FindBaseNonInstanceMap(uint32 mapId) const
return map;
}
-Map* MapManager::CreateMap(uint32 id, Player* player)
+Map* MapManager::CreateMap(uint32 id, Player* player, uint32 loginInstanceId)
{
Map* m = CreateBaseMap(id);
if (m && m->Instanceable())
- m = ((MapInstanced*)m)->CreateInstanceForPlayer(id, player);
+ m = ((MapInstanced*)m)->CreateInstanceForPlayer(id, player, loginInstanceId);
return m;
}
@@ -119,47 +125,36 @@ Map* MapManager::FindMap(uint32 mapid, uint32 instanceId) const
return ((MapInstanced*)map)->FindInstanceMap(instanceId);
}
-bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck)
+Map::EnterState MapManager::PlayerCannotEnter(uint32 mapid, Player* player, bool loginCheck)
{
MapEntry const* entry = sMapStore.LookupEntry(mapid);
if (!entry)
- return false;
+ return Map::CANNOT_ENTER_NO_ENTRY;
if (!entry->IsDungeon())
- return true;
+ return Map::CAN_ENTER;
InstanceTemplate const* instance = sObjectMgr->GetInstanceTemplate(mapid);
if (!instance)
- return false;
+ return Map::CANNOT_ENTER_UNINSTANCED_DUNGEON;
Difficulty targetDifficulty, requestedDifficulty;
targetDifficulty = requestedDifficulty = player->GetDifficultyID(entry);
// Get the highest available difficulty if current setting is higher than the instance allows
MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(entry->ID, targetDifficulty);
if (!mapDiff)
- {
- player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, requestedDifficulty);
- return false;
- }
+ return Map::CANNOT_ENTER_DIFFICULTY_UNAVAILABLE;
//Bypass checks for GMs
if (player->IsGameMaster())
- return true;
+ return Map::CAN_ENTER;
char const* mapName = entry->MapName_lang;
Group* group = player->GetGroup();
- if (entry->IsRaid())
- {
- // can only enter in a raid group
+ if (entry->IsRaid()) // can only enter in a raid group
if ((!group || !group->isRaidGroup()) && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
- {
- /// @todo this is not a good place to send the message
- player->SendRaidGroupOnlyMessage(RAID_GROUP_ERR_ONLY, 0);
- TC_LOG_DEBUG("maps", "MAP: Player '%s' must be in a raid group to enter instance '%s'", player->GetName().c_str(), mapName);
- return false;
- }
- }
+ return Map::CANNOT_ENTER_NOT_IN_RAID;
if (!player->IsAlive())
{
@@ -177,12 +172,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck)
} while (corpseMap);
if (!corpseMap)
- {
- WorldPackets::Misc::AreaTriggerNoCorpse packet;
- player->GetSession()->SendPacket(packet.Write());
- TC_LOG_DEBUG("maps", "MAP: Player '%s' does not have a corpse in instance '%s' and cannot enter.", player->GetName().c_str(), mapName);
- return false;
- }
+ return Map::CANNOT_ENTER_CORPSE_IN_DIFFERENT_INSTANCE;
TC_LOG_DEBUG("maps", "MAP: Player '%s' has corpse in instance '%s' and can enter.", player->GetName().c_str(), mapName);
}
@@ -191,23 +181,13 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck)
}
//Get instance where player's group is bound & its map
- if (group)
+ if (!loginCheck && group)
{
InstanceGroupBind* boundInstance = group->GetBoundInstance(entry);
if (boundInstance && boundInstance->save)
if (Map* boundMap = sMapMgr->FindMap(mapid, boundInstance->save->GetInstanceId()))
- if (!loginCheck && !boundMap->CanEnter(player))
- return false;
- /*
- This check has to be moved to InstanceMap::CanEnter()
- // Player permanently bounded to different instance than groups one
- InstancePlayerBind* playerBoundedInstance = player->GetBoundInstance(mapid, player->GetDifficultyID(entry));
- if (playerBoundedInstance && playerBoundedInstance->perm && playerBoundedInstance->save &&
- boundedInstance->save->GetInstanceId() != playerBoundedInstance->save->GetInstanceId())
- {
- /// @todo send some kind of error message to the player
- return false;
- }*/
+ if (Map::EnterState denyReason = boundMap->CannotEnter(player))
+ return denyReason;
}
// players are only allowed to enter 5 instances per hour
@@ -219,14 +199,14 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck)
// instanceId can never be 0 - will not be found
if (!player->CheckInstanceCount(instanceIdToCheck) && !player->isDead())
- {
- player->SendTransferAborted(mapid, TRANSFER_ABORT_TOO_MANY_INSTANCES);
- return false;
- }
+ return Map::CANNOT_ENTER_TOO_MANY_INSTANCES;
}
//Other requirements
- return player->Satisfy(sObjectMgr->GetAccessRequirement(mapid, targetDifficulty), mapid, true);
+ if (player->Satisfy(sObjectMgr->GetAccessRequirement(mapid, targetDifficulty), mapid, true))
+ return Map::CAN_ENTER;
+ else
+ return Map::CANNOT_ENTER_UNSPECIFIED_REASON;
}
void MapManager::Update(uint32 diff)
diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h
index c0811e7fecc..a4075f73563 100644
--- a/src/server/game/Maps/MapManager.h
+++ b/src/server/game/Maps/MapManager.h
@@ -28,18 +28,14 @@
class Transport;
struct TransportCreatureProto;
-class MapManager
+class TC_GAME_API MapManager
{
public:
- static MapManager* instance()
- {
- static MapManager instance;
- return &instance;
- }
+ static MapManager* instance();
Map* CreateBaseMap(uint32 mapId);
Map* FindBaseNonInstanceMap(uint32 mapId) const;
- Map* CreateMap(uint32 mapId, Player* player);
+ Map* CreateMap(uint32 mapId, Player* player, uint32 loginInstanceId=0);
Map* FindMap(uint32 mapId, uint32 instanceId) const;
uint32 GetAreaId(uint32 mapid, float x, float y, float z) const
@@ -106,7 +102,7 @@ class MapManager
void DoDelayedMovesAndRemoves();
- bool CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck = false);
+ Map::EnterState PlayerCannotEnter(uint32 mapid, Player* player, bool loginCheck = false);
void InitializeVisibilityDistanceInfo();
/* statistics */
diff --git a/src/server/game/Maps/MapUpdater.h b/src/server/game/Maps/MapUpdater.h
index fce4a26c36a..7fdcc24d530 100644
--- a/src/server/game/Maps/MapUpdater.h
+++ b/src/server/game/Maps/MapUpdater.h
@@ -28,7 +28,7 @@
class MapUpdateRequest;
class Map;
-class MapUpdater
+class TC_GAME_API MapUpdater
{
public:
diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp
index 028a58f53c0..5de0133c342 100644
--- a/src/server/game/Maps/TransportMgr.cpp
+++ b/src/server/game/Maps/TransportMgr.cpp
@@ -35,6 +35,12 @@ TransportMgr::TransportMgr() { }
TransportMgr::~TransportMgr() { }
+TransportMgr* TransportMgr::instance()
+{
+ static TransportMgr instance;
+ return &instance;
+}
+
void TransportMgr::Unload()
{
_transportTemplates.clear();
diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h
index d73f284138a..d058c0bb111 100644
--- a/src/server/game/Maps/TransportMgr.h
+++ b/src/server/game/Maps/TransportMgr.h
@@ -83,7 +83,7 @@ struct TransportTemplate
typedef std::map<uint32, TransportAnimationEntry const*> TransportPathContainer;
typedef std::map<uint32, TransportRotationEntry const*> TransportPathRotationContainer;
-struct TransportAnimation
+struct TC_GAME_API TransportAnimation
{
TransportAnimation() : TotalTime(0) { }
@@ -97,16 +97,12 @@ struct TransportAnimation
typedef std::map<uint32, TransportAnimation> TransportAnimationContainer;
-class TransportMgr
+class TC_GAME_API TransportMgr
{
friend void DB2Manager::LoadStores(std::string const&, uint32);
public:
- static TransportMgr* instance()
- {
- static TransportMgr instance;
- return &instance;
- }
+ static TransportMgr* instance();
void Unload();
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index de0e4b77791..4c3ce70fbef 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -1211,7 +1211,12 @@ enum TrinityStrings
LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD = 11007,
LANG_NPCINFO_INHABIT_TYPE = 11008,
- LANG_NPCINFO_FLAGS_EXTRA = 11009
+ LANG_NPCINFO_FLAGS_EXTRA = 11009,
+ LANG_INSTANCE_LOGIN_GAMEMASTER_EXCEPTION = 11010,
+ LANG_CREATURE_NO_INTERIOR_POINT_FOUND = 11011,
+ LANG_CREATURE_MOVEMENT_NOT_BOUNDED = 11012,
+ LANG_CREATURE_MOVEMENT_MAYBE_UNBOUNDED = 11013,
+ LANG_INSTANCE_BIND_MISMATCH = 11014
};
#endif
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index 3cb56e7d9d9..da1f9ef90f3 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -79,7 +79,7 @@ enum RotateDirection
// assume it is 25 yard per 0.6 second
#define SPEED_CHARGE 42.0f
-class MotionMaster //: private std::stack<MovementGenerator *>
+class TC_GAME_API MotionMaster //: private std::stack<MovementGenerator *>
{
private:
//typedef std::stack<MovementGenerator *> Impl;
diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h
index 56e5dc7058a..d9dd17fabc2 100755
--- a/src/server/game/Movement/MovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerator.h
@@ -27,7 +27,7 @@
class Unit;
-class MovementGenerator
+class TC_GAME_API MovementGenerator
{
public:
virtual ~MovementGenerator();
diff --git a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
index 9aa778c5651..161f9e3e970 100755
--- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
@@ -32,7 +32,7 @@ class IdleMovementGenerator : public MovementGenerator
MovementGeneratorType GetMovementGeneratorType() const override { return IDLE_MOTION_TYPE; }
};
-extern IdleMovementGenerator si_idleMovement;
+TC_GAME_API extern IdleMovementGenerator si_idleMovement;
class RotateMovementGenerator : public MovementGenerator
{
diff --git a/src/server/game/Movement/PathGenerator.h b/src/server/game/Movement/PathGenerator.h
index 71e0e88f0b2..3cad62abf25 100644
--- a/src/server/game/Movement/PathGenerator.h
+++ b/src/server/game/Movement/PathGenerator.h
@@ -49,7 +49,7 @@ enum PathType
PATHFIND_SHORT = 0x20, // path is longer or equal to its limited path length
};
-class PathGenerator
+class TC_GAME_API PathGenerator
{
public:
explicit PathGenerator(Unit const* owner);
diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h
index 439cd9a14a4..24a6d85fcbc 100644
--- a/src/server/game/Movement/Spline/MoveSpline.h
+++ b/src/server/game/Movement/Spline/MoveSpline.h
@@ -46,7 +46,7 @@ namespace Movement
// MoveSpline represents smooth catmullrom or linear curve and point that moves belong it
// curve can be cyclic - in this case movement will be cyclic
// point can have vertical acceleration motion component (used in fall, parabolic movement)
- class MoveSpline
+ class TC_GAME_API MoveSpline
{
friend class WorldPackets::Movement::CommonMovement;
friend class WorldPackets::Movement::MonsterMove;
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h
index c968f660f58..421a8d6b06c 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.h
+++ b/src/server/game/Movement/Spline/MoveSplineInit.h
@@ -35,7 +35,7 @@ namespace Movement
};
// Transforms coordinates from global to transport offsets
- class TransportPathTransform
+ class TC_GAME_API TransportPathTransform
{
public:
TransportPathTransform(Unit* owner, bool transformForTransport)
@@ -49,7 +49,7 @@ namespace Movement
/* Initializes and launches spline movement
*/
- class MoveSplineInit
+ class TC_GAME_API MoveSplineInit
{
public:
diff --git a/src/server/game/Movement/Spline/MovementTypedefs.h b/src/server/game/Movement/Spline/MovementTypedefs.h
index 927707bfd56..56d8842e700 100644
--- a/src/server/game/Movement/Spline/MovementTypedefs.h
+++ b/src/server/game/Movement/Spline/MovementTypedefs.h
@@ -77,10 +77,10 @@ namespace Movement
typedef counter<uint32, 0xFFFFFFFF> UInt32Counter;
- extern float gravity;
- extern UInt32Counter splineIdGen;
- extern std::string MovementFlags_ToString(uint32 flags);
- extern std::string MovementFlagsExtra_ToString(uint32 flags);
+ TC_GAME_API extern float gravity;
+ TC_GAME_API extern UInt32Counter splineIdGen;
+ TC_GAME_API extern std::string MovementFlags_ToString(uint32 flags);
+ TC_GAME_API extern std::string MovementFlagsExtra_ToString(uint32 flags);
}
#endif // TRINITYSERVER_TYPEDEFS_H
diff --git a/src/server/game/Movement/Waypoints/WaypointManager.cpp b/src/server/game/Movement/Waypoints/WaypointManager.cpp
index e0639e38e77..dc935263927 100644
--- a/src/server/game/Movement/Waypoints/WaypointManager.cpp
+++ b/src/server/game/Movement/Waypoints/WaypointManager.cpp
@@ -94,6 +94,12 @@ void WaypointMgr::Load()
TC_LOG_INFO("server.loading", ">> Loaded %u waypoints in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
+WaypointMgr* WaypointMgr::instance()
+{
+ static WaypointMgr instance;
+ return &instance;
+}
+
void WaypointMgr::ReloadPath(uint32 id)
{
WaypointPathContainer::iterator itr = _waypointStore.find(id);
diff --git a/src/server/game/Movement/Waypoints/WaypointManager.h b/src/server/game/Movement/Waypoints/WaypointManager.h
index d519eee4793..63dc4184308 100644
--- a/src/server/game/Movement/Waypoints/WaypointManager.h
+++ b/src/server/game/Movement/Waypoints/WaypointManager.h
@@ -44,14 +44,10 @@ struct WaypointData
typedef std::vector<WaypointData*> WaypointPath;
typedef std::unordered_map<uint32, WaypointPath> WaypointPathContainer;
-class WaypointMgr
+class TC_GAME_API WaypointMgr
{
public:
- static WaypointMgr* instance()
- {
- static WaypointMgr instance;
- return &instance;
- }
+ static WaypointMgr* instance();
// Attempts to reload a single path from database
void ReloadPath(uint32 id);
diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.h b/src/server/game/OutdoorPvP/OutdoorPvP.h
index 2be74279ae7..5996b4126e4 100644
--- a/src/server/game/OutdoorPvP/OutdoorPvP.h
+++ b/src/server/game/OutdoorPvP/OutdoorPvP.h
@@ -84,7 +84,7 @@ class Unit;
struct GossipMenuItems;
class OutdoorPvP;
-class OPvPCapturePoint
+class TC_GAME_API OPvPCapturePoint
{
public:
@@ -185,7 +185,7 @@ class OPvPCapturePoint
};
// base class for specific outdoor pvp handlers
-class OutdoorPvP : public ZoneScript
+class TC_GAME_API OutdoorPvP : public ZoneScript
{
friend class OutdoorPvPMgr;
diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
index 55fc8602c99..4081652cac7 100644
--- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
+++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
@@ -37,6 +37,12 @@ void OutdoorPvPMgr::Die()
delete itr->second;
}
+OutdoorPvPMgr* OutdoorPvPMgr::instance()
+{
+ static OutdoorPvPMgr instance;
+ return &instance;
+}
+
void OutdoorPvPMgr::InitOutdoorPvP()
{
uint32 oldMSTime = getMSTime();
diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h
index 8a113987882..e53a78ac271 100644
--- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h
+++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h
@@ -35,18 +35,14 @@ struct OutdoorPvPData
};
// class to handle player enter / leave / areatrigger / GO use events
-class OutdoorPvPMgr
+class TC_GAME_API OutdoorPvPMgr
{
private:
OutdoorPvPMgr();
~OutdoorPvPMgr() { };
public:
- static OutdoorPvPMgr* instance()
- {
- static OutdoorPvPMgr instance;
- return &instance;
- }
+ static OutdoorPvPMgr* instance();
// create outdoor pvp events
void InitOutdoorPvP();
diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp
index 006ce9c52f7..4e51641c502 100644
--- a/src/server/game/Pools/PoolMgr.cpp
+++ b/src/server/game/Pools/PoolMgr.cpp
@@ -60,6 +60,11 @@ bool ActivePoolData::IsActiveObject<Quest>(uint64 quest_id) const
return mActiveQuests.find(quest_id) != mActiveQuests.end();
}
+template TC_GAME_API bool ActivePoolData::IsActiveObject<Creature>(uint64) const;
+template TC_GAME_API bool ActivePoolData::IsActiveObject<GameObject>(uint64) const;
+template TC_GAME_API bool ActivePoolData::IsActiveObject<Pool>(uint64) const;
+template TC_GAME_API bool ActivePoolData::IsActiveObject<Quest>(uint64) const;
+
template<>
void ActivePoolData::ActivateObject<Creature>(uint64 db_guid, uint32 pool_id)
{
@@ -570,6 +575,12 @@ void PoolMgr::Initialize()
mCreatureSearchMap.clear();
}
+PoolMgr* PoolMgr::instance()
+{
+ static PoolMgr instance;
+ return &instance;
+}
+
void PoolMgr::LoadFromDB()
{
// Pool templates
diff --git a/src/server/game/Pools/PoolMgr.h b/src/server/game/Pools/PoolMgr.h
index 59cbee83094..b38d27f9c94 100644
--- a/src/server/game/Pools/PoolMgr.h
+++ b/src/server/game/Pools/PoolMgr.h
@@ -43,7 +43,7 @@ class Pool // for Pool of Pool
typedef std::set<uint64> ActivePoolObjects;
typedef std::map<uint64, uint32> ActivePoolPools;
-class ActivePoolData
+class TC_GAME_API ActivePoolData
{
public:
template<typename T>
@@ -66,7 +66,7 @@ class ActivePoolData
};
template <class T>
-class PoolGroup
+class TC_GAME_API PoolGroup
{
typedef std::vector<PoolObject> PoolObjectList;
public:
@@ -101,18 +101,14 @@ typedef std::multimap<uint32, uint32> PooledQuestRelation;
typedef std::pair<PooledQuestRelation::const_iterator, PooledQuestRelation::const_iterator> PooledQuestRelationBounds;
typedef std::pair<PooledQuestRelation::iterator, PooledQuestRelation::iterator> PooledQuestRelationBoundsNC;
-class PoolMgr
+class TC_GAME_API PoolMgr
{
private:
PoolMgr();
~PoolMgr() { };
public:
- static PoolMgr* instance()
- {
- static PoolMgr instance;
- return &instance;
- }
+ static PoolMgr* instance();
void LoadFromDB();
void LoadQuestPools();
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 8b27be40c20..b0df26f1ca5 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -276,7 +276,7 @@ typedef std::vector<QuestObjective> QuestObjectives;
// This Quest class provides a convenient way to access a few pretotaled (cached) quest details,
// all base quest information, and any utility functions such as generating the amount of
// xp to give
-class Quest
+class TC_GAME_API Quest
{
friend class ObjectMgr;
friend class Player;
diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h
index 224a928bbac..f2a5f3ba1f3 100644
--- a/src/server/game/Reputation/ReputationMgr.h
+++ b/src/server/game/Reputation/ReputationMgr.h
@@ -61,7 +61,7 @@ typedef std::map<uint32, ReputationRank> ForcedReactions;
class Player;
-class ReputationMgr
+class TC_GAME_API ReputationMgr
{
public: // constructors and global modifiers
explicit ReputationMgr(Player* owner) : _player(owner),
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 38ca4911a21..9b403e608c1 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -22,10 +22,10 @@
#include "DBCStores.h"
#include "ObjectMgr.h"
#include "OutdoorPvPMgr.h"
-#include "ScriptLoader.h"
#include "ScriptSystem.h"
#include "Transport.h"
#include "Vehicle.h"
+#include "SmartAI.h"
#include "SpellInfo.h"
#include "SpellScript.h"
#include "GossipDef.h"
@@ -240,12 +240,19 @@ struct TSpellSummary
uint8 Effects; // set of enum SelectEffect
} *SpellSummary;
-ScriptMgr::ScriptMgr() : _scriptCount(0), _scheduledScripts(0)
+ScriptMgr::ScriptMgr()
+ : _scriptCount(0), _scheduledScripts(0), _script_loader_callback(nullptr)
{
}
ScriptMgr::~ScriptMgr() { }
+ScriptMgr* ScriptMgr::instance()
+{
+ static ScriptMgr instance;
+ return &instance;
+}
+
void ScriptMgr::Initialize()
{
uint32 oldMSTime = getMSTime();
@@ -255,7 +262,13 @@ void ScriptMgr::Initialize()
TC_LOG_INFO("server.loading", "Loading C++ scripts");
FillSpellSummary();
- AddScripts();
+
+ AddSC_SmartScripts();
+
+ ASSERT(_script_loader_callback,
+ "Script loader callback wasn't registered!");
+
+ _script_loader_callback();
#ifdef SCRIPTS
for (std::string const& scriptName : UnusedScriptNames)
@@ -504,17 +517,6 @@ void ScriptMgr::OnPacketSend(WorldSession* session, WorldPacket const& packet)
FOREACH_SCRIPT(ServerScript)->OnPacketSend(session, copy);
}
-void ScriptMgr::OnUnknownPacketReceive(WorldSession* session, WorldPacket const& packet)
-{
- ASSERT(session);
-
- if (SCR_REG_LST(ServerScript).empty())
- return;
-
- WorldPacket copy(packet);
- FOREACH_SCRIPT(ServerScript)->OnUnknownPacketReceive(session, copy);
-}
-
void ScriptMgr::OnOpenStateChange(bool open)
{
FOREACH_SCRIPT(WorldScript)->OnOpenStateChange(open);
@@ -1689,32 +1691,32 @@ template<class TScript> std::vector<TScript*> ScriptRegistry<TScript>::Scripts;
template<class TScript> uint32 ScriptRegistry<TScript>::_scriptIdCounter = 0;
// Specialize for each script type class like so:
-template class ScriptRegistry<SpellScriptLoader>;
-template class ScriptRegistry<ServerScript>;
-template class ScriptRegistry<WorldScript>;
-template class ScriptRegistry<FormulaScript>;
-template class ScriptRegistry<WorldMapScript>;
-template class ScriptRegistry<InstanceMapScript>;
-template class ScriptRegistry<BattlegroundMapScript>;
-template class ScriptRegistry<ItemScript>;
-template class ScriptRegistry<CreatureScript>;
-template class ScriptRegistry<GameObjectScript>;
-template class ScriptRegistry<AreaTriggerScript>;
-template class ScriptRegistry<BattlegroundScript>;
-template class ScriptRegistry<OutdoorPvPScript>;
-template class ScriptRegistry<CommandScript>;
-template class ScriptRegistry<WeatherScript>;
-template class ScriptRegistry<AuctionHouseScript>;
-template class ScriptRegistry<ConditionScript>;
-template class ScriptRegistry<VehicleScript>;
-template class ScriptRegistry<DynamicObjectScript>;
-template class ScriptRegistry<TransportScript>;
-template class ScriptRegistry<AchievementCriteriaScript>;
-template class ScriptRegistry<PlayerScript>;
-template class ScriptRegistry<GuildScript>;
-template class ScriptRegistry<GroupScript>;
-template class ScriptRegistry<UnitScript>;
-template class ScriptRegistry<AccountScript>;
+template class TC_GAME_API ScriptRegistry<SpellScriptLoader>;
+template class TC_GAME_API ScriptRegistry<ServerScript>;
+template class TC_GAME_API ScriptRegistry<WorldScript>;
+template class TC_GAME_API ScriptRegistry<FormulaScript>;
+template class TC_GAME_API ScriptRegistry<WorldMapScript>;
+template class TC_GAME_API ScriptRegistry<InstanceMapScript>;
+template class TC_GAME_API ScriptRegistry<BattlegroundMapScript>;
+template class TC_GAME_API ScriptRegistry<ItemScript>;
+template class TC_GAME_API ScriptRegistry<CreatureScript>;
+template class TC_GAME_API ScriptRegistry<GameObjectScript>;
+template class TC_GAME_API ScriptRegistry<AreaTriggerScript>;
+template class TC_GAME_API ScriptRegistry<BattlegroundScript>;
+template class TC_GAME_API ScriptRegistry<OutdoorPvPScript>;
+template class TC_GAME_API ScriptRegistry<CommandScript>;
+template class TC_GAME_API ScriptRegistry<WeatherScript>;
+template class TC_GAME_API ScriptRegistry<AuctionHouseScript>;
+template class TC_GAME_API ScriptRegistry<ConditionScript>;
+template class TC_GAME_API ScriptRegistry<VehicleScript>;
+template class TC_GAME_API ScriptRegistry<DynamicObjectScript>;
+template class TC_GAME_API ScriptRegistry<TransportScript>;
+template class TC_GAME_API ScriptRegistry<AchievementCriteriaScript>;
+template class TC_GAME_API ScriptRegistry<PlayerScript>;
+template class TC_GAME_API ScriptRegistry<GuildScript>;
+template class TC_GAME_API ScriptRegistry<GroupScript>;
+template class TC_GAME_API ScriptRegistry<UnitScript>;
+template class TC_GAME_API ScriptRegistry<AccountScript>;
// Undefine utility macros.
#undef GET_SCRIPT_RET
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index aac2cdeabfa..f75446048ff 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -146,7 +146,7 @@ struct OutdoorPvPData;
event on all registered scripts of that type.
*/
-class ScriptObject
+class TC_GAME_API ScriptObject
{
friend class ScriptMgr;
@@ -185,7 +185,7 @@ template<class TObject> class UpdatableScript
virtual void OnUpdate(TObject* /*obj*/, uint32 /*diff*/) { }
};
-class SpellScriptLoader : public ScriptObject
+class TC_GAME_API SpellScriptLoader : public ScriptObject
{
protected:
@@ -200,7 +200,7 @@ class SpellScriptLoader : public ScriptObject
virtual AuraScript* GetAuraScript() const { return NULL; }
};
-class ServerScript : public ScriptObject
+class TC_GAME_API ServerScript : public ScriptObject
{
protected:
@@ -228,10 +228,6 @@ class ServerScript : public ScriptObject
// Called when a (valid) packet is received by a client. The packet object is a copy of the original packet, so
// reading and modifying it is safe. Make sure to check WorldSession pointer before usage, it might be null in case of auth packets
virtual void OnPacketReceive(WorldSession* /*session*/, WorldPacket& /*packet*/) { }
-
- // Called when an invalid (unknown opcode) packet is received by a client. The packet is a reference to the orignal
- // packet; not a copy. This allows you to actually handle unknown packets (for whatever purpose).
- virtual void OnUnknownPacketReceive(WorldSession* /*session*/, WorldPacket& /*packet*/) { }
};
class WorldScript : public ScriptObject
@@ -334,14 +330,14 @@ template<class TMap> class MapScript : public UpdatableScript<TMap>
virtual void OnPlayerLeave(TMap* /*map*/, Player* /*player*/) { }
};
-class WorldMapScript : public ScriptObject, public MapScript<Map>
+class TC_GAME_API WorldMapScript : public ScriptObject, public MapScript<Map>
{
protected:
WorldMapScript(const char* name, uint32 mapId);
};
-class InstanceMapScript : public ScriptObject, public MapScript<InstanceMap>
+class TC_GAME_API InstanceMapScript : public ScriptObject, public MapScript<InstanceMap>
{
protected:
@@ -353,14 +349,14 @@ class InstanceMapScript : public ScriptObject, public MapScript<InstanceMap>
virtual InstanceScript* GetInstanceScript(InstanceMap* /*map*/) const { return NULL; }
};
-class BattlegroundMapScript : public ScriptObject, public MapScript<BattlegroundMap>
+class TC_GAME_API BattlegroundMapScript : public ScriptObject, public MapScript<BattlegroundMap>
{
protected:
BattlegroundMapScript(const char* name, uint32 mapId);
};
-class ItemScript : public ScriptObject
+class TC_GAME_API ItemScript : public ScriptObject
{
protected:
@@ -384,7 +380,7 @@ class ItemScript : public ScriptObject
virtual bool OnRemove(Player* /*player*/, Item* /*item*/) { return false; }
};
-class UnitScript : public ScriptObject
+class TC_GAME_API UnitScript : public ScriptObject
{
protected:
@@ -407,7 +403,7 @@ class UnitScript : public ScriptObject
virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/) { }
};
-class CreatureScript : public UnitScript, public UpdatableScript<Creature>
+class TC_GAME_API CreatureScript : public UnitScript, public UpdatableScript<Creature>
{
protected:
@@ -443,7 +439,7 @@ class CreatureScript : public UnitScript, public UpdatableScript<Creature>
virtual CreatureAI* GetAI(Creature* /*creature*/) const { return NULL; }
};
-class GameObjectScript : public ScriptObject, public UpdatableScript<GameObject>
+class TC_GAME_API GameObjectScript : public ScriptObject, public UpdatableScript<GameObject>
{
protected:
@@ -488,7 +484,7 @@ class GameObjectScript : public ScriptObject, public UpdatableScript<GameObject>
virtual GameObjectAI* GetAI(GameObject* /*go*/) const { return NULL; }
};
-class AreaTriggerScript : public ScriptObject
+class TC_GAME_API AreaTriggerScript : public ScriptObject
{
protected:
@@ -500,7 +496,7 @@ class AreaTriggerScript : public ScriptObject
virtual bool OnTrigger(Player* /*player*/, AreaTriggerEntry const* /*trigger*/, bool /*entered*/) { return false; }
};
-class BattlegroundScript : public ScriptObject
+class TC_GAME_API BattlegroundScript : public ScriptObject
{
protected:
@@ -512,7 +508,7 @@ class BattlegroundScript : public ScriptObject
virtual Battleground* GetBattleground() const = 0;
};
-class OutdoorPvPScript : public ScriptObject
+class TC_GAME_API OutdoorPvPScript : public ScriptObject
{
protected:
@@ -524,7 +520,7 @@ class OutdoorPvPScript : public ScriptObject
virtual OutdoorPvP* GetOutdoorPvP() const = 0;
};
-class CommandScript : public ScriptObject
+class TC_GAME_API CommandScript : public ScriptObject
{
protected:
@@ -536,7 +532,7 @@ class CommandScript : public ScriptObject
virtual std::vector<ChatCommand> GetCommands() const = 0;
};
-class WeatherScript : public ScriptObject, public UpdatableScript<Weather>
+class TC_GAME_API WeatherScript : public ScriptObject, public UpdatableScript<Weather>
{
protected:
@@ -548,7 +544,7 @@ class WeatherScript : public ScriptObject, public UpdatableScript<Weather>
virtual void OnChange(Weather* /*weather*/, WeatherState /*state*/, float /*grade*/) { }
};
-class AuctionHouseScript : public ScriptObject
+class TC_GAME_API AuctionHouseScript : public ScriptObject
{
protected:
@@ -569,7 +565,7 @@ class AuctionHouseScript : public ScriptObject
virtual void OnAuctionExpire(AuctionHouseObject* /*ah*/, AuctionEntry* /*entry*/) { }
};
-class ConditionScript : public ScriptObject
+class TC_GAME_API ConditionScript : public ScriptObject
{
protected:
@@ -581,7 +577,7 @@ class ConditionScript : public ScriptObject
virtual bool OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/) { return true; }
};
-class VehicleScript : public ScriptObject
+class TC_GAME_API VehicleScript : public ScriptObject
{
protected:
@@ -608,14 +604,14 @@ class VehicleScript : public ScriptObject
virtual void OnRemovePassenger(Vehicle* /*veh*/, Unit* /*passenger*/) { }
};
-class DynamicObjectScript : public ScriptObject, public UpdatableScript<DynamicObject>
+class TC_GAME_API DynamicObjectScript : public ScriptObject, public UpdatableScript<DynamicObject>
{
protected:
DynamicObjectScript(const char* name);
};
-class TransportScript : public ScriptObject, public UpdatableScript<Transport>
+class TC_GAME_API TransportScript : public ScriptObject, public UpdatableScript<Transport>
{
protected:
@@ -636,7 +632,7 @@ class TransportScript : public ScriptObject, public UpdatableScript<Transport>
virtual void OnRelocate(Transport* /*transport*/, uint32 /*waypointId*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/) { }
};
-class AchievementCriteriaScript : public ScriptObject
+class TC_GAME_API AchievementCriteriaScript : public ScriptObject
{
protected:
@@ -648,7 +644,7 @@ class AchievementCriteriaScript : public ScriptObject
virtual bool OnCheck(Player* source, Unit* target) = 0;
};
-class PlayerScript : public UnitScript
+class TC_GAME_API PlayerScript : public UnitScript
{
protected:
@@ -745,7 +741,7 @@ class PlayerScript : public UnitScript
virtual void OnQuestStatusChange(Player* /*player*/, uint32 /*questId*/, QuestStatus /*status*/) { }
};
-class AccountScript : public ScriptObject
+class TC_GAME_API AccountScript : public ScriptObject
{
protected:
@@ -772,7 +768,7 @@ class AccountScript : public ScriptObject
virtual void OnFailedPasswordChange(uint32 /*accountId*/) {}
};
-class GuildScript : public ScriptObject
+class TC_GAME_API GuildScript : public ScriptObject
{
protected:
@@ -813,7 +809,7 @@ class GuildScript : public ScriptObject
virtual void OnBankEvent(Guild* /*guild*/, uint8 /*eventType*/, uint8 /*tabId*/, ObjectGuid::LowType /*playerGuid*/, uint64 /*itemOrMoney*/, uint16 /*itemStackCount*/, uint8 /*destTabId*/) { }
};
-class GroupScript : public ScriptObject
+class TC_GAME_API GroupScript : public ScriptObject
{
protected:
@@ -843,11 +839,11 @@ class GroupScript : public ScriptObject
// namespace
// {
typedef std::list<std::string> UnusedScriptNamesContainer;
- extern UnusedScriptNamesContainer UnusedScriptNames;
+ TC_GAME_API extern UnusedScriptNamesContainer UnusedScriptNames;
// }
// Manages registration, loading, and execution of scripts.
-class ScriptMgr
+class TC_GAME_API ScriptMgr
{
friend class ScriptObject;
@@ -856,11 +852,7 @@ class ScriptMgr
virtual ~ScriptMgr();
public: /* Initialization */
- static ScriptMgr* instance()
- {
- static ScriptMgr instance;
- return &instance;
- }
+ static ScriptMgr* instance();
void Initialize();
void LoadDatabase();
@@ -871,6 +863,15 @@ class ScriptMgr
void IncrementScriptCount() { ++_scriptCount; }
uint32 GetScriptCount() const { return _scriptCount; }
+ typedef void(*ScriptLoaderCallbackType)();
+
+ /// Sets the script loader callback which is invoked to load scripts
+ /// (Workaround for circular dependency game <-> scripts)
+ void SetScriptLoader(ScriptLoaderCallbackType script_loader_callback)
+ {
+ _script_loader_callback = script_loader_callback;
+ }
+
public: /* Unloading */
void Unload();
@@ -889,7 +890,6 @@ class ScriptMgr
void OnSocketClose(std::shared_ptr<WorldSocket> socket);
void OnPacketReceive(WorldSession* session, WorldPacket const& packet);
void OnPacketSend(WorldSession* session, WorldPacket const& packet);
- void OnUnknownPacketReceive(WorldSession* session, WorldPacket const& packet);
public: /* WorldScript */
@@ -1106,6 +1106,8 @@ class ScriptMgr
//atomic op counter for active scripts amount
std::atomic<uint64> _scheduledScripts;
+
+ ScriptLoaderCallbackType _script_loader_callback;
};
#endif
diff --git a/src/server/game/Scripting/ScriptSystem.cpp b/src/server/game/Scripting/ScriptSystem.cpp
index e828830ec0f..52c5c1640af 100644
--- a/src/server/game/Scripting/ScriptSystem.cpp
+++ b/src/server/game/Scripting/ScriptSystem.cpp
@@ -21,7 +21,13 @@
#include "DatabaseEnv.h"
#include "ScriptMgr.h"
-ScriptPointVector const SystemMgr::_empty;
+TC_GAME_API ScriptPointVector const SystemMgr::_empty;
+
+SystemMgr* SystemMgr::instance()
+{
+ static SystemMgr instance;
+ return &instance;
+}
void SystemMgr::LoadScriptWaypoints()
{
diff --git a/src/server/game/Scripting/ScriptSystem.h b/src/server/game/Scripting/ScriptSystem.h
index aebfbf85502..1b79c29d643 100644
--- a/src/server/game/Scripting/ScriptSystem.h
+++ b/src/server/game/Scripting/ScriptSystem.h
@@ -59,18 +59,14 @@ struct ScriptPointMove
typedef std::vector<ScriptPointMove> ScriptPointVector;
-class SystemMgr
+class TC_GAME_API SystemMgr
{
private:
SystemMgr() { }
~SystemMgr() { }
public:
- static SystemMgr* instance()
- {
- static SystemMgr instance;
- return &instance;
- }
+ static SystemMgr* instance();
typedef std::unordered_map<uint32, ScriptPointVector> PointMoveMap;
diff --git a/src/server/game/Server/BattlenetServerManager.cpp b/src/server/game/Server/BattlenetServerManager.cpp
deleted file mode 100644
index 5da0d81161a..00000000000
--- a/src/server/game/Server/BattlenetServerManager.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "Config.h"
-#include "World.h"
-#include "ZmqContext.h"
-#include "BattlenetServerManager.h"
-
-void IPC::BattlenetComm::ServerManager::InitializeConnection()
-{
- std::string bnetserverAddress = sConfigMgr->GetStringDefault("BnetServer.Address", "127.0.0.1");
- int32 bnetserverPort = sConfigMgr->GetIntDefault("BnetServer.Port", 1118);
- _socket = new ZmqMux("inproc://bnetmgr", "tcp://" + bnetserverAddress + ":" + std::to_string(bnetserverPort));
- _socket->Start();
-}
-
-void IPC::BattlenetComm::ServerManager::CloseConnection()
-{
- _socket->End();
- delete _socket;
- _socket = nullptr;
-}
-
-IPC::BattlenetComm::Header IPC::BattlenetComm::ServerManager::CreateHeader(BnetCommands command)
-{
- Header header;
- header.Ipc.Channel = IPC_CHANNEL_BNET;
- header.Ipc.Command = command;
- header.Realm = realm.Id;
- return header;
-}
-
-void IPC::BattlenetComm::ServerManager::SendChangeToonOnlineState(uint32 battlenetAccountId, uint32 gameAccountId, ObjectGuid guid, std::string const& name, bool online)
-{
- // Do nothing for Grunt login
- if (!battlenetAccountId)
- return;
-
- Header header = CreateHeader(BNET_CHANGE_TOON_ONLINE_STATE);
- ToonHandle toon;
- toon.AccountId = battlenetAccountId;
- toon.GameAccountId = gameAccountId;
- toon.Guid = guid.GetCounter();
- toon.Name = name;
-
- zmqpp::message msg;
- msg << header;
- msg << toon;
- msg << online;
-
- Send(&msg);
-}
-
-void IPC::BattlenetComm::ServerManager::Send(zmqpp::message* msg)
-{
- if (!_socket)
- return;
-
- _socket->Send(msg);
-}
diff --git a/src/server/game/Server/BattlenetServerManager.h b/src/server/game/Server/BattlenetServerManager.h
deleted file mode 100644
index 4d426c96eb1..00000000000
--- a/src/server/game/Server/BattlenetServerManager.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef BattlenetMgr_h__
-#define BattlenetMgr_h__
-
-#include "ZmqMux.h"
-#include "Commands.h"
-
-namespace zmqpp
-{
- class socket;
- class message;
-}
-
-namespace IPC
-{
- namespace BattlenetComm
- {
- class ServerManager
- {
- ServerManager() : _socket(nullptr) { }
-
- public:
- void InitializeConnection();
- void CloseConnection();
-
- static ServerManager& Instance()
- {
- static ServerManager instance;
- return instance;
- }
-
- void SendChangeToonOnlineState(uint32 battlenetAccountId, uint32 gameAccountId, ObjectGuid guid, std::string const& name, bool online);
-
- private:
- void Send(zmqpp::message* msg);
-
- static Header CreateHeader(BnetCommands command);
- ZmqMux* _socket;
- };
- }
-}
-
-#define sBattlenetServer IPC::BattlenetComm::ServerManager::Instance()
-
-#endif // BattlenetMgr_h__
diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h
index ed9c1cc0afd..4bf9f2be688 100644
--- a/src/server/game/Server/Packet.h
+++ b/src/server/game/Server/Packet.h
@@ -22,7 +22,7 @@
namespace WorldPackets
{
- class Packet
+ class TC_GAME_API Packet
{
public:
Packet(WorldPacket&& worldPacket) : _worldPacket(std::move(worldPacket)) { }
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp
index 6a76f8ee3b8..648d03ec4ef 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.cpp
+++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp
@@ -20,34 +20,39 @@
WorldPacket const* WorldPackets::Auth::AuthChallenge::Write()
{
- _worldPacket << uint32(Challenge);
_worldPacket.append(DosChallenge, 8);
+ _worldPacket.append(Challenge.data(), Challenge.size());
_worldPacket << uint8(DosZeroBits);
return &_worldPacket;
}
void WorldPackets::Auth::AuthSession::Read()
{
- uint32 addonDataSize;
+ uint32 addonDataSize, realmJoinTicketSize;
- _worldPacket >> LoginServerID;
_worldPacket >> Build;
+ _worldPacket >> BuildType;
_worldPacket >> RegionID;
_worldPacket >> BattlegroupID;
_worldPacket >> RealmID;
- _worldPacket >> LoginServerType;
- _worldPacket >> BuildType;
- _worldPacket >> LocalChallenge;
+ _worldPacket.read(LocalChallenge.data(), LocalChallenge.size());
+ _worldPacket.read(Digest.data(), Digest.size());
_worldPacket >> DosResponse;
- _worldPacket.read(Digest, SHA_DIGEST_LENGTH);
- Account = _worldPacket.ReadString(_worldPacket.ReadBits(11));
- UseIPv6 = _worldPacket.ReadBit(); // UseIPv6
_worldPacket >> addonDataSize;
if (addonDataSize)
{
- AddonInfo.resize(addonDataSize);
- _worldPacket.read(AddonInfo.contents(), addonDataSize);
+ AddonInfo.resize(std::min(addonDataSize, uint32(_worldPacket.size() - _worldPacket.rpos())));
+ _worldPacket.read(AddonInfo.contents(), AddonInfo.size());
+ }
+
+ _worldPacket >> realmJoinTicketSize;
+ if (realmJoinTicketSize)
+ {
+ RealmJoinTicket.resize(std::min(realmJoinTicketSize, uint32(_worldPacket.size() - _worldPacket.rpos())));
+ _worldPacket.read(reinterpret_cast<uint8*>(&RealmJoinTicket[0]), RealmJoinTicket.size());
}
+
+ UseIPv6 = _worldPacket.ReadBit(); // UseIPv6
}
WorldPackets::Auth::AuthResponse::AuthResponse()
@@ -57,7 +62,7 @@ WorldPackets::Auth::AuthResponse::AuthResponse()
WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
{
- _worldPacket << uint8(Result);
+ _worldPacket << uint32(Result);
_worldPacket.WriteBit(SuccessInfo.is_initialized());
_worldPacket.WriteBit(WaitInfo.is_initialized());
_worldPacket.FlushBits();
@@ -294,7 +299,7 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write()
ByteBuffer payload;
uint16 port = Payload.Where.port();
uint8 address[16] = { 0 };
- uint32 addressType = 3;
+ uint8 addressType = 3;
if (Payload.Where.address().is_v4())
{
memcpy(address, Payload.Where.address().to_v4().to_bytes().data(), 4);
@@ -308,7 +313,7 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write()
HmacSha1 hmacHash(64, WherePacketHmac);
hmacHash.UpdateData(address, 16);
- hmacHash.UpdateData((uint8* const)&addressType, 4);
+ hmacHash.UpdateData(&addressType, 1);
hmacHash.UpdateData((uint8* const)&port, 2);
hmacHash.UpdateData((uint8* const)Haiku.c_str(), 71);
hmacHash.UpdateData(Payload.PanamaKey, 32);
@@ -316,260 +321,15 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write()
hmacHash.UpdateData(&Payload.XorMagic, 1);
hmacHash.Finalize();
- uint8* hmac = hmacHash.GetDigest();
-
- payload << uint8(Haiku[53]);
- payload << uint8(PiDigits[12]);
- payload << uint8(Haiku[27]);
- payload << uint8(PiDigits[65]);
- payload << uint8(PiDigits[96]);
- payload << uint8(Haiku[29]);
- payload << uint8(Payload.PanamaKey[12]);
- payload << uint8(hmac[3]);
- payload << uint8(PiDigits[10]);
- payload << uint8(Payload.PanamaKey[20]);
- payload << uint8(PiDigits[14]);
- payload << uint8(hmac[17]);
- payload << uint8(Haiku[3]);
- payload << uint8(PiDigits[26]);
- payload << uint8(PiDigits[94]);
- payload << uint8(PiDigits[7]);
- payload << uint8(PiDigits[93]);
- payload << uint8(Payload.PanamaKey[8]);
- payload << uint8(PiDigits[40]);
- payload << uint8(PiDigits[52]);
- payload << uint8(Haiku[44]);
- payload << uint8(address[13]);
- payload << uint8(Haiku[57]);
- payload << uint8(PiDigits[59]);
- payload << uint8(PiDigits[97]);
- payload << uint8(PiDigits[42]);
- payload << uint8(Haiku[70]);
- payload << uint8(Haiku[42]);
- payload << uint8(PiDigits[50]);
- payload << uint8(address[3]);
- payload << uint8(PiDigits[60]);
- payload << uint8(address[12]);
- payload << uint8(PiDigits[86]);
- payload << uint8(Haiku[56]);
- payload << uint8(PiDigits[70]);
- payload << uint8(Haiku[26]);
- payload << uint8(PiDigits[74]);
- payload << uint8(PiDigits[49]);
- payload << uint8(Payload.PanamaKey[28]);
- payload << uint8(Haiku[69]);
- payload << uint8(hmac[9]);
- payload << uint8(Haiku[15]);
- payload << uint8(Payload.PanamaKey[0]);
- payload << uint8(Payload.PanamaKey[6]);
- payload << uint8(Haiku[17]);
- payload << uint8((port >> 8) & 0xFF);
- payload << uint8(PiDigits[20]);
- payload << uint8(PiDigits[99]);
- payload << uint8(PiDigits[95]);
- payload << uint8(PiDigits[100]);
- payload << uint8(PiDigits[105]);
- payload << uint8(hmac[13]);
- payload << uint8(Payload.PanamaKey[9]);
- payload << uint8(PiDigits[41]);
- payload << uint8(PiDigits[35]);
- payload << uint8(Haiku[10]);
- payload << uint8(Haiku[20]);
- payload << uint8(Haiku[14]);
- payload << uint8(Haiku[47]);
- payload << uint8(Payload.PanamaKey[10]);
- payload << uint8(PiDigits[54]);
- payload << uint8(PiDigits[67]);
- payload << uint8(PiDigits[79]);
- payload << uint8(Payload.PanamaKey[3]);
- payload << uint8(PiDigits[84]);
- payload << uint8(Haiku[33]);
- payload << uint8(Haiku[23]);
- payload << uint8(Haiku[48]);
- payload << uint8(PiDigits[64]);
- payload << uint8(PiDigits[85]);
- payload << uint8(Payload.PanamaKey[24]);
- payload << uint8(hmac[8]);
- payload << uint8(PiDigits[101]);
- payload << uint8(addressType);
- payload << uint8(PiDigits[53]);
- payload << uint8(Haiku[39]);
- payload << uint8(hmac[19]);
- payload << uint8(Payload.PanamaKey[31]);
- payload << uint8(Payload.PanamaKey[18]);
- payload << uint8(hmac[4]);
- payload << uint8(Haiku[54]);
- payload << uint8(PiDigits[76]);
- payload << uint8(address[9]);
- payload << uint8(hmac[7]);
- payload << uint8(PiDigits[80]);
- payload << uint8(hmac[2]);
- payload << uint8(Haiku[13]);
- payload << uint8(Haiku[11]);
- payload << uint8(Payload.PanamaKey[7]);
- payload << uint8(Haiku[64]);
- payload << uint8(Haiku[62]);
- payload << uint8(Haiku[9]);
- payload << uint8(Payload.PanamaKey[26]);
- payload << uint8(hmac[1]);
- payload << uint8(hmac[15]);
- payload << uint8(PiDigits[25]);
- payload << uint8(hmac[14]);
- payload << uint8(Haiku[35]);
- payload << uint8(Haiku[43]);
- payload << uint8(PiDigits[58]);
- payload << uint8(Payload.PanamaKey[1]);
- payload << uint8(PiDigits[45]);
- payload << uint8(Payload.PanamaKey[25]);
- payload << uint8(PiDigits[69]);
- payload << uint8(PiDigits[27]);
- payload << uint8(address[4]);
- payload << uint8(PiDigits[11]);
- payload << uint8(Payload.PanamaKey[16]);
- payload << uint8(PiDigits[38]);
- payload << uint8(PiDigits[82]);
- payload << uint8(PiDigits[1]);
- payload << uint8(PiDigits[103]);
- payload << uint8(address[10]);
- payload << uint8(Haiku[18]);
- payload << uint8(PiDigits[91]);
- payload << uint8(PiDigits[75]);
- payload << uint8(PiDigits[34]);
- payload << uint8(Payload.PanamaKey[27]);
- payload << uint8(PiDigits[106]);
- payload << uint8(PiDigits[28]);
- payload << uint8(Haiku[8]);
- payload << uint8(PiDigits[5]);
- payload << uint8(Haiku[68]);
- payload << uint8(Payload.PanamaKey[15]);
- payload << uint8(address[2]);
- payload << uint8(PiDigits[48]);
- payload << uint8(PiDigits[107]);
- payload << uint8(Payload.PanamaKey[17]);
- payload << uint8(PiDigits[15]);
payload << uint32(Payload.Adler32);
- payload << uint8(PiDigits[36]);
- payload << uint8(address[5]);
- payload << uint8(PiDigits[71]);
- payload << uint8(address[15]);
- payload << uint8(address[0]);
- payload << uint8(hmac[5]);
- payload << uint8(PiDigits[83]);
- payload << uint8(Payload.PanamaKey[14]);
- payload << uint8(PiDigits[55]);
- payload << uint8(PiDigits[31]);
- payload << uint8(Haiku[52]);
- payload << uint8(PiDigits[22]);
- payload << uint8(PiDigits[8]);
- payload << uint8(PiDigits[6]);
- payload << uint8(Payload.PanamaKey[21]);
- payload << uint8(port & 0xFF);
- payload << uint8(PiDigits[51]);
- payload << uint8(Haiku[31]);
- payload << uint8(Haiku[59]);
- payload << uint8(PiDigits[17]);
- payload << uint8(PiDigits[88]);
- payload << uint8(PiDigits[32]);
- payload << uint8(address[6]);
- payload << uint8(Haiku[49]);
- payload << uint8(PiDigits[21]);
- payload << uint8(Payload.PanamaKey[13]);
- payload << uint8(address[1]);
- payload << uint8(Haiku[19]);
- payload << uint8(Haiku[63]);
- payload << uint8(PiDigits[4]);
- payload << uint8(Haiku[65]);
- payload << uint8(PiDigits[39]);
- payload << uint8(Haiku[21]);
- payload << uint8(Haiku[32]);
- payload << uint8(Haiku[25]);
- payload << uint8(Haiku[1]);
- payload << uint8(PiDigits[9]);
- payload << uint8(Haiku[2]);
- payload << uint8(Payload.PanamaKey[22]);
- payload << uint8(PiDigits[78]);
- payload << uint8(Haiku[4]);
- payload << uint8(Haiku[50]);
- payload << uint8(Payload.PanamaKey[29]);
- payload << uint8(hmac[12]);
- payload << uint8(PiDigits[56]);
- payload << uint8(address[11]);
- payload << uint8(PiDigits[102]);
- payload << uint8(Payload.PanamaKey[19]);
- payload << uint8(PiDigits[33]);
- payload << uint8(Haiku[30]);
- payload << uint8(Payload.PanamaKey[5]);
- payload << uint8(PiDigits[46]);
- payload << uint8(PiDigits[30]);
- payload << uint8(PiDigits[98]);
- payload << uint8(Haiku[66]);
- payload << uint8(PiDigits[77]);
- payload << uint8(PiDigits[63]);
- payload << uint8(Payload.PanamaKey[11]);
- payload << uint8(PiDigits[2]);
- payload << uint8(Haiku[61]);
- payload << uint8(address[7]);
- payload << uint8(PiDigits[3]);
- payload << uint8(Haiku[12]);
- payload << uint8(Haiku[40]);
- payload << uint8(PiDigits[57]);
- payload << uint8(Haiku[28]);
- payload << uint8(PiDigits[29]);
- payload << uint8(Haiku[46]);
- payload << uint8(PiDigits[44]);
- payload << uint8(address[14]);
- payload << uint8(PiDigits[16]);
- payload << uint8(PiDigits[87]);
- payload << uint8(PiDigits[81]);
- payload << uint8(hmac[18]);
- payload << uint8(address[8]);
- payload << uint8(Haiku[6]);
- payload << uint8(hmac[16]);
- payload << uint8(PiDigits[62]);
- payload << uint8(PiDigits[72]);
- payload << uint8(PiDigits[18]);
- payload << uint8(PiDigits[43]);
- payload << uint8(Haiku[7]);
- payload << uint8(Haiku[37]);
+ payload << uint8(addressType);
+ payload.append(address, 16);
+ payload << uint16(port);
+ payload.append(Haiku.data(), 71);
+ payload.append(Payload.PanamaKey, 32);
+ payload.append(PiDigits, 108);
payload << uint8(Payload.XorMagic);
- payload << uint8(Payload.PanamaKey[2]);
- payload << uint8(PiDigits[92]);
- payload << uint8(PiDigits[47]);
- payload << uint8(PiDigits[13]);
- payload << uint8(PiDigits[66]);
- payload << uint8(Haiku[55]);
- payload << uint8(PiDigits[73]);
- payload << uint8(Haiku[5]);
- payload << uint8(PiDigits[0]);
- payload << uint8(Haiku[16]);
- payload << uint8(Haiku[34]);
- payload << uint8(hmac[10]);
- payload << uint8(PiDigits[89]);
- payload << uint8(Haiku[38]);
- payload << uint8(Haiku[22]);
- payload << uint8(hmac[11]);
- payload << uint8(PiDigits[61]);
- payload << uint8(Haiku[0]);
- payload << uint8(hmac[0]);
- payload << uint8(Haiku[24]);
- payload << uint8(PiDigits[37]);
- payload << uint8(hmac[6]);
- payload << uint8(Haiku[41]);
- payload << uint8(Haiku[60]);
- payload << uint8(PiDigits[90]);
- payload << uint8(Haiku[67]);
- payload << uint8(Haiku[51]);
- payload << uint8(PiDigits[24]);
- payload << uint8(PiDigits[23]);
- payload << uint8(Haiku[58]);
- payload << uint8(Haiku[45]);
- payload << uint8(PiDigits[104]);
- payload << uint8(PiDigits[68]);
- payload << uint8(Payload.PanamaKey[30]);
- payload << uint8(Payload.PanamaKey[23]);
- payload << uint8(Payload.PanamaKey[4]);
- payload << uint8(Haiku[36]);
- payload << uint8(PiDigits[19]);
+ payload.append(hmacHash.GetDigest(), hmacHash.GetLength());
BigNumber bnData;
bnData.SetBinary(payload.contents(), payload.size());
@@ -594,7 +354,8 @@ void WorldPackets::Auth::AuthContinuedSession::Read()
{
_worldPacket >> DosResponse;
_worldPacket >> Key;
- _worldPacket.read(Digest, SHA_DIGEST_LENGTH);
+ _worldPacket.read(LocalChallenge.data(), LocalChallenge.size());
+ _worldPacket.read(Digest.data(), Digest.size());
}
void WorldPackets::Auth::ConnectToFailed::Read()
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h
index 123d4a24f10..5bd433ebb57 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.h
+++ b/src/server/game/Server/Packets/AuthenticationPackets.h
@@ -38,7 +38,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
- uint32 Challenge = 0;
+ std::array<uint8, 16> Challenge;
uint32 DosChallenge[8]; ///< Encryption seeds
uint8 DosZeroBits = 0;
};
@@ -46,26 +46,27 @@ namespace WorldPackets
class AuthSession final : public ClientPacket
{
public:
+ static uint32 const DigestLength = 24;
+
AuthSession(WorldPacket&& packet) : ClientPacket(CMSG_AUTH_SESSION, std::move(packet))
{
- memset(Digest, 0, SHA_DIGEST_LENGTH);
+ LocalChallenge.fill(0);
+ Digest.fill(0);
}
void Read() override;
- uint32 BattlegroupID = 0;
- int8 LoginServerType = 0; ///< Auth type used - 0 GRUNT, 1 battle.net
- int8 BuildType = 0;
- uint32 RealmID = 0;
uint16 Build = 0;
- uint32 LocalChallenge = 0;
- int32 LoginServerID = 0;
+ int8 BuildType = 0;
uint32 RegionID = 0;
+ uint32 BattlegroupID = 0;
+ uint32 RealmID = 0;
+ std::array<uint8, 16> LocalChallenge;
+ std::array<uint8, DigestLength> Digest;
uint64 DosResponse = 0;
- uint8 Digest[SHA_DIGEST_LENGTH];
- std::string Account;
- bool UseIPv6 = false;
ByteBuffer AddonInfo;
+ std::string RealmJoinTicket;
+ bool UseIPv6 = false;
};
class AuthResponse final : public ServerPacket
@@ -121,7 +122,7 @@ namespace WorldPackets
Optional<AuthSuccessInfo> SuccessInfo; ///< contains the packet data in case that it has account information (It is never set when WaitInfo is set), otherwise its contents are undefined.
Optional<AuthWaitInfo> WaitInfo; ///< contains the queue wait information in case the account is in the login queue.
- uint8 Result = 0; ///< the result of the authentication process, it is AUTH_OK if it succeeded and the account is ready to log in. It can also be AUTH_WAIT_QUEUE if the account entered the login queue (Queued, QueuePos), possible values are @ref ResponseCodes
+ uint32 Result = 0; ///< the result of the authentication process, it is AUTH_OK if it succeeded and the account is ready to log in. It can also be AUTH_WAIT_QUEUE if the account entered the login queue (Queued, QueuePos), possible values are @ref ResponseCodes
};
enum class ConnectToSerial : uint32
@@ -169,16 +170,20 @@ namespace WorldPackets
class AuthContinuedSession final : public ClientPacket
{
public:
+ static uint32 const DigestLength = 24;
+
AuthContinuedSession(WorldPacket&& packet) : ClientPacket(CMSG_AUTH_CONTINUED_SESSION, std::move(packet))
{
- memset(Digest, 0, SHA_DIGEST_LENGTH);
+ LocalChallenge.fill(0);
+ Digest.fill(0);
}
void Read() override;
uint64 DosResponse = 0;
uint64 Key = 0;
- uint8 Digest[SHA_DIGEST_LENGTH];
+ std::array<uint8, 16> LocalChallenge;
+ std::array<uint8, DigestLength> Digest;
};
class ResumeComms final : public ServerPacket
diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp
index d54402d40c7..d30779d49c2 100644
--- a/src/server/game/Server/Packets/CharacterPackets.cpp
+++ b/src/server/game/Server/Packets/CharacterPackets.cpp
@@ -28,8 +28,8 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel
// "characters.hairColor, characters.facialStyle, characters.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, "
// 16 17 18 19 20 21 22
// "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, "
- // 23 24 25
- // "character_banned.guid, characters.slot, character_declinedname.genitive"
+ // 23 24 25 26
+ // "character_banned.guid, characters.slot, characters.logout_time, character_declinedname.genitive"
Guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64());
Name = fields[1].GetString();
@@ -72,7 +72,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel
if (fields[23].GetUInt64())
Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING;
- if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[25].GetString().empty())
+ if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[26].GetString().empty())
Flags |= CHARACTER_FLAG_DECLINED;
if (atLoginFlags & AT_LOGIN_CUSTOMIZE)
@@ -102,6 +102,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel
Tokenizer equipment(fields[22].GetString(), ' ');
ListPosition = fields[24].GetUInt8();
+ LastPlayedTime = fields[25].GetUInt32();
for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
{
@@ -155,6 +156,7 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write()
_worldPacket << uint8(charInfo.VisualItems[slot].InventoryType);
}
+ _worldPacket << uint32(charInfo.LastPlayedTime);
_worldPacket.WriteBits(charInfo.Name.length(), 6);
_worldPacket.WriteBit(charInfo.FirstLogin);
_worldPacket.WriteBit(charInfo.BoostInProgress);
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index bb163b075cc..017dddd1d06 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -133,6 +133,7 @@ namespace WorldPackets
uint32 Flags3 = 0; ///< Character flags 3 @todo research
bool FirstLogin = false;
uint8 unkWod61x = 0;
+ uint32 LastPlayedTime = 0;
struct PetInfo
{
@@ -721,7 +722,7 @@ namespace WorldPackets
{
public:
SetPlayerDeclinedNames(WorldPacket&& packet) : ClientPacket(CMSG_SET_PLAYER_DECLINED_NAMES, std::move(packet)) { }
-
+
void Read() override;
ObjectGuid Player;
diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h
index faa060b3c0f..590fa930845 100644
--- a/src/server/game/Server/Packets/ChatPackets.h
+++ b/src/server/game/Server/Packets/ChatPackets.h
@@ -147,7 +147,7 @@ namespace WorldPackets
};
// SMSG_CHAT
- class Chat final : public ServerPacket
+ class TC_GAME_API Chat final : public ServerPacket
{
public:
Chat() : ServerPacket(SMSG_CHAT, 100) { }
@@ -217,7 +217,7 @@ namespace WorldPackets
int32 EmoteID = 0;
};
- class PrintNotification final : public ServerPacket
+ class TC_GAME_API PrintNotification final : public ServerPacket
{
public:
PrintNotification(std::string const& notifyText) : ServerPacket(SMSG_PRINT_NOTIFICATION, 2 + notifyText.size()), NotifyText(notifyText) { }
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index ebf920e2787..cef9a810213 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -397,7 +397,7 @@ namespace WorldPackets
WorldPacket const* Write() override { return &_worldPacket; }
};
- class Weather final : public ServerPacket
+ class TC_GAME_API Weather final : public ServerPacket
{
public:
Weather();
@@ -598,7 +598,7 @@ namespace WorldPackets
ObjectGuid ObjectGUID;
};
- class PlaySound final : public ServerPacket
+ class TC_GAME_API PlaySound final : public ServerPacket
{
public:
PlaySound() : ServerPacket(SMSG_PLAY_SOUND, 20) { }
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index e8fc4586ac4..018e0d5fe1a 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -42,7 +42,7 @@ namespace WorldPackets
MovementInfo movementInfo;
};
- class MoveUpdate final : public ServerPacket
+ class TC_GAME_API MoveUpdate final : public ServerPacket
{
public:
MoveUpdate() : ServerPacket(SMSG_MOVE_UPDATE) { }
@@ -427,7 +427,7 @@ namespace WorldPackets
ObjectGuid SummonerGUID;
};
- class ControlUpdate final : public ServerPacket
+ class TC_GAME_API ControlUpdate final : public ServerPacket
{
public:
ControlUpdate() : ServerPacket(SMSG_CONTROL_UPDATE, 16 + 1) { }
diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h
index 28444e87e75..d5c1b9da118 100644
--- a/src/server/game/Server/Packets/NPCPackets.h
+++ b/src/server/game/Server/Packets/NPCPackets.h
@@ -207,7 +207,7 @@ namespace WorldPackets
ObjectGuid Healer;
};
- class SpiritHealerConfirm final : public ServerPacket
+ class TC_GAME_API SpiritHealerConfirm final : public ServerPacket
{
public:
SpiritHealerConfirm() : ServerPacket(SMSG_SPIRIT_HEALER_CONFIRM, 16) { }
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
index bd4a171d0bc..803da693c95 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -25,7 +25,7 @@ void WorldPackets::Quest::QuestGiverStatusQuery::Read()
WorldPacket const* WorldPackets::Quest::QuestGiverStatus::Write()
{
_worldPacket << QuestGiver.Guid;
- _worldPacket << QuestGiver.Status;
+ _worldPacket << uint32(QuestGiver.Status);
return &_worldPacket;
}
@@ -36,7 +36,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverStatusMultiple::Write()
for (QuestGiverInfo const& questGiver : QuestGiver)
{
_worldPacket << questGiver.Guid;
- _worldPacket << questGiver.Status;
+ _worldPacket << uint32(questGiver.Status);
}
return &_worldPacket;
@@ -55,102 +55,102 @@ void WorldPackets::Quest::QueryQuestInfo::Read()
WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
{
- _worldPacket << QuestID;
+ _worldPacket << uint32(QuestID);
_worldPacket.WriteBit(Allow);
_worldPacket.FlushBits();
if (Allow)
{
- _worldPacket << Info.QuestID;
- _worldPacket << Info.QuestType;
- _worldPacket << Info.QuestLevel;
- _worldPacket << Info.QuestPackageID;
- _worldPacket << Info.QuestMinLevel;
- _worldPacket << Info.QuestSortID;
- _worldPacket << Info.QuestInfoID;
- _worldPacket << Info.SuggestedGroupNum;
- _worldPacket << Info.RewardNextQuest;
- _worldPacket << Info.RewardXPDifficulty;
- _worldPacket << Info.RewardXPMultiplier;
- _worldPacket << Info.RewardMoney;
- _worldPacket << Info.RewardMoneyDifficulty;
- _worldPacket << Info.RewardMoneyMultiplier;
- _worldPacket << Info.RewardBonusMoney;
- _worldPacket << Info.RewardDisplaySpell;
- _worldPacket << Info.RewardSpell;
- _worldPacket << Info.RewardHonor;
- _worldPacket << Info.RewardKillHonor;
- _worldPacket << Info.StartItem;
- _worldPacket << Info.Flags;
- _worldPacket << Info.FlagsEx;
+ _worldPacket << int32(Info.QuestID);
+ _worldPacket << int32(Info.QuestType);
+ _worldPacket << int32(Info.QuestLevel);
+ _worldPacket << int32(Info.QuestPackageID);
+ _worldPacket << int32(Info.QuestMinLevel);
+ _worldPacket << int32(Info.QuestSortID);
+ _worldPacket << int32(Info.QuestInfoID);
+ _worldPacket << int32(Info.SuggestedGroupNum);
+ _worldPacket << int32(Info.RewardNextQuest);
+ _worldPacket << int32(Info.RewardXPDifficulty);
+ _worldPacket << float(Info.RewardXPMultiplier);
+ _worldPacket << int32(Info.RewardMoney);
+ _worldPacket << int32(Info.RewardMoneyDifficulty);
+ _worldPacket << float(Info.RewardMoneyMultiplier);
+ _worldPacket << int32(Info.RewardBonusMoney);
+ _worldPacket << int32(Info.RewardDisplaySpell);
+ _worldPacket << int32(Info.RewardSpell);
+ _worldPacket << int32(Info.RewardHonor);
+ _worldPacket << float(Info.RewardKillHonor);
+ _worldPacket << int32(Info.StartItem);
+ _worldPacket << uint32(Info.Flags);
+ _worldPacket << uint32(Info.FlagsEx);
for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
{
- _worldPacket << Info.RewardItems[i];
- _worldPacket << Info.RewardAmount[i];
- _worldPacket << Info.ItemDrop[i];
- _worldPacket << Info.ItemDropQuantity[i];
+ _worldPacket << int32(Info.RewardItems[i]);
+ _worldPacket << int32(Info.RewardAmount[i]);
+ _worldPacket << int32(Info.ItemDrop[i]);
+ _worldPacket << int32(Info.ItemDropQuantity[i]);
}
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
- _worldPacket << Info.UnfilteredChoiceItems[i].ItemID;
- _worldPacket << Info.UnfilteredChoiceItems[i].Quantity;
- _worldPacket << Info.UnfilteredChoiceItems[i].DisplayID;
+ _worldPacket << int32(Info.UnfilteredChoiceItems[i].ItemID);
+ _worldPacket << int32(Info.UnfilteredChoiceItems[i].Quantity);
+ _worldPacket << int32(Info.UnfilteredChoiceItems[i].DisplayID);
}
- _worldPacket << Info.POIContinent;
- _worldPacket << Info.POIx;
- _worldPacket << Info.POIy;
- _worldPacket << Info.POIPriority;
+ _worldPacket << int32(Info.POIContinent);
+ _worldPacket << float(Info.POIx);
+ _worldPacket << float(Info.POIy);
+ _worldPacket << int32(Info.POIPriority);
- _worldPacket << Info.RewardTitle;
- _worldPacket << Info.RewardTalents;
- _worldPacket << Info.RewardArenaPoints;
- _worldPacket << Info.RewardSkillLineID;
- _worldPacket << Info.RewardNumSkillUps;
+ _worldPacket << int32(Info.RewardTitle);
+ _worldPacket << int32(Info.RewardTalents);
+ _worldPacket << int32(Info.RewardArenaPoints);
+ _worldPacket << int32(Info.RewardSkillLineID);
+ _worldPacket << int32(Info.RewardNumSkillUps);
- _worldPacket << Info.PortraitGiver;
- _worldPacket << Info.PortraitTurnIn;
+ _worldPacket << int32(Info.PortraitGiver);
+ _worldPacket << int32(Info.PortraitTurnIn);
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
{
- _worldPacket << Info.RewardFactionID[i];
- _worldPacket << Info.RewardFactionValue[i];
- _worldPacket << Info.RewardFactionOverride[i];
+ _worldPacket << int32(Info.RewardFactionID[i]);
+ _worldPacket << int32(Info.RewardFactionValue[i]);
+ _worldPacket << int32(Info.RewardFactionOverride[i]);
}
- _worldPacket << Info.RewardFactionFlags;
+ _worldPacket << int32(Info.RewardFactionFlags);
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
{
- _worldPacket << Info.RewardCurrencyID[i];
- _worldPacket << Info.RewardCurrencyQty[i];
+ _worldPacket << int32(Info.RewardCurrencyID[i]);
+ _worldPacket << int32(Info.RewardCurrencyQty[i]);
}
- _worldPacket << Info.AcceptedSoundKitID;
- _worldPacket << Info.CompleteSoundKitID;
+ _worldPacket << int32(Info.AcceptedSoundKitID);
+ _worldPacket << int32(Info.CompleteSoundKitID);
- _worldPacket << Info.AreaGroupID;
- _worldPacket << Info.TimeAllowed;
+ _worldPacket << int32(Info.AreaGroupID);
+ _worldPacket << int32(Info.TimeAllowed);
_worldPacket << int32(Info.Objectives.size());
_worldPacket << int32(Info.AllowableRaces);
for (QuestObjective const& questObjective : Info.Objectives)
{
- _worldPacket << questObjective.ID;
- _worldPacket << questObjective.Type;
- _worldPacket << questObjective.StorageIndex;
- _worldPacket << questObjective.ObjectID;
- _worldPacket << questObjective.Amount;
- _worldPacket << questObjective.Flags;
- _worldPacket << questObjective.UnkFloat;
+ _worldPacket << uint32(questObjective.ID);
+ _worldPacket << uint8(questObjective.Type);
+ _worldPacket << int8(questObjective.StorageIndex);
+ _worldPacket << int32(questObjective.ObjectID);
+ _worldPacket << int32(questObjective.Amount);
+ _worldPacket << uint32(questObjective.Flags);
+ _worldPacket << float(questObjective.UnkFloat);
_worldPacket << int32(questObjective.VisualEffects.size());
for (int32 visualEffect : questObjective.VisualEffects)
- _worldPacket << visualEffect;
+ _worldPacket << int32(visualEffect);
_worldPacket.WriteBits(questObjective.Description.size(), 8);
_worldPacket.FlushBits();
@@ -186,15 +186,23 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write()
WorldPacket const* WorldPackets::Quest::QuestUpdateAddCredit::Write()
{
_worldPacket << VictimGUID;
- _worldPacket << QuestID;
- _worldPacket << ObjectID;
- _worldPacket << Count;
- _worldPacket << Required;
- _worldPacket << ObjectiveType;
+ _worldPacket << int32(QuestID);
+ _worldPacket << int32(ObjectID);
+ _worldPacket << uint16(Count);
+ _worldPacket << uint16(Required);
+ _worldPacket << uint8(ObjectiveType);
return &_worldPacket;
};
+WorldPacket const* WorldPackets::Quest::QuestUpdateAddPvPCredit::Write()
+{
+ _worldPacket << int32(QuestID);
+ _worldPacket << uint16(Count);
+
+ return &_worldPacket;
+}
+
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards)
{
data << questRewards.ChoiceItemCount;
@@ -247,18 +255,18 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferReward const& offer)
{
data << offer.QuestGiverGUID;
- data << offer.QuestGiverCreatureID;
- data << offer.QuestID;
- data << offer.QuestFlags[0]; // Flags
- data << offer.QuestFlags[1]; // FlagsEx
- data << offer.SuggestedPartyMembers;
+ data << int32(offer.QuestGiverCreatureID);
+ data << int32(offer.QuestID);
+ data << int32(offer.QuestFlags[0]); // Flags
+ data << int32(offer.QuestFlags[1]); // FlagsEx
+ data << int32(offer.SuggestedPartyMembers);
data << offer.Rewards; // WorldPackets::Quest::QuestRewards
data << int32(offer.Emotes.size());
for (WorldPackets::Quest::QuestDescEmote const& emote : offer.Emotes)
{
- data << emote.Type;
- data << emote.Delay;
+ data << int32(emote.Type);
+ data << uint32(emote.Delay);
}
data.WriteBit(offer.AutoLaunched);
@@ -270,9 +278,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferRew
WorldPacket const* WorldPackets::Quest::QuestGiverOfferRewardMessage::Write()
{
_worldPacket << QuestData; // WorldPackets::Quest::QuestGiverOfferReward
- _worldPacket << PortraitTurnIn;
- _worldPacket << PortraitGiver;
- _worldPacket << QuestPackageID;
+ _worldPacket << int32(PortraitTurnIn);
+ _worldPacket << int32(PortraitGiver);
+ _worldPacket << int32(QuestPackageID);
_worldPacket.WriteBits(QuestTitle.size(), 9);
_worldPacket.WriteBits(RewardText.size(), 12);
@@ -301,13 +309,13 @@ void WorldPackets::Quest::QuestGiverChooseReward::Read()
WorldPacket const* WorldPackets::Quest::QuestGiverQuestComplete::Write()
{
- _worldPacket << QuestID;
- _worldPacket << SkillLineIDReward;
- _worldPacket << MoneyReward;
- _worldPacket << NumSkillUpsReward;
- _worldPacket << XPReward;
- _worldPacket << TalentReward;
- _worldPacket << ItemReward; // WorldPackets::Item::ItemInstance
+ _worldPacket << int32(QuestID);
+ _worldPacket << int32(SkillLineIDReward);
+ _worldPacket << int32(MoneyReward);
+ _worldPacket << int32(NumSkillUpsReward);
+ _worldPacket << int32(XPReward);
+ _worldPacket << int32(TalentReward);
+ _worldPacket << ItemReward;
_worldPacket.WriteBit(UseQuestReward);
_worldPacket.WriteBit(LaunchGossip);
@@ -327,33 +335,33 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write()
{
_worldPacket << QuestGiverGUID;
_worldPacket << InformUnit;
- _worldPacket << QuestID;
- _worldPacket << QuestPackageID;
- _worldPacket << PortraitGiver;
- _worldPacket << SuggestedPartyMembers;
- _worldPacket << QuestFlags[0]; // Flags
- _worldPacket << QuestFlags[1]; // FlagsEx
- _worldPacket << PortraitTurnIn;
+ _worldPacket << int32(QuestID);
+ _worldPacket << int32(QuestPackageID);
+ _worldPacket << int32(PortraitGiver);
+ _worldPacket << int32(SuggestedPartyMembers);
+ _worldPacket << uint32(QuestFlags[0]); // Flags
+ _worldPacket << uint32(QuestFlags[1]); // FlagsEx
+ _worldPacket << int32(PortraitTurnIn);
_worldPacket << int32(LearnSpells.size());
_worldPacket << Rewards; // WorldPackets::Quest::QuestRewards
_worldPacket << int32(DescEmotes.size());
_worldPacket << int32(Objectives.size());
for (int32 spell : LearnSpells)
- _worldPacket << spell;
+ _worldPacket << int32(spell);
for (WorldPackets::Quest::QuestDescEmote const& emote : DescEmotes)
{
- _worldPacket << emote.Type;
- _worldPacket << emote.Delay;
+ _worldPacket << int32(emote.Type);
+ _worldPacket << uint32(emote.Delay);
}
for (WorldPackets::Quest::QuestObjectiveSimple const& obj : Objectives)
{
- _worldPacket << obj.ID;
- _worldPacket << obj.ObjectID;
- _worldPacket << obj.Amount;
- _worldPacket << obj.Type;
+ _worldPacket << int32(obj.ID);
+ _worldPacket << int32(obj.ObjectID);
+ _worldPacket << int32(obj.Amount);
+ _worldPacket << uint8(obj.Type);
}
_worldPacket.WriteBits(QuestTitle.size(), 9);
@@ -382,28 +390,28 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write()
WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write()
{
_worldPacket << QuestGiverGUID;
- _worldPacket << QuestGiverCreatureID;
- _worldPacket << QuestID;
- _worldPacket << CompEmoteDelay;
- _worldPacket << CompEmoteType;
- _worldPacket << QuestFlags[0];
- _worldPacket << QuestFlags[1];
- _worldPacket << SuggestPartyMembers;
- _worldPacket << MoneyToGet;
+ _worldPacket << int32(QuestGiverCreatureID);
+ _worldPacket << int32(QuestID);
+ _worldPacket << int32(CompEmoteDelay);
+ _worldPacket << int32(CompEmoteType);
+ _worldPacket << uint32(QuestFlags[0]);
+ _worldPacket << uint32(QuestFlags[1]);
+ _worldPacket << int32(SuggestPartyMembers);
+ _worldPacket << int32(MoneyToGet);
_worldPacket << int32(Collect.size());
_worldPacket << int32(Currency.size());
- _worldPacket << StatusFlags;
+ _worldPacket << int32(StatusFlags);
for (QuestObjectiveCollect const& obj : Collect)
{
- _worldPacket << obj.ObjectID;
- _worldPacket << obj.Amount;
+ _worldPacket << int32(obj.ObjectID);
+ _worldPacket << int32(obj.Amount);
}
for (QuestCurrency const& cur : Currency)
{
- _worldPacket << cur.CurrencyID;
- _worldPacket << cur.Amount;
+ _worldPacket << int32(cur.CurrencyID);
+ _worldPacket << int32(cur.Amount);
}
_worldPacket.WriteBit(AutoLaunched);
@@ -447,16 +455,16 @@ void WorldPackets::Quest::QuestLogRemoveQuest::Read()
WorldPacket const* WorldPackets::Quest::QuestGiverQuestList::Write()
{
_worldPacket << QuestGiverGUID;
- _worldPacket << GreetEmoteDelay;
- _worldPacket << GreetEmoteType;
+ _worldPacket << uint32(GreetEmoteDelay);
+ _worldPacket << uint32(GreetEmoteType);
_worldPacket << uint32(GossipTexts.size());
for (GossipTextData const& gossip : GossipTexts)
{
- _worldPacket << gossip.QuestID;
- _worldPacket << gossip.QuestType;
- _worldPacket << gossip.QuestLevel;
- _worldPacket << gossip.QuestFlags;
- _worldPacket << gossip.QuestFlagsEx;
+ _worldPacket << uint32(gossip.QuestID);
+ _worldPacket << uint32(gossip.QuestType);
+ _worldPacket << uint32(gossip.QuestLevel);
+ _worldPacket << uint32(gossip.QuestFlags);
+ _worldPacket << uint32(gossip.QuestFlagsEx);
_worldPacket.WriteBit(gossip.Repeatable);
_worldPacket.WriteBits(gossip.QuestTitle.size(), 9);
_worldPacket.FlushBits();
@@ -512,7 +520,7 @@ void WorldPackets::Quest::QuestPushResult::Read()
WorldPacket const* WorldPackets::Quest::QuestGiverInvalidQuest::Write()
{
- _worldPacket << Reason;
+ _worldPacket << uint32(Reason);
_worldPacket.WriteBit(SendErrorMessage);
_worldPacket.WriteBits(ReasonText.length(), 9);
@@ -526,15 +534,15 @@ WorldPacket const* WorldPackets::Quest::QuestGiverInvalidQuest::Write()
WorldPacket const* WorldPackets::Quest::QuestUpdateFailedTimer::Write()
{
- _worldPacket << QuestID;
+ _worldPacket << uint32(QuestID);
return &_worldPacket;
}
WorldPacket const* WorldPackets::Quest::QuestGiverQuestFailed::Write()
{
- _worldPacket << QuestID;
- _worldPacket << Reason;
+ _worldPacket << uint32(QuestID);
+ _worldPacket << uint32(Reason);
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index c2a54bb8ddc..b321b4076a5 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -194,6 +194,17 @@ namespace WorldPackets
uint8 ObjectiveType = 0;
};
+ class QuestUpdateAddPvPCredit final : public ServerPacket
+ {
+ public:
+ QuestUpdateAddPvPCredit() : ServerPacket(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, 4 + 2) { }
+
+ WorldPacket const* Write() override;
+
+ int32 QuestID = 0;
+ uint16 Count = 0;
+ };
+
struct QuestChoiceItem
{
int32 ItemID = 0;
@@ -288,8 +299,6 @@ namespace WorldPackets
int32 QuestID = 0;
int32 TalentReward = 0;
bool LaunchGossip = 0;
-
- // Not in JAM struct
WorldPackets::Item::ItemInstance ItemReward;
};
diff --git a/src/server/game/Server/Packets/ScenePackets.h b/src/server/game/Server/Packets/ScenePackets.h
index 02fca2d5fe9..df6a1f0957e 100644
--- a/src/server/game/Server/Packets/ScenePackets.h
+++ b/src/server/game/Server/Packets/ScenePackets.h
@@ -25,7 +25,7 @@ namespace WorldPackets
{
namespace Scenes
{
- class PlayScene final : public ServerPacket
+ class TC_GAME_API PlayScene final : public ServerPacket
{
public:
PlayScene() : ServerPacket(SMSG_PLAY_SCENE, 34) { }
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index 5c800497039..aa78cae6deb 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -813,7 +813,7 @@ WorldPacket const* WorldPackets::Spells::NotifyMissileTrajectoryCollision::Write
_worldPacket << Caster;
_worldPacket << uint8(CastID);
_worldPacket << CollisionPos;
-
+
return &_worldPacket;
}
@@ -844,3 +844,15 @@ WorldPacket const* WorldPackets::Spells::SpellDelayed::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Spells::DispelFailed::Write()
+{
+ _worldPacket << CasterGUID;
+ _worldPacket << VictimGUID;
+ _worldPacket << uint32(SpellID);
+ _worldPacket << uint32(FailedSpells.size());
+ if (!FailedSpells.empty())
+ _worldPacket.append(FailedSpells.data(), FailedSpells.size());
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index 18194255316..b1cb39251de 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -419,7 +419,7 @@ namespace WorldPackets
uint8 CastID = 0;
};
- class CastFailed final : public ServerPacket
+ class TC_GAME_API CastFailed final : public ServerPacket
{
public:
CastFailed(OpcodeServer opcode) : ServerPacket(opcode, 4+4+4+4+1) { }
@@ -445,7 +445,7 @@ namespace WorldPackets
std::vector<SpellModifierData> ModifierData;
};
- class SetSpellModifier final : public ServerPacket
+ class TC_GAME_API SetSpellModifier final : public ServerPacket
{
public:
SetSpellModifier(OpcodeServer opcode) : ServerPacket(opcode, 20) { }
@@ -830,7 +830,7 @@ namespace WorldPackets
{
public:
MissileTrajectoryCollision(WorldPacket&& packet) : ClientPacket(CMSG_MISSILE_TRAJECTORY_COLLISION, std::move(packet)) { }
-
+
void Read() override;
ObjectGuid Target;
@@ -839,7 +839,7 @@ namespace WorldPackets
G3D::Vector3 CollisionPos;
};
- class NotifyMissileTrajectoryCollision : public ServerPacket
+ class NotifyMissileTrajectoryCollision final : public ServerPacket
{
public:
NotifyMissileTrajectoryCollision() : ServerPacket(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, 8 + 1 + 12) { }
@@ -855,7 +855,7 @@ namespace WorldPackets
{
public:
UpdateMissileTrajectory(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_MISSILE_TRAJECTORY, std::move(packet)) { }
-
+
void Read() override;
ObjectGuid Guid;
@@ -868,7 +868,7 @@ namespace WorldPackets
Optional<MovementInfo> Status;
};
- class SpellDelayed : public ServerPacket
+ class SpellDelayed final : public ServerPacket
{
public:
SpellDelayed() : ServerPacket(SMSG_SPELL_DELAYED, sizeof(ObjectGuid) + 4) { }
@@ -878,6 +878,19 @@ namespace WorldPackets
ObjectGuid Caster;
int32 ActualDelay = 0;
};
+
+ class DispelFailed final : public ServerPacket
+ {
+ public:
+ DispelFailed() : ServerPacket(SMSG_DISPEL_FAILED, 16 + 16 + 4 + 4 + 4 /* predict a single failure on average */) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid CasterGUID;
+ ObjectGuid VictimGUID;
+ uint32 SpellID = 0;
+ std::vector<int32> FailedSpells;
+ };
}
}
diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp
index 1e9eb14e3ea..8048fecb597 100644
--- a/src/server/game/Server/Packets/TicketPackets.cpp
+++ b/src/server/game/Server/Packets/TicketPackets.cpp
@@ -53,6 +53,9 @@ WorldPacket const* WorldPackets::Ticket::GMTicketCaseStatus::Write()
_worldPacket.WriteBits(c.Url.size(), 11);
_worldPacket.WriteBits(c.WaitTimeOverrideMessage.size(), 10);
+
+ _worldPacket.WriteString(c.Url);
+ _worldPacket.WriteString(c.WaitTimeOverrideMessage);
}
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index e8f924ced63..19aff2468a9 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -159,6 +159,8 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlemasterJoinArena, &WorldSession::HandleBattlemasterJoinArena);
DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_SKIRMISH, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BATTLENET_CHALLENGE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_BATTLENET_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
@@ -365,8 +367,8 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GET_TROPHY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GetUndeleteCharacterCooldownStatus, &WorldSession::HandleGetUndeleteCooldownStatus);
DEFINE_HANDLER(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetCaseStatus, &WorldSession::HandleGMTicketGetCaseStatusOpcode);
- DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode);
+ DEFINE_HANDLER(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetCaseStatus, &WorldSession::HandleGMTicketGetCaseStatusOpcode);
+ DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode);
DEFINE_HANDLER(CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::GossipSelectOption, &WorldSession::HandleGossipSelectOptionOpcode);
DEFINE_HANDLER(CMSG_GRANT_LEVEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::GrantLevel, &WorldSession::HandleGrantLevel);
DEFINE_HANDLER(CMSG_GUILD_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
@@ -430,7 +432,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_KEYBOUND_OVERRIDE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_LEARN_PET_SPECIALIZATION_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode);
- DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::LeaveGroup, &WorldSession::HandleLeaveGroupOpcode);
+ DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::LeaveGroup, &WorldSession::HandleLeaveGroupOpcode);
DEFINE_HANDLER(CMSG_LEAVE_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_LFG_LIST_APPLY_TO_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_LFG_LIST_CANCEL_APPLICATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
@@ -667,7 +669,6 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_SEND_CONTACT_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::SendContactList, &WorldSession::HandleContactListOpcode);
DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::SendMail, &WorldSession::HandleSendMail);
DEFINE_HANDLER(CMSG_SEND_SOR_REQUEST_VIA_ADDRESS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SEND_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::CTextEmote, &WorldSession::HandleTextEmoteOpcode);
DEFINE_HANDLER(CMSG_SET_ACHIEVEMENTS_HIDDEN, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_ACTION_BAR_TOGGLES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetActionBarToggles, &WorldSession::HandleSetActionBarToggles);
@@ -848,6 +849,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_VOICE_CHANNEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BAN_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -865,6 +867,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_CHALLENGE_ABORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_CHALLENGE_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_REALM_LIST_TICKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_SET_SESSION_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_ACK_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_CONFIRM_PURCHASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DELIVERY_ENDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -977,7 +983,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHEAT_IGNORE_DIMISHING_RETURNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_WARGAME_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHUNKED_PACKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1023,7 +1028,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PLAYER_CHOICE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1053,7 +1058,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEIGN_DEATH_RESISTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_FINAL_CHUNK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_ESCAPED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_NOT_HOOKED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLIGHT_SPLINE_SYNC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1123,7 +1127,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_REQUEST_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOD_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1491,8 +1495,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1509,7 +1513,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 138cb7c1dd5..6dd830fd310 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -37,7 +37,7 @@ enum ConnectionType
enum OpcodeMisc : uint32
{
- MAX_OPCODE = 0x1FFF,
+ MAX_OPCODE = 0x3FFF,
NUM_OPCODE_HANDLERS = (MAX_OPCODE + 1),
UNKNOWN_OPCODE = (0xFFFF + 1),
NULL_OPCODE = 0xBADD
@@ -45,1604 +45,1607 @@ enum OpcodeMisc : uint32
enum OpcodeClient : uint32
{
- CMSG_ACCEPT_GUILD_INVITE = 0x00BF,
- CMSG_ACCEPT_LEVEL_GRANT = 0x0731,
- CMSG_ACCEPT_TRADE = 0x00FD,
- CMSG_ACCEPT_WARGAME_INVITE = 0x117F,
- CMSG_ACTIVATE_TAXI = 0x037A,
- CMSG_ADDON_LIST = 0x0540,
- CMSG_ADD_BATTLENET_FRIEND = 0x0140,
- CMSG_ADD_FRIEND = 0x046B,
- CMSG_ADD_IGNORE = 0x04A7,
- CMSG_ADD_TOY = 0x05E1,
- CMSG_ALTER_APPEARANCE = 0x152D,
- CMSG_AREA_SPIRIT_HEALER_QUERY = 0x1DAA,
- CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x0675,
- CMSG_AREA_TRIGGER = 0x043D,
- CMSG_ATTACK_STOP = 0x0DA6,
- CMSG_ATTACK_SWING = 0x0C2A,
- CMSG_AUCTION_HELLO_REQUEST = 0x1D0E,
- CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x150D,
- CMSG_AUCTION_LIST_ITEMS = 0x118D,
- CMSG_AUCTION_LIST_OWNER_ITEMS = 0x15AE,
- CMSG_AUCTION_LIST_PENDING_SALES = 0x0256,
- CMSG_AUCTION_PLACE_BID = 0x0811,
- CMSG_AUCTION_REMOVE_ITEM = 0x0659,
- CMSG_AUCTION_REPLICATE_ITEMS = 0x15AA,
- CMSG_AUCTION_SELL_ITEM = 0x005D,
- CMSG_AUTH_CONTINUED_SESSION = 0x0C33,
- CMSG_AUTH_SESSION = 0x0977,
- CMSG_AUTOBANK_ITEM = 0x121E,
- CMSG_AUTOBANK_REAGENT = 0x127E,
- CMSG_AUTOSTORE_BANK_ITEM = 0x1312,
- CMSG_AUTOSTORE_BANK_REAGENT = 0x1635,
- CMSG_AUTO_EQUIP_ITEM = 0x1375,
- CMSG_AUTO_EQUIP_ITEM_SLOT = 0x1239,
- CMSG_AUTO_STORE_BAG_ITEM = 0x161E,
- CMSG_BANKER_ACTIVATE = 0x1526,
- CMSG_BATTLEFIELD_LEAVE = 0x0429,
- CMSG_BATTLEFIELD_LIST = 0x08F9,
- CMSG_BATTLEFIELD_PORT = 0x0619,
- CMSG_BATTLEMASTER_HELLO = 0x01E1,
- CMSG_BATTLEMASTER_JOIN = 0x0A71,
- CMSG_BATTLEMASTER_JOIN_ARENA = 0x0A16,
- CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x1DA9,
- CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x113C,
- CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x00B4,
- CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x1424,
- CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x1168,
- CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x00F0,
- CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x05E8,
- CMSG_BATTLE_PAY_START_PURCHASE = 0x0430,
- CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x046C,
- CMSG_BATTLE_PET_DELETE_PET = 0x0168,
- CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x0600,
- CMSG_BATTLE_PET_MODIFY_NAME = 0x00E3,
- CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x0123,
- CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x116C,
- CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x106C,
- CMSG_BATTLE_PET_SET_FLAGS = 0x0538,
- CMSG_BATTLE_PET_SUMMON = 0x007B,
- CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x1085,
- CMSG_BEGIN_TRADE = 0x1022,
- CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0x04B4,
- CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0x10BF,
- CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0x00E8,
- CMSG_BF_MGR_QUEUE_REQUEST = 0x0846,
- CMSG_BINDER_ACTIVATE = 0x073D,
- CMSG_BLACK_MARKET_BID_ON_ITEM = 0x031A,
- CMSG_BLACK_MARKET_OPEN = 0x021E,
- CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x0C59,
- CMSG_BUG_REPORT = 0x04EF,
- CMSG_BUSY_TRADE = 0x0590,
- CMSG_BUY_BACK_ITEM = 0x1906,
- CMSG_BUY_BANK_SLOT = 0x0016,
- CMSG_BUY_ITEM = 0x158A,
- CMSG_BUY_REAGENT_BANK = 0x0636,
- CMSG_BUY_WOW_TOKEN_CONFIRM = 0x102C,
- CMSG_BUY_WOW_TOKEN_START = 0x003F,
- CMSG_CAGE_BATTLE_PET = 0x10A2,
- CMSG_CALENDAR_ADD_EVENT = 0x00F8,
- CMSG_CALENDAR_COMPLAIN = 0x0180,
- CMSG_CALENDAR_COPY_EVENT = 0x01B7,
- CMSG_CALENDAR_EVENT_INVITE = 0x0438,
- CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x0130,
- CMSG_CALENDAR_EVENT_RSVP = 0x1040,
- CMSG_CALENDAR_EVENT_SIGN_UP = 0x01A8,
- CMSG_CALENDAR_EVENT_STATUS = 0x013C,
- CMSG_CALENDAR_GET = 0x0477,
- CMSG_CALENDAR_GET_EVENT = 0x01BB,
- CMSG_CALENDAR_GET_NUM_PENDING = 0x00A7,
- CMSG_CALENDAR_GUILD_FILTER = 0x04A3,
- CMSG_CALENDAR_REMOVE_EVENT = 0x00E7,
- CMSG_CALENDAR_REMOVE_INVITE = 0x1067,
- CMSG_CALENDAR_UPDATE_EVENT = 0x056F,
- CMSG_CANCEL_AURA = 0x0CB6,
- CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x1185,
- CMSG_CANCEL_CAST = 0x0525,
- CMSG_CANCEL_CHANNELLING = 0x01F1,
- CMSG_CANCEL_GROWTH_AURA = 0x002E,
- CMSG_CANCEL_MASTER_LOOT_ROLL = 0x09FD,
- CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x09BE,
- CMSG_CANCEL_MOUNT_AURA = 0x0425,
- CMSG_CANCEL_QUEUED_SPELL = 0x0935,
- CMSG_CANCEL_TEMP_ENCHANTMENT = 0x075D,
- CMSG_CANCEL_TRADE = 0x18AE,
- CMSG_CAN_DUEL = 0x10EB,
- CMSG_CAST_SPELL = 0x00F5,
- CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x089E,
- CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x00DA,
- CMSG_CHANGE_BAG_SLOT_FLAG = 0x0CA2,
- CMSG_CHANGE_MONUMENT_APPEARANCE = 0x1086,
- CMSG_CHANGE_SUB_GROUP = 0x11B8,
- CMSG_CHARACTER_RENAME_REQUEST = 0x05F0,
- CMSG_CHAR_CUSTOMIZE = 0x0433,
- CMSG_CHAR_DELETE = 0x0428,
- CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x0528,
- CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x03D6,
- CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x03FE,
- CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x17FA,
- CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x16FD,
- CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x02BE,
- CMSG_CHAT_ADDON_MESSAGE_RAID = 0x07B1,
- CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x16D9,
- CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x0BBE,
- CMSG_CHAT_CHANNEL_BAN = 0x0FFA,
- CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x0BF5,
- CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x039E,
- CMSG_CHAT_CHANNEL_INVITE = 0x07DE,
- CMSG_CHAT_CHANNEL_KICK = 0x12B6,
- CMSG_CHAT_CHANNEL_LIST = 0x139D,
- CMSG_CHAT_CHANNEL_MODERATE = 0x16D1,
- CMSG_CHAT_CHANNEL_MODERATOR = 0x13B1,
- CMSG_CHAT_CHANNEL_MUTE = 0x1295,
- CMSG_CHAT_CHANNEL_OWNER = 0x0EFE,
- CMSG_CHAT_CHANNEL_PASSWORD = 0x16B2,
- CMSG_CHAT_CHANNEL_SET_OWNER = 0x13D2,
- CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x13DE,
- CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x02F1,
- CMSG_CHAT_CHANNEL_UNBAN = 0x0FB1,
- CMSG_CHAT_CHANNEL_UNMODERATOR = 0x13F1,
- CMSG_CHAT_CHANNEL_UNMUTE = 0x03DD,
- CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x02D2,
- CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x0AF9,
- CMSG_CHAT_CHANNEL_VOICE_OFF = 0x0EDE,
- CMSG_CHAT_CHANNEL_VOICE_ON = 0x1A96,
- CMSG_CHAT_JOIN_CHANNEL = 0x0BF6,
- CMSG_CHAT_LEAVE_CHANNEL = 0x0BF1,
- CMSG_CHAT_MESSAGE_AFK = 0x07BE,
- CMSG_CHAT_MESSAGE_CHANNEL = 0x0BB2,
- CMSG_CHAT_MESSAGE_DND = 0x13DA,
- CMSG_CHAT_MESSAGE_EMOTE = 0x1799,
- CMSG_CHAT_MESSAGE_GUILD = 0x13FA,
- CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x16DD,
- CMSG_CHAT_MESSAGE_OFFICER = 0x13B5,
- CMSG_CHAT_MESSAGE_PARTY = 0x12F5,
- CMSG_CHAT_MESSAGE_RAID = 0x07D2,
- CMSG_CHAT_MESSAGE_RAID_WARNING = 0x0EF9,
- CMSG_CHAT_MESSAGE_SAY = 0x03BE,
- CMSG_CHAT_MESSAGE_WHISPER = 0x13BD,
- CMSG_CHAT_MESSAGE_YELL = 0x03BD,
- CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x0692,
- CMSG_CHAT_REPORT_FILTERED = 0x07BD,
- CMSG_CHAT_REPORT_IGNORED = 0x0EBE,
- CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x03F9,
- CMSG_CHECK_RAF_EMAIL_ENABLED = 0x1033,
- CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x01BC,
- CMSG_CHOICE_RESPONSE = 0x1001,
- CMSG_CLEAR_RAID_MARKER = 0x09EE,
- CMSG_CLEAR_TRADE_ITEM = 0x087A,
- CMSG_CLIENT_PORT_GRAVEYARD = 0x1509,
- CMSG_CLOSE_INTERACTION = 0x001D,
- CMSG_COMMENTATOR_ENABLE = 0x1167,
- CMSG_COMMENTATOR_ENTER_INSTANCE = 0x047B,
- CMSG_COMMENTATOR_EXIT_INSTANCE = 0x10F0,
- CMSG_COMMENTATOR_GET_MAP_INFO = 0x04C0,
- CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x0073,
- CMSG_COMMENTATOR_START_WARGAME = 0x05FC,
- CMSG_COMPLAINT = 0x0133,
- CMSG_COMPLETE_CINEMATIC = 0x023A,
- CMSG_COMPLETE_MOVIE = 0x0612,
- CMSG_CONFIRM_RESPEC_WIPE = 0x04A2,
- CMSG_CONNECT_TO_FAILED = 0x04F8,
- CMSG_CONVERT_RAID = 0x11FF,
- CMSG_CREATE_CHARACTER = 0x143B,
- CMSG_CREATE_SHIPMENT = 0x0575,
- CMSG_DB_QUERY_BULK = 0x10E4,
- CMSG_DECLINE_GUILD_INVITES = 0x1D0A,
- CMSG_DECLINE_PETITION = 0x1D86,
- CMSG_DELETE_EQUIPMENT_SET = 0x027A,
- CMSG_DEL_FRIEND = 0x117C,
- CMSG_DEL_IGNORE = 0x11EB,
- CMSG_DEPOSIT_REAGENT_BANK = 0x0C69,
- CMSG_DESTROY_ITEM = 0x00F2,
- CMSG_DF_BOOT_PLAYER_VOTE = 0x05AC,
- CMSG_DF_GET_JOIN_STATUS = 0x11A7,
- CMSG_DF_GET_SYSTEM_INFO = 0x1138,
- CMSG_DF_JOIN = 0x11F8,
- CMSG_DF_LEAVE = 0x0424,
- CMSG_DF_PROPOSAL_RESPONSE = 0x11B0,
- CMSG_DF_READY_CHECK_RESPONSE = 0x1028,
- CMSG_DF_SEARCH_JOIN = 0x11EC,
- CMSG_DF_SEARCH_LEAVE = 0x00F4,
- CMSG_DF_SET_COMMENT = 0x10B4,
- CMSG_DF_SET_ROLES = 0x003B,
- CMSG_DF_TELEPORT = 0x00A8,
- CMSG_DISCARDED_TIME_SYNC_ACKS = 0x111A,
- CMSG_DISMISS_CRITTER = 0x0A1D,
- CMSG_DO_MASTER_LOOT_ROLL = 0x0036,
- CMSG_DO_READY_CHECK = 0x012B,
- CMSG_DUEL_RESPONSE = 0x19A6,
- CMSG_EJECT_PASSENGER = 0x0D65,
- CMSG_EMOTE = 0x077E,
- CMSG_ENABLE_NAGLE = 0x0827,
- CMSG_ENABLE_TAXI_NODE = 0x190D,
- CMSG_ENGINE_SURVEY = 0x0534,
- CMSG_ENUM_CHARACTERS = 0x1163,
- CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x043B,
- CMSG_FAR_SIGHT = 0x025A,
- CMSG_GAME_OBJ_REPORT_USE = 0x1101,
- CMSG_GAME_OBJ_USE = 0x0359,
- CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x0583,
- CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x01AE,
- CMSG_GARRISON_CHECK_UPGRADEABLE = 0x08ED,
- CMSG_GARRISON_COMPLETE_MISSION = 0x0D4D,
- CMSG_GARRISON_GENERATE_RECRUITS = 0x016E,
- CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x0175,
- CMSG_GARRISON_MISSION_BONUS_ROLL = 0x0125,
- CMSG_GARRISON_PURCHASE_BUILDING = 0x047E,
- CMSG_GARRISON_RECRUIT_FOLLOWER = 0x0588,
- CMSG_GARRISON_REMOVE_FOLLOWER = 0x0136,
- CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x100A,
- CMSG_GARRISON_RENAME_FOLLOWER = 0x0472,
- CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x1CA6,
- CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x18AA,
- CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x00EA,
- CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x0417,
- CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x0822,
- CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x08B0,
- CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x013E,
- CMSG_GARRISON_START_MISSION = 0x087E,
- CMSG_GARRISON_SWAP_BUILDINGS = 0x1CAE,
- CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x0580,
- CMSG_GET_CHALLENGE_MODE_REWARDS = 0x04D6,
- CMSG_GET_GARRISON_INFO = 0x0414,
- CMSG_GET_ITEM_PURCHASE_DATA = 0x1DA1,
- CMSG_GET_MIRROR_IMAGE_DATA = 0x0461,
- CMSG_GET_PVP_OPTIONS_ENABLED = 0x1038,
- CMSG_GET_REMAINING_GAME_TIME = 0x04A8,
- CMSG_GET_TROPHY_LIST = 0x093A,
- CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x017C,
- CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x10E8,
- CMSG_GM_TICKET_GET_CASE_STATUS = 0x01F4,
- CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x0200,
- CMSG_GOSSIP_SELECT_OPTION = 0x0A59,
- CMSG_GRANT_LEVEL = 0x0459,
- CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x08D2,
- CMSG_GUILD_ADD_RANK = 0x048D,
- CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x09C2,
- CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x00C5,
- CMSG_GUILD_BANK_ACTIVATE = 0x0311,
- CMSG_GUILD_BANK_BUY_TAB = 0x0C11,
- CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x0051,
- CMSG_GUILD_BANK_LOG_QUERY = 0x0C82,
- CMSG_GUILD_BANK_QUERY_TAB = 0x0252,
- CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x05CE,
- CMSG_GUILD_BANK_SET_TAB_TEXT = 0x01C5,
- CMSG_GUILD_BANK_SWAP_ITEMS = 0x1522,
- CMSG_GUILD_BANK_TEXT_QUERY = 0x048E,
- CMSG_GUILD_BANK_UPDATE_TAB = 0x112E,
- CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x0855,
- CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x0592,
- CMSG_GUILD_CHANGE_NAME_REQUEST = 0x0991,
- CMSG_GUILD_DECLINE_INVITATION = 0x019D,
- CMSG_GUILD_DELETE = 0x0589,
- CMSG_GUILD_DELETE_RANK = 0x04C1,
- CMSG_GUILD_DEMOTE_MEMBER = 0x0C86,
- CMSG_GUILD_EVENT_LOG_QUERY = 0x0896,
- CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x04D5,
- CMSG_GUILD_GET_RANKS = 0x0195,
- CMSG_GUILD_GET_ROSTER = 0x04D2,
- CMSG_GUILD_INVITE_BY_NAME = 0x1440,
- CMSG_GUILD_LEAVE = 0x09CE,
- CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x01DE,
- CMSG_GUILD_NEWS_UPDATE_STICKY = 0x0C8A,
- CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x0889,
- CMSG_GUILD_PERMISSIONS_QUERY = 0x018D,
- CMSG_GUILD_PROMOTE_MEMBER = 0x01C1,
- CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x08D5,
- CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x088E,
- CMSG_GUILD_QUERY_NEWS = 0x09C6,
- CMSG_GUILD_QUERY_RECIPES = 0x019A,
- CMSG_GUILD_REPLACE_GUILD_MASTER = 0x05CA,
- CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x04CD,
- CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x08CE,
- CMSG_GUILD_SET_GUILD_MASTER = 0x0034,
- CMSG_GUILD_SET_MEMBER_NOTE = 0x0586,
- CMSG_GUILD_SET_RANK_PERMISSIONS = 0x058A,
- CMSG_GUILD_SHIFT_RANK = 0x0881,
- CMSG_GUILD_UPDATE_INFO_TEXT = 0x0882,
- CMSG_GUILD_UPDATE_MOTD_TEXT = 0x01CE,
- CMSG_HEARTH_AND_RESURRECT = 0x065E,
- CMSG_IGNORE_TRADE = 0x083C,
- CMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x0D39,
- CMSG_INITIATE_ROLE_POLL = 0x0124,
- CMSG_INITIATE_TRADE = 0x041F,
- CMSG_INSPECT = 0x0371,
- CMSG_INSPECT_PVP = 0x1024,
- CMSG_INSTANCE_LOCK_RESPONSE = 0x1909,
- CMSG_ITEM_PURCHASE_REFUND = 0x0C1A,
- CMSG_ITEM_TEXT_QUERY = 0x08BA,
- CMSG_JOIN_PET_BATTLE_QUEUE = 0x140D,
- CMSG_JOIN_RATED_BATTLEGROUND = 0x053A,
- CMSG_KEEP_ALIVE = 0x1434,
- CMSG_KEYBOUND_OVERRIDE = 0x0431,
- CMSG_LEARN_PET_SPECIALIZATION_GROUP = 0x04B1,
- CMSG_LEARN_TALENTS = 0x0497,
- CMSG_LEAVE_GROUP = 0x01A7,
- CMSG_LEAVE_PET_BATTLE_QUEUE = 0x04F6,
- CMSG_LFG_LIST_APPLY_TO_GROUP = 0x04F4,
- CMSG_LFG_LIST_CANCEL_APPLICATION = 0x05A7,
- CMSG_LFG_LIST_DECLINE_APPLICANT = 0x0470,
- CMSG_LFG_LIST_GET_STATUS = 0x10E3,
- CMSG_LFG_LIST_INVITE_APPLICANT = 0x046F,
- CMSG_LFG_LIST_INVITE_RESPONSE = 0x053F,
- CMSG_LFG_LIST_JOIN = 0x10A3,
- CMSG_LFG_LIST_LEAVE = 0x00F3,
- CMSG_LFG_LIST_SEARCH = 0x0473,
- CMSG_LFG_LIST_UPDATE_REQUEST = 0x0167,
- CMSG_LF_GUILD_ADD_RECRUIT = 0x11F7,
- CMSG_LF_GUILD_BROWSE = 0x11EF,
- CMSG_LF_GUILD_DECLINE_RECRUIT = 0x05C9,
- CMSG_LF_GUILD_GET_APPLICATIONS = 0x0181,
- CMSG_LF_GUILD_GET_GUILD_POST = 0x049D,
- CMSG_LF_GUILD_GET_RECRUITS = 0x08DE,
- CMSG_LF_GUILD_REMOVE_RECRUIT = 0x0189,
- CMSG_LF_GUILD_SET_GUILD_POST = 0x11B4,
- CMSG_LIST_INVENTORY = 0x0A55,
- CMSG_LOADING_SCREEN_NOTIFY = 0x1428,
- CMSG_LOAD_SELECTED_TROPHY = 0x0D2E,
- CMSG_LOGOUT_CANCEL = 0x0632,
- CMSG_LOGOUT_INSTANT = 0x0411,
- CMSG_LOGOUT_REQUEST = 0x1126,
- CMSG_LOG_DISCONNECT = 0x0C67,
- CMSG_LOG_STREAMING_ERROR = 0x0838,
- CMSG_LOOT_ITEM = 0x0936,
- CMSG_LOOT_MONEY = 0x0025,
- CMSG_LOOT_RELEASE = 0x0922,
- CMSG_LOOT_ROLL = 0x08AD,
- CMSG_LOOT_UNIT = 0x096E,
- CMSG_LOW_LEVEL_RAID1 = 0x1170,
- CMSG_LOW_LEVEL_RAID2 = 0x0351,
- CMSG_MAIL_CREATE_TEXT_ITEM = 0x19A9,
- CMSG_MAIL_DELETE = 0x0876,
- CMSG_MAIL_GET_LIST = 0x0859,
- CMSG_MAIL_MARK_AS_READ = 0x0A1A,
- CMSG_MAIL_RETURN_TO_SENDER = 0x10C0,
- CMSG_MAIL_TAKE_ITEM = 0x0715,
- CMSG_MAIL_TAKE_MONEY = 0x0379,
- CMSG_MASTER_LOOT_ITEM = 0x04FA,
- CMSG_MINIMAP_PING = 0x1173,
- CMSG_MISSILE_TRAJECTORY_COLLISION = 0x0C0D,
- CMSG_MOUNT_SET_FAVORITE = 0x142C,
- CMSG_MOUNT_SPECIAL_ANIM = 0x04F5,
- CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x1195,
- CMSG_MOVE_CHANGE_TRANSPORT = 0x1412,
- CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x1032,
- CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x1996,
- CMSG_MOVE_DISMISS_VEHICLE = 0x111E,
- CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x1C11,
- CMSG_MOVE_FALL_LAND = 0x149D,
- CMSG_MOVE_FALL_RESET = 0x10B6,
- CMSG_MOVE_FEATHER_FALL_ACK = 0x11BE,
- CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x103D,
- CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x1431,
- CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x10B2,
- CMSG_MOVE_FORCE_ROOT_ACK = 0x1036,
- CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x1832,
- CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x1436,
- CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x14B6,
- CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x1931,
- CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x1112,
- CMSG_MOVE_FORCE_UNROOT_ACK = 0x1939,
- CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x15BE,
- CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x143E,
- CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x1511,
- CMSG_MOVE_HEARTBEAT = 0x1512,
- CMSG_MOVE_HOVER_ACK = 0x111D,
- CMSG_MOVE_JUMP = 0x199E,
- CMSG_MOVE_KNOCK_BACK_ACK = 0x159E,
- CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x159A,
- CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x141E,
- CMSG_MOVE_SET_CAN_FLY_ACK = 0x1411,
- CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x181D,
- CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x11B2,
- CMSG_MOVE_SET_FACING = 0x1119,
- CMSG_MOVE_SET_FLY = 0x1531,
- CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x11B6,
- CMSG_MOVE_SET_PITCH = 0x1532,
- CMSG_MOVE_SET_RELATIVE_POSITION = 0x1135,
- CMSG_MOVE_SET_RUN_MODE = 0x181E,
- CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x1836,
- CMSG_MOVE_SET_WALK_MODE = 0x113A,
- CMSG_MOVE_SPLINE_DONE = 0x1991,
- CMSG_MOVE_START_ASCEND = 0x1515,
- CMSG_MOVE_START_BACKWARD = 0x1191,
- CMSG_MOVE_START_DESCEND = 0x1419,
- CMSG_MOVE_START_FORWARD = 0x1196,
- CMSG_MOVE_START_PITCH_DOWN = 0x151A,
- CMSG_MOVE_START_PITCH_UP = 0x1811,
- CMSG_MOVE_START_STRAFE_LEFT = 0x1992,
- CMSG_MOVE_START_STRAFE_RIGHT = 0x113D,
- CMSG_MOVE_START_SWIM = 0x189E,
- CMSG_MOVE_START_TURN_LEFT = 0x1819,
- CMSG_MOVE_START_TURN_RIGHT = 0x141D,
- CMSG_MOVE_STOP = 0x1C16,
- CMSG_MOVE_STOP_ASCEND = 0x1912,
- CMSG_MOVE_STOP_PITCH = 0x1519,
- CMSG_MOVE_STOP_STRAFE = 0x1095,
- CMSG_MOVE_STOP_SWIM = 0x14B5,
- CMSG_MOVE_STOP_TURN = 0x1491,
- CMSG_MOVE_TELEPORT_ACK = 0x1C1A,
- CMSG_MOVE_TELEPORT_CHEAT = 0x18B5,
- CMSG_MOVE_TIME_SKIPPED = 0x18B9,
- CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x1111,
- CMSG_MOVE_WATER_WALK_ACK = 0x18B2,
- CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x092E,
- CMSG_NEXT_CINEMATIC_CAMERA = 0x0C51,
- CMSG_OBJECT_UPDATE_FAILED = 0x01A9,
- CMSG_OBJECT_UPDATE_RESCUED = 0x059F,
- CMSG_OFFER_PETITION = 0x053B,
- CMSG_OPENING_CINEMATIC = 0x0655,
- CMSG_OPEN_ITEM = 0x042D,
- CMSG_OPEN_MISSION_NPC = 0x08B1,
- CMSG_OPEN_SHIPMENT_NPC = 0x09B1,
- CMSG_OPEN_TRADESKILL_NPC = 0x092D,
- CMSG_OPT_OUT_OF_LOOT = 0x065A,
- CMSG_PARTY_INVITE = 0x11FC,
- CMSG_PARTY_INVITE_RESPONSE = 0x057B,
- CMSG_PARTY_UNINVITE = 0x05FF,
- CMSG_PETITION_BUY = 0x150E,
- CMSG_PETITION_RENAME_GUILD = 0x1133,
- CMSG_PETITION_SHOW_LIST = 0x0779,
- CMSG_PETITION_SHOW_SIGNATURES = 0x1521,
- CMSG_PET_ABANDON = 0x1129,
- CMSG_PET_ACTION = 0x0312,
- CMSG_PET_BATTLE_FINAL_NOTIFY = 0x1025,
- CMSG_PET_BATTLE_INPUT = 0x01FC,
- CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x1C02,
- CMSG_PET_BATTLE_QUIT_NOTIFY = 0x1029,
- CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x1137,
- CMSG_PET_BATTLE_REQUEST_PVP = 0x1422,
- CMSG_PET_BATTLE_REQUEST_UPDATE = 0x0CBE,
- CMSG_PET_BATTLE_REQUEST_WILD = 0x05AE,
- CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x0488,
- CMSG_PET_CANCEL_AURA = 0x0019,
- CMSG_PET_CAST_SPELL = 0x1089,
- CMSG_PET_RENAME = 0x05F7,
- CMSG_PET_SET_ACTION = 0x0355,
- CMSG_PET_SPELL_AUTOCAST = 0x045D,
- CMSG_PET_STOP_ATTACK = 0x0271,
- CMSG_PING = 0x0828,
- CMSG_PLAYER_LOGIN = 0x10F3,
- CMSG_PROTOCOL_MISMATCH = 0x0CE7,
- CMSG_PUSH_QUEST_TO_PARTY = 0x110A,
- CMSG_PVP_LOG_DATA = 0x0075,
- CMSG_QUERY_BATTLE_PET_NAME = 0x0CE1,
- CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x0074,
- CMSG_QUERY_CORPSE_TRANSPORT = 0x1124,
- CMSG_QUERY_COUNTDOWN_TIMER = 0x08F2,
- CMSG_QUERY_CREATURE = 0x1002,
- CMSG_QUERY_GAME_OBJECT = 0x182D,
- CMSG_QUERY_GARRISON_CREATURE_NAME = 0x090E,
- CMSG_QUERY_GUILD_INFO = 0x00BC,
- CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x1921,
- CMSG_QUERY_NEXT_MAIL_TIME = 0x1189,
- CMSG_QUERY_NPC_TEXT = 0x04E2,
- CMSG_QUERY_PAGE_TEXT = 0x0C21,
- CMSG_QUERY_PETITION = 0x050A,
- CMSG_QUERY_PET_NAME = 0x0569,
- CMSG_QUERY_PLAYER_NAME = 0x01A4,
- CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x04E9,
- CMSG_QUERY_QUEST_INFO = 0x08BD,
- CMSG_QUERY_REALM_NAME = 0x016C,
- CMSG_QUERY_SCENARIO_POI = 0x01E7,
- CMSG_QUERY_TIME = 0x0A32,
- CMSG_QUERY_VOID_STORAGE = 0x08E5,
- CMSG_QUEST_CONFIRM_ACCEPT = 0x0C16,
- CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x005E,
- CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x037E,
- CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x0775,
- CMSG_QUEST_GIVER_HELLO = 0x035A,
- CMSG_QUEST_GIVER_QUERY_QUEST = 0x198A,
- CMSG_QUEST_GIVER_REQUEST_REWARD = 0x118A,
- CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x061E,
- CMSG_QUEST_GIVER_STATUS_QUERY = 0x001A,
- CMSG_QUEST_LOG_REMOVE_QUEST = 0x033E,
- CMSG_QUEST_POI_QUERY = 0x04AF,
- CMSG_QUEST_PUSH_RESULT = 0x0415,
- CMSG_QUEUED_MESSAGES_END = 0x0878,
- CMSG_RANDOM_ROLL = 0x10BC,
- CMSG_READY_CHECK_RESPONSE = 0x1078,
- CMSG_READ_ITEM = 0x0071,
- CMSG_RECLAIM_CORPSE = 0x0275,
- CMSG_RECRUIT_A_FRIEND = 0x04EC,
- CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x04AC,
- CMSG_REDEEM_WOW_TOKEN_START = 0x05BC,
- CMSG_REORDER_CHARACTERS = 0x10B3,
- CMSG_REPAIR_ITEM = 0x0736,
- CMSG_REPLACE_TROPHY = 0x0DE9,
- CMSG_REPOP_REQUEST = 0x15A9,
- CMSG_REPORT_PVP_PLAYER_AFK = 0x1D09,
- CMSG_REQUEST_ACCOUNT_DATA = 0x01B4,
- CMSG_REQUEST_BATTLEFIELD_STATUS = 0x116B,
- CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x09A9,
- CMSG_REQUEST_CEMETERY_LIST = 0x0DBA,
- CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x0875,
- CMSG_REQUEST_FORCED_REACTIONS = 0x086A,
- CMSG_REQUEST_GUILD_PARTY_STATE = 0x08A6,
- CMSG_REQUEST_GUILD_REWARDS_LIST = 0x00B1,
- CMSG_REQUEST_HONOR_STATS = 0x1C86,
- CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x0D7A,
- CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x0570,
- CMSG_REQUEST_PARTY_MEMBER_STATS = 0x01FF,
- CMSG_REQUEST_PET_INFO = 0x0A11,
- CMSG_REQUEST_PLAYED_TIME = 0x003D,
- CMSG_REQUEST_PVP_REWARDS = 0x0435,
- CMSG_REQUEST_RAID_INFO = 0x0533,
- CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x00B0,
- CMSG_REQUEST_RESEARCH_HISTORY = 0x017A,
- CMSG_REQUEST_STABLED_PETS = 0x0456,
- CMSG_REQUEST_VEHICLE_EXIT = 0x0DF5,
- CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x08BB,
- CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x10A6,
- CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x0C6A,
- CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x0024,
- CMSG_RESET_CHALLENGE_MODE = 0x0065,
- CMSG_RESET_INSTANCES = 0x04FF,
- CMSG_RESURRECT_RESPONSE = 0x003C,
- CMSG_REVERT_MONUMENT_APPEARANCE = 0x0171,
- CMSG_RIDE_VEHICLE_INTERACT = 0x1CA9,
- CMSG_SAVE_CUF_PROFILES = 0x000A,
- CMSG_SAVE_EQUIPMENT_SET = 0x041E,
- CMSG_SAVE_GUILD_EMBLEM = 0x1402,
- CMSG_SCENE_PLAYBACK_CANCELED = 0x0C65,
- CMSG_SCENE_PLAYBACK_COMPLETE = 0x04A0,
- CMSG_SCENE_TRIGGER_EVENT = 0x084D,
- CMSG_SELF_RES = 0x1989,
- CMSG_SELL_ITEM = 0x1922,
- CMSG_SELL_WOW_TOKEN_CONFIRM = 0x11A3,
- CMSG_SELL_WOW_TOKEN_START = 0x1140,
- CMSG_SEND_CONTACT_LIST = 0x0077,
- CMSG_SEND_MAIL = 0x00C0,
- CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x00AC,
- CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0x0530,
- CMSG_SEND_TEXT_EMOTE = 0x0412,
- CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x1C05,
- CMSG_SET_ACTION_BAR_TOGGLES = 0x1D29,
- CMSG_SET_ACTION_BUTTON = 0x1037,
- CMSG_SET_ACTIVE_MOVER = 0x1936,
- CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x00FF,
- CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x18A2,
- CMSG_SET_ASSISTANT_LEADER = 0x04BB,
- CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x142D,
- CMSG_SET_BANK_AUTOSORT_DISABLED = 0x0906,
- CMSG_SET_BANK_BAG_SLOT_FLAG = 0x0035,
- CMSG_SET_CONTACT_NOTES = 0x1030,
- CMSG_SET_CURRENCY_FLAGS = 0x1421,
- CMSG_SET_DIFFICULTY_ID = 0x08B9,
- CMSG_SET_DUNGEON_DIFFICULTY = 0x00AF,
- CMSG_SET_EVERYONE_IS_ASSISTANT = 0x0437,
- CMSG_SET_FACTION_AT_WAR = 0x1582,
- CMSG_SET_FACTION_INACTIVE = 0x1DAE,
- CMSG_SET_FACTION_NOT_AT_WAR = 0x077D,
- CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x0505,
- CMSG_SET_LFG_BONUS_FACTION_ID = 0x0402,
- CMSG_SET_LOOT_METHOD = 0x016B,
- CMSG_SET_LOOT_SPECIALIZATION = 0x0A51,
- CMSG_SET_PARTY_ASSIGNMENT = 0x1074,
- CMSG_SET_PARTY_LEADER = 0x11E7,
- CMSG_SET_PET_SLOT = 0x0C45,
- CMSG_SET_PLAYER_DECLINED_NAMES = 0x04B3,
- CMSG_SET_PREFERRED_CEMETERY = 0x0D69,
- CMSG_SET_PVP = 0x08AC,
- CMSG_SET_RAID_DIFFICULTY = 0x103F,
- CMSG_SET_ROLE = 0x01BF,
- CMSG_SET_SAVED_INSTANCE_EXTEND = 0x10AB,
- CMSG_SET_SELECTION = 0x1986,
- CMSG_SET_SHEATHED = 0x0C5A,
- CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x00F1,
- CMSG_SET_SPECIALIZATION = 0x1C82,
- CMSG_SET_TAXI_BENCHMARK_MODE = 0x0455,
- CMSG_SET_TITLE = 0x0C72,
- CMSG_SET_TRADE_CURRENCY = 0x140A,
- CMSG_SET_TRADE_GOLD = 0x0CE5,
- CMSG_SET_TRADE_ITEM = 0x0105,
- CMSG_SET_USING_PARTY_GARRISON = 0x10A9,
- CMSG_SET_WATCHED_FACTION = 0x1905,
- CMSG_SHOWING_CLOAK = 0x118E,
- CMSG_SHOWING_HELM = 0x073E,
- CMSG_SHOW_TRADE_SKILL = 0x11C0,
- CMSG_SIGN_PETITION = 0x0679,
- CMSG_SILENCE_PARTY_TALKER = 0x10F8,
- CMSG_SOCKET_GEMS = 0x021A,
- CMSG_SORT_BAGS = 0x01ED,
- CMSG_SORT_BANK_BAGS = 0x09F2,
- CMSG_SORT_REAGENT_BANK_BAGS = 0x05AA,
- CMSG_SPELL_CLICK = 0x150A,
- CMSG_SPIRIT_HEALER_ACTIVATE = 0x0A36,
- CMSG_SPLIT_ITEM = 0x1219,
- CMSG_STAND_STATE_CHANGE = 0x05EE,
- CMSG_START_SPECTATOR_WAR_GAME = 0x10B7,
- CMSG_START_WAR_GAME = 0x0100,
- CMSG_SUMMON_RESPONSE = 0x0577,
- CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x11BC,
- CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x00EC,
- CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x05A4,
- CMSG_SUSPEND_COMMS_ACK = 0x0CB7,
- CMSG_SUSPEND_TOKEN_RESPONSE = 0x08E8,
- CMSG_SWAP_INV_ITEM = 0x1379,
- CMSG_SWAP_ITEM = 0x1619,
- CMSG_SWAP_SUB_GROUPS = 0x05EC,
- CMSG_SWAP_VOID_ITEM = 0x096A,
- CMSG_TABARD_VENDOR_ACTIVATE = 0x0905,
- CMSG_TALK_TO_GOSSIP = 0x0A19,
- CMSG_TAXI_NODE_STATUS_QUERY = 0x1DAD,
- CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x0336,
- CMSG_TAXI_REQUEST_EARLY_LANDING = 0x0755,
- CMSG_TELEPORT_TO_UNIT = 0x112F,
- CMSG_TIME_ADJUSTMENT_RESPONSE = 0x119A,
- CMSG_TIME_SYNC_RESPONSE = 0x119D,
- CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x18BA,
- CMSG_TIME_SYNC_RESPONSE_FAILED = 0x15B5,
- CMSG_TOGGLE_DIFFICULTY = 0x107F,
- CMSG_TOGGLE_PVP = 0x1C21,
- CMSG_TOTEM_DESTROYED = 0x0056,
- CMSG_TOY_SET_FAVORITE = 0x1068,
- CMSG_TRAINER_BUY_SPELL = 0x1D26,
- CMSG_TRAINER_LIST = 0x0735,
- CMSG_TRANSMOGRIFY_ITEMS = 0x09A1,
- CMSG_TURN_IN_PETITION = 0x0A3A,
- CMSG_TUTORIAL = 0x05EF,
- CMSG_TWITTER_CHECK_STATUS = 0x0916,
- CMSG_TWITTER_CONNECT = 0x095E,
- CMSG_TWITTER_DISCONNECT = 0x011E,
- CMSG_TWITTER_POST = 0x1482,
- CMSG_UI_TIME_REQUEST = 0x0567,
- CMSG_UNACCEPT_TRADE = 0x1081,
- CMSG_UNDELETE_CHARACTER = 0x11F4,
- CMSG_UNLEARN_SKILL = 0x0816,
- CMSG_UNLEARN_SPECIALIZATION = 0x0880,
- CMSG_UNLOCK_VOID_STORAGE = 0x0436,
- CMSG_UPDATE_ACCOUNT_DATA = 0x102F,
- CMSG_UPDATE_CLIENT_SETTINGS = 0x052B,
- CMSG_UPDATE_MISSILE_TRAJECTORY = 0x0945,
- CMSG_UPDATE_RAID_TARGET = 0x01B8,
- CMSG_UPDATE_VAS_PURCHASE_STATES = 0x006C,
- CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x0174,
- CMSG_UPDATE_WOW_TOKEN_COUNT = 0x0164,
- CMSG_UPGRADE_GARRISON = 0x0466,
- CMSG_UPGRADE_ITEM = 0x182E,
- CMSG_USED_FOLLOW = 0x0962,
- CMSG_USE_CRITTER_ITEM = 0x0408,
- CMSG_USE_EQUIPMENT_SET = 0x1236,
- CMSG_USE_ITEM = 0x0562,
- CMSG_USE_TOY = 0x057D,
- CMSG_VIOLENCE_LEVEL = 0x0CBA,
- CMSG_VOICE_ADD_IGNORE = 0x113B,
- CMSG_VOICE_DEL_IGNORE = 0x01EB,
- CMSG_VOICE_SESSION_ENABLE = 0x0434,
- CMSG_VOID_STORAGE_TRANSFER = 0x14A2,
- CMSG_WARDEN_DATA = 0x00EF,
- CMSG_WHO = 0x00A4,
- CMSG_WHO_IS = 0x042C,
- CMSG_WORLD_PORT_RESPONSE = 0x04F7,
- CMSG_WORLD_TELEPORT = 0x10EC,
- CMSG_WRAP_ITEM = 0x1352,
+ CMSG_ACCEPT_GUILD_INVITE = 0x357B,
+ CMSG_ACCEPT_LEVEL_GRANT = 0x3463,
+ CMSG_ACCEPT_TRADE = 0x30D8,
+ CMSG_ACCEPT_WARGAME_INVITE = 0x3560,
+ CMSG_ACTIVATE_TAXI = 0x341F,
+ CMSG_ADDON_LIST = 0x3555,
+ CMSG_ADD_BATTLENET_FRIEND = 0x35E5,
+ CMSG_ADD_FRIEND = 0x365E,
+ CMSG_ADD_IGNORE = 0x3662,
+ CMSG_ADD_TOY = 0x31E6,
+ CMSG_ALTER_APPEARANCE = 0x345F,
+ CMSG_AREA_SPIRIT_HEALER_QUERY = 0x3424,
+ CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x3425,
+ CMSG_AREA_TRIGGER = 0x313C,
+ CMSG_ATTACK_STOP = 0x31B4,
+ CMSG_ATTACK_SWING = 0x31B3,
+ CMSG_AUCTION_HELLO_REQUEST = 0x3434,
+ CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x343A,
+ CMSG_AUCTION_LIST_ITEMS = 0x3437,
+ CMSG_AUCTION_LIST_OWNER_ITEMS = 0x3439,
+ CMSG_AUCTION_LIST_PENDING_SALES = 0x343C,
+ CMSG_AUCTION_PLACE_BID = 0x343B,
+ CMSG_AUCTION_REMOVE_ITEM = 0x3436,
+ CMSG_AUCTION_REPLICATE_ITEMS = 0x3438,
+ CMSG_AUCTION_SELL_ITEM = 0x3435,
+ CMSG_AUTH_CONTINUED_SESSION = 0x36E4,
+ CMSG_AUTH_SESSION = 0x36E3,
+ CMSG_AUTOBANK_ITEM = 0x3917,
+ CMSG_AUTOBANK_REAGENT = 0x3914,
+ CMSG_AUTOSTORE_BANK_ITEM = 0x3916,
+ CMSG_AUTOSTORE_BANK_REAGENT = 0x3915,
+ CMSG_AUTO_EQUIP_ITEM = 0x3918,
+ CMSG_AUTO_EQUIP_ITEM_SLOT = 0x391D,
+ CMSG_AUTO_STORE_BAG_ITEM = 0x3919,
+ CMSG_BANKER_ACTIVATE = 0x3427,
+ CMSG_BATTLEFIELD_LEAVE = 0x30F0,
+ CMSG_BATTLEFIELD_LIST = 0x30FB,
+ CMSG_BATTLEFIELD_PORT = 0x348C,
+ CMSG_BATTLEMASTER_HELLO = 0x31FC,
+ CMSG_BATTLEMASTER_JOIN = 0x3489,
+ CMSG_BATTLEMASTER_JOIN_ARENA = 0x348A,
+ CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x348B,
+ CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x3661,
+ CMSG_BATTLENET_REQUEST = 0x3683,
+ CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x3684,
+ CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x3658,
+ CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x3657,
+ CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x3651,
+ CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x364C,
+ CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x364D,
+ CMSG_BATTLE_PAY_START_PURCHASE = 0x3680,
+ CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x3681,
+ CMSG_BATTLE_PET_DELETE_PET = 0x35AD,
+ CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x35AC,
+ CMSG_BATTLE_PET_MODIFY_NAME = 0x35AF,
+ CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x35AB,
+ CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x35AA,
+ CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x35B3,
+ CMSG_BATTLE_PET_SET_FLAGS = 0x35B6,
+ CMSG_BATTLE_PET_SUMMON = 0x35B0,
+ CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x3145,
+ CMSG_BEGIN_TRADE = 0x30D5,
+ CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0x3559,
+ CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0x355B,
+ CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0x355A,
+ CMSG_BF_MGR_QUEUE_REQUEST = 0x30EF,
+ CMSG_BINDER_ACTIVATE = 0x3426,
+ CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3493,
+ CMSG_BLACK_MARKET_OPEN = 0x3491,
+ CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3492,
+ CMSG_BUG_REPORT = 0x3616,
+ CMSG_BUSY_TRADE = 0x30D6,
+ CMSG_BUY_BACK_ITEM = 0x3418,
+ CMSG_BUY_BANK_SLOT = 0x3428,
+ CMSG_BUY_ITEM = 0x3417,
+ CMSG_BUY_REAGENT_BANK = 0x3429,
+ CMSG_BUY_WOW_TOKEN_CONFIRM = 0x367A,
+ CMSG_BUY_WOW_TOKEN_START = 0x3679,
+ CMSG_CAGE_BATTLE_PET = 0x3154,
+ CMSG_CALENDAR_ADD_EVENT = 0x360D,
+ CMSG_CALENDAR_COMPLAIN = 0x3609,
+ CMSG_CALENDAR_COPY_EVENT = 0x3608,
+ CMSG_CALENDAR_EVENT_INVITE = 0x3602,
+ CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x3606,
+ CMSG_CALENDAR_EVENT_RSVP = 0x3604,
+ CMSG_CALENDAR_EVENT_SIGN_UP = 0x360B,
+ CMSG_CALENDAR_EVENT_STATUS = 0x3605,
+ CMSG_CALENDAR_GET = 0x35FF,
+ CMSG_CALENDAR_GET_EVENT = 0x3600,
+ CMSG_CALENDAR_GET_NUM_PENDING = 0x360A,
+ CMSG_CALENDAR_GUILD_FILTER = 0x3601,
+ CMSG_CALENDAR_REMOVE_EVENT = 0x3607,
+ CMSG_CALENDAR_REMOVE_INVITE = 0x3603,
+ CMSG_CALENDAR_UPDATE_EVENT = 0x360E,
+ CMSG_CANCEL_AURA = 0x3126,
+ CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x344F,
+ CMSG_CANCEL_CAST = 0x31EB,
+ CMSG_CANCEL_CHANNELLING = 0x31BF,
+ CMSG_CANCEL_GROWTH_AURA = 0x31C4,
+ CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3172,
+ CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x3125,
+ CMSG_CANCEL_MOUNT_AURA = 0x31D5,
+ CMSG_CANCEL_QUEUED_SPELL = 0x30FC,
+ CMSG_CANCEL_TEMP_ENCHANTMENT = 0x345C,
+ CMSG_CANCEL_TRADE = 0x30DA,
+ CMSG_CAN_DUEL = 0x35EE,
+ CMSG_CAST_SPELL = 0x31E9,
+ CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x300D,
+ CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x300C,
+ CMSG_CHANGE_BAG_SLOT_FLAG = 0x3265,
+ CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3247,
+ CMSG_CHANGE_SUB_GROUP = 0x35D3,
+ CMSG_CHARACTER_RENAME_REQUEST = 0x364F,
+ CMSG_CHAR_CUSTOMIZE = 0x361E,
+ CMSG_CHAR_DELETE = 0x362B,
+ CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3624,
+ CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x374E,
+ CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x3752,
+ CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x3775,
+ CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x3754,
+ CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x3771,
+ CMSG_CHAT_ADDON_MESSAGE_RAID = 0x3773,
+ CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x3750,
+ CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x3765,
+ CMSG_CHAT_CHANNEL_BAN = 0x3763,
+ CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x376C,
+ CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x3758,
+ CMSG_CHAT_CHANNEL_INVITE = 0x3761,
+ CMSG_CHAT_CHANNEL_KICK = 0x3762,
+ CMSG_CHAT_CHANNEL_LIST = 0x3757,
+ CMSG_CHAT_CHANNEL_MODERATE = 0x375C,
+ CMSG_CHAT_CHANNEL_MODERATOR = 0x375D,
+ CMSG_CHAT_CHANNEL_MUTE = 0x375F,
+ CMSG_CHAT_CHANNEL_OWNER = 0x375B,
+ CMSG_CHAT_CHANNEL_PASSWORD = 0x3759,
+ CMSG_CHAT_CHANNEL_SET_OWNER = 0x375A,
+ CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x3768,
+ CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x3766,
+ CMSG_CHAT_CHANNEL_UNBAN = 0x3764,
+ CMSG_CHAT_CHANNEL_UNMODERATOR = 0x375E,
+ CMSG_CHAT_CHANNEL_UNMUTE = 0x3760,
+ CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x3769,
+ CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x3767,
+ CMSG_CHAT_CHANNEL_VOICE_OFF = 0x376B,
+ CMSG_CHAT_CHANNEL_VOICE_ON = 0x376A,
+ CMSG_CHAT_JOIN_CHANNEL = 0x3746,
+ CMSG_CHAT_LEAVE_CHANNEL = 0x3747,
+ CMSG_CHAT_MESSAGE_AFK = 0x3755,
+ CMSG_CHAT_MESSAGE_CHANNEL = 0x374D,
+ CMSG_CHAT_MESSAGE_DND = 0x3756,
+ CMSG_CHAT_MESSAGE_EMOTE = 0x376E,
+ CMSG_CHAT_MESSAGE_GUILD = 0x3751,
+ CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x3774,
+ CMSG_CHAT_MESSAGE_OFFICER = 0x3753,
+ CMSG_CHAT_MESSAGE_PARTY = 0x3770,
+ CMSG_CHAT_MESSAGE_RAID = 0x3772,
+ CMSG_CHAT_MESSAGE_RAID_WARNING = 0x3776,
+ CMSG_CHAT_MESSAGE_SAY = 0x376D,
+ CMSG_CHAT_MESSAGE_WHISPER = 0x374F,
+ CMSG_CHAT_MESSAGE_YELL = 0x376F,
+ CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x374B,
+ CMSG_CHAT_REPORT_FILTERED = 0x374A,
+ CMSG_CHAT_REPORT_IGNORED = 0x3749,
+ CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x374C,
+ CMSG_CHECK_RAF_EMAIL_ENABLED = 0x3659,
+ CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x3678,
+ CMSG_CHOICE_RESPONSE = 0x31ED,
+ CMSG_CLEAR_RAID_MARKER = 0x311E,
+ CMSG_CLEAR_TRADE_ITEM = 0x30DC,
+ CMSG_CLIENT_PORT_GRAVEYARD = 0x348E,
+ CMSG_CLOSE_INTERACTION = 0x3405,
+ CMSG_COMMENTATOR_ENABLE = 0x3673,
+ CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3573,
+ CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3574,
+ CMSG_COMMENTATOR_GET_MAP_INFO = 0x3571,
+ CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3572,
+ CMSG_COMMENTATOR_START_WARGAME = 0x356F,
+ CMSG_COMPLAINT = 0x35FC,
+ CMSG_COMPLETE_CINEMATIC = 0x34AB,
+ CMSG_COMPLETE_MOVIE = 0x3446,
+ CMSG_CONFIRM_RESPEC_WIPE = 0x316C,
+ CMSG_CONNECT_TO_FAILED = 0x3552,
+ CMSG_CONVERT_RAID = 0x35D5,
+ CMSG_CREATE_CHARACTER = 0x35CA,
+ CMSG_CREATE_SHIPMENT = 0x3236,
+ CMSG_DB_QUERY_BULK = 0x3566,
+ CMSG_DECLINE_GUILD_INVITES = 0x3487,
+ CMSG_DECLINE_PETITION = 0x349A,
+ CMSG_DELETE_EQUIPMENT_SET = 0x3478,
+ CMSG_DEL_FRIEND = 0x365F,
+ CMSG_DEL_IGNORE = 0x3663,
+ CMSG_DEPOSIT_REAGENT_BANK = 0x326E,
+ CMSG_DESTROY_ITEM = 0x31E0,
+ CMSG_DF_BOOT_PLAYER_VOTE = 0x359B,
+ CMSG_DF_GET_JOIN_STATUS = 0x3597,
+ CMSG_DF_GET_SYSTEM_INFO = 0x3596,
+ CMSG_DF_JOIN = 0x3588,
+ CMSG_DF_LEAVE = 0x3593,
+ CMSG_DF_PROPOSAL_RESPONSE = 0x3587,
+ CMSG_DF_READY_CHECK_RESPONSE = 0x359E,
+ CMSG_DF_SEARCH_JOIN = 0x3594,
+ CMSG_DF_SEARCH_LEAVE = 0x3595,
+ CMSG_DF_SET_COMMENT = 0x3598,
+ CMSG_DF_SET_ROLES = 0x3599,
+ CMSG_DF_TELEPORT = 0x359C,
+ CMSG_DISCARDED_TIME_SYNC_ACKS = 0x39B4,
+ CMSG_DISMISS_CRITTER = 0x3465,
+ CMSG_DO_MASTER_LOOT_ROLL = 0x3171,
+ CMSG_DO_READY_CHECK = 0x35BA,
+ CMSG_DUEL_RESPONSE = 0x344B,
+ CMSG_EJECT_PASSENGER = 0x3198,
+ CMSG_EMOTE = 0x34A7,
+ CMSG_ENABLE_NAGLE = 0x36E8,
+ CMSG_ENABLE_TAXI_NODE = 0x341D,
+ CMSG_ENGINE_SURVEY = 0x3672,
+ CMSG_ENUM_CHARACTERS = 0x3568,
+ CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x366C,
+ CMSG_FAR_SIGHT = 0x3450,
+ CMSG_GAME_OBJ_REPORT_USE = 0x3459,
+ CMSG_GAME_OBJ_USE = 0x3458,
+ CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x3227,
+ CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x3219,
+ CMSG_GARRISON_CHECK_UPGRADEABLE = 0x3261,
+ CMSG_GARRISON_COMPLETE_MISSION = 0x3254,
+ CMSG_GARRISON_GENERATE_RECRUITS = 0x322A,
+ CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x3232,
+ CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3256,
+ CMSG_GARRISON_PURCHASE_BUILDING = 0x3215,
+ CMSG_GARRISON_RECRUIT_FOLLOWER = 0x322C,
+ CMSG_GARRISON_REMOVE_FOLLOWER = 0x324B,
+ CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x3228,
+ CMSG_GARRISON_RENAME_FOLLOWER = 0x3229,
+ CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x3214,
+ CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x3235,
+ CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x3234,
+ CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x3216,
+ CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x3226,
+ CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x3222,
+ CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x322B,
+ CMSG_GARRISON_START_MISSION = 0x3253,
+ CMSG_GARRISON_SWAP_BUILDINGS = 0x321A,
+ CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x3567,
+ CMSG_GET_CHALLENGE_MODE_REWARDS = 0x300F,
+ CMSG_GET_GARRISON_INFO = 0x320F,
+ CMSG_GET_ITEM_PURCHASE_DATA = 0x3495,
+ CMSG_GET_MIRROR_IMAGE_DATA = 0x31E4,
+ CMSG_GET_PVP_OPTIONS_ENABLED = 0x356E,
+ CMSG_GET_REMAINING_GAME_TIME = 0x367B,
+ CMSG_GET_TROPHY_LIST = 0x3244,
+ CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x366E,
+ CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3622,
+ CMSG_GM_TICKET_GET_CASE_STATUS = 0x3621,
+ CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3620,
+ CMSG_GOSSIP_SELECT_OPTION = 0x3406,
+ CMSG_GRANT_LEVEL = 0x3461,
+ CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x300B,
+ CMSG_GUILD_ADD_RANK = 0x2FE2,
+ CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x2FDD,
+ CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x2FDF,
+ CMSG_GUILD_BANK_ACTIVATE = 0x342A,
+ CMSG_GUILD_BANK_BUY_TAB = 0x342D,
+ CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x342F,
+ CMSG_GUILD_BANK_LOG_QUERY = 0x3000,
+ CMSG_GUILD_BANK_QUERY_TAB = 0x342C,
+ CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3001,
+ CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3004,
+ CMSG_GUILD_BANK_SWAP_ITEMS = 0x342B,
+ CMSG_GUILD_BANK_TEXT_QUERY = 0x3005,
+ CMSG_GUILD_BANK_UPDATE_TAB = 0x342E,
+ CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3430,
+ CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x2FF9,
+ CMSG_GUILD_CHANGE_NAME_REQUEST = 0x2FFC,
+ CMSG_GUILD_DECLINE_INVITATION = 0x2FDE,
+ CMSG_GUILD_DELETE = 0x2FE6,
+ CMSG_GUILD_DELETE_RANK = 0x2FE3,
+ CMSG_GUILD_DEMOTE_MEMBER = 0x2FDC,
+ CMSG_GUILD_EVENT_LOG_QUERY = 0x3003,
+ CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x2FEF,
+ CMSG_GUILD_GET_RANKS = 0x2FEB,
+ CMSG_GUILD_GET_ROSTER = 0x2FF1,
+ CMSG_GUILD_INVITE_BY_NAME = 0x3586,
+ CMSG_GUILD_LEAVE = 0x2FE0,
+ CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x300A,
+ CMSG_GUILD_NEWS_UPDATE_STICKY = 0x2FEC,
+ CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x2FE1,
+ CMSG_GUILD_PERMISSIONS_QUERY = 0x3002,
+ CMSG_GUILD_PROMOTE_MEMBER = 0x2FDB,
+ CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x2FE9,
+ CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x2FE7,
+ CMSG_GUILD_QUERY_NEWS = 0x2FEA,
+ CMSG_GUILD_QUERY_RECIPES = 0x2FE8,
+ CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3006,
+ CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x2FED,
+ CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x2FEE,
+ CMSG_GUILD_SET_GUILD_MASTER = 0x3653,
+ CMSG_GUILD_SET_MEMBER_NOTE = 0x2FF0,
+ CMSG_GUILD_SET_RANK_PERMISSIONS = 0x2FE5,
+ CMSG_GUILD_SHIFT_RANK = 0x2FE4,
+ CMSG_GUILD_UPDATE_INFO_TEXT = 0x2FF3,
+ CMSG_GUILD_UPDATE_MOTD_TEXT = 0x2FF2,
+ CMSG_HEARTH_AND_RESURRECT = 0x3474,
+ CMSG_IGNORE_TRADE = 0x30D7,
+ CMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x3169,
+ CMSG_INITIATE_ROLE_POLL = 0x3557,
+ CMSG_INITIATE_TRADE = 0x30D4,
+ CMSG_INSPECT = 0x3490,
+ CMSG_INSPECT_PVP = 0x3631,
+ CMSG_INSTANCE_LOCK_RESPONSE = 0x3479,
+ CMSG_ITEM_PURCHASE_REFUND = 0x3496,
+ CMSG_ITEM_TEXT_QUERY = 0x3262,
+ CMSG_JOIN_PET_BATTLE_QUEUE = 0x3143,
+ CMSG_JOIN_RATED_BATTLEGROUND = 0x30F4,
+ CMSG_KEEP_ALIVE = 0x360F,
+ CMSG_KEYBOUND_OVERRIDE = 0x3183,
+ CMSG_LEARN_PET_SPECIALIZATION_GROUP = 0x3124,
+ CMSG_LEARN_TALENTS = 0x3123,
+ CMSG_LEAVE_GROUP = 0x35D0,
+ CMSG_LEAVE_PET_BATTLE_QUEUE = 0x3144,
+ CMSG_LFG_LIST_APPLY_TO_GROUP = 0x358E,
+ CMSG_LFG_LIST_CANCEL_APPLICATION = 0x358F,
+ CMSG_LFG_LIST_DECLINE_APPLICANT = 0x3590,
+ CMSG_LFG_LIST_GET_STATUS = 0x358C,
+ CMSG_LFG_LIST_INVITE_APPLICANT = 0x3591,
+ CMSG_LFG_LIST_INVITE_RESPONSE = 0x3592,
+ CMSG_LFG_LIST_JOIN = 0x3589,
+ CMSG_LFG_LIST_LEAVE = 0x358B,
+ CMSG_LFG_LIST_SEARCH = 0x358D,
+ CMSG_LFG_LIST_UPDATE_REQUEST = 0x358A,
+ CMSG_LF_GUILD_ADD_RECRUIT = 0x35A3,
+ CMSG_LF_GUILD_BROWSE = 0x35A5,
+ CMSG_LF_GUILD_DECLINE_RECRUIT = 0x2FF6,
+ CMSG_LF_GUILD_GET_APPLICATIONS = 0x2FF7,
+ CMSG_LF_GUILD_GET_GUILD_POST = 0x2FF4,
+ CMSG_LF_GUILD_GET_RECRUITS = 0x2FF5,
+ CMSG_LF_GUILD_REMOVE_RECRUIT = 0x2FF8,
+ CMSG_LF_GUILD_SET_GUILD_POST = 0x35A4,
+ CMSG_LIST_INVENTORY = 0x3415,
+ CMSG_LOADING_SCREEN_NOTIFY = 0x3577,
+ CMSG_LOAD_SELECTED_TROPHY = 0x3245,
+ CMSG_LOGOUT_CANCEL = 0x3441,
+ CMSG_LOGOUT_INSTANT = 0x3442,
+ CMSG_LOGOUT_REQUEST = 0x3440,
+ CMSG_LOG_DISCONNECT = 0x36E6,
+ CMSG_LOG_STREAMING_ERROR = 0x36EA,
+ CMSG_LOOT_ITEM = 0x316F,
+ CMSG_LOOT_MONEY = 0x316E,
+ CMSG_LOOT_RELEASE = 0x3173,
+ CMSG_LOOT_ROLL = 0x3174,
+ CMSG_LOOT_UNIT = 0x316D,
+ CMSG_LOW_LEVEL_RAID1 = 0x362F,
+ CMSG_LOW_LEVEL_RAID2 = 0x347F,
+ CMSG_MAIL_CREATE_TEXT_ITEM = 0x34A1,
+ CMSG_MAIL_DELETE = 0x3185,
+ CMSG_MAIL_GET_LIST = 0x349C,
+ CMSG_MAIL_MARK_AS_READ = 0x34A0,
+ CMSG_MAIL_RETURN_TO_SENDER = 0x35DF,
+ CMSG_MAIL_TAKE_ITEM = 0x349E,
+ CMSG_MAIL_TAKE_MONEY = 0x349D,
+ CMSG_MASTER_LOOT_ITEM = 0x3170,
+ CMSG_MINIMAP_PING = 0x35D2,
+ CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3107,
+ CMSG_MOUNT_SET_FAVORITE = 0x35B8,
+ CMSG_MOUNT_SPECIAL_ANIM = 0x31D6,
+ CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x398C,
+ CMSG_MOVE_CHANGE_TRANSPORT = 0x39A4,
+ CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x39A9,
+ CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x3972,
+ CMSG_MOVE_DISMISS_VEHICLE = 0x39A8,
+ CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3993,
+ CMSG_MOVE_FALL_LAND = 0x3975,
+ CMSG_MOVE_FALL_RESET = 0x3990,
+ CMSG_MOVE_FEATHER_FALL_ACK = 0x3985,
+ CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x398A,
+ CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x3983,
+ CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x39B5,
+ CMSG_MOVE_FORCE_ROOT_ACK = 0x3986,
+ CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x39AA,
+ CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3982,
+ CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3992,
+ CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x39A3,
+ CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3996,
+ CMSG_MOVE_FORCE_UNROOT_ACK = 0x399A,
+ CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x3997,
+ CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x3998,
+ CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x399C,
+ CMSG_MOVE_HEARTBEAT = 0x3987,
+ CMSG_MOVE_HOVER_ACK = 0x399B,
+ CMSG_MOVE_JUMP = 0x3968,
+ CMSG_MOVE_KNOCK_BACK_ACK = 0x39AB,
+ CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x398E,
+ CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x398D,
+ CMSG_MOVE_SET_CAN_FLY_ACK = 0x3984,
+ CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x3999,
+ CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x39AE,
+ CMSG_MOVE_SET_FACING = 0x3980,
+ CMSG_MOVE_SET_FLY = 0x399D,
+ CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x39A7,
+ CMSG_MOVE_SET_PITCH = 0x3981,
+ CMSG_MOVE_SET_RELATIVE_POSITION = 0x3973,
+ CMSG_MOVE_SET_RUN_MODE = 0x396F,
+ CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x398B,
+ CMSG_MOVE_SET_WALK_MODE = 0x3970,
+ CMSG_MOVE_SPLINE_DONE = 0x398F,
+ CMSG_MOVE_START_ASCEND = 0x399E,
+ CMSG_MOVE_START_BACKWARD = 0x3963,
+ CMSG_MOVE_START_DESCEND = 0x39A5,
+ CMSG_MOVE_START_FORWARD = 0x3962,
+ CMSG_MOVE_START_PITCH_DOWN = 0x396D,
+ CMSG_MOVE_START_PITCH_UP = 0x396C,
+ CMSG_MOVE_START_STRAFE_LEFT = 0x3965,
+ CMSG_MOVE_START_STRAFE_RIGHT = 0x3966,
+ CMSG_MOVE_START_SWIM = 0x3976,
+ CMSG_MOVE_START_TURN_LEFT = 0x3969,
+ CMSG_MOVE_START_TURN_RIGHT = 0x396A,
+ CMSG_MOVE_STOP = 0x3964,
+ CMSG_MOVE_STOP_ASCEND = 0x399F,
+ CMSG_MOVE_STOP_PITCH = 0x396E,
+ CMSG_MOVE_STOP_STRAFE = 0x3967,
+ CMSG_MOVE_STOP_SWIM = 0x3977,
+ CMSG_MOVE_STOP_TURN = 0x396B,
+ CMSG_MOVE_TELEPORT_ACK = 0x3974,
+ CMSG_MOVE_TELEPORT_CHEAT = 0x3971,
+ CMSG_MOVE_TIME_SKIPPED = 0x3991,
+ CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x397F,
+ CMSG_MOVE_WATER_WALK_ACK = 0x3989,
+ CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x3139,
+ CMSG_NEXT_CINEMATIC_CAMERA = 0x34AA,
+ CMSG_OBJECT_UPDATE_FAILED = 0x30FD,
+ CMSG_OBJECT_UPDATE_RESCUED = 0x30FE,
+ CMSG_OFFER_PETITION = 0x3640,
+ CMSG_OPENING_CINEMATIC = 0x34A9,
+ CMSG_OPEN_ITEM = 0x3263,
+ CMSG_OPEN_MISSION_NPC = 0x322E,
+ CMSG_OPEN_SHIPMENT_NPC = 0x3233,
+ CMSG_OPEN_TRADESKILL_NPC = 0x323B,
+ CMSG_OPT_OUT_OF_LOOT = 0x3460,
+ CMSG_PARTY_INVITE = 0x3581,
+ CMSG_PARTY_INVITE_RESPONSE = 0x3582,
+ CMSG_PARTY_UNINVITE = 0x35CE,
+ CMSG_PETITION_BUY = 0x3432,
+ CMSG_PETITION_RENAME_GUILD = 0x3654,
+ CMSG_PETITION_SHOW_LIST = 0x3431,
+ CMSG_PETITION_SHOW_SIGNATURES = 0x3433,
+ CMSG_PET_ABANDON = 0x33FF,
+ CMSG_PET_ACTION = 0x33FD,
+ CMSG_PET_BATTLE_FINAL_NOTIFY = 0x3147,
+ CMSG_PET_BATTLE_INPUT = 0x35C7,
+ CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3184,
+ CMSG_PET_BATTLE_QUIT_NOTIFY = 0x3146,
+ CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x35C8,
+ CMSG_PET_BATTLE_REQUEST_PVP = 0x3141,
+ CMSG_PET_BATTLE_REQUEST_UPDATE = 0x3142,
+ CMSG_PET_BATTLE_REQUEST_WILD = 0x313F,
+ CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x3148,
+ CMSG_PET_CANCEL_AURA = 0x3400,
+ CMSG_PET_CAST_SPELL = 0x31E8,
+ CMSG_PET_RENAME = 0x3615,
+ CMSG_PET_SET_ACTION = 0x33FC,
+ CMSG_PET_SPELL_AUTOCAST = 0x3401,
+ CMSG_PET_STOP_ATTACK = 0x33FE,
+ CMSG_PING = 0x36E5,
+ CMSG_PLAYER_LOGIN = 0x356A,
+ CMSG_PROTOCOL_MISMATCH = 0x36EB,
+ CMSG_PUSH_QUEST_TO_PARTY = 0x3413,
+ CMSG_PVP_LOG_DATA = 0x30F8,
+ CMSG_QUERY_BATTLE_PET_NAME = 0x31CB,
+ CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x35EC,
+ CMSG_QUERY_CORPSE_TRANSPORT = 0x35ED,
+ CMSG_QUERY_COUNTDOWN_TIMER = 0x3121,
+ CMSG_QUERY_CREATURE = 0x31C5,
+ CMSG_QUERY_GAME_OBJECT = 0x31C6,
+ CMSG_QUERY_GARRISON_CREATURE_NAME = 0x31CC,
+ CMSG_QUERY_GUILD_INFO = 0x361D,
+ CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x346F,
+ CMSG_QUERY_NEXT_MAIL_TIME = 0x349F,
+ CMSG_QUERY_NPC_TEXT = 0x31C7,
+ CMSG_QUERY_PAGE_TEXT = 0x31C9,
+ CMSG_QUERY_PETITION = 0x31CD,
+ CMSG_QUERY_PET_NAME = 0x31CA,
+ CMSG_QUERY_PLAYER_NAME = 0x361B,
+ CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x30F1,
+ CMSG_QUERY_QUEST_INFO = 0x31C8,
+ CMSG_QUERY_REALM_NAME = 0x361C,
+ CMSG_QUERY_SCENARIO_POI = 0x35E0,
+ CMSG_QUERY_TIME = 0x343F,
+ CMSG_QUERY_VOID_STORAGE = 0x311A,
+ CMSG_QUEST_CONFIRM_ACCEPT = 0x3412,
+ CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x340B,
+ CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x340E,
+ CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x340C,
+ CMSG_QUEST_GIVER_HELLO = 0x3408,
+ CMSG_QUEST_GIVER_QUERY_QUEST = 0x3409,
+ CMSG_QUEST_GIVER_REQUEST_REWARD = 0x340F,
+ CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x3411,
+ CMSG_QUEST_GIVER_STATUS_QUERY = 0x3410,
+ CMSG_QUEST_LOG_REMOVE_QUEST = 0x3494,
+ CMSG_QUEST_POI_QUERY = 0x3641,
+ CMSG_QUEST_PUSH_RESULT = 0x3414,
+ CMSG_QUEUED_MESSAGES_END = 0x36E9,
+ CMSG_RANDOM_ROLL = 0x35DB,
+ CMSG_READY_CHECK_RESPONSE = 0x35BB,
+ CMSG_READ_ITEM = 0x3264,
+ CMSG_RECLAIM_CORPSE = 0x3444,
+ CMSG_RECRUIT_A_FRIEND = 0x365A,
+ CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x367D,
+ CMSG_REDEEM_WOW_TOKEN_START = 0x367C,
+ CMSG_REORDER_CHARACTERS = 0x3569,
+ CMSG_REPAIR_ITEM = 0x3454,
+ CMSG_REPLACE_TROPHY = 0x3246,
+ CMSG_REPOP_REQUEST = 0x348D,
+ CMSG_REPORT_PVP_PLAYER_AFK = 0x345E,
+ CMSG_REQUEST_ACCOUNT_DATA = 0x3625,
+ CMSG_REQUEST_BATTLEFIELD_STATUS = 0x355C,
+ CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x30FA,
+ CMSG_REQUEST_CEMETERY_LIST = 0x30F2,
+ CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x31FF,
+ CMSG_REQUEST_FORCED_REACTIONS = 0x3168,
+ CMSG_REQUEST_GUILD_PARTY_STATE = 0x3120,
+ CMSG_REQUEST_GUILD_REWARDS_LIST = 0x311F,
+ CMSG_REQUEST_HONOR_STATS = 0x30F7,
+ CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x31EF,
+ CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x3576,
+ CMSG_REQUEST_PARTY_MEMBER_STATS = 0x35DA,
+ CMSG_REQUEST_PET_INFO = 0x3402,
+ CMSG_REQUEST_PLAYED_TIME = 0x31D1,
+ CMSG_REQUEST_PVP_REWARDS = 0x310E,
+ CMSG_REQUEST_RAID_INFO = 0x3655,
+ CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x3564,
+ CMSG_REQUEST_RESEARCH_HISTORY = 0x30E5,
+ CMSG_REQUEST_STABLED_PETS = 0x3403,
+ CMSG_REQUEST_VEHICLE_EXIT = 0x3193,
+ CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x3194,
+ CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3195,
+ CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x3196,
+ CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x3675,
+ CMSG_RESET_CHALLENGE_MODE = 0x3166,
+ CMSG_RESET_INSTANCES = 0x35F8,
+ CMSG_RESURRECT_RESPONSE = 0x3614,
+ CMSG_REVERT_MONUMENT_APPEARANCE = 0x3248,
+ CMSG_RIDE_VEHICLE_INTERACT = 0x3197,
+ CMSG_SAVE_CUF_PROFILES = 0x3108,
+ CMSG_SAVE_EQUIPMENT_SET = 0x3477,
+ CMSG_SAVE_GUILD_EMBLEM = 0x31F4,
+ CMSG_SCENE_PLAYBACK_CANCELED = 0x3180,
+ CMSG_SCENE_PLAYBACK_COMPLETE = 0x317F,
+ CMSG_SCENE_TRIGGER_EVENT = 0x3181,
+ CMSG_SELF_RES = 0x3497,
+ CMSG_SELL_ITEM = 0x3416,
+ CMSG_SELL_WOW_TOKEN_CONFIRM = 0x3677,
+ CMSG_SELL_WOW_TOKEN_START = 0x3676,
+ CMSG_SEND_CONTACT_LIST = 0x365D,
+ CMSG_SEND_MAIL = 0x3579,
+ CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x35A8,
+ CMSG_SEND_TEXT_EMOTE = 0x33F9,
+ CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x3186,
+ CMSG_SET_ACTION_BAR_TOGGLES = 0x3498,
+ CMSG_SET_ACTION_BUTTON = 0x35BC,
+ CMSG_SET_ACTIVE_MOVER = 0x39AF,
+ CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x35DC,
+ CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x3200,
+ CMSG_SET_ASSISTANT_LEADER = 0x35D6,
+ CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3267,
+ CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3268,
+ CMSG_SET_BANK_BAG_SLOT_FLAG = 0x3266,
+ CMSG_SET_CONTACT_NOTES = 0x3660,
+ CMSG_SET_CURRENCY_FLAGS = 0x30E7,
+ CMSG_SET_DIFFICULTY_ID = 0x3182,
+ CMSG_SET_DUNGEON_DIFFICULTY = 0x3612,
+ CMSG_SET_EVERYONE_IS_ASSISTANT = 0x359D,
+ CMSG_SET_FACTION_AT_WAR = 0x3447,
+ CMSG_SET_FACTION_INACTIVE = 0x3449,
+ CMSG_SET_FACTION_NOT_AT_WAR = 0x3448,
+ CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x326A,
+ CMSG_SET_LFG_BONUS_FACTION_ID = 0x31EE,
+ CMSG_SET_LOOT_METHOD = 0x35CF,
+ CMSG_SET_LOOT_SPECIALIZATION = 0x34A5,
+ CMSG_SET_PARTY_ASSIGNMENT = 0x35D8,
+ CMSG_SET_PARTY_LEADER = 0x35D1,
+ CMSG_SET_PET_SLOT = 0x30E6,
+ CMSG_SET_PLAYER_DECLINED_NAMES = 0x361A,
+ CMSG_SET_PREFERRED_CEMETERY = 0x30F3,
+ CMSG_SET_PVP = 0x31F8,
+ CMSG_SET_RAID_DIFFICULTY = 0x366A,
+ CMSG_SET_ROLE = 0x3556,
+ CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3618,
+ CMSG_SET_SELECTION = 0x348F,
+ CMSG_SET_SHEATHED = 0x33FA,
+ CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3269,
+ CMSG_SET_SPECIALIZATION = 0x3122,
+ CMSG_SET_TAXI_BENCHMARK_MODE = 0x345D,
+ CMSG_SET_TITLE = 0x31D4,
+ CMSG_SET_TRADE_CURRENCY = 0x30DE,
+ CMSG_SET_TRADE_GOLD = 0x30DD,
+ CMSG_SET_TRADE_ITEM = 0x30DB,
+ CMSG_SET_USING_PARTY_GARRISON = 0x322F,
+ CMSG_SET_WATCHED_FACTION = 0x344A,
+ CMSG_SHOWING_CLOAK = 0x3456,
+ CMSG_SHOWING_HELM = 0x3455,
+ CMSG_SHOW_TRADE_SKILL = 0x3650,
+ CMSG_SIGN_PETITION = 0x3499,
+ CMSG_SILENCE_PARTY_TALKER = 0x35D9,
+ CMSG_SOCKET_GEMS = 0x3453,
+ CMSG_SORT_BAGS = 0x326B,
+ CMSG_SORT_BANK_BAGS = 0x326C,
+ CMSG_SORT_REAGENT_BANK_BAGS = 0x326D,
+ CMSG_SPELL_CLICK = 0x3407,
+ CMSG_SPIRIT_HEALER_ACTIVATE = 0x3423,
+ CMSG_SPLIT_ITEM = 0x391C,
+ CMSG_STAND_STATE_CHANGE = 0x3106,
+ CMSG_START_SPECTATOR_WAR_GAME = 0x355F,
+ CMSG_START_WAR_GAME = 0x355E,
+ CMSG_SUMMON_RESPONSE = 0x35FA,
+ CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x35CC,
+ CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x35CB,
+ CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x35CD,
+ CMSG_SUSPEND_COMMS_ACK = 0x36E2,
+ CMSG_SUSPEND_TOKEN_RESPONSE = 0x36E7,
+ CMSG_SWAP_INV_ITEM = 0x391B,
+ CMSG_SWAP_ITEM = 0x391A,
+ CMSG_SWAP_SUB_GROUPS = 0x35D4,
+ CMSG_SWAP_VOID_ITEM = 0x311C,
+ CMSG_TABARD_VENDOR_ACTIVATE = 0x31F5,
+ CMSG_TALK_TO_GOSSIP = 0x3404,
+ CMSG_TAXI_NODE_STATUS_QUERY = 0x341C,
+ CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x341E,
+ CMSG_TAXI_REQUEST_EARLY_LANDING = 0x3420,
+ CMSG_TELEPORT_TO_UNIT = 0x35F1,
+ CMSG_TIME_ADJUSTMENT_RESPONSE = 0x39B3,
+ CMSG_TIME_SYNC_RESPONSE = 0x39B0,
+ CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x39B2,
+ CMSG_TIME_SYNC_RESPONSE_FAILED = 0x39B1,
+ CMSG_TOGGLE_DIFFICULTY = 0x35E1,
+ CMSG_TOGGLE_PVP = 0x31F7,
+ CMSG_TOTEM_DESTROYED = 0x3464,
+ CMSG_TOY_SET_FAVORITE = 0x35B9,
+ CMSG_TRAINER_BUY_SPELL = 0x3422,
+ CMSG_TRAINER_LIST = 0x3421,
+ CMSG_TRANSMOGRIFY_ITEMS = 0x310F,
+ CMSG_TURN_IN_PETITION = 0x349B,
+ CMSG_TUTORIAL = 0x366B,
+ CMSG_TWITTER_CHECK_STATUS = 0x30A8,
+ CMSG_TWITTER_CONNECT = 0x30A5,
+ CMSG_TWITTER_DISCONNECT = 0x30A9,
+ CMSG_TWITTER_POST = 0x326F,
+ CMSG_UI_TIME_REQUEST = 0x362A,
+ CMSG_UNACCEPT_TRADE = 0x30D9,
+ CMSG_UNDELETE_CHARACTER = 0x366D,
+ CMSG_UNLEARN_SKILL = 0x344D,
+ CMSG_UNLEARN_SPECIALIZATION = 0x311D,
+ CMSG_UNLOCK_VOID_STORAGE = 0x3119,
+ CMSG_UPDATE_ACCOUNT_DATA = 0x3626,
+ CMSG_UPDATE_CLIENT_SETTINGS = 0x35F4,
+ CMSG_UPDATE_MISSILE_TRAJECTORY = 0x39B6,
+ CMSG_UPDATE_RAID_TARGET = 0x35D7,
+ CMSG_UPDATE_VAS_PURCHASE_STATES = 0x3682,
+ CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x367E,
+ CMSG_UPDATE_WOW_TOKEN_COUNT = 0x3674,
+ CMSG_UPGRADE_GARRISON = 0x3208,
+ CMSG_UPGRADE_ITEM = 0x3187,
+ CMSG_USED_FOLLOW = 0x3103,
+ CMSG_USE_CRITTER_ITEM = 0x319E,
+ CMSG_USE_EQUIPMENT_SET = 0x3913,
+ CMSG_USE_ITEM = 0x31E5,
+ CMSG_USE_TOY = 0x31E7,
+ CMSG_VIOLENCE_LEVEL = 0x3101,
+ CMSG_VOICE_ADD_IGNORE = 0x35DD,
+ CMSG_VOICE_DEL_IGNORE = 0x35DE,
+ CMSG_VOICE_SESSION_ENABLE = 0x3613,
+ CMSG_VOID_STORAGE_TRANSFER = 0x311B,
+ CMSG_WARDEN_DATA = 0x356C,
+ CMSG_WHO = 0x3611,
+ CMSG_WHO_IS = 0x3610,
+ CMSG_WORLD_PORT_RESPONSE = 0x3578,
+ CMSG_WORLD_TELEPORT = 0x3562,
+ CMSG_WRAP_ITEM = 0x3912,
};
enum OpcodeServer : uint32
{
- SMSG_ABORT_NEW_WORLD = 0x0E7C,
- SMSG_ACCOUNT_CRITERIA_UPDATE = 0x1A7F,
- SMSG_ACCOUNT_DATA_TIMES = 0x1773,
- SMSG_ACCOUNT_MOUNT_UPDATE = 0x1350,
- SMSG_ACCOUNT_TOYS_UPDATE = 0x1B44,
- SMSG_ACHIEVEMENT_DELETED = 0x1B63,
- SMSG_ACHIEVEMENT_EARNED = 0x0BE4,
- SMSG_ACTIVATE_TAXI_REPLY = 0x1A54,
- SMSG_ADDON_INFO = 0x026F,
- SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x1353,
- SMSG_ADD_ITEM_PASSIVE = 0x1358,
- SMSG_ADD_LOSS_OF_CONTROL = 0x1754,
- SMSG_ADD_RUNE_POWER = 0x0367,
- SMSG_ADJUST_SPLINE_DURATION = 0x0F57,
- SMSG_AE_LOOT_TARGETS = 0x0BF0,
- SMSG_AE_LOOT_TARGET_ACK = 0x06DC,
- SMSG_AI_REACTION = 0x135C,
- SMSG_ALL_ACCOUNT_CRITERIA = 0x0A60,
- SMSG_ALL_ACHIEVEMENT_DATA = 0x1B50,
- SMSG_ALL_GUILD_ACHIEVEMENTS = 0x154F,
- SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x1BC4,
- SMSG_AREA_SPIRIT_HEALER_TIME = 0x024C,
- SMSG_AREA_TRIGGER_DENIED = 0x03DF,
- SMSG_AREA_TRIGGER_NO_CORPSE = 0x1B43,
- SMSG_AREA_TRIGGER_RE_PATH = 0x065C,
- SMSG_AREA_TRIGGER_RE_SHAPE = 0x127B,
- SMSG_ARENA_ERROR = 0x02F3,
- SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x0F78,
- SMSG_ATTACKER_STATE_UPDATE = 0x0ACF,
- SMSG_ATTACK_START = 0x12CC,
- SMSG_ATTACK_STOP = 0x0F6B,
- SMSG_ATTACK_SWING_ERROR = 0x1A78,
- SMSG_ATTACK_SWING_LANDED_LOG = 0x16DB,
- SMSG_AUCTION_CLOSED_NOTIFICATION = 0x1BE0,
- SMSG_AUCTION_COMMAND_RESULT = 0x12F7,
- SMSG_AUCTION_HELLO_RESPONSE = 0x0E57,
- SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x027C,
- SMSG_AUCTION_LIST_ITEMS_RESULT = 0x1243,
- SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x0BCC,
- SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x1BEF,
- SMSG_AUCTION_OUTBID_NOTIFICATION = 0x1ACB,
- SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x02D7,
- SMSG_AUCTION_REPLICATE_RESPONSE = 0x0BD4,
- SMSG_AUCTION_WON_NOTIFICATION = 0x0A5C,
- SMSG_AURA_POINTS_DEPLETED = 0x00B0,
- SMSG_AURA_UPDATE = 0x10AF,
- SMSG_AUTH_CHALLENGE = 0x0307,
- SMSG_AUTH_RESPONSE = 0x1357,
- SMSG_AVAILABLE_VOICE_CHANNEL = 0x0205,
- SMSG_BARBER_SHOP_RESULT = 0x1348,
- SMSG_BATTLEFIELD_LIST = 0x0FEF,
- SMSG_BATTLEFIELD_PORT_DENIED = 0x0B70,
- SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x1AE4,
- SMSG_BATTLEFIELD_STATUS_FAILED = 0x0643,
- SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x0370,
- SMSG_BATTLEFIELD_STATUS_NONE = 0x165C,
- SMSG_BATTLEFIELD_STATUS_QUEUED = 0x0ADB,
- SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x175C,
- SMSG_BATTLEGROUND_INFO_THROTTLED = 0x1273,
- SMSG_BATTLEGROUND_INIT = 0x0AEC,
- SMSG_BATTLEGROUND_PLAYER_JOINED = 0x0E50,
- SMSG_BATTLEGROUND_PLAYER_LEFT = 0x1377,
- SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x16D8,
- SMSG_BATTLEGROUND_POINTS = 0x07F7,
- SMSG_BATTLENET_CHALLENGE_ABORT = 0x0648,
- SMSG_BATTLENET_CHALLENGE_START = 0x0657,
- SMSG_BATTLE_PAY_ACK_FAILED = 0x17DF,
- SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x16DC,
- SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x0263,
- SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x0E78,
- SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x0BEF,
- SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x17F0,
- SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x1674,
- SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x0A6B,
- SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x0A5B,
- SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x1B70,
- SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x0BC3,
- SMSG_BATTLE_PETS_HEALED = 0x1B5F,
- SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x1A74,
- SMSG_BATTLE_PET_DELETED = 0x17EC,
- SMSG_BATTLE_PET_ERROR = 0x1A7C,
- SMSG_BATTLE_PET_JOURNAL = 0x13E7,
- SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x1BCB,
- SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x13D7,
- SMSG_BATTLE_PET_LICENSE_CHANGED = 0x0247,
- SMSG_BATTLE_PET_RESTORED = 0x12DF,
- SMSG_BATTLE_PET_REVOKED = 0x0E47,
- SMSG_BATTLE_PET_TRAP_LEVEL = 0x13FB,
- SMSG_BATTLE_PET_UPDATES = 0x02FF,
- SMSG_BF_MGR_DROP_TIMER_CANCELLED = 0x0EC7,
- SMSG_BF_MGR_DROP_TIMER_STARTED = 0x025F,
- SMSG_BF_MGR_EJECTED = 0x1E43,
- SMSG_BF_MGR_EJECT_PENDING = 0x0747,
- SMSG_BF_MGR_ENTERING = 0x1AD0,
- SMSG_BF_MGR_ENTRY_INVITE = 0x02FB,
- SMSG_BF_MGR_QUEUE_INVITE = 0x1A48,
- SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0x0B4F,
- SMSG_BF_MGR_QUEUE_STATUS_UPDATE = 0x07FF,
- SMSG_BF_MGR_STATE_CHANGED = 0x0EE8,
- SMSG_BINDER_CONFIRM = 0x0A58,
- SMSG_BIND_POINT_UPDATE = 0x075B,
- SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x07E0,
- SMSG_BLACK_MARKET_OPEN_RESULT = 0x1760,
- SMSG_BLACK_MARKET_OUTBID = 0x164F,
- SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x0B68,
- SMSG_BLACK_MARKET_WON = 0x1780,
- SMSG_BONUS_ROLL_EMPTY = 0x1E44,
- SMSG_BOSS_KILL_CREDIT = 0x1743,
- SMSG_BREAK_TARGET = 0x1B00,
- SMSG_BUY_FAILED = 0x1258,
- SMSG_BUY_SUCCEEDED = 0x0357,
- SMSG_CACHE_VERSION = 0x1747,
- SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x02DC,
- SMSG_CALENDAR_COMMAND_RESULT = 0x0258,
- SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x0777,
- SMSG_CALENDAR_EVENT_INVITE = 0x02D0,
- SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x16C4,
- SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x0244,
- SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x0E70,
- SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x1748,
- SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x0AFB,
- SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x06E3,
- SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x1B68,
- SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x0280,
- SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x0BD7,
- SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x02D8,
- SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x0AD0,
- SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x0AC4,
- SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x1AC3,
- SMSG_CALENDAR_SEND_CALENDAR = 0x0F00,
- SMSG_CALENDAR_SEND_EVENT = 0x12F8,
- SMSG_CALENDAR_SEND_NUM_PENDING = 0x03C8,
- SMSG_CAMERA_SHAKE = 0x07CC,
- SMSG_CANCEL_AUTO_REPEAT = 0x1800,
- SMSG_CANCEL_COMBAT = 0x02DB,
- SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x11F8,
- SMSG_CANCEL_SCENE = 0x0BE3,
- SMSG_CANCEL_SPELL_VISUAL = 0x1440,
- SMSG_CANCEL_SPELL_VISUAL_KIT = 0x0167,
- SMSG_CAN_DUEL_RESULT = 0x16FB,
- SMSG_CAST_FAILED = 0x1138,
- SMSG_CATEGORY_COOLDOWN = 0x00FB,
- SMSG_CHALLEGE_MODE_REWARDS = 0x1A67,
- SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x1A58,
- SMSG_CHALLENGE_MODE_COMPLETE = 0x0773,
- SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x1B80,
- SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x067C,
- SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x0FE7,
- SMSG_CHALLENGE_MODE_RESET = 0x07DC,
- SMSG_CHALLENGE_MODE_START = 0x07CF,
- SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x066C,
- SMSG_CHANNEL_LIST = 0x0E05,
- SMSG_CHANNEL_NOTIFY = 0x038E,
- SMSG_CHANNEL_NOTIFY_JOINED = 0x020D,
- SMSG_CHANNEL_NOTIFY_LEFT = 0x0685,
- SMSG_CHARACTER_LOGIN_FAILED = 0x02C7,
- SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x1AF0,
- SMSG_CHARACTER_RENAME_RESULT = 0x0264,
- SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN = 0x07C4,
- SMSG_CHARACTER_UPGRADE_COMPLETE = 0x1764,
- SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x07EC,
- SMSG_CHARACTER_UPGRADE_STARTED = 0x02C8,
- SMSG_CHAR_CUSTOMIZE = 0x1263,
- SMSG_CHAR_CUSTOMIZE_FAILED = 0x1B6B,
- SMSG_CHAR_FACTION_CHANGE_RESULT = 0x0EF8,
- SMSG_CHAT = 0x068D,
- SMSG_CHAT_AUTO_RESPONDED = 0x0282,
- SMSG_CHAT_DOWN = 0x0B0A,
- SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x0B0D,
- SMSG_CHAT_IS_DOWN = 0x0381,
- SMSG_CHAT_NOT_IN_PARTY = 0x038D,
- SMSG_CHAT_PLAYER_AMBIGUOUS = 0x0A85,
- SMSG_CHAT_PLAYER_NOTFOUND = 0x0A0D,
- SMSG_CHAT_RECONNECT = 0x0609,
- SMSG_CHAT_RESTRICTED = 0x0B01,
- SMSG_CHAT_SERVER_MESSAGE = 0x0A01,
- SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x0563,
- SMSG_CHECK_WARGAME_ENTRY = 0x16F4,
- SMSG_CLEAR_ALL_SPELL_CHARGES = 0x10B3,
- SMSG_CLEAR_BOSS_EMOTES = 0x0FE8,
- SMSG_CLEAR_COOLDOWN = 0x0AC3,
- SMSG_CLEAR_COOLDOWNS = 0x0580,
- SMSG_CLEAR_LOSS_OF_CONTROL = 0x07EB,
- SMSG_CLEAR_SPELL_CHARGES = 0x10F3,
- SMSG_CLEAR_TARGET = 0x0E44,
- SMSG_COIN_REMOVED = 0x02E4,
- SMSG_COMBAT_EVENT_FAILED = 0x06C3,
- SMSG_COMMENTATOR_MAP_INFO = 0x0B44,
- SMSG_COMMENTATOR_PLAYER_INFO = 0x0B64,
- SMSG_COMMENTATOR_STATE_CHANGED = 0x07DF,
- SMSG_COMPLAINT_RESULT = 0x0F80,
- SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x0E6C,
- SMSG_CONNECT_TO = 0x0284,
- SMSG_CONQUEST_FORMULA_CONSTANTS = 0x026C,
- SMSG_CONSOLE_WRITE = 0x067F,
- SMSG_CONTACT_LIST = 0x1A6F,
- SMSG_CONTROL_UPDATE = 0x07D0,
- SMSG_CONVERT_RUNE = 0x0368,
- SMSG_COOLDOWN_CHEAT = 0x1658,
- SMSG_COOLDOWN_EVENT = 0x0BDB,
- SMSG_CORPSE_LOCATION = 0x12C3,
- SMSG_CORPSE_RECLAIM_DELAY = 0x1BC7,
- SMSG_CORPSE_TRANSPORT_QUERY = 0x03EC,
- SMSG_CREATE_CHAR = 0x0B5B,
- SMSG_CREATE_SHIPMENT_RESPONSE = 0x0EFF,
- SMSG_CRITERIA_DELETED = 0x0E53,
- SMSG_CRITERIA_UPDATE = 0x0667,
- SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x12EF,
- SMSG_CUSTOM_LOAD_SCREEN = 0x177C,
- SMSG_DAILY_QUESTS_RESET = 0x112D,
- SMSG_DAMAGE_CALC_LOG = 0x03F8,
- SMSG_DANCE_STUDIO_CREATE_RESULT = 0x1280,
- SMSG_DB_REPLY = 0x0E7B,
- SMSG_DEATH_RELEASE_LOC = 0x12FF,
- SMSG_DEFENSE_MESSAGE = 0x0686,
- SMSG_DELETE_CHAR = 0x13DF,
- SMSG_DESTROY_ARENA_UNIT = 0x037B,
- SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x03CC,
- SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x0BE7,
- SMSG_DISENCHANT_CREDIT = 0x0BD8,
- SMSG_DISMOUNT = 0x0AE0,
- SMSG_DISMOUNT_RESULT = 0x0680,
- SMSG_DISPEL_FAILED = 0x0073,
- SMSG_DISPLAY_GAME_ERROR = 0x13EF,
- SMSG_DISPLAY_PLAYER_CHOICE = 0x1BEB,
- SMSG_DISPLAY_PROMOTION = 0x164C,
- SMSG_DISPLAY_QUEST_POPUP = 0x0631,
- SMSG_DISPLAY_TOAST = 0x13C4,
- SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x1274,
- SMSG_DROP_NEW_CONNECTION = 0x0228,
- SMSG_DUEL_COMPLETE = 0x0B6F,
- SMSG_DUEL_COUNTDOWN = 0x03E8,
- SMSG_DUEL_IN_BOUNDS = 0x0AF4,
- SMSG_DUEL_OUT_OF_BOUNDS = 0x1254,
- SMSG_DUEL_REQUESTED = 0x07FB,
- SMSG_DUEL_WINNER = 0x0B78,
- SMSG_DURABILITY_DAMAGE_DEATH = 0x1AD8,
- SMSG_EMOTE = 0x06C4,
- SMSG_ENABLE_BARBER_SHOP = 0x1774,
- SMSG_ENCHANTMENT_LOG = 0x16CF,
- SMSG_ENCOUNTER_END = 0x1AE8,
- SMSG_ENCOUNTER_START = 0x0F5B,
- SMSG_ENUM_CHARACTERS_RESULT = 0x17D8,
- SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x10EC,
- SMSG_EQUIPMENT_SET_ID = 0x1AC7,
- SMSG_EXPECTED_SPAM_RECORDS = 0x0386,
- SMSG_EXPLORATION_EXPERIENCE = 0x0780,
- SMSG_FACTION_BONUS_INFO = 0x1248,
- SMSG_FAILED_PLAYER_CONDITION = 0x035C,
- SMSG_FEATURE_SYSTEM_STATUS = 0x1AC4,
- SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x0753,
- SMSG_FEIGN_DEATH_RESISTED = 0x174B,
- SMSG_FISH_ESCAPED = 0x0AF0,
- SMSG_FISH_NOT_HOOKED = 0x13FF,
- SMSG_FLIGHT_SPLINE_SYNC = 0x09E1,
- SMSG_FORCED_DEATH_UPDATE = 0x074C,
- SMSG_FORCE_ANIM = 0x0E4B,
- SMSG_FORCE_OBJECT_RELINK = 0x0A4B,
- SMSG_FRIEND_STATUS = 0x17EB,
- SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x0EDC,
- SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x1ACC,
- SMSG_GAME_OBJECT_DESPAWN = 0x137F,
- SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x0473,
- SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x10E3,
- SMSG_GAME_OBJECT_RESET_STATE = 0x02EB,
- SMSG_GAME_OBJECT_UI_ACTION = 0x17CB,
- SMSG_GAME_SPEED_SET = 0x0678,
- SMSG_GAME_TIME_SET = 0x1768,
- SMSG_GAME_TIME_UPDATE = 0x16F0,
- SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x113A,
- SMSG_GARRISON_ADD_MISSION_RESULT = 0x1135,
- SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x1931,
- SMSG_GARRISON_BUILDING_ACTIVATED = 0x151A,
- SMSG_GARRISON_BUILDING_LANDMARKS = 0x14B6,
- SMSG_GARRISON_BUILDING_REMOVED = 0x113D,
- SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x199E,
- SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x1436,
- SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x189E,
- SMSG_GARRISON_CREATE_RESULT = 0x1519,
- SMSG_GARRISON_DELETE_RESULT = 0x1836,
- SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x1119,
- SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x1111,
- SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x1532,
- SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x1599,
- SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x10BA,
- SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x1AF7,
- SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x1819,
- SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x1095,
- SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x1996,
- SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x183E,
- SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x143D,
- SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x14B2,
- SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x18BE,
- SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x1832,
- SMSG_GARRISON_OPEN_ARCHITECT = 0x1195,
- SMSG_GARRISON_OPEN_MISSION_NPC = 0x159A,
- SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x1C12,
- SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x141E,
- SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x1992,
- SMSG_GARRISON_PLOT_PLACED = 0x1191,
- SMSG_GARRISON_PLOT_REMOVED = 0x1C16,
- SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x14B5,
- SMSG_GARRISON_RECALL_PORTAL_USED = 0x1516,
- SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x159E,
- SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x111D,
- SMSG_GARRISON_REMOTE_INFO = 0x1811,
- SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x1036,
- SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x18B5,
- SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x1491,
- SMSG_GARRISON_START_MISSION_RESULT = 0x1C1A,
- SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x141D,
- SMSG_GARRISON_UPGRADE_RESULT = 0x181E,
- SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x13F7,
- SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x03CB,
- SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x18B2,
- SMSG_GET_GARRISON_INFO_RESULT = 0x1196,
- SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x17FB,
- SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x0BF7,
- SMSG_GET_TROPHY_LIST_RESPONSE = 0x1648,
- SMSG_GM_PLAYER_INFO = 0x1400,
- SMSG_GM_REQUEST_PLAYER_INFO = 0x074F,
- SMSG_GM_TICKET_CASE_STATUS = 0x17C7,
- SMSG_GM_TICKET_SYSTEM_STATUS = 0x1680,
- SMSG_GOD_MODE = 0x074B,
- SMSG_GOSSIP_COMPLETE = 0x15A2,
- SMSG_GOSSIP_MESSAGE = 0x0351,
- SMSG_GOSSIP_POI = 0x174C,
- SMSG_GROUP_ACTION_THROTTLED = 0x0AFC,
- SMSG_GROUP_DECLINE = 0x1667,
- SMSG_GROUP_DESTROYED = 0x02EC,
- SMSG_GROUP_NEW_LEADER = 0x1AF3,
- SMSG_GROUP_UNINVITE = 0x176C,
- SMSG_GUILD_ACHIEVEMENT_DELETED = 0x1448,
- SMSG_GUILD_ACHIEVEMENT_EARNED = 0x1543,
- SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x1498,
- SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x1413,
- SMSG_GUILD_BANK_QUERY_RESULTS = 0x140B,
- SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x1483,
- SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x155C,
- SMSG_GUILD_CHALLENGE_COMPLETED = 0x1497,
- SMSG_GUILD_CHALLENGE_UPDATE = 0x140F,
- SMSG_GUILD_CHANGE_NAME_RESULT = 0x14CB,
- SMSG_GUILD_COMMAND_RESULT = 0x150B,
- SMSG_GUILD_CRITERIA_DELETED = 0x1508,
- SMSG_GUILD_CRITERIA_UPDATE = 0x145F,
- SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x1554,
- SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x1418,
- SMSG_GUILD_EVENT_DISBANDED = 0x1490,
- SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x1457,
- SMSG_GUILD_EVENT_MOTD = 0x14CF,
- SMSG_GUILD_EVENT_NEW_LEADER = 0x1417,
- SMSG_GUILD_EVENT_PLAYER_JOINED = 0x1514,
- SMSG_GUILD_EVENT_PLAYER_LEFT = 0x14D3,
- SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x151F,
- SMSG_GUILD_EVENT_RANKS_UPDATED = 0x1560,
- SMSG_GUILD_EVENT_RANK_CHANGED = 0x14C4,
- SMSG_GUILD_EVENT_TAB_ADDED = 0x1513,
- SMSG_GUILD_EVENT_TAB_DELETED = 0x14E0,
- SMSG_GUILD_EVENT_TAB_MODIFIED = 0x149C,
- SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x1558,
- SMSG_GUILD_FLAGGED_FOR_RENAME = 0x145B,
- SMSG_GUILD_INVITE = 0x155F,
- SMSG_GUILD_INVITE_DECLINED = 0x1454,
- SMSG_GUILD_INVITE_EXPIRED = 0x1520,
- SMSG_GUILD_KNOWN_RECIPES = 0x1407,
- SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x1420,
- SMSG_GUILD_MEMBER_DAILY_RESET = 0x150C,
- SMSG_GUILD_MEMBER_RECIPES = 0x1458,
- SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x1414,
- SMSG_GUILD_MOVED = 0x1553,
- SMSG_GUILD_MOVE_STARTING = 0x1488,
- SMSG_GUILD_NAME_CHANGED = 0x14D4,
- SMSG_GUILD_NEWS = 0x1557,
- SMSG_GUILD_NEWS_DELETED = 0x1487,
- SMSG_GUILD_PARTY_STATE = 0x151C,
- SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x1544,
- SMSG_GUILD_RANKS = 0x150F,
- SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x141B,
- SMSG_GUILD_RESET = 0x155B,
- SMSG_GUILD_REWARD_LIST = 0x1410,
- SMSG_GUILD_ROSTER = 0x1408,
- SMSG_GUILD_ROSTER_UPDATE = 0x1517,
- SMSG_GUILD_SEND_RANK_CHANGE = 0x149F,
- SMSG_HEALTH_UPDATE = 0x0B58,
- SMSG_HIGHEST_THREAT_UPDATE = 0x0F53,
- SMSG_HOTFIX_NOTIFY = 0x0BEC,
- SMSG_HOTFIX_NOTIFY_BLOB = 0x0748,
- SMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x1163,
- SMSG_INITIALIZE_FACTIONS = 0x0EC4,
- SMSG_INITIAL_SETUP = 0x07F0,
- SMSG_INIT_WORLD_STATES = 0x0770,
- SMSG_INSPECT_HONOR_STATS = 0x1B77,
- SMSG_INSPECT_PVP = 0x065F,
- SMSG_INSPECT_RESULT = 0x0F7B,
- SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x06E7,
- SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x12D4,
- SMSG_INSTANCE_ENCOUNTER_END = 0x02C4,
- SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x06D4,
- SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x0B54,
- SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x0253,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x06F8,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x0400,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x0EEB,
- SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x1374,
- SMSG_INSTANCE_ENCOUNTER_START = 0x0B53,
- SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x0350,
- SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x0E77,
- SMSG_INSTANCE_INFO = 0x0AE8,
- SMSG_INSTANCE_RESET = 0x07E3,
- SMSG_INSTANCE_RESET_FAILED = 0x17D4,
- SMSG_INSTANCE_SAVE_CREATED = 0x0ED4,
- SMSG_INVALIDATE_PLAYER = 0x166B,
- SMSG_INVALID_PROMOTION_CODE = 0x0AF8,
- SMSG_INVENTORY_CHANGE_FAILURE = 0x1268,
- SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x1D26,
- SMSG_ITEM_CHANGED = 0x1744,
- SMSG_ITEM_COOLDOWN = 0x0E5C,
- SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x1A50,
- SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x1A7B,
- SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x126C,
- SMSG_ITEM_PUSH_RESULT = 0x1370,
- SMSG_ITEM_TIME_UPDATE = 0x13EC,
- SMSG_KICK_REASON = 0x0EFB,
- SMSG_LEARNED_SPELLS = 0x05A7,
- SMSG_LEARN_TALENT_FAILED = 0x0E43,
- SMSG_LEVEL_UP_INFO = 0x1643,
- SMSG_LFG_BOOT_PLAYER = 0x100F,
- SMSG_LFG_DISABLED = 0x108B,
- SMSG_LFG_JOIN_RESULT = 0x114F,
- SMSG_LFG_LIST_JOIN_RESULT = 0x109F,
- SMSG_LFG_LIST_SEARCH_RESULTS = 0x110B,
- SMSG_LFG_LIST_SEARCH_STATUS = 0x1008,
- SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x1048,
- SMSG_LFG_LIST_UPDATE_STATUS = 0x1157,
- SMSG_LFG_OFFER_CONTINUE = 0x1060,
- SMSG_LFG_PARTY_INFO = 0x1097,
- SMSG_LFG_PLAYER_INFO = 0x1187,
- SMSG_LFG_PLAYER_REWARD = 0x1103,
- SMSG_LFG_PROPOSAL_UPDATE = 0x110F,
- SMSG_LFG_QUEUE_STATUS = 0x1117,
- SMSG_LFG_READY_CHECK_RESULT = 0x115B,
- SMSG_LFG_READY_CHECK_UPDATE = 0x1007,
- SMSG_LFG_ROLE_CHECK_UPDATE = 0x1058,
- SMSG_LFG_SEARCH_RESULTS = 0x1014,
- SMSG_LFG_SLOT_INVALID = 0x101B,
- SMSG_LFG_TELEPORT_DENIED = 0x1053,
- SMSG_LFG_UPDATE_STATUS = 0x1010,
- SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x1587,
- SMSG_LF_GUILD_APPLICATIONS = 0x1460,
- SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x1503,
- SMSG_LF_GUILD_BROWSE = 0x154C,
- SMSG_LF_GUILD_COMMAND_RESULT = 0x148B,
- SMSG_LF_GUILD_POST = 0x1450,
- SMSG_LF_GUILD_RECRUITS = 0x1453,
- SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x0AC7,
- SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x1E48,
- SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x0AEF,
- SMSG_LOAD_CUF_PROFILES = 0x17C4,
- SMSG_LOAD_EQUIPMENT_SET = 0x0360,
- SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x0BDC,
- SMSG_LOGIN_SET_TIME_SPEED = 0x1BEC,
- SMSG_LOGIN_VERIFY_WORLD = 0x12C8,
- SMSG_LOGOUT_CANCEL_ACK = 0x17E4,
- SMSG_LOGOUT_COMPLETE = 0x16EF,
- SMSG_LOGOUT_RESPONSE = 0x0664,
- SMSG_LOG_XP_GAIN = 0x12F4,
- SMSG_LOOT_ALL_PASSED = 0x076B,
- SMSG_LOOT_CONTENTS = 0x1B5C,
- SMSG_LOOT_ITEM_LIST = 0x1AE7,
- SMSG_LOOT_LIST = 0x16E4,
- SMSG_LOOT_MONEY_NOTIFY = 0x167F,
- SMSG_LOOT_RELEASE = 0x12E7,
- SMSG_LOOT_RELEASE_ALL = 0x0FC4,
- SMSG_LOOT_REMOVED = 0x03F4,
- SMSG_LOOT_RESPONSE = 0x167B,
- SMSG_LOOT_ROLL = 0x16C7,
- SMSG_LOOT_ROLLS_COMPLETE = 0x034F,
- SMSG_LOOT_ROLL_WON = 0x06EC,
- SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x0254,
- SMSG_MAIL_COMMAND_RESULT = 0x06D0,
- SMSG_MAIL_LIST_RESULT = 0x16EC,
- SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x136C,
- SMSG_MAP_OBJECTIVES_INIT = 0x0BD3,
- SMSG_MAP_OBJ_EVENTS = 0x16D0,
- SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x1A5C,
- SMSG_MESSAGE_BOX = 0x1347,
- SMSG_MINIMAP_PING = 0x1BFC,
- SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x01BF,
- SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x0540,
- SMSG_MISSILE_CANCEL = 0x174F,
- SMSG_MODIFY_COOLDOWN = 0x13C7,
- SMSG_MOTD = 0x0206,
- SMSG_MOUNT_RESULT = 0x16FC,
- SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x0C62,
- SMSG_MOVE_DISABLE_COLLISION = 0x0102,
- SMSG_MOVE_DISABLE_GRAVITY = 0x0D02,
- SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x0D3A,
- SMSG_MOVE_ENABLE_COLLISION = 0x0576,
- SMSG_MOVE_ENABLE_GRAVITY = 0x08ED,
- SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x0906,
- SMSG_MOVE_KNOCK_BACK = 0x0026,
- SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x01E2,
- SMSG_MOVE_ROOT = 0x0471,
- SMSG_MOVE_SET_ACTIVE_MOVER = 0x0175,
- SMSG_MOVE_SET_CAN_FLY = 0x05E9,
- SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x00FA,
- SMSG_MOVE_SET_COLLISION_HEIGHT = 0x086E,
- SMSG_MOVE_SET_COMPOUND_STATE = 0x002D,
- SMSG_MOVE_SET_FEATHER_FALL = 0x0425,
- SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x0D0D,
- SMSG_MOVE_SET_FLIGHT_SPEED = 0x08BD,
- SMSG_MOVE_SET_HOVERING = 0x04EA,
- SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x05B5,
- SMSG_MOVE_SET_LAND_WALK = 0x09A1,
- SMSG_MOVE_SET_NORMAL_FALL = 0x00F6,
- SMSG_MOVE_SET_PITCH_RATE = 0x042D,
- SMSG_MOVE_SET_RUN_BACK_SPEED = 0x0875,
- SMSG_MOVE_SET_RUN_SPEED = 0x04FD,
- SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x0D72,
- SMSG_MOVE_SET_SWIM_SPEED = 0x0961,
- SMSG_MOVE_SET_TURN_RATE = 0x0DB6,
- SMSG_MOVE_SET_VEHICLE_REC_ID = 0x08E6,
- SMSG_MOVE_SET_WALK_SPEED = 0x0872,
- SMSG_MOVE_SET_WATER_WALK = 0x00F1,
- SMSG_MOVE_SKIP_TIME = 0x0829,
- SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x0C71,
- SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x0465,
- SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x0062,
- SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x0171,
- SMSG_MOVE_SPLINE_ROOT = 0x05E2,
- SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x08A6,
- SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x05F1,
- SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x0D01,
- SMSG_MOVE_SPLINE_SET_FLYING = 0x0475,
- SMSG_MOVE_SPLINE_SET_HOVER = 0x00ED,
- SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x04A6,
- SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x0C79,
- SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x0D79,
- SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x053A,
- SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x040E,
- SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x0DE1,
- SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x0031,
- SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x05F2,
- SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x002A,
- SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x09AE,
- SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x0401,
- SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x0865,
- SMSG_MOVE_SPLINE_START_SWIM = 0x00BD,
- SMSG_MOVE_SPLINE_STOP_SWIM = 0x01E9,
- SMSG_MOVE_SPLINE_UNROOT = 0x0032,
- SMSG_MOVE_SPLINE_UNSET_FLYING = 0x057E,
- SMSG_MOVE_SPLINE_UNSET_HOVER = 0x0D4D,
- SMSG_MOVE_TELEPORT = 0x0D2D,
- SMSG_MOVE_UNROOT = 0x0876,
- SMSG_MOVE_UNSET_CAN_FLY = 0x1006,
- SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x0DF9,
- SMSG_MOVE_UNSET_HOVERING = 0x0535,
- SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x0435,
- SMSG_MOVE_UPDATE = 0x0439,
- SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x007E,
- SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x0C0E,
- SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x097D,
- SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x0CA9,
- SMSG_MOVE_UPDATE_KNOCK_BACK = 0x0CE2,
- SMSG_MOVE_UPDATE_PITCH_RATE = 0x04FE,
- SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x0DF6,
- SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x100A,
- SMSG_MOVE_UPDATE_RUN_SPEED = 0x0CEA,
- SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x0902,
- SMSG_MOVE_UPDATE_SWIM_SPEED = 0x0D75,
- SMSG_MOVE_UPDATE_TELEPORT = 0x0D09,
- SMSG_MOVE_UPDATE_TURN_RATE = 0x05A2,
- SMSG_MOVE_UPDATE_WALK_SPEED = 0x0DA5,
- SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x1A73,
- SMSG_NEW_TAXI_PATH = 0x0BFF,
- SMSG_NEW_WORLD = 0x0AEB,
- SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x05F3,
- SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x0A74,
- SMSG_NOTIFY_MONEY = 0x1BCC,
- SMSG_NOTIFY_RECEIVED_MAIL = 0x0A73,
- SMSG_OFFER_PETITION_ERROR = 0x13F4,
- SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x1B54,
- SMSG_ON_MONSTER_MOVE = 0x043A,
- SMSG_OPEN_CONTAINER = 0x07D8,
- SMSG_OPEN_LFG_DUNGEON_FINDER = 0x114C,
- SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x1657,
- SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x16E8,
- SMSG_OVERRIDE_LIGHT = 0x13CC,
- SMSG_PAGE_TEXT = 0x03FB,
- SMSG_PARTY_COMMAND_RESULT = 0x0744,
- SMSG_PARTY_INVITE = 0x07E8,
- SMSG_PARTY_KILL_LOG = 0x03EF,
- SMSG_PARTY_MEMBER_STATE = 0x0EF3,
- SMSG_PARTY_UPDATE = 0x027B,
- SMSG_PAUSE_MIRROR_TIMER = 0x036F,
- SMSG_PENDING_RAID_LOCK = 0x0E64,
- SMSG_PETITION_ALREADY_SIGNED = 0x13D8,
- SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x141F,
- SMSG_PETITION_SHOW_LIST = 0x136B,
- SMSG_PETITION_SHOW_SIGNATURES = 0x0663,
- SMSG_PETITION_SIGN_RESULTS = 0x0FE3,
- SMSG_PET_ACTION_FEEDBACK = 0x07F4,
- SMSG_PET_ACTION_SOUND = 0x0267,
- SMSG_PET_ADDED = 0x12CF,
- SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x1B48,
- SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x0377,
- SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x165F,
- SMSG_PET_BATTLE_FINAL_ROUND = 0x02CF,
- SMSG_PET_BATTLE_FINISHED = 0x02F8,
- SMSG_PET_BATTLE_FIRST_ROUND = 0x03E3,
- SMSG_PET_BATTLE_INITIAL_UPDATE = 0x0B80,
- SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x1AC8,
- SMSG_PET_BATTLE_PVP_CHALLENGE = 0x0A63,
- SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x03D3,
- SMSG_PET_BATTLE_QUEUE_STATUS = 0x1BD3,
- SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x1360,
- SMSG_PET_BATTLE_REQUEST_FAILED = 0x12F0,
- SMSG_PET_BATTLE_ROUND_RESULT = 0x0EC8,
- SMSG_PET_BATTLE_SLOT_UPDATES = 0x0FCB,
- SMSG_PET_CAST_FAILED = 0x11A7,
- SMSG_PET_CLEAR_SPELLS = 0x1134,
- SMSG_PET_DISMISS_SOUND = 0x07F3,
- SMSG_PET_GOD_MODE = 0x1A68,
- SMSG_PET_GUIDS = 0x1BF7,
- SMSG_PET_LEARNED_SPELLS = 0x046F,
- SMSG_PET_MODE = 0x1277,
- SMSG_PET_NAME_INVALID = 0x03F0,
- SMSG_PET_SLOT_UPDATED = 0x13F8,
- SMSG_PET_SPELLS_MESSAGE = 0x10E4,
- SMSG_PET_STABLE_LIST = 0x13D0,
- SMSG_PET_STABLE_RESULT = 0x03C3,
- SMSG_PET_TAME_FAILURE = 0x16E7,
- SMSG_PET_UNLEARNED_SPELLS = 0x053F,
- SMSG_PHASE_SHIFT_CHANGE = 0x137C,
- SMSG_PLAYED_TIME = 0x0EDF,
- SMSG_PLAYER_BOUND = 0x12CB,
- SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x14C8,
- SMSG_PLAYER_SKINNED = 0x0A48,
- SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x16C3,
- SMSG_PLAY_MUSIC = 0x1B57,
- SMSG_PLAY_OBJECT_SOUND = 0x0A4C,
- SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x0344,
- SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x10A3,
- SMSG_PLAY_SCENE = 0x1778,
- SMSG_PLAY_SOUND = 0x0F6F,
- SMSG_PLAY_SPEAKERBOT_SOUND = 0x0AE4,
- SMSG_PLAY_SPELL_VISUAL = 0x11B0,
- SMSG_PLAY_SPELL_VISUAL_KIT = 0x00F3,
- SMSG_PLAY_TIME_WARNING = 0x1ADF,
- SMSG_PONG = 0x0288,
- SMSG_POWER_UPDATE = 0x1BDB,
- SMSG_PRE_RESSURECT = 0x0C00,
- SMSG_PRINT_NOTIFICATION = 0x03FC,
- SMSG_PROC_RESIST = 0x1677,
- SMSG_PROPOSE_LEVEL_GRANT = 0x0A77,
- SMSG_PVP_CREDIT = 0x1673,
- SMSG_PVP_LOG_DATA = 0x0EEF,
- SMSG_PVP_OPTIONS_ENABLED = 0x1BFB,
- SMSG_PVP_SEASON = 0x1BF0,
- SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x0800,
- SMSG_QUERY_CREATURE_RESPONSE = 0x134F,
- SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x03EB,
- SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x15BE,
- SMSG_QUERY_GUILD_INFO_RESPONSE = 0x1507,
- SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x037F,
- SMSG_QUERY_NPC_TEXT_RESPONSE = 0x02F7,
- SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x1B58,
- SMSG_QUERY_PETITION_RESPONSE = 0x1668,
- SMSG_QUERY_PET_NAME_RESPONSE = 0x0E5F,
- SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x17D0,
- SMSG_QUERY_QUEST_INFO_RESPONSE = 0x15AD,
- SMSG_QUERY_TIME_RESPONSE = 0x1B7C,
- SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x0442,
- SMSG_QUEST_CONFIRM_ACCEPT = 0x0756,
- SMSG_QUEST_FORCE_REMOVED = 0x1525,
- SMSG_QUEST_GIVER_INVALID_QUEST = 0x11A1,
- SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x1125,
- SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x1D05,
- SMSG_QUEST_GIVER_QUEST_DETAILS = 0x1921,
- SMSG_QUEST_GIVER_QUEST_FAILED = 0x152D,
- SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x0259,
- SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x1DAA,
- SMSG_QUEST_GIVER_STATUS = 0x1D02,
- SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x0735,
- SMSG_QUEST_LOG_FULL = 0x031D,
- SMSG_QUEST_POI_QUERY_RESPONSE = 0x1D82,
- SMSG_QUEST_PUSH_RESULT = 0x1D21,
- SMSG_QUEST_UPDATE_ADD_CREDIT = 0x1D8A,
- SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x0616,
- SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x1501,
- SMSG_QUEST_UPDATE_COMPLETE = 0x1981,
- SMSG_QUEST_UPDATE_FAILED = 0x023E,
- SMSG_QUEST_UPDATE_FAILED_TIMER = 0x1989,
- SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x0767,
- SMSG_RAID_DIFFICULTY_SET = 0x1368,
- SMSG_RAID_GROUP_ONLY = 0x1B6C,
- SMSG_RAID_INSTANCE_MESSAGE = 0x0306,
- SMSG_RAID_MARKERS_CHANGED = 0x17E7,
- SMSG_RANDOM_ROLL = 0x07DB,
- SMSG_RATED_BATTLEFIELD_INFO = 0x1BD8,
- SMSG_READY_CHECK_COMPLETED = 0x0BD0,
- SMSG_READY_CHECK_RESPONSE = 0x1BDF,
- SMSG_READY_CHECK_STARTED = 0x02C3,
- SMSG_READ_ITEM_RESULT_FAILED = 0x0ED3,
- SMSG_READ_ITEM_RESULT_OK = 0x0AF7,
- SMSG_REALM_QUERY_RESPONSE = 0x0ED8,
- SMSG_REALM_SPLIT = 0x03E7,
- SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x0750,
- SMSG_REFER_A_FRIEND_EXPIRED = 0x17DC,
- SMSG_REFER_A_FRIEND_FAILURE = 0x13E8,
- SMSG_REFRESH_COMPONENT = 0x066B,
- SMSG_REFRESH_SPELL_HISTORY = 0x1038,
- SMSG_REMOVE_ITEM_PASSIVE = 0x0EDB,
- SMSG_REMOVE_LOSS_OF_CONTROL = 0x0364,
- SMSG_REPLACE_TROPHY_RESPONSE = 0x03C7,
- SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x135F,
- SMSG_REQUEST_ADDON_LIST = 0x1B47,
- SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x1344,
- SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x1AEB,
- SMSG_RESEARCH_COMPLETE = 0x1AEC,
- SMSG_RESET_COMPRESSION_CONTEXT = 0x0287,
- SMSG_RESET_FAILED_NOTIFY = 0x0270,
- SMSG_RESET_RANGED_COMBAT_TIMER = 0x16E3,
- SMSG_RESET_WEEKLY_CURRENCY = 0x0EF0,
- SMSG_RESPEC_WIPE_CONFIRM = 0x1BE8,
- SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x0F4C,
- SMSG_RESUME_CAST_BAR = 0x01B3,
- SMSG_RESUME_COMMS = 0x02A3,
- SMSG_RESUME_TOKEN = 0x1373,
- SMSG_RESURRECT_REQUEST = 0x06FC,
- SMSG_RESYNC_RUNES = 0x13FC,
- SMSG_ROLE_CHANGED_INFORM = 0x16D7,
- SMSG_ROLE_CHOSEN = 0x111B,
- SMSG_ROLE_POLL_INFORM = 0x1663,
- SMSG_RUNE_REGEN_DEBUG = 0x0FD3,
- SMSG_SCENARIO_BOOT = 0x1244,
- SMSG_SCENARIO_COMPLETED = 0x13CB,
- SMSG_SCENARIO_OUT_OF_BOUNDS = 0x12D0,
- SMSG_SCENARIO_POIS = 0x1BE3,
- SMSG_SCENARIO_PROGRESS_UPDATE = 0x0ED7,
- SMSG_SCENARIO_STATE = 0x1364,
- SMSG_SCENE_OBJECT_EVENT = 0x13F0,
- SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x0F44,
- SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x1758,
- SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x16EB,
- SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x02E0,
- SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x0F7C,
- SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x0B43,
- SMSG_SCRIPT_CAST = 0x00F4,
- SMSG_SELL_RESPONSE = 0x0EE0,
- SMSG_SEND_ITEM_PASSIVES = 0x1654,
- SMSG_SEND_KNOWN_SPELLS = 0x00EF,
- SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x1BF4,
- SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x0FCF,
- SMSG_SEND_SPELL_CHARGES = 0x05FC,
- SMSG_SEND_SPELL_HISTORY = 0x01F0,
- SMSG_SEND_UNLEARN_SPELLS = 0x05B3,
- SMSG_SERVER_FIRST_ACHIEVEMENT = 0x030E,
- SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x064F,
- SMSG_SERVER_TIME = 0x0F60,
- SMSG_SETUP_CURRENCY = 0x0F48,
- SMSG_SETUP_RESEARCH_HISTORY = 0x126F,
- SMSG_SET_AI_ANIM_KIT = 0x13C3,
- SMSG_SET_ALL_TASK_PROGRESS = 0x0ADF,
- SMSG_SET_ANIM_TIER = 0x03E4,
- SMSG_SET_CURRENCY = 0x0BFC,
- SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x115F,
- SMSG_SET_DUNGEON_DIFFICULTY = 0x0647,
- SMSG_SET_FACTION_AT_WAR = 0x02F4,
- SMSG_SET_FACTION_NOT_VISIBLE = 0x0A80,
- SMSG_SET_FACTION_STANDING = 0x13C8,
- SMSG_SET_FACTION_VISIBLE = 0x0AD4,
- SMSG_SET_FLAT_SPELL_MODIFIER = 0x00C0,
- SMSG_SET_FORCED_REACTIONS = 0x0A6C,
- SMSG_SET_ITEM_PURCHASE_DATA = 0x165B,
- SMSG_SET_LOOT_METHOD_FAILED = 0x0F47,
- SMSG_SET_MAX_WEEKLY_QUANTITY = 0x0F63,
- SMSG_SET_MELEE_ANIM_KIT = 0x17CF,
- SMSG_SET_MOVEMENT_ANIM_KIT = 0x1A5B,
- SMSG_SET_PCT_SPELL_MODIFIER = 0x11AB,
- SMSG_SET_PET_SPECIALIZATION = 0x1B7F,
- SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x1650,
- SMSG_SET_PLAY_HOVER_ANIM = 0x12E4,
- SMSG_SET_PROFICIENCY = 0x0668,
- SMSG_SET_SPELL_CHARGES = 0x1027,
- SMSG_SET_TASK_COMPLETE = 0x13E0,
- SMSG_SET_TIME_ZONE_INFORMATION = 0x17E0,
- SMSG_SET_VEHICLE_REC_ID = 0x0B4B,
- SMSG_SHOW_BANK = 0x0B48,
- SMSG_SHOW_MAILBOX = 0x0A7C,
- SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x12FB,
- SMSG_SHOW_TAXI_NODES = 0x066F,
- SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x0B77,
- SMSG_SOCKET_GEMS = 0x025C,
- SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x17D3,
- SMSG_SPECIAL_MOUNT_ANIM = 0x0274,
- SMSG_SPELL_ABSORB_LOG = 0x117F,
- SMSG_SPELL_CHANNEL_START = 0x1428,
- SMSG_SPELL_CHANNEL_UPDATE = 0x04F7,
- SMSG_SPELL_COOLDOWN = 0x0124,
- SMSG_SPELL_DAMAGE_SHIELD = 0x047B,
- SMSG_SPELL_DELAYED = 0x116F,
- SMSG_SPELL_DISPELL_LOG = 0x116B,
- SMSG_SPELL_ENERGIZE_LOG = 0x0100,
- SMSG_SPELL_EXECUTE_LOG = 0x11FC,
- SMSG_SPELL_FAILED_OTHER = 0x11EC,
- SMSG_SPELL_FAILURE = 0x0424,
- SMSG_SPELL_GO = 0x00BF,
- SMSG_SPELL_HEAL_LOG = 0x10B7,
- SMSG_SPELL_INSTAKILL_LOG = 0x0064,
- SMSG_SPELL_INTERRUPT_LOG = 0x01C0,
- SMSG_SPELL_MISS_LOG = 0x057B,
- SMSG_SPELL_MULTISTRIKE_EFFECT = 0x00AB,
- SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x10F0,
- SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x04C0,
- SMSG_SPELL_PERIODIC_AURA_LOG = 0x10FC,
- SMSG_SPELL_START = 0x1077,
- SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x0570,
- SMSG_SPIRIT_HEALER_CONFIRM = 0x164B,
- SMSG_STAND_STATE_UPDATE = 0x12E0,
- SMSG_START_ELAPSED_TIMER = 0x166F,
- SMSG_START_ELAPSED_TIMERS = 0x02CC,
- SMSG_START_LOOT_ROLL = 0x02CB,
- SMSG_START_MIRROR_TIMER = 0x166C,
- SMSG_START_TIMER = 0x1A4B,
- SMSG_STOP_ELAPSED_TIMER = 0x0ED0,
- SMSG_STOP_MIRROR_TIMER = 0x13EB,
- SMSG_STOP_SPEAKERBOT_SOUND = 0x1A64,
- SMSG_STREAMING_MOVIES = 0x0644,
- SMSG_SUMMON_CANCEL = 0x1B73,
- SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x1AE3,
- SMSG_SUMMON_REQUEST = 0x065B,
- SMSG_SUPERCEDED_SPELLS = 0x04F4,
- SMSG_SUPPRESS_NPC_GREETINGS = 0x0758,
- SMSG_SUSPEND_COMMS = 0x0208,
- SMSG_SUSPEND_TOKEN = 0x0353,
- SMSG_TALENTS_INVOLUNTARILY_RESET = 0x035F,
- SMSG_TAXI_NODE_STATUS = 0x12F3,
- SMSG_TEXT_EMOTE = 0x13E4,
- SMSG_THREAT_CLEAR = 0x07C3,
- SMSG_THREAT_REMOVE = 0x0BDF,
- SMSG_THREAT_UPDATE = 0x035B,
- SMSG_TIME_ADJUSTMENT = 0x00BE,
- SMSG_TIME_SYNC_REQUEST = 0x0101,
- SMSG_TITLE_EARNED = 0x125C,
- SMSG_TITLE_LOST = 0x06D8,
- SMSG_TOTEM_CREATED = 0x0BC7,
- SMSG_TOTEM_MOVED = 0x16CC,
- SMSG_TRADE_STATUS = 0x1253,
- SMSG_TRADE_UPDATED = 0x0AF3,
- SMSG_TRAINER_BUY_FAILED = 0x025B,
- SMSG_TRAINER_LIST = 0x12DC,
- SMSG_TRANSFER_ABORTED = 0x12DB,
- SMSG_TRANSFER_PENDING = 0x0348,
- SMSG_TRIGGER_CINEMATIC = 0x16FF,
- SMSG_TRIGGER_MOVIE = 0x16F3,
- SMSG_TURN_IN_PETITION_RESULT = 0x16C8,
- SMSG_TUTORIAL_FLAGS = 0x1B7B,
- SMSG_TWITTER_STATUS = 0x0060,
- SMSG_UI_TIME = 0x1B4C,
- SMSG_UNDELETE_CHARACTER_RESPONSE = 0x0FD0,
- SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x1ADB,
- SMSG_UNLEARNED_SPELLS = 0x0470,
- SMSG_UPDATE_ACCOUNT_DATA = 0x0B47,
- SMSG_UPDATE_ACTION_BUTTONS = 0x17F8,
- SMSG_UPDATE_CHARACTER_FLAGS = 0x12D7,
- SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x1050,
- SMSG_UPDATE_EXPANSION_LEVEL = 0x125F,
- SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x175B,
- SMSG_UPDATE_LAST_INSTANCE = 0x0B7C,
- SMSG_UPDATE_OBJECT = 0x026B,
- SMSG_UPDATE_TALENT_DATA = 0x0277,
- SMSG_UPDATE_TASK_PROGRESS = 0x1BE4,
- SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x10BF,
- SMSG_UPDATE_WORLD_STATE = 0x0A67,
- SMSG_USERLIST_ADD = 0x0B8D,
- SMSG_USERLIST_REMOVE = 0x0A8A,
- SMSG_USERLIST_UPDATE = 0x0289,
- SMSG_USE_EQUIPMENT_SET_RESULT = 0x0B57,
- SMSG_VENDOR_INVENTORY = 0x0E5B,
- SMSG_VIGNETTE_UPDATE = 0x0EF7,
- SMSG_VOICE_CHAT_STATUS = 0x028E,
- SMSG_VOICE_PARENTAL_CONTROLS = 0x020E,
- SMSG_VOICE_SESSION_LEAVE = 0x0605,
- SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x0B85,
- SMSG_VOID_ITEM_SWAP_RESPONSE = 0x0F64,
- SMSG_VOID_STORAGE_CONTENTS = 0x1ADC,
- SMSG_VOID_STORAGE_FAILED = 0x03CF,
- SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x1A6B,
- SMSG_VOID_TRANSFER_RESULT = 0x0E68,
- SMSG_WAIT_QUEUE_FINISH = 0x1A53,
- SMSG_WAIT_QUEUE_UPDATE = 0x1257,
- SMSG_WARDEN_DATA = 0x0A68,
- SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x1BF8,
- SMSG_WEATHER = 0x12FC,
- SMSG_WEEKLY_SPELL_USAGE = 0x00E8,
- SMSG_WHO = 0x0A09,
- SMSG_WHO_IS = 0x0FD4,
- SMSG_WORLD_SERVER_INFO = 0x1B78,
- SMSG_WORLD_TEXT = 0x17F3,
- SMSG_WOW_TOKEN_AUCTION_SOLD = 0x12E3,
- SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x17C8,
- SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x0F68,
- SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x034C,
- SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x1A80,
- SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x1AD4,
- SMSG_WOW_TOKEN_REDEEM_RESULT = 0x0BF4,
- SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x0757,
- SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x0673,
- SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x0A50,
- SMSG_XP_GAIN_ABORTED = 0x1300,
- SMSG_XP_GAIN_ENABLED = 0x0670,
- SMSG_ZONE_UNDER_ATTACK = 0x0A06,
+ SMSG_ABORT_NEW_WORLD = 0x2533,
+ SMSG_ACCOUNT_CRITERIA_UPDATE = 0x25D2,
+ SMSG_ACCOUNT_DATA_TIMES = 0x26CA,
+ SMSG_ACCOUNT_MOUNT_UPDATE = 0x2549,
+ SMSG_ACCOUNT_TOYS_UPDATE = 0x254A,
+ SMSG_ACHIEVEMENT_DELETED = 0x26A0,
+ SMSG_ACHIEVEMENT_EARNED = 0x25E0,
+ SMSG_ACTIVATE_TAXI_REPLY = 0x2627,
+ SMSG_ADDON_INFO = 0x26FC,
+ SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x25DA,
+ SMSG_ADD_ITEM_PASSIVE = 0x2545,
+ SMSG_ADD_LOSS_OF_CONTROL = 0x2617,
+ SMSG_ADD_RUNE_POWER = 0x2665,
+ SMSG_ADJUST_SPLINE_DURATION = 0x256C,
+ SMSG_AE_LOOT_TARGETS = 0x25AE,
+ SMSG_AE_LOOT_TARGET_ACK = 0x25AF,
+ SMSG_AI_REACTION = 0x2661,
+ SMSG_ALL_ACCOUNT_CRITERIA = 0x24EE,
+ SMSG_ALL_ACHIEVEMENT_DATA = 0x24ED,
+ SMSG_ALL_GUILD_ACHIEVEMENTS = 0x2936,
+ SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2504,
+ SMSG_AREA_SPIRIT_HEALER_TIME = 0x2701,
+ SMSG_AREA_TRIGGER_DENIED = 0x261E,
+ SMSG_AREA_TRIGGER_NO_CORPSE = 0x26D6,
+ SMSG_AREA_TRIGGER_RE_PATH = 0x25BF,
+ SMSG_AREA_TRIGGER_RE_SHAPE = 0x25C1,
+ SMSG_ARENA_ERROR = 0x2693,
+ SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x25E6,
+ SMSG_ATTACKER_STATE_UPDATE = 0x2749,
+ SMSG_ATTACK_START = 0x25EE,
+ SMSG_ATTACK_STOP = 0x25EF,
+ SMSG_ATTACK_SWING_ERROR = 0x26B5,
+ SMSG_ATTACK_SWING_LANDED_LOG = 0x26B6,
+ SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26AA,
+ SMSG_AUCTION_COMMAND_RESULT = 0x26A7,
+ SMSG_AUCTION_HELLO_RESPONSE = 0x26A5,
+ SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x26AE,
+ SMSG_AUCTION_LIST_ITEMS_RESULT = 0x26AC,
+ SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x26AD,
+ SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x26AF,
+ SMSG_AUCTION_OUTBID_NOTIFICATION = 0x26A9,
+ SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x26AB,
+ SMSG_AUCTION_REPLICATE_RESPONSE = 0x26A6,
+ SMSG_AUCTION_WON_NOTIFICATION = 0x26A8,
+ SMSG_AURA_POINTS_DEPLETED = 0x2BA0,
+ SMSG_AURA_UPDATE = 0x2B9F,
+ SMSG_AUTH_CHALLENGE = 0x2FC6,
+ SMSG_AUTH_RESPONSE = 0x24EA,
+ SMSG_AVAILABLE_VOICE_CHANNEL = 0x2B30,
+ SMSG_BAN_REASON = 0x2633,
+ SMSG_BARBER_SHOP_RESULT = 0x266B,
+ SMSG_BATTLEFIELD_LIST = 0x2511,
+ SMSG_BATTLEFIELD_PORT_DENIED = 0x2517,
+ SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x250D,
+ SMSG_BATTLEFIELD_STATUS_FAILED = 0x2510,
+ SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x250C,
+ SMSG_BATTLEFIELD_STATUS_NONE = 0x250F,
+ SMSG_BATTLEFIELD_STATUS_QUEUED = 0x250E,
+ SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x252B,
+ SMSG_BATTLEGROUND_INFO_THROTTLED = 0x2523,
+ SMSG_BATTLEGROUND_INIT = 0x271E,
+ SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2515,
+ SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2516,
+ SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2512,
+ SMSG_BATTLEGROUND_POINTS = 0x271D,
+ SMSG_BATTLENET_CHALLENGE_ABORT = 0x2748,
+ SMSG_BATTLENET_CHALLENGE_START = 0x2747,
+ SMSG_BATTLENET_NOTIFICATION = 0x279E,
+ SMSG_BATTLENET_REALM_LIST_TICKET = 0x27A0,
+ SMSG_BATTLENET_RESPONSE = 0x279D,
+ SMSG_BATTLENET_SET_SESSION_STATE = 0x279F,
+ SMSG_BATTLE_PAY_ACK_FAILED = 0x2740,
+ SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x273F,
+ SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x2736,
+ SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x2735,
+ SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x2734,
+ SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x2732,
+ SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x2730,
+ SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x2731,
+ SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x273E,
+ SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x273C,
+ SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x273B,
+ SMSG_BATTLE_PETS_HEALED = 0x258C,
+ SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x2621,
+ SMSG_BATTLE_PET_DELETED = 0x2589,
+ SMSG_BATTLE_PET_ERROR = 0x25D5,
+ SMSG_BATTLE_PET_JOURNAL = 0x2588,
+ SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2586,
+ SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2587,
+ SMSG_BATTLE_PET_LICENSE_CHANGED = 0x258D,
+ SMSG_BATTLE_PET_RESTORED = 0x258B,
+ SMSG_BATTLE_PET_REVOKED = 0x258A,
+ SMSG_BATTLE_PET_TRAP_LEVEL = 0x2584,
+ SMSG_BATTLE_PET_UPDATES = 0x2583,
+ SMSG_BF_MGR_DROP_TIMER_CANCELLED = 0x251F,
+ SMSG_BF_MGR_DROP_TIMER_STARTED = 0x251E,
+ SMSG_BF_MGR_EJECTED = 0x251D,
+ SMSG_BF_MGR_EJECT_PENDING = 0x251C,
+ SMSG_BF_MGR_ENTERING = 0x2519,
+ SMSG_BF_MGR_ENTRY_INVITE = 0x2518,
+ SMSG_BF_MGR_QUEUE_INVITE = 0x2520,
+ SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0x251A,
+ SMSG_BF_MGR_QUEUE_STATUS_UPDATE = 0x251B,
+ SMSG_BF_MGR_STATE_CHANGED = 0x2522,
+ SMSG_BINDER_CONFIRM = 0x26BB,
+ SMSG_BIND_POINT_UPDATE = 0x24FA,
+ SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x25C5,
+ SMSG_BLACK_MARKET_OPEN_RESULT = 0x25C3,
+ SMSG_BLACK_MARKET_OUTBID = 0x25C6,
+ SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x25C4,
+ SMSG_BLACK_MARKET_WON = 0x25C7,
+ SMSG_BONUS_ROLL_EMPTY = 0x25E3,
+ SMSG_BOSS_KILL_CREDIT = 0x273A,
+ SMSG_BREAK_TARGET = 0x25ED,
+ SMSG_BUY_FAILED = 0x2674,
+ SMSG_BUY_SUCCEEDED = 0x2673,
+ SMSG_CACHE_VERSION = 0x26C4,
+ SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x2647,
+ SMSG_CALENDAR_COMMAND_RESULT = 0x2648,
+ SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x2637,
+ SMSG_CALENDAR_EVENT_INVITE = 0x2638,
+ SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x2639,
+ SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x263C,
+ SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x2641,
+ SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x2642,
+ SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x263D,
+ SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x263E,
+ SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x263A,
+ SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x263B,
+ SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x263F,
+ SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x2640,
+ SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x2643,
+ SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x2644,
+ SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x2645,
+ SMSG_CALENDAR_SEND_CALENDAR = 0x2635,
+ SMSG_CALENDAR_SEND_EVENT = 0x2636,
+ SMSG_CALENDAR_SEND_NUM_PENDING = 0x2646,
+ SMSG_CAMERA_SHAKE = 0x26E6,
+ SMSG_CANCEL_AUTO_REPEAT = 0x2694,
+ SMSG_CANCEL_COMBAT = 0x26B3,
+ SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2BC4,
+ SMSG_CANCEL_SCENE = 0x25D4,
+ SMSG_CANCEL_SPELL_VISUAL = 0x2BC2,
+ SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2BC6,
+ SMSG_CAN_DUEL_RESULT = 0x25F7,
+ SMSG_CAST_FAILED = 0x2BD2,
+ SMSG_CATEGORY_COOLDOWN = 0x2B94,
+ SMSG_CHALLEGE_MODE_REWARDS = 0x25A3,
+ SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x25A4,
+ SMSG_CHALLENGE_MODE_COMPLETE = 0x25A2,
+ SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x25A5,
+ SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x25A7,
+ SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x25A6,
+ SMSG_CHALLENGE_MODE_RESET = 0x25A1,
+ SMSG_CHALLENGE_MODE_START = 0x25A0,
+ SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x26B7,
+ SMSG_CHANNEL_LIST = 0x2B46,
+ SMSG_CHANNEL_NOTIFY = 0x2B43,
+ SMSG_CHANNEL_NOTIFY_JOINED = 0x2B44,
+ SMSG_CHANNEL_NOTIFY_LEFT = 0x2B45,
+ SMSG_CHARACTER_LOGIN_FAILED = 0x26C5,
+ SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x2746,
+ SMSG_CHARACTER_RENAME_RESULT = 0x2724,
+ SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN = 0x2772,
+ SMSG_CHARACTER_UPGRADE_COMPLETE = 0x2773,
+ SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x2578,
+ SMSG_CHARACTER_UPGRADE_STARTED = 0x2771,
+ SMSG_CHAR_CUSTOMIZE = 0x269B,
+ SMSG_CHAR_CUSTOMIZE_FAILED = 0x269A,
+ SMSG_CHAR_FACTION_CHANGE_RESULT = 0x2760,
+ SMSG_CHAT = 0x2B2B,
+ SMSG_CHAT_AUTO_RESPONDED = 0x2B3B,
+ SMSG_CHAT_DOWN = 0x2B40,
+ SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x2B2A,
+ SMSG_CHAT_IS_DOWN = 0x2B41,
+ SMSG_CHAT_NOT_IN_PARTY = 0x2B35,
+ SMSG_CHAT_PLAYER_AMBIGUOUS = 0x2B2E,
+ SMSG_CHAT_PLAYER_NOTFOUND = 0x2B3A,
+ SMSG_CHAT_RECONNECT = 0x2B42,
+ SMSG_CHAT_RESTRICTED = 0x2B36,
+ SMSG_CHAT_SERVER_MESSAGE = 0x2B47,
+ SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x2B90,
+ SMSG_CHECK_WARGAME_ENTRY = 0x2526,
+ SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2BA5,
+ SMSG_CLEAR_BOSS_EMOTES = 0x2552,
+ SMSG_CLEAR_COOLDOWN = 0x2667,
+ SMSG_CLEAR_COOLDOWNS = 0x2BA3,
+ SMSG_CLEAR_LOSS_OF_CONTROL = 0x2619,
+ SMSG_CLEAR_SPELL_CHARGES = 0x2BA6,
+ SMSG_CLEAR_TARGET = 0x265D,
+ SMSG_COIN_REMOVED = 0x25AD,
+ SMSG_COMBAT_EVENT_FAILED = 0x25F0,
+ SMSG_COMMENTATOR_MAP_INFO = 0x26C7,
+ SMSG_COMMENTATOR_PLAYER_INFO = 0x26C8,
+ SMSG_COMMENTATOR_STATE_CHANGED = 0x26C6,
+ SMSG_COMPLAINT_RESULT = 0x2655,
+ SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x2758,
+ SMSG_CONNECT_TO = 0x2FCA,
+ SMSG_CONQUEST_FORMULA_CONSTANTS = 0x2741,
+ SMSG_CONSOLE_WRITE = 0x25D1,
+ SMSG_CONTACT_LIST = 0x2744,
+ SMSG_CONTROL_UPDATE = 0x25E5,
+ SMSG_CONVERT_RUNE = 0x2664,
+ SMSG_COOLDOWN_CHEAT = 0x26F9,
+ SMSG_COOLDOWN_EVENT = 0x2666,
+ SMSG_CORPSE_LOCATION = 0x25EC,
+ SMSG_CORPSE_RECLAIM_DELAY = 0x270C,
+ SMSG_CORPSE_TRANSPORT_QUERY = 0x26D2,
+ SMSG_CREATE_CHAR = 0x26C0,
+ SMSG_CREATE_SHIPMENT_RESPONSE = 0x2757,
+ SMSG_CRITERIA_DELETED = 0x269F,
+ SMSG_CRITERIA_UPDATE = 0x2699,
+ SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x266F,
+ SMSG_CUSTOM_LOAD_SCREEN = 0x2568,
+ SMSG_DAILY_QUESTS_RESET = 0x29FE,
+ SMSG_DAMAGE_CALC_LOG = 0x277A,
+ SMSG_DANCE_STUDIO_CREATE_RESULT = 0x2721,
+ SMSG_DB_REPLY = 0x2528,
+ SMSG_DEATH_RELEASE_LOC = 0x2687,
+ SMSG_DEFENSE_MESSAGE = 0x2B39,
+ SMSG_DELETE_CHAR = 0x26C1,
+ SMSG_DESTROY_ARENA_UNIT = 0x2703,
+ SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x26B4,
+ SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x2507,
+ SMSG_DISENCHANT_CREDIT = 0x2542,
+ SMSG_DISMOUNT = 0x265C,
+ SMSG_DISMOUNT_RESULT = 0x24F9,
+ SMSG_DISPEL_FAILED = 0x2BAE,
+ SMSG_DISPLAY_GAME_ERROR = 0x253B,
+ SMSG_DISPLAY_PLAYER_CHOICE = 0x2622,
+ SMSG_DISPLAY_PROMOTION = 0x25E9,
+ SMSG_DISPLAY_QUEST_POPUP = 0x2A19,
+ SMSG_DISPLAY_TOAST = 0x25BB,
+ SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x257A,
+ SMSG_DROP_NEW_CONNECTION = 0x2FC9,
+ SMSG_DUEL_COMPLETE = 0x25F5,
+ SMSG_DUEL_COUNTDOWN = 0x25F4,
+ SMSG_DUEL_IN_BOUNDS = 0x25F3,
+ SMSG_DUEL_OUT_OF_BOUNDS = 0x25F2,
+ SMSG_DUEL_REQUESTED = 0x25F1,
+ SMSG_DUEL_WINNER = 0x25F6,
+ SMSG_DURABILITY_DAMAGE_DEATH = 0x2708,
+ SMSG_EMOTE = 0x277B,
+ SMSG_ENABLE_BARBER_SHOP = 0x266A,
+ SMSG_ENCHANTMENT_LOG = 0x26D3,
+ SMSG_ENCOUNTER_END = 0x2739,
+ SMSG_ENCOUNTER_START = 0x2738,
+ SMSG_ENUM_CHARACTERS_RESULT = 0x2500,
+ SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2B9E,
+ SMSG_EQUIPMENT_SET_ID = 0x265E,
+ SMSG_EXPECTED_SPAM_RECORDS = 0x2B2F,
+ SMSG_EXPLORATION_EXPERIENCE = 0x2720,
+ SMSG_FACTION_BONUS_INFO = 0x26E5,
+ SMSG_FAILED_PLAYER_CONDITION = 0x2567,
+ SMSG_FEATURE_SYSTEM_STATUS = 0x2557,
+ SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x2558,
+ SMSG_FEIGN_DEATH_RESISTED = 0x2705,
+ SMSG_FISH_ESCAPED = 0x267C,
+ SMSG_FISH_NOT_HOOKED = 0x267B,
+ SMSG_FLIGHT_SPLINE_SYNC = 0x2D73,
+ SMSG_FORCED_DEATH_UPDATE = 0x2688,
+ SMSG_FORCE_ANIM = 0x2712,
+ SMSG_FORCE_OBJECT_RELINK = 0x25E8,
+ SMSG_FRIEND_STATUS = 0x2745,
+ SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x255B,
+ SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x255C,
+ SMSG_GAME_OBJECT_DESPAWN = 0x255D,
+ SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2BC9,
+ SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2BC8,
+ SMSG_GAME_OBJECT_RESET_STATE = 0x26DC,
+ SMSG_GAME_OBJECT_UI_ACTION = 0x26D9,
+ SMSG_GAME_SPEED_SET = 0x262B,
+ SMSG_GAME_TIME_SET = 0x26CC,
+ SMSG_GAME_TIME_UPDATE = 0x26CB,
+ SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x287C,
+ SMSG_GARRISON_ADD_MISSION_RESULT = 0x287F,
+ SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2890,
+ SMSG_GARRISON_BUILDING_ACTIVATED = 0x2879,
+ SMSG_GARRISON_BUILDING_LANDMARKS = 0x28A3,
+ SMSG_GARRISON_BUILDING_REMOVED = 0x2872,
+ SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x2874,
+ SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x288E,
+ SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2882,
+ SMSG_GARRISON_CREATE_RESULT = 0x287A,
+ SMSG_GARRISON_DELETE_RESULT = 0x2897,
+ SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x288C,
+ SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x288B,
+ SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x288D,
+ SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x288A,
+ SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x28A0,
+ SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x275A,
+ SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x2875,
+ SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x2873,
+ SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x287E,
+ SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x28A1,
+ SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x2888,
+ SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x2885,
+ SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x2889,
+ SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x288F,
+ SMSG_GARRISON_OPEN_ARCHITECT = 0x2898,
+ SMSG_GARRISON_OPEN_MISSION_NPC = 0x289A,
+ SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x2894,
+ SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x2899,
+ SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x2871,
+ SMSG_GARRISON_PLOT_PLACED = 0x286F,
+ SMSG_GARRISON_PLOT_REMOVED = 0x2870,
+ SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x2883,
+ SMSG_GARRISON_RECALL_PORTAL_USED = 0x2884,
+ SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x2895,
+ SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x2896,
+ SMSG_GARRISON_REMOTE_INFO = 0x2878,
+ SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2891,
+ SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x287D,
+ SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x2877,
+ SMSG_GARRISON_START_MISSION_RESULT = 0x2880,
+ SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x2876,
+ SMSG_GARRISON_UPGRADE_RESULT = 0x287B,
+ SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2501,
+ SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2722,
+ SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x289F,
+ SMSG_GET_GARRISON_INFO_RESULT = 0x286E,
+ SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x2759,
+ SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x2755,
+ SMSG_GET_TROPHY_LIST_RESPONSE = 0x2776,
+ SMSG_GM_PLAYER_INFO = 0x26F8,
+ SMSG_GM_REQUEST_PLAYER_INFO = 0x256F,
+ SMSG_GM_TICKET_CASE_STATUS = 0x264E,
+ SMSG_GM_TICKET_SYSTEM_STATUS = 0x264D,
+ SMSG_GOD_MODE = 0x26BA,
+ SMSG_GOSSIP_COMPLETE = 0x2A13,
+ SMSG_GOSSIP_MESSAGE = 0x2A14,
+ SMSG_GOSSIP_POI = 0x2752,
+ SMSG_GROUP_ACTION_THROTTLED = 0x2524,
+ SMSG_GROUP_DECLINE = 0x274D,
+ SMSG_GROUP_DESTROYED = 0x274F,
+ SMSG_GROUP_NEW_LEADER = 0x25CA,
+ SMSG_GROUP_UNINVITE = 0x274E,
+ SMSG_GUILD_ACHIEVEMENT_DELETED = 0x2943,
+ SMSG_GUILD_ACHIEVEMENT_EARNED = 0x2942,
+ SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x2945,
+ SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x295C,
+ SMSG_GUILD_BANK_QUERY_RESULTS = 0x295B,
+ SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x295D,
+ SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x2960,
+ SMSG_GUILD_CHALLENGE_COMPLETED = 0x2951,
+ SMSG_GUILD_CHALLENGE_UPDATE = 0x2950,
+ SMSG_GUILD_CHANGE_NAME_RESULT = 0x295A,
+ SMSG_GUILD_COMMAND_RESULT = 0x2938,
+ SMSG_GUILD_CRITERIA_DELETED = 0x2944,
+ SMSG_GUILD_CRITERIA_UPDATE = 0x2941,
+ SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x2972,
+ SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x2971,
+ SMSG_GUILD_EVENT_DISBANDED = 0x2968,
+ SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x295F,
+ SMSG_GUILD_EVENT_MOTD = 0x2969,
+ SMSG_GUILD_EVENT_NEW_LEADER = 0x2967,
+ SMSG_GUILD_EVENT_PLAYER_JOINED = 0x2965,
+ SMSG_GUILD_EVENT_PLAYER_LEFT = 0x2966,
+ SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x296A,
+ SMSG_GUILD_EVENT_RANKS_UPDATED = 0x296B,
+ SMSG_GUILD_EVENT_RANK_CHANGED = 0x296C,
+ SMSG_GUILD_EVENT_TAB_ADDED = 0x296D,
+ SMSG_GUILD_EVENT_TAB_DELETED = 0x296E,
+ SMSG_GUILD_EVENT_TAB_MODIFIED = 0x296F,
+ SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x2970,
+ SMSG_GUILD_FLAGGED_FOR_RENAME = 0x2959,
+ SMSG_GUILD_INVITE = 0x2948,
+ SMSG_GUILD_INVITE_DECLINED = 0x2963,
+ SMSG_GUILD_INVITE_EXPIRED = 0x2964,
+ SMSG_GUILD_KNOWN_RECIPES = 0x293C,
+ SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x293D,
+ SMSG_GUILD_MEMBER_DAILY_RESET = 0x2961,
+ SMSG_GUILD_MEMBER_RECIPES = 0x293B,
+ SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x2947,
+ SMSG_GUILD_MOVED = 0x2957,
+ SMSG_GUILD_MOVE_STARTING = 0x2956,
+ SMSG_GUILD_NAME_CHANGED = 0x2958,
+ SMSG_GUILD_NEWS = 0x293F,
+ SMSG_GUILD_NEWS_DELETED = 0x2940,
+ SMSG_GUILD_PARTY_STATE = 0x2949,
+ SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x295E,
+ SMSG_GUILD_RANKS = 0x2946,
+ SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x294A,
+ SMSG_GUILD_RESET = 0x2955,
+ SMSG_GUILD_REWARD_LIST = 0x293E,
+ SMSG_GUILD_ROSTER = 0x2939,
+ SMSG_GUILD_ROSTER_UPDATE = 0x293A,
+ SMSG_GUILD_SEND_RANK_CHANGE = 0x2937,
+ SMSG_HEALTH_UPDATE = 0x267F,
+ SMSG_HIGHEST_THREAT_UPDATE = 0x268E,
+ SMSG_HOTFIX_NOTIFY = 0x2529,
+ SMSG_HOTFIX_NOTIFY_BLOB = 0x252A,
+ SMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x2BA4,
+ SMSG_INITIALIZE_FACTIONS = 0x26E4,
+ SMSG_INITIAL_SETUP = 0x24FD,
+ SMSG_INIT_WORLD_STATES = 0x2709,
+ SMSG_INSPECT_HONOR_STATS = 0x2538,
+ SMSG_INSPECT_PVP = 0x26E0,
+ SMSG_INSPECT_RESULT = 0x25CE,
+ SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x2766,
+ SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x2765,
+ SMSG_INSTANCE_ENCOUNTER_END = 0x276C,
+ SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x2764,
+ SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x276E,
+ SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x276D,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x2769,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x2768,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x276B,
+ SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x276F,
+ SMSG_INSTANCE_ENCOUNTER_START = 0x276A,
+ SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x2767,
+ SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x26B8,
+ SMSG_INSTANCE_INFO = 0x25D0,
+ SMSG_INSTANCE_RESET = 0x2630,
+ SMSG_INSTANCE_RESET_FAILED = 0x2631,
+ SMSG_INSTANCE_SAVE_CREATED = 0x2737,
+ SMSG_INVALIDATE_PLAYER = 0x2654,
+ SMSG_INVALID_PROMOTION_CODE = 0x2713,
+ SMSG_INVENTORY_CHANGE_FAILURE = 0x26E2,
+ SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A01,
+ SMSG_ITEM_CHANGED = 0x26A2,
+ SMSG_ITEM_COOLDOWN = 0x2779,
+ SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2715,
+ SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x2537,
+ SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x2535,
+ SMSG_ITEM_PUSH_RESULT = 0x25BA,
+ SMSG_ITEM_TIME_UPDATE = 0x2714,
+ SMSG_KICK_REASON = 0x2798,
+ SMSG_LEARNED_SPELLS = 0x2BCB,
+ SMSG_LEARN_TALENT_FAILED = 0x256D,
+ SMSG_LEVEL_UP_INFO = 0x26A1,
+ SMSG_LFG_BOOT_PLAYER = 0x29B4,
+ SMSG_LFG_DISABLED = 0x29B2,
+ SMSG_LFG_JOIN_RESULT = 0x299A,
+ SMSG_LFG_LIST_JOIN_RESULT = 0x299B,
+ SMSG_LFG_LIST_SEARCH_RESULTS = 0x299C,
+ SMSG_LFG_LIST_SEARCH_STATUS = 0x299D,
+ SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x29A7,
+ SMSG_LFG_LIST_UPDATE_STATUS = 0x29A3,
+ SMSG_LFG_OFFER_CONTINUE = 0x29B3,
+ SMSG_LFG_PARTY_INFO = 0x29B5,
+ SMSG_LFG_PLAYER_INFO = 0x29B6,
+ SMSG_LFG_PLAYER_REWARD = 0x29B7,
+ SMSG_LFG_PROPOSAL_UPDATE = 0x29AA,
+ SMSG_LFG_QUEUE_STATUS = 0x299E,
+ SMSG_LFG_READY_CHECK_RESULT = 0x29B9,
+ SMSG_LFG_READY_CHECK_UPDATE = 0x29A0,
+ SMSG_LFG_ROLE_CHECK_UPDATE = 0x299F,
+ SMSG_LFG_SEARCH_RESULTS = 0x29AB,
+ SMSG_LFG_SLOT_INVALID = 0x29AE,
+ SMSG_LFG_TELEPORT_DENIED = 0x29B1,
+ SMSG_LFG_UPDATE_STATUS = 0x29A2,
+ SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x2952,
+ SMSG_LF_GUILD_APPLICATIONS = 0x294F,
+ SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x2953,
+ SMSG_LF_GUILD_BROWSE = 0x294C,
+ SMSG_LF_GUILD_COMMAND_RESULT = 0x294E,
+ SMSG_LF_GUILD_POST = 0x294B,
+ SMSG_LF_GUILD_RECRUITS = 0x294D,
+ SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x272E,
+ SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x272C,
+ SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2723,
+ SMSG_LOAD_CUF_PROFILES = 0x2553,
+ SMSG_LOAD_EQUIPMENT_SET = 0x26CE,
+ SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x2777,
+ SMSG_LOGIN_SET_TIME_SPEED = 0x26CD,
+ SMSG_LOGIN_VERIFY_WORLD = 0x2532,
+ SMSG_LOGOUT_CANCEL_ACK = 0x262F,
+ SMSG_LOGOUT_COMPLETE = 0x262E,
+ SMSG_LOGOUT_RESPONSE = 0x262D,
+ SMSG_LOG_XP_GAIN = 0x269D,
+ SMSG_LOOT_ALL_PASSED = 0x25B8,
+ SMSG_LOOT_CONTENTS = 0x2573,
+ SMSG_LOOT_ITEM_LIST = 0x25B6,
+ SMSG_LOOT_LIST = 0x2702,
+ SMSG_LOOT_MONEY_NOTIFY = 0x25B2,
+ SMSG_LOOT_RELEASE = 0x25B1,
+ SMSG_LOOT_RELEASE_ALL = 0x25B0,
+ SMSG_LOOT_REMOVED = 0x25AB,
+ SMSG_LOOT_RESPONSE = 0x25AA,
+ SMSG_LOOT_ROLL = 0x25B4,
+ SMSG_LOOT_ROLLS_COMPLETE = 0x25B7,
+ SMSG_LOOT_ROLL_WON = 0x25B9,
+ SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2616,
+ SMSG_MAIL_COMMAND_RESULT = 0x25D8,
+ SMSG_MAIL_LIST_RESULT = 0x2716,
+ SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2717,
+ SMSG_MAP_OBJECTIVES_INIT = 0x271F,
+ SMSG_MAP_OBJ_EVENTS = 0x255E,
+ SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x25B5,
+ SMSG_MESSAGE_BOX = 0x24F3,
+ SMSG_MINIMAP_PING = 0x267A,
+ SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2B92,
+ SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2B91,
+ SMSG_MISSILE_CANCEL = 0x255F,
+ SMSG_MODIFY_COOLDOWN = 0x2725,
+ SMSG_MOTD = 0x2B2D,
+ SMSG_MOUNT_RESULT = 0x24F8,
+ SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2D5D,
+ SMSG_MOVE_DISABLE_COLLISION = 0x2D59,
+ SMSG_MOVE_DISABLE_GRAVITY = 0x2D57,
+ SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2D56,
+ SMSG_MOVE_ENABLE_COLLISION = 0x2D5A,
+ SMSG_MOVE_ENABLE_GRAVITY = 0x2D58,
+ SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2D55,
+ SMSG_MOVE_KNOCK_BACK = 0x2D4D,
+ SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x2D5E,
+ SMSG_MOVE_ROOT = 0x2D45,
+ SMSG_MOVE_SET_ACTIVE_MOVER = 0x2D21,
+ SMSG_MOVE_SET_CAN_FLY = 0x2D4F,
+ SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x2D51,
+ SMSG_MOVE_SET_COLLISION_HEIGHT = 0x2D5B,
+ SMSG_MOVE_SET_COMPOUND_STATE = 0x2D5F,
+ SMSG_MOVE_SET_FEATHER_FALL = 0x2D49,
+ SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x2D41,
+ SMSG_MOVE_SET_FLIGHT_SPEED = 0x2D40,
+ SMSG_MOVE_SET_HOVERING = 0x2D4B,
+ SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x2D53,
+ SMSG_MOVE_SET_LAND_WALK = 0x2D48,
+ SMSG_MOVE_SET_NORMAL_FALL = 0x2D4A,
+ SMSG_MOVE_SET_PITCH_RATE = 0x2D44,
+ SMSG_MOVE_SET_RUN_BACK_SPEED = 0x2D3D,
+ SMSG_MOVE_SET_RUN_SPEED = 0x2D3C,
+ SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x2D3F,
+ SMSG_MOVE_SET_SWIM_SPEED = 0x2D3E,
+ SMSG_MOVE_SET_TURN_RATE = 0x2D43,
+ SMSG_MOVE_SET_VEHICLE_REC_ID = 0x2D5C,
+ SMSG_MOVE_SET_WALK_SPEED = 0x2D42,
+ SMSG_MOVE_SET_WATER_WALK = 0x2D47,
+ SMSG_MOVE_SKIP_TIME = 0x2D60,
+ SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x2D65,
+ SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x2D63,
+ SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x2D66,
+ SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x2D64,
+ SMSG_MOVE_SPLINE_ROOT = 0x2D61,
+ SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x2D67,
+ SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x2D38,
+ SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x2D37,
+ SMSG_MOVE_SPLINE_SET_FLYING = 0x2D71,
+ SMSG_MOVE_SPLINE_SET_HOVER = 0x2D69,
+ SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x2D6C,
+ SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x2D68,
+ SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x2D3B,
+ SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x2D34,
+ SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x2D6F,
+ SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x2D33,
+ SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x2D36,
+ SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x2D35,
+ SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x2D3A,
+ SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x2D70,
+ SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x2D39,
+ SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x2D6B,
+ SMSG_MOVE_SPLINE_START_SWIM = 0x2D6D,
+ SMSG_MOVE_SPLINE_STOP_SWIM = 0x2D6E,
+ SMSG_MOVE_SPLINE_UNROOT = 0x2D62,
+ SMSG_MOVE_SPLINE_UNSET_FLYING = 0x2D72,
+ SMSG_MOVE_SPLINE_UNSET_HOVER = 0x2D6A,
+ SMSG_MOVE_TELEPORT = 0x2D4E,
+ SMSG_MOVE_UNROOT = 0x2D46,
+ SMSG_MOVE_UNSET_CAN_FLY = 0x2D50,
+ SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x2D52,
+ SMSG_MOVE_UNSET_HOVERING = 0x2D4C,
+ SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x2D54,
+ SMSG_MOVE_UPDATE = 0x2D2C,
+ SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x2D30,
+ SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x2D2B,
+ SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x2D28,
+ SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x2D27,
+ SMSG_MOVE_UPDATE_KNOCK_BACK = 0x2D2E,
+ SMSG_MOVE_UPDATE_PITCH_RATE = 0x2D2A,
+ SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x2D31,
+ SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x2D23,
+ SMSG_MOVE_UPDATE_RUN_SPEED = 0x2D22,
+ SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x2D26,
+ SMSG_MOVE_UPDATE_SWIM_SPEED = 0x2D25,
+ SMSG_MOVE_UPDATE_TELEPORT = 0x2D2D,
+ SMSG_MOVE_UPDATE_TURN_RATE = 0x2D29,
+ SMSG_MOVE_UPDATE_WALK_SPEED = 0x2D24,
+ SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x2575,
+ SMSG_NEW_TAXI_PATH = 0x2628,
+ SMSG_NEW_WORLD = 0x2531,
+ SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2BC1,
+ SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x2653,
+ SMSG_NOTIFY_MONEY = 0x2534,
+ SMSG_NOTIFY_RECEIVED_MAIL = 0x25D9,
+ SMSG_OFFER_PETITION_ERROR = 0x2662,
+ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x269E,
+ SMSG_ON_MONSTER_MOVE = 0x2D20,
+ SMSG_OPEN_CONTAINER = 0x26E3,
+ SMSG_OPEN_LFG_DUNGEON_FINDER = 0x29B0,
+ SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x2754,
+ SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x2756,
+ SMSG_OVERRIDE_LIGHT = 0x2669,
+ SMSG_PAGE_TEXT = 0x26D8,
+ SMSG_PARTY_COMMAND_RESULT = 0x2751,
+ SMSG_PARTY_INVITE = 0x2555,
+ SMSG_PARTY_KILL_LOG = 0x271B,
+ SMSG_PARTY_MEMBER_STATE = 0x2719,
+ SMSG_PARTY_UPDATE = 0x258E,
+ SMSG_PAUSE_MIRROR_TIMER = 0x26D0,
+ SMSG_PENDING_RAID_LOCK = 0x26B2,
+ SMSG_PETITION_ALREADY_SIGNED = 0x253E,
+ SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x2974,
+ SMSG_PETITION_SHOW_LIST = 0x266C,
+ SMSG_PETITION_SHOW_SIGNATURES = 0x266D,
+ SMSG_PETITION_SIGN_RESULTS = 0x270D,
+ SMSG_PET_ACTION_FEEDBACK = 0x270B,
+ SMSG_PET_ACTION_SOUND = 0x264A,
+ SMSG_PET_ADDED = 0x252E,
+ SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x259B,
+ SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x261D,
+ SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x2594,
+ SMSG_PET_BATTLE_FINAL_ROUND = 0x2599,
+ SMSG_PET_BATTLE_FINISHED = 0x259A,
+ SMSG_PET_BATTLE_FIRST_ROUND = 0x2596,
+ SMSG_PET_BATTLE_INITIAL_UPDATE = 0x2595,
+ SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x259C,
+ SMSG_PET_BATTLE_PVP_CHALLENGE = 0x2593,
+ SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x25D6,
+ SMSG_PET_BATTLE_QUEUE_STATUS = 0x25D7,
+ SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2598,
+ SMSG_PET_BATTLE_REQUEST_FAILED = 0x2592,
+ SMSG_PET_BATTLE_ROUND_RESULT = 0x2597,
+ SMSG_PET_BATTLE_SLOT_UPDATES = 0x2585,
+ SMSG_PET_CAST_FAILED = 0x2BD3,
+ SMSG_PET_CLEAR_SPELLS = 0x2BA1,
+ SMSG_PET_DISMISS_SOUND = 0x264B,
+ SMSG_PET_GOD_MODE = 0x2625,
+ SMSG_PET_GUIDS = 0x26C3,
+ SMSG_PET_LEARNED_SPELLS = 0x2BCD,
+ SMSG_PET_MODE = 0x2506,
+ SMSG_PET_NAME_INVALID = 0x2671,
+ SMSG_PET_SLOT_UPDATED = 0x2505,
+ SMSG_PET_SPELLS_MESSAGE = 0x2BA2,
+ SMSG_PET_STABLE_LIST = 0x252F,
+ SMSG_PET_STABLE_RESULT = 0x2530,
+ SMSG_PET_TAME_FAILURE = 0x265F,
+ SMSG_PET_UNLEARNED_SPELLS = 0x2BCE,
+ SMSG_PHASE_SHIFT_CHANGE = 0x24F5,
+ SMSG_PLAYED_TIME = 0x268A,
+ SMSG_PLAYER_BOUND = 0x24FB,
+ SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x2973,
+ SMSG_PLAYER_SKINNED = 0x2706,
+ SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x271A,
+ SMSG_PLAY_MUSIC = 0x2728,
+ SMSG_PLAY_OBJECT_SOUND = 0x2729,
+ SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x26F0,
+ SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2BC5,
+ SMSG_PLAY_SCENE = 0x25D3,
+ SMSG_PLAY_SOUND = 0x2727,
+ SMSG_PLAY_SPEAKERBOT_SOUND = 0x272A,
+ SMSG_PLAY_SPELL_VISUAL = 0x2BC3,
+ SMSG_PLAY_SPELL_VISUAL_KIT = 0x2BC7,
+ SMSG_PLAY_TIME_WARNING = 0x26BC,
+ SMSG_PONG = 0x2FCB,
+ SMSG_POWER_UPDATE = 0x2680,
+ SMSG_PRE_RESSURECT = 0x2726,
+ SMSG_PRINT_NOTIFICATION = 0x2566,
+ SMSG_PROC_RESIST = 0x271C,
+ SMSG_PROPOSE_LEVEL_GRANT = 0x2692,
+ SMSG_PVP_CREDIT = 0x2698,
+ SMSG_PVP_LOG_DATA = 0x2539,
+ SMSG_PVP_OPTIONS_ENABLED = 0x253C,
+ SMSG_PVP_SEASON = 0x2559,
+ SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2685,
+ SMSG_QUERY_CREATURE_RESPONSE = 0x267D,
+ SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x267E,
+ SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x28A2,
+ SMSG_QUERY_GUILD_INFO_RESPONSE = 0x2962,
+ SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x2778,
+ SMSG_QUERY_NPC_TEXT_RESPONSE = 0x2681,
+ SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x2683,
+ SMSG_QUERY_PETITION_RESPONSE = 0x2686,
+ SMSG_QUERY_PET_NAME_RESPONSE = 0x2684,
+ SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x2682,
+ SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A12,
+ SMSG_QUERY_TIME_RESPONSE = 0x269C,
+ SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x29FF,
+ SMSG_QUEST_CONFIRM_ACCEPT = 0x2A0B,
+ SMSG_QUEST_FORCE_REMOVED = 0x2A17,
+ SMSG_QUEST_GIVER_INVALID_QUEST = 0x2A02,
+ SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x2A10,
+ SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x2A00,
+ SMSG_QUEST_GIVER_QUEST_DETAILS = 0x2A0E,
+ SMSG_QUEST_GIVER_QUEST_FAILED = 0x2A03,
+ SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x2A15,
+ SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x2A0F,
+ SMSG_QUEST_GIVER_STATUS = 0x2A16,
+ SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x2A0D,
+ SMSG_QUEST_LOG_FULL = 0x2A04,
+ SMSG_QUEST_POI_QUERY_RESPONSE = 0x2A18,
+ SMSG_QUEST_PUSH_RESULT = 0x2A0C,
+ SMSG_QUEST_UPDATE_ADD_CREDIT = 0x2A08,
+ SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x2A09,
+ SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x2A0A,
+ SMSG_QUEST_UPDATE_COMPLETE = 0x2A05,
+ SMSG_QUEST_UPDATE_FAILED = 0x2A06,
+ SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A07,
+ SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x2742,
+ SMSG_RAID_DIFFICULTY_SET = 0x2761,
+ SMSG_RAID_GROUP_ONLY = 0x2763,
+ SMSG_RAID_INSTANCE_MESSAGE = 0x2B37,
+ SMSG_RAID_MARKERS_CHANGED = 0x253F,
+ SMSG_RANDOM_ROLL = 0x25CD,
+ SMSG_RATED_BATTLEFIELD_INFO = 0x252C,
+ SMSG_READY_CHECK_COMPLETED = 0x2591,
+ SMSG_READY_CHECK_RESPONSE = 0x2590,
+ SMSG_READY_CHECK_STARTED = 0x258F,
+ SMSG_READ_ITEM_RESULT_FAILED = 0x275C,
+ SMSG_READ_ITEM_RESULT_OK = 0x275B,
+ SMSG_REALM_QUERY_RESPONSE = 0x2668,
+ SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x2743,
+ SMSG_REFER_A_FRIEND_EXPIRED = 0x26E1,
+ SMSG_REFER_A_FRIEND_FAILURE = 0x266E,
+ SMSG_REFRESH_COMPONENT = 0x25F9,
+ SMSG_REFRESH_SPELL_HISTORY = 0x2BAA,
+ SMSG_REMOVE_ITEM_PASSIVE = 0x2546,
+ SMSG_REMOVE_LOSS_OF_CONTROL = 0x2618,
+ SMSG_REPLACE_TROPHY_RESPONSE = 0x2775,
+ SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x265B,
+ SMSG_REQUEST_ADDON_LIST = 0x25DF,
+ SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x2525,
+ SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x255A,
+ SMSG_RESEARCH_COMPLETE = 0x2503,
+ SMSG_RESET_COMPRESSION_CONTEXT = 0x2FCC,
+ SMSG_RESET_FAILED_NOTIFY = 0x2663,
+ SMSG_RESET_RANGED_COMBAT_TIMER = 0x2695,
+ SMSG_RESET_WEEKLY_CURRENCY = 0x24F2,
+ SMSG_RESPEC_WIPE_CONFIRM = 0x25A8,
+ SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x24EF,
+ SMSG_RESUME_CAST_BAR = 0x2BBB,
+ SMSG_RESUME_COMMS = 0x2FC8,
+ SMSG_RESUME_TOKEN = 0x2544,
+ SMSG_RESURRECT_REQUEST = 0x24FC,
+ SMSG_RESYNC_RUNES = 0x26BF,
+ SMSG_ROLE_CHANGED_INFORM = 0x2509,
+ SMSG_ROLE_CHOSEN = 0x29B8,
+ SMSG_ROLE_POLL_INFORM = 0x250A,
+ SMSG_RUNE_REGEN_DEBUG = 0x254D,
+ SMSG_SCENARIO_BOOT = 0x275D,
+ SMSG_SCENARIO_COMPLETED = 0x2788,
+ SMSG_SCENARIO_OUT_OF_BOUNDS = 0x275E,
+ SMSG_SCENARIO_POIS = 0x25CF,
+ SMSG_SCENARIO_PROGRESS_UPDATE = 0x25C9,
+ SMSG_SCENARIO_STATE = 0x25C8,
+ SMSG_SCENE_OBJECT_EVENT = 0x257B,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x2580,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x2581,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x257D,
+ SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x257C,
+ SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x257F,
+ SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x257E,
+ SMSG_SCRIPT_CAST = 0x2BD1,
+ SMSG_SELL_RESPONSE = 0x2672,
+ SMSG_SEND_ITEM_PASSIVES = 0x2547,
+ SMSG_SEND_KNOWN_SPELLS = 0x2BA8,
+ SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x25CB,
+ SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x25CC,
+ SMSG_SEND_SPELL_CHARGES = 0x2BAB,
+ SMSG_SEND_SPELL_HISTORY = 0x2BA9,
+ SMSG_SEND_UNLEARN_SPELLS = 0x2BAC,
+ SMSG_SERVER_FIRST_ACHIEVEMENT = 0x2B3F,
+ SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x25EB,
+ SMSG_SERVER_TIME = 0x262C,
+ SMSG_SETUP_CURRENCY = 0x24F0,
+ SMSG_SETUP_RESEARCH_HISTORY = 0x2502,
+ SMSG_SET_AI_ANIM_KIT = 0x26EF,
+ SMSG_SET_ALL_TASK_PROGRESS = 0x274B,
+ SMSG_SET_ANIM_TIER = 0x26F3,
+ SMSG_SET_CURRENCY = 0x24F1,
+ SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x29AC,
+ SMSG_SET_DUNGEON_DIFFICULTY = 0x264F,
+ SMSG_SET_FACTION_AT_WAR = 0x26BE,
+ SMSG_SET_FACTION_NOT_VISIBLE = 0x26EA,
+ SMSG_SET_FACTION_STANDING = 0x26EB,
+ SMSG_SET_FACTION_VISIBLE = 0x26E9,
+ SMSG_SET_FLAT_SPELL_MODIFIER = 0x2BB5,
+ SMSG_SET_FORCED_REACTIONS = 0x26DB,
+ SMSG_SET_ITEM_PURCHASE_DATA = 0x2536,
+ SMSG_SET_LOOT_METHOD_FAILED = 0x2784,
+ SMSG_SET_MAX_WEEKLY_QUANTITY = 0x253D,
+ SMSG_SET_MELEE_ANIM_KIT = 0x26F2,
+ SMSG_SET_MOVEMENT_ANIM_KIT = 0x26F1,
+ SMSG_SET_PCT_SPELL_MODIFIER = 0x2BB6,
+ SMSG_SET_PET_SPECIALIZATION = 0x25C2,
+ SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2689,
+ SMSG_SET_PLAY_HOVER_ANIM = 0x2551,
+ SMSG_SET_PROFICIENCY = 0x26F4,
+ SMSG_SET_SPELL_CHARGES = 0x2BA7,
+ SMSG_SET_TASK_COMPLETE = 0x274C,
+ SMSG_SET_TIME_ZONE_INFORMATION = 0x2620,
+ SMSG_SET_VEHICLE_REC_ID = 0x26B1,
+ SMSG_SHOW_BANK = 0x2629,
+ SMSG_SHOW_MAILBOX = 0x275F,
+ SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x2574,
+ SMSG_SHOW_TAXI_NODES = 0x2679,
+ SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x272F,
+ SMSG_SOCKET_GEMS = 0x26E7,
+ SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x2576,
+ SMSG_SPECIAL_MOUNT_ANIM = 0x2649,
+ SMSG_SPELL_ABSORB_LOG = 0x2B9C,
+ SMSG_SPELL_CHANNEL_START = 0x2BB3,
+ SMSG_SPELL_CHANNEL_UPDATE = 0x2BB4,
+ SMSG_SPELL_COOLDOWN = 0x2B93,
+ SMSG_SPELL_DAMAGE_SHIELD = 0x2BAF,
+ SMSG_SPELL_DELAYED = 0x2BBC,
+ SMSG_SPELL_DISPELL_LOG = 0x2B98,
+ SMSG_SPELL_ENERGIZE_LOG = 0x2B9A,
+ SMSG_SPELL_EXECUTE_LOG = 0x2BBD,
+ SMSG_SPELL_FAILED_OTHER = 0x2BD0,
+ SMSG_SPELL_FAILURE = 0x2BCF,
+ SMSG_SPELL_GO = 0x2BB7,
+ SMSG_SPELL_HEAL_LOG = 0x2B9B,
+ SMSG_SPELL_INSTAKILL_LOG = 0x2BB1,
+ SMSG_SPELL_INTERRUPT_LOG = 0x2B9D,
+ SMSG_SPELL_MISS_LOG = 0x2BBE,
+ SMSG_SPELL_MULTISTRIKE_EFFECT = 0x2BC0,
+ SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x2BB0,
+ SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x2BAD,
+ SMSG_SPELL_PERIODIC_AURA_LOG = 0x2B99,
+ SMSG_SPELL_START = 0x2BB8,
+ SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x2BB2,
+ SMSG_SPIRIT_HEALER_CONFIRM = 0x26D5,
+ SMSG_STAND_STATE_UPDATE = 0x26DA,
+ SMSG_START_ELAPSED_TIMER = 0x259D,
+ SMSG_START_ELAPSED_TIMERS = 0x259F,
+ SMSG_START_LOOT_ROLL = 0x25B3,
+ SMSG_START_MIRROR_TIMER = 0x26CF,
+ SMSG_START_TIMER = 0x2541,
+ SMSG_STOP_ELAPSED_TIMER = 0x259E,
+ SMSG_STOP_MIRROR_TIMER = 0x26D1,
+ SMSG_STOP_SPEAKERBOT_SOUND = 0x272B,
+ SMSG_STREAMING_MOVIES = 0x2540,
+ SMSG_SUMMON_CANCEL = 0x265A,
+ SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x250B,
+ SMSG_SUMMON_REQUEST = 0x26DF,
+ SMSG_SUPERCEDED_SPELLS = 0x2BCA,
+ SMSG_SUPPRESS_NPC_GREETINGS = 0x2554,
+ SMSG_SUSPEND_COMMS = 0x2FC7,
+ SMSG_SUSPEND_TOKEN = 0x2543,
+ SMSG_TALENTS_INVOLUNTARILY_RESET = 0x26D7,
+ SMSG_TAXI_NODE_STATUS = 0x2626,
+ SMSG_TEXT_EMOTE = 0x2624,
+ SMSG_THREAT_CLEAR = 0x2691,
+ SMSG_THREAT_REMOVE = 0x2690,
+ SMSG_THREAT_UPDATE = 0x268F,
+ SMSG_TIME_ADJUSTMENT = 0x2D1F,
+ SMSG_TIME_SYNC_REQUEST = 0x2D1E,
+ SMSG_TITLE_EARNED = 0x268C,
+ SMSG_TITLE_LOST = 0x268D,
+ SMSG_TOTEM_CREATED = 0x2675,
+ SMSG_TOTEM_MOVED = 0x2676,
+ SMSG_TRADE_STATUS = 0x24FF,
+ SMSG_TRADE_UPDATED = 0x24FE,
+ SMSG_TRAINER_BUY_FAILED = 0x2697,
+ SMSG_TRAINER_LIST = 0x2696,
+ SMSG_TRANSFER_ABORTED = 0x26C2,
+ SMSG_TRANSFER_PENDING = 0x2569,
+ SMSG_TRIGGER_CINEMATIC = 0x277C,
+ SMSG_TRIGGER_MOVIE = 0x2677,
+ SMSG_TURN_IN_PETITION_RESULT = 0x270F,
+ SMSG_TUTORIAL_FLAGS = 0x2770,
+ SMSG_TWITTER_STATUS = 0x2F7B,
+ SMSG_UI_TIME = 0x26D4,
+ SMSG_UNDELETE_CHARACTER_RESPONSE = 0x277F,
+ SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2780,
+ SMSG_UNLEARNED_SPELLS = 0x2BCC,
+ SMSG_UPDATE_ACCOUNT_DATA = 0x26C9,
+ SMSG_UPDATE_ACTION_BUTTONS = 0x2579,
+ SMSG_UPDATE_CHARACTER_FLAGS = 0x2774,
+ SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x29AF,
+ SMSG_UPDATE_EXPANSION_LEVEL = 0x25E4,
+ SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x2652,
+ SMSG_UPDATE_LAST_INSTANCE = 0x2632,
+ SMSG_UPDATE_OBJECT = 0x277D,
+ SMSG_UPDATE_TALENT_DATA = 0x256E,
+ SMSG_UPDATE_TASK_PROGRESS = 0x274A,
+ SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2B97,
+ SMSG_UPDATE_WORLD_STATE = 0x270A,
+ SMSG_USERLIST_ADD = 0x2B3C,
+ SMSG_USERLIST_REMOVE = 0x2B3D,
+ SMSG_USERLIST_UPDATE = 0x2B3E,
+ SMSG_USE_EQUIPMENT_SET_RESULT = 0x2710,
+ SMSG_VENDOR_INVENTORY = 0x254F,
+ SMSG_VIGNETTE_UPDATE = 0x272D,
+ SMSG_VOICE_CHAT_STATUS = 0x2B31,
+ SMSG_VOICE_PARENTAL_CONTROLS = 0x2B32,
+ SMSG_VOICE_SESSION_LEAVE = 0x2B34,
+ SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x2B33,
+ SMSG_VOID_ITEM_SWAP_RESPONSE = 0x2564,
+ SMSG_VOID_STORAGE_CONTENTS = 0x2561,
+ SMSG_VOID_STORAGE_FAILED = 0x2560,
+ SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x2562,
+ SMSG_VOID_TRANSFER_RESULT = 0x2563,
+ SMSG_WAIT_QUEUE_FINISH = 0x24EC,
+ SMSG_WAIT_QUEUE_UPDATE = 0x24EB,
+ SMSG_WARDEN_DATA = 0x24F4,
+ SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x253A,
+ SMSG_WEATHER = 0x2651,
+ SMSG_WEEKLY_SPELL_USAGE = 0x2B96,
+ SMSG_WHO = 0x2B2C,
+ SMSG_WHO_IS = 0x2650,
+ SMSG_WORLD_SERVER_INFO = 0x2548,
+ SMSG_WORLD_TEXT = 0x2789,
+ SMSG_WOW_TOKEN_AUCTION_SOLD = 0x2790,
+ SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x2792,
+ SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2793,
+ SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x278D,
+ SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2794,
+ SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2795,
+ SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2796,
+ SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x278E,
+ SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x278F,
+ SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2797,
+ SMSG_XP_GAIN_ABORTED = 0x2565,
+ SMSG_XP_GAIN_ENABLED = 0x2762,
+ SMSG_ZONE_UNDER_ATTACK = 0x2B38,
// Opcodes that are not generated automatically
SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0xBADD, // no client handler
- SMSG_CHUNKED_PACKET = 0x0227,
- SMSG_COMPRESSED_PACKET = 0x0224,
- SMSG_FINAL_CHUNK = 0x02A4,
- SMSG_MULTIPLE_PACKETS = 0x0303,
+ SMSG_COMPRESSED_PACKET = 0x2FCF,
+ SMSG_MULTIPLE_PACKETS = 0x2FCE,
// 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 c780c27ccf0..2d088606023 100644
--- a/src/server/game/Server/Protocol/PacketLog.cpp
+++ b/src/server/game/Server/Protocol/PacketLog.cpp
@@ -70,6 +70,12 @@ PacketLog::~PacketLog()
_file = NULL;
}
+PacketLog* PacketLog::instance()
+{
+ static PacketLog instance;
+ return &instance;
+}
+
void PacketLog::Initialize()
{
std::string logsDir = sConfigMgr->GetStringDefault("LogsDir", "");
diff --git a/src/server/game/Server/Protocol/PacketLog.h b/src/server/game/Server/Protocol/PacketLog.h
index f7c8652bd66..329658f0789 100644
--- a/src/server/game/Server/Protocol/PacketLog.h
+++ b/src/server/game/Server/Protocol/PacketLog.h
@@ -32,7 +32,7 @@ enum Direction
class WorldPacket;
-class PacketLog
+class TC_GAME_API PacketLog
{
private:
PacketLog();
@@ -41,11 +41,7 @@ class PacketLog
std::once_flag _initializeFlag;
public:
- static PacketLog* instance()
- {
- static PacketLog instance;
- return &instance;
- }
+ static PacketLog* instance();
void Initialize();
bool CanLogPacket() const { return (_file != NULL); }
diff --git a/src/server/game/Server/Protocol/ServerPktHeader.h b/src/server/game/Server/Protocol/ServerPktHeader.h
index 6ca65c9e5fb..d3fe37de94a 100644
--- a/src/server/game/Server/Protocol/ServerPktHeader.h
+++ b/src/server/game/Server/Protocol/ServerPktHeader.h
@@ -26,13 +26,13 @@ union ServerPktHeader
struct
{
uint16 Size;
- uint32 Command;
+ uint16 Command;
} Setup;
struct
{
- uint32 Command : 13;
- uint32 Size : 19;
+ uint32 Size;
+ uint16 Command;
} Normal;
};
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 78e7bbfc180..ebb3ea02896 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -42,7 +42,6 @@
#include "SocialMgr.h"
#include "ScriptMgr.h"
#include "WardenWin.h"
-#include "BattlenetServerManager.h"
#include "AuthenticationPackets.h"
#include "CharacterPackets.h"
#include "ClientConfigPackets.h"
@@ -419,12 +418,12 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
}
break;
case STATUS_NEVER:
- TC_LOG_ERROR("network.opcode", "Received not allowed opcode %s from %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet->GetOpcode())).c_str()
- , GetPlayerInfo().c_str());
+ TC_LOG_ERROR("network.opcode", "Received not allowed opcode %s from %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet->GetOpcode())).c_str()
+ , GetPlayerInfo().c_str());
break;
case STATUS_UNHANDLED:
- TC_LOG_ERROR("network.opcode", "Received not handled opcode %s from %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet->GetOpcode())).c_str()
- , GetPlayerInfo().c_str());
+ TC_LOG_ERROR("network.opcode", "Received not handled opcode %s from %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet->GetOpcode())).c_str()
+ , GetPlayerInfo().c_str());
break;
}
}
@@ -612,8 +611,6 @@ void WorldSession::LogoutPlayer(bool save)
TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Logout Character:[%s] (%s) Level: %d",
GetAccountId(), GetRemoteAddress().c_str(), _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), _player->getLevel());
- sBattlenetServer.SendChangeToonOnlineState(GetBattlenetAccountId(), GetAccountId(), _player->GetGUID(), _player->GetName(), false);
-
if (Map* _map = _player->FindMap())
_map->RemovePlayerFromMap(_player, true);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 9655968dcb3..1bcc9d0b373 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -863,7 +863,7 @@ struct PacketCounter
};
/// Player session in the World
-class WorldSession
+class TC_GAME_API WorldSession
{
public:
WorldSession(uint32 id, std::string&& name, uint32 battlenetAccountId, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter);
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index acec25a7363..84561dbd37e 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -20,10 +20,12 @@
#include "AuthenticationPackets.h"
#include "BigNumber.h"
#include "CharacterPackets.h"
+#include "HmacHash.h"
#include "Opcodes.h"
-#include "ScriptMgr.h"
-#include "SHA1.h"
#include "PacketLog.h"
+#include "ScriptMgr.h"
+#include "SessionKeyGeneration.h"
+#include "SHA256.h"
#include "World.h"
#include <zlib.h>
@@ -53,22 +55,24 @@ private:
using boost::asio::ip::tcp;
+uint32 const WorldSocket::ConnectionInitializeMagic = 0xF5EB1CE;
std::string const WorldSocket::ServerConnectionInitialize("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT");
std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER");
uint32 const WorldSocket::MinSizeForCompression = 0x400;
-uint32 const SizeOfClientHeader[2][2] =
-{
- { 2, 0 },
- { 6, 4 }
-};
+uint32 const SizeOfClientHeader[2] = { sizeof(uint16) + sizeof(uint16), sizeof(uint32) + sizeof(uint16) };
+uint32 const SizeOfServerHeader[2] = { sizeof(uint16) + sizeof(uint16), sizeof(uint32) + sizeof(uint16) };
+
+uint8 const WorldSocket::AuthCheckSeed[16] = { 0xC5, 0xC6, 0x98, 0x95, 0x76, 0x3F, 0x1D, 0xCD, 0xB6, 0xA1, 0x37, 0x28, 0xB3, 0x12, 0xFF, 0x8A };
+uint8 const WorldSocket::SessionKeySeed[16] = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B };
+uint8 const WorldSocket::ContinuedSessionSeed[16] = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F };
-uint32 const SizeOfServerHeader[2] = { sizeof(uint16) + sizeof(uint32), sizeof(uint32) };
WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)),
- _type(CONNECTION_TYPE_REALM), _authSeed(rand32()), _OverSpeedPings(0),
- _worldSession(nullptr), _authed(false), _compressionStream(nullptr), _initialized(false)
+ _type(CONNECTION_TYPE_REALM), _OverSpeedPings(0),
+ _worldSession(nullptr), _authed(false), _compressionStream(nullptr)
{
- _headerBuffer.Resize(SizeOfClientHeader[0][0]);
+ _serverChallenge.SetRand(8 * 16);
+ _headerBuffer.Resize(SizeOfClientHeader[0]);
}
WorldSocket::~WorldSocket()
@@ -116,11 +120,14 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result)
}
}
- AsyncRead();
+ _packetBuffer.Resize(4 + 2 + ClientConnectionInitialize.length() + 1);
+
+ AsyncReadWithCallback(&WorldSocket::InitializeHandler);
MessageBuffer initializer;
ServerPktHeader header;
header.Setup.Size = ServerConnectionInitialize.size();
+ initializer.Write(&ConnectionInitializeMagic, sizeof(ConnectionInitializeMagic));
initializer.Write(&header, sizeof(header.Setup.Size));
initializer.Write(ServerConnectionInitialize.c_str(), ServerConnectionInitialize.length());
@@ -128,6 +135,71 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result)
QueuePacket(std::move(initializer));
}
+void WorldSocket::InitializeHandler(boost::system::error_code error, std::size_t transferedBytes)
+{
+ if (error)
+ {
+ CloseSocket();
+ return;
+ }
+
+ GetReadBuffer().WriteCompleted(transferedBytes);
+
+ MessageBuffer& packet = GetReadBuffer();
+ if (packet.GetActiveSize() > 0)
+ {
+ if (_packetBuffer.GetRemainingSpace() > 0)
+ {
+ // need to receive the header
+ std::size_t readHeaderSize = std::min(packet.GetActiveSize(), _packetBuffer.GetRemainingSpace());
+ _packetBuffer.Write(packet.GetReadPointer(), readHeaderSize);
+ packet.ReadCompleted(readHeaderSize);
+
+ if (_packetBuffer.GetRemainingSpace() > 0)
+ {
+ // Couldn't receive the whole header this time.
+ ASSERT(packet.GetActiveSize() == 0);
+ AsyncReadWithCallback(&WorldSocket::InitializeHandler);
+ return;
+ }
+
+ uint32 magic;
+ uint16 length;
+ ByteBuffer buffer(std::move(_packetBuffer));
+
+ buffer >> magic;
+ buffer >> length;
+ std::string initializer = buffer.ReadString(length);
+ if (magic != ConnectionInitializeMagic || initializer != ClientConnectionInitialize)
+ {
+ CloseSocket();
+ return;
+ }
+
+ _compressionStream = new z_stream();
+ _compressionStream->zalloc = (alloc_func)NULL;
+ _compressionStream->zfree = (free_func)NULL;
+ _compressionStream->opaque = (voidpf)NULL;
+ _compressionStream->avail_in = 0;
+ _compressionStream->next_in = NULL;
+ int32 z_res = deflateInit2(_compressionStream, sWorld->getIntConfig(CONFIG_COMPRESSION), Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
+ if (z_res != Z_OK)
+ {
+ CloseSocket();
+ TC_LOG_ERROR("network", "Can't initialize packet compression (zlib: deflateInit) Error code: %i (%s)", z_res, zError(z_res));
+ return;
+ }
+
+ _packetBuffer.Reset();
+ HandleSendAuthSession();
+ AsyncRead();
+ return;
+ }
+ }
+
+ AsyncReadWithCallback(&WorldSocket::InitializeHandler);
+}
+
bool WorldSocket::Update()
{
EncryptablePacket* queued;
@@ -179,7 +251,7 @@ void WorldSocket::HandleSendAuthSession()
_decryptSeed.SetRand(16 * 8);
WorldPackets::Auth::AuthChallenge challenge;
- challenge.Challenge = _authSeed;
+ memcpy(challenge.Challenge.data(), _serverChallenge.AsByteArray(16).get(), 16);
memcpy(&challenge.DosChallenge[0], _encryptSeed.AsByteArray(16).get(), 16);
memcpy(&challenge.DosChallenge[4], _decryptSeed.AsByteArray(16).get(), 16);
challenge.DosZeroBits = 1;
@@ -261,14 +333,12 @@ void WorldSocket::ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& op
if (_authCrypt.IsInitialized())
{
opcode = header->Normal.Command;
- size = header->Normal.Size;
+ size = header->Normal.Size - 2;
}
else
{
opcode = header->Setup.Command;
- size = header->Setup.Size;
- if (_initialized)
- size -= 4;
+ size = header->Setup.Size - 2;
}
}
@@ -281,9 +351,9 @@ void WorldSocket::SetWorldSession(WorldSession* session)
bool WorldSocket::ReadHeaderHandler()
{
- ASSERT(_headerBuffer.GetActiveSize() == SizeOfClientHeader[_initialized][_authCrypt.IsInitialized()], "Header size " SZFMTD " different than expected %u", _headerBuffer.GetActiveSize(), SizeOfClientHeader[_initialized][_authCrypt.IsInitialized()]);
+ ASSERT(_headerBuffer.GetActiveSize() == SizeOfClientHeader[_authCrypt.IsInitialized()], "Header size " SZFMTD " different than expected %u", _headerBuffer.GetActiveSize(), SizeOfClientHeader[_authCrypt.IsInitialized()]);
- _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), _headerBuffer.GetActiveSize());
+ _authCrypt.DecryptRecv(_headerBuffer.GetReadPointer(), 4);
ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer());
uint32 opcode;
@@ -291,7 +361,7 @@ bool WorldSocket::ReadHeaderHandler()
ExtractOpcodeAndSize(header, opcode, size);
- if (!ClientPktHeader::IsValidSize(size) || (_initialized && !ClientPktHeader::IsValidOpcode(opcode)))
+ if (!ClientPktHeader::IsValidSize(size) || !ClientPktHeader::IsValidOpcode(opcode))
{
TC_LOG_ERROR("network", "WorldSocket::ReadHeaderHandler(): client %s sent malformed packet (size: %u, cmd: %u)",
GetRemoteIpAddress().to_string().c_str(), size, opcode);
@@ -304,133 +374,106 @@ bool WorldSocket::ReadHeaderHandler()
WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler()
{
- if (_initialized)
- {
- ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer());
- uint32 cmd;
- uint32 size;
+ ClientPktHeader* header = reinterpret_cast<ClientPktHeader*>(_headerBuffer.GetReadPointer());
+ uint32 cmd;
+ uint32 size;
- ExtractOpcodeAndSize(header, cmd, size);
+ ExtractOpcodeAndSize(header, cmd, size);
- OpcodeClient opcode = static_cast<OpcodeClient>(cmd);
+ OpcodeClient opcode = static_cast<OpcodeClient>(cmd);
- WorldPacket packet(opcode, std::move(_packetBuffer), GetConnectionType());
+ WorldPacket packet(opcode, std::move(_packetBuffer), GetConnectionType());
- if (sPacketLog->CanLogPacket())
- sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort(), GetConnectionType());
+ if (sPacketLog->CanLogPacket())
+ sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort(), GetConnectionType());
- std::unique_lock<std::mutex> sessionGuard(_worldSessionLock, std::defer_lock);
+ std::unique_lock<std::mutex> sessionGuard(_worldSessionLock, std::defer_lock);
- switch (opcode)
+ switch (opcode)
+ {
+ case CMSG_PING:
+ LogOpcodeText(opcode, sessionGuard);
+ return HandlePing(packet) ? ReadDataHandlerResult::Ok : ReadDataHandlerResult::Error;
+ case CMSG_AUTH_SESSION:
{
- case CMSG_PING:
- LogOpcodeText(opcode, sessionGuard);
- return HandlePing(packet) ? ReadDataHandlerResult::Ok : ReadDataHandlerResult::Error;
- case CMSG_AUTH_SESSION:
+ LogOpcodeText(opcode, sessionGuard);
+ if (_authed)
{
- LogOpcodeText(opcode, sessionGuard);
- if (_authed)
- {
- // locking just to safely log offending user is probably overkill but we are disconnecting him anyway
- if (sessionGuard.try_lock())
- TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
- return ReadDataHandlerResult::Error;
- }
-
- std::shared_ptr<WorldPackets::Auth::AuthSession> authSession = std::make_shared<WorldPackets::Auth::AuthSession>(std::move(packet));
- authSession->Read();
- HandleAuthSession(authSession);
- return ReadDataHandlerResult::WaitingForQuery;
+ // locking just to safely log offending user is probably overkill but we are disconnecting him anyway
+ if (sessionGuard.try_lock())
+ TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
+ return ReadDataHandlerResult::Error;
}
- case CMSG_AUTH_CONTINUED_SESSION:
- {
- LogOpcodeText(opcode, sessionGuard);
- if (_authed)
- {
- // locking just to safely log offending user is probably overkill but we are disconnecting him anyway
- if (sessionGuard.try_lock())
- TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_CONTINUED_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
- return ReadDataHandlerResult::Error;
- }
- std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession = std::make_shared<WorldPackets::Auth::AuthContinuedSession>(std::move(packet));
- authSession->Read();
- HandleAuthContinuedSession(authSession);
- return ReadDataHandlerResult::WaitingForQuery;
- }
- case CMSG_KEEP_ALIVE:
- LogOpcodeText(opcode, sessionGuard);
- break;
- case CMSG_LOG_DISCONNECT:
- LogOpcodeText(opcode, sessionGuard);
- packet.rfinish(); // contains uint32 disconnectReason;
- break;
- case CMSG_ENABLE_NAGLE:
- LogOpcodeText(opcode, sessionGuard);
- SetNoDelay(false);
- break;
- case CMSG_CONNECT_TO_FAILED:
+ std::shared_ptr<WorldPackets::Auth::AuthSession> authSession = std::make_shared<WorldPackets::Auth::AuthSession>(std::move(packet));
+ authSession->Read();
+ HandleAuthSession(authSession);
+ return ReadDataHandlerResult::WaitingForQuery;
+ }
+ case CMSG_AUTH_CONTINUED_SESSION:
+ {
+ LogOpcodeText(opcode, sessionGuard);
+ if (_authed)
{
- sessionGuard.lock();
-
- LogOpcodeText(opcode, sessionGuard);
- WorldPackets::Auth::ConnectToFailed connectToFailed(std::move(packet));
- connectToFailed.Read();
- HandleConnectToFailed(connectToFailed);
- break;
+ // locking just to safely log offending user is probably overkill but we are disconnecting him anyway
+ if (sessionGuard.try_lock())
+ TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_CONTINUED_SESSION from %s", _worldSession->GetPlayerInfo().c_str());
+ return ReadDataHandlerResult::Error;
}
- default:
- {
- sessionGuard.lock();
- LogOpcodeText(opcode, sessionGuard);
+ std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession = std::make_shared<WorldPackets::Auth::AuthContinuedSession>(std::move(packet));
+ authSession->Read();
+ HandleAuthContinuedSession(authSession);
+ return ReadDataHandlerResult::WaitingForQuery;
+ }
+ case CMSG_KEEP_ALIVE:
+ LogOpcodeText(opcode, sessionGuard);
+ break;
+ case CMSG_LOG_DISCONNECT:
+ LogOpcodeText(opcode, sessionGuard);
+ packet.rfinish(); // contains uint32 disconnectReason;
+ break;
+ case CMSG_ENABLE_NAGLE:
+ LogOpcodeText(opcode, sessionGuard);
+ SetNoDelay(false);
+ break;
+ case CMSG_CONNECT_TO_FAILED:
+ {
+ sessionGuard.lock();
- if (!_worldSession)
- {
- TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
- return ReadDataHandlerResult::Error;
- }
+ LogOpcodeText(opcode, sessionGuard);
+ WorldPackets::Auth::ConnectToFailed connectToFailed(std::move(packet));
+ connectToFailed.Read();
+ HandleConnectToFailed(connectToFailed);
+ break;
+ }
+ default:
+ {
+ sessionGuard.lock();
- OpcodeHandler const* handler = opcodeTable[opcode];
- if (!handler)
- {
- TC_LOG_ERROR("network.opcode", "No defined handler for opcode %s sent by %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet.GetOpcode())).c_str(), _worldSession->GetPlayerInfo().c_str());
- break;
- }
+ LogOpcodeText(opcode, sessionGuard);
- // Our Idle timer will reset on any non PING opcodes.
- // Catches people idling on the login screen and any lingering ingame connections.
- _worldSession->ResetTimeOutTime();
+ if (!_worldSession)
+ {
+ TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode));
+ return ReadDataHandlerResult::Error;
+ }
- // Copy the packet to the heap before enqueuing
- _worldSession->QueuePacket(new WorldPacket(std::move(packet)));
+ OpcodeHandler const* handler = opcodeTable[opcode];
+ if (!handler)
+ {
+ TC_LOG_ERROR("network.opcode", "No defined handler for opcode %s sent by %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet.GetOpcode())).c_str(), _worldSession->GetPlayerInfo().c_str());
break;
}
- }
- }
- else
- {
- std::string initializer(reinterpret_cast<char const*>(_packetBuffer.GetReadPointer()), std::min(_packetBuffer.GetActiveSize(), ClientConnectionInitialize.length()));
- if (initializer != ClientConnectionInitialize)
- return ReadDataHandlerResult::Error;
-
- _compressionStream = new z_stream();
- _compressionStream->zalloc = (alloc_func)NULL;
- _compressionStream->zfree = (free_func)NULL;
- _compressionStream->opaque = (voidpf)NULL;
- _compressionStream->avail_in = 0;
- _compressionStream->next_in = NULL;
- int32 z_res = deflateInit2(_compressionStream, sWorld->getIntConfig(CONFIG_COMPRESSION), Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
- if (z_res != Z_OK)
- {
- TC_LOG_ERROR("network", "Can't initialize packet compression (zlib: deflateInit) Error code: %i (%s)", z_res, zError(z_res));
- return ReadDataHandlerResult::Error;
- }
- _initialized = true;
- _headerBuffer.Resize(SizeOfClientHeader[1][0]);
- _packetBuffer.Reset();
- HandleSendAuthSession();
+ // Our Idle timer will reset on any non PING opcodes.
+ // Catches people idling on the login screen and any lingering ingame connections.
+ _worldSession->ResetTimeOutTime();
+
+ // Copy the packet to the heap before enqueuing
+ _worldSession->QueuePacket(new WorldPacket(std::move(packet)));
+ break;
+ }
}
return ReadDataHandlerResult::Ok;
@@ -480,8 +523,8 @@ void WorldSocket::WritePacketToBuffer(EncryptablePacket const& packet, MessageBu
if (packetSize > MinSizeForCompression && packet.NeedsEncryption())
{
CompressedWorldPacket cmp;
- cmp.UncompressedSize = packetSize + 4;
- cmp.UncompressedAdler = adler32(adler32(0x9827D8F1, (Bytef*)&opcode, 4), packet.contents(), packetSize);
+ cmp.UncompressedSize = packetSize + 2;
+ cmp.UncompressedAdler = adler32(adler32(0x9827D8F1, (Bytef*)&opcode, 2), packet.contents(), packetSize);
// Reserve space for compression info - uncompressed size and checksums
uint8* compressionInfo = buffer.GetWritePointer();
@@ -500,15 +543,17 @@ void WorldSocket::WritePacketToBuffer(EncryptablePacket const& packet, MessageBu
else if (!packet.empty())
buffer.Write(packet.contents(), packet.size());
+ packetSize += 2 /*opcode*/;
+
if (packet.NeedsEncryption())
{
header.Normal.Size = packetSize;
header.Normal.Command = opcode;
- _authCrypt.EncryptSend((uint8*)&header, sizeOfHeader);
+ _authCrypt.EncryptSend((uint8*)&header, 4);
}
else
{
- header.Setup.Size = packetSize + 4;
+ header.Setup.Size = packetSize;
header.Setup.Command = opcode;
}
@@ -518,12 +563,12 @@ void WorldSocket::WritePacketToBuffer(EncryptablePacket const& packet, MessageBu
uint32 WorldSocket::CompressPacket(uint8* buffer, WorldPacket const& packet)
{
uint32 opcode = packet.GetOpcode();
- uint32 bufferSize = deflateBound(_compressionStream, packet.size() + sizeof(opcode));
+ uint32 bufferSize = deflateBound(_compressionStream, packet.size() + sizeof(uint16));
_compressionStream->next_out = buffer;
_compressionStream->avail_out = bufferSize;
_compressionStream->next_in = (Bytef*)&opcode;
- _compressionStream->avail_in = sizeof(uint32);
+ _compressionStream->avail_in = sizeof(uint16);
int32 z_res = deflate(_compressionStream, Z_NO_FLUSH);
if (z_res != Z_OK)
@@ -554,7 +599,6 @@ struct AccountInfo
std::string LastIP;
std::string LockCountry;
LocaleConstant Locale;
- std::string OS;
bool IsBanned;
} BattleNet;
@@ -566,6 +610,7 @@ struct AccountInfo
uint8 Expansion;
int64 MuteTime;
uint32 Recruiter;
+ std::string OS;
bool IsRectuiter;
AccountTypes Security;
bool IsBanned;
@@ -575,8 +620,8 @@ struct AccountInfo
explicit AccountInfo(Field* fields)
{
- // 0 1 2 3 4 5 6 7 8 9 10 11
- // SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, ba.os, ba.id, aa.gmLevel,
+ // 0 1 2 3 4 5 6 7 8 9 10 11
+ // SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, ba.lock_country, a.expansion, a.mutetime, ba.locale, a.recruiter, a.os, ba.id, aa.gmLevel,
// 12 13 14
// 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, ?)
@@ -591,7 +636,7 @@ struct AccountInfo
Game.MuteTime = fields[6].GetInt64();
BattleNet.Locale = LocaleConstant(fields[7].GetUInt8());
Game.Recruiter = fields[8].GetUInt32();
- BattleNet.OS = fields[9].GetString();
+ Game.OS = fields[9].GetString();
BattleNet.Id = fields[10].GetUInt32();
Game.Security = AccountTypes(fields[11].GetUInt8());
BattleNet.IsBanned = fields[12].GetUInt64() != 0;
@@ -610,12 +655,12 @@ struct AccountInfo
void WorldSocket::HandleAuthSession(std::shared_ptr<WorldPackets::Auth::AuthSession> authSession)
{
// Client switches packet headers after sending CMSG_AUTH_SESSION
- _headerBuffer.Resize(SizeOfClientHeader[1][1]);
+ _headerBuffer.Resize(SizeOfClientHeader[1]);
// Get the account information from the auth database
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME);
stmt->setInt32(0, int32(realm.Id.Realm));
- stmt->setString(1, authSession->Account);
+ stmt->setString(1, authSession->RealmJoinTicket);
_queryCallback = std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1);
_queryFuture = LoginDatabase.AsyncQuery(stmt);
@@ -627,7 +672,6 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
if (!result)
{
// We can not log here, as we do not know the account. Thus, no accountId.
- SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (unknown account).");
DelayedCloseSocket();
return;
@@ -638,16 +682,43 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
// For hook purposes, we get Remoteaddress at this point.
std::string address = GetRemoteIpAddress().to_string();
+ HmacSha256 hmac(SHA256_DIGEST_LENGTH, account.Game.SessionKey.AsByteArray(SHA256_DIGEST_LENGTH).get());
+ hmac.UpdateData(authSession->LocalChallenge.data(), authSession->LocalChallenge.size());
+ hmac.UpdateData(_serverChallenge.AsByteArray(16).get(), 16);
+ hmac.UpdateData(AuthCheckSeed, 16);
+ hmac.Finalize();
+
+ if (memcmp(hmac.GetDigest(), authSession->Digest.data(), authSession->Digest.size()) != 0)
+ {
+ TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", account.Game.Id, authSession->RealmJoinTicket.c_str(), address.c_str());
+ DelayedCloseSocket();
+ return;
+ }
+
+ HmacSha256 sessionKeyHmac(SHA256_DIGEST_LENGTH, account.Game.SessionKey.AsByteArray(SHA256_DIGEST_LENGTH).get());
+ sessionKeyHmac.UpdateData(_serverChallenge.AsByteArray(16).get(), 16);
+ sessionKeyHmac.UpdateData(authSession->LocalChallenge.data(), authSession->LocalChallenge.size());
+ sessionKeyHmac.UpdateData(SessionKeySeed, 16);
+ sessionKeyHmac.Finalize();
+
+ uint8 sessionKey[40];
+ SessionKeyGenerator<SHA256Hash> sessionKeyGenerator(sessionKeyHmac.GetDigest(), sessionKeyHmac.GetLength());
+ sessionKeyGenerator.Generate(sessionKey, 40);
+
+ BigNumber K;
+ K.SetBinary(sessionKey, 40);
+
+ // Check that Key and account name are the same on client and server
+ // only do this after verifying credentials - no error message is better than bad encryption making the client crash
+ _authCrypt.Init(&K);
+
// As we don't know if attempted login process by ip works, we update last_attempt_ip right away
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_ATTEMPT_IP);
stmt->setString(0, address);
- stmt->setString(1, authSession->Account);
+ stmt->setString(1, authSession->RealmJoinTicket);
LoginDatabase.Execute(stmt);
// This also allows to check for possible "hack" attempts on account
- // even if auth credentials are bad, try using the session key we have - client cannot read auth response error without it
- _authCrypt.Init(&account.Game.SessionKey);
-
// First reject the connection if packet contains invalid data or realm state doesn't allow logging in
if (sWorld->IsClosed())
{
@@ -668,37 +739,10 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
// Must be done before WorldSession is created
bool wardenActive = sWorld->getBoolConfig(CONFIG_WARDEN_ENABLED);
- if (wardenActive && account.BattleNet.OS != "Win" && account.BattleNet.OS != "Wn64" && account.BattleNet.OS != "Mc64")
+ if (wardenActive && account.Game.OS != "Win" && account.Game.OS != "Wn64" && account.Game.OS != "Mc64")
{
SendAuthResponseError(AUTH_REJECT);
- TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s attempted to log in using invalid client OS (%s).", address.c_str(), account.BattleNet.OS.c_str());
- DelayedCloseSocket();
- return;
- }
-
- if (!account.BattleNet.Id || authSession->LoginServerType != 1)
- {
- SendAuthResponseError(AUTH_REJECT);
- TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s (%s) attempted to log in using deprecated login method (GRUNT).", authSession->Account.c_str(), address.c_str());
- DelayedCloseSocket();
- return;
- }
-
- // Check that Key and account name are the same on client and server
- uint32 t = 0;
-
- SHA1Hash sha;
- sha.UpdateData(authSession->Account);
- sha.UpdateData((uint8*)&t, 4);
- sha.UpdateData((uint8*)&authSession->LocalChallenge, 4);
- sha.UpdateData((uint8*)&_authSeed, 4);
- sha.UpdateBigNumbers(&account.Game.SessionKey, NULL);
- sha.Finalize();
-
- if (memcmp(sha.GetDigest(), authSession->Digest, SHA_DIGEST_LENGTH) != 0)
- {
- SendAuthResponseError(AUTH_FAILED);
- TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", account.Game.Id, authSession->Account.c_str(), address.c_str());
+ TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s attempted to log in using invalid client OS (%s).", address.c_str(), account.Game.OS.c_str());
DelayedCloseSocket();
return;
}
@@ -762,13 +806,13 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
return;
}
- TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.", authSession->Account.c_str(), address.c_str());
+ TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.", authSession->RealmJoinTicket.c_str(), address.c_str());
// Update the last_ip in the database as it was successful for login
stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_IP);
stmt->setString(0, address);
- stmt->setString(1, authSession->Account);
+ stmt->setString(1, authSession->RealmJoinTicket);
LoginDatabase.Execute(stmt);
@@ -776,13 +820,13 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::
sScriptMgr->OnAccountLogin(account.Game.Id);
_authed = true;
- _worldSession = new WorldSession(account.Game.Id, std::move(authSession->Account), account.BattleNet.Id, shared_from_this(), account.Game.Security,
+ _worldSession = new WorldSession(account.Game.Id, std::move(authSession->RealmJoinTicket), account.BattleNet.Id, shared_from_this(), account.Game.Security,
account.Game.Expansion, mutetime, account.BattleNet.Locale, account.Game.Recruiter, account.Game.IsRectuiter);
_worldSession->ReadAddonsInfo(authSession->AddonInfo);
// Initialize Warden system only if it is enabled by config
if (wardenActive)
- _worldSession->InitWarden(&account.Game.SessionKey, account.BattleNet.OS);
+ _worldSession->InitWarden(&account.Game.SessionKey, account.Game.OS);
_queryCallback = std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1);
_queryFuture = _worldSession->LoadPermissionsAsync();
@@ -811,7 +855,7 @@ void WorldSocket::HandleAuthContinuedSession(std::shared_ptr<WorldPackets::Auth:
}
// Client switches packet headers after sending CMSG_AUTH_CONTINUED_SESSION
- _headerBuffer.Resize(SizeOfClientHeader[1][1]);
+ _headerBuffer.Resize(SizeOfClientHeader[1]);
uint32 accountId = uint32(key.Fields.AccountId);
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION);
@@ -841,13 +885,14 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPacket
_authCrypt.Init(&k, _encryptSeed.AsByteArray().get(), _decryptSeed.AsByteArray().get());
- SHA1Hash sha;
- sha.UpdateData(login);
- sha.UpdateBigNumbers(&k, NULL);
- sha.UpdateData((uint8*)&_authSeed, 4);
- sha.Finalize();
+ HmacSha256 hmac(40, k.AsByteArray(40).get());
+ hmac.UpdateData(reinterpret_cast<uint8 const*>(&authSession->Key), sizeof(authSession->Key));
+ hmac.UpdateData(authSession->LocalChallenge.data(), authSession->LocalChallenge.size());
+ hmac.UpdateData(_serverChallenge.AsByteArray(16).get(), 16);
+ hmac.UpdateData(ContinuedSessionSeed, 16);
+ hmac.Finalize();
- if (memcmp(sha.GetDigest(), authSession->Digest, sha.GetLength()))
+ if (memcmp(hmac.GetDigest(), authSession->Digest.data(), authSession->Digest.size()))
{
SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT);
TC_LOG_ERROR("network", "WorldSocket::HandleAuthContinuedSession: Authentication failed for account: %u ('%s') address: %s", accountId, login.c_str(), GetRemoteIpAddress().to_string().c_str());
diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index 205494ca4ea..a5593e83521 100644
--- a/src/server/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
@@ -52,13 +52,13 @@ union ClientPktHeader
struct
{
uint16 Size;
- uint32 Command;
+ uint16 Command;
} Setup;
struct
{
- uint32 Command : 13;
- uint32 Size : 19;
+ uint32 Size;
+ uint16 Command;
} Normal;
static bool IsValidSize(uint32 size) { return size < 10240; }
@@ -67,12 +67,17 @@ union ClientPktHeader
#pragma pack(pop)
-class WorldSocket : public Socket<WorldSocket>
+class TC_GAME_API WorldSocket : public Socket<WorldSocket>
{
+ static uint32 const ConnectionInitializeMagic;
static std::string const ServerConnectionInitialize;
static std::string const ClientConnectionInitialize;
static uint32 const MinSizeForCompression;
+ static uint8 const AuthCheckSeed[16];
+ static uint8 const SessionKeySeed[16];
+ static uint8 const ContinuedSessionSeed[16];
+
typedef Socket<WorldSocket> BaseSocket;
public:
@@ -107,6 +112,7 @@ protected:
ReadDataHandlerResult ReadDataHandler();
private:
void CheckIpCallback(PreparedQueryResult result);
+ void InitializeHandler(boost::system::error_code error, std::size_t transferedBytes);
/// writes network.opcode log
/// accessing WorldSession is not threadsafe, only do it when holding _worldSessionLock
@@ -130,7 +136,7 @@ private:
ConnectionType _type;
- uint32 _authSeed;
+ BigNumber _serverChallenge;
WorldPacketCrypt _authCrypt;
BigNumber _encryptSeed;
BigNumber _decryptSeed;
@@ -148,8 +154,6 @@ private:
z_stream_s* _compressionStream;
- bool _initialized;
-
PreparedQueryResultFuture _queryFuture;
std::function<void(PreparedQueryResult&&)> _queryCallback;
std::string _ipCountry;
diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp
index 4f42e943245..53a22a80449 100644
--- a/src/server/game/Server/WorldSocketMgr.cpp
+++ b/src/server/game/Server/WorldSocketMgr.cpp
@@ -52,6 +52,12 @@ WorldSocketMgr::~WorldSocketMgr()
ASSERT(!_instanceAcceptor, "StopNetwork must be called prior to WorldSocketMgr destruction");
}
+WorldSocketMgr& WorldSocketMgr::Instance()
+{
+ static WorldSocketMgr instance;
+ return instance;
+}
+
bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port)
{
_tcpNoDelay = sConfigMgr->GetBoolDefault("Network.TcpNodelay", true);
diff --git a/src/server/game/Server/WorldSocketMgr.h b/src/server/game/Server/WorldSocketMgr.h
index 2079b62d14f..fd86d3b7931 100644
--- a/src/server/game/Server/WorldSocketMgr.h
+++ b/src/server/game/Server/WorldSocketMgr.h
@@ -30,18 +30,14 @@
class WorldSocket;
/// Manages all sockets connected to peers and network threads
-class WorldSocketMgr : public SocketMgr<WorldSocket>
+class TC_GAME_API WorldSocketMgr : public SocketMgr<WorldSocket>
{
typedef SocketMgr<WorldSocket> BaseSocketMgr;
public:
~WorldSocketMgr();
- static WorldSocketMgr& Instance()
- {
- static WorldSocketMgr instance;
- return instance;
- }
+ static WorldSocketMgr& Instance();
/// Start network, listen at address:port .
bool StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) override;
diff --git a/src/server/game/Skills/SkillDiscovery.h b/src/server/game/Skills/SkillDiscovery.h
index b7fe1cdc8b2..c2020e5b075 100644
--- a/src/server/game/Skills/SkillDiscovery.h
+++ b/src/server/game/Skills/SkillDiscovery.h
@@ -23,8 +23,9 @@
class Player;
-void LoadSkillDiscoveryTable();
-uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player);
-bool HasDiscoveredAllSpells(uint32 spellId, Player* player);
-uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player);
+TC_GAME_API void LoadSkillDiscoveryTable();
+TC_GAME_API uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player);
+TC_GAME_API bool HasDiscoveredAllSpells(uint32 spellId, Player* player);
+TC_GAME_API uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player);
+
#endif
diff --git a/src/server/game/Skills/SkillExtraItems.h b/src/server/game/Skills/SkillExtraItems.h
index 2889b221600..5a477b65f0b 100644
--- a/src/server/game/Skills/SkillExtraItems.h
+++ b/src/server/game/Skills/SkillExtraItems.h
@@ -23,12 +23,14 @@
// predef classes used in functions
class Player;
+
// returns true and sets the appropriate info if the player can create a perfect item with the given spellId
-bool CanCreatePerfectItem(Player* player, uint32 spellId, float &perfectCreateChance, uint32 &perfectItemType);
+TC_GAME_API bool CanCreatePerfectItem(Player* player, uint32 spellId, float &perfectCreateChance, uint32 &perfectItemType);
// load perfection proc info from DB
-void LoadSkillPerfectItemTable();
+TC_GAME_API void LoadSkillPerfectItemTable();
// returns true and sets the appropriate info if the player can create extra items with the given spellId
-bool CanCreateExtraItems(Player* player, uint32 spellId, float &additionalChance, uint8 &additionalMax);
+TC_GAME_API bool CanCreateExtraItems(Player* player, uint32 spellId, float &additionalChance, uint8 &additionalMax);
// function to load the extra item creation info from DB
-void LoadSkillExtraItemTable();
+TC_GAME_API void LoadSkillExtraItemTable();
+
#endif
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 1da2f73a2f2..ea6b607e7a3 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -772,10 +772,7 @@ void AuraEffect::CalculatePeriodic(Unit* caster, bool resetPeriodicTimer /*= tru
{
// Haste modifies periodic time of channeled spells
if (m_spellInfo->IsChanneled())
- {
- if (m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
- caster->ModSpellCastTime(m_spellInfo, m_period);
- }
+ caster->ModSpellDurationTime(m_spellInfo, m_period);
else if (m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
m_period = int32(m_period * caster->GetFloatValue(UNIT_MOD_CAST_SPEED));
}
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index 95ace9c7a32..0d907e4148c 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -27,7 +27,7 @@ class Aura;
typedef void(AuraEffect::*pAuraEffectHandler)(AuraApplication const* aurApp, uint8 mode, bool apply) const;
-class AuraEffect
+class TC_GAME_API AuraEffect
{
friend void Aura::_InitEffects(uint32 effMask, Unit* caster, int32 *baseAmount);
friend Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint32 effMask, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel);
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index 7ad36c58956..65cdbced339 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -47,7 +47,7 @@ class ChargeDropEvent;
// update aura target map every 500 ms instead of every update - reduce amount of grid searcher calls
#define UPDATE_TARGET_MAP_INTERVAL 500
-class AuraApplication
+class TC_GAME_API AuraApplication
{
friend void Unit::_ApplyAura(AuraApplication * aurApp, uint32 effMask);
friend void Unit::_UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode);
@@ -113,7 +113,7 @@ struct AuraLoadEffectInfo
};
#pragma pack(pop)
-class Aura
+class TC_GAME_API Aura
{
friend Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint32 effMask, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel);
public:
@@ -326,7 +326,7 @@ class Aura
SpellEffectInfoVector _spelEffectInfos;
};
-class UnitAura : public Aura
+class TC_GAME_API UnitAura : public Aura
{
friend Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel);
public:
@@ -347,7 +347,7 @@ class UnitAura : public Aura
DiminishingGroup m_AuraDRGroup:8; // Diminishing
};
-class DynObjAura : public Aura
+class TC_GAME_API DynObjAura : public Aura
{
friend Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* owner, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel);
public:
@@ -358,7 +358,7 @@ class DynObjAura : public Aura
void FillTargetMap(std::map<Unit*, uint32> & targets, Unit* caster) override;
};
-class ChargeDropEvent : public BasicEvent
+class TC_GAME_API ChargeDropEvent : public BasicEvent
{
friend class Aura;
protected:
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 579dc0b8a06..256600e4010 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -2648,7 +2648,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
{
// Haste modifies duration of channeled spells
if (m_spellInfo->IsChanneled())
- m_originalCaster->ModSpellCastTime(aurSpellInfo, duration, this);
+ m_originalCaster->ModSpellDurationTime(aurSpellInfo, duration, this);
else if (m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
{
int32 origDuration = duration;
@@ -3313,7 +3313,7 @@ void Spell::handle_immediate()
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);
// Apply haste mods
- m_caster->ModSpellCastTime(m_spellInfo, duration, this);
+ m_caster->ModSpellDurationTime(m_spellInfo, duration, this);
m_spellState = SPELL_STATE_CASTING;
m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags);
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index a7c9b91a31f..dd6d39f6030 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -115,7 +115,7 @@ enum SpellRangeFlag
SPELL_RANGE_RANGED = 2 //hunter range and ranged weapon
};
-struct SpellDestination
+struct TC_GAME_API SpellDestination
{
SpellDestination();
SpellDestination(float x, float y, float z, float orientation = 0.0f, uint32 mapId = MAPID_INVALID);
@@ -167,7 +167,7 @@ struct SpellLogEffectFeedPetParams
int32 ItemID = 0;
};
-class SpellCastTargets
+class TC_GAME_API SpellCastTargets
{
public:
SpellCastTargets();
@@ -291,7 +291,7 @@ enum SpellEffectHandleMode
typedef std::list<std::pair<uint32, ObjectGuid>> DispelList;
-class Spell
+class TC_GAME_API Spell
{
friend void Unit::SetCurrentCastSpell(Spell* pSpell);
friend class SpellScript;
@@ -851,7 +851,7 @@ class Spell
namespace Trinity
{
- struct WorldObjectSpellTargetCheck
+ struct TC_GAME_API WorldObjectSpellTargetCheck
{
Unit* _caster;
Unit* _referer;
@@ -866,7 +866,7 @@ namespace Trinity
bool operator()(WorldObject* target);
};
- struct WorldObjectSpellNearbyTargetCheck : public WorldObjectSpellTargetCheck
+ struct TC_GAME_API WorldObjectSpellNearbyTargetCheck : public WorldObjectSpellTargetCheck
{
float _range;
Position const* _position;
@@ -875,7 +875,7 @@ namespace Trinity
bool operator()(WorldObject* target);
};
- struct WorldObjectSpellAreaTargetCheck : public WorldObjectSpellTargetCheck
+ struct TC_GAME_API WorldObjectSpellAreaTargetCheck : public WorldObjectSpellTargetCheck
{
float _range;
Position const* _position;
@@ -884,7 +884,7 @@ namespace Trinity
bool operator()(WorldObject* target);
};
- struct WorldObjectSpellConeTargetCheck : public WorldObjectSpellAreaTargetCheck
+ struct TC_GAME_API WorldObjectSpellConeTargetCheck : public WorldObjectSpellAreaTargetCheck
{
float _coneAngle;
WorldObjectSpellConeTargetCheck(float coneAngle, float range, Unit* caster,
@@ -892,7 +892,7 @@ namespace Trinity
bool operator()(WorldObject* target);
};
- struct WorldObjectSpellTrajTargetCheck : public WorldObjectSpellAreaTargetCheck
+ struct TC_GAME_API WorldObjectSpellTrajTargetCheck : public WorldObjectSpellAreaTargetCheck
{
WorldObjectSpellTrajTargetCheck(float range, Position const* position, Unit* caster, SpellInfo const* spellInfo);
bool operator()(WorldObject* target);
@@ -901,7 +901,7 @@ namespace Trinity
typedef void(Spell::*pEffect)(SpellEffIndex effIndex);
-class SpellEvent : public BasicEvent
+class TC_GAME_API SpellEvent : public BasicEvent
{
public:
SpellEvent(Spell* spell);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 59428220bea..0c2fc2e5d91 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2307,9 +2307,12 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
return;
// Ok if exist some buffs for dispel try dispel it
- uint32 failCount = 0;
DispelChargesList success_list;
- WorldPacket dataFail(SMSG_DISPEL_FAILED, 8+8+4+4+damage*4);
+ WorldPackets::Spells::DispelFailed dispelFailed;
+ dispelFailed.CasterGUID = m_caster->GetGUID();
+ dispelFailed.VictimGUID = unitTarget->GetGUID();
+ dispelFailed.SpellID = m_spellInfo->Id;
+
// dispel N = damage buffs (or while exist buffs for dispel)
for (int32 count = 0; count < damage && !dispel_list.empty();)
{
@@ -2344,23 +2347,14 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
dispel_list.erase(itr);
}
else
- {
- if (!failCount)
- {
- // Failed to dispell
- dataFail << m_caster->GetGUID(); // Caster GUID
- dataFail << unitTarget->GetGUID(); // Victim GUID
- dataFail << uint32(m_spellInfo->Id); // dispel spell id
- }
- ++failCount;
- dataFail << uint32(itr->first->GetId()); // Spell Id
- }
+ dispelFailed.FailedSpells.push_back(int32(itr->first->GetId()));
+
++count;
}
}
- if (failCount)
- m_caster->SendMessageToSet(&dataFail, true);
+ if (!dispelFailed.FailedSpells.empty())
+ m_caster->SendMessageToSet(dispelFailed.Write(), true);
if (success_list.empty())
return;
@@ -5163,9 +5157,12 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex /*effIndex*/)
return;
// Ok if exist some buffs for dispel try dispel it
- uint32 failCount = 0;
DispelList success_list;
- WorldPacket dataFail(SMSG_DISPEL_FAILED, 8+8+4+4+damage*4);
+ WorldPackets::Spells::DispelFailed dispelFailed;
+ dispelFailed.CasterGUID = m_caster->GetGUID();
+ dispelFailed.VictimGUID = unitTarget->GetGUID();
+ dispelFailed.SpellID = m_spellInfo->Id;
+
// dispel N = damage buffs (or while exist buffs for dispel)
for (int32 count = 0; count < damage && !steal_list.empty();)
{
@@ -5190,23 +5187,14 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex /*effIndex*/)
steal_list.erase(itr);
}
else
- {
- if (!failCount)
- {
- // Failed to dispell
- dataFail << m_caster->GetGUID(); // Caster GUID
- dataFail << unitTarget->GetGUID(); // Victim GUID
- dataFail << uint32(m_spellInfo->Id); // dispel spell id
- }
- ++failCount;
- dataFail << uint32(itr->first->GetId()); // Spell Id
- }
+ dispelFailed.FailedSpells.push_back(int32(itr->first->GetId()));
+
++count;
}
}
- if (failCount)
- m_caster->SendMessageToSet(&dataFail, true);
+ if (!dispelFailed.FailedSpells.empty())
+ m_caster->SendMessageToSet(dispelFailed.Write(), true);
if (success_list.empty())
return;
diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h
index c63fdc63e47..f2a3d346fdf 100644
--- a/src/server/game/Spells/SpellHistory.h
+++ b/src/server/game/Spells/SpellHistory.h
@@ -39,7 +39,7 @@ enum SpellCooldownFlags
SPELL_COOLDOWN_FLAG_INCLUDE_EVENT_COOLDOWNS = 0x2 ///< Starts GCD for spells that should start their cooldown on events, requires SPELL_COOLDOWN_FLAG_INCLUDE_GCD set
};
-class SpellHistory
+class TC_GAME_API SpellHistory
{
public:
typedef std::chrono::system_clock Clock;
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 8f321bccc6d..b8e9b10efc4 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -204,7 +204,7 @@ enum SpellCustomAttributes
uint32 GetTargetFlagMask(SpellTargetObjectTypes objType);
-class SpellImplicitTargetInfo
+class TC_GAME_API SpellImplicitTargetInfo
{
private:
Targets _target;
@@ -235,7 +235,7 @@ private:
static StaticData _data[TOTAL_SPELL_TARGETS];
};
-class SpellEffectInfo
+class TC_GAME_API SpellEffectInfo
{
SpellInfo const* _spellInfo;
public:
@@ -323,7 +323,7 @@ typedef std::unordered_map<uint32, SpellVisualVector> SpellVisualMap;
typedef std::vector<AuraEffect*> AuraEffectVector;
-class SpellInfo
+class TC_GAME_API SpellInfo
{
public:
uint32 Id;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index f735f4034a9..2c062e33259 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -472,6 +472,12 @@ SpellMgr::~SpellMgr()
UnloadSpellInfoStore();
}
+SpellMgr* SpellMgr::instance()
+{
+ static SpellMgr instance;
+ return &instance;
+}
+
/// Some checks for spells, to prevent adding deprecated/broken spells for trainers, spell book, etc
bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg)
{
@@ -3191,6 +3197,8 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO;
break;
case 8145: // Tremor Totem (instant pulse)
+ spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS;
+ /*no break*/
case 6474: // Earthbind Totem (instant pulse)
spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY;
break;
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index e058ed84407..79721235c17 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -430,7 +430,7 @@ enum EffectRadiusIndex
};
// Spell pet auras
-class PetAura
+class TC_GAME_API PetAura
{
private:
typedef std::unordered_map<uint32, uint32> PetAuraMap;
@@ -477,7 +477,7 @@ class PetAura
};
typedef std::map<uint32, PetAura> SpellPetAuraMap;
-struct SpellArea
+struct TC_GAME_API SpellArea
{
uint32 spellId;
uint32 areaId; // zone/subzone/or 0 is not limited to zone
@@ -590,14 +590,14 @@ inline bool IsProfessionOrRidingSkill(uint32 skill)
bool IsPartOfSkillLine(uint32 skillId, uint32 spellId);
// spell diminishing returns
-DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto);
-DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
-DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group);
-int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto);
+TC_GAME_API DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto);
+TC_GAME_API DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
+TC_GAME_API DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group);
+TC_GAME_API int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto);
-extern PetFamilySpellsStore sPetFamilySpellsStore;
+TC_GAME_API extern PetFamilySpellsStore sPetFamilySpellsStore;
-class SpellMgr
+class TC_GAME_API SpellMgr
{
// Constructors
private:
@@ -606,11 +606,7 @@ class SpellMgr
// Accessors (const or static functions)
public:
- static SpellMgr* instance()
- {
- static SpellMgr instance;
- return &instance;
- }
+ static SpellMgr* instance();
// Spell correctness for client using
static bool IsSpellValid(SpellInfo const* spellInfo, Player* player = NULL, bool msg = true);
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 02eaa2ef92f..aca3e074b9a 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -52,7 +52,7 @@ enum SpellScriptState
#define SPELL_SCRIPT_STATE_END SPELL_SCRIPT_STATE_UNLOADING + 1
// helper class from which SpellScript and SpellAura derive, use these classes instead
-class _SpellScript
+class TC_GAME_API _SpellScript
{
// internal use classes & functions
// DO NOT OVERRIDE THESE IN SCRIPTS
@@ -68,7 +68,7 @@ class _SpellScript
std::string const* _GetScriptName() const;
protected:
- class EffectHook
+ class TC_GAME_API EffectHook
{
public:
EffectHook(uint8 _effIndex);
@@ -82,7 +82,7 @@ class _SpellScript
uint8 effIndex;
};
- class EffectNameCheck
+ class TC_GAME_API EffectNameCheck
{
public:
EffectNameCheck(uint16 _effName) { effName = _effName; }
@@ -92,7 +92,7 @@ class _SpellScript
uint16 effName;
};
- class EffectAuraNameCheck
+ class TC_GAME_API EffectAuraNameCheck
{
public:
EffectAuraNameCheck(uint16 _effAurName) { effAurName = _effAurName; }
@@ -149,7 +149,7 @@ enum SpellScriptHookType
#define HOOK_SPELL_END SPELL_SCRIPT_HOOK_CHECK_CAST + 1
#define HOOK_SPELL_COUNT HOOK_SPELL_END - HOOK_SPELL_START
-class SpellScript : public _SpellScript
+class TC_GAME_API SpellScript : public _SpellScript
{
// internal use classes & functions
// DO NOT OVERRIDE THESE IN SCRIPTS
@@ -165,7 +165,7 @@ class SpellScript : public _SpellScript
SPELLSCRIPT_FUNCTION_TYPE_DEFINES(SpellScript)
- class CastHandler
+ class TC_GAME_API CastHandler
{
public:
CastHandler(SpellCastFnType _pCastHandlerScript);
@@ -174,7 +174,7 @@ class SpellScript : public _SpellScript
SpellCastFnType pCastHandlerScript;
};
- class CheckCastHandler
+ class TC_GAME_API CheckCastHandler
{
public:
CheckCastHandler(SpellCheckCastFnType checkCastHandlerScript);
@@ -183,7 +183,7 @@ class SpellScript : public _SpellScript
SpellCheckCastFnType _checkCastHandlerScript;
};
- class EffectHandler : public _SpellScript::EffectNameCheck, public _SpellScript::EffectHook
+ class TC_GAME_API EffectHandler : public _SpellScript::EffectNameCheck, public _SpellScript::EffectHook
{
public:
EffectHandler(SpellEffectFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName);
@@ -194,7 +194,7 @@ class SpellScript : public _SpellScript
SpellEffectFnType pEffectHandlerScript;
};
- class HitHandler
+ class TC_GAME_API HitHandler
{
public:
HitHandler(SpellHitFnType _pHitHandlerScript);
@@ -203,7 +203,7 @@ class SpellScript : public _SpellScript
SpellHitFnType pHitHandlerScript;
};
- class TargetHook : public _SpellScript::EffectHook
+ class TC_GAME_API TargetHook : public _SpellScript::EffectHook
{
public:
TargetHook(uint8 _effectIndex, uint16 _targetType, bool _area, bool _dest);
@@ -216,7 +216,7 @@ class SpellScript : public _SpellScript
bool dest;
};
- class ObjectAreaTargetSelectHandler : public TargetHook
+ class TC_GAME_API ObjectAreaTargetSelectHandler : public TargetHook
{
public:
ObjectAreaTargetSelectHandler(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType);
@@ -225,7 +225,7 @@ class SpellScript : public _SpellScript
SpellObjectAreaTargetSelectFnType pObjectAreaTargetSelectHandlerScript;
};
- class ObjectTargetSelectHandler : public TargetHook
+ class TC_GAME_API ObjectTargetSelectHandler : public TargetHook
{
public:
ObjectTargetSelectHandler(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType);
@@ -234,7 +234,7 @@ class SpellScript : public _SpellScript
SpellObjectTargetSelectFnType pObjectTargetSelectHandlerScript;
};
- class DestinationTargetSelectHandler : public TargetHook
+ class TC_GAME_API DestinationTargetSelectHandler : public TargetHook
{
public:
DestinationTargetSelectHandler(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType);
@@ -472,7 +472,7 @@ enum AuraScriptHookType
#define HOOK_AURA_EFFECT_END HOOK_AURA_EFFECT_CALC_SPELLMOD + 1
#define HOOK_AURA_EFFECT_COUNT HOOK_AURA_EFFECT_END - HOOK_AURA_EFFECT_START
*/
-class AuraScript : public _SpellScript
+class TC_GAME_API AuraScript : public _SpellScript
{
// internal use classes & functions
// DO NOT OVERRIDE THESE IN SCRIPTS
@@ -495,7 +495,7 @@ class AuraScript : public _SpellScript
AURASCRIPT_FUNCTION_TYPE_DEFINES(AuraScript)
- class CheckAreaTargetHandler
+ class TC_GAME_API CheckAreaTargetHandler
{
public:
CheckAreaTargetHandler(AuraCheckAreaTargetFnType pHandlerScript);
@@ -503,7 +503,7 @@ class AuraScript : public _SpellScript
private:
AuraCheckAreaTargetFnType pHandlerScript;
};
- class AuraDispelHandler
+ class TC_GAME_API AuraDispelHandler
{
public:
AuraDispelHandler(AuraDispelFnType pHandlerScript);
@@ -511,14 +511,14 @@ class AuraScript : public _SpellScript
private:
AuraDispelFnType pHandlerScript;
};
- class EffectBase : public _SpellScript::EffectAuraNameCheck, public _SpellScript::EffectHook
+ class TC_GAME_API EffectBase : public _SpellScript::EffectAuraNameCheck, public _SpellScript::EffectHook
{
public:
EffectBase(uint8 _effIndex, uint16 _effName);
std::string ToString();
bool CheckEffect(SpellInfo const* spellInfo, uint8 effIndex) override;
};
- class EffectPeriodicHandler : public EffectBase
+ class TC_GAME_API EffectPeriodicHandler : public EffectBase
{
public:
EffectPeriodicHandler(AuraEffectPeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName);
@@ -526,7 +526,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectPeriodicFnType pEffectHandlerScript;
};
- class EffectUpdatePeriodicHandler : public EffectBase
+ class TC_GAME_API EffectUpdatePeriodicHandler : public EffectBase
{
public:
EffectUpdatePeriodicHandler(AuraEffectUpdatePeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName);
@@ -534,7 +534,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectUpdatePeriodicFnType pEffectHandlerScript;
};
- class EffectCalcAmountHandler : public EffectBase
+ class TC_GAME_API EffectCalcAmountHandler : public EffectBase
{
public:
EffectCalcAmountHandler(AuraEffectCalcAmountFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName);
@@ -542,7 +542,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectCalcAmountFnType pEffectHandlerScript;
};
- class EffectCalcPeriodicHandler : public EffectBase
+ class TC_GAME_API EffectCalcPeriodicHandler : public EffectBase
{
public:
EffectCalcPeriodicHandler(AuraEffectCalcPeriodicFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName);
@@ -550,7 +550,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectCalcPeriodicFnType pEffectHandlerScript;
};
- class EffectCalcSpellModHandler : public EffectBase
+ class TC_GAME_API EffectCalcSpellModHandler : public EffectBase
{
public:
EffectCalcSpellModHandler(AuraEffectCalcSpellModFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName);
@@ -558,7 +558,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectCalcSpellModFnType pEffectHandlerScript;
};
- class EffectApplyHandler : public EffectBase
+ class TC_GAME_API EffectApplyHandler : public EffectBase
{
public:
EffectApplyHandler(AuraEffectApplicationModeFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName, AuraEffectHandleModes _mode);
@@ -567,7 +567,7 @@ class AuraScript : public _SpellScript
AuraEffectApplicationModeFnType pEffectHandlerScript;
AuraEffectHandleModes mode;
};
- class EffectAbsorbHandler : public EffectBase
+ class TC_GAME_API EffectAbsorbHandler : public EffectBase
{
public:
EffectAbsorbHandler(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex);
@@ -575,7 +575,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectAbsorbFnType pEffectHandlerScript;
};
- class EffectManaShieldHandler : public EffectBase
+ class TC_GAME_API EffectManaShieldHandler : public EffectBase
{
public:
EffectManaShieldHandler(AuraEffectAbsorbFnType _pEffectHandlerScript, uint8 _effIndex);
@@ -583,7 +583,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectAbsorbFnType pEffectHandlerScript;
};
- class EffectSplitHandler : public EffectBase
+ class TC_GAME_API EffectSplitHandler : public EffectBase
{
public:
EffectSplitHandler(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex);
@@ -591,7 +591,7 @@ class AuraScript : public _SpellScript
private:
AuraEffectSplitFnType pEffectHandlerScript;
};
- class CheckProcHandler
+ class TC_GAME_API CheckProcHandler
{
public:
CheckProcHandler(AuraCheckProcFnType handlerScript);
@@ -599,7 +599,7 @@ class AuraScript : public _SpellScript
private:
AuraCheckProcFnType _HandlerScript;
};
- class AuraProcHandler
+ class TC_GAME_API AuraProcHandler
{
public:
AuraProcHandler(AuraProcFnType handlerScript);
@@ -607,7 +607,7 @@ class AuraScript : public _SpellScript
private:
AuraProcFnType _HandlerScript;
};
- class EffectProcHandler : public EffectBase
+ class TC_GAME_API EffectProcHandler : public EffectBase
{
public:
EffectProcHandler(AuraEffectProcFnType effectHandlerScript, uint8 effIndex, uint16 effName);
@@ -647,7 +647,7 @@ class AuraScript : public _SpellScript
AuraApplication const* m_auraApplication;
bool m_defaultActionPrevented;
- class ScriptStateStore
+ class TC_GAME_API ScriptStateStore
{
public:
AuraApplication const* _auraApplication;
diff --git a/src/server/game/Support/SupportMgr.cpp b/src/server/game/Support/SupportMgr.cpp
index 7caccfd7cb2..97a828f44d6 100644
--- a/src/server/game/Support/SupportMgr.cpp
+++ b/src/server/game/Support/SupportMgr.cpp
@@ -362,6 +362,12 @@ SupportMgr::~SupportMgr()
delete s.second;
}
+SupportMgr* SupportMgr::instance()
+{
+ static SupportMgr instance;
+ return &instance;
+}
+
void SupportMgr::Initialize()
{
SetSupportSystemStatus(sWorld->getBoolConfig(CONFIG_SUPPORT_ENABLED));
@@ -403,6 +409,10 @@ SuggestionTicket* SupportMgr::GetTicket<SuggestionTicket>(uint32 suggestionId)
}
+template TC_GAME_API BugTicket* SupportMgr::GetTicket<BugTicket>(uint32);
+template TC_GAME_API ComplaintTicket* SupportMgr::GetTicket<ComplaintTicket>(uint32);
+template TC_GAME_API SuggestionTicket* SupportMgr::GetTicket<SuggestionTicket>(uint32);
+
template<>
uint32 SupportMgr::GetOpenTicketCount<BugTicket>() const { return _openBugTicketCount; }
@@ -412,6 +422,10 @@ uint32 SupportMgr::GetOpenTicketCount<ComplaintTicket>() const { return _openCom
template<>
uint32 SupportMgr::GetOpenTicketCount<SuggestionTicket>() const { return _openSuggestionTicketCount; }
+template TC_GAME_API uint32 SupportMgr::GetOpenTicketCount<BugTicket>() const;
+template TC_GAME_API uint32 SupportMgr::GetOpenTicketCount<ComplaintTicket>() const;
+template TC_GAME_API uint32 SupportMgr::GetOpenTicketCount<SuggestionTicket>() const;
+
void SupportMgr::LoadBugTickets()
{
uint32 oldMSTime = getMSTime();
@@ -607,6 +621,10 @@ void SupportMgr::RemoveTicket<SuggestionTicket>(uint32 ticketId)
}
}
+template TC_GAME_API void SupportMgr::RemoveTicket<BugTicket>(uint32);
+template TC_GAME_API void SupportMgr::RemoveTicket<ComplaintTicket>(uint32);
+template TC_GAME_API void SupportMgr::RemoveTicket<SuggestionTicket>(uint32);
+
template<>
void SupportMgr::CloseTicket<BugTicket>(uint32 ticketId, ObjectGuid closedBy)
{
@@ -643,6 +661,10 @@ void SupportMgr::CloseTicket<SuggestionTicket>(uint32 ticketId, ObjectGuid close
}
}
+template TC_GAME_API void SupportMgr::CloseTicket<BugTicket>(uint32, ObjectGuid);
+template TC_GAME_API void SupportMgr::CloseTicket<ComplaintTicket>(uint32, ObjectGuid);
+template TC_GAME_API void SupportMgr::CloseTicket<SuggestionTicket>(uint32, ObjectGuid);
+
template<>
void SupportMgr::ResetTickets<BugTicket>()
{
@@ -684,6 +706,10 @@ void SupportMgr::ResetTickets<SuggestionTicket>()
CharacterDatabase.Execute(stmt);
}
+template TC_GAME_API void SupportMgr::ResetTickets<BugTicket>();
+template TC_GAME_API void SupportMgr::ResetTickets<ComplaintTicket>();
+template TC_GAME_API void SupportMgr::ResetTickets<SuggestionTicket>();
+
template<>
void SupportMgr::ShowList<BugTicket>(ChatHandler& handler) const
{
@@ -711,6 +737,10 @@ void SupportMgr::ShowList<SuggestionTicket>(ChatHandler& handler) const
handler.SendSysMessage(itr->second->FormatViewMessageString(handler).c_str());
}
+template TC_GAME_API void SupportMgr::ShowList<BugTicket>(ChatHandler&) const;
+template TC_GAME_API void SupportMgr::ShowList<ComplaintTicket>(ChatHandler&) const;
+template TC_GAME_API void SupportMgr::ShowList<SuggestionTicket>(ChatHandler&) const;
+
template<>
void SupportMgr::ShowClosedList<BugTicket>(ChatHandler& handler) const
{
@@ -737,3 +767,7 @@ void SupportMgr::ShowClosedList<SuggestionTicket>(ChatHandler& handler) const
if (itr->second->IsClosed())
handler.SendSysMessage(itr->second->FormatViewMessageString(handler).c_str());
}
+
+template TC_GAME_API void SupportMgr::ShowClosedList<BugTicket>(ChatHandler&) const;
+template TC_GAME_API void SupportMgr::ShowClosedList<ComplaintTicket>(ChatHandler&) const;
+template TC_GAME_API void SupportMgr::ShowClosedList<SuggestionTicket>(ChatHandler&) const;
diff --git a/src/server/game/Support/SupportMgr.h b/src/server/game/Support/SupportMgr.h
index f79f71e7b2f..aafbbc2dd20 100644
--- a/src/server/game/Support/SupportMgr.h
+++ b/src/server/game/Support/SupportMgr.h
@@ -50,7 +50,7 @@ enum SupportSpamType
using ChatLog = WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketChatLog;
-class Ticket
+class TC_GAME_API Ticket
{
public:
Ticket();
@@ -116,7 +116,7 @@ protected:
std::string _comment;
};
-class BugTicket : public Ticket
+class TC_GAME_API BugTicket : public Ticket
{
public:
BugTicket();
@@ -140,7 +140,7 @@ private:
std::string _note;
};
-class ComplaintTicket : public Ticket
+class TC_GAME_API ComplaintTicket : public Ticket
{
public:
ComplaintTicket();
@@ -176,7 +176,7 @@ private:
std::string _note;
};
-class SuggestionTicket : public Ticket
+class TC_GAME_API SuggestionTicket : public Ticket
{
public:
SuggestionTicket();
@@ -204,18 +204,14 @@ typedef std::map<uint32, BugTicket*> BugTicketList;
typedef std::map<uint32, ComplaintTicket*> ComplaintTicketList;
typedef std::map<uint32, SuggestionTicket*> SuggestionTicketList;
-class SupportMgr
+class TC_GAME_API SupportMgr
{
private:
SupportMgr();
~SupportMgr();
public:
- static SupportMgr* instance()
- {
- static SupportMgr instance;
- return &instance;
- }
+ static SupportMgr* instance();
template<typename T>
T* GetTicket(uint32 ticketId);
diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp
index edc9b5a67e6..f4bc3f7fcba 100644
--- a/src/server/game/Texts/CreatureTextMgr.cpp
+++ b/src/server/game/Texts/CreatureTextMgr.cpp
@@ -76,6 +76,12 @@ class PlayerTextBuilder
WorldObject const* _target;
};
+CreatureTextMgr* CreatureTextMgr::instance()
+{
+ static CreatureTextMgr instance;
+ return &instance;
+}
+
void CreatureTextMgr::LoadCreatureTexts()
{
uint32 oldMSTime = getMSTime();
diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h
index d0004ec51d3..5bff16ad812 100644
--- a/src/server/game/Texts/CreatureTextMgr.h
+++ b/src/server/game/Texts/CreatureTextMgr.h
@@ -76,18 +76,14 @@ typedef std::unordered_map<uint32, CreatureTextHolder> CreatureTextMap; // a
typedef std::map<CreatureTextId, CreatureTextLocale> LocaleCreatureTextMap;
-class CreatureTextMgr
+class TC_GAME_API CreatureTextMgr
{
private:
CreatureTextMgr() { }
~CreatureTextMgr() { }
public:
- static CreatureTextMgr* instance()
- {
- static CreatureTextMgr instance;
- return &instance;
- }
+ static CreatureTextMgr* instance();
void LoadCreatureTexts();
void LoadCreatureTextLocales();
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.h b/src/server/game/Tools/CharacterDatabaseCleaner.h
index ecbd6d0a790..f1e6900a6bb 100644
--- a/src/server/game/Tools/CharacterDatabaseCleaner.h
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.h
@@ -30,20 +30,20 @@ namespace CharacterDatabaseCleaner
CLEANING_FLAG_QUESTSTATUS = 0x10
};
- void CleanDatabase();
+ TC_GAME_API void CleanDatabase();
- void CheckUnique(const char* column, const char* table, bool (*check)(uint32));
+ TC_GAME_API void CheckUnique(const char* column, const char* table, bool (*check)(uint32));
- bool AchievementProgressCheck(uint32 criteria);
- bool SkillCheck(uint32 skill);
- bool SpellCheck(uint32 spell_id);
- bool TalentCheck(uint32 talent_id);
+ TC_GAME_API bool AchievementProgressCheck(uint32 criteria);
+ TC_GAME_API bool SkillCheck(uint32 skill);
+ TC_GAME_API bool SpellCheck(uint32 spell_id);
+ TC_GAME_API bool TalentCheck(uint32 talent_id);
- void CleanCharacterAchievementProgress();
- void CleanCharacterSkills();
- void CleanCharacterSpell();
- void CleanCharacterTalent();
- void CleanCharacterQuestStatus();
+ TC_GAME_API void CleanCharacterAchievementProgress();
+ TC_GAME_API void CleanCharacterSkills();
+ TC_GAME_API void CleanCharacterSpell();
+ TC_GAME_API void CleanCharacterTalent();
+ TC_GAME_API void CleanCharacterQuestStatus();
}
#endif
diff --git a/src/server/game/Tools/PlayerDump.h b/src/server/game/Tools/PlayerDump.h
index 9f95572fd8c..66f4fd3fe13 100644
--- a/src/server/game/Tools/PlayerDump.h
+++ b/src/server/game/Tools/PlayerDump.h
@@ -65,7 +65,7 @@ enum DumpReturn
DUMP_CHARACTER_DELETED
};
-class PlayerDump
+class TC_GAME_API PlayerDump
{
public:
typedef std::set<ObjectGuid::LowType> DumpGuidSet;
@@ -75,7 +75,7 @@ class PlayerDump
PlayerDump() { }
};
-class PlayerDumpWriter : public PlayerDump
+class TC_GAME_API PlayerDumpWriter : public PlayerDump
{
public:
PlayerDumpWriter() { }
@@ -94,7 +94,7 @@ class PlayerDumpWriter : public PlayerDump
DumpGuidSet items;
};
-class PlayerDumpReader : public PlayerDump
+class TC_GAME_API PlayerDumpReader : public PlayerDump
{
public:
PlayerDumpReader() { }
diff --git a/src/server/game/Warden/Warden.h b/src/server/game/Warden/Warden.h
index 35ee18d4c02..b0aa496cbe8 100644
--- a/src/server/game/Warden/Warden.h
+++ b/src/server/game/Warden/Warden.h
@@ -92,7 +92,7 @@ struct ClientWardenModule
class WorldSession;
-class Warden
+class TC_GAME_API Warden
{
friend class WardenWin;
friend class WardenMac;
diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp
index 5c4b0fc05b7..13ddae012fe 100644
--- a/src/server/game/Warden/WardenCheckMgr.cpp
+++ b/src/server/game/Warden/WardenCheckMgr.cpp
@@ -189,6 +189,12 @@ void WardenCheckMgr::LoadWardenOverrides()
TC_LOG_INFO("server.loading", ">> Loaded %u warden action overrides.", count);
}
+WardenCheckMgr* WardenCheckMgr::instance()
+{
+ static WardenCheckMgr instance;
+ return &instance;
+}
+
WardenCheck* WardenCheckMgr::GetWardenDataById(uint16 Id)
{
if (Id < CheckStore.size())
diff --git a/src/server/game/Warden/WardenCheckMgr.h b/src/server/game/Warden/WardenCheckMgr.h
index 4107ccc3aff..7349fd5b589 100644
--- a/src/server/game/Warden/WardenCheckMgr.h
+++ b/src/server/game/Warden/WardenCheckMgr.h
@@ -48,18 +48,14 @@ struct WardenCheckResult
BigNumber Result; // MEM_CHECK
};
-class WardenCheckMgr
+class TC_GAME_API WardenCheckMgr
{
private:
WardenCheckMgr();
~WardenCheckMgr();
public:
- static WardenCheckMgr* instance()
- {
- static WardenCheckMgr instance;
- return &instance;
- }
+ static WardenCheckMgr* instance();
// We have a linear key without any gaps, so we use vector for fast access
typedef std::vector<WardenCheck*> CheckContainer;
diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp
index 6df1dc7561c..834012fe964 100644
--- a/src/server/game/Warden/WardenMac.cpp
+++ b/src/server/game/Warden/WardenMac.cpp
@@ -16,7 +16,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "Cryptography/WardenKeyGeneration.h"
+#include "Cryptography/SessionKeyGeneration.h"
#include "Common.h"
#include "WorldPacket.h"
#include "WorldSession.h"
@@ -28,6 +28,7 @@
#include "Util.h"
#include "WardenMac.h"
#include "WardenModuleMac.h"
+#include "SHA1.h"
#include <openssl/md5.h>
@@ -39,7 +40,7 @@ void WardenMac::Init(WorldSession* pClient, BigNumber* K)
{
_session = pClient;
// Generate Warden Key
- SHA1Randx WK(K->AsByteArray().get(), K->GetNumBytes());
+ SessionKeyGenerator<SHA1Hash> WK(K->AsByteArray().get(), K->GetNumBytes());
WK.Generate(_inputKey, 16);
WK.Generate(_outputKey, 16);
/*
diff --git a/src/server/game/Warden/WardenMac.h b/src/server/game/Warden/WardenMac.h
index 26a2d86524e..c7435502f63 100644
--- a/src/server/game/Warden/WardenMac.h
+++ b/src/server/game/Warden/WardenMac.h
@@ -28,7 +28,7 @@
class WorldSession;
class Warden;
-class WardenMac : public Warden
+class TC_GAME_API WardenMac : public Warden
{
public:
WardenMac();
diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp
index b99a6cd3ac9..5362ad56616 100644
--- a/src/server/game/Warden/WardenWin.cpp
+++ b/src/server/game/Warden/WardenWin.cpp
@@ -17,7 +17,7 @@
*/
#include "Cryptography/HmacHash.h"
-#include "Cryptography/WardenKeyGeneration.h"
+#include "Cryptography/SessionKeyGeneration.h"
#include "Common.h"
#include "WorldPacket.h"
#include "WorldSession.h"
@@ -31,6 +31,7 @@
#include "WardenWin.h"
#include "WardenModuleWin.h"
#include "WardenCheckMgr.h"
+#include "SHA1.h"
#include <openssl/md5.h>
@@ -42,7 +43,7 @@ void WardenWin::Init(WorldSession* session, BigNumber* k)
{
_session = session;
// Generate Warden Key
- SHA1Randx WK(k->AsByteArray().get(), k->GetNumBytes());
+ SessionKeyGenerator<SHA1Hash> WK(k->AsByteArray().get(), k->GetNumBytes());
WK.Generate(_inputKey, 16);
WK.Generate(_outputKey, 16);
diff --git a/src/server/game/Warden/WardenWin.h b/src/server/game/Warden/WardenWin.h
index 4bf1af77c47..b3e6d7c586c 100644
--- a/src/server/game/Warden/WardenWin.h
+++ b/src/server/game/Warden/WardenWin.h
@@ -62,7 +62,7 @@ struct WardenInitModuleRequest
class WorldSession;
class Warden;
-class WardenWin : public Warden
+class TC_GAME_API WardenWin : public Warden
{
public:
WardenWin();
diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp
index 393080f044a..92140fbc2af 100644
--- a/src/server/game/Weather/Weather.cpp
+++ b/src/server/game/Weather/Weather.cpp
@@ -153,7 +153,7 @@ bool Weather::ReGenerate()
uint32 chance2 = chance1 + m_weatherChances->data[season].snowChance;
uint32 chance3 = chance2 + m_weatherChances->data[season].stormChance;
- uint32 rnd = urand(0, 99);
+ uint32 rnd = urand(1, 100);
if (rnd <= chance1)
m_type = WEATHER_TYPE_RAIN;
else if (rnd <= chance2)
diff --git a/src/server/game/Weather/Weather.h b/src/server/game/Weather/Weather.h
index 0135b28522f..e0330b85a60 100644
--- a/src/server/game/Weather/Weather.h
+++ b/src/server/game/Weather/Weather.h
@@ -62,7 +62,7 @@ enum WeatherState : uint32
};
/// Weather for one zone
-class Weather
+class TC_GAME_API Weather
{
public:
diff --git a/src/server/game/Weather/WeatherMgr.h b/src/server/game/Weather/WeatherMgr.h
index 97c541fd3c0..e3dd4ac9ec4 100644
--- a/src/server/game/Weather/WeatherMgr.h
+++ b/src/server/game/Weather/WeatherMgr.h
@@ -30,15 +30,15 @@ class Player;
namespace WeatherMgr
{
- void LoadWeatherData();
+ TC_GAME_API void LoadWeatherData();
- Weather* FindWeather(uint32 id);
- Weather* AddWeather(uint32 zone_id);
- void RemoveWeather(uint32 zone_id);
+ TC_GAME_API Weather* FindWeather(uint32 id);
+ TC_GAME_API Weather* AddWeather(uint32 zone_id);
+ TC_GAME_API void RemoveWeather(uint32 zone_id);
- void SendFineWeatherUpdateToPlayer(Player* player);
+ TC_GAME_API void SendFineWeatherUpdateToPlayer(Player* player);
- void Update(uint32 diff);
+ TC_GAME_API void Update(uint32 diff);
}
#endif
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index d2ccb025165..be9b48a81f3 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -43,6 +43,7 @@
#include "GridNotifiersImpl.h"
#include "GroupMgr.h"
#include "GuildFinderMgr.h"
+#include "GameObjectModel.h"
#include "InstanceSaveMgr.h"
#include "Language.h"
#include "LFGMgr.h"
@@ -73,17 +74,18 @@
#include <boost/algorithm/string.hpp>
-std::atomic<bool> World::m_stopEvent(false);
-uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE;
-std::atomic<uint32> World::m_worldLoopCounter(0);
+TC_GAME_API std::atomic<bool> World::m_stopEvent(false);
+TC_GAME_API uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE;
-float World::m_MaxVisibleDistanceOnContinents = DEFAULT_VISIBILITY_DISTANCE;
-float World::m_MaxVisibleDistanceInInstances = DEFAULT_VISIBILITY_INSTANCE;
-float World::m_MaxVisibleDistanceInBGArenas = DEFAULT_VISIBILITY_BGARENAS;
+TC_GAME_API std::atomic<uint32> World::m_worldLoopCounter(0);
-int32 World::m_visibility_notify_periodOnContinents = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
-int32 World::m_visibility_notify_periodInInstances = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
-int32 World::m_visibility_notify_periodInBGArenas = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
+TC_GAME_API float World::m_MaxVisibleDistanceOnContinents = DEFAULT_VISIBILITY_DISTANCE;
+TC_GAME_API float World::m_MaxVisibleDistanceInInstances = DEFAULT_VISIBILITY_INSTANCE;
+TC_GAME_API float World::m_MaxVisibleDistanceInBGArenas = DEFAULT_VISIBILITY_BGARENAS;
+
+TC_GAME_API int32 World::m_visibility_notify_periodOnContinents = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
+TC_GAME_API int32 World::m_visibility_notify_periodInInstances = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
+TC_GAME_API int32 World::m_visibility_notify_periodInBGArenas = DEFAULT_VISIBILITY_NOTIFY_PERIOD;
/// World constructor
World::World()
@@ -147,6 +149,12 @@ World::~World()
/// @todo free addSessQueue
}
+World* World::instance()
+{
+ static World instance;
+ return &instance;
+}
+
/// Find a player in a specified zone
Player* World::FindPlayerInZone(uint32 zone)
{
@@ -1409,8 +1417,6 @@ void World::LoadConfigSettings(bool reload)
sScriptMgr->OnConfigLoad(reload);
}
-extern void LoadGameObjectModelList(std::string const& dataPath);
-
/// Initialize the World
void World::SetInitialWorldSettings()
{
@@ -1941,6 +1947,7 @@ void World::SetInitialWorldSettings()
m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS);
m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS);
+ m_timers[WUPDATE_AUCTIONS_PENDING].SetInterval(250);
m_timers[WUPDATE_UPTIME].SetInterval(m_int_configs[CONFIG_UPTIME_UPDATE]*MINUTE*IN_MILLISECONDS);
//Update "uptime" table based on configuration entry in minutes.
m_timers[WUPDATE_CORPSES].SetInterval(20 * MINUTE * IN_MILLISECONDS);
@@ -2190,6 +2197,13 @@ void World::Update(uint32 diff)
sAuctionMgr->Update();
}
+ if (m_timers[WUPDATE_AUCTIONS_PENDING].Passed())
+ {
+ m_timers[WUPDATE_AUCTIONS_PENDING].Reset();
+
+ sAuctionMgr->UpdatePendingAuctions();
+ }
+
/// <li> Handle AHBot operations
if (m_timers[WUPDATE_AHBOT].Passed())
{
@@ -3468,6 +3482,8 @@ void World::RemoveOldCorpses()
m_timers[WUPDATE_CORPSES].SetCurrent(m_timers[WUPDATE_CORPSES].GetInterval());
}
+Realm realm;
+
uint32 GetVirtualRealmAddress()
{
return uint32(realm.Id.Region) << 24 | uint32(realm.Id.Site) << 16 | realm.Id.Realm;
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 0f9a27c733f..24a23f4f853 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -79,6 +79,7 @@ enum ShutdownExitCode
enum WorldTimers
{
WUPDATE_AUCTIONS,
+ WUPDATE_AUCTIONS_PENDING,
WUPDATE_WEATHERS,
WUPDATE_UPTIME,
WUPDATE_CORPSES,
@@ -555,14 +556,10 @@ struct CharacterInfo
};
/// The World
-class World
+class TC_GAME_API World
{
public:
- static World* instance()
- {
- static World instance;
- return &instance;
- }
+ static World* instance();
static std::atomic<uint32> m_worldLoopCounter;
@@ -898,9 +895,11 @@ class World
std::deque<PreparedQueryResultFuture> m_realmCharCallbacks;
};
-extern Realm realm;
-uint32 GetVirtualRealmAddress();
+TC_GAME_API extern Realm realm;
+
+TC_GAME_API uint32 GetVirtualRealmAddress();
#define sWorld World::instance()
+
#endif
/// @}
diff --git a/src/server/ipc/CMakeLists.txt b/src/server/ipc/CMakeLists.txt
deleted file mode 100644
index ca29ebe61b3..00000000000
--- a/src/server/ipc/CMakeLists.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2008-2016 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(ZMQ REQUIRED)
-
-file(GLOB_RECURSE sources_ipc *.cpp *.h)
-
-set(ipc_SRCS
- ${sources_ipc}
-)
-
-include_directories(
- ${CMAKE_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/dep/zmqpp
- ${CMAKE_SOURCE_DIR}/src/common
- ${CMAKE_SOURCE_DIR}/src/server/shared
- ${ZMQ_INCLUDE_DIR}
-)
-
-add_library(ipc STATIC ${ipc_SRCS})
diff --git a/src/server/ipc/Commands.cpp b/src/server/ipc/Commands.cpp
deleted file mode 100644
index 3eb78cbc14a..00000000000
--- a/src/server/ipc/Commands.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "Commands.h"
-#include <zmqpp/message.hpp>
-
-zmqpp::message& operator>>(zmqpp::message& msg, IPC::Header& header)
-{
- msg >> header.Channel;
- msg >> header.Command;
- return msg;
-}
-
-zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::RealmHandle& realm)
-{
- msg >> realm.Region;
- msg >> realm.Site;
- msg >> realm.Realm;
- return msg;
-}
-
-zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::Header& header)
-{
- msg >> header.Ipc;
- msg >> header.Realm;
- return msg;
-}
-
-zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle& toonHandle)
-{
- msg >> toonHandle.AccountId;
- msg >> toonHandle.GameAccountId;
- msg >> toonHandle.Guid;
- msg >> toonHandle.Name;
- return msg;
-}
-
-zmqpp::message& operator<<(zmqpp::message& msg, IPC::Header const& header)
-{
- msg << header.Channel;
- msg << header.Command;
- return msg;
-}
-
-zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle const& realm)
-{
- msg << realm.Region;
- msg << realm.Site;
- msg << realm.Realm;
- return msg;
-}
-
-zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::Header const& header)
-{
- msg << header.Ipc;
- msg << header.Realm;
- return msg;
-}
-
-zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle const& toonHandle)
-{
- msg << toonHandle.AccountId;
- msg << toonHandle.GameAccountId;
- msg << toonHandle.Guid;
- msg << toonHandle.Name;
- return msg;
-}
diff --git a/src/server/ipc/Commands.h b/src/server/ipc/Commands.h
deleted file mode 100644
index 618e8ca0509..00000000000
--- a/src/server/ipc/Commands.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _COMMANDS_H
-#define _COMMANDS_H
-
-#include "Define.h"
-#include "Realm/Realm.h"
-#include <string>
-
-enum Channels
-{
- IPC_CHANNEL_BNET,
-
- MAX_IPC_CHANNELS,
-};
-
-enum BnetCommands
-{
- BNET_CHANGE_TOON_ONLINE_STATE,
-
- IPC_BNET_MAX_COMMAND
-};
-
-namespace IPC
-{
- struct Header
- {
- uint8 Channel;
- uint8 Command;
- };
-
- namespace BattlenetComm
- {
- struct Header
- {
- IPC::Header Ipc;
- Battlenet::RealmHandle Realm;
- };
-
- struct ToonHandle
- {
- uint32 AccountId;
- uint32 GameAccountId;
- uint64 Guid;
- std::string Name;
- };
- }
-}
-
-namespace zmqpp
-{
- class message;
-}
-
-zmqpp::message& operator>>(zmqpp::message& msg, IPC::Header& header);
-zmqpp::message& operator>>(zmqpp::message& msg, Battlenet::RealmHandle& realm);
-zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::Header& header);
-zmqpp::message& operator>>(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle& toonHandle);
-
-zmqpp::message& operator<<(zmqpp::message& msg, IPC::Header const& header);
-zmqpp::message& operator<<(zmqpp::message& msg, Battlenet::RealmHandle const& realm);
-zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::Header const& header);
-zmqpp::message& operator<<(zmqpp::message& msg, IPC::BattlenetComm::ToonHandle const& toonHandle);
-
-#endif // _COMMANDS_H
diff --git a/src/server/ipc/ZMQTask.cpp b/src/server/ipc/ZMQTask.cpp
deleted file mode 100644
index 6d359d9b10a..00000000000
--- a/src/server/ipc/ZMQTask.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ZMQTask.h"
-#include "ZmqContext.h"
-#include <zmqpp/message.hpp>
-
-ZMQTask::ZMQTask()
-{
- _poller = new zmqpp::poller();
-}
-
-ZMQTask::~ZMQTask()
-{
- delete _poller;
- _poller = NULL;
- delete _inproc;
- delete _thread;
-}
-
-void ZMQTask::Start()
-{
- _inproc = sIpcContext->CreateInprocSubscriber();
- _poller->add(*_inproc);
-
- HandleOpen();
- _thread = new std::thread(&ZMQTask::Run, this);
-}
-
-void ZMQTask::End()
-{
- _thread->join();
- _poller->remove(*_inproc);
- _inproc->close();
- HandleClose();
-}
-
-bool ZMQTask::ProcessExit()
-{
- if (_poller->events(*_inproc) == zmqpp::poller::poll_in)
- {
- int op1;
- do
- {
- zmqpp::message msg;
- if (!_inproc->receive(msg, true))
- return false; //No more messages to read from sock. This shouldn't happen.
-
- // strip 'internalmq.' from message
- std::string cmd = msg.get(0).substr(11);
- if (cmd == "kill")
- return true;
-
- _inproc->get(zmqpp::socket_option::events, op1);
- } while (op1 & zmqpp::poller::poll_in);
- }
-
- return false;
-}
-
-void ZMQTask::Pipeline(zmqpp::socket* from, zmqpp::socket* to)
-{
- /*
- Push messages from socket to socket.
- */
- if (_poller->events(*from) == zmqpp::poller::poll_in)
- {
- int32 op1, op2;
- do
- {
- zmqpp::message msg;
- if (!from->receive(msg, true))
- return; //No more messages to read from socket. This shouldn't happen.
-
- to->send(msg);
- from->get(zmqpp::socket_option::events, op1);
- to->get(zmqpp::socket_option::events, op2);
- } while(op1 & zmqpp::poller::poll_in && op2 & zmqpp::poller::poll_out);
- }
-}
diff --git a/src/server/ipc/ZMQTask.h b/src/server/ipc/ZMQTask.h
deleted file mode 100644
index 85773adbfd1..00000000000
--- a/src/server/ipc/ZMQTask.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __ZMQTASK_H
-#define __ZMQTASK_H
-
-#include "Define.h"
-#include <thread>
-#include <zmqpp/poller.hpp>
-#include <zmqpp/socket.hpp>
-
-/*
- This class serves as a base for all long running tasks
- It is set up to terminate its running task upon receiving "kill" command
-*/
-class ZMQTask
-{
-public:
- ZMQTask();
- virtual ~ZMQTask();
-
- void Start();
- void End();
- virtual void Run() = 0;
-
-protected:
- virtual void HandleOpen() { }
- virtual void HandleClose() { }
- void Pipeline(zmqpp::socket* from, zmqpp::socket* to);
- bool ProcessExit();
-
- zmqpp::poller* _poller;
-
- zmqpp::socket* _inproc = nullptr;
- std::thread* _thread = nullptr;
-};
-
-#endif // __ZMQTASK_H
diff --git a/src/server/ipc/ZmqContext.cpp b/src/server/ipc/ZmqContext.cpp
deleted file mode 100644
index bc062de8e88..00000000000
--- a/src/server/ipc/ZmqContext.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ZmqContext.h"
-
-ZmqContext::ZmqContext() : _inproc(nullptr)
-{
-}
-
-ZmqContext::~ZmqContext()
-{
-}
-
-zmqpp::socket* ZmqContext::CreateNewSocket(zmqpp::socket_type type)
-{
- std::unique_lock<std::mutex> lock(_mutex);
- zmqpp::socket* socket = new zmqpp::socket(_context, type);
- socket->set(zmqpp::socket_option::linger, 0);
- return socket;
-}
-
-void ZmqContext::Initialize()
-{
- _inproc = new zmqpp::socket(_context, zmqpp::socket_type::pub);
- _inproc->bind("inproc://workers");
-}
-
-zmqpp::socket* ZmqContext::CreateInprocSubscriber()
-{
- zmqpp::socket* sub = CreateNewSocket(zmqpp::socket_type::sub);
- sub->connect("inproc://workers");
- sub->subscribe("internalmq.");
- return sub;
-}
-
-void ZmqContext::Close()
-{
- _inproc->send("internalmq.kill");
- delete _inproc;
- _inproc = nullptr;
-}
diff --git a/src/server/ipc/ZmqContext.h b/src/server/ipc/ZmqContext.h
deleted file mode 100644
index 99f49a8c597..00000000000
--- a/src/server/ipc/ZmqContext.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __ZMQCONTEX_H
-#define __ZMQCONTEX_H
-
-#include <zmqpp/zmqpp.hpp>
-#include <mutex>
-
-/*
- * We need to serialize access to zmq context otherwise stuff blows up.
- */
-class ZmqContext
-{
-public:
- ~ZmqContext();
-
- static ZmqContext* Instance()
- {
- static ZmqContext instance;
- return &instance;
- }
-
- zmqpp::socket* CreateNewSocket(zmqpp::socket_type);
- void Initialize();
- zmqpp::socket* CreateInprocSubscriber();
- void Close();
-
-private:
- ZmqContext();
- ZmqContext(ZmqContext const&) = delete;
- ZmqContext& operator=(ZmqContext const&) = delete;
-
- zmqpp::context _context;
- std::mutex _mutex;
- zmqpp::socket* _inproc;
-};
-
-#define sIpcContext ZmqContext::Instance()
-
-#endif
diff --git a/src/server/ipc/ZmqListener.cpp b/src/server/ipc/ZmqListener.cpp
deleted file mode 100644
index a7cf78f8a92..00000000000
--- a/src/server/ipc/ZmqListener.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ZmqListener.h"
-#include "ZmqContext.h"
-
-ZmqListener::ZmqListener(std::string const& from, std::string const& to)
-{
- _from = sIpcContext->CreateNewSocket(zmqpp::socket_type::sub);
- _to = sIpcContext->CreateNewSocket(zmqpp::socket_type::push);
- _from->connect(from);
- _to->bind(to);
-}
-
-ZmqListener::~ZmqListener()
-{
- delete _from;
- delete _to;
-}
-
-void ZmqListener::HandleOpen()
-{
-}
-
-void ZmqListener::HandleClose()
-{
- _from->close();
- _to->close();
-}
-
-void ZmqListener::Run()
-{
- while (!ProcessExit())
- {
- _poller->poll();
-
- while (_poller->events(*_from) & zmqpp::poller::poll_in &&
- _poller->events(*_to) & zmqpp::poller::poll_out)
- {
- zmqpp::message msg;
- _from->receive(msg);
- _to->send(msg);
- }
- }
-}
-
-void ZmqListener::Subscribe(std::string const& keyword)
-{
- _from->subscribe(keyword);
-}
-
-void ZmqListener::Unsubscribe(std::string const& keyword)
-{
- _from->unsubscribe(keyword);
-}
diff --git a/src/server/ipc/ZmqListener.h b/src/server/ipc/ZmqListener.h
deleted file mode 100644
index 07798b81886..00000000000
--- a/src/server/ipc/ZmqListener.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __ZMQLISTENER_H
-#define __ZMQLISTENER_H
-
-#include "ZMQTask.h"
-#include <zmqpp/zmqpp.hpp>
-
-class ZmqListener : public ZMQTask
-{
-/*
- * Read broadcasts from remote PUB socket, and forward them to
- * another socket.
- *
- * from - client SUB socket
- * to - listen PUSH socket
- *
- */
-public:
- ZmqListener(std::string const& from, std::string const& to);
- ~ZmqListener();
- void Run() override;
-
- void Subscribe(std::string const& keyword);
- void Unsubscribe(std::string const& keyword);
-
-protected:
- void HandleOpen() override;
- void HandleClose() override;
-
-private:
- zmqpp::socket* _from;
- zmqpp::socket* _to;
-};
-
-#endif
diff --git a/src/server/ipc/ZmqMux.cpp b/src/server/ipc/ZmqMux.cpp
deleted file mode 100644
index d6dcd0f73f6..00000000000
--- a/src/server/ipc/ZmqMux.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ZmqMux.h"
-#include "ZmqContext.h"
-
-ZmqMux::ZmqMux(std::string const& fromUri, std::string const& toUri):
- _fromAddress(fromUri)
-{
- printf("Opening muxer thread from %s to %s\n", fromUri.c_str(), toUri.c_str());
- _from = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull);
- _to = sIpcContext->CreateNewSocket(zmqpp::socket_type::push);
-
- _from->bind(fromUri);
- _to->connect(toUri);
-}
-
-ZmqMux::~ZmqMux()
-{
- delete _from;
- delete _to;
-}
-
-void ZmqMux::HandleOpen()
-{
- _poller->add(*_from);
- _poller->add(*_to, zmqpp::poller::poll_out);
-}
-
-bool ZmqMux::Send(zmqpp::message* m, bool dont_block)
-{
- if (_socket.get() == nullptr)
- {
- _socket.reset(sIpcContext->CreateNewSocket(zmqpp::socket_type::push));
- _socket->connect(_fromAddress);
- }
-
- return _socket->send(*m, dont_block);
-}
-
-void ZmqMux::Run()
-{
- for (;;)
- {
- std::this_thread::sleep_for(std::chrono::milliseconds(50));
- if (!_poller->poll())
- break;
-
- if (ProcessExit())
- break;
-
- Pipeline(_from, _to);
- }
-}
diff --git a/src/server/ipc/ZmqMux.h b/src/server/ipc/ZmqMux.h
deleted file mode 100644
index 1009382f101..00000000000
--- a/src/server/ipc/ZmqMux.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __ZMQMUX_H
-#define __ZMQMUX_H
-
-#include "ZMQTask.h"
-#include <string>
-#include <boost/thread/tss.hpp>
-
-/*
- * Multiplexes zmq messages from many threads,
- * and then passes them to another socket.
- */
-class ZmqMux : public ZMQTask
-{
-public:
- ZmqMux(std::string const& from, std::string const& to);
- ~ZmqMux();
- bool Send(zmqpp::message*, bool dont_block = false);
- void Run() override;
-
-protected:
- void HandleOpen() override;
-
-private:
- boost::thread_specific_ptr<zmqpp::socket> _socket;
- zmqpp::socket* _from;
- zmqpp::socket* _to;
- std::string const _fromAddress;
-};
-
-#endif
diff --git a/src/server/ipc/ZmqWorker.cpp b/src/server/ipc/ZmqWorker.cpp
deleted file mode 100644
index 617730ad013..00000000000
--- a/src/server/ipc/ZmqWorker.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ZmqWorker.h"
-#include "ZmqContext.h"
-
-ZmqWorker::ZmqWorker(std::string const& taskUri, std::string const& resUri) :
- _taskUri(taskUri), _resultsUri(resUri)
-{
-}
-
-ZmqWorker::~ZmqWorker()
-{
- delete _taskQueue;
- delete _results;
-}
-
-void ZmqWorker::HandleOpen()
-{
- _taskQueue = sIpcContext->CreateNewSocket(zmqpp::socket_type::pull);
- _results = sIpcContext->CreateNewSocket(zmqpp::socket_type::push);
-
- _taskQueue->connect(_taskUri);
- _results->connect(_resultsUri);
-
- _poller->add(*_taskQueue);
-}
-
-void ZmqWorker::HandleClose()
-{
- _taskQueue->close();
- _results->close();
-}
-
-void ZmqWorker::Run()
-{
- while (!ProcessExit())
- {
- _poller->poll();
- if (_poller->events(*_taskQueue) & zmqpp::poller::poll_in)
- PerformWork();
- }
-}
-
-void ZmqWorker::PerformWork()
-{
- int32 op1;
- do
- {
- zmqpp::message msg;
- _taskQueue->receive(msg);
- Dispatch(msg);
- _taskQueue->get(zmqpp::socket_option::events, op1);
- } while (op1 & zmqpp::poller::poll_in);
-}
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
index b89d12b70a8..c5b6aed89b9 100644
--- a/src/server/scripts/CMakeLists.txt
+++ b/src/server/scripts/CMakeLists.txt
@@ -10,11 +10,6 @@
# Enable precompiled headers when using the GCC compiler.
-if (USE_SCRIPTPCH)
- set(scripts_STAT_PCH_HDR PrecompiledHeaders/ScriptPCH.h)
- set(scripts_STAT_PCH_SRC PrecompiledHeaders/ScriptPCH.cpp)
-endif ()
-
message(STATUS "SCRIPT PREPARATIONS")
macro(PrepareScripts name out)
@@ -26,134 +21,57 @@ macro(PrepareScripts name out)
message(STATUS " -> Prepared: ${name}")
endmacro(PrepareScripts)
-set(scripts_STAT_SRCS
- ${scripts_STAT_SRCS}
- ../game/AI/ScriptedAI/ScriptedEscortAI.cpp
- ../game/AI/ScriptedAI/ScriptedCreature.cpp
- ../game/AI/ScriptedAI/ScriptedFollowerAI.cpp
-)
-
-PrepareScripts(Spells scripts_STAT_SRCS)
-PrepareScripts(Commands scripts_STAT_SRCS)
+PrepareScripts(Spells PRIVATE_SOURCES)
+PrepareScripts(Commands PRIVATE_SOURCES)
if(SCRIPTS)
- PrepareScripts(Custom scripts_STAT_SRCS)
- PrepareScripts(World scripts_STAT_SRCS)
- PrepareScripts(OutdoorPvP scripts_STAT_SRCS)
- PrepareScripts(EasternKingdoms scripts_STAT_SRCS)
- PrepareScripts(Kalimdor scripts_STAT_SRCS)
- PrepareScripts(Outland scripts_STAT_SRCS)
- PrepareScripts(Northrend scripts_STAT_SRCS)
- PrepareScripts(Maelstrom scripts_STAT_SRCS)
- PrepareScripts(Events scripts_STAT_SRCS)
- PrepareScripts(Pet scripts_STAT_SRCS)
+ PrepareScripts(Custom PRIVATE_SOURCES)
+ PrepareScripts(World PRIVATE_SOURCES)
+ PrepareScripts(OutdoorPvP PRIVATE_SOURCES)
+ PrepareScripts(EasternKingdoms PRIVATE_SOURCES)
+ PrepareScripts(Kalimdor PRIVATE_SOURCES)
+ PrepareScripts(Outland PRIVATE_SOURCES)
+ PrepareScripts(Northrend PRIVATE_SOURCES)
+ PrepareScripts(Maelstrom PRIVATE_SOURCES)
+ PrepareScripts(Events PRIVATE_SOURCES)
+ PrepareScripts(Pet PRIVATE_SOURCES)
endif()
message(STATUS "SCRIPT PREPARATION COMPLETE")
message("")
-include_directories(
- ${CMAKE_SOURCE_DIR}/dep/cppformat
- ${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
- ${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/AuctionHouseBot
- ${CMAKE_SOURCE_DIR}/src/server/game/Battlefield
- ${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/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/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/Object
- ${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/Transport
- ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit
- ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Vehicle
- ${CMAKE_SOURCE_DIR}/src/server/game/Events
- ${CMAKE_SOURCE_DIR}/src/server/game/Globals
- ${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/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
- ${CMAKE_SOURCE_DIR}/src/server/game/Mails
- ${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/Quests
- ${CMAKE_SOURCE_DIR}/src/server/game/Reputation
- ${CMAKE_SOURCE_DIR}/src/server/game/Scripting
- ${CMAKE_SOURCE_DIR}/src/server/game/Server
- ${CMAKE_SOURCE_DIR}/src/server/game/Server/Packets
- ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol
- ${CMAKE_SOURCE_DIR}/src/server/game/Skills
- ${CMAKE_SOURCE_DIR}/src/server/game/Spells
- ${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/Weather
- ${CMAKE_SOURCE_DIR}/src/server/game/World
- ${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}
-)
+list(APPEND PRIVATE_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/ScriptLoader.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/ScriptLoader.cpp)
+
+if (USE_SCRIPTPCH)
+ set(PRIVATE_PCH_HEADER PrecompiledHeaders/ScriptPCH.h)
+ set(PRIVATE_PCH_SOURCE PrecompiledHeaders/ScriptPCH.cpp)
+endif ()
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
add_library(scripts STATIC
- ${scripts_STAT_SRCS}
- ${scripts_STAT_PCH_SRC}
+ ${PRIVATE_SOURCES}
+ ${PRIVATE_PCH_SOURCE}
)
+target_include_directories(scripts
+ PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
+
+target_link_libraries(scripts
+ PUBLIC
+ game)
+
+set_target_properties(scripts
+ PROPERTIES
+ FOLDER
+ "server")
+
# Generate precompiled header
if (USE_SCRIPTPCH)
- add_cxx_pch(scripts ${scripts_STAT_PCH_HDR} ${scripts_STAT_PCH_SRC})
+ add_cxx_pch(scripts ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE})
endif()
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index dc2baa57e5f..8be6e029cf0 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -98,6 +98,7 @@ public:
{ "transport", rbac::RBAC_PERM_COMMAND_DEBUG_TRANSPORT, false, &HandleDebugTransportCommand, "" },
{ "loadcells", rbac::RBAC_PERM_COMMAND_DEBUG_LOADCELLS, false, &HandleDebugLoadCellsCommand, "",},
{ "phase", rbac::RBAC_PERM_COMMAND_DEBUG_PHASE, false, &HandleDebugPhaseCommand, "" },
+ { "boundary", rbac::RBAC_PERM_COMMAND_DEBUG_BOUNDARY, false, &HandleDebugBoundaryCommand, "" }
};
static std::vector<ChatCommand> commandTable =
{
@@ -1419,6 +1420,33 @@ public:
return true;
}
+ static bool HandleDebugBoundaryCommand(ChatHandler* handler, char const* args)
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+ if (!player)
+ return false;
+ Creature* target = handler->getSelectedCreature();
+ if (!target || !target->IsAIEnabled || !target->AI())
+ {
+ return false;
+ }
+
+ char* fill_str = args ? strtok((char*)args, " ") : nullptr;
+ char* duration_str = args ? strtok(nullptr, " ") : nullptr;
+
+ int duration = duration_str ? atoi(duration_str) : -1;
+ if (duration <= 0 || duration >= 30 * MINUTE) // arbitary upper limit
+ duration = 3 * MINUTE;
+
+ bool doFill = fill_str ? (stricmp(fill_str, "FILL") == 0) : false;
+
+ int32 errMsg = target->AI()->VisualizeBoundary(duration, player, doFill);
+ if (errMsg > 0)
+ handler->PSendSysMessage(errMsg);
+
+ return true;
+ }
+
static bool HandleDebugPhaseCommand(ChatHandler* handler, char const* /*args*/)
{
Unit* target = handler->getSelectedUnit();
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
index 269e115189a..d5ed2421efc 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
@@ -77,7 +77,7 @@ public:
Talk(SAY_RESPAWN);
}
- bool CheckInRoom()
+ bool CheckInRoom() override
{
if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
{
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
index 93583364ef6..238942c15f6 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
@@ -78,7 +78,7 @@ public:
Talk(SAY_BUFF);
}
- bool CheckInRoom()
+ bool CheckInRoom() override
{
if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
{
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
index 043c78999f3..2108e393578 100644
--- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
@@ -111,7 +111,7 @@ class boss_alizabal : public CreatureScript
Talk(SAY_SLAY);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
me->GetMotionMaster()->MoveTargetedHome();
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp
index 2dbca9eee57..ae94b112533 100644
--- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp
@@ -73,9 +73,9 @@ class boss_occuthar : public CreatureScript
events.ScheduleEvent(EVENT_BERSERK, 5 * MINUTE * IN_MILLISECONDS);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- BossAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode(why);
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
_DespawnAtEvade();
}
@@ -188,7 +188,7 @@ class npc_eyestalk : public CreatureScript
}
}
- void EnterEvadeMode() override { } // Never evade
+ void EnterEvadeMode(EvadeReason /*why*/) override { } // Never evade
private:
InstanceScript* _instance;
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp
index 13b675e855c..f89d54ec7dd 100644
--- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp
@@ -58,7 +58,7 @@ class boss_pit_lord_argaloth : public CreatureScript
events.ScheduleEvent(EVENT_BERSERK, 5 * MINUTE * IN_MILLISECONDS);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
me->GetMotionMaster()->MoveTargetedHome();
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
index 3543fccf159..b454f5feaa9 100644
--- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
@@ -21,10 +21,10 @@
DoorData const doorData[] =
{
- { GO_ARGALOTH_DOOR, DATA_ARGALOTH, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_OCCUTHAR_DOOR, DATA_OCCUTHAR, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ALIZABAL_DOOR, DATA_ALIZABAL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_ARGALOTH_DOOR, DATA_ARGALOTH, DOOR_TYPE_ROOM },
+ { GO_OCCUTHAR_DOOR, DATA_OCCUTHAR, DOOR_TYPE_ROOM },
+ { GO_ALIZABAL_DOOR, DATA_ALIZABAL, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_baradin_hold: public InstanceMapScript
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
index bd489d279ae..5e1aad82fa5 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
@@ -198,9 +198,9 @@ class boss_doomrel : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
_instance->SetGuidData(DATA_EVENSTARTER, ObjectGuid::Empty);
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
index 102d9e871cb..73704f4f42c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
@@ -22,14 +22,14 @@
DoorData const doorData[] =
{
- { GO_BOSSGATE01, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_DRAKE_RIDER_PORTCULLIS, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ALTERAC_VALLEY_GATE, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GATE, DATA_FIREMAW, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GATE, DATA_EBONROC, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GATE, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_VACCUUM_EXIT_GATE, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_BOSSGATE01, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE },
+ { GO_DRAKE_RIDER_PORTCULLIS, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE },
+ { GO_ALTERAC_VALLEY_GATE, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE },
+ { GO_GATE, DATA_FIREMAW, DOOR_TYPE_PASSAGE },
+ { GO_GATE, DATA_EBONROC, DOOR_TYPE_PASSAGE },
+ { GO_GATE, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE },
+ { GO_VACCUUM_EXIT_GATE, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
ObjectData const creatureData[] =
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
index 96e05541684..ced8dd8f37e 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
@@ -91,9 +91,9 @@ public:
Initialize();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
ResetTimer = 2000;
}
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
index 0a88ba17877..6386bb50e1a 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
@@ -30,12 +30,12 @@
DoorData const doorData[] =
{
- { GO_SELIN_DOOR, DATA_SELIN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_SELIN_ENCOUNTER_DOOR, DATA_SELIN, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_VEXALLUS_DOOR, DATA_VEXALLUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_DELRISSA_DOOR, DATA_DELRISSA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_KAEL_DOOR, DATA_KAELTHAS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_SELIN_DOOR, DATA_SELIN, DOOR_TYPE_PASSAGE },
+ { GO_SELIN_ENCOUNTER_DOOR, DATA_SELIN, DOOR_TYPE_ROOM },
+ { GO_VEXALLUS_DOOR, DATA_VEXALLUS, DOOR_TYPE_PASSAGE },
+ { GO_DELRISSA_DOOR, DATA_DELRISSA, DOOR_TYPE_PASSAGE },
+ { GO_KAEL_DOOR, DATA_KAELTHAS, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
Position const KalecgosSpawnPos = { 164.3747f, -397.1197f, 2.151798f, 1.66219f };
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index 1975ebe0021..6038b76f0d0 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -452,8 +452,6 @@ class npc_eye_of_acherus : public CreatureScript
## npc_death_knight_initiate
######*/
-#define GOSSIP_ACCEPT_DUEL "I challenge you, death knight!"
-
enum Spells_DKI
{
SPELL_DUEL = 52996,
@@ -514,7 +512,7 @@ public:
if (player->IsInCombat() || creature->IsInCombat())
return true;
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ACCEPT_DUEL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
+ player->ADD_GOSSIP_ITEM_DB(Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
}
return true;
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index acfdf0523f4..dd43b46795b 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
@@ -596,10 +596,10 @@ public:
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
if (!bIsBattle)//do not reset self if we are in battle
- npc_escortAI::EnterEvadeMode();
+ npc_escortAI::EnterEvadeMode(why);
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
index caab177d53f..7096e60fb15 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
@@ -21,8 +21,8 @@
DoorData const doorData[] =
{
- { GO_HIGH_INQUISITORS_DOOR, DATA_MOGRAINE_AND_WHITE_EVENT, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_HIGH_INQUISITORS_DOOR, DATA_MOGRAINE_AND_WHITE_EVENT, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_scarlet_monastery : public InstanceMapScript
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
index b0b72f96956..0e3e1ff3950 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -108,7 +108,7 @@ class boss_kirtonos_the_herald : public CreatureScript
_JustDied();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetGuidData(GO_GATE_KIRTONOS)))
gate->SetGoState(GO_STATE_ACTIVE);
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
index 936ae51f163..2534c099169 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
@@ -136,10 +136,10 @@ public:
me->SummonCreature(NPC_FELMYST, x, y, z + 30, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
if (!Intro)
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void StartIntro()
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 8319d41a94a..8cdce77a1f5 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -169,12 +169,12 @@ public:
me->SetFullHealth(); //dunno why it does not resets health at evade..
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
bJustReset = true;
me->SetVisible(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void DoAction(int32 param) override
@@ -237,7 +237,7 @@ public:
{
if (me->GetDistance(CENTER_X, CENTER_Y, DRAGON_REALM_Z) >= 75)
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_BOUNDARY);
return;
}
if (HealthBelowPct(10) && !isEnraged)
@@ -261,7 +261,7 @@ public:
else
{
TC_LOG_ERROR("scripts", "Didn't find Shathrowar. Kalecgos event reseted.");
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
}
@@ -423,7 +423,7 @@ public:
TalkTimer = 15000;
break;
case 3:
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
break;
default:
break;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index c792214ae49..d86b3707606 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -624,9 +624,9 @@ public:
Talk(SAY_KJ_SLAY);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
summons.DespawnAll();
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index 1c5f4193cd6..23ce70ef8f6 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
@@ -151,7 +151,7 @@ public:
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (Creature* muru = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MURU)))
muru->AI()->Reset(); // Reset encounter.
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
index 3f89e80906d..bb9d3065f64 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
@@ -31,13 +31,13 @@
DoorData const doorData[] =
{
- { GO_FIRE_BARRIER, DATA_FELMYST, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_MURUS_GATE_1, DATA_MURU, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_MURUS_GATE_2, DATA_MURU, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_BOSS_COLLISION_1, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_BOSS_COLLISION_2, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_FORCE_FIELD, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_FIRE_BARRIER, DATA_FELMYST, DOOR_TYPE_PASSAGE },
+ { GO_MURUS_GATE_1, DATA_MURU, DOOR_TYPE_ROOM },
+ { GO_MURUS_GATE_2, DATA_MURU, DOOR_TYPE_PASSAGE },
+ { GO_BOSS_COLLISION_1, DATA_KALECGOS, DOOR_TYPE_ROOM },
+ { GO_BOSS_COLLISION_2, DATA_KALECGOS, DOOR_TYPE_ROOM },
+ { GO_FORCE_FIELD, DATA_KALECGOS, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_sunwell_plateau : public InstanceMapScript
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index f6ae3fc1b91..4c89aab57ba 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -22,12 +22,12 @@
DoorData const doorData[] =
{
- { GO_VENOXIS_COIL, DATA_VENOXIS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ARENA_DOOR_1, DATA_MANDOKIR, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_FORCEFIELD, DATA_KILNARA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ZANZIL_DOOR, DATA_ZANZIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- //{ GO_THE_CACHE_OF_MADNESS_DOOR, DATA_xxxxxxx, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+ { GO_VENOXIS_COIL, DATA_VENOXIS, DOOR_TYPE_ROOM },
+ { GO_ARENA_DOOR_1, DATA_MANDOKIR, DOOR_TYPE_ROOM },
+ { GO_FORCEFIELD, DATA_KILNARA, DOOR_TYPE_ROOM },
+ { GO_ZANZIL_DOOR, DATA_ZANZIL, DOOR_TYPE_ROOM },
+ //{ GO_THE_CACHE_OF_MADNESS_DOOR, DATA_xxxxxxx, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM }
};
class instance_zulgurub : public InstanceMapScript
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
index d0e62565102..0196461b68e 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
@@ -417,7 +417,7 @@ void hyjalAI::Reset()
}
}
-void hyjalAI::EnterEvadeMode()
+void hyjalAI::EnterEvadeMode(EvadeReason /*why*/)
{
if (me->GetEntry() != JAINA)
me->RemoveAllAuras();
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
index 0c5213ee080..54d3c53039e 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
@@ -123,7 +123,7 @@ struct hyjalAI : public npc_escortAI
void Reset() override; // Generically used to reset our variables. Do *not* call in EnterEvadeMode as this may make problems if the raid is still in combat
- void EnterEvadeMode() override; // Send creature back to spawn location and evade.
+ void EnterEvadeMode(EvadeReason /*why*/ = EVADE_REASON_OTHER) override; // Send creature back to spawn location and evade.
void EnterCombat(Unit* /*who*/) override; // Used to reset cooldowns for our spells and to inform the raid that we're under attack
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
index 5e100b1c4b2..db62fb8b086 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
@@ -43,9 +43,9 @@ Position const GuardianOfTimePos = { 2321.489f, 1268.383f, 132.8507f, 0.418879f
DoorData const doorData[] =
{
- { GO_MALGANIS_GATE_2, DATA_MAL_GANIS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_EXIT_GATE, DATA_MAL_GANIS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_MALGANIS_GATE_2, DATA_MAL_GANIS, DOOR_TYPE_ROOM },
+ { GO_EXIT_GATE, DATA_MAL_GANIS, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_culling_of_stratholme : public InstanceMapScript
diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
index ae608a86413..aeb63dac2c0 100644
--- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
+++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
@@ -259,11 +259,11 @@ class npc_blazing_monstrosity : public CreatureScript
{
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
_summons.DespawnAll();
_events.Reset();
- PassiveAI::EnterEvadeMode();
+ PassiveAI::EnterEvadeMode(why);
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
index 789b79e6d7f..925eb8308aa 100644
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
@@ -284,7 +284,7 @@ class npc_omega_stance : public CreatureScript
DoCast(me, SPELL_OMEGA_STANCE_SPIDER_TRIGGER, true);
}
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
};
CreatureAI* GetAI(Creature* creature) const override
@@ -308,7 +308,7 @@ class npc_alpha_beam : public CreatureScript
anraphet->CastSpell(me, SPELL_ALPHA_BEAMS_BACK_CAST);
}
- void EnterEvadeMode() override { } // Never evade
+ void EnterEvadeMode(EvadeReason /*why*/) override { } // Never evade
private:
InstanceScript* _instance;
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
index 09f86896c02..6dabe1f0a72 100644
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
@@ -29,19 +29,19 @@
DoorData const doorData[] =
{
- {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_ELEVATOR_COL01, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_VAULT_OF_LIGHTS_DOOR, DATA_VAULT_OF_LIGHTS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_02, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LASERBEAMS01, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LASERBEAMS_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LASERBEAMS_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_04, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {GO_DOODAD_ULDUM_LASERBEAMS_02, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+ {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE },
+ {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_ELEVATOR_COL01, DATA_TEMPLE_GUARDIAN_ANHUUR, DOOR_TYPE_PASSAGE },
+ {GO_VAULT_OF_LIGHTS_DOOR, DATA_VAULT_OF_LIGHTS, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_02, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LASERBEAMS01, DATA_EARTH_WARDEN, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LASERBEAMS_01, DATA_FIRE_WARDEN, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LASERBEAMS_03, DATA_WATER_WARDEN, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LIGHTMACHINE_04, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ULDUM_LASERBEAMS_02, DATA_AIR_WARDEN, DOOR_TYPE_PASSAGE },
+ {0, 0, DOOR_TYPE_ROOM }
};
class instance_halls_of_origination : public InstanceMapScript
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
index 772c77bd01a..7da15b1fdce 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
@@ -316,20 +316,9 @@ public:
MovePoint = iTemp;
}
- bool CheckInRoom() override
- {
- if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 95.0f)
- {
- EnterEvadeMode();
- return false;
- }
-
- return true;
- }
-
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
//Common to PHASE_START && PHASE_END
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
index da953c0eb97..e5fa2153ad4 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
@@ -31,6 +31,11 @@ EndScriptData */
#include "onyxias_lair.h"
#include "TemporarySummon.h"
+BossBoundaryData const boundaries =
+{
+ { DATA_ONYXIA, new CircleBoundary(Position(-34.3697f, -212.3296f), 100.0) }
+};
+
class instance_onyxias_lair : public InstanceMapScript
{
public:
@@ -47,6 +52,7 @@ public:
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadBossBoundaries(boundaries);
onyxiaLiftoffTimer = 0;
manyWhelpsCounter = 0;
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
index 04d86a87f14..fa8eb2b706e 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
@@ -129,10 +129,10 @@ class boss_ayamiss : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
me->ClearUnitState(UNIT_STATE_ROOT);
- BossAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode(why);
}
void EnterCombat(Unit* attacker) override
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
index 4b6622e43c2..8a564c4974c 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
@@ -72,9 +72,9 @@ class boss_buru : public CreatureScript
_phase = 0;
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- BossAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode(why);
for (ObjectGuid eggGuid : Eggs)
if (Creature* egg = me->GetMap()->GetCreature(eggGuid))
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
index a04f0dc376a..e71ac9c1ed4 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
@@ -163,11 +163,11 @@ class boss_ossirian : public CreatureScript
Talk(SAY_SLAY);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
Cleanup();
summons.DespawnAll();
- BossAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode(why);
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
index abfbc8162df..de425fbfce1 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
@@ -77,9 +77,9 @@ class boss_skeram : public CreatureScript
Talk(SAY_SLAY);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
if (me->IsSummon())
((TempSummon*)me)->UnSummon();
}
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
index 595eadd6d2c..9f4c2da91e2 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
@@ -190,10 +190,10 @@ class boss_viscidus : public CreatureScript
events.ScheduleEvent(EVENT_POISON_SHOCK, urand(7000, 12000));
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
summons.DespawnAll();
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
index 01958f15298..36a094d2725 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
@@ -22,8 +22,8 @@
DoorData const doorData[] =
{
- { GO_PRINCE_TALDARAM_GATE, DATA_PRINCE_TALDARAM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_PRINCE_TALDARAM_GATE, DATA_PRINCE_TALDARAM, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_ahnkahet : public InstanceMapScript
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
index 9c774a434ab..88003680ec7 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
@@ -21,11 +21,11 @@
DoorData const doorData[] =
{
- { GO_KRIKTHIR_DOOR, DATA_KRIKTHIR_THE_GATEWATCHER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ANUBARAK_DOOR_1, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ANUBARAK_DOOR_2, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ANUBARAK_DOOR_3, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_KRIKTHIR_DOOR, DATA_KRIKTHIR_THE_GATEWATCHER, DOOR_TYPE_PASSAGE },
+ { GO_ANUBARAK_DOOR_1, DATA_ANUBARAK, DOOR_TYPE_ROOM },
+ { GO_ANUBARAK_DOOR_2, DATA_ANUBARAK, DOOR_TYPE_ROOM },
+ { GO_ANUBARAK_DOOR_3, DATA_ANUBARAK, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
ObjectData const creatureData[] =
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
index d2fdfee859a..f0b5a02e66e 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
@@ -501,8 +501,6 @@ public:
}
DoMeleeAttackIfReady();
-
- EnterEvadeIfOutOfCombatArea(diff);
}
private:
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
index 10e67704188..b54010b386c 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
@@ -23,6 +23,11 @@
0 - Sartharion
*/
+BossBoundaryData const boundaries =
+{
+ { DATA_SARTHARION, new RectangleBoundary(3218.86f, 3275.69f, 484.68f, 572.4f) }
+};
+
class instance_obsidian_sanctum : public InstanceMapScript
{
public:
@@ -33,6 +38,8 @@ public:
instance_obsidian_sanctum_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
+ SetBossNumber(EncounterCount);
+ LoadBossBoundaries(boundaries);
}
void OnCreatureCreate(Creature* creature) override
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
index 590c1011d56..fb5642c6f3b 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
@@ -98,7 +98,7 @@ class boss_general_zarithrian : public CreatureScript
{
_Reset();
if (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE)
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE);
}
void EnterCombat(Unit* /*who*/) override
@@ -145,13 +145,6 @@ class boss_general_zarithrian : public CreatureScript
if (!UpdateVictim())
return;
- // Can't use room boundary here, the gameobject is spawned at the same position as the boss. This is just as good anyway.
- if (me->GetPositionX() > 3058.0f)
- {
- EnterEvadeMode();
- return;
- }
-
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
@@ -228,7 +221,7 @@ class npc_onyx_flamecaller : public CreatureScript
_events.ScheduleEvent(EVENT_LAVA_GOUT, 5000);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
// Prevent EvadeMode
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 4a1c7e3c7a7..8c68fe4cc18 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -256,21 +256,9 @@ struct generic_halionAI : public BossAI
}
}
- bool CheckInRoom() override
- {
- // Rough radius, it is not an exactly perfect circle
- if (me->GetDistance2d(HalionControllerSpawnPos.GetPositionX(), HalionControllerSpawnPos.GetPositionY()) > 48.5f)
- {
- if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
- controller->AI()->EnterEvadeMode();
- return false;
- }
- return true;
- }
-
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom() || me->HasUnitState(UNIT_STATE_CASTING))
+ if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
@@ -323,11 +311,15 @@ class boss_halion : public CreatureScript
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
+ if (why == EVADE_REASON_BOUNDARY)
+ if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER)))
+ controller->AI()->EnterEvadeMode();
+
// Phase 1: We always can evade. Phase 2 & 3: We can evade if and only if the controller tells us to.
if (events.IsInPhase(PHASE_ONE) || _canEvade)
- generic_halionAI::EnterEvadeMode();
+ generic_halionAI::EnterEvadeMode(why);
}
void EnterCombat(Unit* who) override
@@ -497,7 +489,7 @@ class boss_twilight_halion : public CreatureScript
}
// Never evade
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
void KilledUnit(Unit* victim) override
{
@@ -1022,7 +1014,7 @@ class npc_meteor_strike_initial : public CreatureScript
}
void UpdateAI(uint32 /*diff*/) override { }
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
private:
InstanceScript* _instance;
std::list<Creature*> _meteorList;
@@ -1148,7 +1140,7 @@ class npc_meteor_strike_flame : public CreatureScript
flame->AI()->SetGUID(_rootOwnerGuid);
}
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
private:
InstanceScript* _instance;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
index 2a2f57b84e1..e660c3e2dde 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
@@ -23,10 +23,16 @@
#include "WorldPacket.h"
#include "ruby_sanctum.h"
+BossBoundaryData const boundaries =
+{
+ { DATA_GENERAL_ZARITHRIAN, new EllipseBoundary(Position(3013.409f, 529.492f), 45.0, 100.0) },
+ { DATA_HALION, new CircleBoundary(Position(3156.037f, 533.2656f), 48.5) }
+};
+
DoorData const doorData[] =
{
- {GO_FIRE_FIELD, DATA_BALTHARUS_THE_WARBORN, DOOR_TYPE_PASSAGE, BOUNDARY_E },
- {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE},
+ {GO_FIRE_FIELD, DATA_BALTHARUS_THE_WARBORN, DOOR_TYPE_PASSAGE },
+ {0, 0, DOOR_TYPE_ROOM },
};
class instance_ruby_sanctum : public InstanceMapScript
@@ -40,6 +46,7 @@ class instance_ruby_sanctum : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadBossBoundaries(boundaries);
LoadDoorData(doorData);
BaltharusSharedHealth = 0;
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
index 13a89f115e2..af805efc7e7 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp
@@ -18,6 +18,7 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
+#include "SpellScript.h"
#include "ruby_sanctum.h"
#include "Player.h"
@@ -45,6 +46,11 @@ enum Events
EVENT_XERESTRASZA_EVENT_7 = 7,
};
+enum Spells
+{
+ SPELL_RALLY = 75416
+};
+
Position const xerestraszaMovePos = {3151.236f, 379.8733f, 86.31996f, 0.0f};
class npc_xerestrasza : public CreatureScript
@@ -165,8 +171,53 @@ class at_baltharus_plateau : public AreaTriggerScript
}
};
+// 75415 - Rallying Shout
+class spell_ruby_sanctum_rallying_shout : public SpellScriptLoader
+{
+ public:
+ spell_ruby_sanctum_rallying_shout() : SpellScriptLoader("spell_ruby_sanctum_rallying_shout") { }
+
+ class spell_ruby_sanctum_rallying_shout_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_ruby_sanctum_rallying_shout_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_RALLY))
+ return false;
+ return true;
+ }
+
+ void CountTargets(std::list<WorldObject*>& targets)
+ {
+ _targetCount = targets.size();
+ }
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (_targetCount && !GetCaster()->HasAura(SPELL_RALLY))
+ GetCaster()->CastCustomSpell(SPELL_RALLY, SPELLVALUE_AURA_STACK, _targetCount, GetCaster(), TRIGGERED_FULL_MASK);
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ruby_sanctum_rallying_shout_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ OnEffectHit += SpellEffectFn(spell_ruby_sanctum_rallying_shout_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+
+ private:
+ uint32 _targetCount = 0;
+ };
+
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_ruby_sanctum_rallying_shout_SpellScript();
+ }
+};
+
void AddSC_ruby_sanctum()
{
new npc_xerestrasza();
new at_baltharus_plateau();
+ new spell_ruby_sanctum_rallying_shout();
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index 5836514dcf6..83daa6e35a2 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -167,10 +167,10 @@ class boss_gormok : public CreatureScript
summons.DespawnAll();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void MovementInform(uint32 type, uint32 pointId) override
@@ -309,11 +309,6 @@ class npc_snobold_vassal : public CreatureScript
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
}
- void EnterEvadeMode() override
- {
- ScriptedAI::EnterEvadeMode();
- }
-
void EnterCombat(Unit* who) override
{
_targetGUID = who->GetGUID();
@@ -751,10 +746,10 @@ class boss_dreadscale : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
- boss_jormungarAI::EnterEvadeMode();
+ boss_jormungarAI::EnterEvadeMode(why);
}
void JustReachedHome() override
@@ -924,10 +919,10 @@ class boss_icehowl : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void JustReachedHome() override
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 07b7637927d..83bd1c8fbcb 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -416,10 +416,10 @@ class boss_fjola : public CreatureScript
boss_twin_baseAI::EnterCombat(who);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR));
- boss_twin_baseAI::EnterEvadeMode();
+ boss_twin_baseAI::EnterEvadeMode(why);
}
void JustReachedHome() override
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
index 805c9bc2f6b..b053d95e1bd 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
@@ -22,6 +22,14 @@
#include "Player.h"
#include "TemporarySummon.h"
+BossBoundaryData const boundaries = {
+ { BOSS_BEASTS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { BOSS_JARAXXUS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { BOSS_CRUSADERS, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { BOSS_VALKIRIES, new CircleBoundary(Position(563.26f, 139.6f), 75.0) },
+ { BOSS_ANUBARAK, new EllipseBoundary(Position(746.0f, 135.0f), 100.0, 75.0) }
+};
+
class instance_trial_of_the_crusader : public InstanceMapScript
{
public:
@@ -33,6 +41,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTERS);
+ LoadBossBoundaries(boundaries);
TrialCounter = 50;
EventStage = 0;
NorthrendBeasts = NOT_STARTED;
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 8f9b6313c84..5de0dbd865c 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -1269,7 +1269,7 @@ class npc_the_lich_king_escape_hor : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (_despawn)
return;
@@ -1335,7 +1335,7 @@ class npc_the_lich_king_escape_hor : public CreatureScript
}
else if (me->getThreatManager().getThreatList().size() < 2 && me->HasAura(SPELL_REMORSELESS_WINTER))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return false;
}
@@ -1438,7 +1438,7 @@ struct npc_gauntlet_trash : public ScriptedAI
_events.Reset();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (_instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
_instance->SetData(DATA_WAVE_COUNT, NOT_STARTED);
@@ -1546,10 +1546,10 @@ class npc_phantom_mage : public CreatureScript
{
npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { }
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
if (!me->HasAura(AURA_HALLUCINATION))
- npc_gauntlet_trash::EnterEvadeMode();
+ npc_gauntlet_trash::EnterEvadeMode(why);
}
void EnterCombat(Unit* /*who*/) override
@@ -1626,10 +1626,10 @@ class npc_phantom_hallucination : public CreatureScript
DoZoneInCombat(me, 150.0f);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
if (me->GetOwner() && !me->GetOwner()->HasAura(AURA_HALLUCINATION))
- npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode();
+ npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(why);
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index a5659299706..03f12e46bc3 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
@@ -166,10 +166,10 @@ class boss_ick : public CreatureScript
events.ScheduleEvent(EVENT_SPECIAL, urand(30000, 35000));
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
me->GetMotionMaster()->Clear();
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void JustDied(Unit* /*killer*/) override
@@ -203,7 +203,7 @@ class boss_ick : public CreatureScript
if (!me->GetVictim() && me->getThreatManager().isThreatListEmpty())
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_NO_HOSTILES);
return;
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
index 805de607114..af85fc95a64 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
@@ -170,7 +170,7 @@ class boss_tyrannus : public CreatureScript
me->GetMotionMaster()->MoveChase(victim);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SetBossState(DATA_TYRANNUS, FAIL);
if (Creature* rimefang = GetRimefang())
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
index e547b84c381..12845d6e2b1 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
@@ -27,9 +27,9 @@ Position const EventLeaderPos2 = {1054.368f, 107.14620f, 628.4467f, 0.0f};
DoorData const Doors[] =
{
- {GO_ICE_WALL, DATA_GARFROST, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
- {GO_ICE_WALL, DATA_ICK, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
- {GO_HALLS_OF_REFLECTION_PORTCULLIS, DATA_TYRANNUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
+ {GO_ICE_WALL, DATA_GARFROST, DOOR_TYPE_PASSAGE },
+ {GO_ICE_WALL, DATA_ICK, DOOR_TYPE_PASSAGE },
+ {GO_HALLS_OF_REFLECTION_PORTCULLIS, DATA_TYRANNUS, DOOR_TYPE_PASSAGE },
};
class instance_pit_of_saron : public InstanceMapScript
diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
index 9e43228dc63..053e38ed93e 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
@@ -336,7 +336,7 @@ class boss_drakkari_elemental : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
me->DespawnOrUnsummon();
}
diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index 6ec02bfbe33..9f90b228247 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -23,12 +23,12 @@
DoorData const doorData[] =
{
- { GO_GAL_DARAH_DOOR_1, DATA_GAL_DARAH, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GAL_DARAH_DOOR_2, DATA_GAL_DARAH, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GAL_DARAH_DOOR_3, DATA_GAL_DARAH, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ECK_THE_FEROCIOUS_DOOR, DATA_MOORABI, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ECK_THE_FEROCIOUS_DOOR_BEHIND, DATA_ECK_THE_FEROCIOUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_GAL_DARAH_DOOR_1, DATA_GAL_DARAH, DOOR_TYPE_PASSAGE },
+ { GO_GAL_DARAH_DOOR_2, DATA_GAL_DARAH, DOOR_TYPE_PASSAGE },
+ { GO_GAL_DARAH_DOOR_3, DATA_GAL_DARAH, DOOR_TYPE_ROOM },
+ { GO_ECK_THE_FEROCIOUS_DOOR, DATA_MOORABI, DOOR_TYPE_PASSAGE },
+ { GO_ECK_THE_FEROCIOUS_DOOR_BEHIND, DATA_ECK_THE_FEROCIOUS, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
ObjectData const creatureData[] =
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index 9bc7c382a85..a0ce6700d8d 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -173,7 +173,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
{
if (!instance->CheckRequiredBosses(DATA_BLOOD_QUEEN_LANA_THEL, who->ToPlayer()))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
return;
}
@@ -244,9 +244,11 @@ class boss_blood_queen_lana_thel : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- _EnterEvadeMode();
+ if (!_EnterEvadeMode(why))
+ return;
+
CleanAuras();
if (_killMinchar)
{
@@ -257,6 +259,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
}
else
{
+ me->AddUnitState(UNIT_STATE_EVADE);
me->GetMotionMaster()->MoveTargetedHome();
Reset();
}
@@ -333,7 +336,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index 98108d8fceb..7e9083115b8 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -287,7 +287,7 @@ class boss_deathbringer_saurfang : public CreatureScript
if (!instance->CheckRequiredBosses(DATA_DEATHBRINGER_SAURFANG, who->ToPlayer()))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
return;
}
@@ -332,9 +332,9 @@ class boss_deathbringer_saurfang : public CreatureScript
ScriptedAI::AttackStart(victim);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
if (_introDone)
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
}
@@ -390,7 +390,7 @@ class boss_deathbringer_saurfang : public CreatureScript
if (target->GetTransport())
{
summon->DespawnOrUnsummon(1);
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
@@ -420,7 +420,7 @@ class boss_deathbringer_saurfang : public CreatureScript
{
if (target->GetTransport())
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
index a57d49f9cb9..60a26878a3d 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
@@ -115,7 +115,7 @@ class boss_festergut : public CreatureScript
{
if (!instance->CheckRequiredBosses(DATA_FESTERGUT, who->ToPlayer()))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
return;
}
@@ -145,9 +145,9 @@ class boss_festergut : public CreatureScript
instance->SetBossState(DATA_FESTERGUT, FAIL);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE)))
professor->AI()->EnterEvadeMode();
}
@@ -166,7 +166,7 @@ class boss_festergut : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
index eafb4f302eb..bf0d24c9e5e 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
@@ -573,7 +573,7 @@ struct gunship_npc_AI : public ScriptedAI
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (!me->IsAlive() || !me->IsInCombat())
return;
@@ -622,7 +622,7 @@ protected:
{
if (Instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != IN_PROGRESS)
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return false;
}
@@ -635,7 +635,7 @@ protected:
}
else if (me->getThreatManager().isThreatListEmpty())
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return false;
}
@@ -870,7 +870,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript
_events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 10000));
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (!me->IsAlive())
return;
@@ -1138,7 +1138,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript
_events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 10000));
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (!me->IsAlive())
return;
@@ -1716,9 +1716,9 @@ class npc_gunship_mage : public CreatureScript
me->SetReactState(REACT_PASSIVE);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void MovementInform(uint32 type, uint32 pointId) override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
index 5a33117e629..a03042ee7ff 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
@@ -421,7 +421,7 @@ class boss_lady_deathwhisper : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if ((!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) || !CheckInRoom())
+ if ((!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)))
return;
events.Update(diff);
@@ -1043,8 +1043,9 @@ class at_lady_deathwhisper_entrance : public AreaTriggerScript
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/, bool /*entered*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
- if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LADY_DEATHWHISPER)))
- ladyDeathwhisper->AI()->DoAction(ACTION_START_INTRO);
+ if (instance->GetBossState(DATA_LADY_DEATHWHISPER) != DONE)
+ if (Creature* ladyDeathwhisper = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LADY_DEATHWHISPER)))
+ ladyDeathwhisper->AI()->DoAction(ACTION_START_INTRO);
return true;
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index 9dcadfacb0c..84211547416 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
@@ -186,7 +186,7 @@ class boss_lord_marrowgar : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index a702c4ffdf8..b9a7b6ce056 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -564,7 +564,7 @@ class boss_professor_putricide : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if ((!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)) && !UpdateVictim()) || !CheckInRoom())
+ if ((!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)) && !UpdateVictim()))
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
index 981d4624cd4..1e5609bbb83 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
@@ -119,7 +119,7 @@ class boss_rotface : public CreatureScript
{
if (!instance->CheckRequiredBosses(DATA_ROTFACE, who->ToPlayer()))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
return;
}
@@ -155,9 +155,9 @@ class boss_rotface : public CreatureScript
Talk(SAY_KILL);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE)))
professor->AI()->EnterEvadeMode();
}
@@ -179,7 +179,7 @@ class boss_rotface : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 2df85a2e176..bbbf222a4e7 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -265,7 +265,7 @@ class boss_sindragosa : public CreatureScript
{
if (!instance->CheckRequiredBosses(DATA_SINDRAGOSA, victim->ToPlayer()))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_SEQUENCE_BREAK);
instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
return;
}
@@ -276,6 +276,13 @@ class boss_sindragosa : public CreatureScript
Talk(SAY_AGGRO);
}
+ void EnterEvadeMode(EvadeReason why) override
+ {
+ if (_isInAirPhase && why == EVADE_REASON_BOUNDARY)
+ return;
+ BossAI::EnterEvadeMode(why);
+ }
+
void JustReachedHome() override
{
BossAI::JustReachedHome();
@@ -416,7 +423,7 @@ class boss_sindragosa : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index 709fab15307..49bd81c472e 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -517,7 +517,7 @@ class boss_the_lich_king : public CreatureScript
{
if (!instance->CheckRequiredBosses(DATA_THE_LICH_KING, target->ToPlayer()))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
return;
}
@@ -560,10 +560,10 @@ class boss_the_lich_king : public CreatureScript
return !target->HasAura(SPELL_IN_FROSTMOURNE_ROOM);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
instance->SetBossState(DATA_THE_LICH_KING, FAIL);
- BossAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode(why);
if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD_TIRION_FORDRING)))
tirion->AI()->EnterEvadeMode();
DoCastAOE(SPELL_KILL_FROSTMOURNE_PLAYERS);
@@ -1703,7 +1703,7 @@ class npc_terenas_menethil : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
// no running back home
if (!me->IsAlive())
@@ -1946,7 +1946,7 @@ class npc_broken_frostmourne : public CreatureScript
_events.ScheduleEvent(EVENT_OUTRO_SUMMON_TERENAS, 6000, 0, PHASE_OUTRO);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
index b5e19c54a24..50c09c6e3e0 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
@@ -557,6 +557,8 @@ class npc_green_dragon_combat_trigger : public CreatureScript
if (!me->IsInCombat())
return;
+ // @TODO check out of bounds on all encounter creatures, evade if matched
+
std::list<HostileReference*> const& threatList = me->getThreatManager().getThreatList();
if (threatList.empty())
{
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 0bb9ede6cc1..d6a4cf87f4c 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -1283,16 +1283,16 @@ struct npc_argent_captainAI : public ScriptedAI
return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
// not yet following
if (me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_IDLE) != CHASE_MOTION_TYPE || IsUndead)
{
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
return;
}
- if (!_EnterEvadeMode())
+ if (!_EnterEvadeMode(why))
return;
if (!me->GetVehicle())
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index fafb378c31c..1d6b1ffb61e 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -47,34 +47,54 @@ enum TimedEvents
EVENT_RESPAWN_GUNSHIP = 4
};
+BossBoundaryData const boundaries =
+{
+ { DATA_LORD_MARROWGAR, new CircleBoundary(Position(-428.0f,2211.0f), 95.0) },
+ { DATA_LORD_MARROWGAR, new RectangleBoundary(-430.0f, -330.0f, 2110.0f, 2310.0f) },
+ { DATA_LADY_DEATHWHISPER, new RectangleBoundary(-670.0f, -520.0f, 2145.0f, 2280.0f) },
+ { DATA_DEATHBRINGER_SAURFANG, new RectangleBoundary(-565.0f, -465.0f, 2160.0f, 2260.0f) },
+
+ { DATA_ROTFACE, new RectangleBoundary(4385.0f, 4505.0f, 3082.0f, 3195.0f) },
+ { DATA_FESTERGUT, new RectangleBoundary(4205.0f, 4325.0f, 3082.0f, 3195.0f) },
+ { DATA_PROFESSOR_PUTRICIDE, new ParallelogramBoundary(Position(4356.0f, 3290.0f), Position(4435.0f, 3194.0f), Position(4280.0f, 3194.0f)) },
+ { DATA_PROFESSOR_PUTRICIDE, new RectangleBoundary(4280.0f, 4435.0f, 3150.0f, 4360.0f) },
+
+ { DATA_BLOOD_PRINCE_COUNCIL, new EllipseBoundary(Position(4660.95f, 2769.194f), 85.0, 60.0) },
+ { DATA_BLOOD_QUEEN_LANA_THEL, new CircleBoundary(Position(4595.93f, 2769.365f), 64.0) },
+
+ { DATA_SISTER_SVALNA, new RectangleBoundary(4291.0f, 4423.0f, 2438.0f, 2653.0f) },
+ { DATA_VALITHRIA_DREAMWALKER, new RectangleBoundary(4112.5f, 4293.5f, 2385.0f, 2585.0f) },
+ { DATA_SINDRAGOSA, new EllipseBoundary(Position(4408.6f, 2484.0f), 100.0, 75.0) }
+};
+
DoorData const doorData[] =
{
- {GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM, BOUNDARY_N },
- {GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
- {GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
- {GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM, BOUNDARY_N },
- {GO_SAURFANG_S_DOOR, DATA_DEATHBRINGER_SAURFANG, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
- {GO_ORANGE_PLAGUE_MONSTER_ENTRANCE, DATA_FESTERGUT, DOOR_TYPE_ROOM, BOUNDARY_E },
- {GO_GREEN_PLAGUE_MONSTER_ENTRANCE, DATA_ROTFACE, DOOR_TYPE_ROOM, BOUNDARY_E },
- {GO_SCIENTIST_ENTRANCE, DATA_PROFESSOR_PUTRICIDE, DOOR_TYPE_ROOM, BOUNDARY_E },
- {GO_CRIMSON_HALL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_S },
- {GO_BLOOD_ELF_COUNCIL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE, BOUNDARY_W },
- {GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE, BOUNDARY_E },
- {GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_ROOM, BOUNDARY_S },
- {GO_DOODAD_ICECROWN_GRATE_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
- {GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_SISTER_SVALNA, DOOR_TYPE_PASSAGE, BOUNDARY_S },
- {GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_ROOM, BOUNDARY_N },
- {GO_GREEN_DRAGON_BOSS_EXIT, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_PASSAGE, BOUNDARY_S },
- {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_N },
- {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_S },
- {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_N },
- {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_S },
- {GO_SINDRAGOSA_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_S },
- {GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE, BOUNDARY_E },
- {GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
- {GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_SE },
- {GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM, BOUNDARY_SW },
- {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END
+ {GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM },
+ {GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE },
+ {GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM },
+ {GO_SAURFANG_S_DOOR, DATA_DEATHBRINGER_SAURFANG, DOOR_TYPE_PASSAGE },
+ {GO_ORANGE_PLAGUE_MONSTER_ENTRANCE, DATA_FESTERGUT, DOOR_TYPE_ROOM },
+ {GO_GREEN_PLAGUE_MONSTER_ENTRANCE, DATA_ROTFACE, DOOR_TYPE_ROOM },
+ {GO_SCIENTIST_ENTRANCE, DATA_PROFESSOR_PUTRICIDE, DOOR_TYPE_ROOM },
+ {GO_CRIMSON_HALL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_ROOM },
+ {GO_BLOOD_ELF_COUNCIL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE },
+ {GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_ROOM },
+ {GO_DOODAD_ICECROWN_GRATE_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_PASSAGE },
+ {GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_SISTER_SVALNA, DOOR_TYPE_PASSAGE },
+ {GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_ROOM },
+ {GO_GREEN_DRAGON_BOSS_EXIT, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_PASSAGE },
+ {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
+ {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
+ {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
+ {GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
+ {GO_SINDRAGOSA_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
+ {GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE },
+ {GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE },
+ {GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
+ {GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
+ {0, 0, DOOR_TYPE_ROOM } // END
};
// this doesnt have to only store questgivers, also can be used for related quest spawns
@@ -115,6 +135,7 @@ class instance_icecrown_citadel : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadBossBoundaries(boundaries);
LoadDoorData(doorData);
TeamInInstance = 0;
HeroicAttempts = MaxHeroicAttempts;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
index b060910e823..9deccccd040 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
@@ -173,7 +173,7 @@ public:
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
index 9b3d0b7555b..ec47b0db101 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
@@ -100,7 +100,7 @@ public:
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictimWithGaze() || !CheckInRoom())
+ if (!UpdateVictimWithGaze())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
index 63029141490..6556227fd81 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
@@ -391,7 +391,7 @@ class boss_gothik : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
@@ -537,11 +537,11 @@ class npc_gothik_minion : public CreatureScript
CombatAI::JustDied(owner);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
if (!gateClose)
{
- CombatAI::EnterEvadeMode();
+ CombatAI::EnterEvadeMode(why);
return;
}
@@ -566,7 +566,7 @@ class npc_gothik_minion : public CreatureScript
{
if (gateClose && (!isOnSameSide(me) || (me->GetVictim() && !isOnSameSide(me->GetVictim()))))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
index 64d5a7c5133..afa8e97d8e6 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
@@ -115,7 +115,7 @@ public:
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
index 814718c68a0..3f0090cc507 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
@@ -117,7 +117,7 @@ public:
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
if (HealthBelowPct(30) && !me->HasAura(SPELL_FRENZY_HELPER))
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
index b820aa3266a..c0b12262a9a 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
@@ -88,7 +88,7 @@ public:
events.SetPhase(PHASE_NONE);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
Reset(); // teleport back first
_EnterEvadeMode();
@@ -205,7 +205,7 @@ public:
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index 667258ba676..68b9e252150 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -231,7 +231,7 @@ class boss_sapphiron : public CreatureScript
events.Update(diff);
- if ((_phase != PHASE_BIRTH && !UpdateVictim()) || !CheckInRoom())
+ if (_phase != PHASE_BIRTH && !UpdateVictim())
return;
if (_phase == PHASE_GROUND)
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
index 4831cc7b41d..675d7d4e308 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
@@ -456,6 +456,7 @@ public:
{
Initialize();
instance = creature->GetInstanceScript();
+ SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
}
void Initialize()
@@ -723,6 +724,7 @@ public:
{
Initialize();
instance = creature->GetInstanceScript();
+ SetBoundary(instance->GetBossBoundary(BOSS_THADDIUS));
}
void Initialize()
@@ -990,7 +992,7 @@ public:
{
npc_teslaAI(Creature* creature) : ScriptedAI(creature) { }
- void EnterEvadeMode() override { } // never stop casting due to evade
+ void EnterEvadeMode(EvadeReason /*why*/) override { } // never stop casting due to evade
void UpdateAI(uint32 /*diff*/) override { } // never do anything unless told
void EnterCombat(Unit* /*who*/) override { }
void DamageTaken(Unit* /*who*/, uint32& damage) override { damage = 0; } // no, you can't kill it
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index 3b6a97dbe1d..2bf50a0b8f5 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -20,42 +20,75 @@
#include "InstanceScript.h"
#include "naxxramas.h"
+BossBoundaryData const boundaries =
+{
+ /* Arachnid Quarter */
+ { BOSS_ANUBREKHAN, new CircleBoundary(Position(3273.376709f, -3475.876709f), Position(3195.668213f, -3475.930176f)) },
+ { BOSS_FAERLINA, new RectangleBoundary(3315.0f, 3402.0f, -3727.0f, -3590.0f) },
+ { BOSS_FAERLINA, new CircleBoundary(Position(3372.68f, -3648.2f), Position(3316.0f, -3704.26f)) },
+ { BOSS_MAEXXNA, new CircleBoundary(Position(3502.2587f, -3892.1697f), Position(3418.7422f, -3840.271f)) },
+
+ /* Plague Quarter */
+ { BOSS_NOTH, new RectangleBoundary(2618.0f, 2754.0f, -3557.43f, -3450.0f) },
+ { BOSS_HEIGAN, new CircleBoundary(Position(2772.57f, -3685.28f), 56.0f) },
+ { BOSS_LOATHEB, new CircleBoundary(Position(2909.0f, -3997.41f), 57.0f) },
+
+ /* Military Quarter */
+ { BOSS_RAZUVIOUS, new ZRangeBoundary(260.0f, 287.0f) }, // will not chase onto the upper floor
+ { BOSS_GOTHIK, new RectangleBoundary(2627.0f, 2764.0f, -3440.0f, -3275.0f) },
+ { BOSS_HORSEMEN, new ParallelogramBoundary(AreaBoundary::DoublePosition(2646.0, -2959.0), AreaBoundary::DoublePosition(2529.0, -3075.0), AreaBoundary::DoublePosition(2506.0, -2854.0)) },
+
+ /* Construct Quarter */
+ { BOSS_PATCHWERK, new CircleBoundary(Position(3204.0f, -3241.4f), 240.0f) },
+ { BOSS_PATCHWERK, new CircleBoundary(Position(3130.8576f, -3210.36f), Position(3085.37f, -3219.85f), true) }, // entrance slime circle blocker
+ { BOSS_GROBBULUS, new CircleBoundary(Position(3204.0f, -3241.4f), 240.0f) },
+ { BOSS_GROBBULUS, new RectangleBoundary(3295.0f, 3340.0f, -3254.2f, -3230.18f, true) }, // entrance door blocker
+ { BOSS_GLUTH, new CircleBoundary(Position(3293.0f, -3142.0f), 80.0) },
+ { BOSS_GLUTH, new ParallelogramBoundary(AreaBoundary::DoublePosition(3401.0, -3149.0), AreaBoundary::DoublePosition(3261.0, -3028.0), AreaBoundary::DoublePosition(3320.0, -3267.0)) },
+ { BOSS_GLUTH, new ZRangeBoundary(285.0f, 310.0f) },
+ { BOSS_THADDIUS, new ParallelogramBoundary(AreaBoundary::DoublePosition(3478.3, -3070.0), AreaBoundary::DoublePosition(3370.0, -2961.5), AreaBoundary::DoublePosition(3580.0, -2961.5)) },
+
+ /* Frostwyrm Lair */
+ { BOSS_SAPPHIRON, new CircleBoundary(Position(3517.627f, -5255.5f), 110.0) },
+ { BOSS_KELTHUZAD, new CircleBoundary(Position(3716.0f, -5107.0f), 85.0) }
+};
+
DoorData const doorData[] =
{
- { GO_ROOM_ANUBREKHAN, BOSS_ANUBREKHAN, DOOR_TYPE_ROOM, BOUNDARY_S },
- { GO_PASSAGE_ANUBREKHAN, BOSS_ANUBREKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_PASSAGE_FAERLINA, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ROOM_MAEXXNA, BOSS_FAERLINA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ROOM_MAEXXNA, BOSS_MAEXXNA, DOOR_TYPE_ROOM, BOUNDARY_SW },
- { GO_ROOM_NOTH, BOSS_NOTH, DOOR_TYPE_ROOM, BOUNDARY_N },
- { GO_PASSAGE_NOTH, BOSS_NOTH, DOOR_TYPE_PASSAGE, BOUNDARY_E },
- { GO_ROOM_HEIGAN, BOSS_NOTH, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ROOM_HEIGAN, BOSS_HEIGAN, DOOR_TYPE_ROOM, BOUNDARY_N },
- { GO_PASSAGE_HEIGAN, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, BOUNDARY_E },
- { GO_ROOM_LOATHEB, BOSS_HEIGAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ROOM_LOATHEB, BOSS_LOATHEB, DOOR_TYPE_ROOM, BOUNDARY_W },
- { GO_ROOM_GROBBULUS, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ROOM_GROBBULUS, BOSS_GROBBULUS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_PASSAGE_GLUTH, BOSS_GLUTH, DOOR_TYPE_PASSAGE, BOUNDARY_NW },
- { GO_ROOM_THADDIUS, BOSS_GLUTH, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ROOM_THADDIUS, BOSS_THADDIUS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ROOM_GOTHIK, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ROOM_GOTHIK, BOSS_GOTHIK, DOOR_TYPE_ROOM, BOUNDARY_N },
- { GO_PASSAGE_GOTHIK, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, BOUNDARY_S },
- { GO_ROOM_HORSEMEN, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GOTHIK_GATE, BOSS_GOTHIK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_ROOM_HORSEMEN, BOSS_HORSEMEN, DOOR_TYPE_ROOM, BOUNDARY_NE },
- { GO_PASSAGE_SAPPHIRON, BOSS_SAPPHIRON, DOOR_TYPE_PASSAGE, BOUNDARY_W },
- { GO_ROOM_KELTHUZAD, BOSS_KELTHUZAD, DOOR_TYPE_ROOM, BOUNDARY_S },
- { GO_ARAC_EYE_RAMP, BOSS_MAEXXNA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_ARAC_EYE_RAMP_BOSS, BOSS_MAEXXNA, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_PLAG_EYE_RAMP, BOSS_LOATHEB, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_PLAG_EYE_RAMP_BOSS, BOSS_LOATHEB, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_MILI_EYE_RAMP, BOSS_HORSEMEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_MILI_EYE_RAMP_BOSS, BOSS_HORSEMEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_CONS_EYE_RAMP, BOSS_THADDIUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_CONS_EYE_RAMP_BOSS, BOSS_THADDIUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+ { GO_ROOM_ANUBREKHAN, BOSS_ANUBREKHAN, DOOR_TYPE_ROOM },
+ { GO_PASSAGE_ANUBREKHAN, BOSS_ANUBREKHAN, DOOR_TYPE_PASSAGE },
+ { GO_PASSAGE_FAERLINA, BOSS_FAERLINA, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_MAEXXNA, BOSS_FAERLINA, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_MAEXXNA, BOSS_MAEXXNA, DOOR_TYPE_ROOM },
+ { GO_ROOM_NOTH, BOSS_NOTH, DOOR_TYPE_ROOM },
+ { GO_PASSAGE_NOTH, BOSS_NOTH, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_HEIGAN, BOSS_NOTH, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_HEIGAN, BOSS_HEIGAN, DOOR_TYPE_ROOM },
+ { GO_PASSAGE_HEIGAN, BOSS_HEIGAN, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_LOATHEB, BOSS_HEIGAN, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_LOATHEB, BOSS_LOATHEB, DOOR_TYPE_ROOM },
+ { GO_ROOM_GROBBULUS, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_GROBBULUS, BOSS_GROBBULUS, DOOR_TYPE_ROOM },
+ { GO_PASSAGE_GLUTH, BOSS_GLUTH, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_THADDIUS, BOSS_GLUTH, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_THADDIUS, BOSS_THADDIUS, DOOR_TYPE_ROOM },
+ { GO_ROOM_GOTHIK, BOSS_RAZUVIOUS, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_GOTHIK, BOSS_GOTHIK, DOOR_TYPE_ROOM },
+ { GO_PASSAGE_GOTHIK, BOSS_GOTHIK, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_HORSEMEN, BOSS_GOTHIK, DOOR_TYPE_PASSAGE },
+ { GO_GOTHIK_GATE, BOSS_GOTHIK, DOOR_TYPE_ROOM },
+ { GO_ROOM_HORSEMEN, BOSS_HORSEMEN, DOOR_TYPE_ROOM },
+ { GO_PASSAGE_SAPPHIRON, BOSS_SAPPHIRON, DOOR_TYPE_PASSAGE },
+ { GO_ROOM_KELTHUZAD, BOSS_KELTHUZAD, DOOR_TYPE_ROOM },
+ { GO_ARAC_EYE_RAMP, BOSS_MAEXXNA, DOOR_TYPE_PASSAGE },
+ { GO_ARAC_EYE_RAMP_BOSS, BOSS_MAEXXNA, DOOR_TYPE_PASSAGE },
+ { GO_PLAG_EYE_RAMP, BOSS_LOATHEB, DOOR_TYPE_PASSAGE },
+ { GO_PLAG_EYE_RAMP_BOSS, BOSS_LOATHEB, DOOR_TYPE_PASSAGE },
+ { GO_MILI_EYE_RAMP, BOSS_HORSEMEN, DOOR_TYPE_PASSAGE },
+ { GO_MILI_EYE_RAMP_BOSS, BOSS_HORSEMEN, DOOR_TYPE_PASSAGE },
+ { GO_CONS_EYE_RAMP, BOSS_THADDIUS, DOOR_TYPE_PASSAGE },
+ { GO_CONS_EYE_RAMP_BOSS, BOSS_THADDIUS, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM }
};
MinionData const minionData[] =
@@ -117,6 +150,7 @@ class instance_naxxramas : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadBossBoundaries(boundaries);
LoadDoorData(doorData);
LoadMinionData(minionData);
LoadObjectData(nullptr, objectData);
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 0d5584e9960..9525d3f14f9 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -574,7 +574,7 @@ public:
me->setActive(true);
if (!instance->CheckRequiredBosses(DATA_MALYGOS_EVENT))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
@@ -585,7 +585,7 @@ public:
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
instance->SetBossState(DATA_MALYGOS_EVENT, FAIL);
@@ -1282,7 +1282,7 @@ public:
VehicleAI::Reset();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
}
@@ -1341,7 +1341,7 @@ class npc_nexus_lord : public CreatureScript
_events.Reset();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
}
@@ -1430,7 +1430,7 @@ class npc_scion_of_eternity : public CreatureScript
{
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
}
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
index 6b438e094d6..e5944841ad5 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
@@ -21,6 +21,11 @@
#include "eye_of_eternity.h"
#include "Player.h"
+BossBoundaryData const boundaries =
+{
+ { DATA_MALYGOS_EVENT, new CircleBoundary(Position(754.362f, 1301.609985f), 280.0) } // sanity check boundary
+};
+
class instance_eye_of_eternity : public InstanceMapScript
{
public:
@@ -37,6 +42,7 @@ public:
{
SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTER);
+ LoadBossBoundaries(boundaries);
}
void OnPlayerEnter(Player* player) override
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index d83e8386f2e..fa2d2712755 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
@@ -23,8 +23,8 @@
DoorData const doorData[] =
{
- { GO_DRAGON_CAGE_DOOR, DATA_DRAKOS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+ { GO_DRAGON_CAGE_DOOR, DATA_DRAKOS, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM }
};
Position const VerdisaMove = { 949.188f, 1032.91f, 359.967f, 1.093027f };
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
index 1b93b611df6..bc2fbe00f27 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
@@ -187,14 +187,14 @@ public:
instance->SetBossState(DATA_BJARNGRIM, NOT_STARTED);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
if (me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE))
canBuff = true;
else
canBuff = false;
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
index 33d4758f5a9..37df62ac166 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
@@ -21,10 +21,10 @@
DoorData const doorData[] =
{
- { GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE },
+ { GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE },
+ { GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_halls_of_lightning : public InstanceMapScript
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
index 63f4ed28952..c6822235ce6 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
@@ -22,8 +22,8 @@
DoorData const doorData[] =
{
- { GO_SJONNIR_DOOR, DATA_TRIBUNAL_OF_AGES, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_SJONNIR_DOOR, DATA_TRIBUNAL_OF_AGES, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_halls_of_stone : public InstanceMapScript
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 77657870320..e80da765a5f 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -492,10 +492,10 @@ class boss_algalon_the_observer : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
instance->SetBossState(BOSS_ALGALON, FAIL);
- BossAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode(why);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
me->SetSheath(SHEATH_STATE_UNARMED);
}
@@ -545,7 +545,7 @@ class boss_algalon_the_observer : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if ((!(events.IsInPhase(PHASE_ROLE_PLAY) || events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim()) || !CheckInRoom())
+ if (!(events.IsInPhase(PHASE_ROLE_PLAY) || events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim())
return;
events.Update(diff);
@@ -639,7 +639,7 @@ class boss_algalon_the_observer : public CreatureScript
events.ScheduleEvent(EVENT_EVADE, 2500);
break;
case EVENT_EVADE:
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
break;
case EVENT_COSMIC_SMASH:
Talk(EMOTE_ALGALON_COSMIC_SMASH);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index e1c02e7ad99..0ce12c9cd70 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -369,7 +369,7 @@ class boss_flame_leviathan : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
index 3398d318d85..cd214a0114f 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
@@ -277,8 +277,6 @@ class boss_ignis : public CreatureScript
}
DoMeleeAttackIfReady();
-
- EnterEvadeIfOutOfCombatArea(diff);
}
private:
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
index 3378185c2a8..3b7e25f72d9 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
@@ -478,7 +478,7 @@ class boss_mimiron : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if ((!UpdateVictim() || !CheckInRoom()) && instance->GetBossState(BOSS_MIMIRON) != DONE)
+ if (!UpdateVictim() && instance->GetBossState(BOSS_MIMIRON) != DONE)
return;
events.Update(diff);
@@ -846,7 +846,7 @@ class boss_leviathan_mk_ii : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
@@ -999,7 +999,7 @@ class boss_vx_001 : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
summons.DespawnAll();
}
@@ -1174,7 +1174,7 @@ class boss_aerial_command_unit : public CreatureScript
}
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
summons.DespawnAll();
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
index f898461154a..3f783e8201c 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
@@ -54,10 +54,10 @@ class boss_thorim : public CreatureScript
_Reset();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
Talk(SAY_WIPE);
- _EnterEvadeMode();
+ _EnterEvadeMode(why);
}
void KilledUnit(Unit* who) override
@@ -78,7 +78,7 @@ class boss_thorim : public CreatureScript
_EnterCombat();
}
- void UpdateAI(uint32 diff) override
+ void UpdateAI(uint32 /*diff*/) override
{
if (!UpdateVictim())
return;
@@ -86,8 +86,6 @@ class boss_thorim : public CreatureScript
//
DoMeleeAttackIfReady();
-
- EnterEvadeIfOutOfCombatArea(diff);
}
};
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
index 97864fd6173..a00e0d885cd 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
@@ -267,7 +267,7 @@ class boss_xt002 : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim() || !CheckInRoom())
+ if (!UpdateVictim())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
index ecd79e7ba63..e96337d2d19 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -447,9 +447,9 @@ class boss_voice_of_yogg_saron : public CreatureScript
me->SetInCombatWithZone();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- BossAI::EnterEvadeMode();
+ BossAI::EnterEvadeMode(why);
for (uint8 i = DATA_SARA; i <= DATA_MIMIRON_YS; ++i)
if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetGuidData(i)))
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
index 5eee284f351..7271bd5af52 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
@@ -24,26 +24,43 @@
#include "WorldPacket.h"
#include "ulduar.h"
+static BossBoundaryData const boundaries =
+{
+ { BOSS_LEVIATHAN, new RectangleBoundary(148.0f, 401.3f, -155.0f, 90.0f) },
+ { BOSS_IGNIS, new RectangleBoundary(495.0f, 680.0f, 90.0f, 400.0f) },
+ { BOSS_RAZORSCALE, new RectangleBoundary(370.0f, 810.0f, -542.0f, -55.0f) },
+ { BOSS_XT002, new RectangleBoundary(755.0f, 940.0f, -125.0f, 95.0f) },
+ { BOSS_ASSEMBLY_OF_IRON, new CircleBoundary(Position(1587.2f, 121.0f), 90.0) },
+ { BOSS_ALGALON, new CircleBoundary(Position(1632.668f, -307.7656f), 45.0) },
+ { BOSS_ALGALON, new ZRangeBoundary(410.0f, 440.0f) },
+ { BOSS_HODIR, new EllipseBoundary(Position(2001.5f, -240.0f), 50.0, 75.0) },
+ { BOSS_THORIM, new CircleBoundary(Position(2134.73f, -263.2f), 50.0) },
+ { BOSS_FREYA, new RectangleBoundary(2094.6f, 2520.0f, -250.0f, 200.0f) },
+ { BOSS_MIMIRON, new CircleBoundary(Position(2744.0f, 2569.0f), 70.0) },
+ { BOSS_VEZAX, new RectangleBoundary(1740.0f, 1930.0f, 31.0f, 228.0f) },
+ { BOSS_YOGG_SARON, new CircleBoundary(Position(1980.42f, -27.68f), 105.0) }
+};
+
static DoorData const doorData[] =
{
- { GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM, BOUNDARY_S },
- { GO_XT_002_DOOR, BOSS_XT002, DOOR_TYPE_ROOM, BOUNDARY_S },
- { GO_IRON_COUNCIL_DOOR, BOSS_ASSEMBLY_OF_IRON, DOOR_TYPE_ROOM, BOUNDARY_N },
- { GO_ARCHIVUM_DOOR, BOSS_ASSEMBLY_OF_IRON, DOOR_TYPE_PASSAGE, BOUNDARY_S },
- { GO_HODIR_ENTRANCE, BOSS_HODIR, DOOR_TYPE_ROOM, BOUNDARY_E },
- { GO_HODIR_DOOR, BOSS_HODIR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_HODIR_ICE_DOOR, BOSS_HODIR, DOOR_TYPE_PASSAGE, BOUNDARY_W },
- { GO_MIMIRON_DOOR_1, BOSS_MIMIRON, DOOR_TYPE_ROOM, BOUNDARY_W },
- { GO_MIMIRON_DOOR_2, BOSS_MIMIRON, DOOR_TYPE_ROOM, BOUNDARY_E },
- { GO_MIMIRON_DOOR_3, BOSS_MIMIRON, DOOR_TYPE_ROOM, BOUNDARY_S },
- { GO_VEZAX_DOOR, BOSS_VEZAX, DOOR_TYPE_PASSAGE, BOUNDARY_E },
- { GO_YOGG_SARON_DOOR, BOSS_YOGG_SARON, DOOR_TYPE_ROOM, BOUNDARY_S },
- { GO_DOODAD_UL_SIGILDOOR_03, BOSS_ALGALON, DOOR_TYPE_ROOM, BOUNDARY_W },
- { GO_DOODAD_UL_UNIVERSEFLOOR_01, BOSS_ALGALON, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_DOODAD_UL_UNIVERSEFLOOR_02, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_NONE },
- { GO_DOODAD_UL_UNIVERSEGLOBE01, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_NONE },
- { GO_DOODAD_UL_ULDUAR_TRAPDOOR_03, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_LEVIATHAN_DOOR, BOSS_LEVIATHAN, DOOR_TYPE_ROOM },
+ { GO_XT_002_DOOR, BOSS_XT002, DOOR_TYPE_ROOM },
+ { GO_IRON_COUNCIL_DOOR, BOSS_ASSEMBLY_OF_IRON, DOOR_TYPE_ROOM },
+ { GO_ARCHIVUM_DOOR, BOSS_ASSEMBLY_OF_IRON, DOOR_TYPE_PASSAGE },
+ { GO_HODIR_ENTRANCE, BOSS_HODIR, DOOR_TYPE_ROOM },
+ { GO_HODIR_DOOR, BOSS_HODIR, DOOR_TYPE_PASSAGE },
+ { GO_HODIR_ICE_DOOR, BOSS_HODIR, DOOR_TYPE_PASSAGE },
+ { GO_MIMIRON_DOOR_1, BOSS_MIMIRON, DOOR_TYPE_ROOM },
+ { GO_MIMIRON_DOOR_2, BOSS_MIMIRON, DOOR_TYPE_ROOM },
+ { GO_MIMIRON_DOOR_3, BOSS_MIMIRON, DOOR_TYPE_ROOM },
+ { GO_VEZAX_DOOR, BOSS_VEZAX, DOOR_TYPE_PASSAGE },
+ { GO_YOGG_SARON_DOOR, BOSS_YOGG_SARON, DOOR_TYPE_ROOM },
+ { GO_DOODAD_UL_SIGILDOOR_03, BOSS_ALGALON, DOOR_TYPE_ROOM },
+ { GO_DOODAD_UL_UNIVERSEFLOOR_01, BOSS_ALGALON, DOOR_TYPE_ROOM },
+ { GO_DOODAD_UL_UNIVERSEFLOOR_02, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE },
+ { GO_DOODAD_UL_UNIVERSEGLOBE01, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE },
+ { GO_DOODAD_UL_ULDUAR_TRAPDOOR_03, BOSS_ALGALON, DOOR_TYPE_SPAWN_HOLE },
+ { 0, 0, DOOR_TYPE_ROOM },
};
MinionData const minionData[] =
@@ -74,7 +91,7 @@ class instance_ulduar : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(MAX_ENCOUNTER);
-
+ LoadBossBoundaries(boundaries);
LoadDoorData(doorData);
LoadMinionData(minionData);
LoadObjectData(creatureData, nullptr);
@@ -818,12 +835,9 @@ class instance_ulduar : public InstanceMapScript
{
case DATA_COLOSSUS:
ColossusData = data;
- if (data == 2)
+ if (data == 2 && GetBossState(BOSS_LEVIATHAN) == NOT_STARTED)
{
- if (Creature* Leviathan = instance->GetCreature(LeviathanGUID))
- Leviathan->AI()->DoAction(ACTION_MOVE_TO_CENTER_POSITION);
- if (GameObject* gameObject = instance->GetGameObject(LeviathanGateGUID))
- gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ _events.ScheduleEvent(EVENT_LEVIATHAN_BREAK_DOOR, 5 * IN_MILLISECONDS);
SaveToDB();
}
break;
@@ -1179,6 +1193,12 @@ class instance_ulduar : public InstanceMapScript
}
}
break;
+ case EVENT_LEVIATHAN_BREAK_DOOR:
+ if (Creature* Leviathan = instance->GetCreature(LeviathanGUID))
+ Leviathan->AI()->DoAction(ACTION_MOVE_TO_CENTER_POSITION);
+ if (GameObject* gameObject = instance->GetGameObject(LeviathanGateGUID))
+ gameObject->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ break;
}
}
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
index f9f2f94d587..58c963f9cb5 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
@@ -427,7 +427,8 @@ enum UlduarEvents
EVENT_DESPAWN_ALGALON = 1,
EVENT_UPDATE_ALGALON_TIMER = 2,
ACTION_INIT_ALGALON = 6,
- EVENT_DESPAWN_LEVIATHAN_VEHICLES = 7
+ EVENT_DESPAWN_LEVIATHAN_VEHICLES = 7,
+ EVENT_LEVIATHAN_BREAK_DOOR = 8
};
enum YoggSaronIllusions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
index 556756f41a7..fbcf464d8b1 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
@@ -21,9 +21,9 @@
DoorData const doorData[] =
{
- { GO_GIANT_PORTCULLIS_1, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GIANT_PORTCULLIS_2, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_GIANT_PORTCULLIS_1, DATA_INGVAR, DOOR_TYPE_PASSAGE },
+ { GO_GIANT_PORTCULLIS_2, DATA_INGVAR, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
MinionData const minionData[] =
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
index 910ddfbc572..8f2d5a61770 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
@@ -19,11 +19,16 @@
#include "InstanceScript.h"
#include "utgarde_pinnacle.h"
+BossBoundaryData const boundaries =
+{
+ { DATA_KING_YMIRON, new RectangleBoundary(340.0f, 450.0f, -412.0f, -275.0f) }
+};
+
DoorData const doorData[] =
{
- { GO_SKADI_THE_RUTHLESS_DOOR, DATA_SKADI_THE_RUTHLESS, DOOR_TYPE_PASSAGE, BOUNDARY_W },
- { GO_KING_YMIRON_DOOR, DATA_KING_YMIRON, DOOR_TYPE_PASSAGE, BOUNDARY_N },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_SKADI_THE_RUTHLESS_DOOR, DATA_SKADI_THE_RUTHLESS, DOOR_TYPE_PASSAGE },
+ { GO_KING_YMIRON_DOOR, DATA_KING_YMIRON, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_utgarde_pinnacle : public InstanceMapScript
@@ -37,6 +42,7 @@ class instance_utgarde_pinnacle : public InstanceMapScript
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
+ LoadBossBoundaries(boundaries);
LoadDoorData(doorData);
}
diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index 70ab5516d03..63ca432996f 100644
--- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
@@ -239,7 +239,7 @@ public:
}
}
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
void MoveInLineOfSight(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index ec7acf0d894..88217cb384e 100644
--- a/src/server/scripts/Northrend/zone_icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
@@ -231,9 +231,9 @@ class npc_tournament_training_dummy : public CreatureScript
events.ScheduleEvent(EVENT_DUMMY_RECAST_DEFEND, 5000);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- if (!_EnterEvadeMode())
+ if (!_EnterEvadeMode(why))
return;
Reset();
@@ -304,7 +304,7 @@ class npc_tournament_training_dummy : public CreatureScript
case EVENT_DUMMY_RESET:
if (UpdateVictim())
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
events.ScheduleEvent(EVENT_DUMMY_RESET, 10000);
}
break;
diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index 6fd19da5df9..cc0be0bd895 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -337,7 +337,7 @@ public:
void AttackStart(Unit* /*who*/) override { }
void EnterCombat(Unit* /*who*/) override { }
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override
{
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
index 94cc67a5177..cbf0d6b1ce5 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
@@ -21,8 +21,8 @@
DoorData const doorData[] =
{
- { GO_IKISS_DOOR, DATA_TALON_KING_IKISS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_IKISS_DOOR, DATA_TALON_KING_IKISS, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
ObjectData const gameObjectData[] =
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
index 2d98fb43190..8acd6067c0b 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
@@ -143,7 +143,7 @@ class boss_ambassador_hellmaw : public CreatureScript
if (me->HasAura(SPELL_BANISH))
{
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
index ac351538ee7..96978e92b19 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
@@ -22,9 +22,9 @@
DoorData const doorData[] =
{
- { GO_REFECTORY_DOOR, DATA_BLACKHEART_THE_INCITER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_SCREAMING_HALL_DOOR, DATA_GRANDMASTER_VORPIL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_REFECTORY_DOOR, DATA_BLACKHEART_THE_INCITER, DOOR_TYPE_PASSAGE },
+ { GO_SCREAMING_HALL_DOOR, DATA_GRANDMASTER_VORPIL, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_shadow_labyrinth : public InstanceMapScript
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index d97c60f3455..6bc502fa5e9 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -1181,7 +1181,7 @@ public:
void EnterCombat(Unit* /*who*/) override { }
void MoveInLineOfSight(Unit* /*who*/) override { }
- void EnterEvadeMode() override { }
+ void EnterEvadeMode(EvadeReason /*why*/) override { }
void GetIllidanGUID(ObjectGuid guid)
{
@@ -1439,7 +1439,7 @@ public:
}
// Do not call reset in Akama's evade mode, as this will stop him from summoning minions after he kills the first bit
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
me->RemoveAllAuras();
me->DeleteThreatList();
@@ -1474,7 +1474,7 @@ public:
}
for (std::vector<Unit*>::const_iterator itr = eliteList.begin(); itr != eliteList.end(); ++itr)
(*itr)->setDeathState(JUST_DIED);
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
}
void BeginTalk()
@@ -1544,7 +1544,7 @@ public:
{
if (Creature* illidan = ObjectAccessor::GetCreature(*me, IllidanGUID))
ENSURE_AI(boss_illidan_stormrage::boss_illidan_stormrageAI, illidan->AI())->DeleteFromThreatList(me->GetGUID());
- EnterEvadeMode();
+ EnterEvadeMode(EVADE_REASON_OTHER);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
++WalkCount;
}
diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
index 9da6bdaee18..708a095d70a 100644
--- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
+++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
@@ -408,7 +408,7 @@ struct boss_illidari_councilAI : public ScriptedAI
LoadGUIDs();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
for (uint8 i = 0; i < 4; ++i)
{
@@ -419,7 +419,7 @@ struct boss_illidari_councilAI : public ScriptedAI
return;
}
}
- ScriptedAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode(why);
}
void DamageTaken(Unit* done_by, uint32 &damage) override
diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
index 1521b04375b..86ad7958957 100644
--- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
+++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
@@ -21,18 +21,18 @@
DoorData const doorData[] =
{
- { GO_NAJENTUS_GATE, DATA_HIGH_WARLORD_NAJENTUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_NAJENTUS_GATE, DATA_SUPREMUS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_SUPREMUS_GATE, DATA_SUPREMUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_SHADE_OF_AKAMA_DOOR, DATA_SHADE_OF_AKAMA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_TERON_DOOR_1, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_TERON_DOOR_2, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_GURTOGG_DOOR, DATA_GURTOGG_BLOODBOIL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_TEMPLE_DOOR, DATA_RELIQUARY_OF_SOULS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_MOTHER_SHAHRAZ_DOOR, DATA_MOTHER_SHAHRAZ, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_COUNCIL_DOOR_1, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_COUNCIL_DOOR_2, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_NAJENTUS_GATE, DATA_HIGH_WARLORD_NAJENTUS, DOOR_TYPE_PASSAGE },
+ { GO_NAJENTUS_GATE, DATA_SUPREMUS, DOOR_TYPE_ROOM },
+ { GO_SUPREMUS_GATE, DATA_SUPREMUS, DOOR_TYPE_PASSAGE },
+ { GO_SHADE_OF_AKAMA_DOOR, DATA_SHADE_OF_AKAMA, DOOR_TYPE_ROOM },
+ { GO_TERON_DOOR_1, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM },
+ { GO_TERON_DOOR_2, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM },
+ { GO_GURTOGG_DOOR, DATA_GURTOGG_BLOODBOIL, DOOR_TYPE_PASSAGE },
+ { GO_TEMPLE_DOOR, DATA_RELIQUARY_OF_SOULS, DOOR_TYPE_PASSAGE },
+ { GO_MOTHER_SHAHRAZ_DOOR, DATA_MOTHER_SHAHRAZ, DOOR_TYPE_PASSAGE },
+ { GO_COUNCIL_DOOR_1, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM },
+ { GO_COUNCIL_DOOR_2, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_black_temple : public InstanceMapScript
diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
index 9b23f458186..67f980cf192 100644
--- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
+++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
@@ -21,9 +21,9 @@
DoorData const doorData[] =
{
- { GO_MAULGAR_DOOR, DATA_MAULGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GRUUL_DOOR, DATA_GRUUL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_MAULGAR_DOOR, DATA_MAULGAR, DOOR_TYPE_PASSAGE },
+ { GO_GRUUL_DOOR, DATA_GRUUL, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
MinionData const minionData[] =
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
index f021a876b81..92b74c029ba 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
@@ -22,13 +22,13 @@
DoorData const doorData[] =
{
- { GO_PRISON_DOOR_01, DATA_KELIDAN_THE_BREAKER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_PRISON_DOOR_02, DATA_THE_MAKER, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_PRISON_DOOR_03, DATA_THE_MAKER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_PRISON_DOOR_04, DATA_BROGGOK, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_PRISON_DOOR_05, DATA_BROGGOK, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { GO_SUMMON_DOOR, DATA_KELIDAN_THE_BREAKER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_PRISON_DOOR_01, DATA_KELIDAN_THE_BREAKER, DOOR_TYPE_PASSAGE },
+ { GO_PRISON_DOOR_02, DATA_THE_MAKER, DOOR_TYPE_ROOM },
+ { GO_PRISON_DOOR_03, DATA_THE_MAKER, DOOR_TYPE_PASSAGE },
+ { GO_PRISON_DOOR_04, DATA_BROGGOK, DOOR_TYPE_PASSAGE },
+ { GO_PRISON_DOOR_05, DATA_BROGGOK, DOOR_TYPE_ROOM },
+ { GO_SUMMON_DOOR, DATA_KELIDAN_THE_BREAKER, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_blood_furnace : public InstanceMapScript
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
index 21694d20208..30ffac54345 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
@@ -34,9 +34,9 @@ EndScriptData */
DoorData const doorData[] =
{
- { GO_GRAND_WARLOCK_CHAMBER_DOOR_1, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_GRAND_WARLOCK_CHAMBER_DOOR_2, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+ { GO_GRAND_WARLOCK_CHAMBER_DOOR_1, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE },
+ { GO_GRAND_WARLOCK_CHAMBER_DOOR_2, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM }
};
class instance_shattered_halls : public InstanceMapScript
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
index 7f3a908b830..102d567e810 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
@@ -484,7 +484,7 @@ class npc_ember_of_alar : public CreatureScript
DoZoneInCombat();
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
me->setDeathState(JUST_DIED);
}
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
index 16cdbdda3ad..edfa2aedf92 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
@@ -94,6 +94,8 @@ class boss_void_reaver : public CreatureScript
if (!UpdateVictim())
return;
+ events.Update(diff);
+
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -154,8 +156,6 @@ class boss_void_reaver : public CreatureScript
}
DoMeleeAttackIfReady();
-
- EnterEvadeIfOutOfCombatArea(diff);
}
private:
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
index 0d54d8fc22e..a751ed546ff 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
@@ -36,9 +36,9 @@ EndScriptData */
DoorData const doorData[] =
{
- { GO_ARCANE_DOOR_LEFT, DATA_KAELTHAS, DOOR_TYPE_ROOM, BOUNDARY_SW },
- { GO_ARCANE_DOOR_RIGHT, DATA_KAELTHAS, DOOR_TYPE_ROOM, BOUNDARY_SE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_ARCANE_DOOR_LEFT, DATA_KAELTHAS, DOOR_TYPE_ROOM/*, BOUNDARY_SW */ },
+ { GO_ARCANE_DOOR_RIGHT, DATA_KAELTHAS, DOOR_TYPE_ROOM/*, BOUNDARY_SE */ },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
ObjectData const gameObjectData[] =
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
index 77018c6f43c..c2f93fd3910 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
@@ -22,10 +22,10 @@
static DoorData const doorData[] =
{
- { GO_DOOR_MOARG_1, DATA_GATEWATCHER_IRON_HAND, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_DOOR_MOARG_2, DATA_GATEWATCHER_GYROKILL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_DOOR_NETHERMANCER, DATA_NETHERMANCER_SEPRETHREA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+ { GO_DOOR_MOARG_1, DATA_GATEWATCHER_IRON_HAND, DOOR_TYPE_PASSAGE },
+ { GO_DOOR_MOARG_2, DATA_GATEWATCHER_GYROKILL, DOOR_TYPE_PASSAGE },
+ { GO_DOOR_NETHERMANCER, DATA_NETHERMANCER_SEPRETHREA, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM }
};
class instance_mechanar : public InstanceMapScript
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
index 2d8654a9b48..148420ad1a0 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
@@ -21,9 +21,9 @@
DoorData const doorData[] =
{
- { GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA, DATA_SOCCOTHRATES, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA, DATA_DALLIAH, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
- { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+ { GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA, DATA_SOCCOTHRATES, DOOR_TYPE_PASSAGE },
+ { GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA, DATA_DALLIAH, DOOR_TYPE_PASSAGE },
+ { 0, 0, DOOR_TYPE_ROOM } // END
};
class instance_arcatraz : public InstanceMapScript
diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
index 6ca8d6a247a..3ebdb846c4d 100644
--- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
@@ -168,9 +168,9 @@ public:
}
// Override Evade Mode event, recast buff that was removed by standard handler
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- npc_escortAI::EnterEvadeMode();
+ npc_escortAI::EnterEvadeMode(why);
DoCast(me, SPELL_ANCESTRAL_WOLF_BUFF, true);
}
diff --git a/src/server/scripts/Pet/pet_mage.cpp b/src/server/scripts/Pet/pet_mage.cpp
index 274fa27c9d0..76a9f57c214 100644
--- a/src/server/scripts/Pet/pet_mage.cpp
+++ b/src/server/scripts/Pet/pet_mage.cpp
@@ -24,11 +24,24 @@
#include "ScriptedCreature.h"
#include "CombatAI.h"
#include "Pet.h"
+#include "PetAI.h"
+#include "Cell.h"
+#include "CellImpl.h"
+#include "GridNotifiers.h"
enum MageSpells
{
SPELL_MAGE_CLONE_ME = 45204,
- SPELL_MAGE_MASTERS_THREAT_LIST = 58838
+ SPELL_MAGE_MASTERS_THREAT_LIST = 58838,
+ SPELL_MAGE_FROST_BOLT = 59638,
+ SPELL_MAGE_FIRE_BLAST = 59637
+};
+
+enum MirrorImageTimers
+{
+ TIMER_MIRROR_IMAGE_INIT = 0,
+ TIMER_MIRROR_IMAGE_FROST_BOLT = 4000,
+ TIMER_MIRROR_IMAGE_FIRE_BLAST = 6000
};
class npc_pet_mage_mirror_image : public CreatureScript
@@ -40,22 +53,186 @@ class npc_pet_mage_mirror_image : public CreatureScript
{
npc_pet_mage_mirror_imageAI(Creature* creature) : CasterAI(creature) { }
+ void Init()
+ {
+ Unit* owner = me->GetCharmerOrOwner();
+
+ std::list<Unit*> targets;
+ Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30.0f);
+ Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, targets, u_check);
+ me->VisitNearbyObject(40.0f, searcher);
+
+ Unit* highestThreatUnit = nullptr;
+ float highestThreat = 0.0f;
+ Unit* nearestPlayer = nullptr;
+ for (std::list<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter)
+ {
+ // Consider only units without CC
+ if (!(*iter)->HasBreakableByDamageCrowdControlAura((*iter)))
+ {
+ // Take first found unit
+ if (!highestThreatUnit && (*iter)->GetTypeId() != TYPEID_PLAYER)
+ {
+ highestThreatUnit = (*iter);
+ continue;
+ }
+ if (!nearestPlayer && ((*iter)->GetTypeId() == TYPEID_PLAYER))
+ {
+ nearestPlayer = (*iter);
+ continue;
+ }
+ // else compare best fit unit with current unit
+ ThreatContainer::StorageType triggers = (*iter)->getThreatManager().getThreatList();
+ for (ThreatContainer::StorageType::const_iterator trig_citr = triggers.begin(); trig_citr != triggers.end(); ++trig_citr)
+ {
+ // Try to find threat referenced to owner
+ if ((*trig_citr)->getTarget() == owner)
+ {
+ // Check if best fit hostile unit hs lower threat than this current unit
+ if (highestThreat < (*trig_citr)->getThreat())
+ {
+ // If so, update best fit unit
+ highestThreat = (*trig_citr)->getThreat();
+ highestThreatUnit = (*iter);
+ break;
+ }
+ }
+ }
+ // In case no unit with threat was found so far, always check for nearest unit (only for players)
+ if ((*iter)->GetTypeId() == TYPEID_PLAYER)
+ {
+ // If this player is closer than the previous one, update it
+ if (me->GetDistance((*iter)->GetPosition()) < me->GetDistance(nearestPlayer->GetPosition()))
+ nearestPlayer = (*iter);
+ }
+ }
+ }
+ // Prioritize units with threat referenced to owner
+ if (highestThreat > 0.0f && highestThreatUnit)
+ me->Attack(highestThreatUnit, false);
+ // If there is no such target, try to attack nearest hostile unit if such exists
+ else if (nearestPlayer)
+ me->Attack(nearestPlayer, false);
+ }
+
+ bool IsInThreatList(Unit* target)
+ {
+ Unit* owner = me->GetCharmerOrOwner();
+
+ std::list<Unit*> targets;
+ Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30.0f);
+ Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(me, targets, u_check);
+ me->VisitNearbyObject(40.0f, searcher);
+
+ for (std::list<Unit*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter)
+ {
+ if ((*iter) == target)
+ {
+ // Consider only units without CC
+ if (!(*iter)->HasBreakableByDamageCrowdControlAura((*iter)))
+ {
+ ThreatContainer::StorageType triggers = (*iter)->getThreatManager().getThreatList();
+ for (ThreatContainer::StorageType::const_iterator trig_citr = triggers.begin(); trig_citr != triggers.end(); ++trig_citr)
+ {
+ // Try to find threat referenced to owner
+ if ((*trig_citr)->getTarget() == owner)
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
void InitializeAI() override
{
CasterAI::InitializeAI();
Unit* owner = me->GetOwner();
if (!owner)
return;
- // Inherit Master's Threat List (not yet implemented)
- owner->CastSpell((Unit*)NULL, SPELL_MAGE_MASTERS_THREAT_LIST, true);
+
// here mirror image casts on summoner spell (not present in client dbc) 49866
// here should be auras (not present in client dbc): 35657, 35658, 35659, 35660 selfcast by mirror images (stats related?)
// Clone Me!
owner->CastSpell(me, SPELL_MAGE_CLONE_ME, false);
}
+ void EnterCombat(Unit* who) override
+ {
+ if (me->GetVictim() && !me->GetVictim()->HasBreakableByDamageCrowdControlAura(me))
+ {
+ me->CastSpell(who, SPELL_MAGE_FIRE_BLAST, false);
+ events.ScheduleEvent(SPELL_MAGE_FROST_BOLT, TIMER_MIRROR_IMAGE_INIT);
+ events.ScheduleEvent(SPELL_MAGE_FIRE_BLAST, TIMER_MIRROR_IMAGE_FIRE_BLAST);
+ }
+ else
+ EnterEvadeMode(EVADE_REASON_OTHER);
+ }
+
+ void Reset() override
+ {
+ events.Reset();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ Unit* owner = me->GetCharmerOrOwner();
+ Unit* target = owner->getAttackerForHelper();
+
+ events.Update(diff);
+
+ // prevent CC interrupts by images
+ if (me->GetVictim() && me->EnsureVictim()->HasBreakableByDamageCrowdControlAura(me))
+ {
+ me->InterruptNonMeleeSpells(false);
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ if (!owner)
+ return;
+
+ // assign target if image doesnt have any or the target is not actual
+ if (!target || me->GetVictim() != target)
+ {
+ Unit* ownerTarget = nullptr;
+ if (Player* owner = me->GetCharmerOrOwner()->ToPlayer())
+ ownerTarget = owner->GetSelectedUnit();
+
+ // recognize which victim will be choosen
+ if (ownerTarget && ownerTarget->GetTypeId() == TYPEID_PLAYER)
+ {
+ if (!ownerTarget->HasBreakableByDamageCrowdControlAura(ownerTarget))
+ me->Attack(ownerTarget, false);
+ }
+ else if (ownerTarget && (ownerTarget->GetTypeId() != TYPEID_PLAYER) && IsInThreatList(ownerTarget))
+ {
+ if (!ownerTarget->HasBreakableByDamageCrowdControlAura(ownerTarget))
+ me->Attack(ownerTarget, false);
+ }
+ else
+ Init();
+ }
+
+ if (uint32 spellId = events.ExecuteEvent())
+ {
+ if (spellId == SPELL_MAGE_FROST_BOLT)
+ {
+ events.ScheduleEvent(SPELL_MAGE_FROST_BOLT, TIMER_MIRROR_IMAGE_FROST_BOLT);
+ DoCastVictim(spellId);
+ }
+ else if (spellId == SPELL_MAGE_FIRE_BLAST)
+ {
+ DoCastVictim(spellId);
+ events.ScheduleEvent(SPELL_MAGE_FIRE_BLAST, TIMER_MIRROR_IMAGE_FIRE_BLAST);
+ }
+ }
+ }
+
// Do not reload Creature templates on evade mode enter - prevent visual lost
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (me->IsInEvadeMode() || !me->IsAlive())
return;
@@ -68,6 +245,7 @@ class npc_pet_mage_mirror_image : public CreatureScript
me->GetMotionMaster()->Clear(false);
me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), MOTION_SLOT_ACTIVE);
}
+ Init();
}
};
diff --git a/src/server/scripts/Pet/pet_priest.cpp b/src/server/scripts/Pet/pet_priest.cpp
index 61ac54f8ac0..a3110ce8f8b 100644
--- a/src/server/scripts/Pet/pet_priest.cpp
+++ b/src/server/scripts/Pet/pet_priest.cpp
@@ -44,7 +44,7 @@ class npc_pet_pri_lightwell : public CreatureScript
DoCast(me, SPELL_PRIEST_LIGHTWELL_CHARGES, false);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason /*why*/) override
{
if (!me->IsAlive())
return;
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/scripts/ScriptLoader.cpp
index ccc4c39ccd1..145977a5f79 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/scripts/ScriptLoader.cpp
@@ -19,7 +19,6 @@
#include "World.h"
void AddSpellsScripts();
-void AddSC_SmartScripts();
void AddCommandsScripts();
#ifdef SCRIPTS
@@ -38,7 +37,6 @@ void AddCustomScripts();
void AddScripts()
{
AddSpellsScripts();
- AddSC_SmartScripts();
AddCommandsScripts();
#ifdef SCRIPTS
AddWorldScripts();
diff --git a/src/server/game/Scripting/ScriptLoader.h b/src/server/scripts/ScriptLoader.h
index 57b62df22d1..57b62df22d1 100644
--- a/src/server/game/Scripting/ScriptLoader.h
+++ b/src/server/scripts/ScriptLoader.h
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index aea3cf455c8..85e94c19f93 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -4114,6 +4114,44 @@ public:
}
};
+enum LandmineKnockbackAchievement
+{
+ SPELL_LANDMINE_KNOCKBACK_ACHIEVEMENT = 57064
+};
+
+class spell_gen_landmine_knockback_achievement : public SpellScriptLoader
+{
+public:
+ spell_gen_landmine_knockback_achievement() : SpellScriptLoader("spell_gen_landmine_knockback_achievement") { }
+
+ class spell_gen_landmine_knockback_achievement_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_landmine_knockback_achievement_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* target = GetHitPlayer())
+ {
+ Aura const* aura = GetHitAura();
+ if (!aura || aura->GetStackAmount() < 10)
+ return;
+
+ target->CastSpell(target, SPELL_LANDMINE_KNOCKBACK_ACHIEVEMENT, true);
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_landmine_knockback_achievement_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_gen_landmine_knockback_achievement_SpellScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -4201,4 +4239,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_gm_freeze();
new spell_gen_stand();
new spell_gen_mixology_bonus();
+ new spell_gen_landmine_knockback_achievement();
}
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index 1b884c14464..4e4d5cdf4fd 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -410,6 +410,80 @@ class spell_pilgrims_bounty_buff_food : public SpellScriptLoader
}
};
+enum TheTurkinator
+{
+ SPELL_KILL_COUNTER_VISUAL = 62015,
+ SPELL_KILL_COUNTER_VISUAL_MAX = 62021,
+ EMOTE_TURKEY_HUNTER = 0,
+ EMOTE_TURKEY_DOMINATION = 1,
+ EMOTE_TURKEY_SLAUGHTER = 2,
+ EMOTE_TURKEY_TRIUMPH = 3
+};
+
+class spell_pilgrims_bounty_turkey_tracker : public SpellScriptLoader
+{
+ public:
+ spell_pilgrims_bounty_turkey_tracker() : SpellScriptLoader("spell_pilgrims_bounty_turkey_tracker") { }
+
+ class spell_pilgrims_bounty_turkey_tracker_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pilgrims_bounty_turkey_tracker_SpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_KILL_COUNTER_VISUAL) || !sSpellMgr->GetSpellInfo(SPELL_KILL_COUNTER_VISUAL_MAX))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ Unit* target = GetHitUnit();
+
+ if (!target || !caster)
+ return;
+
+ if (target->HasAura(SPELL_KILL_COUNTER_VISUAL_MAX))
+ return;
+
+ if (Aura const* aura = target->GetAura(GetSpellInfo()->Id))
+ {
+ switch (aura->GetStackAmount())
+ {
+ case 10:
+ caster->AI()->Talk(EMOTE_TURKEY_HUNTER, target);
+ break;
+ case 20:
+ caster->AI()->Talk(EMOTE_TURKEY_DOMINATION, target);
+ break;
+ case 30:
+ caster->AI()->Talk(EMOTE_TURKEY_SLAUGHTER, target);
+ break;
+ case 40:
+ caster->AI()->Talk(EMOTE_TURKEY_TRIUMPH, target);
+ target->CastSpell(target, SPELL_KILL_COUNTER_VISUAL_MAX, true);
+ target->RemoveAurasDueToSpell(GetSpellInfo()->Id);
+ break;
+ default:
+ return;
+ }
+ target->CastSpell(target, SPELL_KILL_COUNTER_VISUAL, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_turkey_tracker_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pilgrims_bounty_turkey_tracker_SpellScript();
+ }
+};
+
enum Mistletoe
{
SPELL_CREATE_MISTLETOE = 26206,
@@ -973,6 +1047,7 @@ void AddSC_holiday_spell_scripts()
new spell_pilgrims_bounty_buff_food("spell_gen_spice_bread_stuffing", SPELL_WELL_FED_HIT_TRIGGER);
new spell_pilgrims_bounty_buff_food("spell_gen_pumpkin_pie", SPELL_WELL_FED_SPIRIT_TRIGGER);
new spell_pilgrims_bounty_buff_food("spell_gen_candied_sweet_potato", SPELL_WELL_FED_HASTE_TRIGGER);
+ new spell_pilgrims_bounty_turkey_tracker();
// Winter Veil
new spell_winter_veil_mistletoe();
new spell_winter_veil_px_238_winter_wondervolt();
diff --git a/src/server/scripts/World/npc_taxi.cpp b/src/server/scripts/World/npc_taxi.cpp
index 364caebd932..a200ba545d8 100644
--- a/src/server/scripts/World/npc_taxi.cpp
+++ b/src/server/scripts/World/npc_taxi.cpp
@@ -33,30 +33,8 @@ EndScriptData
#define GOSSIP_SUSURRUS "I am ready."
#define GOSSIP_NETHER_DRAKE "I'm ready to fly! Take me up, dragon!"
#define GOSSIP_BRAZEN "I am ready to go to Durnholde Keep."
-#define GOSSIP_IRONWING "I'd like to take a flight around Stormwind Harbor."
-#define GOSSIP_DABIREE1 "Fly me to Murketh and Shaadraz Gateways"
-#define GOSSIP_DABIREE2 "Fly me to Shatter Point"
-#define GOSSIP_WINDBELLOW1 "Fly me to The Abyssal Shelf"
-#define GOSSIP_WINDBELLOW2 "Fly me to Honor Point"
-#define GOSSIP_BRACK1 "Fly me to Murketh and Shaadraz Gateways"
-#define GOSSIP_BRACK2 "Fly me to The Abyssal Shelf"
-#define GOSSIP_BRACK3 "Fly me to Spinebreaker Post"
-#define GOSSIP_IRENA "Fly me to Skettis please"
-#define GOSSIP_CLOUDBREAKER1 "Speaking of action, I've been ordered to undertake an air strike."
-#define GOSSIP_CLOUDBREAKER2 "I need to intercept the Dawnblade reinforcements."
-#define GOSSIP_DRAGONHAWK "<Ride the dragonhawk to Sun's Reach>"
#define GOSSIP_VERONIA "Fly me to Manaforge Coruu please"
-#define GOSSIP_DEESAK "Fly me to Ogri'la please"
-#define GOSSIP_AFRASASTRASZ1 "I would like to take a flight to the ground, Lord Of Afrasastrasz."
-#define GOSSIP_AFRASASTRASZ2 "My Lord, I must go to the upper floor of the temple."
-#define GOSSIP_TARIOLSTRASZ1 "My Lord, I must go to the upper floor of the temple."
-#define GOSSIP_TARIOLSTRASZ2 "Can you spare a drake to travel to Lord Of Afrasastrasz, in the middle of the temple?"
-#define GOSSIP_TORASTRASZA1 "I would like to see Lord Of Afrasastrasz, in the middle of the temple."
-#define GOSSIP_TORASTRASZA2 "Yes, Please. I would like to return to the ground floor of the temple."
#define GOSSIP_CRIMSONWING "<Ride the gryphons to Survey Alcaz Island>"
-#define GOSSIP_WILLIAMKEILAR1 "Take me to Northpass Tower."
-#define GOSSIP_WILLIAMKEILAR2 "Take me to Eastwall Tower."
-#define GOSSIP_WILLIAMKEILAR3 "Take me to Crown Guard Tower."
class npc_taxi : public CreatureScript
{
@@ -81,91 +59,15 @@ public:
case 18725: // Old Hillsbrad Foothills - Brazen
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BRAZEN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
break;
- case 29154: // Stormwind City - Thargold Ironwing
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_IRONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- break;
- case 19409: // Hellfire Peninsula - Wing Commander Dabir'ee
- //Mission: The Murketh and Shaadraz Gateways
- if (player->GetQuestStatus(10146) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DABIREE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
-
- //Shatter Point
- if (!player->GetQuestRewardStatus(10340))
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DABIREE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- break;
- case 20235: // Hellfire Peninsula - Gryphoneer Windbellow
- //Mission: The Abyssal Shelf || Return to the Abyssal Shelf
- if (player->GetQuestStatus(10163) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10346) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WINDBELLOW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
-
- //Go to the Front
- if (player->GetQuestStatus(10382) != QUEST_STATUS_NONE && !player->GetQuestRewardStatus(10382))
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WINDBELLOW2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
- break;
- case 19401: // Hellfire Peninsula - Wing Commander Brack
- //Mission: The Murketh and Shaadraz Gateways
- if (player->GetQuestStatus(10129) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BRACK1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8);
-
- //Mission: The Abyssal Shelf || Return to the Abyssal Shelf
- if (player->GetQuestStatus(10162) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10347) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BRACK2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9);
-
- //Spinebreaker Post
- if (player->GetQuestStatus(10242) == QUEST_STATUS_COMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_BRACK3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10);
- break;
- case 23413: // Blade's Edge Mountains - Skyguard Handler Irena
- if (player->GetReputationRank(1031) >= REP_HONORED)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_IRENA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11);
- break;
- case 25059: // Isle of Quel'Danas - Ayren Cloudbreaker
- if (player->GetQuestStatus(11532) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11533) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12);
-
- if (player->GetQuestStatus(11542) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CLOUDBREAKER2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13);
- break;
- case 25236: // Isle of Quel'Danas - Unrestrained Dragonhawk
- if (player->GetQuestStatus(11542) == QUEST_STATUS_COMPLETE || player->GetQuestStatus(11543) == QUEST_STATUS_COMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DRAGONHAWK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14);
- break;
case 20162: // Netherstorm - Veronia
//Behind Enemy Lines
if (player->GetQuestStatus(10652) != QUEST_STATUS_REWARDED)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_VERONIA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15);
break;
- case 23415: // Terokkar Forest - Skyguard Handler Deesak
- if (player->GetReputationRank(1031) >= REP_HONORED)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEESAK, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 16);
- break;
- case 27575: // Dragonblight - Lord Afrasastrasz
- // middle -> ground
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 17);
- // middle -> top
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_AFRASASTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 18);
- break;
- case 26443: // Dragonblight - Tariolstrasz //need to check if quests are required before gossip available (12123, 12124)
- // ground -> top
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 19);
- // ground -> middle
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TARIOLSTRASZ2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 20);
- break;
- case 26949: // Dragonblight - Torastrasza
- // top -> middle
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21);
- // top -> ground
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_TORASTRASZA2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 22);
- break;
case 23704: // Dustwallow Marsh - Cassa Crimsonwing
if (player->GetQuestStatus(11142) == QUEST_STATUS_INCOMPLETE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_CRIMSONWING, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+25);
break;
- case 17209:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 26);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 27);
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WILLIAMKEILAR3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 28);
- break;
}
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
@@ -195,102 +97,14 @@ public:
player->ActivateTaxiPathTo(534); //TaxiPath 534
}
break;
- case GOSSIP_ACTION_INFO_DEF + 3:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 53335, true); //TaxiPath 1041 (Stormwind Harbor)
- break;
- case GOSSIP_ACTION_INFO_DEF + 4:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 33768, true); //TaxiPath 585 (Gateways Murket and Shaadraz)
- break;
- case GOSSIP_ACTION_INFO_DEF + 5:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 35069, true); //TaxiPath 612 (Taxi - Hellfire Peninsula - Expedition Point to Shatter Point)
- break;
- case GOSSIP_ACTION_INFO_DEF + 6:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 33899, true); //TaxiPath 589 (Aerial Assault Flight (Alliance))
- break;
- case GOSSIP_ACTION_INFO_DEF + 7:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 35065, true); //TaxiPath 607 (Taxi - Hellfire Peninsula - Shatter Point to Beach Head)
- break;
- case GOSSIP_ACTION_INFO_DEF + 8:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 33659, true); //TaxiPath 584 (Gateways Murket and Shaadraz)
- break;
- case GOSSIP_ACTION_INFO_DEF + 9:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 33825, true); //TaxiPath 587 (Aerial Assault Flight (Horde))
- break;
- case GOSSIP_ACTION_INFO_DEF + 10:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 34578, true); //TaxiPath 604 (Taxi - Reaver's Fall to Spinebreaker Ridge)
- break;
- case GOSSIP_ACTION_INFO_DEF + 11:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 41278, true); //TaxiPath 706
- break;
- case GOSSIP_ACTION_INFO_DEF + 12:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 45071, true); //TaxiPath 779
- break;
- case GOSSIP_ACTION_INFO_DEF + 13:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 45113, true); //TaxiPath 784
- break;
- case GOSSIP_ACTION_INFO_DEF + 14:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 45353, true); //TaxiPath 788
- break;
case GOSSIP_ACTION_INFO_DEF + 15:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player, 34905, true); //TaxiPath 606
break;
- case GOSSIP_ACTION_INFO_DEF + 16:
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, 41279, true); //TaxiPath 705 (Taxi - Skettis to Skyguard Outpost)
- break;
- case GOSSIP_ACTION_INFO_DEF + 17:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(882);
- break;
- case GOSSIP_ACTION_INFO_DEF + 18:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(881);
- break;
- case GOSSIP_ACTION_INFO_DEF + 19:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(878);
- break;
- case GOSSIP_ACTION_INFO_DEF + 20:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(883);
- break;
- case GOSSIP_ACTION_INFO_DEF + 21:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(880);
- break;
- case GOSSIP_ACTION_INFO_DEF + 22:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(879);
- break;
case GOSSIP_ACTION_INFO_DEF + 25:
player->CLOSE_GOSSIP_MENU();
player->CastSpell(player, 42295, true);
break;
- case GOSSIP_ACTION_INFO_DEF + 26:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(494);
- break;
- case GOSSIP_ACTION_INFO_DEF + 27:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(495);
- break;
- case GOSSIP_ACTION_INFO_DEF + 28:
- player->CLOSE_GOSSIP_MENU();
- player->ActivateTaxiPathTo(496);
- break;
}
return true;
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index 90d15131bc4..87616548350 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -1434,9 +1434,9 @@ public:
_events.ScheduleEvent(EVENT_TD_DESPAWN, 15000);
}
- void EnterEvadeMode() override
+ void EnterEvadeMode(EvadeReason why) override
{
- if (!_EnterEvadeMode())
+ if (!_EnterEvadeMode(why))
return;
Reset();
diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt
index fd6ff91e135..ce6c13bd932 100644
--- a/src/server/shared/CMakeLists.txt
+++ b/src/server/shared/CMakeLists.txt
@@ -8,74 +8,61 @@
# 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_Cryptography Cryptography/*.cpp Cryptography/*.h)
-file(GLOB_RECURSE sources_DataStores DataStores/*.cpp DataStores/*.h)
-file(GLOB_RECURSE sources_Dynamic Dynamic/*.cpp Dynamic/*.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)
-if(WIN32)
- file(GLOB_RECURSE sources_Service Service/*.cpp Service/*.h)
-endif(WIN32)
-
-file(GLOB sources_localdir *.cpp *.h)
-
-# Manually set sources for Debugging directory as we don't want to include WheatyExceptionReport in shared project
-# It needs to be included both in bnetserver 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)
-
-#
-# Build shared sourcelist
-#
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if (USE_COREPCH)
- set(shared_STAT_PCH_HDR PrecompiledHeaders/sharedPCH.h)
- set(shared_STAT_PCH_SRC PrecompiledHeaders/sharedPCH.cpp)
+ set(PRIVATE_PCH_HEADER PrecompiledHeaders/sharedPCH.h)
+ set(PRIVATE_PCH_SOURCE PrecompiledHeaders/sharedPCH.cpp)
endif()
-set(shared_STAT_SRCS
- ${shared_STAT_SRCS}
- ${sources_Cryptography}
- ${sources_DataStores}
- ${sources_Dynamic}
- ${sources_Networking}
- ${sources_Packets}
- ${sources_Realm}
- ${sources_Service}
- ${sources_localdir}
-)
+GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+
+add_definitions(-DTRINITY_API_EXPORT_SHARED)
-include_directories(
- ${CMAKE_CURRENT_SOURCE_DIR}/Dynamic
- ${CMAKE_CURRENT_SOURCE_DIR}/Networking
- ${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}
+add_library(shared
+ ${PRIVATE_SOURCES}
+ ${PRIVATE_PCH_SOURCE}
)
-GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
-add_library(shared STATIC
- ${shared_STAT_SRCS}
- ${shared_STAT_PCH_SRC}
-)
+target_include_directories(shared
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(shared revision_data.h)
+target_link_libraries(shared
+ PUBLIC
+ database
+ rapidjson)
+
+set_target_properties(shared
+ PROPERTIES
+ FOLDER
+ "server")
+
+if( BUILD_SHARED_LIBS )
+ if( UNIX )
+ install(TARGETS shared
+ LIBRARY
+ DESTINATION lib)
+ elseif( WIN32 )
+ install(TARGETS shared
+ RUNTIME
+ DESTINATION "${CMAKE_INSTALL_PREFIX}")
+ endif()
+endif()
# Generate precompiled header
if (USE_COREPCH)
- add_cxx_pch(shared ${shared_STAT_PCH_HDR} ${shared_STAT_PCH_SRC})
+ add_cxx_pch(shared ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE})
endif ()
diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h
index 0b83bc43dc4..41705c67f19 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.h
+++ b/src/server/shared/DataStores/DB2StorageLoader.h
@@ -24,7 +24,7 @@
#include <cassert>
#include <list>
-class DB2FileLoader
+class TC_SHARED_API DB2FileLoader
{
public:
DB2FileLoader();
@@ -114,7 +114,7 @@ private:
int unk5; // WDB2
};
-class DB2DatabaseLoader
+class TC_SHARED_API DB2DatabaseLoader
{
public:
explicit DB2DatabaseLoader(std::string const& storageName) : _storageName(storageName) { }
diff --git a/src/server/shared/DataStores/DBCFileLoader.h b/src/server/shared/DataStores/DBCFileLoader.h
index cbbd786337c..e58031e6ccc 100644
--- a/src/server/shared/DataStores/DBCFileLoader.h
+++ b/src/server/shared/DataStores/DBCFileLoader.h
@@ -23,7 +23,7 @@
#include "Utilities/ByteConverter.h"
#include <cassert>
-class DBCFileLoader
+class TC_SHARED_API DBCFileLoader
{
public:
DBCFileLoader();
diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h
index d21801a64ac..e2f4045ccff 100644
--- a/src/server/shared/Networking/AsyncAcceptor.h
+++ b/src/server/shared/Networking/AsyncAcceptor.h
@@ -21,6 +21,7 @@
#include "Log.h"
#include <boost/asio.hpp>
#include <functional>
+#include <atomic>
using boost::asio::ip::tcp;
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index 07f427652aa..0674ede57d8 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -55,11 +55,11 @@ public:
virtual bool Update()
{
- if (!IsOpen())
+ if (_closed)
return false;
#ifndef TC_SOCKET_USE_IOCP
- if (_isWritingAsync || _writeQueue.empty())
+ if (_isWritingAsync || (_writeQueue.empty() && !_closing))
return true;
for (; HandleQueue();)
@@ -90,6 +90,17 @@ public:
std::bind(&Socket<T>::ReadHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
+ void AsyncReadWithCallback(void (T::*callback)(boost::system::error_code, std::size_t))
+ {
+ if (!IsOpen())
+ return;
+
+ _readBuffer.Normalize();
+ _readBuffer.EnsureFreeSpace();
+ _socket.async_read_some(boost::asio::buffer(_readBuffer.GetWritePointer(), _readBuffer.GetRemainingSpace()),
+ std::bind(callback, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2));
+ }
+
void QueuePacket(MessageBuffer&& buffer)
{
_writeQueue.push(std::move(buffer));
@@ -153,7 +164,6 @@ protected:
GetRemoteIpAddress().to_string().c_str(), err.value(), err.message().c_str());
}
-
private:
void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes)
{
@@ -197,9 +207,6 @@ private:
bool HandleQueue()
{
- if (!IsOpen())
- return false;
-
if (_writeQueue.empty())
return false;
@@ -216,11 +223,15 @@ private:
return AsyncProcessQueue();
_writeQueue.pop();
+ if (_closing && _writeQueue.empty())
+ CloseSocket();
return false;
}
else if (bytesSent == 0)
{
_writeQueue.pop();
+ if (_closing && _writeQueue.empty())
+ CloseSocket();
return false;
}
else if (bytesSent < bytesToSend) // now n > 0
@@ -230,6 +241,8 @@ private:
}
_writeQueue.pop();
+ if (_closing && _writeQueue.empty())
+ CloseSocket();
return !_writeQueue.empty();
}
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h
index b8c6ee1c36e..2373e632c44 100644
--- a/src/server/shared/Packets/ByteBuffer.h
+++ b/src/server/shared/Packets/ByteBuffer.h
@@ -37,7 +37,7 @@
class MessageBuffer;
// Root of ByteBuffer exception hierarchy
-class ByteBufferException : public std::exception
+class TC_SHARED_API ByteBufferException : public std::exception
{
public:
~ByteBufferException() throw() { }
@@ -51,7 +51,7 @@ private:
std::string msg_;
};
-class ByteBufferPositionException : public ByteBufferException
+class TC_SHARED_API ByteBufferPositionException : public ByteBufferException
{
public:
ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize);
@@ -59,7 +59,7 @@ public:
~ByteBufferPositionException() throw() { }
};
-class ByteBufferSourceException : public ByteBufferException
+class TC_SHARED_API ByteBufferSourceException : public ByteBufferException
{
public:
ByteBufferSourceException(size_t pos, size_t size, size_t valueSize);
@@ -67,7 +67,7 @@ public:
~ByteBufferSourceException() throw() { }
};
-class ByteBuffer
+class TC_SHARED_API ByteBuffer
{
public:
static size_t const DEFAULT_SIZE = 0x1000;
diff --git a/src/server/shared/Realm/Realm.h b/src/server/shared/Realm/Realm.h
index 585a98e4569..87d333a4bf6 100644
--- a/src/server/shared/Realm/Realm.h
+++ b/src/server/shared/Realm/Realm.h
@@ -41,7 +41,7 @@ enum RealmFlags
namespace Battlenet
{
- struct RealmHandle
+ struct TC_SHARED_API RealmHandle
{
RealmHandle() : Region(0), Site(0), Realm(0) { }
RealmHandle(uint8 region, uint8 battlegroup, uint32 index)
@@ -78,7 +78,7 @@ enum RealmType
};
// Storage object for a realm
-struct Realm
+struct TC_SHARED_API Realm
{
Battlenet::RealmHandle Id;
uint32 Build;
diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt
index 0d1a296e68a..7fb4c6d2b75 100644
--- a/src/server/worldserver/CMakeLists.txt
+++ b/src/server/worldserver/CMakeLists.txt
@@ -8,122 +8,29 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-file(GLOB_RECURSE sources_CommandLine CommandLine/*.cpp CommandLine/*.h)
-file(GLOB_RECURSE sources_RemoteAccess RemoteAccess/*.cpp RemoteAccess/*.h)
-file(GLOB_RECURSE sources_TCSoap TCSoap/*.cpp TCSoap/*.h)
-file(GLOB sources_localdir *.cpp *.h)
-
-if (USE_COREPCH)
- set(worldserver_PCH_HDR PrecompiledHeaders/worldPCH.h)
- set(worldserver_PCH_SRC PrecompiledHeaders/worldPCH.cpp)
-endif()
-
-set(worldserver_SRCS
- ${worldserver_SRCS}
- ${sources_CommandLine}
- ${sources_RemoteAccess}
- ${sources_TCSoap}
- ${sources_localdir}
-)
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if( WIN32 )
- set(worldserver_SRCS
- ${worldserver_SRCS}
- ${sources_windows_Debugging}
- )
+ list(APPEND PRIVATE_SOURCES ${sources_windows})
if ( MSVC )
- set(worldserver_SRCS
- ${worldserver_SRCS}
- worldserver.rc
- )
+ list(APPEND PRIVATE_SOURCES worldserver.rc)
endif()
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/gsoap
- ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include
- ${CMAKE_SOURCE_DIR}/dep/zmqpp
- ${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/Addons
- ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds
- ${CMAKE_SOURCE_DIR}/src/server/game/Chat
- ${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/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/Object
- ${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/Unit
- ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Vehicle
- ${CMAKE_SOURCE_DIR}/src/server/game/Globals
- ${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/Handlers
- ${CMAKE_SOURCE_DIR}/src/server/game/Instances
- ${CMAKE_SOURCE_DIR}/src/server/game/Loot
- ${CMAKE_SOURCE_DIR}/src/server/game/Mails
- ${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/Spline
- ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints
- ${CMAKE_SOURCE_DIR}/src/server/game/Quests
- ${CMAKE_SOURCE_DIR}/src/server/game/Scripting
- ${CMAKE_SOURCE_DIR}/src/server/game/Server
- ${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/Weather
- ${CMAKE_SOURCE_DIR}/src/server/game/World
- ${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}
- ${ZMQ_INCLUDE_DIR}
-)
+if (USE_COREPCH)
+ set(PRIVATE_PCH_HEADER PrecompiledHeaders/worldPCH.h)
+ set(PRIVATE_PCH_SOURCE PrecompiledHeaders/worldPCH.cpp)
+endif()
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
add_executable(worldserver
- ${worldserver_SRCS}
- ${worldserver_PCH_SRC}
+ ${PRIVATE_SOURCES}
+ ${PRIVATE_PCH_SOURCE}
)
if( NOT WIN32 )
@@ -139,27 +46,27 @@ endif()
set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAGS}")
target_link_libraries(worldserver
- game
- scripts
- shared
- database
- ipc
- common
- g3dlib
- gsoap
- Detour
- zmqpp
- format
- ${JEMALLOC_LIBRARY}
- ${READLINE_LIBRARY}
- ${TERMCAP_LIBRARY}
- ${MYSQL_LIBRARY}
- ${OPENSSL_LIBRARIES}
- ${ZLIB_LIBRARIES}
- ${ZMQ_LIBRARY}
- ${CMAKE_THREAD_LIBS_INIT}
- ${Boost_LIBRARIES}
-)
+ PUBLIC
+ scripts
+ gsoap
+ readline)
+
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES
+ # Exclude
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
+
+target_include_directories(worldserver
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
+
+set_target_properties(worldserver
+ PROPERTIES
+ FOLDER
+ "server")
if( WIN32 )
if ( MSVC )
@@ -185,5 +92,5 @@ endif()
# Generate precompiled header
if( USE_COREPCH )
- add_cxx_pch(worldserver ${worldserver_PCH_HDR} ${worldserver_PCH_SRC})
+ add_cxx_pch(worldserver ${PRIVATE_PCH_HEADER} ${PRIVATE_PCH_SOURCE})
endif()
diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp
index 906937e974b..8c801736ef4 100644
--- a/src/server/worldserver/Main.cpp
+++ b/src/server/worldserver/Main.cpp
@@ -21,8 +21,6 @@
/// \file
#include "Common.h"
-#include "Commands.h"
-#include "ZmqContext.h"
#include "DatabaseEnv.h"
#include "AsyncAcceptor.h"
#include "RASession.h"
@@ -35,6 +33,7 @@
#include "InstanceSaveMgr.h"
#include "ObjectAccessor.h"
#include "ScriptMgr.h"
+#include "ScriptLoader.h"
#include "OutdoorPvP/OutdoorPvPMgr.h"
#include "BattlegroundMgr.h"
#include "TCSoap.h"
@@ -42,7 +41,6 @@
#include "GitRevision.h"
#include "WorldSocket.h"
#include "WorldSocketMgr.h"
-#include "BattlenetServerManager.h"
#include "Realm/Realm.h"
#include "DatabaseLoader.h"
#include "AppenderDB.h"
@@ -80,12 +78,6 @@ uint32 _worldLoopCounter(0);
uint32 _lastChangeMsTime(0);
uint32 _maxCoreStuckTimeInMs(0);
-WorldDatabaseWorkerPool WorldDatabase; ///< Accessor to the world database
-CharacterDatabaseWorkerPool CharacterDatabase; ///< Accessor to the character database
-HotfixDatabaseWorkerPool HotfixDatabase; ///< Accessor to the hotfix database
-LoginDatabaseWorkerPool LoginDatabase; ///< Accessor to the realm/login database
-Realm realm;
-
void SignalHandler(const boost::system::error_code& error, int signalNumber);
void FreezeDetectorHandler(const boost::system::error_code& error);
AsyncAcceptor* StartRaSocketAcceptor(boost::asio::io_service& ioService);
@@ -199,6 +191,7 @@ extern int main(int argc, char** argv)
LoadRealmInfo();
// Initialize the World
+ sScriptMgr->SetScriptLoader(AddScripts);
sWorld->SetInitialWorldSettings();
// Launch CliRunnable thread
@@ -244,10 +237,6 @@ extern int main(int argc, char** argv)
TC_LOG_INFO("server.worldserver", "Starting up anti-freeze thread (%u seconds max stuck time)...", coreStuckTime);
}
- sIpcContext->Initialize();
-
- sBattlenetServer.InitializeConnection();
-
TC_LOG_INFO("server.worldserver", "%s (worldserver-daemon) ready...", GitRevision::GetFullVersion());
sScriptMgr->OnStartup();
@@ -261,10 +250,6 @@ extern int main(int argc, char** argv)
sScriptMgr->OnShutdown();
- sIpcContext->Close();
-
- sBattlenetServer.CloseConnection();
-
sWorld->KickAll(); // save and kick all players
sWorld->UpdateSessions(1); // real players unload required UpdateSessions call
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index b6787e25e19..3e65a8589e4 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -589,6 +589,9 @@ StrictPetNames = 0
# 6 - (Spanish)
# 7 - (Spanish Mexico)
# 8 - (Russian)
+# 9 - (none)
+# 10 - (ptBR)
+# 11 - (itIT)
DBC.Locale = 0
@@ -3245,6 +3248,46 @@ AuctionHouseBot.forceIncludeItems = ""
AuctionHouseBot.forceExcludeItems = ""
#
+# AuctionHouseBot.Class.RandomStackRatio.*
+# Description: Used to determine how often a stack of the class will be single or randomly-size stacked when posted
+# Value needs to be between 0 and 100, no decimal. Anything higher than 100 will be treated as 100
+# Examples: 100 = stacks will always be random in size
+# 50 = half the time the stacks are random, the other half being single stack
+# 0 = stacks will always single size
+# Default: Consumable: 20 (20% random stack size, 80% single stack size)
+# Container: 0 (100% single stack size)
+# Weapon: 0 (100% single stack size)
+# Gem: 20 (20% random stack size, 80% single stack size)
+# Armor: 0 (100% single stack size)
+# Reagent: 100 (100% random stack size)
+# Projectile: 100 (100% random stack size)
+# TradeGood: 50 (50% random stack size, 50% single stack size)
+# Generic: 100 (100% random stack size)
+# Recipe: 0 (100% single stack size)
+# Quiver: 0 (100% single stack size)
+# Quest: 100 (100% random stack size)
+# Key: 100 (100% random stack size)
+# Misc: 100 (100% random stack size)
+# Glyph: 0 (100% single stack size)
+#
+
+AuctionHouseBot.Class.RandomStackRatio.Consumable = 20
+AuctionHouseBot.Class.RandomStackRatio.Container = 0
+AuctionHouseBot.Class.RandomStackRatio.Weapon = 0
+AuctionHouseBot.Class.RandomStackRatio.Gem = 20
+AuctionHouseBot.Class.RandomStackRatio.Armor = 0
+AuctionHouseBot.Class.RandomStackRatio.Reagent = 100
+AuctionHouseBot.Class.RandomStackRatio.Projectile = 100
+AuctionHouseBot.Class.RandomStackRatio.TradeGood = 50
+AuctionHouseBot.Class.RandomStackRatio.Generic = 100
+AuctionHouseBot.Class.RandomStackRatio.Recipe = 0
+AuctionHouseBot.Class.RandomStackRatio.Quiver = 0
+AuctionHouseBot.Class.RandomStackRatio.Quest = 100
+AuctionHouseBot.Class.RandomStackRatio.Key = 100
+AuctionHouseBot.Class.RandomStackRatio.Misc = 100
+AuctionHouseBot.Class.RandomStackRatio.Glyph = 0
+
+#
###################################################################################################
###################################################################################################
@@ -3623,24 +3666,3 @@ PacketSpoof.BanDuration = 86400
#
###################################################################################################
-
-###################################################################################################
-# IPC SETTINGS
-#
-# BnetServer.Address
-# Description: Determines IP address of battle.net server to connect to.
-# Default: 127.0.0.1
-#
-
-BnetServer.Address = 127.0.0.1
-
-#
-# BnetServer.Port
-# Description: Determines port to use when connecting to battle.net server.
-# Default: 1118
-#
-
-BnetServer.Port = 1118
-
-#
-###################################################################################################
diff --git a/src/tools/connection_patcher/CMakeLists.txt b/src/tools/connection_patcher/CMakeLists.txt
index 781547f628b..3fad34fabb1 100644
--- a/src/tools/connection_patcher/CMakeLists.txt
+++ b/src/tools/connection_patcher/CMakeLists.txt
@@ -8,15 +8,6 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-include_directories(
- ${CMAKE_SOURCE_DIR}
- ${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}
-)
-
set(HEADER_FILES
Helper.hpp
Patcher.hpp
@@ -42,10 +33,8 @@ if (MSVC)
endif ()
target_link_libraries(connection_patcher
- common
- ${OPENSSL_LIBRARIES}
- ${CMAKE_THREAD_LIBS_INIT}
- ${Boost_LIBRARIES}
+ PUBLIC
+ common
)
if (UNIX)
diff --git a/src/tools/connection_patcher/Program.cpp b/src/tools/connection_patcher/Program.cpp
index 4f1baccbd95..209815db60a 100644
--- a/src/tools/connection_patcher/Program.cpp
+++ b/src/tools/connection_patcher/Program.cpp
@@ -96,7 +96,7 @@ namespace Connection_Patcher
}
template<typename PATCH, typename PATTERN>
- void do_patches(Patcher* patcher, boost::filesystem::path output, bool patchVersionPath, uint32_t buildNumber)
+ void do_patches(Patcher* patcher, boost::filesystem::path output, uint32_t buildNumber)
{
std::cout << "patching Portal\n";
// '.logon.battle.net' -> '' to allow for set portal 'host'
@@ -117,18 +117,16 @@ namespace Connection_Patcher
// Creep::Instance::LoadModule() to allow for unsigned auth module
patcher->Patch(PATCH::Signature(), PATTERN::Signature());
- if (patchVersionPath)
- {
- std::cout << "patching Versions\n";
- // sever the connection to blizzard's versions file to stop it from updating and replace with custom version
- // hardcode %s.patch.battle.net:1119/%s/versions to trinity6.github.io/%s/%s/build/versi
- std::string verPatch(Patches::Common::VersionsFile());
- std::string buildPattern = "build";
-
- boost::algorithm::replace_all(verPatch, buildPattern, std::to_string(buildNumber));
- std::vector<unsigned char> verVec(verPatch.begin(), verPatch.end());
- patcher->Patch(verVec, Patterns::Common::VersionsFile());
- }
+ std::cout << "patching Versions\n";
+ // sever the connection to blizzard's versions file to stop it from updating and replace with custom version
+ // this is good practice with or without the retail version, just to stop the exe from auto-patching randomly
+ // hardcode %s.patch.battle.net:1119/%s/versions to trinity6.github.io/%s/%s/build/versi
+ std::string verPatch(Patches::Common::VersionsFile());
+ std::string buildPattern = "build";
+
+ boost::algorithm::replace_all(verPatch, buildPattern, std::to_string(buildNumber));
+ std::vector<unsigned char> verVec(verPatch.begin(), verPatch.end());
+ patcher->Patch(verVec, Patterns::Common::VersionsFile());
patcher->Finish(output);
@@ -142,7 +140,6 @@ namespace Connection_Patcher
all.add_options()
("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.")
;
@@ -176,9 +173,6 @@ int main(int argc, char** argv)
try
{
- bool patchVersionPath = false;
- int wowBuild = 0;
-
auto vm = GetConsoleArguments(argc, argv);
// exit if help is enabled
@@ -211,19 +205,14 @@ int main(int argc, char** argv)
Patcher patcher(binary_path);
- if (vm.count("extra"))
- {
- patchVersionPath = true;
- wowBuild = vm["extra"].as<uint32_t>();
-
- if (wowBuild == 0)
- wowBuild = Helper::GetBuildNumber(patcher.GetBinary());
+ // always set wowBuild to current build of the .exe files
+ int wowBuild = Helper::GetBuildNumber(patcher.GetBinary());
- if (wowBuild == 0 || wowBuild < 10000 || wowBuild > 65535) // Build number has to be exactly 5 characters long
- throw std::runtime_error("Could not retrieve build number or it was out of range. Build: " + std::to_string(wowBuild));
+ // define logical limits in case the exe was tinkered with and the build number was changed
+ if (wowBuild == 0 || wowBuild < 10000 || wowBuild > 65535) // Build number has to be exactly 5 characters long
+ throw std::runtime_error("Build number was out of range. Build: " + std::to_string(wowBuild));
- std::cout << "Determined build number: " << std::to_string(wowBuild) << std::endl;
- }
+ std::cout << "Determined build number: " << std::to_string(wowBuild) << std::endl;
switch (patcher.GetType())
{
@@ -232,7 +221,7 @@ int main(int argc, char** argv)
boost::algorithm::replace_all(renamed_binary_path, ".exe", "_Patched.exe");
do_patches<Patches::Windows::x86, Patterns::Windows::x86>
- (&patcher, renamed_binary_path, patchVersionPath, wowBuild);
+ (&patcher, renamed_binary_path, wowBuild);
do_module<Patches::Windows::x86, Patterns::Windows::x86>
( "8f52906a2c85b416a595702251570f96d3522f39237603115f2f1ab24962043c.auth"
@@ -245,7 +234,7 @@ int main(int argc, char** argv)
boost::algorithm::replace_all(renamed_binary_path, ".exe", "_Patched.exe");
do_patches<Patches::Windows::x64, Patterns::Windows::x64>
- (&patcher, renamed_binary_path, patchVersionPath, wowBuild);
+ (&patcher, renamed_binary_path, wowBuild);
do_module<Patches::Windows::x64, Patterns::Windows::x64>
( "0a3afee2cade3a0e8b458c4b4660104cac7fc50e2ca9bef0d708942e77f15c1d.auth"
@@ -262,7 +251,7 @@ int main(int argc, char** argv)
);
do_patches<Patches::Mac::x64, Patterns::Mac::x64>
- (&patcher, renamed_binary_path, patchVersionPath, wowBuild);
+ (&patcher, renamed_binary_path, wowBuild);
{
namespace fs = boost::filesystem;
diff --git a/src/tools/map_extractor/CMakeLists.txt b/src/tools/map_extractor/CMakeLists.txt
index 32fccaa2038..656bee3d5a0 100644
--- a/src/tools/map_extractor/CMakeLists.txt
+++ b/src/tools/map_extractor/CMakeLists.txt
@@ -9,34 +9,38 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-file(GLOB_RECURSE sources *.cpp *.h)
-
-include_directories (
- ${CMAKE_SOURCE_DIR}/dep/CascLib/src
- ${CMAKE_SOURCE_DIR}/dep/cppformat
- ${CMAKE_SOURCE_DIR}/src/common
- ${CMAKE_SOURCE_DIR}/src/common/Utilities
- ${CMAKE_SOURCE_DIR}/src/server/shared
+CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/loadlib
-)
-
-include_directories(${include_Dirs})
+ PRIVATE_SOURCES)
add_executable(mapextractor
- ${sources}
+ ${PRIVATE_SOURCES}
)
+target_include_directories(mapextractor
+ PUBLIC
+ ${CMAKE_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/loadlib)
+
target_link_libraries(mapextractor
- casc
- common
- format
- ${BZIP2_LIBRARIES}
- ${ZLIB_LIBRARIES}
- ${Boost_LIBRARIES}
-)
+ PUBLIC
+ common
+ casc)
+
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES)
+
+target_include_directories(mapextractor
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(mapextractor casc)
+set_target_properties(mapextractor
+ PROPERTIES
+ FOLDER
+ "tools")
if( UNIX )
install(TARGETS mapextractor DESTINATION bin)
diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt
index adc3410aa6e..7e34fea6acc 100644
--- a/src/tools/mmaps_generator/CMakeLists.txt
+++ b/src/tools/mmaps_generator/CMakeLists.txt
@@ -8,43 +8,34 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-file(GLOB_RECURSE mmap_gen_sources *.cpp *.h)
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES)
-set(mmap_gen_Includes
- ${CMAKE_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/dep/cppformat
- ${CMAKE_SOURCE_DIR}/dep/zlib
- ${CMAKE_SOURCE_DIR}/dep/bzip2
- ${CMAKE_SOURCE_DIR}/dep/g3dlite/include
- ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast
- ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include
- ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour
- ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include
- ${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/common/Collision
- ${CMAKE_SOURCE_DIR}/src/common/Collision/Management
- ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps
- ${CMAKE_SOURCE_DIR}/src/common/Collision/Models
-)
+add_executable(mmaps_generator ${PRIVATE_SOURCES})
-include_directories(${mmap_gen_Includes})
+target_link_libraries(mmaps_generator
+ PUBLIC
+ common
+ Recast
+ Detour
+ zlib
+ bzip2)
-add_executable(mmaps_generator ${mmap_gen_sources})
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES)
-target_link_libraries(mmaps_generator
- common
- g3dlib
- Recast
- Detour
- format
- ${BZIP2_LIBRARIES}
- ${ZLIB_LIBRARIES}
- ${CMAKE_THREAD_LIBS_INIT}
- ${Boost_LIBRARIES}
-)
+target_include_directories(mmaps_generator
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
+
+set_target_properties(mmaps_generator
+ PROPERTIES
+ FOLDER
+ "tools")
if( UNIX )
install(TARGETS mmaps_generator DESTINATION bin)
diff --git a/src/tools/vmap4_assembler/CMakeLists.txt b/src/tools/vmap4_assembler/CMakeLists.txt
index b2b17f49289..28e8b374143 100644
--- a/src/tools/vmap4_assembler/CMakeLists.txt
+++ b/src/tools/vmap4_assembler/CMakeLists.txt
@@ -9,24 +9,17 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-include_directories(
- ${CMAKE_SOURCE_DIR}/dep/g3dlite/include
- ${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}
-)
-
add_executable(vmap4assembler VMapAssembler.cpp)
-add_dependencies(vmap4assembler casc)
target_link_libraries(vmap4assembler
common
- g3dlib
- ${ZLIB_LIBRARIES}
-)
+ casc
+ zlib)
+
+set_target_properties(vmap4assembler
+ PROPERTIES
+ FOLDER
+ "tools")
if( UNIX )
install(TARGETS vmap4assembler DESTINATION bin)
diff --git a/src/tools/vmap4_extractor/CMakeLists.txt b/src/tools/vmap4_extractor/CMakeLists.txt
index 18d770af707..feaf7ddb215 100644
--- a/src/tools/vmap4_extractor/CMakeLists.txt
+++ b/src/tools/vmap4_extractor/CMakeLists.txt
@@ -9,25 +9,32 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-file(GLOB_RECURSE sources *.cpp *.h)
+CollectSourceFiles(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PRIVATE_SOURCES)
-include_directories(
- ${CMAKE_SOURCE_DIR}/src/common
- ${CMAKE_SOURCE_DIR}/src/server/shared
- ${CMAKE_SOURCE_DIR}/dep/CascLib/src
-)
-
-add_executable(vmap4extractor ${sources})
+add_executable(vmap4extractor ${PRIVATE_SOURCES})
target_link_libraries(vmap4extractor
- casc
- common
- ${BZIP2_LIBRARIES}
- ${ZLIB_LIBRARIES}
- ${Boost_LIBRARIES}
-)
+ PUBLIC
+ common
+ casc
+ bzip2)
+
+CollectIncludeDirectories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ PUBLIC_INCLUDES)
+
+target_include_directories(vmap4extractor
+ PUBLIC
+ ${PUBLIC_INCLUDES}
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR})
-add_dependencies(vmap4extractor casc)
+set_target_properties(vmap4extractor
+ PROPERTIES
+ FOLDER
+ "tools")
if( UNIX )
install(TARGETS vmap4extractor DESTINATION bin)