summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt9
-rw-r--r--src/cmake/compiler/clang/settings.cmake20
-rw-r--r--src/cmake/compiler/gcc/settings.cmake36
-rw-r--r--src/cmake/compiler/icc/settings.cmake18
-rw-r--r--src/cmake/compiler/mingw/settings.cmake27
-rw-r--r--src/cmake/compiler/msvc/settings.cmake67
-rw-r--r--src/cmake/macros/CheckBuildDir.cmake23
-rw-r--r--src/cmake/macros/CheckPlatform.cmake18
-rw-r--r--src/cmake/macros/EnsureVersion.cmake115
-rw-r--r--src/cmake/macros/FindACE.cmake84
-rw-r--r--src/cmake/macros/FindGit.cmake46
-rw-r--r--src/cmake/macros/FindGperftools.cmake51
-rw-r--r--src/cmake/macros/FindMySQL.cmake184
-rw-r--r--src/cmake/macros/FindOpenSSL.cmake180
-rw-r--r--src/cmake/macros/FindPCHSupport.cmake104
-rw-r--r--src/cmake/macros/FindReadline.cmake18
-rw-r--r--src/cmake/platform/after_platform.cmake4
-rw-r--r--src/cmake/platform/cmake_uninstall.in.cmake23
-rw-r--r--src/cmake/platform/settings.cmake5
-rw-r--r--src/cmake/platform/unix/settings.cmake44
-rw-r--r--src/cmake/platform/win/settings.cmake32
-rw-r--r--src/common/AutoPtr.h43
-rw-r--r--src/common/CMakeLists.txt95
-rw-r--r--src/common/Collision/BoundingIntervalHierarchy.cpp298
-rw-r--r--src/common/Collision/BoundingIntervalHierarchy.h388
-rw-r--r--src/common/Collision/BoundingIntervalHierarchyWrapper.h107
-rw-r--r--src/common/Collision/CMakeLists.txt93
-rw-r--r--src/common/Collision/DynamicTree.cpp228
-rw-r--r--src/common/Collision/DynamicTree.h51
-rw-r--r--src/common/Collision/Management/IMMAPManager.h39
-rw-r--r--src/common/Collision/Management/IVMapManager.h88
-rw-r--r--src/common/Collision/Management/MMapFactory.cpp49
-rw-r--r--src/common/Collision/Management/MMapFactory.h41
-rw-r--r--src/common/Collision/Management/MMapManager.cpp372
-rw-r--r--src/common/Collision/Management/MMapManager.h91
-rw-r--r--src/common/Collision/Management/VMapFactory.cpp30
-rw-r--r--src/common/Collision/Management/VMapFactory.h28
-rw-r--r--src/common/Collision/Management/VMapManager2.cpp313
-rw-r--r--src/common/Collision/Management/VMapManager2.h125
-rw-r--r--src/common/Collision/Maps/MapTree.cpp465
-rw-r--r--src/common/Collision/Maps/MapTree.h87
-rw-r--r--src/common/Collision/Maps/TileAssembler.cpp528
-rw-r--r--src/common/Collision/Maps/TileAssembler.h107
-rw-r--r--src/common/Collision/Models/GameObjectModel.cpp214
-rw-r--r--src/common/Collision/Models/GameObjectModel.h62
-rw-r--r--src/common/Collision/Models/ModelInstance.cpp211
-rw-r--r--src/common/Collision/Models/ModelInstance.h70
-rw-r--r--src/common/Collision/Models/WorldModel.cpp574
-rw-r--r--src/common/Collision/Models/WorldModel.h117
-rw-r--r--src/common/Collision/PrecompiledHeaders/collisionPCH.cpp1
-rw-r--r--src/common/Collision/PrecompiledHeaders/collisionPCH.h9
-rw-r--r--src/common/Collision/RegularGrid.h264
-rw-r--r--src/common/Collision/VMapDefinitions.h22
-rw-r--r--src/common/Collision/VMapTools.h138
-rw-r--r--src/common/Common.cpp37
-rw-r--r--src/common/Common.h215
-rw-r--r--src/common/CompilerDefs.h54
-rw-r--r--src/common/Configuration/Config.cpp145
-rw-r--r--src/common/Configuration/Config.h66
-rw-r--r--src/common/Containers.h62
-rw-r--r--src/common/Cryptography/ARC4.cpp40
-rw-r--r--src/common/Cryptography/ARC4.h25
-rw-r--r--src/common/Cryptography/Authentication/AuthCrypt.cpp61
-rw-r--r--src/common/Cryptography/Authentication/AuthCrypt.h30
-rw-r--r--src/common/Cryptography/BigNumber.cpp190
-rw-r--r--src/common/Cryptography/BigNumber.h88
-rw-r--r--src/common/Cryptography/HMACSHA1.cpp45
-rw-r--r--src/common/Cryptography/HMACSHA1.h35
-rw-r--r--src/common/Cryptography/OpenSSLCrypto.cpp54
-rw-r--r--src/common/Cryptography/OpenSSLCrypto.h23
-rw-r--r--src/common/Cryptography/SHA1.cpp56
-rw-r--r--src/common/Cryptography/SHA1.h38
-rw-r--r--src/common/Cryptography/WardenKeyGeneration.h67
-rw-r--r--src/common/DataStores/DBCFileLoader.cpp312
-rw-r--r--src/common/DataStores/DBCFileLoader.h98
-rw-r--r--src/common/DataStores/DBCStore.h284
-rw-r--r--src/common/Database/AdhocStatement.cpp47
-rw-r--r--src/common/Database/AdhocStatement.h31
-rw-r--r--src/common/Database/DatabaseEnv.h34
-rw-r--r--src/common/Database/DatabaseWorker.cpp41
-rw-r--r--src/common/Database/DatabaseWorker.h31
-rw-r--r--src/common/Database/DatabaseWorkerPool.h521
-rw-r--r--src/common/Database/Field.cpp55
-rw-r--r--src/common/Database/Field.h380
-rw-r--r--src/common/Database/Implementation/CharacterDatabase.cpp559
-rw-r--r--src/common/Database/Implementation/CharacterDatabase.h499
-rw-r--r--src/common/Database/Implementation/LoginDatabase.cpp84
-rw-r--r--src/common/Database/Implementation/LoginDatabase.h108
-rw-r--r--src/common/Database/Implementation/WorldDatabase.cpp82
-rw-r--r--src/common/Database/Implementation/WorldDatabase.h107
-rw-r--r--src/common/Database/MySQLConnection.cpp538
-rw-r--r--src/common/Database/MySQLConnection.h127
-rw-r--r--src/common/Database/MySQLThreading.h48
-rw-r--r--src/common/Database/PreparedStatement.cpp477
-rw-r--r--src/common/Database/PreparedStatement.h157
-rw-r--r--src/common/Database/QueryHolder.cpp198
-rw-r--r--src/common/Database/QueryHolder.h47
-rw-r--r--src/common/Database/QueryResult.cpp219
-rw-r--r--src/common/Database/QueryResult.h97
-rw-r--r--src/common/Database/SQLOperation.h64
-rw-r--r--src/common/Database/Transaction.cpp82
-rw-r--r--src/common/Database/Transaction.h61
-rw-r--r--src/common/Debugging/Errors.cpp47
-rw-r--r--src/common/Debugging/Errors.h38
-rw-r--r--src/common/Debugging/WheatyExceptionReport.cpp1203
-rw-r--r--src/common/Debugging/WheatyExceptionReport.h149
-rw-r--r--src/common/Define.h88
-rw-r--r--src/common/Dynamic/FactoryHolder.h49
-rw-r--r--src/common/Dynamic/HashNamespace.h107
-rw-r--r--src/common/Dynamic/LinkedList.h233
-rw-r--r--src/common/Dynamic/LinkedReference/RefManager.h44
-rw-r--r--src/common/Dynamic/LinkedReference/Reference.h88
-rw-r--r--src/common/Dynamic/ObjectRegistry.h94
-rw-r--r--src/common/Dynamic/TypeContainer.h112
-rw-r--r--src/common/Dynamic/TypeContainerFunctions.h101
-rw-r--r--src/common/Dynamic/TypeContainerFunctionsPtr.h156
-rw-r--r--src/common/Dynamic/TypeContainerVisitor.h99
-rw-r--r--src/common/Dynamic/TypeList.h32
-rw-r--r--src/common/Dynamic/UnorderedMap.h60
-rw-r--r--src/common/Dynamic/UnorderedSet.h54
-rw-r--r--src/common/Logging/Log.cpp1010
-rw-r--r--src/common/Logging/Log.h199
-rw-r--r--src/common/Packets/ByteBuffer.cpp69
-rw-r--r--src/common/Packets/ByteBuffer.h619
-rw-r--r--src/common/Packets/WorldPacket.h40
-rw-r--r--src/common/PrecompiledHeaders/sharedPCH.cpp1
-rw-r--r--src/common/PrecompiledHeaders/sharedPCH.h8
-rw-r--r--src/common/SystemConfig.h32
-rw-r--r--src/common/Threading/Callback.h300
-rw-r--r--src/common/Threading/DelayExecutor.cpp122
-rw-r--r--src/common/Threading/DelayExecutor.h39
-rw-r--r--src/common/Threading/LockedQueue.h146
-rw-r--r--src/common/Threading/Threading.cpp111
-rw-r--r--src/common/Threading/Threading.h71
-rw-r--r--src/common/Utilities/ByteConverter.h56
-rw-r--r--src/common/Utilities/EventProcessor.cpp91
-rw-r--r--src/common/Utilities/EventProcessor.h65
-rw-r--r--src/common/Utilities/ServiceWin32.cpp252
-rw-r--r--src/common/Utilities/ServiceWin32.h17
-rw-r--r--src/common/Utilities/SignalHandler.h29
-rw-r--r--src/common/Utilities/Timer.h189
-rw-r--r--src/common/Utilities/Util.cpp544
-rw-r--r--src/common/Utilities/Util.h893
-rw-r--r--src/scripts/CMakeLists.txt193
-rw-r--r--src/server/CMakeLists.txt21
-rw-r--r--src/server/authserver/Authentication/AuthCodes.cpp (renamed from src/authserver/Authentication/AuthCodes.cpp)0
-rw-r--r--src/server/authserver/Authentication/AuthCodes.h (renamed from src/authserver/Authentication/AuthCodes.h)0
-rw-r--r--src/server/authserver/CMakeLists.txt (renamed from src/authserver/CMakeLists.txt)18
-rw-r--r--src/server/authserver/Main.cpp (renamed from src/authserver/Main.cpp)0
-rw-r--r--src/server/authserver/PrecompiledHeaders/authPCH.cpp (renamed from src/authserver/PrecompiledHeaders/authPCH.cpp)0
-rw-r--r--src/server/authserver/PrecompiledHeaders/authPCH.h (renamed from src/authserver/PrecompiledHeaders/authPCH.h)0
-rw-r--r--src/server/authserver/Realms/RealmList.cpp (renamed from src/authserver/Realms/RealmList.cpp)0
-rw-r--r--src/server/authserver/Realms/RealmList.h (renamed from src/authserver/Realms/RealmList.h)0
-rw-r--r--src/server/authserver/Server/AuthSocket.cpp (renamed from src/authserver/Server/AuthSocket.cpp)0
-rw-r--r--src/server/authserver/Server/AuthSocket.h (renamed from src/authserver/Server/AuthSocket.h)0
-rw-r--r--src/server/authserver/Server/RealmAcceptor.h (renamed from src/authserver/Server/RealmAcceptor.h)0
-rw-r--r--src/server/authserver/Server/RealmSocket.cpp (renamed from src/authserver/Server/RealmSocket.cpp)0
-rw-r--r--src/server/authserver/Server/RealmSocket.h (renamed from src/authserver/Server/RealmSocket.h)0
-rw-r--r--src/server/authserver/authserver.conf.dist (renamed from src/authserver/authserver.conf.dist)0
-rw-r--r--src/server/authserver/authserver.ico (renamed from src/authserver/authserver.ico)bin136606 -> 136606 bytes
-rw-r--r--src/server/authserver/authserver.rc (renamed from src/authserver/authserver.rc)0
-rw-r--r--src/server/authserver/resource.h (renamed from src/authserver/resource.h)0
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.cpp (renamed from src/game/AI/CoreAI/CombatAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.h (renamed from src/game/AI/CoreAI/CombatAI.h)0
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.cpp (renamed from src/game/AI/CoreAI/GameObjectAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.h (renamed from src/game/AI/CoreAI/GameObjectAI.h)0
-rw-r--r--src/server/game/AI/CoreAI/GuardAI.cpp (renamed from src/game/AI/CoreAI/GuardAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/GuardAI.h (renamed from src/game/AI/CoreAI/GuardAI.h)0
-rw-r--r--src/server/game/AI/CoreAI/PassiveAI.cpp (renamed from src/game/AI/CoreAI/PassiveAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/PassiveAI.h (renamed from src/game/AI/CoreAI/PassiveAI.h)0
-rw-r--r--src/server/game/AI/CoreAI/PetAI.cpp (renamed from src/game/AI/CoreAI/PetAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/PetAI.h (renamed from src/game/AI/CoreAI/PetAI.h)0
-rw-r--r--src/server/game/AI/CoreAI/ReactorAI.cpp (renamed from src/game/AI/CoreAI/ReactorAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/ReactorAI.h (renamed from src/game/AI/CoreAI/ReactorAI.h)0
-rw-r--r--src/server/game/AI/CoreAI/TotemAI.cpp (renamed from src/game/AI/CoreAI/TotemAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/TotemAI.h (renamed from src/game/AI/CoreAI/TotemAI.h)0
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp (renamed from src/game/AI/CoreAI/UnitAI.cpp)0
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.h (renamed from src/game/AI/CoreAI/UnitAI.h)0
-rw-r--r--src/server/game/AI/CreatureAI.cpp (renamed from src/game/AI/CreatureAI.cpp)0
-rw-r--r--src/server/game/AI/CreatureAI.h (renamed from src/game/AI/CreatureAI.h)0
-rw-r--r--src/server/game/AI/CreatureAIFactory.h (renamed from src/game/AI/CreatureAIFactory.h)0
-rw-r--r--src/server/game/AI/CreatureAIImpl.h (renamed from src/game/AI/CreatureAIImpl.h)0
-rw-r--r--src/server/game/AI/CreatureAIRegistry.cpp (renamed from src/game/AI/CreatureAIRegistry.cpp)0
-rw-r--r--src/server/game/AI/CreatureAIRegistry.h (renamed from src/game/AI/CreatureAIRegistry.h)0
-rw-r--r--src/server/game/AI/CreatureAISelector.cpp (renamed from src/game/AI/CreatureAISelector.cpp)0
-rw-r--r--src/server/game/AI/CreatureAISelector.h (renamed from src/game/AI/CreatureAISelector.h)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp (renamed from src/game/AI/ScriptedAI/ScriptedCreature.cpp)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h (renamed from src/game/AI/ScriptedAI/ScriptedCreature.h)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp (renamed from src/game/AI/ScriptedAI/ScriptedEscortAI.cpp)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.h (renamed from src/game/AI/ScriptedAI/ScriptedEscortAI.h)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp (renamed from src/game/AI/ScriptedAI/ScriptedFollowerAI.cpp)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h (renamed from src/game/AI/ScriptedAI/ScriptedFollowerAI.h)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedGossip.cpp (renamed from src/game/AI/ScriptedAI/ScriptedGossip.cpp)0
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedGossip.h (renamed from src/game/AI/ScriptedAI/ScriptedGossip.h)0
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp (renamed from src/game/AI/SmartScripts/SmartAI.cpp)0
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h (renamed from src/game/AI/SmartScripts/SmartAI.h)0
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp (renamed from src/game/AI/SmartScripts/SmartScript.cpp)0
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h (renamed from src/game/AI/SmartScripts/SmartScript.h)0
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp (renamed from src/game/AI/SmartScripts/SmartScriptMgr.cpp)0
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h (renamed from src/game/AI/SmartScripts/SmartScriptMgr.h)0
-rw-r--r--src/server/game/Accounts/AccountMgr.cpp (renamed from src/game/Accounts/AccountMgr.cpp)0
-rw-r--r--src/server/game/Accounts/AccountMgr.h (renamed from src/game/Accounts/AccountMgr.h)0
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp (renamed from src/game/Achievements/AchievementMgr.cpp)0
-rw-r--r--src/server/game/Achievements/AchievementMgr.h (renamed from src/game/Achievements/AchievementMgr.h)0
-rw-r--r--src/server/game/Addons/AddonMgr.cpp120
-rw-r--r--src/server/game/Addons/AddonMgr.h58
-rw-r--r--src/server/game/ArenaSpectator/ArenaSpectator.h (renamed from src/game/ArenaSpectator/ArenaSpectator.h)0
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp (renamed from src/game/AuctionHouse/AuctionHouseMgr.cpp)0
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h (renamed from src/game/AuctionHouse/AuctionHouseMgr.h)0
-rw-r--r--src/server/game/Battlefield/Battlefield.cpp (renamed from src/game/Battlefield/Battlefield.cpp)0
-rw-r--r--src/server/game/Battlefield/Battlefield.h (renamed from src/game/Battlefield/Battlefield.h)0
-rw-r--r--src/server/game/Battlefield/BattlefieldHandler.cpp (renamed from src/game/Battlefield/BattlefieldHandler.cpp)0
-rw-r--r--src/server/game/Battlefield/BattlefieldMgr.cpp (renamed from src/game/Battlefield/BattlefieldMgr.cpp)0
-rw-r--r--src/server/game/Battlefield/BattlefieldMgr.h (renamed from src/game/Battlefield/BattlefieldMgr.h)0
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.cpp (renamed from src/game/Battlefield/Zones/BattlefieldWG.cpp)0
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.h (renamed from src/game/Battlefield/Zones/BattlefieldWG.h)0
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp (renamed from src/game/Battlegrounds/ArenaTeam.cpp)0
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.h (renamed from src/game/Battlegrounds/ArenaTeam.h)0
-rw-r--r--src/server/game/Battlegrounds/ArenaTeamMgr.cpp (renamed from src/game/Battlegrounds/ArenaTeamMgr.cpp)0
-rw-r--r--src/server/game/Battlegrounds/ArenaTeamMgr.h (renamed from src/game/Battlegrounds/ArenaTeamMgr.h)0
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp (renamed from src/game/Battlegrounds/Battleground.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Battleground.h (renamed from src/game/Battlegrounds/Battleground.h)0
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp (renamed from src/game/Battlegrounds/BattlegroundMgr.cpp)0
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h (renamed from src/game/Battlegrounds/BattlegroundMgr.h)0
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.cpp (renamed from src/game/Battlegrounds/BattlegroundQueue.cpp)0
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.h (renamed from src/game/Battlegrounds/BattlegroundQueue.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundAB.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.h (renamed from src/game/Battlegrounds/Zones/BattlegroundAB.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundAV.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h (renamed from src/game/Battlegrounds/Zones/BattlegroundAV.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundBE.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundBE.h (renamed from src/game/Battlegrounds/Zones/BattlegroundBE.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundDS.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundDS.h (renamed from src/game/Battlegrounds/Zones/BattlegroundDS.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundEY.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h (renamed from src/game/Battlegrounds/Zones/BattlegroundEY.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundIC.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.h (renamed from src/game/Battlegrounds/Zones/BattlegroundIC.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundNA.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundNA.h (renamed from src/game/Battlegrounds/Zones/BattlegroundNA.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundRL.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundRL.h (renamed from src/game/Battlegrounds/Zones/BattlegroundRL.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundRV.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundRV.h (renamed from src/game/Battlegrounds/Zones/BattlegroundRV.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundSA.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.h (renamed from src/game/Battlegrounds/Zones/BattlegroundSA.h)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp (renamed from src/game/Battlegrounds/Zones/BattlegroundWS.cpp)0
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.h (renamed from src/game/Battlegrounds/Zones/BattlegroundWS.h)0
-rw-r--r--src/server/game/CMakeLists.txt (renamed from src/game/CMakeLists.txt)54
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp (renamed from src/game/Calendar/CalendarMgr.cpp)0
-rw-r--r--src/server/game/Calendar/CalendarMgr.h (renamed from src/game/Calendar/CalendarMgr.h)0
-rw-r--r--src/server/game/Chat/Channels/Channel.cpp (renamed from src/game/Chat/Channels/Channel.cpp)0
-rw-r--r--src/server/game/Chat/Channels/Channel.h (renamed from src/game/Chat/Channels/Channel.h)0
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.cpp (renamed from src/game/Chat/Channels/ChannelMgr.cpp)0
-rw-r--r--src/server/game/Chat/Channels/ChannelMgr.h (renamed from src/game/Chat/Channels/ChannelMgr.h)0
-rw-r--r--src/server/game/Chat/Chat.cpp (renamed from src/game/Chat/Chat.cpp)0
-rw-r--r--src/server/game/Chat/Chat.h (renamed from src/game/Chat/Chat.h)0
-rw-r--r--src/server/game/Chat/ChatLink.cpp (renamed from src/game/Chat/ChatLink.cpp)0
-rw-r--r--src/server/game/Chat/ChatLink.h (renamed from src/game/Chat/ChatLink.h)0
-rw-r--r--src/server/game/Combat/HostileRefManager.cpp (renamed from src/game/Combat/HostileRefManager.cpp)0
-rw-r--r--src/server/game/Combat/HostileRefManager.h (renamed from src/game/Combat/HostileRefManager.h)0
-rw-r--r--src/server/game/Combat/ThreatManager.cpp (renamed from src/game/Combat/ThreatManager.cpp)0
-rw-r--r--src/server/game/Combat/ThreatManager.h (renamed from src/game/Combat/ThreatManager.h)0
-rw-r--r--src/server/game/Combat/UnitEvents.h (renamed from src/game/Combat/UnitEvents.h)0
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp (renamed from src/game/Conditions/ConditionMgr.cpp)0
-rw-r--r--src/server/game/Conditions/ConditionMgr.h (renamed from src/game/Conditions/ConditionMgr.h)0
-rw-r--r--src/server/game/Conditions/DisableMgr.cpp (renamed from src/game/Conditions/DisableMgr.cpp)0
-rw-r--r--src/server/game/Conditions/DisableMgr.h (renamed from src/game/Conditions/DisableMgr.h)0
-rw-r--r--src/server/game/DataStores/DBCEnums.h (renamed from src/game/DataStores/DBCEnums.h)0
-rw-r--r--src/server/game/DataStores/DBCStores.cpp (renamed from src/game/DataStores/DBCStores.cpp)0
-rw-r--r--src/server/game/DataStores/DBCStores.h (renamed from src/game/DataStores/DBCStores.h)0
-rw-r--r--src/server/game/DataStores/DBCStructure.h (renamed from src/game/DataStores/DBCStructure.h)0
-rw-r--r--src/server/game/DataStores/DBCfmt.h (renamed from src/game/DataStores/DBCfmt.h)0
-rw-r--r--src/server/game/DungeonFinding/LFG.cpp (renamed from src/game/DungeonFinding/LFG.cpp)0
-rw-r--r--src/server/game/DungeonFinding/LFG.h (renamed from src/game/DungeonFinding/LFG.h)0
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.cpp (renamed from src/game/DungeonFinding/LFGGroupData.cpp)0
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.h (renamed from src/game/DungeonFinding/LFGGroupData.h)0
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp (renamed from src/game/DungeonFinding/LFGMgr.cpp)0
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h (renamed from src/game/DungeonFinding/LFGMgr.h)0
-rw-r--r--src/server/game/DungeonFinding/LFGPlayerData.cpp (renamed from src/game/DungeonFinding/LFGPlayerData.cpp)0
-rw-r--r--src/server/game/DungeonFinding/LFGPlayerData.h (renamed from src/game/DungeonFinding/LFGPlayerData.h)0
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.cpp (renamed from src/game/DungeonFinding/LFGQueue.cpp)0
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.h (renamed from src/game/DungeonFinding/LFGQueue.h)0
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.cpp (renamed from src/game/DungeonFinding/LFGScripts.cpp)0
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.h (renamed from src/game/DungeonFinding/LFGScripts.h)0
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp (renamed from src/game/Entities/Corpse/Corpse.cpp)0
-rw-r--r--src/server/game/Entities/Corpse/Corpse.h (renamed from src/game/Entities/Corpse/Corpse.h)0
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp (renamed from src/game/Entities/Creature/Creature.cpp)0
-rw-r--r--src/server/game/Entities/Creature/Creature.h (renamed from src/game/Entities/Creature/Creature.h)0
-rw-r--r--src/server/game/Entities/Creature/CreatureGroups.cpp (renamed from src/game/Entities/Creature/CreatureGroups.cpp)0
-rw-r--r--src/server/game/Entities/Creature/CreatureGroups.h (renamed from src/game/Entities/Creature/CreatureGroups.h)0
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp (renamed from src/game/Entities/Creature/GossipDef.cpp)0
-rw-r--r--src/server/game/Entities/Creature/GossipDef.h (renamed from src/game/Entities/Creature/GossipDef.h)0
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.cpp (renamed from src/game/Entities/Creature/TemporarySummon.cpp)0
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.h (renamed from src/game/Entities/Creature/TemporarySummon.h)0
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp (renamed from src/game/Entities/DynamicObject/DynamicObject.cpp)0
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.h (renamed from src/game/Entities/DynamicObject/DynamicObject.h)0
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp (renamed from src/game/Entities/GameObject/GameObject.cpp)0
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h (renamed from src/game/Entities/GameObject/GameObject.h)0
-rw-r--r--src/server/game/Entities/Item/Container/Bag.cpp (renamed from src/game/Entities/Item/Container/Bag.cpp)0
-rw-r--r--src/server/game/Entities/Item/Container/Bag.h (renamed from src/game/Entities/Item/Container/Bag.h)0
-rw-r--r--src/server/game/Entities/Item/Item.cpp (renamed from src/game/Entities/Item/Item.cpp)0
-rw-r--r--src/server/game/Entities/Item/Item.h (renamed from src/game/Entities/Item/Item.h)0
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.cpp (renamed from src/game/Entities/Item/ItemEnchantmentMgr.cpp)0
-rw-r--r--src/server/game/Entities/Item/ItemEnchantmentMgr.h (renamed from src/game/Entities/Item/ItemEnchantmentMgr.h)0
-rw-r--r--src/server/game/Entities/Item/ItemPrototype.h (renamed from src/game/Entities/Item/ItemPrototype.h)0
-rw-r--r--src/server/game/Entities/Object/Object.cpp (renamed from src/game/Entities/Object/Object.cpp)0
-rw-r--r--src/server/game/Entities/Object/Object.h (renamed from src/game/Entities/Object/Object.h)0
-rw-r--r--src/server/game/Entities/Object/ObjectDefines.h (renamed from src/game/Entities/Object/ObjectDefines.h)0
-rw-r--r--src/server/game/Entities/Object/ObjectPosSelector.cpp (renamed from src/game/Entities/Object/ObjectPosSelector.cpp)0
-rw-r--r--src/server/game/Entities/Object/ObjectPosSelector.h (renamed from src/game/Entities/Object/ObjectPosSelector.h)0
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.cpp (renamed from src/game/Entities/Object/Updates/UpdateData.cpp)0
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateData.h (renamed from src/game/Entities/Object/Updates/UpdateData.h)0
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp (renamed from src/game/Entities/Object/Updates/UpdateFieldFlags.cpp)0
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFieldFlags.h (renamed from src/game/Entities/Object/Updates/UpdateFieldFlags.h)0
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h (renamed from src/game/Entities/Object/Updates/UpdateFields.h)0
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateMask.h (renamed from src/game/Entities/Object/Updates/UpdateMask.h)0
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp (renamed from src/game/Entities/Pet/Pet.cpp)0
-rw-r--r--src/server/game/Entities/Pet/Pet.h (renamed from src/game/Entities/Pet/Pet.h)0
-rw-r--r--src/server/game/Entities/Pet/PetDefines.h (renamed from src/game/Entities/Pet/PetDefines.h)0
-rw-r--r--src/server/game/Entities/Player/Player.cpp (renamed from src/game/Entities/Player/Player.cpp)0
-rw-r--r--src/server/game/Entities/Player/Player.h (renamed from src/game/Entities/Player/Player.h)0
-rw-r--r--src/server/game/Entities/Player/SocialMgr.cpp (renamed from src/game/Entities/Player/SocialMgr.cpp)0
-rw-r--r--src/server/game/Entities/Player/SocialMgr.h (renamed from src/game/Entities/Player/SocialMgr.h)0
-rw-r--r--src/server/game/Entities/Totem/Totem.cpp (renamed from src/game/Entities/Totem/Totem.cpp)0
-rw-r--r--src/server/game/Entities/Totem/Totem.h (renamed from src/game/Entities/Totem/Totem.h)0
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp (renamed from src/game/Entities/Transport/Transport.cpp)0
-rw-r--r--src/server/game/Entities/Transport/Transport.h (renamed from src/game/Entities/Transport/Transport.h)0
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp (renamed from src/game/Entities/Unit/StatSystem.cpp)0
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp (renamed from src/game/Entities/Unit/Unit.cpp)0
-rw-r--r--src/server/game/Entities/Unit/Unit.h (renamed from src/game/Entities/Unit/Unit.h)0
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp (renamed from src/game/Entities/Vehicle/Vehicle.cpp)0
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h (renamed from src/game/Entities/Vehicle/Vehicle.h)0
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h (renamed from src/game/Entities/Vehicle/VehicleDefines.h)0
-rw-r--r--src/server/game/Events/GameEventMgr.cpp (renamed from src/game/Events/GameEventMgr.cpp)0
-rw-r--r--src/server/game/Events/GameEventMgr.h (renamed from src/game/Events/GameEventMgr.h)0
-rw-r--r--src/server/game/Globals/ObjectAccessor.cpp (renamed from src/game/Globals/ObjectAccessor.cpp)0
-rw-r--r--src/server/game/Globals/ObjectAccessor.h (renamed from src/game/Globals/ObjectAccessor.h)0
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp (renamed from src/game/Globals/ObjectMgr.cpp)0
-rw-r--r--src/server/game/Globals/ObjectMgr.h (renamed from src/game/Globals/ObjectMgr.h)0
-rw-r--r--src/server/game/Grids/Cells/Cell.h (renamed from src/game/Grids/Cells/Cell.h)0
-rw-r--r--src/server/game/Grids/Cells/CellImpl.h (renamed from src/game/Grids/Cells/CellImpl.h)0
-rw-r--r--src/server/game/Grids/Grid.h (renamed from src/game/Grids/Grid.h)0
-rw-r--r--src/server/game/Grids/GridDefines.h (renamed from src/game/Grids/GridDefines.h)0
-rw-r--r--src/server/game/Grids/GridLoader.h (renamed from src/game/Grids/GridLoader.h)0
-rw-r--r--src/server/game/Grids/GridRefManager.h (renamed from src/game/Grids/GridRefManager.h)0
-rw-r--r--src/server/game/Grids/GridReference.h (renamed from src/game/Grids/GridReference.h)0
-rw-r--r--src/server/game/Grids/NGrid.h (renamed from src/game/Grids/NGrid.h)0
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.cpp (renamed from src/game/Grids/Notifiers/GridNotifiers.cpp)0
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h (renamed from src/game/Grids/Notifiers/GridNotifiers.h)0
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h (renamed from src/game/Grids/Notifiers/GridNotifiersImpl.h)0
-rw-r--r--src/server/game/Grids/ObjectGridLoader.cpp (renamed from src/game/Grids/ObjectGridLoader.cpp)0
-rw-r--r--src/server/game/Grids/ObjectGridLoader.h (renamed from src/game/Grids/ObjectGridLoader.h)0
-rw-r--r--src/server/game/Groups/Group.cpp (renamed from src/game/Groups/Group.cpp)0
-rw-r--r--src/server/game/Groups/Group.h (renamed from src/game/Groups/Group.h)0
-rw-r--r--src/server/game/Groups/GroupMgr.cpp (renamed from src/game/Groups/GroupMgr.cpp)0
-rw-r--r--src/server/game/Groups/GroupMgr.h (renamed from src/game/Groups/GroupMgr.h)0
-rw-r--r--src/server/game/Groups/GroupRefManager.h (renamed from src/game/Groups/GroupRefManager.h)0
-rw-r--r--src/server/game/Groups/GroupReference.cpp (renamed from src/game/Groups/GroupReference.cpp)0
-rw-r--r--src/server/game/Groups/GroupReference.h (renamed from src/game/Groups/GroupReference.h)0
-rw-r--r--src/server/game/Guilds/Guild.cpp (renamed from src/game/Guilds/Guild.cpp)0
-rw-r--r--src/server/game/Guilds/Guild.h (renamed from src/game/Guilds/Guild.h)0
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp (renamed from src/game/Guilds/GuildMgr.cpp)0
-rw-r--r--src/server/game/Guilds/GuildMgr.h (renamed from src/game/Guilds/GuildMgr.h)0
-rw-r--r--src/server/game/Handlers/AddonHandler.cpp (renamed from src/game/Handlers/AddonHandler.cpp)0
-rw-r--r--src/server/game/Handlers/AddonHandler.h (renamed from src/game/Handlers/AddonHandler.h)0
-rw-r--r--src/server/game/Handlers/ArenaTeamHandler.cpp (renamed from src/game/Handlers/ArenaTeamHandler.cpp)0
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp (renamed from src/game/Handlers/AuctionHouseHandler.cpp)0
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp (renamed from src/game/Handlers/AuthHandler.cpp)0
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp (renamed from src/game/Handlers/BattleGroundHandler.cpp)0
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp (renamed from src/game/Handlers/CalendarHandler.cpp)0
-rw-r--r--src/server/game/Handlers/ChannelHandler.cpp (renamed from src/game/Handlers/ChannelHandler.cpp)0
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp (renamed from src/game/Handlers/CharacterHandler.cpp)0
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp (renamed from src/game/Handlers/ChatHandler.cpp)0
-rw-r--r--src/server/game/Handlers/CombatHandler.cpp (renamed from src/game/Handlers/CombatHandler.cpp)0
-rw-r--r--src/server/game/Handlers/DuelHandler.cpp (renamed from src/game/Handlers/DuelHandler.cpp)0
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp (renamed from src/game/Handlers/GroupHandler.cpp)0
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp (renamed from src/game/Handlers/GuildHandler.cpp)0
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp (renamed from src/game/Handlers/ItemHandler.cpp)0
-rw-r--r--src/server/game/Handlers/LFGHandler.cpp (renamed from src/game/Handlers/LFGHandler.cpp)0
-rw-r--r--src/server/game/Handlers/LootHandler.cpp (renamed from src/game/Handlers/LootHandler.cpp)0
-rw-r--r--src/server/game/Handlers/MailHandler.cpp (renamed from src/game/Handlers/MailHandler.cpp)0
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp (renamed from src/game/Handlers/MiscHandler.cpp)0
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp (renamed from src/game/Handlers/MovementHandler.cpp)0
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp (renamed from src/game/Handlers/NPCHandler.cpp)0
-rw-r--r--src/server/game/Handlers/NPCHandler.h (renamed from src/game/Handlers/NPCHandler.h)0
-rw-r--r--src/server/game/Handlers/PetHandler.cpp (renamed from src/game/Handlers/PetHandler.cpp)0
-rw-r--r--src/server/game/Handlers/PetitionsHandler.cpp (renamed from src/game/Handlers/PetitionsHandler.cpp)0
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp (renamed from src/game/Handlers/QueryHandler.cpp)0
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp (renamed from src/game/Handlers/QuestHandler.cpp)0
-rw-r--r--src/server/game/Handlers/ReferAFriendHandler.cpp (renamed from src/game/Handlers/ReferAFriendHandler.cpp)0
-rw-r--r--src/server/game/Handlers/SkillHandler.cpp (renamed from src/game/Handlers/SkillHandler.cpp)0
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp (renamed from src/game/Handlers/SpellHandler.cpp)0
-rw-r--r--src/server/game/Handlers/TaxiHandler.cpp (renamed from src/game/Handlers/TaxiHandler.cpp)0
-rw-r--r--src/server/game/Handlers/TicketHandler.cpp (renamed from src/game/Handlers/TicketHandler.cpp)0
-rw-r--r--src/server/game/Handlers/TradeHandler.cpp (renamed from src/game/Handlers/TradeHandler.cpp)0
-rw-r--r--src/server/game/Handlers/VehicleHandler.cpp (renamed from src/game/Handlers/VehicleHandler.cpp)0
-rw-r--r--src/server/game/Handlers/VoiceChatHandler.cpp (renamed from src/game/Handlers/VoiceChatHandler.cpp)0
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp (renamed from src/game/Instances/InstanceSaveMgr.cpp)0
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.h (renamed from src/game/Instances/InstanceSaveMgr.h)0
-rw-r--r--src/server/game/Instances/InstanceScript.cpp (renamed from src/game/Instances/InstanceScript.cpp)0
-rw-r--r--src/server/game/Instances/InstanceScript.h (renamed from src/game/Instances/InstanceScript.h)0
-rw-r--r--src/server/game/Loot/LootItemStorage.cpp (renamed from src/game/Loot/LootItemStorage.cpp)0
-rw-r--r--src/server/game/Loot/LootItemStorage.h (renamed from src/game/Loot/LootItemStorage.h)0
-rw-r--r--src/server/game/Loot/LootMgr.cpp (renamed from src/game/Loot/LootMgr.cpp)0
-rw-r--r--src/server/game/Loot/LootMgr.h (renamed from src/game/Loot/LootMgr.h)0
-rw-r--r--src/server/game/Mails/Mail.cpp (renamed from src/game/Mails/Mail.cpp)0
-rw-r--r--src/server/game/Mails/Mail.h (renamed from src/game/Mails/Mail.h)0
-rw-r--r--src/server/game/Maps/Map.cpp (renamed from src/game/Maps/Map.cpp)0
-rw-r--r--src/server/game/Maps/Map.h (renamed from src/game/Maps/Map.h)0
-rw-r--r--src/server/game/Maps/MapInstanced.cpp (renamed from src/game/Maps/MapInstanced.cpp)0
-rw-r--r--src/server/game/Maps/MapInstanced.h (renamed from src/game/Maps/MapInstanced.h)0
-rw-r--r--src/server/game/Maps/MapManager.cpp (renamed from src/game/Maps/MapManager.cpp)0
-rw-r--r--src/server/game/Maps/MapManager.h (renamed from src/game/Maps/MapManager.h)0
-rw-r--r--src/server/game/Maps/MapRefManager.h (renamed from src/game/Maps/MapRefManager.h)0
-rw-r--r--src/server/game/Maps/MapReference.h (renamed from src/game/Maps/MapReference.h)0
-rw-r--r--src/server/game/Maps/MapUpdater.cpp (renamed from src/game/Maps/MapUpdater.cpp)0
-rw-r--r--src/server/game/Maps/MapUpdater.h (renamed from src/game/Maps/MapUpdater.h)0
-rw-r--r--src/server/game/Maps/TransportMgr.cpp (renamed from src/game/Maps/TransportMgr.cpp)0
-rw-r--r--src/server/game/Maps/TransportMgr.h (renamed from src/game/Maps/TransportMgr.h)0
-rw-r--r--src/server/game/Maps/ZoneScript.h (renamed from src/game/Maps/ZoneScript.h)0
-rw-r--r--src/server/game/Misc/AsyncAuctionListing.cpp (renamed from src/game/Misc/AsyncAuctionListing.cpp)0
-rw-r--r--src/server/game/Misc/AsyncAuctionListing.h (renamed from src/game/Misc/AsyncAuctionListing.h)0
-rw-r--r--src/server/game/Misc/AvgDiffTracker.cpp (renamed from src/game/Misc/AvgDiffTracker.cpp)0
-rw-r--r--src/server/game/Misc/AvgDiffTracker.h (renamed from src/game/Misc/AvgDiffTracker.h)0
-rw-r--r--src/server/game/Misc/DynamicVisibility.cpp (renamed from src/game/Misc/DynamicVisibility.cpp)0
-rw-r--r--src/server/game/Misc/DynamicVisibility.h (renamed from src/game/Misc/DynamicVisibility.h)0
-rw-r--r--src/server/game/Misc/SavingSystem.cpp (renamed from src/game/Misc/SavingSystem.cpp)0
-rw-r--r--src/server/game/Misc/SavingSystem.h (renamed from src/game/Misc/SavingSystem.h)0
-rw-r--r--src/server/game/Misc/WhoListCache.cpp (renamed from src/game/Misc/WhoListCache.cpp)0
-rw-r--r--src/server/game/Misc/WhoListCache.h (renamed from src/game/Misc/WhoListCache.h)0
-rw-r--r--src/server/game/Miscellaneous/Formulas.h (renamed from src/game/Miscellaneous/Formulas.h)0
-rw-r--r--src/server/game/Miscellaneous/Language.h (renamed from src/game/Miscellaneous/Language.h)0
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h (renamed from src/game/Miscellaneous/SharedDefines.h)0
-rw-r--r--src/server/game/Movement/FollowerRefManager.h (renamed from src/game/Movement/FollowerRefManager.h)0
-rw-r--r--src/server/game/Movement/FollowerReference.cpp (renamed from src/game/Movement/FollowerReference.cpp)0
-rw-r--r--src/server/game/Movement/FollowerReference.h (renamed from src/game/Movement/FollowerReference.h)0
-rw-r--r--src/server/game/Movement/MotionMaster.cpp (renamed from src/game/Movement/MotionMaster.cpp)0
-rw-r--r--src/server/game/Movement/MotionMaster.h (renamed from src/game/Movement/MotionMaster.h)0
-rw-r--r--src/server/game/Movement/MovementGenerator.cpp (renamed from src/game/Movement/MovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerator.h (renamed from src/game/Movement/MovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGeneratorImpl.h (renamed from src/game/Movement/MovementGeneratorImpl.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/ConfusedMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/EscortMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/EscortMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/EscortMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/EscortMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/FleeingMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/HomeMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/HomeMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/IdleMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/IdleMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/PathGenerator.cpp (renamed from src/game/Movement/MovementGenerators/PathGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/PathGenerator.h (renamed from src/game/Movement/MovementGenerators/PathGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/PointMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/PointMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/PointMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/RandomMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/RandomMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/TargetedMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp (renamed from src/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp)0
-rw-r--r--src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h (renamed from src/game/Movement/MovementGenerators/WaypointMovementGenerator.h)0
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp (renamed from src/game/Movement/Spline/MoveSpline.cpp)0
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.h (renamed from src/game/Movement/Spline/MoveSpline.h)0
-rw-r--r--src/server/game/Movement/Spline/MoveSplineFlag.h (renamed from src/game/Movement/Spline/MoveSplineFlag.h)0
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp (renamed from src/game/Movement/Spline/MoveSplineInit.cpp)0
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h (renamed from src/game/Movement/Spline/MoveSplineInit.h)0
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInitArgs.h (renamed from src/game/Movement/Spline/MoveSplineInitArgs.h)0
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.cpp (renamed from src/game/Movement/Spline/MovementPacketBuilder.cpp)0
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.h (renamed from src/game/Movement/Spline/MovementPacketBuilder.h)0
-rw-r--r--src/server/game/Movement/Spline/MovementTypedefs.h (renamed from src/game/Movement/Spline/MovementTypedefs.h)0
-rw-r--r--src/server/game/Movement/Spline/MovementUtil.cpp (renamed from src/game/Movement/Spline/MovementUtil.cpp)0
-rw-r--r--src/server/game/Movement/Spline/Spline.cpp (renamed from src/game/Movement/Spline/Spline.cpp)0
-rw-r--r--src/server/game/Movement/Spline/Spline.h (renamed from src/game/Movement/Spline/Spline.h)0
-rw-r--r--src/server/game/Movement/Spline/SplineImpl.h (renamed from src/game/Movement/Spline/SplineImpl.h)0
-rw-r--r--src/server/game/Movement/Waypoints/WaypointManager.cpp (renamed from src/game/Movement/Waypoints/WaypointManager.cpp)0
-rw-r--r--src/server/game/Movement/Waypoints/WaypointManager.h (renamed from src/game/Movement/Waypoints/WaypointManager.h)0
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.cpp (renamed from src/game/OutdoorPvP/OutdoorPvP.cpp)0
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvP.h (renamed from src/game/OutdoorPvP/OutdoorPvP.h)0
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp (renamed from src/game/OutdoorPvP/OutdoorPvPMgr.cpp)0
-rw-r--r--src/server/game/OutdoorPvP/OutdoorPvPMgr.h (renamed from src/game/OutdoorPvP/OutdoorPvPMgr.h)0
-rw-r--r--src/server/game/Petitions/PetitionMgr.cpp (renamed from src/game/Petitions/PetitionMgr.cpp)0
-rw-r--r--src/server/game/Petitions/PetitionMgr.h (renamed from src/game/Petitions/PetitionMgr.h)0
-rw-r--r--src/server/game/Pools/PoolMgr.cpp (renamed from src/game/Pools/PoolMgr.cpp)0
-rw-r--r--src/server/game/Pools/PoolMgr.h (renamed from src/game/Pools/PoolMgr.h)0
-rw-r--r--src/server/game/PrecompiledHeaders/gamePCH.cpp (renamed from src/game/PrecompiledHeaders/gamePCH.cpp)0
-rw-r--r--src/server/game/PrecompiledHeaders/gamePCH.h (renamed from src/game/PrecompiledHeaders/gamePCH.h)0
-rw-r--r--src/server/game/Quests/QuestDef.cpp (renamed from src/game/Quests/QuestDef.cpp)0
-rw-r--r--src/server/game/Quests/QuestDef.h (renamed from src/game/Quests/QuestDef.h)0
-rw-r--r--src/server/game/Reputation/ReputationMgr.cpp (renamed from src/game/Reputation/ReputationMgr.cpp)0
-rw-r--r--src/server/game/Reputation/ReputationMgr.h (renamed from src/game/Reputation/ReputationMgr.h)0
-rw-r--r--src/server/game/Scripting/MapScripts.cpp (renamed from src/game/Scripting/MapScripts.cpp)0
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp (renamed from src/game/Scripting/ScriptMgr.cpp)0
-rw-r--r--src/server/game/Scripting/ScriptMgr.h (renamed from src/game/Scripting/ScriptMgr.h)0
-rw-r--r--src/server/game/Scripting/ScriptSystem.cpp (renamed from src/game/Scripting/ScriptSystem.cpp)0
-rw-r--r--src/server/game/Scripting/ScriptSystem.h (renamed from src/game/Scripting/ScriptSystem.h)0
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp (renamed from src/game/Server/Protocol/Opcodes.cpp)0
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h (renamed from src/game/Server/Protocol/Opcodes.h)0
-rw-r--r--src/server/game/Server/Protocol/PacketLog.cpp (renamed from src/game/Server/Protocol/PacketLog.cpp)0
-rw-r--r--src/server/game/Server/Protocol/PacketLog.h (renamed from src/game/Server/Protocol/PacketLog.h)0
-rw-r--r--src/server/game/Server/WorldSession.cpp (renamed from src/game/Server/WorldSession.cpp)0
-rw-r--r--src/server/game/Server/WorldSession.h (renamed from src/game/Server/WorldSession.h)0
-rw-r--r--src/server/game/Server/WorldSocket.cpp (renamed from src/game/Server/WorldSocket.cpp)0
-rw-r--r--src/server/game/Server/WorldSocket.h (renamed from src/game/Server/WorldSocket.h)0
-rw-r--r--src/server/game/Server/WorldSocketAcceptor.h (renamed from src/game/Server/WorldSocketAcceptor.h)0
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp (renamed from src/game/Server/WorldSocketMgr.cpp)0
-rw-r--r--src/server/game/Server/WorldSocketMgr.h (renamed from src/game/Server/WorldSocketMgr.h)0
-rw-r--r--src/server/game/Skills/SkillDiscovery.cpp (renamed from src/game/Skills/SkillDiscovery.cpp)0
-rw-r--r--src/server/game/Skills/SkillDiscovery.h (renamed from src/game/Skills/SkillDiscovery.h)0
-rw-r--r--src/server/game/Skills/SkillExtraItems.cpp (renamed from src/game/Skills/SkillExtraItems.cpp)0
-rw-r--r--src/server/game/Skills/SkillExtraItems.h (renamed from src/game/Skills/SkillExtraItems.h)0
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h (renamed from src/game/Spells/Auras/SpellAuraDefines.h)0
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp (renamed from src/game/Spells/Auras/SpellAuraEffects.cpp)0
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h (renamed from src/game/Spells/Auras/SpellAuraEffects.h)0
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp (renamed from src/game/Spells/Auras/SpellAuras.cpp)0
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h (renamed from src/game/Spells/Auras/SpellAuras.h)0
-rw-r--r--src/server/game/Spells/Spell.cpp (renamed from src/game/Spells/Spell.cpp)0
-rw-r--r--src/server/game/Spells/Spell.h (renamed from src/game/Spells/Spell.h)0
-rw-r--r--src/server/game/Spells/SpellEffects.cpp (renamed from src/game/Spells/SpellEffects.cpp)0
-rw-r--r--src/server/game/Spells/SpellInfo.cpp (renamed from src/game/Spells/SpellInfo.cpp)0
-rw-r--r--src/server/game/Spells/SpellInfo.h (renamed from src/game/Spells/SpellInfo.h)0
-rw-r--r--src/server/game/Spells/SpellMgr.cpp (renamed from src/game/Spells/SpellMgr.cpp)0
-rw-r--r--src/server/game/Spells/SpellMgr.h (renamed from src/game/Spells/SpellMgr.h)0
-rw-r--r--src/server/game/Spells/SpellScript.cpp (renamed from src/game/Spells/SpellScript.cpp)0
-rw-r--r--src/server/game/Spells/SpellScript.h (renamed from src/game/Spells/SpellScript.h)0
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp (renamed from src/game/Texts/CreatureTextMgr.cpp)0
-rw-r--r--src/server/game/Texts/CreatureTextMgr.h (renamed from src/game/Texts/CreatureTextMgr.h)0
-rw-r--r--src/server/game/Tickets/TicketMgr.cpp (renamed from src/game/Tickets/TicketMgr.cpp)0
-rw-r--r--src/server/game/Tickets/TicketMgr.h (renamed from src/game/Tickets/TicketMgr.h)0
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp (renamed from src/game/Tools/CharacterDatabaseCleaner.cpp)0
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.h (renamed from src/game/Tools/CharacterDatabaseCleaner.h)0
-rw-r--r--src/server/game/Tools/PlayerDump.cpp (renamed from src/game/Tools/PlayerDump.cpp)0
-rw-r--r--src/server/game/Tools/PlayerDump.h (renamed from src/game/Tools/PlayerDump.h)0
-rw-r--r--src/server/game/Warden/Modules/WardenModuleMac.h (renamed from src/game/Warden/Modules/WardenModuleMac.h)0
-rw-r--r--src/server/game/Warden/Modules/WardenModuleWin.h (renamed from src/game/Warden/Modules/WardenModuleWin.h)0
-rw-r--r--src/server/game/Warden/Warden.cpp (renamed from src/game/Warden/Warden.cpp)0
-rw-r--r--src/server/game/Warden/Warden.h (renamed from src/game/Warden/Warden.h)0
-rw-r--r--src/server/game/Warden/WardenCheckMgr.cpp (renamed from src/game/Warden/WardenCheckMgr.cpp)0
-rw-r--r--src/server/game/Warden/WardenCheckMgr.h (renamed from src/game/Warden/WardenCheckMgr.h)0
-rw-r--r--src/server/game/Warden/WardenMac.cpp (renamed from src/game/Warden/WardenMac.cpp)0
-rw-r--r--src/server/game/Warden/WardenMac.h (renamed from src/game/Warden/WardenMac.h)0
-rw-r--r--src/server/game/Warden/WardenWin.cpp (renamed from src/game/Warden/WardenWin.cpp)0
-rw-r--r--src/server/game/Warden/WardenWin.h (renamed from src/game/Warden/WardenWin.h)0
-rw-r--r--src/server/game/Weather/Weather.cpp (renamed from src/game/Weather/Weather.cpp)0
-rw-r--r--src/server/game/Weather/Weather.h (renamed from src/game/Weather/Weather.h)0
-rw-r--r--src/server/game/Weather/WeatherMgr.cpp (renamed from src/game/Weather/WeatherMgr.cpp)0
-rw-r--r--src/server/game/Weather/WeatherMgr.h (renamed from src/game/Weather/WeatherMgr.h)0
-rw-r--r--src/server/game/World/World.cpp (renamed from src/game/World/World.cpp)0
-rw-r--r--src/server/game/World/World.h (renamed from src/game/World/World.h)0
-rw-r--r--src/server/scripts/CMakeLists.txt193
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt (renamed from src/scripts/Commands/CMakeLists.txt)0
-rw-r--r--src/server/scripts/Commands/cs_account.cpp (renamed from src/scripts/Commands/cs_account.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_achievement.cpp (renamed from src/scripts/Commands/cs_achievement.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_ban.cpp (renamed from src/scripts/Commands/cs_ban.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_bf.cpp (renamed from src/scripts/Commands/cs_bf.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_cast.cpp (renamed from src/scripts/Commands/cs_cast.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_character.cpp (renamed from src/scripts/Commands/cs_character.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp (renamed from src/scripts/Commands/cs_debug.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_disable.cpp (renamed from src/scripts/Commands/cs_disable.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_event.cpp (renamed from src/scripts/Commands/cs_event.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_gm.cpp (renamed from src/scripts/Commands/cs_gm.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_go.cpp (renamed from src/scripts/Commands/cs_go.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp (renamed from src/scripts/Commands/cs_gobject.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_guild.cpp (renamed from src/scripts/Commands/cs_guild.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_honor.cpp (renamed from src/scripts/Commands/cs_honor.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_instance.cpp (renamed from src/scripts/Commands/cs_instance.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_learn.cpp (renamed from src/scripts/Commands/cs_learn.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp (renamed from src/scripts/Commands/cs_lfg.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_list.cpp (renamed from src/scripts/Commands/cs_list.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp (renamed from src/scripts/Commands/cs_lookup.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_message.cpp (renamed from src/scripts/Commands/cs_message.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp (renamed from src/scripts/Commands/cs_misc.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp (renamed from src/scripts/Commands/cs_modify.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp (renamed from src/scripts/Commands/cs_npc.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_quest.cpp (renamed from src/scripts/Commands/cs_quest.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp (renamed from src/scripts/Commands/cs_reload.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_reset.cpp (renamed from src/scripts/Commands/cs_reset.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_server.cpp (renamed from src/scripts/Commands/cs_server.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_spectator.cpp (renamed from src/scripts/Commands/cs_spectator.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_tele.cpp (renamed from src/scripts/Commands/cs_tele.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_ticket.cpp (renamed from src/scripts/Commands/cs_ticket.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_titles.cpp (renamed from src/scripts/Commands/cs_titles.cpp)0
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp (renamed from src/scripts/Commands/cs_wp.cpp)0
-rw-r--r--src/server/scripts/Custom/README.md (renamed from src/scripts/Custom/README.md)0
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp (renamed from src/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp (renamed from src/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp (renamed from src/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp (renamed from src/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp (renamed from src/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h (renamed from src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/CMakeLists.txt (renamed from src/scripts/EasternKingdoms/CMakeLists.txt)0
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp (renamed from src/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/deadmines.h (renamed from src/scripts/EasternKingdoms/Deadmines/deadmines.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp (renamed from src/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp (renamed from src/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_curator.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp (renamed from src/scripts/EasternKingdoms/Karazhan/karazhan.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.h (renamed from src/scripts/EasternKingdoms/Karazhan/karazhan.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp (renamed from src/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp (renamed from src/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp (renamed from src/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp (renamed from src/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp (renamed from src/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h (renamed from src/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp (renamed from src/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp (renamed from src/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp (renamed from src/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp (renamed from src/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp (renamed from src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp (renamed from src/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp (renamed from src/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/scholomance.h (renamed from src/scripts/EasternKingdoms/Scholomance/scholomance.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp (renamed from src/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h (renamed from src/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp (renamed from src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.h (renamed from src/scripts/EasternKingdoms/Stratholme/stratholme.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp (renamed from src/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h (renamed from src/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp (renamed from src/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp (renamed from src/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp (renamed from src/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp (renamed from src/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp (renamed from src/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp (renamed from src/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp (renamed from src/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h (renamed from src/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp (renamed from src/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp (renamed from src/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.h (renamed from src/scripts/EasternKingdoms/Uldaman/uldaman.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp (renamed from src/scripts/EasternKingdoms/ZulAman/zulaman.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.h (renamed from src/scripts/EasternKingdoms/ZulAman/zulaman.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp (renamed from src/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h (renamed from src/scripts/EasternKingdoms/ZulGurub/zulgurub.h)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_alterac_mountains.cpp (renamed from src/scripts/EasternKingdoms/zone_alterac_mountains.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp (renamed from src/scripts/EasternKingdoms/zone_arathi_highlands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp (renamed from src/scripts/EasternKingdoms/zone_blasted_lands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp (renamed from src/scripts/EasternKingdoms/zone_burning_steppes.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_duskwood.cpp (renamed from src/scripts/EasternKingdoms/zone_duskwood.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp (renamed from src/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp (renamed from src/scripts/EasternKingdoms/zone_eversong_woods.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ghostlands.cpp (renamed from src/scripts/EasternKingdoms/zone_ghostlands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp (renamed from src/scripts/EasternKingdoms/zone_hinterlands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ironforge.cpp (renamed from src/scripts/EasternKingdoms/zone_ironforge.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp (renamed from src/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_loch_modan.cpp (renamed from src/scripts/EasternKingdoms/zone_loch_modan.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp (renamed from src/scripts/EasternKingdoms/zone_redridge_mountains.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp (renamed from src/scripts/EasternKingdoms/zone_silverpine_forest.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp (renamed from src/scripts/EasternKingdoms/zone_stormwind_city.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp (renamed from src/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp (renamed from src/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp (renamed from src/scripts/EasternKingdoms/zone_tirisfal_glades.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_undercity.cpp (renamed from src/scripts/EasternKingdoms/zone_undercity.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp (renamed from src/scripts/EasternKingdoms/zone_western_plaguelands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_westfall.cpp (renamed from src/scripts/EasternKingdoms/zone_westfall.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_wetlands.cpp (renamed from src/scripts/EasternKingdoms/zone_wetlands.cpp)0
-rw-r--r--src/server/scripts/Events/CMakeLists.txt (renamed from src/scripts/Events/CMakeLists.txt)0
-rw-r--r--src/server/scripts/Events/brewfest.cpp (renamed from src/scripts/Events/brewfest.cpp)0
-rw-r--r--src/server/scripts/Events/childrens_week.cpp (renamed from src/scripts/Events/childrens_week.cpp)0
-rw-r--r--src/server/scripts/Events/hallows_end.cpp (renamed from src/scripts/Events/hallows_end.cpp)0
-rw-r--r--src/server/scripts/Events/love_in_air.cpp (renamed from src/scripts/Events/love_in_air.cpp)0
-rw-r--r--src/server/scripts/Events/midsummer.cpp (renamed from src/scripts/Events/midsummer.cpp)0
-rw-r--r--src/server/scripts/Events/pilgrims_bounty.cpp (renamed from src/scripts/Events/pilgrims_bounty.cpp)0
-rw-r--r--src/server/scripts/Events/winter_veil.cpp (renamed from src/scripts/Events/winter_veil.cpp)0
-rw-r--r--src/server/scripts/GenLoader.cpp.cmake (renamed from src/scripts/GenLoader.cpp.cmake)0
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h (renamed from src/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h)0
-rw-r--r--src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp (renamed from src/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt (renamed from src/scripts/Kalimdor/CMakeLists.txt)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h (renamed from src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp (renamed from src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h (renamed from src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h)0
-rw-r--r--src/server/scripts/Kalimdor/DireMaul/dire_maul.h (renamed from src/scripts/Kalimdor/DireMaul/dire_maul.h)0
-rw-r--r--src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp (renamed from src/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/instance_maraudon.cpp (renamed from src/scripts/Kalimdor/Maraudon/instance_maraudon.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/Maraudon/maraudon.h (renamed from src/scripts/Kalimdor/Maraudon/maraudon.h)0
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp (renamed from src/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp (renamed from src/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h (renamed from src/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h)0
-rw-r--r--src/server/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp (renamed from src/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp (renamed from src/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp (renamed from src/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h (renamed from src/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h)0
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp (renamed from src/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h (renamed from src/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h (renamed from src/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h)0
-rw-r--r--src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp (renamed from src/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h (renamed from src/scripts/Kalimdor/WailingCaverns/wailing_caverns.h)0
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp (renamed from src/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h (renamed from src/scripts/Kalimdor/ZulFarrak/zulfarrak.h)0
-rw-r--r--src/server/scripts/Kalimdor/boss_azuregos.cpp (renamed from src/scripts/Kalimdor/boss_azuregos.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_ashenvale.cpp (renamed from src/scripts/Kalimdor/zone_ashenvale.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_azshara.cpp (renamed from src/scripts/Kalimdor/zone_azshara.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp (renamed from src/scripts/Kalimdor/zone_azuremyst_isle.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp (renamed from src/scripts/Kalimdor/zone_bloodmyst_isle.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_darkshore.cpp (renamed from src/scripts/Kalimdor/zone_darkshore.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp (renamed from src/scripts/Kalimdor/zone_desolace.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp (renamed from src/scripts/Kalimdor/zone_durotar.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp (renamed from src/scripts/Kalimdor/zone_dustwallow_marsh.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_felwood.cpp (renamed from src/scripts/Kalimdor/zone_felwood.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_feralas.cpp (renamed from src/scripts/Kalimdor/zone_feralas.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_moonglade.cpp (renamed from src/scripts/Kalimdor/zone_moonglade.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_mulgore.cpp (renamed from src/scripts/Kalimdor/zone_mulgore.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp (renamed from src/scripts/Kalimdor/zone_orgrimmar.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp (renamed from src/scripts/Kalimdor/zone_silithus.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp (renamed from src/scripts/Kalimdor/zone_stonetalon_mountains.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_tanaris.cpp (renamed from src/scripts/Kalimdor/zone_tanaris.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_teldrassil.cpp (renamed from src/scripts/Kalimdor/zone_teldrassil.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp (renamed from src/scripts/Kalimdor/zone_the_barrens.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_thousand_needles.cpp (renamed from src/scripts/Kalimdor/zone_thousand_needles.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp (renamed from src/scripts/Kalimdor/zone_thunder_bluff.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_ungoro_crater.cpp (renamed from src/scripts/Kalimdor/zone_ungoro_crater.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_winterspring.cpp (renamed from src/scripts/Kalimdor/zone_winterspring.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h (renamed from src/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp (renamed from src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp (renamed from src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp (renamed from src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp (renamed from src/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/def_ahnkahet.h (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/def_ahnkahet.h)0
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp (renamed from src/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp)0
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt (renamed from src/scripts/Northrend/CMakeLists.txt)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp (renamed from src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp (renamed from src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h (renamed from src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp (renamed from src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp (renamed from src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp (renamed from src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp (renamed from src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp (renamed from src/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp)0
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h (renamed from src/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp)0
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h (renamed from src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h)0
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp (renamed from src/scripts/Northrend/DraktharonKeep/boss_dred.cpp)0
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp (renamed from src/scripts/Northrend/DraktharonKeep/boss_novos.cpp)0
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp (renamed from src/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp)0
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp (renamed from src/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp)0
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h (renamed from src/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h)0
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp (renamed from src/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp (renamed from src/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp (renamed from src/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp (renamed from src/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h (renamed from src/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp (renamed from src/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp (renamed from src/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp (renamed from src/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp (renamed from src/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h (renamed from src/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp (renamed from src/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp (renamed from src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp (renamed from src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp (renamed from src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp (renamed from src/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp (renamed from src/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp)0
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h (renamed from src/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h)0
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp (renamed from src/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp)0
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_eck.cpp (renamed from src/scripts/Northrend/Gundrak/boss_eck.cpp)0
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp (renamed from src/scripts/Northrend/Gundrak/boss_gal_darah.cpp)0
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp (renamed from src/scripts/Northrend/Gundrak/boss_moorabi.cpp)0
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp (renamed from src/scripts/Northrend/Gundrak/boss_slad_ran.cpp)0
-rw-r--r--src/server/scripts/Northrend/Gundrak/gundrak.h (renamed from src/scripts/Northrend/Gundrak/gundrak.h)0
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp (renamed from src/scripts/Northrend/Gundrak/instance_gundrak.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h (renamed from src/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp)0
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp (renamed from src/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_faerlina.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_gluth.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_gothik.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_grobbulus.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_heigan.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_loatheb.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_maexxna.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_noth.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_noth.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_patchwerk.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_razuvious.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_sapphiron.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp (renamed from src/scripts/Northrend/Naxxramas/boss_thaddius.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp (renamed from src/scripts/Northrend/Naxxramas/instance_naxxramas.cpp)0
-rw-r--r--src/server/scripts/Northrend/Naxxramas/naxxramas.h (renamed from src/scripts/Northrend/Naxxramas/naxxramas.h)0
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp (renamed from src/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h (renamed from src/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h)0
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp (renamed from src/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp (renamed from src/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp (renamed from src/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp (renamed from src/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp (renamed from src/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp (renamed from src/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp (renamed from src/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/nexus.h (renamed from src/scripts/Northrend/Nexus/Nexus/nexus.h)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp (renamed from src/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp (renamed from src/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp (renamed from src/scripts/Northrend/Nexus/Oculus/boss_urom.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp (renamed from src/scripts/Northrend/Nexus/Oculus/boss_varos.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp (renamed from src/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp (renamed from src/scripts/Northrend/Nexus/Oculus/oculus.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.h (renamed from src/scripts/Northrend/Nexus/Oculus/oculus.h)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h (renamed from src/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h (renamed from src/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp (renamed from src/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp (renamed from src/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp)0
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h (renamed from src/scripts/Northrend/Ulduar/Ulduar/ulduar.h)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h (renamed from src/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp (renamed from src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp)0
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h (renamed from src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp (renamed from src/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp (renamed from src/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp (renamed from src/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp (renamed from src/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp (renamed from src/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h (renamed from src/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp (renamed from src/scripts/Northrend/VioletHold/boss_cyanigosa.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_erekem.cpp (renamed from src/scripts/Northrend/VioletHold/boss_erekem.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp (renamed from src/scripts/Northrend/VioletHold/boss_ichoron.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp (renamed from src/scripts/Northrend/VioletHold/boss_lavanthor.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_moragg.cpp (renamed from src/scripts/Northrend/VioletHold/boss_moragg.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp (renamed from src/scripts/Northrend/VioletHold/boss_xevozz.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp (renamed from src/scripts/Northrend/VioletHold/boss_zuramat.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp (renamed from src/scripts/Northrend/VioletHold/instance_violet_hold.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.cpp (renamed from src/scripts/Northrend/VioletHold/violet_hold.cpp)0
-rw-r--r--src/server/scripts/Northrend/VioletHold/violet_hold.h (renamed from src/scripts/Northrend/VioletHold/violet_hold.h)0
-rw-r--r--src/server/scripts/Northrend/isle_of_conquest.cpp (renamed from src/scripts/Northrend/isle_of_conquest.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp (renamed from src/scripts/Northrend/zone_borean_tundra.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_crystalsong_forest.cpp (renamed from src/scripts/Northrend/zone_crystalsong_forest.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp (renamed from src/scripts/Northrend/zone_dalaran.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp (renamed from src/scripts/Northrend/zone_dragonblight.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp (renamed from src/scripts/Northrend/zone_grizzly_hills.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_howling_fjord.cpp (renamed from src/scripts/Northrend/zone_howling_fjord.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp (renamed from src/scripts/Northrend/zone_icecrown.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp (renamed from src/scripts/Northrend/zone_sholazar_basin.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp (renamed from src/scripts/Northrend/zone_storm_peaks.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_wintergrasp.cpp (renamed from src/scripts/Northrend/zone_wintergrasp.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp (renamed from src/scripts/Northrend/zone_zuldrak.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/CMakeLists.txt (renamed from src/scripts/OutdoorPvP/CMakeLists.txt)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp (renamed from src/scripts/OutdoorPvP/OutdoorPvPEP.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPEP.h (renamed from src/scripts/OutdoorPvP/OutdoorPvPEP.h)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPGH.cpp (renamed from src/scripts/OutdoorPvP/OutdoorPvPGH.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPGH.h (renamed from src/scripts/OutdoorPvP/OutdoorPvPGH.h)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp (renamed from src/scripts/OutdoorPvP/OutdoorPvPHP.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPHP.h (renamed from src/scripts/OutdoorPvP/OutdoorPvPHP.h)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp (renamed from src/scripts/OutdoorPvP/OutdoorPvPNA.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPNA.h (renamed from src/scripts/OutdoorPvP/OutdoorPvPNA.h)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp (renamed from src/scripts/OutdoorPvP/OutdoorPvPSI.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPSI.h (renamed from src/scripts/OutdoorPvP/OutdoorPvPSI.h)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp (renamed from src/scripts/OutdoorPvP/OutdoorPvPTF.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPTF.h (renamed from src/scripts/OutdoorPvP/OutdoorPvPTF.h)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp (renamed from src/scripts/OutdoorPvP/OutdoorPvPZM.cpp)0
-rw-r--r--src/server/scripts/OutdoorPvP/OutdoorPvPZM.h (renamed from src/scripts/OutdoorPvP/OutdoorPvPZM.h)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp (renamed from src/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp (renamed from src/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp (renamed from src/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp (renamed from src/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp (renamed from src/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h (renamed from src/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp (renamed from src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp (renamed from src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp (renamed from src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp (renamed from src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp (renamed from src/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp)0
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h (renamed from src/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/black_temple.h (renamed from src/scripts/Outland/BlackTemple/black_temple.h)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp (renamed from src/scripts/Outland/BlackTemple/boss_bloodboil.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp (renamed from src/scripts/Outland/BlackTemple/boss_illidan.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp (renamed from src/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp (renamed from src/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp (renamed from src/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_supremus.cpp (renamed from src/scripts/Outland/BlackTemple/boss_supremus.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp (renamed from src/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp (renamed from src/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/illidari_council.cpp (renamed from src/scripts/Outland/BlackTemple/illidari_council.cpp)0
-rw-r--r--src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp (renamed from src/scripts/Outland/BlackTemple/instance_black_temple.cpp)0
-rw-r--r--src/server/scripts/Outland/CMakeLists.txt (renamed from src/scripts/Outland/CMakeLists.txt)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h (renamed from src/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp (renamed from src/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h (renamed from src/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h)0
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp (renamed from src/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp)0
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_gruul.cpp (renamed from src/scripts/Outland/GruulsLair/boss_gruul.cpp)0
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp (renamed from src/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp)0
-rw-r--r--src/server/scripts/Outland/GruulsLair/gruuls_lair.h (renamed from src/scripts/Outland/GruulsLair/gruuls_lair.h)0
-rw-r--r--src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp (renamed from src/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h (renamed from src/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp (renamed from src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp (renamed from src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp (renamed from src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp (renamed from src/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp (renamed from src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp (renamed from src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp (renamed from src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h (renamed from src/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp (renamed from src/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp (renamed from src/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp (renamed from src/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h (renamed from src/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp (renamed from src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp (renamed from src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp (renamed from src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp (renamed from src/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp)0
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h (renamed from src/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp (renamed from src/scripts/Outland/TempestKeep/Eye/boss_alar.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp (renamed from src/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp (renamed from src/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp (renamed from src/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp (renamed from src/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/the_eye.h (renamed from src/scripts/Outland/TempestKeep/Eye/the_eye.h)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp (renamed from src/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp (renamed from src/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp (renamed from src/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp (renamed from src/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp (renamed from src/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp (renamed from src/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h (renamed from src/scripts/Outland/TempestKeep/Mechanar/mechanar.h)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp (renamed from src/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h (renamed from src/scripts/Outland/TempestKeep/arcatraz/arcatraz.h)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp (renamed from src/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp (renamed from src/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp (renamed from src/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp (renamed from src/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp (renamed from src/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp (renamed from src/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp (renamed from src/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp (renamed from src/scripts/Outland/TempestKeep/botanica/boss_laj.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp (renamed from src/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp (renamed from src/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp (renamed from src/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp)0
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h (renamed from src/scripts/Outland/TempestKeep/botanica/the_botanica.h)0
-rw-r--r--src/server/scripts/Outland/boss_doomlord_kazzak.cpp (renamed from src/scripts/Outland/boss_doomlord_kazzak.cpp)0
-rw-r--r--src/server/scripts/Outland/boss_doomwalker.cpp (renamed from src/scripts/Outland/boss_doomwalker.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp (renamed from src/scripts/Outland/zone_blades_edge_mountains.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_hellfire_peninsula.cpp (renamed from src/scripts/Outland/zone_hellfire_peninsula.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_nagrand.cpp (renamed from src/scripts/Outland/zone_nagrand.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp (renamed from src/scripts/Outland/zone_netherstorm.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp (renamed from src/scripts/Outland/zone_shadowmoon_valley.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_shattrath_city.cpp (renamed from src/scripts/Outland/zone_shattrath_city.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_terokkar_forest.cpp (renamed from src/scripts/Outland/zone_terokkar_forest.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_zangarmarsh.cpp (renamed from src/scripts/Outland/zone_zangarmarsh.cpp)0
-rw-r--r--src/server/scripts/Pet/CMakeLists.txt (renamed from src/scripts/Pet/CMakeLists.txt)0
-rw-r--r--src/server/scripts/Pet/pet_dk.cpp (renamed from src/scripts/Pet/pet_dk.cpp)0
-rw-r--r--src/server/scripts/Pet/pet_generic.cpp (renamed from src/scripts/Pet/pet_generic.cpp)0
-rw-r--r--src/server/scripts/Pet/pet_hunter.cpp (renamed from src/scripts/Pet/pet_hunter.cpp)0
-rw-r--r--src/server/scripts/Pet/pet_mage.cpp (renamed from src/scripts/Pet/pet_mage.cpp)0
-rw-r--r--src/server/scripts/Pet/pet_priest.cpp (renamed from src/scripts/Pet/pet_priest.cpp)0
-rw-r--r--src/server/scripts/Pet/pet_shaman.cpp (renamed from src/scripts/Pet/pet_shaman.cpp)0
-rw-r--r--src/server/scripts/PrecompiledHeaders/ScriptPCH.cpp (renamed from src/scripts/PrecompiledHeaders/ScriptPCH.cpp)0
-rw-r--r--src/server/scripts/PrecompiledHeaders/ScriptPCH.h (renamed from src/scripts/PrecompiledHeaders/ScriptPCH.h)0
-rw-r--r--src/server/scripts/ScriptLoader.cpp (renamed from src/scripts/ScriptLoader.cpp)0
-rw-r--r--src/server/scripts/ScriptLoader.h (renamed from src/scripts/ScriptLoader.h)0
-rw-r--r--src/server/scripts/Spells/CMakeLists.txt (renamed from src/scripts/Spells/CMakeLists.txt)0
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp (renamed from src/scripts/Spells/spell_dk.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp (renamed from src/scripts/Spells/spell_druid.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp (renamed from src/scripts/Spells/spell_generic.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp (renamed from src/scripts/Spells/spell_hunter.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_item.cpp (renamed from src/scripts/Spells/spell_item.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp (renamed from src/scripts/Spells/spell_mage.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp (renamed from src/scripts/Spells/spell_paladin.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp (renamed from src/scripts/Spells/spell_priest.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp (renamed from src/scripts/Spells/spell_quest.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp (renamed from src/scripts/Spells/spell_rogue.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp (renamed from src/scripts/Spells/spell_shaman.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp (renamed from src/scripts/Spells/spell_warlock.cpp)0
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp (renamed from src/scripts/Spells/spell_warrior.cpp)0
-rw-r--r--src/server/scripts/World/CMakeLists.txt (renamed from src/scripts/World/CMakeLists.txt)0
-rw-r--r--src/server/scripts/World/achievement_scripts.cpp (renamed from src/scripts/World/achievement_scripts.cpp)0
-rw-r--r--src/server/scripts/World/areatrigger_scripts.cpp (renamed from src/scripts/World/areatrigger_scripts.cpp)0
-rw-r--r--src/server/scripts/World/boss_emerald_dragons.cpp (renamed from src/scripts/World/boss_emerald_dragons.cpp)0
-rw-r--r--src/server/scripts/World/character_creation.cpp (renamed from src/scripts/World/character_creation.cpp)0
-rw-r--r--src/server/scripts/World/chat_log.cpp (renamed from src/scripts/World/chat_log.cpp)0
-rw-r--r--src/server/scripts/World/go_scripts.cpp (renamed from src/scripts/World/go_scripts.cpp)0
-rw-r--r--src/server/scripts/World/guards.cpp (renamed from src/scripts/World/guards.cpp)0
-rw-r--r--src/server/scripts/World/item_scripts.cpp (renamed from src/scripts/World/item_scripts.cpp)0
-rw-r--r--src/server/scripts/World/mob_generic_creature.cpp (renamed from src/scripts/World/mob_generic_creature.cpp)0
-rw-r--r--src/server/scripts/World/npc_innkeeper.cpp (renamed from src/scripts/World/npc_innkeeper.cpp)0
-rw-r--r--src/server/scripts/World/npc_professions.cpp (renamed from src/scripts/World/npc_professions.cpp)0
-rw-r--r--src/server/scripts/World/npc_taxi.cpp (renamed from src/scripts/World/npc_taxi.cpp)0
-rw-r--r--src/server/scripts/World/npcs_special.cpp (renamed from src/scripts/World/npcs_special.cpp)0
-rw-r--r--src/server/worldserver/CMakeLists.txt216
-rw-r--r--src/server/worldserver/CommandLine/CliRunnable.cpp (renamed from src/worldserver/CommandLine/CliRunnable.cpp)0
-rw-r--r--src/server/worldserver/CommandLine/CliRunnable.h (renamed from src/worldserver/CommandLine/CliRunnable.h)0
-rw-r--r--src/server/worldserver/Main.cpp (renamed from src/worldserver/Main.cpp)0
-rw-r--r--src/server/worldserver/Master.cpp (renamed from src/worldserver/Master.cpp)0
-rw-r--r--src/server/worldserver/Master.h (renamed from src/worldserver/Master.h)0
-rw-r--r--src/server/worldserver/PrecompiledHeaders/worldPCH.cpp (renamed from src/worldserver/PrecompiledHeaders/worldPCH.cpp)0
-rw-r--r--src/server/worldserver/PrecompiledHeaders/worldPCH.h (renamed from src/worldserver/PrecompiledHeaders/worldPCH.h)0
-rw-r--r--src/server/worldserver/RemoteAccess/RARunnable.cpp (renamed from src/worldserver/RemoteAccess/RARunnable.cpp)0
-rw-r--r--src/server/worldserver/RemoteAccess/RARunnable.h (renamed from src/worldserver/RemoteAccess/RARunnable.h)0
-rw-r--r--src/server/worldserver/RemoteAccess/RASocket.cpp (renamed from src/worldserver/RemoteAccess/RASocket.cpp)0
-rw-r--r--src/server/worldserver/RemoteAccess/RASocket.h (renamed from src/worldserver/RemoteAccess/RASocket.h)0
-rw-r--r--src/server/worldserver/TCSoap/TCSoap.cpp (renamed from src/worldserver/TCSoap/TCSoap.cpp)0
-rw-r--r--src/server/worldserver/TCSoap/TCSoap.h (renamed from src/worldserver/TCSoap/TCSoap.h)0
-rw-r--r--src/server/worldserver/WorldThread/WorldRunnable.cpp (renamed from src/worldserver/WorldThread/WorldRunnable.cpp)0
-rw-r--r--src/server/worldserver/WorldThread/WorldRunnable.h (renamed from src/worldserver/WorldThread/WorldRunnable.h)0
-rw-r--r--src/server/worldserver/resource.h (renamed from src/worldserver/resource.h)0
-rw-r--r--src/server/worldserver/worldserver.conf.dist (renamed from src/worldserver/worldserver.conf.dist)0
-rw-r--r--src/server/worldserver/worldserver.ico (renamed from src/worldserver/worldserver.ico)bin136606 -> 136606 bytes
-rw-r--r--src/server/worldserver/worldserver.rc (renamed from src/worldserver/worldserver.rc)0
-rw-r--r--src/tools/CMakeLists.txt17
-rw-r--r--src/tools/map_extractor/CMakeLists.txt46
-rw-r--r--src/tools/map_extractor/System.cpp1143
-rw-r--r--src/tools/map_extractor/adt.cpp153
-rw-r--r--src/tools/map_extractor/adt.h330
-rw-r--r--src/tools/map_extractor/dbcfile.cpp89
-rw-r--r--src/tools/map_extractor/dbcfile.h125
-rw-r--r--src/tools/map_extractor/loadlib.cpp71
-rw-r--r--src/tools/map_extractor/loadlib/loadlib.h73
-rw-r--r--src/tools/map_extractor/mpq_libmpq.cpp117
-rw-r--r--src/tools/map_extractor/mpq_libmpq04.h96
-rw-r--r--src/tools/map_extractor/wdt.cpp72
-rw-r--r--src/tools/map_extractor/wdt.h74
-rw-r--r--src/tools/mesh_extractor/ADT.cpp60
-rw-r--r--src/tools/mesh_extractor/ADT.h39
-rw-r--r--src/tools/mesh_extractor/CMakeLists.txt50
-rw-r--r--src/tools/mesh_extractor/Cache.h70
-rw-r--r--src/tools/mesh_extractor/Chunk.cpp38
-rw-r--r--src/tools/mesh_extractor/Chunk.h27
-rw-r--r--src/tools/mesh_extractor/ChunkedData.cpp81
-rw-r--r--src/tools/mesh_extractor/ChunkedData.h28
-rw-r--r--src/tools/mesh_extractor/Constants.h65
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.cpp203
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.h37
-rw-r--r--src/tools/mesh_extractor/DBC.cpp77
-rw-r--r--src/tools/mesh_extractor/DBC.h60
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.cpp116
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.h69
-rw-r--r--src/tools/mesh_extractor/Geometry.cpp136
-rw-r--r--src/tools/mesh_extractor/Geometry.h30
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.cpp109
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.h28
-rw-r--r--src/tools/mesh_extractor/MPQ.cpp129
-rw-r--r--src/tools/mesh_extractor/MPQ.h96
-rw-r--r--src/tools/mesh_extractor/MPQManager.cpp122
-rw-r--r--src/tools/mesh_extractor/MPQManager.h43
-rw-r--r--src/tools/mesh_extractor/MapChunk.cpp83
-rw-r--r--src/tools/mesh_extractor/MapChunk.h31
-rw-r--r--src/tools/mesh_extractor/MeshExtractor.cpp476
-rw-r--r--src/tools/mesh_extractor/Model.cpp74
-rw-r--r--src/tools/mesh_extractor/Model.h30
-rw-r--r--src/tools/mesh_extractor/ObjectDataHandler.cpp16
-rw-r--r--src/tools/mesh_extractor/ObjectDataHandler.h22
-rw-r--r--src/tools/mesh_extractor/TileBuilder.cpp404
-rw-r--r--src/tools/mesh_extractor/TileBuilder.h41
-rw-r--r--src/tools/mesh_extractor/Utils.cpp554
-rw-r--r--src/tools/mesh_extractor/Utils.h397
-rw-r--r--src/tools/mesh_extractor/WDT.cpp68
-rw-r--r--src/tools/mesh_extractor/WDT.h36
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.cpp150
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.h45
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.cpp227
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.h54
-rw-r--r--src/tools/mesh_extractor/WorldModelRoot.cpp86
-rw-r--r--src/tools/mesh_extractor/WorldModelRoot.h34
-rw-r--r--src/tools/mesh_extractor/readme6
-rw-r--r--src/tools/mmaps_generator/CMakeLists.txt140
-rw-r--r--src/tools/mmaps_generator/Info/readme.txt69
-rw-r--r--src/tools/mmaps_generator/IntermediateValues.cpp265
-rw-r--r--src/tools/mmaps_generator/IntermediateValues.h41
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp1014
-rw-r--r--src/tools/mmaps_generator/MapBuilder.h199
-rw-r--r--src/tools/mmaps_generator/PathCommon.h128
-rw-r--r--src/tools/mmaps_generator/PathGenerator.cpp285
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp923
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.h118
-rw-r--r--src/tools/mmaps_generator/VMapExtensions.cpp62
-rw-r--r--src/tools/vmap4_assembler/CMakeLists.txt39
-rw-r--r--src/tools/vmap4_assembler/VMapAssembler.cpp37
-rw-r--r--src/tools/vmap4_extractor/CMakeLists.txt39
-rw-r--r--src/tools/vmap4_extractor/adtfile.cpp202
-rw-r--r--src/tools/vmap4_extractor/adtfile.h131
-rw-r--r--src/tools/vmap4_extractor/dbcfile.cpp84
-rw-r--r--src/tools/vmap4_extractor/dbcfile.h143
-rw-r--r--src/tools/vmap4_extractor/gameobject_extract.cpp111
-rw-r--r--src/tools/vmap4_extractor/loadlib/loadlib.h67
-rw-r--r--src/tools/vmap4_extractor/model.cpp196
-rw-r--r--src/tools/vmap4_extractor/model.h55
-rw-r--r--src/tools/vmap4_extractor/modelheaders.h87
-rw-r--r--src/tools/vmap4_extractor/mpq_libmpq.cpp117
-rw-r--r--src/tools/vmap4_extractor/mpq_libmpq04.h95
-rw-r--r--src/tools/vmap4_extractor/vec3d.h236
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp526
-rw-r--r--src/tools/vmap4_extractor/vmapexport.h30
-rw-r--r--src/tools/vmap4_extractor/wdtfile.cpp118
-rw-r--r--src/tools/vmap4_extractor/wdtfile.h33
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp556
-rw-r--r--src/tools/vmap4_extractor/wmo.h122
-rw-r--r--src/worldserver/CMakeLists.txt216
1286 files changed, 34687 insertions, 455 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4d106ab3a2..12df311743 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -19,12 +19,5 @@ endif()
add_subdirectory(genrev)
if( SERVERS )
- set(sources_windows_Debugging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Debugging/WheatyExceptionReport.cpp
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Debugging/WheatyExceptionReport.h
- )
- add_subdirectory(game)
- add_subdirectory(authserver)
- add_subdirectory(scripts)
- add_subdirectory(worldserver)
+ add_subdirectory(server)
endif()
diff --git a/src/cmake/compiler/clang/settings.cmake b/src/cmake/compiler/clang/settings.cmake
new file mode 100644
index 0000000000..055860c999
--- /dev/null
+++ b/src/cmake/compiler/clang/settings.cmake
@@ -0,0 +1,20 @@
+# Set build-directive (used in core to tell which buildtype we used)
+add_definitions(-D_BUILD_DIRECTIVE='"${CMAKE_BUILD_TYPE}"')
+
+if(WITH_WARNINGS)
+ set(WARNING_FLAGS "-W -Wall -Wextra -Winit-self -Wfatal-errors -Wno-mismatched-tags")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS} -Woverloaded-virtual")
+ message(STATUS "Clang: All warnings enabled")
+endif()
+
+if(WITH_COREDEBUG)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
+ message(STATUS "Clang: Debug-flags set (-g3)")
+endif()
+
+# -Wno-narrowing needed to suppress a warning in g3d
+# -Wno-deprecated-register is needed to suppress gsoap warnings on Unix systems.
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wno-narrowing -Wno-deprecated-register")
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG=1")
diff --git a/src/cmake/compiler/gcc/settings.cmake b/src/cmake/compiler/gcc/settings.cmake
new file mode 100644
index 0000000000..c4597c5071
--- /dev/null
+++ b/src/cmake/compiler/gcc/settings.cmake
@@ -0,0 +1,36 @@
+# Set build-directive (used in core to tell which buildtype we used)
+add_definitions(-D_BUILD_DIRECTIVE='"${CMAKE_BUILD_TYPE}"')
+
+set(GCC_EXPECTED_VERSION 4.8.2)
+
+if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS GCC_EXPECTED_VERSION)
+ message(FATAL_ERROR "GCC: This project requires version ${GCC_EXPECTED_VERSION} to build but found ${CMAKE_CXX_COMPILER_VERSION}")
+endif()
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+message(STATUS "GCC: Enabled c++11 support")
+
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
+message(STATUS "GCC: Enabled C99 support")
+
+if(PLATFORM EQUAL 32)
+ # Required on 32-bit systems to enable SSE2 (standard on x64)
+ set(SSE_FLAGS "-msse2 -mfpmath=sse")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SSE_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}")
+endif()
+add_definitions(-DHAVE_SSE2 -D__SSE2__)
+message(STATUS "GCC: SFMT enabled, SSE2 flags forced")
+
+if( WITH_WARNINGS )
+ set(WARNING_FLAGS "-W -Wall -Wextra -Winit-self -Winvalid-pch -Wfatal-errors")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS} -Woverloaded-virtual")
+ message(STATUS "GCC: All warnings enabled")
+endif()
+
+if( WITH_COREDEBUG )
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
+ message(STATUS "GCC: Debug-flags set (-g3)")
+endif()
diff --git a/src/cmake/compiler/icc/settings.cmake b/src/cmake/compiler/icc/settings.cmake
new file mode 100644
index 0000000000..133bc15e59
--- /dev/null
+++ b/src/cmake/compiler/icc/settings.cmake
@@ -0,0 +1,18 @@
+# Set build-directive (used in core to tell which buildtype we used)
+add_definitions(-D_BUILD_DIRECTIVE="'${CMAKE_BUILD_TYPE}'")
+
+if(PLATFORM EQUAL 32)
+ add_definitions(-axSSE2)
+else()
+ add_definitions(-xSSE2)
+endif()
+
+if( WITH_WARNINGS )
+ add_definitions(-w1)
+ message(STATUS "ICC: All warnings enabled")
+endif()
+
+if( WITH_COREDEBUG )
+ add_definitions(-g)
+ message(STATUS "ICC: Debug-flag set (-g)")
+endif()
diff --git a/src/cmake/compiler/mingw/settings.cmake b/src/cmake/compiler/mingw/settings.cmake
new file mode 100644
index 0000000000..68156bd0b6
--- /dev/null
+++ b/src/cmake/compiler/mingw/settings.cmake
@@ -0,0 +1,27 @@
+# set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+# Set build-directive (used in core to tell which buildtype we used)
+add_definitions(-D_BUILD_DIRECTIVE=\\"${CMAKE_BUILD_TYPE}\\")
+
+if(PLATFORM EQUAL 32)
+ # Required on 32-bit systems to enable SSE2 (standard on x64)
+ set(SSE_FLAGS "-msse2 -mfpmath=sse")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SSE_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}")
+endif()
+add_definitions(-DHAVE_SSE2 -D__SSE2__)
+message(STATUS "GCC: SFMT enabled, SSE2 flags forced")
+
+if( WITH_WARNINGS )
+ set(WARNING_FLAGS "-W -Wall -Wextra -Winit-self -Winvalid-pch -Wfatal-errors")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS} -Woverloaded-virtual")
+ message(STATUS "GCC: All warnings enabled")
+endif()
+
+if( WITH_COREDEBUG )
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
+ message(STATUS "GCC: Debug-flags set (-g3)")
+endif()
diff --git a/src/cmake/compiler/msvc/settings.cmake b/src/cmake/compiler/msvc/settings.cmake
new file mode 100644
index 0000000000..7ce1f7f200
--- /dev/null
+++ b/src/cmake/compiler/msvc/settings.cmake
@@ -0,0 +1,67 @@
+# set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+# set up output paths ofr static libraries etc (commented out - shown here as an example only)
+#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+if(PLATFORM EQUAL 64)
+ # This definition is necessary to work around a bug with Intellisense described
+ # here: http://tinyurl.com/2cb428. Syntax highlighting is important for proper
+ # debugger functionality.
+ add_definitions("-D_WIN64")
+ message(STATUS "MSVC: 64-bit platform, enforced -D_WIN64 parameter")
+
+ #Enable extended object support for debug compiles on X64 (not required on X86)
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj")
+ message(STATUS "MSVC: Enabled extended object-support for debug-compiles")
+else()
+ # mark 32 bit executables large address aware so they can use > 2GB address space
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
+ message(STATUS "MSVC: Enabled large address awareness")
+
+ add_definitions(/arch:SSE2)
+ message(STATUS "MSVC: Enabled SSE2 support")
+endif()
+
+# Set build-directive (used in core to tell which buildtype we used)
+add_definitions(-D_BUILD_DIRECTIVE=\\"$(ConfigurationName)\\")
+
+# multithreaded compiling on VS
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
+
+# Define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES - eliminates the warning by changing the strcpy call to strcpy_s, which prevents buffer overruns
+add_definitions(-D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES)
+message(STATUS "MSVC: Overloaded standard names")
+
+# Ignore warnings about older, less secure functions
+add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+message(STATUS "MSVC: Disabled NON-SECURE warnings")
+
+#Ignore warnings about POSIX deprecation
+add_definitions(-D_CRT_NONSTDC_NO_WARNINGS)
+message(STATUS "MSVC: Disabled POSIX warnings")
+
+#Ignore warnings about INTMAX_MAX
+add_definitions(-D__STDC_LIMIT_MACROS)
+message(STATUS "MSVC: Disabled INTMAX_MAX warnings")
+
+# disable warnings in Visual Studio 8 and above if not wanted
+if(NOT WITH_WARNINGS)
+ if(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4996 /wd4355 /wd4244 /wd4985 /wd4267 /wd4619")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4996 /wd4355 /wd4244 /wd4985 /wd4267 /wd4619")
+ message(STATUS "MSVC: Disabled generic compiletime warnings")
+ endif()
+endif()
+
+# Specify the maximum PreCompiled Header memory allocation limit
+# Fixes a compiler-problem when using PCH - the /Ym flag is adjusted by the compiler in MSVC2012, hence we need to set an upper limit with /Zm to avoid discrepancies)
+# (And yes, this is a verified , unresolved bug with MSVC... *sigh*)
+string(REGEX REPLACE "/Zm[0-9]+ *" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zm500")
+
+# Enable and treat as errors the following warnings to easily detect virtual function signature failures:
+# 'function' : member function does not override any base class virtual member function
+# 'virtual_function' : no override available for virtual member function from base 'class'; function is hidden
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /we4263 /we4264")
diff --git a/src/cmake/macros/CheckBuildDir.cmake b/src/cmake/macros/CheckBuildDir.cmake
new file mode 100644
index 0000000000..085ca32746
--- /dev/null
+++ b/src/cmake/macros/CheckBuildDir.cmake
@@ -0,0 +1,23 @@
+# Copyright (C)
+#
+# 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.
+
+#
+# Force out-of-source build
+#
+
+string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" BUILDING_IN_SOURCE)
+
+if( BUILDING_IN_SOURCE )
+ message(FATAL_ERROR "
+ This project requires an out of source build. Remove the file 'CMakeCache.txt'
+ found in this directory before continuing, create a separate build directory
+ and run 'cmake path_to_project [options]' from there.
+ ")
+endif()
diff --git a/src/cmake/macros/CheckPlatform.cmake b/src/cmake/macros/CheckPlatform.cmake
new file mode 100644
index 0000000000..5ef5f6d9a5
--- /dev/null
+++ b/src/cmake/macros/CheckPlatform.cmake
@@ -0,0 +1,18 @@
+# check what platform we're on (64-bit or 32-bit), and create a simpler test than CMAKE_SIZEOF_VOID_P
+if(CMAKE_SIZEOF_VOID_P MATCHES 8)
+ set(PLATFORM 64)
+ MESSAGE(STATUS "Detected 64-bit platform")
+else()
+ set(PLATFORM 32)
+ MESSAGE(STATUS "Detected 32-bit platform")
+endif()
+
+include("${CMAKE_SOURCE_DIR}/src/cmake/platform/settings.cmake")
+
+if(WIN32)
+ include("${CMAKE_SOURCE_DIR}/src/cmake/platform/win/settings.cmake")
+elseif(UNIX)
+ include("${CMAKE_SOURCE_DIR}/src/cmake/platform/unix/settings.cmake")
+endif()
+
+include("${CMAKE_SOURCE_DIR}/src/cmake/platform/after_platform.cmake")
diff --git a/src/cmake/macros/EnsureVersion.cmake b/src/cmake/macros/EnsureVersion.cmake
new file mode 100644
index 0000000000..a85e12abb7
--- /dev/null
+++ b/src/cmake/macros/EnsureVersion.cmake
@@ -0,0 +1,115 @@
+# This file defines the following macros for developers to use in ensuring
+# that installed software is of the right version:
+#
+# ENSURE_VERSION - test that a version number is greater than
+# or equal to some minimum
+# ENSURE_VERSION_RANGE - test that a version number is greater than
+# or equal to some minimum and less than some
+# maximum
+# ENSURE_VERSION2 - deprecated, do not use in new code
+#
+
+# ENSURE_VERSION
+# This macro compares version numbers of the form "x.y.z" or "x.y"
+# ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK)
+# will set FOO_VERSION_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION
+# Leading and trailing text is ok, e.g.
+# ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK)
+# which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system
+
+# Copyright (c) 2006, David Faure, <faure@kde.org>
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# ENSURE_VERSION_RANGE
+# This macro ensures that a version number of the form
+# "x.y.z" or "x.y" falls within a range defined by
+# min_version <= found_version < max_version.
+# If this expression holds, FOO_VERSION_OK will be set TRUE
+#
+# Example: ENSURE_VERSION_RANGE3( "0.1.0" ${FOOCODE_VERSION} "0.7.0" FOO_VERSION_OK )
+#
+# This macro will break silently if any of x,y,z are greater than 100.
+#
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# NORMALIZE_VERSION
+# Helper macro to convert version numbers of the form "x.y.z"
+# to an integer equal to 10^4 * x + 10^2 * y + z
+#
+# This macro will break silently if any of x,y,z are greater than 100.
+#
+# Copyright (c) 2006, David Faure, <faure@kde.org>
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+# CHECK_RANGE_INCLUSIVE_LOWER
+# Helper macro to check whether x <= y < z
+#
+# Copyright (c) 2007, Will Stephenson <wstephenson@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+MACRO(NORMALIZE_VERSION _requested_version _normalized_version)
+ STRING(REGEX MATCH "[^0-9]*[0-9]+\\.[0-9]+\\.[0-9]+.*" _threePartMatch "${_requested_version}")
+ if (_threePartMatch)
+ # parse the parts of the version string
+ STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" _major_vers "${_requested_version}")
+ STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" _minor_vers "${_requested_version}")
+ STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" _patch_vers "${_requested_version}")
+ else (_threePartMatch)
+ STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+" "\\1" _major_vers "${_requested_version}")
+ STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)" "\\1" _minor_vers "${_requested_version}")
+ set(_patch_vers "0")
+ endif (_threePartMatch)
+
+ # compute an overall version number which can be compared at once
+ MATH(EXPR ${_normalized_version} "${_major_vers}*10000 + ${_minor_vers}*100 + ${_patch_vers}")
+ENDMACRO(NORMALIZE_VERSION)
+
+MACRO(CHECK_RANGE_INCLUSIVE_LOWER _lower_limit _value _upper_limit _ok)
+ if (${_value} LESS ${_lower_limit})
+ set( ${_ok} FALSE )
+ elseif (${_value} EQUAL ${_lower_limit})
+ set( ${_ok} TRUE )
+ elseif (${_value} EQUAL ${_upper_limit})
+ set( ${_ok} FALSE )
+ elseif (${_value} GREATER ${_upper_limit})
+ set( ${_ok} FALSE )
+ else (${_value} LESS ${_lower_limit})
+ set( ${_ok} TRUE )
+ endif (${_value} LESS ${_lower_limit})
+ENDMACRO(CHECK_RANGE_INCLUSIVE_LOWER)
+
+MACRO(ENSURE_VERSION requested_version found_version var_too_old)
+ NORMALIZE_VERSION( ${requested_version} req_vers_num )
+ NORMALIZE_VERSION( ${found_version} found_vers_num )
+
+ if (found_vers_num LESS req_vers_num)
+ set( ${var_too_old} FALSE )
+ else (found_vers_num LESS req_vers_num)
+ set( ${var_too_old} TRUE )
+ endif (found_vers_num LESS req_vers_num)
+
+ENDMACRO(ENSURE_VERSION)
+
+MACRO(ENSURE_VERSION2 requested_version2 found_version2 var_too_old2)
+ ENSURE_VERSION( ${requested_version2} ${found_version2} ${var_too_old2})
+ENDMACRO(ENSURE_VERSION2)
+
+MACRO(ENSURE_VERSION_RANGE min_version found_version max_version var_ok)
+ NORMALIZE_VERSION( ${min_version} req_vers_num )
+ NORMALIZE_VERSION( ${found_version} found_vers_num )
+ NORMALIZE_VERSION( ${max_version} max_vers_num )
+
+ CHECK_RANGE_INCLUSIVE_LOWER( ${req_vers_num} ${found_vers_num} ${max_vers_num} ${var_ok})
+ENDMACRO(ENSURE_VERSION_RANGE)
diff --git a/src/cmake/macros/FindACE.cmake b/src/cmake/macros/FindACE.cmake
new file mode 100644
index 0000000000..10d762f301
--- /dev/null
+++ b/src/cmake/macros/FindACE.cmake
@@ -0,0 +1,84 @@
+#
+# Find the ACE client includes and library
+#
+
+# This module defines
+# ACE_INCLUDE_DIR, where to find ace.h
+# ACE_LIBRARIES, the libraries to link against
+# ACE_FOUND, if false, you cannot build anything that requires ACE
+
+# also defined, but not for general use are
+# ACE_LIBRARY, where to find the ACE library.
+
+set( ACE_FOUND 0 )
+
+if ( UNIX )
+ if (NOT ACE_INCLUDE_DIR)
+ FIND_PATH( ACE_INCLUDE_DIR
+ NAMES
+ ace/ACE.h
+ PATHS
+ /usr/include
+ /usr/include/ace
+ /usr/local/include
+ /usr/local/include/ace
+ $ENV{ACE_ROOT}
+ $ENV{ACE_ROOT}/ace
+ $ENV{ACE_ROOT}/include
+ ${CMAKE_SOURCE_DIR}/externals/ace
+ DOC
+ "Specify include-directories that might contain ace.h here."
+ )
+ endif()
+
+ if (NOT ACE_LIBRARY)
+ FIND_LIBRARY( ACE_LIBRARY
+ NAMES
+ ace ACE
+ PATHS
+ /usr/lib
+ /usr/lib/ace
+ /usr/local/lib
+ /usr/local/lib/ace
+ /usr/local/ace/lib
+ $ENV{ACE_ROOT}/lib
+ $ENV{ACE_ROOT}
+ DOC "Specify library-locations that might contain the ACE library here."
+ )
+
+ # FIND_LIBRARY( ACE_EXTRA_LIBRARIES
+ # NAMES
+ # z zlib
+ # PATHS
+ # /usr/lib
+ # /usr/local/lib
+ # DOC
+ # "if more libraries are necessary to link into ACE, specify them here."
+ # )
+ endif()
+
+ if ( ACE_LIBRARY )
+ if ( ACE_INCLUDE_DIR )
+ if (_ACE_VERSION)
+ set(ACE_VERSION "${_ACE_VERSION}")
+ else (_ACE_VERSION)
+ file(STRINGS "${ACE_INCLUDE_DIR}/ace/Version.h" ACE_VERSION_STR REGEX "^#define ACE_VERSION \".*\"")
+ string(REGEX REPLACE "^.*ACE_VERSION \"([0-9].[0-9].[0-9a-z]).*$"
+ "\\1" ACE_VERSION "${ACE_VERSION_STR}")
+ endif (_ACE_VERSION)
+
+ include(EnsureVersion)
+ ENSURE_VERSION( "${ACE_EXPECTED_VERSION}" "${ACE_VERSION}" ACE_FOUND)
+ if (NOT ACE_FOUND)
+ message(FATAL_ERROR "AzerothCore needs ACE version ${ACE_EXPECTED_VERSION} but found version ${ACE_VERSION}")
+ endif()
+
+ message( STATUS "Found ACE library: ${ACE_LIBRARY}")
+ message( STATUS "Found ACE headers: ${ACE_INCLUDE_DIR}")
+ else ( ACE_INCLUDE_DIR )
+ message(FATAL_ERROR "Could not find ACE headers! Please install ACE libraries and headers")
+ endif ( ACE_INCLUDE_DIR )
+ endif ( ACE_LIBRARY )
+
+ mark_as_advanced( ACE_FOUND ACE_LIBRARY ACE_EXTRA_LIBRARIES ACE_INCLUDE_DIR )
+endif (UNIX)
diff --git a/src/cmake/macros/FindGit.cmake b/src/cmake/macros/FindGit.cmake
new file mode 100644
index 0000000000..a37370c849
--- /dev/null
+++ b/src/cmake/macros/FindGit.cmake
@@ -0,0 +1,46 @@
+# Copyright (C)
+#
+# 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.
+include(${CMAKE_SOURCE_DIR}/src/cmake/macros/EnsureVersion.cmake)
+
+set(_REQUIRED_GIT_VERSION "1.7")
+
+find_program(GIT_EXECUTABLE
+ NAMES
+ git git.cmd
+ HINTS
+ ENV PATH
+ DOC "Full path to git commandline client"
+)
+MARK_AS_ADVANCED(GIT_EXECUTABLE)
+
+if(NOT GIT_EXECUTABLE)
+ message(FATAL_ERROR "
+ Git was NOT FOUND on your system - did you forget to install a recent version, or setting the path to it?
+ Observe that for revision hash/date to work you need at least version ${_REQUIRED_GIT_VERSION}")
+else()
+ message(STATUS "Found git binary : ${GIT_EXECUTABLE}")
+ execute_process(
+ COMMAND "${GIT_EXECUTABLE}" --version
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
+ OUTPUT_VARIABLE _GIT_VERSION
+ ERROR_QUIET
+ )
+
+ # make sure we're using minimum the required version of git, so the "dirty-testing" will work properly
+ ensure_version( "${_REQUIRED_GIT_VERSION}" "${_GIT_VERSION}" _GIT_VERSION_OK)
+
+ # throw an error if we don't have a recent enough version of git...
+ if(NOT _GIT_VERSION_OK)
+ message(STATUS "Git version too old : ${_GIT_VERSION}")
+ message(FATAL_ERROR "
+ Git was found but is OUTDATED - did you forget to install a recent version, or setting the path to it?
+ Observe that for revision hash/date to work you need at least version ${_REQUIRED_GIT_VERSION}")
+ endif()
+endif()
diff --git a/src/cmake/macros/FindGperftools.cmake b/src/cmake/macros/FindGperftools.cmake
new file mode 100644
index 0000000000..f35104d2f9
--- /dev/null
+++ b/src/cmake/macros/FindGperftools.cmake
@@ -0,0 +1,51 @@
+# Tries to find Gperftools.
+#
+# Usage of this module as follows:
+#
+# find_package(Gperftools)
+#
+# Variables used by this module, they can change the default behaviour and need
+# to be set before calling find_package:
+#
+# Gperftools_ROOT_DIR Set this variable to the root installation of
+# Gperftools if the module has problems finding
+# the proper installation path.
+#
+# Variables defined by this module:
+#
+# GPERFTOOLS_FOUND System has Gperftools libs/headers
+# GPERFTOOLS_LIBRARIES The Gperftools libraries (tcmalloc & profiler)
+# GPERFTOOLS_INCLUDE_DIR The location of Gperftools headers
+
+find_library(GPERFTOOLS_TCMALLOC
+ NAMES tcmalloc
+ HINTS ${Gperftools_ROOT_DIR}/lib)
+
+find_library(GPERFTOOLS_PROFILER
+ NAMES profiler
+ HINTS ${Gperftools_ROOT_DIR}/lib)
+
+find_library(GPERFTOOLS_TCMALLOC_AND_PROFILER
+ NAMES tcmalloc_and_profiler
+ HINTS ${Gperftools_ROOT_DIR}/lib)
+
+find_path(GPERFTOOLS_INCLUDE_DIR
+ NAMES gperftools/heap-profiler.h
+ HINTS ${Gperftools_ROOT_DIR}/include)
+
+set(GPERFTOOLS_LIBRARIES ${GPERFTOOLS_TCMALLOC_AND_PROFILER})
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+ Gperftools
+ DEFAULT_MSG
+ GPERFTOOLS_LIBRARIES
+ GPERFTOOLS_INCLUDE_DIR)
+
+mark_as_advanced(
+ Gperftools_ROOT_DIR
+ GPERFTOOLS_TCMALLOC
+ GPERFTOOLS_PROFILER
+ GPERFTOOLS_TCMALLOC_AND_PROFILER
+ GPERFTOOLS_LIBRARIES
+ GPERFTOOLS_INCLUDE_DIR) \ No newline at end of file
diff --git a/src/cmake/macros/FindMySQL.cmake b/src/cmake/macros/FindMySQL.cmake
new file mode 100644
index 0000000000..4f432ca4c8
--- /dev/null
+++ b/src/cmake/macros/FindMySQL.cmake
@@ -0,0 +1,184 @@
+#
+# Find the MySQL client includes and library
+#
+
+# This module defines
+# MYSQL_INCLUDE_DIR, where to find mysql.h
+# MYSQL_LIBRARIES, the libraries to link against to connect to MySQL
+# MYSQL_FOUND, if false, you cannot build anything that requires MySQL.
+
+# also defined, but not for general use are
+# MYSQL_LIBRARY, where to find the MySQL library.
+
+set( MYSQL_FOUND 0 )
+
+if( UNIX )
+ set(MYSQL_CONFIG_PREFER_PATH "$ENV{MYSQL_HOME}/bin" CACHE FILEPATH
+ "preferred path to MySQL (mysql_config)"
+ )
+
+ find_program(MYSQL_CONFIG mysql_config
+ ${MYSQL_CONFIG_PREFER_PATH}
+ /usr/local/mysql/bin/
+ /usr/local/bin/
+ /usr/bin/
+ )
+
+ if( MYSQL_CONFIG )
+ message(STATUS "Using mysql-config: ${MYSQL_CONFIG}")
+ # set INCLUDE_DIR
+ exec_program(${MYSQL_CONFIG}
+ ARGS --include
+ OUTPUT_VARIABLE MY_TMP
+ )
+
+ string(REGEX REPLACE "-I([^ ]*)( .*)?" "\\1" MY_TMP "${MY_TMP}")
+ set(MYSQL_ADD_INCLUDE_PATH ${MY_TMP} CACHE FILEPATH INTERNAL)
+ #message("[DEBUG] MYSQL ADD_INCLUDE_PATH : ${MYSQL_ADD_INCLUDE_PATH}")
+ # set LIBRARY_DIR
+ exec_program(${MYSQL_CONFIG}
+ ARGS --libs_r
+ OUTPUT_VARIABLE MY_TMP
+ )
+ set(MYSQL_ADD_LIBRARIES "")
+ string(REGEX MATCHALL "-l[^ ]*" MYSQL_LIB_LIST "${MY_TMP}")
+ foreach(LIB ${MYSQL_LIB_LIST})
+ string(REGEX REPLACE "[ ]*-l([^ ]*)" "\\1" LIB "${LIB}")
+ list(APPEND MYSQL_ADD_LIBRARIES "${LIB}")
+ #message("[DEBUG] MYSQL ADD_LIBRARIES : ${MYSQL_ADD_LIBRARIES}")
+ endforeach(LIB ${MYSQL_LIB_LIST})
+
+ set(MYSQL_ADD_LIBRARIES_PATH "")
+ string(REGEX MATCHALL "-L[^ ]*" MYSQL_LIBDIR_LIST "${MY_TMP}")
+ foreach(LIB ${MYSQL_LIBDIR_LIST})
+ string(REGEX REPLACE "[ ]*-L([^ ]*)" "\\1" LIB "${LIB}")
+ list(APPEND MYSQL_ADD_LIBRARIES_PATH "${LIB}")
+ #message("[DEBUG] MYSQL ADD_LIBRARIES_PATH : ${MYSQL_ADD_LIBRARIES_PATH}")
+ endforeach(LIB ${MYSQL_LIBS})
+
+ else( MYSQL_CONFIG )
+ set(MYSQL_ADD_LIBRARIES "")
+ list(APPEND MYSQL_ADD_LIBRARIES "mysqlclient_r")
+ endif( MYSQL_CONFIG )
+endif( UNIX )
+
+find_path(MYSQL_INCLUDE_DIR
+ NAMES
+ mysql.h
+ PATHS
+ ${MYSQL_ADD_INCLUDE_PATH}
+ /usr/include
+ /usr/include/mysql
+ /usr/local/include
+ /usr/local/include/mysql
+ /usr/local/mysql/include
+ "C:/Program Files/MySQL/MySQL Server 5.7/include"
+ "C:/Program Files/MySQL/MySQL Server 5.6/include"
+ "C:/Program Files/MySQL/MySQL Server 5.5/include"
+ "C:/Program Files/MySQL/MySQL Server 5.1/include"
+ "C:/Program Files/MySQL/MySQL Server 5.0/include"
+ "C:/Program Files/MySQL/include"
+ "C:/MySQL/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/include"
+ "$ENV{ProgramFiles}/MySQL/*/include"
+ "$ENV{SystemDrive}/MySQL/*/include"
+ "c:/msys/local/include"
+ DOC
+ "Specify the directory containing mysql.h."
+)
+
+if( UNIX )
+ foreach(LIB ${MYSQL_ADD_LIBRARIES})
+ find_library( MYSQL_LIBRARY
+ NAMES
+ mysql libmysql ${LIB}
+ PATHS
+ ${MYSQL_ADD_LIBRARIES_PATH}
+ /usr/lib
+ /usr/lib/mysql
+ /usr/local/lib
+ /usr/local/lib/mysql
+ /usr/local/mysql/lib
+ DOC "Specify the location of the mysql library here."
+ )
+ endforeach(LIB ${MYSQL_ADD_LIBRARY})
+endif( UNIX )
+
+if( WIN32 )
+ find_library( MYSQL_LIBRARY
+ NAMES
+ libmysql
+ PATHS
+ ${MYSQL_ADD_LIBRARIES_PATH}
+ "C:/Program Files/MySQL/MySQL Server 5.7/lib/opt"
+ "C:/Program Files/MySQL/MySQL Server 5.6/lib/opt"
+ "C:/Program Files/MySQL/MySQL Server 5.5/lib/opt"
+ "C:/Program Files/MySQL/MySQL Server 5.1/lib/opt"
+ "C:/Program Files/MySQL/MySQL Server 5.0/lib/opt"
+ "C:/Program Files/MySQL/lib"
+ "C:/MySQL/lib/debug"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
+ "$ENV{ProgramFiles}/MySQL/*/lib/opt"
+ "$ENV{SystemDrive}/MySQL/*/lib/opt"
+ "c:/msys/local/include"
+ DOC "Specify the location of the mysql library here."
+ )
+endif( WIN32 )
+
+# On Windows you typically don't need to include any extra libraries
+# to build MYSQL stuff.
+
+if( NOT WIN32 )
+ find_library( MYSQL_EXTRA_LIBRARIES
+ NAMES
+ z zlib
+ PATHS
+ /usr/lib
+ /usr/local/lib
+ DOC
+ "if more libraries are necessary to link in a MySQL client (typically zlib), specify them here."
+ )
+else( NOT WIN32 )
+ set( MYSQL_EXTRA_LIBRARIES "" )
+endif( NOT WIN32 )
+
+if( MYSQL_LIBRARY )
+ if( MYSQL_INCLUDE_DIR )
+ set( MYSQL_FOUND 1 )
+ message(STATUS "Found MySQL library: ${MYSQL_LIBRARY}")
+ message(STATUS "Found MySQL headers: ${MYSQL_INCLUDE_DIR}")
+ else( MYSQL_INCLUDE_DIR )
+ message(FATAL_ERROR "Could not find MySQL headers! Please install the development libraries and headers")
+ endif( MYSQL_INCLUDE_DIR )
+ mark_as_advanced( MYSQL_FOUND MYSQL_LIBRARY MYSQL_EXTRA_LIBRARIES MYSQL_INCLUDE_DIR )
+else( MYSQL_LIBRARY )
+ message(FATAL_ERROR "Could not find the MySQL libraries! Please install the development libraries and headers")
+endif( MYSQL_LIBRARY )
diff --git a/src/cmake/macros/FindOpenSSL.cmake b/src/cmake/macros/FindOpenSSL.cmake
new file mode 100644
index 0000000000..245a91d419
--- /dev/null
+++ b/src/cmake/macros/FindOpenSSL.cmake
@@ -0,0 +1,180 @@
+# - Try to find the OpenSSL encryption library
+# Once done this will define
+#
+# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL
+#
+# Read-Only variables:
+# OPENSSL_FOUND - system has the OpenSSL library
+# OPENSSL_INCLUDE_DIR - the OpenSSL include directory
+# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL
+
+#=============================================================================
+# Copyright 2006-2009 Kitware, Inc.
+# Copyright 2006 Alexander Neundorf <neundorf@kde.org>
+# Copyright 2009-2010 Mathieu Malaterre <mathieu.malaterre@gmail.com>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distributed this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+# http://www.slproweb.com/products/Win32OpenSSL.html
+
+SET(_OPENSSL_ROOT_HINTS
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]"
+ )
+
+IF(PLATFORM EQUAL 64)
+ SET(_OPENSSL_ROOT_PATHS
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;InstallLocation]"
+ "C:/OpenSSL-Win64/"
+ "C:/OpenSSL/"
+ )
+ELSE()
+ SET(_OPENSSL_ROOT_PATHS
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;InstallLocation]"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;InstallLocation]"
+ "C:/OpenSSL/"
+ )
+ENDIF()
+
+FIND_PATH(OPENSSL_ROOT_DIR
+ NAMES
+ include/openssl/ssl.h
+ HINTS
+ ${_OPENSSL_ROOT_HINTS}
+ PATHS
+ ${_OPENSSL_ROOT_PATHS}
+)
+MARK_AS_ADVANCED(OPENSSL_ROOT_DIR)
+
+# Re-use the previous path:
+FIND_PATH(OPENSSL_INCLUDE_DIR openssl/ssl.h
+ ${OPENSSL_ROOT_DIR}/include
+)
+
+IF(WIN32 AND NOT CYGWIN)
+ # MINGW should go here too
+ IF(MSVC)
+ # /MD and /MDd are the standard values - if someone wants to use
+ # others, the libnames have to change here too
+ # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b
+ # TODO: handle /MT and static lib
+ # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix:
+ # * MD for dynamic-release
+ # * MDd for dynamic-debug
+ # * MT for static-release
+ # * MTd for static-debug
+
+ # Implementation details:
+ # We are using the libraries located in the VC subdir instead of the parent directory eventhough :
+ # libeay32MD.lib is identical to ../libeay32.lib, and
+ # ssleay32MD.lib is identical to ../ssleay32.lib
+
+ FIND_LIBRARY(LIB_EAY_DEBUG
+ NAMES
+ libeay32MDd libeay32
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib/VC
+ )
+
+ FIND_LIBRARY(LIB_EAY_RELEASE
+ NAMES
+ libeay32MD libeay32
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib/VC
+ )
+
+ FIND_LIBRARY(SSL_EAY_DEBUG
+ NAMES
+ ssleay32MDd ssleay32 ssl
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib/VC
+ )
+
+ FIND_LIBRARY(SSL_EAY_RELEASE
+ NAMES
+ ssleay32MD ssleay32 ssl
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib/VC
+ )
+
+ if( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )
+ set( OPENSSL_LIBRARIES
+ optimized ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE}
+ debug ${SSL_EAY_DEBUG} ${LIB_EAY_DEBUG}
+ )
+ else()
+ set( OPENSSL_LIBRARIES
+ ${SSL_EAY_RELEASE}
+ ${LIB_EAY_RELEASE}
+ )
+ endif()
+
+ MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE LIB_EAY_DEBUG LIB_EAY_RELEASE)
+ ELSEIF(MINGW)
+
+ # same player, for MingW
+ FIND_LIBRARY(LIB_EAY
+ NAMES
+ libeay32
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib/MinGW
+ )
+
+ FIND_LIBRARY(SSL_EAY NAMES
+ NAMES
+ ssleay32
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib/MinGW
+ )
+
+ MARK_AS_ADVANCED(SSL_EAY LIB_EAY)
+
+ set( OPENSSL_LIBRARIES
+ ${SSL_EAY}
+ ${LIB_EAY}
+ )
+ ELSE(MSVC)
+ # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues:
+ FIND_LIBRARY(LIB_EAY
+ NAMES
+ libeay32
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib
+ ${OPENSSL_ROOT_DIR}/lib/VC
+ )
+
+ FIND_LIBRARY(SSL_EAY
+ NAMES
+ ssleay32
+ PATHS
+ ${OPENSSL_ROOT_DIR}/lib
+ ${OPENSSL_ROOT_DIR}/lib/VC
+ )
+ MARK_AS_ADVANCED(SSL_EAY LIB_EAY)
+
+ SET( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
+ ENDIF(MSVC)
+ELSE(WIN32 AND NOT CYGWIN)
+ FIND_LIBRARY(OPENSSL_SSL_LIBRARIES NAMES ssl ssleay32 ssleay32MD)
+ FIND_LIBRARY(OPENSSL_CRYPTO_LIBRARIES NAMES crypto)
+ MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARIES OPENSSL_SSL_LIBRARIES)
+
+ SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARIES} ${OPENSSL_CRYPTO_LIBRARIES})
+
+ENDIF(WIN32 AND NOT CYGWIN)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(OpenSSL DEFAULT_MSG
+ OPENSSL_LIBRARIES
+ OPENSSL_INCLUDE_DIR
+)
+
+MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES)
diff --git a/src/cmake/macros/FindPCHSupport.cmake b/src/cmake/macros/FindPCHSupport.cmake
new file mode 100644
index 0000000000..b068b69c26
--- /dev/null
+++ b/src/cmake/macros/FindPCHSupport.cmake
@@ -0,0 +1,104 @@
+FUNCTION(GET_COMMON_PCH_PARAMS PCH_HEADER PCH_FE INCLUDE_PREFIX)
+ GET_FILENAME_COMPONENT(PCH_HEADER_N ${PCH_HEADER} NAME)
+ GET_DIRECTORY_PROPERTY(TARGET_INCLUDES INCLUDE_DIRECTORIES)
+
+ FOREACH(ITEM ${TARGET_INCLUDES})
+ LIST(APPEND INCLUDE_FLAGS_LIST "${INCLUDE_PREFIX}\"${ITEM}\" ")
+ ENDFOREACH(ITEM)
+
+ SET(PCH_HEADER_NAME ${PCH_HEADER_N} PARENT_SCOPE)
+ SET(PCH_HEADER_OUT ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_N}.${PCH_FE} PARENT_SCOPE)
+ SET(INCLUDE_FLAGS ${INCLUDE_FLAGS_LIST} PARENT_SCOPE)
+ENDFUNCTION(GET_COMMON_PCH_PARAMS)
+
+FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME INCLUDE_FLAGS IN PCH_SRC OUT)
+ IF (CMAKE_BUILD_TYPE)
+ STRING(TOUPPER _${CMAKE_BUILD_TYPE} CURRENT_BUILD_TYPE)
+ ENDIF ()
+
+ SET(COMPILE_FLAGS ${CMAKE_CXX_FLAGS${CURRENT_BUILD_TYPE}})
+ LIST(APPEND COMPILE_FLAGS ${CMAKE_CXX_FLAGS})
+
+ IF ("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin")
+ IF (NOT "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "")
+ LIST(APPEND COMPILE_FLAGS "-arch ${CMAKE_OSX_ARCHITECTURES}")
+ ENDIF ()
+ IF (NOT "${CMAKE_OSX_SYSROOT}" STREQUAL "")
+ LIST(APPEND COMPILE_FLAGS "-isysroot ${CMAKE_OSX_SYSROOT}")
+ ENDIF ()
+ IF (NOT "${CMAKE_OSX_DEPLOYMENT_TARGET}" STREQUAL "")
+ LIST(APPEND COMPILE_FLAGS "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
+ ENDIF ()
+ ENDIF ()
+
+ GET_DIRECTORY_PROPERTY(TARGET_DEFINITIONS COMPILE_DEFINITIONS)
+ FOREACH(ITEM ${TARGET_DEFINITIONS})
+ LIST(APPEND DEFINITION_FLAGS "-D${ITEM} ")
+ ENDFOREACH(ITEM)
+
+ SEPARATE_ARGUMENTS(COMPILE_FLAGS)
+ SEPARATE_ARGUMENTS(INCLUDE_FLAGS)
+ SEPARATE_ARGUMENTS(DEFINITION_FLAGS)
+
+ GET_FILENAME_COMPONENT(PCH_SRC_N ${PCH_SRC} NAME)
+ ADD_LIBRARY(${PCH_SRC_N}_dephelp MODULE ${PCH_SRC})
+
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${OUT}
+ COMMAND ${CMAKE_CXX_COMPILER}
+ ARGS ${DEFINITION_FLAGS} ${COMPILE_FLAGS} ${INCLUDE_FLAGS} -x c++-header ${IN} -o ${OUT}
+ DEPENDS ${IN} ${PCH_SRC_N}_dephelp
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+
+ ADD_CUSTOM_TARGET(generate_${PCH_SRC_N}
+ DEPENDS ${OUT}
+ )
+
+ ADD_DEPENDENCIES(${TARGET_NAME} generate_${PCH_SRC_N})
+ENDFUNCTION(GENERATE_CXX_PCH_COMMAND)
+
+FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME PCH_HEADER PCH_SOURCE)
+ GET_COMMON_PCH_PARAMS(${PCH_HEADER} "gch" "-I")
+ GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT})
+ SET_TARGET_PROPERTIES(
+ ${TARGET_NAME} PROPERTIES
+ COMPILE_FLAGS "-include ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_NAME}"
+ )
+ENDFUNCTION(ADD_CXX_PCH_GCC)
+
+FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME PCH_HEADER PCH_SOURCE)
+ GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "-I")
+ GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT})
+ SET_TARGET_PROPERTIES(
+ ${TARGET_NAME} PROPERTIES
+ COMPILE_FLAGS "-include-pch ${PCH_HEADER_OUT}"
+ )
+ENDFUNCTION(ADD_CXX_PCH_CLANG)
+
+FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME PCH_HEADER PCH_SOURCE)
+ GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "/I")
+ SET_TARGET_PROPERTIES(
+ ${TARGET_NAME} PROPERTIES
+ COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}"
+ )
+ SET_SOURCE_FILES_PROPERTIES(
+ ${PCH_SOURCE} PROPERTIES
+ COMPILE_FLAGS "/Yc${PCH_HEADER_NAME}"
+ )
+ENDFUNCTION(ADD_CXX_PCH_MSVC)
+
+FUNCTION(ADD_CXX_PCH TARGET_NAME PCH_HEADER PCH_SOURCE)
+ IF (MSVC)
+ ADD_CXX_PCH_MSVC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE})
+ ELSEIF ("${CMAKE_GENERATOR}" MATCHES "Xcode")
+ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+ XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER YES
+ XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/${PCH_HEADER}"
+ )
+ ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
+ ADD_CXX_PCH_CLANG(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE})
+ ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
+ ADD_CXX_PCH_GCC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE})
+ ENDIF ()
+ENDFUNCTION(ADD_CXX_PCH)
diff --git a/src/cmake/macros/FindReadline.cmake b/src/cmake/macros/FindReadline.cmake
new file mode 100644
index 0000000000..07c6b368df
--- /dev/null
+++ b/src/cmake/macros/FindReadline.cmake
@@ -0,0 +1,18 @@
+# find Readline (terminal input library) includes and library
+#
+# READLINE_INCLUDE_DIR - where the directory containing the READLINE headers can be found
+# READLINE_LIBRARY - full path to the READLINE library
+# READLINE_FOUND - TRUE if READLINE was found
+
+FIND_PATH(READLINE_INCLUDE_DIR readline/readline.h)
+FIND_LIBRARY(READLINE_LIBRARY NAMES readline)
+
+IF (READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
+ SET(READLINE_FOUND TRUE)
+ MESSAGE(STATUS "Found Readline library: ${READLINE_LIBRARY}")
+ MESSAGE(STATUS "Include dir is: ${READLINE_INCLUDE_DIR}")
+ INCLUDE_DIRECTORIES(${READLINE_INCLUDE_DIR})
+ELSE (READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
+ SET(READLINE_FOUND FALSE)
+ MESSAGE(FATAL_ERROR "** Readline library not found!\n** Your distro may provide a binary for Readline e.g. for ubuntu try apt-get install libreadline5-dev")
+ENDIF (READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
diff --git a/src/cmake/platform/after_platform.cmake b/src/cmake/platform/after_platform.cmake
new file mode 100644
index 0000000000..bf02e719d8
--- /dev/null
+++ b/src/cmake/platform/after_platform.cmake
@@ -0,0 +1,4 @@
+if( NOT CONF_DIR )
+ set(CONF_DIR ${CMAKE_INSTALL_PREFIX})
+ message(STATUS "Using installation path for configuration files")
+endif()
diff --git a/src/cmake/platform/cmake_uninstall.in.cmake b/src/cmake/platform/cmake_uninstall.in.cmake
new file mode 100644
index 0000000000..06f9c8263a
--- /dev/null
+++ b/src/cmake/platform/cmake_uninstall.in.cmake
@@ -0,0 +1,23 @@
+# from cmake wiki
+IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+ MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
+ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+
+FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
+STRING(REGEX REPLACE "\n" ";" files "${files}")
+FOREACH(file ${files})
+ MESSAGE(STATUS "Uninstalling \"${file}\"")
+ IF(EXISTS "${file}")
+ EXEC_PROGRAM(
+ "@CMAKE_COMMAND@" ARGS "-E remove \"${file}\""
+ OUTPUT_VARIABLE rm_out
+ RETURN_VALUE rm_retval
+ )
+ IF("${rm_retval}" STREQUAL 0)
+ ELSE("${rm_retval}" STREQUAL 0)
+ MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"")
+ ENDIF("${rm_retval}" STREQUAL 0)
+ ELSE(EXISTS "${file}")
+ MESSAGE(STATUS "File \"${file}\" does not exist.")
+ ENDIF(EXISTS "${file}")
+ENDFOREACH(file)
diff --git a/src/cmake/platform/settings.cmake b/src/cmake/platform/settings.cmake
new file mode 100644
index 0000000000..6df5bc2165
--- /dev/null
+++ b/src/cmake/platform/settings.cmake
@@ -0,0 +1,5 @@
+# set installation prefix
+if( PREFIX )
+ set(CMAKE_INSTALL_PREFIX "${PREFIX}")
+endif()
+
diff --git a/src/cmake/platform/unix/settings.cmake b/src/cmake/platform/unix/settings.cmake
new file mode 100644
index 0000000000..34ac006d66
--- /dev/null
+++ b/src/cmake/platform/unix/settings.cmake
@@ -0,0 +1,44 @@
+# Package overloads - Linux
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ if (NOT NOJEM)
+ set(JEMALLOC_LIBRARY "jemalloc")
+ message(STATUS "UNIX: Using jemalloc")
+ endif()
+endif()
+
+# set default configuration directory
+if( NOT CONF_DIR )
+ set(CONF_DIR ${CMAKE_INSTALL_PREFIX}/etc)
+ message(STATUS "UNIX: Using default configuration directory")
+endif()
+
+# set default library directory
+if( NOT LIBSDIR )
+ set(LIBSDIR ${CMAKE_INSTALL_PREFIX}/lib)
+ message(STATUS "UNIX: Using default library directory")
+endif()
+
+# configure uninstaller
+configure_file(
+ "${CMAKE_SOURCE_DIR}/src/cmake/platform/cmake_uninstall.in.cmake"
+ "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake"
+ @ONLY
+)
+message(STATUS "UNIX: Configuring uninstall target")
+
+# create uninstaller target (allows for using "make uninstall")
+add_custom_target(uninstall
+ "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake"
+)
+message(STATUS "UNIX: Created uninstall target")
+
+message(STATUS "UNIX: Detected compiler: ${CMAKE_C_COMPILER}")
+if(CMAKE_C_COMPILER MATCHES "gcc" OR CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ include(${CMAKE_SOURCE_DIR}/src/cmake/compiler/gcc/settings.cmake)
+elseif(CMAKE_C_COMPILER MATCHES "icc")
+ include(${CMAKE_SOURCE_DIR}/src/cmake/compiler/icc/settings.cmake)
+elseif(CMAKE_C_COMPILER MATCHES "clang" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
+ include(${CMAKE_SOURCE_DIR}/src/cmake/compiler/clang/settings.cmake)
+else()
+add_definitions(-D_BUILD_DIRECTIVE='"${CMAKE_BUILD_TYPE}"')
+endif()
diff --git a/src/cmake/platform/win/settings.cmake b/src/cmake/platform/win/settings.cmake
new file mode 100644
index 0000000000..78aa97b0b0
--- /dev/null
+++ b/src/cmake/platform/win/settings.cmake
@@ -0,0 +1,32 @@
+# Platform-specfic options
+option(USE_MYSQL_SOURCES "Use included MySQL-sources to build libraries" 0)
+
+# Package overloads
+set(ACE_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/deps/acelite)
+set(ACE_LIBRARY "ace")
+set(BZIP2_LIBRARIES "bzip2")
+set(ZLIB_LIBRARIES "zlib")
+
+if( USE_MYSQL_SOURCES )
+ set(MYSQL_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/deps/mysqllite/include)
+ set(MYSQL_LIBRARY "libmysql")
+ set( MYSQL_FOUND 1 )
+ message(STATUS "Using supplied MySQL sources")
+endif()
+
+# check the CMake preload parameters (commented out by default)
+
+# overload CMAKE_INSTALL_PREFIX if not being set properly
+#if( WIN32 )
+# if( NOT CYGWIN )
+# if( NOT CMAKE_INSTALL_PREFIX )
+# set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/bin")
+# endif()
+# endif()
+#endif()
+
+if ( MSVC )
+ include(${CMAKE_SOURCE_DIR}/src/cmake/compiler/msvc/settings.cmake)
+elseif ( MINGW )
+ include(${CMAKE_SOURCE_DIR}/src/cmake/compiler/mingw/settings.cmake)
+endif()
diff --git a/src/common/AutoPtr.h b/src/common/AutoPtr.h
new file mode 100644
index 0000000000..508056d489
--- /dev/null
+++ b/src/common/AutoPtr.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _TRINITY_AUTO_PTR_H
+#define _TRINITY_AUTO_PTR_H
+
+#include <ace/Bound_Ptr.h>
+
+namespace Trinity
+{
+
+template <class Pointer, class Lock>
+class AutoPtr : public ACE_Strong_Bound_Ptr<Pointer, Lock>
+{
+ typedef ACE_Strong_Bound_Ptr<Pointer, Lock> Base;
+
+public:
+ AutoPtr()
+ : Base()
+ { }
+
+ AutoPtr(Pointer* x)
+ : Base(x)
+ { }
+
+ operator bool() const
+ {
+ return !Base::null();
+ }
+
+ bool operator !() const
+ {
+ return Base::null();
+ }
+};
+
+} // namespace Trinity
+
+#endif
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
new file mode 100644
index 0000000000..9a44d33028
--- /dev/null
+++ b/src/common/CMakeLists.txt
@@ -0,0 +1,95 @@
+# Copyright (C)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+if( USE_COREPCH )
+ include_directories(${CMAKE_CURRENT_BINARY_DIR})
+endif()
+
+file(GLOB_RECURSE sources_Configuration Configuration/*.cpp Configuration/*.h)
+file(GLOB_RECURSE sources_Cryptography Cryptography/*.cpp Cryptography/*.h)
+file(GLOB_RECURSE sources_Database Database/*.cpp Database/*.h)
+file(GLOB_RECURSE sources_DataStores DataStores/*.cpp DataStores/*.h)
+file(GLOB_RECURSE sources_Dynamic Dynamic/*.cpp Dynamic/*.h)
+file(GLOB_RECURSE sources_Logging Logging/*.cpp Logging/*.h)
+file(GLOB_RECURSE sources_Packets Packets/*.cpp Packets/*.h)
+file(GLOB_RECURSE sources_Threading Threading/*.cpp Threading/*.h)
+file(GLOB_RECURSE sources_Utilities Utilities/*.cpp Utilities/*.h)
+
+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 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)
+
+#
+# Build shared sourcelist
+#
+
+if (USE_COREPCH)
+ set(shared_STAT_PCH_HDR PrecompiledHeaders/sharedPCH.h)
+ set(shared_STAT_PCH_SRC PrecompiledHeaders/sharedPCH.cpp)
+endif()
+
+set(shared_STAT_SRCS
+ ${shared_STAT_SRCS}
+ ${sources_Configuration}
+ ${sources_Cryptography}
+ ${sources_Database}
+ ${sources_DataStores}
+ ${sources_Debugging}
+ ${sources_Dynamic}
+ ${sources_Logging}
+ ${sources_Packets}
+ ${sources_Threading}
+ ${sources_Utilities}
+ ${sources_localdir}
+ Debugging/Errors.h
+)
+
+include_directories(
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour
+ ${CMAKE_SOURCE_DIR}/deps/SFMT
+ ${CMAKE_SOURCE_DIR}/deps/sockets/include
+ ${CMAKE_SOURCE_DIR}/deps/utf8cpp
+ ${CMAKE_SOURCE_DIR}/src
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/Configuration
+ ${CMAKE_CURRENT_SOURCE_DIR}/Cryptography
+ ${CMAKE_CURRENT_SOURCE_DIR}/Database
+ ${CMAKE_CURRENT_SOURCE_DIR}/DataStores
+ ${CMAKE_CURRENT_SOURCE_DIR}/Debugging
+ ${CMAKE_CURRENT_SOURCE_DIR}/Dynamic
+ ${CMAKE_CURRENT_SOURCE_DIR}/Logging
+ ${CMAKE_CURRENT_SOURCE_DIR}/Packets
+ ${CMAKE_CURRENT_SOURCE_DIR}/Threading
+ ${CMAKE_CURRENT_SOURCE_DIR}/Utilities
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object
+ ${ACE_INCLUDE_DIR}
+ ${MYSQL_INCLUDE_DIR}
+ ${OPENSSL_INCLUDE_DIR}
+)
+
+add_library(shared STATIC
+ ${shared_STAT_SRCS}
+ ${shared_STAT_PCH_SRC}
+)
+
+target_link_libraries(shared
+ ${ACE_LIBRARY}
+)
+
+# Generate precompiled header
+if (USE_COREPCH)
+ add_cxx_pch(shared ${shared_STAT_PCH_HDR} ${shared_STAT_PCH_SRC})
+endif ()
+
+add_subdirectory(Collision) \ No newline at end of file
diff --git a/src/common/Collision/BoundingIntervalHierarchy.cpp b/src/common/Collision/BoundingIntervalHierarchy.cpp
new file mode 100644
index 0000000000..fde804a303
--- /dev/null
+++ b/src/common/Collision/BoundingIntervalHierarchy.cpp
@@ -0,0 +1,298 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "BoundingIntervalHierarchy.h"
+
+#ifdef _MSC_VER
+ #define isnan _isnan
+#else
+ #define isnan std::isnan
+#endif
+
+void BIH::buildHierarchy(std::vector<uint32> &tempTree, buildData &dat, BuildStats &stats)
+{
+ // create space for the first node
+ tempTree.push_back(uint32(3 << 30)); // dummy leaf
+ tempTree.insert(tempTree.end(), 2, 0);
+ //tempTree.add(0);
+
+ // seed bbox
+ AABound gridBox = { bounds.low(), bounds.high() };
+ AABound nodeBox = gridBox;
+ // seed subdivide function
+ subdivide(0, dat.numPrims - 1, tempTree, dat, gridBox, nodeBox, 0, 1, stats);
+}
+
+void BIH::subdivide(int left, int right, std::vector<uint32> &tempTree, buildData &dat, AABound &gridBox, AABound &nodeBox, int nodeIndex, int depth, BuildStats &stats)
+{
+ if ((right - left + 1) <= dat.maxPrims || depth >= MAX_STACK_SIZE)
+ {
+ // write leaf node
+ stats.updateLeaf(depth, right - left + 1);
+ createNode(tempTree, nodeIndex, left, right);
+ return;
+ }
+ // calculate extents
+ int axis = -1, prevAxis, rightOrig;
+ float clipL = G3D::fnan(), clipR = G3D::fnan(), prevClip = G3D::fnan();
+ float split = G3D::fnan(), prevSplit;
+ bool wasLeft = true;
+ while (true)
+ {
+ prevAxis = axis;
+ prevSplit = split;
+ // perform quick consistency checks
+ G3D::Vector3 d( gridBox.hi - gridBox.lo );
+ if (d.x < 0 || d.y < 0 || d.z < 0)
+ throw std::logic_error("negative node extents");
+ for (int i = 0; i < 3; i++)
+ {
+ if (nodeBox.hi[i] < gridBox.lo[i] || nodeBox.lo[i] > gridBox.hi[i])
+ {
+ //UI.printError(Module.ACCEL, "Reached tree area in error - discarding node with: %d objects", right - left + 1);
+ throw std::logic_error("invalid node overlap");
+ }
+ }
+ // find longest axis
+ axis = d.primaryAxis();
+ split = 0.5f * (gridBox.lo[axis] + gridBox.hi[axis]);
+ // partition L/R subsets
+ clipL = -G3D::inf();
+ clipR = G3D::inf();
+ rightOrig = right; // save this for later
+ float nodeL = G3D::inf();
+ float nodeR = -G3D::inf();
+ for (int i = left; i <= right;)
+ {
+ int obj = dat.indices[i];
+ float minb = dat.primBound[obj].low()[axis];
+ float maxb = dat.primBound[obj].high()[axis];
+ float center = (minb + maxb) * 0.5f;
+ if (center <= split)
+ {
+ // stay left
+ i++;
+ if (clipL < maxb)
+ clipL = maxb;
+ }
+ else
+ {
+ // move to the right most
+ int t = dat.indices[i];
+ dat.indices[i] = dat.indices[right];
+ dat.indices[right] = t;
+ right--;
+ if (clipR > minb)
+ clipR = minb;
+ }
+ nodeL = std::min(nodeL, minb);
+ nodeR = std::max(nodeR, maxb);
+ }
+ // check for empty space
+ if (nodeL > nodeBox.lo[axis] && nodeR < nodeBox.hi[axis])
+ {
+ float nodeBoxW = nodeBox.hi[axis] - nodeBox.lo[axis];
+ float nodeNewW = nodeR - nodeL;
+ // node box is too big compare to space occupied by primitives?
+ if (1.3f * nodeNewW < nodeBoxW)
+ {
+ stats.updateBVH2();
+ int nextIndex = tempTree.size();
+ // allocate child
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ // write bvh2 clip node
+ stats.updateInner();
+ tempTree[nodeIndex + 0] = (axis << 30) | (1 << 29) | nextIndex;
+ tempTree[nodeIndex + 1] = floatToRawIntBits(nodeL);
+ tempTree[nodeIndex + 2] = floatToRawIntBits(nodeR);
+ // update nodebox and recurse
+ nodeBox.lo[axis] = nodeL;
+ nodeBox.hi[axis] = nodeR;
+ subdivide(left, rightOrig, tempTree, dat, gridBox, nodeBox, nextIndex, depth + 1, stats);
+ return;
+ }
+ }
+ // ensure we are making progress in the subdivision
+ if (right == rightOrig)
+ {
+ // all left
+ if (prevAxis == axis && G3D::fuzzyEq(prevSplit, split)) {
+ // we are stuck here - create a leaf
+ stats.updateLeaf(depth, right - left + 1);
+ createNode(tempTree, nodeIndex, left, right);
+ return;
+ }
+ if (clipL <= split) {
+ // keep looping on left half
+ gridBox.hi[axis] = split;
+ prevClip = clipL;
+ wasLeft = true;
+ continue;
+ }
+ gridBox.hi[axis] = split;
+ prevClip = G3D::fnan();
+ }
+ else if (left > right)
+ {
+ // all right
+ if (prevAxis == axis && G3D::fuzzyEq(prevSplit, split)) {
+ // we are stuck here - create a leaf
+ stats.updateLeaf(depth, right - left + 1);
+ createNode(tempTree, nodeIndex, left, right);
+ return;
+ }
+ right = rightOrig;
+ if (clipR >= split) {
+ // keep looping on right half
+ gridBox.lo[axis] = split;
+ prevClip = clipR;
+ wasLeft = false;
+ continue;
+ }
+ gridBox.lo[axis] = split;
+ prevClip = G3D::fnan();
+ }
+ else
+ {
+ // we are actually splitting stuff
+ if (prevAxis != -1 && !isnan(prevClip))
+ {
+ // second time through - lets create the previous split
+ // since it produced empty space
+ int nextIndex = tempTree.size();
+ // allocate child node
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ if (wasLeft) {
+ // create a node with a left child
+ // write leaf node
+ stats.updateInner();
+ tempTree[nodeIndex + 0] = (prevAxis << 30) | nextIndex;
+ tempTree[nodeIndex + 1] = floatToRawIntBits(prevClip);
+ tempTree[nodeIndex + 2] = floatToRawIntBits(G3D::inf());
+ } else {
+ // create a node with a right child
+ // write leaf node
+ stats.updateInner();
+ tempTree[nodeIndex + 0] = (prevAxis << 30) | (nextIndex - 3);
+ tempTree[nodeIndex + 1] = floatToRawIntBits(-G3D::inf());
+ tempTree[nodeIndex + 2] = floatToRawIntBits(prevClip);
+ }
+ // count stats for the unused leaf
+ depth++;
+ stats.updateLeaf(depth, 0);
+ // now we keep going as we are, with a new nodeIndex:
+ nodeIndex = nextIndex;
+ }
+ break;
+ }
+ }
+ // compute index of child nodes
+ int nextIndex = tempTree.size();
+ // allocate left node
+ int nl = right - left + 1;
+ int nr = rightOrig - (right + 1) + 1;
+ if (nl > 0) {
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ } else
+ nextIndex -= 3;
+ // allocate right node
+ if (nr > 0) {
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ tempTree.push_back(0);
+ }
+ // write leaf node
+ stats.updateInner();
+ tempTree[nodeIndex + 0] = (axis << 30) | nextIndex;
+ tempTree[nodeIndex + 1] = floatToRawIntBits(clipL);
+ tempTree[nodeIndex + 2] = floatToRawIntBits(clipR);
+ // prepare L/R child boxes
+ AABound gridBoxL(gridBox), gridBoxR(gridBox);
+ AABound nodeBoxL(nodeBox), nodeBoxR(nodeBox);
+ gridBoxL.hi[axis] = gridBoxR.lo[axis] = split;
+ nodeBoxL.hi[axis] = clipL;
+ nodeBoxR.lo[axis] = clipR;
+ // recurse
+ if (nl > 0)
+ subdivide(left, right, tempTree, dat, gridBoxL, nodeBoxL, nextIndex, depth + 1, stats);
+ else
+ stats.updateLeaf(depth + 1, 0);
+ if (nr > 0)
+ subdivide(right + 1, rightOrig, tempTree, dat, gridBoxR, nodeBoxR, nextIndex + 3, depth + 1, stats);
+ else
+ stats.updateLeaf(depth + 1, 0);
+}
+
+bool BIH::writeToFile(FILE* wf) const
+{
+ uint32 treeSize = tree.size();
+ uint32 check=0, count;
+ check += fwrite(&bounds.low(), sizeof(float), 3, wf);
+ check += fwrite(&bounds.high(), sizeof(float), 3, wf);
+ check += fwrite(&treeSize, sizeof(uint32), 1, wf);
+ check += fwrite(&tree[0], sizeof(uint32), treeSize, wf);
+ count = objects.size();
+ check += fwrite(&count, sizeof(uint32), 1, wf);
+ check += fwrite(&objects[0], sizeof(uint32), count, wf);
+ return check == (3 + 3 + 2 + treeSize + count);
+}
+
+bool BIH::readFromFile(FILE* rf)
+{
+ uint32 treeSize;
+ G3D::Vector3 lo, hi;
+ uint32 check=0, count=0;
+ check += fread(&lo, sizeof(float), 3, rf);
+ check += fread(&hi, sizeof(float), 3, rf);
+ bounds = G3D::AABox(lo, hi);
+ check += fread(&treeSize, sizeof(uint32), 1, rf);
+ tree.resize(treeSize);
+ check += fread(&tree[0], sizeof(uint32), treeSize, rf);
+ check += fread(&count, sizeof(uint32), 1, rf);
+ objects.resize(count); // = new uint32[nObjects];
+ check += fread(&objects[0], sizeof(uint32), count, rf);
+ return uint64(check) == uint64(3 + 3 + 1 + 1 + uint64(treeSize) + uint64(count));
+}
+
+void BIH::BuildStats::updateLeaf(int depth, int n)
+{
+ numLeaves++;
+ minDepth = std::min(depth, minDepth);
+ maxDepth = std::max(depth, maxDepth);
+ sumDepth += depth;
+ minObjects = std::min(n, minObjects);
+ maxObjects = std::max(n, maxObjects);
+ sumObjects += n;
+ int nl = std::min(n, 5);
+ ++numLeavesN[nl];
+}
+
+void BIH::BuildStats::printStats()
+{
+ printf("Tree stats:\n");
+ printf(" * Nodes: %d\n", numNodes);
+ printf(" * Leaves: %d\n", numLeaves);
+ printf(" * Objects: min %d\n", minObjects);
+ printf(" avg %.2f\n", (float) sumObjects / numLeaves);
+ printf(" avg(n>0) %.2f\n", (float) sumObjects / (numLeaves - numLeavesN[0]));
+ printf(" max %d\n", maxObjects);
+ printf(" * Depth: min %d\n", minDepth);
+ printf(" avg %.2f\n", (float) sumDepth / numLeaves);
+ printf(" max %d\n", maxDepth);
+ printf(" * Leaves w/: N=0 %3d%%\n", 100 * numLeavesN[0] / numLeaves);
+ printf(" N=1 %3d%%\n", 100 * numLeavesN[1] / numLeaves);
+ printf(" N=2 %3d%%\n", 100 * numLeavesN[2] / numLeaves);
+ printf(" N=3 %3d%%\n", 100 * numLeavesN[3] / numLeaves);
+ printf(" N=4 %3d%%\n", 100 * numLeavesN[4] / numLeaves);
+ printf(" N>4 %3d%%\n", 100 * numLeavesN[5] / numLeaves);
+ printf(" * BVH2 nodes: %d (%3d%%)\n", numBVH2, 100 * numBVH2 / (numNodes + numLeaves - 2 * numBVH2));
+}
diff --git a/src/common/Collision/BoundingIntervalHierarchy.h b/src/common/Collision/BoundingIntervalHierarchy.h
new file mode 100644
index 0000000000..7b3eb5af0d
--- /dev/null
+++ b/src/common/Collision/BoundingIntervalHierarchy.h
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _BIH_H
+#define _BIH_H
+
+#include "G3D/Vector3.h"
+#include "G3D/Ray.h"
+#include "G3D/AABox.h"
+
+#include "Define.h"
+
+#include <stdexcept>
+#include <vector>
+#include <algorithm>
+#include <limits>
+#include <cmath>
+
+#define MAX_STACK_SIZE 64
+
+static inline uint32 floatToRawIntBits(float f)
+{
+ union
+ {
+ uint32 ival;
+ float fval;
+ } temp;
+ temp.fval=f;
+ return temp.ival;
+}
+
+static inline float intBitsToFloat(uint32 i)
+{
+ union
+ {
+ uint32 ival;
+ float fval;
+ } temp;
+ temp.ival=i;
+ return temp.fval;
+}
+
+struct AABound
+{
+ G3D::Vector3 lo, hi;
+};
+
+/** Bounding Interval Hierarchy Class.
+ Building and Ray-Intersection functions based on BIH from
+ Sunflow, a Java Raytracer, released under MIT/X11 License
+ http://sunflow.sourceforge.net/
+ Copyright (c) 2003-2007 Christopher Kulla
+*/
+
+class BIH
+{
+ private:
+ void init_empty()
+ {
+ tree.clear();
+ objects.clear();
+ // create space for the first node
+ tree.push_back(3u << 30u); // dummy leaf
+ tree.insert(tree.end(), 2, 0);
+ }
+ public:
+ BIH() { init_empty(); }
+ template< class BoundsFunc, class PrimArray >
+ void build(const PrimArray &primitives, BoundsFunc &getBounds, uint32 leafSize = 3, bool printStats=false)
+ {
+ if (primitives.size() == 0)
+ {
+ init_empty();
+ return;
+ }
+
+ buildData dat;
+ dat.maxPrims = leafSize;
+ dat.numPrims = primitives.size();
+ dat.indices = new uint32[dat.numPrims];
+ dat.primBound = new G3D::AABox[dat.numPrims];
+ getBounds(primitives[0], bounds);
+ for (uint32 i=0; i<dat.numPrims; ++i)
+ {
+ dat.indices[i] = i;
+ getBounds(primitives[i], dat.primBound[i]);
+ bounds.merge(dat.primBound[i]);
+ }
+ std::vector<uint32> tempTree;
+ BuildStats stats;
+ buildHierarchy(tempTree, dat, stats);
+ if (printStats)
+ stats.printStats();
+
+ objects.resize(dat.numPrims);
+ for (uint32 i=0; i<dat.numPrims; ++i)
+ objects[i] = dat.indices[i];
+ //nObjects = dat.numPrims;
+ tree = tempTree;
+ delete[] dat.primBound;
+ delete[] dat.indices;
+ }
+ uint32 primCount() const { return objects.size(); }
+
+ template<typename RayCallback>
+ void intersectRay(const G3D::Ray &r, RayCallback& intersectCallback, float &maxDist, bool stopAtFirstHit) const
+ {
+ float intervalMin = -1.f;
+ float intervalMax = -1.f;
+ G3D::Vector3 org = r.origin();
+ G3D::Vector3 dir = r.direction();
+ G3D::Vector3 invDir;
+ for (int i=0; i<3; ++i)
+ {
+ invDir[i] = 1.f / dir[i];
+ if (G3D::fuzzyNe(dir[i], 0.0f))
+ {
+ float t1 = (bounds.low()[i] - org[i]) * invDir[i];
+ float t2 = (bounds.high()[i] - org[i]) * invDir[i];
+ if (t1 > t2)
+ std::swap(t1, t2);
+ if (t1 > intervalMin)
+ intervalMin = t1;
+ if (t2 < intervalMax || intervalMax < 0.f)
+ intervalMax = t2;
+ // intervalMax can only become smaller for other axis,
+ // and intervalMin only larger respectively, so stop early
+ if (intervalMax <= 0 || intervalMin >= maxDist)
+ return;
+ }
+ }
+
+ if (intervalMin > intervalMax)
+ return;
+ intervalMin = std::max(intervalMin, 0.f);
+ intervalMax = std::min(intervalMax, maxDist);
+
+ uint32 offsetFront[3];
+ uint32 offsetBack[3];
+ uint32 offsetFront3[3];
+ uint32 offsetBack3[3];
+ // compute custom offsets from direction sign bit
+
+ for (int i=0; i<3; ++i)
+ {
+ offsetFront[i] = floatToRawIntBits(dir[i]) >> 31;
+ offsetBack[i] = offsetFront[i] ^ 1;
+ offsetFront3[i] = offsetFront[i] * 3;
+ offsetBack3[i] = offsetBack[i] * 3;
+
+ // avoid always adding 1 during the inner loop
+ ++offsetFront[i];
+ ++offsetBack[i];
+ }
+
+ StackNode stack[MAX_STACK_SIZE];
+ int stackPos = 0;
+ int node = 0;
+
+ while (true) {
+ while (true)
+ {
+ uint32 tn = tree[node];
+ uint32 axis = (tn & (3 << 30)) >> 30;
+ bool BVH2 = tn & (1 << 29);
+ int offset = tn & ~(7 << 29);
+ if (!BVH2)
+ {
+ if (axis < 3)
+ {
+ // "normal" interior node
+ float tf = (intBitsToFloat(tree[node + offsetFront[axis]]) - org[axis]) * invDir[axis];
+ float tb = (intBitsToFloat(tree[node + offsetBack[axis]]) - org[axis]) * invDir[axis];
+ // ray passes between clip zones
+ if (tf < intervalMin && tb > intervalMax)
+ break;
+ int back = offset + offsetBack3[axis];
+ node = back;
+ // ray passes through far node only
+ if (tf < intervalMin) {
+ intervalMin = (tb >= intervalMin) ? tb : intervalMin;
+ continue;
+ }
+ node = offset + offsetFront3[axis]; // front
+ // ray passes through near node only
+ if (tb > intervalMax) {
+ intervalMax = (tf <= intervalMax) ? tf : intervalMax;
+ continue;
+ }
+ // ray passes through both nodes
+ // push back node
+ stack[stackPos].node = back;
+ stack[stackPos].tnear = (tb >= intervalMin) ? tb : intervalMin;
+ stack[stackPos].tfar = intervalMax;
+ stackPos++;
+ // update ray interval for front node
+ intervalMax = (tf <= intervalMax) ? tf : intervalMax;
+ continue;
+ }
+ else
+ {
+ // leaf - test some objects
+ int n = tree[node + 1];
+ while (n > 0) {
+ bool hit = intersectCallback(r, objects[offset], maxDist, stopAtFirstHit);
+ if (stopAtFirstHit && hit) return;
+ --n;
+ ++offset;
+ }
+ break;
+ }
+ }
+ else
+ {
+ if (axis>2)
+ return; // should not happen
+ float tf = (intBitsToFloat(tree[node + offsetFront[axis]]) - org[axis]) * invDir[axis];
+ float tb = (intBitsToFloat(tree[node + offsetBack[axis]]) - org[axis]) * invDir[axis];
+ node = offset;
+ intervalMin = (tf >= intervalMin) ? tf : intervalMin;
+ intervalMax = (tb <= intervalMax) ? tb : intervalMax;
+ if (intervalMin > intervalMax)
+ break;
+ continue;
+ }
+ } // traversal loop
+ do
+ {
+ // stack is empty?
+ if (stackPos == 0)
+ return;
+ // move back up the stack
+ stackPos--;
+ intervalMin = stack[stackPos].tnear;
+ if (maxDist < intervalMin)
+ continue;
+ node = stack[stackPos].node;
+ intervalMax = stack[stackPos].tfar;
+ break;
+ } while (true);
+ }
+ }
+
+ template<typename IsectCallback>
+ void intersectPoint(const G3D::Vector3 &p, IsectCallback& intersectCallback) const
+ {
+ if (!bounds.contains(p))
+ return;
+
+ StackNode stack[MAX_STACK_SIZE];
+ int stackPos = 0;
+ int node = 0;
+
+ while (true) {
+ while (true)
+ {
+ uint32 tn = tree[node];
+ uint32 axis = (tn & (3 << 30)) >> 30;
+ bool BVH2 = tn & (1 << 29);
+ int offset = tn & ~(7 << 29);
+ if (!BVH2)
+ {
+ if (axis < 3)
+ {
+ // "normal" interior node
+ float tl = intBitsToFloat(tree[node + 1]);
+ float tr = intBitsToFloat(tree[node + 2]);
+ // point is between clip zones
+ if (tl < p[axis] && tr > p[axis])
+ break;
+ int right = offset + 3;
+ node = right;
+ // point is in right node only
+ if (tl < p[axis]) {
+ continue;
+ }
+ node = offset; // left
+ // point is in left node only
+ if (tr > p[axis]) {
+ continue;
+ }
+ // point is in both nodes
+ // push back right node
+ stack[stackPos].node = right;
+ stackPos++;
+ continue;
+ }
+ else
+ {
+ // leaf - test some objects
+ int n = tree[node + 1];
+ while (n > 0) {
+ intersectCallback(p, objects[offset]); // !!!
+ --n;
+ ++offset;
+ }
+ break;
+ }
+ }
+ else // BVH2 node (empty space cut off left and right)
+ {
+ if (axis>2)
+ return; // should not happen
+ float tl = intBitsToFloat(tree[node + 1]);
+ float tr = intBitsToFloat(tree[node + 2]);
+ node = offset;
+ if (tl > p[axis] || tr < p[axis])
+ break;
+ continue;
+ }
+ } // traversal loop
+
+ // stack is empty?
+ if (stackPos == 0)
+ return;
+ // move back up the stack
+ stackPos--;
+ node = stack[stackPos].node;
+ }
+ }
+
+ bool writeToFile(FILE* wf) const;
+ bool readFromFile(FILE* rf);
+
+ protected:
+ std::vector<uint32> tree;
+ std::vector<uint32> objects;
+ G3D::AABox bounds;
+
+ struct buildData
+ {
+ uint32 *indices;
+ G3D::AABox *primBound;
+ uint32 numPrims;
+ int maxPrims;
+ };
+ struct StackNode
+ {
+ uint32 node;
+ float tnear;
+ float tfar;
+ };
+
+ class BuildStats
+ {
+ private:
+ int numNodes;
+ int numLeaves;
+ int sumObjects;
+ int minObjects;
+ int maxObjects;
+ int sumDepth;
+ int minDepth;
+ int maxDepth;
+ int numLeavesN[6];
+ int numBVH2;
+
+ public:
+ BuildStats():
+ numNodes(0), numLeaves(0), sumObjects(0), minObjects(0x0FFFFFFF),
+ maxObjects(0xFFFFFFFF), sumDepth(0), minDepth(0x0FFFFFFF),
+ maxDepth(0xFFFFFFFF), numBVH2(0)
+ {
+ for (int i=0; i<6; ++i) numLeavesN[i] = 0;
+ }
+
+ void updateInner() { numNodes++; }
+ void updateBVH2() { numBVH2++; }
+ void updateLeaf(int depth, int n);
+ void printStats();
+ };
+
+ void buildHierarchy(std::vector<uint32> &tempTree, buildData &dat, BuildStats &stats);
+
+ void createNode(std::vector<uint32> &tempTree, int nodeIndex, uint32 left, uint32 right) const
+ {
+ // write leaf node
+ tempTree[nodeIndex + 0] = (3 << 30) | left;
+ tempTree[nodeIndex + 1] = right - left + 1;
+ }
+
+ void subdivide(int left, int right, std::vector<uint32> &tempTree, buildData &dat, AABound &gridBox, AABound &nodeBox, int nodeIndex, int depth, BuildStats &stats);
+};
+
+#endif // _BIH_H
diff --git a/src/common/Collision/BoundingIntervalHierarchyWrapper.h b/src/common/Collision/BoundingIntervalHierarchyWrapper.h
new file mode 100644
index 0000000000..5d0fa47020
--- /dev/null
+++ b/src/common/Collision/BoundingIntervalHierarchyWrapper.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _BIH_WRAP
+#define _BIH_WRAP
+
+#include "G3D/Table.h"
+#include "G3D/Array.h"
+#include "G3D/Set.h"
+#include "BoundingIntervalHierarchy.h"
+
+
+template<class T, class BoundsFunc = BoundsTrait<T> >
+class BIHWrap
+{
+ template<class RayCallback>
+ struct MDLCallback
+ {
+ const T* const* objects;
+ RayCallback& _callback;
+ uint32 objects_size;
+
+ MDLCallback(RayCallback& callback, const T* const* objects_array, uint32 objects_size ) : objects(objects_array), _callback(callback), objects_size(objects_size) { }
+
+ /// Intersect ray
+ bool operator() (const G3D::Ray& ray, uint32 idx, float& maxDist, bool stopAtFirstHit)
+ {
+ if (idx >= objects_size)
+ return false;
+ if (const T* obj = objects[idx])
+ return _callback(ray, *obj, maxDist, stopAtFirstHit);
+ return false;
+ }
+
+ /// Intersect point
+ void operator() (const G3D::Vector3& p, uint32 idx)
+ {
+ if (idx >= objects_size)
+ return;
+ if (const T* obj = objects[idx])
+ _callback(p, *obj);
+ }
+ };
+
+ typedef G3D::Array<const T*> ObjArray;
+
+ BIH m_tree;
+ ObjArray m_objects;
+ G3D::Table<const T*, uint32> m_obj2Idx;
+ G3D::Set<const T*> m_objects_to_push;
+ int unbalanced_times;
+
+public:
+ BIHWrap() : unbalanced_times(0) { }
+
+ void insert(const T& obj)
+ {
+ ++unbalanced_times;
+ m_objects_to_push.insert(&obj);
+ }
+
+ void remove(const T& obj)
+ {
+ ++unbalanced_times;
+ uint32 Idx = 0;
+ const T * temp;
+ if (m_obj2Idx.getRemove(&obj, temp, Idx))
+ m_objects[Idx] = NULL;
+ else
+ m_objects_to_push.remove(&obj);
+ }
+
+ void balance()
+ {
+ if (unbalanced_times == 0)
+ return;
+
+ unbalanced_times = 0;
+ m_objects.fastClear();
+ m_obj2Idx.getKeys(m_objects);
+ m_objects_to_push.getMembers(m_objects);
+ //assert that m_obj2Idx has all the keys
+
+ m_tree.build(m_objects, BoundsFunc::getBounds2);
+ }
+
+ template<typename RayCallback>
+ void intersectRay(const G3D::Ray& ray, RayCallback& intersectCallback, float& maxDist, bool stopAtFirstHit)
+ {
+ balance();
+ MDLCallback<RayCallback> temp_cb(intersectCallback, m_objects.getCArray(), m_objects.size());
+ m_tree.intersectRay(ray, temp_cb, maxDist, stopAtFirstHit);
+ }
+
+ template<typename IsectCallback>
+ void intersectPoint(const G3D::Vector3& point, IsectCallback& intersectCallback)
+ {
+ balance();
+ MDLCallback<IsectCallback> callback(intersectCallback, m_objects.getCArray(), m_objects.size());
+ m_tree.intersectPoint(point, callback);
+ }
+};
+
+#endif // _BIH_WRAP
diff --git a/src/common/Collision/CMakeLists.txt b/src/common/Collision/CMakeLists.txt
new file mode 100644
index 0000000000..a1c6b8b840
--- /dev/null
+++ b/src/common/Collision/CMakeLists.txt
@@ -0,0 +1,93 @@
+# Copyright (C)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+if( USE_COREPCH )
+ include_directories(${CMAKE_CURRENT_BINARY_DIR})
+endif()
+
+file(GLOB_RECURSE sources_Management Management/*.cpp Management/*.h)
+file(GLOB_RECURSE sources_Maps Maps/*.cpp Maps/*.h)
+file(GLOB_RECURSE sources_Models Models/*.cpp Models/*.h)
+file(GLOB sources_localdir *.cpp *.h)
+
+if (USE_COREPCH)
+ set(collision_STAT_PCH_HDR PrecompiledHeaders/collisionPCH.h)
+ set(collision_STAT_PCH_SRC PrecompiledHeaders/collisionPCH.cpp)
+endif ()
+
+set(collision_STAT_SRCS
+ ${collision_STAT_SRCS}
+ ${sources_Management}
+ ${sources_Maps}
+ ${sources_Models}
+ ${sources_localdir}
+)
+
+include_directories(
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/deps/g3dlite/include
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour/Include
+ ${CMAKE_SOURCE_DIR}/src/common/
+ ${CMAKE_SOURCE_DIR}/src/common/Configuration
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Database
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic/LinkedReference
+ ${CMAKE_SOURCE_DIR}/src/common/Logging
+ ${CMAKE_SOURCE_DIR}/src/common/Threading
+ ${CMAKE_SOURCE_DIR}/src/common/Packets
+ ${CMAKE_SOURCE_DIR}/src/common/Utilities
+ ${CMAKE_SOURCE_DIR}/src/common/DataStores
+ ${CMAKE_SOURCE_DIR}/src/server/game/Addons
+ ${CMAKE_SOURCE_DIR}/src/server/game/Conditions
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit
+ ${CMAKE_SOURCE_DIR}/src/server/game/Combat
+ ${CMAKE_SOURCE_DIR}/src/server/game/Loot
+ ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers
+ ${CMAKE_SOURCE_DIR}/src/server/game/Maps
+ ${CMAKE_SOURCE_DIR}/src/server/game/DataStores
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement
+ ${CMAKE_SOURCE_DIR}/src/server/game/Server
+ ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol
+ ${CMAKE_SOURCE_DIR}/src/server/game/World
+ ${CMAKE_SOURCE_DIR}/src/server/game/Spells
+ ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/Management
+ ${CMAKE_CURRENT_SOURCE_DIR}/Maps
+ ${CMAKE_CURRENT_SOURCE_DIR}/Models
+ ${ACE_INCLUDE_DIR}
+ ${MYSQL_INCLUDE_DIR}
+)
+
+add_library(collision STATIC
+ ${collision_STAT_SRCS}
+ ${collision_STAT_PCH_SRC}
+)
+
+target_link_libraries(collision
+ shared
+)
+
+# Generate precompiled header
+if (USE_COREPCH)
+ add_cxx_pch(collision ${collision_STAT_PCH_HDR} ${collision_STAT_PCH_SRC})
+endif ()
diff --git a/src/common/Collision/DynamicTree.cpp b/src/common/Collision/DynamicTree.cpp
new file mode 100644
index 0000000000..adf29a8a6e
--- /dev/null
+++ b/src/common/Collision/DynamicTree.cpp
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "DynamicTree.h"
+//#include "QuadTree.h"
+//#include "RegularGrid.h"
+#include "BoundingIntervalHierarchyWrapper.h"
+
+#include "Log.h"
+#include "RegularGrid.h"
+#include "Timer.h"
+#include "GameObjectModel.h"
+#include "ModelInstance.h"
+
+#include <G3D/AABox.h>
+#include <G3D/Ray.h>
+#include <G3D/Vector3.h>
+
+using VMAP::ModelInstance;
+
+namespace {
+
+int CHECK_TREE_PERIOD = 200;
+
+} // namespace
+
+template<> struct HashTrait< GameObjectModel>{
+ static size_t hashCode(const GameObjectModel& g) { return (size_t)(void*)&g; }
+};
+
+template<> struct PositionTrait< GameObjectModel> {
+ static void getPosition(const GameObjectModel& g, G3D::Vector3& p) { p = g.getPosition(); }
+};
+
+template<> struct BoundsTrait< GameObjectModel> {
+ static void getBounds(const GameObjectModel& g, G3D::AABox& out) { out = g.getBounds();}
+ static void getBounds2(const GameObjectModel* g, G3D::AABox& out) { out = g->getBounds();}
+};
+
+/*
+static bool operator == (const GameObjectModel& mdl, const GameObjectModel& mdl2){
+ return &mdl == &mdl2;
+}
+*/
+
+typedef RegularGrid2D<GameObjectModel, BIHWrap<GameObjectModel> > ParentTree;
+
+struct DynTreeImpl : public ParentTree/*, public Intersectable*/
+{
+ typedef GameObjectModel Model;
+ typedef ParentTree base;
+
+ DynTreeImpl() :
+ rebalance_timer(CHECK_TREE_PERIOD),
+ unbalanced_times(0)
+ {
+ }
+
+ void insert(const Model& mdl)
+ {
+ base::insert(mdl);
+ ++unbalanced_times;
+ }
+
+ void remove(const Model& mdl)
+ {
+ base::remove(mdl);
+ ++unbalanced_times;
+ }
+
+ void balance()
+ {
+ base::balance();
+ unbalanced_times = 0;
+ }
+
+ void update(uint32 difftime)
+ {
+ if (!size())
+ return;
+
+ rebalance_timer.Update(difftime);
+ if (rebalance_timer.Passed())
+ {
+ rebalance_timer.Reset(CHECK_TREE_PERIOD);
+ if (unbalanced_times > 0)
+ balance();
+ }
+ }
+
+ TimeTrackerSmall rebalance_timer;
+ int unbalanced_times;
+};
+
+DynamicMapTree::DynamicMapTree() : impl(new DynTreeImpl()) { }
+
+DynamicMapTree::~DynamicMapTree()
+{
+ delete impl;
+}
+
+void DynamicMapTree::insert(const GameObjectModel& mdl)
+{
+ impl->insert(mdl);
+}
+
+void DynamicMapTree::remove(const GameObjectModel& mdl)
+{
+ impl->remove(mdl);
+}
+
+bool DynamicMapTree::contains(const GameObjectModel& mdl) const
+{
+ return impl->contains(mdl);
+}
+
+void DynamicMapTree::balance()
+{
+ impl->balance();
+}
+
+int DynamicMapTree::size() const
+{
+ return impl->size();
+}
+
+void DynamicMapTree::update(uint32 t_diff)
+{
+ impl->update(t_diff);
+}
+
+struct DynamicTreeIntersectionCallback
+{
+ bool did_hit;
+ uint32 phase_mask;
+ DynamicTreeIntersectionCallback(uint32 phasemask) : did_hit(false), phase_mask(phasemask) { }
+ bool operator()(const G3D::Ray& r, const GameObjectModel& obj, float& distance, bool stopAtFirstHit)
+ {
+ bool result = obj.intersectRay(r, distance, stopAtFirstHit, phase_mask);
+ if (result)
+ did_hit = result;
+ return result;
+ }
+ bool didHit() const { return did_hit;}
+};
+
+bool DynamicMapTree::getIntersectionTime(const uint32 phasemask, const G3D::Ray& ray,
+ const G3D::Vector3& endPos, float& maxDist) const
+{
+ float distance = maxDist;
+ DynamicTreeIntersectionCallback callback(phasemask);
+ impl->intersectRay(ray, callback, distance, endPos, false);
+ if (callback.didHit())
+ maxDist = distance;
+ return callback.didHit();
+}
+
+bool DynamicMapTree::getObjectHitPos(const uint32 phasemask, const G3D::Vector3& startPos,
+ const G3D::Vector3& endPos, G3D::Vector3& resultHit,
+ float modifyDist) const
+{
+ bool result = false;
+ float maxDist = (endPos - startPos).magnitude();
+ // valid map coords should *never ever* produce float overflow, but this would produce NaNs too
+ ASSERT(maxDist < std::numeric_limits<float>::max());
+ // prevent NaN values which can cause BIH intersection to enter infinite loop
+ if (maxDist < 1e-10f)
+ {
+ resultHit = endPos;
+ return false;
+ }
+ G3D::Vector3 dir = (endPos - startPos)/maxDist; // direction with length of 1
+ G3D::Ray ray(startPos, dir);
+ float dist = maxDist;
+ if (getIntersectionTime(phasemask, ray, endPos, dist))
+ {
+ resultHit = startPos + dir * dist;
+ if (modifyDist < 0)
+ {
+ if ((resultHit - startPos).magnitude() > -modifyDist)
+ resultHit = resultHit + dir*modifyDist;
+ else
+ resultHit = startPos;
+ }
+ else
+ resultHit = resultHit + dir*modifyDist;
+
+ result = true;
+ }
+ else
+ {
+ resultHit = endPos;
+ result = false;
+ }
+ return result;
+}
+
+bool DynamicMapTree::isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask) const
+{
+ G3D::Vector3 v1(x1, y1, z1), v2(x2, y2, z2);
+
+ float maxDist = (v2 - v1).magnitude();
+
+ if (!G3D::fuzzyGt(maxDist, 0) )
+ return true;
+
+ G3D::Ray r(v1, (v2-v1) / maxDist);
+ DynamicTreeIntersectionCallback callback(phasemask);
+ impl->intersectRay(r, callback, maxDist, v2, true);
+
+ return !callback.did_hit;
+}
+
+float DynamicMapTree::getHeight(float x, float y, float z, float maxSearchDist, uint32 phasemask) const
+{
+ G3D::Vector3 v(x, y, z + 2.0f);
+ G3D::Ray r(v, G3D::Vector3(0, 0, -1));
+ DynamicTreeIntersectionCallback callback(phasemask);
+ impl->intersectZAllignedRay(r, callback, maxSearchDist);
+
+ if (callback.didHit())
+ return v.z - maxSearchDist;
+ else
+ return -G3D::inf();
+}
diff --git a/src/common/Collision/DynamicTree.h b/src/common/Collision/DynamicTree.h
new file mode 100644
index 0000000000..a8f45d9800
--- /dev/null
+++ b/src/common/Collision/DynamicTree.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _DYNTREE_H
+#define _DYNTREE_H
+
+#include "Define.h"
+
+namespace G3D
+{
+ class Ray;
+ class Vector3;
+}
+
+class GameObjectModel;
+struct DynTreeImpl;
+
+class DynamicMapTree
+{
+ DynTreeImpl *impl;
+
+public:
+
+ DynamicMapTree();
+ ~DynamicMapTree();
+
+ bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2,
+ float z2, uint32 phasemask) const;
+
+ bool getIntersectionTime(uint32 phasemask, const G3D::Ray& ray,
+ const G3D::Vector3& endPos, float& maxDist) const;
+
+ bool getObjectHitPos(uint32 phasemask, const G3D::Vector3& pPos1,
+ const G3D::Vector3& pPos2, G3D::Vector3& pResultHitPos,
+ float pModifyDist) const;
+
+ float getHeight(float x, float y, float z, float maxSearchDist, uint32 phasemask) const;
+
+ void insert(const GameObjectModel&);
+ void remove(const GameObjectModel&);
+ bool contains(const GameObjectModel&) const;
+ int size() const;
+
+ void balance();
+ void update(uint32 diff);
+};
+
+#endif // _DYNTREE_H
diff --git a/src/common/Collision/Management/IMMAPManager.h b/src/common/Collision/Management/IMMAPManager.h
new file mode 100644
index 0000000000..b2df8a2232
--- /dev/null
+++ b/src/common/Collision/Management/IMMAPManager.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _IMMAPMANAGER_H
+#define _IMMAPMANAGER_H
+
+#include <string>
+#include "Define.h"
+
+// Interface for IMMapManger
+namespace MMAP
+{
+ enum MMAP_LOAD_RESULT
+ {
+ MMAP_LOAD_RESULT_ERROR,
+ MMAP_LOAD_RESULT_OK,
+ MMAP_LOAD_RESULT_IGNORED,
+ };
+
+ class IMMapManager
+ {
+ private:
+ bool iEnablePathFinding;
+
+ public:
+ IMMapManager() : iEnablePathFinding(true) {}
+ virtual ~IMMapManager(void) {}
+
+ //Enabled/Disabled Pathfinding
+ void setEnablePathFinding(bool value) { iEnablePathFinding = value; }
+ bool isEnablePathFinding() const { return (iEnablePathFinding); }
+ };
+}
+
+#endif \ No newline at end of file
diff --git a/src/common/Collision/Management/IVMapManager.h b/src/common/Collision/Management/IVMapManager.h
new file mode 100644
index 0000000000..d37b0e1c54
--- /dev/null
+++ b/src/common/Collision/Management/IVMapManager.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _IVMAPMANAGER_H
+#define _IVMAPMANAGER_H
+
+#include <string>
+#include "Define.h"
+
+//===========================================================
+
+/**
+This is the minimum interface to the VMapMamager.
+*/
+
+namespace VMAP
+{
+
+ enum VMAP_LOAD_RESULT
+ {
+ VMAP_LOAD_RESULT_ERROR,
+ VMAP_LOAD_RESULT_OK,
+ VMAP_LOAD_RESULT_IGNORED
+ };
+
+ #define VMAP_INVALID_HEIGHT -100000.0f // for check
+ #define VMAP_INVALID_HEIGHT_VALUE -200000.0f // real assigned value in unknown height case
+
+ //===========================================================
+ class IVMapManager
+ {
+ private:
+ bool iEnableLineOfSightCalc;
+ bool iEnableHeightCalc;
+
+ public:
+ IVMapManager() : iEnableLineOfSightCalc(true), iEnableHeightCalc(true) { }
+
+ virtual ~IVMapManager(void) { }
+
+ virtual int loadMap(const char* pBasePath, unsigned int pMapId, int x, int y) = 0;
+
+ virtual bool existsMap(const char* pBasePath, unsigned int pMapId, int x, int y) = 0;
+
+ virtual void unloadMap(unsigned int pMapId, int x, int y) = 0;
+ virtual void unloadMap(unsigned int pMapId) = 0;
+
+ virtual bool isInLineOfSight(unsigned int pMapId, float x1, float y1, float z1, float x2, float y2, float z2) = 0;
+ virtual float getHeight(unsigned int pMapId, float x, float y, float z, float maxSearchDist) = 0;
+ /**
+ test if we hit an object. return true if we hit one. rx, ry, rz will hold the hit position or the dest position, if no intersection was found
+ return a position, that is pReduceDist closer to the origin
+ */
+ virtual bool getObjectHitPos(unsigned int pMapId, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float pModifyDist) = 0;
+ /**
+ send debug commands
+ */
+ virtual bool processCommand(char *pCommand)= 0;
+
+ /**
+ Enable/disable LOS calculation
+ It is enabled by default. If it is enabled in mid game the maps have to loaded manualy
+ */
+ void setEnableLineOfSightCalc(bool pVal) { iEnableLineOfSightCalc = pVal; }
+ /**
+ Enable/disable model height calculation
+ It is enabled by default. If it is enabled in mid game the maps have to loaded manualy
+ */
+ void setEnableHeightCalc(bool pVal) { iEnableHeightCalc = pVal; }
+
+ bool isLineOfSightCalcEnabled() const { return(iEnableLineOfSightCalc); }
+ bool isHeightCalcEnabled() const { return(iEnableHeightCalc); }
+ bool isMapLoadingEnabled() const { return(iEnableLineOfSightCalc || iEnableHeightCalc ); }
+
+ virtual std::string getDirFileName(unsigned int pMapId, int x, int y) const =0;
+ /**
+ Query world model area info.
+ \param z gets adjusted to the ground height for which this are info is valid
+ */
+ virtual bool getAreaInfo(unsigned int pMapId, float x, float y, float &z, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const=0;
+ virtual bool GetLiquidLevel(uint32 pMapId, float x, float y, float z, uint8 ReqLiquidType, float &level, float &floor, uint32 &type) const=0;
+ };
+
+}
+#endif
diff --git a/src/common/Collision/Management/MMapFactory.cpp b/src/common/Collision/Management/MMapFactory.cpp
new file mode 100644
index 0000000000..798fecaadb
--- /dev/null
+++ b/src/common/Collision/Management/MMapFactory.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MMapFactory.h"
+#include "World.h"
+#include <set>
+
+namespace MMAP
+{
+ // ######################## MMapFactory ########################
+ // our global singleton copy
+ MMapManager *g_MMapManager = NULL;
+ bool MMapFactory::forbiddenMaps[1000] = {0};
+
+ MMapManager* MMapFactory::createOrGetMMapManager()
+ {
+ if (g_MMapManager == NULL)
+ g_MMapManager = new MMapManager();
+
+ return g_MMapManager;
+ }
+
+ bool MMapFactory::IsPathfindingEnabled(const Map* map)
+ {
+ if (!map) return false;
+ return !forbiddenMaps[map->GetId()] && (sWorld->getBoolConfig(CONFIG_ENABLE_MMAPS) ? true : map->IsBattlegroundOrArena());
+ }
+
+ void MMapFactory::InitializeDisabledMaps()
+ {
+ memset(&forbiddenMaps, 0, sizeof(forbiddenMaps));
+ int32 f[] = {616 /*EoE*/, 649 /*ToC25*/, 650 /*ToC5*/, -1};
+ uint32 i = 0;
+ while (f[i] >= 0)
+ forbiddenMaps[f[i++]] = true;
+ }
+
+ void MMapFactory::clear()
+ {
+ if (g_MMapManager)
+ {
+ delete g_MMapManager;
+ g_MMapManager = NULL;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/common/Collision/Management/MMapFactory.h b/src/common/Collision/Management/MMapFactory.h
new file mode 100644
index 0000000000..84799f8118
--- /dev/null
+++ b/src/common/Collision/Management/MMapFactory.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MMAP_FACTORY_H
+#define _MMAP_FACTORY_H
+
+#include "MMapManager.h"
+#include "UnorderedMap.h"
+#include "DetourAlloc.h"
+#include "DetourNavMesh.h"
+#include "DetourNavMeshQuery.h"
+#include "Map.h"
+
+namespace MMAP
+{
+ enum MMAP_LOAD_RESULT
+ {
+ MMAP_LOAD_RESULT_ERROR,
+ MMAP_LOAD_RESULT_OK,
+ MMAP_LOAD_RESULT_IGNORED,
+ };
+
+ // static class
+ // holds all mmap global data
+ // access point to MMapManager singleton
+ class MMapFactory
+ {
+ public:
+ static MMapManager* createOrGetMMapManager();
+ static void clear();
+ static bool IsPathfindingEnabled(const Map* map);
+ static void InitializeDisabledMaps();
+ static bool forbiddenMaps[1000];
+ };
+}
+
+#endif
+
diff --git a/src/common/Collision/Management/MMapManager.cpp b/src/common/Collision/Management/MMapManager.cpp
new file mode 100644
index 0000000000..43355b834b
--- /dev/null
+++ b/src/common/Collision/Management/MMapManager.cpp
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MapManager.h"
+#include "MMapManager.h"
+#include "Log.h"
+
+namespace MMAP
+{
+ // ######################## MMapManager ########################
+ MMapManager::~MMapManager()
+ {
+ for (MMapDataSet::iterator i = loadedMMaps.begin(); i != loadedMMaps.end(); ++i)
+ delete i->second;
+
+ // by now we should not have maps loaded
+ // if we had, tiles in MMapData->mmapLoadedTiles, their actual data is lost!
+ }
+
+ bool MMapManager::loadMapData(uint32 mapId)
+ {
+ // we already have this map loaded?
+ if (loadedMMaps.find(mapId) != loadedMMaps.end())
+ return true;
+
+ // load and init dtNavMesh - read parameters from file
+ uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i.mmap")+1;
+ char *fileName = new char[pathLen];
+ snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i.mmap").c_str(), mapId);
+
+ FILE* file = fopen(fileName, "rb");
+ if (!file)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "MMAP:loadMapData: Error: Could not open mmap file '%s'", fileName);
+#endif
+ delete [] fileName;
+ return false;
+ }
+
+ dtNavMeshParams params;
+ int count = fread(&params, sizeof(dtNavMeshParams), 1, file);
+ fclose(file);
+ if (count != 1)
+ {
+ ;//TC_LOG_DEBUG(LOG_FILTER_MAPS, "MMAP:loadMapData: Error: Could not read params from file '%s'", fileName);
+ delete [] fileName;
+ return false;
+ }
+
+ dtNavMesh* mesh = dtAllocNavMesh();
+ ASSERT(mesh);
+ if (DT_SUCCESS != mesh->init(&params))
+ {
+ dtFreeNavMesh(mesh);
+ sLog->outError("MMAP:loadMapData: Failed to initialize dtNavMesh for mmap %03u from file %s", mapId, fileName);
+ delete [] fileName;
+ return false;
+ }
+
+ delete [] fileName;
+
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDetail("MMAP:loadMapData: Loaded %03i.mmap", mapId);
+#endif
+
+ // store inside our map list
+ MMapData* mmap_data = new MMapData(mesh);
+ mmap_data->mmapLoadedTiles.clear();
+
+ loadedMMaps.insert(std::pair<uint32, MMapData*>(mapId, mmap_data));
+ return true;
+ }
+
+ uint32 MMapManager::packTileID(int32 x, int32 y)
+ {
+ return uint32(x << 16 | y);
+ }
+
+ ACE_RW_Thread_Mutex& MMapManager::GetMMapLock(uint32 mapId)
+ {
+ Map* map = sMapMgr->FindBaseMap(mapId);
+ if (!map)
+ {
+ sLog->outMisc("ZOMG! MoveMaps: BaseMap not found!");
+ return this->MMapLock;
+ }
+ return map->GetMMapLock();
+ }
+
+ bool MMapManager::loadMap(uint32 mapId, int32 x, int32 y)
+ {
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, MMapManagerLock);
+
+ // make sure the mmap is loaded and ready to load tiles
+ if(!loadMapData(mapId))
+ return false;
+
+ // get this mmap data
+ MMapData* mmap = loadedMMaps[mapId];
+ ASSERT(mmap->navMesh);
+
+ // check if we already have this tile loaded
+ uint32 packedGridPos = packTileID(x, y);
+ if (mmap->mmapLoadedTiles.find(packedGridPos) != mmap->mmapLoadedTiles.end())
+ {
+ sLog->outError("MMAP:loadMap: Asked to load already loaded navmesh tile. %03u%02i%02i.mmtile", mapId, x, y);
+ return false;
+ }
+
+ // load this tile :: mmaps/MMMXXYY.mmtile
+ uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i%02i%02i.mmtile")+1;
+ char *fileName = new char[pathLen];
+ snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i%02i%02i.mmtile").c_str(), mapId, x, y);
+
+ FILE *file = fopen(fileName, "rb");
+ if (!file)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "MMAP:loadMap: Could not open mmtile file '%s'", fileName);
+#endif
+ delete [] fileName;
+ return false;
+ }
+ delete [] fileName;
+
+ // read header
+ MmapTileHeader fileHeader;
+ if (fread(&fileHeader, sizeof(MmapTileHeader), 1, file) != 1 || fileHeader.mmapMagic != MMAP_MAGIC)
+ {
+ sLog->outError("MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, x, y);
+ fclose(file);
+ return false;
+ }
+
+ if (fileHeader.mmapVersion != MMAP_VERSION)
+ {
+ sLog->outError("MMAP:loadMap: %03u%02i%02i.mmtile was built with generator v%i, expected v%i",
+ mapId, x, y, fileHeader.mmapVersion, MMAP_VERSION);
+ fclose(file);
+ return false;
+ }
+
+ unsigned char* data = (unsigned char*)dtAlloc(fileHeader.size, DT_ALLOC_PERM);
+ ASSERT(data);
+
+ size_t result = fread(data, fileHeader.size, 1, file);
+ if(!result)
+ {
+ sLog->outError("MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, x, y);
+ fclose(file);
+ return false;
+ }
+
+ fclose(file);
+
+ dtTileRef tileRef = 0;
+
+ dtStatus stat;
+ {
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, GetMMapLock(mapId));
+ stat = mmap->navMesh->addTile(data, fileHeader.size, DT_TILE_FREE_DATA, 0, &tileRef);
+ }
+
+ // memory allocated for data is now managed by detour, and will be deallocated when the tile is removed
+ if (stat == DT_SUCCESS)
+ {
+ mmap->mmapLoadedTiles.insert(std::pair<uint32, dtTileRef>(packedGridPos, tileRef));
+ ++loadedTiles;
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ dtMeshHeader* header = (dtMeshHeader*)data;
+ sLog->outDetail("MMAP:loadMap: Loaded mmtile %03i[%02i,%02i] into %03i[%02i,%02i]", mapId, x, y, mapId, header->x, header->y);
+#endif
+ return true;
+ }
+ else
+ {
+ sLog->outError("MMAP:loadMap: Could not load %03u%02i%02i.mmtile into navmesh", mapId, x, y);
+ dtFree(data);
+ return false;
+ }
+
+ return false;
+ }
+
+ bool MMapManager::unloadMap(uint32 mapId, int32 x, int32 y)
+ {
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, MMapManagerLock);
+
+ // check if we have this map loaded
+ if (loadedMMaps.find(mapId) == loadedMMaps.end())
+ {
+ // file may not exist, therefore not loaded
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh map. %03u%02i%02i.mmtile", mapId, x, y);
+#endif
+ return false;
+ }
+
+ MMapData* mmap = loadedMMaps[mapId];
+
+ // check if we have this tile loaded
+ uint32 packedGridPos = packTileID(x, y);
+ if (mmap->mmapLoadedTiles.find(packedGridPos) == mmap->mmapLoadedTiles.end())
+ {
+ // file may not exist, therefore not loaded
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh tile. %03u%02i%02i.mmtile", mapId, x, y);
+#endif
+ return false;
+ }
+
+ dtTileRef tileRef = mmap->mmapLoadedTiles[packedGridPos];
+
+ dtStatus status;
+ {
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, GetMMapLock(mapId));
+ status = mmap->navMesh->removeTile(tileRef, NULL, NULL);
+ }
+
+ // unload, and mark as non loaded
+ if (status != DT_SUCCESS)
+ {
+ // this is technically a memory leak
+ // if the grid is later reloaded, dtNavMesh::addTile will return error but no extra memory is used
+ // we cannot recover from this error - assert out
+ sLog->outError("MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, x, y);
+ ASSERT(false);
+ }
+ else
+ {
+ mmap->mmapLoadedTiles.erase(packedGridPos);
+ --loadedTiles;
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDetail("MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, x, y, mapId);
+#endif
+ return true;
+ }
+
+ return false;
+ }
+
+ bool MMapManager::unloadMap(uint32 mapId)
+ {
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, MMapManagerLock);
+
+ if (loadedMMaps.find(mapId) == loadedMMaps.end())
+ {
+ // file may not exist, therefore not loaded
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh map %03u", mapId);
+#endif
+ return false;
+ }
+
+ // unload all tiles from given map
+ MMapData* mmap = loadedMMaps[mapId];
+ for (MMapTileSet::iterator i = mmap->mmapLoadedTiles.begin(); i != mmap->mmapLoadedTiles.end(); ++i)
+ {
+ uint32 x = (i->first >> 16);
+ uint32 y = (i->first & 0x0000FFFF);
+
+ dtStatus status;
+ {
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, GetMMapLock(mapId));
+ status = mmap->navMesh->removeTile(i->second, NULL, NULL);
+ }
+
+ if (status != DT_SUCCESS)
+ sLog->outError("MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, x, y);
+ else
+ {
+ --loadedTiles;
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDetail("MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, x, y, mapId);
+#endif
+ }
+ }
+
+ delete mmap;
+ loadedMMaps.erase(mapId);
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDetail("MMAP:unloadMap: Unloaded %03i.mmap", mapId);
+#endif
+
+ return true;
+ }
+
+ bool MMapManager::unloadMapInstance(uint32 mapId, uint32 instanceId)
+ {
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, MMapManagerLock);
+
+ // check if we have this map loaded
+ if (loadedMMaps.find(mapId) == loadedMMaps.end())
+ {
+ // file may not exist, therefore not loaded
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMapInstance: Asked to unload not loaded navmesh map %03u", mapId);
+#endif
+ return false;
+ }
+
+ MMapData* mmap = loadedMMaps[mapId];
+ if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end())
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMapInstance: Asked to unload not loaded dtNavMeshQuery mapId %03u instanceId %u", mapId, instanceId);
+#endif
+ return false;
+ }
+
+ dtNavMeshQuery* query = mmap->navMeshQueries[instanceId];
+
+ dtFreeNavMeshQuery(query);
+ mmap->navMeshQueries.erase(instanceId);
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDetail("MMAP:unloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId);
+#endif
+
+ return true;
+ }
+
+ dtNavMesh const* MMapManager::GetNavMesh(uint32 mapId)
+ {
+ // pussywizard: moved to calling function
+ //TRINITY_READ_GUARD(ACE_RW_Thread_Mutex, MMapManagerLock);
+
+ if (loadedMMaps.find(mapId) == loadedMMaps.end())
+ return NULL;
+
+ return loadedMMaps[mapId]->navMesh;
+ }
+
+ dtNavMeshQuery const* MMapManager::GetNavMeshQuery(uint32 mapId, uint32 instanceId)
+ {
+ // pussywizard: moved to calling function
+ //TRINITY_READ_GUARD(ACE_RW_Thread_Mutex, MMapManagerLock);
+
+ if (loadedMMaps.find(mapId) == loadedMMaps.end())
+ return NULL;
+
+ MMapData* mmap = loadedMMaps[mapId];
+ if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end())
+ {
+ // pussywizard: different instances of the same map shouldn't access this simultaneously
+ TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, GetMMapLock(mapId));
+ // check again after acquiring mutex
+ if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end())
+ {
+ // allocate mesh query
+ dtNavMeshQuery* query = dtAllocNavMeshQuery();
+ ASSERT(query);
+ if (DT_SUCCESS != query->init(mmap->navMesh, 1024))
+ {
+ dtFreeNavMeshQuery(query);
+ sLog->outError("MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId);
+ return NULL;
+ }
+
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDetail("MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId);
+#endif
+ mmap->navMeshQueries.insert(std::pair<uint32, dtNavMeshQuery*>(instanceId, query));
+ }
+ }
+
+ return mmap->navMeshQueries[instanceId];
+ }
+}
diff --git a/src/common/Collision/Management/MMapManager.h b/src/common/Collision/Management/MMapManager.h
new file mode 100644
index 0000000000..842fe47fbf
--- /dev/null
+++ b/src/common/Collision/Management/MMapManager.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MMAP_MANAGER_H
+#define _MMAP_MANAGER_H
+
+#include "UnorderedMap.h"
+#include "DetourAlloc.h"
+#include "DetourNavMesh.h"
+#include "DetourNavMeshQuery.h"
+#include "World.h"
+
+// memory management
+inline void* dtCustomAlloc(size_t size, dtAllocHint /*hint*/)
+{
+ return (void*)new unsigned char[size];
+}
+
+inline void dtCustomFree(void* ptr)
+{
+ delete [] (unsigned char*)ptr;
+}
+
+// move map related classes
+namespace MMAP
+{
+ typedef UNORDERED_MAP<uint32, dtTileRef> MMapTileSet;
+ typedef UNORDERED_MAP<uint32, dtNavMeshQuery*> NavMeshQuerySet;
+
+ // dummy struct to hold map's mmap data
+ struct MMapData
+ {
+ MMapData(dtNavMesh* mesh) : navMesh(mesh) {}
+ ~MMapData()
+ {
+ for (NavMeshQuerySet::iterator i = navMeshQueries.begin(); i != navMeshQueries.end(); ++i)
+ dtFreeNavMeshQuery(i->second);
+
+ if (navMesh)
+ dtFreeNavMesh(navMesh);
+ }
+
+ dtNavMesh* navMesh;
+
+ // we have to use single dtNavMeshQuery for every instance, since those are not thread safe
+ NavMeshQuerySet navMeshQueries; // instanceId to query
+ MMapTileSet mmapLoadedTiles; // maps [map grid coords] to [dtTile]
+ };
+
+
+ typedef UNORDERED_MAP<uint32, MMapData*> MMapDataSet;
+
+ // singleton class
+ // holds all all access to mmap loading unloading and meshes
+ class MMapManager
+ {
+ public:
+ MMapManager() : loadedTiles(0) {}
+ ~MMapManager();
+
+ bool loadMap(uint32 mapId, int32 x, int32 y);
+ bool unloadMap(uint32 mapId, int32 x, int32 y);
+ bool unloadMap(uint32 mapId);
+ bool unloadMapInstance(uint32 mapId, uint32 instanceId);
+
+ // the returned [dtNavMeshQuery const*] is NOT threadsafe
+ dtNavMeshQuery const* GetNavMeshQuery(uint32 mapId, uint32 instanceId);
+ dtNavMesh const* GetNavMesh(uint32 mapId);
+
+ uint32 getLoadedTilesCount() const { return loadedTiles; }
+ uint32 getLoadedMapsCount() const { return loadedMMaps.size(); }
+
+ ACE_RW_Thread_Mutex& GetMMapLock(uint32 mapId);
+ ACE_RW_Thread_Mutex& GetMMapGeneralLock() { return MMapLock; } // pussywizard: in case a per-map mutex can't be found, should never happen
+ ACE_RW_Thread_Mutex& GetManagerLock() { return MMapManagerLock; }
+ private:
+ bool loadMapData(uint32 mapId);
+ uint32 packTileID(int32 x, int32 y);
+
+ MMapDataSet loadedMMaps;
+ uint32 loadedTiles;
+
+ ACE_RW_Thread_Mutex MMapManagerLock;
+ ACE_RW_Thread_Mutex MMapLock; // pussywizard: in case a per-map mutex can't be found, should never happen
+ };
+}
+
+#endif \ No newline at end of file
diff --git a/src/common/Collision/Management/VMapFactory.cpp b/src/common/Collision/Management/VMapFactory.cpp
new file mode 100644
index 0000000000..17be9ddfa4
--- /dev/null
+++ b/src/common/Collision/Management/VMapFactory.cpp
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "VMapFactory.h"
+#include "VMapManager2.h"
+
+namespace VMAP
+{
+ IVMapManager* gVMapManager = NULL;
+
+ //===============================================
+ // just return the instance
+ IVMapManager* VMapFactory::createOrGetVMapManager()
+ {
+ if (gVMapManager == 0)
+ gVMapManager= new VMapManager2(); // should be taken from config ... Please change if you like :-)
+ return gVMapManager;
+ }
+
+ //===============================================
+ // delete all internal data structures
+ void VMapFactory::clear()
+ {
+ delete gVMapManager;
+ gVMapManager = NULL;
+ }
+}
diff --git a/src/common/Collision/Management/VMapFactory.h b/src/common/Collision/Management/VMapFactory.h
new file mode 100644
index 0000000000..43a4060d14
--- /dev/null
+++ b/src/common/Collision/Management/VMapFactory.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _VMAPFACTORY_H
+#define _VMAPFACTORY_H
+
+#include "IVMapManager.h"
+
+/**
+This is the access point to the VMapManager.
+*/
+
+namespace VMAP
+{
+ //===========================================================
+
+ class VMapFactory
+ {
+ public:
+ static IVMapManager* createOrGetVMapManager();
+ static void clear();
+ };
+
+}
+#endif
diff --git a/src/common/Collision/Management/VMapManager2.cpp b/src/common/Collision/Management/VMapManager2.cpp
new file mode 100644
index 0000000000..6897ffa56a
--- /dev/null
+++ b/src/common/Collision/Management/VMapManager2.cpp
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C)
+ * Copyright (C)
+ *
+ * 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 <iostream>
+#include <iomanip>
+#include <string>
+#include <sstream>
+#include "VMapManager2.h"
+#include "MapTree.h"
+#include "ModelInstance.h"
+#include "WorldModel.h"
+#include <G3D/Vector3.h>
+#include <ace/Null_Mutex.h>
+#include <ace/Singleton.h>
+#include "DisableMgr.h"
+#include "DBCStores.h"
+#include "Log.h"
+#include "VMapDefinitions.h"
+
+using G3D::Vector3;
+
+namespace VMAP
+{
+ VMapManager2::VMapManager2()
+ {
+ GetLiquidFlagsPtr = &GetLiquidFlagsDummy;
+ }
+
+ VMapManager2::~VMapManager2(void)
+ {
+ for (InstanceTreeMap::iterator i = iInstanceMapTrees.begin(); i != iInstanceMapTrees.end(); ++i)
+ {
+ delete i->second;
+ }
+ for (ModelFileMap::iterator i = iLoadedModelFiles.begin(); i != iLoadedModelFiles.end(); ++i)
+ {
+ delete i->second.getModel();
+ }
+ }
+
+ Vector3 VMapManager2::convertPositionToInternalRep(float x, float y, float z) const
+ {
+ Vector3 pos;
+ const float mid = 0.5f * 64.0f * 533.33333333f;
+ pos.x = mid - x;
+ pos.y = mid - y;
+ pos.z = z;
+
+ return pos;
+ }
+
+ // move to MapTree too?
+ std::string VMapManager2::getMapFileName(unsigned int mapId)
+ {
+ std::stringstream fname;
+ fname.width(3);
+ fname << std::setfill('0') << mapId << std::string(MAP_FILENAME_EXTENSION2);
+
+ return fname.str();
+ }
+
+ int VMapManager2::loadMap(const char* basePath, unsigned int mapId, int x, int y)
+ {
+ int result = VMAP_LOAD_RESULT_IGNORED;
+ if (isMapLoadingEnabled())
+ {
+ if (_loadMap(mapId, basePath, x, y))
+ result = VMAP_LOAD_RESULT_OK;
+ else
+ result = VMAP_LOAD_RESULT_ERROR;
+ }
+
+ return result;
+ }
+
+ // load one tile (internal use only)
+ bool VMapManager2::_loadMap(uint32 mapId, const std::string& basePath, uint32 tileX, uint32 tileY)
+ {
+ InstanceTreeMap::iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree == iInstanceMapTrees.end())
+ {
+ std::string mapFileName = getMapFileName(mapId);
+ StaticMapTree* newTree = new StaticMapTree(mapId, basePath);
+ if (!newTree->InitMap(mapFileName, this))
+ {
+ delete newTree;
+ return false;
+ }
+ instanceTree = iInstanceMapTrees.insert(InstanceTreeMap::value_type(mapId, newTree)).first;
+ }
+
+ return instanceTree->second->LoadMapTile(tileX, tileY, this);
+ }
+
+ void VMapManager2::unloadMap(unsigned int mapId)
+ {
+ InstanceTreeMap::iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree != iInstanceMapTrees.end())
+ {
+ instanceTree->second->UnloadMap(this);
+ if (instanceTree->second->numLoadedTiles() == 0)
+ {
+ delete instanceTree->second;
+ iInstanceMapTrees.erase(mapId);
+ }
+ }
+ }
+
+ void VMapManager2::unloadMap(unsigned int mapId, int x, int y)
+ {
+ InstanceTreeMap::iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree != iInstanceMapTrees.end())
+ {
+ instanceTree->second->UnloadMapTile(x, y, this);
+ if (instanceTree->second->numLoadedTiles() == 0)
+ {
+ delete instanceTree->second;
+ iInstanceMapTrees.erase(mapId);
+ }
+ }
+ }
+
+ bool VMapManager2::isInLineOfSight(unsigned int mapId, float x1, float y1, float z1, float x2, float y2, float z2)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_VMAP_CHECKS)
+ if (!isLineOfSightCalcEnabled() || DisableMgr::IsDisabledFor(DISABLE_TYPE_VMAP, mapId, NULL, VMAP_DISABLE_LOS))
+ return true;
+#endif
+
+ InstanceTreeMap::iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree != iInstanceMapTrees.end())
+ {
+ Vector3 pos1 = convertPositionToInternalRep(x1, y1, z1);
+ Vector3 pos2 = convertPositionToInternalRep(x2, y2, z2);
+ if (pos1 != pos2)
+ {
+ return instanceTree->second->isInLineOfSight(pos1, pos2);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ get the hit position and return true if we hit something
+ otherwise the result pos will be the dest pos
+ */
+ bool VMapManager2::getObjectHitPos(unsigned int mapId, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float modifyDist)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_VMAP_CHECKS)
+ if (isLineOfSightCalcEnabled() && !DisableMgr::IsDisabledFor(DISABLE_TYPE_VMAP, mapId, NULL, VMAP_DISABLE_LOS))
+#endif
+ {
+ InstanceTreeMap::iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree != iInstanceMapTrees.end())
+ {
+ Vector3 pos1 = convertPositionToInternalRep(x1, y1, z1);
+ Vector3 pos2 = convertPositionToInternalRep(x2, y2, z2);
+ Vector3 resultPos;
+ bool result = instanceTree->second->getObjectHitPos(pos1, pos2, resultPos, modifyDist);
+ resultPos = convertPositionToInternalRep(resultPos.x, resultPos.y, resultPos.z);
+ rx = resultPos.x;
+ ry = resultPos.y;
+ rz = resultPos.z;
+ return result;
+ }
+ }
+
+ rx = x2;
+ ry = y2;
+ rz = z2;
+
+ return false;
+ }
+
+ /**
+ get height or INVALID_HEIGHT if no height available
+ */
+
+ float VMapManager2::getHeight(unsigned int mapId, float x, float y, float z, float maxSearchDist)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_VMAP_CHECKS)
+ if (isHeightCalcEnabled() && !DisableMgr::IsDisabledFor(DISABLE_TYPE_VMAP, mapId, NULL, VMAP_DISABLE_HEIGHT))
+#endif
+ {
+ InstanceTreeMap::iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree != iInstanceMapTrees.end())
+ {
+ Vector3 pos = convertPositionToInternalRep(x, y, z);
+ float height = instanceTree->second->getHeight(pos, maxSearchDist);
+ if (!(height < G3D::inf()))
+ return height = VMAP_INVALID_HEIGHT_VALUE; // No height
+
+ return height;
+ }
+ }
+
+ return VMAP_INVALID_HEIGHT_VALUE;
+ }
+
+ bool VMapManager2::getAreaInfo(unsigned int mapId, float x, float y, float& z, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_VMAP_CHECKS)
+ if (!DisableMgr::IsDisabledFor(DISABLE_TYPE_VMAP, mapId, NULL, VMAP_DISABLE_AREAFLAG))
+#endif
+ {
+ InstanceTreeMap::const_iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree != iInstanceMapTrees.end())
+ {
+ Vector3 pos = convertPositionToInternalRep(x, y, z);
+ bool result = instanceTree->second->getAreaInfo(pos, flags, adtId, rootId, groupId);
+ // z is not touched by convertPositionToInternalRep(), so just copy
+ z = pos.z;
+ return result;
+ }
+ }
+
+ return false;
+ }
+
+ bool VMapManager2::GetLiquidLevel(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, float& level, float& floor, uint32& type) const
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_VMAP_CHECKS)
+ if (!DisableMgr::IsDisabledFor(DISABLE_TYPE_VMAP, mapId, NULL, VMAP_DISABLE_LIQUIDSTATUS))
+#endif
+ {
+ InstanceTreeMap::const_iterator instanceTree = iInstanceMapTrees.find(mapId);
+ if (instanceTree != iInstanceMapTrees.end())
+ {
+ LocationInfo info;
+ Vector3 pos = convertPositionToInternalRep(x, y, z);
+ if (instanceTree->second->GetLocationInfo(pos, info))
+ {
+ floor = info.ground_Z;
+ ASSERT(floor < std::numeric_limits<float>::max());
+ type = info.hitModel->GetLiquidType(); // entry from LiquidType.dbc
+ if (reqLiquidType && !(GetLiquidFlagsPtr(type) & reqLiquidType))
+ return false;
+ if (info.hitInstance->GetLiquidLevel(pos, info, level))
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ WorldModel* VMapManager2::acquireModelInstance(const std::string& basepath, const std::string& filename)
+ {
+ //! Critical section, thread safe access to iLoadedModelFiles
+ TRINITY_GUARD(ACE_Thread_Mutex, LoadedModelFilesLock);
+
+ ModelFileMap::iterator model = iLoadedModelFiles.find(filename);
+ if (model == iLoadedModelFiles.end())
+ {
+ WorldModel* worldmodel = new WorldModel();
+ if (!worldmodel->readFile(basepath + filename + ".vmo"))
+ {
+ sLog->outError("VMapManager2: could not load '%s%s.vmo'", basepath.c_str(), filename.c_str());
+ delete worldmodel;
+ return NULL;
+ }
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "VMapManager2: loading file '%s%s'", basepath.c_str(), filename.c_str());
+#endif
+ model = iLoadedModelFiles.insert(std::pair<std::string, ManagedModel>(filename, ManagedModel())).first;
+ model->second.setModel(worldmodel);
+ }
+ //model->second.incRefCount();
+ return model->second.getModel();
+ }
+
+ void VMapManager2::releaseModelInstance(const std::string &filename)
+ {
+ //! Critical section, thread safe access to iLoadedModelFiles
+ TRINITY_GUARD(ACE_Thread_Mutex, LoadedModelFilesLock);
+ ModelFileMap::iterator model = iLoadedModelFiles.find(filename);
+ if (model == iLoadedModelFiles.end())
+ {
+ sLog->outError("VMapManager2: trying to unload non-loaded file '%s'", filename.c_str());
+ return;
+ }
+ if (model->second.decRefCount() == 0)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDebug(LOG_FILTER_MAPS, "VMapManager2: unloading file '%s'", filename.c_str());
+#endif
+ delete model->second.getModel();
+ iLoadedModelFiles.erase(model);
+ }
+ }
+
+ bool VMapManager2::existsMap(const char* basePath, unsigned int mapId, int x, int y)
+ {
+ return StaticMapTree::CanLoadMap(std::string(basePath), mapId, x, y);
+ }
+
+} // namespace VMAP \ No newline at end of file
diff --git a/src/common/Collision/Management/VMapManager2.h b/src/common/Collision/Management/VMapManager2.h
new file mode 100644
index 0000000000..ac07d79458
--- /dev/null
+++ b/src/common/Collision/Management/VMapManager2.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C)
+ * Copyright (C)
+ *
+ * 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 _VMAPMANAGER2_H
+#define _VMAPMANAGER2_H
+
+#include "IVMapManager.h"
+#include "Dynamic/UnorderedMap.h"
+#include "Define.h"
+#include <ace/Thread_Mutex.h>
+
+//===========================================================
+
+#define MAP_FILENAME_EXTENSION2 ".vmtree"
+
+#define FILENAMEBUFFER_SIZE 500
+
+/**
+This is the main Class to manage loading and unloading of maps, line of sight, height calculation and so on.
+For each map or map tile to load it reads a directory file that contains the ModelContainer files used by this map or map tile.
+Each global map or instance has its own dynamic BSP-Tree.
+The loaded ModelContainers are included in one of these BSP-Trees.
+Additionally a table to match map ids and map names is used.
+*/
+
+//===========================================================
+
+namespace G3D
+{
+ class Vector3;
+}
+
+namespace VMAP
+{
+ class StaticMapTree;
+ class WorldModel;
+
+ class ManagedModel
+ {
+ public:
+ ManagedModel() : iModel(0), iRefCount(0) { }
+ void setModel(WorldModel* model) { iModel = model; }
+ WorldModel* getModel() { return iModel; }
+ void incRefCount() { ++iRefCount; }
+ int decRefCount() { return --iRefCount; }
+ protected:
+ WorldModel* iModel;
+ int iRefCount;
+ };
+
+ typedef UNORDERED_MAP<uint32, StaticMapTree*> InstanceTreeMap;
+ typedef UNORDERED_MAP<std::string, ManagedModel> ModelFileMap;
+
+ class VMapManager2 : public IVMapManager
+ {
+ protected:
+ // Tree to check collision
+ ModelFileMap iLoadedModelFiles;
+ InstanceTreeMap iInstanceMapTrees;
+ // Mutex for iLoadedModelFiles
+ ACE_Thread_Mutex LoadedModelFilesLock;
+
+ bool _loadMap(uint32 mapId, const std::string& basePath, uint32 tileX, uint32 tileY);
+ /* void _unloadMap(uint32 pMapId, uint32 x, uint32 y); */
+
+ static uint32 GetLiquidFlagsDummy(uint32) { return 0; }
+
+ public:
+ // public for debug
+ G3D::Vector3 convertPositionToInternalRep(float x, float y, float z) const;
+ static std::string getMapFileName(unsigned int mapId);
+
+ VMapManager2();
+ ~VMapManager2(void);
+
+ int loadMap(const char* pBasePath, unsigned int mapId, int x, int y);
+
+ void unloadMap(unsigned int mapId, int x, int y);
+ void unloadMap(unsigned int mapId);
+
+ bool isInLineOfSight(unsigned int mapId, float x1, float y1, float z1, float x2, float y2, float z2) ;
+ /**
+ fill the hit pos and return true, if an object was hit
+ */
+ bool getObjectHitPos(unsigned int mapId, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float& ry, float& rz, float modifyDist);
+ float getHeight(unsigned int mapId, float x, float y, float z, float maxSearchDist);
+
+ bool processCommand(char* /*command*/) { return false; } // for debug and extensions
+
+ bool getAreaInfo(unsigned int pMapId, float x, float y, float& z, uint32& flags, int32& adtId, int32& rootId, int32& groupId) const;
+ bool GetLiquidLevel(uint32 pMapId, float x, float y, float z, uint8 reqLiquidType, float& level, float& floor, uint32& type) const;
+
+ WorldModel* acquireModelInstance(const std::string& basepath, const std::string& filename);
+ void releaseModelInstance(const std::string& filename);
+
+ // what's the use of this? o.O
+ virtual std::string getDirFileName(unsigned int mapId, int /*x*/, int /*y*/) const
+ {
+ return getMapFileName(mapId);
+ }
+ virtual bool existsMap(const char* basePath, unsigned int mapId, int x, int y);
+ public:
+ void getInstanceMapTree(InstanceTreeMap &instanceMapTree);
+
+ typedef uint32(*GetLiquidFlagsFn)(uint32 liquidType);
+ GetLiquidFlagsFn GetLiquidFlagsPtr;
+ };
+}
+
+#endif \ No newline at end of file
diff --git a/src/common/Collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp
new file mode 100644
index 0000000000..c2056c90b9
--- /dev/null
+++ b/src/common/Collision/Maps/MapTree.cpp
@@ -0,0 +1,465 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MapTree.h"
+#include "ModelInstance.h"
+#include "VMapManager2.h"
+#include "VMapDefinitions.h"
+#include "Log.h"
+#include "Errors.h"
+
+#include <string>
+#include <sstream>
+#include <iomanip>
+#include <limits>
+
+using G3D::Vector3;
+
+namespace VMAP
+{
+
+ class MapRayCallback
+ {
+ public:
+ MapRayCallback(ModelInstance* val): prims(val), hit(false) {}
+ bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool StopAtFirstHit)
+ {
+ bool result = prims[entry].intersectRay(ray, distance, StopAtFirstHit);
+ if (result)
+ hit = true;
+ return result;
+ }
+ bool didHit() { return hit; }
+ protected:
+ ModelInstance* prims;
+ bool hit;
+ };
+
+ class AreaInfoCallback
+ {
+ public:
+ AreaInfoCallback(ModelInstance* val): prims(val) {}
+ void operator()(const Vector3& point, uint32 entry)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) && defined(VMAP_DEBUG)
+ sLog->outDebug(LOG_FILTER_MAPS, "AreaInfoCallback: trying to intersect '%s'", prims[entry].name.c_str());
+#endif
+ prims[entry].intersectPoint(point, aInfo);
+ }
+
+ ModelInstance* prims;
+ AreaInfo aInfo;
+ };
+
+ class LocationInfoCallback
+ {
+ public:
+ LocationInfoCallback(ModelInstance* val, LocationInfo &info): prims(val), locInfo(info), result(false) {}
+ void operator()(const Vector3& point, uint32 entry)
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) && defined(VMAP_DEBUG)
+ sLog->outDebug(LOG_FILTER_MAPS, "LocationInfoCallback: trying to intersect '%s'", prims[entry].name.c_str());
+#endif
+ if (prims[entry].GetLocationInfo(point, locInfo))
+ result = true;
+ }
+
+ ModelInstance* prims;
+ LocationInfo &locInfo;
+ bool result;
+ };
+
+ //=========================================================
+
+ std::string StaticMapTree::getTileFileName(uint32 mapID, uint32 tileX, uint32 tileY)
+ {
+ std::stringstream tilefilename;
+ tilefilename.fill('0');
+ tilefilename << std::setw(3) << mapID << '_';
+ //tilefilename << std::setw(2) << tileX << '_' << std::setw(2) << tileY << ".vmtile";
+ tilefilename << std::setw(2) << tileY << '_' << std::setw(2) << tileX << ".vmtile";
+ return tilefilename.str();
+ }
+
+ bool StaticMapTree::getAreaInfo(Vector3 &pos, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const
+ {
+ AreaInfoCallback intersectionCallBack(iTreeValues);
+ iTree.intersectPoint(pos, intersectionCallBack);
+ if (intersectionCallBack.aInfo.result)
+ {
+ flags = intersectionCallBack.aInfo.flags;
+ adtId = intersectionCallBack.aInfo.adtId;
+ rootId = intersectionCallBack.aInfo.rootId;
+ groupId = intersectionCallBack.aInfo.groupId;
+ pos.z = intersectionCallBack.aInfo.ground_Z;
+ return true;
+ }
+ return false;
+ }
+
+ bool StaticMapTree::GetLocationInfo(const Vector3 &pos, LocationInfo &info) const
+ {
+ LocationInfoCallback intersectionCallBack(iTreeValues, info);
+ iTree.intersectPoint(pos, intersectionCallBack);
+ return intersectionCallBack.result;
+ }
+
+ StaticMapTree::StaticMapTree(uint32 mapID, const std::string &basePath)
+ : iMapID(mapID), iIsTiled(false), iTreeValues(0), iBasePath(basePath)
+ {
+ if (iBasePath.length() > 0 && iBasePath[iBasePath.length()-1] != '/' && iBasePath[iBasePath.length()-1] != '\\')
+ {
+ iBasePath.push_back('/');
+ }
+ }
+
+ //=========================================================
+ //! Make sure to call unloadMap() to unregister acquired model references before destroying
+ StaticMapTree::~StaticMapTree()
+ {
+ delete[] iTreeValues;
+ }
+
+ //=========================================================
+ /**
+ If intersection is found within pMaxDist, sets pMaxDist to intersection distance and returns true.
+ Else, pMaxDist is not modified and returns false;
+ */
+
+ bool StaticMapTree::getIntersectionTime(const G3D::Ray& pRay, float &pMaxDist, bool StopAtFirstHit) const
+ {
+ float distance = pMaxDist;
+ MapRayCallback intersectionCallBack(iTreeValues);
+ iTree.intersectRay(pRay, intersectionCallBack, distance, StopAtFirstHit);
+ if (intersectionCallBack.didHit())
+ pMaxDist = distance;
+ return intersectionCallBack.didHit();
+ }
+ //=========================================================
+
+ bool StaticMapTree::isInLineOfSight(const Vector3& pos1, const Vector3& pos2) const
+ {
+ float maxDist = (pos2 - pos1).magnitude();
+ // return false if distance is over max float, in case of cheater teleporting to the end of the universe
+ if (maxDist == std::numeric_limits<float>::max() || !myisfinite(maxDist))
+ return false;
+
+ // valid map coords should *never ever* produce float overflow, but this would produce NaNs too
+ ASSERT(maxDist < std::numeric_limits<float>::max());
+ // prevent NaN values which can cause BIH intersection to enter infinite loop
+ if (maxDist < 1e-10f)
+ return true;
+ // direction with length of 1
+ G3D::Ray ray = G3D::Ray::fromOriginAndDirection(pos1, (pos2 - pos1)/maxDist);
+ if (getIntersectionTime(ray, maxDist, true))
+ return false;
+
+ return true;
+ }
+ //=========================================================
+ /**
+ When moving from pos1 to pos2 check if we hit an object. Return true and the position if we hit one
+ Return the hit pos or the original dest pos
+ */
+
+ bool StaticMapTree::getObjectHitPos(const Vector3& pPos1, const Vector3& pPos2, Vector3& pResultHitPos, float pModifyDist) const
+ {
+ bool result=false;
+ float maxDist = (pPos2 - pPos1).magnitude();
+ // valid map coords should *never ever* produce float overflow, but this would produce NaNs too
+ ASSERT(maxDist < std::numeric_limits<float>::max());
+ // prevent NaN values which can cause BIH intersection to enter infinite loop
+ if (maxDist < 1e-10f)
+ {
+ pResultHitPos = pPos2;
+ return false;
+ }
+ Vector3 dir = (pPos2 - pPos1)/maxDist; // direction with length of 1
+ G3D::Ray ray(pPos1, dir);
+ float dist = maxDist;
+ if (getIntersectionTime(ray, dist, false))
+ {
+ pResultHitPos = pPos1 + dir * dist;
+ if (pModifyDist < 0)
+ {
+ if ((pResultHitPos - pPos1).magnitude() > -pModifyDist)
+ {
+ pResultHitPos = pResultHitPos + dir*pModifyDist;
+ }
+ else
+ {
+ pResultHitPos = pPos1;
+ }
+ }
+ else
+ {
+ pResultHitPos = pResultHitPos + dir*pModifyDist;
+ }
+ result = true;
+ }
+ else
+ {
+ pResultHitPos = pPos2;
+ result = false;
+ }
+ return result;
+ }
+
+ //=========================================================
+
+ float StaticMapTree::getHeight(const Vector3& pPos, float maxSearchDist) const
+ {
+ float height = G3D::inf();
+ Vector3 dir = Vector3(0, 0, -1);
+ G3D::Ray ray(pPos, dir); // direction with length of 1
+ float maxDist = maxSearchDist;
+ if (getIntersectionTime(ray, maxDist, false))
+ {
+ height = pPos.z - maxDist;
+ }
+ return(height);
+ }
+
+ //=========================================================
+
+ bool StaticMapTree::CanLoadMap(const std::string &vmapPath, uint32 mapID, uint32 tileX, uint32 tileY)
+ {
+ std::string basePath = vmapPath;
+ if (basePath.length() > 0 && basePath[basePath.length()-1] != '/' && basePath[basePath.length()-1] != '\\')
+ basePath.push_back('/');
+ std::string fullname = basePath + VMapManager2::getMapFileName(mapID);
+ bool success = true;
+ FILE* rf = fopen(fullname.c_str(), "rb");
+ if (!rf)
+ return false;
+ // TODO: check magic number when implemented...
+ char tiled;
+ char chunk[8];
+ if (!readChunk(rf, chunk, VMAP_MAGIC, 8) || fread(&tiled, sizeof(char), 1, rf) != 1)
+ {
+ fclose(rf);
+ return false;
+ }
+ if (tiled)
+ {
+ std::string tilefile = basePath + getTileFileName(mapID, tileX, tileY);
+ FILE* tf = fopen(tilefile.c_str(), "rb");
+ if (!tf)
+ success = false;
+ else
+ {
+ if (!readChunk(tf, chunk, VMAP_MAGIC, 8))
+ success = false;
+ fclose(tf);
+ }
+ }
+ fclose(rf);
+ return success;
+ }
+
+ //=========================================================
+
+ bool StaticMapTree::InitMap(const std::string &fname, VMapManager2* vm)
+ {
+ //VMAP_DEBUG_LOG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : initializing StaticMapTree '%s'", fname.c_str());
+ bool success = false;
+ std::string fullname = iBasePath + fname;
+ FILE* rf = fopen(fullname.c_str(), "rb");
+ if (!rf)
+ return false;
+
+ char chunk[8];
+ char tiled = '\0';
+
+ if (readChunk(rf, chunk, VMAP_MAGIC, 8) && fread(&tiled, sizeof(char), 1, rf) == 1 &&
+ readChunk(rf, chunk, "NODE", 4) && iTree.readFromFile(rf))
+ {
+ iNTreeValues = iTree.primCount();
+ iTreeValues = new ModelInstance[iNTreeValues];
+ success = readChunk(rf, chunk, "GOBJ", 4);
+ }
+
+ iIsTiled = bool(tiled);
+
+ // global model spawns
+ // only non-tiled maps have them, and if so exactly one (so far at least...)
+ ModelSpawn spawn;
+#ifdef VMAP_DEBUG
+ //TC_LOG_DEBUG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : map isTiled: %u", static_cast<uint32>(iIsTiled));
+#endif
+ if (!iIsTiled && ModelSpawn::readFromFile(rf, spawn))
+ {
+ WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name);
+ //VMAP_DEBUG_LOG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : loading %s", spawn.name.c_str());
+ if (model)
+ {
+ // assume that global model always is the first and only tree value (could be improved...)
+ iTreeValues[0] = ModelInstance(spawn, model);
+ iLoadedSpawns[0] = 1;
+ }
+ else
+ {
+ success = false;
+ //VMAP_ERROR_LOG(LOG_FILTER_GENERAL, "StaticMapTree::InitMap() : could not acquire WorldModel pointer for '%s'", spawn.name.c_str());
+ }
+ }
+
+ fclose(rf);
+ return success;
+ }
+
+ //=========================================================
+
+ void StaticMapTree::UnloadMap(VMapManager2* vm)
+ {
+ for (loadedSpawnMap::iterator i = iLoadedSpawns.begin(); i != iLoadedSpawns.end(); ++i)
+ {
+ iTreeValues[i->first].setUnloaded();
+ for (uint32 refCount = 0; refCount < i->second; ++refCount)
+ vm->releaseModelInstance(iTreeValues[i->first].name);
+ }
+ iLoadedSpawns.clear();
+ iLoadedTiles.clear();
+ }
+
+ //=========================================================
+
+ bool StaticMapTree::LoadMapTile(uint32 tileX, uint32 tileY, VMapManager2* vm)
+ {
+ if (!iIsTiled)
+ {
+ // currently, core creates grids for all maps, whether it has terrain tiles or not
+ // so we need "fake" tile loads to know when we can unload map geometry
+ iLoadedTiles[packTileID(tileX, tileY)] = false;
+ return true;
+ }
+ if (!iTreeValues)
+ {
+ sLog->outError("StaticMapTree::LoadMapTile() : tree has not been initialized [%u, %u]", tileX, tileY);
+ return false;
+ }
+ bool result = true;
+
+ std::string tilefile = iBasePath + getTileFileName(iMapID, tileX, tileY);
+ FILE* tf = fopen(tilefile.c_str(), "rb");
+ if (tf)
+ {
+ char chunk[8];
+
+ if (!readChunk(tf, chunk, VMAP_MAGIC, 8))
+ result = false;
+ uint32 numSpawns = 0;
+ if (result && fread(&numSpawns, sizeof(uint32), 1, tf) != 1)
+ result = false;
+ for (uint32 i=0; i<numSpawns && result; ++i)
+ {
+ // read model spawns
+ ModelSpawn spawn;
+ result = ModelSpawn::readFromFile(tf, spawn);
+ if (result)
+ {
+ // acquire model instance
+ WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name);
+ if (!model)
+ sLog->outError("StaticMapTree::LoadMapTile() : could not acquire WorldModel pointer [%u, %u]", tileX, tileY);
+
+ // update tree
+ uint32 referencedVal;
+
+ if (fread(&referencedVal, sizeof(uint32), 1, tf) == 1)
+ {
+ if (!iLoadedSpawns.count(referencedVal))
+ {
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) && defined(VMAP_DEBUG)
+ if (referencedVal > iNTreeValues)
+ {
+ sLog->outDebug(LOG_FILTER_MAPS, "StaticMapTree::LoadMapTile() : invalid tree element (%u/%u)", referencedVal, iNTreeValues);
+ continue;
+ }
+#endif
+ iTreeValues[referencedVal] = ModelInstance(spawn, model);
+ iLoadedSpawns[referencedVal] = 1;
+ }
+ else
+ {
+ ++iLoadedSpawns[referencedVal];
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) && defined(VMAP_DEBUG)
+ if (iTreeValues[referencedVal].ID != spawn.ID)
+ sLog->outDebug(LOG_FILTER_MAPS, "StaticMapTree::LoadMapTile() : trying to load wrong spawn in node");
+ else if (iTreeValues[referencedVal].name != spawn.name)
+ sLog->outDebug(LOG_FILTER_MAPS, "StaticMapTree::LoadMapTile() : name collision on GUID=%u", spawn.ID);
+#endif
+ }
+ }
+ else
+ result = false;
+ }
+ }
+ iLoadedTiles[packTileID(tileX, tileY)] = true;
+ fclose(tf);
+ }
+ else
+ iLoadedTiles[packTileID(tileX, tileY)] = false;
+ return result;
+ }
+
+ //=========================================================
+
+ void StaticMapTree::UnloadMapTile(uint32 tileX, uint32 tileY, VMapManager2* vm)
+ {
+ uint32 tileID = packTileID(tileX, tileY);
+ loadedTileMap::iterator tile = iLoadedTiles.find(tileID);
+ if (tile == iLoadedTiles.end())
+ {
+ sLog->outError("StaticMapTree::UnloadMapTile() : trying to unload non-loaded tile - Map:%u X:%u Y:%u", iMapID, tileX, tileY);
+ return;
+ }
+ if (tile->second) // file associated with tile
+ {
+ std::string tilefile = iBasePath + getTileFileName(iMapID, tileX, tileY);
+ FILE* tf = fopen(tilefile.c_str(), "rb");
+ if (tf)
+ {
+ bool result=true;
+ char chunk[8];
+ if (!readChunk(tf, chunk, VMAP_MAGIC, 8))
+ result = false;
+ uint32 numSpawns;
+ if (fread(&numSpawns, sizeof(uint32), 1, tf) != 1)
+ result = false;
+ for (uint32 i=0; i<numSpawns && result; ++i)
+ {
+ // read model spawns
+ ModelSpawn spawn;
+ result = ModelSpawn::readFromFile(tf, spawn);
+ if (result)
+ {
+ // release model instance
+ vm->releaseModelInstance(spawn.name);
+
+ // update tree
+ uint32 referencedNode;
+
+ if (fread(&referencedNode, sizeof(uint32), 1, tf) != 1)
+ result = false;
+ else
+ {
+ if (!iLoadedSpawns.count(referencedNode))
+ sLog->outError("StaticMapTree::UnloadMapTile() : trying to unload non-referenced model '%s' (ID:%u)", spawn.name.c_str(), spawn.ID);
+ else if (--iLoadedSpawns[referencedNode] == 0)
+ {
+ iTreeValues[referencedNode].setUnloaded();
+ iLoadedSpawns.erase(referencedNode);
+ }
+ }
+ }
+ }
+ fclose(tf);
+ }
+ }
+ iLoadedTiles.erase(tile);
+ }
+}
diff --git a/src/common/Collision/Maps/MapTree.h b/src/common/Collision/Maps/MapTree.h
new file mode 100644
index 0000000000..b9ec50d5d9
--- /dev/null
+++ b/src/common/Collision/Maps/MapTree.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MAPTREE_H
+#define _MAPTREE_H
+
+#include "Define.h"
+#include "Dynamic/UnorderedMap.h"
+#include "BoundingIntervalHierarchy.h"
+
+namespace VMAP
+{
+ class ModelInstance;
+ class GroupModel;
+ class VMapManager2;
+
+ struct LocationInfo
+ {
+ LocationInfo(): hitInstance(0), hitModel(0), ground_Z(-G3D::inf()) { }
+ const ModelInstance* hitInstance;
+ const GroupModel* hitModel;
+ float ground_Z;
+ };
+
+ class StaticMapTree
+ {
+ typedef UNORDERED_MAP<uint32, bool> loadedTileMap;
+ typedef UNORDERED_MAP<uint32, uint32> loadedSpawnMap;
+ private:
+ uint32 iMapID;
+ bool iIsTiled;
+ BIH iTree;
+ ModelInstance* iTreeValues; // the tree entries
+ uint32 iNTreeValues;
+
+ // Store all the map tile idents that are loaded for that map
+ // some maps are not splitted into tiles and we have to make sure, not removing the map before all tiles are removed
+ // empty tiles have no tile file, hence map with bool instead of just a set (consistency check)
+ loadedTileMap iLoadedTiles;
+ // stores <tree_index, reference_count> to invalidate tree values, unload map, and to be able to report errors
+ loadedSpawnMap iLoadedSpawns;
+ std::string iBasePath;
+
+ private:
+ bool getIntersectionTime(const G3D::Ray& pRay, float &pMaxDist, bool StopAtFirstHit) const;
+ //bool containsLoadedMapTile(unsigned int pTileIdent) const { return(iLoadedMapTiles.containsKey(pTileIdent)); }
+ public:
+ static std::string getTileFileName(uint32 mapID, uint32 tileX, uint32 tileY);
+ static uint32 packTileID(uint32 tileX, uint32 tileY) { return tileX<<16 | tileY; }
+ static void unpackTileID(uint32 ID, uint32 &tileX, uint32 &tileY) { tileX = ID>>16; tileY = ID&0xFF; }
+ static bool CanLoadMap(const std::string &basePath, uint32 mapID, uint32 tileX, uint32 tileY);
+
+ StaticMapTree(uint32 mapID, const std::string &basePath);
+ ~StaticMapTree();
+
+ bool isInLineOfSight(const G3D::Vector3& pos1, const G3D::Vector3& pos2) const;
+ bool getObjectHitPos(const G3D::Vector3& pos1, const G3D::Vector3& pos2, G3D::Vector3& pResultHitPos, float pModifyDist) const;
+ float getHeight(const G3D::Vector3& pPos, float maxSearchDist) const;
+ bool getAreaInfo(G3D::Vector3 &pos, uint32 &flags, int32 &adtId, int32 &rootId, int32 &groupId) const;
+ bool GetLocationInfo(const G3D::Vector3 &pos, LocationInfo &info) const;
+
+ bool InitMap(const std::string &fname, VMapManager2* vm);
+ void UnloadMap(VMapManager2* vm);
+ bool LoadMapTile(uint32 tileX, uint32 tileY, VMapManager2* vm);
+ void UnloadMapTile(uint32 tileX, uint32 tileY, VMapManager2* vm);
+ bool isTiled() const { return iIsTiled; }
+ uint32 numLoadedTiles() const { return iLoadedTiles.size(); }
+ void getModelInstances(ModelInstance* &models, uint32 &count);
+ };
+
+ struct AreaInfo
+ {
+ AreaInfo(): result(false), ground_Z(-G3D::inf()), flags(0), adtId(0),
+ rootId(0), groupId(0) { }
+ bool result;
+ float ground_Z;
+ uint32 flags;
+ int32 adtId;
+ int32 rootId;
+ int32 groupId;
+ };
+} // VMAP
+
+#endif // _MAPTREE_H
diff --git a/src/common/Collision/Maps/TileAssembler.cpp b/src/common/Collision/Maps/TileAssembler.cpp
new file mode 100644
index 0000000000..93a11367d8
--- /dev/null
+++ b/src/common/Collision/Maps/TileAssembler.cpp
@@ -0,0 +1,528 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "TileAssembler.h"
+#include "MapTree.h"
+#include "BoundingIntervalHierarchy.h"
+#include "VMapDefinitions.h"
+#include "SharedDefines.h"
+
+#include <set>
+#include <iomanip>
+#include <sstream>
+#include <iomanip>
+
+using G3D::Vector3;
+using G3D::AABox;
+using G3D::inf;
+using std::pair;
+
+template<> struct BoundsTrait<VMAP::ModelSpawn*>
+{
+ static void getBounds(const VMAP::ModelSpawn* const &obj, G3D::AABox& out) { out = obj->getBounds(); }
+};
+
+namespace VMAP
+{
+ bool readChunk(FILE* rf, char *dest, const char *compare, uint32 len)
+ {
+ if (fread(dest, sizeof(char), len, rf) != len) return false;
+ return memcmp(dest, compare, len) == 0;
+ }
+
+ Vector3 ModelPosition::transform(const Vector3& pIn) const
+ {
+ Vector3 out = pIn * iScale;
+ out = iRotation * out;
+ return(out);
+ }
+
+ //=================================================================
+
+ TileAssembler::TileAssembler(const std::string& pSrcDirName, const std::string& pDestDirName)
+ : iDestDir(pDestDirName), iSrcDir(pSrcDirName), iFilterMethod(NULL), iCurrentUniqueNameId(0)
+ {
+ //mkdir(iDestDir);
+ //init();
+ }
+
+ TileAssembler::~TileAssembler()
+ {
+ //delete iCoordModelMapping;
+ }
+
+ bool TileAssembler::convertWorld2()
+ {
+ bool success = readMapSpawns();
+ if (!success)
+ return false;
+
+ // export Map data
+ for (MapData::iterator map_iter = mapData.begin(); map_iter != mapData.end() && success; ++map_iter)
+ {
+ // build global map tree
+ std::vector<ModelSpawn*> mapSpawns;
+ UniqueEntryMap::iterator entry;
+ printf("Calculating model bounds for map %u...\n", map_iter->first);
+ for (entry = map_iter->second->UniqueEntries.begin(); entry != map_iter->second->UniqueEntries.end(); ++entry)
+ {
+ // M2 models don't have a bound set in WDT/ADT placement data, i still think they're not used for LoS at all on retail
+ if (entry->second.flags & MOD_M2)
+ {
+ if (!calculateTransformedBound(entry->second))
+ break;
+ }
+ else if (entry->second.flags & MOD_WORLDSPAWN) // WMO maps and terrain maps use different origin, so we need to adapt :/
+ {
+ /// @todo remove extractor hack and uncomment below line:
+ //entry->second.iPos += Vector3(533.33333f*32, 533.33333f*32, 0.f);
+ entry->second.iBound = entry->second.iBound + Vector3(533.33333f*32, 533.33333f*32, 0.f);
+ }
+ mapSpawns.push_back(&(entry->second));
+ spawnedModelFiles.insert(entry->second.name);
+ }
+
+ printf("Creating map tree for map %u...\n", map_iter->first);
+ BIH pTree;
+
+ try
+ {
+ pTree.build(mapSpawns, BoundsTrait<ModelSpawn*>::getBounds);
+ }
+ catch (std::exception& e)
+ {
+ printf("Exception ""%s"" when calling pTree.build", e.what());
+ return false;
+ }
+
+ // ===> possibly move this code to StaticMapTree class
+ std::map<uint32, uint32> modelNodeIdx;
+ for (uint32 i=0; i<mapSpawns.size(); ++i)
+ modelNodeIdx.insert(pair<uint32, uint32>(mapSpawns[i]->ID, i));
+
+ // write map tree file
+ std::stringstream mapfilename;
+ mapfilename << iDestDir << '/' << std::setfill('0') << std::setw(3) << map_iter->first << ".vmtree";
+ FILE* mapfile = fopen(mapfilename.str().c_str(), "wb");
+ if (!mapfile)
+ {
+ success = false;
+ printf("Cannot open %s\n", mapfilename.str().c_str());
+ break;
+ }
+
+ //general info
+ if (success && fwrite(VMAP_MAGIC, 1, 8, mapfile) != 8) success = false;
+ uint32 globalTileID = StaticMapTree::packTileID(65, 65);
+ pair<TileMap::iterator, TileMap::iterator> globalRange = map_iter->second->TileEntries.equal_range(globalTileID);
+ char isTiled = globalRange.first == globalRange.second; // only maps without terrain (tiles) have global WMO
+ if (success && fwrite(&isTiled, sizeof(char), 1, mapfile) != 1) success = false;
+ // Nodes
+ if (success && fwrite("NODE", 4, 1, mapfile) != 1) success = false;
+ if (success) success = pTree.writeToFile(mapfile);
+ // global map spawns (WDT), if any (most instances)
+ if (success && fwrite("GOBJ", 4, 1, mapfile) != 1) success = false;
+
+ for (TileMap::iterator glob=globalRange.first; glob != globalRange.second && success; ++glob)
+ {
+ success = ModelSpawn::writeToFile(mapfile, map_iter->second->UniqueEntries[glob->second]);
+ }
+
+ fclose(mapfile);
+
+ // <====
+
+ // write map tile files, similar to ADT files, only with extra BSP tree node info
+ TileMap &tileEntries = map_iter->second->TileEntries;
+ TileMap::iterator tile;
+ for (tile = tileEntries.begin(); tile != tileEntries.end(); ++tile)
+ {
+ const ModelSpawn &spawn = map_iter->second->UniqueEntries[tile->second];
+ if (spawn.flags & MOD_WORLDSPAWN) // WDT spawn, saved as tile 65/65 currently...
+ continue;
+ uint32 nSpawns = tileEntries.count(tile->first);
+ std::stringstream tilefilename;
+ tilefilename.fill('0');
+ tilefilename << iDestDir << '/' << std::setw(3) << map_iter->first << '_';
+ uint32 x, y;
+ StaticMapTree::unpackTileID(tile->first, x, y);
+ tilefilename << std::setw(2) << x << '_' << std::setw(2) << y << ".vmtile";
+ if (FILE* tilefile = fopen(tilefilename.str().c_str(), "wb"))
+ {
+ // file header
+ if (success && fwrite(VMAP_MAGIC, 1, 8, tilefile) != 8) success = false;
+ // write number of tile spawns
+ if (success && fwrite(&nSpawns, sizeof(uint32), 1, tilefile) != 1) success = false;
+ // write tile spawns
+ for (uint32 s=0; s<nSpawns; ++s)
+ {
+ if (s)
+ ++tile;
+ const ModelSpawn &spawn2 = map_iter->second->UniqueEntries[tile->second];
+ success = success && ModelSpawn::writeToFile(tilefile, spawn2);
+ // MapTree nodes to update when loading tile:
+ std::map<uint32, uint32>::iterator nIdx = modelNodeIdx.find(spawn2.ID);
+ if (success && fwrite(&nIdx->second, sizeof(uint32), 1, tilefile) != 1) success = false;
+ }
+ fclose(tilefile);
+ }
+ }
+ // break; //test, extract only first map; TODO: remvoe this line
+ }
+
+ // add an object models, listed in temp_gameobject_models file
+ exportGameobjectModels();
+ // export objects
+ std::cout << "\nConverting Model Files" << std::endl;
+ for (std::set<std::string>::iterator mfile = spawnedModelFiles.begin(); mfile != spawnedModelFiles.end(); ++mfile)
+ {
+ std::cout << "Converting " << *mfile << std::endl;
+ if (!convertRawFile(*mfile))
+ {
+ std::cout << "error converting " << *mfile << std::endl;
+ success = false;
+ break;
+ }
+ }
+
+ //cleanup:
+ for (MapData::iterator map_iter = mapData.begin(); map_iter != mapData.end(); ++map_iter)
+ {
+ delete map_iter->second;
+ }
+ return success;
+ }
+
+ bool TileAssembler::readMapSpawns()
+ {
+ std::string fname = iSrcDir + "/dir_bin";
+ FILE* dirf = fopen(fname.c_str(), "rb");
+ if (!dirf)
+ {
+ printf("Could not read dir_bin file!\n");
+ return false;
+ }
+ printf("Read coordinate mapping...\n");
+ uint32 mapID, tileX, tileY, check=0;
+ G3D::Vector3 v1, v2;
+ ModelSpawn spawn;
+ while (!feof(dirf))
+ {
+ check = 0;
+ // read mapID, tileX, tileY, Flags, adtID, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, name
+ check += fread(&mapID, sizeof(uint32), 1, dirf);
+ if (check == 0) // EoF...
+ break;
+ check += fread(&tileX, sizeof(uint32), 1, dirf);
+ check += fread(&tileY, sizeof(uint32), 1, dirf);
+ if (!ModelSpawn::readFromFile(dirf, spawn))
+ break;
+
+ MapSpawns *current;
+ MapData::iterator map_iter = mapData.find(mapID);
+ if (map_iter == mapData.end())
+ {
+ printf("spawning Map %d\n", mapID);
+ mapData[mapID] = current = new MapSpawns();
+ }
+ else current = (*map_iter).second;
+ current->UniqueEntries.insert(pair<uint32, ModelSpawn>(spawn.ID, spawn));
+ current->TileEntries.insert(pair<uint32, uint32>(StaticMapTree::packTileID(tileX, tileY), spawn.ID));
+ }
+ bool success = (ferror(dirf) == 0);
+ fclose(dirf);
+ return success;
+ }
+
+ bool TileAssembler::calculateTransformedBound(ModelSpawn &spawn)
+ {
+ std::string modelFilename(iSrcDir);
+ modelFilename.push_back('/');
+ modelFilename.append(spawn.name);
+
+ ModelPosition modelPosition;
+ modelPosition.iDir = spawn.iRot;
+ modelPosition.iScale = spawn.iScale;
+ modelPosition.init();
+
+ WorldModel_Raw raw_model;
+ if (!raw_model.Read(modelFilename.c_str()))
+ return false;
+
+ uint32 groups = raw_model.groupsArray.size();
+ if (groups != 1)
+ printf("Warning: '%s' does not seem to be a M2 model!\n", modelFilename.c_str());
+
+ AABox modelBound;
+ bool boundEmpty=true;
+
+ for (uint32 g=0; g<groups; ++g) // should be only one for M2 files...
+ {
+ std::vector<Vector3>& vertices = raw_model.groupsArray[g].vertexArray;
+
+ if (vertices.empty())
+ {
+ std::cout << "error: model '" << spawn.name << "' has no geometry!" << std::endl;
+ continue;
+ }
+
+ uint32 nvectors = vertices.size();
+ for (uint32 i = 0; i < nvectors; ++i)
+ {
+ Vector3 v = modelPosition.transform(vertices[i]);
+
+ if (boundEmpty)
+ modelBound = AABox(v, v), boundEmpty=false;
+ else
+ modelBound.merge(v);
+ }
+ }
+ spawn.iBound = modelBound + spawn.iPos;
+ spawn.flags |= MOD_HAS_BOUND;
+ return true;
+ }
+
+ struct WMOLiquidHeader
+ {
+ int xverts, yverts, xtiles, ytiles;
+ float pos_x;
+ float pos_y;
+ float pos_z;
+ short type;
+ };
+ //=================================================================
+ bool TileAssembler::convertRawFile(const std::string& pModelFilename)
+ {
+ bool success = true;
+ std::string filename = iSrcDir;
+ if (filename.length() >0)
+ filename.push_back('/');
+ filename.append(pModelFilename);
+
+ WorldModel_Raw raw_model;
+ if (!raw_model.Read(filename.c_str()))
+ return false;
+
+ // write WorldModel
+ WorldModel model;
+ model.setRootWmoID(raw_model.RootWMOID);
+ if (!raw_model.groupsArray.empty())
+ {
+ std::vector<GroupModel> groupsArray;
+
+ uint32 groups = raw_model.groupsArray.size();
+ for (uint32 g = 0; g < groups; ++g)
+ {
+ GroupModel_Raw& raw_group = raw_model.groupsArray[g];
+ groupsArray.push_back(GroupModel(raw_group.mogpflags, raw_group.GroupWMOID, raw_group.bounds ));
+ groupsArray.back().setMeshData(raw_group.vertexArray, raw_group.triangles);
+ groupsArray.back().setLiquidData(raw_group.liquid);
+ }
+
+ model.setGroupModels(groupsArray);
+ }
+
+ success = model.writeFile(iDestDir + "/" + pModelFilename + ".vmo");
+ //std::cout << "readRawFile2: '" << pModelFilename << "' tris: " << nElements << " nodes: " << nNodes << std::endl;
+ return success;
+ }
+
+ void TileAssembler::exportGameobjectModels()
+ {
+ FILE* model_list = fopen((iSrcDir + "/" + "temp_gameobject_models").c_str(), "rb");
+ if (!model_list)
+ return;
+
+ FILE* model_list_copy = fopen((iDestDir + "/" + GAMEOBJECT_MODELS).c_str(), "wb");
+ if (!model_list_copy)
+ {
+ fclose(model_list);
+ return;
+ }
+
+ uint32 name_length, displayId;
+ char buff[500];
+ while (!feof(model_list))
+ {
+ if (fread(&displayId, sizeof(uint32), 1, model_list) != 1
+ || fread(&name_length, sizeof(uint32), 1, model_list) != 1
+ || name_length >= sizeof(buff)
+ || fread(&buff, sizeof(char), name_length, model_list) != name_length)
+ {
+ std::cout << "\nFile 'temp_gameobject_models' seems to be corrupted" << std::endl;
+ break;
+ }
+
+ std::string model_name(buff, name_length);
+
+ WorldModel_Raw raw_model;
+ if ( !raw_model.Read((iSrcDir + "/" + model_name).c_str()) )
+ continue;
+
+ spawnedModelFiles.insert(model_name);
+ AABox bounds;
+ bool boundEmpty = true;
+ for (uint32 g = 0; g < raw_model.groupsArray.size(); ++g)
+ {
+ std::vector<Vector3>& vertices = raw_model.groupsArray[g].vertexArray;
+
+ uint32 nvectors = vertices.size();
+ for (uint32 i = 0; i < nvectors; ++i)
+ {
+ Vector3& v = vertices[i];
+ if (boundEmpty)
+ bounds = AABox(v, v), boundEmpty = false;
+ else
+ bounds.merge(v);
+ }
+ }
+
+ fwrite(&displayId, sizeof(uint32), 1, model_list_copy);
+ fwrite(&name_length, sizeof(uint32), 1, model_list_copy);
+ fwrite(&buff, sizeof(char), name_length, model_list_copy);
+ fwrite(&bounds.low(), sizeof(Vector3), 1, model_list_copy);
+ fwrite(&bounds.high(), sizeof(Vector3), 1, model_list_copy);
+ }
+
+ fclose(model_list);
+ fclose(model_list_copy);
+ }
+ // temporary use defines to simplify read/check code (close file and return at fail)
+ #define READ_OR_RETURN(V, S) if (fread((V), (S), 1, rf) != 1) { \
+ fclose(rf); printf("readfail, op = %i\n", readOperation); return(false); }
+ #define READ_OR_RETURN_WITH_DELETE(V, S) if (fread((V), (S), 1, rf) != 1) { \
+ fclose(rf); printf("readfail, op = %i\n", readOperation); delete[] V; return(false); };
+ #define CMP_OR_RETURN(V, S) if (strcmp((V), (S)) != 0) { \
+ fclose(rf); printf("cmpfail, %s!=%s\n", V, S);return(false); }
+
+ bool GroupModel_Raw::Read(FILE* rf)
+ {
+ char blockId[5];
+ blockId[4] = 0;
+ int blocksize;
+ int readOperation = 0;
+
+ READ_OR_RETURN(&mogpflags, sizeof(uint32));
+ READ_OR_RETURN(&GroupWMOID, sizeof(uint32));
+
+
+ Vector3 vec1, vec2;
+ READ_OR_RETURN(&vec1, sizeof(Vector3));
+
+ READ_OR_RETURN(&vec2, sizeof(Vector3));
+ bounds.set(vec1, vec2);
+
+ READ_OR_RETURN(&liquidflags, sizeof(uint32));
+
+ // will this ever be used? what is it good for anyway??
+ uint32 branches;
+ READ_OR_RETURN(&blockId, 4);
+ CMP_OR_RETURN(blockId, "GRP ");
+ READ_OR_RETURN(&blocksize, sizeof(int));
+ READ_OR_RETURN(&branches, sizeof(uint32));
+ for (uint32 b=0; b<branches; ++b)
+ {
+ uint32 indexes;
+ // indexes for each branch (not used jet)
+ READ_OR_RETURN(&indexes, sizeof(uint32));
+ }
+
+ // ---- indexes
+ READ_OR_RETURN(&blockId, 4);
+ CMP_OR_RETURN(blockId, "INDX");
+ READ_OR_RETURN(&blocksize, sizeof(int));
+ uint32 nindexes;
+ READ_OR_RETURN(&nindexes, sizeof(uint32));
+ if (nindexes >0)
+ {
+ uint16 *indexarray = new uint16[nindexes];
+ READ_OR_RETURN_WITH_DELETE(indexarray, nindexes*sizeof(uint16));
+ triangles.reserve(nindexes / 3);
+ for (uint32 i=0; i<nindexes; i+=3)
+ triangles.push_back(MeshTriangle(indexarray[i], indexarray[i+1], indexarray[i+2]));
+
+ delete[] indexarray;
+ }
+
+ // ---- vectors
+ READ_OR_RETURN(&blockId, 4);
+ CMP_OR_RETURN(blockId, "VERT");
+ READ_OR_RETURN(&blocksize, sizeof(int));
+ uint32 nvectors;
+ READ_OR_RETURN(&nvectors, sizeof(uint32));
+
+ if (nvectors >0)
+ {
+ float *vectorarray = new float[nvectors*3];
+ READ_OR_RETURN_WITH_DELETE(vectorarray, nvectors*sizeof(float)*3);
+ for (uint32 i=0; i<nvectors; ++i)
+ vertexArray.push_back( Vector3(vectorarray + 3*i) );
+
+ delete[] vectorarray;
+ }
+ // ----- liquid
+ liquid = 0;
+ if (liquidflags& 1)
+ {
+ WMOLiquidHeader hlq;
+ READ_OR_RETURN(&blockId, 4);
+ CMP_OR_RETURN(blockId, "LIQU");
+ READ_OR_RETURN(&blocksize, sizeof(int));
+ READ_OR_RETURN(&hlq, sizeof(WMOLiquidHeader));
+ liquid = new WmoLiquid(hlq.xtiles, hlq.ytiles, Vector3(hlq.pos_x, hlq.pos_y, hlq.pos_z), hlq.type);
+ uint32 size = hlq.xverts*hlq.yverts;
+ READ_OR_RETURN(liquid->GetHeightStorage(), size*sizeof(float));
+ size = hlq.xtiles*hlq.ytiles;
+ READ_OR_RETURN(liquid->GetFlagsStorage(), size);
+ }
+
+ return true;
+ }
+
+
+ GroupModel_Raw::~GroupModel_Raw()
+ {
+ delete liquid;
+ }
+
+ bool WorldModel_Raw::Read(const char * path)
+ {
+ FILE* rf = fopen(path, "rb");
+ if (!rf)
+ {
+ printf("ERROR: Can't open raw model file: %s\n", path);
+ return false;
+ }
+
+ char ident[9];
+ ident[8] = '\0';
+ int readOperation = 0;
+
+ READ_OR_RETURN(&ident, 8);
+ CMP_OR_RETURN(ident, RAW_VMAP_MAGIC);
+
+ // we have to read one int. This is needed during the export and we have to skip it here
+ uint32 tempNVectors;
+ READ_OR_RETURN(&tempNVectors, sizeof(tempNVectors));
+
+ uint32 groups;
+ READ_OR_RETURN(&groups, sizeof(uint32));
+ READ_OR_RETURN(&RootWMOID, sizeof(uint32));
+
+ groupsArray.resize(groups);
+ bool succeed = true;
+ for (uint32 g = 0; g < groups && succeed; ++g)
+ succeed = groupsArray[g].Read(rf);
+
+ if (succeed) /// rf will be freed inside Read if the function had any errors.
+ fclose(rf);
+ return succeed;
+ }
+
+ // drop of temporary use defines
+ #undef READ_OR_RETURN
+ #undef CMP_OR_RETURN
+}
diff --git a/src/common/Collision/Maps/TileAssembler.h b/src/common/Collision/Maps/TileAssembler.h
new file mode 100644
index 0000000000..d93662d7fc
--- /dev/null
+++ b/src/common/Collision/Maps/TileAssembler.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _TILEASSEMBLER_H_
+#define _TILEASSEMBLER_H_
+
+#include <G3D/Vector3.h>
+#include <G3D/Matrix3.h>
+#include <map>
+#include <set>
+
+#include "ModelInstance.h"
+#include "WorldModel.h"
+
+namespace VMAP
+{
+ /**
+ This Class is used to convert raw vector data into balanced BSP-Trees.
+ To start the conversion call convertWorld().
+ */
+ //===============================================
+
+ class ModelPosition
+ {
+ private:
+ G3D::Matrix3 iRotation;
+ public:
+ ModelPosition(): iScale(0.0f) { }
+ G3D::Vector3 iPos;
+ G3D::Vector3 iDir;
+ float iScale;
+ void init()
+ {
+ iRotation = G3D::Matrix3::fromEulerAnglesZYX(G3D::pif()*iDir.y/180.f, G3D::pif()*iDir.x/180.f, G3D::pif()*iDir.z/180.f);
+ }
+ G3D::Vector3 transform(const G3D::Vector3& pIn) const;
+ void moveToBasePos(const G3D::Vector3& pBasePos) { iPos -= pBasePos; }
+ };
+
+ typedef std::map<uint32, ModelSpawn> UniqueEntryMap;
+ typedef std::multimap<uint32, uint32> TileMap;
+
+ struct MapSpawns
+ {
+ UniqueEntryMap UniqueEntries;
+ TileMap TileEntries;
+ };
+
+ typedef std::map<uint32, MapSpawns*> MapData;
+ //===============================================
+
+ struct GroupModel_Raw
+ {
+ uint32 mogpflags;
+ uint32 GroupWMOID;
+
+ G3D::AABox bounds;
+ uint32 liquidflags;
+ std::vector<MeshTriangle> triangles;
+ std::vector<G3D::Vector3> vertexArray;
+ class WmoLiquid* liquid;
+
+ GroupModel_Raw() : mogpflags(0), GroupWMOID(0), liquidflags(0),
+ liquid(NULL) { }
+ ~GroupModel_Raw();
+
+ bool Read(FILE* f);
+ };
+
+ struct WorldModel_Raw
+ {
+ uint32 RootWMOID;
+ std::vector<GroupModel_Raw> groupsArray;
+
+ bool Read(const char * path);
+ };
+
+ class TileAssembler
+ {
+ private:
+ std::string iDestDir;
+ std::string iSrcDir;
+ bool (*iFilterMethod)(char *pName);
+ G3D::Table<std::string, unsigned int > iUniqueNameIds;
+ unsigned int iCurrentUniqueNameId;
+ MapData mapData;
+ std::set<std::string> spawnedModelFiles;
+
+ public:
+ TileAssembler(const std::string& pSrcDirName, const std::string& pDestDirName);
+ virtual ~TileAssembler();
+
+ bool convertWorld2();
+ bool readMapSpawns();
+ bool calculateTransformedBound(ModelSpawn &spawn);
+ void exportGameobjectModels();
+
+ bool convertRawFile(const std::string& pModelFilename);
+ void setModelNameFilterMethod(bool (*pFilterMethod)(char *pName)) { iFilterMethod = pFilterMethod; }
+ std::string getDirEntryNameFromModName(unsigned int pMapId, const std::string& pModPosName);
+ };
+
+} // VMAP
+#endif /*_TILEASSEMBLER_H_*/
diff --git a/src/common/Collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp
new file mode 100644
index 0000000000..d548ddb432
--- /dev/null
+++ b/src/common/Collision/Models/GameObjectModel.cpp
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "VMapFactory.h"
+#include "VMapManager2.h"
+#include "VMapDefinitions.h"
+#include "WorldModel.h"
+
+#include "GameObjectModel.h"
+#include "Log.h"
+#include "GameObject.h"
+#include "Creature.h"
+#include "TemporarySummon.h"
+#include "Object.h"
+#include "DBCStores.h"
+#include "World.h"
+
+using G3D::Vector3;
+using G3D::Ray;
+using G3D::AABox;
+
+struct GameobjectModelData
+{
+ GameobjectModelData(const std::string& name_, const AABox& box) :
+ bound(box), name(name_) {}
+
+ AABox bound;
+ std::string name;
+};
+
+typedef UNORDERED_MAP<uint32, GameobjectModelData> ModelList;
+ModelList model_list;
+
+void LoadGameObjectModelList()
+{
+//#ifndef NO_CORE_FUNCS
+ uint32 oldMSTime = getMSTime();
+//#endif
+
+ FILE* model_list_file = fopen((sWorld->GetDataPath() + "vmaps/" + VMAP::GAMEOBJECT_MODELS).c_str(), "rb");
+ if (!model_list_file)
+ {
+ sLog->outError("Unable to open '%s' file.", VMAP::GAMEOBJECT_MODELS);
+ return;
+ }
+
+ uint32 name_length, displayId;
+ char buff[500];
+ while (true)
+ {
+ Vector3 v1, v2;
+ if (fread(&displayId, sizeof(uint32), 1, model_list_file) != 1)
+ if (feof(model_list_file)) // EOF flag is only set after failed reading attempt
+ break;
+
+ if (fread(&name_length, sizeof(uint32), 1, model_list_file) != 1
+ || name_length >= sizeof(buff)
+ || fread(&buff, sizeof(char), name_length, model_list_file) != name_length
+ || fread(&v1, sizeof(Vector3), 1, model_list_file) != 1
+ || fread(&v2, sizeof(Vector3), 1, model_list_file) != 1)
+ {
+ sLog->outError("File '%s' seems to be corrupted!", VMAP::GAMEOBJECT_MODELS);
+ break;
+ }
+
+ model_list.insert
+ (
+ ModelList::value_type( displayId, GameobjectModelData(std::string(buff, name_length), AABox(v1, v2)) )
+ );
+ }
+
+ fclose(model_list_file);
+ sLog->outString(">> Loaded %u GameObject models in %u ms", uint32(model_list.size()), GetMSTimeDiffToNow(oldMSTime));
+ sLog->outString();
+}
+
+GameObjectModel::~GameObjectModel()
+{
+ if (iModel)
+ ((VMAP::VMapManager2*)VMAP::VMapFactory::createOrGetVMapManager())->releaseModelInstance(name);
+}
+
+bool GameObjectModel::initialize(const GameObject& go, const GameObjectDisplayInfoEntry& info)
+{
+ ModelList::const_iterator it = model_list.find(info.Displayid);
+ if (it == model_list.end())
+ return false;
+
+ G3D::AABox mdl_box(it->second.bound);
+ // ignore models with no bounds
+ if (mdl_box == G3D::AABox::zero())
+ {
+ sLog->outError("GameObject model %s has zero bounds, loading skipped", it->second.name.c_str());
+ return false;
+ }
+
+ iModel = ((VMAP::VMapManager2*)VMAP::VMapFactory::createOrGetVMapManager())->acquireModelInstance(sWorld->GetDataPath() + "vmaps/", it->second.name);
+
+ if (!iModel)
+ return false;
+
+ name = it->second.name;
+ //flags = VMAP::MOD_M2;
+ //adtId = 0;
+ //ID = 0;
+ iPos = Vector3(go.GetPositionX(), go.GetPositionY(), go.GetPositionZ());
+
+ // pussywizard:
+ phasemask = (go.GetGoState() == GO_STATE_READY || go.IsTransport()) ? go.GetPhaseMask() : 0;
+
+ iScale = go.GetFloatValue(OBJECT_FIELD_SCALE_X);
+ iInvScale = 1.f / iScale;
+
+ G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(go.GetOrientation(), 0, 0);
+ iInvRot = iRotation.inverse();
+ // transform bounding box:
+ mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale);
+ AABox rotated_bounds;
+ for (int i = 0; i < 8; ++i)
+ rotated_bounds.merge(iRotation * mdl_box.corner(i));
+
+ iBound = rotated_bounds + iPos;
+#ifdef SPAWN_CORNERS
+ // test:
+ for (int i = 0; i < 8; ++i)
+ {
+ Vector3 pos(iBound.corner(i));
+ const_cast<GameObject&>(go).SummonCreature(1, pos.x, pos.y, pos.z, 0, TEMPSUMMON_MANUAL_DESPAWN);
+ }
+#endif
+
+ owner = &go;
+ return true;
+}
+
+GameObjectModel* GameObjectModel::Create(const GameObject& go)
+{
+ const GameObjectDisplayInfoEntry* info = sGameObjectDisplayInfoStore.LookupEntry(go.GetDisplayId());
+ if (!info)
+ return NULL;
+
+ GameObjectModel* mdl = new GameObjectModel();
+ if (!mdl->initialize(go, *info))
+ {
+ delete mdl;
+ return NULL;
+ }
+
+ return mdl;
+}
+
+bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask) const
+{
+ if (!(phasemask & ph_mask) || !owner->isSpawned())
+ return false;
+
+ float time = ray.intersectionTime(iBound);
+ if (time == G3D::inf())
+ return false;
+
+ // child bounds are defined in object space:
+ Vector3 p = iInvRot * (ray.origin() - iPos) * iInvScale;
+ Ray modRay(p, iInvRot * ray.direction());
+ float distance = MaxDist * iInvScale;
+ bool hit = iModel->IntersectRay(modRay, distance, StopAtFirstHit);
+ if (hit)
+ {
+ distance *= iScale;
+ MaxDist = distance;
+ }
+ return hit;
+}
+
+bool GameObjectModel::UpdatePosition()
+{
+ if (!iModel)
+ return false;
+
+ ModelList::const_iterator it = model_list.find(owner->GetDisplayId());
+ if (it == model_list.end())
+ return false;
+
+ G3D::AABox mdl_box(it->second.bound);
+ // ignore models with no bounds
+ if (mdl_box == G3D::AABox::zero())
+ {
+ //VMAP_ERROR_LOG("misc", "GameObject model %s has zero bounds, loading skipped", it->second.name.c_str());
+ return false;
+ }
+
+ iPos = Vector3(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ());
+ G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(owner->GetOrientation(), 0, 0);
+ iInvRot = iRotation.inverse();
+ // transform bounding box:
+ mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale);
+ AABox rotated_bounds;
+ for (int i = 0; i < 8; ++i)
+ rotated_bounds.merge(iRotation * mdl_box.corner(i));
+
+ iBound = rotated_bounds + iPos;
+#ifdef SPAWN_CORNERS
+ // test:
+ for (int i = 0; i < 8; ++i)
+ {
+ Vector3 pos(iBound.corner(i));
+ owner->SummonCreature(1, pos.x, pos.y, pos.z, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 10000);
+ }
+#endif
+
+ return true;
+}
diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h
new file mode 100644
index 0000000000..f5b545014e
--- /dev/null
+++ b/src/common/Collision/Models/GameObjectModel.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _GAMEOBJECT_MODEL_H
+#define _GAMEOBJECT_MODEL_H
+
+#include <G3D/Matrix3.h>
+#include <G3D/Vector3.h>
+#include <G3D/AABox.h>
+#include <G3D/Ray.h>
+
+#include "Define.h"
+
+namespace VMAP
+{
+ class WorldModel;
+}
+
+class GameObject;
+struct GameObjectDisplayInfoEntry;
+
+class GameObjectModel /*, public Intersectable*/
+{
+ uint32 phasemask;
+ G3D::AABox iBound;
+ G3D::Matrix3 iInvRot;
+ G3D::Vector3 iPos;
+ //G3D::Vector3 iRot;
+ float iInvScale;
+ float iScale;
+ VMAP::WorldModel* iModel;
+ GameObject const* owner;
+
+ GameObjectModel() : phasemask(0), iInvScale(0), iScale(0), iModel(NULL), owner(NULL) { }
+ bool initialize(const GameObject& go, const GameObjectDisplayInfoEntry& info);
+
+public:
+ std::string name;
+
+ const G3D::AABox& getBounds() const { return iBound; }
+
+ ~GameObjectModel();
+
+ const G3D::Vector3& getPosition() const { return iPos;}
+
+ /** Enables\disables collision. */
+ void disable() { phasemask = 0;}
+ void enable(uint32 ph_mask) { phasemask = ph_mask;}
+
+ bool isEnabled() const {return phasemask != 0;}
+
+ bool intersectRay(const G3D::Ray& Ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask) const;
+
+ static GameObjectModel* Create(const GameObject& go);
+
+ bool UpdatePosition();
+};
+
+#endif // _GAMEOBJECT_MODEL_H \ No newline at end of file
diff --git a/src/common/Collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp
new file mode 100644
index 0000000000..18faf11e5d
--- /dev/null
+++ b/src/common/Collision/Models/ModelInstance.cpp
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ModelInstance.h"
+#include "WorldModel.h"
+#include "MapTree.h"
+#include "VMapDefinitions.h"
+
+using G3D::Vector3;
+using G3D::Ray;
+
+namespace VMAP
+{
+ ModelInstance::ModelInstance(const ModelSpawn &spawn, WorldModel* model): ModelSpawn(spawn), iModel(model)
+ {
+ iInvRot = G3D::Matrix3::fromEulerAnglesZYX(G3D::pi()*iRot.y/180.f, G3D::pi()*iRot.x/180.f, G3D::pi()*iRot.z/180.f).inverse();
+ iInvScale = 1.f/iScale;
+ }
+
+ bool ModelInstance::intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool StopAtFirstHit) const
+ {
+ if (!iModel)
+ {
+ //std::cout << "<object not loaded>\n";
+ return false;
+ }
+ float time = pRay.intersectionTime(iBound);
+ if (time == G3D::inf())
+ {
+// std::cout << "Ray does not hit '" << name << "'\n";
+
+ return false;
+ }
+// std::cout << "Ray crosses bound of '" << name << "'\n";
+/* std::cout << "ray from:" << pRay.origin().x << ", " << pRay.origin().y << ", " << pRay.origin().z
+ << " dir:" << pRay.direction().x << ", " << pRay.direction().y << ", " << pRay.direction().z
+ << " t/tmax:" << time << '/' << pMaxDist;
+ std::cout << "\nBound lo:" << iBound.low().x << ", " << iBound.low().y << ", " << iBound.low().z << " hi: "
+ << iBound.high().x << ", " << iBound.high().y << ", " << iBound.high().z << std::endl; */
+ // child bounds are defined in object space:
+ Vector3 p = iInvRot * (pRay.origin() - iPos) * iInvScale;
+ Ray modRay(p, iInvRot * pRay.direction());
+ float distance = pMaxDist * iInvScale;
+ bool hit = iModel->IntersectRay(modRay, distance, StopAtFirstHit);
+ if (hit)
+ {
+ distance *= iScale;
+ pMaxDist = distance;
+ }
+ return hit;
+ }
+
+ void ModelInstance::intersectPoint(const G3D::Vector3& p, AreaInfo &info) const
+ {
+ if (!iModel)
+ {
+#ifdef VMAP_DEBUG
+ std::cout << "<object not loaded>\n";
+#endif
+ return;
+ }
+
+ // M2 files don't contain area info, only WMO files
+ if (flags & MOD_M2)
+ return;
+ if (!iBound.contains(p))
+ return;
+ // child bounds are defined in object space:
+ Vector3 pModel = iInvRot * (p - iPos) * iInvScale;
+ Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f);
+ float zDist;
+ if (iModel->IntersectPoint(pModel, zDirModel, zDist, info))
+ {
+ Vector3 modelGround = pModel + zDist * zDirModel;
+ // Transform back to world space. Note that:
+ // Mat * vec == vec * Mat.transpose()
+ // and for rotation matrices: Mat.inverse() == Mat.transpose()
+ float world_Z = ((modelGround * iInvRot) * iScale + iPos).z;
+ if (info.ground_Z < world_Z)
+ {
+ info.ground_Z = world_Z;
+ info.adtId = adtId;
+ }
+ }
+ }
+
+ bool ModelInstance::GetLocationInfo(const G3D::Vector3& p, LocationInfo &info) const
+ {
+ if (!iModel)
+ {
+#ifdef VMAP_DEBUG
+ std::cout << "<object not loaded>\n";
+#endif
+ return false;
+ }
+
+ // M2 files don't contain area info, only WMO files
+ if (flags & MOD_M2)
+ return false;
+ if (!iBound.contains(p))
+ return false;
+ // child bounds are defined in object space:
+ Vector3 pModel = iInvRot * (p - iPos) * iInvScale;
+ Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f);
+ float zDist;
+ if (iModel->GetLocationInfo(pModel, zDirModel, zDist, info))
+ {
+ Vector3 modelGround = pModel + zDist * zDirModel;
+ // Transform back to world space. Note that:
+ // Mat * vec == vec * Mat.transpose()
+ // and for rotation matrices: Mat.inverse() == Mat.transpose()
+ float world_Z = ((modelGround * iInvRot) * iScale + iPos).z;
+ if (info.ground_Z < world_Z) // hm...could it be handled automatically with zDist at intersection?
+ {
+ info.ground_Z = world_Z;
+ info.hitInstance = this;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool ModelInstance::GetLiquidLevel(const G3D::Vector3& p, LocationInfo &info, float &liqHeight) const
+ {
+ // child bounds are defined in object space:
+ Vector3 pModel = iInvRot * (p - iPos) * iInvScale;
+ //Vector3 zDirModel = iInvRot * Vector3(0.f, 0.f, -1.f);
+ float zDist;
+ if (info.hitModel->GetLiquidLevel(pModel, zDist))
+ {
+ // calculate world height (zDist in model coords):
+ // assume WMO not tilted (wouldn't make much sense anyway)
+ liqHeight = zDist * iScale + iPos.z;
+ return true;
+ }
+ return false;
+ }
+
+ bool ModelSpawn::readFromFile(FILE* rf, ModelSpawn &spawn)
+ {
+ uint32 check = 0, nameLen;
+ check += fread(&spawn.flags, sizeof(uint32), 1, rf);
+ // EoF?
+ if (!check)
+ {
+ if (ferror(rf))
+ std::cout << "Error reading ModelSpawn!\n";
+ return false;
+ }
+ check += fread(&spawn.adtId, sizeof(uint16), 1, rf);
+ check += fread(&spawn.ID, sizeof(uint32), 1, rf);
+ check += fread(&spawn.iPos, sizeof(float), 3, rf);
+ check += fread(&spawn.iRot, sizeof(float), 3, rf);
+ check += fread(&spawn.iScale, sizeof(float), 1, rf);
+ bool has_bound = (spawn.flags & MOD_HAS_BOUND);
+ if (has_bound) // only WMOs have bound in MPQ, only available after computation
+ {
+ Vector3 bLow, bHigh;
+ check += fread(&bLow, sizeof(float), 3, rf);
+ check += fread(&bHigh, sizeof(float), 3, rf);
+ spawn.iBound = G3D::AABox(bLow, bHigh);
+ }
+ check += fread(&nameLen, sizeof(uint32), 1, rf);
+ if (check != uint32(has_bound ? 17 : 11))
+ {
+ std::cout << "Error reading ModelSpawn!\n";
+ return false;
+ }
+ char nameBuff[500];
+ if (nameLen > 500) // file names should never be that long, must be file error
+ {
+ std::cout << "Error reading ModelSpawn, file name too long!\n";
+ return false;
+ }
+ check = fread(nameBuff, sizeof(char), nameLen, rf);
+ if (check != nameLen)
+ {
+ std::cout << "Error reading ModelSpawn!\n";
+ return false;
+ }
+ spawn.name = std::string(nameBuff, nameLen);
+ return true;
+ }
+
+ bool ModelSpawn::writeToFile(FILE* wf, const ModelSpawn &spawn)
+ {
+ uint32 check=0;
+ check += fwrite(&spawn.flags, sizeof(uint32), 1, wf);
+ check += fwrite(&spawn.adtId, sizeof(uint16), 1, wf);
+ check += fwrite(&spawn.ID, sizeof(uint32), 1, wf);
+ check += fwrite(&spawn.iPos, sizeof(float), 3, wf);
+ check += fwrite(&spawn.iRot, sizeof(float), 3, wf);
+ check += fwrite(&spawn.iScale, sizeof(float), 1, wf);
+ bool has_bound = (spawn.flags & MOD_HAS_BOUND);
+ if (has_bound) // only WMOs have bound in MPQ, only available after computation
+ {
+ check += fwrite(&spawn.iBound.low(), sizeof(float), 3, wf);
+ check += fwrite(&spawn.iBound.high(), sizeof(float), 3, wf);
+ }
+ uint32 nameLen = spawn.name.length();
+ check += fwrite(&nameLen, sizeof(uint32), 1, wf);
+ if (check != uint32(has_bound ? 17 : 11)) return false;
+ check = fwrite(spawn.name.c_str(), sizeof(char), nameLen, wf);
+ if (check != nameLen) return false;
+ return true;
+ }
+
+}
diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h
new file mode 100644
index 0000000000..16a9c34ca7
--- /dev/null
+++ b/src/common/Collision/Models/ModelInstance.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MODELINSTANCE_H_
+#define _MODELINSTANCE_H_
+
+#include <G3D/Matrix3.h>
+#include <G3D/Vector3.h>
+#include <G3D/AABox.h>
+#include <G3D/Ray.h>
+
+#include "Define.h"
+
+namespace VMAP
+{
+ class WorldModel;
+ struct AreaInfo;
+ struct LocationInfo;
+
+ enum ModelFlags
+ {
+ MOD_M2 = 1,
+ MOD_WORLDSPAWN = 1<<1,
+ MOD_HAS_BOUND = 1<<2
+ };
+
+ class ModelSpawn
+ {
+ public:
+ //mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, name
+ uint32 flags;
+ uint16 adtId;
+ uint32 ID;
+ G3D::Vector3 iPos;
+ G3D::Vector3 iRot;
+ float iScale;
+ G3D::AABox iBound;
+ std::string name;
+ bool operator==(const ModelSpawn &other) const { return ID == other.ID; }
+ //uint32 hashCode() const { return ID; }
+ // temp?
+ const G3D::AABox& getBounds() const { return iBound; }
+
+ static bool readFromFile(FILE* rf, ModelSpawn &spawn);
+ static bool writeToFile(FILE* rw, const ModelSpawn &spawn);
+ };
+
+ class ModelInstance: public ModelSpawn
+ {
+ public:
+ ModelInstance(): iInvScale(0.0f), iModel(0) { }
+ ModelInstance(const ModelSpawn &spawn, WorldModel* model);
+ void setUnloaded() { iModel = 0; }
+ bool intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool StopAtFirstHit) const;
+ void intersectPoint(const G3D::Vector3& p, AreaInfo &info) const;
+ bool GetLocationInfo(const G3D::Vector3& p, LocationInfo &info) const;
+ bool GetLiquidLevel(const G3D::Vector3& p, LocationInfo &info, float &liqHeight) const;
+ protected:
+ G3D::Matrix3 iInvRot;
+ float iInvScale;
+ WorldModel* iModel;
+ public:
+ WorldModel* getWorldModel();
+ };
+} // namespace VMAP
+
+#endif // _MODELINSTANCE
diff --git a/src/common/Collision/Models/WorldModel.cpp b/src/common/Collision/Models/WorldModel.cpp
new file mode 100644
index 0000000000..622fb55212
--- /dev/null
+++ b/src/common/Collision/Models/WorldModel.cpp
@@ -0,0 +1,574 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "WorldModel.h"
+#include "ModelInstance.h"
+#include "VMapDefinitions.h"
+#include "MapTree.h"
+
+using G3D::Vector3;
+using G3D::Ray;
+
+template<> struct BoundsTrait<VMAP::GroupModel>
+{
+ static void getBounds(const VMAP::GroupModel& obj, G3D::AABox& out) { out = obj.GetBound(); }
+};
+
+namespace VMAP
+{
+ bool IntersectTriangle(const MeshTriangle &tri, std::vector<Vector3>::const_iterator points, const G3D::Ray &ray, float &distance)
+ {
+ static const float EPS = 1e-5f;
+
+ // See RTR2 ch. 13.7 for the algorithm.
+
+ const Vector3 e1 = points[tri.idx1] - points[tri.idx0];
+ const Vector3 e2 = points[tri.idx2] - points[tri.idx0];
+ const Vector3 p(ray.direction().cross(e2));
+ const float a = e1.dot(p);
+
+ if (fabs(a) < EPS) {
+ // Determinant is ill-conditioned; abort early
+ return false;
+ }
+
+ const float f = 1.0f / a;
+ const Vector3 s(ray.origin() - points[tri.idx0]);
+ const float u = f * s.dot(p);
+
+ if ((u < 0.0f) || (u > 1.0f)) {
+ // We hit the plane of the m_geometry, but outside the m_geometry
+ return false;
+ }
+
+ const Vector3 q(s.cross(e1));
+ const float v = f * ray.direction().dot(q);
+
+ if ((v < 0.0f) || ((u + v) > 1.0f)) {
+ // We hit the plane of the triangle, but outside the triangle
+ return false;
+ }
+
+ const float t = f * e2.dot(q);
+
+ if ((t > 0.0f) && (t < distance))
+ {
+ // This is a new hit, closer than the previous one
+ distance = t;
+
+ /* baryCoord[0] = 1.0 - u - v;
+ baryCoord[1] = u;
+ baryCoord[2] = v; */
+
+ return true;
+ }
+ // This hit is after the previous hit, so ignore it
+ return false;
+ }
+
+ class TriBoundFunc
+ {
+ public:
+ TriBoundFunc(std::vector<Vector3> &vert): vertices(vert.begin()) { }
+ void operator()(const MeshTriangle &tri, G3D::AABox &out) const
+ {
+ G3D::Vector3 lo = vertices[tri.idx0];
+ G3D::Vector3 hi = lo;
+
+ lo = (lo.min(vertices[tri.idx1])).min(vertices[tri.idx2]);
+ hi = (hi.max(vertices[tri.idx1])).max(vertices[tri.idx2]);
+
+ out = G3D::AABox(lo, hi);
+ }
+ protected:
+ const std::vector<Vector3>::const_iterator vertices;
+ };
+
+ // ===================== WmoLiquid ==================================
+
+ WmoLiquid::WmoLiquid(uint32 width, uint32 height, const Vector3 &corner, uint32 type):
+ iTilesX(width), iTilesY(height), iCorner(corner), iType(type)
+ {
+ iHeight = new float[(width+1)*(height+1)];
+ iFlags = new uint8[width*height];
+ }
+
+ WmoLiquid::WmoLiquid(const WmoLiquid &other): iHeight(0), iFlags(0)
+ {
+ *this = other; // use assignment operator...
+ }
+
+ WmoLiquid::~WmoLiquid()
+ {
+ delete[] iHeight;
+ delete[] iFlags;
+ }
+
+ WmoLiquid& WmoLiquid::operator=(const WmoLiquid &other)
+ {
+ if (this == &other)
+ return *this;
+ iTilesX = other.iTilesX;
+ iTilesY = other.iTilesY;
+ iCorner = other.iCorner;
+ iType = other.iType;
+ delete iHeight;
+ delete iFlags;
+ if (other.iHeight)
+ {
+ iHeight = new float[(iTilesX+1)*(iTilesY+1)];
+ memcpy(iHeight, other.iHeight, (iTilesX+1)*(iTilesY+1)*sizeof(float));
+ }
+ else
+ iHeight = 0;
+ if (other.iFlags)
+ {
+ iFlags = new uint8[iTilesX * iTilesY];
+ memcpy(iFlags, other.iFlags, iTilesX * iTilesY);
+ }
+ else
+ iFlags = 0;
+ return *this;
+ }
+
+ bool WmoLiquid::GetLiquidHeight(const Vector3 &pos, float &liqHeight) const
+ {
+ float tx_f = (pos.x - iCorner.x)/LIQUID_TILE_SIZE;
+ uint32 tx = uint32(tx_f);
+ if (tx_f < 0.0f || tx >= iTilesX)
+ return false;
+ float ty_f = (pos.y - iCorner.y)/LIQUID_TILE_SIZE;
+ uint32 ty = uint32(ty_f);
+ if (ty_f < 0.0f || ty >= iTilesY)
+ return false;
+
+ // check if tile shall be used for liquid level
+ // checking for 0x08 *might* be enough, but disabled tiles always are 0x?F:
+ if ((iFlags[tx + ty*iTilesX] & 0x0F) == 0x0F)
+ return false;
+
+ // (dx, dy) coordinates inside tile, in [0, 1]^2
+ float dx = tx_f - (float)tx;
+ float dy = ty_f - (float)ty;
+
+ /* Tesselate tile to two triangles (not sure if client does it exactly like this)
+
+ ^ dy
+ |
+ 1 x---------x (1, 1)
+ | (b) / |
+ | / |
+ | / |
+ | / (a) |
+ x---------x---> dx
+ 0 1
+ */
+
+ const uint32 rowOffset = iTilesX + 1;
+ if (dx > dy) // case (a)
+ {
+ float sx = iHeight[tx+1 + ty * rowOffset] - iHeight[tx + ty * rowOffset];
+ float sy = iHeight[tx+1 + (ty+1) * rowOffset] - iHeight[tx+1 + ty * rowOffset];
+ liqHeight = iHeight[tx + ty * rowOffset] + dx * sx + dy * sy;
+ }
+ else // case (b)
+ {
+ float sx = iHeight[tx+1 + (ty+1) * rowOffset] - iHeight[tx + (ty+1) * rowOffset];
+ float sy = iHeight[tx + (ty+1) * rowOffset] - iHeight[tx + ty * rowOffset];
+ liqHeight = iHeight[tx + ty * rowOffset] + dx * sx + dy * sy;
+ }
+ return true;
+ }
+
+ uint32 WmoLiquid::GetFileSize()
+ {
+ return 2 * sizeof(uint32) +
+ sizeof(Vector3) +
+ (iTilesX + 1)*(iTilesY + 1) * sizeof(float) +
+ iTilesX * iTilesY;
+ }
+
+ bool WmoLiquid::writeToFile(FILE* wf)
+ {
+ bool result = false;
+ if (fwrite(&iTilesX, sizeof(uint32), 1, wf) == 1 &&
+ fwrite(&iTilesY, sizeof(uint32), 1, wf) == 1 &&
+ fwrite(&iCorner, sizeof(Vector3), 1, wf) == 1 &&
+ fwrite(&iType, sizeof(uint32), 1, wf) == 1)
+ {
+ uint32 size = (iTilesX + 1) * (iTilesY + 1);
+ if (fwrite(iHeight, sizeof(float), size, wf) == size)
+ {
+ size = iTilesX*iTilesY;
+ result = fwrite(iFlags, sizeof(uint8), size, wf) == size;
+ }
+ }
+
+ return result;
+ }
+
+ bool WmoLiquid::readFromFile(FILE* rf, WmoLiquid* &out)
+ {
+ bool result = false;
+ WmoLiquid* liquid = new WmoLiquid();
+
+ if (fread(&liquid->iTilesX, sizeof(uint32), 1, rf) == 1 &&
+ fread(&liquid->iTilesY, sizeof(uint32), 1, rf) == 1 &&
+ fread(&liquid->iCorner, sizeof(Vector3), 1, rf) == 1 &&
+ fread(&liquid->iType, sizeof(uint32), 1, rf) == 1)
+ {
+ uint32 size = (liquid->iTilesX + 1) * (liquid->iTilesY + 1);
+ liquid->iHeight = new float[size];
+ if (fread(liquid->iHeight, sizeof(float), size, rf) == size)
+ {
+ size = liquid->iTilesX * liquid->iTilesY;
+ liquid->iFlags = new uint8[size];
+ result = fread(liquid->iFlags, sizeof(uint8), size, rf) == size;
+ }
+ }
+
+ if (!result)
+ delete liquid;
+ else
+ out = liquid;
+
+ return result;
+ }
+
+ // ===================== GroupModel ==================================
+
+ GroupModel::GroupModel(const GroupModel &other):
+ iBound(other.iBound), iMogpFlags(other.iMogpFlags), iGroupWMOID(other.iGroupWMOID),
+ vertices(other.vertices), triangles(other.triangles), meshTree(other.meshTree), iLiquid(0)
+ {
+ if (other.iLiquid)
+ iLiquid = new WmoLiquid(*other.iLiquid);
+ }
+
+ void GroupModel::setMeshData(std::vector<Vector3> &vert, std::vector<MeshTriangle> &tri)
+ {
+ vertices.swap(vert);
+ triangles.swap(tri);
+ TriBoundFunc bFunc(vertices);
+ meshTree.build(triangles, bFunc);
+ }
+
+ bool GroupModel::writeToFile(FILE* wf)
+ {
+ bool result = true;
+ uint32 chunkSize, count;
+
+ if (result && fwrite(&iBound, sizeof(G3D::AABox), 1, wf) != 1) result = false;
+ if (result && fwrite(&iMogpFlags, sizeof(uint32), 1, wf) != 1) result = false;
+ if (result && fwrite(&iGroupWMOID, sizeof(uint32), 1, wf) != 1) result = false;
+
+ // write vertices
+ if (result && fwrite("VERT", 1, 4, wf) != 4) result = false;
+ count = vertices.size();
+ chunkSize = sizeof(uint32)+ sizeof(Vector3)*count;
+ if (result && fwrite(&chunkSize, sizeof(uint32), 1, wf) != 1) result = false;
+ if (result && fwrite(&count, sizeof(uint32), 1, wf) != 1) result = false;
+ if (!count) // models without (collision) geometry end here, unsure if they are useful
+ return result;
+ if (result && fwrite(&vertices[0], sizeof(Vector3), count, wf) != count) result = false;
+
+ // write triangle mesh
+ if (result && fwrite("TRIM", 1, 4, wf) != 4) result = false;
+ count = triangles.size();
+ chunkSize = sizeof(uint32)+ sizeof(MeshTriangle)*count;
+ if (result && fwrite(&chunkSize, sizeof(uint32), 1, wf) != 1) result = false;
+ if (result && fwrite(&count, sizeof(uint32), 1, wf) != 1) result = false;
+ if (result && fwrite(&triangles[0], sizeof(MeshTriangle), count, wf) != count) result = false;
+
+ // write mesh BIH
+ if (result && fwrite("MBIH", 1, 4, wf) != 4) result = false;
+ if (result) result = meshTree.writeToFile(wf);
+
+ // write liquid data
+ if (result && fwrite("LIQU", 1, 4, wf) != 4) result = false;
+ if (!iLiquid)
+ {
+ chunkSize = 0;
+ if (result && fwrite(&chunkSize, sizeof(uint32), 1, wf) != 1) result = false;
+ return result;
+ }
+ chunkSize = iLiquid->GetFileSize();
+ if (result && fwrite(&chunkSize, sizeof(uint32), 1, wf) != 1) result = false;
+ if (result) result = iLiquid->writeToFile(wf);
+
+ return result;
+ }
+
+ bool GroupModel::readFromFile(FILE* rf)
+ {
+ char chunk[8];
+ bool result = true;
+ uint32 chunkSize = 0;
+ uint32 count = 0;
+ triangles.clear();
+ vertices.clear();
+ delete iLiquid;
+ iLiquid = NULL;
+
+ if (result && fread(&iBound, sizeof(G3D::AABox), 1, rf) != 1) result = false;
+ if (result && fread(&iMogpFlags, sizeof(uint32), 1, rf) != 1) result = false;
+ if (result && fread(&iGroupWMOID, sizeof(uint32), 1, rf) != 1) result = false;
+
+ // read vertices
+ if (result && !readChunk(rf, chunk, "VERT", 4)) result = false;
+ if (result && fread(&chunkSize, sizeof(uint32), 1, rf) != 1) result = false;
+ if (result && fread(&count, sizeof(uint32), 1, rf) != 1) result = false;
+ if (!count) // models without (collision) geometry end here, unsure if they are useful
+ return result;
+ if (result) vertices.resize(count);
+ if (result && fread(&vertices[0], sizeof(Vector3), count, rf) != count) result = false;
+
+ // read triangle mesh
+ if (result && !readChunk(rf, chunk, "TRIM", 4)) result = false;
+ if (result && fread(&chunkSize, sizeof(uint32), 1, rf) != 1) result = false;
+ if (result && fread(&count, sizeof(uint32), 1, rf) != 1) result = false;
+ if (result) triangles.resize(count);
+ if (result && fread(&triangles[0], sizeof(MeshTriangle), count, rf) != count) result = false;
+
+ // read mesh BIH
+ if (result && !readChunk(rf, chunk, "MBIH", 4)) result = false;
+ if (result) result = meshTree.readFromFile(rf);
+
+ // write liquid data
+ if (result && !readChunk(rf, chunk, "LIQU", 4)) result = false;
+ if (result && fread(&chunkSize, sizeof(uint32), 1, rf) != 1) result = false;
+ if (result && chunkSize > 0)
+ result = WmoLiquid::readFromFile(rf, iLiquid);
+ return result;
+ }
+
+ struct GModelRayCallback
+ {
+ GModelRayCallback(const std::vector<MeshTriangle> &tris, const std::vector<Vector3> &vert):
+ vertices(vert.begin()), triangles(tris.begin()), hit(false) { }
+ bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool /*StopAtFirstHit*/)
+ {
+ bool result = IntersectTriangle(triangles[entry], vertices, ray, distance);
+ if (result) hit=true;
+ return hit;
+ }
+ std::vector<Vector3>::const_iterator vertices;
+ std::vector<MeshTriangle>::const_iterator triangles;
+ bool hit;
+ };
+
+ bool GroupModel::IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const
+ {
+ if (triangles.empty())
+ return false;
+
+ GModelRayCallback callback(triangles, vertices);
+ meshTree.intersectRay(ray, callback, distance, stopAtFirstHit);
+ return callback.hit;
+ }
+
+ bool GroupModel::IsInsideObject(const Vector3 &pos, const Vector3 &down, float &z_dist) const
+ {
+ if (triangles.empty() || !iBound.contains(pos))
+ return false;
+ GModelRayCallback callback(triangles, vertices);
+ Vector3 rPos = pos - 0.1f * down;
+ float dist = G3D::inf();
+ G3D::Ray ray(rPos, down);
+ bool hit = IntersectRay(ray, dist, false);
+ if (hit)
+ z_dist = dist - 0.1f;
+ return hit;
+ }
+
+ bool GroupModel::GetLiquidLevel(const Vector3 &pos, float &liqHeight) const
+ {
+ if (iLiquid)
+ return iLiquid->GetLiquidHeight(pos, liqHeight);
+ return false;
+ }
+
+ uint32 GroupModel::GetLiquidType() const
+ {
+ if (iLiquid)
+ return iLiquid->GetType();
+ return 0;
+ }
+
+ // ===================== WorldModel ==================================
+
+ void WorldModel::setGroupModels(std::vector<GroupModel> &models)
+ {
+ groupModels.swap(models);
+ groupTree.build(groupModels, BoundsTrait<GroupModel>::getBounds, 1);
+ }
+
+ struct WModelRayCallBack
+ {
+ WModelRayCallBack(const std::vector<GroupModel> &mod): models(mod.begin()), hit(false) { }
+ bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool StopAtFirstHit)
+ {
+ bool result = models[entry].IntersectRay(ray, distance, StopAtFirstHit);
+ if (result) hit=true;
+ return hit;
+ }
+ std::vector<GroupModel>::const_iterator models;
+ bool hit;
+ };
+
+ bool WorldModel::IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const
+ {
+ // small M2 workaround, maybe better make separate class with virtual intersection funcs
+ // in any case, there's no need to use a bound tree if we only have one submodel
+ if (groupModels.size() == 1)
+ return groupModels[0].IntersectRay(ray, distance, stopAtFirstHit);
+
+ WModelRayCallBack isc(groupModels);
+ groupTree.intersectRay(ray, isc, distance, stopAtFirstHit);
+ return isc.hit;
+ }
+
+ class WModelAreaCallback {
+ public:
+ WModelAreaCallback(const std::vector<GroupModel> &vals, const Vector3 &down):
+ prims(vals.begin()), hit(vals.end()), minVol(G3D::inf()), zDist(G3D::inf()), zVec(down) { }
+ std::vector<GroupModel>::const_iterator prims;
+ std::vector<GroupModel>::const_iterator hit;
+ float minVol;
+ float zDist;
+ Vector3 zVec;
+ void operator()(const Vector3& point, uint32 entry)
+ {
+ float group_Z;
+ //float pVol = prims[entry].GetBound().volume();
+ //if (pVol < minVol)
+ //{
+ /* if (prims[entry].iBound.contains(point)) */
+ if (prims[entry].IsInsideObject(point, zVec, group_Z))
+ {
+ //minVol = pVol;
+ //hit = prims + entry;
+ if (group_Z < zDist)
+ {
+ zDist = group_Z;
+ hit = prims + entry;
+ }
+#ifdef VMAP_DEBUG
+ const GroupModel &gm = prims[entry];
+ printf("%10u %8X %7.3f, %7.3f, %7.3f | %7.3f, %7.3f, %7.3f | z=%f, p_z=%f\n", gm.GetWmoID(), gm.GetMogpFlags(),
+ gm.GetBound().low().x, gm.GetBound().low().y, gm.GetBound().low().z,
+ gm.GetBound().high().x, gm.GetBound().high().y, gm.GetBound().high().z, group_Z, point.z);
+#endif
+ }
+ //}
+ //std::cout << "trying to intersect '" << prims[entry].name << "'\n";
+ }
+ };
+
+ bool WorldModel::IntersectPoint(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, AreaInfo &info) const
+ {
+ if (groupModels.empty())
+ return false;
+
+ WModelAreaCallback callback(groupModels, down);
+ groupTree.intersectPoint(p, callback);
+ if (callback.hit != groupModels.end())
+ {
+ info.rootId = RootWMOID;
+ info.groupId = callback.hit->GetWmoID();
+ info.flags = callback.hit->GetMogpFlags();
+ info.result = true;
+ dist = callback.zDist;
+ return true;
+ }
+ return false;
+ }
+
+ bool WorldModel::GetLocationInfo(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, LocationInfo &info) const
+ {
+ if (groupModels.empty())
+ return false;
+
+ WModelAreaCallback callback(groupModels, down);
+ groupTree.intersectPoint(p, callback);
+ if (callback.hit != groupModels.end())
+ {
+ info.hitModel = &(*callback.hit);
+ dist = callback.zDist;
+ return true;
+ }
+ return false;
+ }
+
+ bool WorldModel::writeFile(const std::string &filename)
+ {
+ FILE* wf = fopen(filename.c_str(), "wb");
+ if (!wf)
+ return false;
+
+ uint32 chunkSize, count;
+ bool result = fwrite(VMAP_MAGIC, 1, 8, wf) == 8;
+ if (result && fwrite("WMOD", 1, 4, wf) != 4) result = false;
+ chunkSize = sizeof(uint32) + sizeof(uint32);
+ if (result && fwrite(&chunkSize, sizeof(uint32), 1, wf) != 1) result = false;
+ if (result && fwrite(&RootWMOID, sizeof(uint32), 1, wf) != 1) result = false;
+
+ // write group models
+ count=groupModels.size();
+ if (count)
+ {
+ if (result && fwrite("GMOD", 1, 4, wf) != 4) result = false;
+ //chunkSize = sizeof(uint32)+ sizeof(GroupModel)*count;
+ //if (result && fwrite(&chunkSize, sizeof(uint32), 1, wf) != 1) result = false;
+ if (result && fwrite(&count, sizeof(uint32), 1, wf) != 1) result = false;
+ for (uint32 i=0; i<groupModels.size() && result; ++i)
+ result = groupModels[i].writeToFile(wf);
+
+ // write group BIH
+ if (result && fwrite("GBIH", 1, 4, wf) != 4) result = false;
+ if (result) result = groupTree.writeToFile(wf);
+ }
+
+ fclose(wf);
+ return result;
+ }
+
+ bool WorldModel::readFile(const std::string &filename)
+ {
+ FILE* rf = fopen(filename.c_str(), "rb");
+ if (!rf)
+ return false;
+
+ bool result = true;
+ uint32 chunkSize = 0;
+ uint32 count = 0;
+ char chunk[8]; // Ignore the added magic header
+ if (!readChunk(rf, chunk, VMAP_MAGIC, 8)) result = false;
+
+ if (result && !readChunk(rf, chunk, "WMOD", 4)) result = false;
+ if (result && fread(&chunkSize, sizeof(uint32), 1, rf) != 1) result = false;
+ if (result && fread(&RootWMOID, sizeof(uint32), 1, rf) != 1) result = false;
+
+ // read group models
+ if (result && readChunk(rf, chunk, "GMOD", 4))
+ {
+ //if (fread(&chunkSize, sizeof(uint32), 1, rf) != 1) result = false;
+
+ if (result && fread(&count, sizeof(uint32), 1, rf) != 1) result = false;
+ if (result) groupModels.resize(count);
+ //if (result && fread(&groupModels[0], sizeof(GroupModel), count, rf) != count) result = false;
+ for (uint32 i=0; i<count && result; ++i)
+ result = groupModels[i].readFromFile(rf);
+
+ // read group BIH
+ if (result && !readChunk(rf, chunk, "GBIH", 4)) result = false;
+ if (result) result = groupTree.readFromFile(rf);
+ }
+
+ fclose(rf);
+ return result;
+ }
+}
diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h
new file mode 100644
index 0000000000..32ac6d9915
--- /dev/null
+++ b/src/common/Collision/Models/WorldModel.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _WORLDMODEL_H
+#define _WORLDMODEL_H
+
+#include <G3D/HashTrait.h>
+#include <G3D/Vector3.h>
+#include <G3D/AABox.h>
+#include <G3D/Ray.h>
+#include "BoundingIntervalHierarchy.h"
+
+#include "Define.h"
+
+namespace VMAP
+{
+ class TreeNode;
+ struct AreaInfo;
+ struct LocationInfo;
+
+ class MeshTriangle
+ {
+ public:
+ MeshTriangle() : idx0(0), idx1(0), idx2(0) { }
+ MeshTriangle(uint32 na, uint32 nb, uint32 nc): idx0(na), idx1(nb), idx2(nc) { }
+
+ uint32 idx0;
+ uint32 idx1;
+ uint32 idx2;
+ };
+
+ class WmoLiquid
+ {
+ public:
+ WmoLiquid(uint32 width, uint32 height, const G3D::Vector3 &corner, uint32 type);
+ WmoLiquid(const WmoLiquid &other);
+ ~WmoLiquid();
+ WmoLiquid& operator=(const WmoLiquid &other);
+ bool GetLiquidHeight(const G3D::Vector3 &pos, float &liqHeight) const;
+ uint32 GetType() const { return iType; }
+ float *GetHeightStorage() { return iHeight; }
+ uint8 *GetFlagsStorage() { return iFlags; }
+ uint32 GetFileSize();
+ bool writeToFile(FILE* wf);
+ static bool readFromFile(FILE* rf, WmoLiquid* &liquid);
+ private:
+ WmoLiquid(): iTilesX(0), iTilesY(0), iType(0), iHeight(0), iFlags(0) { }
+ uint32 iTilesX; //!< number of tiles in x direction, each
+ uint32 iTilesY;
+ G3D::Vector3 iCorner; //!< the lower corner
+ uint32 iType; //!< liquid type
+ float *iHeight; //!< (tilesX + 1)*(tilesY + 1) height values
+ uint8 *iFlags; //!< info if liquid tile is used
+ public:
+ void getPosInfo(uint32 &tilesX, uint32 &tilesY, G3D::Vector3 &corner) const;
+ };
+
+ /*! holding additional info for WMO group files */
+ class GroupModel
+ {
+ public:
+ GroupModel(): iMogpFlags(0), iGroupWMOID(0), iLiquid(0) { }
+ GroupModel(const GroupModel &other);
+ GroupModel(uint32 mogpFlags, uint32 groupWMOID, const G3D::AABox &bound):
+ iBound(bound), iMogpFlags(mogpFlags), iGroupWMOID(groupWMOID), iLiquid(0) { }
+ ~GroupModel() { delete iLiquid; }
+
+ //! pass mesh data to object and create BIH. Passed vectors get get swapped with old geometry!
+ void setMeshData(std::vector<G3D::Vector3> &vert, std::vector<MeshTriangle> &tri);
+ void setLiquidData(WmoLiquid*& liquid) { iLiquid = liquid; liquid = NULL; }
+ bool IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const;
+ bool IsInsideObject(const G3D::Vector3 &pos, const G3D::Vector3 &down, float &z_dist) const;
+ bool GetLiquidLevel(const G3D::Vector3 &pos, float &liqHeight) const;
+ uint32 GetLiquidType() const;
+ bool writeToFile(FILE* wf);
+ bool readFromFile(FILE* rf);
+ const G3D::AABox& GetBound() const { return iBound; }
+ uint32 GetMogpFlags() const { return iMogpFlags; }
+ uint32 GetWmoID() const { return iGroupWMOID; }
+ protected:
+ G3D::AABox iBound;
+ uint32 iMogpFlags;// 0x8 outdor; 0x2000 indoor
+ uint32 iGroupWMOID;
+ std::vector<G3D::Vector3> vertices;
+ std::vector<MeshTriangle> triangles;
+ BIH meshTree;
+ WmoLiquid* iLiquid;
+ public:
+ void getMeshData(std::vector<G3D::Vector3> &vertices, std::vector<MeshTriangle> &triangles, WmoLiquid* &liquid);
+ };
+ /*! Holds a model (converted M2 or WMO) in its original coordinate space */
+ class WorldModel
+ {
+ public:
+ WorldModel(): RootWMOID(0) { }
+
+ //! pass group models to WorldModel and create BIH. Passed vector is swapped with old geometry!
+ void setGroupModels(std::vector<GroupModel> &models);
+ void setRootWmoID(uint32 id) { RootWMOID = id; }
+ bool IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const;
+ bool IntersectPoint(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, AreaInfo &info) const;
+ bool GetLocationInfo(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, LocationInfo &info) const;
+ bool writeFile(const std::string &filename);
+ bool readFile(const std::string &filename);
+ protected:
+ uint32 RootWMOID;
+ std::vector<GroupModel> groupModels;
+ BIH groupTree;
+ public:
+ void getGroupModels(std::vector<GroupModel> &groupModels);
+ };
+} // namespace VMAP
+
+#endif // _WORLDMODEL_H
diff --git a/src/common/Collision/PrecompiledHeaders/collisionPCH.cpp b/src/common/Collision/PrecompiledHeaders/collisionPCH.cpp
new file mode 100644
index 0000000000..36eae8e2b0
--- /dev/null
+++ b/src/common/Collision/PrecompiledHeaders/collisionPCH.cpp
@@ -0,0 +1 @@
+#include "collisionPCH.h"
diff --git a/src/common/Collision/PrecompiledHeaders/collisionPCH.h b/src/common/Collision/PrecompiledHeaders/collisionPCH.h
new file mode 100644
index 0000000000..ece2ef1b8e
--- /dev/null
+++ b/src/common/Collision/PrecompiledHeaders/collisionPCH.h
@@ -0,0 +1,9 @@
+#include "Define.h"
+#include "VMapDefinitions.h"
+#include "MapTree.h"
+#include "WorldModel.h"
+#include "ModelInstance.h"
+#include "BoundingIntervalHierarchy.h"
+#include "RegularGrid.h"
+#include "BoundingIntervalHierarchyWrapper.h"
+#include "GameObjectModel.h"
diff --git a/src/common/Collision/RegularGrid.h b/src/common/Collision/RegularGrid.h
new file mode 100644
index 0000000000..f3e0f62e6a
--- /dev/null
+++ b/src/common/Collision/RegularGrid.h
@@ -0,0 +1,264 @@
+#ifndef _REGULAR_GRID_H
+#define _REGULAR_GRID_H
+
+
+#include <G3D/Ray.h>
+#include <G3D/Table.h>
+#include <G3D/BoundsTrait.h>
+#include <G3D/PositionTrait.h>
+
+#include "Errors.h"
+
+template <class Node>
+class NodeArray
+{
+public:
+ explicit NodeArray() { memset(&_nodes, 0, sizeof(_nodes)); }
+ void AddNode(Node* n)
+ {
+ for (uint8 i=0; i<9; ++i)
+ if (_nodes[i] == 0)
+ {
+ _nodes[i] = n;
+ return;
+ }
+ else if (_nodes[i] == n)
+ return;
+ }
+ Node* _nodes[9];
+};
+
+template<class Node>
+struct NodeCreator{
+ static Node * makeNode(int /*x*/, int /*y*/) { return new Node();}
+};
+
+template<class T,
+class Node,
+class NodeCreatorFunc = NodeCreator<Node>,
+ /*class BoundsFunc = BoundsTrait<T>,*/
+class PositionFunc = PositionTrait<T>
+>
+class RegularGrid2D
+{
+public:
+
+ enum{
+ CELL_NUMBER = 64,
+ };
+
+ #define HGRID_MAP_SIZE (533.33333f * 64.f) // shouldn't be changed
+ #define CELL_SIZE float(HGRID_MAP_SIZE/(float)CELL_NUMBER)
+
+ typedef G3D::Table<const T*, NodeArray<Node> > MemberTable;
+
+ MemberTable memberTable;
+ Node* nodes[CELL_NUMBER][CELL_NUMBER];
+
+ RegularGrid2D(){
+ memset(nodes, 0, sizeof(nodes));
+ }
+
+ ~RegularGrid2D(){
+ for (int x = 0; x < CELL_NUMBER; ++x)
+ for (int y = 0; y < CELL_NUMBER; ++y)
+ delete nodes[x][y];
+ }
+
+ void insert(const T& value)
+ {
+ G3D::Vector3 pos[9];
+ pos[0] = value.getBounds().corner(0);
+ pos[1] = value.getBounds().corner(1);
+ pos[2] = value.getBounds().corner(2);
+ pos[3] = value.getBounds().corner(3);
+ pos[4] = (pos[0] + pos[1])/2.0f;
+ pos[5] = (pos[1] + pos[2])/2.0f;
+ pos[6] = (pos[2] + pos[3])/2.0f;
+ pos[7] = (pos[3] + pos[0])/2.0f;
+ pos[8] = (pos[0] + pos[2])/2.0f;
+
+ NodeArray<Node> na;
+ for (uint8 i=0; i<9; ++i)
+ {
+ Cell c = Cell::ComputeCell(pos[i].x, pos[i].y);
+ if (!c.isValid())
+ continue;
+ Node& node = getGridFor(pos[i].x, pos[i].y);
+ na.AddNode(&node);
+ }
+
+ for (uint8 i=0; i<9; ++i)
+ {
+ if (na._nodes[i])
+ na._nodes[i]->insert(value);
+ else
+ break;
+ }
+
+ memberTable.set(&value, na);
+ }
+
+ void remove(const T& value)
+ {
+ NodeArray<Node>& na = memberTable[&value];
+ for (uint8 i=0; i<9; ++i)
+ {
+ if (na._nodes[i])
+ na._nodes[i]->remove(value);
+ else
+ break;
+ }
+
+ // Remove the member
+ memberTable.remove(&value);
+ }
+
+ void balance()
+ {
+ for (int x = 0; x < CELL_NUMBER; ++x)
+ for (int y = 0; y < CELL_NUMBER; ++y)
+ if (Node* n = nodes[x][y])
+ n->balance();
+ }
+
+ bool contains(const T& value) const { return memberTable.containsKey(&value); }
+ int size() const { return memberTable.size(); }
+
+ struct Cell
+ {
+ int x, y;
+ bool operator == (const Cell& c2) const { return x == c2.x && y == c2.y;}
+
+ static Cell ComputeCell(float fx, float fy)
+ {
+ Cell c = { int(fx * (1.f/CELL_SIZE) + (CELL_NUMBER/2)), int(fy * (1.f/CELL_SIZE) + (CELL_NUMBER/2)) };
+ return c;
+ }
+
+ bool isValid() const { return x >= 0 && x < CELL_NUMBER && y >= 0 && y < CELL_NUMBER;}
+ };
+
+
+ Node& getGridFor(float fx, float fy)
+ {
+ Cell c = Cell::ComputeCell(fx, fy);
+ return getGrid(c.x, c.y);
+ }
+
+ Node& getGrid(int x, int y)
+ {
+ ASSERT(x < CELL_NUMBER && y < CELL_NUMBER);
+ if (!nodes[x][y])
+ nodes[x][y] = NodeCreatorFunc::makeNode(x, y);
+ return *nodes[x][y];
+ }
+
+ template<typename RayCallback>
+ void intersectRay(const G3D::Ray& ray, RayCallback& intersectCallback, float max_dist, bool stopAtFirstHit)
+ {
+ intersectRay(ray, intersectCallback, max_dist, ray.origin() + ray.direction() * max_dist, stopAtFirstHit);
+ }
+
+ template<typename RayCallback>
+ void intersectRay(const G3D::Ray& ray, RayCallback& intersectCallback, float& max_dist, const G3D::Vector3& end, bool stopAtFirstHit)
+ {
+ Cell cell = Cell::ComputeCell(ray.origin().x, ray.origin().y);
+ if (!cell.isValid())
+ return;
+
+ Cell last_cell = Cell::ComputeCell(end.x, end.y);
+
+ if (cell == last_cell)
+ {
+ if (Node* node = nodes[cell.x][cell.y])
+ node->intersectRay(ray, intersectCallback, max_dist, stopAtFirstHit);
+ return;
+ }
+
+ float voxel = (float)CELL_SIZE;
+ float kx_inv = ray.invDirection().x, bx = ray.origin().x;
+ float ky_inv = ray.invDirection().y, by = ray.origin().y;
+
+ int stepX, stepY;
+ float tMaxX, tMaxY;
+ if (kx_inv >= 0)
+ {
+ stepX = 1;
+ float x_border = (cell.x+1) * voxel;
+ tMaxX = (x_border - bx) * kx_inv;
+ }
+ else
+ {
+ stepX = -1;
+ float x_border = (cell.x-1) * voxel;
+ tMaxX = (x_border - bx) * kx_inv;
+ }
+
+ if (ky_inv >= 0)
+ {
+ stepY = 1;
+ float y_border = (cell.y+1) * voxel;
+ tMaxY = (y_border - by) * ky_inv;
+ }
+ else
+ {
+ stepY = -1;
+ float y_border = (cell.y-1) * voxel;
+ tMaxY = (y_border - by) * ky_inv;
+ }
+
+ //int Cycles = std::max((int)ceilf(max_dist/tMaxX),(int)ceilf(max_dist/tMaxY));
+ //int i = 0;
+
+ float tDeltaX = voxel * fabs(kx_inv);
+ float tDeltaY = voxel * fabs(ky_inv);
+ do
+ {
+ if (Node* node = nodes[cell.x][cell.y])
+ {
+ //float enterdist = max_dist;
+ node->intersectRay(ray, intersectCallback, max_dist, stopAtFirstHit);
+ }
+ if (cell == last_cell)
+ break;
+ if (tMaxX < tMaxY)
+ {
+ tMaxX += tDeltaX;
+ cell.x += stepX;
+ }
+ else
+ {
+ tMaxY += tDeltaY;
+ cell.y += stepY;
+ }
+ //++i;
+ } while (cell.isValid());
+ }
+
+ template<typename IsectCallback>
+ void intersectPoint(const G3D::Vector3& point, IsectCallback& intersectCallback)
+ {
+ Cell cell = Cell::ComputeCell(point.x, point.y);
+ if (!cell.isValid())
+ return;
+ if (Node* node = nodes[cell.x][cell.y])
+ node->intersectPoint(point, intersectCallback);
+ }
+
+ // Optimized verson of intersectRay function for rays with vertical directions
+ template<typename RayCallback>
+ void intersectZAllignedRay(const G3D::Ray& ray, RayCallback& intersectCallback, float& max_dist)
+ {
+ Cell cell = Cell::ComputeCell(ray.origin().x, ray.origin().y);
+ if (!cell.isValid())
+ return;
+ if (Node* node = nodes[cell.x][cell.y])
+ node->intersectRay(ray, intersectCallback, max_dist, false);
+ }
+};
+
+#undef CELL_SIZE
+#undef HGRID_MAP_SIZE
+
+#endif
diff --git a/src/common/Collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h
new file mode 100644
index 0000000000..3ff01cba2d
--- /dev/null
+++ b/src/common/Collision/VMapDefinitions.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _VMAPDEFINITIONS_H
+#define _VMAPDEFINITIONS_H
+#include <cstring>
+
+#define LIQUID_TILE_SIZE (533.333f / 128.f)
+
+namespace VMAP
+{
+ const char VMAP_MAGIC[] = "VMAP_4.1";
+ const char RAW_VMAP_MAGIC[] = "VMAP041"; // used in extracted vmap files with raw data
+ const char GAMEOBJECT_MODELS[] = "GameObjectModels.dtree";
+
+ // defined in TileAssembler.cpp currently...
+ bool readChunk(FILE* rf, char *dest, const char *compare, uint32 len);
+}
+#endif
diff --git a/src/common/Collision/VMapTools.h b/src/common/Collision/VMapTools.h
new file mode 100644
index 0000000000..908a02c622
--- /dev/null
+++ b/src/common/Collision/VMapTools.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _VMAPTOOLS_H
+#define _VMAPTOOLS_H
+
+#include <G3D/CollisionDetection.h>
+#include <G3D/AABox.h>
+
+#include "NodeValueAccess.h"
+
+/**
+The Class is mainly taken from G3D/AABSPTree.h but modified to be able to use our internal data structure.
+This is an iterator that helps us analysing the BSP-Trees.
+The collision detection is modified to return true, if we are inside an object.
+*/
+
+namespace VMAP
+{
+ template<class TValue>
+ class IntersectionCallBack {
+ public:
+ TValue* closestEntity;
+ G3D::Vector3 hitLocation;
+ G3D::Vector3 hitNormal;
+
+ void operator()(const G3D::Ray& ray, const TValue* entity, bool StopAtFirstHit, float& distance) {
+ entity->intersect(ray, distance, StopAtFirstHit, hitLocation, hitNormal);
+ }
+ };
+
+ //==============================================================
+ //==============================================================
+ //==============================================================
+
+ class MyCollisionDetection
+ {
+ private:
+ public:
+
+ static bool collisionLocationForMovingPointFixedAABox(
+ const G3D::Vector3& origin,
+ const G3D::Vector3& dir,
+ const G3D::AABox& box,
+ G3D::Vector3& location,
+ bool& Inside)
+ {
+
+ // Integer representation of a floating-point value.
+#define IR(x) (reinterpret_cast<G3D::uint32 const&>(x))
+
+ Inside = true;
+ const G3D::Vector3& MinB = box.low();
+ const G3D::Vector3& MaxB = box.high();
+ G3D::Vector3 MaxT(-1.0f, -1.0f, -1.0f);
+
+ // Find candidate planes.
+ for (int i = 0; i < 3; ++i)
+ {
+ if (origin[i] < MinB[i])
+ {
+ location[i] = MinB[i];
+ Inside = false;
+
+ // Calculate T distances to candidate planes
+ if (IR(dir[i]))
+ {
+ MaxT[i] = (MinB[i] - origin[i]) / dir[i];
+ }
+ }
+ else if (origin[i] > MaxB[i])
+ {
+ location[i] = MaxB[i];
+ Inside = false;
+
+ // Calculate T distances to candidate planes
+ if (IR(dir[i]))
+ {
+ MaxT[i] = (MaxB[i] - origin[i]) / dir[i];
+ }
+ }
+ }
+
+ if (Inside)
+ {
+ // definite hit
+ location = origin;
+ return true;
+ }
+
+ // Get largest of the maxT's for final choice of intersection
+ int WhichPlane = 0;
+ if (MaxT[1] > MaxT[WhichPlane])
+ {
+ WhichPlane = 1;
+ }
+
+ if (MaxT[2] > MaxT[WhichPlane])
+ {
+ WhichPlane = 2;
+ }
+
+ // Check final candidate actually inside box
+ if (IR(MaxT[WhichPlane]) & 0x80000000)
+ {
+ // Miss the box
+ return false;
+ }
+
+ for (int i = 0; i < 3; ++i)
+ {
+ if (i != WhichPlane)
+ {
+ location[i] = origin[i] + MaxT[WhichPlane] * dir[i];
+ if ((location[i] < MinB[i]) ||
+ (location[i] > MaxB[i]))
+ {
+ // On this plane we're outside the box extents, so
+ // we miss the box
+ return false;
+ }
+ }
+ }
+ /*
+ // Choose the normal to be the plane normal facing into the ray
+ normal = G3D::Vector3::zero();
+ normal[WhichPlane] = (dir[WhichPlane] > 0) ? -1.0 : 1.0;
+ */
+ return true;
+
+#undef IR
+ }
+ };
+}
+#endif
diff --git a/src/common/Common.cpp b/src/common/Common.cpp
new file mode 100644
index 0000000000..1bde202041
--- /dev/null
+++ b/src/common/Common.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Common.h"
+
+char const* localeNames[TOTAL_LOCALES] = {
+ "enUS",
+ "koKR",
+ "frFR",
+ "deDE",
+ "zhCN",
+ "zhTW",
+ "esES",
+ "esMX",
+ "ruRU"
+};
+
+LocaleConstant GetLocaleByName(const std::string& name)
+{
+ for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
+ if (name==localeNames[i])
+ return LocaleConstant(i);
+
+ return LOCALE_enUS; // including enGB case
+}
+
+void CleanStringForMysqlQuery(std::string& str)
+{
+ std::string::size_type n = 0;
+ while ((n=str.find('\\')) != str.npos) str.erase(n,1);
+ while ((n=str.find('"')) != str.npos) str.erase(n,1);
+ while ((n=str.find('\'')) != str.npos) str.erase(n,1);
+}
+
diff --git a/src/common/Common.h b/src/common/Common.h
new file mode 100644
index 0000000000..9fb4d30c69
--- /dev/null
+++ b/src/common/Common.h
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef AZEROTHCORE_COMMON_H
+#define AZEROTHCORE_COMMON_H
+
+// config.h needs to be included 1st
+/// @todo this thingy looks like hack, but its not, need to
+// make separate header however, because It makes mess here.
+#ifdef HAVE_CONFIG_H
+// Remove Some things that we will define
+// This is in case including another config.h
+// before trinity config.h
+#ifdef PACKAGE
+#undef PACKAGE
+#endif //PACKAGE
+#ifdef PACKAGE_BUGREPORT
+#undef PACKAGE_BUGREPORT
+#endif //PACKAGE_BUGREPORT
+#ifdef PACKAGE_NAME
+#undef PACKAGE_NAME
+#endif //PACKAGE_NAME
+#ifdef PACKAGE_STRING
+#undef PACKAGE_STRING
+#endif //PACKAGE_STRING
+#ifdef PACKAGE_TARNAME
+#undef PACKAGE_TARNAME
+#endif //PACKAGE_TARNAME
+#ifdef PACKAGE_VERSION
+#undef PACKAGE_VERSION
+#endif //PACKAGE_VERSION
+#ifdef VERSION
+#undef VERSION
+#endif //VERSION
+
+# include "Config.h"
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+#endif //HAVE_CONFIG_H
+
+#include "Define.h"
+
+#include "Dynamic/UnorderedMap.h"
+#include "Dynamic/UnorderedSet.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <math.h>
+#include <errno.h>
+#include <signal.h>
+#include <assert.h>
+
+#if PLATFORM == PLATFORM_WINDOWS
+#define STRCASECMP stricmp
+#else
+#define STRCASECMP strcasecmp
+#endif
+
+#include <set>
+#include <list>
+#include <string>
+#include <map>
+#include <queue>
+#include <sstream>
+#include <fstream>
+#include <algorithm>
+#include <vector>
+
+#include "Threading/LockedQueue.h"
+#include "Threading/Threading.h"
+
+#include <ace/Basic_Types.h>
+#include <ace/Guard_T.h>
+#include <ace/RW_Thread_Mutex.h>
+#include <ace/Thread_Mutex.h>
+#include <ace/OS_NS_time.h>
+#include <ace/Stack_Trace.h>
+
+#if PLATFORM == PLATFORM_WINDOWS
+# include <ace/config-all.h>
+// XP winver - needed to compile with standard leak check in MemoryLeaks.h
+// uncomment later if needed
+//#define _WIN32_WINNT 0x0501
+# include <ws2tcpip.h>
+//#undef WIN32_WINNT
+#else
+# include <sys/types.h>
+# include <sys/ioctl.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <unistd.h>
+# include <netdb.h>
+#endif
+
+#if COMPILER == COMPILER_MICROSOFT
+
+#include <float.h>
+
+#define I32FMT "%08I32X"
+#define I64FMT "%016I64X"
+#define snprintf _snprintf
+#define atoll _atoi64
+#define vsnprintf _vsnprintf
+#ifndef isfinite
+#define isfinite(X) _finite(X)
+#endif
+#define llabs _abs64
+
+#else
+
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#define I32FMT "%08X"
+#define I64FMT "%016llX"
+
+#endif
+
+using namespace std;
+
+inline float finiteAlways(float f) { return isfinite(f) ? f : 0.0f; }
+
+inline bool myisfinite(float f) { return isfinite(f) && !isnan(f); }
+
+#define atol(a) strtoul( a, NULL, 10)
+
+#define STRINGIZE(a) #a
+
+enum TimeConstants
+{
+ MINUTE = 60,
+ HOUR = MINUTE*60,
+ DAY = HOUR*24,
+ WEEK = DAY*7,
+ MONTH = DAY*30,
+ YEAR = MONTH*12,
+ IN_MILLISECONDS = 1000
+};
+
+enum AccountTypes
+{
+ SEC_PLAYER = 0,
+ SEC_MODERATOR = 1,
+ SEC_GAMEMASTER = 2,
+ SEC_ADMINISTRATOR = 3,
+ SEC_CONSOLE = 4 // must be always last in list, accounts must have less security level always also
+};
+
+enum LocaleConstant
+{
+ LOCALE_enUS = 0,
+ LOCALE_koKR = 1,
+ LOCALE_frFR = 2,
+ LOCALE_deDE = 3,
+ LOCALE_zhCN = 4,
+ LOCALE_zhTW = 5,
+ LOCALE_esES = 6,
+ LOCALE_esMX = 7,
+ LOCALE_ruRU = 8
+};
+
+const uint8 TOTAL_LOCALES = 9;
+#define DEFAULT_LOCALE LOCALE_enUS
+
+#define MAX_LOCALES 8
+#define MAX_ACCOUNT_TUTORIAL_VALUES 8
+
+extern char const* localeNames[TOTAL_LOCALES];
+
+LocaleConstant GetLocaleByName(const std::string& name);
+void CleanStringForMysqlQuery(std::string& str);
+
+typedef std::vector<std::string> StringVector;
+
+// we always use stdlibc++ std::max/std::min, undefine some not C++ standard defines (Win API and some other platforms)
+#ifdef max
+#undef max
+#endif
+
+#ifdef min
+#undef min
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846f
+#endif
+
+#define MAX_QUERY_LEN 32*1024
+
+#define TRINITY_GUARD(MUTEX, LOCK) \
+ ACE_Guard< MUTEX > TRINITY_GUARD_OBJECT (LOCK); \
+ if (TRINITY_GUARD_OBJECT.locked() == 0) ASSERT(false);
+
+//! For proper implementation of multiple-read, single-write pattern, use
+//! ACE_RW_Mutex as underlying @MUTEX
+# define TRINITY_WRITE_GUARD(MUTEX, LOCK) \
+ ACE_Write_Guard< MUTEX > TRINITY_GUARD_OBJECT (LOCK); \
+ if (TRINITY_GUARD_OBJECT.locked() == 0) ASSERT(false);
+
+//! For proper implementation of multiple-read, single-write pattern, use
+//! ACE_RW_Mutex as underlying @MUTEX
+# define TRINITY_READ_GUARD(MUTEX, LOCK) \
+ ACE_Read_Guard< MUTEX > TRINITY_GUARD_OBJECT (LOCK); \
+ if (TRINITY_GUARD_OBJECT.locked() == 0) ASSERT(false);
+
+#endif
diff --git a/src/common/CompilerDefs.h b/src/common/CompilerDefs.h
new file mode 100644
index 0000000000..e189799c3f
--- /dev/null
+++ b/src/common/CompilerDefs.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_COMPILERDEFS_H
+#define TRINITY_COMPILERDEFS_H
+
+#define PLATFORM_WINDOWS 0
+#define PLATFORM_UNIX 1
+#define PLATFORM_APPLE 2
+#define PLATFORM_INTEL 3
+
+// must be first (win 64 also define _WIN32)
+#if defined( _WIN64 )
+# define PLATFORM PLATFORM_WINDOWS
+#elif defined( __WIN32__ ) || defined( WIN32 ) || defined( _WIN32 )
+# define PLATFORM PLATFORM_WINDOWS
+#elif defined( __APPLE_CC__ )
+# define PLATFORM PLATFORM_APPLE
+#elif defined( __INTEL_COMPILER )
+# define PLATFORM PLATFORM_INTEL
+#else
+# define PLATFORM PLATFORM_UNIX
+#endif
+
+#define COMPILER_MICROSOFT 0
+#define COMPILER_GNU 1
+#define COMPILER_BORLAND 2
+#define COMPILER_INTEL 3
+
+#ifdef _MSC_VER
+# define COMPILER COMPILER_MICROSOFT
+#elif defined( __BORLANDC__ )
+# define COMPILER COMPILER_BORLAND
+#elif defined( __INTEL_COMPILER )
+# define COMPILER COMPILER_INTEL
+#elif defined( __GNUC__ )
+# define COMPILER COMPILER_GNU
+# define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#else
+# error "FATAL ERROR: Unknown compiler."
+#endif
+
+#if defined(__cplusplus) && __cplusplus == 201103L
+# define COMPILER_HAS_CPP11_SUPPORT 1
+#elif _MSC_VER >= 1700
+# define COMPILER_HAS_CPP11_SUPPORT 1
+#else
+# define COMPILER_HAS_CPP11_SUPPORT 0
+#endif
+
+#endif
diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp
new file mode 100644
index 0000000000..e467fc3697
--- /dev/null
+++ b/src/common/Configuration/Config.cpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Config.h"
+#include "Errors.h"
+
+// Defined here as it must not be exposed to end-users.
+bool ConfigMgr::GetValueHelper(const char* name, ACE_TString &result)
+{
+ GuardType guard(_configLock);
+
+ if (_config.get() == 0)
+ return false;
+
+ ACE_TString section_name;
+ ACE_Configuration_Section_Key section_key;
+ const ACE_Configuration_Section_Key &root_key = _config->root_section();
+
+ int i = 0;
+ while (_config->enumerate_sections(root_key, i, section_name) == 0)
+ {
+ _config->open_section(root_key, section_name.c_str(), 0, section_key);
+ if (_config->get_string_value(section_key, name, result) == 0)
+ return true;
+ ++i;
+ }
+
+ return false;
+}
+
+bool ConfigMgr::LoadInitial(char const* file)
+{
+ ASSERT(file);
+
+ GuardType guard(_configLock);
+
+ _config.reset(new ACE_Configuration_Heap());
+ if (_config->open() == 0)
+ if (LoadData(file))
+ return true;
+
+ _config.reset();
+ return false;
+}
+
+bool ConfigMgr::LoadMore(char const* file)
+{
+ ASSERT(file);
+ ASSERT(_config);
+
+ GuardType guard(_configLock);
+
+ return LoadData(file);
+}
+
+bool ConfigMgr::Reload()
+{
+ for(std::vector<std::string>::iterator it = _confFiles.begin(); it != _confFiles.end(); ++it) {
+ if (it==_confFiles.begin()) {
+ if (!LoadInitial((*it).c_str()))
+ return false;
+ } else {
+ LoadMore((*it).c_str());
+ }
+ }
+
+ return true;
+}
+
+bool ConfigMgr::LoadData(char const* file)
+{
+ if(std::find(_confFiles.begin(), _confFiles.end(), file) == _confFiles.end()) {
+ _confFiles.push_back(file);
+ }
+
+ ACE_Ini_ImpExp config_importer(*_config.get());
+ if (config_importer.import_config(file) == 0)
+ return true;
+
+ return false;
+}
+
+std::string ConfigMgr::GetStringDefault(const char* name, const std::string &def)
+{
+ ACE_TString val;
+ return GetValueHelper(name, val) ? val.c_str() : def;
+}
+
+bool ConfigMgr::GetBoolDefault(const char* name, bool def)
+{
+ ACE_TString val;
+
+ if (!GetValueHelper(name, val))
+ return def;
+
+ return (val == "true" || val == "TRUE" || val == "yes" || val == "YES" ||
+ val == "1");
+}
+
+int ConfigMgr::GetIntDefault(const char* name, int def)
+{
+ ACE_TString val;
+ return GetValueHelper(name, val) ? atoi(val.c_str()) : def;
+}
+
+float ConfigMgr::GetFloatDefault(const char* name, float def)
+{
+ ACE_TString val;
+ return GetValueHelper(name, val) ? (float)atof(val.c_str()) : def;
+}
+
+std::list<std::string> ConfigMgr::GetKeysByString(std::string const& name)
+{
+ GuardType guard(_configLock);
+
+ std::list<std::string> keys;
+ if (_config.get() == 0)
+ return keys;
+
+ ACE_TString section_name;
+ ACE_Configuration_Section_Key section_key;
+ const ACE_Configuration_Section_Key &root_key = _config->root_section();
+
+ int i = 0;
+ while (_config->enumerate_sections(root_key, i++, section_name) == 0)
+ {
+ _config->open_section(root_key, section_name.c_str(), 0, section_key);
+
+ ACE_TString key_name;
+ ACE_Configuration::VALUETYPE type;
+ int j = 0;
+ while (_config->enumerate_values(section_key, j++, key_name, type) == 0)
+ {
+ std::string temp = key_name.c_str();
+
+ if (!temp.find(name))
+ keys.push_back(temp);
+ }
+ }
+
+ return keys;
+}
diff --git a/src/common/Configuration/Config.h b/src/common/Configuration/Config.h
new file mode 100644
index 0000000000..5ef1099635
--- /dev/null
+++ b/src/common/Configuration/Config.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include <string>
+#include <list>
+#include <vector>
+#include <ace/Singleton.h>
+#include <ace/Configuration_Import_Export.h>
+#include <ace/Thread_Mutex.h>
+#include <AutoPtr.h>
+
+typedef Trinity::AutoPtr<ACE_Configuration_Heap, ACE_Null_Mutex> Config;
+
+class ConfigMgr
+{
+ friend class ACE_Singleton<ConfigMgr, ACE_Null_Mutex>;
+ friend class ConfigLoader;
+
+ ConfigMgr() { }
+ ~ConfigMgr() { }
+
+public:
+ /// Method used only for loading main configuration files (authserver.conf and worldserver.conf)
+ bool LoadInitial(char const* file);
+
+ /**
+ * This method loads additional configuration files
+ * It is recommended to use this method in WorldScript::OnConfigLoad hooks
+ *
+ * @return true if loading was successful
+ */
+ bool LoadMore(char const* file);
+
+ bool Reload();
+
+ std::string GetStringDefault(const char* name, const std::string& def);
+ bool GetBoolDefault(const char* name, bool def);
+ int GetIntDefault(const char* name, int def);
+ float GetFloatDefault(const char* name, float def);
+
+ std::list<std::string> GetKeysByString(std::string const& name);
+
+private:
+ bool GetValueHelper(const char* name, ACE_TString &result);
+ bool LoadData(char const* file);
+
+ typedef ACE_Thread_Mutex LockType;
+ typedef ACE_Guard<LockType> GuardType;
+
+ std::vector<std::string> _confFiles;
+ Config _config;
+ LockType _configLock;
+
+ ConfigMgr(ConfigMgr const&);
+ ConfigMgr& operator=(ConfigMgr const&);
+};
+
+#define sConfigMgr ACE_Singleton<ConfigMgr, ACE_Null_Mutex>::instance()
+
+#endif
diff --git a/src/common/Containers.h b/src/common/Containers.h
new file mode 100644
index 0000000000..d5974cefab
--- /dev/null
+++ b/src/common/Containers.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_CONTAINERS_H
+#define TRINITY_CONTAINERS_H
+
+#include "Define.h"
+#include <list>
+
+//! Because circular includes are bad
+extern uint32 urand(uint32 min, uint32 max);
+
+namespace Trinity
+{
+ namespace Containers
+ {
+ template<class T>
+ void RandomResizeList(std::list<T> &list, uint32 size)
+ {
+ size_t list_size = list.size();
+
+ while (list_size > size)
+ {
+ typename std::list<T>::iterator itr = list.begin();
+ std::advance(itr, urand(0, list_size - 1));
+ list.erase(itr);
+ --list_size;
+ }
+ }
+
+ template<class T, class Predicate>
+ void RandomResizeList(std::list<T> &list, Predicate& predicate, uint32 size)
+ {
+ //! First use predicate filter
+ std::list<T> listCopy;
+ for (typename std::list<T>::iterator itr = list.begin(); itr != list.end(); ++itr)
+ if (predicate(*itr))
+ listCopy.push_back(*itr);
+
+ if (size)
+ RandomResizeList(listCopy, size);
+
+ list = listCopy;
+ }
+
+ /* Select a random element from a container. Note: make sure you explicitly empty check the container */
+ template <class C> typename C::value_type const& SelectRandomContainerElement(C const& container)
+ {
+ typename C::const_iterator it = container.begin();
+ std::advance(it, urand(0, container.size() - 1));
+ return *it;
+ }
+ }
+ //! namespace Containers
+}
+//! namespace Trinity
+
+#endif //! #ifdef TRINITY_CONTAINERS_H
diff --git a/src/common/Cryptography/ARC4.cpp b/src/common/Cryptography/ARC4.cpp
new file mode 100644
index 0000000000..429abfcdf3
--- /dev/null
+++ b/src/common/Cryptography/ARC4.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ARC4.h"
+#include <openssl/sha.h>
+
+ARC4::ARC4(uint8 len) : m_ctx()
+{
+ EVP_CIPHER_CTX_init(&m_ctx);
+ EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
+ EVP_CIPHER_CTX_set_key_length(&m_ctx, len);
+}
+
+ARC4::ARC4(uint8 *seed, uint8 len) : m_ctx()
+{
+ EVP_CIPHER_CTX_init(&m_ctx);
+ EVP_EncryptInit_ex(&m_ctx, EVP_rc4(), NULL, NULL, NULL);
+ EVP_CIPHER_CTX_set_key_length(&m_ctx, len);
+ EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
+}
+
+ARC4::~ARC4()
+{
+ EVP_CIPHER_CTX_cleanup(&m_ctx);
+}
+
+void ARC4::Init(uint8 *seed)
+{
+ EVP_EncryptInit_ex(&m_ctx, NULL, NULL, seed, NULL);
+}
+
+void ARC4::UpdateData(int len, uint8 *data)
+{
+ int outlen = 0;
+ EVP_EncryptUpdate(&m_ctx, data, &outlen, data, len);
+ EVP_EncryptFinal_ex(&m_ctx, data, &outlen);
+}
diff --git a/src/common/Cryptography/ARC4.h b/src/common/Cryptography/ARC4.h
new file mode 100644
index 0000000000..bb25410e28
--- /dev/null
+++ b/src/common/Cryptography/ARC4.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _AUTH_SARC4_H
+#define _AUTH_SARC4_H
+
+#include "Define.h"
+#include <openssl/evp.h>
+
+class ARC4
+{
+ public:
+ ARC4(uint8 len);
+ ARC4(uint8 *seed, uint8 len);
+ ~ARC4();
+ void Init(uint8 *seed);
+ void UpdateData(int len, uint8 *data);
+ private:
+ EVP_CIPHER_CTX m_ctx;
+};
+
+#endif
diff --git a/src/common/Cryptography/Authentication/AuthCrypt.cpp b/src/common/Cryptography/Authentication/AuthCrypt.cpp
new file mode 100644
index 0000000000..171939cfb5
--- /dev/null
+++ b/src/common/Cryptography/Authentication/AuthCrypt.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "AuthCrypt.h"
+#include "Cryptography/HMACSHA1.h"
+#include "Cryptography/BigNumber.h"
+
+AuthCrypt::AuthCrypt() :
+ _clientDecrypt(SHA_DIGEST_LENGTH), _serverEncrypt(SHA_DIGEST_LENGTH),
+ _initialized(false)
+{ }
+
+void AuthCrypt::Init(BigNumber* K)
+{
+ uint8 ServerEncryptionKey[SEED_KEY_SIZE] = { 0xCC, 0x98, 0xAE, 0x04, 0xE8, 0x97, 0xEA, 0xCA, 0x12, 0xDD, 0xC0, 0x93, 0x42, 0x91, 0x53, 0x57 };
+ HmacHash serverEncryptHmac(SEED_KEY_SIZE, (uint8*)ServerEncryptionKey);
+ uint8 *encryptHash = serverEncryptHmac.ComputeHash(K);
+
+ uint8 ServerDecryptionKey[SEED_KEY_SIZE] = { 0xC2, 0xB3, 0x72, 0x3C, 0xC6, 0xAE, 0xD9, 0xB5, 0x34, 0x3C, 0x53, 0xEE, 0x2F, 0x43, 0x67, 0xCE };
+ HmacHash clientDecryptHmac(SEED_KEY_SIZE, (uint8*)ServerDecryptionKey);
+ uint8 *decryptHash = clientDecryptHmac.ComputeHash(K);
+
+ //ARC4 _serverDecrypt(encryptHash);
+ _clientDecrypt.Init(decryptHash);
+ _serverEncrypt.Init(encryptHash);
+ //ARC4 _clientEncrypt(decryptHash);
+
+ // Drop first 1024 bytes, as WoW uses ARC4-drop1024.
+ uint8 syncBuf[1024];
+ memset(syncBuf, 0, 1024);
+
+ _serverEncrypt.UpdateData(1024, syncBuf);
+ //_clientEncrypt.UpdateData(1024, syncBuf);
+
+ memset(syncBuf, 0, 1024);
+
+ //_serverDecrypt.UpdateData(1024, syncBuf);
+ _clientDecrypt.UpdateData(1024, syncBuf);
+
+ _initialized = true;
+}
+
+void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
+{
+ if (!_initialized)
+ return;
+
+ _clientDecrypt.UpdateData(len, data);
+}
+
+void AuthCrypt::EncryptSend(uint8 *data, size_t len)
+{
+ if (!_initialized)
+ return;
+
+ _serverEncrypt.UpdateData(len, data);
+}
+
diff --git a/src/common/Cryptography/Authentication/AuthCrypt.h b/src/common/Cryptography/Authentication/AuthCrypt.h
new file mode 100644
index 0000000000..061841679a
--- /dev/null
+++ b/src/common/Cryptography/Authentication/AuthCrypt.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _AUTHCRYPT_H
+#define _AUTHCRYPT_H
+
+#include "Cryptography/ARC4.h"
+
+class BigNumber;
+
+class AuthCrypt
+{
+ public:
+ AuthCrypt();
+
+ void Init(BigNumber* K);
+ void DecryptRecv(uint8 *, size_t);
+ void EncryptSend(uint8 *, size_t);
+
+ bool IsInitialized() const { return _initialized; }
+
+ private:
+ ARC4 _clientDecrypt;
+ ARC4 _serverEncrypt;
+ bool _initialized;
+};
+#endif
diff --git a/src/common/Cryptography/BigNumber.cpp b/src/common/Cryptography/BigNumber.cpp
new file mode 100644
index 0000000000..c43265ec89
--- /dev/null
+++ b/src/common/Cryptography/BigNumber.cpp
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include <ace/Guard_T.h>
+
+#include "Cryptography/BigNumber.h"
+#include <openssl/bn.h>
+#include <openssl/crypto.h>
+#include <algorithm>
+#include <ace/Auto_Ptr.h>
+
+BigNumber::BigNumber()
+ : _bn(BN_new())
+{ }
+
+BigNumber::BigNumber(BigNumber const& bn)
+ : _bn(BN_dup(bn._bn))
+{ }
+
+BigNumber::BigNumber(uint32 val)
+ : _bn(BN_new())
+{
+ BN_set_word(_bn, val);
+}
+
+BigNumber::~BigNumber()
+{
+ BN_free(_bn);
+}
+
+void BigNumber::SetDword(uint32 val)
+{
+ BN_set_word(_bn, val);
+}
+
+void BigNumber::SetQword(uint64 val)
+{
+ BN_set_word(_bn, (uint32)(val >> 32));
+ BN_lshift(_bn, _bn, 32);
+ BN_add_word(_bn, (uint32)(val & 0xFFFFFFFF));
+}
+
+void BigNumber::SetBinary(uint8 const* bytes, int32 len)
+{
+ uint8* array = new uint8[len];
+
+ for (int i = 0; i < len; i++)
+ array[i] = bytes[len - 1 - i];
+
+ BN_bin2bn(array, len, _bn);
+
+ delete[] array;
+}
+
+void BigNumber::SetHexStr(char const* str)
+{
+ BN_hex2bn(&_bn, str);
+}
+
+void BigNumber::SetRand(int32 numbits)
+{
+ BN_rand(_bn, numbits, 0, 1);
+}
+
+BigNumber& BigNumber::operator=(BigNumber const& bn)
+{
+ if (this == &bn)
+ return *this;
+
+ BN_copy(_bn, bn._bn);
+ return *this;
+}
+
+BigNumber BigNumber::operator+=(BigNumber const& bn)
+{
+ BN_add(_bn, _bn, bn._bn);
+ return *this;
+}
+
+BigNumber BigNumber::operator-=(BigNumber const& bn)
+{
+ BN_sub(_bn, _bn, bn._bn);
+ return *this;
+}
+
+BigNumber BigNumber::operator*=(BigNumber const& bn)
+{
+ BN_CTX *bnctx;
+
+ bnctx = BN_CTX_new();
+ BN_mul(_bn, _bn, bn._bn, bnctx);
+ BN_CTX_free(bnctx);
+
+ return *this;
+}
+
+BigNumber BigNumber::operator/=(BigNumber const& bn)
+{
+ BN_CTX *bnctx;
+
+ bnctx = BN_CTX_new();
+ BN_div(_bn, NULL, _bn, bn._bn, bnctx);
+ BN_CTX_free(bnctx);
+
+ return *this;
+}
+
+BigNumber BigNumber::operator%=(BigNumber const& bn)
+{
+ BN_CTX *bnctx;
+
+ bnctx = BN_CTX_new();
+ BN_mod(_bn, _bn, bn._bn, bnctx);
+ BN_CTX_free(bnctx);
+
+ return *this;
+}
+
+BigNumber BigNumber::Exp(BigNumber const& bn)
+{
+ BigNumber ret;
+ BN_CTX *bnctx;
+
+ bnctx = BN_CTX_new();
+ BN_exp(ret._bn, _bn, bn._bn, bnctx);
+ BN_CTX_free(bnctx);
+
+ return ret;
+}
+
+BigNumber BigNumber::ModExp(BigNumber const& bn1, BigNumber const& bn2)
+{
+ BigNumber ret;
+ BN_CTX *bnctx;
+
+ bnctx = BN_CTX_new();
+ BN_mod_exp(ret._bn, _bn, bn1._bn, bn2._bn, bnctx);
+ BN_CTX_free(bnctx);
+
+ return ret;
+}
+
+int32 BigNumber::GetNumBytes(void)
+{
+ return BN_num_bytes(_bn);
+}
+
+uint32 BigNumber::AsDword()
+{
+ return (uint32)BN_get_word(_bn);
+}
+
+bool BigNumber::isZero() const
+{
+ return BN_is_zero(_bn);
+}
+
+ACE_Auto_Array_Ptr<uint8> BigNumber::AsByteArray(int32 minSize, bool littleEndian)
+{
+ int length = (minSize >= GetNumBytes()) ? minSize : GetNumBytes();
+
+ uint8* array = new uint8[length];
+
+ // If we need more bytes than length of BigNumber set the rest to 0
+ if (length > GetNumBytes())
+ memset((void*)array, 0, length);
+
+ BN_bn2bin(_bn, (unsigned char *)array);
+
+ // openssl's BN stores data internally in big endian format, reverse if little endian desired
+ if (littleEndian)
+ std::reverse(array, array + length);
+
+ ACE_Auto_Array_Ptr<uint8> ret(array);
+ return ret;
+}
+
+char * BigNumber::AsHexStr() const
+{
+ return BN_bn2hex(_bn);
+}
+
+char * BigNumber::AsDecStr() const
+{
+ return BN_bn2dec(_bn);
+}
+
diff --git a/src/common/Cryptography/BigNumber.h b/src/common/Cryptography/BigNumber.h
new file mode 100644
index 0000000000..337dee9db1
--- /dev/null
+++ b/src/common/Cryptography/BigNumber.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _AUTH_BIGNUMBER_H
+#define _AUTH_BIGNUMBER_H
+
+#include "Define.h"
+#include <ace/Auto_Ptr.h>
+
+struct bignum_st;
+
+class BigNumber
+{
+ public:
+ BigNumber();
+ BigNumber(BigNumber const& bn);
+ BigNumber(uint32);
+ ~BigNumber();
+
+ void SetDword(uint32);
+ void SetQword(uint64);
+ void SetBinary(uint8 const* bytes, int32 len);
+ void SetHexStr(char const* str);
+
+ void SetRand(int32 numbits);
+
+ BigNumber& operator=(BigNumber const& bn);
+
+ BigNumber operator+=(BigNumber const& bn);
+ BigNumber operator+(BigNumber const& bn)
+ {
+ BigNumber t(*this);
+ return t += bn;
+ }
+
+ BigNumber operator-=(BigNumber const& bn);
+ BigNumber operator-(BigNumber const& bn)
+ {
+ BigNumber t(*this);
+ return t -= bn;
+ }
+
+ BigNumber operator*=(BigNumber const& bn);
+ BigNumber operator*(BigNumber const& bn)
+ {
+ BigNumber t(*this);
+ return t *= bn;
+ }
+
+ BigNumber operator/=(BigNumber const& bn);
+ BigNumber operator/(BigNumber const& bn)
+ {
+ BigNumber t(*this);
+ return t /= bn;
+ }
+
+ BigNumber operator%=(BigNumber const& bn);
+ BigNumber operator%(BigNumber const& bn)
+ {
+ BigNumber t(*this);
+ return t %= bn;
+ }
+
+ bool isZero() const;
+
+ BigNumber ModExp(BigNumber const& bn1, BigNumber const& bn2);
+ BigNumber Exp(BigNumber const&);
+
+ int32 GetNumBytes(void);
+
+ struct bignum_st *BN() { return _bn; }
+
+ uint32 AsDword();
+
+ ACE_Auto_Array_Ptr<uint8> AsByteArray(int32 minSize = 0, bool littleEndian = true);
+
+ char * AsHexStr() const;
+ char * AsDecStr() const;
+
+ private:
+ struct bignum_st *_bn;
+
+};
+#endif
+
diff --git a/src/common/Cryptography/HMACSHA1.cpp b/src/common/Cryptography/HMACSHA1.cpp
new file mode 100644
index 0000000000..93872d2716
--- /dev/null
+++ b/src/common/Cryptography/HMACSHA1.cpp
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "HMACSHA1.h"
+#include "BigNumber.h"
+#include "Common.h"
+
+HmacHash::HmacHash(uint32 len, uint8 *seed)
+{
+ HMAC_CTX_init(&m_ctx);
+ HMAC_Init_ex(&m_ctx, seed, len, EVP_sha1(), NULL);
+ memset(m_digest, 0, sizeof(m_digest));
+}
+
+HmacHash::~HmacHash()
+{
+ HMAC_CTX_cleanup(&m_ctx);
+}
+
+void HmacHash::UpdateData(const std::string &str)
+{
+ HMAC_Update(&m_ctx, (uint8 const*)str.c_str(), str.length());
+}
+
+void HmacHash::UpdateData(const uint8* data, size_t len)
+{
+ HMAC_Update(&m_ctx, data, len);
+}
+
+void HmacHash::Finalize()
+{
+ uint32 length = 0;
+ HMAC_Final(&m_ctx, (uint8*)m_digest, &length);
+ ASSERT(length == SHA_DIGEST_LENGTH);
+}
+
+uint8 *HmacHash::ComputeHash(BigNumber* bn)
+{
+ HMAC_Update(&m_ctx, bn->AsByteArray().get(), bn->GetNumBytes());
+ Finalize();
+ return (uint8*)m_digest;
+}
diff --git a/src/common/Cryptography/HMACSHA1.h b/src/common/Cryptography/HMACSHA1.h
new file mode 100644
index 0000000000..3c99dc0838
--- /dev/null
+++ b/src/common/Cryptography/HMACSHA1.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _AUTH_HMAC_H
+#define _AUTH_HMAC_H
+
+#include "Define.h"
+#include <string>
+#include <openssl/hmac.h>
+#include <openssl/sha.h>
+
+class BigNumber;
+
+#define SEED_KEY_SIZE 16
+
+class HmacHash
+{
+ public:
+ HmacHash(uint32 len, uint8 *seed);
+ ~HmacHash();
+ void UpdateData(const std::string &str);
+ void UpdateData(const uint8* data, size_t len);
+ void Finalize();
+ uint8 *ComputeHash(BigNumber* bn);
+ uint8 *GetDigest() { return (uint8*)m_digest; }
+ int GetLength() const { return SHA_DIGEST_LENGTH; }
+ private:
+ HMAC_CTX m_ctx;
+ uint8 m_digest[SHA_DIGEST_LENGTH];
+};
+#endif
+
diff --git a/src/common/Cryptography/OpenSSLCrypto.cpp b/src/common/Cryptography/OpenSSLCrypto.cpp
new file mode 100644
index 0000000000..d8b1b7c6e9
--- /dev/null
+++ b/src/common/Cryptography/OpenSSLCrypto.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include <OpenSSLCrypto.h>
+#include <openssl/crypto.h>
+#include <ace/Thread_Mutex.h>
+#include <vector>
+#include <ace/Thread.h>
+
+std::vector<ACE_Thread_Mutex*> cryptoLocks;
+
+static void lockingCallback(int mode, int type, const char* /*file*/, int /*line*/)
+{
+ if (mode & CRYPTO_LOCK)
+ cryptoLocks[type]->acquire();
+ else
+ cryptoLocks[type]->release();
+}
+
+static void threadIdCallback(CRYPTO_THREADID * id)
+{
+/// ACE_thread_t turns out to be a struct under Mac OS.
+#ifndef __APPLE__
+ CRYPTO_THREADID_set_numeric(id, ACE_Thread::self());
+#else
+ CRYPTO_THREADID_set_pointer(id, ACE_Thread::self());
+#endif
+}
+
+void OpenSSLCrypto::threadsSetup()
+{
+ cryptoLocks.resize(CRYPTO_num_locks());
+ for(int i = 0 ; i < CRYPTO_num_locks(); ++i)
+ {
+ cryptoLocks[i] = new ACE_Thread_Mutex();
+ }
+ CRYPTO_THREADID_set_callback(threadIdCallback);
+ CRYPTO_set_locking_callback(lockingCallback);
+}
+
+void OpenSSLCrypto::threadsCleanup()
+{
+ CRYPTO_set_locking_callback(NULL);
+ CRYPTO_THREADID_set_callback(NULL);
+ for(int i = 0 ; i < CRYPTO_num_locks(); ++i)
+ {
+ delete cryptoLocks[i];
+ }
+ cryptoLocks.resize(0);
+} \ No newline at end of file
diff --git a/src/common/Cryptography/OpenSSLCrypto.h b/src/common/Cryptography/OpenSSLCrypto.h
new file mode 100644
index 0000000000..4285f7d750
--- /dev/null
+++ b/src/common/Cryptography/OpenSSLCrypto.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef OPENSSL_CRYPTO_H
+#define OPENSSL_CRYPTO_H
+
+/**
+* A group of functions which setup openssl crypto module to work properly in multithreaded enviroment
+* If not setup properly - it will crash
+*/
+namespace OpenSSLCrypto
+{
+ /// Needs to be called before threads using openssl are spawned
+ void threadsSetup();
+ /// Needs to be called after threads using openssl are despawned
+ void threadsCleanup();
+}
+
+#endif \ No newline at end of file
diff --git a/src/common/Cryptography/SHA1.cpp b/src/common/Cryptography/SHA1.cpp
new file mode 100644
index 0000000000..a4176eecc6
--- /dev/null
+++ b/src/common/Cryptography/SHA1.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "SHA1.h"
+#include "BigNumber.h"
+#include <stdarg.h>
+
+SHA1Hash::SHA1Hash()
+{
+ SHA1_Init(&mC);
+ memset(mDigest, 0, SHA_DIGEST_LENGTH * sizeof(uint8));
+}
+
+SHA1Hash::~SHA1Hash()
+{
+ SHA1_Init(&mC);
+}
+
+void SHA1Hash::UpdateData(const uint8 *dta, int len)
+{
+ SHA1_Update(&mC, dta, len);
+}
+
+void SHA1Hash::UpdateData(const std::string &str)
+{
+ UpdateData((uint8 const*)str.c_str(), str.length());
+}
+
+void SHA1Hash::UpdateBigNumbers(BigNumber* bn0, ...)
+{
+ va_list v;
+ BigNumber* bn;
+
+ va_start(v, bn0);
+ bn = bn0;
+ while (bn)
+ {
+ UpdateData(bn->AsByteArray().get(), bn->GetNumBytes());
+ bn = va_arg(v, BigNumber*);
+ }
+ va_end(v);
+}
+
+void SHA1Hash::Initialize()
+{
+ SHA1_Init(&mC);
+}
+
+void SHA1Hash::Finalize(void)
+{
+ SHA1_Final(mDigest, &mC);
+}
+
diff --git a/src/common/Cryptography/SHA1.h b/src/common/Cryptography/SHA1.h
new file mode 100644
index 0000000000..afa6667439
--- /dev/null
+++ b/src/common/Cryptography/SHA1.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _AUTH_SHA1_H
+#define _AUTH_SHA1_H
+
+#include "Define.h"
+#include <string>
+#include <openssl/sha.h>
+
+class BigNumber;
+
+class SHA1Hash
+{
+ public:
+ SHA1Hash();
+ ~SHA1Hash();
+
+ void UpdateBigNumbers(BigNumber* bn0, ...);
+
+ void UpdateData(const uint8 *dta, int len);
+ void UpdateData(const std::string &str);
+
+ void Initialize();
+ void Finalize();
+
+ uint8 *GetDigest(void) { return mDigest; };
+ int GetLength(void) const { return SHA_DIGEST_LENGTH; };
+
+ private:
+ SHA_CTX mC;
+ uint8 mDigest[SHA_DIGEST_LENGTH];
+};
+#endif
+
diff --git a/src/common/Cryptography/WardenKeyGeneration.h b/src/common/Cryptography/WardenKeyGeneration.h
new file mode 100644
index 0000000000..5d73b3037a
--- /dev/null
+++ b/src/common/Cryptography/WardenKeyGeneration.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "SHA1.h"
+
+#ifndef _WARDEN_KEY_GENERATION_H
+#define _WARDEN_KEY_GENERATION_H
+
+class SHA1Randx
+{
+public:
+ SHA1Randx(uint8* buff, uint32 size)
+ {
+ uint32 taken = size/2;
+
+ sh.Initialize();
+ sh.UpdateData(buff, taken);
+ sh.Finalize();
+
+ memcpy(o1, sh.GetDigest(), 20);
+
+ sh.Initialize();
+ sh.UpdateData(buff + taken, size - taken);
+ sh.Finalize();
+
+ memcpy(o2, sh.GetDigest(), 20);
+
+ memset(o0, 0x00, 20);
+
+ FillUp();
+ }
+
+ void Generate(uint8* buf, uint32 sz)
+ {
+ for (uint32 i = 0; i < sz; ++i)
+ {
+ if (taken == 20)
+ FillUp();
+
+ buf[i] = o0[taken];
+ taken++;
+ }
+ }
+
+private:
+ void FillUp()
+ {
+ sh.Initialize();
+ sh.UpdateData(o1, 20);
+ sh.UpdateData(o0, 20);
+ sh.UpdateData(o2, 20);
+ sh.Finalize();
+
+ memcpy(o0, sh.GetDigest(), 20);
+
+ taken = 0;
+ }
+
+ SHA1Hash sh;
+ uint32 taken;
+ uint8 o0[20], o1[20], o2[20];
+};
+
+#endif
diff --git a/src/common/DataStores/DBCFileLoader.cpp b/src/common/DataStores/DBCFileLoader.cpp
new file mode 100644
index 0000000000..6d5790b383
--- /dev/null
+++ b/src/common/DataStores/DBCFileLoader.cpp
@@ -0,0 +1,312 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "DBCFileLoader.h"
+#include "Errors.h"
+
+DBCFileLoader::DBCFileLoader() : recordSize(0), recordCount(0), fieldCount(0), stringSize(0), fieldsOffset(NULL), data(NULL), stringTable(NULL) { }
+
+bool DBCFileLoader::Load(const char* filename, const char* fmt)
+{
+ uint32 header;
+ if (data)
+ {
+ delete [] data;
+ data = NULL;
+ }
+
+ FILE* f = fopen(filename, "rb");
+ if (!f)
+ return false;
+
+ if (fread(&header, 4, 1, f) != 1) // Number of records
+ {
+ fclose(f);
+ return false;
+ }
+
+
+ EndianConvert(header);
+
+ if (header != 0x43424457) //'WDBC'
+ {
+ fclose(f);
+ return false;
+ }
+
+ if (fread(&recordCount, 4, 1, f) != 1) // Number of records
+ {
+ fclose(f);
+ return false;
+ }
+
+ EndianConvert(recordCount);
+
+ if (fread(&fieldCount, 4, 1, f) != 1) // Number of fields
+ {
+ fclose(f);
+ return false;
+ }
+
+ EndianConvert(fieldCount);
+
+ if (fread(&recordSize, 4, 1, f) != 1) // Size of a record
+ {
+ fclose(f);
+ return false;
+ }
+
+ EndianConvert(recordSize);
+
+ if (fread(&stringSize, 4, 1, f) != 1) // String size
+ {
+ fclose(f);
+ return false;
+ }
+
+ EndianConvert(stringSize);
+
+ fieldsOffset = new uint32[fieldCount];
+ fieldsOffset[0] = 0;
+ for (uint32 i = 1; i < fieldCount; ++i)
+ {
+ fieldsOffset[i] = fieldsOffset[i - 1];
+ if (fmt[i - 1] == 'b' || fmt[i - 1] == 'X') // byte fields
+ fieldsOffset[i] += sizeof(uint8);
+ else // 4 byte fields (int32/float/strings)
+ fieldsOffset[i] += sizeof(uint32);
+ }
+
+ data = new unsigned char[recordSize * recordCount + stringSize];
+ stringTable = data + recordSize*recordCount;
+
+ if (fread(data, recordSize * recordCount + stringSize, 1, f) != 1)
+ {
+ fclose(f);
+ return false;
+ }
+
+ fclose(f);
+
+ return true;
+}
+
+DBCFileLoader::~DBCFileLoader()
+{
+ if (data)
+ delete [] data;
+
+ if (fieldsOffset)
+ delete [] fieldsOffset;
+}
+
+DBCFileLoader::Record DBCFileLoader::getRecord(size_t id)
+{
+ assert(data);
+ return Record(*this, data + id * recordSize);
+}
+
+uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos)
+{
+ uint32 recordsize = 0;
+ int32 i = -1;
+ for (uint32 x = 0; format[x]; ++x)
+ {
+ switch (format[x])
+ {
+ case FT_FLOAT:
+ recordsize += sizeof(float);
+ break;
+ case FT_INT:
+ recordsize += sizeof(uint32);
+ break;
+ case FT_STRING:
+ recordsize += sizeof(char*);
+ break;
+ case FT_SORT:
+ i = x;
+ break;
+ case FT_IND:
+ i = x;
+ recordsize += sizeof(uint32);
+ break;
+ case FT_BYTE:
+ recordsize += sizeof(uint8);
+ break;
+ case FT_NA:
+ case FT_NA_BYTE:
+ break;
+ case FT_LOGIC:
+ ASSERT(false && "Attempted to load DBC files that do not have field types that match what is in the core. Check DBCfmt.h or your DBC files.");
+ break;
+ default:
+ ASSERT(false && "Unknown field format character in DBCfmt.h");
+ break;
+ }
+ }
+
+ if (index_pos)
+ *index_pos = i;
+
+ return recordsize;
+}
+
+char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char*& sqlDataTable)
+{
+ /*
+ format STRING, NA, FLOAT, NA, INT <=>
+ struct{
+ char* field0,
+ float field1,
+ int field2
+ }entry;
+
+ this func will generate entry[rows] data;
+ */
+
+ typedef char* ptr;
+ if (strlen(format) != fieldCount)
+ return NULL;
+
+ //get struct size and index pos
+ int32 i;
+ uint32 recordsize = GetFormatRecordSize(format, &i);
+
+ if (i >= 0)
+ {
+ uint32 maxi = 0;
+ //find max index
+ for (uint32 y = 0; y < recordCount; ++y)
+ {
+ uint32 ind = getRecord(y).getUInt(i);
+ if (ind > maxi)
+ maxi = ind;
+ }
+
+ // If higher index avalible from sql - use it instead of dbcs
+ if (sqlHighestIndex > maxi)
+ maxi = sqlHighestIndex;
+
+ ++maxi;
+ records = maxi;
+ indexTable = new ptr[maxi];
+ memset(indexTable, 0, maxi * sizeof(ptr));
+ }
+ else
+ {
+ records = recordCount + sqlRecordCount;
+ indexTable = new ptr[recordCount + sqlRecordCount];
+ }
+
+ char* dataTable = new char[(recordCount + sqlRecordCount) * recordsize];
+
+ uint32 offset = 0;
+
+ for (uint32 y = 0; y < recordCount; ++y)
+ {
+ if (i >= 0)
+ indexTable[getRecord(y).getUInt(i)] = &dataTable[offset];
+ else
+ indexTable[y] = &dataTable[offset];
+
+ for (uint32 x=0; x < fieldCount; ++x)
+ {
+ switch (format[x])
+ {
+ case FT_FLOAT:
+ *((float*)(&dataTable[offset])) = getRecord(y).getFloat(x);
+ offset += sizeof(float);
+ break;
+ case FT_IND:
+ case FT_INT:
+ *((uint32*)(&dataTable[offset])) = getRecord(y).getUInt(x);
+ offset += sizeof(uint32);
+ break;
+ case FT_BYTE:
+ *((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x);
+ offset += sizeof(uint8);
+ break;
+ case FT_STRING:
+ *((char**)(&dataTable[offset])) = NULL; // will replace non-empty or "" strings in AutoProduceStrings
+ offset += sizeof(char*);
+ break;
+ case FT_LOGIC:
+ ASSERT(false && "Attempted to load DBC files that do not have field types that match what is in the core. Check DBCfmt.h or your DBC files.");
+ break;
+ case FT_NA:
+ case FT_NA_BYTE:
+ case FT_SORT:
+ break;
+ default:
+ ASSERT(false && "Unknown field format character in DBCfmt.h");
+ break;
+ }
+ }
+ }
+
+ sqlDataTable = dataTable + offset;
+
+ return dataTable;
+}
+
+char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable)
+{
+ if (strlen(format) != fieldCount)
+ return NULL;
+
+ char* stringPool = new char[stringSize];
+ memcpy(stringPool, stringTable, stringSize);
+
+ uint32 offset = 0;
+
+ for (uint32 y = 0; y < recordCount; ++y)
+ {
+ for (uint32 x = 0; x < fieldCount; ++x)
+ {
+ switch (format[x])
+ {
+ case FT_FLOAT:
+ offset += sizeof(float);
+ break;
+ case FT_IND:
+ case FT_INT:
+ offset += sizeof(uint32);
+ break;
+ case FT_BYTE:
+ offset += sizeof(uint8);
+ break;
+ case FT_STRING:
+ {
+ // fill only not filled entries
+ char** slot = (char**)(&dataTable[offset]);
+ if (!*slot || !**slot)
+ {
+ const char * st = getRecord(y).getString(x);
+ *slot=stringPool+(st-(const char*)stringTable);
+ }
+ offset += sizeof(char*);
+ break;
+ }
+ case FT_LOGIC:
+ ASSERT(false && "Attempted to load DBC files that does not have field types that match what is in the core. Check DBCfmt.h or your DBC files.");
+ break;
+ case FT_NA:
+ case FT_NA_BYTE:
+ case FT_SORT:
+ break;
+ default:
+ ASSERT(false && "Unknown field format character in DBCfmt.h");
+ break;
+ }
+ }
+ }
+
+ return stringPool;
+}
diff --git a/src/common/DataStores/DBCFileLoader.h b/src/common/DataStores/DBCFileLoader.h
new file mode 100644
index 0000000000..2afba9579e
--- /dev/null
+++ b/src/common/DataStores/DBCFileLoader.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef DBC_FILE_LOADER_H
+#define DBC_FILE_LOADER_H
+#include "Define.h"
+#include "Utilities/ByteConverter.h"
+#include <cassert>
+
+enum DbcFieldFormat
+{
+ FT_NA='x', //not used or unknown, 4 byte size
+ FT_NA_BYTE='X', //not used or unknown, byte
+ FT_STRING='s', //char*
+ FT_FLOAT='f', //float
+ FT_INT='i', //uint32
+ FT_BYTE='b', //uint8
+ FT_SORT='d', //sorted by this field, field is not included
+ FT_IND='n', //the same, but parsed to data
+ FT_LOGIC='l', //Logical (boolean)
+ FT_SQL_PRESENT='p', //Used in sql format to mark column present in sql dbc
+ FT_SQL_ABSENT='a' //Used in sql format to mark column absent in sql dbc
+};
+
+class DBCFileLoader
+{
+ public:
+ DBCFileLoader();
+ ~DBCFileLoader();
+
+ bool Load(const char *filename, const char *fmt);
+
+ class Record
+ {
+ public:
+ float getFloat(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ float val = *reinterpret_cast<float*>(offset+file.GetOffset(field));
+ EndianConvert(val);
+ return val;
+ }
+ uint32 getUInt(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ uint32 val = *reinterpret_cast<uint32*>(offset+file.GetOffset(field));
+ EndianConvert(val);
+ return val;
+ }
+ uint8 getUInt8(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<uint8*>(offset+file.GetOffset(field));
+ }
+
+ const char *getString(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ size_t stringOffset = getUInt(field);
+ assert(stringOffset < file.stringSize);
+ return reinterpret_cast<char*>(file.stringTable + stringOffset);
+ }
+
+ private:
+ Record(DBCFileLoader &file_, unsigned char *offset_): offset(offset_), file(file_) { }
+ unsigned char *offset;
+ DBCFileLoader &file;
+
+ friend class DBCFileLoader;
+
+ };
+
+ // Get record by id
+ Record getRecord(size_t id);
+ /// Get begin iterator over records
+
+ uint32 GetNumRows() const { return recordCount; }
+ uint32 GetRowSize() const { return recordSize; }
+ uint32 GetCols() const { return fieldCount; }
+ uint32 GetOffset(size_t id) const { return (fieldsOffset != NULL && id < fieldCount) ? fieldsOffset[id] : 0; }
+ bool IsLoaded() const { return data != NULL; }
+ char* AutoProduceData(const char* fmt, uint32& count, char**& indexTable, uint32 sqlRecordCount, uint32 sqlHighestIndex, char *& sqlDataTable);
+ char* AutoProduceStrings(const char* fmt, char* dataTable);
+ static uint32 GetFormatRecordSize(const char * format, int32 * index_pos = NULL);
+ private:
+
+ uint32 recordSize;
+ uint32 recordCount;
+ uint32 fieldCount;
+ uint32 stringSize;
+ uint32 *fieldsOffset;
+ unsigned char *data;
+ unsigned char *stringTable;
+};
+#endif
diff --git a/src/common/DataStores/DBCStore.h b/src/common/DataStores/DBCStore.h
new file mode 100644
index 0000000000..533e542041
--- /dev/null
+++ b/src/common/DataStores/DBCStore.h
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef DBCSTORE_H
+#define DBCSTORE_H
+
+#include "DBCFileLoader.h"
+#include "Logging/Log.h"
+#include "Field.h"
+#include "DatabaseWorkerPool.h"
+#include "Implementation/WorldDatabase.h"
+#include "DatabaseEnv.h"
+
+struct SqlDbc
+{
+ std::string const* formatString;
+ std::string const* indexName;
+ std::string sqlTableName;
+ int32 indexPos;
+ int32 sqlIndexPos;
+ SqlDbc(std::string const* _filename, std::string const* _format, std::string const* _idname, char const* fmt)
+ : formatString(_format), indexName (_idname), sqlIndexPos(0)
+ {
+ // Convert dbc file name to sql table name
+ sqlTableName = *_filename;
+ for (uint32 i = 0; i< sqlTableName.size(); ++i)
+ {
+ if (isalpha(sqlTableName[i]))
+ sqlTableName[i] = char(tolower(sqlTableName[i]));
+ else if (sqlTableName[i] == '.')
+ sqlTableName[i] = '_';
+ }
+
+ // Get sql index position
+ DBCFileLoader::GetFormatRecordSize(fmt, &indexPos);
+ if (indexPos >= 0)
+ {
+ uint32 uindexPos = uint32(indexPos);
+ for (uint32 x = 0; x < formatString->size(); ++x)
+ {
+ // Count only fields present in sql
+ if ((*formatString)[x] == FT_SQL_PRESENT)
+ {
+ if (x == uindexPos)
+ break;
+ ++sqlIndexPos;
+ }
+ }
+ }
+ }
+};
+
+template<class T>
+class DBCStorage
+{
+ typedef std::list<char*> StringPoolList;
+ public:
+ explicit DBCStorage(char const* f)
+ : fmt(f), nCount(0), fieldCount(0), dataTable(NULL)
+ {
+ indexTable.asT = NULL;
+ }
+
+ ~DBCStorage() { Clear(); }
+
+ T const* LookupEntry(uint32 id) const
+ {
+ return (id >= nCount) ? NULL : indexTable.asT[id];
+ }
+
+ uint32 GetNumRows() const { return nCount; }
+ char const* GetFormat() const { return fmt; }
+ uint32 GetFieldCount() const { return fieldCount; }
+
+ bool Load(char const* fn, SqlDbc* sql)
+ {
+ DBCFileLoader dbc;
+ // Check if load was sucessful, only then continue
+ if (!dbc.Load(fn, fmt))
+ return false;
+
+ uint32 sqlRecordCount = 0;
+ uint32 sqlHighestIndex = 0;
+ Field* fields = NULL;
+ QueryResult result = QueryResult(NULL);
+ // Load data from sql
+ if (sql)
+ {
+ std::string query = "SELECT * FROM " + sql->sqlTableName;
+ if (sql->indexPos >= 0)
+ query +=" ORDER BY " + *sql->indexName + " DESC";
+ query += ';';
+
+
+ result = WorldDatabase.Query(query.c_str());
+ if (result)
+ {
+ sqlRecordCount = uint32(result->GetRowCount());
+ if (sql->indexPos >= 0)
+ {
+ fields = result->Fetch();
+ sqlHighestIndex = fields[sql->sqlIndexPos].GetUInt32();
+ }
+
+ // Check if sql index pos is valid
+ if (int32(result->GetFieldCount() - 1) < sql->sqlIndexPos)
+ {
+ sLog->outError("Invalid index pos for dbc:'%s'", sql->sqlTableName.c_str());
+ return false;
+ }
+ }
+ }
+
+ char* sqlDataTable = NULL;
+ fieldCount = dbc.GetCols();
+
+ dataTable = reinterpret_cast<T*>(dbc.AutoProduceData(fmt, nCount, indexTable.asChar,
+ sqlRecordCount, sqlHighestIndex, sqlDataTable));
+
+ stringPoolList.push_back(dbc.AutoProduceStrings(fmt, reinterpret_cast<char*>(dataTable)));
+
+ // Insert sql data into arrays
+ if (result)
+ {
+ if (indexTable.asT)
+ {
+ uint32 offset = 0;
+ uint32 rowIndex = dbc.GetNumRows();
+ do
+ {
+ if (!fields)
+ fields = result->Fetch();
+
+ if (sql->indexPos >= 0)
+ {
+ uint32 id = fields[sql->sqlIndexPos].GetUInt32();
+ if (indexTable.asT[id])
+ {
+ sLog->outError("Index %d already exists in dbc:'%s'", id, sql->sqlTableName.c_str());
+ return false;
+ }
+
+ indexTable.asT[id] = reinterpret_cast<T*>(&sqlDataTable[offset]);
+ }
+ else
+ indexTable.asT[rowIndex]= reinterpret_cast<T*>(&sqlDataTable[offset]);
+
+ uint32 columnNumber = 0;
+ uint32 sqlColumnNumber = 0;
+
+ for (; columnNumber < sql->formatString->size(); ++columnNumber)
+ {
+ if ((*sql->formatString)[columnNumber] == FT_SQL_ABSENT)
+ {
+ switch (fmt[columnNumber])
+ {
+ case FT_FLOAT:
+ *reinterpret_cast<float*>(&sqlDataTable[offset]) = 0.0f;
+ offset += 4;
+ break;
+ case FT_IND:
+ case FT_INT:
+ *reinterpret_cast<uint32*>(&sqlDataTable[offset]) = uint32(0);
+ offset += 4;
+ break;
+ case FT_BYTE:
+ *reinterpret_cast<uint8*>(&sqlDataTable[offset]) = uint8(0);
+ offset += 1;
+ break;
+ case FT_STRING:
+ // Beginning of the pool - empty string
+ *reinterpret_cast<char**>(&sqlDataTable[offset]) = stringPoolList.back();
+ offset += sizeof(char*);
+ break;
+ }
+ }
+ else if ((*sql->formatString)[columnNumber] == FT_SQL_PRESENT)
+ {
+ bool validSqlColumn = true;
+ switch (fmt[columnNumber])
+ {
+ case FT_FLOAT:
+ *reinterpret_cast<float*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetFloat();
+ offset += 4;
+ break;
+ case FT_IND:
+ case FT_INT:
+ *reinterpret_cast<uint32*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt32();
+ offset += 4;
+ break;
+ case FT_BYTE:
+ *reinterpret_cast<uint8*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt8();
+ offset += 1;
+ break;
+ case FT_STRING:
+ sLog->outError("Unsupported data type in table '%s' at char %d", sql->sqlTableName.c_str(), columnNumber);
+ return false;
+ case FT_SORT:
+ break;
+ default:
+ validSqlColumn = false;
+ break;
+ }
+ if (validSqlColumn && (columnNumber != (sql->formatString->size()-1)))
+ sqlColumnNumber++;
+ }
+ else
+ {
+ sLog->outError("Incorrect sql format string '%s' at char %d", sql->sqlTableName.c_str(), columnNumber);
+ return false;
+ }
+ }
+
+ if (sqlColumnNumber != (result->GetFieldCount() - 1))
+ {
+ sLog->outError("SQL and DBC format strings are not matching for table: '%s'", sql->sqlTableName.c_str());
+ return false;
+ }
+
+ fields = NULL;
+ ++rowIndex;
+ } while (result->NextRow());
+ }
+ }
+
+ // error in dbc file at loading if NULL
+ return indexTable.asT != NULL;
+ }
+
+ bool LoadStringsFrom(char const* fn)
+ {
+ // DBC must be already loaded using Load
+ if (!indexTable.asT)
+ return false;
+
+ DBCFileLoader dbc;
+ // Check if load was successful, only then continue
+ if (!dbc.Load(fn, fmt))
+ return false;
+
+ stringPoolList.push_back(dbc.AutoProduceStrings(fmt, reinterpret_cast<char*>(dataTable)));
+
+ return true;
+ }
+
+ void Clear()
+ {
+ if (!indexTable.asT)
+ return;
+
+ delete[] reinterpret_cast<char*>(indexTable.asT);
+ indexTable.asT = NULL;
+ delete[] reinterpret_cast<char*>(dataTable);
+ dataTable = NULL;
+
+ while (!stringPoolList.empty())
+ {
+ delete[] stringPoolList.front();
+ stringPoolList.pop_front();
+ }
+
+ nCount = 0;
+ }
+
+ private:
+ char const* fmt;
+ uint32 nCount;
+ uint32 fieldCount;
+
+ union
+ {
+ T** asT;
+ char** asChar;
+ }
+ indexTable;
+
+ T* dataTable;
+ StringPoolList stringPoolList;
+};
+
+#endif
diff --git a/src/common/Database/AdhocStatement.cpp b/src/common/Database/AdhocStatement.cpp
new file mode 100644
index 0000000000..e752ab9e7d
--- /dev/null
+++ b/src/common/Database/AdhocStatement.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "AdhocStatement.h"
+#include "MySQLConnection.h"
+
+/*! Basic, ad-hoc queries. */
+BasicStatementTask::BasicStatementTask(const char* sql) :
+m_has_result(false)
+{
+ m_sql = strdup(sql);
+}
+
+BasicStatementTask::BasicStatementTask(const char* sql, QueryResultFuture result) :
+m_has_result(true),
+m_result(result)
+{
+ m_sql = strdup(sql);
+}
+
+BasicStatementTask::~BasicStatementTask()
+{
+ free((void*)m_sql);
+}
+
+bool BasicStatementTask::Execute()
+{
+ if (m_has_result)
+ {
+ ResultSet* result = m_conn->Query(m_sql);
+ if (!result || !result->GetRowCount())
+ {
+ delete result;
+ m_result.set(QueryResult(NULL));
+ return false;
+ }
+ result->NextRow();
+ m_result.set(QueryResult(result));
+ return true;
+ }
+
+ return m_conn->Execute(m_sql);
+}
diff --git a/src/common/Database/AdhocStatement.h b/src/common/Database/AdhocStatement.h
new file mode 100644
index 0000000000..b527efcada
--- /dev/null
+++ b/src/common/Database/AdhocStatement.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _ADHOCSTATEMENT_H
+#define _ADHOCSTATEMENT_H
+
+#include <ace/Future.h>
+#include "SQLOperation.h"
+
+typedef ACE_Future<QueryResult> QueryResultFuture;
+/*! Raw, ad-hoc query. */
+class BasicStatementTask : public SQLOperation
+{
+ public:
+ BasicStatementTask(const char* sql);
+ BasicStatementTask(const char* sql, QueryResultFuture result);
+ ~BasicStatementTask();
+
+ bool Execute();
+
+ private:
+ const char* m_sql; //- Raw query to be executed
+ bool m_has_result;
+ QueryResultFuture m_result;
+};
+
+#endif \ No newline at end of file
diff --git a/src/common/Database/DatabaseEnv.h b/src/common/Database/DatabaseEnv.h
new file mode 100644
index 0000000000..cfa9eef24a
--- /dev/null
+++ b/src/common/Database/DatabaseEnv.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef DATABASEENV_H
+#define DATABASEENV_H
+
+#include "Common.h"
+#include "Errors.h"
+#include "Log.h"
+
+#include "Field.h"
+#include "QueryResult.h"
+
+#include "MySQLThreading.h"
+#include "Transaction.h"
+
+#define _LIKE_ "LIKE"
+#define _TABLE_SIM_ "`"
+#define _CONCAT3_(A, B, C) "CONCAT( " A ", " B ", " C " )"
+#define _OFFSET_ "LIMIT %d, 1"
+
+#include "Implementation/LoginDatabase.h"
+#include "Implementation/CharacterDatabase.h"
+#include "Implementation/WorldDatabase.h"
+
+extern WorldDatabaseWorkerPool WorldDatabase;
+extern CharacterDatabaseWorkerPool CharacterDatabase;
+extern LoginDatabaseWorkerPool LoginDatabase;
+
+#endif
+
diff --git a/src/common/Database/DatabaseWorker.cpp b/src/common/Database/DatabaseWorker.cpp
new file mode 100644
index 0000000000..aa6a5ba16c
--- /dev/null
+++ b/src/common/Database/DatabaseWorker.cpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "DatabaseEnv.h"
+#include "DatabaseWorker.h"
+#include "SQLOperation.h"
+#include "MySQLConnection.h"
+#include "MySQLThreading.h"
+
+DatabaseWorker::DatabaseWorker(ACE_Activation_Queue* new_queue, MySQLConnection* con) :
+m_queue(new_queue),
+m_conn(con)
+{
+ /// Assign thread to task
+ activate();
+}
+
+int DatabaseWorker::svc()
+{
+ if (!m_queue)
+ return -1;
+
+ SQLOperation *request = NULL;
+ while (1)
+ {
+ request = (SQLOperation*)(m_queue->dequeue());
+ if (!request)
+ break;
+
+ request->SetConnection(m_conn);
+ request->call();
+
+ delete request;
+ }
+
+ return 0;
+}
diff --git a/src/common/Database/DatabaseWorker.h b/src/common/Database/DatabaseWorker.h
new file mode 100644
index 0000000000..6fa544d452
--- /dev/null
+++ b/src/common/Database/DatabaseWorker.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _WORKERTHREAD_H
+#define _WORKERTHREAD_H
+
+#include <ace/Task.h>
+#include <ace/Activation_Queue.h>
+
+class MySQLConnection;
+
+class DatabaseWorker : protected ACE_Task_Base
+{
+ public:
+ DatabaseWorker(ACE_Activation_Queue* new_queue, MySQLConnection* con);
+
+ ///- Inherited from ACE_Task_Base
+ int svc();
+ int wait() { return ACE_Task_Base::wait(); }
+
+ private:
+ DatabaseWorker() : ACE_Task_Base() { }
+ ACE_Activation_Queue* m_queue;
+ MySQLConnection* m_conn;
+};
+
+#endif
diff --git a/src/common/Database/DatabaseWorkerPool.h b/src/common/Database/DatabaseWorkerPool.h
new file mode 100644
index 0000000000..87957b206a
--- /dev/null
+++ b/src/common/Database/DatabaseWorkerPool.h
@@ -0,0 +1,521 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _DATABASEWORKERPOOL_H
+#define _DATABASEWORKERPOOL_H
+
+#include <ace/Thread_Mutex.h>
+
+#include "Common.h"
+#include "Callback.h"
+#include "MySQLConnection.h"
+#include "Transaction.h"
+#include "DatabaseWorker.h"
+#include "PreparedStatement.h"
+#include "Log.h"
+#include "QueryResult.h"
+#include "QueryHolder.h"
+#include "AdhocStatement.h"
+
+#define MIN_MYSQL_SERVER_VERSION 50100u
+#define MIN_MYSQL_CLIENT_VERSION 50100u
+
+class PingOperation : public SQLOperation
+{
+ //! Operation for idle delaythreads
+ bool Execute()
+ {
+ m_conn->Ping();
+ return true;
+ }
+};
+
+template <class T>
+class DatabaseWorkerPool
+{
+ public:
+ /* Activity state */
+ DatabaseWorkerPool() :
+ _mqueue(new ACE_Message_Queue<ACE_SYNCH>(2*1024*1024, 2*1024*1024)),
+ _queue(new ACE_Activation_Queue(_mqueue))
+ {
+ memset(_connectionCount, 0, sizeof(_connectionCount));
+ _connections.resize(IDX_SIZE);
+
+ WPFatal(mysql_thread_safe(), "Used MySQL library isn't thread-safe.");
+ WPFatal(mysql_get_client_version() >= MIN_MYSQL_CLIENT_VERSION, "AzerothCore does not support MySQL versions below 5.1");
+ }
+
+ ~DatabaseWorkerPool()
+ {
+ }
+
+ bool Open(const std::string& infoString, uint8 async_threads, uint8 synch_threads)
+ {
+ bool res = true;
+ _connectionInfo = MySQLConnectionInfo(infoString);
+
+ sLog->outSQLDriver("Opening DatabasePool '%s'. Asynchronous connections: %u, synchronous connections: %u.",
+ GetDatabaseName(), async_threads, synch_threads);
+
+ //! Open asynchronous connections (delayed operations)
+ _connections[IDX_ASYNC].resize(async_threads);
+ for (uint8 i = 0; i < async_threads; ++i)
+ {
+ T* t = new T(_queue, _connectionInfo);
+ res &= t->Open();
+ if (res) // only check mysql version if connection is valid
+ WPFatal(mysql_get_server_version(t->GetHandle()) >= MIN_MYSQL_SERVER_VERSION, "AzerothCore does not support MySQL versions below 5.1");
+ _connections[IDX_ASYNC][i] = t;
+ ++_connectionCount[IDX_ASYNC];
+ }
+
+ //! Open synchronous connections (direct, blocking operations)
+ _connections[IDX_SYNCH].resize(synch_threads);
+ for (uint8 i = 0; i < synch_threads; ++i)
+ {
+ T* t = new T(_connectionInfo);
+ res &= t->Open();
+ _connections[IDX_SYNCH][i] = t;
+ ++_connectionCount[IDX_SYNCH];
+ }
+
+ if (res)
+ sLog->outSQLDriver("DatabasePool '%s' opened successfully. %u total connections running.", GetDatabaseName(),
+ (_connectionCount[IDX_SYNCH] + _connectionCount[IDX_ASYNC]));
+ else
+ sLog->outError("DatabasePool %s NOT opened. There were errors opening the MySQL connections. Check your SQLDriverLogFile "
+ "for specific errors.", GetDatabaseName());
+ return res;
+ }
+
+ void Close()
+ {
+ sLog->outSQLDriver("Closing down DatabasePool '%s'.", GetDatabaseName());
+
+ //! Shuts down delaythreads for this connection pool by underlying deactivate().
+ //! The next dequeue attempt in the worker thread tasks will result in an error,
+ //! ultimately ending the worker thread task.
+ _queue->queue()->close();
+
+ for (uint8 i = 0; i < _connectionCount[IDX_ASYNC]; ++i)
+ {
+ T* t = _connections[IDX_ASYNC][i];
+ DatabaseWorker* worker = t->m_worker;
+ worker->wait(); //! Block until no more threads are running this task.
+ delete worker;
+ t->Close(); //! Closes the actualy MySQL connection.
+ }
+
+ sLog->outSQLDriver("Asynchronous connections on DatabasePool '%s' terminated. Proceeding with synchronous connections.",
+ GetDatabaseName());
+
+ //! Shut down the synchronous connections
+ //! There's no need for locking the connection, because DatabaseWorkerPool<>::Close
+ //! should only be called after any other thread tasks in the core have exited,
+ //! meaning there can be no concurrent access at this point.
+ for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i)
+ _connections[IDX_SYNCH][i]->Close();
+
+ //! Deletes the ACE_Activation_Queue object and its underlying ACE_Message_Queue
+ delete _queue;
+ delete _mqueue;
+
+ sLog->outSQLDriver("All connections on DatabasePool '%s' closed.", GetDatabaseName());
+ }
+
+ /**
+ Delayed one-way statement methods.
+ */
+
+ //! Enqueues a one-way SQL operation in string format that will be executed asynchronously.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
+ void Execute(const char* sql)
+ {
+ if (!sql)
+ return;
+
+ BasicStatementTask* task = new BasicStatementTask(sql);
+ Enqueue(task);
+ }
+
+ //! Enqueues a one-way SQL operation in string format -with variable args- that will be executed asynchronously.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
+ void PExecute(const char* sql, ...)
+ {
+ if (!sql)
+ return;
+
+ va_list ap;
+ char szQuery[MAX_QUERY_LEN];
+ va_start(ap, sql);
+ vsnprintf(szQuery, MAX_QUERY_LEN, sql, ap);
+ va_end(ap);
+
+ Execute(szQuery);
+ }
+
+ //! Enqueues a one-way SQL operation in prepared statement format that will be executed asynchronously.
+ //! Statement must be prepared with CONNECTION_ASYNC flag.
+ void Execute(PreparedStatement* stmt)
+ {
+ PreparedStatementTask* task = new PreparedStatementTask(stmt);
+ Enqueue(task);
+ }
+
+ /**
+ Direct synchronous one-way statement methods.
+ */
+
+ //! Directly executes a one-way SQL operation in string format, that will block the calling thread until finished.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
+ void DirectExecute(const char* sql)
+ {
+ if (!sql)
+ return;
+
+ T* t = GetFreeConnection();
+ t->Execute(sql);
+ t->Unlock();
+ }
+
+ //! Directly executes a one-way SQL operation in string format -with variable args-, that will block the calling thread until finished.
+ //! This method should only be used for queries that are only executed once, e.g during startup.
+ void DirectPExecute(const char* sql, ...)
+ {
+ if (!sql)
+ return;
+
+ va_list ap;
+ char szQuery[MAX_QUERY_LEN];
+ va_start(ap, sql);
+ vsnprintf(szQuery, MAX_QUERY_LEN, sql, ap);
+ va_end(ap);
+
+ return DirectExecute(szQuery);
+ }
+
+ //! Directly executes a one-way SQL operation in prepared statement format, that will block the calling thread until finished.
+ //! Statement must be prepared with the CONNECTION_SYNCH flag.
+ void DirectExecute(PreparedStatement* stmt)
+ {
+ T* t = GetFreeConnection();
+ t->Execute(stmt);
+ t->Unlock();
+
+ //! Delete proxy-class. Not needed anymore
+ delete stmt;
+ }
+
+ /**
+ Synchronous query (with resultset) methods.
+ */
+
+ //! Directly executes an SQL query in string format that will block the calling thread until finished.
+ //! Returns reference counted auto pointer, no need for manual memory management in upper level code.
+ QueryResult Query(const char* sql, T* conn = NULL)
+ {
+ if (!conn)
+ conn = GetFreeConnection();
+
+ ResultSet* result = conn->Query(sql);
+ conn->Unlock();
+ if (!result || !result->GetRowCount())
+ {
+ delete result;
+ return QueryResult(NULL);
+ }
+
+ result->NextRow();
+ return QueryResult(result);
+ }
+
+ //! Directly executes an SQL query in string format -with variable args- that will block the calling thread until finished.
+ //! Returns reference counted auto pointer, no need for manual memory management in upper level code.
+ QueryResult PQuery(const char* sql, T* conn, ...)
+ {
+ if (!sql)
+ return QueryResult(NULL);
+
+ va_list ap;
+ char szQuery[MAX_QUERY_LEN];
+ va_start(ap, conn);
+ vsnprintf(szQuery, MAX_QUERY_LEN, sql, ap);
+ va_end(ap);
+
+ return Query(szQuery, conn);
+ }
+
+ //! Directly executes an SQL query in string format -with variable args- that will block the calling thread until finished.
+ //! Returns reference counted auto pointer, no need for manual memory management in upper level code.
+ QueryResult PQuery(const char* sql, ...)
+ {
+ if (!sql)
+ return QueryResult(NULL);
+
+ va_list ap;
+ char szQuery[MAX_QUERY_LEN];
+ va_start(ap, sql);
+ vsnprintf(szQuery, MAX_QUERY_LEN, sql, ap);
+ va_end(ap);
+
+ return Query(szQuery);
+ }
+
+ //! Directly executes an SQL query in prepared format that will block the calling thread until finished.
+ //! Returns reference counted auto pointer, no need for manual memory management in upper level code.
+ //! Statement must be prepared with CONNECTION_SYNCH flag.
+ PreparedQueryResult Query(PreparedStatement* stmt)
+ {
+ T* t = GetFreeConnection();
+ PreparedResultSet* ret = t->Query(stmt);
+ t->Unlock();
+
+ //! Delete proxy-class. Not needed anymore
+ delete stmt;
+
+ if (!ret || !ret->GetRowCount())
+ {
+ delete ret;
+ return PreparedQueryResult(NULL);
+ }
+
+ return PreparedQueryResult(ret);
+ }
+
+ /**
+ Asynchronous query (with resultset) methods.
+ */
+
+ //! Enqueues a query in string format that will set the value of the QueryResultFuture return object as soon as the query is executed.
+ //! The return value is then processed in ProcessQueryCallback methods.
+ QueryResultFuture AsyncQuery(const char* sql)
+ {
+ QueryResultFuture res;
+ BasicStatementTask* task = new BasicStatementTask(sql, res);
+ Enqueue(task);
+ return res; //! Actual return value has no use yet
+ }
+
+ //! Enqueues a query in string format -with variable args- that will set the value of the QueryResultFuture return object as soon as the query is executed.
+ //! The return value is then processed in ProcessQueryCallback methods.
+ QueryResultFuture AsyncPQuery(const char* sql, ...)
+ {
+ va_list ap;
+ char szQuery[MAX_QUERY_LEN];
+ va_start(ap, sql);
+ vsnprintf(szQuery, MAX_QUERY_LEN, sql, ap);
+ va_end(ap);
+
+ return AsyncQuery(szQuery);
+ }
+
+ //! Enqueues a query in prepared format that will set the value of the PreparedQueryResultFuture return object as soon as the query is executed.
+ //! The return value is then processed in ProcessQueryCallback methods.
+ //! Statement must be prepared with CONNECTION_ASYNC flag.
+ PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt)
+ {
+ PreparedQueryResultFuture res;
+ PreparedStatementTask* task = new PreparedStatementTask(stmt, res);
+ Enqueue(task);
+ return res;
+ }
+
+ //! Enqueues a vector of SQL operations (can be both adhoc and prepared) that will set the value of the QueryResultHolderFuture
+ //! return object as soon as the query is executed.
+ //! The return value is then processed in ProcessQueryCallback methods.
+ //! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag.
+ QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder)
+ {
+ QueryResultHolderFuture res;
+ SQLQueryHolderTask* task = new SQLQueryHolderTask(holder, res);
+ Enqueue(task);
+ return res; //! Fool compiler, has no use yet
+ }
+
+ /**
+ Transaction context methods.
+ */
+
+ //! Begins an automanaged transaction pointer that will automatically rollback if not commited. (Autocommit=0)
+ SQLTransaction BeginTransaction()
+ {
+ return SQLTransaction(new Transaction);
+ }
+
+ //! Enqueues a collection of one-way SQL operations (can be both adhoc and prepared). The order in which these operations
+ //! were appended to the transaction will be respected during execution.
+ void CommitTransaction(SQLTransaction transaction)
+ {
+ #ifdef TRINITY_DEBUG
+ //! Only analyze transaction weaknesses in Debug mode.
+ //! Ideally we catch the faults in Debug mode and then correct them,
+ //! so there's no need to waste these CPU cycles in Release mode.
+ switch (transaction->GetSize())
+ {
+ case 0:
+ sLog->outSQLDriver("Transaction contains 0 queries. Not executing.");
+ return;
+ case 1:
+ sLog->outSQLDriver("Warning: Transaction only holds 1 query, consider removing Transaction context in code.");
+ break;
+ default:
+ break;
+ }
+ #endif // TRINITY_DEBUG
+
+ Enqueue(new TransactionTask(transaction));
+ }
+
+ //! Directly executes a collection of one-way SQL operations (can be both adhoc and prepared). The order in which these operations
+ //! were appended to the transaction will be respected during execution.
+ void DirectCommitTransaction(SQLTransaction& transaction)
+ {
+ T* con = GetFreeConnection();
+ if (con->ExecuteTransaction(transaction))
+ {
+ con->Unlock(); // OK, operation succesful
+ return;
+ }
+
+ //! Handle MySQL Errno 1213 without extending deadlock to the core itself
+ //! TODO: More elegant way
+ if (con->GetLastError() == 1213)
+ {
+ uint8 loopBreaker = 5;
+ for (uint8 i = 0; i < loopBreaker; ++i)
+ {
+ if (con->ExecuteTransaction(transaction))
+ break;
+ }
+ }
+
+ //! Clean up now.
+ transaction->Cleanup();
+
+ con->Unlock();
+ }
+
+ //! Method used to execute prepared statements in a diverse context.
+ //! Will be wrapped in a transaction if valid object is present, otherwise executed standalone.
+ void ExecuteOrAppend(SQLTransaction& trans, PreparedStatement* stmt)
+ {
+ if (trans.null())
+ Execute(stmt);
+ else
+ trans->Append(stmt);
+ }
+
+ //! Method used to execute ad-hoc statements in a diverse context.
+ //! Will be wrapped in a transaction if valid object is present, otherwise executed standalone.
+ void ExecuteOrAppend(SQLTransaction& trans, const char* sql)
+ {
+ if (trans.null())
+ Execute(sql);
+ else
+ trans->Append(sql);
+ }
+
+ /**
+ Other
+ */
+
+ //! Automanaged (internally) pointer to a prepared statement object for usage in upper level code.
+ //! Pointer is deleted in this->DirectExecute(PreparedStatement*), this->Query(PreparedStatement*) or PreparedStatementTask::~PreparedStatementTask.
+ //! This object is not tied to the prepared statement on the MySQL context yet until execution.
+ PreparedStatement* GetPreparedStatement(uint32 index)
+ {
+ return new PreparedStatement(index);
+ }
+
+ //! Apply escape string'ing for current collation. (utf8)
+ void EscapeString(std::string& str)
+ {
+ if (str.empty())
+ return;
+
+ char* buf = new char[str.size()*2+1];
+ EscapeString(buf, str.c_str(), str.size());
+ str = buf;
+ delete[] buf;
+ }
+
+ //! Keeps all our MySQL connections alive, prevent the server from disconnecting us.
+ void KeepAlive()
+ {
+ //! Ping synchronous connections
+ for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i)
+ {
+ T* t = _connections[IDX_SYNCH][i];
+ if (t->LockIfReady())
+ {
+ t->Ping();
+ t->Unlock();
+ }
+ }
+
+ //! Assuming all worker threads are free, every worker thread will receive 1 ping operation request
+ //! If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter
+ //! as the sole purpose is to prevent connections from idling.
+ for (size_t i = 0; i < _connections[IDX_ASYNC].size(); ++i)
+ Enqueue(new PingOperation);
+ }
+
+ char const* GetDatabaseName() const
+ {
+ return _connectionInfo.database.c_str();
+ }
+
+ private:
+ unsigned long EscapeString(char *to, const char *from, unsigned long length)
+ {
+ if (!to || !from || !length)
+ return 0;
+
+ return mysql_real_escape_string(_connections[IDX_SYNCH][0]->GetHandle(), to, from, length);
+ }
+
+ void Enqueue(SQLOperation* op)
+ {
+ _queue->enqueue(op);
+ }
+
+ //! Gets a free connection in the synchronous connection pool.
+ //! Caller MUST call t->Unlock() after touching the MySQL context to prevent deadlocks.
+ T* GetFreeConnection()
+ {
+ uint8 i = 0;
+ size_t num_cons = _connectionCount[IDX_SYNCH];
+ T* t = NULL;
+ //! Block forever until a connection is free
+ for (;;)
+ {
+ t = _connections[IDX_SYNCH][++i % num_cons];
+ //! Must be matched with t->Unlock() or you will get deadlocks
+ if (t->LockIfReady())
+ break;
+ }
+
+ return t;
+ }
+
+ private:
+ enum _internalIndex
+ {
+ IDX_ASYNC,
+ IDX_SYNCH,
+ IDX_SIZE
+ };
+
+ ACE_Message_Queue<ACE_SYNCH>* _mqueue;
+ ACE_Activation_Queue* _queue; //! Queue shared by async worker threads.
+ std::vector< std::vector<T*> > _connections;
+ uint32 _connectionCount[2]; //! Counter of MySQL connections;
+ MySQLConnectionInfo _connectionInfo;
+};
+
+#endif
diff --git a/src/common/Database/Field.cpp b/src/common/Database/Field.cpp
new file mode 100644
index 0000000000..fdc5ded657
--- /dev/null
+++ b/src/common/Database/Field.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Field.h"
+
+Field::Field()
+{
+ data.value = NULL;
+ data.type = MYSQL_TYPE_NULL;
+ data.length = 0;
+ data.raw = false;
+}
+
+Field::~Field()
+{
+ CleanUp();
+}
+
+void Field::SetByteValue(const void* newValue, const size_t newSize, enum_field_types newType, uint32 length)
+{
+ if (data.value)
+ CleanUp();
+
+ // This value stores raw bytes that have to be explicitly cast later
+ if (newValue)
+ {
+ data.value = new char[newSize];
+ memcpy(data.value, newValue, newSize);
+ data.length = length;
+ }
+ data.type = newType;
+ data.raw = true;
+}
+
+void Field::SetStructuredValue(char* newValue, enum_field_types newType)
+{
+ if (data.value)
+ CleanUp();
+
+ // This value stores somewhat structured data that needs function style casting
+ if (newValue)
+ {
+ size_t size = strlen(newValue);
+ data.value = new char [size+1];
+ strcpy((char*)data.value, newValue);
+ data.length = size;
+ }
+
+ data.type = newType;
+ data.raw = false;
+}
diff --git a/src/common/Database/Field.h b/src/common/Database/Field.h
new file mode 100644
index 0000000000..6ba3c9e92e
--- /dev/null
+++ b/src/common/Database/Field.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef AZEROTHCORE_FIELD_H
+#define AZEROTHCORE_FIELD_H
+
+#include "Common.h"
+#include "Log.h"
+
+#include <mysql.h>
+
+class Field
+{
+ friend class ResultSet;
+ friend class PreparedResultSet;
+
+ public:
+
+ bool GetBool() const // Wrapper, actually gets integer
+ {
+ return GetUInt8() == 1 ? true : false;
+ }
+
+ uint8 GetUInt8() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_TINY))
+ {
+ sLog->outSQLDriver("Warning: GetUInt8() on non-tinyint field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<uint8*>(data.value);
+ return static_cast<uint8>(atol((char*)data.value));
+ }
+
+ int8 GetInt8() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_TINY))
+ {
+ sLog->outSQLDriver("Warning: GetInt8() on non-tinyint field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<int8*>(data.value);
+ return static_cast<int8>(atol((char*)data.value));
+ }
+
+ uint16 GetUInt16() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_SHORT) && !IsType(MYSQL_TYPE_YEAR))
+ {
+ sLog->outSQLDriver("Warning: GetUInt16() on non-smallint field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<uint16*>(data.value);
+ return static_cast<uint16>(atol((char*)data.value));
+ }
+
+ int16 GetInt16() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_SHORT) && !IsType(MYSQL_TYPE_YEAR))
+ {
+ sLog->outSQLDriver("Warning: GetInt16() on non-smallint field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<int16*>(data.value);
+ return static_cast<int16>(atol((char*)data.value));
+ }
+
+ uint32 GetUInt32() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_INT24) && !IsType(MYSQL_TYPE_LONG))
+ {
+ sLog->outSQLDriver("Warning: GetUInt32() on non-(medium)int field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<uint32*>(data.value);
+ return static_cast<uint32>(atol((char*)data.value));
+ }
+
+ int32 GetInt32() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_INT24) && !IsType(MYSQL_TYPE_LONG))
+ {
+ sLog->outSQLDriver("Warning: GetInt32() on non-(medium)int field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<int32*>(data.value);
+ return static_cast<int32>(atol((char*)data.value));
+ }
+
+ uint64 GetUInt64() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_LONGLONG) && !IsType(MYSQL_TYPE_BIT))
+ {
+ sLog->outSQLDriver("Warning: GetUInt64() on non-bigint field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<uint64*>(data.value);
+ return static_cast<uint64>(atol((char*)data.value));
+ }
+
+ int64 GetInt64() const
+ {
+ if (!data.value)
+ return 0;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_LONGLONG) && !IsType(MYSQL_TYPE_BIT))
+ {
+ sLog->outSQLDriver("Warning: GetInt64() on non-bigint field. Using type: %s.", FieldTypeToString(data.type));
+ return 0;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<int64*>(data.value);
+ return static_cast<int64>(strtol((char*)data.value, NULL, 10));
+ }
+
+ float GetFloat() const
+ {
+ if (!data.value)
+ return 0.0f;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_FLOAT))
+ {
+ sLog->outSQLDriver("Warning: GetFloat() on non-float field. Using type: %s.", FieldTypeToString(data.type));
+ return 0.0f;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<float*>(data.value);
+ return static_cast<float>(atof((char*)data.value));
+ }
+
+ double GetDouble() const
+ {
+ if (!data.value)
+ return 0.0f;
+
+ #ifdef TRINITY_DEBUG
+ if (!IsType(MYSQL_TYPE_DOUBLE))
+ {
+ sLog->outSQLDriver("Warning: GetDouble() on non-double field. Using type: %s.", FieldTypeToString(data.type));
+ return 0.0f;
+ }
+ #endif
+
+ if (data.raw)
+ return *reinterpret_cast<double*>(data.value);
+ return static_cast<double>(atof((char*)data.value));
+ }
+
+ char const* GetCString() const
+ {
+ if (!data.value)
+ return NULL;
+
+ #ifdef TRINITY_DEBUG
+ if (IsNumeric())
+ {
+ sLog->outSQLDriver("Error: GetCString() on numeric field. Using type: %s.", FieldTypeToString(data.type));
+ return NULL;
+ }
+ #endif
+ return static_cast<char const*>(data.value);
+
+ }
+
+ std::string GetString() const
+ {
+ if (!data.value)
+ return "";
+
+ if (data.raw)
+ {
+ char const* string = GetCString();
+ if (!string)
+ string = "";
+ return std::string(string, data.length);
+ }
+ return std::string((char*)data.value);
+ }
+
+ bool IsNull() const
+ {
+ return data.value == NULL;
+ }
+
+ protected:
+ Field();
+ ~Field();
+
+ #if defined(__GNUC__)
+ #pragma pack(1)
+ #else
+ #pragma pack(push, 1)
+ #endif
+ struct
+ {
+ uint32 length; // Length (prepared strings only)
+ void* value; // Actual data in memory
+ enum_field_types type; // Field type
+ bool raw; // Raw bytes? (Prepared statement or ad hoc)
+ } data;
+ #if defined(__GNUC__)
+ #pragma pack()
+ #else
+ #pragma pack(pop)
+ #endif
+
+ void SetByteValue(void const* newValue, size_t const newSize, enum_field_types newType, uint32 length);
+ void SetStructuredValue(char* newValue, enum_field_types newType);
+
+ void CleanUp()
+ {
+ delete[] ((char*)data.value);
+ data.value = NULL;
+ }
+
+ static size_t SizeForType(MYSQL_FIELD* field)
+ {
+ switch (field->type)
+ {
+ case MYSQL_TYPE_NULL:
+ return 0;
+ case MYSQL_TYPE_TINY:
+ return 1;
+ case MYSQL_TYPE_YEAR:
+ case MYSQL_TYPE_SHORT:
+ return 2;
+ case MYSQL_TYPE_INT24:
+ case MYSQL_TYPE_LONG:
+ case MYSQL_TYPE_FLOAT:
+ return 4;
+ case MYSQL_TYPE_DOUBLE:
+ case MYSQL_TYPE_LONGLONG:
+ case MYSQL_TYPE_BIT:
+ return 8;
+
+ case MYSQL_TYPE_TIMESTAMP:
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_TIME:
+ case MYSQL_TYPE_DATETIME:
+ return sizeof(MYSQL_TIME);
+
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_STRING:
+ case MYSQL_TYPE_VAR_STRING:
+ return field->max_length + 1;
+
+ case MYSQL_TYPE_DECIMAL:
+ case MYSQL_TYPE_NEWDECIMAL:
+ return 64;
+
+ case MYSQL_TYPE_GEOMETRY:
+ /*
+ Following types are not sent over the wire:
+ MYSQL_TYPE_ENUM:
+ MYSQL_TYPE_SET:
+ */
+ default:
+ sLog->outSQLDriver("SQL::SizeForType(): invalid field type %u", uint32(field->type));
+ return 0;
+ }
+ }
+
+ bool IsType(enum_field_types type) const
+ {
+ return data.type == type;
+ }
+
+ bool IsNumeric() const
+ {
+ return (data.type == MYSQL_TYPE_TINY ||
+ data.type == MYSQL_TYPE_SHORT ||
+ data.type == MYSQL_TYPE_INT24 ||
+ data.type == MYSQL_TYPE_LONG ||
+ data.type == MYSQL_TYPE_FLOAT ||
+ data.type == MYSQL_TYPE_DOUBLE ||
+ data.type == MYSQL_TYPE_LONGLONG );
+ }
+
+ private:
+ #ifdef TRINITY_DEBUG
+ static char const* FieldTypeToString(enum_field_types type)
+ {
+ switch (type)
+ {
+ case MYSQL_TYPE_BIT: return "BIT";
+ case MYSQL_TYPE_BLOB: return "BLOB";
+ case MYSQL_TYPE_DATE: return "DATE";
+ case MYSQL_TYPE_DATETIME: return "DATETIME";
+ case MYSQL_TYPE_NEWDECIMAL: return "NEWDECIMAL";
+ case MYSQL_TYPE_DECIMAL: return "DECIMAL";
+ case MYSQL_TYPE_DOUBLE: return "DOUBLE";
+ case MYSQL_TYPE_ENUM: return "ENUM";
+ case MYSQL_TYPE_FLOAT: return "FLOAT";
+ case MYSQL_TYPE_GEOMETRY: return "GEOMETRY";
+ case MYSQL_TYPE_INT24: return "INT24";
+ case MYSQL_TYPE_LONG: return "LONG";
+ case MYSQL_TYPE_LONGLONG: return "LONGLONG";
+ case MYSQL_TYPE_LONG_BLOB: return "LONG_BLOB";
+ case MYSQL_TYPE_MEDIUM_BLOB: return "MEDIUM_BLOB";
+ case MYSQL_TYPE_NEWDATE: return "NEWDATE";
+ case MYSQL_TYPE_NULL: return "NULL";
+ case MYSQL_TYPE_SET: return "SET";
+ case MYSQL_TYPE_SHORT: return "SHORT";
+ case MYSQL_TYPE_STRING: return "STRING";
+ case MYSQL_TYPE_TIME: return "TIME";
+ case MYSQL_TYPE_TIMESTAMP: return "TIMESTAMP";
+ case MYSQL_TYPE_TINY: return "TINY";
+ case MYSQL_TYPE_TINY_BLOB: return "TINY_BLOB";
+ case MYSQL_TYPE_VAR_STRING: return "VAR_STRING";
+ case MYSQL_TYPE_YEAR: return "YEAR";
+ default: return "-Unknown-";
+ }
+ }
+ #endif
+};
+
+#endif
+
diff --git a/src/common/Database/Implementation/CharacterDatabase.cpp b/src/common/Database/Implementation/CharacterDatabase.cpp
new file mode 100644
index 0000000000..c1ace0ccaa
--- /dev/null
+++ b/src/common/Database/Implementation/CharacterDatabase.cpp
@@ -0,0 +1,559 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "CharacterDatabase.h"
+
+void CharacterDatabaseConnection::DoPrepareStatements()
+{
+ if (!m_reconnecting)
+ m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS);
+
+ PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_EXPIRED_BANS, "UPDATE character_banned SET active = 0 WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate <> bandate", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_DATA_BY_NAME, "SELECT guid, account, name, gender, race, class, level FROM characters WHERE deleteDate IS NULL AND name = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_DATA_BY_GUID, "SELECT guid, account, name, gender, race, class, level FROM characters WHERE deleteDate IS NULL AND guid = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHECK_NAME, "SELECT 1 FROM characters WHERE name = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHECK_GUID, "SELECT 1 FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_SUM_CHARS, "SELECT COUNT(guid) FROM characters WHERE account = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHAR_CREATE_INFO, "SELECT level, race, class FROM characters WHERE account = ? LIMIT 0, ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_BAN, "INSERT INTO character_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER_BAN, "UPDATE character_banned SET active = 0 WHERE guid = ? AND active != 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER_BAN, "DELETE cb FROM character_banned cb INNER JOIN characters c ON c.guid = cb.guid WHERE c.account = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_BANINFO, "SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate, banreason, bannedby FROM character_banned WHERE guid = ? ORDER BY bandate ASC", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_GUID_BY_NAME_FILTER, "SELECT guid, name FROM characters WHERE name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_BANINFO_LIST, "SELECT bandate, unbandate, bannedby, banreason FROM character_banned WHERE guid = ? ORDER BY unbandate", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_BANNED_NAME, "SELECT characters.name FROM characters, character_banned WHERE character_banned.guid = ? AND character_banned.guid = characters.guid", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, 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.extra_flags "
+ "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 ORDER BY c.guid", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, 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.extra_flags, 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 ORDER BY c.guid", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_NAME_DATA, "SELECT race, class, gender, level FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_POSITION, "SELECT position_x, position_y, position_z, orientation, map, taxi_path FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_DAILY, "DELETE FROM character_queststatus_daily", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_WEEKLY, "DELETE FROM character_queststatus_weekly", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_MONTHLY, "DELETE FROM character_queststatus_monthly", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_SEASONAL, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, "DELETE FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, "DELETE FROM character_queststatus_monthly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, "DELETE FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC);
+
+ // Start LoginQueryHolder content
+ PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
+ "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
+ "resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
+ "arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
+ "health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels "
+ "FROM characters WHERE guid = ?", CONNECTION_ASYNC);
+
+ PrepareStatement(CHAR_SEL_CHARACTER_AURAS, "SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, "
+ "base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SPELL, "SELECT spell, specMask FROM character_spell WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, "
+ "itemcount1, itemcount2, itemcount3, itemcount4, playercount FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_DAILYQUESTSTATUS, "SELECT quest, time FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS, "SELECT quest FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_MONTHLYQUESTSTATUS, "SELECT quest FROM character_queststatus_monthly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS, "SELECT quest, event FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS, "INSERT INTO character_queststatus_daily (guid, quest, time) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, "INSERT INTO character_queststatus_weekly (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, "INSERT INTO character_queststatus_monthly (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, "INSERT INTO character_queststatus_seasonal (guid, quest, event) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, bag, slot, "
+ "item, itemEntry FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activeTalentGroup AND a.guid = ? ORDER BY button", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, item, time, needSend FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_CRITERIAPROGRESS, "SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, "
+ "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_ENTRY_POINT, "SELECT joinX, joinY, joinZ, joinO, joinMapId, taxiPath, mountSpell FROM character_entry_point WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, specMask FROM character_talent WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_BANNED, "SELECT guid FROM character_banned WHERE guid = ? AND active = 1", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUSREW, "SELECT quest FROM character_queststatus_rewarded WHERE guid = ? AND active = 1", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, "SELECT instanceId, releaseTime FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_BREW_OF_THE_MONTH, "SELECT lastEventId FROM character_brew_of_the_month WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_BREW_OF_THE_MONTH, "REPLACE INTO character_brew_of_the_month (guid, lastEventId) VALUES (?, ?)", CONNECTION_ASYNC);
+ // End LoginQueryHolder content
+
+ PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, item_guid, itemEntry, owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid WHERE mail_id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, itemguid, itemEntry FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET buyguid = ?, lastbid = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_MAIL_ITEM, "INSERT INTO mail_items(mail_id, item_guid, receiver) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_EXPIRED_MAIL, "SELECT id, messageType, sender, receiver, has_items, expire_time, cod, checked, mailTemplateId FROM mail WHERE expire_time < ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS, "SELECT item_guid, itemEntry, mail_id FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid LEFT JOIN mail mm ON mi.mail_id = mm.id WHERE mm.id IS NOT NULL AND mm.expire_time < ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_UPD_MAIL_RETURNED, "UPDATE mail SET sender = ?, receiver = ?, expire_time = ?, deliver_time = ?, cod = 0, checked = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_MAIL_ITEM_RECEIVER, "UPDATE mail_items SET receiver = ? WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ITEM_OWNER, "UPDATE item_instance SET owner_guid = ? WHERE guid = ?", CONNECTION_ASYNC);
+
+ PrepareStatement(CHAR_SEL_ITEM_REFUNDS, "SELECT player_guid, paidMoney, paidExtendedCost FROM item_refund_instance WHERE item_guid = ? AND player_guid = ? LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ITEM_BOP_TRADE, "SELECT allowedPlayers FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_ACCOUNT_BY_NAME, "SELECT account FROM characters WHERE name = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, "DELETE FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, "INSERT INTO account_instance_times (accountId, instanceId, releaseTime) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_MATCH_MAKER_RATING, "SELECT matchMakerRating, maxMMR FROM character_arena_stats WHERE guid = ? AND slot = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_COUNT, "SELECT ? AS account,(SELECT COUNT(*) FROM characters WHERE account =?) AS cnt", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_NAME, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
+
+ // Guild handling
+ // 0: uint32, 1: string, 2: uint32, 3: string, 4: string, 5: uint64, 6-10: uint32, 11: uint64
+ PrepareStatement(CHAR_INS_GUILD, "INSERT INTO guild (guildid, name, leaderguid, info, motd, createdate, EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, BankMoney) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD, "DELETE FROM guild WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ // 0: uint32, 1: uint32, 2: uint8, 4: string, 5: string
+ PrepareStatement(CHAR_INS_GUILD_MEMBER, "INSERT INTO guild_member (guildid, guid, rank, pnote, offnote) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ // 0: uint32, 1: uint8, 3: string, 4: uint32, 5: uint32
+ PrepareStatement(CHAR_INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights, BankMoneyPerDay) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_DEL_GUILD_LOWEST_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid >= ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
+ PrepareStatement(CHAR_INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)", CONNECTION_ASYNC); // 0: uint32, 1: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ // 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32
+ PrepareStatement(CHAR_INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ // 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32
+ PrepareStatement(CHAR_INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) "
+ "ON DUPLICATE KEY UPDATE gbright = VALUES(gbright), SlotPerDay = VALUES(SlotPerDay)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_RIGHTS, "DELETE FROM guild_bank_right WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK, "DELETE FROM guild_bank_right WHERE guildid = ? AND rid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
+ // 0-1: uint32, 2-3: uint8, 4-5: uint32, 6: uint16, 7: uint8, 8: uint64
+ PrepareStatement(CHAR_INS_GUILD_BANK_EVENTLOG, "INSERT INTO guild_bank_eventlog (guildid, LogGuid, TabId, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG, "DELETE FROM guild_bank_eventlog WHERE guildid = ? AND LogGuid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint32, 2: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOGS, "DELETE FROM guild_bank_eventlog WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ // 0-1: uint32, 2: uint8, 3-4: uint32, 5: uint8, 6: uint64
+ PrepareStatement(CHAR_INS_GUILD_EVENTLOG, "INSERT INTO guild_eventlog (guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_EVENTLOG, "DELETE FROM guild_eventlog WHERE guildid = ? AND LogGuid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint32
+ PrepareStatement(CHAR_DEL_GUILD_EVENTLOGS, "DELETE FROM guild_eventlog WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MEMBER_PNOTE, "UPDATE guild_member SET pnote = ? WHERE guid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MEMBER_OFFNOTE, "UPDATE guild_member SET offnote = ? WHERE guid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MEMBER_RANK, "UPDATE guild_member SET rank = ? WHERE guid = ?", CONNECTION_ASYNC); // 0: uint8, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_INFO, "UPDATE guild SET info = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_LEADER, "UPDATE guild SET leaderguid = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_RANK_NAME, "UPDATE guild_rank SET rname = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC); // 0: string, 1: uint8, 2: uint32
+ PrepareStatement(CHAR_UPD_GUILD_RANK_RIGHTS, "UPDATE guild_rank SET rights = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint32
+ // 0-5: uint32
+ PrepareStatement(CHAR_UPD_GUILD_EMBLEM_INFO, "UPDATE guild SET EmblemStyle = ?, EmblemColor = ?, BorderStyle = ?, BorderColor = ?, BackgroundColor = ? WHERE guildid = ?", CONNECTION_ASYNC);
+ // 0: string, 1: string, 2: uint32, 3: uint8
+ PrepareStatement(CHAR_UPD_GUILD_BANK_TAB_INFO, "UPDATE guild_bank_tab SET TabName = ?, TabIcon = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint64, 1: uint32
+ // 0: uint8, 1: uint32, 2: uint8, 3: uint32
+ PrepareStatement(CHAR_UPD_GUILD_BANK_EVENTLOG_TAB, "UPDATE guild_bank_eventlog SET TabId = ? WHERE guildid = ? AND TabId = ? AND LogGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GUILD_RANK_BANK_MONEY, "UPDATE guild_rank SET BankMoneyPerDay = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint32
+ PrepareStatement(CHAR_UPD_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: string, 1: uint32, 2: uint8
+
+ PrepareStatement(CHAR_INS_GUILD_MEMBER_WITHDRAW,
+ "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, money) VALUES (?, ?, ?, ?, ?, ?, ?, ?) "
+ "ON DUPLICATE KEY UPDATE tab0 = VALUES (tab0), tab1 = VALUES (tab1), tab2 = VALUES (tab2), tab3 = VALUES (tab3), tab4 = VALUES (tab4), tab5 = VALUES (tab5)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_MEMBER_WITHDRAW, "TRUNCATE guild_member_withdraw", CONNECTION_ASYNC);
+
+ // 0: uint32, 1: uint32, 2: uint32
+ PrepareStatement(CHAR_SEL_CHAR_DATA_FOR_GUILD, "SELECT name, level, class, zone, account FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+
+ // Chat channel handling
+ PrepareStatement(CHAR_INS_CHANNEL, "INSERT INTO channels(channelId, name, team, announce, lastUsed) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP())", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHANNEL, "UPDATE channels SET announce = ?, password = ?, lastUsed = UNIX_TIMESTAMP() WHERE channelId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHANNEL_USAGE, "UPDATE channels SET lastUsed = UNIX_TIMESTAMP() WHERE channelId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_OLD_CHANNELS, "DELETE FROM channels WHERE lastUsed + ? < UNIX_TIMESTAMP()", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_OLD_CHANNELS_BANS, "DELETE cb.* FROM channels_bans cb LEFT JOIN channels cn ON cb.channelId=cn.channelId WHERE cn.channelId IS NULL OR cb.banTime <= UNIX_TIMESTAMP()", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHANNEL_BAN, "REPLACE INTO channels_bans VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHANNEL_BAN, "DELETE FROM channels_bans WHERE channelId = ? AND playerGUID = ?", CONNECTION_ASYNC);
+
+ // Equipmentsets
+ PrepareStatement(CHAR_UPD_EQUIP_SET, "UPDATE character_equipmentsets SET name=?, iconname=?, ignore_mask=?, item0=?, item1=?, item2=?, item3=?, "
+ "item4=?, item5=?, item6=?, item7=?, item8=?, item9=?, item10=?, item11=?, item12=?, item13=?, item14=?, item15=?, item16=?, "
+ "item17=?, item18=? WHERE guid=? AND setguid=? AND setindex=?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_EQUIP_SET, "INSERT INTO character_equipmentsets (guid, setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, "
+ "item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_EQUIP_SET, "DELETE FROM character_equipmentsets WHERE setguid=?", CONNECTION_ASYNC);
+
+ // Auras
+ PrepareStatement(CHAR_INS_AURA, "INSERT INTO character_aura (guid, casterGuid, itemGuid, spell, effectMask, recalculateMask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+
+ // Account data
+ PrepareStatement(CHAR_SEL_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE accountId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_ACCOUNT_DATA, "REPLACE INTO account_data (accountId, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ACCOUNT_DATA, "DELETE FROM account_data WHERE accountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PLAYER_ACCOUNT_DATA, "SELECT type, time, data FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_PLAYER_ACCOUNT_DATA, "REPLACE INTO character_account_data(guid, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA, "DELETE FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC);
+
+ // Tutorials
+ PrepareStatement(CHAR_SEL_TUTORIALS, "SELECT tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_HAS_TUTORIALS, "SELECT 1 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_TUTORIALS, "INSERT INTO account_tutorial(tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7, accountId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_TUTORIALS, "UPDATE account_tutorial SET tut0 = ?, tut1 = ?, tut2 = ?, tut3 = ?, tut4 = ?, tut5 = ?, tut6 = ?, tut7 = ? WHERE accountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_TUTORIALS, "DELETE FROM account_tutorial WHERE accountId = ?", CONNECTION_ASYNC);
+
+ // Instance saves
+ PrepareStatement(CHAR_INS_INSTANCE_SAVE, "INSERT INTO instance (id, map, resettime, difficulty, completedEncounters, data) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_INSTANCE_SAVE_DATA, "UPDATE instance SET data=? WHERE id=?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_INSTANCE_SAVE_ENCOUNTERMASK, "UPDATE instance SET completedEncounters=? WHERE id=?", CONNECTION_ASYNC);
+
+ // Game event saves
+ PrepareStatement(CHAR_DEL_GAME_EVENT_SAVE, "DELETE FROM game_event_save WHERE eventEntry = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GAME_EVENT_SAVE, "INSERT INTO game_event_save (eventEntry, state, next_start) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+
+ // Game event condition saves
+ PrepareStatement(CHAR_DEL_ALL_GAME_EVENT_CONDITION_SAVE, "DELETE FROM game_event_condition_save WHERE eventEntry = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GAME_EVENT_CONDITION_SAVE, "DELETE FROM game_event_condition_save WHERE eventEntry = ? AND condition_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GAME_EVENT_CONDITION_SAVE, "INSERT INTO game_event_condition_save (eventEntry, condition_id, done) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+
+ // Petitions
+ PrepareStatement(CHAR_DEL_ALL_PETITION_SIGNATURES, "DELETE FROM petition_sign WHERE playerguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE, "DELETE FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_ASYNC);
+
+ // Arena teams
+ PrepareStatement(CHAR_INS_ARENA_TEAM, "INSERT INTO arena_team (arenaTeamId, name, captainGuid, type, rating, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ARENA_TEAM_MEMBER, "INSERT INTO arena_team_member (arenaTeamId, guid) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ARENA_TEAM, "DELETE FROM arena_team WHERE arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ARENA_TEAM_MEMBERS, "DELETE FROM arena_team_member WHERE arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ARENA_TEAM_CAPTAIN, "UPDATE arena_team SET captainGuid = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ARENA_TEAM_MEMBER, "DELETE FROM arena_team_member WHERE arenaTeamId = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ARENA_TEAM_STATS, "UPDATE arena_team SET rating = ?, weekGames = ?, weekWins = ?, seasonGames = ?, seasonWins = ?, rank = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ARENA_TEAM_MEMBER, "UPDATE arena_team_member SET personalRating = ?, weekGames = ?, weekWins = ?, seasonGames = ?, seasonWins = ? WHERE arenaTeamId = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CHARACTER_ARENA_STATS, "REPLACE INTO character_arena_stats (guid, slot, matchMakerRating, maxMMR) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PLAYER_ARENA_TEAMS, "SELECT arena_team_member.arenaTeamId FROM arena_team_member JOIN arena_team ON arena_team_member.arenaTeamId = arena_team.arenaTeamId WHERE guid = ?", CONNECTION_SYNCH);
+
+ // Character battleground data
+ PrepareStatement(CHAR_INS_PLAYER_ENTRY_POINT, "INSERT INTO character_entry_point (guid, joinX, joinY, joinZ, joinO, joinMapId, taxiPath, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_ENTRY_POINT, "DELETE FROM character_entry_point WHERE guid = ?", CONNECTION_ASYNC);
+
+ // Character homebind
+ PrepareStatement(CHAR_INS_PLAYER_HOMEBIND, "INSERT INTO character_homebind (guid, mapId, zoneId, posX, posY, posZ) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_PLAYER_HOMEBIND, "UPDATE character_homebind SET mapId = ?, zoneId = ?, posX = ?, posY = ?, posZ = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC);
+
+ // Corpse
+ PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_CORPSE, "INSERT INTO corpse (corpseGuid, guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE corpseGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_CORPSES, "DELETE FROM corpse WHERE guid = ? AND corpseType <> 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC);
+
+ // Creature respawn
+ PrepareStatement(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
+
+ // Gameobject respawn
+ PrepareStatement(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
+
+ // GM Tickets
+ PrepareStatement(CHAR_SEL_GM_TICKETS, "SELECT id, type, playerGuid, name, description, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, needMoreHelp, resolvedBy FROM gm_ticket", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_GM_TICKET, "REPLACE INTO gm_ticket (id, type, playerGuid, name, description, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, needMoreHelp, resolvedBy) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GM_TICKET, "DELETE FROM gm_ticket WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_GM_TICKETS, "DELETE FROM gm_ticket WHERE playerGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION, "UPDATE gm_ticket SET type = 2 WHERE playerGuid = ?", CONNECTION_ASYNC);
+
+ // GM Survey/subsurvey/lag report
+ PrepareStatement(CHAR_INS_GM_SURVEY, "INSERT INTO gm_survey (guid, surveyId, mainSurvey, comment, createTime) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(NOW()))", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GM_SUBSURVEY, "INSERT INTO gm_subsurvey (surveyId, questionId, answer, answerComment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_LAG_REPORT, "INSERT INTO lag_reports (guid, lagType, mapId, posX, posY, posZ, latency, createTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+
+ // LFG Data
+ PrepareStatement(CHAR_REP_LFG_DATA, "REPLACE INTO lfg_data (guid, dungeon, state) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?", CONNECTION_ASYNC);
+
+ // Player saving
+ PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
+ "map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, "
+ "taximask, cinematic, "
+ "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, "
+ "extra_flags, stable_slots, at_login, zone, "
+ "death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, "
+ "todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, "
+ "power4, power5, power6, power7, latency, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES "
+ "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?,"
+ "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
+ "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?,"
+ "arenaPoints=?,totalHonorPoints=?,todayHonorPoints=?,yesterdayHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,knownCurrencies=?,"
+ "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,talentGroupsCount=?,activeTalentGroup=?,exploredZones=?,"
+ "equipmentCache=?,ammoId=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC);
+
+ PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_REM_AT_LOGIN_FLAG, "UPDATE characters set at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ALL_AT_LOGIN_FLAGS, "UPDATE characters SET at_login = at_login | ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_BUG_REPORT, "INSERT INTO bugreport (type, content) VALUES(?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_PETITION_NAME, "UPDATE petition SET name = ? WHERE petitionguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PETITION_SIGNATURE, "INSERT INTO petition_sign (ownerguid, petitionguid, playerguid, player_account) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GROUP, "INSERT INTO groups (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raidDifficulty, masterLooterGuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_GROUP_MEMBER, "REPLACE INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_LEADER, "UPDATE groups SET leaderGuid = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_TYPE, "UPDATE groups SET groupType = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_MEMBER_SUBGROUP, "UPDATE group_member SET subgroup = ? WHERE memberGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_MEMBER_FLAG, "UPDATE group_member SET memberFlags = ? WHERE memberGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_DIFFICULTY, "UPDATE groups SET difficulty = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_RAID_DIFFICULTY, "UPDATE groups SET raidDifficulty = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ALL_GM_TICKETS, "TRUNCATE TABLE gm_ticket", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_SPELL_TALENTS, "DELETE FROM character_talent WHERE spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_SPELL_SPELLS, "DELETE FROM character_spell WHERE spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_DELETE_INFO, "UPDATE characters SET deleteInfos_Name = name, deleteInfos_Account = account, deleteDate = UNIX_TIMESTAMP(), name = '', account = 0 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_RESTORE_DELETE_INFO, "UPDATE characters SET name = ?, account = ?, deleteDate = NULL, deleteInfos_Name = NULL, deleteInfos_Account = NULL WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ZONE, "UPDATE characters SET zone = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_LEVEL, "UPDATE characters SET level = ?, xp = 0 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, "DELETE FROM character_achievement_progress WHERE criteria = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_ACHIEVMENT, "DELETE FROM character_achievement WHERE achievement = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ADDON, "INSERT INTO addons (name, crc) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_PET_SPELL, "DELETE FROM pet_spell WHERE spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GLOBAL_INSTANCE_RESETTIME, "UPDATE instance_reset SET resettime = ? WHERE mapid = ? AND difficulty = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ONLINE, "UPDATE characters SET online = 1 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_NAME_AT_LOGIN, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_WORLDSTATE, "UPDATE worldstates SET value = ? WHERE entry = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_WORLDSTATE, "INSERT INTO worldstates (entry, value) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE, "DELETE FROM character_instance WHERE instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_NOT_EXTENDED, "DELETE FROM character_instance WHERE instance = ? AND extended = 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_INSTANCE_SET_NOT_EXTENDED, "UPDATE character_instance SET extended = 0 WHERE instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ?, extended = 0 WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_INSTANCE_EXTENDED, "UPDATE character_instance SET extended = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extended) VALUES (?, ?, ?, 0)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ARENA_LOG_FIGHT, "INSERT INTO log_arena_fights VALUES (?, NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ARENA_LOG_MEMBERSTATS, "INSERT INTO log_arena_memberstats VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GENDER_PLAYERBYTES, "UPDATE characters SET gender = ?, playerBytes = ?, playerBytes2 = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags | ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags & ~ ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_SOCIAL, "REPLACE INTO character_social (guid, friend, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_DEL_INFO, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID, "SELECT guid FROM characters WHERE account = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned WHERE guid = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_AT_LOGIN, "SELECT at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, "SELECT class, level, at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_AT_LOGIN_TITLES_MONEY, "SELECT at_login, knownTitles, money FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_SOCIAL, "SELECT DISTINCT guid FROM character_social WHERE friend = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, "SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid = ? AND type = ? LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL, "SELECT id, messageType, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId FROM mail WHERE receiver = ? ORDER BY id DESC", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_ASYNCH, "SELECT ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomPropertyId, ii.durability, ii.playedTime, ii.text, mi.item_guid, ii.itemEntry, ii.owner_guid, mail.id, mail.messageType, mail.sender, mail.receiver, mail.subject, mail.body, mail.has_items, mail.expire_time, mail.deliver_time, mail.money, mail.cod, mail.checked, mail.stationery, mail.mailTemplateId FROM mail LEFT JOIN (mail_items mi JOIN item_instance ii) ON (mi.mail_id = mail.id AND mi.item_guid = ii.guid) WHERE mail.receiver = ? ORDER BY mail.id DESC", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_PLAYERBYTES2, "SELECT playerBytes2 FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_AURA_FROZEN, "DELETE FROM character_aura WHERE spell = 9454 AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM character_inventory ci INNER JOIN item_instance ii ON ii.guid = ci.item WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM,"SELECT COUNT(itemEntry) FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_GUILD_BANK_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM guild_bank_item gbi INNER JOIN item_instance ii ON ii.guid = gbi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY, "SELECT ci.item, cb.slot AS bag, ci.slot, ci.guid, c.account, c.name FROM characters c "
+ "INNER JOIN character_inventory ci ON ci.guid = c.guid "
+ "INNER JOIN item_instance ii ON ii.guid = ci.item "
+ "LEFT JOIN character_inventory cb ON cb.item = ci.bag WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_ITEMS_BY_ENTRY, "SELECT mi.item_guid, m.sender, m.receiver, cs.account, cs.name, cr.account, cr.name "
+ "FROM mail m INNER JOIN mail_items mi ON mi.mail_id = m.id INNER JOIN item_instance ii ON ii.guid = mi.item_guid "
+ "INNER JOIN characters cs ON cs.guid = m.sender INNER JOIN characters cr ON cr.guid = m.receiver WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY, "SELECT ah.itemguid, ah.itemowner, c.account, c.name FROM auctionhouse ah INNER JOIN characters c ON c.guid = ah.itemowner INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT, "INSERT INTO character_achievement (guid, achievement, date) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, "DELETE FROM character_achievement_progress WHERE guid = ? AND criteria = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ITEM_REFUND_INSTANCE, "DELETE FROM item_refund_instance WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ITEM_REFUND_INSTANCE, "INSERT INTO item_refund_instance (item_guid, player_guid, paidMoney, paidExtendedCost) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP, "DELETE FROM groups WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_MEMBER_ALL, "DELETE FROM group_member WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_GIFT, "INSERT INTO character_gifts (guid, item_guid, entry, flags) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INSTANCE_BY_INSTANCE, "DELETE FROM instance WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_ITEM_BY_ID, "DELETE FROM mail_items WHERE mail_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PETITION, "INSERT INTO petition (ownerguid, petitionguid, name, type) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_BY_GUID, "DELETE FROM petition WHERE petitionguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_GUID, "DELETE FROM petition_sign WHERE petitionguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_DECLINED_NAME, "INSERT INTO character_declinedname (guid, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_FACTION_OR_RACE, "UPDATE characters SET name = ?, race = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SKILL_LANGUAGES, "DELETE FROM character_skills WHERE skill IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137) AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_SKILL_LANGUAGE, "INSERT INTO `character_skills` (guid, skill, value, max) VALUES (?, ?, 300, 300)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_TAXI_PATH, "UPDATE characters SET taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_TAXIMASK, "UPDATE characters SET taximask = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS, "DELETE FROM character_queststatus WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID, "DELETE FROM character_social WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, "DELETE FROM character_social WHERE friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, "DELETE FROM character_achievement WHERE achievement = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ACHIEVEMENT, "UPDATE character_achievement SET achievement = ? WHERE achievement = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE, "UPDATE item_instance ii, character_inventory ci SET ii.itemEntry = ? WHERE ii.itemEntry = ? AND ci.guid = ? AND ci.item = ii.guid", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL, "DELETE FROM character_spell WHERE guid = ? AND spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, "UPDATE character_spell SET spell = ? WHERE spell = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_REP_BY_FACTION, "SELECT standing FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_REP_BY_FACTION, "DELETE FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE, "UPDATE character_reputation SET faction = ?, standing = ? WHERE faction = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET knownTitles = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_RES_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET chosenTitle = 0 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN, "DELETE FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER, "DELETE FROM characters WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACTION, "DELETE FROM character_action WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_AURA, "DELETE FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_GIFT, "DELETE FROM character_gifts WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE, "DELETE FROM character_instance WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INVENTORY, "DELETE FROM character_inventory WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, "DELETE FROM character_queststatus_rewarded WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_REPUTATION, "DELETE FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SPELL, "DELETE FROM character_spell WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL, "DELETE FROM mail WHERE receiver = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_ITEMS, "DELETE FROM mail_items WHERE receiver = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENTS, "DELETE FROM character_achievement WHERE guid = ? AND achievement NOT BETWEEN '456' AND '467' AND achievement NOT BETWEEN '1400' AND '1427' AND achievement NOT IN(1463, 3117, 3259)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_EQUIPMENTSETS, "DELETE FROM character_equipmentsets WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, "DELETE FROM guild_eventlog WHERE PlayerGuid1 = ? OR PlayerGuid2 = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, "DELETE FROM guild_bank_eventlog WHERE PlayerGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_GLYPHS, "DELETE FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SKILLS, "DELETE FROM character_skills WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_HONOR_POINTS, "UPDATE characters SET totalHonorPoints = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_REMOVE_GHOST, "UPDATE characters SET playerFlags = (playerFlags & (~16)) WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACTION, "INSERT INTO character_action (guid, spec, button, action, type) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ACTION, "UPDATE character_action SET action = ?, type = ? WHERE guid = ? AND button = ? AND spec = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, "DELETE FROM character_action WHERE guid = ? AND button = ? AND spec = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM, "DELETE FROM character_inventory WHERE item = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, "DELETE FROM character_inventory WHERE bag = ? AND slot = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_MAIL, "UPDATE mail SET has_items = ?, expire_time = ?, deliver_time = ?, money = ?, cod = ?, checked = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3, itemcount4, playercount) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, "DELETE FROM character_queststatus WHERE guid = ? AND quest = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED, "INSERT IGNORE INTO character_queststatus_rewarded (guid, quest, active) VALUES (?, ?, 1)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, "DELETE FROM character_queststatus_rewarded WHERE guid = ? AND quest = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_FACTION_CHANGE, "UPDATE character_queststatus_rewarded SET quest = ? WHERE quest = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE, "UPDATE character_queststatus_rewarded SET active = 1 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST, "UPDATE character_queststatus_rewarded SET active = 0 WHERE quest = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_SKILLS, "INSERT INTO character_skills (guid, skill, value, max) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, specMask) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, spirit, "
+ "armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, "
+ "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, "DELETE FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, "DELETE FROM petition_sign WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL, "DELETE FROM character_talent WHERE guid = ? AND spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, specMask) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC);
+
+ // Items that hold loot or money
+ PrepareStatement(CHAR_SEL_ITEMCONTAINER_ITEMS, "SELECT containerGUID, itemid, count, randomPropertyId, randomSuffix FROM item_loot_storage", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ITEMCONTAINER_SINGLE_ITEM, "DELETE FROM item_loot_storage WHERE containerGUID = ? AND itemid = ? AND count = ? LIMIT 1", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ITEMCONTAINER_SINGLE_ITEM, "INSERT INTO item_loot_storage (containerGUID, itemid, count, randomPropertyId, randomSuffix) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ITEMCONTAINER_CONTAINER, "DELETE FROM item_loot_storage WHERE containerGUID = ?", CONNECTION_ASYNC);
+
+ // Calendar
+ PrepareStatement(CHAR_REP_CALENDAR_EVENT, "REPLACE INTO calendar_events (id, creator, title, description, type, dungeon, eventtime, flags, time2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CALENDAR_EVENT, "DELETE FROM calendar_events WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CALENDAR_INVITE, "REPLACE INTO calendar_invites (id, event, invitee, sender, status, statustime, rank, text) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CALENDAR_INVITE, "DELETE FROM calendar_invites WHERE id = ?", CONNECTION_ASYNC);
+
+ // Pet
+ PrepareStatement(CHAR_SEL_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SLOTS_DETAIL, "SELECT owner, id, entry, level, name FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_ENTRY, "SELECT entry FROM character_pet WHERE owner = ? AND id = ? AND slot >= ? AND slot <= ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SLOT_BY_ID, "SELECT slot, entry FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SPELL_LIST, "SELECT DISTINCT pet_spell.spell FROM pet_spell, character_pet WHERE character_pet.owner = ? AND character_pet.id = pet_spell.guid AND character_pet.id <> ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PET, "SELECT id FROM character_pet WHERE owner = ? AND id <> ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PETS, "SELECT id FROM character_pet WHERE owner = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, "DELETE FROM character_pet_declinedname WHERE owner = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME, "DELETE FROM character_pet_declinedname WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_ADD_CHAR_PET_DECLINEDNAME, "INSERT INTO character_pet_declinedname (id, owner, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_AURA, "SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges FROM pet_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SPELL, "SELECT spell, active FROM pet_spell WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PET_AURAS, "DELETE FROM pet_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PET_SPELLS, "DELETE FROM pet_spell WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PET_SPELL_COOLDOWNS, "DELETE FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PET_SPELL_BY_SPELL, "DELETE FROM pet_spell WHERE guid = ? AND spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PET_SPELL, "INSERT INTO pet_spell (guid, spell, active) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, "
+ "base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND entry = ? AND (slot = ? OR slot > ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?) ", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND slot = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_PET_BY_OWNER, "DELETE FROM character_pet WHERE owner = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_PET_NAME, "UPDATE character_pet SET name = ?, renamed = 1 WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ? AND id <> ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_PET_SLOT_BY_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_PET_BY_ID, "DELETE FROM character_pet WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_PET_BY_SLOT, "DELETE FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CHAR_PET, "REPLACE INTO character_pet (id, entry, owner, modelid, CreatedBySpell, PetType, level, exp, Reactstate, name, renamed, slot, curhealth, curmana, curhappiness, savetime, abdata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+
+ // PvPstats
+ PrepareStatement(CHAR_SEL_PVPSTATS_MAXID, "SELECT MAX(id) FROM pvpstats_battlegrounds", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_PVPSTATS_BATTLEGROUND, "INSERT INTO pvpstats_battlegrounds (id, winner_faction, bracket_id, type, date) VALUES (?, ?, ?, ?, NOW())", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PVPSTATS_PLAYER, "INSERT INTO pvpstats_players (battleground_id, character_guid, winner, score_killing_blows, score_deaths, score_honorable_kills, score_bonus_honor, score_damage_done, score_healing_done, attr_1, attr_2, attr_3, attr_4, attr_5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PVPSTATS_FACTIONS_OVERALL, "SELECT winner_faction, COUNT(*) AS count FROM pvpstats_battlegrounds WHERE DATEDIFF(NOW(), date) < 7 GROUP BY winner_faction ORDER BY winner_faction ASC", CONNECTION_SYNCH);
+
+ // Deserter tracker
+ PrepareStatement(CHAR_INS_DESERTER_TRACK, "INSERT INTO battleground_deserters (guid, type, datetime) VALUES (?, ?, NOW())", CONNECTION_ASYNC);
+}
diff --git a/src/common/Database/Implementation/CharacterDatabase.h b/src/common/Database/Implementation/CharacterDatabase.h
new file mode 100644
index 0000000000..7ec0d094a8
--- /dev/null
+++ b/src/common/Database/Implementation/CharacterDatabase.h
@@ -0,0 +1,499 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _CHARACTERDATABASE_H
+#define _CHARACTERDATABASE_H
+
+#include "DatabaseWorkerPool.h"
+#include "MySQLConnection.h"
+
+class CharacterDatabaseConnection : public MySQLConnection
+{
+ public:
+ //- Constructors for sync and async connections
+ CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) {}
+ CharacterDatabaseConnection(ACE_Activation_Queue* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) {}
+
+ //- Loads database type specific prepared statements
+ void DoPrepareStatements();
+};
+
+typedef DatabaseWorkerPool<CharacterDatabaseConnection> CharacterDatabaseWorkerPool;
+
+enum CharacterDatabaseStatements
+{
+ /* Naming standard for defines:
+ {DB}_{SEL/INS/UPD/DEL/REP}_{Summary of data changed}
+ When updating more than one field, consider looking at the calling function
+ name for a suiting suffix.
+ */
+
+ CHAR_DEL_QUEST_POOL_SAVE,
+ CHAR_INS_QUEST_POOL_SAVE,
+ CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM,
+ CHAR_DEL_EXPIRED_BANS,
+ CHAR_SEL_DATA_BY_NAME,
+ CHAR_SEL_DATA_BY_GUID,
+ CHAR_SEL_CHECK_NAME,
+ CHAR_SEL_CHECK_GUID,
+ CHAR_SEL_SUM_CHARS,
+ CHAR_SEL_CHAR_CREATE_INFO,
+ CHAR_INS_CHARACTER_BAN,
+ CHAR_UPD_CHARACTER_BAN,
+ CHAR_DEL_CHARACTER_BAN,
+ CHAR_SEL_BANINFO,
+ CHAR_SEL_GUID_BY_NAME_FILTER,
+ CHAR_SEL_BANINFO_LIST,
+ CHAR_SEL_BANNED_NAME,
+ CHAR_SEL_ENUM,
+ CHAR_SEL_ENUM_DECLINED_NAME,
+ CHAR_SEL_FREE_NAME,
+ CHAR_SEL_CHAR_ZONE,
+ CHAR_SEL_CHARACTER_NAME_DATA,
+ CHAR_SEL_CHAR_POSITION_XYZ,
+ CHAR_SEL_CHAR_POSITION,
+ CHAR_DEL_QUEST_STATUS_DAILY,
+ CHAR_DEL_QUEST_STATUS_WEEKLY,
+ CHAR_DEL_QUEST_STATUS_MONTHLY,
+ CHAR_DEL_QUEST_STATUS_SEASONAL,
+ CHAR_DEL_QUEST_STATUS_DAILY_CHAR,
+ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR,
+ CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR,
+ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR,
+ CHAR_DEL_BATTLEGROUND_RANDOM,
+ CHAR_INS_BATTLEGROUND_RANDOM,
+
+ CHAR_SEL_CHARACTER,
+ CHAR_SEL_CHARACTER_AURAS,
+ CHAR_SEL_CHARACTER_SPELL,
+ CHAR_SEL_CHARACTER_QUESTSTATUS,
+ CHAR_SEL_CHARACTER_DAILYQUESTSTATUS,
+ CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS,
+ CHAR_SEL_CHARACTER_MONTHLYQUESTSTATUS,
+ CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS,
+ CHAR_INS_CHARACTER_DAILYQUESTSTATUS,
+ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS,
+ CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS,
+ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS,
+ CHAR_SEL_CHARACTER_REPUTATION,
+ CHAR_SEL_CHARACTER_INVENTORY,
+ CHAR_SEL_CHARACTER_ACTIONS,
+ CHAR_SEL_CHARACTER_ACTIONS_SPEC,
+ CHAR_SEL_CHARACTER_MAILCOUNT,
+ CHAR_SEL_CHARACTER_MAILDATE,
+ CHAR_SEL_CHARACTER_SOCIALLIST,
+ CHAR_SEL_CHARACTER_HOMEBIND,
+ CHAR_SEL_CHARACTER_SPELLCOOLDOWNS,
+ CHAR_SEL_CHARACTER_DECLINEDNAMES,
+ CHAR_SEL_CHARACTER_ACHIEVEMENTS,
+ CHAR_SEL_CHARACTER_CRITERIAPROGRESS,
+ CHAR_SEL_CHARACTER_EQUIPMENTSETS,
+ CHAR_SEL_CHARACTER_ENTRY_POINT,
+ CHAR_SEL_CHARACTER_GLYPHS,
+ CHAR_SEL_CHARACTER_TALENTS,
+ CHAR_SEL_CHARACTER_SKILLS,
+ CHAR_SEL_CHARACTER_RANDOMBG,
+ CHAR_SEL_CHARACTER_BANNED,
+ CHAR_SEL_CHARACTER_QUESTSTATUSREW,
+ CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES,
+ CHAR_SEL_MAILITEMS,
+ CHAR_SEL_BREW_OF_THE_MONTH,
+ CHAR_REP_BREW_OF_THE_MONTH,
+ CHAR_SEL_AUCTION_ITEMS,
+ CHAR_INS_AUCTION,
+ CHAR_DEL_AUCTION,
+ CHAR_UPD_AUCTION_BID,
+ CHAR_SEL_AUCTIONS,
+ CHAR_INS_MAIL,
+ CHAR_DEL_MAIL_BY_ID,
+ CHAR_INS_MAIL_ITEM,
+ CHAR_DEL_MAIL_ITEM,
+ CHAR_DEL_INVALID_MAIL_ITEM,
+ CHAR_SEL_EXPIRED_MAIL,
+ CHAR_SEL_EXPIRED_MAIL_ITEMS,
+ CHAR_UPD_MAIL_RETURNED,
+ CHAR_UPD_MAIL_ITEM_RECEIVER,
+ CHAR_UPD_ITEM_OWNER,
+ CHAR_SEL_ITEM_REFUNDS,
+ CHAR_SEL_ITEM_BOP_TRADE,
+ CHAR_DEL_ITEM_BOP_TRADE,
+ CHAR_INS_ITEM_BOP_TRADE,
+ CHAR_REP_INVENTORY_ITEM,
+ CHAR_REP_ITEM_INSTANCE,
+ CHAR_UPD_ITEM_INSTANCE,
+ CHAR_UPD_ITEM_INSTANCE_ON_LOAD,
+ CHAR_DEL_ITEM_INSTANCE,
+ CHAR_DEL_ITEM_INSTANCE_BY_OWNER,
+ CHAR_UPD_GIFT_OWNER,
+ CHAR_DEL_GIFT,
+ CHAR_SEL_CHARACTER_GIFT_BY_ITEM,
+ CHAR_SEL_ACCOUNT_BY_NAME,
+ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES,
+ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES,
+ CHAR_SEL_MATCH_MAKER_RATING,
+ CHAR_SEL_CHARACTER_COUNT,
+ CHAR_UPD_NAME,
+ CHAR_DEL_DECLINED_NAME,
+
+ CHAR_INS_GUILD,
+ CHAR_DEL_GUILD,
+ CHAR_INS_GUILD_MEMBER,
+ CHAR_DEL_GUILD_MEMBER,
+ CHAR_DEL_GUILD_MEMBERS,
+ CHAR_INS_GUILD_RANK,
+ CHAR_DEL_GUILD_RANKS,
+ CHAR_DEL_GUILD_LOWEST_RANK,
+ CHAR_INS_GUILD_BANK_TAB,
+ CHAR_DEL_GUILD_BANK_TAB,
+ CHAR_DEL_GUILD_BANK_TABS,
+ CHAR_INS_GUILD_BANK_ITEM,
+ CHAR_DEL_GUILD_BANK_ITEM,
+ CHAR_DEL_GUILD_BANK_ITEMS,
+ CHAR_INS_GUILD_BANK_RIGHT,
+ CHAR_DEL_GUILD_BANK_RIGHTS,
+ CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK,
+ CHAR_INS_GUILD_BANK_EVENTLOG,
+ CHAR_DEL_GUILD_BANK_EVENTLOG,
+ CHAR_DEL_GUILD_BANK_EVENTLOGS,
+ CHAR_INS_GUILD_EVENTLOG,
+ CHAR_DEL_GUILD_EVENTLOG,
+ CHAR_DEL_GUILD_EVENTLOGS,
+ CHAR_UPD_GUILD_MEMBER_PNOTE,
+ CHAR_UPD_GUILD_MEMBER_OFFNOTE,
+ CHAR_UPD_GUILD_MEMBER_RANK,
+ CHAR_UPD_GUILD_MOTD,
+ CHAR_UPD_GUILD_INFO,
+ CHAR_UPD_GUILD_LEADER,
+ CHAR_UPD_GUILD_RANK_NAME,
+ CHAR_UPD_GUILD_RANK_RIGHTS,
+ CHAR_UPD_GUILD_EMBLEM_INFO,
+ CHAR_UPD_GUILD_BANK_TAB_INFO,
+ CHAR_UPD_GUILD_BANK_MONEY,
+ CHAR_UPD_GUILD_BANK_EVENTLOG_TAB,
+ CHAR_UPD_GUILD_RANK_BANK_MONEY,
+ CHAR_UPD_GUILD_BANK_TAB_TEXT,
+ CHAR_INS_GUILD_MEMBER_WITHDRAW,
+ CHAR_DEL_GUILD_MEMBER_WITHDRAW,
+ CHAR_SEL_CHAR_DATA_FOR_GUILD,
+
+ CHAR_INS_CHANNEL,
+ CHAR_UPD_CHANNEL,
+ CHAR_UPD_CHANNEL_USAGE,
+ CHAR_DEL_OLD_CHANNELS,
+ CHAR_DEL_OLD_CHANNELS_BANS,
+ CHAR_INS_CHANNEL_BAN,
+ CHAR_DEL_CHANNEL_BAN,
+
+ CHAR_UPD_EQUIP_SET,
+ CHAR_INS_EQUIP_SET,
+ CHAR_DEL_EQUIP_SET,
+
+ CHAR_INS_AURA,
+
+ CHAR_SEL_ACCOUNT_DATA,
+ CHAR_REP_ACCOUNT_DATA,
+ CHAR_DEL_ACCOUNT_DATA,
+ CHAR_SEL_PLAYER_ACCOUNT_DATA,
+ CHAR_REP_PLAYER_ACCOUNT_DATA,
+ CHAR_DEL_PLAYER_ACCOUNT_DATA,
+
+ CHAR_SEL_TUTORIALS,
+ CHAR_SEL_HAS_TUTORIALS,
+ CHAR_INS_TUTORIALS,
+ CHAR_UPD_TUTORIALS,
+ CHAR_DEL_TUTORIALS,
+
+ CHAR_INS_INSTANCE_SAVE,
+ CHAR_UPD_INSTANCE_SAVE_DATA,
+ CHAR_UPD_INSTANCE_SAVE_ENCOUNTERMASK,
+
+ CHAR_DEL_GAME_EVENT_SAVE,
+ CHAR_INS_GAME_EVENT_SAVE,
+
+ CHAR_DEL_ALL_GAME_EVENT_CONDITION_SAVE,
+ CHAR_DEL_GAME_EVENT_CONDITION_SAVE,
+ CHAR_INS_GAME_EVENT_CONDITION_SAVE,
+
+ CHAR_INS_ARENA_TEAM,
+ CHAR_INS_ARENA_TEAM_MEMBER,
+ CHAR_DEL_ARENA_TEAM,
+ CHAR_DEL_ARENA_TEAM_MEMBERS,
+ CHAR_UPD_ARENA_TEAM_CAPTAIN,
+ CHAR_DEL_ARENA_TEAM_MEMBER,
+ CHAR_UPD_ARENA_TEAM_STATS,
+ CHAR_UPD_ARENA_TEAM_MEMBER,
+ CHAR_REP_CHARACTER_ARENA_STATS,
+ CHAR_SEL_PLAYER_ARENA_TEAMS,
+
+ CHAR_DEL_ALL_PETITION_SIGNATURES,
+ CHAR_DEL_PETITION_SIGNATURE,
+
+ CHAR_INS_PLAYER_ENTRY_POINT,
+ CHAR_DEL_PLAYER_ENTRY_POINT,
+
+ CHAR_INS_PLAYER_HOMEBIND,
+ CHAR_UPD_PLAYER_HOMEBIND,
+ CHAR_DEL_PLAYER_HOMEBIND,
+
+ CHAR_SEL_CORPSES,
+ CHAR_INS_CORPSE,
+ CHAR_DEL_CORPSE,
+ CHAR_DEL_PLAYER_CORPSES,
+ CHAR_DEL_OLD_CORPSES,
+
+ CHAR_SEL_CREATURE_RESPAWNS,
+ CHAR_REP_CREATURE_RESPAWN,
+ CHAR_DEL_CREATURE_RESPAWN,
+ CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE,
+
+ CHAR_SEL_GO_RESPAWNS,
+ CHAR_REP_GO_RESPAWN,
+ CHAR_DEL_GO_RESPAWN,
+ CHAR_DEL_GO_RESPAWN_BY_INSTANCE,
+
+ CHAR_SEL_GM_TICKETS,
+ CHAR_REP_GM_TICKET,
+ CHAR_DEL_GM_TICKET,
+ CHAR_DEL_ALL_GM_TICKETS,
+ CHAR_DEL_PLAYER_GM_TICKETS,
+ CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION,
+
+ CHAR_INS_GM_SURVEY,
+ CHAR_INS_GM_SUBSURVEY,
+ CHAR_INS_LAG_REPORT,
+
+ CHAR_INS_CHARACTER,
+ CHAR_UPD_CHARACTER,
+
+ CHAR_UPD_ADD_AT_LOGIN_FLAG,
+ CHAR_UPD_REM_AT_LOGIN_FLAG,
+ CHAR_UPD_ALL_AT_LOGIN_FLAGS,
+ CHAR_INS_BUG_REPORT,
+ CHAR_UPD_PETITION_NAME,
+ CHAR_INS_PETITION_SIGNATURE,
+ CHAR_UPD_ACCOUNT_ONLINE,
+ CHAR_INS_GROUP,
+ CHAR_REP_GROUP_MEMBER,
+ CHAR_DEL_GROUP_MEMBER,
+ CHAR_UPD_GROUP_LEADER,
+ CHAR_UPD_GROUP_TYPE,
+ CHAR_UPD_GROUP_MEMBER_SUBGROUP,
+ CHAR_UPD_GROUP_MEMBER_FLAG,
+ CHAR_UPD_GROUP_DIFFICULTY,
+ CHAR_UPD_GROUP_RAID_DIFFICULTY,
+ CHAR_DEL_INVALID_SPELL_SPELLS,
+ CHAR_DEL_INVALID_SPELL_TALENTS,
+ CHAR_UPD_DELETE_INFO,
+ CHAR_UDP_RESTORE_DELETE_INFO,
+ CHAR_UPD_ZONE,
+ CHAR_UPD_LEVEL,
+ CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA,
+ CHAR_DEL_INVALID_ACHIEVMENT,
+ CHAR_INS_ADDON,
+ CHAR_DEL_INVALID_PET_SPELL,
+ CHAR_UPD_GLOBAL_INSTANCE_RESETTIME,
+ CHAR_UPD_CHAR_ONLINE,
+ CHAR_UPD_CHAR_NAME_AT_LOGIN,
+ CHAR_UPD_WORLDSTATE,
+ CHAR_INS_WORLDSTATE,
+ CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE,
+ CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_NOT_EXTENDED,
+ CHAR_UPD_CHAR_INSTANCE_SET_NOT_EXTENDED,
+ CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID,
+ CHAR_UPD_CHAR_INSTANCE,
+ CHAR_UPD_CHAR_INSTANCE_EXTENDED,
+ CHAR_INS_CHAR_INSTANCE,
+ CHAR_INS_ARENA_LOG_FIGHT,
+ CHAR_INS_ARENA_LOG_MEMBERSTATS,
+ CHAR_UPD_GENDER_PLAYERBYTES,
+ CHAR_DEL_CHARACTER_SKILL,
+ CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS,
+ CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS,
+ CHAR_INS_CHARACTER_SOCIAL,
+ CHAR_DEL_CHARACTER_SOCIAL,
+ CHAR_UPD_CHARACTER_SOCIAL_NOTE,
+ CHAR_UPD_CHARACTER_POSITION,
+
+ CHAR_REP_LFG_DATA,
+ CHAR_DEL_LFG_DATA,
+
+ CHAR_SEL_CHARACTER_AURA_FROZEN,
+ CHAR_SEL_CHARACTER_ONLINE,
+
+ CHAR_SEL_CHAR_DEL_INFO_BY_GUID,
+ CHAR_SEL_CHAR_DEL_INFO_BY_NAME,
+ CHAR_SEL_CHAR_DEL_INFO,
+
+ CHAR_SEL_CHARS_BY_ACCOUNT_ID,
+ CHAR_SEL_CHAR_PINFO,
+ CHAR_SEL_PINFO_BANS,
+ CHAR_SEL_CHAR_HOMEBIND,
+ CHAR_SEL_CHAR_GUID_NAME_BY_ACC,
+ CHAR_SEL_POOL_QUEST_SAVE,
+ CHAR_SEL_CHARACTER_AT_LOGIN,
+ CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN,
+ CHAR_SEL_CHAR_AT_LOGIN_TITLES_MONEY,
+ CHAR_SEL_CHAR_COD_ITEM_MAIL,
+ CHAR_SEL_CHAR_SOCIAL,
+ CHAR_SEL_CHAR_OLD_CHARS,
+ CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID,
+ CHAR_SEL_MAIL,
+ CHAR_SEL_MAIL_ASYNCH,
+ CHAR_SEL_CHAR_PLAYERBYTES2,
+ CHAR_DEL_CHAR_AURA_FROZEN,
+ CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM,
+ CHAR_SEL_MAIL_COUNT_ITEM,
+ CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM,
+ CHAR_SEL_GUILD_BANK_COUNT_ITEM,
+ CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY,
+ CHAR_SEL_MAIL_ITEMS_BY_ENTRY,
+ CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY,
+ CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY,
+ CHAR_DEL_CHAR_ACHIEVEMENT,
+ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS,
+ CHAR_INS_CHAR_ACHIEVEMENT,
+ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA,
+ CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS,
+ CHAR_DEL_CHAR_REPUTATION_BY_FACTION,
+ CHAR_INS_CHAR_REPUTATION_BY_FACTION,
+ CHAR_UPD_CHAR_ARENA_POINTS,
+ CHAR_DEL_ITEM_REFUND_INSTANCE,
+ CHAR_INS_ITEM_REFUND_INSTANCE,
+ CHAR_DEL_GROUP,
+ CHAR_DEL_GROUP_MEMBER_ALL,
+ CHAR_INS_CHAR_GIFT,
+ CHAR_DEL_INSTANCE_BY_INSTANCE,
+ CHAR_DEL_MAIL_ITEM_BY_ID,
+ CHAR_INS_PETITION,
+ CHAR_DEL_PETITION_BY_GUID,
+ CHAR_DEL_PETITION_SIGNATURE_BY_GUID,
+ CHAR_DEL_CHAR_DECLINED_NAME,
+ CHAR_INS_CHAR_DECLINED_NAME,
+ CHAR_UPD_FACTION_OR_RACE,
+ CHAR_DEL_CHAR_SKILL_LANGUAGES,
+ CHAR_INS_CHAR_SKILL_LANGUAGE,
+ CHAR_UPD_CHAR_TAXI_PATH,
+ CHAR_UPD_CHAR_TAXIMASK,
+ CHAR_DEL_CHAR_QUESTSTATUS,
+ CHAR_DEL_CHAR_SOCIAL_BY_GUID,
+ CHAR_DEL_CHAR_SOCIAL_BY_FRIEND,
+ CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT,
+ CHAR_UPD_CHAR_ACHIEVEMENT,
+ CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE,
+ CHAR_DEL_CHAR_SPELL_BY_SPELL,
+ CHAR_UPD_CHAR_SPELL_FACTION_CHANGE,
+ CHAR_SEL_CHAR_REP_BY_FACTION,
+ CHAR_DEL_CHAR_REP_BY_FACTION,
+ CHAR_UPD_CHAR_REP_FACTION_CHANGE,
+ CHAR_UPD_CHAR_TITLES_FACTION_CHANGE,
+ CHAR_RES_CHAR_TITLES_FACTION_CHANGE,
+ CHAR_DEL_CHAR_SPELL_COOLDOWN,
+ CHAR_DEL_CHARACTER,
+ CHAR_DEL_CHAR_ACTION,
+ CHAR_DEL_CHAR_AURA,
+ CHAR_DEL_CHAR_GIFT,
+ CHAR_DEL_CHAR_INSTANCE,
+ CHAR_DEL_CHAR_INVENTORY,
+ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED,
+ CHAR_DEL_CHAR_REPUTATION,
+ CHAR_DEL_CHAR_SPELL,
+ CHAR_DEL_MAIL,
+ CHAR_DEL_MAIL_ITEMS,
+ CHAR_DEL_CHAR_ACHIEVEMENTS,
+ CHAR_DEL_CHAR_EQUIPMENTSETS,
+ CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER,
+ CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER,
+ CHAR_DEL_CHAR_GLYPHS,
+ CHAR_DEL_CHAR_TALENT,
+ CHAR_DEL_CHAR_SKILLS,
+ CHAR_UDP_CHAR_HONOR_POINTS,
+ CHAR_UDP_CHAR_ARENA_POINTS,
+ CHAR_UDP_CHAR_MONEY,
+ CHAR_UPD_CHAR_REMOVE_GHOST, // pussywizard
+ CHAR_INS_CHAR_ACTION,
+ CHAR_UPD_CHAR_ACTION,
+ CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC,
+ CHAR_DEL_CHAR_INVENTORY_BY_ITEM,
+ CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT,
+ CHAR_UPD_MAIL,
+ CHAR_REP_CHAR_QUESTSTATUS,
+ CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST,
+ CHAR_INS_CHAR_QUESTSTATUS_REWARDED,
+ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST,
+ CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_FACTION_CHANGE,
+ CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE,
+ CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST,
+ CHAR_DEL_CHAR_SKILL_BY_SKILL,
+ CHAR_INS_CHAR_SKILLS,
+ CHAR_UDP_CHAR_SKILLS,
+ CHAR_INS_CHAR_SPELL,
+ CHAR_DEL_CHAR_STATS,
+ CHAR_INS_CHAR_STATS,
+ CHAR_DEL_PETITION_BY_OWNER,
+ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER,
+ CHAR_DEL_PETITION_BY_OWNER_AND_TYPE,
+ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE,
+ CHAR_INS_CHAR_GLYPHS,
+ CHAR_DEL_CHAR_TALENT_BY_SPELL,
+ CHAR_INS_CHAR_TALENT,
+ CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC,
+
+ CHAR_REP_CALENDAR_EVENT,
+ CHAR_DEL_CALENDAR_EVENT,
+ CHAR_REP_CALENDAR_INVITE,
+ CHAR_DEL_CALENDAR_INVITE,
+
+ CHAR_SEL_PET_AURA,
+ CHAR_SEL_PET_SPELL,
+ CHAR_SEL_PET_SPELL_COOLDOWN,
+ CHAR_DEL_PET_AURAS,
+ CHAR_DEL_PET_SPELL_COOLDOWNS,
+ CHAR_INS_PET_SPELL_COOLDOWN,
+ CHAR_DEL_PET_SPELL_BY_SPELL,
+ CHAR_INS_PET_SPELL,
+ CHAR_INS_PET_AURA,
+
+ CHAR_DEL_PET_SPELLS,
+ CHAR_DEL_CHAR_PET_BY_OWNER,
+ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER,
+ CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT,
+ CHAR_SEL_PET_SLOTS,
+ CHAR_SEL_PET_SLOTS_DETAIL,
+ CHAR_SEL_PET_ENTRY,
+ CHAR_SEL_PET_SLOT_BY_ID,
+ CHAR_SEL_PET_SPELL_LIST,
+ CHAR_SEL_CHAR_PET,
+ CHAR_SEL_CHAR_PETS,
+ CHAR_SEL_CHAR_PET_BY_ENTRY,
+ CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2,
+ CHAR_SEL_CHAR_PET_BY_SLOT,
+ CHAR_DEL_CHAR_PET_DECLINEDNAME,
+ CHAR_ADD_CHAR_PET_DECLINEDNAME,
+ CHAR_UPD_CHAR_PET_NAME,
+ CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID,
+ CHAR_UDP_CHAR_PET_SLOT_BY_SLOT,
+ CHAR_UPD_CHAR_PET_SLOT_BY_ID,
+ CHAR_DEL_CHAR_PET_BY_ID,
+ CHAR_DEL_CHAR_PET_BY_SLOT,
+ CHAR_REP_CHAR_PET,
+
+ CHAR_SEL_ITEMCONTAINER_ITEMS,
+ CHAR_DEL_ITEMCONTAINER_SINGLE_ITEM,
+ CHAR_INS_ITEMCONTAINER_SINGLE_ITEM,
+ CHAR_DEL_ITEMCONTAINER_CONTAINER,
+
+ CHAR_SEL_PVPSTATS_MAXID,
+ CHAR_INS_PVPSTATS_BATTLEGROUND,
+ CHAR_INS_PVPSTATS_PLAYER,
+ CHAR_SEL_PVPSTATS_FACTIONS_OVERALL,
+
+ CHAR_INS_DESERTER_TRACK,
+
+ MAX_CHARACTERDATABASE_STATEMENTS
+};
+
+#endif
diff --git a/src/common/Database/Implementation/LoginDatabase.cpp b/src/common/Database/Implementation/LoginDatabase.cpp
new file mode 100644
index 0000000000..66d1755c7a
--- /dev/null
+++ b/src/common/Database/Implementation/LoginDatabase.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "LoginDatabase.h"
+
+void LoginDatabaseConnection::DoPrepareStatements()
+{
+ if (!m_reconnecting)
+ m_stmts.resize(MAX_LOGINDATABASE_STATEMENTS);
+
+ PrepareStatement(LOGIN_SEL_REALMLIST, "SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE flag <> 3 ORDER BY name", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_IP_BANNED, "SELECT * FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_INS_IP_AUTO_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban')", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_IP_BANNED_BY_IP, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) AND ip LIKE CONCAT('%%', ?, '%%') ORDER BY unbandate", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED, "SELECT bandate, unbandate FROM account_banned WHERE id = ? AND active = 1", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_ALL, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 AND username LIKE CONCAT('%%', ?, '%%') GROUP BY account.id", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_INS_ACCOUNT_AUTO_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban', 1)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_FAILEDLOGINS, "SELECT id, failed_logins FROM account WHERE username = ?", 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 id, sessionkey, last_ip, locked, lock_country, expansion, mutetime, locale, recruiter, os FROM account WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_NUM_CHARS_ON_REALM, "SELECT numchars FROM realmcharacters WHERE realmid = ? AND acctid= ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BY_IP, "SELECT id, username FROM account WHERE last_ip = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BY_ID, "SELECT 1 FROM account WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_INS_IP_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_IP_NOT_BANNED, "DELETE FROM ip_banned WHERE ip = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_ACCOUNT_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_ACCOUNT_NOT_BANNED, "UPDATE account_banned SET active = 0 WHERE id = ? AND active != 0", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM, "DELETE FROM realmcharacters WHERE acctid = ? AND realmid = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_REALM_CHARACTERS, "INSERT INTO realmcharacters (numchars, acctid, realmid) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_SUM_REALM_CHARACTERS, "SELECT SUM(numchars) FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, expansion, joindate) VALUES(?, ?, ?, NOW())", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_REALM_CHARACTERS_INIT, "INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_ACCOUNT_LOCK_CONTRY, "UPDATE account SET lock_country = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_USERNAME, "UPDATE account SET v = 0, s = 0, username = ?, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_PASSWORD, "UPDATE account SET v = 0, s = 0, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_MUTE_TIME, "UPDATE account SET mutetime = ? , mutereason = ? , muteby = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_MUTE_TIME_LOGIN, "UPDATE account SET mutetime = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_LAST_IP, "UPDATE account SET last_ip = ? WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_ACCOUNT_ONLINE, "UPDATE account SET online = online | (1<<(?-1)) WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_UPTIME_PLAYERS, "UPDATE uptime SET uptime = ?, maxplayers = ? WHERE realmid = ? AND starttime = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_OLD_LOGS, "DELETE FROM logs WHERE (time + ?) < ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_ACCOUNT_ACCESS, "DELETE FROM account_access WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM, "DELETE FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_ACCOUNT_ACCESS, "INSERT INTO account_access (id,gmlevel,RealmID) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL, "SELECT gmlevel FROM account_access WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_GET_GMLEVEL_BY_REALMID, "SELECT gmlevel FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, "SELECT 1 FROM account_access WHERE id = ? AND gmlevel > ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS, "SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_RECRUITER, "SELECT 1 FROM account WHERE recruiter = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_BANS, "SELECT 1 FROM account_banned WHERE id = ? AND active = 1 UNION SELECT 1 FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_WHOIS, "SELECT username, email, last_ip FROM account WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_AUTOBROADCAST, "SELECT id, weight, text FROM autobroadcast WHERE realmid = ? OR realmid = -1", CONNECTION_SYNCH);
+}
diff --git a/src/common/Database/Implementation/LoginDatabase.h b/src/common/Database/Implementation/LoginDatabase.h
new file mode 100644
index 0000000000..0bde70d161
--- /dev/null
+++ b/src/common/Database/Implementation/LoginDatabase.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _LOGINDATABASE_H
+#define _LOGINDATABASE_H
+
+#include "DatabaseWorkerPool.h"
+#include "MySQLConnection.h"
+
+class LoginDatabaseConnection : public MySQLConnection
+{
+ public:
+ //- Constructors for sync and async connections
+ LoginDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { }
+ LoginDatabaseConnection(ACE_Activation_Queue* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { }
+
+ //- Loads database type specific prepared statements
+ void DoPrepareStatements();
+};
+
+typedef DatabaseWorkerPool<LoginDatabaseConnection> LoginDatabaseWorkerPool;
+
+enum LoginDatabaseStatements
+{
+ /* Naming standard for defines:
+ {DB}_{SEL/INS/UPD/DEL/REP}_{Summary of data changed}
+ When updating more than one field, consider looking at the calling function
+ name for a suiting suffix.
+ */
+
+ LOGIN_SEL_REALMLIST,
+ LOGIN_DEL_EXPIRED_IP_BANS,
+ LOGIN_UPD_EXPIRED_ACCOUNT_BANS,
+ LOGIN_SEL_IP_BANNED,
+ LOGIN_INS_IP_AUTO_BANNED,
+ LOGIN_SEL_ACCOUNT_BANNED,
+ LOGIN_SEL_ACCOUNT_BANNED_ALL,
+ LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME,
+ LOGIN_INS_ACCOUNT_AUTO_BANNED,
+ LOGIN_DEL_ACCOUNT_BANNED,
+ LOGIN_SEL_SESSIONKEY,
+ LOGIN_UPD_VS,
+ LOGIN_UPD_LOGONPROOF,
+ LOGIN_SEL_LOGONCHALLENGE,
+ LOGIN_SEL_LOGON_COUNTRY,
+ LOGIN_UPD_FAILEDLOGINS,
+ LOGIN_SEL_FAILEDLOGINS,
+ LOGIN_SEL_ACCOUNT_ID_BY_NAME,
+ LOGIN_SEL_ACCOUNT_LIST_BY_NAME,
+ LOGIN_SEL_ACCOUNT_INFO_BY_NAME,
+ LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL,
+ LOGIN_SEL_NUM_CHARS_ON_REALM,
+ LOGIN_SEL_ACCOUNT_BY_IP,
+ LOGIN_INS_IP_BANNED,
+ LOGIN_DEL_IP_NOT_BANNED,
+ LOGIN_SEL_IP_BANNED_ALL,
+ LOGIN_SEL_IP_BANNED_BY_IP,
+ LOGIN_SEL_ACCOUNT_BY_ID,
+ LOGIN_INS_ACCOUNT_BANNED,
+ LOGIN_UPD_ACCOUNT_NOT_BANNED,
+ LOGIN_DEL_REALM_CHARACTERS_BY_REALM,
+ LOGIN_DEL_REALM_CHARACTERS,
+ LOGIN_INS_REALM_CHARACTERS,
+ LOGIN_SEL_SUM_REALM_CHARACTERS,
+ LOGIN_INS_ACCOUNT,
+ LOGIN_INS_REALM_CHARACTERS_INIT,
+ LOGIN_UPD_EXPANSION,
+ LOGIN_UPD_ACCOUNT_LOCK,
+ LOGIN_UPD_ACCOUNT_LOCK_CONTRY,
+ LOGIN_UPD_USERNAME,
+ LOGIN_UPD_PASSWORD,
+ LOGIN_UPD_MUTE_TIME,
+ LOGIN_UPD_MUTE_TIME_LOGIN,
+ LOGIN_UPD_LAST_IP,
+ LOGIN_UPD_ACCOUNT_ONLINE,
+ LOGIN_UPD_UPTIME_PLAYERS,
+ LOGIN_DEL_OLD_LOGS,
+ LOGIN_DEL_ACCOUNT_ACCESS,
+ LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM,
+ LOGIN_INS_ACCOUNT_ACCESS,
+ LOGIN_GET_ACCOUNT_ID_BY_USERNAME,
+ LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL,
+ LOGIN_GET_GMLEVEL_BY_REALMID,
+ LOGIN_GET_USERNAME_BY_ID,
+ LOGIN_SEL_CHECK_PASSWORD,
+ LOGIN_SEL_CHECK_PASSWORD_BY_NAME,
+ LOGIN_SEL_PINFO,
+ LOGIN_SEL_PINFO_BANS,
+ LOGIN_SEL_GM_ACCOUNTS,
+ LOGIN_SEL_ACCOUNT_INFO,
+ LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST,
+ LOGIN_SEL_ACCOUNT_ACCESS,
+ LOGIN_SEL_ACCOUNT_RECRUITER,
+ LOGIN_SEL_BANS,
+ LOGIN_SEL_ACCOUNT_WHOIS,
+ LOGIN_SEL_REALMLIST_SECURITY_LEVEL,
+ LOGIN_DEL_ACCOUNT,
+ LOGIN_SEL_IP2NATION_COUNTRY,
+ LOGIN_SEL_AUTOBROADCAST,
+
+ MAX_LOGINDATABASE_STATEMENTS
+};
+
+#endif
diff --git a/src/common/Database/Implementation/WorldDatabase.cpp b/src/common/Database/Implementation/WorldDatabase.cpp
new file mode 100644
index 0000000000..2dd28018ed
--- /dev/null
+++ b/src/common/Database/Implementation/WorldDatabase.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "WorldDatabase.h"
+
+void WorldDatabaseConnection::DoPrepareStatements()
+{
+ if (!m_reconnecting)
+ m_stmts.resize(MAX_WORLDDATABASE_STATEMENTS);
+
+ PrepareStatement(WORLD_SEL_QUEST_POOLS, "SELECT entry, pool_entry FROM pool_quest", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_CREATURE_TEXT, "SELECT entry, groupid, id, text, type, language, probability, emote, duration, sound, BroadcastTextID, TextRange FROM creature_text", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z FROM waypoints ORDER BY entry, pointid", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_GRAVEYARD_ZONE, "INSERT INTO game_graveyard_zone (id, ghost_zone, faction) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GRAVEYARD_ZONE, "DELETE FROM game_graveyard_zone WHERE id = ? AND ghost_zone = ? AND faction = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_NPC_VENDOR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_NPC_VENDOR, "DELETE FROM npc_vendor WHERE entry = ? AND item = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_NPC_VENDOR_REF, "SELECT item, maxcount, incrtime, ExtendedCost FROM npc_vendor WHERE entry = ? ORDER BY slot ASC", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE, "UPDATE creature SET MovementType = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_FACTION, "UPDATE creature_template SET faction = ? WHERE entry = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_NPCFLAG, "UPDATE creature_template SET npcflag = ? WHERE entry = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_POSITION, "UPDATE creature SET position_x = ?, position_y = ?, position_z = ?, orientation = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_SPAWN_DISTANCE, "UPDATE creature SET spawndist = ?, MovementType = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_SPAWN_TIME_SECS, "UPDATE creature SET spawntimesecs = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_CREATURE_FORMATION, "INSERT INTO creature_formations (leaderGUID, memberGUID, dist, angle, groupAI) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_WAYPOINT_DATA, "INSERT INTO waypoint_data (id, point, position_x, position_y, position_z) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_WAYPOINT_DATA, "DELETE FROM waypoint_data WHERE id = ? AND point = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_POINT, "UPDATE waypoint_data SET point = point - 1 WHERE id = ? AND point > ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_POSITION, "UPDATE waypoint_data SET position_x = ?, position_y = ?, position_z = ? where id = ? AND point = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_WPGUID, "UPDATE waypoint_data SET wpguid = ? WHERE id = ? and point = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_MAX_ID, "SELECT MAX(id) FROM waypoint_data", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_MAX_POINT, "SELECT MAX(point) FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, move_type, delay, action, action_chance FROM waypoint_data WHERE id = ? ORDER BY point", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, "SELECT point, position_x, position_y, position_z FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, "SELECT position_x, position_y, position_z FROM waypoint_data WHERE point = 1 AND id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, "SELECT position_x, position_y, position_z, orientation FROM waypoint_data WHERE id = ? ORDER BY point DESC LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_WPGUID, "SELECT id, point FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID, "SELECT id, point, delay, move_type, action, action_chance FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID, "UPDATE waypoint_data SET wpguid = 0", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_POS, "SELECT id, point FROM waypoint_data WHERE (abs(position_x - ?) <= ?) and (abs(position_y - ?) <= ?) and (abs(position_z - ?) <= ?)", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID, "SELECT wpguid FROM waypoint_data WHERE id = ? and wpguid <> 0", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_ACTION, "SELECT DISTINCT action FROM waypoint_data", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPTS_MAX_ID, "SELECT MAX(guid) FROM waypoint_scripts", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_INS_CREATURE_ADDON, "INSERT INTO creature_addon(guid, path_id) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_ADDON_PATH, "UPDATE creature_addon SET path_id = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_CREATURE_ADDON, "DELETE FROM creature_addon WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_CREATURE_ADDON_BY_GUID, "SELECT guid FROM creature_addon WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_INS_WAYPOINT_SCRIPT, "INSERT INTO waypoint_scripts (guid) VALUES (?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_WAYPOINT_SCRIPT, "DELETE FROM waypoint_scripts WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_ID, "UPDATE waypoint_scripts SET id = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_X, "UPDATE waypoint_scripts SET x = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_Y, "UPDATE waypoint_scripts SET y = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_Z, "UPDATE waypoint_scripts SET z = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_O, "UPDATE waypoint_scripts SET o = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? AND (phaseMask & ?) <> 0 ORDER BY order_", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? AND (phaseMask & ?) <> 0 ORDER BY order_", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnMask, phaseMask, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, dynamicflags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnMask, phaseMask, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_DISABLES, "INSERT INTO disables (entry, sourceType, flags, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_DISABLES, "SELECT entry FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_DISABLES, "DELETE FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_ASYNC);
+}
diff --git a/src/common/Database/Implementation/WorldDatabase.h b/src/common/Database/Implementation/WorldDatabase.h
new file mode 100644
index 0000000000..df42677077
--- /dev/null
+++ b/src/common/Database/Implementation/WorldDatabase.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _WORLDDATABASE_H
+#define _WORLDDATABASE_H
+
+#include "DatabaseWorkerPool.h"
+#include "MySQLConnection.h"
+
+class WorldDatabaseConnection : public MySQLConnection
+{
+ public:
+ //- Constructors for sync and async connections
+ WorldDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) { }
+ WorldDatabaseConnection(ACE_Activation_Queue* q, MySQLConnectionInfo& connInfo) : MySQLConnection(q, connInfo) { }
+
+ //- Loads database type specific prepared statements
+ void DoPrepareStatements();
+};
+
+typedef DatabaseWorkerPool<WorldDatabaseConnection> WorldDatabaseWorkerPool;
+
+enum WorldDatabaseStatements
+{
+ /* Naming standard for defines:
+ {DB}_{SEL/INS/UPD/DEL/REP}_{Summary of data changed}
+ When updating more than one field, consider looking at the calling function
+ name for a suiting suffix.
+ */
+
+ WORLD_SEL_QUEST_POOLS,
+ WORLD_DEL_CRELINKED_RESPAWN,
+ WORLD_REP_CREATURE_LINKED_RESPAWN,
+ WORLD_SEL_CREATURE_TEXT,
+ WORLD_SEL_SMART_SCRIPTS,
+ WORLD_SEL_SMARTAI_WP,
+ WORLD_DEL_GAMEOBJECT,
+ WORLD_DEL_EVENT_GAMEOBJECT,
+ WORLD_INS_GRAVEYARD_ZONE,
+ WORLD_DEL_GRAVEYARD_ZONE,
+ WORLD_INS_GAME_TELE,
+ WORLD_DEL_GAME_TELE,
+ WORLD_INS_NPC_VENDOR,
+ WORLD_DEL_NPC_VENDOR,
+ WORLD_SEL_NPC_VENDOR_REF,
+ WORLD_UPD_CREATURE_MOVEMENT_TYPE,
+ WORLD_UPD_CREATURE_FACTION,
+ WORLD_UPD_CREATURE_NPCFLAG,
+ WORLD_UPD_CREATURE_POSITION,
+ WORLD_UPD_CREATURE_SPAWN_DISTANCE,
+ WORLD_UPD_CREATURE_SPAWN_TIME_SECS,
+ WORLD_INS_CREATURE_FORMATION,
+ WORLD_INS_WAYPOINT_DATA,
+ WORLD_DEL_WAYPOINT_DATA,
+ WORLD_UPD_WAYPOINT_DATA_POINT,
+ WORLD_UPD_WAYPOINT_DATA_POSITION,
+ WORLD_UPD_WAYPOINT_DATA_WPGUID,
+ WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID,
+ WORLD_SEL_WAYPOINT_DATA_MAX_ID,
+ WORLD_SEL_WAYPOINT_DATA_BY_ID,
+ WORLD_SEL_WAYPOINT_DATA_POS_BY_ID,
+ WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID,
+ WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID,
+ WORLD_SEL_WAYPOINT_DATA_BY_WPGUID,
+ WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID,
+ WORLD_SEL_WAYPOINT_DATA_MAX_POINT,
+ WORLD_SEL_WAYPOINT_DATA_BY_POS,
+ WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID,
+ WORLD_SEL_WAYPOINT_DATA_ACTION,
+ WORLD_SEL_WAYPOINT_SCRIPTS_MAX_ID,
+ WORLD_UPD_CREATURE_ADDON_PATH,
+ WORLD_INS_CREATURE_ADDON,
+ WORLD_DEL_CREATURE_ADDON,
+ WORLD_SEL_CREATURE_ADDON_BY_GUID,
+ WORLD_INS_WAYPOINT_SCRIPT,
+ WORLD_DEL_WAYPOINT_SCRIPT,
+ WORLD_UPD_WAYPOINT_SCRIPT_ID,
+ WORLD_UPD_WAYPOINT_SCRIPT_X,
+ WORLD_UPD_WAYPOINT_SCRIPT_Y,
+ WORLD_UPD_WAYPOINT_SCRIPT_Z,
+ WORLD_UPD_WAYPOINT_SCRIPT_O,
+ WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID,
+ WORLD_DEL_CREATURE,
+ WORLD_SEL_COMMANDS,
+ WORLD_SEL_CREATURE_TEMPLATE,
+ WORLD_SEL_WAYPOINT_SCRIPT_BY_ID,
+ WORLD_SEL_ITEM_TEMPLATE_BY_NAME,
+ WORLD_SEL_CREATURE_BY_ID,
+ WORLD_SEL_GAMEOBJECT_NEAREST,
+ WORLD_SEL_CREATURE_NEAREST,
+ WORLD_SEL_GAMEOBJECT_TARGET,
+ WORLD_INS_CREATURE,
+ WORLD_DEL_GAME_EVENT_CREATURE,
+ WORLD_DEL_GAME_EVENT_MODEL_EQUIP,
+ WORLD_INS_GAMEOBJECT,
+ WORLD_SEL_DISABLES,
+ WORLD_INS_DISABLES,
+ WORLD_DEL_DISABLES,
+
+ MAX_WORLDDATABASE_STATEMENTS
+};
+
+#endif
diff --git a/src/common/Database/MySQLConnection.cpp b/src/common/Database/MySQLConnection.cpp
new file mode 100644
index 0000000000..6b554ce8e7
--- /dev/null
+++ b/src/common/Database/MySQLConnection.cpp
@@ -0,0 +1,538 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+
+#include "Common.h"
+
+#ifdef _WIN32
+ #include <winsock2.h>
+#endif
+#include <mysql.h>
+#include <mysqld_error.h>
+#include <errmsg.h>
+
+#include "MySQLConnection.h"
+#include "MySQLThreading.h"
+#include "QueryResult.h"
+#include "SQLOperation.h"
+#include "PreparedStatement.h"
+#include "DatabaseWorker.h"
+#include "Timer.h"
+#include "Log.h"
+
+MySQLConnection::MySQLConnection(MySQLConnectionInfo& connInfo) :
+m_reconnecting(false),
+m_prepareError(false),
+m_queue(NULL),
+m_worker(NULL),
+m_Mysql(NULL),
+m_connectionInfo(connInfo),
+m_connectionFlags(CONNECTION_SYNCH)
+{
+}
+
+MySQLConnection::MySQLConnection(ACE_Activation_Queue* queue, MySQLConnectionInfo& connInfo) :
+m_reconnecting(false),
+m_prepareError(false),
+m_queue(queue),
+m_Mysql(NULL),
+m_connectionInfo(connInfo),
+m_connectionFlags(CONNECTION_ASYNC)
+{
+ m_worker = new DatabaseWorker(m_queue, this);
+}
+
+MySQLConnection::~MySQLConnection()
+{
+ ASSERT (m_Mysql); /// MySQL context must be present at this point
+
+ for (size_t i = 0; i < m_stmts.size(); ++i)
+ delete m_stmts[i];
+
+ mysql_close(m_Mysql);
+}
+
+void MySQLConnection::Close()
+{
+ /// Only close us if we're not operating
+ delete this;
+}
+
+bool MySQLConnection::Open()
+{
+ MYSQL *mysqlInit;
+ mysqlInit = mysql_init(NULL);
+ if (!mysqlInit)
+ {
+ sLog->outError("Could not initialize Mysql connection to database `%s`", m_connectionInfo.database.c_str());
+ return false;
+ }
+
+ int port;
+ char const* unix_socket;
+ //unsigned int timeout = 10;
+
+ mysql_options(mysqlInit, MYSQL_SET_CHARSET_NAME, "utf8");
+ //mysql_options(mysqlInit, MYSQL_OPT_READ_TIMEOUT, (char const*)&timeout);
+ #ifdef _WIN32
+ if (m_connectionInfo.host == ".") // named pipe use option (Windows)
+ {
+ unsigned int opt = MYSQL_PROTOCOL_PIPE;
+ mysql_options(mysqlInit, MYSQL_OPT_PROTOCOL, (char const*)&opt);
+ port = 0;
+ unix_socket = 0;
+ }
+ else // generic case
+ {
+ port = atoi(m_connectionInfo.port_or_socket.c_str());
+ unix_socket = 0;
+ }
+ #else
+ if (m_connectionInfo.host == ".") // socket use option (Unix/Linux)
+ {
+ unsigned int opt = MYSQL_PROTOCOL_SOCKET;
+ mysql_options(mysqlInit, MYSQL_OPT_PROTOCOL, (char const*)&opt);
+ m_connectionInfo.host = "localhost";
+ port = 0;
+ unix_socket = m_connectionInfo.port_or_socket.c_str();
+ }
+ else // generic case
+ {
+ port = atoi(m_connectionInfo.port_or_socket.c_str());
+ unix_socket = 0;
+ }
+ #endif
+
+ m_Mysql = mysql_real_connect(mysqlInit, m_connectionInfo.host.c_str(), m_connectionInfo.user.c_str(),
+ m_connectionInfo.password.c_str(), m_connectionInfo.database.c_str(), port, unix_socket, 0);
+
+ if (m_Mysql)
+ {
+ if (!m_reconnecting)
+ {
+ sLog->outSQLDriver("MySQL client library: %s", mysql_get_client_info());
+ sLog->outSQLDriver("MySQL server ver: %s ", mysql_get_server_info(m_Mysql));
+ // MySQL version above 5.1 IS required in both client and server and there is no known issue with different versions above 5.1
+ // if (mysql_get_server_version(m_Mysql) != mysql_get_client_version())
+ // sLog->outInfo(LOG_FILTER_SQL, "[WARNING] MySQL client/server version mismatch; may conflict with behaviour of prepared statements.");
+ }
+
+#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
+ sLog->outDetail("Connected to MySQL database at %s", m_connectionInfo.host.c_str());
+#endif
+ mysql_autocommit(m_Mysql, 1);
+
+ // set connection properties to UTF8 to properly handle locales for different
+ // server configs - core sends data in UTF8, so MySQL must expect UTF8 too
+ mysql_set_character_set(m_Mysql, "utf8");
+ return PrepareStatements();
+ }
+ else
+ {
+ sLog->outError("Could not connect to MySQL database at %s: %s\n", m_connectionInfo.host.c_str(), mysql_error(mysqlInit));
+ mysql_close(mysqlInit);
+ return false;
+ }
+}
+
+bool MySQLConnection::PrepareStatements()
+{
+ DoPrepareStatements();
+ return !m_prepareError;
+}
+
+bool MySQLConnection::Execute(const char* sql)
+{
+ if (!m_Mysql)
+ return false;
+
+ {
+ uint32 _s = 0;
+ if (sLog->GetSQLDriverQueryLogging())
+ _s = getMSTime();
+
+ if (mysql_query(m_Mysql, sql))
+ {
+ uint32 lErrno = mysql_errno(m_Mysql);
+
+ sLog->outSQLDriver("SQL: %s", sql);
+ sLog->outSQLDriver("ERROR: [%u] %s", lErrno, mysql_error(m_Mysql));
+
+ if (_HandleMySQLErrno(lErrno)) // If it returns true, an error was handled successfully (i.e. reconnection)
+ return Execute(sql); // Try again
+
+ return false;
+ }
+ else if (sLog->GetSQLDriverQueryLogging())
+ {
+ sLog->outSQLDriver("[%u ms] SQL: %s", getMSTimeDiff(_s, getMSTime()), sql);
+ }
+ }
+
+ return true;
+}
+
+bool MySQLConnection::Execute(PreparedStatement* stmt)
+{
+ if (!m_Mysql)
+ return false;
+
+ uint32 index = stmt->m_index;
+ {
+ MySQLPreparedStatement* m_mStmt = GetPreparedStatement(index);
+ ASSERT(m_mStmt); // Can only be null if preparation failed, server side error or bad query
+ m_mStmt->m_stmt = stmt; // Cross reference them for debug output
+ stmt->m_stmt = m_mStmt; // TODO: Cleaner way
+
+ stmt->BindParameters();
+
+ MYSQL_STMT* msql_STMT = m_mStmt->GetSTMT();
+ MYSQL_BIND* msql_BIND = m_mStmt->GetBind();
+
+ uint32 _s = 0;
+ if (sLog->GetSQLDriverQueryLogging())
+ _s = getMSTime();
+
+ if (mysql_stmt_bind_param(msql_STMT, msql_BIND))
+ {
+ uint32 lErrno = mysql_errno(m_Mysql);
+ sLog->outSQLDriver("SQL(p): %s\n [ERROR]: [%u] %s", m_mStmt->getQueryString(m_queries[index].first).c_str(), lErrno, mysql_stmt_error(msql_STMT));
+
+ if (_HandleMySQLErrno(lErrno)) // If it returns true, an error was handled successfully (i.e. reconnection)
+ return Execute(stmt); // Try again
+
+ m_mStmt->ClearParameters();
+ return false;
+ }
+
+ if (mysql_stmt_execute(msql_STMT))
+ {
+ uint32 lErrno = mysql_errno(m_Mysql);
+ sLog->outSQLDriver("SQL(p): %s\n [ERROR]: [%u] %s", m_mStmt->getQueryString(m_queries[index].first).c_str(), lErrno, mysql_stmt_error(msql_STMT));
+
+ if (_HandleMySQLErrno(lErrno)) // If it returns true, an error was handled successfully (i.e. reconnection)
+ return Execute(stmt); // Try again
+
+ m_mStmt->ClearParameters();
+ return false;
+ }
+
+ if (sLog->GetSQLDriverQueryLogging())
+ sLog->outSQLDriver("[%u ms] SQL(p): %s", getMSTimeDiff(_s, getMSTime()), m_mStmt->getQueryString(m_queries[index].first).c_str());
+
+ m_mStmt->ClearParameters();
+ return true;
+ }
+}
+
+bool MySQLConnection::_Query(PreparedStatement* stmt, MYSQL_RES **pResult, uint64* pRowCount, uint32* pFieldCount)
+{
+ if (!m_Mysql)
+ return false;
+
+ uint32 index = stmt->m_index;
+ {
+ MySQLPreparedStatement* m_mStmt = GetPreparedStatement(index);
+ ASSERT(m_mStmt); // Can only be null if preparation failed, server side error or bad query
+ m_mStmt->m_stmt = stmt; // Cross reference them for debug output
+ stmt->m_stmt = m_mStmt; // TODO: Cleaner way
+
+ stmt->BindParameters();
+
+ MYSQL_STMT* msql_STMT = m_mStmt->GetSTMT();
+ MYSQL_BIND* msql_BIND = m_mStmt->GetBind();
+
+ uint32 _s = 0;
+ if (sLog->GetSQLDriverQueryLogging())
+ _s = getMSTime();
+
+ if (mysql_stmt_bind_param(msql_STMT, msql_BIND))
+ {
+ uint32 lErrno = mysql_errno(m_Mysql);
+ sLog->outSQLDriver("SQL(p): %s\n [ERROR]: [%u] %s", m_mStmt->getQueryString(m_queries[index].first).c_str(), lErrno, mysql_stmt_error(msql_STMT));
+
+ if (_HandleMySQLErrno(lErrno)) // If it returns true, an error was handled successfully (i.e. reconnection)
+ return _Query(stmt, pResult, pRowCount, pFieldCount); // Try again
+
+ m_mStmt->ClearParameters();
+ return false;
+ }
+
+ if (mysql_stmt_execute(msql_STMT))
+ {
+ uint32 lErrno = mysql_errno(m_Mysql);
+ sLog->outSQLDriver("SQL(p): %s\n [ERROR]: [%u] %s",
+ m_mStmt->getQueryString(m_queries[index].first).c_str(), lErrno, mysql_stmt_error(msql_STMT));
+
+ if (_HandleMySQLErrno(lErrno)) // If it returns true, an error was handled successfully (i.e. reconnection)
+ return _Query(stmt, pResult, pRowCount, pFieldCount); // Try again
+
+ m_mStmt->ClearParameters();
+ return false;
+ }
+
+ if (sLog->GetSQLDriverQueryLogging())
+ sLog->outSQLDriver("[%u ms] SQL(p): %s", getMSTimeDiff(_s, getMSTime()), m_mStmt->getQueryString(m_queries[index].first).c_str());
+
+ m_mStmt->ClearParameters();
+
+ *pResult = mysql_stmt_result_metadata(msql_STMT);
+ *pRowCount = mysql_stmt_num_rows(msql_STMT);
+ *pFieldCount = mysql_stmt_field_count(msql_STMT);
+
+ return true;
+
+ }
+}
+
+ResultSet* MySQLConnection::Query(const char* sql)
+{
+ if (!sql)
+ return NULL;
+
+ MYSQL_RES *result = NULL;
+ MYSQL_FIELD *fields = NULL;
+ uint64 rowCount = 0;
+ uint32 fieldCount = 0;
+
+ if (!_Query(sql, &result, &fields, &rowCount, &fieldCount))
+ return NULL;
+
+ return new ResultSet(result, fields, rowCount, fieldCount);
+}
+
+bool MySQLConnection::_Query(const char *sql, MYSQL_RES **pResult, MYSQL_FIELD **pFields, uint64* pRowCount, uint32* pFieldCount)
+{
+ if (!m_Mysql)
+ return false;
+
+ {
+ uint32 _s = 0;
+ if (sLog->GetSQLDriverQueryLogging())
+ _s = getMSTime();
+
+ if (mysql_query(m_Mysql, sql))
+ {
+ uint32 lErrno = mysql_errno(m_Mysql);
+ sLog->outSQLDriver("SQL: %s", sql);
+ sLog->outSQLDriver("ERROR: [%u] %s", lErrno, mysql_error(m_Mysql));
+
+ if (_HandleMySQLErrno(lErrno)) // If it returns true, an error was handled successfully (i.e. reconnection)
+ return _Query(sql, pResult, pFields, pRowCount, pFieldCount); // We try again
+
+ return false;
+ }
+ else if (sLog->GetSQLDriverQueryLogging())
+ {
+ sLog->outSQLDriver("[%u ms] SQL: %s", getMSTimeDiff(_s, getMSTime()), sql);
+ }
+
+ *pResult = mysql_store_result(m_Mysql);
+ *pRowCount = mysql_affected_rows(m_Mysql);
+ *pFieldCount = mysql_field_count(m_Mysql);
+ }
+
+ if (!*pResult )
+ return false;
+
+ if (!*pRowCount)
+ {
+ mysql_free_result(*pResult);
+ return false;
+ }
+
+ *pFields = mysql_fetch_fields(*pResult);
+
+ return true;
+}
+
+void MySQLConnection::BeginTransaction()
+{
+ Execute("START TRANSACTION");
+}
+
+void MySQLConnection::RollbackTransaction()
+{
+ Execute("ROLLBACK");
+}
+
+void MySQLConnection::CommitTransaction()
+{
+ Execute("COMMIT");
+}
+
+bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
+{
+ std::list<SQLElementData> const& queries = transaction->m_queries;
+ if (queries.empty())
+ return false;
+
+ BeginTransaction();
+
+ std::list<SQLElementData>::const_iterator itr;
+ for (itr = queries.begin(); itr != queries.end(); ++itr)
+ {
+ SQLElementData const& data = *itr;
+ switch (itr->type)
+ {
+ case SQL_ELEMENT_PREPARED:
+ {
+ PreparedStatement* stmt = data.element.stmt;
+ ASSERT(stmt);
+ if (!Execute(stmt))
+ {
+ sLog->outSQLDriver("[Warning] Transaction aborted. %u queries not executed.", (uint32)queries.size());
+ RollbackTransaction();
+ return false;
+ }
+ }
+ break;
+ case SQL_ELEMENT_RAW:
+ {
+ const char* sql = data.element.query;
+ ASSERT(sql);
+ if (!Execute(sql))
+ {
+ sLog->outSQLDriver("[Warning] Transaction aborted. %u queries not executed.", (uint32)queries.size());
+ RollbackTransaction();
+ return false;
+ }
+ }
+ break;
+ }
+ }
+
+ // we might encounter errors during certain queries, and depending on the kind of error
+ // we might want to restart the transaction. So to prevent data loss, we only clean up when it's all done.
+ // This is done in calling functions DatabaseWorkerPool<T>::DirectCommitTransaction and TransactionTask::Execute,
+ // and not while iterating over every element.
+
+ CommitTransaction();
+ return true;
+}
+
+MySQLPreparedStatement* MySQLConnection::GetPreparedStatement(uint32 index)
+{
+ ASSERT(index < m_stmts.size());
+ MySQLPreparedStatement* ret = m_stmts[index];
+ if (!ret)
+ sLog->outSQLDriver("ERROR: Could not fetch prepared statement %u on database `%s`, connection type: %s.",
+ index, m_connectionInfo.database.c_str(), (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous");
+
+ return ret;
+}
+
+void MySQLConnection::PrepareStatement(uint32 index, const char* sql, ConnectionFlags flags)
+{
+ m_queries.insert(PreparedStatementMap::value_type(index, std::make_pair(sql, flags)));
+
+ // For reconnection case
+ if (m_reconnecting)
+ delete m_stmts[index];
+
+ // Check if specified query should be prepared on this connection
+ // i.e. don't prepare async statements on synchronous connections
+ // to save memory that will not be used.
+ if (!(m_connectionFlags & flags))
+ {
+ m_stmts[index] = NULL;
+ return;
+ }
+
+ MYSQL_STMT* stmt = mysql_stmt_init(m_Mysql);
+ if (!stmt)
+ {
+ sLog->outSQLDriver("[ERROR]: In mysql_stmt_init() id: %u, sql: \"%s\"", index, sql);
+ sLog->outSQLDriver("[ERROR]: %s", mysql_error(m_Mysql));
+ m_prepareError = true;
+ }
+ else
+ {
+ if (mysql_stmt_prepare(stmt, sql, static_cast<unsigned long>(strlen(sql))))
+ {
+ sLog->outSQLDriver("[ERROR]: In mysql_stmt_prepare() id: %u, sql: \"%s\"", index, sql);
+ sLog->outSQLDriver("[ERROR]: %s", mysql_stmt_error(stmt));
+ mysql_stmt_close(stmt);
+ m_prepareError = true;
+ }
+ else
+ {
+ MySQLPreparedStatement* mStmt = new MySQLPreparedStatement(stmt);
+ m_stmts[index] = mStmt;
+ }
+ }
+}
+
+PreparedResultSet* MySQLConnection::Query(PreparedStatement* stmt)
+{
+ MYSQL_RES *result = NULL;
+ uint64 rowCount = 0;
+ uint32 fieldCount = 0;
+
+ if (!_Query(stmt, &result, &rowCount, &fieldCount))
+ return NULL;
+
+ if (mysql_more_results(m_Mysql))
+ {
+ mysql_next_result(m_Mysql);
+ }
+ return new PreparedResultSet(stmt->m_stmt->GetSTMT(), result, rowCount, fieldCount);
+}
+
+bool MySQLConnection::_HandleMySQLErrno(uint32 errNo)
+{
+ switch (errNo)
+ {
+ case CR_SERVER_GONE_ERROR:
+ case CR_SERVER_LOST:
+ case CR_INVALID_CONN_HANDLE:
+ case CR_SERVER_LOST_EXTENDED:
+ {
+ m_reconnecting = true;
+ uint64 oldThreadId = mysql_thread_id(GetHandle());
+ mysql_close(GetHandle());
+ if (this->Open()) // Don't remove 'this' pointer unless you want to skip loading all prepared statements....
+ {
+ sLog->outSQLDriver("Connection to the MySQL server is active.");
+ if (oldThreadId != mysql_thread_id(GetHandle()))
+ sLog->outSQLDriver("Successfully reconnected to %s @%s:%s (%s).",
+ m_connectionInfo.database.c_str(), m_connectionInfo.host.c_str(), m_connectionInfo.port_or_socket.c_str(),
+ (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous");
+
+ m_reconnecting = false;
+ return true;
+ }
+
+ uint32 lErrno = mysql_errno(GetHandle()); // It's possible this attempted reconnect throws 2006 at us. To prevent crazy recursive calls, sleep here.
+ ACE_OS::sleep(3); // Sleep 3 seconds
+ return _HandleMySQLErrno(lErrno); // Call self (recursive)
+ }
+
+ case ER_LOCK_DEADLOCK:
+ return false; // Implemented in TransactionTask::Execute and DatabaseWorkerPool<T>::DirectCommitTransaction
+ // Query related errors - skip query
+ case ER_WRONG_VALUE_COUNT:
+ case ER_DUP_ENTRY:
+ return false;
+
+ // Outdated table or database structure - terminate core
+ case ER_BAD_FIELD_ERROR:
+ case ER_NO_SUCH_TABLE:
+ sLog->outError("Your database structure is not up to date. Please make sure you've executed all queries in the sql/updates folders.");
+ ACE_OS::sleep(10);
+ std::abort();
+ return false;
+ case ER_PARSE_ERROR:
+ sLog->outError("Error while parsing SQL. Core fix required.");
+ ACE_OS::sleep(10);
+ std::abort();
+ return false;
+ default:
+ sLog->outError("Unhandled MySQL errno %u. Unexpected behaviour possible.", errNo);
+ return false;
+ }
+}
diff --git a/src/common/Database/MySQLConnection.h b/src/common/Database/MySQLConnection.h
new file mode 100644
index 0000000000..2631ba2fd3
--- /dev/null
+++ b/src/common/Database/MySQLConnection.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include <ace/Activation_Queue.h>
+
+#include "DatabaseWorkerPool.h"
+#include "Transaction.h"
+#include "Util.h"
+
+#ifndef _MYSQLCONNECTION_H
+#define _MYSQLCONNECTION_H
+
+class DatabaseWorker;
+class PreparedStatement;
+class MySQLPreparedStatement;
+class PingOperation;
+
+enum ConnectionFlags
+{
+ CONNECTION_ASYNC = 0x1,
+ CONNECTION_SYNCH = 0x2,
+ CONNECTION_BOTH = CONNECTION_ASYNC | CONNECTION_SYNCH
+};
+
+struct MySQLConnectionInfo
+{
+ MySQLConnectionInfo() { }
+ MySQLConnectionInfo(const std::string& infoString)
+ {
+ Tokenizer tokens(infoString, ';');
+
+ if (tokens.size() != 5)
+ return;
+
+ uint8 i = 0;
+
+ host.assign(tokens[i++]);
+ port_or_socket.assign(tokens[i++]);
+ user.assign(tokens[i++]);
+ password.assign(tokens[i++]);
+ database.assign(tokens[i++]);
+ }
+
+ std::string user;
+ std::string password;
+ std::string database;
+ std::string host;
+ std::string port_or_socket;
+};
+
+typedef std::map<uint32 /*index*/, std::pair<std::string /*query*/, ConnectionFlags /*sync/async*/> > PreparedStatementMap;
+
+class MySQLConnection
+{
+ template <class T> friend class DatabaseWorkerPool;
+ friend class PingOperation;
+
+ public:
+ MySQLConnection(MySQLConnectionInfo& connInfo); //! Constructor for synchronous connections.
+ MySQLConnection(ACE_Activation_Queue* queue, MySQLConnectionInfo& connInfo); //! Constructor for asynchronous connections.
+ virtual ~MySQLConnection();
+
+ virtual bool Open();
+ void Close();
+
+ public:
+ bool Execute(const char* sql);
+ bool Execute(PreparedStatement* stmt);
+ ResultSet* Query(const char* sql);
+ PreparedResultSet* Query(PreparedStatement* stmt);
+ bool _Query(const char *sql, MYSQL_RES **pResult, MYSQL_FIELD **pFields, uint64* pRowCount, uint32* pFieldCount);
+ bool _Query(PreparedStatement* stmt, MYSQL_RES **pResult, uint64* pRowCount, uint32* pFieldCount);
+
+ void BeginTransaction();
+ void RollbackTransaction();
+ void CommitTransaction();
+ bool ExecuteTransaction(SQLTransaction& transaction);
+
+ operator bool () const { return m_Mysql != NULL; }
+ void Ping() { mysql_ping(m_Mysql); }
+
+ uint32 GetLastError() { return mysql_errno(m_Mysql); }
+
+ protected:
+ bool LockIfReady()
+ {
+ /// Tries to acquire lock. If lock is acquired by another thread
+ /// the calling parent will just try another connection
+ return m_Mutex.tryacquire() != -1;
+ }
+
+ void Unlock()
+ {
+ /// Called by parent databasepool. Will let other threads access this connection
+ m_Mutex.release();
+ }
+
+ MYSQL* GetHandle() { return m_Mysql; }
+ MySQLPreparedStatement* GetPreparedStatement(uint32 index);
+ void PrepareStatement(uint32 index, const char* sql, ConnectionFlags flags);
+
+ bool PrepareStatements();
+ virtual void DoPrepareStatements() = 0;
+
+ protected:
+ std::vector<MySQLPreparedStatement*> m_stmts; //! PreparedStatements storage
+ PreparedStatementMap m_queries; //! Query storage
+ bool m_reconnecting; //! Are we reconnecting?
+ bool m_prepareError; //! Was there any error while preparing statements?
+
+ private:
+ bool _HandleMySQLErrno(uint32 errNo);
+
+ private:
+ ACE_Activation_Queue* m_queue; //! Queue shared with other asynchronous connections.
+ DatabaseWorker* m_worker; //! Core worker task.
+ MYSQL * m_Mysql; //! MySQL Handle.
+ MySQLConnectionInfo& m_connectionInfo; //! Connection info (used for logging)
+ ConnectionFlags m_connectionFlags; //! Connection flags (for preparing relevant statements)
+ ACE_Thread_Mutex m_Mutex;
+};
+
+#endif
diff --git a/src/common/Database/MySQLThreading.h b/src/common/Database/MySQLThreading.h
new file mode 100644
index 0000000000..726fd7cb81
--- /dev/null
+++ b/src/common/Database/MySQLThreading.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MYSQLTHREADING_H
+#define _MYSQLTHREADING_H
+
+#include "Log.h"
+
+class MySQL
+{
+ public:
+ /*! Create a thread on the MySQL server to mirrior the calling thread,
+ initializes thread-specific variables and allows thread-specific
+ operations without concurrence from other threads.
+ This should only be called if multiple core threads are running
+ on the same MySQL connection. Seperate MySQL connections implicitly
+ create a mirror thread.
+ */
+ static void Thread_Init()
+ {
+ mysql_thread_init();
+ }
+
+ /*! Shuts down MySQL thread and frees resources, should only be called
+ when we terminate. MySQL threads and connections are not configurable
+ during runtime.
+ */
+ static void Thread_End()
+ {
+ mysql_thread_end();
+ }
+
+ static void Library_Init()
+ {
+ mysql_library_init(-1, NULL, NULL);
+ }
+
+ static void Library_End()
+ {
+ mysql_library_end();
+ }
+};
+
+#endif
diff --git a/src/common/Database/PreparedStatement.cpp b/src/common/Database/PreparedStatement.cpp
new file mode 100644
index 0000000000..f3ec96fa48
--- /dev/null
+++ b/src/common/Database/PreparedStatement.cpp
@@ -0,0 +1,477 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "PreparedStatement.h"
+#include "MySQLConnection.h"
+#include "Log.h"
+
+PreparedStatement::PreparedStatement(uint32 index) :
+m_stmt(NULL),
+m_index(index)
+{
+}
+
+PreparedStatement::~PreparedStatement()
+{
+}
+
+void PreparedStatement::BindParameters()
+{
+ ASSERT (m_stmt);
+
+ uint8 i = 0;
+ for (; i < statement_data.size(); i++)
+ {
+ switch (statement_data[i].type)
+ {
+ case TYPE_BOOL:
+ m_stmt->setBool(i, statement_data[i].data.boolean);
+ break;
+ case TYPE_UI8:
+ m_stmt->setUInt8(i, statement_data[i].data.ui8);
+ break;
+ case TYPE_UI16:
+ m_stmt->setUInt16(i, statement_data[i].data.ui16);
+ break;
+ case TYPE_UI32:
+ m_stmt->setUInt32(i, statement_data[i].data.ui32);
+ break;
+ case TYPE_I8:
+ m_stmt->setInt8(i, statement_data[i].data.i8);
+ break;
+ case TYPE_I16:
+ m_stmt->setInt16(i, statement_data[i].data.i16);
+ break;
+ case TYPE_I32:
+ m_stmt->setInt32(i, statement_data[i].data.i32);
+ break;
+ case TYPE_UI64:
+ m_stmt->setUInt64(i, statement_data[i].data.ui64);
+ break;
+ case TYPE_I64:
+ m_stmt->setInt64(i, statement_data[i].data.i64);
+ break;
+ case TYPE_FLOAT:
+ m_stmt->setFloat(i, statement_data[i].data.f);
+ break;
+ case TYPE_DOUBLE:
+ m_stmt->setDouble(i, statement_data[i].data.d);
+ break;
+ case TYPE_STRING:
+ m_stmt->setString(i, statement_data[i].str.c_str());
+ break;
+ case TYPE_NULL:
+ m_stmt->setNull(i);
+ break;
+ }
+ }
+ #ifdef _DEBUG
+ if (i < m_stmt->m_paramCount)
+ sLog->outSQLDriver("[WARNING]: BindParameters() for statement %u did not bind all allocated parameters", m_index);
+ #endif
+}
+
+//- Bind to buffer
+void PreparedStatement::setBool(const uint8 index, const bool value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.boolean = value;
+ statement_data[index].type = TYPE_BOOL;
+}
+
+void PreparedStatement::setUInt8(const uint8 index, const uint8 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.ui8 = value;
+ statement_data[index].type = TYPE_UI8;
+}
+
+void PreparedStatement::setUInt16(const uint8 index, const uint16 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.ui16 = value;
+ statement_data[index].type = TYPE_UI16;
+}
+
+void PreparedStatement::setUInt32(const uint8 index, const uint32 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.ui32 = value;
+ statement_data[index].type = TYPE_UI32;
+}
+
+void PreparedStatement::setUInt64(const uint8 index, const uint64 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.ui64 = value;
+ statement_data[index].type = TYPE_UI64;
+}
+
+void PreparedStatement::setInt8(const uint8 index, const int8 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.i8 = value;
+ statement_data[index].type = TYPE_I8;
+}
+
+void PreparedStatement::setInt16(const uint8 index, const int16 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.i16 = value;
+ statement_data[index].type = TYPE_I16;
+}
+
+void PreparedStatement::setInt32(const uint8 index, const int32 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.i32 = value;
+ statement_data[index].type = TYPE_I32;
+}
+
+void PreparedStatement::setInt64(const uint8 index, const int64 value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.i64 = value;
+ statement_data[index].type = TYPE_I64;
+}
+
+void PreparedStatement::setFloat(const uint8 index, const float value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.f = value;
+ statement_data[index].type = TYPE_FLOAT;
+}
+
+void PreparedStatement::setDouble(const uint8 index, const double value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].data.d = value;
+ statement_data[index].type = TYPE_DOUBLE;
+}
+
+void PreparedStatement::setString(const uint8 index, const std::string& value)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].str = value;
+ statement_data[index].type = TYPE_STRING;
+}
+
+void PreparedStatement::setNull(const uint8 index)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].type = TYPE_NULL;
+}
+
+MySQLPreparedStatement::MySQLPreparedStatement(MYSQL_STMT* stmt) :
+m_stmt(NULL),
+m_Mstmt(stmt),
+m_bind(NULL)
+{
+ /// Initialize variable parameters
+ m_paramCount = mysql_stmt_param_count(stmt);
+ m_paramsSet.assign(m_paramCount, false);
+ m_bind = new MYSQL_BIND[m_paramCount];
+ memset(m_bind, 0, sizeof(MYSQL_BIND)*m_paramCount);
+
+ /// "If set to 1, causes mysql_stmt_store_result() to update the metadata MYSQL_FIELD->max_length value."
+ my_bool bool_tmp = 1;
+ mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &bool_tmp);
+}
+
+MySQLPreparedStatement::~MySQLPreparedStatement()
+{
+ ClearParameters();
+ if (m_Mstmt->bind_result_done)
+ {
+ delete[] m_Mstmt->bind->length;
+ delete[] m_Mstmt->bind->is_null;
+ }
+ mysql_stmt_close(m_Mstmt);
+ delete[] m_bind;
+}
+
+void MySQLPreparedStatement::ClearParameters()
+{
+ for (uint32 i=0; i < m_paramCount; ++i)
+ {
+ delete m_bind[i].length;
+ m_bind[i].length = NULL;
+ delete[] (char*) m_bind[i].buffer;
+ m_bind[i].buffer = NULL;
+ m_paramsSet[i] = false;
+ }
+}
+
+static bool ParamenterIndexAssertFail(uint32 stmtIndex, uint8 index, uint32 paramCount)
+{
+ sLog->outError("Attempted to bind parameter %u%s on a PreparedStatement %u (statement has only %u parameters)", uint32(index) + 1, (index == 1 ? "st" : (index == 2 ? "nd" : (index == 3 ? "rd" : "nd"))), stmtIndex, paramCount);
+ return false;
+}
+
+//- Bind on mysql level
+bool MySQLPreparedStatement::CheckValidIndex(uint8 index)
+{
+ ASSERT(index < m_paramCount || ParamenterIndexAssertFail(m_stmt->m_index, index, m_paramCount));
+
+ if (m_paramsSet[index])
+ sLog->outSQLDriver("[WARNING] Prepared Statement (id: %u) trying to bind value on already bound index (%u).", m_stmt->m_index, index);
+ return true;
+}
+
+void MySQLPreparedStatement::setBool(const uint8 index, const bool value)
+{
+ setUInt8(index, value ? 1 : 0);
+}
+
+void MySQLPreparedStatement::setUInt8(const uint8 index, const uint8 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_TINY, &value, sizeof(uint8), true);
+}
+
+void MySQLPreparedStatement::setUInt16(const uint8 index, const uint16 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_SHORT, &value, sizeof(uint16), true);
+}
+
+void MySQLPreparedStatement::setUInt32(const uint8 index, const uint32 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_LONG, &value, sizeof(uint32), true);
+}
+
+void MySQLPreparedStatement::setUInt64(const uint8 index, const uint64 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_LONGLONG, &value, sizeof(uint64), true);
+}
+
+void MySQLPreparedStatement::setInt8(const uint8 index, const int8 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_TINY, &value, sizeof(int8), false);
+}
+
+void MySQLPreparedStatement::setInt16(const uint8 index, const int16 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_SHORT, &value, sizeof(int16), false);
+}
+
+void MySQLPreparedStatement::setInt32(const uint8 index, const int32 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_LONG, &value, sizeof(int32), false);
+}
+
+void MySQLPreparedStatement::setInt64(const uint8 index, const int64 value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_LONGLONG, &value, sizeof(int64), false);
+}
+
+void MySQLPreparedStatement::setFloat(const uint8 index, const float value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_FLOAT, &value, sizeof(float), (value > 0.0f));
+}
+
+void MySQLPreparedStatement::setDouble(const uint8 index, const double value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ setValue(param, MYSQL_TYPE_DOUBLE, &value, sizeof(double), (value > 0.0f));
+}
+
+void MySQLPreparedStatement::setString(const uint8 index, const char* value)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ size_t len = strlen(value) + 1;
+ param->buffer_type = MYSQL_TYPE_VAR_STRING;
+ delete [] static_cast<char *>(param->buffer);
+ param->buffer = new char[len];
+ param->buffer_length = len;
+ param->is_null_value = 0;
+ delete param->length;
+ param->length = new unsigned long(len-1);
+
+ memcpy(param->buffer, value, len);
+}
+
+void MySQLPreparedStatement::setNull(const uint8 index)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ param->buffer_type = MYSQL_TYPE_NULL;
+ delete [] static_cast<char *>(param->buffer);
+ param->buffer = NULL;
+ param->buffer_length = 0;
+ param->is_null_value = 1;
+ delete param->length;
+ param->length = NULL;
+}
+
+void MySQLPreparedStatement::setValue(MYSQL_BIND* param, enum_field_types type, const void* value, uint32 len, bool isUnsigned)
+{
+ param->buffer_type = type;
+ delete [] static_cast<char *>(param->buffer);
+ param->buffer = new char[len];
+ param->buffer_length = 0;
+ param->is_null_value = 0;
+ param->length = NULL; // Only != NULL for strings
+ param->is_unsigned = isUnsigned;
+
+ memcpy(param->buffer, value, len);
+}
+
+std::string MySQLPreparedStatement::getQueryString(std::string const& sqlPattern) const
+{
+ std::string queryString = sqlPattern;
+
+ size_t pos = 0;
+ for (uint32 i = 0; i < m_stmt->statement_data.size(); i++)
+ {
+ pos = queryString.find('?', pos);
+ std::stringstream ss;
+
+ switch (m_stmt->statement_data[i].type)
+ {
+ case TYPE_BOOL:
+ ss << uint16(m_stmt->statement_data[i].data.boolean);
+ break;
+ case TYPE_UI8:
+ ss << uint16(m_stmt->statement_data[i].data.ui8); // stringstream will append a character with that code instead of numeric representation
+ break;
+ case TYPE_UI16:
+ ss << m_stmt->statement_data[i].data.ui16;
+ break;
+ case TYPE_UI32:
+ ss << m_stmt->statement_data[i].data.ui32;
+ break;
+ case TYPE_I8:
+ ss << int16(m_stmt->statement_data[i].data.i8); // stringstream will append a character with that code instead of numeric representation
+ break;
+ case TYPE_I16:
+ ss << m_stmt->statement_data[i].data.i16;
+ break;
+ case TYPE_I32:
+ ss << m_stmt->statement_data[i].data.i32;
+ break;
+ case TYPE_UI64:
+ ss << m_stmt->statement_data[i].data.ui64;
+ break;
+ case TYPE_I64:
+ ss << m_stmt->statement_data[i].data.i64;
+ break;
+ case TYPE_FLOAT:
+ ss << m_stmt->statement_data[i].data.f;
+ break;
+ case TYPE_DOUBLE:
+ ss << m_stmt->statement_data[i].data.d;
+ break;
+ case TYPE_STRING:
+ ss << '\'' << m_stmt->statement_data[i].str << '\'';
+ break;
+ case TYPE_NULL:
+ ss << "NULL";
+ break;
+ }
+
+ std::string replaceStr = ss.str();
+ queryString.replace(pos, 1, replaceStr);
+ pos += replaceStr.length();
+ }
+
+ return queryString;
+}
+
+//- Execution
+PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt) :
+m_stmt(stmt),
+m_has_result(false)
+{
+}
+
+PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultFuture result) :
+m_stmt(stmt),
+m_has_result(true),
+m_result(result)
+{
+}
+
+
+PreparedStatementTask::~PreparedStatementTask()
+{
+ delete m_stmt;
+}
+
+bool PreparedStatementTask::Execute()
+{
+ if (m_has_result)
+ {
+ PreparedResultSet* result = m_conn->Query(m_stmt);
+ if (!result || !result->GetRowCount())
+ {
+ delete result;
+ m_result.set(PreparedQueryResult(NULL));
+ return false;
+ }
+ m_result.set(PreparedQueryResult(result));
+ return true;
+ }
+
+ return m_conn->Execute(m_stmt);
+}
diff --git a/src/common/Database/PreparedStatement.h b/src/common/Database/PreparedStatement.h
new file mode 100644
index 0000000000..0d55c24d8a
--- /dev/null
+++ b/src/common/Database/PreparedStatement.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _PREPAREDSTATEMENT_H
+#define _PREPAREDSTATEMENT_H
+
+#include "SQLOperation.h"
+#include <ace/Future.h>
+
+#ifdef __APPLE__
+#undef TYPE_BOOL
+#endif
+
+//- Union for data buffer (upper-level bind -> queue -> lower-level bind)
+union PreparedStatementDataUnion
+{
+ bool boolean;
+ uint8 ui8;
+ int8 i8;
+ uint16 ui16;
+ int16 i16;
+ uint32 ui32;
+ int32 i32;
+ uint64 ui64;
+ int64 i64;
+ float f;
+ double d;
+};
+
+//- This enum helps us differ data held in above union
+enum PreparedStatementValueType
+{
+ TYPE_BOOL,
+ TYPE_UI8,
+ TYPE_UI16,
+ TYPE_UI32,
+ TYPE_UI64,
+ TYPE_I8,
+ TYPE_I16,
+ TYPE_I32,
+ TYPE_I64,
+ TYPE_FLOAT,
+ TYPE_DOUBLE,
+ TYPE_STRING,
+ TYPE_NULL
+};
+
+struct PreparedStatementData
+{
+ PreparedStatementDataUnion data;
+ PreparedStatementValueType type;
+ std::string str;
+};
+
+//- Forward declare
+class MySQLPreparedStatement;
+
+//- Upper-level class that is used in code
+class PreparedStatement
+{
+ friend class PreparedStatementTask;
+ friend class MySQLPreparedStatement;
+ friend class MySQLConnection;
+
+ public:
+ explicit PreparedStatement(uint32 index);
+ ~PreparedStatement();
+
+ void setBool(const uint8 index, const bool value);
+ void setUInt8(const uint8 index, const uint8 value);
+ void setUInt16(const uint8 index, const uint16 value);
+ void setUInt32(const uint8 index, const uint32 value);
+ void setUInt64(const uint8 index, const uint64 value);
+ void setInt8(const uint8 index, const int8 value);
+ void setInt16(const uint8 index, const int16 value);
+ void setInt32(const uint8 index, const int32 value);
+ void setInt64(const uint8 index, const int64 value);
+ void setFloat(const uint8 index, const float value);
+ void setDouble(const uint8 index, const double value);
+ void setString(const uint8 index, const std::string& value);
+ void setNull(const uint8 index);
+
+ protected:
+ void BindParameters();
+
+ protected:
+ MySQLPreparedStatement* m_stmt;
+ uint32 m_index;
+ std::vector<PreparedStatementData> statement_data; //- Buffer of parameters, not tied to MySQL in any way yet
+};
+
+//- 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
+{
+ friend class MySQLConnection;
+ friend class PreparedStatement;
+
+ public:
+ MySQLPreparedStatement(MYSQL_STMT* stmt);
+ ~MySQLPreparedStatement();
+
+ void setBool(const uint8 index, const bool value);
+ void setUInt8(const uint8 index, const uint8 value);
+ void setUInt16(const uint8 index, const uint16 value);
+ void setUInt32(const uint8 index, const uint32 value);
+ void setUInt64(const uint8 index, const uint64 value);
+ void setInt8(const uint8 index, const int8 value);
+ void setInt16(const uint8 index, const int16 value);
+ void setInt32(const uint8 index, const int32 value);
+ void setInt64(const uint8 index, const int64 value);
+ void setFloat(const uint8 index, const float value);
+ void setDouble(const uint8 index, const double value);
+ void setString(const uint8 index, const char* value);
+ void setNull(const uint8 index);
+
+ protected:
+ MYSQL_STMT* GetSTMT() { return m_Mstmt; }
+ MYSQL_BIND* GetBind() { return m_bind; }
+ PreparedStatement* m_stmt;
+ void ClearParameters();
+ bool CheckValidIndex(uint8 index);
+ std::string getQueryString(std::string const& sqlPattern) const;
+
+ private:
+ void setValue(MYSQL_BIND* param, enum_field_types type, const void* value, uint32 len, bool isUnsigned);
+
+ private:
+ MYSQL_STMT* m_Mstmt;
+ uint32 m_paramCount;
+ std::vector<bool> m_paramsSet;
+ MYSQL_BIND* m_bind;
+};
+
+typedef ACE_Future<PreparedQueryResult> PreparedQueryResultFuture;
+
+//- Lower-level class, enqueuable operation
+class PreparedStatementTask : public SQLOperation
+{
+ public:
+ PreparedStatementTask(PreparedStatement* stmt);
+ PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultFuture result);
+ ~PreparedStatementTask();
+
+ bool Execute();
+
+ protected:
+ PreparedStatement* m_stmt;
+ bool m_has_result;
+ PreparedQueryResultFuture m_result;
+};
+#endif
diff --git a/src/common/Database/QueryHolder.cpp b/src/common/Database/QueryHolder.cpp
new file mode 100644
index 0000000000..dd98f117aa
--- /dev/null
+++ b/src/common/Database/QueryHolder.cpp
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MySQLConnection.h"
+#include "QueryHolder.h"
+#include "PreparedStatement.h"
+#include "Log.h"
+
+bool SQLQueryHolder::SetQuery(size_t index, const char *sql)
+{
+ if (m_queries.size() <= index)
+ {
+ sLog->outError("Query index (%u) out of range (size: %u) for query: %s", uint32(index), (uint32)m_queries.size(), sql);
+ return false;
+ }
+
+ /// not executed yet, just stored (it's not called a holder for nothing)
+ SQLElementData element;
+ element.type = SQL_ELEMENT_RAW;
+ element.element.query = strdup(sql);
+
+ SQLResultSetUnion result;
+ result.qresult = NULL;
+
+ m_queries[index] = SQLResultPair(element, result);
+ return true;
+}
+
+bool SQLQueryHolder::SetPQuery(size_t index, const char *format, ...)
+{
+ if (!format)
+ {
+ sLog->outError("Query (index: %u) is empty.", uint32(index));
+ return false;
+ }
+
+ va_list ap;
+ char szQuery [MAX_QUERY_LEN];
+ va_start(ap, format);
+ int res = vsnprintf(szQuery, MAX_QUERY_LEN, format, ap);
+ va_end(ap);
+
+ if (res == -1)
+ {
+ sLog->outError("SQL Query truncated (and not execute) for format: %s", format);
+ return false;
+ }
+
+ return SetQuery(index, szQuery);
+}
+
+bool SQLQueryHolder::SetPreparedQuery(size_t index, PreparedStatement* stmt)
+{
+ if (m_queries.size() <= index)
+ {
+ sLog->outError("Query index (%u) out of range (size: %u) for prepared statement", uint32(index), (uint32)m_queries.size());
+ return false;
+ }
+
+ /// not executed yet, just stored (it's not called a holder for nothing)
+ SQLElementData element;
+ element.type = SQL_ELEMENT_PREPARED;
+ element.element.stmt = stmt;
+
+ SQLResultSetUnion result;
+ result.presult = NULL;
+
+ m_queries[index] = SQLResultPair(element, result);
+ return true;
+}
+
+QueryResult SQLQueryHolder::GetResult(size_t index)
+{
+ // Don't call to this function if the index is of an ad-hoc statement
+ if (index < m_queries.size())
+ {
+ ResultSet* result = m_queries[index].second.qresult;
+ if (!result || !result->GetRowCount())
+ return QueryResult(NULL);
+
+ result->NextRow();
+ return QueryResult(result);
+ }
+ else
+ return QueryResult(NULL);
+}
+
+PreparedQueryResult SQLQueryHolder::GetPreparedResult(size_t index)
+{
+ // Don't call to this function if the index is of a prepared statement
+ if (index < m_queries.size())
+ {
+ PreparedResultSet* result = m_queries[index].second.presult;
+ if (!result || !result->GetRowCount())
+ return PreparedQueryResult(NULL);
+
+ return PreparedQueryResult(result);
+ }
+ else
+ return PreparedQueryResult(NULL);
+}
+
+void SQLQueryHolder::SetResult(size_t index, ResultSet* result)
+{
+ if (result && !result->GetRowCount())
+ {
+ delete result;
+ result = NULL;
+ }
+
+ /// store the result in the holder
+ if (index < m_queries.size())
+ m_queries[index].second.qresult = result;
+}
+
+void SQLQueryHolder::SetPreparedResult(size_t index, PreparedResultSet* result)
+{
+ if (result && !result->GetRowCount())
+ {
+ delete result;
+ result = NULL;
+ }
+
+ /// store the result in the holder
+ if (index < m_queries.size())
+ m_queries[index].second.presult = result;
+}
+
+SQLQueryHolder::~SQLQueryHolder()
+{
+ for (size_t i = 0; i < m_queries.size(); i++)
+ {
+ /// if the result was never used, free the resources
+ /// results used already (getresult called) are expected to be deleted
+ if (SQLElementData* data = &m_queries[i].first)
+ {
+ switch (data->type)
+ {
+ case SQL_ELEMENT_RAW:
+ free((void*)(const_cast<char*>(data->element.query)));
+ break;
+ case SQL_ELEMENT_PREPARED:
+ delete data->element.stmt;
+ break;
+ }
+ }
+ }
+}
+
+void SQLQueryHolder::SetSize(size_t size)
+{
+ /// to optimize push_back, reserve the number of queries about to be executed
+ m_queries.resize(size);
+}
+
+bool SQLQueryHolderTask::Execute()
+{
+ //the result can't be ready as we are processing it right now
+ ASSERT(!m_result.ready());
+
+ if (!m_holder)
+ return false;
+
+ /// we can do this, we are friends
+ std::vector<SQLQueryHolder::SQLResultPair> &queries = m_holder->m_queries;
+
+ for (size_t i = 0; i < queries.size(); i++)
+ {
+ /// execute all queries in the holder and pass the results
+ if (SQLElementData* data = &queries[i].first)
+ {
+ switch (data->type)
+ {
+ case SQL_ELEMENT_RAW:
+ {
+ char const* sql = data->element.query;
+ if (sql)
+ m_holder->SetResult(i, m_conn->Query(sql));
+ break;
+ }
+ case SQL_ELEMENT_PREPARED:
+ {
+ PreparedStatement* stmt = data->element.stmt;
+ if (stmt)
+ m_holder->SetPreparedResult(i, m_conn->Query(stmt));
+ break;
+ }
+ }
+ }
+ }
+
+ m_result.set(m_holder);
+ return true;
+}
diff --git a/src/common/Database/QueryHolder.h b/src/common/Database/QueryHolder.h
new file mode 100644
index 0000000000..efd45c383f
--- /dev/null
+++ b/src/common/Database/QueryHolder.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _QUERYHOLDER_H
+#define _QUERYHOLDER_H
+
+#include <ace/Future.h>
+
+class SQLQueryHolder
+{
+ friend class SQLQueryHolderTask;
+ private:
+ typedef std::pair<SQLElementData, SQLResultSetUnion> SQLResultPair;
+ std::vector<SQLResultPair> m_queries;
+ public:
+ SQLQueryHolder() { }
+ ~SQLQueryHolder();
+ bool SetQuery(size_t index, const char *sql);
+ bool SetPQuery(size_t index, const char *format, ...) ATTR_PRINTF(3, 4);
+ bool SetPreparedQuery(size_t index, PreparedStatement* stmt);
+ void SetSize(size_t size);
+ QueryResult GetResult(size_t index);
+ PreparedQueryResult GetPreparedResult(size_t index);
+ void SetResult(size_t index, ResultSet* result);
+ void SetPreparedResult(size_t index, PreparedResultSet* result);
+};
+
+typedef ACE_Future<SQLQueryHolder*> QueryResultHolderFuture;
+
+class SQLQueryHolderTask : public SQLOperation
+{
+ private:
+ SQLQueryHolder * m_holder;
+ QueryResultHolderFuture m_result;
+
+ public:
+ SQLQueryHolderTask(SQLQueryHolder *holder, QueryResultHolderFuture res)
+ : m_holder(holder), m_result(res){ };
+ bool Execute();
+
+};
+
+#endif \ No newline at end of file
diff --git a/src/common/Database/QueryResult.cpp b/src/common/Database/QueryResult.cpp
new file mode 100644
index 0000000000..aea203080c
--- /dev/null
+++ b/src/common/Database/QueryResult.cpp
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "DatabaseEnv.h"
+#include "Log.h"
+
+ResultSet::ResultSet(MYSQL_RES *result, MYSQL_FIELD *fields, uint64 rowCount, uint32 fieldCount) :
+_rowCount(rowCount),
+_fieldCount(fieldCount),
+_result(result),
+_fields(fields)
+{
+ _currentRow = new Field[_fieldCount];
+ ASSERT(_currentRow);
+}
+
+PreparedResultSet::PreparedResultSet(MYSQL_STMT* stmt, MYSQL_RES *result, uint64 rowCount, uint32 fieldCount) :
+m_rowCount(rowCount),
+m_rowPosition(0),
+m_fieldCount(fieldCount),
+m_rBind(NULL),
+m_stmt(stmt),
+m_res(result),
+m_isNull(NULL),
+m_length(NULL)
+{
+ if (!m_res)
+ return;
+
+ if (m_stmt->bind_result_done)
+ {
+ delete[] m_stmt->bind->length;
+ delete[] m_stmt->bind->is_null;
+ }
+
+ m_rBind = new MYSQL_BIND[m_fieldCount];
+ m_isNull = new my_bool[m_fieldCount];
+ m_length = new unsigned long[m_fieldCount];
+
+ memset(m_isNull, 0, sizeof(my_bool) * m_fieldCount);
+ memset(m_rBind, 0, sizeof(MYSQL_BIND) * m_fieldCount);
+ memset(m_length, 0, sizeof(unsigned long) * m_fieldCount);
+
+ //- This is where we store the (entire) resultset
+ if (mysql_stmt_store_result(m_stmt))
+ {
+ sLog->outSQLDriver("%s:mysql_stmt_store_result, cannot bind result from MySQL server. Error: %s", __FUNCTION__, mysql_stmt_error(m_stmt));
+ delete[] m_rBind;
+ delete[] m_isNull;
+ delete[] m_length;
+ return;
+ }
+
+ //- This is where we prepare the buffer based on metadata
+ uint32 i = 0;
+ MYSQL_FIELD* field = mysql_fetch_field(m_res);
+ while (field)
+ {
+ size_t size = Field::SizeForType(field);
+
+ m_rBind[i].buffer_type = field->type;
+ m_rBind[i].buffer = malloc(size);
+ memset(m_rBind[i].buffer, 0, size);
+ m_rBind[i].buffer_length = size;
+ m_rBind[i].length = &m_length[i];
+ m_rBind[i].is_null = &m_isNull[i];
+ m_rBind[i].error = NULL;
+ m_rBind[i].is_unsigned = field->flags & UNSIGNED_FLAG;
+
+ ++i;
+ field = mysql_fetch_field(m_res);
+ }
+
+ //- This is where we bind the bind the buffer to the statement
+ if (mysql_stmt_bind_result(m_stmt, m_rBind))
+ {
+ sLog->outSQLDriver("%s:mysql_stmt_bind_result, cannot bind result from MySQL server. Error: %s", __FUNCTION__, mysql_stmt_error(m_stmt));
+ delete[] m_rBind;
+ delete[] m_isNull;
+ delete[] m_length;
+ return;
+ }
+
+ m_rowCount = mysql_stmt_num_rows(m_stmt);
+
+ m_rows.resize(uint32(m_rowCount));
+ while (_NextRow())
+ {
+ m_rows[uint32(m_rowPosition)] = new Field[m_fieldCount];
+ for (uint64 fIndex = 0; fIndex < m_fieldCount; ++fIndex)
+ {
+ if (!*m_rBind[fIndex].is_null)
+ m_rows[uint32(m_rowPosition)][fIndex].SetByteValue( m_rBind[fIndex].buffer,
+ m_rBind[fIndex].buffer_length,
+ m_rBind[fIndex].buffer_type,
+ *m_rBind[fIndex].length );
+ else
+ switch (m_rBind[fIndex].buffer_type)
+ {
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_STRING:
+ case MYSQL_TYPE_VAR_STRING:
+ m_rows[uint32(m_rowPosition)][fIndex].SetByteValue( "",
+ m_rBind[fIndex].buffer_length,
+ m_rBind[fIndex].buffer_type,
+ *m_rBind[fIndex].length );
+ break;
+ default:
+ m_rows[uint32(m_rowPosition)][fIndex].SetByteValue( 0,
+ m_rBind[fIndex].buffer_length,
+ m_rBind[fIndex].buffer_type,
+ *m_rBind[fIndex].length );
+ }
+ }
+ m_rowPosition++;
+ }
+ m_rowPosition = 0;
+
+ /// All data is buffered, let go of mysql c api structures
+ CleanUp();
+}
+
+ResultSet::~ResultSet()
+{
+ CleanUp();
+}
+
+PreparedResultSet::~PreparedResultSet()
+{
+ for (uint32 i = 0; i < uint32(m_rowCount); ++i)
+ delete[] m_rows[i];
+}
+
+bool ResultSet::NextRow()
+{
+ MYSQL_ROW row;
+
+ if (!_result)
+ return false;
+
+ row = mysql_fetch_row(_result);
+ if (!row)
+ {
+ CleanUp();
+ return false;
+ }
+
+ for (uint32 i = 0; i < _fieldCount; i++)
+ _currentRow[i].SetStructuredValue(row[i], _fields[i].type);
+
+ return true;
+}
+
+bool PreparedResultSet::NextRow()
+{
+ /// Only updates the m_rowPosition so upper level code knows in which element
+ /// of the rows vector to look
+ if (++m_rowPosition >= m_rowCount)
+ return false;
+
+ return true;
+}
+
+bool PreparedResultSet::_NextRow()
+{
+ /// Only called in low-level code, namely the constructor
+ /// Will iterate over every row of data and buffer it
+ if (m_rowPosition >= m_rowCount)
+ return false;
+
+ int retval = mysql_stmt_fetch( m_stmt );
+
+ if (!retval || retval == MYSQL_DATA_TRUNCATED)
+ retval = true;
+
+ if (retval == MYSQL_NO_DATA)
+ retval = false;
+
+ return retval;
+}
+
+void ResultSet::CleanUp()
+{
+ if (_currentRow)
+ {
+ delete [] _currentRow;
+ _currentRow = NULL;
+ }
+
+ if (_result)
+ {
+ mysql_free_result(_result);
+ _result = NULL;
+ }
+}
+
+void PreparedResultSet::CleanUp()
+{
+ /// More of the in our code allocated sources are deallocated by the poorly documented mysql c api
+ if (m_res)
+ mysql_free_result(m_res);
+
+ FreeBindBuffer();
+ mysql_stmt_free_result(m_stmt);
+
+ delete[] m_rBind;
+}
+
+void PreparedResultSet::FreeBindBuffer()
+{
+ for (uint32 i = 0; i < m_fieldCount; ++i)
+ free (m_rBind[i].buffer);
+}
diff --git a/src/common/Database/QueryResult.h b/src/common/Database/QueryResult.h
new file mode 100644
index 0000000000..dd6cec32d0
--- /dev/null
+++ b/src/common/Database/QueryResult.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef QUERYRESULT_H
+#define QUERYRESULT_H
+
+#include "AutoPtr.h"
+#include <ace/Thread_Mutex.h>
+
+#include "Errors.h"
+#include "Field.h"
+
+#ifdef _WIN32
+ #include <winsock2.h>
+#endif
+#include <mysql.h>
+
+class ResultSet
+{
+ public:
+ ResultSet(MYSQL_RES* result, MYSQL_FIELD* fields, uint64 rowCount, uint32 fieldCount);
+ ~ResultSet();
+
+ bool NextRow();
+ uint64 GetRowCount() const { return _rowCount; }
+ uint32 GetFieldCount() const { return _fieldCount; }
+
+ Field* Fetch() const { return _currentRow; }
+ const Field & operator [] (uint32 index) const
+ {
+ ASSERT(index < _fieldCount);
+ return _currentRow[index];
+ }
+
+ protected:
+ uint64 _rowCount;
+ Field* _currentRow;
+ uint32 _fieldCount;
+
+ private:
+ void CleanUp();
+ MYSQL_RES* _result;
+ MYSQL_FIELD* _fields;
+};
+
+typedef Trinity::AutoPtr<ResultSet, ACE_Thread_Mutex> QueryResult;
+
+class PreparedResultSet
+{
+ public:
+ PreparedResultSet(MYSQL_STMT* stmt, MYSQL_RES* result, uint64 rowCount, uint32 fieldCount);
+ ~PreparedResultSet();
+
+ bool NextRow();
+ uint64 GetRowCount() const { return m_rowCount; }
+ uint32 GetFieldCount() const { return m_fieldCount; }
+
+ Field* Fetch() const
+ {
+ ASSERT(m_rowPosition < m_rowCount);
+ return m_rows[uint32(m_rowPosition)];
+ }
+
+ const Field & operator [] (uint32 index) const
+ {
+ ASSERT(m_rowPosition < m_rowCount);
+ ASSERT(index < m_fieldCount);
+ return m_rows[uint32(m_rowPosition)][index];
+ }
+
+ protected:
+ std::vector<Field*> m_rows;
+ uint64 m_rowCount;
+ uint64 m_rowPosition;
+ uint32 m_fieldCount;
+
+ private:
+ MYSQL_BIND* m_rBind;
+ MYSQL_STMT* m_stmt;
+ MYSQL_RES* m_res;
+
+ my_bool* m_isNull;
+ unsigned long* m_length;
+
+ void FreeBindBuffer();
+ void CleanUp();
+ bool _NextRow();
+
+};
+
+typedef Trinity::AutoPtr<PreparedResultSet, ACE_Thread_Mutex> PreparedQueryResult;
+
+#endif
+
diff --git a/src/common/Database/SQLOperation.h b/src/common/Database/SQLOperation.h
new file mode 100644
index 0000000000..72ce6fd6a0
--- /dev/null
+++ b/src/common/Database/SQLOperation.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _SQLOPERATION_H
+#define _SQLOPERATION_H
+
+#include <ace/Method_Request.h>
+#include <ace/Activation_Queue.h>
+
+#include "QueryResult.h"
+
+//- Forward declare (don't include header to prevent circular includes)
+class PreparedStatement;
+
+//- Union that holds element data
+union SQLElementUnion
+{
+ PreparedStatement* stmt;
+ const char* query;
+};
+
+//- Type specifier of our element data
+enum SQLElementDataType
+{
+ SQL_ELEMENT_RAW,
+ SQL_ELEMENT_PREPARED
+};
+
+//- The element
+struct SQLElementData
+{
+ SQLElementUnion element;
+ SQLElementDataType type;
+};
+
+//- For ambigious resultsets
+union SQLResultSetUnion
+{
+ PreparedResultSet* presult;
+ ResultSet* qresult;
+};
+
+class MySQLConnection;
+
+class SQLOperation : public ACE_Method_Request
+{
+ public:
+ SQLOperation(): m_conn(NULL) { }
+ virtual int call()
+ {
+ Execute();
+ return 0;
+ }
+ virtual bool Execute() = 0;
+ virtual void SetConnection(MySQLConnection* con) { m_conn = con; }
+
+ MySQLConnection* m_conn;
+};
+
+#endif
diff --git a/src/common/Database/Transaction.cpp b/src/common/Database/Transaction.cpp
new file mode 100644
index 0000000000..a2dfb9beea
--- /dev/null
+++ b/src/common/Database/Transaction.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "DatabaseEnv.h"
+#include "Transaction.h"
+
+//- Append a raw ad-hoc query to the transaction
+void Transaction::Append(const char* sql)
+{
+ SQLElementData data;
+ data.type = SQL_ELEMENT_RAW;
+ data.element.query = strdup(sql);
+ m_queries.push_back(data);
+}
+
+void Transaction::PAppend(const char* sql, ...)
+{
+ va_list ap;
+ char szQuery [MAX_QUERY_LEN];
+ va_start(ap, sql);
+ vsnprintf(szQuery, MAX_QUERY_LEN, sql, ap);
+ va_end(ap);
+
+ Append(szQuery);
+}
+
+//- Append a prepared statement to the transaction
+void Transaction::Append(PreparedStatement* stmt)
+{
+ SQLElementData data;
+ data.type = SQL_ELEMENT_PREPARED;
+ data.element.stmt = stmt;
+ m_queries.push_back(data);
+}
+
+void Transaction::Cleanup()
+{
+ // This might be called by explicit calls to Cleanup or by the auto-destructor
+ if (_cleanedUp)
+ return;
+
+ while (!m_queries.empty())
+ {
+ SQLElementData const &data = m_queries.front();
+ switch (data.type)
+ {
+ case SQL_ELEMENT_PREPARED:
+ delete data.element.stmt;
+ break;
+ case SQL_ELEMENT_RAW:
+ free((void*)(data.element.query));
+ break;
+ }
+
+ m_queries.pop_front();
+ }
+
+ _cleanedUp = true;
+}
+
+bool TransactionTask::Execute()
+{
+ if (m_conn->ExecuteTransaction(m_trans))
+ return true;
+
+ if (m_conn->GetLastError() == 1213)
+ {
+ uint8 loopBreaker = 5; // Handle MySQL Errno 1213 without extending deadlock to the core itself
+ for (uint8 i = 0; i < loopBreaker; ++i)
+ if (m_conn->ExecuteTransaction(m_trans))
+ return true;
+ }
+
+ // Clean up now.
+ m_trans->Cleanup();
+
+ return false;
+}
diff --git a/src/common/Database/Transaction.h b/src/common/Database/Transaction.h
new file mode 100644
index 0000000000..48afc65a4f
--- /dev/null
+++ b/src/common/Database/Transaction.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _TRANSACTION_H
+#define _TRANSACTION_H
+
+#include "SQLOperation.h"
+
+//- Forward declare (don't include header to prevent circular includes)
+class PreparedStatement;
+
+/*! Transactions, high level class. */
+class Transaction
+{
+ friend class TransactionTask;
+ friend class MySQLConnection;
+
+ template <typename T>
+ friend class DatabaseWorkerPool;
+
+ public:
+ Transaction() : _cleanedUp(false) { }
+ ~Transaction() { Cleanup(); }
+
+ void Append(PreparedStatement* statement);
+ void Append(const char* sql);
+ void PAppend(const char* sql, ...);
+
+ size_t GetSize() const { return m_queries.size(); }
+
+ protected:
+ void Cleanup();
+ std::list<SQLElementData> m_queries;
+
+ private:
+ bool _cleanedUp;
+
+};
+typedef Trinity::AutoPtr<Transaction, ACE_Thread_Mutex> SQLTransaction;
+
+/*! Low level class*/
+class TransactionTask : public SQLOperation
+{
+ template <class T> friend class DatabaseWorkerPool;
+ friend class DatabaseWorker;
+
+ public:
+ TransactionTask(SQLTransaction trans) : m_trans(trans) { } ;
+ ~TransactionTask(){ };
+
+ protected:
+ bool Execute();
+
+ SQLTransaction m_trans;
+};
+
+#endif
diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp
new file mode 100644
index 0000000000..3ed8dc5e0a
--- /dev/null
+++ b/src/common/Debugging/Errors.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Errors.h"
+
+#include <ace/Stack_Trace.h>
+#include <ace/OS_NS_unistd.h>
+#include <cstdlib>
+
+namespace Trinity {
+
+void Assert(char const* file, int line, char const* function, char const* message)
+{
+ ACE_Stack_Trace st;
+ fprintf(stderr, "\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n",
+ file, line, function, message, st.c_str());
+ *((volatile int*)NULL) = 0;
+ exit(1);
+}
+
+void Fatal(char const* file, int line, char const* function, char const* message)
+{
+ fprintf(stderr, "\n%s:%i in %s FATAL ERROR:\n %s\n",
+ file, line, function, message);
+ ACE_OS::sleep(10);
+ *((volatile int*)NULL) = 0;
+ exit(1);
+}
+
+void Error(char const* file, int line, char const* function, char const* message)
+{
+ fprintf(stderr, "\n%s:%i in %s ERROR:\n %s\n",
+ file, line, function, message);
+ *((volatile int*)NULL) = 0;
+ exit(1);
+}
+
+void Warning(char const* file, int line, char const* function, char const* message)
+{
+ fprintf(stderr, "\n%s:%i in %s WARNING:\n %s\n",
+ file, line, function, message);
+}
+
+} // namespace Trinity
diff --git a/src/common/Debugging/Errors.h b/src/common/Debugging/Errors.h
new file mode 100644
index 0000000000..81dc27c241
--- /dev/null
+++ b/src/common/Debugging/Errors.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef AZEROTHCORE_ERRORS_H
+#define AZEROTHCORE_ERRORS_H
+
+#include "Define.h"
+
+namespace Trinity
+{
+
+ DECLSPEC_NORETURN void Assert(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
+
+ DECLSPEC_NORETURN void Fatal(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
+
+ DECLSPEC_NORETURN void Error(char const* file, int line, char const* function, char const* message) ATTR_NORETURN;
+
+ void Warning(char const* file, int line, char const* function, char const* message);
+
+} // namespace Trinity
+
+#define WPAssert(cond) do { if (!(cond)) Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, #cond); } while (0)
+#define WPFatal(cond, msg) do { if (!(cond)) Trinity::Fatal(__FILE__, __LINE__, __FUNCTION__, (msg)); } while (0)
+#define WPError(cond, msg) do { if (!(cond)) Trinity::Error(__FILE__, __LINE__, __FUNCTION__, (msg)); } while (0)
+#define WPWarning(cond, msg) do { if (!(cond)) Trinity::Warning(__FILE__, __LINE__, __FUNCTION__, (msg)); } while (0)
+
+#define ASSERT WPAssert
+
+template <typename T> inline T* ASSERT_NOTNULL(T* pointer)
+{
+ ASSERT(pointer);
+ return pointer;
+}
+
+#endif
diff --git a/src/common/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp
new file mode 100644
index 0000000000..7bb12cf6c5
--- /dev/null
+++ b/src/common/Debugging/WheatyExceptionReport.cpp
@@ -0,0 +1,1203 @@
+//==========================================
+// Matt Pietrek
+// MSDN Magazine, 2002
+// FILE: WheatyExceptionReport.CPP
+//==========================================
+#include "CompilerDefs.h"
+
+#if PLATFORM == PLATFORM_WINDOWS && !defined(__MINGW32__)
+#define WIN32_LEAN_AND_MEAN
+#pragma warning(disable:4996)
+#pragma warning(disable:4312)
+#pragma warning(disable:4311)
+#include <windows.h>
+#include <tlhelp32.h>
+#include <stdio.h>
+#include <tchar.h>
+#define _NO_CVCONST_H
+#include <dbghelp.h>
+
+#include "WheatyExceptionReport.h"
+
+#include "Common.h"
+#include "SystemConfig.h"
+#include "revision.h"
+
+#define CrashFolder _T("Crashes")
+#pragma comment(linker, "/DEFAULTLIB:dbghelp.lib")
+
+inline LPTSTR ErrorMessage(DWORD dw)
+{
+ LPVOID lpMsgBuf;
+ DWORD formatResult = FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ dw,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf,
+ 0, NULL);
+ if (formatResult != 0)
+ return (LPTSTR)lpMsgBuf;
+ else
+ {
+ LPTSTR msgBuf = (LPTSTR)LocalAlloc(LPTR, 30);
+ sprintf(msgBuf, "Unknown error: %u", dw);
+ return msgBuf;
+ }
+
+}
+
+//============================== Global Variables =============================
+
+//
+// Declare the static variables of the WheatyExceptionReport class
+//
+TCHAR WheatyExceptionReport::m_szLogFileName[MAX_PATH];
+TCHAR WheatyExceptionReport::m_szDumpFileName[MAX_PATH];
+LPTOP_LEVEL_EXCEPTION_FILTER WheatyExceptionReport::m_previousFilter;
+HANDLE WheatyExceptionReport::m_hReportFile;
+HANDLE WheatyExceptionReport::m_hDumpFile;
+HANDLE WheatyExceptionReport::m_hProcess;
+SymbolPairs WheatyExceptionReport::symbols;
+
+// Declare global instance of class
+WheatyExceptionReport g_WheatyExceptionReport;
+
+//============================== Class Methods =============================
+
+WheatyExceptionReport::WheatyExceptionReport() // Constructor
+{
+ // Install the unhandled exception filter function
+ m_previousFilter = SetUnhandledExceptionFilter(WheatyUnhandledExceptionFilter);
+ m_hProcess = GetCurrentProcess();
+ if (!IsDebuggerPresent())
+ {
+ _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
+ _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+ _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
+ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+ }
+}
+
+//============
+// Destructor
+//============
+WheatyExceptionReport::~WheatyExceptionReport()
+{
+ if (m_previousFilter)
+ SetUnhandledExceptionFilter(m_previousFilter);
+ ClearSymbols();
+}
+
+//===========================================================
+// Entry point where control comes on an unhandled exception
+//===========================================================
+LONG WINAPI WheatyExceptionReport::WheatyUnhandledExceptionFilter(
+PEXCEPTION_POINTERS pExceptionInfo)
+{
+ TCHAR module_folder_name[MAX_PATH];
+ GetModuleFileName(0, module_folder_name, MAX_PATH);
+ TCHAR* pos = _tcsrchr(module_folder_name, '\\');
+ if (!pos)
+ return 0;
+ pos[0] = '\0';
+ ++pos;
+
+ TCHAR crash_folder_path[MAX_PATH];
+ sprintf(crash_folder_path, "%s\\%s", module_folder_name, CrashFolder);
+ if (!CreateDirectory(crash_folder_path, NULL))
+ {
+ if (GetLastError() != ERROR_ALREADY_EXISTS)
+ return 0;
+ }
+
+ SYSTEMTIME systime;
+ GetLocalTime(&systime);
+ sprintf(m_szDumpFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].dmp",
+ crash_folder_path, _HASH, pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond);
+
+ sprintf(m_szLogFileName, "%s\\%s_%s_[%u-%u_%u-%u-%u].txt",
+ crash_folder_path, _HASH, pos, systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond);
+
+ m_hDumpFile = CreateFile(m_szDumpFileName,
+ GENERIC_WRITE,
+ 0,
+ 0,
+ OPEN_ALWAYS,
+ FILE_FLAG_WRITE_THROUGH,
+ 0);
+
+ m_hReportFile = CreateFile(m_szLogFileName,
+ GENERIC_WRITE,
+ 0,
+ 0,
+ OPEN_ALWAYS,
+ FILE_FLAG_WRITE_THROUGH,
+ 0);
+
+ if (m_hDumpFile)
+ {
+ MINIDUMP_EXCEPTION_INFORMATION info;
+ info.ClientPointers = FALSE;
+ info.ExceptionPointers = pExceptionInfo;
+ info.ThreadId = GetCurrentThreadId();
+
+ MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
+ m_hDumpFile, MiniDumpWithIndirectlyReferencedMemory, &info, 0, 0);
+
+ CloseHandle(m_hDumpFile);
+ }
+
+ if (m_hReportFile)
+ {
+ SetFilePointer(m_hReportFile, 0, 0, FILE_END);
+
+ GenerateExceptionReport(pExceptionInfo);
+
+ CloseHandle(m_hReportFile);
+ m_hReportFile = 0;
+ }
+
+ if (m_previousFilter)
+ return m_previousFilter(pExceptionInfo);
+ else
+ return EXCEPTION_EXECUTE_HANDLER/*EXCEPTION_CONTINUE_SEARCH*/;
+}
+
+BOOL WheatyExceptionReport::_GetProcessorName(TCHAR* sProcessorName, DWORD maxcount)
+{
+ if (!sProcessorName)
+ return FALSE;
+
+ HKEY hKey;
+ LONG lRet;
+ lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"),
+ 0, KEY_QUERY_VALUE, &hKey);
+ if (lRet != ERROR_SUCCESS)
+ return FALSE;
+ TCHAR szTmp[2048];
+ DWORD cntBytes = sizeof(szTmp);
+ lRet = ::RegQueryValueEx(hKey, _T("ProcessorNameString"), NULL, NULL,
+ (LPBYTE)szTmp, &cntBytes);
+ if (lRet != ERROR_SUCCESS)
+ return FALSE;
+ ::RegCloseKey(hKey);
+ sProcessorName[0] = '\0';
+ // Skip spaces
+ TCHAR* psz = szTmp;
+ while (iswspace(*psz))
+ ++psz;
+ _tcsncpy(sProcessorName, psz, maxcount);
+ return TRUE;
+}
+
+BOOL WheatyExceptionReport::_GetWindowsVersion(TCHAR* szVersion, DWORD cntMax)
+{
+ // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
+ // If that fails, try using the OSVERSIONINFO structure.
+ OSVERSIONINFOEX osvi = { 0 };
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ BOOL bOsVersionInfoEx;
+ bOsVersionInfoEx = ::GetVersionEx((LPOSVERSIONINFO)(&osvi));
+ if (!bOsVersionInfoEx)
+ {
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if (!::GetVersionEx((OSVERSIONINFO*)&osvi))
+ return FALSE;
+ }
+ *szVersion = _T('\0');
+ TCHAR wszTmp[128];
+ switch (osvi.dwPlatformId)
+ {
+ // Windows NT product family.
+ case VER_PLATFORM_WIN32_NT:
+ {
+ #if WINVER < 0x0500
+ BYTE suiteMask = osvi.wReserved[0];
+ BYTE productType = osvi.wReserved[1];
+ #else
+ WORD suiteMask = osvi.wSuiteMask;
+ BYTE productType = osvi.wProductType;
+ #endif // WINVER < 0x0500
+
+ // Test for the specific product family.
+ if (osvi.dwMajorVersion == 6)
+ {
+ if (productType == VER_NT_WORKSTATION)
+ {
+ if (osvi.dwMinorVersion == 2)
+ _tcsncat(szVersion, _T("Windows 8 "), cntMax);
+ else if (osvi.dwMinorVersion == 1)
+ _tcsncat(szVersion, _T("Windows 7 "), cntMax);
+ else
+ _tcsncat(szVersion, _T("Windows Vista "), cntMax);
+ }
+ else if (osvi.dwMinorVersion == 2)
+ _tcsncat(szVersion, _T("Windows Server 2012 "), cntMax);
+ else if (osvi.dwMinorVersion == 1)
+ _tcsncat(szVersion, _T("Windows Server 2008 R2 "), cntMax);
+ else
+ _tcsncat(szVersion, _T("Windows Server 2008 "), cntMax);
+ }
+ else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
+ _tcsncat(szVersion, _T("Microsoft Windows Server 2003 "), cntMax);
+ else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
+ _tcsncat(szVersion, _T("Microsoft Windows XP "), cntMax);
+ else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
+ _tcsncat(szVersion, _T("Microsoft Windows 2000 "), cntMax);
+ else if (osvi.dwMajorVersion <= 4)
+ _tcsncat(szVersion, _T("Microsoft Windows NT "), cntMax);
+
+ // Test for specific product on Windows NT 4.0 SP6 and later.
+ if (bOsVersionInfoEx)
+ {
+ // Test for the workstation type.
+ if (productType == VER_NT_WORKSTATION)
+ {
+ if (osvi.dwMajorVersion == 4)
+ _tcsncat(szVersion, _T("Workstation 4.0 "), cntMax);
+ else if (suiteMask & VER_SUITE_PERSONAL)
+ _tcsncat(szVersion, _T("Home Edition "), cntMax);
+ else if (suiteMask & VER_SUITE_EMBEDDEDNT)
+ _tcsncat(szVersion, _T("Embedded "), cntMax);
+ else
+ _tcsncat(szVersion, _T("Professional "), cntMax);
+ }
+ // Test for the server type.
+ else if (productType == VER_NT_SERVER)
+ {
+ if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
+ {
+ if (suiteMask & VER_SUITE_DATACENTER)
+ _tcsncat(szVersion, _T("Datacenter Edition "), cntMax);
+ else if (suiteMask & VER_SUITE_ENTERPRISE)
+ _tcsncat(szVersion, _T("Enterprise Edition "), cntMax);
+ else if (suiteMask == VER_SUITE_BLADE)
+ _tcsncat(szVersion, _T("Web Edition "), cntMax);
+ else
+ _tcsncat(szVersion, _T("Standard Edition "), cntMax);
+ }
+ else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
+ {
+ if (suiteMask & VER_SUITE_DATACENTER)
+ _tcsncat(szVersion, _T("Datacenter Server "), cntMax);
+ else if (suiteMask & VER_SUITE_ENTERPRISE)
+ _tcsncat(szVersion, _T("Advanced Server "), cntMax);
+ else
+ _tcsncat(szVersion, _T("Server "), cntMax);
+ }
+ else // Windows NT 4.0
+ {
+ if (suiteMask & VER_SUITE_ENTERPRISE)
+ _tcsncat(szVersion, _T("Server 4.0, Enterprise Edition "), cntMax);
+ else
+ _tcsncat(szVersion, _T("Server 4.0 "), cntMax);
+ }
+ }
+ }
+
+ // Display service pack (if any) and build number.
+ if (osvi.dwMajorVersion == 4 && _tcsicmp(osvi.szCSDVersion, _T("Service Pack 6")) == 0)
+ {
+ HKEY hKey;
+ LONG lRet;
+
+ // Test for SP6 versus SP6a.
+ lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009"), 0, KEY_QUERY_VALUE, &hKey);
+ if (lRet == ERROR_SUCCESS)
+ {
+ _stprintf(wszTmp, _T("Service Pack 6a (Version %d.%d, Build %d)"),
+ osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
+ _tcsncat(szVersion, wszTmp, cntMax);
+ }
+ else // Windows NT 4.0 prior to SP6a
+ {
+ _stprintf(wszTmp, _T("%s (Version %d.%d, Build %d)"),
+ osvi.szCSDVersion, osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
+ _tcsncat(szVersion, wszTmp, cntMax);
+ }
+ ::RegCloseKey(hKey);
+ }
+ else // Windows NT 3.51 and earlier or Windows 2000 and later
+ {
+ if (!_tcslen(osvi.szCSDVersion))
+ _stprintf(wszTmp, _T("(Version %d.%d, Build %d)"),
+ osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
+ else
+ _stprintf(wszTmp, _T("%s (Version %d.%d, Build %d)"),
+ osvi.szCSDVersion, osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
+ _tcsncat(szVersion, wszTmp, cntMax);
+ }
+ break;
+ }
+ default:
+ _stprintf(wszTmp, _T("%s (Version %d.%d, Build %d)"),
+ osvi.szCSDVersion, osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
+ _tcsncat(szVersion, wszTmp, cntMax);
+ break;
+ }
+
+ return TRUE;
+}
+
+void WheatyExceptionReport::PrintSystemInfo()
+{
+ SYSTEM_INFO SystemInfo;
+ ::GetSystemInfo(&SystemInfo);
+
+ MEMORYSTATUS MemoryStatus;
+ MemoryStatus.dwLength = sizeof (MEMORYSTATUS);
+ ::GlobalMemoryStatus(&MemoryStatus);
+ TCHAR sString[1024];
+ _tprintf(_T("//=====================================================\r\n"));
+ if (_GetProcessorName(sString, countof(sString)))
+ _tprintf(_T("*** Hardware ***\r\nProcessor: %s\r\nNumber Of Processors: %d\r\nPhysical Memory: %d KB (Available: %d KB)\r\nCommit Charge Limit: %d KB\r\n"),
+ sString, SystemInfo.dwNumberOfProcessors, MemoryStatus.dwTotalPhys/0x400, MemoryStatus.dwAvailPhys/0x400, MemoryStatus.dwTotalPageFile/0x400);
+ else
+ _tprintf(_T("*** Hardware ***\r\nProcessor: <unknown>\r\nNumber Of Processors: %d\r\nPhysical Memory: %d KB (Available: %d KB)\r\nCommit Charge Limit: %d KB\r\n"),
+ SystemInfo.dwNumberOfProcessors, MemoryStatus.dwTotalPhys/0x400, MemoryStatus.dwAvailPhys/0x400, MemoryStatus.dwTotalPageFile/0x400);
+
+ if (_GetWindowsVersion(sString, countof(sString)))
+ _tprintf(_T("\r\n*** Operation System ***\r\n%s\r\n"), sString);
+ else
+ _tprintf(_T("\r\n*** Operation System:\r\n<unknown>\r\n"));
+}
+
+//===========================================================================
+void WheatyExceptionReport::printTracesForAllThreads(bool bWriteVariables)
+{
+ THREADENTRY32 te32;
+
+ DWORD dwOwnerPID = GetCurrentProcessId();
+ m_hProcess = GetCurrentProcess();
+ // Take a snapshot of all running threads
+ HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
+ if (hThreadSnap == INVALID_HANDLE_VALUE)
+ return;
+
+ // Fill in the size of the structure before using it.
+ te32.dwSize = sizeof(THREADENTRY32);
+
+ // Retrieve information about the first thread,
+ // and exit if unsuccessful
+ if (!Thread32First(hThreadSnap, &te32))
+ {
+ CloseHandle(hThreadSnap); // Must clean up the
+ // snapshot object!
+ return;
+ }
+
+ // Now walk the thread list of the system,
+ // and display information about each thread
+ // associated with the specified process
+ do
+ {
+ if (te32.th32OwnerProcessID == dwOwnerPID)
+ {
+ CONTEXT context;
+ context.ContextFlags = 0xffffffff;
+ HANDLE threadHandle = OpenThread(THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, false, te32.th32ThreadID);
+ if (threadHandle)
+ {
+ if (GetThreadContext(threadHandle, &context))
+ WriteStackDetails(&context, bWriteVariables, threadHandle);
+ CloseHandle(threadHandle);
+ }
+ }
+ } while (Thread32Next(hThreadSnap, &te32));
+
+// Don't forget to clean up the snapshot object.
+ CloseHandle(hThreadSnap);
+}
+
+//===========================================================================
+// Open the report file, and write the desired information to it. Called by
+// WheatyUnhandledExceptionFilter
+//===========================================================================
+void WheatyExceptionReport::GenerateExceptionReport(
+PEXCEPTION_POINTERS pExceptionInfo)
+{
+ SYSTEMTIME systime;
+ GetLocalTime(&systime);
+
+ // Start out with a banner
+ _tprintf(_T("Revision: %s\r\n"), _FULLVERSION);
+ _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute);
+ PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord;
+
+ PrintSystemInfo();
+ // First print information about the type of fault
+ _tprintf(_T("\r\n//=====================================================\r\n"));
+ _tprintf(_T("Exception code: %08X %s\r\n"),
+ pExceptionRecord->ExceptionCode,
+ GetExceptionString(pExceptionRecord->ExceptionCode));
+
+ // Now print information about where the fault occured
+ TCHAR szFaultingModule[MAX_PATH];
+ DWORD section;
+ DWORD_PTR offset;
+ GetLogicalAddress(pExceptionRecord->ExceptionAddress,
+ szFaultingModule,
+ sizeof(szFaultingModule),
+ section, offset);
+
+#ifdef _M_IX86
+ _tprintf(_T("Fault address: %08X %02X:%08X %s\r\n"),
+ pExceptionRecord->ExceptionAddress,
+ section, offset, szFaultingModule);
+#endif
+#ifdef _M_X64
+ _tprintf(_T("Fault address: %016I64X %02X:%016I64X %s\r\n"),
+ pExceptionRecord->ExceptionAddress,
+ section, offset, szFaultingModule);
+#endif
+
+ PCONTEXT pCtx = pExceptionInfo->ContextRecord;
+
+ // Show the registers
+ #ifdef _M_IX86 // X86 Only!
+ _tprintf(_T("\r\nRegisters:\r\n"));
+
+ _tprintf(_T("EAX:%08X\r\nEBX:%08X\r\nECX:%08X\r\nEDX:%08X\r\nESI:%08X\r\nEDI:%08X\r\n")
+ , pCtx->Eax, pCtx->Ebx, pCtx->Ecx, pCtx->Edx,
+ pCtx->Esi, pCtx->Edi);
+
+ _tprintf(_T("CS:EIP:%04X:%08X\r\n"), pCtx->SegCs, pCtx->Eip);
+ _tprintf(_T("SS:ESP:%04X:%08X EBP:%08X\r\n"),
+ pCtx->SegSs, pCtx->Esp, pCtx->Ebp);
+ _tprintf(_T("DS:%04X ES:%04X FS:%04X GS:%04X\r\n"),
+ pCtx->SegDs, pCtx->SegEs, pCtx->SegFs, pCtx->SegGs);
+ _tprintf(_T("Flags:%08X\r\n"), pCtx->EFlags);
+ #endif
+
+ #ifdef _M_X64
+ _tprintf(_T("\r\nRegisters:\r\n"));
+ _tprintf(_T("RAX:%016I64X\r\nRBX:%016I64X\r\nRCX:%016I64X\r\nRDX:%016I64X\r\nRSI:%016I64X\r\nRDI:%016I64X\r\n")
+ _T("R8: %016I64X\r\nR9: %016I64X\r\nR10:%016I64X\r\nR11:%016I64X\r\nR12:%016I64X\r\nR13:%016I64X\r\nR14:%016I64X\r\nR15:%016I64X\r\n")
+ , pCtx->Rax, pCtx->Rbx, pCtx->Rcx, pCtx->Rdx,
+ pCtx->Rsi, pCtx->Rdi, pCtx->R9, pCtx->R10, pCtx->R11, pCtx->R12, pCtx->R13, pCtx->R14, pCtx->R15);
+ _tprintf(_T("CS:RIP:%04X:%016I64X\r\n"), pCtx->SegCs, pCtx->Rip);
+ _tprintf(_T("SS:RSP:%04X:%016X RBP:%08X\r\n"),
+ pCtx->SegSs, pCtx->Rsp, pCtx->Rbp);
+ _tprintf(_T("DS:%04X ES:%04X FS:%04X GS:%04X\r\n"),
+ pCtx->SegDs, pCtx->SegEs, pCtx->SegFs, pCtx->SegGs);
+ _tprintf(_T("Flags:%08X\r\n"), pCtx->EFlags);
+ #endif
+
+ SymSetOptions(SYMOPT_DEFERRED_LOADS);
+
+ // Initialize DbgHelp
+ if (!SymInitialize(GetCurrentProcess(), 0, TRUE))
+ {
+ _tprintf(_T("\n\rCRITICAL ERROR.\n\r Couldn't initialize the symbol handler for process.\n\rError [%s].\n\r\n\r"),
+ ErrorMessage(GetLastError()));
+ }
+
+ CONTEXT trashableContext = *pCtx;
+
+ WriteStackDetails(&trashableContext, false, NULL);
+ printTracesForAllThreads(false);
+
+// #ifdef _M_IX86 // X86 Only!
+
+ _tprintf(_T("========================\r\n"));
+ _tprintf(_T("Local Variables And Parameters\r\n"));
+
+ trashableContext = *pCtx;
+ WriteStackDetails(&trashableContext, true, NULL);
+ printTracesForAllThreads(true);
+
+ /*_tprintf(_T("========================\r\n"));
+ _tprintf(_T("Global Variables\r\n"));
+
+ SymEnumSymbols(GetCurrentProcess(),
+ (UINT_PTR)GetModuleHandle(szFaultingModule),
+ 0, EnumerateSymbolsCallback, 0);*/
+ // #endif // X86 Only!
+
+ SymCleanup(GetCurrentProcess());
+
+ _tprintf(_T("\r\n"));
+}
+
+//======================================================================
+// Given an exception code, returns a pointer to a static string with a
+// description of the exception
+//======================================================================
+LPTSTR WheatyExceptionReport::GetExceptionString(DWORD dwCode)
+{
+ #define EXCEPTION(x) case EXCEPTION_##x: return _T(#x);
+
+ switch (dwCode)
+ {
+ EXCEPTION(ACCESS_VIOLATION)
+ EXCEPTION(DATATYPE_MISALIGNMENT)
+ EXCEPTION(BREAKPOINT)
+ EXCEPTION(SINGLE_STEP)
+ EXCEPTION(ARRAY_BOUNDS_EXCEEDED)
+ EXCEPTION(FLT_DENORMAL_OPERAND)
+ EXCEPTION(FLT_DIVIDE_BY_ZERO)
+ EXCEPTION(FLT_INEXACT_RESULT)
+ EXCEPTION(FLT_INVALID_OPERATION)
+ EXCEPTION(FLT_OVERFLOW)
+ EXCEPTION(FLT_STACK_CHECK)
+ EXCEPTION(FLT_UNDERFLOW)
+ EXCEPTION(INT_DIVIDE_BY_ZERO)
+ EXCEPTION(INT_OVERFLOW)
+ EXCEPTION(PRIV_INSTRUCTION)
+ EXCEPTION(IN_PAGE_ERROR)
+ EXCEPTION(ILLEGAL_INSTRUCTION)
+ EXCEPTION(NONCONTINUABLE_EXCEPTION)
+ EXCEPTION(STACK_OVERFLOW)
+ EXCEPTION(INVALID_DISPOSITION)
+ EXCEPTION(GUARD_PAGE)
+ EXCEPTION(INVALID_HANDLE)
+ }
+
+ // If not one of the "known" exceptions, try to get the string
+ // from NTDLL.DLL's message table.
+
+ static TCHAR szBuffer[512] = { 0 };
+
+ FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE,
+ GetModuleHandle(_T("NTDLL.DLL")),
+ dwCode, 0, szBuffer, sizeof(szBuffer), 0);
+
+ return szBuffer;
+}
+
+//=============================================================================
+// Given a linear address, locates the module, section, and offset containing
+// that address.
+//
+// Note: the szModule paramater buffer is an output buffer of length specified
+// by the len parameter (in characters!)
+//=============================================================================
+BOOL WheatyExceptionReport::GetLogicalAddress(
+PVOID addr, PTSTR szModule, DWORD len, DWORD& section, DWORD_PTR& offset)
+{
+ MEMORY_BASIC_INFORMATION mbi;
+
+ if (!VirtualQuery(addr, &mbi, sizeof(mbi)))
+ return FALSE;
+
+ DWORD_PTR hMod = (DWORD_PTR)mbi.AllocationBase;
+
+ if (!hMod)
+ return FALSE;
+
+ if (!GetModuleFileName((HMODULE)hMod, szModule, len))
+ return FALSE;
+
+ // Point to the DOS header in memory
+ PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER)hMod;
+
+ // From the DOS header, find the NT (PE) header
+ PIMAGE_NT_HEADERS pNtHdr = (PIMAGE_NT_HEADERS)(hMod + DWORD_PTR(pDosHdr->e_lfanew));
+
+ PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pNtHdr);
+
+ DWORD_PTR rva = (DWORD_PTR)addr - hMod; // RVA is offset from module load address
+
+ // Iterate through the section table, looking for the one that encompasses
+ // the linear address.
+ for (unsigned i = 0;
+ i < pNtHdr->FileHeader.NumberOfSections;
+ i++, pSection++)
+ {
+ DWORD_PTR sectionStart = pSection->VirtualAddress;
+ DWORD_PTR sectionEnd = sectionStart
+ + DWORD_PTR(std::max(pSection->SizeOfRawData, pSection->Misc.VirtualSize));
+
+ // Is the address in this section???
+ if ((rva >= sectionStart) && (rva <= sectionEnd))
+ {
+ // Yes, address is in the section. Calculate section and offset,
+ // and store in the "section" & "offset" params, which were
+ // passed by reference.
+ section = i+1;
+ offset = rva - sectionStart;
+ return TRUE;
+ }
+ }
+
+ return FALSE; // Should never get here!
+}
+
+// It contains SYMBOL_INFO structure plus additional
+// space for the name of the symbol
+struct CSymbolInfoPackage : public SYMBOL_INFO_PACKAGE
+{
+ CSymbolInfoPackage()
+ {
+ si.SizeOfStruct = sizeof(SYMBOL_INFO);
+ si.MaxNameLen = sizeof(name);
+ }
+};
+
+//============================================================
+// Walks the stack, and writes the results to the report file
+//============================================================
+void WheatyExceptionReport::WriteStackDetails(
+PCONTEXT pContext,
+bool bWriteVariables, HANDLE pThreadHandle) // true if local/params should be output
+{
+ _tprintf(_T("\r\nCall stack:\r\n"));
+
+ _tprintf(_T("Address Frame Function SourceFile\r\n"));
+
+ DWORD dwMachineType = 0;
+ // Could use SymSetOptions here to add the SYMOPT_DEFERRED_LOADS flag
+
+ STACKFRAME64 sf;
+ memset(&sf, 0, sizeof(sf));
+
+ #ifdef _M_IX86
+ // Initialize the STACKFRAME structure for the first call. This is only
+ // necessary for Intel CPUs, and isn't mentioned in the documentation.
+ sf.AddrPC.Offset = pContext->Eip;
+ sf.AddrPC.Mode = AddrModeFlat;
+ sf.AddrStack.Offset = pContext->Esp;
+ sf.AddrStack.Mode = AddrModeFlat;
+ sf.AddrFrame.Offset = pContext->Ebp;
+ sf.AddrFrame.Mode = AddrModeFlat;
+
+ dwMachineType = IMAGE_FILE_MACHINE_I386;
+ #endif
+
+#ifdef _M_X64
+ sf.AddrPC.Offset = pContext->Rip;
+ sf.AddrPC.Mode = AddrModeFlat;
+ sf.AddrStack.Offset = pContext->Rsp;
+ sf.AddrStack.Mode = AddrModeFlat;
+ sf.AddrFrame.Offset = pContext->Rbp;
+ sf.AddrFrame.Mode = AddrModeFlat;
+ dwMachineType = IMAGE_FILE_MACHINE_AMD64;
+#endif
+
+ while (1)
+ {
+ // Get the next stack frame
+ if (! StackWalk64(dwMachineType,
+ m_hProcess,
+ pThreadHandle != NULL ? pThreadHandle : GetCurrentThread(),
+ &sf,
+ pContext,
+ 0,
+ SymFunctionTableAccess64,
+ SymGetModuleBase64,
+ 0))
+ break;
+ if (0 == sf.AddrFrame.Offset) // Basic sanity check to make sure
+ break; // the frame is OK. Bail if not.
+#ifdef _M_IX86
+ _tprintf(_T("%08X %08X "), sf.AddrPC.Offset, sf.AddrFrame.Offset);
+#endif
+#ifdef _M_X64
+ _tprintf(_T("%016I64X %016I64X "), sf.AddrPC.Offset, sf.AddrFrame.Offset);
+#endif
+
+ DWORD64 symDisplacement = 0; // Displacement of the input address,
+ // relative to the start of the symbol
+
+ // Get the name of the function for this stack frame entry
+ CSymbolInfoPackage sip;
+ if (SymFromAddr(
+ m_hProcess, // Process handle of the current process
+ sf.AddrPC.Offset, // Symbol address
+ &symDisplacement, // Address of the variable that will receive the displacement
+ &sip.si)) // Address of the SYMBOL_INFO structure (inside "sip" object)
+ {
+ _tprintf(_T("%hs+%I64X"), sip.si.Name, symDisplacement);
+
+ }
+ else // No symbol found. Print out the logical address instead.
+ {
+ TCHAR szModule[MAX_PATH] = _T("");
+ DWORD section = 0;
+ DWORD_PTR offset = 0;
+
+ GetLogicalAddress((PVOID)sf.AddrPC.Offset,
+ szModule, sizeof(szModule), section, offset);
+#ifdef _M_IX86
+ _tprintf(_T("%04X:%08X %s"), section, offset, szModule);
+#endif
+#ifdef _M_X64
+ _tprintf(_T("%04X:%016I64X %s"), section, offset, szModule);
+#endif
+ }
+
+ // Get the source line for this stack frame entry
+ IMAGEHLP_LINE64 lineInfo = { sizeof(IMAGEHLP_LINE64) };
+ DWORD dwLineDisplacement;
+ if (SymGetLineFromAddr64(m_hProcess, sf.AddrPC.Offset,
+ &dwLineDisplacement, &lineInfo))
+ {
+ _tprintf(_T(" %s line %u"), lineInfo.FileName, lineInfo.LineNumber);
+ }
+
+ _tprintf(_T("\r\n"));
+
+ // Write out the variables, if desired
+ if (bWriteVariables)
+ {
+ // Use SymSetContext to get just the locals/params for this frame
+ IMAGEHLP_STACK_FRAME imagehlpStackFrame;
+ imagehlpStackFrame.InstructionOffset = sf.AddrPC.Offset;
+ SymSetContext(m_hProcess, &imagehlpStackFrame, 0);
+
+ // Enumerate the locals/parameters
+ SymEnumSymbols(m_hProcess, 0, 0, EnumerateSymbolsCallback, &sf);
+
+ _tprintf(_T("\r\n"));
+ }
+ }
+
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// The function invoked by SymEnumSymbols
+//////////////////////////////////////////////////////////////////////////////
+
+BOOL CALLBACK
+WheatyExceptionReport::EnumerateSymbolsCallback(
+PSYMBOL_INFO pSymInfo,
+ULONG /*SymbolSize*/,
+PVOID UserContext)
+{
+
+ char szBuffer[1024 * 64];
+
+ __try
+ {
+ ClearSymbols();
+ if (FormatSymbolValue(pSymInfo, (STACKFRAME64*)UserContext,
+ szBuffer, sizeof(szBuffer)))
+ _tprintf(_T("\t%s\r\n"), szBuffer);
+ }
+ __except (EXCEPTION_EXECUTE_HANDLER)
+ {
+ _tprintf(_T("punting on symbol %s\r\n"), pSymInfo->Name);
+ }
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Given a SYMBOL_INFO representing a particular variable, displays its
+// contents. If it's a user defined type, display the members and their
+// values.
+//////////////////////////////////////////////////////////////////////////////
+bool WheatyExceptionReport::FormatSymbolValue(
+PSYMBOL_INFO pSym,
+STACKFRAME64 * sf,
+char * pszBuffer,
+unsigned /*cbBuffer*/)
+{
+ char * pszCurrBuffer = pszBuffer;
+
+ // Indicate if the variable is a local or parameter
+ if (pSym->Flags & IMAGEHLP_SYMBOL_INFO_PARAMETER)
+ pszCurrBuffer += sprintf(pszCurrBuffer, "Parameter ");
+ else if (pSym->Flags & IMAGEHLP_SYMBOL_INFO_LOCAL)
+ pszCurrBuffer += sprintf(pszCurrBuffer, "Local ");
+
+ // If it's a function, don't do anything.
+ if (pSym->Tag == SymTagFunction) // SymTagFunction from CVCONST.H from the DIA SDK
+ return false;
+
+ DWORD_PTR pVariable = 0; // Will point to the variable's data in memory
+
+ if (pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE)
+ {
+ // if (pSym->Register == 8) // EBP is the value 8 (in DBGHELP 5.1)
+ { // This may change!!!
+#ifdef _M_IX86
+ pVariable = sf->AddrFrame.Offset;
+#elif _M_X64
+ pVariable = sf->AddrStack.Offset;
+#endif
+ pVariable += (DWORD_PTR)pSym->Address;
+ }
+ // else
+ // return false;
+ }
+ else if (pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGISTER)
+ {
+ return false; // Don't try to report register variable
+ }
+ else
+ {
+ pVariable = (DWORD_PTR)pSym->Address; // It must be a global variable
+ }
+
+ // Determine if the variable is a user defined type (UDT). IF so, bHandled
+ // will return true.
+ bool bHandled;
+ pszCurrBuffer = DumpTypeIndex(pszCurrBuffer, pSym->ModBase, pSym->TypeIndex,
+ 0, pVariable, bHandled, pSym->Name, "");
+
+ if (!bHandled)
+ {
+ // The symbol wasn't a UDT, so do basic, stupid formatting of the
+ // variable. Based on the size, we're assuming it's a char, WORD, or
+ // DWORD.
+ BasicType basicType = GetBasicType(pSym->TypeIndex, pSym->ModBase);
+ pszCurrBuffer += sprintf(pszCurrBuffer, rgBaseType[basicType]);
+
+ // Emit the variable name
+ pszCurrBuffer += sprintf(pszCurrBuffer, "\'%s\'", pSym->Name);
+
+ pszCurrBuffer = FormatOutputValue(pszCurrBuffer, basicType, pSym->Size,
+ (PVOID)pVariable);
+ }
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// If it's a user defined type (UDT), recurse through its members until we're
+// at fundamental types. When he hit fundamental types, return
+// bHandled = false, so that FormatSymbolValue() will format them.
+//////////////////////////////////////////////////////////////////////////////
+char * WheatyExceptionReport::DumpTypeIndex(
+char * pszCurrBuffer,
+DWORD64 modBase,
+DWORD dwTypeIndex,
+unsigned nestingLevel,
+DWORD_PTR offset,
+bool & bHandled,
+char* Name,
+char* suffix)
+{
+ bHandled = false;
+
+ if (!StoreSymbol(dwTypeIndex, offset))
+ return pszCurrBuffer;
+
+ DWORD typeTag;
+ if (!SymGetTypeInfo(m_hProcess, modBase, dwTypeIndex, TI_GET_SYMTAG, &typeTag))
+ return pszCurrBuffer;
+
+ // Get the name of the symbol. This will either be a Type name (if a UDT),
+ // or the structure member name.
+ WCHAR * pwszTypeName;
+ if (SymGetTypeInfo(m_hProcess, modBase, dwTypeIndex, TI_GET_SYMNAME,
+ &pwszTypeName))
+ {
+ // handle special cases
+ if (wcscmp(pwszTypeName, L"std::basic_string<char,std::char_traits<char>,std::allocator<char> >") == 0)
+ {
+ LocalFree(pwszTypeName);
+ pszCurrBuffer += sprintf(pszCurrBuffer, " %s", "std::string");
+ pszCurrBuffer = FormatOutputValue(pszCurrBuffer, btStdString, 0, (PVOID)offset);
+ pszCurrBuffer += sprintf(pszCurrBuffer, "\r\n");
+ bHandled = true;
+ return pszCurrBuffer;
+ }
+
+ pszCurrBuffer += sprintf(pszCurrBuffer, " %ls", pwszTypeName);
+ LocalFree(pwszTypeName);
+ }
+
+ if (strlen(suffix) > 0)
+ pszCurrBuffer += sprintf(pszCurrBuffer, "%s", suffix);
+
+ DWORD innerTypeID;
+ switch (typeTag)
+ {
+ case SymTagPointerType:
+ if (SymGetTypeInfo(m_hProcess, modBase, dwTypeIndex, TI_GET_TYPEID, &innerTypeID))
+ {
+#define MAX_NESTING_LEVEL 5
+ if (nestingLevel >= MAX_NESTING_LEVEL)
+ break;
+
+ pszCurrBuffer += sprintf(pszCurrBuffer, " %s", Name);
+ BOOL isReference;
+ SymGetTypeInfo(m_hProcess, modBase, dwTypeIndex, TI_GET_IS_REFERENCE, &isReference);
+
+ char addressStr[40];
+ memset(addressStr, 0, sizeof(addressStr));
+
+ if (isReference)
+ addressStr[0] = '&';
+ else
+ addressStr[0] = '*';
+
+ DWORD_PTR address = *(PDWORD_PTR)offset;
+ if (address == NULL)
+ {
+ pwszTypeName;
+ if (SymGetTypeInfo(m_hProcess, modBase, innerTypeID, TI_GET_SYMNAME,
+ &pwszTypeName))
+ {
+ pszCurrBuffer += sprintf(pszCurrBuffer, " %ls", pwszTypeName);
+ LocalFree(pwszTypeName);
+ }
+
+ pszCurrBuffer += sprintf(pszCurrBuffer, "%s = NULL\r\n", addressStr);
+
+ bHandled = true;
+ return pszCurrBuffer;
+ }
+ else
+ {
+ FormatOutputValue(&addressStr[1], btVoid, sizeof(PVOID), (PVOID)offset);
+ pszCurrBuffer = DumpTypeIndex(pszCurrBuffer, modBase, innerTypeID, nestingLevel + 1,
+ address, bHandled, "", addressStr);
+
+ if (!bHandled)
+ {
+ BasicType basicType = GetBasicType(dwTypeIndex, modBase);
+ pszCurrBuffer += sprintf(pszCurrBuffer, rgBaseType[basicType]);
+ // Get the size of the child member
+ ULONG64 length;
+ SymGetTypeInfo(m_hProcess, modBase, innerTypeID, TI_GET_LENGTH, &length);
+ pszCurrBuffer = FormatOutputValue(pszCurrBuffer, basicType, length, (PVOID)address);
+ pszCurrBuffer += sprintf(pszCurrBuffer, "\r\n");
+ bHandled = true;
+ return pszCurrBuffer;
+ }
+ }
+ }
+ break;
+ case SymTagData:
+ if (SymGetTypeInfo(m_hProcess, modBase, dwTypeIndex, TI_GET_TYPEID, &innerTypeID))
+ {
+ DWORD innerTypeTag;
+ if (!SymGetTypeInfo(m_hProcess, modBase, innerTypeID, TI_GET_SYMTAG, &innerTypeTag))
+ break;
+
+ if (innerTypeTag == SymTagPointerType)
+ {
+ pszCurrBuffer += sprintf(pszCurrBuffer, " %s", Name);
+
+ pszCurrBuffer = DumpTypeIndex(pszCurrBuffer, modBase, innerTypeID, nestingLevel + 1,
+ offset, bHandled, "", "");
+ }
+ }
+ break;
+ case SymTagBaseType:
+ break;
+ case SymTagEnum:
+ return pszCurrBuffer;
+ default:
+ break;
+ }
+
+ // Determine how many children this type has.
+ DWORD dwChildrenCount = 0;
+ SymGetTypeInfo(m_hProcess, modBase, dwTypeIndex, TI_GET_CHILDRENCOUNT, &dwChildrenCount);
+
+ if (!dwChildrenCount) // If no children, we're done
+ return pszCurrBuffer;
+
+ // Prepare to get an array of "TypeIds", representing each of the children.
+ // SymGetTypeInfo(TI_FINDCHILDREN) expects more memory than just a
+ // TI_FINDCHILDREN_PARAMS struct has. Use derivation to accomplish this.
+ struct FINDCHILDREN : TI_FINDCHILDREN_PARAMS
+ {
+ ULONG MoreChildIds[1024*2];
+ FINDCHILDREN(){Count = sizeof(MoreChildIds) / sizeof(MoreChildIds[0]);}
+ } children;
+
+ children.Count = dwChildrenCount;
+ children.Start= 0;
+
+ // Get the array of TypeIds, one for each child type
+ if (!SymGetTypeInfo(m_hProcess, modBase, dwTypeIndex, TI_FINDCHILDREN,
+ &children))
+ {
+ return pszCurrBuffer;
+ }
+
+ // Append a line feed
+ pszCurrBuffer += sprintf(pszCurrBuffer, "\r\n");
+
+ // Iterate through each of the children
+ for (unsigned i = 0; i < dwChildrenCount; i++)
+ {
+ DWORD symTag;
+ SymGetTypeInfo(m_hProcess, modBase, children.ChildId[i], TI_GET_SYMTAG, &symTag);
+
+ if (symTag == SymTagFunction || symTag == SymTagTypedef)
+ continue;
+
+ // Add appropriate indentation level (since this routine is recursive)
+ for (unsigned j = 0; j <= nestingLevel+1; j++)
+ pszCurrBuffer += sprintf(pszCurrBuffer, "\t");
+
+ // Recurse for each of the child types
+ bool bHandled2;
+ BasicType basicType = GetBasicType(children.ChildId[i], modBase);
+ pszCurrBuffer += sprintf(pszCurrBuffer, rgBaseType[basicType]);
+
+ // Get the offset of the child member, relative to its parent
+ DWORD dwMemberOffset;
+ SymGetTypeInfo(m_hProcess, modBase, children.ChildId[i],
+ TI_GET_OFFSET, &dwMemberOffset);
+
+ // Calculate the address of the member
+ DWORD_PTR dwFinalOffset = offset + dwMemberOffset;
+
+ pszCurrBuffer = DumpTypeIndex(pszCurrBuffer, modBase,
+ children.ChildId[i], nestingLevel+1,
+ dwFinalOffset, bHandled2, ""/*Name */, "");
+
+ // If the child wasn't a UDT, format it appropriately
+ if (!bHandled2)
+ {
+ // Get the real "TypeId" of the child. We need this for the
+ // SymGetTypeInfo(TI_GET_TYPEID) call below.
+ DWORD typeId;
+ SymGetTypeInfo(m_hProcess, modBase, children.ChildId[i],
+ TI_GET_TYPEID, &typeId);
+
+ // Get the size of the child member
+ ULONG64 length;
+ SymGetTypeInfo(m_hProcess, modBase, typeId, TI_GET_LENGTH, &length);
+
+ pszCurrBuffer = FormatOutputValue(pszCurrBuffer, basicType,
+ length, (PVOID)dwFinalOffset);
+
+ pszCurrBuffer += sprintf(pszCurrBuffer, "\r\n");
+ }
+ }
+
+ bHandled = true;
+ return pszCurrBuffer;
+}
+
+char * WheatyExceptionReport::FormatOutputValue(char * pszCurrBuffer,
+BasicType basicType,
+DWORD64 length,
+PVOID pAddress)
+{
+ __try
+ {
+ switch (basicType)
+ {
+ case btChar:
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = \"%s\"", (char*)pAddress);
+ break;
+ case btStdString:
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = \"%s\"", static_cast<std::string*>(pAddress)->c_str());
+ break;
+ default:
+ // Format appropriately (assuming it's a 1, 2, or 4 bytes (!!!)
+ if (length == 1)
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = %X", *(PBYTE)pAddress);
+ else if (length == 2)
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = %X", *(PWORD)pAddress);
+ else if (length == 4)
+ {
+ if (basicType == btFloat)
+ {
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = %f", *(PFLOAT)pAddress);
+ }
+ else if (basicType == btChar)
+ {
+ if (!IsBadStringPtr(*(PSTR*)pAddress, 32))
+ {
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = \"%.31s\"",
+ *(PSTR*)pAddress);
+ }
+ else
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = %X",
+ *(PDWORD)pAddress);
+ }
+ else
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = %X", *(PDWORD)pAddress);
+ }
+ else if (length == 8)
+ {
+ if (basicType == btFloat)
+ {
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = %lf",
+ *(double *)pAddress);
+ }
+ else
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = %I64X",
+ *(DWORD64*)pAddress);
+ }
+ else
+ {
+ #if _WIN64
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = 0x%I64X", (DWORD64)pAddress);
+ #else
+ pszCurrBuffer += sprintf(pszCurrBuffer, " = 0x%X", (DWORD)pAddress);
+ #endif
+ }
+ break;
+ }
+ }
+ __except (EXCEPTION_EXECUTE_HANDLER)
+ {
+#if _WIN64
+ pszCurrBuffer += sprintf(pszCurrBuffer, " <Unable to read memory> = %I64X", (DWORD64)pAddress);
+#else
+ pszCurrBuffer += sprintf(pszCurrBuffer, " <Unable to read memory> = %X", (DWORD)pAddress);
+#endif
+ }
+
+ return pszCurrBuffer;
+}
+
+BasicType
+WheatyExceptionReport::GetBasicType(DWORD typeIndex, DWORD64 modBase)
+{
+ BasicType basicType;
+ if (SymGetTypeInfo(m_hProcess, modBase, typeIndex,
+ TI_GET_BASETYPE, &basicType))
+ {
+ return basicType;
+ }
+
+ // Get the real "TypeId" of the child. We need this for the
+ // SymGetTypeInfo(TI_GET_TYPEID) call below.
+ DWORD typeId;
+ if (SymGetTypeInfo(m_hProcess, modBase, typeIndex, TI_GET_TYPEID, &typeId))
+ {
+ if (SymGetTypeInfo(m_hProcess, modBase, typeId, TI_GET_BASETYPE,
+ &basicType))
+ {
+ return basicType;
+ }
+ }
+
+ return btNoType;
+}
+
+//============================================================================
+// Helper function that writes to the report file, and allows the user to use
+// printf style formating
+//============================================================================
+int __cdecl WheatyExceptionReport::_tprintf(const TCHAR * format, ...)
+{
+ TCHAR szBuff[1024 * 64];
+ int retValue;
+ DWORD cbWritten;
+ va_list argptr;
+
+ va_start(argptr, format);
+ retValue = vsprintf(szBuff, format, argptr);
+ va_end(argptr);
+
+ WriteFile(m_hReportFile, szBuff, retValue * sizeof(TCHAR), &cbWritten, 0);
+
+ return retValue;
+}
+
+bool WheatyExceptionReport::StoreSymbol(DWORD type, DWORD_PTR offset)
+{
+ return symbols.insert(SymbolPair(type, offset)).second;
+}
+
+void WheatyExceptionReport::ClearSymbols()
+{
+ symbols.clear();
+}
+
+#endif // _WIN32
diff --git a/src/common/Debugging/WheatyExceptionReport.h b/src/common/Debugging/WheatyExceptionReport.h
new file mode 100644
index 0000000000..f6d6b7f4b9
--- /dev/null
+++ b/src/common/Debugging/WheatyExceptionReport.h
@@ -0,0 +1,149 @@
+#ifndef _WHEATYEXCEPTIONREPORT_
+#define _WHEATYEXCEPTIONREPORT_
+
+#if PLATFORM == PLATFORM_WINDOWS && !defined(__MINGW32__)
+
+#include <dbghelp.h>
+#include <set>
+#if _MSC_VER < 1400
+# define countof(array) (sizeof(array) / sizeof(array[0]))
+#else
+# include <stdlib.h>
+# define countof _countof
+#endif // _MSC_VER < 1400
+
+enum BasicType // Stolen from CVCONST.H in the DIA 2.0 SDK
+{
+ btNoType = 0,
+ btVoid = 1,
+ btChar = 2,
+ btWChar = 3,
+ btInt = 6,
+ btUInt = 7,
+ btFloat = 8,
+ btBCD = 9,
+ btBool = 10,
+ btLong = 13,
+ btULong = 14,
+ btCurrency = 25,
+ btDate = 26,
+ btVariant = 27,
+ btComplex = 28,
+ btBit = 29,
+ btBSTR = 30,
+ btHresult = 31,
+
+ // Custom types
+ btStdString = 101
+};
+
+const char* const rgBaseType[] =
+{
+ " <user defined> ", // btNoType = 0,
+ " void ", // btVoid = 1,
+ " char* ", // btChar = 2,
+ " wchar_t* ", // btWChar = 3,
+ " signed char ",
+ " unsigned char ",
+ " int ", // btInt = 6,
+ " unsigned int ", // btUInt = 7,
+ " float ", // btFloat = 8,
+ " <BCD> ", // btBCD = 9,
+ " bool ", // btBool = 10,
+ " short ",
+ " unsigned short ",
+ " long ", // btLong = 13,
+ " unsigned long ", // btULong = 14,
+ " __int8 ",
+ " __int16 ",
+ " __int32 ",
+ " __int64 ",
+ " __int128 ",
+ " unsigned __int8 ",
+ " unsigned __int16 ",
+ " unsigned __int32 ",
+ " unsigned __int64 ",
+ " unsigned __int128 ",
+ " <currency> ", // btCurrency = 25,
+ " <date> ", // btDate = 26,
+ " VARIANT ", // btVariant = 27,
+ " <complex> ", // btComplex = 28,
+ " <bit> ", // btBit = 29,
+ " BSTR ", // btBSTR = 30,
+ " HRESULT " // btHresult = 31
+};
+
+struct SymbolPair
+{
+ SymbolPair(DWORD type, DWORD_PTR offset)
+ {
+ _type = type;
+ _offset = offset;
+ }
+
+ bool operator<(const SymbolPair& other) const
+ {
+ return _offset < other._offset ||
+ (_offset == other._offset && _type < other._type);
+ }
+
+ DWORD _type;
+ DWORD_PTR _offset;
+};
+typedef std::set<SymbolPair> SymbolPairs;
+
+class WheatyExceptionReport
+{
+ public:
+
+ WheatyExceptionReport();
+ ~WheatyExceptionReport();
+
+ // entry point where control comes on an unhandled exception
+ static LONG WINAPI WheatyUnhandledExceptionFilter(
+ PEXCEPTION_POINTERS pExceptionInfo);
+
+ static void printTracesForAllThreads(bool);
+ private:
+ // where report info is extracted and generated
+ static void GenerateExceptionReport(PEXCEPTION_POINTERS pExceptionInfo);
+ static void PrintSystemInfo();
+ static BOOL _GetWindowsVersion(TCHAR* szVersion, DWORD cntMax);
+ static BOOL _GetProcessorName(TCHAR* sProcessorName, DWORD maxcount);
+
+ // Helper functions
+ static LPTSTR GetExceptionString(DWORD dwCode);
+ static BOOL GetLogicalAddress(PVOID addr, PTSTR szModule, DWORD len,
+ DWORD& section, DWORD_PTR& offset);
+
+ static void WriteStackDetails(PCONTEXT pContext, bool bWriteVariables, HANDLE pThreadHandle);
+
+ static BOOL CALLBACK EnumerateSymbolsCallback(PSYMBOL_INFO, ULONG, PVOID);
+
+ static bool FormatSymbolValue(PSYMBOL_INFO, STACKFRAME64 *, char * pszBuffer, unsigned cbBuffer);
+
+ static char * DumpTypeIndex(char *, DWORD64, DWORD, unsigned, DWORD_PTR, bool &, char*, char*);
+
+ static char * FormatOutputValue(char * pszCurrBuffer, BasicType basicType, DWORD64 length, PVOID pAddress);
+
+ static BasicType GetBasicType(DWORD typeIndex, DWORD64 modBase);
+
+ static int __cdecl _tprintf(const TCHAR * format, ...);
+
+ static bool StoreSymbol(DWORD type , DWORD_PTR offset);
+ static void ClearSymbols();
+
+ // Variables used by the class
+ static TCHAR m_szLogFileName[MAX_PATH];
+ static TCHAR m_szDumpFileName[MAX_PATH];
+ static LPTOP_LEVEL_EXCEPTION_FILTER m_previousFilter;
+ static HANDLE m_hReportFile;
+ static HANDLE m_hDumpFile;
+ static HANDLE m_hProcess;
+ static SymbolPairs symbols;
+};
+
+extern WheatyExceptionReport g_WheatyExceptionReport; // global instance of class
+#endif // _WIN32
+#endif // _WHEATYEXCEPTIONREPORT_
+
diff --git a/src/common/Define.h b/src/common/Define.h
new file mode 100644
index 0000000000..3494531019
--- /dev/null
+++ b/src/common/Define.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_DEFINE_H
+#define TRINITY_DEFINE_H
+
+#include <cstdint>
+#include <cstddef>
+#include <sys/types.h>
+#include <ace/Basic_Types.h>
+#include <ace/ACE_export.h>
+#include <ace/Default_Constants.h>
+
+#include "CompilerDefs.h"
+
+
+
+#if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__)
+#define OS_WIN
+#endif
+
+#define TRINITY_LITTLEENDIAN 0
+#define TRINITY_BIGENDIAN 1
+
+#if !defined(TRINITY_ENDIAN)
+# if defined (ACE_BIG_ENDIAN)
+# define TRINITY_ENDIAN TRINITY_BIGENDIAN
+# else //ACE_BYTE_ORDER != ACE_BIG_ENDIAN
+# define TRINITY_ENDIAN TRINITY_LITTLEENDIAN
+# endif //ACE_BYTE_ORDER
+#endif //TRINITY_ENDIAN
+
+#if PLATFORM == PLATFORM_WINDOWS
+# define TRINITY_PATH_MAX MAX_PATH
+# ifndef DECLSPEC_NORETURN
+# define DECLSPEC_NORETURN __declspec(noreturn)
+# endif //DECLSPEC_NORETURN
+# ifndef DECLSPEC_DEPRECATED
+# define DECLSPEC_DEPRECATED __declspec(deprecated)
+# endif //DECLSPEC_DEPRECATED
+#else //PLATFORM != PLATFORM_WINDOWS
+# define TRINITY_PATH_MAX PATH_MAX
+# define DECLSPEC_NORETURN
+# define DECLSPEC_DEPRECATED
+#endif //PLATFORM
+
+#if !defined(COREDEBUG)
+# define TRINITY_INLINE inline
+#else //COREDEBUG
+# if !defined(TRINITY_DEBUG)
+# define TRINITY_DEBUG
+# endif //TRINITY_DEBUG
+# define TRINITY_INLINE
+#endif //!COREDEBUG
+
+#if COMPILER == COMPILER_GNU
+# define ATTR_NORETURN __attribute__((noreturn))
+# define ATTR_PRINTF(F, V) __attribute__ ((format (printf, F, V)))
+# define ATTR_DEPRECATED __attribute__((deprecated))
+#else //COMPILER != COMPILER_GNU
+# define ATTR_NORETURN
+# define ATTR_PRINTF(F, V)
+# define ATTR_DEPRECATED
+#endif //COMPILER == COMPILER_GNU
+
+#define UI64FMTD ACE_UINT64_FORMAT_SPECIFIER
+#define UI64LIT(N) ACE_UINT64_LITERAL(N)
+
+#define SI64FMTD ACE_INT64_FORMAT_SPECIFIER
+#define SI64LIT(N) ACE_INT64_LITERAL(N)
+
+#define SIZEFMTD ACE_SIZE_T_FORMAT_SPECIFIER
+
+#define UNUSED(x) (void)(x)
+
+typedef std::int64_t int64;
+typedef std::int32_t int32;
+typedef std::int16_t int16;
+typedef std::int8_t int8;
+typedef std::uint64_t uint64;
+typedef std::uint32_t uint32;
+typedef std::uint16_t uint16;
+typedef std::uint8_t uint8;
+
+#endif //TRINITY_DEFINE_H
diff --git a/src/common/Dynamic/FactoryHolder.h b/src/common/Dynamic/FactoryHolder.h
new file mode 100644
index 0000000000..a53b55abc7
--- /dev/null
+++ b/src/common/Dynamic/FactoryHolder.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_FACTORY_HOLDER
+#define TRINITY_FACTORY_HOLDER
+
+#include "Define.h"
+#include "Dynamic/TypeList.h"
+#include "ObjectRegistry.h"
+
+/** FactoryHolder holds a factory object of a specific type
+ */
+template<class T, class Key = std::string>
+class FactoryHolder
+{
+ public:
+ typedef ObjectRegistry<FactoryHolder<T, Key >, Key > FactoryHolderRegistry;
+ friend class ACE_Singleton<FactoryHolderRegistry, ACE_Null_Mutex>;
+ typedef ACE_Singleton<FactoryHolderRegistry, ACE_Null_Mutex> FactoryHolderRepository;
+
+ FactoryHolder(Key k) : i_key(k) { }
+ virtual ~FactoryHolder() { }
+ inline Key key() const { return i_key; }
+
+ void RegisterSelf(void) { FactoryHolderRepository::instance()->InsertItem(this, i_key); }
+ void DeregisterSelf(void) { FactoryHolderRepository::instance()->RemoveItem(this, false); }
+
+ /// Abstract Factory create method
+ virtual T* Create(void *data = NULL) const = 0;
+ private:
+ Key i_key;
+};
+
+/** Permissible is a classic way of letting the object decide
+ * whether how good they handle things. This is not retricted
+ * to factory selectors.
+ */
+template<class T>
+class Permissible
+{
+ public:
+ virtual ~Permissible() { }
+ virtual int Permit(const T *) const = 0;
+};
+#endif
+
diff --git a/src/common/Dynamic/HashNamespace.h b/src/common/Dynamic/HashNamespace.h
new file mode 100644
index 0000000000..b9cbe5e658
--- /dev/null
+++ b/src/common/Dynamic/HashNamespace.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_HASH_NAMESPACE_H
+#define TRINITY_HASH_NAMESPACE_H
+
+#include "Define.h"
+
+#if COMPILER_HAS_CPP11_SUPPORT
+# define HASH_NAMESPACE_START namespace std {
+# define HASH_NAMESPACE_END }
+#elif defined(_STLPORT_VERSION)
+# define HASH_NAMESPACE_START namespace std {
+# define HASH_NAMESPACE_END }
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1600 // VS100
+# define HASH_NAMESPACE_START namespace std {
+# define HASH_NAMESPACE_END }
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1
+# define HASH_NAMESPACE_START namespace std { namespace tr1 {
+# define HASH_NAMESPACE_END } }
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1300
+# define HASH_NAMESPACE_START namespace stdext {
+# define HASH_NAMESPACE_END }
+
+#if !_HAS_TRADITIONAL_STL
+#ifndef HASH_NAMESPACE
+#define HASH_NAMESPACE
+#else
+
+// can be not used by some platforms, so provide fake forward
+HASH_NAMESPACE_START
+
+template<class K>
+class hash
+{
+public:
+ size_t operator() (K const&);
+};
+
+HASH_NAMESPACE_END
+
+#endif
+#endif
+
+#elif COMPILER == COMPILER_INTEL
+# define HASH_NAMESPACE_START namespace std {
+# define HASH_NAMESPACE_END }
+#elif COMPILER == COMPILER_GNU && defined(__clang__) && defined(_LIBCPP_VERSION)
+# define HASH_NAMESPACE_START namespace std {
+# define HASH_NAMESPACE_END }
+#elif COMPILER == COMPILER_GNU && GCC_VERSION > 40200
+# define HASH_NAMESPACE_START namespace std { namespace tr1 {
+# define HASH_NAMESPACE_END } }
+#elif COMPILER == COMPILER_GNU && GCC_VERSION >= 30000
+# define HASH_NAMESPACE_START namespace __gnu_cxx {
+# define HASH_NAMESPACE_END }
+
+#include <ext/hash_fun.h>
+#include <string>
+
+HASH_NAMESPACE_START
+
+template<>
+class hash<unsigned long long>
+{
+public:
+ size_t operator()(const unsigned long long &__x) const { return (size_t)__x; }
+};
+
+template<typename T>
+class hash<T *>
+{
+public:
+ size_t operator()(T * const &__x) const { return (size_t)__x; }
+};
+
+template<> struct hash<std::string>
+{
+ size_t operator()(const std::string &__x) const
+ {
+ return hash<char const*>()(__x.c_str());
+ }
+};
+
+HASH_NAMESPACE_END
+
+#else
+# define HASH_NAMESPACE_START namespace std {
+# define HASH_NAMESPACE_END }
+#endif
+
+#if COMPILER != COMPILER_MICROSOFT
+
+// Visual Studio use non standard hash calculation function, so provide fake forward for other
+HASH_NAMESPACE_START
+
+template<class K>
+size_t hash_value(K const&);
+
+HASH_NAMESPACE_END
+
+#endif
+
+#endif
diff --git a/src/common/Dynamic/LinkedList.h b/src/common/Dynamic/LinkedList.h
new file mode 100644
index 0000000000..cc353d9695
--- /dev/null
+++ b/src/common/Dynamic/LinkedList.h
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _LINKEDLIST
+#define _LINKEDLIST
+
+#include "Define.h"
+#include <iterator>
+
+//============================================
+class LinkedListHead;
+
+class LinkedListElement
+{
+ private:
+ friend class LinkedListHead;
+
+ LinkedListElement* iNext;
+ LinkedListElement* iPrev;
+ public:
+ LinkedListElement(): iNext(NULL), iPrev(NULL) { }
+ ~LinkedListElement() { delink(); }
+
+ bool hasNext() const { return(iNext && iNext->iNext != NULL); }
+ bool hasPrev() const { return(iPrev && iPrev->iPrev != NULL); }
+ bool isInList() const { return(iNext != NULL && iPrev != NULL); }
+
+ LinkedListElement * next() { return hasNext() ? iNext : NULL; }
+ LinkedListElement const* next() const { return hasNext() ? iNext : NULL; }
+ LinkedListElement * prev() { return hasPrev() ? iPrev : NULL; }
+ LinkedListElement const* prev() const { return hasPrev() ? iPrev : NULL; }
+
+ LinkedListElement * nocheck_next() { return iNext; }
+ LinkedListElement const* nocheck_next() const { return iNext; }
+ LinkedListElement * nocheck_prev() { return iPrev; }
+ LinkedListElement const* nocheck_prev() const { return iPrev; }
+
+ void delink()
+ {
+ if (isInList())
+ {
+ iNext->iPrev = iPrev; iPrev->iNext = iNext; iNext = NULL; iPrev = NULL;
+ }
+ }
+
+ void insertBefore(LinkedListElement* pElem)
+ {
+ pElem->iNext = this;
+ pElem->iPrev = iPrev;
+ iPrev->iNext = pElem;
+ iPrev = pElem;
+ }
+
+ void insertAfter(LinkedListElement* pElem)
+ {
+ pElem->iPrev = this;
+ pElem->iNext = iNext;
+ iNext->iPrev = pElem;
+ iNext = pElem;
+ }
+};
+
+//============================================
+
+class LinkedListHead
+{
+ private:
+ LinkedListElement iFirst;
+ LinkedListElement iLast;
+ uint32 iSize;
+ public:
+ LinkedListHead(): iSize(0)
+ {
+ // create empty list
+
+ iFirst.iNext = &iLast;
+ iLast.iPrev = &iFirst;
+ }
+
+ bool isEmpty() const { return(!iFirst.iNext->isInList()); }
+
+ LinkedListElement * getFirst() { return(isEmpty() ? NULL : iFirst.iNext); }
+ LinkedListElement const* getFirst() const { return(isEmpty() ? NULL : iFirst.iNext); }
+
+ LinkedListElement * getLast() { return(isEmpty() ? NULL : iLast.iPrev); }
+ LinkedListElement const* getLast() const { return(isEmpty() ? NULL : iLast.iPrev); }
+
+ void insertFirst(LinkedListElement* pElem)
+ {
+ iFirst.insertAfter(pElem);
+ }
+
+ void insertLast(LinkedListElement* pElem)
+ {
+ iLast.insertBefore(pElem);
+ }
+
+ uint32 getSize() const
+ {
+ if (!iSize)
+ {
+ uint32 result = 0;
+ LinkedListElement const* e = getFirst();
+ while (e)
+ {
+ ++result;
+ e = e->next();
+ }
+ return result;
+ }
+ else
+ return iSize;
+ }
+
+ void incSize() { ++iSize; }
+ void decSize() { --iSize; }
+
+ template<class _Ty>
+ class Iterator
+ {
+ public:
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef _Ty value_type;
+ typedef ptrdiff_t difference_type;
+ typedef ptrdiff_t distance_type;
+ typedef _Ty* pointer;
+ typedef _Ty const* const_pointer;
+ typedef _Ty& reference;
+ typedef _Ty const & const_reference;
+
+ Iterator() : _Ptr(0)
+ { // construct with null node pointer
+ }
+
+ Iterator(pointer _Pnode) : _Ptr(_Pnode)
+ { // construct with node pointer _Pnode
+ }
+
+ Iterator& operator=(Iterator const &_Right)
+ {
+ _Ptr = _Right._Ptr;
+ return *this;
+ }
+
+ Iterator& operator=(const_pointer const &_Right)
+ {
+ _Ptr = pointer(_Right);
+ return *this;
+ }
+
+ reference operator*()
+ { // return designated value
+ return *_Ptr;
+ }
+
+ pointer operator->()
+ { // return pointer to class object
+ return _Ptr;
+ }
+
+ Iterator& operator++()
+ { // preincrement
+ _Ptr = _Ptr->next();
+ return (*this);
+ }
+
+ Iterator operator++(int)
+ { // postincrement
+ iterator _Tmp = *this;
+ ++*this;
+ return (_Tmp);
+ }
+
+ Iterator& operator--()
+ { // predecrement
+ _Ptr = _Ptr->prev();
+ return (*this);
+ }
+
+ Iterator operator--(int)
+ { // postdecrement
+ iterator _Tmp = *this;
+ --*this;
+ return (_Tmp);
+ }
+
+ bool operator==(Iterator const &_Right) const
+ { // test for iterator equality
+ return (_Ptr == _Right._Ptr);
+ }
+
+ bool operator!=(Iterator const &_Right) const
+ { // test for iterator inequality
+ return (!(*this == _Right));
+ }
+
+ bool operator==(pointer const &_Right) const
+ { // test for pointer equality
+ return (_Ptr != _Right);
+ }
+
+ bool operator!=(pointer const &_Right) const
+ { // test for pointer equality
+ return (!(*this == _Right));
+ }
+
+ bool operator==(const_reference _Right) const
+ { // test for reference equality
+ return (_Ptr == &_Right);
+ }
+
+ bool operator!=(const_reference _Right) const
+ { // test for reference equality
+ return (_Ptr != &_Right);
+ }
+
+ pointer _Mynode()
+ { // return node pointer
+ return (_Ptr);
+ }
+
+ protected:
+ pointer _Ptr; // pointer to node
+ };
+
+ typedef Iterator<LinkedListElement> iterator;
+};
+
+//============================================
+#endif
diff --git a/src/common/Dynamic/LinkedReference/RefManager.h b/src/common/Dynamic/LinkedReference/RefManager.h
new file mode 100644
index 0000000000..52e397c86a
--- /dev/null
+++ b/src/common/Dynamic/LinkedReference/RefManager.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _REFMANAGER_H
+#define _REFMANAGER_H
+//=====================================================
+
+#include "Dynamic/LinkedList.h"
+#include "Dynamic/LinkedReference/Reference.h"
+
+template <class TO, class FROM> class RefManager : public LinkedListHead
+{
+ public:
+ typedef LinkedListHead::Iterator< Reference<TO, FROM> > iterator;
+ RefManager() { }
+ virtual ~RefManager() { clearReferences(); }
+
+ Reference<TO, FROM>* getFirst() { return ((Reference<TO, FROM>*) LinkedListHead::getFirst()); }
+ Reference<TO, FROM> const* getFirst() const { return ((Reference<TO, FROM> const*) LinkedListHead::getFirst()); }
+ Reference<TO, FROM>* getLast() { return ((Reference<TO, FROM>*) LinkedListHead::getLast()); }
+ Reference<TO, FROM> const* getLast() const { return ((Reference<TO, FROM> const*) LinkedListHead::getLast()); }
+
+ iterator begin() { return iterator(getFirst()); }
+ iterator end() { return iterator(NULL); }
+ iterator rbegin() { return iterator(getLast()); }
+ iterator rend() { return iterator(NULL); }
+
+ void clearReferences()
+ {
+ LinkedListElement* ref;
+ while ((ref = getFirst()) != NULL)
+ {
+ ((Reference<TO, FROM>*) ref)->invalidate();
+ ref->delink(); // the delink might be already done by invalidate(), but doing it here again does not hurt and insures an empty list
+ }
+ }
+};
+
+//=====================================================
+#endif
+
diff --git a/src/common/Dynamic/LinkedReference/Reference.h b/src/common/Dynamic/LinkedReference/Reference.h
new file mode 100644
index 0000000000..9bf2509f6a
--- /dev/null
+++ b/src/common/Dynamic/LinkedReference/Reference.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _REFERENCE_H
+#define _REFERENCE_H
+
+#include "Dynamic/LinkedList.h"
+#include "Errors.h" // for ASSERT
+
+//=====================================================
+
+template <class TO, class FROM> class Reference : public LinkedListElement
+{
+ private:
+ TO* iRefTo;
+ FROM* iRefFrom;
+ protected:
+ // Tell our refTo (target) object that we have a link
+ virtual void targetObjectBuildLink() = 0;
+
+ // Tell our refTo (taget) object, that the link is cut
+ virtual void targetObjectDestroyLink() = 0;
+
+ // Tell our refFrom (source) object, that the link is cut (Target destroyed)
+ virtual void sourceObjectDestroyLink() = 0;
+ public:
+ Reference() { iRefTo = NULL; iRefFrom = NULL; }
+ virtual ~Reference() { }
+
+ // Create new link
+ void link(TO* toObj, FROM* fromObj)
+ {
+ ASSERT(fromObj); // fromObj MUST not be NULL
+ if (isValid())
+ unlink();
+ if (toObj != NULL)
+ {
+ iRefTo = toObj;
+ iRefFrom = fromObj;
+ targetObjectBuildLink();
+ }
+ }
+
+ // We don't need the reference anymore. Call comes from the refFrom object
+ // Tell our refTo object, that the link is cut
+ void unlink()
+ {
+ targetObjectDestroyLink();
+ delink();
+ iRefTo = NULL;
+ iRefFrom = NULL;
+ }
+
+ // Link is invalid due to destruction of referenced target object. Call comes from the refTo object
+ // Tell our refFrom object, that the link is cut
+ void invalidate() // the iRefFrom MUST remain!!
+ {
+ sourceObjectDestroyLink();
+ delink();
+ iRefTo = NULL;
+ }
+
+ bool isValid() const // Only check the iRefTo
+ {
+ return iRefTo != NULL;
+ }
+
+ Reference<TO, FROM> * next() { return((Reference<TO, FROM> *) LinkedListElement::next()); }
+ Reference<TO, FROM> const* next() const { return((Reference<TO, FROM> const*) LinkedListElement::next()); }
+ Reference<TO, FROM> * prev() { return((Reference<TO, FROM> *) LinkedListElement::prev()); }
+ Reference<TO, FROM> const* prev() const { return((Reference<TO, FROM> const*) LinkedListElement::prev()); }
+
+ Reference<TO, FROM> * nocheck_next() { return((Reference<TO, FROM> *) LinkedListElement::nocheck_next()); }
+ Reference<TO, FROM> const* nocheck_next() const { return((Reference<TO, FROM> const*) LinkedListElement::nocheck_next()); }
+ Reference<TO, FROM> * nocheck_prev() { return((Reference<TO, FROM> *) LinkedListElement::nocheck_prev()); }
+ Reference<TO, FROM> const* nocheck_prev() const { return((Reference<TO, FROM> const*) LinkedListElement::nocheck_prev()); }
+
+ TO* operator ->() const { return iRefTo; }
+ TO* getTarget() const { return iRefTo; }
+
+ FROM* GetSource() const { return iRefFrom; }
+};
+
+//=====================================================
+#endif
diff --git a/src/common/Dynamic/ObjectRegistry.h b/src/common/Dynamic/ObjectRegistry.h
new file mode 100644
index 0000000000..27388ebf76
--- /dev/null
+++ b/src/common/Dynamic/ObjectRegistry.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_OBJECTREGISTRY_H
+#define TRINITY_OBJECTREGISTRY_H
+
+#include "Define.h"
+#include "Dynamic/UnorderedMap.h"
+#include <ace/Singleton.h>
+
+#include <string>
+#include <vector>
+#include <map>
+
+/** ObjectRegistry holds all registry item of the same type
+ */
+template<class T, class Key = std::string>
+class ObjectRegistry
+{
+ public:
+ typedef std::map<Key, T *> RegistryMapType;
+
+ /// Returns a registry item
+ const T* GetRegistryItem(Key key) const
+ {
+ typename RegistryMapType::const_iterator iter = i_registeredObjects.find(key);
+ return( iter == i_registeredObjects.end() ? NULL : iter->second );
+ }
+
+ /// Inserts a registry item
+ bool InsertItem(T *obj, Key key, bool override = false)
+ {
+ typename RegistryMapType::iterator iter = i_registeredObjects.find(key);
+ if ( iter != i_registeredObjects.end() )
+ {
+ if ( !override )
+ return false;
+ delete iter->second;
+ i_registeredObjects.erase(iter);
+ }
+
+ i_registeredObjects[key] = obj;
+ return true;
+ }
+
+ /// Removes a registry item
+ void RemoveItem(Key key, bool delete_object = true)
+ {
+ typename RegistryMapType::iterator iter = i_registeredObjects.find(key);
+ if ( iter != i_registeredObjects.end() )
+ {
+ if ( delete_object )
+ delete iter->second;
+ i_registeredObjects.erase(iter);
+ }
+ }
+
+ /// Returns true if registry contains an item
+ bool HasItem(Key key) const
+ {
+ return (i_registeredObjects.find(key) != i_registeredObjects.end());
+ }
+
+ /// Inefficiently return a vector of registered items
+ unsigned int GetRegisteredItems(std::vector<Key> &l) const
+ {
+ unsigned int sz = l.size();
+ l.resize(sz + i_registeredObjects.size());
+ for (typename RegistryMapType::const_iterator iter = i_registeredObjects.begin(); iter != i_registeredObjects.end(); ++iter)
+ l[sz++] = iter->first;
+ return i_registeredObjects.size();
+ }
+
+ /// Return the map of registered items
+ RegistryMapType const &GetRegisteredItems() const
+ {
+ return i_registeredObjects;
+ }
+
+ ObjectRegistry() { }
+ ~ObjectRegistry()
+ {
+ for (typename RegistryMapType::iterator iter=i_registeredObjects.begin(); iter != i_registeredObjects.end(); ++iter)
+ delete iter->second;
+ i_registeredObjects.clear();
+ }
+ private:
+ RegistryMapType i_registeredObjects;
+};
+
+#endif
diff --git a/src/common/Dynamic/TypeContainer.h b/src/common/Dynamic/TypeContainer.h
new file mode 100644
index 0000000000..3bd5fbd919
--- /dev/null
+++ b/src/common/Dynamic/TypeContainer.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_TYPECONTAINER_H
+#define TRINITY_TYPECONTAINER_H
+
+/*
+ * Here, you'll find a series of containers that allow you to hold multiple
+ * types of object at the same time.
+ */
+
+#include <map>
+#include <vector>
+#include "Define.h"
+#include "Dynamic/TypeList.h"
+#include "GridRefManager.h"
+
+/*
+ * @class ContainerMapList is a mulit-type container for map elements
+ * By itself its meaningless but collaborate along with TypeContainers,
+ * it become the most powerfully container in the whole system.
+ */
+template<class OBJECT> struct ContainerMapList
+{
+ //std::map<OBJECT_HANDLE, OBJECT *> _element;
+ GridRefManager<OBJECT> _element;
+};
+
+template<> struct ContainerMapList<TypeNull> /* nothing is in type null */
+{
+};
+template<class H, class T> struct ContainerMapList<TypeList<H, T> >
+{
+ ContainerMapList<H> _elements;
+ ContainerMapList<T> _TailElements;
+};
+
+/*
+ * @class ContaierArrayList is a multi-type container for
+ * array of elements.
+ */
+template<class OBJECT> struct ContainerArrayList
+{
+ std::vector<OBJECT> _element;
+};
+
+// termination condition
+template<> struct ContainerArrayList<TypeNull> { };
+// recursion
+template<class H, class T> struct ContainerArrayList<TypeList<H, T> >
+{
+ ContainerArrayList<H> _elements;
+ ContainerArrayList<T> _TailElements;
+};
+
+/*
+ * @class ContainerList is a simple list of different types of elements
+ *
+ */
+template<class OBJECT> struct ContainerList
+{
+ OBJECT _element;
+};
+
+/* TypeNull is underfined */
+template<> struct ContainerList<TypeNull> { };
+template<class H, class T> struct ContainerList<TypeList<H, T> >
+{
+ ContainerList<H> _elements;
+ ContainerMapList<T> _TailElements;
+};
+
+#include "TypeContainerFunctions.h"
+
+/*
+ * @class TypeMapContainer contains a fixed number of types and is
+ * determined at compile time. This is probably the most complicated
+ * class and do its simplest thing, that is, holds objects
+ * of different types.
+ */
+
+template<class OBJECT_TYPES>
+class TypeMapContainer
+{
+ public:
+ template<class SPECIFIC_TYPE> size_t Count() const { return Trinity::Count(i_elements, (SPECIFIC_TYPE*)NULL); }
+
+ /// inserts a specific object into the container
+ template<class SPECIFIC_TYPE> bool insert(SPECIFIC_TYPE *obj)
+ {
+ SPECIFIC_TYPE* t = Trinity::Insert(i_elements, obj);
+ return (t != NULL);
+ }
+
+ /// Removes the object from the container, and returns the removed object
+ //template<class SPECIFIC_TYPE> bool remove(SPECIFIC_TYPE* obj)
+ //{
+ // SPECIFIC_TYPE* t = Trinity::Remove(i_elements, obj);
+ // return (t != NULL);
+ //}
+
+ ContainerMapList<OBJECT_TYPES> & GetElements(void) { return i_elements; }
+ const ContainerMapList<OBJECT_TYPES> & GetElements(void) const { return i_elements;}
+
+ private:
+ ContainerMapList<OBJECT_TYPES> i_elements;
+};
+#endif
+
diff --git a/src/common/Dynamic/TypeContainerFunctions.h b/src/common/Dynamic/TypeContainerFunctions.h
new file mode 100644
index 0000000000..50c31699e2
--- /dev/null
+++ b/src/common/Dynamic/TypeContainerFunctions.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TYPECONTAINER_FUNCTIONS_H
+#define TYPECONTAINER_FUNCTIONS_H
+
+/*
+ * Here you'll find a list of helper functions to make
+ * the TypeContainer usefull. Without it, its hard
+ * to access or mutate the container.
+ */
+
+#include "Define.h"
+#include "Dynamic/TypeList.h"
+#include <map>
+
+namespace Trinity
+{
+ /* ContainerMapList Helpers */
+ // count functions
+ template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<SPECIFIC_TYPE> &elements, SPECIFIC_TYPE* /*fake*/)
+ {
+ return elements._element.getSize();
+ }
+
+ template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<TypeNull> &/*elements*/, SPECIFIC_TYPE* /*fake*/)
+ {
+ return 0;
+ }
+
+ template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<T> &/*elements*/, SPECIFIC_TYPE* /*fake*/)
+ {
+ return 0;
+ }
+
+ template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<TypeList<SPECIFIC_TYPE, T> >&elements, SPECIFIC_TYPE* fake)
+ {
+ return Count(elements._elements, fake);
+ }
+
+ template<class SPECIFIC_TYPE, class H, class T> size_t Count(const ContainerMapList<TypeList<H, T> >&elements, SPECIFIC_TYPE* fake)
+ {
+ return Count(elements._TailElements, fake);
+ }
+
+ // non-const insert functions
+ template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Insert(ContainerMapList<SPECIFIC_TYPE> &elements, SPECIFIC_TYPE *obj)
+ {
+ //elements._element[hdl] = obj;
+ obj->AddToGrid(elements._element);
+ return obj;
+ }
+
+ template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Insert(ContainerMapList<TypeNull> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ {
+ return NULL;
+ }
+
+ // this is a missed
+ template<class SPECIFIC_TYPE, class T> SPECIFIC_TYPE* Insert(ContainerMapList<T> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ {
+ return NULL; // a missed
+ }
+
+ // Recursion
+ template<class SPECIFIC_TYPE, class H, class T> SPECIFIC_TYPE* Insert(ContainerMapList<TypeList<H, T> >&elements, SPECIFIC_TYPE *obj)
+ {
+ SPECIFIC_TYPE* t= Insert(elements._elements, obj);
+ return (t != NULL ? t : Insert(elements._TailElements, obj));
+ }
+
+ //// non-const remove method
+ //template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Remove(ContainerMapList<SPECIFIC_TYPE> & /*elements*/, SPECIFIC_TYPE *obj)
+ //{
+ // obj->GetGridRef().unlink();
+ // return obj;
+ //}
+
+ //template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Remove(ContainerMapList<TypeNull> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ //{
+ // return NULL;
+ //}
+
+ //// this is a missed
+ //template<class SPECIFIC_TYPE, class T> SPECIFIC_TYPE* Remove(ContainerMapList<T> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ //{
+ // return NULL; // a missed
+ //}
+
+ //template<class SPECIFIC_TYPE, class T, class H> SPECIFIC_TYPE* Remove(ContainerMapList<TypeList<H, T> > &elements, SPECIFIC_TYPE *obj)
+ //{
+ // // The head element is bad
+ // SPECIFIC_TYPE* t = Remove(elements._elements, obj);
+ // return ( t != NULL ? t : Remove(elements._TailElements, obj) );
+ //}
+}
+#endif
+
diff --git a/src/common/Dynamic/TypeContainerFunctionsPtr.h b/src/common/Dynamic/TypeContainerFunctionsPtr.h
new file mode 100644
index 0000000000..6237094016
--- /dev/null
+++ b/src/common/Dynamic/TypeContainerFunctionsPtr.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TYPECONTAINER_FUNCTIONS_PTR_H
+#define TYPECONTAINER_FUNCTIONS_PTR_H
+
+/*
+ * Here you'll find a list of helper functions to make
+ * the TypeContainer usefull. Without it, its hard
+ * to access or mutate the container.
+ */
+
+#include "Platform/Define.h"
+#include "Utilities/TypeList.h"
+#include <map>
+
+namespace Trinity
+{
+ /* ContainerMapList Helpers */
+ // count functions
+ // template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<SPECIFIC_TYPE> &elements, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ // {
+ // return elements._element.size();
+ // };
+ //
+ // template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<TypeNull> &elements, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ // {
+ // return 0;
+ // }
+ //
+ // template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<T> &elements, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ // {
+ // return 0;
+ // }
+ //
+ // template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<TypeList<SPECIFIC_TYPE, T> >&elements, SPECIFIC_TYPE* fake)
+ // {
+ // return Count(elements._elements, fake);
+ // }
+ //
+ // template<class SPECIFIC_TYPE, class H, class T> size_t Count(const ContainerMapList<TypeList<H, T> >&elements, SPECIFIC_TYPE* fake)
+ // {
+ // return Count(elements._TailElements, fake);
+ // }
+
+ // non-const find functions
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<SPECIFIC_TYPE> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ typename std::map<OBJECT_HANDLE, CountedPtr<SPECIFIC_TYPE> >::iterator iter = elements._element.find(hdl);
+ return (iter == elements._element.end() ? NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL) : iter->second);
+ };
+
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<TypeNull> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);// terminate recursion
+ }
+
+ template<class SPECIFIC_TYPE, class T> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<T> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);// this is a missed
+ }
+
+ template<class SPECIFIC_TYPE, class H, class T> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<TypeList<H, T> >&elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* fake)
+ {
+ CountedPtr<SPECIFIC_TYPE> &t = Find(elements._elements, hdl, fake);
+ return (!t ? Find(elements._TailElements, hdl, fake) : t);
+ }
+
+ // const find functions
+ template<class SPECIFIC_TYPE> const CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<SPECIFIC_TYPE> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ typename CountedPtr<SPECIFIC_TYPE>::iterator iter = elements._element.find(hdl);
+ return (iter == elements._element.end() ? NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL) : iter->second);
+ };
+
+ template<class SPECIFIC_TYPE> const CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<TypeNull> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);
+ }
+
+ template<class SPECIFIC_TYPE, class T> const CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<T> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);
+ }
+
+ template<class SPECIFIC_TYPE, class H, class T> CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<TypeList<H, T> >&elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* fake)
+ {
+ CountedPtr<SPECIFIC_TYPE> &t = Find(elements._elements, hdl, fake);
+ if (!t)
+ t = Find(elements._TailElement, hdl, fake);
+
+ return t;
+ }
+
+ // non-const insert functions
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<SPECIFIC_TYPE> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ elements._element[hdl] = obj;
+ return obj;
+ };
+
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<TypeNull> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);
+ }
+
+ // this is a missed
+ template<class SPECIFIC_TYPE, class T> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<T> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);// a missed
+ }
+
+ // Recursion
+ template<class SPECIFIC_TYPE, class H, class T> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<TypeList<H, T> >&elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ CountedPtr<SPECIFIC_TYPE> &t= Insert(elements._elements, obj, hdl);
+ return (!t ? Insert(elements._TailElements, obj, hdl) : t);
+ }
+
+ // non-const remove method
+ template<class SPECIFIC_TYPE> bool Remove(ContainerMapList<SPECIFIC_TYPE> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ typename std::map<OBJECT_HANDLE, CountedPtr<SPECIFIC_TYPE> >::iterator iter = elements._element.find(hdl);
+ if ( iter != elements._element.end() )
+ {
+ elements._element.erase(iter);
+ return true;
+ }
+
+ return false; // found... terminate the search
+ }
+
+ template<class SPECIFIC_TYPE> bool Remove(ContainerMapList<TypeNull> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return false;
+ }
+
+ // this is a missed
+ template<class SPECIFIC_TYPE, class T> bool Remove(ContainerMapList<T> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return false;
+ }
+
+ template<class SPECIFIC_TYPE, class T, class H> bool Remove(ContainerMapList<TypeList<H, T> > &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ // The head element is bad
+ bool t = Remove(elements._elements, obj, hdl);
+ return ( !t ? Remove(elements._TailElements, obj, hdl) : t );
+ }
+
+}
+#endif
+
diff --git a/src/common/Dynamic/TypeContainerVisitor.h b/src/common/Dynamic/TypeContainerVisitor.h
new file mode 100644
index 0000000000..58725a7f65
--- /dev/null
+++ b/src/common/Dynamic/TypeContainerVisitor.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_TYPECONTAINERVISITOR_H
+#define TRINITY_TYPECONTAINERVISITOR_H
+
+/*
+ * @class TypeContainerVisitor is implemented as a visitor pattern. It is
+ * a visitor to the TypeContainerList or TypeContainerMapList. The visitor has
+ * to overload its types as a visit method is called.
+ */
+
+#include "Define.h"
+#include "Dynamic/TypeContainer.h"
+
+// forward declaration
+template<class T, class Y> class TypeContainerVisitor;
+
+// visitor helper
+template<class VISITOR, class TYPE_CONTAINER> void VisitorHelper(VISITOR &v, TYPE_CONTAINER &c)
+{
+ v.Visit(c);
+}
+
+// terminate condition for container list
+template<class VISITOR> void VisitorHelper(VISITOR &/*v*/, ContainerList<TypeNull> &/*c*/) { }
+
+template<class VISITOR, class T> void VisitorHelper(VISITOR &v, ContainerList<T> &c)
+{
+ v.Visit(c._element);
+}
+
+// recursion for container list
+template<class VISITOR, class H, class T> void VisitorHelper(VISITOR &v, ContainerList<TypeList<H, T> > &c)
+{
+ VisitorHelper(v, c._elements);
+ VisitorHelper(v, c._TailElements);
+}
+
+// terminate condition container map list
+template<class VISITOR> void VisitorHelper(VISITOR &/*v*/, ContainerMapList<TypeNull> &/*c*/) { }
+
+template<class VISITOR, class T> void VisitorHelper(VISITOR &v, ContainerMapList<T> &c)
+{
+ v.Visit(c._element);
+}
+
+// recursion container map list
+template<class VISITOR, class H, class T> void VisitorHelper(VISITOR &v, ContainerMapList<TypeList<H, T> > &c)
+{
+ VisitorHelper(v, c._elements);
+ VisitorHelper(v, c._TailElements);
+}
+
+// array list
+template<class VISITOR, class T> void VisitorHelper(VISITOR &v, ContainerArrayList<T> &c)
+{
+ v.Visit(c._element);
+}
+
+template<class VISITOR> void VisitorHelper(VISITOR &/*v*/, ContainerArrayList<TypeNull> &/*c*/) { }
+
+// recursion
+template<class VISITOR, class H, class T> void VisitorHelper(VISITOR &v, ContainerArrayList<TypeList<H, T> > &c)
+{
+ VisitorHelper(v, c._elements);
+ VisitorHelper(v, c._TailElements);
+}
+
+// for TypeMapContainer
+template<class VISITOR, class OBJECT_TYPES> void VisitorHelper(VISITOR &v, TypeMapContainer<OBJECT_TYPES> &c)
+{
+ VisitorHelper(v, c.GetElements());
+}
+
+template<class VISITOR, class TYPE_CONTAINER>
+class TypeContainerVisitor
+{
+ public:
+ TypeContainerVisitor(VISITOR &v) : i_visitor(v) { }
+
+ void Visit(TYPE_CONTAINER &c)
+ {
+ VisitorHelper(i_visitor, c);
+ }
+
+ void Visit(const TYPE_CONTAINER &c) const
+ {
+ VisitorHelper(i_visitor, c);
+ }
+
+ private:
+ VISITOR &i_visitor;
+};
+#endif
+
diff --git a/src/common/Dynamic/TypeList.h b/src/common/Dynamic/TypeList.h
new file mode 100644
index 0000000000..65767107cc
--- /dev/null
+++ b/src/common/Dynamic/TypeList.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_TYPELIST_H
+#define TRINITY_TYPELIST_H
+
+/*
+ @struct TypeList
+ TypeList is the most simple but yet the most powerfull class of all. It holds
+ at compile time the different type of objects in a linked list.
+ */
+
+class TypeNull;
+
+template<typename HEAD, typename TAIL>
+struct TypeList
+{
+ typedef HEAD Head;
+ typedef TAIL Tail;
+};
+
+// enough for now.. can be expand at any point in time as needed
+#define TYPELIST_1(T1) TypeList<T1, TypeNull>
+#define TYPELIST_2(T1, T2) TypeList<T1, TYPELIST_1(T2) >
+#define TYPELIST_3(T1, T2, T3) TypeList<T1, TYPELIST_2(T2, T3) >
+#define TYPELIST_4(T1, T2, T3, T4) TypeList<T1, TYPELIST_3(T2, T3, T4) >
+#define TYPELIST_5(T1, T2, T3, T4, T5) TypeList<T1, TYPELIST_4(T2, T3, T4, T5) >
+#endif
+
diff --git a/src/common/Dynamic/UnorderedMap.h b/src/common/Dynamic/UnorderedMap.h
new file mode 100644
index 0000000000..8b50eb80bc
--- /dev/null
+++ b/src/common/Dynamic/UnorderedMap.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_UNORDERED_MAP_H
+#define TRINITY_UNORDERED_MAP_H
+
+#include "HashNamespace.h"
+
+#if COMPILER_HAS_CPP11_SUPPORT
+# include <unordered_map>
+#elif COMPILER == COMPILER_INTEL
+# include <ext/hash_map>
+#elif COMPILER == COMPILER_GNU && defined(__clang__) && defined(_LIBCPP_VERSION)
+# include <unordered_map>
+#elif COMPILER == COMPILER_GNU && GCC_VERSION > 40200
+# include <tr1/unordered_map>
+#elif COMPILER == COMPILER_GNU && GCC_VERSION >= 30000
+# include <ext/hash_map>
+#elif COMPILER == COMPILER_MICROSOFT && ((_MSC_VER >= 1500 && _HAS_TR1) || _MSC_VER >= 1700) // VC9.0 SP1 and later
+# include <unordered_map>
+#else
+# include <hash_map>
+#endif
+
+#ifdef _STLPORT_VERSION
+# define UNORDERED_MAP std::hash_map
+# define UNORDERED_MULTIMAP std::hash_multimap
+#elif COMPILER_HAS_CPP11_SUPPORT
+# define UNORDERED_MAP std::unordered_map
+# define UNORDERED_MULTIMAP std::unordered_multimap
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1600 // VS100
+# define UNORDERED_MAP std::tr1::unordered_map
+# define UNORDERED_MULTIMAP std::tr1::unordered_multimap
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1
+# define UNORDERED_MAP std::tr1::unordered_map
+# define UNORDERED_MULTIMAP std::tr1::unordered_multimap
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1300
+# define UNORDERED_MAP stdext::hash_map
+# define UNORDERED_MULTIMAP stdext::hash_multimap
+#elif COMPILER == COMPILER_INTEL
+# define UNORDERED_MAP std::hash_map
+# define UNORDERED_MULTIMAP std::hash_multimap
+#elif COMPILER == COMPILER_GNU && defined(__clang__) && defined(_LIBCPP_VERSION)
+# define UNORDERED_MAP std::unordered_map
+# define UNORDERED_MULTIMAP std::unordered_multimap
+#elif COMPILER == COMPILER_GNU && GCC_VERSION > 40200
+# define UNORDERED_MAP std::tr1::unordered_map
+# define UNORDERED_MULTIMAP std::tr1::unordered_multimap
+#elif COMPILER == COMPILER_GNU && GCC_VERSION >= 30000
+# define UNORDERED_MAP __gnu_cxx::hash_map
+# define UNORDERED_MULTIMAP __gnu_cxx::hash_multimap
+#else
+# define UNORDERED_MAP std::hash_map
+# define UNORDERED_MULTIMAP std::hash_multimap
+#endif
+
+#endif
diff --git a/src/common/Dynamic/UnorderedSet.h b/src/common/Dynamic/UnorderedSet.h
new file mode 100644
index 0000000000..c7f096480b
--- /dev/null
+++ b/src/common/Dynamic/UnorderedSet.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_UNORDERED_SET_H
+#define TRINITY_UNORDERED_SET_H
+
+#include "HashNamespace.h"
+
+#if COMPILER_HAS_CPP11_SUPPORT
+# include <unordered_set>
+#elif COMPILER == COMPILER_INTEL
+# include <ext/hash_set>
+#elif COMPILER == COMPILER_GNU && defined(__clang__) && defined(_LIBCPP_VERSION)
+# include <unordered_set>
+#elif COMPILER == COMPILER_GNU && GCC_VERSION > 40200
+# include <tr1/unordered_set>
+#elif COMPILER == COMPILER_GNU && GCC_VERSION >= 30000
+# include <ext/hash_set>
+#elif COMPILER == COMPILER_MICROSOFT && ((_MSC_VER >= 1500 && _HAS_TR1) || _MSC_VER >= 1700) // VC9.0 SP1 and later
+# include <unordered_set>
+#else
+# include <hash_set>
+#endif
+
+#ifdef _STLPORT_VERSION
+# define UNORDERED_SET std::hash_set
+using std::hash_set;
+#elif COMPILER_HAS_CPP11_SUPPORT
+# define UNORDERED_SET std::unordered_set
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1600 // VS100
+# define UNORDERED_SET std::tr1::unordered_set
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1
+# define UNORDERED_SET std::tr1::unordered_set
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1300
+# define UNORDERED_SET stdext::hash_set
+using stdext::hash_set;
+#elif COMPILER == COMPILER_INTEL
+# define UNORDERED_SET std::hash_set
+using std::hash_set;
+#elif COMPILER == COMPILER_GNU && defined(__clang__) && defined(_LIBCPP_VERSION)
+# define UNORDERED_SET std::unordered_set
+#elif COMPILER == COMPILER_GNU && GCC_VERSION > 40200
+# define UNORDERED_SET std::tr1::unordered_set
+#elif COMPILER == COMPILER_GNU && GCC_VERSION >= 30000
+# define UNORDERED_SET __gnu_cxx::hash_set
+#else
+# define UNORDERED_SET std::hash_set
+using std::hash_set;
+#endif
+
+#endif
diff --git a/src/common/Logging/Log.cpp b/src/common/Logging/Log.cpp
new file mode 100644
index 0000000000..0a3c875a43
--- /dev/null
+++ b/src/common/Logging/Log.cpp
@@ -0,0 +1,1010 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Common.h"
+#include "Log.h"
+#include "WorldPacket.h"
+#include "Configuration/Config.h"
+#include "Util.h"
+#include "SHA1.h"
+
+#include "Implementation/LoginDatabase.h" // For logging
+extern LoginDatabaseWorkerPool LoginDatabase;
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <ace/Stack_Trace.h>
+
+Log::Log() :
+ raLogfile(NULL), logfile(NULL), gmLogfile(NULL), charLogfile(NULL),
+ dberLogfile(NULL), chatLogfile(NULL), sqlLogFile(NULL), sqlDevLogFile(NULL), miscLogFile(NULL),
+ m_gmlog_per_account(false), m_enableLogDB(false), m_colored(false)
+{
+ Initialize();
+}
+
+Log::~Log()
+{
+ if (logfile != NULL)
+ fclose(logfile);
+ logfile = NULL;
+
+ if (gmLogfile != NULL)
+ fclose(gmLogfile);
+ gmLogfile = NULL;
+
+ if (charLogfile != NULL)
+ fclose(charLogfile);
+ charLogfile = NULL;
+
+ if (dberLogfile != NULL)
+ fclose(dberLogfile);
+ dberLogfile = NULL;
+
+ if (raLogfile != NULL)
+ fclose(raLogfile);
+ raLogfile = NULL;
+
+ if (chatLogfile != NULL)
+ fclose(chatLogfile);
+ chatLogfile = NULL;
+
+ if (sqlLogFile != NULL)
+ fclose(sqlLogFile);
+ sqlLogFile = NULL;
+
+ if (sqlDevLogFile != NULL)
+ fclose(sqlDevLogFile);
+ sqlDevLogFile = NULL;
+
+ if (miscLogFile != NULL)
+ fclose(miscLogFile);
+ miscLogFile = NULL;
+}
+
+void Log::SetLogLevel(char *Level)
+{
+ int32 NewLevel = atoi((char*)Level);
+ if (NewLevel < 0)
+ NewLevel = 0;
+ m_logLevel = NewLevel;
+
+ outString("LogLevel is %u", m_logLevel);
+}
+
+void Log::SetLogFileLevel(char *Level)
+{
+ int32 NewLevel = atoi((char*)Level);
+ if (NewLevel < 0)
+ NewLevel = 0;
+ m_logFileLevel = NewLevel;
+
+ outString("LogFileLevel is %u", m_logFileLevel);
+}
+
+void Log::Initialize()
+{
+ /// Check whether we'll log GM commands/RA events/character outputs/chat stuffs
+ m_dbChar = sConfigMgr->GetBoolDefault("LogDB.Char", false);
+ m_dbRA = sConfigMgr->GetBoolDefault("LogDB.RA", false);
+ m_dbGM = sConfigMgr->GetBoolDefault("LogDB.GM", false);
+ m_dbChat = sConfigMgr->GetBoolDefault("LogDB.Chat", false);
+
+ /// Realm must be 0 by default
+ SetRealmID(0);
+
+ /// Common log files data
+ m_logsDir = sConfigMgr->GetStringDefault("LogsDir", "");
+ if (!m_logsDir.empty())
+ if ((m_logsDir.at(m_logsDir.length() - 1) != '/') && (m_logsDir.at(m_logsDir.length() - 1) != '\\'))
+ m_logsDir.push_back('/');
+
+ m_logsTimestamp = "_" + GetTimestampStr();
+
+ /// Open specific log files
+ logfile = openLogFile("LogFile", "LogTimestamp", "w");
+ InitColors(sConfigMgr->GetStringDefault("LogColors", ""));
+
+ m_gmlog_per_account = sConfigMgr->GetBoolDefault("GmLogPerAccount", false);
+ if (!m_gmlog_per_account)
+ gmLogfile = openLogFile("GMLogFile", "GmLogTimestamp", "a");
+ else
+ {
+ // GM log settings for per account case
+ m_gmlog_filename_format = sConfigMgr->GetStringDefault("GMLogFile", "");
+ if (!m_gmlog_filename_format.empty())
+ {
+ bool m_gmlog_timestamp = sConfigMgr->GetBoolDefault("GmLogTimestamp", false);
+
+ size_t dot_pos = m_gmlog_filename_format.find_last_of('.');
+ if (dot_pos!=m_gmlog_filename_format.npos)
+ {
+ if (m_gmlog_timestamp)
+ m_gmlog_filename_format.insert(dot_pos, m_logsTimestamp);
+
+ m_gmlog_filename_format.insert(dot_pos, "_#%u");
+ }
+ else
+ {
+ m_gmlog_filename_format += "_#%u";
+
+ if (m_gmlog_timestamp)
+ m_gmlog_filename_format += m_logsTimestamp;
+ }
+
+ m_gmlog_filename_format = m_logsDir + m_gmlog_filename_format;
+ }
+ }
+
+ charLogfile = openLogFile("CharLogFile", "CharLogTimestamp", "a");
+ dberLogfile = openLogFile("DBErrorLogFile", NULL, "a");
+ raLogfile = openLogFile("RaLogFile", NULL, "a");
+ chatLogfile = openLogFile("ChatLogFile", "ChatLogTimestamp", "a");
+ sqlLogFile = openLogFile("SQLDriverLogFile", NULL, "a");
+ sqlDevLogFile = openLogFile("SQLDeveloperLogFile", NULL, "a");
+ miscLogFile = fopen((m_logsDir+"Misc.log").c_str(), "a");
+
+ // Main log file settings
+ m_logLevel = sConfigMgr->GetIntDefault("LogLevel", LOGL_NORMAL);
+ m_logFileLevel = sConfigMgr->GetIntDefault("LogFileLevel", LOGL_NORMAL);
+ m_dbLogLevel = sConfigMgr->GetIntDefault("DBLogLevel", LOGL_NORMAL);
+ m_sqlDriverQueryLogging = sConfigMgr->GetBoolDefault("SQLDriverQueryLogging", false);
+
+ m_DebugLogMask = DebugLogFilters(sConfigMgr->GetIntDefault("DebugLogMask", LOG_FILTER_NONE));
+
+ // Char log settings
+ m_charLog_Dump = sConfigMgr->GetBoolDefault("CharLogDump", false);
+ m_charLog_Dump_Separate = sConfigMgr->GetBoolDefault("CharLogDump.Separate", false);
+ if (m_charLog_Dump_Separate)
+ {
+ m_dumpsDir = sConfigMgr->GetStringDefault("CharLogDump.SeparateDir", "");
+ if (!m_dumpsDir.empty())
+ if ((m_dumpsDir.at(m_dumpsDir.length() - 1) != '/') && (m_dumpsDir.at(m_dumpsDir.length() - 1) != '\\'))
+ m_dumpsDir.push_back('/');
+ }
+}
+
+void Log::ReloadConfig()
+{
+ m_logLevel = sConfigMgr->GetIntDefault("LogLevel", LOGL_NORMAL);
+ m_logFileLevel = sConfigMgr->GetIntDefault("LogFileLevel", LOGL_NORMAL);
+ m_dbLogLevel = sConfigMgr->GetIntDefault("DBLogLevel", LOGL_NORMAL);
+
+ m_DebugLogMask = DebugLogFilters(sConfigMgr->GetIntDefault("DebugLogMask", LOG_FILTER_NONE));
+}
+
+FILE* Log::openLogFile(char const* configFileName, char const* configTimeStampFlag, char const* mode)
+{
+ std::string logfn=sConfigMgr->GetStringDefault(configFileName, "");
+ if (logfn.empty())
+ return NULL;
+
+ if (configTimeStampFlag && sConfigMgr->GetBoolDefault(configTimeStampFlag, false))
+ {
+ size_t dot_pos = logfn.find_last_of(".");
+ if (dot_pos!=logfn.npos)
+ logfn.insert(dot_pos, m_logsTimestamp);
+ else
+ logfn += m_logsTimestamp;
+ }
+
+ return fopen((m_logsDir+logfn).c_str(), mode);
+}
+
+FILE* Log::openGmlogPerAccount(uint32 account)
+{
+ if (m_gmlog_filename_format.empty())
+ return NULL;
+
+ char namebuf[TRINITY_PATH_MAX];
+ snprintf(namebuf, TRINITY_PATH_MAX, m_gmlog_filename_format.c_str(), account);
+ return fopen(namebuf, "a");
+}
+
+void Log::outTimestamp(FILE* file)
+{
+ time_t t = time(NULL);
+ tm* aTm = localtime(&t);
+ // YYYY year
+ // MM month (2 digits 01-12)
+ // DD day (2 digits 01-31)
+ // HH hour (2 digits 00-23)
+ // MM minutes (2 digits 00-59)
+ // SS seconds (2 digits 00-59)
+ fprintf(file, "%-4d-%02d-%02d %02d:%02d:%02d ", aTm->tm_year+1900, aTm->tm_mon+1, aTm->tm_mday, aTm->tm_hour, aTm->tm_min, aTm->tm_sec);
+}
+
+void Log::InitColors(const std::string& str)
+{
+ if (str.empty())
+ {
+ m_colored = false;
+ return;
+ }
+
+ int color[4];
+
+ std::istringstream ss(str);
+
+ for (uint8 i = 0; i < LogLevels; ++i)
+ {
+ ss >> color[i];
+
+ if (!ss)
+ return;
+
+ if (color[i] < 0 || color[i] >= Colors)
+ return;
+ }
+
+ for (uint8 i = 0; i < LogLevels; ++i)
+ m_colors[i] = ColorTypes(color[i]);
+
+ m_colored = true;
+}
+
+void Log::SetColor(bool stdout_stream, ColorTypes color)
+{
+ #if PLATFORM == PLATFORM_WINDOWS
+ static WORD WinColorFG[Colors] =
+ {
+ 0, // BLACK
+ FOREGROUND_RED, // RED
+ FOREGROUND_GREEN, // GREEN
+ FOREGROUND_RED | FOREGROUND_GREEN, // BROWN
+ FOREGROUND_BLUE, // BLUE
+ FOREGROUND_RED | FOREGROUND_BLUE, // MAGENTA
+ FOREGROUND_GREEN | FOREGROUND_BLUE, // CYAN
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, // WHITE
+ // YELLOW
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
+ // RED_BOLD
+ FOREGROUND_RED | FOREGROUND_INTENSITY,
+ // GREEN_BOLD
+ FOREGROUND_GREEN | FOREGROUND_INTENSITY,
+ FOREGROUND_BLUE | FOREGROUND_INTENSITY, // BLUE_BOLD
+ // MAGENTA_BOLD
+ FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
+ // CYAN_BOLD
+ FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY,
+ // WHITE_BOLD
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY
+ };
+
+ HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE );
+ SetConsoleTextAttribute(hConsole, WinColorFG[color]);
+ #else
+ enum ANSITextAttr
+ {
+ TA_NORMAL=0,
+ TA_BOLD=1,
+ TA_BLINK=5,
+ TA_REVERSE=7
+ };
+
+ enum ANSIFgTextAttr
+ {
+ FG_BLACK=30, FG_RED, FG_GREEN, FG_BROWN, FG_BLUE,
+ FG_MAGENTA, FG_CYAN, FG_WHITE, FG_YELLOW
+ };
+
+ enum ANSIBgTextAttr
+ {
+ BG_BLACK=40, BG_RED, BG_GREEN, BG_BROWN, BG_BLUE,
+ BG_MAGENTA, BG_CYAN, BG_WHITE
+ };
+
+ static uint8 UnixColorFG[Colors] =
+ {
+ FG_BLACK, // BLACK
+ FG_RED, // RED
+ FG_GREEN, // GREEN
+ FG_BROWN, // BROWN
+ FG_BLUE, // BLUE
+ FG_MAGENTA, // MAGENTA
+ FG_CYAN, // CYAN
+ FG_WHITE, // WHITE
+ FG_YELLOW, // YELLOW
+ FG_RED, // LRED
+ FG_GREEN, // LGREEN
+ FG_BLUE, // LBLUE
+ FG_MAGENTA, // LMAGENTA
+ FG_CYAN, // LCYAN
+ FG_WHITE // LWHITE
+ };
+
+ fprintf((stdout_stream? stdout : stderr), "\x1b[%d%sm", UnixColorFG[color], (color >= YELLOW && color < Colors ? ";1" : ""));
+ #endif
+}
+
+void Log::ResetColor(bool stdout_stream)
+{
+ #if PLATFORM == PLATFORM_WINDOWS
+ HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE );
+ SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED );
+ #else
+ fprintf(( stdout_stream ? stdout : stderr ), "\x1b[0m");
+ #endif
+}
+
+std::string Log::GetTimestampStr()
+{
+ time_t t = time(NULL);
+ tm aTm;
+ ACE_OS::localtime_r(&t, &aTm);
+ // YYYY year
+ // MM month (2 digits 01-12)
+ // DD day (2 digits 01-31)
+ // HH hour (2 digits 00-23)
+ // MM minutes (2 digits 00-59)
+ // SS seconds (2 digits 00-59)
+ char buf[20];
+ snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
+ return std::string(buf);
+}
+
+void Log::outDB(LogTypes type, const char * str)
+{
+ if(!str || std::string(str).empty() || type >= MAX_LOG_TYPES)
+ return;
+
+ std::string new_str(str);
+ LoginDatabase.EscapeString(new_str);
+
+ LoginDatabase.PExecute("INSERT INTO logs (time, realm, type, string) "
+ "VALUES (" UI64FMTD ", %u, %u, '%s');", uint64(time(0)), realm, (uint32)type, new_str.c_str());
+}
+
+void Log::outString(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ /*if (m_enableLogDB)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_STRING, nnew_str);
+ va_end(ap2);
+ }*/
+
+ if (m_colored)
+ SetColor(true, m_colors[LOGL_NORMAL]);
+
+ va_list ap;
+
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(true);
+
+ printf("\n");
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ va_start(ap, str);
+ vfprintf(logfile, str, ap);
+ fprintf(logfile, "\n");
+ va_end(ap);
+
+ fflush(logfile);
+ }
+ fflush(stdout);
+}
+
+void Log::outString()
+{
+ printf("\n");
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ fprintf(logfile, "\n");
+ fflush(logfile);
+ }
+ fflush(stdout);
+}
+
+void Log::outCrash(const char * err, ...)
+{
+ if (!err)
+ return;
+
+ if (m_enableLogDB)
+ {
+ va_list ap2;
+ va_start(ap2, err);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, err, ap2);
+ outDB(LOG_TYPE_CRASH, nnew_str);
+ va_end(ap2);
+ }
+
+ if (m_colored)
+ SetColor(false, LRED);
+
+ va_list ap;
+
+ va_start(ap, err);
+ vutf8printf(stderr, err, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(false);
+
+ fprintf(stderr, "\n");
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ fprintf(logfile, "CRASH ALERT: ");
+
+ va_start(ap, err);
+ vfprintf(logfile, err, ap);
+ va_end(ap);
+
+ fprintf(logfile, "\n");
+ fflush(logfile);
+ }
+ fflush(stderr);
+}
+
+void Log::outError(const char * err, ...)
+{
+ if (!err)
+ return;
+
+ if (m_enableLogDB)
+ {
+ va_list ap2;
+ va_start(ap2, err);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, err, ap2);
+ outDB(LOG_TYPE_ERROR, nnew_str);
+ va_end(ap2);
+ }
+
+ if (m_colored)
+ SetColor(false, LRED);
+
+ va_list ap;
+
+ va_start(ap, err);
+ vutf8printf(stderr, err, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(false);
+
+ fprintf( stderr, "\n");
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ fprintf(logfile, "ERROR: ");
+
+ va_start(ap, err);
+ vfprintf(logfile, err, ap);
+ va_end(ap);
+
+ fprintf(logfile, "\n");
+ fflush(logfile);
+ }
+ fflush(stderr);
+}
+
+void Log::outSQLDriver(const char* str, ...)
+{
+ if (!str)
+ return;
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ printf("\n");
+
+ if (sqlLogFile)
+ {
+ outTimestamp(sqlLogFile);
+
+ va_list apSQL;
+ va_start(apSQL, str);
+ vfprintf(sqlLogFile, str, apSQL);
+ va_end(apSQL);
+
+ fprintf(sqlLogFile, "\n");
+ fflush(sqlLogFile);
+ }
+
+ fflush(stdout);
+}
+
+void Log::outErrorDb(const char * err, ...)
+{
+ if (!err)
+ return;
+
+ if (m_colored)
+ SetColor(false, LRED);
+
+ if (m_enableLogDB)
+ {
+ va_list ap2;
+ va_start(ap2, err);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, err, ap2);
+ outDB(LOG_TYPE_ERROR, nnew_str);
+ va_end(ap2);
+ }
+
+ va_list ap;
+
+ va_start(ap, err);
+ vutf8printf(stderr, err, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(false);
+
+ fprintf( stderr, "\n" );
+
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ fprintf(logfile, "ERROR: " );
+
+ va_start(ap, err);
+ vfprintf(logfile, err, ap);
+ va_end(ap);
+
+ fprintf(logfile, "\n" );
+ fflush(logfile);
+ }
+
+ if (dberLogfile)
+ {
+ outTimestamp(dberLogfile);
+ va_start(ap, err);
+ vfprintf(dberLogfile, err, ap);
+ va_end(ap);
+
+ fprintf(dberLogfile, "\n" );
+ fflush(dberLogfile);
+ }
+ fflush(stderr);
+}
+
+void Log::outBasic(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ if (m_enableLogDB && m_dbLogLevel > LOGL_NORMAL)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_BASIC, nnew_str);
+ va_end(ap2);
+ }
+
+ if (m_logLevel > LOGL_NORMAL)
+ {
+ if (m_colored)
+ SetColor(true, m_colors[LOGL_BASIC]);
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(true);
+
+ printf("\n");
+
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ va_list ap2;
+ va_start(ap2, str);
+ vfprintf(logfile, str, ap2);
+ fprintf(logfile, "\n" );
+ va_end(ap2);
+ fflush(logfile);
+ }
+ }
+ fflush(stdout);
+}
+
+void Log::outDetail(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ if (m_enableLogDB && m_dbLogLevel > LOGL_BASIC)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_DETAIL, nnew_str);
+ va_end(ap2);
+ }
+
+ if (m_logLevel > LOGL_BASIC)
+ {
+ if (m_colored)
+ SetColor(true, m_colors[LOGL_DETAIL]);
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(true);
+
+ printf("\n");
+
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ va_list ap2;
+ va_start(ap2, str);
+ vfprintf(logfile, str, ap2);
+ va_end(ap2);
+
+ fprintf(logfile, "\n");
+ fflush(logfile);
+ }
+ }
+
+ fflush(stdout);
+}
+
+void Log::outSQLDev(const char* str, ...)
+{
+ if (!str)
+ return;
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ printf("\n");
+
+ if (sqlDevLogFile)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ vfprintf(sqlDevLogFile, str, ap2);
+ va_end(ap2);
+
+ fprintf(sqlDevLogFile, "\n");
+ fflush(sqlDevLogFile);
+ }
+
+ fflush(stdout);
+}
+
+void Log::outDebug(DebugLogFilters f, const char * str, ...)
+{
+ if (!(m_DebugLogMask & f))
+ return;
+
+ if (!str)
+ return;
+
+ if (m_enableLogDB && m_dbLogLevel > LOGL_DETAIL)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_DEBUG, nnew_str);
+ va_end(ap2);
+ }
+
+ if ( m_logLevel > LOGL_DETAIL )
+ {
+ if (m_colored)
+ SetColor(true, m_colors[LOGL_DEBUG]);
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(true);
+
+ printf( "\n" );
+
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ va_list ap2;
+ va_start(ap2, str);
+ vfprintf(logfile, str, ap2);
+ va_end(ap2);
+
+ fprintf(logfile, "\n" );
+ fflush(logfile);
+ }
+ }
+ fflush(stdout);
+}
+
+void Log::outStaticDebug(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ if (m_enableLogDB && m_dbLogLevel > LOGL_DETAIL)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_DEBUG, nnew_str);
+ va_end(ap2);
+ }
+
+ if ( m_logLevel > LOGL_DETAIL )
+ {
+ if (m_colored)
+ SetColor(true, m_colors[LOGL_DEBUG]);
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(true);
+
+ printf( "\n" );
+
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ va_list ap2;
+ va_start(ap2, str);
+ vfprintf(logfile, str, ap2);
+ va_end(ap2);
+
+ fprintf(logfile, "\n" );
+ fflush(logfile);
+ }
+ }
+ fflush(stdout);
+}
+
+void Log::outStringInLine(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ va_list ap;
+
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if (logfile)
+ {
+ va_start(ap, str);
+ vfprintf(logfile, str, ap);
+ va_end(ap);
+ }
+}
+
+void Log::outCommand(uint32 account, const char * str, ...)
+{
+ if (!str)
+ return;
+
+ // TODO: support accountid
+ if (m_enableLogDB && m_dbGM)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_GM, nnew_str);
+ va_end(ap2);
+ }
+
+ if (m_logLevel > LOGL_NORMAL)
+ {
+ if (m_colored)
+ SetColor(true, m_colors[LOGL_BASIC]);
+
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(stdout, str, &ap);
+ va_end(ap);
+
+ if (m_colored)
+ ResetColor(true);
+
+ printf("\n");
+
+ if (logfile)
+ {
+ outTimestamp(logfile);
+ va_list ap2;
+ va_start(ap2, str);
+ vfprintf(logfile, str, ap2);
+ fprintf(logfile, "\n" );
+ va_end(ap2);
+ fflush(logfile);
+ }
+ }
+
+ if (m_gmlog_per_account)
+ {
+ if (FILE* per_file = openGmlogPerAccount (account))
+ {
+ outTimestamp(per_file);
+ va_list ap;
+ va_start(ap, str);
+ vfprintf(per_file, str, ap);
+ fprintf(per_file, "\n" );
+ va_end(ap);
+ fclose(per_file);
+ }
+ }
+ else if (gmLogfile)
+ {
+ outTimestamp(gmLogfile);
+ va_list ap;
+ va_start(ap, str);
+ vfprintf(gmLogfile, str, ap);
+ fprintf(gmLogfile, "\n" );
+ va_end(ap);
+ fflush(gmLogfile);
+ }
+
+ fflush(stdout);
+}
+
+void Log::outChar(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ if (m_enableLogDB && m_dbChar)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_CHAR, nnew_str);
+ va_end(ap2);
+ }
+
+ if (charLogfile)
+ {
+ outTimestamp(charLogfile);
+ va_list ap;
+ va_start(ap, str);
+ vfprintf(charLogfile, str, ap);
+ fprintf(charLogfile, "\n" );
+ va_end(ap);
+ fflush(charLogfile);
+ }
+}
+
+void Log::outCharDump(const char * str, uint32 account_id, uint32 guid, const char * name)
+{
+ FILE* file = NULL;
+ if (m_charLog_Dump_Separate)
+ {
+ char fileName[29]; // Max length: name(12) + guid(11) + _.log (5) + \0
+ snprintf(fileName, 29, "%d_%s.log", guid, name);
+ std::string sFileName(m_dumpsDir);
+ sFileName.append(fileName);
+ file = fopen((m_logsDir + sFileName).c_str(), "w");
+ }
+ else
+ file = charLogfile;
+ if (file)
+ {
+ fprintf(file, "== START DUMP == (account: %u guid: %u name: %s )\n%s\n== END DUMP ==\n",
+ account_id, guid, name, str);
+ fflush(file);
+ if (m_charLog_Dump_Separate)
+ fclose(file);
+ }
+}
+
+void Log::outChat(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ if (m_enableLogDB && m_dbChat)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_CHAT, nnew_str);
+ va_end(ap2);
+ }
+
+ if (chatLogfile)
+ {
+ outTimestamp(chatLogfile);
+ va_list ap;
+ va_start(ap, str);
+ vfprintf(chatLogfile, str, ap);
+ fprintf(chatLogfile, "\n");
+ fflush(chatLogfile);
+ va_end(ap);
+ }
+}
+
+void Log::outRemote(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ if (m_enableLogDB && m_dbRA)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_RA, nnew_str);
+ va_end(ap2);
+ }
+
+ if (raLogfile)
+ {
+ outTimestamp(raLogfile);
+ va_list ap;
+ va_start(ap, str);
+ vfprintf(raLogfile, str, ap);
+ fprintf(raLogfile, "\n" );
+ va_end(ap);
+ fflush(raLogfile);
+ }
+}
+
+void Log::outMisc(const char * str, ...)
+{
+ if (!str)
+ return;
+
+ if (m_enableLogDB)
+ {
+ va_list ap2;
+ va_start(ap2, str);
+ char nnew_str[MAX_QUERY_LEN];
+ vsnprintf(nnew_str, MAX_QUERY_LEN, str, ap2);
+ outDB(LOG_TYPE_PERF, nnew_str);
+ va_end(ap2);
+ }
+
+ if (miscLogFile)
+ {
+ outTimestamp(miscLogFile);
+ va_list ap;
+ va_start(ap, str);
+ vfprintf(miscLogFile, str, ap);
+ fprintf(miscLogFile, "\n" );
+ fflush(miscLogFile);
+ va_end(ap);
+ }
+}
diff --git a/src/common/Logging/Log.h b/src/common/Logging/Log.h
new file mode 100644
index 0000000000..d534b92ec7
--- /dev/null
+++ b/src/common/Logging/Log.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef AZEROTHCORE_LOG_H
+#define AZEROTHCORE_LOG_H
+
+#include "Common.h"
+#include <ace/Task.h>
+#include <ace/Singleton.h>
+
+class WorldPacket;
+
+enum DebugLogFilters
+{
+ LOG_FILTER_NONE = 0x00000000,
+ LOG_FILTER_UNITS = 0x00000001, // Anything related to units that doesn't fit in other categories. ie. creature formations
+ LOG_FILTER_PETS = 0x00000002,
+ LOG_FILTER_VEHICLES = 0x00000004,
+ LOG_FILTER_TSCR = 0x00000008, // C++ AI, instance scripts, etc.
+ LOG_FILTER_DATABASE_AI = 0x00000010, // SmartAI, EventAI, CreatureAI
+ LOG_FILTER_MAPSCRIPTS = 0x00000020,
+ LOG_FILTER_NETWORKIO = 0x00000040, // Anything packet/netcode related
+ LOG_FILTER_SPELLS_AURAS = 0x00000080,
+ LOG_FILTER_ACHIEVEMENTSYS = 0x00000100,
+ LOG_FILTER_CONDITIONSYS = 0x00000200,
+ LOG_FILTER_POOLSYS = 0x00000400,
+ LOG_FILTER_AUCTIONHOUSE = 0x00000800,
+ LOG_FILTER_BATTLEGROUND = 0x00001000, // Anything related to arena's and battlegrounds
+ LOG_FILTER_OUTDOORPVP = 0x00002000,
+ LOG_FILTER_CHATSYS = 0x00004000,
+ LOG_FILTER_LFG = 0x00008000,
+ LOG_FILTER_MAPS = 0x00010000, // Maps, instances, grids, cells, visibility
+ LOG_FILTER_PLAYER_LOADING = 0x00020000, // Debug output from Player::_Load functions
+ LOG_FILTER_PLAYER_ITEMS = 0x00040000, // Anything item related
+ LOG_FILTER_PLAYER_SKILLS = 0x00080000, // Skills related
+ LOG_FILTER_LOOT = 0x00100000, // Loot related
+ LOG_FILTER_GUILD = 0x00200000, // Guild related
+ LOG_FILTER_TRANSPORTS = 0x00400000, // Transport related
+ LOG_FILTER_WARDEN = 0x00800000, // Warden related
+ LOG_FILTER_BATTLEFIELD = 0x01000000, // Battlefield related
+ LOG_FILTER_MODULES = 0x02000000, // Modules debug
+};
+
+enum LogTypes
+{
+ LOG_TYPE_STRING = 0,
+ LOG_TYPE_ERROR = 1,
+ LOG_TYPE_BASIC = 2,
+ LOG_TYPE_DETAIL = 3,
+ LOG_TYPE_DEBUG = 4,
+ LOG_TYPE_CHAR = 5,
+ LOG_TYPE_WORLD = 6,
+ LOG_TYPE_RA = 7,
+ LOG_TYPE_GM = 8,
+ LOG_TYPE_CRASH = 9,
+ LOG_TYPE_CHAT = 10,
+ LOG_TYPE_PERF = 11,
+ LOG_TYPE_MULTITH= 12,
+ MAX_LOG_TYPES
+};
+
+enum LogLevel
+{
+ LOGL_NORMAL = 0,
+ LOGL_BASIC,
+ LOGL_DETAIL,
+ LOGL_DEBUG
+};
+
+const int LogLevels = int(LOGL_DEBUG)+1;
+
+enum ColorTypes
+{
+ BLACK,
+ RED,
+ GREEN,
+ BROWN,
+ BLUE,
+ MAGENTA,
+ CYAN,
+ GREY,
+ YELLOW,
+ LRED,
+ LGREEN,
+ LBLUE,
+ LMAGENTA,
+ LCYAN,
+ WHITE
+};
+
+const int Colors = int(WHITE)+1;
+
+class Log
+{
+ friend class ACE_Singleton<Log, ACE_Thread_Mutex>;
+
+ private:
+ Log();
+ ~Log();
+
+ public:
+ void Initialize();
+
+ void ReloadConfig();
+
+ void InitColors(const std::string& init_str);
+ void SetColor(bool stdout_stream, ColorTypes color);
+ void ResetColor(bool stdout_stream);
+
+ void outDB(LogTypes type, const char * str);
+ void outString(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outString();
+ void outStringInLine(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outError(const char * err, ...) ATTR_PRINTF(2, 3);
+ void outCrash(const char * err, ...) ATTR_PRINTF(2, 3);
+ void outBasic(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outDetail(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outSQLDev(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outDebug(DebugLogFilters f, const char* str, ...) ATTR_PRINTF(3, 4);
+ void outStaticDebug(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outErrorDb(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outChar(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outCommand(uint32 account, const char * str, ...) ATTR_PRINTF(3, 4);
+ void outChat(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outRemote(const char * str, ...) ATTR_PRINTF(2, 3);
+ void outSQLDriver(const char* str, ...) ATTR_PRINTF(2, 3);
+ void outMisc(const char * str, ...) ATTR_PRINTF(2, 3); // pussywizard
+ void outCharDump(const char * str, uint32 account_id, uint32 guid, const char * name);
+
+ static void outTimestamp(FILE* file);
+ static std::string GetTimestampStr();
+
+ void SetLogLevel(char * Level);
+ void SetLogFileLevel(char * Level);
+ void SetSQLDriverQueryLogging(bool newStatus) { m_sqlDriverQueryLogging = newStatus; }
+ void SetRealmID(uint32 id) { realm = id; }
+
+ bool IsOutDebug() const { return m_logLevel > 2 || (m_logFileLevel > 2 && logfile); }
+ bool IsOutCharDump() const { return m_charLog_Dump; }
+
+ bool GetLogDB() const { return m_enableLogDB; }
+ void SetLogDB(bool enable) { m_enableLogDB = enable; }
+ bool GetSQLDriverQueryLogging() const { return m_sqlDriverQueryLogging; }
+ private:
+ FILE* openLogFile(char const* configFileName, char const* configTimeStampFlag, char const* mode);
+ FILE* openGmlogPerAccount(uint32 account);
+
+ FILE* raLogfile;
+ FILE* logfile;
+ FILE* gmLogfile;
+ FILE* charLogfile;
+ FILE* dberLogfile;
+ FILE* chatLogfile;
+ FILE* sqlLogFile;
+ FILE* sqlDevLogFile;
+ FILE* miscLogFile;
+
+ // cache values for after initilization use (like gm log per account case)
+ std::string m_logsDir;
+ std::string m_logsTimestamp;
+
+ // gm log control
+ bool m_gmlog_per_account;
+ std::string m_gmlog_filename_format;
+
+ bool m_enableLogDB;
+ uint32 realm;
+
+ // log coloring
+ bool m_colored;
+ ColorTypes m_colors[4];
+
+ // log levels:
+ // false: errors only, true: full query logging
+ bool m_sqlDriverQueryLogging;
+
+ // log levels:
+ // 0 minimum/string, 1 basic/error, 2 detail, 3 full/debug
+ uint8 m_dbLogLevel;
+ uint8 m_logLevel;
+ uint8 m_logFileLevel;
+ bool m_dbChar;
+ bool m_dbRA;
+ bool m_dbGM;
+ bool m_dbChat;
+ bool m_charLog_Dump;
+ bool m_charLog_Dump_Separate;
+ std::string m_dumpsDir;
+
+ DebugLogFilters m_DebugLogMask;
+};
+
+#define sLog ACE_Singleton<Log, ACE_Thread_Mutex>::instance()
+
+#endif
+
diff --git a/src/common/Packets/ByteBuffer.cpp b/src/common/Packets/ByteBuffer.cpp
new file mode 100644
index 0000000000..653d45c089
--- /dev/null
+++ b/src/common/Packets/ByteBuffer.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ByteBuffer.h"
+#include "Common.h"
+#include "Log.h"
+
+#include <ace/Stack_Trace.h>
+#include <sstream>
+
+ByteBufferPositionException::ByteBufferPositionException(bool add, size_t pos,
+ size_t size, size_t valueSize)
+{
+ std::ostringstream ss;
+
+ ss << "Attempted to " << (add ? "put" : "get") << " value with size: "
+ << valueSize << " in ByteBuffer (pos: " << pos << " size: " << size
+ << ")";
+
+ message().assign(ss.str());
+}
+
+ByteBufferSourceException::ByteBufferSourceException(size_t pos, size_t size,
+ size_t valueSize)
+{
+ std::ostringstream ss;
+
+ ss << "Attempted to put a "
+ << (valueSize > 0 ? "NULL-pointer" : "zero-sized value")
+ << " in ByteBuffer (pos: " << pos << " size: " << size << ")";
+
+ message().assign(ss.str());
+}
+
+void ByteBuffer::hexlike(bool outString) const
+{
+ if (!outString)
+ return;
+
+ uint32 j = 1, k = 1;
+
+ std::ostringstream o;
+ o << "STORAGE_SIZE: " << size() << "\nCONTENTS:\n";
+
+ for (uint32 i = 0; i < size(); ++i)
+ {
+ char buf[3];
+ snprintf(buf, 3, "%02X", read<uint8>(i));
+ if ((i == (j * 8)) && ((i != (k * 16))))
+ {
+ o << "| ";
+ ++j;
+ }
+ else if (i == (k * 16))
+ {
+ o << "\n";
+ ++k;
+ ++j;
+ }
+
+ o << buf << " ";
+ }
+ o << " ";
+
+ sLog->outString("%s", o.str().c_str());
+}
diff --git a/src/common/Packets/ByteBuffer.h b/src/common/Packets/ByteBuffer.h
new file mode 100644
index 0000000000..7c6cdb2d43
--- /dev/null
+++ b/src/common/Packets/ByteBuffer.h
@@ -0,0 +1,619 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _BYTEBUFFER_H
+#define _BYTEBUFFER_H
+
+#include "Common.h"
+#include "Errors.h"
+#include "ByteConverter.h"
+
+#include <ace/OS_NS_time.h>
+#include <exception>
+#include <list>
+#include <map>
+#include <string>
+#include <vector>
+#include <cstring>
+#include <time.h>
+
+// Root of ByteBuffer exception hierarchy
+class ByteBufferException : public std::exception
+{
+public:
+ ~ByteBufferException() throw() { }
+
+ char const* what() const throw() { return msg_.c_str(); }
+
+protected:
+ std::string & message() throw() { return msg_; }
+
+private:
+ std::string msg_;
+};
+
+class ByteBufferPositionException : public ByteBufferException
+{
+public:
+ ByteBufferPositionException(bool add, size_t pos, size_t size, size_t valueSize);
+
+ ~ByteBufferPositionException() throw() { }
+};
+
+class ByteBufferSourceException : public ByteBufferException
+{
+public:
+ ByteBufferSourceException(size_t pos, size_t size, size_t valueSize);
+
+ ~ByteBufferSourceException() throw() { }
+};
+
+class ByteBuffer
+{
+ public:
+ const static size_t DEFAULT_SIZE = 0x1000;
+
+ // constructor
+ ByteBuffer() : _rpos(0), _wpos(0)
+ {
+ _storage.reserve(DEFAULT_SIZE);
+ }
+
+ ByteBuffer(size_t reserve) : _rpos(0), _wpos(0)
+ {
+ _storage.reserve(reserve);
+ }
+
+ // copy constructor
+ ByteBuffer(const ByteBuffer &buf) : _rpos(buf._rpos), _wpos(buf._wpos),
+ _storage(buf._storage)
+ {
+ }
+
+ void clear()
+ {
+ _storage.clear();
+ _rpos = _wpos = 0;
+ }
+
+ template <typename T> void append(T value)
+ {
+ EndianConvert(value);
+ append((uint8 *)&value, sizeof(value));
+ }
+
+ template <typename T> void put(size_t pos, T value)
+ {
+ EndianConvert(value);
+ put(pos, (uint8 *)&value, sizeof(value));
+ }
+
+ ByteBuffer &operator<<(uint8 value)
+ {
+ append<uint8>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(uint16 value)
+ {
+ append<uint16>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(uint32 value)
+ {
+ append<uint32>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(uint64 value)
+ {
+ append<uint64>(value);
+ return *this;
+ }
+
+ // signed as in 2e complement
+ ByteBuffer &operator<<(int8 value)
+ {
+ append<int8>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(int16 value)
+ {
+ append<int16>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(int32 value)
+ {
+ append<int32>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(int64 value)
+ {
+ append<int64>(value);
+ return *this;
+ }
+
+ // floating points
+ ByteBuffer &operator<<(float value)
+ {
+ append<float>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(double value)
+ {
+ append<double>(value);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(const std::string &value)
+ {
+ if (size_t len = value.length())
+ append((uint8 const*)value.c_str(), len);
+ append((uint8)0);
+ return *this;
+ }
+
+ ByteBuffer &operator<<(const char *str)
+ {
+ if (size_t len = (str ? strlen(str) : 0))
+ append((uint8 const*)str, len);
+ append((uint8)0);
+ return *this;
+ }
+
+ ByteBuffer &operator>>(bool &value)
+ {
+ value = read<char>() > 0 ? true : false;
+ return *this;
+ }
+
+ ByteBuffer &operator>>(uint8 &value)
+ {
+ value = read<uint8>();
+ return *this;
+ }
+
+ ByteBuffer &operator>>(uint16 &value)
+ {
+ value = read<uint16>();
+ return *this;
+ }
+
+ ByteBuffer &operator>>(uint32 &value)
+ {
+ value = read<uint32>();
+ return *this;
+ }
+
+ ByteBuffer &operator>>(uint64 &value)
+ {
+ value = read<uint64>();
+ return *this;
+ }
+
+ //signed as in 2e complement
+ ByteBuffer &operator>>(int8 &value)
+ {
+ value = read<int8>();
+ return *this;
+ }
+
+ ByteBuffer &operator>>(int16 &value)
+ {
+ value = read<int16>();
+ return *this;
+ }
+
+ ByteBuffer &operator>>(int32 &value)
+ {
+ value = read<int32>();
+ return *this;
+ }
+
+ ByteBuffer &operator>>(int64 &value)
+ {
+ value = read<int64>();
+ return *this;
+ }
+
+ ByteBuffer &operator>>(float &value)
+ {
+ value = read<float>();
+ if (!myisfinite(value))
+ {
+ value = 0.0f;
+ //throw ByteBufferException();
+ }
+ return *this;
+ }
+
+ ByteBuffer &operator>>(double &value)
+ {
+ value = read<double>();
+ if (!myisfinite(value))
+ {
+ value = 0.0f;
+ //throw ByteBufferException();
+ }
+ return *this;
+ }
+
+ ByteBuffer &operator>>(std::string& value)
+ {
+ value.clear();
+ while (rpos() < size()) // prevent crash at wrong string format in packet
+ {
+ char c = read<char>();
+ if (c == 0)
+ break;
+ value += c;
+ }
+ return *this;
+ }
+
+ uint8& operator[](size_t const pos)
+ {
+ if (pos >= size())
+ throw ByteBufferPositionException(false, pos, 1, size());
+ return _storage[pos];
+ }
+
+ uint8 const& operator[](size_t const pos) const
+ {
+ if (pos >= size())
+ throw ByteBufferPositionException(false, pos, 1, size());
+ return _storage[pos];
+ }
+
+ size_t rpos() const { return _rpos; }
+
+ size_t rpos(size_t rpos_)
+ {
+ _rpos = rpos_;
+ return _rpos;
+ }
+
+ void rfinish()
+ {
+ _rpos = wpos();
+ }
+
+ size_t wpos() const { return _wpos; }
+
+ size_t wpos(size_t wpos_)
+ {
+ _wpos = wpos_;
+ return _wpos;
+ }
+
+ template<typename T>
+ void read_skip() { read_skip(sizeof(T)); }
+
+ void read_skip(size_t skip)
+ {
+ if (_rpos + skip > size())
+ throw ByteBufferPositionException(false, _rpos, skip, size());
+ _rpos += skip;
+ }
+
+ template <typename T> T read()
+ {
+ T r = read<T>(_rpos);
+ _rpos += sizeof(T);
+ return r;
+ }
+
+ template <typename T> T read(size_t pos) const
+ {
+ if (pos + sizeof(T) > size())
+ throw ByteBufferPositionException(false, pos, sizeof(T), size());
+ T val = *((T const*)&_storage[pos]);
+ EndianConvert(val);
+ return val;
+ }
+
+ void read(uint8 *dest, size_t len)
+ {
+ if (_rpos + len > size())
+ throw ByteBufferPositionException(false, _rpos, len, size());
+ std::memcpy(dest, &_storage[_rpos], len);
+ _rpos += len;
+ }
+
+ void readPackGUID(uint64& guid)
+ {
+ if (rpos() + 1 > size())
+ throw ByteBufferPositionException(false, _rpos, 1, size());
+
+ guid = 0;
+
+ uint8 guidmark = 0;
+ (*this) >> guidmark;
+
+ for (int i = 0; i < 8; ++i)
+ {
+ if (guidmark & (uint8(1) << i))
+ {
+ if (rpos() + 1 > size())
+ throw ByteBufferPositionException(false, _rpos, 1, size());
+
+ uint8 bit;
+ (*this) >> bit;
+ guid |= (uint64(bit) << (i * 8));
+ }
+ }
+ }
+
+ uint32 ReadPackedTime()
+ {
+ uint32 packedDate = read<uint32>();
+ tm lt = tm();
+
+ lt.tm_min = packedDate & 0x3F;
+ lt.tm_hour = (packedDate >> 6) & 0x1F;
+ //lt.tm_wday = (packedDate >> 11) & 7;
+ lt.tm_mday = ((packedDate >> 14) & 0x3F) + 1;
+ lt.tm_mon = (packedDate >> 20) & 0xF;
+ lt.tm_year = ((packedDate >> 24) & 0x1F) + 100;
+
+ #ifdef OS_WIN
+ return uint32(mktime(&lt) + _timezone);
+ #else
+ return uint32(mktime(&lt) + timezone);
+ #endif
+
+ }
+
+ ByteBuffer& ReadPackedTime(uint32& time)
+ {
+ time = ReadPackedTime();
+ return *this;
+ }
+
+ uint8 * contents()
+ {
+ if (_storage.empty())
+ throw ByteBufferException();
+ return &_storage[0];
+ }
+
+ const uint8 *contents() const
+ {
+ if (_storage.empty())
+ throw ByteBufferException();
+ return &_storage[0];
+ }
+
+ size_t size() const { return _storage.size(); }
+ bool empty() const { return _storage.empty(); }
+
+ void resize(size_t newsize)
+ {
+ _storage.resize(newsize, 0);
+ _rpos = 0;
+ _wpos = size();
+ }
+
+ void reserve(size_t ressize)
+ {
+ if (ressize > size())
+ _storage.reserve(ressize);
+ }
+
+ void append(const char *src, size_t cnt)
+ {
+ return append((const uint8 *)src, cnt);
+ }
+
+ template<class T> void append(const T *src, size_t cnt)
+ {
+ return append((const uint8 *)src, cnt * sizeof(T));
+ }
+
+ void append(const uint8 *src, size_t cnt)
+ {
+ if (!cnt)
+ throw ByteBufferSourceException(_wpos, size(), cnt);
+
+ if (!src)
+ throw ByteBufferSourceException(_wpos, size(), cnt);
+
+ ASSERT(size() < 10000000);
+
+ size_t newsize = _wpos + cnt;
+
+ if (_storage.capacity() < newsize) // pussywizard
+ {
+ if (newsize < 100)
+ _storage.reserve(300);
+ else if (newsize < 750)
+ _storage.reserve(2500);
+ else if (newsize < 6000)
+ _storage.reserve(10000);
+ else
+ _storage.reserve(400000);
+ }
+
+ if (_storage.size() < newsize)
+ _storage.resize(newsize);
+
+ memcpy(&_storage[_wpos], src, cnt);
+ _wpos = newsize;
+ }
+
+ void append(const ByteBuffer& buffer)
+ {
+ if (buffer.wpos())
+ append(buffer.contents(), buffer.wpos());
+ }
+
+ // can be used in SMSG_MONSTER_MOVE opcode
+ void appendPackXYZ(float x, float y, float z)
+ {
+ uint32 packed = 0;
+ packed |= ((int)(x / 0.25f) & 0x7FF);
+ packed |= ((int)(y / 0.25f) & 0x7FF) << 11;
+ packed |= ((int)(z / 0.25f) & 0x3FF) << 22;
+ *this << packed;
+ }
+
+ void appendPackGUID(uint64 guid)
+ {
+ uint8 packGUID[8+1];
+ packGUID[0] = 0;
+ size_t size = 1;
+ for (uint8 i = 0;guid != 0;++i)
+ {
+ if (guid & 0xFF)
+ {
+ packGUID[0] |= uint8(1 << i);
+ packGUID[size] = uint8(guid & 0xFF);
+ ++size;
+ }
+
+ guid >>= 8;
+ }
+ append(packGUID, size);
+ }
+
+ void AppendPackedTime(time_t time)
+ {
+ tm lt;
+ ACE_OS::localtime_r(&time, &lt);
+ append<uint32>((lt.tm_year - 100) << 24 | lt.tm_mon << 20 | (lt.tm_mday - 1) << 14 | lt.tm_wday << 11 | lt.tm_hour << 6 | lt.tm_min);
+ }
+
+ void put(size_t pos, const uint8 *src, size_t cnt)
+ {
+ if (pos + cnt > size())
+ throw ByteBufferPositionException(true, pos, cnt, size());
+
+ if (!src)
+ throw ByteBufferSourceException(_wpos, size(), cnt);
+
+ std::memcpy(&_storage[pos], src, cnt);
+ }
+
+ void hexlike(bool outString = false) const;
+
+ protected:
+ size_t _rpos, _wpos;
+ std::vector<uint8> _storage;
+};
+
+template <typename T>
+inline ByteBuffer &operator<<(ByteBuffer &b, std::vector<T> v)
+{
+ b << (uint32)v.size();
+ for (typename std::vector<T>::iterator i = v.begin(); i != v.end(); ++i)
+ {
+ b << *i;
+ }
+ return b;
+}
+
+template <typename T>
+inline ByteBuffer &operator>>(ByteBuffer &b, std::vector<T> &v)
+{
+ uint32 vsize;
+ b >> vsize;
+ v.clear();
+ while (vsize--)
+ {
+ T t;
+ b >> t;
+ v.push_back(t);
+ }
+ return b;
+}
+
+template <typename T>
+inline ByteBuffer &operator<<(ByteBuffer &b, std::list<T> v)
+{
+ b << (uint32)v.size();
+ for (typename std::list<T>::iterator i = v.begin(); i != v.end(); ++i)
+ {
+ b << *i;
+ }
+ return b;
+}
+
+template <typename T>
+inline ByteBuffer &operator>>(ByteBuffer &b, std::list<T> &v)
+{
+ uint32 vsize;
+ b >> vsize;
+ v.clear();
+ while (vsize--)
+ {
+ T t;
+ b >> t;
+ v.push_back(t);
+ }
+ return b;
+}
+
+template <typename K, typename V>
+inline ByteBuffer &operator<<(ByteBuffer &b, std::map<K, V> &m)
+{
+ b << (uint32)m.size();
+ for (typename std::map<K, V>::iterator i = m.begin(); i != m.end(); ++i)
+ {
+ b << i->first << i->second;
+ }
+ return b;
+}
+
+template <typename K, typename V>
+inline ByteBuffer &operator>>(ByteBuffer &b, std::map<K, V> &m)
+{
+ uint32 msize;
+ b >> msize;
+ m.clear();
+ while (msize--)
+ {
+ K k;
+ V v;
+ b >> k >> v;
+ m.insert(make_pair(k, v));
+ }
+ return b;
+}
+
+/// @todo Make a ByteBuffer.cpp and move all this inlining to it.
+template<> inline std::string ByteBuffer::read<std::string>()
+{
+ std::string tmp;
+ *this >> tmp;
+ return tmp;
+}
+
+template<>
+inline void ByteBuffer::read_skip<char*>()
+{
+ std::string temp;
+ *this >> temp;
+}
+
+template<>
+inline void ByteBuffer::read_skip<char const*>()
+{
+ read_skip<char*>();
+}
+
+template<>
+inline void ByteBuffer::read_skip<std::string>()
+{
+ read_skip<char*>();
+}
+
+#endif
+
diff --git a/src/common/Packets/WorldPacket.h b/src/common/Packets/WorldPacket.h
new file mode 100644
index 0000000000..8781834f80
--- /dev/null
+++ b/src/common/Packets/WorldPacket.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef AZEROTHCORE_WORLDPACKET_H
+#define AZEROTHCORE_WORLDPACKET_H
+
+#include "Common.h"
+#include "ByteBuffer.h"
+
+class WorldPacket : public ByteBuffer
+{
+ public:
+ // just container for later use
+ WorldPacket() : ByteBuffer(0), m_opcode(0)
+ {
+ }
+ explicit WorldPacket(uint16 opcode, size_t res=200) : ByteBuffer(res), m_opcode(opcode) { }
+ // copy constructor
+ WorldPacket(const WorldPacket &packet) : ByteBuffer(packet), m_opcode(packet.m_opcode)
+ {
+ }
+
+ void Initialize(uint16 opcode, size_t newres=200)
+ {
+ clear();
+ _storage.reserve(newres);
+ m_opcode = opcode;
+ }
+
+ uint16 GetOpcode() const { return m_opcode; }
+ void SetOpcode(uint16 opcode) { m_opcode = opcode; }
+
+ protected:
+ uint16 m_opcode;
+};
+#endif
+
diff --git a/src/common/PrecompiledHeaders/sharedPCH.cpp b/src/common/PrecompiledHeaders/sharedPCH.cpp
new file mode 100644
index 0000000000..36eb3a877f
--- /dev/null
+++ b/src/common/PrecompiledHeaders/sharedPCH.cpp
@@ -0,0 +1 @@
+#include "sharedPCH.h"
diff --git a/src/common/PrecompiledHeaders/sharedPCH.h b/src/common/PrecompiledHeaders/sharedPCH.h
new file mode 100644
index 0000000000..d0c15b17f0
--- /dev/null
+++ b/src/common/PrecompiledHeaders/sharedPCH.h
@@ -0,0 +1,8 @@
+//add here most rarely modified headers to speed up debug build compilation
+
+#include "Common.h"
+#include "Log.h"
+#include "DatabaseWorker.h"
+#include "SQLOperation.h"
+#include "Errors.h"
+#include "TypeList.h"
diff --git a/src/common/SystemConfig.h b/src/common/SystemConfig.h
new file mode 100644
index 0000000000..0c1585bf7f
--- /dev/null
+++ b/src/common/SystemConfig.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+// THIS FILE IS DEPRECATED
+
+#ifndef TRINITY_SYSTEMCONFIG_H
+#define TRINITY_SYSTEMCONFIG_H
+
+#include "Define.h"
+#include "revision.h"
+
+#define _PACKAGENAME "AzerothCore"
+
+#if TRINITY_ENDIAN == TRINITY_BIGENDIAN
+# define _ENDIAN_STRING "big-endian"
+#else
+# define _ENDIAN_STRING "little-endian"
+#endif
+
+#if PLATFORM == PLATFORM_WINDOWS
+# ifdef _WIN64
+# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win64, " _BUILD_DIRECTIVE ")"
+# else
+# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win32, " _BUILD_DIRECTIVE ")"
+# endif
+#else
+# define _FULLVERSION _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Unix, " _BUILD_DIRECTIVE ")"
+#endif
+#endif
diff --git a/src/common/Threading/Callback.h b/src/common/Threading/Callback.h
new file mode 100644
index 0000000000..b2a04b69ff
--- /dev/null
+++ b/src/common/Threading/Callback.h
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _CALLBACK_H
+#define _CALLBACK_H
+
+#include <ace/Future.h>
+#include <ace/Future_Set.h>
+#include "QueryResult.h"
+
+typedef ACE_Future<QueryResult> QueryResultFuture;
+typedef ACE_Future<PreparedQueryResult> PreparedQueryResultFuture;
+
+/*! A simple template using ACE_Future to manage callbacks from the thread and object that
+ issued the request. <ParamType> is variable type of parameter that is used as parameter
+ for the callback function.
+*/
+#define CALLBACK_STAGE_INVALID uint8(-1)
+
+template <typename Result, typename ParamType, bool chain = false>
+class QueryCallback
+{
+ public:
+ QueryCallback() : _param(), _stage(chain ? 0 : CALLBACK_STAGE_INVALID) {}
+
+ //! The parameter of this function should be a resultset returned from either .AsyncQuery or .AsyncPQuery
+ void SetFutureResult(ACE_Future<Result> value)
+ {
+ _result = value;
+ }
+
+ ACE_Future<Result> GetFutureResult()
+ {
+ return _result;
+ }
+
+ int IsReady()
+ {
+ return _result.ready();
+ }
+
+ void GetResult(Result& res)
+ {
+ _result.get(res);
+ }
+
+ void FreeResult()
+ {
+ _result.cancel();
+ }
+
+ void SetParam(ParamType value)
+ {
+ _param = value;
+ }
+
+ ParamType GetParam()
+ {
+ return _param;
+ }
+
+ //! Resets the stage of the callback chain
+ void ResetStage()
+ {
+ if (!chain)
+ return;
+
+ _stage = 0;
+ }
+
+ //! Advances the callback chain to the next stage, so upper level code can act on its results accordingly
+ void NextStage()
+ {
+ if (!chain)
+ return;
+
+ ++_stage;
+ }
+
+ //! Returns the callback stage (or CALLBACK_STAGE_INVALID if invalid)
+ uint8 GetStage()
+ {
+ return _stage;
+ }
+
+ //! Resets all underlying variables (param, result and stage)
+ void Reset()
+ {
+ SetParam(NULL);
+ FreeResult();
+ ResetStage();
+ }
+
+ private:
+ ACE_Future<Result> _result;
+ ParamType _param;
+ uint8 _stage;
+};
+
+template <typename Result, typename ParamType1, typename ParamType2, bool chain = false>
+class QueryCallback_2
+{
+ public:
+ QueryCallback_2() : _stage(chain ? 0 : CALLBACK_STAGE_INVALID) {}
+
+ //! The parameter of this function should be a resultset returned from either .AsyncQuery or .AsyncPQuery
+ void SetFutureResult(ACE_Future<Result> value)
+ {
+ _result = value;
+ }
+
+ ACE_Future<Result> GetFutureResult()
+ {
+ return _result;
+ }
+
+ int IsReady()
+ {
+ return _result.ready();
+ }
+
+ void GetResult(Result& res)
+ {
+ _result.get(res);
+ }
+
+ void FreeResult()
+ {
+ _result.cancel();
+ }
+
+ void SetFirstParam(ParamType1 value)
+ {
+ _param_1 = value;
+ }
+
+ void SetSecondParam(ParamType2 value)
+ {
+ _param_2 = value;
+ }
+
+ ParamType1 GetFirstParam()
+ {
+ return _param_1;
+ }
+
+ ParamType2 GetSecondParam()
+ {
+ return _param_2;
+ }
+
+ //! Resets the stage of the callback chain
+ void ResetStage()
+ {
+ if (!chain)
+ return;
+
+ _stage = 0;
+ }
+
+ //! Advances the callback chain to the next stage, so upper level code can act on its results accordingly
+ void NextStage()
+ {
+ if (!chain)
+ return;
+
+ ++_stage;
+ }
+
+ //! Returns the callback stage (or CALLBACK_STAGE_INVALID if invalid)
+ uint8 GetStage()
+ {
+ return _stage;
+ }
+
+ //! Resets all underlying variables (param, result and stage)
+ void Reset()
+ {
+ SetFirstParam(0);
+ SetSecondParam(NULL);
+ FreeResult();
+ ResetStage();
+ }
+
+ private:
+ ACE_Future<Result> _result;
+ ParamType1 _param_1;
+ ParamType2 _param_2;
+ uint8 _stage;
+};
+
+template <typename Result, typename ParamType1, typename ParamType2, typename ParamType3, bool chain = false>
+class QueryCallback_3
+{
+ public:
+ QueryCallback_3() : _stage(chain ? 0 : CALLBACK_STAGE_INVALID) {}
+
+ //! The parameter of this function should be a resultset returned from either .AsyncQuery or .AsyncPQuery
+ void SetFutureResult(ACE_Future<Result> value)
+ {
+ _result = value;
+ }
+
+ ACE_Future<Result> GetFutureResult()
+ {
+ return _result;
+ }
+
+ int IsReady()
+ {
+ return _result.ready();
+ }
+
+ void GetResult(Result& res)
+ {
+ _result.get(res);
+ }
+
+ void FreeResult()
+ {
+ _result.cancel();
+ }
+
+ void SetFirstParam(ParamType1 value)
+ {
+ _param_1 = value;
+ }
+
+ void SetSecondParam(ParamType2 value)
+ {
+ _param_2 = value;
+ }
+
+ void SetThirdParam(ParamType3 value)
+ {
+ _param_3 = value;
+ }
+
+ ParamType1 GetFirstParam()
+ {
+ return _param_1;
+ }
+
+ ParamType2 GetSecondParam()
+ {
+ return _param_2;
+ }
+
+ ParamType3 GetThirdParam()
+ {
+ return _param_3;
+ }
+
+ //! Resets the stage of the callback chain
+ void ResetStage()
+ {
+ if (!chain)
+ return;
+
+ _stage = 0;
+ }
+
+ //! Advances the callback chain to the next stage, so upper level code can act on its results accordingly
+ void NextStage()
+ {
+ if (!chain)
+ return;
+
+ ++_stage;
+ }
+
+ //! Returns the callback stage (or CALLBACK_STAGE_INVALID if invalid)
+ uint8 GetStage()
+ {
+ return _stage;
+ }
+
+ //! Resets all underlying variables (param, result and stage)
+ void Reset()
+ {
+ SetFirstParam(NULL);
+ SetSecondParam(NULL);
+ SetThirdParam(NULL);
+ FreeResult();
+ ResetStage();
+ }
+
+ private:
+ ACE_Future<Result> _result;
+ ParamType1 _param_1;
+ ParamType2 _param_2;
+ ParamType3 _param_3;
+ uint8 _stage;
+};
+
+#endif \ No newline at end of file
diff --git a/src/common/Threading/DelayExecutor.cpp b/src/common/Threading/DelayExecutor.cpp
new file mode 100644
index 0000000000..99d8133f81
--- /dev/null
+++ b/src/common/Threading/DelayExecutor.cpp
@@ -0,0 +1,122 @@
+#include <ace/Singleton.h>
+#include <ace/Thread_Mutex.h>
+#include <ace/Log_Msg.h>
+#include "Threading.h"
+
+#include "DelayExecutor.h"
+
+DelayExecutor* DelayExecutor::instance()
+{
+ return ACE_Singleton<DelayExecutor, ACE_Thread_Mutex>::instance();
+}
+
+DelayExecutor::DelayExecutor()
+ : pre_svc_hook_(0), post_svc_hook_(0), activated_(false), mqueue_(1*1024*1024, 1*1024*1024), queue_(&mqueue_)
+{
+}
+
+DelayExecutor::~DelayExecutor()
+{
+ if (pre_svc_hook_)
+ delete pre_svc_hook_;
+
+ if (post_svc_hook_)
+ delete post_svc_hook_;
+
+ deactivate();
+}
+
+int DelayExecutor::deactivate()
+{
+ if (!activated())
+ return -1;
+
+ activated(false);
+ queue_.queue()->deactivate();
+ wait();
+
+ return 0;
+}
+
+int DelayExecutor::svc()
+{
+ if (pre_svc_hook_)
+ pre_svc_hook_->call();
+
+ for (;;)
+ {
+ ACE_Method_Request* rq = queue_.dequeue();
+
+ if (!rq)
+ break;
+
+ rq->call();
+ delete rq;
+ }
+
+ if (post_svc_hook_)
+ post_svc_hook_->call();
+
+ return 0;
+}
+
+int DelayExecutor::start(int num_threads, ACE_Method_Request* pre_svc_hook, ACE_Method_Request* post_svc_hook)
+{
+ if (activated())
+ return -1;
+
+ if (num_threads < 1)
+ return -1;
+
+ if (pre_svc_hook_)
+ delete pre_svc_hook_;
+
+ if (post_svc_hook_)
+ delete post_svc_hook_;
+
+ pre_svc_hook_ = pre_svc_hook;
+ post_svc_hook_ = post_svc_hook;
+
+ queue_.queue()->activate();
+
+ // pussywizard:
+ //ACORE::ThreadPriority tp;
+ //int _priority = tp.getPriority(ACORE::Priority_Highest);
+ //if (ACE_Task_Base::activate(THR_NEW_LWP | THR_JOINABLE, num_threads, 0, _priority) == -1)
+ // return -1;
+
+ if (ACE_Task_Base::activate(THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED, num_threads) == -1)
+ return -1;
+
+ activated(true);
+
+ return true;
+}
+
+int DelayExecutor::execute(ACE_Method_Request* new_req)
+{
+ if (new_req == NULL)
+ return -1;
+
+ // pussywizard: NULL as param for enqueue - wait until the action is possible!
+ // new tasks are added to the queue during map update (schedule_update in MapInstanced::Update)
+ // the queue can be momentarily blocked by map threads constantly waiting for tasks (for (;;) { queue_.dequeue();... } in DelayExecutor::svc())
+ // so just wait a moment, don't drop the task xDddd
+ if (queue_.enqueue(new_req, /*(ACE_Time_Value*)&ACE_Time_Value::zero*/ NULL) == -1)
+ {
+ delete new_req;
+ ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%t) %p\n"), ACE_TEXT("DelayExecutor::execute enqueue")), -1);
+ }
+
+ return 0;
+}
+
+bool DelayExecutor::activated()
+{
+ return activated_;
+}
+
+void DelayExecutor::activated(bool s)
+{
+ activated_ = s;
+}
diff --git a/src/common/Threading/DelayExecutor.h b/src/common/Threading/DelayExecutor.h
new file mode 100644
index 0000000000..23994b1e7b
--- /dev/null
+++ b/src/common/Threading/DelayExecutor.h
@@ -0,0 +1,39 @@
+#ifndef _M_DELAY_EXECUTOR_H
+#define _M_DELAY_EXECUTOR_H
+
+#include <ace/Task.h>
+#include <ace/Activation_Queue.h>
+#include <ace/Method_Request.h>
+
+class DelayExecutor : protected ACE_Task_Base
+{
+ public:
+
+ DelayExecutor();
+ virtual ~DelayExecutor();
+
+ static DelayExecutor* instance();
+
+ int execute(ACE_Method_Request* new_req);
+
+ int start(int num_threads = 1, ACE_Method_Request* pre_svc_hook = NULL, ACE_Method_Request* post_svc_hook = NULL);
+
+ int deactivate();
+
+ bool activated();
+
+ virtual int svc();
+
+ private:
+
+ ACE_Method_Request* pre_svc_hook_;
+ ACE_Method_Request* post_svc_hook_;
+ bool activated_;
+ ACE_Message_Queue<ACE_SYNCH> mqueue_;
+ ACE_Activation_Queue queue_;
+
+
+ void activated(bool s);
+};
+
+#endif // _M_DELAY_EXECUTOR_H
diff --git a/src/common/Threading/LockedQueue.h b/src/common/Threading/LockedQueue.h
new file mode 100644
index 0000000000..2c4491e74f
--- /dev/null
+++ b/src/common/Threading/LockedQueue.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef LOCKEDQUEUE_H
+#define LOCKEDQUEUE_H
+
+#include <ace/Guard_T.h>
+#include <ace/Thread_Mutex.h>
+#include <deque>
+#include <assert.h>
+#include "Debugging/Errors.h"
+
+namespace ACE_Based
+{
+ template <class T, class LockType, typename StorageType=std::deque<T> >
+ class LockedQueue
+ {
+ //! Lock access to the queue.
+ LockType _lock;
+
+ //! Storage backing the queue.
+ StorageType _queue;
+
+ //! Cancellation flag.
+ volatile bool _canceled;
+
+ public:
+
+ //! Create a LockedQueue.
+ LockedQueue()
+ : _canceled(false)
+ {
+ }
+
+ //! Destroy a LockedQueue.
+ virtual ~LockedQueue()
+ {
+ }
+
+ //! Adds an item to the queue.
+ void add(const T& item)
+ {
+ lock();
+
+ //ASSERT(!this->_canceled);
+ // throw Cancellation_Exception();
+
+ _queue.push_back(item);
+
+ unlock();
+ }
+
+ //! Gets the next result in the queue, if any.
+ bool next(T& result)
+ {
+ // ACE_Guard<LockType> g(this->_lock);
+ ACE_GUARD_RETURN (LockType, g, this->_lock, false);
+
+ if (_queue.empty())
+ return false;
+
+ //ASSERT (!_queue.empty() || !this->_canceled);
+ // throw Cancellation_Exception();
+ result = _queue.front();
+ _queue.pop_front();
+
+ return true;
+ }
+
+ template<class Checker>
+ bool next(T& result, Checker& check)
+ {
+ ACE_Guard<LockType> g(this->_lock);
+
+ if (_queue.empty())
+ return false;
+
+ result = _queue.front();
+ if (!check.Process(result))
+ return false;
+
+ _queue.pop_front();
+ return true;
+ }
+
+ //! Peeks at the top of the queue. Check if the queue is empty before calling! Remember to unlock after use if autoUnlock == false.
+ T& peek(bool autoUnlock = false)
+ {
+ lock();
+
+ T& result = _queue.front();
+
+ if (autoUnlock)
+ unlock();
+
+ return result;
+ }
+
+ //! Cancels the queue.
+ void cancel()
+ {
+ lock();
+
+ _canceled = true;
+
+ unlock();
+ }
+
+ //! Checks if the queue is cancelled.
+ bool cancelled()
+ {
+ ACE_Guard<LockType> g(this->_lock);
+ return _canceled;
+ }
+
+ //! Locks the queue for access.
+ void lock()
+ {
+ this->_lock.acquire();
+ }
+
+ //! Unlocks the queue.
+ void unlock()
+ {
+ this->_lock.release();
+ }
+
+ ///! Calls pop_front of the queue
+ void pop_front()
+ {
+ ACE_GUARD (LockType, g, this->_lock);
+ _queue.pop_front();
+ }
+
+ ///! Checks if we're empty or not with locks held
+ bool empty()
+ {
+ ACE_GUARD_RETURN (LockType, g, this->_lock, false);
+ return _queue.empty();
+ }
+ };
+}
+#endif
diff --git a/src/common/Threading/Threading.cpp b/src/common/Threading/Threading.cpp
new file mode 100644
index 0000000000..e62d92dea8
--- /dev/null
+++ b/src/common/Threading/Threading.cpp
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Threading.h"
+#include "Errors.h"
+
+#include <chrono>
+#include <system_error>
+
+using namespace ACORE;
+
+Thread::Thread() : m_task(nullptr), m_iThreadId(), m_ThreadImp()
+{
+}
+
+Thread::Thread(Runnable* instance) : m_task(instance), m_ThreadImp(&Thread::ThreadTask, (void*)m_task)
+{
+ m_iThreadId = m_ThreadImp.get_id();
+
+ // register reference to m_task to prevent it deeltion until destructor
+ if (m_task)
+ m_task->incReference();
+}
+
+Thread::~Thread()
+{
+ // Wait();
+
+ // deleted runnable object (if no other references)
+ if (m_task)
+ m_task->decReference();
+}
+
+bool Thread::wait()
+{
+ if (m_iThreadId == std::thread::id() || !m_task)
+ return false;
+
+ bool res = true;
+
+ try
+ {
+ m_ThreadImp.join();
+ }
+ catch (std::system_error&)
+ {
+ res = false;
+ }
+
+ m_iThreadId = std::thread::id();
+
+ return res;
+}
+
+void Thread::destroy()
+{
+ if (m_iThreadId == std::thread::id() || !m_task)
+ return;
+
+ // FIXME: We need to make sure that all threads can be trusted to
+ // halt execution on their own as this is not an interrupt
+ m_ThreadImp.join();
+ m_iThreadId = std::thread::id();
+}
+
+void Thread::ThreadTask(void* param)
+{
+ Runnable* _task = (Runnable*)param;
+ _task->run();
+}
+
+std::thread::id Thread::currentId()
+{
+ return std::this_thread::get_id();
+}
+
+void Thread::setPriority(Priority priority)
+{
+#ifdef WIN32
+ std::thread::native_handle_type handle = m_ThreadImp.native_handle();
+#endif
+
+ bool _ok = true;
+
+ switch (priority)
+ {
+#ifdef WIN32
+ case Priority_Realtime: _ok = SetThreadPriority(handle, THREAD_PRIORITY_TIME_CRITICAL); break;
+ case Priority_Highest: _ok = SetThreadPriority(handle, THREAD_PRIORITY_HIGHEST); break;
+ case Priority_High: _ok = SetThreadPriority(handle, THREAD_PRIORITY_ABOVE_NORMAL); break;
+ case Priority_Normal: _ok = SetThreadPriority(handle, THREAD_PRIORITY_NORMAL); break;
+ case Priority_Low: _ok = SetThreadPriority(handle, THREAD_PRIORITY_BELOW_NORMAL); break;
+ case Priority_Lowest: _ok = SetThreadPriority(handle, THREAD_PRIORITY_LOWEST); break;
+ case Priority_Idle: _ok = SetThreadPriority(handle, THREAD_PRIORITY_IDLE); break;
+#endif
+ default:
+ break;
+ }
+
+
+ // remove this ASSERT in case you don't want to know is thread priority change was successful or not
+ ASSERT(_ok);
+}
+
+void Thread::Sleep(unsigned long msecs)
+{
+ std::this_thread::sleep_for(std::chrono::milliseconds(msecs));
+}
diff --git a/src/common/Threading/Threading.h b/src/common/Threading/Threading.h
new file mode 100644
index 0000000000..ad6d52639c
--- /dev/null
+++ b/src/common/Threading/Threading.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef THREADING_H
+#define THREADING_H
+
+#include <thread>
+#include <atomic>
+
+#include <thread>
+#include <atomic>
+
+namespace ACORE
+{
+ class Runnable
+ {
+ public:
+ virtual ~Runnable() {}
+ virtual void run() = 0;
+
+ void incReference() { ++m_refs; }
+ void decReference()
+ {
+ if (!--m_refs)
+ delete this;
+ }
+ private:
+ std::atomic_long m_refs;
+ };
+
+ enum Priority
+ {
+ Priority_Idle,
+ Priority_Lowest,
+ Priority_Low,
+ Priority_Normal,
+ Priority_High,
+ Priority_Highest,
+ Priority_Realtime,
+ };
+
+ class Thread
+ {
+ public:
+ Thread();
+ explicit Thread(Runnable* instance);
+ ~Thread();
+
+ bool wait();
+ void destroy();
+
+ void setPriority(Priority type);
+
+ static void Sleep(unsigned long msecs);
+ static std::thread::id currentId();
+
+ private:
+ Thread(const Thread&);
+ Thread& operator=(const Thread&);
+
+ static void ThreadTask(void* param);
+
+ Runnable* const m_task;
+ std::thread::id m_iThreadId;
+ std::thread m_ThreadImp;
+ };
+}
+#endif
diff --git a/src/common/Utilities/ByteConverter.h b/src/common/Utilities/ByteConverter.h
new file mode 100644
index 0000000000..882f10fff9
--- /dev/null
+++ b/src/common/Utilities/ByteConverter.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_BYTECONVERTER_H
+#define TRINITY_BYTECONVERTER_H
+
+/** ByteConverter reverse your byte order. This is use
+ for cross platform where they have different endians.
+ */
+
+#include "Define.h"
+#include <algorithm>
+
+namespace ByteConverter
+{
+ template<size_t T>
+ inline void convert(char *val)
+ {
+ std::swap(*val, *(val + T - 1));
+ convert<T - 2>(val + 1);
+ }
+
+ template<> inline void convert<0>(char *) { }
+ template<> inline void convert<1>(char *) { } // ignore central byte
+
+ template<typename T> inline void apply(T *val)
+ {
+ convert<sizeof(T)>((char *)(val));
+ }
+}
+
+#if TRINITY_ENDIAN == TRINITY_BIGENDIAN
+template<typename T> inline void EndianConvert(T& val) { ByteConverter::apply<T>(&val); }
+template<typename T> inline void EndianConvertReverse(T&) { }
+template<typename T> inline void EndianConvertPtr(void* val) { ByteConverter::apply<T>(val); }
+template<typename T> inline void EndianConvertPtrReverse(void*) { }
+#else
+template<typename T> inline void EndianConvert(T&) { }
+template<typename T> inline void EndianConvertReverse(T& val) { ByteConverter::apply<T>(&val); }
+template<typename T> inline void EndianConvertPtr(void*) { }
+template<typename T> inline void EndianConvertPtrReverse(void* val) { ByteConverter::apply<T>(val); }
+#endif
+
+template<typename T> void EndianConvert(T*); // will generate link error
+template<typename T> void EndianConvertReverse(T*); // will generate link error
+
+inline void EndianConvert(uint8&) { }
+inline void EndianConvert( int8&) { }
+inline void EndianConvertReverse(uint8&) { }
+inline void EndianConvertReverse( int8&) { }
+
+#endif
+
diff --git a/src/common/Utilities/EventProcessor.cpp b/src/common/Utilities/EventProcessor.cpp
new file mode 100644
index 0000000000..74506fb0d0
--- /dev/null
+++ b/src/common/Utilities/EventProcessor.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "EventProcessor.h"
+
+EventProcessor::EventProcessor()
+{
+ m_time = 0;
+ m_aborting = false;
+}
+
+EventProcessor::~EventProcessor()
+{
+ KillAllEvents(true);
+}
+
+void EventProcessor::Update(uint32 p_time)
+{
+ // update time
+ m_time += p_time;
+
+ // main event loop
+ EventList::iterator i;
+ while (((i = m_events.begin()) != m_events.end()) && i->first <= m_time)
+ {
+ // get and remove event from queue
+ BasicEvent* Event = i->second;
+ m_events.erase(i);
+
+ if (!Event->to_Abort)
+ {
+ if (Event->Execute(m_time, p_time))
+ {
+ // completely destroy event if it is not re-added
+ delete Event;
+ }
+ }
+ else
+ {
+ Event->Abort(m_time);
+ delete Event;
+ }
+ }
+}
+
+void EventProcessor::KillAllEvents(bool force)
+{
+ // prevent event insertions
+ m_aborting = true;
+
+ // first, abort all existing events
+ for (EventList::iterator i = m_events.begin(); i != m_events.end();)
+ {
+ EventList::iterator i_old = i;
+ ++i;
+
+ i_old->second->to_Abort = true;
+ i_old->second->Abort(m_time);
+ if (force || i_old->second->IsDeletable())
+ {
+ delete i_old->second;
+
+ if (!force) // need per-element cleanup
+ m_events.erase (i_old);
+ }
+ }
+
+ // fast clear event list (in force case)
+ if (force)
+ m_events.clear();
+}
+
+void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime)
+{
+ if (set_addtime) Event->m_addTime = m_time;
+ Event->m_execTime = e_time;
+ m_events.insert(std::pair<uint64, BasicEvent*>(e_time, Event));
+}
+
+uint64 EventProcessor::CalculateTime(uint64 t_offset) const
+{
+ return(m_time + t_offset);
+}
+
+uint64 EventProcessor::CalculateQueueTime(uint64 delay) const
+{
+ return CalculateTime(delay - (m_time % delay));
+}
diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h
new file mode 100644
index 0000000000..9d12c7efbb
--- /dev/null
+++ b/src/common/Utilities/EventProcessor.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef __EVENTPROCESSOR_H
+#define __EVENTPROCESSOR_H
+
+#include "Define.h"
+
+#include <map>
+
+// Note. All times are in milliseconds here.
+
+class BasicEvent
+{
+ public:
+ BasicEvent()
+ {
+ to_Abort = false;
+ m_addTime = 0;
+ m_execTime = 0;
+ }
+ virtual ~BasicEvent() { } // override destructor to perform some actions on event removal
+
+ // this method executes when the event is triggered
+ // return false if event does not want to be deleted
+ // e_time is execution time, p_time is update interval
+ virtual bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) { return true; }
+
+ virtual bool IsDeletable() const { return true; } // this event can be safely deleted
+
+ virtual void Abort(uint64 /*e_time*/) { } // this method executes when the event is aborted
+
+ bool to_Abort; // set by externals when the event is aborted, aborted events don't execute
+ // and get Abort call when deleted
+
+ // these can be used for time offset control
+ uint64 m_addTime; // time when the event was added to queue, filled by event handler
+ uint64 m_execTime; // planned time of next execution, filled by event handler
+};
+
+typedef std::multimap<uint64, BasicEvent*> EventList;
+
+class EventProcessor
+{
+ public:
+ EventProcessor();
+ ~EventProcessor();
+
+ void Update(uint32 p_time);
+ void KillAllEvents(bool force);
+ void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true);
+ uint64 CalculateTime(uint64 t_offset) const;
+
+ // Xinef: calculates next queue tick time
+ uint64 CalculateQueueTime(uint64 delay) const;
+
+ protected:
+ uint64 m_time;
+ EventList m_events;
+ bool m_aborting;
+};
+#endif
diff --git a/src/common/Utilities/ServiceWin32.cpp b/src/common/Utilities/ServiceWin32.cpp
new file mode 100644
index 0000000000..d384ce16fc
--- /dev/null
+++ b/src/common/Utilities/ServiceWin32.cpp
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifdef _WIN32
+
+#include "Common.h"
+#include "Log.h"
+#include <cstring>
+#include <windows.h>
+#include <winsvc.h>
+
+// stupid ACE define
+#ifdef main
+#undef main
+#endif //main
+
+#if !defined(WINADVAPI)
+#if !defined(_ADVAPI32_)
+#define WINADVAPI DECLSPEC_IMPORT
+#else
+#define WINADVAPI
+#endif
+#endif
+
+extern int main(int argc, char ** argv);
+extern char serviceLongName[];
+extern char serviceName[];
+extern char serviceDescription[];
+
+extern int m_ServiceStatus;
+
+SERVICE_STATUS serviceStatus;
+
+SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
+
+typedef WINADVAPI BOOL (WINAPI *CSD_T)(SC_HANDLE, DWORD, LPCVOID);
+
+bool WinServiceInstall()
+{
+ SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
+
+ if (serviceControlManager)
+ {
+ char path[_MAX_PATH + 10];
+ if (GetModuleFileName( 0, path, sizeof(path)/sizeof(path[0]) ) > 0)
+ {
+ SC_HANDLE service;
+ std::strcat(path, " --service");
+ service = CreateService(serviceControlManager,
+ serviceName, // name of service
+ serviceLongName, // service name to display
+ SERVICE_ALL_ACCESS, // desired access
+ // service type
+ SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
+ SERVICE_AUTO_START, // start type
+ SERVICE_ERROR_IGNORE, // error control type
+ path, // service's binary
+ 0, // no load ordering group
+ 0, // no tag identifier
+ 0, // no dependencies
+ 0, // LocalSystem account
+ 0); // no password
+ if (service)
+ {
+ HMODULE advapi32 = GetModuleHandle("ADVAPI32.DLL");
+ if (!advapi32)
+ {
+ CloseServiceHandle(service);
+ CloseServiceHandle(serviceControlManager);
+ return false;
+ }
+
+ CSD_T ChangeService_Config2 = (CSD_T) GetProcAddress(advapi32, "ChangeServiceConfig2A");
+ if (!ChangeService_Config2)
+ {
+ CloseServiceHandle(service);
+ CloseServiceHandle(serviceControlManager);
+ return false;
+ }
+
+ SERVICE_DESCRIPTION sdBuf;
+ sdBuf.lpDescription = serviceDescription;
+ ChangeService_Config2(
+ service, // handle to service
+ SERVICE_CONFIG_DESCRIPTION, // change: description
+ &sdBuf); // new data
+
+ SC_ACTION _action[1];
+ _action[0].Type = SC_ACTION_RESTART;
+ _action[0].Delay = 10000;
+ SERVICE_FAILURE_ACTIONS sfa;
+ ZeroMemory(&sfa, sizeof(SERVICE_FAILURE_ACTIONS));
+ sfa.lpsaActions = _action;
+ sfa.cActions = 1;
+ sfa.dwResetPeriod =INFINITE;
+ ChangeService_Config2(
+ service, // handle to service
+ SERVICE_CONFIG_FAILURE_ACTIONS, // information level
+ &sfa); // new data
+
+ CloseServiceHandle(service);
+
+ }
+ }
+ CloseServiceHandle(serviceControlManager);
+ }
+ return true;
+}
+
+bool WinServiceUninstall()
+{
+ SC_HANDLE serviceControlManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
+
+ if (serviceControlManager)
+ {
+ SC_HANDLE service = OpenService(serviceControlManager,
+ serviceName, SERVICE_QUERY_STATUS | DELETE);
+ if (service)
+ {
+ SERVICE_STATUS serviceStatus2;
+ if (QueryServiceStatus(service, &serviceStatus2))
+ {
+ if (serviceStatus2.dwCurrentState == SERVICE_STOPPED)
+ DeleteService(service);
+ }
+ CloseServiceHandle(service);
+ }
+
+ CloseServiceHandle(serviceControlManager);
+ }
+ return true;
+}
+
+void WINAPI ServiceControlHandler(DWORD controlCode)
+{
+ switch (controlCode)
+ {
+ case SERVICE_CONTROL_INTERROGATE:
+ break;
+
+ case SERVICE_CONTROL_SHUTDOWN:
+ case SERVICE_CONTROL_STOP:
+ serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
+ SetServiceStatus(serviceStatusHandle, &serviceStatus);
+
+ m_ServiceStatus = 0;
+ return;
+
+ case SERVICE_CONTROL_PAUSE:
+ m_ServiceStatus = 2;
+ serviceStatus.dwCurrentState = SERVICE_PAUSED;
+ SetServiceStatus(serviceStatusHandle, &serviceStatus);
+ break;
+
+ case SERVICE_CONTROL_CONTINUE:
+ serviceStatus.dwCurrentState = SERVICE_RUNNING;
+ SetServiceStatus(serviceStatusHandle, &serviceStatus);
+ m_ServiceStatus = 1;
+ break;
+
+ default:
+ if ( controlCode >= 128 && controlCode <= 255 )
+ // user defined control code
+ break;
+ else
+ // unrecognized control code
+ break;
+ }
+
+ SetServiceStatus(serviceStatusHandle, &serviceStatus);
+}
+
+void WINAPI ServiceMain(DWORD argc, char *argv[])
+{
+ // initialise service status
+ serviceStatus.dwServiceType = SERVICE_WIN32;
+ serviceStatus.dwCurrentState = SERVICE_START_PENDING;
+ serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
+ serviceStatus.dwWin32ExitCode = NO_ERROR;
+ serviceStatus.dwServiceSpecificExitCode = NO_ERROR;
+ serviceStatus.dwCheckPoint = 0;
+ serviceStatus.dwWaitHint = 0;
+
+ serviceStatusHandle = RegisterServiceCtrlHandler(serviceName, ServiceControlHandler);
+
+ if ( serviceStatusHandle )
+ {
+ char path[_MAX_PATH + 1];
+ unsigned int i, last_slash = 0;
+
+ GetModuleFileName(0, path, sizeof(path)/sizeof(path[0]));
+
+ for (i = 0; i < std::strlen(path); i++)
+ {
+ if (path[i] == '\\') last_slash = i;
+ }
+
+ path[last_slash] = 0;
+
+ // service is starting
+ serviceStatus.dwCurrentState = SERVICE_START_PENDING;
+ SetServiceStatus(serviceStatusHandle, &serviceStatus);
+
+ // do initialisation here
+ SetCurrentDirectory(path);
+
+ // running
+ serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
+ serviceStatus.dwCurrentState = SERVICE_RUNNING;
+ SetServiceStatus( serviceStatusHandle, &serviceStatus );
+
+ ////////////////////////
+ // service main cycle //
+ ////////////////////////
+
+ m_ServiceStatus = 1;
+ argc = 1;
+ main(argc, argv);
+
+ // service was stopped
+ serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
+ SetServiceStatus(serviceStatusHandle, &serviceStatus);
+
+ // do cleanup here
+
+ // service is now stopped
+ serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
+ serviceStatus.dwCurrentState = SERVICE_STOPPED;
+ SetServiceStatus(serviceStatusHandle, &serviceStatus);
+ }
+}
+
+bool WinServiceRun()
+{
+ SERVICE_TABLE_ENTRY serviceTable[] =
+ {
+ { serviceName, ServiceMain },
+ { 0, 0 }
+ };
+
+ if (!StartServiceCtrlDispatcher(serviceTable))
+ {
+ sLog->outError("StartService Failed. Error [%u]", ::GetLastError());
+ return false;
+ }
+ return true;
+}
+#endif
+
diff --git a/src/common/Utilities/ServiceWin32.h b/src/common/Utilities/ServiceWin32.h
new file mode 100644
index 0000000000..ef7d262c09
--- /dev/null
+++ b/src/common/Utilities/ServiceWin32.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifdef _WIN32
+#ifndef _WIN32_SERVICE_
+#define _WIN32_SERVICE_
+
+bool WinServiceInstall();
+bool WinServiceUninstall();
+bool WinServiceRun();
+
+#endif // _WIN32_SERVICE_
+#endif // _WIN32
+
diff --git a/src/common/Utilities/SignalHandler.h b/src/common/Utilities/SignalHandler.h
new file mode 100644
index 0000000000..3086f3ce8c
--- /dev/null
+++ b/src/common/Utilities/SignalHandler.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef __SIGNAL_HANDLER_H__
+#define __SIGNAL_HANDLER_H__
+
+#include <ace/Event_Handler.h>
+
+namespace Trinity
+{
+
+/// Handle termination signals
+class SignalHandler : public ACE_Event_Handler
+{
+ public:
+ int handle_signal(int SigNum, siginfo_t* = NULL, ucontext_t* = NULL)
+ {
+ HandleSignal(SigNum);
+ return 0;
+ }
+ virtual void HandleSignal(int /*SigNum*/) { };
+};
+
+}
+
+#endif /* __SIGNAL_HANDLER_H__ */
diff --git a/src/common/Utilities/Timer.h b/src/common/Utilities/Timer.h
new file mode 100644
index 0000000000..bed9f7dcbc
--- /dev/null
+++ b/src/common/Utilities/Timer.h
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TRINITY_TIMER_H
+#define TRINITY_TIMER_H
+
+#include "ace/OS_NS_sys_time.h"
+#include "Common.h"
+
+inline uint32 getMSTime()
+{
+ static const ACE_Time_Value ApplicationStartTime = ACE_OS::gettimeofday();
+ return (ACE_OS::gettimeofday() - ApplicationStartTime).msec();
+}
+
+inline uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
+{
+ // getMSTime() have limited data range and this is case when it overflow in this tick
+ if (oldMSTime > newMSTime)
+ return (0xFFFFFFFF - oldMSTime) + newMSTime;
+ else
+ return newMSTime - oldMSTime;
+}
+
+inline uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
+{
+ return getMSTimeDiff(oldMSTime, getMSTime());
+}
+
+struct IntervalTimer
+{
+ public:
+
+ IntervalTimer()
+ : _interval(0), _current(0)
+ {
+ }
+
+ void Update(time_t diff)
+ {
+ _current += diff;
+ if (_current < 0)
+ _current = 0;
+ }
+
+ bool Passed()
+ {
+ return _current >= _interval;
+ }
+
+ void Reset()
+ {
+ if (_current >= _interval)
+ _current %= _interval;
+ }
+
+ void SetCurrent(time_t current)
+ {
+ _current = current;
+ }
+
+ void SetInterval(time_t interval)
+ {
+ _interval = interval;
+ }
+
+ time_t GetInterval() const
+ {
+ return _interval;
+ }
+
+ time_t GetCurrent() const
+ {
+ return _current;
+ }
+
+ private:
+
+ time_t _interval;
+ time_t _current;
+};
+
+struct TimeTracker
+{
+ public:
+
+ TimeTracker(time_t expiry)
+ : i_expiryTime(expiry)
+ {
+ }
+
+ void Update(time_t diff)
+ {
+ i_expiryTime -= diff;
+ }
+
+ bool Passed() const
+ {
+ return i_expiryTime <= 0;
+ }
+
+ void Reset(time_t interval)
+ {
+ i_expiryTime = interval;
+ }
+
+ time_t GetExpiry() const
+ {
+ return i_expiryTime;
+ }
+
+ private:
+
+ time_t i_expiryTime;
+};
+
+struct TimeTrackerSmall
+{
+ public:
+
+ TimeTrackerSmall(uint32 expiry = 0)
+ : i_expiryTime(expiry)
+ {
+ }
+
+ void Update(int32 diff)
+ {
+ i_expiryTime -= diff;
+ }
+
+ bool Passed() const
+ {
+ return i_expiryTime <= 0;
+ }
+
+ void Reset(uint32 interval)
+ {
+ i_expiryTime = interval;
+ }
+
+ int32 GetExpiry() const
+ {
+ return i_expiryTime;
+ }
+
+ private:
+
+ int32 i_expiryTime;
+};
+
+struct PeriodicTimer
+{
+ public:
+
+ PeriodicTimer(int32 period, int32 start_time)
+ : i_period(period), i_expireTime(start_time)
+ {
+ }
+
+ bool Update(const uint32 diff)
+ {
+ if ((i_expireTime -= diff) > 0)
+ return false;
+
+ i_expireTime += i_period > int32(diff) ? i_period : diff;
+ return true;
+ }
+
+ void SetPeriodic(int32 period, int32 start_time)
+ {
+ i_expireTime = start_time;
+ i_period = period;
+ }
+
+ // Tracker interface
+ void TUpdate(int32 diff) { i_expireTime -= diff; }
+ bool TPassed() const { return i_expireTime <= 0; }
+ void TReset(int32 diff, int32 period) { i_expireTime += period > diff ? period : diff; }
+
+ private:
+
+ int32 i_period;
+ int32 i_expireTime;
+};
+
+#endif
diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp
new file mode 100644
index 0000000000..ea3d81e8e6
--- /dev/null
+++ b/src/common/Utilities/Util.cpp
@@ -0,0 +1,544 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Util.h"
+#include "Common.h"
+#include "utf8.h"
+#include "Log.h"
+#include "DatabaseWorker.h"
+#include "SQLOperation.h"
+#include "Errors.h"
+#include "TypeList.h"
+#include "SFMT.h"
+#include "Errors.h" // for ASSERT
+#include <ace/TSS_T.h>
+
+typedef ACE_TSS<SFMTRand> SFMTRandTSS;
+static SFMTRandTSS sfmtRand;
+
+int32 irand(int32 min, int32 max)
+{
+ ASSERT(max >= min);
+ return int32(sfmtRand->IRandom(min, max));
+}
+
+uint32 urand(uint32 min, uint32 max)
+{
+ ASSERT(max >= min);
+ return sfmtRand->URandom(min, max);
+}
+
+float frand(float min, float max)
+{
+ ASSERT(max >= min);
+ return float(sfmtRand->Random() * (max - min) + min);
+}
+
+uint32 rand32()
+{
+ return int32(sfmtRand->BRandom());
+}
+
+double rand_norm()
+{
+ return sfmtRand->Random();
+}
+
+double rand_chance()
+{
+ return sfmtRand->Random() * 100.0;
+}
+
+Tokenizer::Tokenizer(const std::string &src, const char sep, uint32 vectorReserve)
+{
+ m_str = new char[src.length() + 1];
+ memcpy(m_str, src.c_str(), src.length() + 1);
+
+ if (vectorReserve)
+ m_storage.reserve(vectorReserve);
+
+ char* posold = m_str;
+ char* posnew = m_str;
+
+ for (;;)
+ {
+ if (*posnew == sep)
+ {
+ m_storage.push_back(posold);
+ posold = posnew + 1;
+
+ *posnew = '\0';
+ }
+ else if (*posnew == '\0')
+ {
+ // Hack like, but the old code accepted these kind of broken strings,
+ // so changing it would break other things
+ if (posold != posnew)
+ m_storage.push_back(posold);
+
+ break;
+ }
+
+ ++posnew;
+ }
+}
+
+void stripLineInvisibleChars(std::string &str)
+{
+ static std::string const invChars = " \t\7\n";
+
+ size_t wpos = 0;
+
+ bool space = false;
+ for (size_t pos = 0; pos < str.size(); ++pos)
+ {
+ if (invChars.find(str[pos])!=std::string::npos)
+ {
+ if (!space)
+ {
+ str[wpos++] = ' ';
+ space = true;
+ }
+ }
+ else
+ {
+ if (wpos!=pos)
+ str[wpos++] = str[pos];
+ else
+ ++wpos;
+ space = false;
+ }
+ }
+
+ if (wpos < str.size())
+ str.erase(wpos, str.size());
+ if (str.find("|TInterface")!=std::string::npos)
+ str.clear();
+
+}
+
+std::string secsToTimeString(uint64 timeInSecs, bool shortText)
+{
+ uint64 secs = timeInSecs % MINUTE;
+ uint64 minutes = timeInSecs % HOUR / MINUTE;
+ uint64 hours = timeInSecs % DAY / HOUR;
+ uint64 days = timeInSecs / DAY;
+
+ std::ostringstream ss;
+ if (days)
+ ss << days << (shortText ? "d" : " day(s) ");
+ if (hours)
+ ss << hours << (shortText ? "h" : " hour(s) ");
+ if (minutes)
+ ss << minutes << (shortText ? "m" : " minute(s) ");
+ if (secs || (!days && !hours && !minutes) )
+ ss << secs << (shortText ? "s" : " second(s) ");
+
+ std::string str = ss.str();
+
+ if (!shortText && !str.empty() && str[str.size()-1] == ' ')
+ str.resize(str.size()-1);
+
+ return str;
+}
+
+int32 MoneyStringToMoney(const std::string& moneyString)
+{
+ int32 money = 0;
+
+ if (!(std::count(moneyString.begin(), moneyString.end(), 'g') == 1 ||
+ std::count(moneyString.begin(), moneyString.end(), 's') == 1 ||
+ std::count(moneyString.begin(), moneyString.end(), 'c') == 1))
+ return 0; // Bad format
+
+ Tokenizer tokens(moneyString, ' ');
+ for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr)
+ {
+ std::string tokenString(*itr);
+ size_t gCount = std::count(tokenString.begin(), tokenString.end(), 'g');
+ size_t sCount = std::count(tokenString.begin(), tokenString.end(), 's');
+ size_t cCount = std::count(tokenString.begin(), tokenString.end(), 'c');
+ if (gCount + sCount + cCount != 1)
+ return 0;
+
+ uint32 amount = atoi(*itr);
+ if (gCount == 1)
+ money += amount * 100 * 100;
+ else if (sCount == 1)
+ money += amount * 100;
+ else if (cCount == 1)
+ money += amount;
+ }
+
+ return money;
+}
+
+uint32 TimeStringToSecs(const std::string& timestring)
+{
+ uint32 secs = 0;
+ uint32 buffer = 0;
+ uint32 multiplier = 0;
+
+ for (std::string::const_iterator itr = timestring.begin(); itr != timestring.end(); ++itr)
+ {
+ if (isdigit(*itr))
+ {
+ buffer*=10;
+ buffer+= (*itr)-'0';
+ }
+ else
+ {
+ switch (*itr)
+ {
+ case 'd': multiplier = DAY; break;
+ case 'h': multiplier = HOUR; break;
+ case 'm': multiplier = MINUTE; break;
+ case 's': multiplier = 1; break;
+ default : return 0; //bad format
+ }
+ buffer*=multiplier;
+ secs+=buffer;
+ buffer=0;
+ }
+ }
+
+ return secs;
+}
+
+std::string TimeToTimestampStr(time_t t)
+{
+ tm aTm;
+ ACE_OS::localtime_r(&t, &aTm);
+ // YYYY year
+ // MM month (2 digits 01-12)
+ // DD day (2 digits 01-31)
+ // HH hour (2 digits 00-23)
+ // MM minutes (2 digits 00-59)
+ // SS seconds (2 digits 00-59)
+ char buf[20];
+ snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d", aTm.tm_year+1900, aTm.tm_mon+1, aTm.tm_mday, aTm.tm_hour, aTm.tm_min, aTm.tm_sec);
+ return std::string(buf);
+}
+
+/// Check if the string is a valid ip address representation
+bool IsIPAddress(char const* ipaddress)
+{
+ if (!ipaddress)
+ return false;
+
+ // Let the big boys do it.
+ // Drawback: all valid ip address formats are recognized e.g.: 12.23, 121234, 0xABCD)
+ return inet_addr(ipaddress) != INADDR_NONE;
+}
+
+std::string GetAddressString(ACE_INET_Addr const& addr)
+{
+ char buf[ACE_MAX_FULLY_QUALIFIED_NAME_LEN + 16];
+ addr.addr_to_string(buf, ACE_MAX_FULLY_QUALIFIED_NAME_LEN + 16);
+ return buf;
+}
+
+bool IsIPAddrInNetwork(ACE_INET_Addr const& net, ACE_INET_Addr const& addr, ACE_INET_Addr const& subnetMask)
+{
+ uint32 mask = subnetMask.get_ip_address();
+ if ((net.get_ip_address() & mask) == (addr.get_ip_address() & mask))
+ return true;
+ return false;
+}
+
+/// create PID file
+uint32 CreatePIDFile(const std::string& filename)
+{
+ FILE* pid_file = fopen (filename.c_str(), "w" );
+ if (pid_file == NULL)
+ return 0;
+
+#ifdef _WIN32
+ DWORD pid = GetCurrentProcessId();
+#else
+ pid_t pid = getpid();
+#endif
+
+ fprintf(pid_file, "%u", pid );
+ fclose(pid_file);
+
+ return (uint32)pid;
+}
+
+size_t utf8length(std::string& utf8str)
+{
+ try
+ {
+ return utf8::distance(utf8str.c_str(), utf8str.c_str()+utf8str.size());
+ }
+ catch(std::exception)
+ {
+ utf8str = "";
+ return 0;
+ }
+}
+
+void utf8truncate(std::string& utf8str, size_t len)
+{
+ try
+ {
+ size_t wlen = utf8::distance(utf8str.c_str(), utf8str.c_str()+utf8str.size());
+ if (wlen <= len)
+ return;
+
+ std::wstring wstr;
+ wstr.resize(wlen);
+ utf8::utf8to16(utf8str.c_str(), utf8str.c_str()+utf8str.size(), &wstr[0]);
+ wstr.resize(len);
+ char* oend = utf8::utf16to8(wstr.c_str(), wstr.c_str()+wstr.size(), &utf8str[0]);
+ utf8str.resize(oend-(&utf8str[0])); // remove unused tail
+ }
+ catch(std::exception)
+ {
+ utf8str = "";
+ }
+}
+
+bool Utf8toWStr(char const* utf8str, size_t csize, wchar_t* wstr, size_t& wsize)
+{
+ try
+ {
+ size_t len = utf8::distance(utf8str, utf8str+csize);
+ if (len > wsize)
+ {
+ if (wsize > 0)
+ wstr[0] = L'\0';
+ wsize = 0;
+ return false;
+ }
+
+ wsize = len;
+ utf8::utf8to16(utf8str, utf8str+csize, wstr);
+ wstr[len] = L'\0';
+ }
+ catch(std::exception)
+ {
+ if (wsize > 0)
+ wstr[0] = L'\0';
+ wsize = 0;
+ return false;
+ }
+
+ return true;
+}
+
+bool Utf8toWStr(const std::string& utf8str, std::wstring& wstr)
+{
+ try
+ {
+ if (size_t len = utf8::distance(utf8str.c_str(), utf8str.c_str()+utf8str.size()))
+ {
+ wstr.resize(len);
+ utf8::utf8to16(utf8str.c_str(), utf8str.c_str()+utf8str.size(), &wstr[0]);
+ }
+ }
+ catch(std::exception)
+ {
+ wstr = L"";
+ return false;
+ }
+
+ return true;
+}
+
+bool WStrToUtf8(wchar_t* wstr, size_t size, std::string& utf8str)
+{
+ try
+ {
+ std::string utf8str2;
+ utf8str2.resize(size*4); // allocate for most long case
+
+ if (size)
+ {
+ char* oend = utf8::utf16to8(wstr, wstr+size, &utf8str2[0]);
+ utf8str2.resize(oend-(&utf8str2[0])); // remove unused tail
+ }
+ utf8str = utf8str2;
+ }
+ catch(std::exception)
+ {
+ utf8str = "";
+ return false;
+ }
+
+ return true;
+}
+
+bool WStrToUtf8(std::wstring wstr, std::string& utf8str)
+{
+ try
+ {
+ std::string utf8str2;
+ utf8str2.resize(wstr.size()*4); // allocate for most long case
+
+ if (wstr.size())
+ {
+ char* oend = utf8::utf16to8(wstr.c_str(), wstr.c_str()+wstr.size(), &utf8str2[0]);
+ utf8str2.resize(oend-(&utf8str2[0])); // remove unused tail
+ }
+ utf8str = utf8str2;
+ }
+ catch(std::exception)
+ {
+ utf8str = "";
+ return false;
+ }
+
+ return true;
+}
+
+typedef wchar_t const* const* wstrlist;
+
+std::wstring GetMainPartOfName(std::wstring wname, uint32 declension)
+{
+ // supported only Cyrillic cases
+ if (wname.size() < 1 || !isCyrillicCharacter(wname[0]) || declension > 5)
+ return wname;
+
+ // Important: end length must be <= MAX_INTERNAL_PLAYER_NAME-MAX_PLAYER_NAME (3 currently)
+
+ static wchar_t const a_End[] = { wchar_t(1), wchar_t(0x0430), wchar_t(0x0000)};
+ static wchar_t const o_End[] = { wchar_t(1), wchar_t(0x043E), wchar_t(0x0000)};
+ static wchar_t const ya_End[] = { wchar_t(1), wchar_t(0x044F), wchar_t(0x0000)};
+ static wchar_t const ie_End[] = { wchar_t(1), wchar_t(0x0435), wchar_t(0x0000)};
+ static wchar_t const i_End[] = { wchar_t(1), wchar_t(0x0438), wchar_t(0x0000)};
+ static wchar_t const yeru_End[] = { wchar_t(1), wchar_t(0x044B), wchar_t(0x0000)};
+ static wchar_t const u_End[] = { wchar_t(1), wchar_t(0x0443), wchar_t(0x0000)};
+ static wchar_t const yu_End[] = { wchar_t(1), wchar_t(0x044E), wchar_t(0x0000)};
+ static wchar_t const oj_End[] = { wchar_t(2), wchar_t(0x043E), wchar_t(0x0439), wchar_t(0x0000)};
+ static wchar_t const ie_j_End[] = { wchar_t(2), wchar_t(0x0435), wchar_t(0x0439), wchar_t(0x0000)};
+ static wchar_t const io_j_End[] = { wchar_t(2), wchar_t(0x0451), wchar_t(0x0439), wchar_t(0x0000)};
+ static wchar_t const o_m_End[] = { wchar_t(2), wchar_t(0x043E), wchar_t(0x043C), wchar_t(0x0000)};
+ static wchar_t const io_m_End[] = { wchar_t(2), wchar_t(0x0451), wchar_t(0x043C), wchar_t(0x0000)};
+ static wchar_t const ie_m_End[] = { wchar_t(2), wchar_t(0x0435), wchar_t(0x043C), wchar_t(0x0000)};
+ static wchar_t const soft_End[] = { wchar_t(1), wchar_t(0x044C), wchar_t(0x0000)};
+ static wchar_t const j_End[] = { wchar_t(1), wchar_t(0x0439), wchar_t(0x0000)};
+
+ static wchar_t const* const dropEnds[6][8] = {
+ { &a_End[1], &o_End[1], &ya_End[1], &ie_End[1], &soft_End[1], &j_End[1], NULL, NULL },
+ { &a_End[1], &ya_End[1], &yeru_End[1], &i_End[1], NULL, NULL, NULL, NULL },
+ { &ie_End[1], &u_End[1], &yu_End[1], &i_End[1], NULL, NULL, NULL, NULL },
+ { &u_End[1], &yu_End[1], &o_End[1], &ie_End[1], &soft_End[1], &ya_End[1], &a_End[1], NULL },
+ { &oj_End[1], &io_j_End[1], &ie_j_End[1], &o_m_End[1], &io_m_End[1], &ie_m_End[1], &yu_End[1], NULL },
+ { &ie_End[1], &i_End[1], NULL, NULL, NULL, NULL, NULL, NULL }
+ };
+
+ for (wchar_t const* const* itr = &dropEnds[declension][0]; *itr; ++itr)
+ {
+ size_t len = size_t((*itr)[-1]); // get length from string size field
+
+ if (wname.substr(wname.size()-len, len)==*itr)
+ return wname.substr(0, wname.size()-len);
+ }
+
+ return wname;
+}
+
+bool utf8ToConsole(const std::string& utf8str, std::string& conStr)
+{
+#if PLATFORM == PLATFORM_WINDOWS
+ std::wstring wstr;
+ if (!Utf8toWStr(utf8str, wstr))
+ return false;
+
+ conStr.resize(wstr.size());
+ CharToOemBuffW(&wstr[0], &conStr[0], wstr.size());
+#else
+ // not implemented yet
+ conStr = utf8str;
+#endif
+
+ return true;
+}
+
+bool consoleToUtf8(const std::string& conStr, std::string& utf8str)
+{
+#if PLATFORM == PLATFORM_WINDOWS
+ std::wstring wstr;
+ wstr.resize(conStr.size());
+ OemToCharBuffW(&conStr[0], &wstr[0], conStr.size());
+
+ return WStrToUtf8(wstr, utf8str);
+#else
+ // not implemented yet
+ utf8str = conStr;
+ return true;
+#endif
+}
+
+bool Utf8FitTo(const std::string& str, std::wstring search)
+{
+ std::wstring temp;
+
+ if (!Utf8toWStr(str, temp))
+ return false;
+
+ // converting to lower case
+ wstrToLower( temp );
+
+ if (temp.find(search) == std::wstring::npos)
+ return false;
+
+ return true;
+}
+
+void utf8printf(FILE* out, const char *str, ...)
+{
+ va_list ap;
+ va_start(ap, str);
+ vutf8printf(out, str, &ap);
+ va_end(ap);
+}
+
+void vutf8printf(FILE* out, const char *str, va_list* ap)
+{
+#if PLATFORM == PLATFORM_WINDOWS
+ char temp_buf[32*1024];
+ wchar_t wtemp_buf[32*1024];
+
+ size_t temp_len = vsnprintf(temp_buf, 32*1024, str, *ap);
+ //vsnprintf returns -1 if the buffer is too small
+ if (temp_len == size_t(-1))
+ temp_len = 32*1024-1;
+
+ size_t wtemp_len = 32*1024-1;
+ Utf8toWStr(temp_buf, temp_len, wtemp_buf, wtemp_len);
+
+ CharToOemBuffW(&wtemp_buf[0], &temp_buf[0], wtemp_len+1);
+ fprintf(out, "%s", temp_buf);
+#else
+ vfprintf(out, str, *ap);
+#endif
+}
+
+std::string ByteArrayToHexStr(uint8 const* bytes, uint32 arrayLen, bool reverse /* = false */)
+{
+ int32 init = 0;
+ int32 end = arrayLen;
+ int8 op = 1;
+
+ if (reverse)
+ {
+ init = arrayLen - 1;
+ end = -1;
+ op = -1;
+ }
+
+ std::ostringstream ss;
+ for (int32 i = init; i != end; i += op)
+ {
+ char buffer[4];
+ sprintf(buffer, "%02X", bytes[i]);
+ ss << buffer;
+ }
+
+ return ss.str();
+}
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h
new file mode 100644
index 0000000000..9887412220
--- /dev/null
+++ b/src/common/Utilities/Util.h
@@ -0,0 +1,893 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _UTIL_H
+#define _UTIL_H
+
+#include "Define.h"
+#include "Errors.h"
+
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <list>
+#include <map>
+#include <ace/INET_Addr.h>
+
+// Searcher for map of structs
+template<typename T, class S> struct Finder
+{
+ T val_;
+ T S::* idMember_;
+
+ Finder(T val, T S::* idMember) : val_(val), idMember_(idMember) {}
+ bool operator()(const std::pair<int, S> &obj) { return obj.second.*idMember_ == val_; }
+};
+
+class Tokenizer
+{
+public:
+ typedef std::vector<char const*> StorageType;
+
+ typedef StorageType::size_type size_type;
+
+ typedef StorageType::const_iterator const_iterator;
+ typedef StorageType::reference reference;
+ typedef StorageType::const_reference const_reference;
+
+public:
+ Tokenizer(const std::string &src, char const sep, uint32 vectorReserve = 0);
+ ~Tokenizer() { delete[] m_str; }
+
+ const_iterator begin() const { return m_storage.begin(); }
+ const_iterator end() const { return m_storage.end(); }
+
+ size_type size() const { return m_storage.size(); }
+
+ reference operator [] (size_type i) { return m_storage[i]; }
+ const_reference operator [] (size_type i) const { return m_storage[i]; }
+
+private:
+ char* m_str;
+ StorageType m_storage;
+};
+
+void stripLineInvisibleChars(std::string &src);
+
+int32 MoneyStringToMoney(const std::string& moneyString);
+
+std::string secsToTimeString(uint64 timeInSecs, bool shortText = false);
+uint32 TimeStringToSecs(const std::string& timestring);
+std::string TimeToTimestampStr(time_t t);
+
+/* Return a random number in the range min..max. */
+int32 irand(int32 min, int32 max);
+
+/* Return a random number in the range min..max (inclusive). */
+uint32 urand(uint32 min, uint32 max);
+
+/* Return a random number in the range 0 .. UINT32_MAX. */
+uint32 rand32();
+
+/* Return a random number in the range min..max */
+float frand(float min, float max);
+
+/* Return a random double from 0.0 to 1.0 (exclusive). */
+double rand_norm();
+
+/* Return a random double from 0.0 to 100.0 (exclusive). */
+double rand_chance();
+
+/* Return true if a random roll fits in the specified chance (range 0-100). */
+inline bool roll_chance_f(float chance)
+{
+ return chance > rand_chance();
+}
+
+/* Return true if a random roll fits in the specified chance (range 0-100). */
+inline bool roll_chance_i(int32 chance)
+{
+ return chance > irand(0, 99);
+}
+
+inline void ApplyPercentModFloatVar(float& var, float val, bool apply)
+{
+ if (val == -100.0f) // prevent set var to zero
+ val = -99.99f;
+ var *= (apply ? (100.0f + val) / 100.0f : 100.0f / (100.0f + val));
+}
+
+// Percentage calculation
+template <class T, class U>
+inline T CalculatePct(T base, U pct)
+{
+ return T(base * static_cast<float>(pct) / 100.0f);
+}
+
+template <class T, class U>
+inline T AddPct(T &base, U pct)
+{
+ return base += CalculatePct(base, pct);
+}
+
+template <class T, class U>
+inline T ApplyPct(T &base, U pct)
+{
+ return base = CalculatePct(base, pct);
+}
+
+template <class T>
+inline T RoundToInterval(T& num, T floor, T ceil)
+{
+ return num = std::min(std::max(num, floor), ceil);
+}
+
+// UTF8 handling
+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);
+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 wstr, std::string& utf8str);
+// size==real string size
+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);
+
+inline bool isBasicLatinCharacter(wchar_t wchar)
+{
+ if (wchar >= L'a' && wchar <= L'z') // LATIN SMALL LETTER A - LATIN SMALL LETTER Z
+ return true;
+ if (wchar >= L'A' && wchar <= L'Z') // LATIN CAPITAL LETTER A - LATIN CAPITAL LETTER Z
+ return true;
+ return false;
+}
+
+inline bool isExtendedLatinCharacter(wchar_t wchar)
+{
+ if (isBasicLatinCharacter(wchar))
+ return true;
+ if (wchar >= 0x00C0 && wchar <= 0x00D6) // LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS
+ return true;
+ if (wchar >= 0x00D8 && wchar <= 0x00DE) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN
+ return true;
+ if (wchar == 0x00DF) // LATIN SMALL LETTER SHARP S
+ return true;
+ if (wchar >= 0x00E0 && wchar <= 0x00F6) // LATIN SMALL LETTER A WITH GRAVE - LATIN SMALL LETTER O WITH DIAERESIS
+ return true;
+ if (wchar >= 0x00F8 && wchar <= 0x00FE) // LATIN SMALL LETTER O WITH STROKE - LATIN SMALL LETTER THORN
+ return true;
+ if (wchar >= 0x0100 && wchar <= 0x012F) // LATIN CAPITAL LETTER A WITH MACRON - LATIN SMALL LETTER I WITH OGONEK
+ return true;
+ if (wchar == 0x1E9E) // LATIN CAPITAL LETTER SHARP S
+ return true;
+ return false;
+}
+
+inline bool isCyrillicCharacter(wchar_t wchar)
+{
+ if (wchar >= 0x0410 && wchar <= 0x044F) // CYRILLIC CAPITAL LETTER A - CYRILLIC SMALL LETTER YA
+ return true;
+ if (wchar == 0x0401 || wchar == 0x0451) // CYRILLIC CAPITAL LETTER IO, CYRILLIC SMALL LETTER IO
+ return true;
+ return false;
+}
+
+inline bool isEastAsianCharacter(wchar_t wchar)
+{
+ if (wchar >= 0x1100 && wchar <= 0x11F9) // Hangul Jamo
+ return true;
+ if (wchar >= 0x3041 && wchar <= 0x30FF) // Hiragana + Katakana
+ return true;
+ if (wchar >= 0x3131 && wchar <= 0x318E) // Hangul Compatibility Jamo
+ return true;
+ if (wchar >= 0x31F0 && wchar <= 0x31FF) // Katakana Phonetic Ext.
+ return true;
+ if (wchar >= 0x3400 && wchar <= 0x4DB5) // CJK Ideographs Ext. A
+ return true;
+ if (wchar >= 0x4E00 && wchar <= 0x9FC3) // Unified CJK Ideographs
+ return true;
+ if (wchar >= 0xAC00 && wchar <= 0xD7A3) // Hangul Syllables
+ return true;
+ if (wchar >= 0xFF01 && wchar <= 0xFFEE) // Halfwidth forms
+ return true;
+ return false;
+}
+
+inline bool isNumeric(wchar_t wchar)
+{
+ return (wchar >= L'0' && wchar <=L'9');
+}
+
+inline bool isNumeric(char c)
+{
+ return (c >= '0' && c <='9');
+}
+
+inline bool isNumeric(char const* str)
+{
+ for (char const* c = str; *c; ++c)
+ if (!isNumeric(*c))
+ return false;
+
+ return true;
+}
+
+inline bool isNumericOrSpace(wchar_t wchar)
+{
+ return isNumeric(wchar) || wchar == L' ';
+}
+
+inline bool isBasicLatinString(const std::wstring &wstr, bool numericOrSpace)
+{
+ for (size_t i = 0; i < wstr.size(); ++i)
+ if (!isBasicLatinCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
+ return false;
+ return true;
+}
+
+inline bool isExtendedLatinString(const std::wstring &wstr, bool numericOrSpace)
+{
+ for (size_t i = 0; i < wstr.size(); ++i)
+ if (!isExtendedLatinCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
+ return false;
+ return true;
+}
+
+inline bool isCyrillicString(const std::wstring &wstr, bool numericOrSpace)
+{
+ for (size_t i = 0; i < wstr.size(); ++i)
+ if (!isCyrillicCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
+ return false;
+ return true;
+}
+
+inline bool isEastAsianString(const std::wstring &wstr, bool numericOrSpace)
+{
+ for (size_t i = 0; i < wstr.size(); ++i)
+ if (!isEastAsianCharacter(wstr[i]) && (!numericOrSpace || !isNumericOrSpace(wstr[i])))
+ return false;
+ return true;
+}
+
+inline wchar_t wcharToUpper(wchar_t wchar)
+{
+ if (wchar >= L'a' && wchar <= L'z') // LATIN SMALL LETTER A - LATIN SMALL LETTER Z
+ return wchar_t(uint16(wchar)-0x0020);
+ if (wchar == 0x00DF) // LATIN SMALL LETTER SHARP S
+ return wchar_t(0x1E9E);
+ if (wchar >= 0x00E0 && wchar <= 0x00F6) // LATIN SMALL LETTER A WITH GRAVE - LATIN SMALL LETTER O WITH DIAERESIS
+ return wchar_t(uint16(wchar)-0x0020);
+ if (wchar >= 0x00F8 && wchar <= 0x00FE) // LATIN SMALL LETTER O WITH STROKE - LATIN SMALL LETTER THORN
+ return wchar_t(uint16(wchar)-0x0020);
+ if (wchar >= 0x0101 && wchar <= 0x012F) // LATIN SMALL LETTER A WITH MACRON - LATIN SMALL LETTER I WITH OGONEK (only %2=1)
+ {
+ if (wchar % 2 == 1)
+ return wchar_t(uint16(wchar)-0x0001);
+ }
+ if (wchar >= 0x0430 && wchar <= 0x044F) // CYRILLIC SMALL LETTER A - CYRILLIC SMALL LETTER YA
+ return wchar_t(uint16(wchar)-0x0020);
+ if (wchar == 0x0451) // CYRILLIC SMALL LETTER IO
+ return wchar_t(0x0401);
+
+ return wchar;
+}
+
+inline wchar_t wcharToUpperOnlyLatin(wchar_t wchar)
+{
+ return isBasicLatinCharacter(wchar) ? wcharToUpper(wchar) : wchar;
+}
+
+inline wchar_t wcharToLower(wchar_t wchar)
+{
+ if (wchar >= L'A' && wchar <= L'Z') // LATIN CAPITAL LETTER A - LATIN CAPITAL LETTER Z
+ return wchar_t(uint16(wchar)+0x0020);
+ if (wchar >= 0x00C0 && wchar <= 0x00D6) // LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS
+ return wchar_t(uint16(wchar)+0x0020);
+ if (wchar >= 0x00D8 && wchar <= 0x00DE) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN
+ return wchar_t(uint16(wchar)+0x0020);
+ if (wchar >= 0x0100 && wchar <= 0x012E) // LATIN CAPITAL LETTER A WITH MACRON - LATIN CAPITAL LETTER I WITH OGONEK (only %2=0)
+ {
+ if (wchar % 2 == 0)
+ return wchar_t(uint16(wchar)+0x0001);
+ }
+ if (wchar == 0x1E9E) // LATIN CAPITAL LETTER SHARP S
+ return wchar_t(0x00DF);
+ if (wchar == 0x0401) // CYRILLIC CAPITAL LETTER IO
+ return wchar_t(0x0451);
+ if (wchar >= 0x0410 && wchar <= 0x042F) // CYRILLIC CAPITAL LETTER A - CYRILLIC CAPITAL LETTER YA
+ return wchar_t(uint16(wchar)+0x0020);
+
+ return wchar;
+}
+
+inline void wstrToUpper(std::wstring& str)
+{
+ std::transform( str.begin(), str.end(), str.begin(), wcharToUpper );
+}
+
+inline void wstrToLower(std::wstring& str)
+{
+ std::transform( str.begin(), str.end(), str.begin(), wcharToLower );
+}
+
+std::wstring GetMainPartOfName(std::wstring 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 search);
+void utf8printf(FILE* out, const char *str, ...);
+void vutf8printf(FILE* out, const char *str, va_list* ap);
+
+bool IsIPAddress(char const* ipaddress);
+
+/// Checks if address belongs to the a network with specified submask
+bool IsIPAddrInNetwork(ACE_INET_Addr const& net, ACE_INET_Addr const& addr, ACE_INET_Addr const& subnetMask);
+
+/// Transforms ACE_INET_Addr address into string format "dotted_ip:port"
+std::string GetAddressString(ACE_INET_Addr const& addr);
+
+uint32 CreatePIDFile(const std::string& filename);
+
+std::string ByteArrayToHexStr(uint8 const* bytes, uint32 length, bool reverse = false);
+#endif
+
+//handler for operations on large flags
+#ifndef _FLAG96
+#define _FLAG96
+
+// simple class for not-modifyable list
+template <typename T>
+class HookList
+{
+ typedef typename std::list<T>::iterator ListIterator;
+ private:
+ typename std::list<T> m_list;
+ public:
+ HookList<T> & operator+=(T t)
+ {
+ m_list.push_back(t);
+ return *this;
+ }
+ HookList<T> & operator-=(T t)
+ {
+ m_list.remove(t);
+ return *this;
+ }
+ size_t size()
+ {
+ return m_list.size();
+ }
+ ListIterator begin()
+ {
+ return m_list.begin();
+ }
+ ListIterator end()
+ {
+ return m_list.end();
+ }
+};
+
+class flag96
+{
+private:
+ uint32 part[3];
+
+public:
+ flag96(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0)
+ {
+ part[0] = p1;
+ part[1] = p2;
+ part[2] = p3;
+ }
+
+ flag96(uint64 p1, uint32 p2)
+ {
+ part[0] = (uint32)(p1 & UI64LIT(0x00000000FFFFFFFF));
+ part[1] = (uint32)((p1 >> 32) & UI64LIT(0x00000000FFFFFFFF));
+ part[2] = p2;
+ }
+
+ inline bool IsEqual(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0) const
+ {
+ return (part[0] == p1 && part[1] == p2 && part[2] == p3);
+ }
+
+ inline bool HasFlag(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0) const
+ {
+ return (part[0] & p1 || part[1] & p2 || part[2] & p3);
+ }
+
+ inline void Set(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0)
+ {
+ part[0] = p1;
+ part[1] = p2;
+ part[2] = p3;
+ }
+
+ inline bool operator <(const flag96 &right) const
+ {
+ for (uint8 i = 3; i > 0; --i)
+ {
+ if (part[i - 1] < right.part[i - 1])
+ return true;
+ else if (part[i - 1] > right.part[i - 1])
+ return false;
+ }
+ return false;
+ }
+
+ inline bool operator ==(const flag96 &right) const
+ {
+ return
+ (
+ part[0] == right.part[0] &&
+ part[1] == right.part[1] &&
+ part[2] == right.part[2]
+ );
+ }
+
+ inline bool operator !=(const flag96 &right) const
+ {
+ return !this->operator ==(right);
+ }
+
+ inline flag96 & operator =(const flag96 &right)
+ {
+ part[0] = right.part[0];
+ part[1] = right.part[1];
+ part[2] = right.part[2];
+ return *this;
+ }
+
+ inline flag96 operator &(const flag96 &right) const
+ {
+ return flag96(part[0] & right.part[0], part[1] & right.part[1],
+ part[2] & right.part[2]);
+ }
+
+ inline flag96 & operator &=(const flag96 &right)
+ {
+ part[0] &= right.part[0];
+ part[1] &= right.part[1];
+ part[2] &= right.part[2];
+ return *this;
+ }
+
+ inline flag96 operator |(const flag96 &right) const
+ {
+ return flag96(part[0] | right.part[0], part[1] | right.part[1],
+ part[2] | right.part[2]);
+ }
+
+ inline flag96 & operator |=(const flag96 &right)
+ {
+ part[0] |= right.part[0];
+ part[1] |= right.part[1];
+ part[2] |= right.part[2];
+ return *this;
+ }
+
+ inline flag96 operator ~() const
+ {
+ return flag96(~part[0], ~part[1], ~part[2]);
+ }
+
+ inline flag96 operator ^(const flag96 &right) const
+ {
+ return flag96(part[0] ^ right.part[0], part[1] ^ right.part[1],
+ part[2] ^ right.part[2]);
+ }
+
+ inline flag96 & operator ^=(const flag96 &right)
+ {
+ part[0] ^= right.part[0];
+ part[1] ^= right.part[1];
+ part[2] ^= right.part[2];
+ return *this;
+ }
+
+ inline operator bool() const
+ {
+ return (part[0] != 0 || part[1] != 0 || part[2] != 0);
+ }
+
+ inline bool operator !() const
+ {
+ return !this->operator bool();
+ }
+
+ inline uint32 & operator [](uint8 el)
+ {
+ return part[el];
+ }
+
+ inline const uint32 & operator [](uint8 el) const
+ {
+ return part[el];
+ }
+};
+
+enum ComparisionType
+{
+ COMP_TYPE_EQ = 0,
+ COMP_TYPE_HIGH,
+ COMP_TYPE_LOW,
+ COMP_TYPE_HIGH_EQ,
+ COMP_TYPE_LOW_EQ,
+ COMP_TYPE_MAX
+};
+
+template <class T>
+bool CompareValues(ComparisionType type, T val1, T val2)
+{
+ switch (type)
+ {
+ case COMP_TYPE_EQ:
+ return val1 == val2;
+ case COMP_TYPE_HIGH:
+ return val1 > val2;
+ case COMP_TYPE_LOW:
+ return val1 < val2;
+ case COMP_TYPE_HIGH_EQ:
+ return val1 >= val2;
+ case COMP_TYPE_LOW_EQ:
+ return val1 <= val2;
+ default:
+ // incorrect parameter
+ ASSERT(false);
+ return false;
+ }
+}
+
+class EventMap
+{
+ typedef std::multimap<uint32, uint32> EventStore;
+
+ public:
+ EventMap() : _time(0), _phase(0) { }
+
+ /**
+ * @name Reset
+ * @brief Removes all scheduled events and resets time and phase.
+ */
+ void Reset()
+ {
+ _eventMap.clear();
+ _time = 0;
+ _phase = 0;
+ }
+
+ /**
+ * @name Update
+ * @brief Updates the timer of the event map.
+ * @param time Value to be added to time.
+ */
+ void Update(uint32 time)
+ {
+ _time += time;
+ }
+
+ /**
+ * @name GetTimer
+ * @return Current timer value.
+ */
+ uint32 GetTimer() const
+ {
+ return _time;
+ }
+
+ void SetTimer(uint32 time)
+ {
+ _time = time;
+ }
+
+ /**
+ * @name GetPhaseMask
+ * @return Active phases as mask.
+ */
+ uint8 GetPhaseMask() const
+ {
+ return _phase;
+ }
+
+ /**
+ * @name Empty
+ * @return True, if there are no events scheduled.
+ */
+ bool Empty() const
+ {
+ return _eventMap.empty();
+ }
+
+ /**
+ * @name SetPhase
+ * @brief Sets the phase of the map (absolute).
+ * @param phase Phase which should be set. Values: 1 - 8. 0 resets phase.
+ */
+ void SetPhase(uint8 phase)
+ {
+ if (!phase)
+ _phase = 0;
+ else if (phase <= 8)
+ _phase = (1 << (phase - 1));
+ }
+
+ /**
+ * @name AddPhase
+ * @brief Activates the given phase (bitwise).
+ * @param phase Phase which should be activated. Values: 1 - 8
+ */
+ void AddPhase(uint8 phase)
+ {
+ if (phase && phase <= 8)
+ _phase |= (1 << (phase - 1));
+ }
+
+ /**
+ * @name RemovePhase
+ * @brief Deactivates the given phase (bitwise).
+ * @param phase Phase which should be deactivated. Values: 1 - 8.
+ */
+ void RemovePhase(uint8 phase)
+ {
+ if (phase && phase <= 8)
+ _phase &= ~(1 << (phase - 1));
+ }
+
+ /**
+ * @name ScheduleEvent
+ * @brief Creates new event entry in map.
+ * @param eventId The id of the new event.
+ * @param time The time in milliseconds until the event occurs.
+ * @param group The group which the event is associated to. Has to be between 1 and 8. 0 means it has no group.
+ * @param phase The phase in which the event can occur. Has to be between 1 and 8. 0 means it can occur in all phases.
+ */
+ void ScheduleEvent(uint32 eventId, uint32 time, uint32 group = 0, uint32 phase = 0)
+ {
+ if (group && group <= 8)
+ eventId |= (1 << (group + 15));
+
+ if (phase && phase <= 8)
+ eventId |= (1 << (phase + 23));
+
+ _eventMap.insert(EventStore::value_type(_time + time, eventId));
+ }
+
+ /**
+ * @name RescheduleEvent
+ * @brief Cancels the given event and reschedules it.
+ * @param eventId The id of the event.
+ * @param time The time in milliseconds until the event occurs.
+ * @param group The group which the event is associated to. Has to be between 1 and 8. 0 means it has no group.
+ * @param phase The phase in which the event can occur. Has to be between 1 and 8. 0 means it can occur in all phases.
+ */
+ void RescheduleEvent(uint32 eventId, uint32 time, uint32 groupId = 0, uint32 phase = 0)
+ {
+ CancelEvent(eventId);
+ ScheduleEvent(eventId, time, groupId, phase);
+ }
+
+ /**
+ * @name RescheduleEvent
+ * @brief Cancels the given event and reschedules it.
+ * @param eventId The id of the event.
+ * @param time The time in milliseconds until the event occurs.
+ * @param group The group which the event is associated to. Has to be between 1 and 8. 0 means it has no group.
+ * @param phase The phase in which the event can occur. Has to be between 1 and 8. 0 means it can occur in all phases.
+ */
+ void RepeatEvent(uint32 time)
+ {
+ if (Empty())
+ return;
+
+ uint32 eventId = _eventMap.begin()->second;
+ _eventMap.erase(_eventMap.begin());
+ ScheduleEvent(eventId, time);
+ }
+
+ /**
+ * @name PopEvent
+ * @brief Remove the first event in the map.
+ */
+ void PopEvent()
+ {
+ if (!Empty())
+ _eventMap.erase(_eventMap.begin());
+ }
+
+ /**
+ * @name ExecuteEvent
+ * @brief Returns the next event to execute and removes it from map.
+ * @return Id of the event to execute.
+ */
+ uint32 ExecuteEvent()
+ {
+ while (!Empty())
+ {
+ EventStore::iterator itr = _eventMap.begin();
+
+ if (itr->first > _time)
+ return 0;
+ else if (_phase && (itr->second & 0xFF000000) && !((itr->second >> 24) & _phase))
+ _eventMap.erase(itr);
+ else
+ {
+ uint32 eventId = (itr->second & 0x0000FFFF);
+ _eventMap.erase(itr);
+ return eventId;
+ }
+ }
+
+ return 0;
+ }
+
+ /**
+ * @name GetEvent
+ * @brief Returns the next event to execute.
+ * @return Id of the event to execute.
+ */
+ uint32 GetEvent()
+ {
+ while (!Empty())
+ {
+ EventStore::iterator itr = _eventMap.begin();
+
+ if (itr->first > _time)
+ return 0;
+ else if (_phase && (itr->second & 0xFF000000) && !(itr->second & (_phase << 24)))
+ _eventMap.erase(itr);
+ else
+ return (itr->second & 0x0000FFFF);
+ }
+
+ return 0;
+ }
+
+ /**
+ * @name DelayEvents
+ * @brief Delays all events in the map. If delay is greater than or equal internal timer, delay will be 0.
+ * @param delay Amount of delay.
+ */
+ void DelayEvents(uint32 delay)
+ {
+ _time = delay < _time ? _time - delay : 0;
+ }
+
+ void DelayEventsToMax(uint32 delay, uint32 group)
+ {
+ for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
+ {
+ if (itr->first < _time+delay && (group == 0 || ((1 << (group + 15)) & itr->second)))
+ {
+ ScheduleEvent(itr->second, delay);
+ _eventMap.erase(itr);
+ itr = _eventMap.begin();
+ }
+ else
+ ++itr;
+ }
+ }
+
+ /**
+ * @name DelayEvents
+ * @brief Delay all events of the same group.
+ * @param delay Amount of delay.
+ * @param group Group of the events.
+ */
+ void DelayEvents(uint32 delay, uint32 group)
+ {
+ if (group > 8 || Empty())
+ return;
+
+ EventStore delayed;
+
+ for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
+ {
+ if (!group || (itr->second & (1 << (group + 15))))
+ {
+ delayed.insert(EventStore::value_type(itr->first + delay, itr->second));
+ _eventMap.erase(itr++);
+ }
+ else
+ ++itr;
+ }
+
+ _eventMap.insert(delayed.begin(), delayed.end());
+ }
+
+ /**
+ * @name CancelEvent
+ * @brief Cancels all events of the specified id.
+ * @param eventId Event id to cancel.
+ */
+ void CancelEvent(uint32 eventId)
+ {
+ if (Empty())
+ return;
+
+ for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
+ {
+ if (eventId == (itr->second & 0x0000FFFF))
+ _eventMap.erase(itr++);
+ else
+ ++itr;
+ }
+ }
+
+ /**
+ * @name CancelEventGroup
+ * @brief Cancel events belonging to specified group.
+ * @param group Group to cancel.
+ */
+ void CancelEventGroup(uint32 group)
+ {
+ if (!group || group > 8 || Empty())
+ return;
+
+ uint32 groupMask = (1 << (group + 15));
+ for (EventStore::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
+ {
+ if (itr->second & groupMask)
+ {
+ _eventMap.erase(itr);
+ itr = _eventMap.begin();
+ }
+ else
+ ++itr;
+ }
+ }
+
+ /**
+ * @name GetNextEventTime
+ * @brief Returns closest occurence of specified event.
+ * @param eventId Wanted event id.
+ * @return Time of found event.
+ */
+ uint32 GetNextEventTime(uint32 eventId) const
+ {
+ if (Empty())
+ return 0;
+
+ for (EventStore::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr)
+ if (eventId == (itr->second & 0x0000FFFF))
+ return itr->first;
+
+ return 0;
+ }
+
+ /**
+ * @name GetNextEventTime
+ * @return Time of next event.
+ */
+ uint32 GetNextEventTime() const
+ {
+ return Empty() ? 0 : _eventMap.begin()->first;
+ }
+
+ /**
+ * @name IsInPhase
+ * @brief Returns wether event map is in specified phase or not.
+ * @param phase Wanted phase.
+ * @return True, if phase of event map contains specified phase.
+ */
+ bool IsInPhase(uint8 phase)
+ {
+ return phase <= 8 && (!phase || _phase & (1 << (phase - 1)));
+ }
+
+ private:
+ uint32 _time;
+ uint32 _phase;
+
+ EventStore _eventMap;
+};
+
+#endif
diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt
deleted file mode 100644
index 3b6202072f..0000000000
--- a/src/scripts/CMakeLists.txt
+++ /dev/null
@@ -1,193 +0,0 @@
-# Copyright (C)
-#
-# 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.
-
-# Enable precompiled headers when using the GCC compiler.
-
-CU_RUN_HOOK(BEFORE_SCRIPTS_LIBRARY)
-
-CU_SET_PATH("AC_SCRIPTS_DIR" "${CMAKE_CURRENT_LIST_DIR}")
-
-if (USE_SCRIPTPCH)
- set(scripts_STAT_PCH_HDR PrecompiledHeaders/ScriptPCH.h)
- set(scripts_STAT_PCH_SRC PrecompiledHeaders/ScriptPCH.cpp)
-endif ()
-
-message(STATUS "SCRIPT PREPARATIONS")
-include(Spells/CMakeLists.txt)
-
-include(Commands/CMakeLists.txt)
-
-set(scripts_STAT_SRCS
- ${scripts_STAT_SRCS}
- ScriptLoader.cpp
- ScriptLoader.h
- ${BUILDDIR}/GenLoader.cpp
- ../game/AI/ScriptedAI/ScriptedEscortAI.cpp
- ../game/AI/ScriptedAI/ScriptedCreature.cpp
- ../game/AI/ScriptedAI/ScriptedFollowerAI.cpp
-)
-
-AC_ADD_SCRIPT_LOADER("Spell" "ScriptLoader.h")
-AC_ADD_SCRIPT_LOADER("SC_Smart" "ScriptLoader.h")
-AC_ADD_SCRIPT_LOADER("Command" "ScriptLoader.h")
-
-CU_SET_PATH("CMAKE_AC_MODULE_DIR" "${CMAKE_CURRENT_LIST_DIR}")
-
-if(SCRIPTS)
- include(World/CMakeLists.txt)
- include(OutdoorPvP/CMakeLists.txt)
- include(EasternKingdoms/CMakeLists.txt)
- include(Kalimdor/CMakeLists.txt)
- include(Outland/CMakeLists.txt)
- include(Northrend/CMakeLists.txt)
- include(Events/CMakeLists.txt)
- include(Pet/CMakeLists.txt)
-endif()
-
-if(EXISTS "${AC_SCRIPTS_DIR}/Custom/CMakeLists.txt")
-include(Custom/CMakeLists.txt)
-endif()
-
-CU_GET_GLOBAL("AC_ADD_SCRIPTS_LIST")
-CU_GET_GLOBAL("AC_ADD_SCRIPTS_INCLUDE")
-CU_GET_GLOBAL("AC_SCRIPTS_SOURCES")
-
-set(scripts_STAT_SRCS
- ${scripts_STAT_SRCS}
- ${AC_SCRIPTS_SOURCES}
-)
-
-set("AC_SCRIPTS_INCLUDES" "")
-
-FOREACH (include ${AC_ADD_SCRIPTS_INCLUDE})
- set("AC_SCRIPTS_INCLUDES" "#include \"${include}\"\n${AC_SCRIPTS_INCLUDES}")
-ENDFOREACH()
-
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/GenLoader.cpp.cmake ${BUILDDIR}/GenLoader.cpp)
-
-message(STATUS "SCRIPT PREPARATION COMPLETE")
-message("")
-
-include_directories(
- ${scripts_INCLUDE_DIRS}
- ${CMAKE_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/recastnavigation/Detour/Include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/recastnavigation/Recast/Include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/g3dlite/include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/SFMT
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/zlib
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Configuration
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Cryptography
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Database
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/DataStores
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Debugging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Dynamic/LinkedReference
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Dynamic
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Logging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Packets
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Threading
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Utilities
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/Management
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/Models
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Database
- ${CMAKE_SOURCE_DIR}/modules/acore/game-framework/src/Addons
- ${CMAKE_SOURCE_DIR}/src/game/Accounts
- ${CMAKE_SOURCE_DIR}/src/game/Achievements
- ${CMAKE_SOURCE_DIR}/src/game/AI
- ${CMAKE_SOURCE_DIR}/src/game/AI/CoreAI
- ${CMAKE_SOURCE_DIR}/src/game/AI/ScriptedAI
- ${CMAKE_SOURCE_DIR}/src/game/AI/SmartScripts
- ${CMAKE_SOURCE_DIR}/src/game/AuctionHouse
- ${CMAKE_SOURCE_DIR}/src/game/Battlefield
- ${CMAKE_SOURCE_DIR}/src/game/Battlefield/Zones
- ${CMAKE_SOURCE_DIR}/src/game/Battlegrounds
- ${CMAKE_SOURCE_DIR}/src/game/Battlegrounds/Zones
- ${CMAKE_SOURCE_DIR}/src/game/Calendar
- ${CMAKE_SOURCE_DIR}/src/game/Chat
- ${CMAKE_SOURCE_DIR}/src/game/Chat/Channels
- ${CMAKE_SOURCE_DIR}/src/game/Conditions
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Configuration
- ${CMAKE_SOURCE_DIR}/src/game/Combat
- ${CMAKE_SOURCE_DIR}/src/game/DataStores
- ${CMAKE_SOURCE_DIR}/src/game/DungeonFinding
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Corpse
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Creature
- ${CMAKE_SOURCE_DIR}/src/game/Entities/DynamicObject
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Item
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Item/Container
- ${CMAKE_SOURCE_DIR}/src/game/Entities/GameObject
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Object
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Object/Updates
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Pet
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Player
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Totem
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Transport
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Unit
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Vehicle
- ${CMAKE_SOURCE_DIR}/src/game/Events
- ${CMAKE_SOURCE_DIR}/src/game/Globals
- ${CMAKE_SOURCE_DIR}/src/game/Grids
- ${CMAKE_SOURCE_DIR}/src/game/Grids/Cells
- ${CMAKE_SOURCE_DIR}/src/game/Grids/Notifiers
- ${CMAKE_SOURCE_DIR}/src/game/Groups
- ${CMAKE_SOURCE_DIR}/src/game/Guilds
- ${CMAKE_SOURCE_DIR}/src/game/Handlers
- ${CMAKE_SOURCE_DIR}/src/game/Instances
- ${CMAKE_SOURCE_DIR}/src/game/LookingForGroup
- ${CMAKE_SOURCE_DIR}/src/game/Loot
- ${CMAKE_SOURCE_DIR}/src/game/Mails
- ${CMAKE_SOURCE_DIR}/src/game/Miscellaneous
- ${CMAKE_SOURCE_DIR}/src/game/Maps
- ${CMAKE_SOURCE_DIR}/src/game/Movement
- ${CMAKE_SOURCE_DIR}/src/game/Movement/MovementGenerators
- ${CMAKE_SOURCE_DIR}/src/game/Movement/Spline
- ${CMAKE_SOURCE_DIR}/src/game/Movement/Waypoints
- ${CMAKE_SOURCE_DIR}/src/game/Opcodes
- ${CMAKE_SOURCE_DIR}/src/game/OutdoorPvP
- ${CMAKE_SOURCE_DIR}/src/game/Petitions
- ${CMAKE_SOURCE_DIR}/src/game/Pools
- ${CMAKE_SOURCE_DIR}/src/game/PrecompiledHeaders
- ${CMAKE_SOURCE_DIR}/src/game/Quests
- ${CMAKE_SOURCE_DIR}/src/game/Reputation
- ${CMAKE_SOURCE_DIR}/src/game/Scripting
- ${CMAKE_SOURCE_DIR}/src/game/Server
- ${CMAKE_SOURCE_DIR}/src/game/Server/Protocol
- ${CMAKE_SOURCE_DIR}/src/game/Skills
- ${CMAKE_SOURCE_DIR}/src/game/Spells
- ${CMAKE_SOURCE_DIR}/src/game/Spells/Auras
- ${CMAKE_SOURCE_DIR}/src/game/Texts
- ${CMAKE_SOURCE_DIR}/src/game/Tickets
- ${CMAKE_SOURCE_DIR}/src/game/Tools
- ${CMAKE_SOURCE_DIR}/src/game/Warden
- ${CMAKE_SOURCE_DIR}/src/game/Warden/Modules
- ${CMAKE_SOURCE_DIR}/src/game/Weather
- ${CMAKE_SOURCE_DIR}/src/game/World
- ${CMAKE_SOURCE_DIR}/src/game/ArenaSpectator
- ${CMAKE_SOURCE_DIR}/src/game/Misc
- ${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders
- ${ACE_INCLUDE_DIR}
- ${MYSQL_INCLUDE_DIR}
-)
-
-add_library(scripts STATIC
- ${scripts_STAT_SRCS}
- ${scripts_STAT_PCH_SRC}
-)
-
-add_dependencies(scripts revision.h)
-
-# Generate precompiled header
-if (USE_SCRIPTPCH)
- add_cxx_pch(scripts ${scripts_STAT_PCH_HDR} ${scripts_STAT_PCH_SRC})
-endif()
diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt
new file mode 100644
index 0000000000..d6a3e97362
--- /dev/null
+++ b/src/server/CMakeLists.txt
@@ -0,0 +1,21 @@
+# Copyright (C)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+if( SERVERS )
+set(sources_windows_Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h
+)
+
+add_subdirectory(game)
+add_subdirectory(authserver)
+add_subdirectory(scripts)
+add_subdirectory(worldserver)
+endif()
diff --git a/src/authserver/Authentication/AuthCodes.cpp b/src/server/authserver/Authentication/AuthCodes.cpp
index 201787ecf9..201787ecf9 100644
--- a/src/authserver/Authentication/AuthCodes.cpp
+++ b/src/server/authserver/Authentication/AuthCodes.cpp
diff --git a/src/authserver/Authentication/AuthCodes.h b/src/server/authserver/Authentication/AuthCodes.h
index a63044e918..a63044e918 100644
--- a/src/authserver/Authentication/AuthCodes.h
+++ b/src/server/authserver/Authentication/AuthCodes.h
diff --git a/src/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt
index 4fa2f788e1..65c4ed58e8 100644
--- a/src/authserver/CMakeLists.txt
+++ b/src/server/authserver/CMakeLists.txt
@@ -43,15 +43,15 @@ endif()
include_directories(
${CMAKE_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Database
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Debugging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Packets
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Cryptography
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Cryptography/Authentication
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Logging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Threading
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Utilities
+ ${CMAKE_SOURCE_DIR}/src/common
+ ${CMAKE_SOURCE_DIR}/src/common/Database
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Packets
+ ${CMAKE_SOURCE_DIR}/src/common/Cryptography
+ ${CMAKE_SOURCE_DIR}/src/common/Cryptography/Authentication
+ ${CMAKE_SOURCE_DIR}/src/common/Logging
+ ${CMAKE_SOURCE_DIR}/src/common/Threading
+ ${CMAKE_SOURCE_DIR}/src/common/Utilities
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/Authentication
${CMAKE_CURRENT_SOURCE_DIR}/Realms
diff --git a/src/authserver/Main.cpp b/src/server/authserver/Main.cpp
index 57ed11e458..57ed11e458 100644
--- a/src/authserver/Main.cpp
+++ b/src/server/authserver/Main.cpp
diff --git a/src/authserver/PrecompiledHeaders/authPCH.cpp b/src/server/authserver/PrecompiledHeaders/authPCH.cpp
index eed50cb2c0..eed50cb2c0 100644
--- a/src/authserver/PrecompiledHeaders/authPCH.cpp
+++ b/src/server/authserver/PrecompiledHeaders/authPCH.cpp
diff --git a/src/authserver/PrecompiledHeaders/authPCH.h b/src/server/authserver/PrecompiledHeaders/authPCH.h
index 5fc3b0a341..5fc3b0a341 100644
--- a/src/authserver/PrecompiledHeaders/authPCH.h
+++ b/src/server/authserver/PrecompiledHeaders/authPCH.h
diff --git a/src/authserver/Realms/RealmList.cpp b/src/server/authserver/Realms/RealmList.cpp
index 660554cd26..660554cd26 100644
--- a/src/authserver/Realms/RealmList.cpp
+++ b/src/server/authserver/Realms/RealmList.cpp
diff --git a/src/authserver/Realms/RealmList.h b/src/server/authserver/Realms/RealmList.h
index a24507bf9e..a24507bf9e 100644
--- a/src/authserver/Realms/RealmList.h
+++ b/src/server/authserver/Realms/RealmList.h
diff --git a/src/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp
index c662f544f6..c662f544f6 100644
--- a/src/authserver/Server/AuthSocket.cpp
+++ b/src/server/authserver/Server/AuthSocket.cpp
diff --git a/src/authserver/Server/AuthSocket.h b/src/server/authserver/Server/AuthSocket.h
index 2c8d64c7ca..2c8d64c7ca 100644
--- a/src/authserver/Server/AuthSocket.h
+++ b/src/server/authserver/Server/AuthSocket.h
diff --git a/src/authserver/Server/RealmAcceptor.h b/src/server/authserver/Server/RealmAcceptor.h
index 523fbde415..523fbde415 100644
--- a/src/authserver/Server/RealmAcceptor.h
+++ b/src/server/authserver/Server/RealmAcceptor.h
diff --git a/src/authserver/Server/RealmSocket.cpp b/src/server/authserver/Server/RealmSocket.cpp
index 6fd6f9cb64..6fd6f9cb64 100644
--- a/src/authserver/Server/RealmSocket.cpp
+++ b/src/server/authserver/Server/RealmSocket.cpp
diff --git a/src/authserver/Server/RealmSocket.h b/src/server/authserver/Server/RealmSocket.h
index b1bfffa93d..b1bfffa93d 100644
--- a/src/authserver/Server/RealmSocket.h
+++ b/src/server/authserver/Server/RealmSocket.h
diff --git a/src/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist
index 2ab525b97d..2ab525b97d 100644
--- a/src/authserver/authserver.conf.dist
+++ b/src/server/authserver/authserver.conf.dist
diff --git a/src/authserver/authserver.ico b/src/server/authserver/authserver.ico
index da318f48a8..da318f48a8 100644
--- a/src/authserver/authserver.ico
+++ b/src/server/authserver/authserver.ico
Binary files differ
diff --git a/src/authserver/authserver.rc b/src/server/authserver/authserver.rc
index d21bd638bd..d21bd638bd 100644
--- a/src/authserver/authserver.rc
+++ b/src/server/authserver/authserver.rc
diff --git a/src/authserver/resource.h b/src/server/authserver/resource.h
index 5415d15d80..5415d15d80 100644
--- a/src/authserver/resource.h
+++ b/src/server/authserver/resource.h
diff --git a/src/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp
index 3d7d67665c..3d7d67665c 100644
--- a/src/game/AI/CoreAI/CombatAI.cpp
+++ b/src/server/game/AI/CoreAI/CombatAI.cpp
diff --git a/src/game/AI/CoreAI/CombatAI.h b/src/server/game/AI/CoreAI/CombatAI.h
index 17459fab46..17459fab46 100644
--- a/src/game/AI/CoreAI/CombatAI.h
+++ b/src/server/game/AI/CoreAI/CombatAI.h
diff --git a/src/game/AI/CoreAI/GameObjectAI.cpp b/src/server/game/AI/CoreAI/GameObjectAI.cpp
index 935273b44c..935273b44c 100644
--- a/src/game/AI/CoreAI/GameObjectAI.cpp
+++ b/src/server/game/AI/CoreAI/GameObjectAI.cpp
diff --git a/src/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h
index 9b0024d3ee..9b0024d3ee 100644
--- a/src/game/AI/CoreAI/GameObjectAI.h
+++ b/src/server/game/AI/CoreAI/GameObjectAI.h
diff --git a/src/game/AI/CoreAI/GuardAI.cpp b/src/server/game/AI/CoreAI/GuardAI.cpp
index 59ee6932f9..59ee6932f9 100644
--- a/src/game/AI/CoreAI/GuardAI.cpp
+++ b/src/server/game/AI/CoreAI/GuardAI.cpp
diff --git a/src/game/AI/CoreAI/GuardAI.h b/src/server/game/AI/CoreAI/GuardAI.h
index 80de456e0e..80de456e0e 100644
--- a/src/game/AI/CoreAI/GuardAI.h
+++ b/src/server/game/AI/CoreAI/GuardAI.h
diff --git a/src/game/AI/CoreAI/PassiveAI.cpp b/src/server/game/AI/CoreAI/PassiveAI.cpp
index 3f5b4397be..3f5b4397be 100644
--- a/src/game/AI/CoreAI/PassiveAI.cpp
+++ b/src/server/game/AI/CoreAI/PassiveAI.cpp
diff --git a/src/game/AI/CoreAI/PassiveAI.h b/src/server/game/AI/CoreAI/PassiveAI.h
index e71f790ad2..e71f790ad2 100644
--- a/src/game/AI/CoreAI/PassiveAI.h
+++ b/src/server/game/AI/CoreAI/PassiveAI.h
diff --git a/src/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp
index 8a0b979513..8a0b979513 100644
--- a/src/game/AI/CoreAI/PetAI.cpp
+++ b/src/server/game/AI/CoreAI/PetAI.cpp
diff --git a/src/game/AI/CoreAI/PetAI.h b/src/server/game/AI/CoreAI/PetAI.h
index a00d7be528..a00d7be528 100644
--- a/src/game/AI/CoreAI/PetAI.h
+++ b/src/server/game/AI/CoreAI/PetAI.h
diff --git a/src/game/AI/CoreAI/ReactorAI.cpp b/src/server/game/AI/CoreAI/ReactorAI.cpp
index fa2699d78c..fa2699d78c 100644
--- a/src/game/AI/CoreAI/ReactorAI.cpp
+++ b/src/server/game/AI/CoreAI/ReactorAI.cpp
diff --git a/src/game/AI/CoreAI/ReactorAI.h b/src/server/game/AI/CoreAI/ReactorAI.h
index a222402b81..a222402b81 100644
--- a/src/game/AI/CoreAI/ReactorAI.h
+++ b/src/server/game/AI/CoreAI/ReactorAI.h
diff --git a/src/game/AI/CoreAI/TotemAI.cpp b/src/server/game/AI/CoreAI/TotemAI.cpp
index 5d5c302465..5d5c302465 100644
--- a/src/game/AI/CoreAI/TotemAI.cpp
+++ b/src/server/game/AI/CoreAI/TotemAI.cpp
diff --git a/src/game/AI/CoreAI/TotemAI.h b/src/server/game/AI/CoreAI/TotemAI.h
index 7e153cca24..7e153cca24 100644
--- a/src/game/AI/CoreAI/TotemAI.h
+++ b/src/server/game/AI/CoreAI/TotemAI.h
diff --git a/src/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp
index 1018bc307f..1018bc307f 100644
--- a/src/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
diff --git a/src/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h
index d2c2f1f3df..d2c2f1f3df 100644
--- a/src/game/AI/CoreAI/UnitAI.h
+++ b/src/server/game/AI/CoreAI/UnitAI.h
diff --git a/src/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index 981ff1b5ff..981ff1b5ff 100644
--- a/src/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
diff --git a/src/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index 67e69476d7..67e69476d7 100644
--- a/src/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
diff --git a/src/game/AI/CreatureAIFactory.h b/src/server/game/AI/CreatureAIFactory.h
index 6249fc347b..6249fc347b 100644
--- a/src/game/AI/CreatureAIFactory.h
+++ b/src/server/game/AI/CreatureAIFactory.h
diff --git a/src/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h
index 556058c1d4..556058c1d4 100644
--- a/src/game/AI/CreatureAIImpl.h
+++ b/src/server/game/AI/CreatureAIImpl.h
diff --git a/src/game/AI/CreatureAIRegistry.cpp b/src/server/game/AI/CreatureAIRegistry.cpp
index c2b8d2920a..c2b8d2920a 100644
--- a/src/game/AI/CreatureAIRegistry.cpp
+++ b/src/server/game/AI/CreatureAIRegistry.cpp
diff --git a/src/game/AI/CreatureAIRegistry.h b/src/server/game/AI/CreatureAIRegistry.h
index 381385172a..381385172a 100644
--- a/src/game/AI/CreatureAIRegistry.h
+++ b/src/server/game/AI/CreatureAIRegistry.h
diff --git a/src/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp
index 85f0bc75ad..85f0bc75ad 100644
--- a/src/game/AI/CreatureAISelector.cpp
+++ b/src/server/game/AI/CreatureAISelector.cpp
diff --git a/src/game/AI/CreatureAISelector.h b/src/server/game/AI/CreatureAISelector.h
index 6d49f51cc9..6d49f51cc9 100644
--- a/src/game/AI/CreatureAISelector.h
+++ b/src/server/game/AI/CreatureAISelector.h
diff --git a/src/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index 349b57eb57..349b57eb57 100644
--- a/src/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
diff --git a/src/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
index 54f5c87d50..54f5c87d50 100644
--- a/src/game/AI/ScriptedAI/ScriptedCreature.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
diff --git a/src/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index 4e0d88fe79..4e0d88fe79 100644
--- a/src/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
diff --git a/src/game/AI/ScriptedAI/ScriptedEscortAI.h b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
index 4557569bd9..4557569bd9 100644
--- a/src/game/AI/ScriptedAI/ScriptedEscortAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.h
diff --git a/src/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
index b44ec3ca0f..b44ec3ca0f 100644
--- a/src/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp
diff --git a/src/game/AI/ScriptedAI/ScriptedFollowerAI.h b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
index 926e3f7fa8..926e3f7fa8 100644
--- a/src/game/AI/ScriptedAI/ScriptedFollowerAI.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.h
diff --git a/src/game/AI/ScriptedAI/ScriptedGossip.cpp b/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp
index cf0846108c..cf0846108c 100644
--- a/src/game/AI/ScriptedAI/ScriptedGossip.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp
diff --git a/src/game/AI/ScriptedAI/ScriptedGossip.h b/src/server/game/AI/ScriptedAI/ScriptedGossip.h
index 68de534736..68de534736 100644
--- a/src/game/AI/ScriptedAI/ScriptedGossip.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedGossip.h
diff --git a/src/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 77044f0924..77044f0924 100644
--- a/src/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
diff --git a/src/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index 5f6a8ac104..5f6a8ac104 100644
--- a/src/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
diff --git a/src/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index ed7868baf3..ed7868baf3 100644
--- a/src/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
diff --git a/src/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 548e123317..548e123317 100644
--- a/src/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
diff --git a/src/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index f133d0b35e..f133d0b35e 100644
--- a/src/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
diff --git a/src/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 3b02da9c64..3b02da9c64 100644
--- a/src/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
diff --git a/src/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp
index 27601bd5d0..27601bd5d0 100644
--- a/src/game/Accounts/AccountMgr.cpp
+++ b/src/server/game/Accounts/AccountMgr.cpp
diff --git a/src/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h
index 3028191c7c..3028191c7c 100644
--- a/src/game/Accounts/AccountMgr.h
+++ b/src/server/game/Accounts/AccountMgr.h
diff --git a/src/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index ac8d218c1b..ac8d218c1b 100644
--- a/src/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
diff --git a/src/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 74fe0046ef..74fe0046ef 100644
--- a/src/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
diff --git a/src/server/game/Addons/AddonMgr.cpp b/src/server/game/Addons/AddonMgr.cpp
new file mode 100644
index 0000000000..a8bcdc875e
--- /dev/null
+++ b/src/server/game/Addons/AddonMgr.cpp
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "AddonMgr.h"
+#include "DatabaseEnv.h"
+#include "Log.h"
+#include "Timer.h"
+
+#include <list>
+#include <openssl/md5.h>
+
+namespace AddonMgr
+{
+
+// Anonymous namespace ensures file scope of all the stuff inside it, even
+// if you add something more to this namespace somewhere else.
+namespace
+{
+ // List of saved addons (in DB).
+ typedef std::list<SavedAddon> SavedAddonsList;
+
+ SavedAddonsList m_knownAddons;
+ BannedAddonList m_bannedAddons;
+}
+
+void LoadFromDB()
+{
+ uint32 oldMSTime = getMSTime();
+
+ QueryResult result = CharacterDatabase.Query("SELECT name, crc FROM addons");
+ if (!result)
+ {
+ sLog->outString(">> Loaded 0 known addons. DB table `addons` is empty!");
+ sLog->outString();
+ return;
+ }
+
+ uint32 count = 0;
+
+ do
+ {
+ Field* fields = result->Fetch();
+
+ std::string name = fields[0].GetString();
+ uint32 crc = fields[1].GetUInt32();
+
+ m_knownAddons.push_back(SavedAddon(name, crc));
+
+ ++count;
+ }
+ while (result->NextRow());
+
+ sLog->outString(">> Loaded %u known addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+
+ oldMSTime = getMSTime();
+ result = CharacterDatabase.Query("SELECT id, name, version, UNIX_TIMESTAMP(timestamp) FROM banned_addons");
+ if (result)
+ {
+ uint32 count = 0;
+ uint32 offset = 102;
+
+ do
+ {
+ Field* fields = result->Fetch();
+
+ BannedAddon addon;
+ addon.Id = fields[0].GetUInt32() + offset;
+ addon.Timestamp = uint32(fields[3].GetUInt64());
+
+ std::string name = fields[1].GetString();
+ std::string version = fields[2].GetString();
+
+ MD5(reinterpret_cast<uint8 const*>(name.c_str()), name.length(), addon.NameMD5);
+ MD5(reinterpret_cast<uint8 const*>(version.c_str()), version.length(), addon.VersionMD5);
+
+ m_bannedAddons.push_back(addon);
+
+ ++count;
+ } while (result->NextRow());
+
+ sLog->outString(">> Loaded %u banned addons in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ sLog->outString();
+ }
+}
+
+void SaveAddon(AddonInfo const& addon)
+{
+ std::string name = addon.Name;
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ADDON);
+
+ stmt->setString(0, name);
+ stmt->setUInt32(1, addon.CRC);
+
+ CharacterDatabase.Execute(stmt);
+
+ m_knownAddons.push_back(SavedAddon(addon.Name, addon.CRC));
+}
+
+SavedAddon const* GetAddonInfo(const std::string& name)
+{
+ for (SavedAddonsList::const_iterator it = m_knownAddons.begin(); it != m_knownAddons.end(); ++it)
+ {
+ SavedAddon const& addon = (*it);
+ if (addon.Name == name)
+ return &addon;
+ }
+
+ return NULL;
+}
+
+BannedAddonList const* GetBannedAddons()
+{
+ return &m_bannedAddons;
+}
+
+} // Namespace
diff --git a/src/server/game/Addons/AddonMgr.h b/src/server/game/Addons/AddonMgr.h
new file mode 100644
index 0000000000..24113ff8a5
--- /dev/null
+++ b/src/server/game/Addons/AddonMgr.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _ADDONMGR_H
+#define _ADDONMGR_H
+
+#include "Define.h"
+#include <string>
+#include <list>
+
+struct AddonInfo
+{
+ AddonInfo(const std::string& name, uint8 enabled, uint32 crc, uint8 state, bool crcOrPubKey)
+ : Name(name), Enabled(enabled), CRC(crc), State(state), UsePublicKeyOrCRC(crcOrPubKey) {}
+
+ std::string Name;
+ uint8 Enabled;
+ uint32 CRC;
+ uint8 State;
+ bool UsePublicKeyOrCRC;
+};
+
+struct SavedAddon
+{
+ SavedAddon(const std::string& name, uint32 crc) : Name(name)
+ {
+ CRC = crc;
+ }
+
+ std::string Name;
+ uint32 CRC;
+};
+
+struct BannedAddon
+{
+ uint32 Id;
+ uint8 NameMD5[16];
+ uint8 VersionMD5[16];
+ uint32 Timestamp;
+};
+
+#define STANDARD_ADDON_CRC 0x4c1c776d
+
+namespace AddonMgr
+{
+ void LoadFromDB();
+ void SaveAddon(AddonInfo const& addon);
+ SavedAddon const* GetAddonInfo(const std::string& name);
+
+ typedef std::list<BannedAddon> BannedAddonList;
+ BannedAddonList const* GetBannedAddons();
+}
+
+#endif
+
diff --git a/src/game/ArenaSpectator/ArenaSpectator.h b/src/server/game/ArenaSpectator/ArenaSpectator.h
index f60cf9d9f7..f60cf9d9f7 100644
--- a/src/game/ArenaSpectator/ArenaSpectator.h
+++ b/src/server/game/ArenaSpectator/ArenaSpectator.h
diff --git a/src/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index 500c44d85b..500c44d85b 100644
--- a/src/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
diff --git a/src/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index 15f4db18c9..15f4db18c9 100644
--- a/src/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
diff --git a/src/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp
index 1ab8f8c2e6..1ab8f8c2e6 100644
--- a/src/game/Battlefield/Battlefield.cpp
+++ b/src/server/game/Battlefield/Battlefield.cpp
diff --git a/src/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h
index 7655678ff4..7655678ff4 100644
--- a/src/game/Battlefield/Battlefield.h
+++ b/src/server/game/Battlefield/Battlefield.h
diff --git a/src/game/Battlefield/BattlefieldHandler.cpp b/src/server/game/Battlefield/BattlefieldHandler.cpp
index 50c944dc6d..50c944dc6d 100644
--- a/src/game/Battlefield/BattlefieldHandler.cpp
+++ b/src/server/game/Battlefield/BattlefieldHandler.cpp
diff --git a/src/game/Battlefield/BattlefieldMgr.cpp b/src/server/game/Battlefield/BattlefieldMgr.cpp
index 32a452a626..32a452a626 100644
--- a/src/game/Battlefield/BattlefieldMgr.cpp
+++ b/src/server/game/Battlefield/BattlefieldMgr.cpp
diff --git a/src/game/Battlefield/BattlefieldMgr.h b/src/server/game/Battlefield/BattlefieldMgr.h
index 2834271ad8..2834271ad8 100644
--- a/src/game/Battlefield/BattlefieldMgr.h
+++ b/src/server/game/Battlefield/BattlefieldMgr.h
diff --git a/src/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp
index 804b3b5e55..804b3b5e55 100644
--- a/src/game/Battlefield/Zones/BattlefieldWG.cpp
+++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp
diff --git a/src/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h
index 87658e3b22..87658e3b22 100644
--- a/src/game/Battlefield/Zones/BattlefieldWG.h
+++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h
diff --git a/src/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
index 1a5370b49b..1a5370b49b 100644
--- a/src/game/Battlegrounds/ArenaTeam.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
diff --git a/src/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
index 6baec58265..6baec58265 100644
--- a/src/game/Battlegrounds/ArenaTeam.h
+++ b/src/server/game/Battlegrounds/ArenaTeam.h
diff --git a/src/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
index 80bcdecea4..80bcdecea4 100644
--- a/src/game/Battlegrounds/ArenaTeamMgr.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp
diff --git a/src/game/Battlegrounds/ArenaTeamMgr.h b/src/server/game/Battlegrounds/ArenaTeamMgr.h
index 85224dd2c1..85224dd2c1 100644
--- a/src/game/Battlegrounds/ArenaTeamMgr.h
+++ b/src/server/game/Battlegrounds/ArenaTeamMgr.h
diff --git a/src/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index e4ac0d3901..e4ac0d3901 100644
--- a/src/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
diff --git a/src/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 4ca4de3466..4ca4de3466 100644
--- a/src/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
diff --git a/src/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index f2b53bec3a..f2b53bec3a 100644
--- a/src/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
diff --git a/src/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h
index 48482b7995..48482b7995 100644
--- a/src/game/Battlegrounds/BattlegroundMgr.h
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h
diff --git a/src/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
index 75202db3ca..75202db3ca 100644
--- a/src/game/Battlegrounds/BattlegroundQueue.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
diff --git a/src/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h
index a1e68b858e..a1e68b858e 100644
--- a/src/game/Battlegrounds/BattlegroundQueue.h
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
index d58f6b5431..d58f6b5431 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundAB.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
index ddb5ba5d83..ddb5ba5d83 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundAB.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
index 11416b1df4..11416b1df4 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundAV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
index 2aa518cb6a..2aa518cb6a 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundAV.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundBE.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
index de43c5bfdc..de43c5bfdc 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundBE.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundBE.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundBE.h b/src/server/game/Battlegrounds/Zones/BattlegroundBE.h
index fc61e697bd..fc61e697bd 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundBE.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundBE.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundDS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
index 4fd7785f30..4fd7785f30 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundDS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundDS.h b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
index f378495edd..f378495edd 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundDS.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundDS.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
index 5ab0747557..5ab0747557 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundEY.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
index 5d96953524..5d96953524 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundEY.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index e1fed2c96e..e1fed2c96e 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
index b12e775d60..b12e775d60 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundIC.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundNA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp
index 49ece01053..49ece01053 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundNA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundNA.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundNA.h b/src/server/game/Battlegrounds/Zones/BattlegroundNA.h
index 44ac45a2b6..44ac45a2b6 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundNA.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundNA.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundRL.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp
index ca26e2b013..ca26e2b013 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundRL.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundRL.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundRL.h b/src/server/game/Battlegrounds/Zones/BattlegroundRL.h
index 561cc47736..561cc47736 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundRL.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundRL.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
index 1936da03c4..1936da03c4 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundRV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundRV.h b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
index 394b4bf6c9..394b4bf6c9 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundRV.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
index 47f2b3437b..47f2b3437b 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundSA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
index a9de456ea8..a9de456ea8 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundSA.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
diff --git a/src/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
index 16bb9c7e0b..16bb9c7e0b 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundWS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
diff --git a/src/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
index 6faed44f2c..6faed44f2c 100644
--- a/src/game/Battlegrounds/Zones/BattlegroundWS.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
diff --git a/src/game/CMakeLists.txt b/src/server/game/CMakeLists.txt
index 5638e7f2f7..2b4f7c26ae 100644
--- a/src/game/CMakeLists.txt
+++ b/src/server/game/CMakeLists.txt
@@ -111,29 +111,29 @@ set(game_STAT_SRCS
include_directories(
${game_INCLUDE_DIRS}
${CMAKE_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/recastnavigation/Detour/Include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/recastnavigation/Recast/Include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/g3dlite/include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/SFMT
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/zlib
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/Management
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/Models
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/Maps
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Configuration
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Cryptography
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Cryptography/Authentication
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Database
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/DataStores
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Debugging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Dynamic/LinkedReference
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Dynamic
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Logging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Packets
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Threading
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Utilities
- ${CMAKE_SOURCE_DIR}/modules/acore/game-framework/src/Addons
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour/Include
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Recast/Include
+ ${CMAKE_SOURCE_DIR}/deps/g3dlite/include
+ ${CMAKE_SOURCE_DIR}/deps/SFMT
+ ${CMAKE_SOURCE_DIR}/deps/zlib
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/Management
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/Models
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/Maps
+ ${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/Database
+ ${CMAKE_SOURCE_DIR}/src/common/DataStores
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic/LinkedReference
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic
+ ${CMAKE_SOURCE_DIR}/src/common/Logging
+ ${CMAKE_SOURCE_DIR}/src/common/Packets
+ ${CMAKE_SOURCE_DIR}/src/common/Threading
+ ${CMAKE_SOURCE_DIR}/src/common/Utilities
+ ${CMAKE_SOURCE_DIR}/src/server/game/Addons
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/Accounts
${CMAKE_CURRENT_SOURCE_DIR}/Achievements
@@ -206,8 +206,8 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/World
${CMAKE_CURRENT_SOURCE_DIR}/ArenaSpectator
${CMAKE_CURRENT_SOURCE_DIR}/Misc
- ${CMAKE_SOURCE_DIR}/src/scripts/
- ${CMAKE_SOURCE_DIR}/src/scripts/PrecompiledHeaders
+ ${CMAKE_SOURCE_DIR}/src/server/scripts/
+ ${CMAKE_SOURCE_DIR}/src/server/scripts/PrecompiledHeaders
${ACE_INCLUDE_DIR}
${MYSQL_INCLUDE_DIR}
${OPENSSL_INCLUDE_DIR}
@@ -218,10 +218,6 @@ add_library(game STATIC
${game_STAT_PCH_SRC}
)
-target_link_libraries(game
- gamefw
-)
-
add_dependencies(game revision.h)
# Generate precompiled header
diff --git a/src/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp
index a0031fdc7f..a0031fdc7f 100644
--- a/src/game/Calendar/CalendarMgr.cpp
+++ b/src/server/game/Calendar/CalendarMgr.cpp
diff --git a/src/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h
index b61df6e482..b61df6e482 100644
--- a/src/game/Calendar/CalendarMgr.h
+++ b/src/server/game/Calendar/CalendarMgr.h
diff --git a/src/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp
index 420d436a10..420d436a10 100644
--- a/src/game/Chat/Channels/Channel.cpp
+++ b/src/server/game/Chat/Channels/Channel.cpp
diff --git a/src/game/Chat/Channels/Channel.h b/src/server/game/Chat/Channels/Channel.h
index 8b6b243308..8b6b243308 100644
--- a/src/game/Chat/Channels/Channel.h
+++ b/src/server/game/Chat/Channels/Channel.h
diff --git a/src/game/Chat/Channels/ChannelMgr.cpp b/src/server/game/Chat/Channels/ChannelMgr.cpp
index 49b78129e0..49b78129e0 100644
--- a/src/game/Chat/Channels/ChannelMgr.cpp
+++ b/src/server/game/Chat/Channels/ChannelMgr.cpp
diff --git a/src/game/Chat/Channels/ChannelMgr.h b/src/server/game/Chat/Channels/ChannelMgr.h
index 5775c84acd..5775c84acd 100644
--- a/src/game/Chat/Channels/ChannelMgr.h
+++ b/src/server/game/Chat/Channels/ChannelMgr.h
diff --git a/src/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 79986a7538..79986a7538 100644
--- a/src/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
diff --git a/src/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index dc0e6c65ca..dc0e6c65ca 100644
--- a/src/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
diff --git a/src/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp
index ee5787963c..ee5787963c 100644
--- a/src/game/Chat/ChatLink.cpp
+++ b/src/server/game/Chat/ChatLink.cpp
diff --git a/src/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h
index e004350b1e..e004350b1e 100644
--- a/src/game/Chat/ChatLink.h
+++ b/src/server/game/Chat/ChatLink.h
diff --git a/src/game/Combat/HostileRefManager.cpp b/src/server/game/Combat/HostileRefManager.cpp
index 503f35022f..503f35022f 100644
--- a/src/game/Combat/HostileRefManager.cpp
+++ b/src/server/game/Combat/HostileRefManager.cpp
diff --git a/src/game/Combat/HostileRefManager.h b/src/server/game/Combat/HostileRefManager.h
index a69567a8a4..a69567a8a4 100644
--- a/src/game/Combat/HostileRefManager.h
+++ b/src/server/game/Combat/HostileRefManager.h
diff --git a/src/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index e5c952d53d..e5c952d53d 100644
--- a/src/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
diff --git a/src/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h
index cb746a2c34..cb746a2c34 100644
--- a/src/game/Combat/ThreatManager.h
+++ b/src/server/game/Combat/ThreatManager.h
diff --git a/src/game/Combat/UnitEvents.h b/src/server/game/Combat/UnitEvents.h
index c63ce5112f..c63ce5112f 100644
--- a/src/game/Combat/UnitEvents.h
+++ b/src/server/game/Combat/UnitEvents.h
diff --git a/src/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index ccf36914cf..ccf36914cf 100644
--- a/src/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
diff --git a/src/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 2195ef87c8..2195ef87c8 100644
--- a/src/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
diff --git a/src/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp
index 0a5c838826..0a5c838826 100644
--- a/src/game/Conditions/DisableMgr.cpp
+++ b/src/server/game/Conditions/DisableMgr.cpp
diff --git a/src/game/Conditions/DisableMgr.h b/src/server/game/Conditions/DisableMgr.h
index 075123d257..075123d257 100644
--- a/src/game/Conditions/DisableMgr.h
+++ b/src/server/game/Conditions/DisableMgr.h
diff --git a/src/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 97034d0a4a..97034d0a4a 100644
--- a/src/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
diff --git a/src/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index d92d3f78a2..d92d3f78a2 100644
--- a/src/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
diff --git a/src/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index 5b241f6fcb..5b241f6fcb 100644
--- a/src/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
diff --git a/src/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index e43351b9dd..e43351b9dd 100644
--- a/src/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
diff --git a/src/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 8e1a6c3395..8e1a6c3395 100644
--- a/src/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
diff --git a/src/game/DungeonFinding/LFG.cpp b/src/server/game/DungeonFinding/LFG.cpp
index 880ed01a4e..880ed01a4e 100644
--- a/src/game/DungeonFinding/LFG.cpp
+++ b/src/server/game/DungeonFinding/LFG.cpp
diff --git a/src/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h
index e5b9c5a833..e5b9c5a833 100644
--- a/src/game/DungeonFinding/LFG.h
+++ b/src/server/game/DungeonFinding/LFG.h
diff --git a/src/game/DungeonFinding/LFGGroupData.cpp b/src/server/game/DungeonFinding/LFGGroupData.cpp
index 70b9e7a582..70b9e7a582 100644
--- a/src/game/DungeonFinding/LFGGroupData.cpp
+++ b/src/server/game/DungeonFinding/LFGGroupData.cpp
diff --git a/src/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h
index 3ec0d42d19..3ec0d42d19 100644
--- a/src/game/DungeonFinding/LFGGroupData.h
+++ b/src/server/game/DungeonFinding/LFGGroupData.h
diff --git a/src/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 415a73ede1..415a73ede1 100644
--- a/src/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
diff --git a/src/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index c9c33f402e..c9c33f402e 100644
--- a/src/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
diff --git a/src/game/DungeonFinding/LFGPlayerData.cpp b/src/server/game/DungeonFinding/LFGPlayerData.cpp
index 952c64fea6..952c64fea6 100644
--- a/src/game/DungeonFinding/LFGPlayerData.cpp
+++ b/src/server/game/DungeonFinding/LFGPlayerData.cpp
diff --git a/src/game/DungeonFinding/LFGPlayerData.h b/src/server/game/DungeonFinding/LFGPlayerData.h
index 2731eda359..2731eda359 100644
--- a/src/game/DungeonFinding/LFGPlayerData.h
+++ b/src/server/game/DungeonFinding/LFGPlayerData.h
diff --git a/src/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp
index 68ba72437c..68ba72437c 100644
--- a/src/game/DungeonFinding/LFGQueue.cpp
+++ b/src/server/game/DungeonFinding/LFGQueue.cpp
diff --git a/src/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h
index 9e042067bd..9e042067bd 100644
--- a/src/game/DungeonFinding/LFGQueue.h
+++ b/src/server/game/DungeonFinding/LFGQueue.h
diff --git a/src/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp
index 63dfe243bc..63dfe243bc 100644
--- a/src/game/DungeonFinding/LFGScripts.cpp
+++ b/src/server/game/DungeonFinding/LFGScripts.cpp
diff --git a/src/game/DungeonFinding/LFGScripts.h b/src/server/game/DungeonFinding/LFGScripts.h
index 786de4c6d1..786de4c6d1 100644
--- a/src/game/DungeonFinding/LFGScripts.h
+++ b/src/server/game/DungeonFinding/LFGScripts.h
diff --git a/src/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index 9e833f105f..9e833f105f 100644
--- a/src/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
diff --git a/src/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h
index 0bd0b00356..0bd0b00356 100644
--- a/src/game/Entities/Corpse/Corpse.h
+++ b/src/server/game/Entities/Corpse/Corpse.h
diff --git a/src/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 8a2a0f3a13..8a2a0f3a13 100644
--- a/src/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
diff --git a/src/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 6411337a9b..6411337a9b 100644
--- a/src/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
diff --git a/src/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp
index dc3d0cbbb5..dc3d0cbbb5 100644
--- a/src/game/Entities/Creature/CreatureGroups.cpp
+++ b/src/server/game/Entities/Creature/CreatureGroups.cpp
diff --git a/src/game/Entities/Creature/CreatureGroups.h b/src/server/game/Entities/Creature/CreatureGroups.h
index 8b3ac94c0a..8b3ac94c0a 100644
--- a/src/game/Entities/Creature/CreatureGroups.h
+++ b/src/server/game/Entities/Creature/CreatureGroups.h
diff --git a/src/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 209c9d3b10..209c9d3b10 100644
--- a/src/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
diff --git a/src/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h
index 683f6388e7..683f6388e7 100644
--- a/src/game/Entities/Creature/GossipDef.h
+++ b/src/server/game/Entities/Creature/GossipDef.h
diff --git a/src/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp
index 231ce0d187..231ce0d187 100644
--- a/src/game/Entities/Creature/TemporarySummon.cpp
+++ b/src/server/game/Entities/Creature/TemporarySummon.cpp
diff --git a/src/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h
index e8024f8303..e8024f8303 100644
--- a/src/game/Entities/Creature/TemporarySummon.h
+++ b/src/server/game/Entities/Creature/TemporarySummon.h
diff --git a/src/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index 6a1529cb19..6a1529cb19 100644
--- a/src/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
diff --git a/src/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h
index 6d4f4f483d..6d4f4f483d 100644
--- a/src/game/Entities/DynamicObject/DynamicObject.h
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.h
diff --git a/src/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 735dfefedd..735dfefedd 100644
--- a/src/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
diff --git a/src/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index d2283dfb8c..d2283dfb8c 100644
--- a/src/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
diff --git a/src/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp
index 5f24a9ff4d..5f24a9ff4d 100644
--- a/src/game/Entities/Item/Container/Bag.cpp
+++ b/src/server/game/Entities/Item/Container/Bag.cpp
diff --git a/src/game/Entities/Item/Container/Bag.h b/src/server/game/Entities/Item/Container/Bag.h
index 4ea856d649..4ea856d649 100644
--- a/src/game/Entities/Item/Container/Bag.h
+++ b/src/server/game/Entities/Item/Container/Bag.h
diff --git a/src/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 9a5e5531bc..9a5e5531bc 100644
--- a/src/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
diff --git a/src/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 9145842202..9145842202 100644
--- a/src/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
diff --git a/src/game/Entities/Item/ItemEnchantmentMgr.cpp b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
index a018aa6d0c..a018aa6d0c 100644
--- a/src/game/Entities/Item/ItemEnchantmentMgr.cpp
+++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.cpp
diff --git a/src/game/Entities/Item/ItemEnchantmentMgr.h b/src/server/game/Entities/Item/ItemEnchantmentMgr.h
index 91566e7178..91566e7178 100644
--- a/src/game/Entities/Item/ItemEnchantmentMgr.h
+++ b/src/server/game/Entities/Item/ItemEnchantmentMgr.h
diff --git a/src/game/Entities/Item/ItemPrototype.h b/src/server/game/Entities/Item/ItemPrototype.h
index 7764d3a95c..7764d3a95c 100644
--- a/src/game/Entities/Item/ItemPrototype.h
+++ b/src/server/game/Entities/Item/ItemPrototype.h
diff --git a/src/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index d1731510ea..d1731510ea 100644
--- a/src/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
diff --git a/src/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 68b8bda28c..68b8bda28c 100644
--- a/src/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
diff --git a/src/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h
index ceb154d5c0..ceb154d5c0 100644
--- a/src/game/Entities/Object/ObjectDefines.h
+++ b/src/server/game/Entities/Object/ObjectDefines.h
diff --git a/src/game/Entities/Object/ObjectPosSelector.cpp b/src/server/game/Entities/Object/ObjectPosSelector.cpp
index c5af622e78..c5af622e78 100644
--- a/src/game/Entities/Object/ObjectPosSelector.cpp
+++ b/src/server/game/Entities/Object/ObjectPosSelector.cpp
diff --git a/src/game/Entities/Object/ObjectPosSelector.h b/src/server/game/Entities/Object/ObjectPosSelector.h
index 49c675597b..49c675597b 100644
--- a/src/game/Entities/Object/ObjectPosSelector.h
+++ b/src/server/game/Entities/Object/ObjectPosSelector.h
diff --git a/src/game/Entities/Object/Updates/UpdateData.cpp b/src/server/game/Entities/Object/Updates/UpdateData.cpp
index 7bb23719fa..7bb23719fa 100644
--- a/src/game/Entities/Object/Updates/UpdateData.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateData.cpp
diff --git a/src/game/Entities/Object/Updates/UpdateData.h b/src/server/game/Entities/Object/Updates/UpdateData.h
index 64aee6d400..64aee6d400 100644
--- a/src/game/Entities/Object/Updates/UpdateData.h
+++ b/src/server/game/Entities/Object/Updates/UpdateData.h
diff --git a/src/game/Entities/Object/Updates/UpdateFieldFlags.cpp b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp
index 0c02b555cd..0c02b555cd 100644
--- a/src/game/Entities/Object/Updates/UpdateFieldFlags.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp
diff --git a/src/game/Entities/Object/Updates/UpdateFieldFlags.h b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h
index 096cf5b9ea..096cf5b9ea 100644
--- a/src/game/Entities/Object/Updates/UpdateFieldFlags.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h
diff --git a/src/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 166d354279..166d354279 100644
--- a/src/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
diff --git a/src/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h
index 05940643a3..05940643a3 100644
--- a/src/game/Entities/Object/Updates/UpdateMask.h
+++ b/src/server/game/Entities/Object/Updates/UpdateMask.h
diff --git a/src/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index e887d6cb60..e887d6cb60 100644
--- a/src/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
diff --git a/src/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h
index 65f7735ec7..65f7735ec7 100644
--- a/src/game/Entities/Pet/Pet.h
+++ b/src/server/game/Entities/Pet/Pet.h
diff --git a/src/game/Entities/Pet/PetDefines.h b/src/server/game/Entities/Pet/PetDefines.h
index 6994bf62fb..6994bf62fb 100644
--- a/src/game/Entities/Pet/PetDefines.h
+++ b/src/server/game/Entities/Pet/PetDefines.h
diff --git a/src/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ece890078a..ece890078a 100644
--- a/src/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
diff --git a/src/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 3e879bf1e6..3e879bf1e6 100644
--- a/src/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
diff --git a/src/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp
index 7319dbcac3..7319dbcac3 100644
--- a/src/game/Entities/Player/SocialMgr.cpp
+++ b/src/server/game/Entities/Player/SocialMgr.cpp
diff --git a/src/game/Entities/Player/SocialMgr.h b/src/server/game/Entities/Player/SocialMgr.h
index c7ccfab68a..c7ccfab68a 100644
--- a/src/game/Entities/Player/SocialMgr.h
+++ b/src/server/game/Entities/Player/SocialMgr.h
diff --git a/src/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp
index bf6079fd07..bf6079fd07 100644
--- a/src/game/Entities/Totem/Totem.cpp
+++ b/src/server/game/Entities/Totem/Totem.cpp
diff --git a/src/game/Entities/Totem/Totem.h b/src/server/game/Entities/Totem/Totem.h
index 91b0c37121..91b0c37121 100644
--- a/src/game/Entities/Totem/Totem.h
+++ b/src/server/game/Entities/Totem/Totem.h
diff --git a/src/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 9e67aecea1..9e67aecea1 100644
--- a/src/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
diff --git a/src/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index 15dfad2287..15dfad2287 100644
--- a/src/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
diff --git a/src/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index e45e3b83c1..e45e3b83c1 100644
--- a/src/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
diff --git a/src/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index d0bcf5d290..d0bcf5d290 100644
--- a/src/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
diff --git a/src/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index bb8dca9134..bb8dca9134 100644
--- a/src/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
diff --git a/src/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 25bed66c27..25bed66c27 100644
--- a/src/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
diff --git a/src/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 65bf9d2f5d..65bf9d2f5d 100644
--- a/src/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
diff --git a/src/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h
index 1c1f0da978..1c1f0da978 100644
--- a/src/game/Entities/Vehicle/VehicleDefines.h
+++ b/src/server/game/Entities/Vehicle/VehicleDefines.h
diff --git a/src/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 26670a333a..26670a333a 100644
--- a/src/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
diff --git a/src/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index 64f1659882..64f1659882 100644
--- a/src/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
diff --git a/src/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp
index 03c0fa21d4..03c0fa21d4 100644
--- a/src/game/Globals/ObjectAccessor.cpp
+++ b/src/server/game/Globals/ObjectAccessor.cpp
diff --git a/src/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index b51df205c0..b51df205c0 100644
--- a/src/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
diff --git a/src/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index c82ad20e9c..c82ad20e9c 100644
--- a/src/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
diff --git a/src/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 1340400aa6..1340400aa6 100644
--- a/src/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
diff --git a/src/game/Grids/Cells/Cell.h b/src/server/game/Grids/Cells/Cell.h
index bb19abdf24..bb19abdf24 100644
--- a/src/game/Grids/Cells/Cell.h
+++ b/src/server/game/Grids/Cells/Cell.h
diff --git a/src/game/Grids/Cells/CellImpl.h b/src/server/game/Grids/Cells/CellImpl.h
index 0b683ec5a7..0b683ec5a7 100644
--- a/src/game/Grids/Cells/CellImpl.h
+++ b/src/server/game/Grids/Cells/CellImpl.h
diff --git a/src/game/Grids/Grid.h b/src/server/game/Grids/Grid.h
index dcf7e6cd61..dcf7e6cd61 100644
--- a/src/game/Grids/Grid.h
+++ b/src/server/game/Grids/Grid.h
diff --git a/src/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h
index 5554a731e4..5554a731e4 100644
--- a/src/game/Grids/GridDefines.h
+++ b/src/server/game/Grids/GridDefines.h
diff --git a/src/game/Grids/GridLoader.h b/src/server/game/Grids/GridLoader.h
index 3520515ab5..3520515ab5 100644
--- a/src/game/Grids/GridLoader.h
+++ b/src/server/game/Grids/GridLoader.h
diff --git a/src/game/Grids/GridRefManager.h b/src/server/game/Grids/GridRefManager.h
index b2120e633f..b2120e633f 100644
--- a/src/game/Grids/GridRefManager.h
+++ b/src/server/game/Grids/GridRefManager.h
diff --git a/src/game/Grids/GridReference.h b/src/server/game/Grids/GridReference.h
index cffa719256..cffa719256 100644
--- a/src/game/Grids/GridReference.h
+++ b/src/server/game/Grids/GridReference.h
diff --git a/src/game/Grids/NGrid.h b/src/server/game/Grids/NGrid.h
index a5f586e4cf..a5f586e4cf 100644
--- a/src/game/Grids/NGrid.h
+++ b/src/server/game/Grids/NGrid.h
diff --git a/src/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
index 844d2a7fdb..844d2a7fdb 100644
--- a/src/game/Grids/Notifiers/GridNotifiers.cpp
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
diff --git a/src/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index e0f52dc8ee..e0f52dc8ee 100644
--- a/src/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
diff --git a/src/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
index 1a8fbed5d1..1a8fbed5d1 100644
--- a/src/game/Grids/Notifiers/GridNotifiersImpl.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h
diff --git a/src/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp
index 0c97bdf2b2..0c97bdf2b2 100644
--- a/src/game/Grids/ObjectGridLoader.cpp
+++ b/src/server/game/Grids/ObjectGridLoader.cpp
diff --git a/src/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h
index 184c9638df..184c9638df 100644
--- a/src/game/Grids/ObjectGridLoader.h
+++ b/src/server/game/Grids/ObjectGridLoader.h
diff --git a/src/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 6e970365af..6e970365af 100644
--- a/src/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
diff --git a/src/game/Groups/Group.h b/src/server/game/Groups/Group.h
index 427d11eacf..427d11eacf 100644
--- a/src/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
diff --git a/src/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp
index 745b7ac320..745b7ac320 100644
--- a/src/game/Groups/GroupMgr.cpp
+++ b/src/server/game/Groups/GroupMgr.cpp
diff --git a/src/game/Groups/GroupMgr.h b/src/server/game/Groups/GroupMgr.h
index 5bec7df5db..5bec7df5db 100644
--- a/src/game/Groups/GroupMgr.h
+++ b/src/server/game/Groups/GroupMgr.h
diff --git a/src/game/Groups/GroupRefManager.h b/src/server/game/Groups/GroupRefManager.h
index b796897277..b796897277 100644
--- a/src/game/Groups/GroupRefManager.h
+++ b/src/server/game/Groups/GroupRefManager.h
diff --git a/src/game/Groups/GroupReference.cpp b/src/server/game/Groups/GroupReference.cpp
index 2544332d8f..2544332d8f 100644
--- a/src/game/Groups/GroupReference.cpp
+++ b/src/server/game/Groups/GroupReference.cpp
diff --git a/src/game/Groups/GroupReference.h b/src/server/game/Groups/GroupReference.h
index dc7ab36371..dc7ab36371 100644
--- a/src/game/Groups/GroupReference.h
+++ b/src/server/game/Groups/GroupReference.h
diff --git a/src/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 9c3a093e24..9c3a093e24 100644
--- a/src/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
diff --git a/src/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index c2f66ffe79..c2f66ffe79 100644
--- a/src/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
diff --git a/src/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index 496db63e84..496db63e84 100644
--- a/src/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
diff --git a/src/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h
index b53f6432b3..b53f6432b3 100644
--- a/src/game/Guilds/GuildMgr.h
+++ b/src/server/game/Guilds/GuildMgr.h
diff --git a/src/game/Handlers/AddonHandler.cpp b/src/server/game/Handlers/AddonHandler.cpp
index d1b30c027a..d1b30c027a 100644
--- a/src/game/Handlers/AddonHandler.cpp
+++ b/src/server/game/Handlers/AddonHandler.cpp
diff --git a/src/game/Handlers/AddonHandler.h b/src/server/game/Handlers/AddonHandler.h
index 75b3448667..75b3448667 100644
--- a/src/game/Handlers/AddonHandler.h
+++ b/src/server/game/Handlers/AddonHandler.h
diff --git a/src/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp
index 1095ff194c..1095ff194c 100644
--- a/src/game/Handlers/ArenaTeamHandler.cpp
+++ b/src/server/game/Handlers/ArenaTeamHandler.cpp
diff --git a/src/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index f8c0b178a1..f8c0b178a1 100644
--- a/src/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
diff --git a/src/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index da0b9b974b..da0b9b974b 100644
--- a/src/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
diff --git a/src/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index c1b10240c0..c1b10240c0 100644
--- a/src/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
diff --git a/src/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp
index c09ce07a12..c09ce07a12 100644
--- a/src/game/Handlers/CalendarHandler.cpp
+++ b/src/server/game/Handlers/CalendarHandler.cpp
diff --git a/src/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp
index a74a3e91c6..a74a3e91c6 100644
--- a/src/game/Handlers/ChannelHandler.cpp
+++ b/src/server/game/Handlers/ChannelHandler.cpp
diff --git a/src/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 3679c824ca..3679c824ca 100644
--- a/src/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
diff --git a/src/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index d0e2d9fd2d..d0e2d9fd2d 100644
--- a/src/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
diff --git a/src/game/Handlers/CombatHandler.cpp b/src/server/game/Handlers/CombatHandler.cpp
index c59d10bdbd..c59d10bdbd 100644
--- a/src/game/Handlers/CombatHandler.cpp
+++ b/src/server/game/Handlers/CombatHandler.cpp
diff --git a/src/game/Handlers/DuelHandler.cpp b/src/server/game/Handlers/DuelHandler.cpp
index 5ceb57a4bf..5ceb57a4bf 100644
--- a/src/game/Handlers/DuelHandler.cpp
+++ b/src/server/game/Handlers/DuelHandler.cpp
diff --git a/src/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index e1e6143592..e1e6143592 100644
--- a/src/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
diff --git a/src/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index c76126ff02..c76126ff02 100644
--- a/src/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
diff --git a/src/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index b4aa9ef81c..b4aa9ef81c 100644
--- a/src/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
diff --git a/src/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp
index 5e0fd64483..5e0fd64483 100644
--- a/src/game/Handlers/LFGHandler.cpp
+++ b/src/server/game/Handlers/LFGHandler.cpp
diff --git a/src/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp
index 1299042b0c..1299042b0c 100644
--- a/src/game/Handlers/LootHandler.cpp
+++ b/src/server/game/Handlers/LootHandler.cpp
diff --git a/src/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index 24b213472b..24b213472b 100644
--- a/src/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
diff --git a/src/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index ec48d7221b..ec48d7221b 100644
--- a/src/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
diff --git a/src/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 8d435b303d..8d435b303d 100644
--- a/src/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
diff --git a/src/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index 3458895bcc..3458895bcc 100644
--- a/src/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
diff --git a/src/game/Handlers/NPCHandler.h b/src/server/game/Handlers/NPCHandler.h
index efd2cb254f..efd2cb254f 100644
--- a/src/game/Handlers/NPCHandler.h
+++ b/src/server/game/Handlers/NPCHandler.h
diff --git a/src/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index 722c6a3348..722c6a3348 100644
--- a/src/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
diff --git a/src/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp
index c5d40fdfc0..c5d40fdfc0 100644
--- a/src/game/Handlers/PetitionsHandler.cpp
+++ b/src/server/game/Handlers/PetitionsHandler.cpp
diff --git a/src/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index 99ae110297..99ae110297 100644
--- a/src/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
diff --git a/src/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 8650e309cf..8650e309cf 100644
--- a/src/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
diff --git a/src/game/Handlers/ReferAFriendHandler.cpp b/src/server/game/Handlers/ReferAFriendHandler.cpp
index ecf654952c..ecf654952c 100644
--- a/src/game/Handlers/ReferAFriendHandler.cpp
+++ b/src/server/game/Handlers/ReferAFriendHandler.cpp
diff --git a/src/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp
index ab6884b13e..ab6884b13e 100644
--- a/src/game/Handlers/SkillHandler.cpp
+++ b/src/server/game/Handlers/SkillHandler.cpp
diff --git a/src/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index b87646b149..b87646b149 100644
--- a/src/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
diff --git a/src/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp
index 92bcddc72d..92bcddc72d 100644
--- a/src/game/Handlers/TaxiHandler.cpp
+++ b/src/server/game/Handlers/TaxiHandler.cpp
diff --git a/src/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp
index 5b92cb4099..5b92cb4099 100644
--- a/src/game/Handlers/TicketHandler.cpp
+++ b/src/server/game/Handlers/TicketHandler.cpp
diff --git a/src/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp
index 0b5732479e..0b5732479e 100644
--- a/src/game/Handlers/TradeHandler.cpp
+++ b/src/server/game/Handlers/TradeHandler.cpp
diff --git a/src/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp
index f0b211f599..f0b211f599 100644
--- a/src/game/Handlers/VehicleHandler.cpp
+++ b/src/server/game/Handlers/VehicleHandler.cpp
diff --git a/src/game/Handlers/VoiceChatHandler.cpp b/src/server/game/Handlers/VoiceChatHandler.cpp
index 2bef115378..2bef115378 100644
--- a/src/game/Handlers/VoiceChatHandler.cpp
+++ b/src/server/game/Handlers/VoiceChatHandler.cpp
diff --git a/src/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index 850457d34e..850457d34e 100644
--- a/src/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
diff --git a/src/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h
index 410d783942..410d783942 100644
--- a/src/game/Instances/InstanceSaveMgr.h
+++ b/src/server/game/Instances/InstanceSaveMgr.h
diff --git a/src/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index 05ebf650d1..05ebf650d1 100644
--- a/src/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
diff --git a/src/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 3d1958d604..3d1958d604 100644
--- a/src/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
diff --git a/src/game/Loot/LootItemStorage.cpp b/src/server/game/Loot/LootItemStorage.cpp
index beaecc87ca..beaecc87ca 100644
--- a/src/game/Loot/LootItemStorage.cpp
+++ b/src/server/game/Loot/LootItemStorage.cpp
diff --git a/src/game/Loot/LootItemStorage.h b/src/server/game/Loot/LootItemStorage.h
index a55cda8473..a55cda8473 100644
--- a/src/game/Loot/LootItemStorage.h
+++ b/src/server/game/Loot/LootItemStorage.h
diff --git a/src/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index e25cd1c362..e25cd1c362 100644
--- a/src/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
diff --git a/src/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h
index fc08f030af..fc08f030af 100644
--- a/src/game/Loot/LootMgr.h
+++ b/src/server/game/Loot/LootMgr.h
diff --git a/src/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp
index a4a50ccccd..a4a50ccccd 100644
--- a/src/game/Mails/Mail.cpp
+++ b/src/server/game/Mails/Mail.cpp
diff --git a/src/game/Mails/Mail.h b/src/server/game/Mails/Mail.h
index d655767972..d655767972 100644
--- a/src/game/Mails/Mail.h
+++ b/src/server/game/Mails/Mail.h
diff --git a/src/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 4e6a595a55..4e6a595a55 100644
--- a/src/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
diff --git a/src/game/Maps/Map.h b/src/server/game/Maps/Map.h
index aa8939638e..aa8939638e 100644
--- a/src/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
diff --git a/src/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp
index 31c139e2ef..31c139e2ef 100644
--- a/src/game/Maps/MapInstanced.cpp
+++ b/src/server/game/Maps/MapInstanced.cpp
diff --git a/src/game/Maps/MapInstanced.h b/src/server/game/Maps/MapInstanced.h
index fd0b815052..fd0b815052 100644
--- a/src/game/Maps/MapInstanced.h
+++ b/src/server/game/Maps/MapInstanced.h
diff --git a/src/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index c865f73569..c865f73569 100644
--- a/src/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
diff --git a/src/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h
index d8ca015251..d8ca015251 100644
--- a/src/game/Maps/MapManager.h
+++ b/src/server/game/Maps/MapManager.h
diff --git a/src/game/Maps/MapRefManager.h b/src/server/game/Maps/MapRefManager.h
index 6e8287ac19..6e8287ac19 100644
--- a/src/game/Maps/MapRefManager.h
+++ b/src/server/game/Maps/MapRefManager.h
diff --git a/src/game/Maps/MapReference.h b/src/server/game/Maps/MapReference.h
index ca07d4ac01..ca07d4ac01 100644
--- a/src/game/Maps/MapReference.h
+++ b/src/server/game/Maps/MapReference.h
diff --git a/src/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp
index 3377b7455d..3377b7455d 100644
--- a/src/game/Maps/MapUpdater.cpp
+++ b/src/server/game/Maps/MapUpdater.cpp
diff --git a/src/game/Maps/MapUpdater.h b/src/server/game/Maps/MapUpdater.h
index 7afbfd5cb8..7afbfd5cb8 100644
--- a/src/game/Maps/MapUpdater.h
+++ b/src/server/game/Maps/MapUpdater.h
diff --git a/src/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp
index 3aa65c1635..3aa65c1635 100644
--- a/src/game/Maps/TransportMgr.cpp
+++ b/src/server/game/Maps/TransportMgr.cpp
diff --git a/src/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h
index 80d0a7b9db..80d0a7b9db 100644
--- a/src/game/Maps/TransportMgr.h
+++ b/src/server/game/Maps/TransportMgr.h
diff --git a/src/game/Maps/ZoneScript.h b/src/server/game/Maps/ZoneScript.h
index 157322a055..157322a055 100644
--- a/src/game/Maps/ZoneScript.h
+++ b/src/server/game/Maps/ZoneScript.h
diff --git a/src/game/Misc/AsyncAuctionListing.cpp b/src/server/game/Misc/AsyncAuctionListing.cpp
index 35b042c526..35b042c526 100644
--- a/src/game/Misc/AsyncAuctionListing.cpp
+++ b/src/server/game/Misc/AsyncAuctionListing.cpp
diff --git a/src/game/Misc/AsyncAuctionListing.h b/src/server/game/Misc/AsyncAuctionListing.h
index 55abb27e78..55abb27e78 100644
--- a/src/game/Misc/AsyncAuctionListing.h
+++ b/src/server/game/Misc/AsyncAuctionListing.h
diff --git a/src/game/Misc/AvgDiffTracker.cpp b/src/server/game/Misc/AvgDiffTracker.cpp
index 208a3a1829..208a3a1829 100644
--- a/src/game/Misc/AvgDiffTracker.cpp
+++ b/src/server/game/Misc/AvgDiffTracker.cpp
diff --git a/src/game/Misc/AvgDiffTracker.h b/src/server/game/Misc/AvgDiffTracker.h
index 58119df52d..58119df52d 100644
--- a/src/game/Misc/AvgDiffTracker.h
+++ b/src/server/game/Misc/AvgDiffTracker.h
diff --git a/src/game/Misc/DynamicVisibility.cpp b/src/server/game/Misc/DynamicVisibility.cpp
index 66fe7055ff..66fe7055ff 100644
--- a/src/game/Misc/DynamicVisibility.cpp
+++ b/src/server/game/Misc/DynamicVisibility.cpp
diff --git a/src/game/Misc/DynamicVisibility.h b/src/server/game/Misc/DynamicVisibility.h
index 49a8958337..49a8958337 100644
--- a/src/game/Misc/DynamicVisibility.h
+++ b/src/server/game/Misc/DynamicVisibility.h
diff --git a/src/game/Misc/SavingSystem.cpp b/src/server/game/Misc/SavingSystem.cpp
index 3f35d34db8..3f35d34db8 100644
--- a/src/game/Misc/SavingSystem.cpp
+++ b/src/server/game/Misc/SavingSystem.cpp
diff --git a/src/game/Misc/SavingSystem.h b/src/server/game/Misc/SavingSystem.h
index f53153f957..f53153f957 100644
--- a/src/game/Misc/SavingSystem.h
+++ b/src/server/game/Misc/SavingSystem.h
diff --git a/src/game/Misc/WhoListCache.cpp b/src/server/game/Misc/WhoListCache.cpp
index 7b6873f1c7..7b6873f1c7 100644
--- a/src/game/Misc/WhoListCache.cpp
+++ b/src/server/game/Misc/WhoListCache.cpp
diff --git a/src/game/Misc/WhoListCache.h b/src/server/game/Misc/WhoListCache.h
index bd82883e67..bd82883e67 100644
--- a/src/game/Misc/WhoListCache.h
+++ b/src/server/game/Misc/WhoListCache.h
diff --git a/src/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index 01bfad042b..01bfad042b 100644
--- a/src/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
diff --git a/src/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 9a00adb1c1..9a00adb1c1 100644
--- a/src/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
diff --git a/src/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 751024f46a..751024f46a 100644
--- a/src/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
diff --git a/src/game/Movement/FollowerRefManager.h b/src/server/game/Movement/FollowerRefManager.h
index a0146f60c0..a0146f60c0 100644
--- a/src/game/Movement/FollowerRefManager.h
+++ b/src/server/game/Movement/FollowerRefManager.h
diff --git a/src/game/Movement/FollowerReference.cpp b/src/server/game/Movement/FollowerReference.cpp
index 383173d237..383173d237 100644
--- a/src/game/Movement/FollowerReference.cpp
+++ b/src/server/game/Movement/FollowerReference.cpp
diff --git a/src/game/Movement/FollowerReference.h b/src/server/game/Movement/FollowerReference.h
index 1ad745a2a8..1ad745a2a8 100644
--- a/src/game/Movement/FollowerReference.h
+++ b/src/server/game/Movement/FollowerReference.h
diff --git a/src/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 9b17749f51..9b17749f51 100644
--- a/src/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
diff --git a/src/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index 5cb1f146e0..5cb1f146e0 100644
--- a/src/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
diff --git a/src/game/Movement/MovementGenerator.cpp b/src/server/game/Movement/MovementGenerator.cpp
index 4ad366c0cb..4ad366c0cb 100644
--- a/src/game/Movement/MovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h
index 86863c664c..86863c664c 100644
--- a/src/game/Movement/MovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerator.h
diff --git a/src/game/Movement/MovementGeneratorImpl.h b/src/server/game/Movement/MovementGeneratorImpl.h
index a0fecbd177..a0fecbd177 100644
--- a/src/game/Movement/MovementGeneratorImpl.h
+++ b/src/server/game/Movement/MovementGeneratorImpl.h
diff --git a/src/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
index a03b36e07b..a03b36e07b 100644
--- a/src/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/ConfusedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h
index 5f14adc0b8..5f14adc0b8 100644
--- a/src/game/Movement/MovementGenerators/ConfusedMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/EscortMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.cpp
index 47e40f6ae3..47e40f6ae3 100644
--- a/src/game/Movement/MovementGenerators/EscortMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/EscortMovementGenerator.h b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.h
index a3495e44eb..a3495e44eb 100644
--- a/src/game/Movement/MovementGenerators/EscortMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/EscortMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
index 0e74cdbdb8..0e74cdbdb8 100644
--- a/src/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/FleeingMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
index 7927bf1043..7927bf1043 100644
--- a/src/game/Movement/MovementGenerators/FleeingMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
index ae94e77a54..ae94e77a54 100644
--- a/src/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/HomeMovementGenerator.h b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h
index 47a0ad44b4..47a0ad44b4 100644
--- a/src/game/Movement/MovementGenerators/HomeMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
index 80de496d94..80de496d94 100644
--- a/src/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/IdleMovementGenerator.h b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
index 72b3c95f51..72b3c95f51 100644
--- a/src/game/Movement/MovementGenerators/IdleMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp
index 0a55b66d23..0a55b66d23 100644
--- a/src/game/Movement/MovementGenerators/PathGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/PathGenerator.h b/src/server/game/Movement/MovementGenerators/PathGenerator.h
index b6c6e72e0d..b6c6e72e0d 100644
--- a/src/game/Movement/MovementGenerators/PathGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/PathGenerator.h
diff --git a/src/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
index abe8cecb3d..abe8cecb3d 100644
--- a/src/game/Movement/MovementGenerators/PointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/PointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h
index b29fece3f6..b29fece3f6 100644
--- a/src/game/Movement/MovementGenerators/PointMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
index f706b7108d..f706b7108d 100644
--- a/src/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/RandomMovementGenerator.h b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
index 5881536256..5881536256 100644
--- a/src/game/Movement/MovementGenerators/RandomMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
index 97ffaa4437..97ffaa4437 100644
--- a/src/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h
index 19afaa6c3f..19afaa6c3f 100644
--- a/src/game/Movement/MovementGenerators/TargetedMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h
diff --git a/src/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index da316b5224..da316b5224 100644
--- a/src/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
diff --git a/src/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h
index e0e8f87a2f..e0e8f87a2f 100644
--- a/src/game/Movement/MovementGenerators/WaypointMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h
diff --git a/src/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp
index 684c14e1ab..684c14e1ab 100644
--- a/src/game/Movement/Spline/MoveSpline.cpp
+++ b/src/server/game/Movement/Spline/MoveSpline.cpp
diff --git a/src/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h
index b8df80953f..b8df80953f 100644
--- a/src/game/Movement/Spline/MoveSpline.h
+++ b/src/server/game/Movement/Spline/MoveSpline.h
diff --git a/src/game/Movement/Spline/MoveSplineFlag.h b/src/server/game/Movement/Spline/MoveSplineFlag.h
index 7c5da0f39b..7c5da0f39b 100644
--- a/src/game/Movement/Spline/MoveSplineFlag.h
+++ b/src/server/game/Movement/Spline/MoveSplineFlag.h
diff --git a/src/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index 345517e9df..345517e9df 100644
--- a/src/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
diff --git a/src/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h
index 83a03eaeff..83a03eaeff 100644
--- a/src/game/Movement/Spline/MoveSplineInit.h
+++ b/src/server/game/Movement/Spline/MoveSplineInit.h
diff --git a/src/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h
index edde1fbf02..edde1fbf02 100644
--- a/src/game/Movement/Spline/MoveSplineInitArgs.h
+++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h
diff --git a/src/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
index a9efd52593..a9efd52593 100644
--- a/src/game/Movement/Spline/MovementPacketBuilder.cpp
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
diff --git a/src/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h
index 66f3074c3e..66f3074c3e 100644
--- a/src/game/Movement/Spline/MovementPacketBuilder.h
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h
diff --git a/src/game/Movement/Spline/MovementTypedefs.h b/src/server/game/Movement/Spline/MovementTypedefs.h
index 5c92745820..5c92745820 100644
--- a/src/game/Movement/Spline/MovementTypedefs.h
+++ b/src/server/game/Movement/Spline/MovementTypedefs.h
diff --git a/src/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp
index c7b6e4b601..c7b6e4b601 100644
--- a/src/game/Movement/Spline/MovementUtil.cpp
+++ b/src/server/game/Movement/Spline/MovementUtil.cpp
diff --git a/src/game/Movement/Spline/Spline.cpp b/src/server/game/Movement/Spline/Spline.cpp
index 88ddb48537..88ddb48537 100644
--- a/src/game/Movement/Spline/Spline.cpp
+++ b/src/server/game/Movement/Spline/Spline.cpp
diff --git a/src/game/Movement/Spline/Spline.h b/src/server/game/Movement/Spline/Spline.h
index 8084c18e19..8084c18e19 100644
--- a/src/game/Movement/Spline/Spline.h
+++ b/src/server/game/Movement/Spline/Spline.h
diff --git a/src/game/Movement/Spline/SplineImpl.h b/src/server/game/Movement/Spline/SplineImpl.h
index 1cd60707ef..1cd60707ef 100644
--- a/src/game/Movement/Spline/SplineImpl.h
+++ b/src/server/game/Movement/Spline/SplineImpl.h
diff --git a/src/game/Movement/Waypoints/WaypointManager.cpp b/src/server/game/Movement/Waypoints/WaypointManager.cpp
index 094843b997..094843b997 100644
--- a/src/game/Movement/Waypoints/WaypointManager.cpp
+++ b/src/server/game/Movement/Waypoints/WaypointManager.cpp
diff --git a/src/game/Movement/Waypoints/WaypointManager.h b/src/server/game/Movement/Waypoints/WaypointManager.h
index a978213a70..a978213a70 100644
--- a/src/game/Movement/Waypoints/WaypointManager.h
+++ b/src/server/game/Movement/Waypoints/WaypointManager.h
diff --git a/src/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp
index b2a1502652..b2a1502652 100644
--- a/src/game/OutdoorPvP/OutdoorPvP.cpp
+++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp
diff --git a/src/game/OutdoorPvP/OutdoorPvP.h b/src/server/game/OutdoorPvP/OutdoorPvP.h
index 2f94c5ca75..2f94c5ca75 100644
--- a/src/game/OutdoorPvP/OutdoorPvP.h
+++ b/src/server/game/OutdoorPvP/OutdoorPvP.h
diff --git a/src/game/OutdoorPvP/OutdoorPvPMgr.cpp b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
index 315c5055fc..315c5055fc 100644
--- a/src/game/OutdoorPvP/OutdoorPvPMgr.cpp
+++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp
diff --git a/src/game/OutdoorPvP/OutdoorPvPMgr.h b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h
index 5d7483620b..5d7483620b 100644
--- a/src/game/OutdoorPvP/OutdoorPvPMgr.h
+++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h
diff --git a/src/game/Petitions/PetitionMgr.cpp b/src/server/game/Petitions/PetitionMgr.cpp
index 7011c19ab4..7011c19ab4 100644
--- a/src/game/Petitions/PetitionMgr.cpp
+++ b/src/server/game/Petitions/PetitionMgr.cpp
diff --git a/src/game/Petitions/PetitionMgr.h b/src/server/game/Petitions/PetitionMgr.h
index 67476e6009..67476e6009 100644
--- a/src/game/Petitions/PetitionMgr.h
+++ b/src/server/game/Petitions/PetitionMgr.h
diff --git a/src/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp
index 2d22777854..2d22777854 100644
--- a/src/game/Pools/PoolMgr.cpp
+++ b/src/server/game/Pools/PoolMgr.cpp
diff --git a/src/game/Pools/PoolMgr.h b/src/server/game/Pools/PoolMgr.h
index 3bceee5c06..3bceee5c06 100644
--- a/src/game/Pools/PoolMgr.h
+++ b/src/server/game/Pools/PoolMgr.h
diff --git a/src/game/PrecompiledHeaders/gamePCH.cpp b/src/server/game/PrecompiledHeaders/gamePCH.cpp
index 11e501ec7f..11e501ec7f 100644
--- a/src/game/PrecompiledHeaders/gamePCH.cpp
+++ b/src/server/game/PrecompiledHeaders/gamePCH.cpp
diff --git a/src/game/PrecompiledHeaders/gamePCH.h b/src/server/game/PrecompiledHeaders/gamePCH.h
index 68f628430c..68f628430c 100644
--- a/src/game/PrecompiledHeaders/gamePCH.h
+++ b/src/server/game/PrecompiledHeaders/gamePCH.h
diff --git a/src/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index a74bdddff4..a74bdddff4 100644
--- a/src/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
diff --git a/src/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index eb83715793..eb83715793 100644
--- a/src/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
diff --git a/src/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index dde87c8462..dde87c8462 100644
--- a/src/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
diff --git a/src/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h
index 232e021067..232e021067 100644
--- a/src/game/Reputation/ReputationMgr.h
+++ b/src/server/game/Reputation/ReputationMgr.h
diff --git a/src/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp
index 9e9e9f28a4..9e9e9f28a4 100644
--- a/src/game/Scripting/MapScripts.cpp
+++ b/src/server/game/Scripting/MapScripts.cpp
diff --git a/src/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 2c2bf165c6..2c2bf165c6 100644
--- a/src/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
diff --git a/src/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index c71c45dbff..c71c45dbff 100644
--- a/src/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
diff --git a/src/game/Scripting/ScriptSystem.cpp b/src/server/game/Scripting/ScriptSystem.cpp
index 042319a961..042319a961 100644
--- a/src/game/Scripting/ScriptSystem.cpp
+++ b/src/server/game/Scripting/ScriptSystem.cpp
diff --git a/src/game/Scripting/ScriptSystem.h b/src/server/game/Scripting/ScriptSystem.h
index cbf4225909..cbf4225909 100644
--- a/src/game/Scripting/ScriptSystem.h
+++ b/src/server/game/Scripting/ScriptSystem.h
diff --git a/src/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 7878857174..7878857174 100644
--- a/src/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
diff --git a/src/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index b6fe7e0521..b6fe7e0521 100644
--- a/src/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
diff --git a/src/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp
index bac1b078a3..bac1b078a3 100644
--- a/src/game/Server/Protocol/PacketLog.cpp
+++ b/src/server/game/Server/Protocol/PacketLog.cpp
diff --git a/src/game/Server/Protocol/PacketLog.h b/src/server/game/Server/Protocol/PacketLog.h
index e9e8052fd7..e9e8052fd7 100644
--- a/src/game/Server/Protocol/PacketLog.h
+++ b/src/server/game/Server/Protocol/PacketLog.h
diff --git a/src/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index a92ee83563..a92ee83563 100644
--- a/src/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
diff --git a/src/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index ec786c6fef..ec786c6fef 100644
--- a/src/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
diff --git a/src/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index c774ba134e..c774ba134e 100644
--- a/src/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
diff --git a/src/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h
index cfbbe3795a..cfbbe3795a 100644
--- a/src/game/Server/WorldSocket.h
+++ b/src/server/game/Server/WorldSocket.h
diff --git a/src/game/Server/WorldSocketAcceptor.h b/src/server/game/Server/WorldSocketAcceptor.h
index 342d501868..342d501868 100644
--- a/src/game/Server/WorldSocketAcceptor.h
+++ b/src/server/game/Server/WorldSocketAcceptor.h
diff --git a/src/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp
index 89367ee4a9..89367ee4a9 100644
--- a/src/game/Server/WorldSocketMgr.cpp
+++ b/src/server/game/Server/WorldSocketMgr.cpp
diff --git a/src/game/Server/WorldSocketMgr.h b/src/server/game/Server/WorldSocketMgr.h
index 3ef767aec2..3ef767aec2 100644
--- a/src/game/Server/WorldSocketMgr.h
+++ b/src/server/game/Server/WorldSocketMgr.h
diff --git a/src/game/Skills/SkillDiscovery.cpp b/src/server/game/Skills/SkillDiscovery.cpp
index b464725aaa..b464725aaa 100644
--- a/src/game/Skills/SkillDiscovery.cpp
+++ b/src/server/game/Skills/SkillDiscovery.cpp
diff --git a/src/game/Skills/SkillDiscovery.h b/src/server/game/Skills/SkillDiscovery.h
index 6638a325ee..6638a325ee 100644
--- a/src/game/Skills/SkillDiscovery.h
+++ b/src/server/game/Skills/SkillDiscovery.h
diff --git a/src/game/Skills/SkillExtraItems.cpp b/src/server/game/Skills/SkillExtraItems.cpp
index e443844d3e..e443844d3e 100644
--- a/src/game/Skills/SkillExtraItems.cpp
+++ b/src/server/game/Skills/SkillExtraItems.cpp
diff --git a/src/game/Skills/SkillExtraItems.h b/src/server/game/Skills/SkillExtraItems.h
index 366d5c0545..366d5c0545 100644
--- a/src/game/Skills/SkillExtraItems.h
+++ b/src/server/game/Skills/SkillExtraItems.h
diff --git a/src/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 6d2eebcdda..6d2eebcdda 100644
--- a/src/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
diff --git a/src/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 99759c7329..99759c7329 100644
--- a/src/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
diff --git a/src/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index e5e00956a5..e5e00956a5 100644
--- a/src/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
diff --git a/src/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index c50ecc2bc0..c50ecc2bc0 100644
--- a/src/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
diff --git a/src/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index 1587f9fadf..1587f9fadf 100644
--- a/src/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
diff --git a/src/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 8bf57153b9..8bf57153b9 100644
--- a/src/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
diff --git a/src/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 880bb1fdc8..880bb1fdc8 100644
--- a/src/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
diff --git a/src/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 4ec091f78a..4ec091f78a 100644
--- a/src/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
diff --git a/src/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 46d5b708b4..46d5b708b4 100644
--- a/src/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
diff --git a/src/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 19cb345688..19cb345688 100644
--- a/src/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
diff --git a/src/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index d8dbd3aa8f..d8dbd3aa8f 100644
--- a/src/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
diff --git a/src/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index ba76683a67..ba76683a67 100644
--- a/src/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
diff --git a/src/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 3cabe23d56..3cabe23d56 100644
--- a/src/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
diff --git a/src/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 5bf754eef1..5bf754eef1 100644
--- a/src/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
diff --git a/src/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp
index 3465859d63..3465859d63 100644
--- a/src/game/Texts/CreatureTextMgr.cpp
+++ b/src/server/game/Texts/CreatureTextMgr.cpp
diff --git a/src/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h
index 05a1469830..05a1469830 100644
--- a/src/game/Texts/CreatureTextMgr.h
+++ b/src/server/game/Texts/CreatureTextMgr.h
diff --git a/src/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp
index ce7c46a5b8..ce7c46a5b8 100644
--- a/src/game/Tickets/TicketMgr.cpp
+++ b/src/server/game/Tickets/TicketMgr.cpp
diff --git a/src/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h
index 94ebd74db5..94ebd74db5 100644
--- a/src/game/Tickets/TicketMgr.h
+++ b/src/server/game/Tickets/TicketMgr.h
diff --git a/src/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
index 59151ea866..59151ea866 100644
--- a/src/game/Tools/CharacterDatabaseCleaner.cpp
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
diff --git a/src/game/Tools/CharacterDatabaseCleaner.h b/src/server/game/Tools/CharacterDatabaseCleaner.h
index 2ad7436d53..2ad7436d53 100644
--- a/src/game/Tools/CharacterDatabaseCleaner.h
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.h
diff --git a/src/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp
index 36b958f6bc..36b958f6bc 100644
--- a/src/game/Tools/PlayerDump.cpp
+++ b/src/server/game/Tools/PlayerDump.cpp
diff --git a/src/game/Tools/PlayerDump.h b/src/server/game/Tools/PlayerDump.h
index 3afbaa806a..3afbaa806a 100644
--- a/src/game/Tools/PlayerDump.h
+++ b/src/server/game/Tools/PlayerDump.h
diff --git a/src/game/Warden/Modules/WardenModuleMac.h b/src/server/game/Warden/Modules/WardenModuleMac.h
index f3609c037e..f3609c037e 100644
--- a/src/game/Warden/Modules/WardenModuleMac.h
+++ b/src/server/game/Warden/Modules/WardenModuleMac.h
diff --git a/src/game/Warden/Modules/WardenModuleWin.h b/src/server/game/Warden/Modules/WardenModuleWin.h
index 64a2d9ca11..64a2d9ca11 100644
--- a/src/game/Warden/Modules/WardenModuleWin.h
+++ b/src/server/game/Warden/Modules/WardenModuleWin.h
diff --git a/src/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp
index 5771a8a22a..5771a8a22a 100644
--- a/src/game/Warden/Warden.cpp
+++ b/src/server/game/Warden/Warden.cpp
diff --git a/src/game/Warden/Warden.h b/src/server/game/Warden/Warden.h
index 78a6b8c9d0..78a6b8c9d0 100644
--- a/src/game/Warden/Warden.h
+++ b/src/server/game/Warden/Warden.h
diff --git a/src/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp
index 3f153b0c1f..3f153b0c1f 100644
--- a/src/game/Warden/WardenCheckMgr.cpp
+++ b/src/server/game/Warden/WardenCheckMgr.cpp
diff --git a/src/game/Warden/WardenCheckMgr.h b/src/server/game/Warden/WardenCheckMgr.h
index 2485c6d541..2485c6d541 100644
--- a/src/game/Warden/WardenCheckMgr.h
+++ b/src/server/game/Warden/WardenCheckMgr.h
diff --git a/src/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp
index 251e5525bf..251e5525bf 100644
--- a/src/game/Warden/WardenMac.cpp
+++ b/src/server/game/Warden/WardenMac.cpp
diff --git a/src/game/Warden/WardenMac.h b/src/server/game/Warden/WardenMac.h
index 1d74cfc1b0..1d74cfc1b0 100644
--- a/src/game/Warden/WardenMac.h
+++ b/src/server/game/Warden/WardenMac.h
diff --git a/src/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp
index 52f1206544..52f1206544 100644
--- a/src/game/Warden/WardenWin.cpp
+++ b/src/server/game/Warden/WardenWin.cpp
diff --git a/src/game/Warden/WardenWin.h b/src/server/game/Warden/WardenWin.h
index 834acc2fa3..834acc2fa3 100644
--- a/src/game/Warden/WardenWin.h
+++ b/src/server/game/Warden/WardenWin.h
diff --git a/src/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp
index 54c3cb471b..54c3cb471b 100644
--- a/src/game/Weather/Weather.cpp
+++ b/src/server/game/Weather/Weather.cpp
diff --git a/src/game/Weather/Weather.h b/src/server/game/Weather/Weather.h
index a455586e3e..a455586e3e 100644
--- a/src/game/Weather/Weather.h
+++ b/src/server/game/Weather/Weather.h
diff --git a/src/game/Weather/WeatherMgr.cpp b/src/server/game/Weather/WeatherMgr.cpp
index ad9f493dc7..ad9f493dc7 100644
--- a/src/game/Weather/WeatherMgr.cpp
+++ b/src/server/game/Weather/WeatherMgr.cpp
diff --git a/src/game/Weather/WeatherMgr.h b/src/server/game/Weather/WeatherMgr.h
index 450a17b4d4..450a17b4d4 100644
--- a/src/game/Weather/WeatherMgr.h
+++ b/src/server/game/Weather/WeatherMgr.h
diff --git a/src/game/World/World.cpp b/src/server/game/World/World.cpp
index 3ec460da9e..3ec460da9e 100644
--- a/src/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
diff --git a/src/game/World/World.h b/src/server/game/World/World.h
index 6408e0d2dd..6408e0d2dd 100644
--- a/src/game/World/World.h
+++ b/src/server/game/World/World.h
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
new file mode 100644
index 0000000000..a3373a007d
--- /dev/null
+++ b/src/server/scripts/CMakeLists.txt
@@ -0,0 +1,193 @@
+# Copyright (C)
+#
+# 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.
+
+# Enable precompiled headers when using the GCC compiler.
+
+CU_RUN_HOOK(BEFORE_SCRIPTS_LIBRARY)
+
+CU_SET_PATH("AC_SCRIPTS_DIR" "${CMAKE_CURRENT_LIST_DIR}")
+
+if (USE_SCRIPTPCH)
+ set(scripts_STAT_PCH_HDR PrecompiledHeaders/ScriptPCH.h)
+ set(scripts_STAT_PCH_SRC PrecompiledHeaders/ScriptPCH.cpp)
+endif ()
+
+message(STATUS "SCRIPT PREPARATIONS")
+include(Spells/CMakeLists.txt)
+
+include(Commands/CMakeLists.txt)
+
+set(scripts_STAT_SRCS
+ ${scripts_STAT_SRCS}
+ ScriptLoader.cpp
+ ScriptLoader.h
+ ${BUILDDIR}/GenLoader.cpp
+ ../game/AI/ScriptedAI/ScriptedEscortAI.cpp
+ ../game/AI/ScriptedAI/ScriptedCreature.cpp
+ ../game/AI/ScriptedAI/ScriptedFollowerAI.cpp
+)
+
+AC_ADD_SCRIPT_LOADER("Spell" "ScriptLoader.h")
+AC_ADD_SCRIPT_LOADER("SC_Smart" "ScriptLoader.h")
+AC_ADD_SCRIPT_LOADER("Command" "ScriptLoader.h")
+
+CU_SET_PATH("CMAKE_AC_MODULE_DIR" "${CMAKE_CURRENT_LIST_DIR}")
+
+if(SCRIPTS)
+ include(World/CMakeLists.txt)
+ include(OutdoorPvP/CMakeLists.txt)
+ include(EasternKingdoms/CMakeLists.txt)
+ include(Kalimdor/CMakeLists.txt)
+ include(Outland/CMakeLists.txt)
+ include(Northrend/CMakeLists.txt)
+ include(Events/CMakeLists.txt)
+ include(Pet/CMakeLists.txt)
+endif()
+
+if(EXISTS "${AC_SCRIPTS_DIR}/Custom/CMakeLists.txt")
+include(Custom/CMakeLists.txt)
+endif()
+
+CU_GET_GLOBAL("AC_ADD_SCRIPTS_LIST")
+CU_GET_GLOBAL("AC_ADD_SCRIPTS_INCLUDE")
+CU_GET_GLOBAL("AC_SCRIPTS_SOURCES")
+
+set(scripts_STAT_SRCS
+ ${scripts_STAT_SRCS}
+ ${AC_SCRIPTS_SOURCES}
+)
+
+set("AC_SCRIPTS_INCLUDES" "")
+
+FOREACH (include ${AC_ADD_SCRIPTS_INCLUDE})
+ set("AC_SCRIPTS_INCLUDES" "#include \"${include}\"\n${AC_SCRIPTS_INCLUDES}")
+ENDFOREACH()
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/GenLoader.cpp.cmake ${BUILDDIR}/GenLoader.cpp)
+
+message(STATUS "SCRIPT PREPARATION COMPLETE")
+message("")
+
+include_directories(
+ ${scripts_INCLUDE_DIRS}
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour/Include
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Recast/Include
+ ${CMAKE_SOURCE_DIR}/deps/g3dlite/include
+ ${CMAKE_SOURCE_DIR}/deps/SFMT
+ ${CMAKE_SOURCE_DIR}/deps/zlib
+ ${CMAKE_SOURCE_DIR}/src/common
+ ${CMAKE_SOURCE_DIR}/src/common/Configuration
+ ${CMAKE_SOURCE_DIR}/src/common/Cryptography
+ ${CMAKE_SOURCE_DIR}/src/common/Database
+ ${CMAKE_SOURCE_DIR}/src/common/DataStores
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic/LinkedReference
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic
+ ${CMAKE_SOURCE_DIR}/src/common/Logging
+ ${CMAKE_SOURCE_DIR}/src/common/Packets
+ ${CMAKE_SOURCE_DIR}/src/common/Threading
+ ${CMAKE_SOURCE_DIR}/src/common/Utilities
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/Management
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/Models
+ ${CMAKE_SOURCE_DIR}/src/common
+ ${CMAKE_SOURCE_DIR}/src/common/Database
+ ${CMAKE_SOURCE_DIR}/src/server/game/Addons
+ ${CMAKE_SOURCE_DIR}/src/server/game/Accounts
+ ${CMAKE_SOURCE_DIR}/src/server/game/Achievements
+ ${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/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/Calendar
+ ${CMAKE_SOURCE_DIR}/src/server/game/Chat
+ ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels
+ ${CMAKE_SOURCE_DIR}/src/server/game/Conditions
+ ${CMAKE_SOURCE_DIR}/src/common/Configuration
+ ${CMAKE_SOURCE_DIR}/src/server/game/Combat
+ ${CMAKE_SOURCE_DIR}/src/server/game/DataStores
+ ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding
+ ${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/Item
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Item/Container
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/GameObject
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Object/Updates
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Pet
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Player
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Totem
+ ${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/LookingForGroup
+ ${CMAKE_SOURCE_DIR}/src/server/game/Loot
+ ${CMAKE_SOURCE_DIR}/src/server/game/Mails
+ ${CMAKE_SOURCE_DIR}/src/server/game/Miscellaneous
+ ${CMAKE_SOURCE_DIR}/src/server/game/Maps
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Spline
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints
+ ${CMAKE_SOURCE_DIR}/src/server/game/Opcodes
+ ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP
+ ${CMAKE_SOURCE_DIR}/src/server/game/Petitions
+ ${CMAKE_SOURCE_DIR}/src/server/game/Pools
+ ${CMAKE_SOURCE_DIR}/src/server/game/PrecompiledHeaders
+ ${CMAKE_SOURCE_DIR}/src/server/game/Quests
+ ${CMAKE_SOURCE_DIR}/src/server/game/Reputation
+ ${CMAKE_SOURCE_DIR}/src/server/game/Scripting
+ ${CMAKE_SOURCE_DIR}/src/server/game/Server
+ ${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/Texts
+ ${CMAKE_SOURCE_DIR}/src/server/game/Tickets
+ ${CMAKE_SOURCE_DIR}/src/server/game/Tools
+ ${CMAKE_SOURCE_DIR}/src/server/game/Warden
+ ${CMAKE_SOURCE_DIR}/src/server/game/Warden/Modules
+ ${CMAKE_SOURCE_DIR}/src/server/game/Weather
+ ${CMAKE_SOURCE_DIR}/src/server/game/World
+ ${CMAKE_SOURCE_DIR}/src/server/game/ArenaSpectator
+ ${CMAKE_SOURCE_DIR}/src/server/game/Misc
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders
+ ${ACE_INCLUDE_DIR}
+ ${MYSQL_INCLUDE_DIR}
+)
+
+add_library(scripts STATIC
+ ${scripts_STAT_SRCS}
+ ${scripts_STAT_PCH_SRC}
+)
+
+add_dependencies(scripts revision.h)
+
+# Generate precompiled header
+if (USE_SCRIPTPCH)
+ add_cxx_pch(scripts ${scripts_STAT_PCH_HDR} ${scripts_STAT_PCH_SRC})
+endif()
diff --git a/src/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index f1e5aa4932..f1e5aa4932 100644
--- a/src/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
diff --git a/src/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index 4b6ba7d79f..4b6ba7d79f 100644
--- a/src/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
diff --git a/src/scripts/Commands/cs_achievement.cpp b/src/server/scripts/Commands/cs_achievement.cpp
index 1af4da6c2a..1af4da6c2a 100644
--- a/src/scripts/Commands/cs_achievement.cpp
+++ b/src/server/scripts/Commands/cs_achievement.cpp
diff --git a/src/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp
index b0cc058a7f..b0cc058a7f 100644
--- a/src/scripts/Commands/cs_ban.cpp
+++ b/src/server/scripts/Commands/cs_ban.cpp
diff --git a/src/scripts/Commands/cs_bf.cpp b/src/server/scripts/Commands/cs_bf.cpp
index 6544edff3e..6544edff3e 100644
--- a/src/scripts/Commands/cs_bf.cpp
+++ b/src/server/scripts/Commands/cs_bf.cpp
diff --git a/src/scripts/Commands/cs_cast.cpp b/src/server/scripts/Commands/cs_cast.cpp
index 3e4a599b0a..3e4a599b0a 100644
--- a/src/scripts/Commands/cs_cast.cpp
+++ b/src/server/scripts/Commands/cs_cast.cpp
diff --git a/src/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp
index d874108406..d874108406 100644
--- a/src/scripts/Commands/cs_character.cpp
+++ b/src/server/scripts/Commands/cs_character.cpp
diff --git a/src/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 5b627d9693..5b627d9693 100644
--- a/src/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
diff --git a/src/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp
index 95f4238f2c..95f4238f2c 100644
--- a/src/scripts/Commands/cs_disable.cpp
+++ b/src/server/scripts/Commands/cs_disable.cpp
diff --git a/src/scripts/Commands/cs_event.cpp b/src/server/scripts/Commands/cs_event.cpp
index 596750f5a8..596750f5a8 100644
--- a/src/scripts/Commands/cs_event.cpp
+++ b/src/server/scripts/Commands/cs_event.cpp
diff --git a/src/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp
index 0967aa170d..0967aa170d 100644
--- a/src/scripts/Commands/cs_gm.cpp
+++ b/src/server/scripts/Commands/cs_gm.cpp
diff --git a/src/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index 4a6235ddee..4a6235ddee 100644
--- a/src/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
diff --git a/src/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index 9d1c34c5a1..9d1c34c5a1 100644
--- a/src/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
diff --git a/src/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp
index 6389430608..6389430608 100644
--- a/src/scripts/Commands/cs_guild.cpp
+++ b/src/server/scripts/Commands/cs_guild.cpp
diff --git a/src/scripts/Commands/cs_honor.cpp b/src/server/scripts/Commands/cs_honor.cpp
index 7ec5c8c957..7ec5c8c957 100644
--- a/src/scripts/Commands/cs_honor.cpp
+++ b/src/server/scripts/Commands/cs_honor.cpp
diff --git a/src/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp
index 2a6f28d135..2a6f28d135 100644
--- a/src/scripts/Commands/cs_instance.cpp
+++ b/src/server/scripts/Commands/cs_instance.cpp
diff --git a/src/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp
index 95641beaa2..95641beaa2 100644
--- a/src/scripts/Commands/cs_learn.cpp
+++ b/src/server/scripts/Commands/cs_learn.cpp
diff --git a/src/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp
index b491c45b3a..b491c45b3a 100644
--- a/src/scripts/Commands/cs_lfg.cpp
+++ b/src/server/scripts/Commands/cs_lfg.cpp
diff --git a/src/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp
index 4e5b3f5625..4e5b3f5625 100644
--- a/src/scripts/Commands/cs_list.cpp
+++ b/src/server/scripts/Commands/cs_list.cpp
diff --git a/src/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp
index 60f5ce165c..60f5ce165c 100644
--- a/src/scripts/Commands/cs_lookup.cpp
+++ b/src/server/scripts/Commands/cs_lookup.cpp
diff --git a/src/scripts/Commands/cs_message.cpp b/src/server/scripts/Commands/cs_message.cpp
index 15cd13a876..15cd13a876 100644
--- a/src/scripts/Commands/cs_message.cpp
+++ b/src/server/scripts/Commands/cs_message.cpp
diff --git a/src/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 268248f5bb..268248f5bb 100644
--- a/src/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
diff --git a/src/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index f1cdea9832..f1cdea9832 100644
--- a/src/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
diff --git a/src/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 928569fbc7..928569fbc7 100644
--- a/src/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
diff --git a/src/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp
index fff4ccf45b..fff4ccf45b 100644
--- a/src/scripts/Commands/cs_quest.cpp
+++ b/src/server/scripts/Commands/cs_quest.cpp
diff --git a/src/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 2bb77bd07c..2bb77bd07c 100644
--- a/src/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
diff --git a/src/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp
index efeb967442..efeb967442 100644
--- a/src/scripts/Commands/cs_reset.cpp
+++ b/src/server/scripts/Commands/cs_reset.cpp
diff --git a/src/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp
index a0055f594a..a0055f594a 100644
--- a/src/scripts/Commands/cs_server.cpp
+++ b/src/server/scripts/Commands/cs_server.cpp
diff --git a/src/scripts/Commands/cs_spectator.cpp b/src/server/scripts/Commands/cs_spectator.cpp
index 06ac648944..06ac648944 100644
--- a/src/scripts/Commands/cs_spectator.cpp
+++ b/src/server/scripts/Commands/cs_spectator.cpp
diff --git a/src/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp
index 95a1ed5f5e..95a1ed5f5e 100644
--- a/src/scripts/Commands/cs_tele.cpp
+++ b/src/server/scripts/Commands/cs_tele.cpp
diff --git a/src/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp
index d3b757a68d..d3b757a68d 100644
--- a/src/scripts/Commands/cs_ticket.cpp
+++ b/src/server/scripts/Commands/cs_ticket.cpp
diff --git a/src/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp
index a6b83ddfe8..a6b83ddfe8 100644
--- a/src/scripts/Commands/cs_titles.cpp
+++ b/src/server/scripts/Commands/cs_titles.cpp
diff --git a/src/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index 870fb95e52..870fb95e52 100644
--- a/src/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
diff --git a/src/scripts/Custom/README.md b/src/server/scripts/Custom/README.md
index 05944b8706..05944b8706 100644
--- a/src/scripts/Custom/README.md
+++ b/src/server/scripts/Custom/README.md
diff --git a/src/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
index 3da3d09577..3da3d09577 100644
--- a/src/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
diff --git a/src/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index 69aff5830e..69aff5830e 100644
--- a/src/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
diff --git a/src/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
index a2235fedc6..a2235fedc6 100644
--- a/src/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
diff --git a/src/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
index 41f2e6c6ab..41f2e6c6ab 100644
--- a/src/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
diff --git a/src/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
index 35fa03608d..35fa03608d 100644
--- a/src/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_vanndar.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
index 467fb10f40..467fb10f40 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
index 4e2f2e5ac9..4e2f2e5ac9 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp
index 4b2feebae5..4b2feebae5 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp
index ef4a430fb4..ef4a430fb4 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
index 0aaea2484e..0aaea2484e 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp
index 4d0ae24715..4d0ae24715 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp
index 4820dccdfc..4820dccdfc 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp
index 2f3b15b0b5..2f3b15b0b5 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
index c4ef036036..c4ef036036 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp
index 018eb1d2e8..018eb1d2e8 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp
index 88cc083d65..88cc083d65 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
index a901fd41e5..a901fd41e5 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
index 53757fdcc3..53757fdcc3 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
index 4073401b96..4073401b96 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp
index 36c1cb3eee..36c1cb3eee 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp
index 0bb28b78c2..0bb28b78c2 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp
index b94a3fc487..b94a3fc487 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp
index 10bfa8bdf1..10bfa8bdf1 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp
index 51d4b00bcd..51d4b00bcd 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp
index 2b5371ddf2..2b5371ddf2 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp
index 76f434d120..76f434d120 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp
index d4cad44590..d4cad44590 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp
index 0bfc0e35ba..0bfc0e35ba 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp
index f0b55062eb..f0b55062eb 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
index da072be449..da072be449 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
index 5cb0d993f6..5cb0d993f6 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp
index 2343c8aaab..2343c8aaab 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp
index c57e83d741..c57e83d741 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp
index 795f5b00f2..795f5b00f2 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
index 98bd6fbec6..98bd6fbec6 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
index 7d29ec85fb..7d29ec85fb 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp
index 0948764f6f..0948764f6f 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
index 6eebc16c2c..6eebc16c2c 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp
index a3fe26b4b1..a3fe26b4b1 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp
index a7576e21af..a7576e21af 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp
index c632b37c32..c632b37c32 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
index d87fe137be..d87fe137be 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
index 9182797b61..9182797b61 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
index 0962608908..0962608908 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
index a215557d52..a215557d52 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
index 5dd5f76259..5dd5f76259 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
index 402bbbed8d..402bbbed8d 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
index c73c8c74b2..c73c8c74b2 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
index 5b44d39437..5b44d39437 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
index 3b459be7db..3b459be7db 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
index 0908b5b107..0908b5b107 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
index ebf5aa3a2d..ebf5aa3a2d 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp
index dceeab6c86..dceeab6c86 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
index 245386c8bb..245386c8bb 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
index 2383092777..2383092777 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
index 8b0fba3cc9..8b0fba3cc9 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
index ae4531435d..ae4531435d 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h
diff --git a/src/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt
index 42220f43f4..42220f43f4 100644
--- a/src/scripts/EasternKingdoms/CMakeLists.txt
+++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt
diff --git a/src/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
index e0eb4874e6..e0eb4874e6 100644
--- a/src/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp
diff --git a/src/scripts/EasternKingdoms/Deadmines/deadmines.h b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h
index 77f075cf1d..77f075cf1d 100644
--- a/src/scripts/EasternKingdoms/Deadmines/deadmines.h
+++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h
diff --git a/src/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
index d5771f9c22..d5771f9c22 100644
--- a/src/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
diff --git a/src/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
index 93e1ee73be..93e1ee73be 100644
--- a/src/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
+++ b/src/server/scripts/EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_curator.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp
index ac8220bc3b..ac8220bc3b 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_curator.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_curator.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
index fda5f665c9..fda5f665c9 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
index 690e514eb3..690e514eb3 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
index c294d00893..c294d00893 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp
index 86b19b2a58..86b19b2a58 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
index da543ce312..da543ce312 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp
index 9a2e90b6d8..9a2e90b6d8 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp
index 8084d481e0..8084d481e0 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
index c6badbf302..c6badbf302 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp
index b163cd1e74..b163cd1e74 100644
--- a/src/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
index 721ad64ff9..721ad64ff9 100644
--- a/src/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
index f6a76e367a..f6a76e367a 100644
--- a/src/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 8af6ac53fa..8af6ac53fa 100644
--- a/src/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
diff --git a/src/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h
index 4240244640..4240244640 100644
--- a/src/scripts/EasternKingdoms/Karazhan/karazhan.h
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h
diff --git a/src/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
index 0232394821..0232394821 100644
--- a/src/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp
diff --git a/src/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp
index fe6aa57bb7..fe6aa57bb7 100644
--- a/src/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp
diff --git a/src/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
index 45595f8ee4..45595f8ee4 100644
--- a/src/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp
diff --git a/src/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
index 072042c6f1..072042c6f1 100644
--- a/src/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
diff --git a/src/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
index afd2add9f5..afd2add9f5 100644
--- a/src/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp
diff --git a/src/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h
index 59138de53c..59138de53c 100644
--- a/src/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h
diff --git a/src/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index a2a74d0e16..a2a74d0e16 100644
--- a/src/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
diff --git a/src/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index 950fca072c..950fca072c 100644
--- a/src/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
diff --git a/src/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index bd63c62b21..bd63c62b21 100644
--- a/src/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
diff --git a/src/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
index 889f7883ed..889f7883ed 100644
--- a/src/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
diff --git a/src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
index 0793279daa..0793279daa 100644
--- a/src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp
diff --git a/src/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
index 689659052b..689659052b 100644
--- a/src/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
diff --git a/src/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
index 6771f6c42c..6771f6c42c 100644
--- a/src/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
diff --git a/src/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
index 46dd5d175b..46dd5d175b 100644
--- a/src/scripts/EasternKingdoms/Scholomance/scholomance.h
+++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
diff --git a/src/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
index 3edf7aee10..3edf7aee10 100644
--- a/src/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
diff --git a/src/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
index 7856020078..7856020078 100644
--- a/src/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
+++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
diff --git a/src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp
index 8e14117944..8e14117944 100644
--- a/src/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/instance_stratholme.cpp
diff --git a/src/scripts/EasternKingdoms/Stratholme/stratholme.h b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h
index 0ee7b2a1bd..0ee7b2a1bd 100644
--- a/src/scripts/EasternKingdoms/Stratholme/stratholme.h
+++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.h
diff --git a/src/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp
index 4ab94eefde..4ab94eefde 100644
--- a/src/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp
+++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp
diff --git a/src/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h
index a8497e3366..a8497e3366 100644
--- a/src/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h
+++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.h
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
index 0ae8006142..0ae8006142 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
index a69ab27306..a69ab27306 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
index d82cbbbb26..d82cbbbb26 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 5d5194d4ae..5d5194d4ae 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index 58464a96f4..58464a96f4 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index 2b449feea3..2b449feea3 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
index 2d1eb7352c..2d1eb7352c 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
diff --git a/src/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
index d56b48de1a..d56b48de1a 100644
--- a/src/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/sunwell_plateau.h
diff --git a/src/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp b/src/server/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp
index bf0eded85c..bf0eded85c 100644
--- a/src/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp
+++ b/src/server/scripts/EasternKingdoms/TheStockade/instance_the_stockade.cpp
diff --git a/src/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
index 50660a8b8f..50660a8b8f 100644
--- a/src/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
diff --git a/src/scripts/EasternKingdoms/Uldaman/uldaman.h b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
index 62216c3b66..62216c3b66 100644
--- a/src/scripts/EasternKingdoms/Uldaman/uldaman.h
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
diff --git a/src/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index d629c582d8..d629c582d8 100644
--- a/src/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
index df3428d7b8..df3428d7b8 100644
--- a/src/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index be458ee88a..be458ee88a 100644
--- a/src/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
index b44d358f3b..b44d358f3b 100644
--- a/src/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
index b5fb0f732a..b5fb0f732a 100644
--- a/src/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
index 11cada5b5e..11cada5b5e 100644
--- a/src/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
index 0e8740e622..0e8740e622 100644
--- a/src/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index f3c8a98075..f3c8a98075 100644
--- a/src/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
diff --git a/src/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
index 68c35c72c6..68c35c72c6 100644
--- a/src/scripts/EasternKingdoms/ZulAman/zulaman.h
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 6f22e93443..6f22e93443 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
index 4de805483b..4de805483b 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
index 3d5aea29fb..3d5aea29fb 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
index 2bcc2754a2..2bcc2754a2 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
index 93eefb191a..93eefb191a 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
index c8acc56683..c8acc56683 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
index 62b0e501ef..62b0e501ef 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index 6ff8bcaa75..6ff8bcaa75 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
index 7f4bfc6d6a..7f4bfc6d6a 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
index 8f33ae17a9..8f33ae17a9 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
index 717fec9210..717fec9210 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
index 4aa983ca76..4aa983ca76 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
index c2681db085..c2681db085 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index ede549be0a..ede549be0a 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
diff --git a/src/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index bd0989661a..bd0989661a 100644
--- a/src/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
diff --git a/src/scripts/EasternKingdoms/zone_alterac_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_alterac_mountains.cpp
index 95ca4ead5c..95ca4ead5c 100644
--- a/src/scripts/EasternKingdoms/zone_alterac_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_alterac_mountains.cpp
diff --git a/src/scripts/EasternKingdoms/zone_arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
index 832ab472b1..832ab472b1 100644
--- a/src/scripts/EasternKingdoms/zone_arathi_highlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
diff --git a/src/scripts/EasternKingdoms/zone_blasted_lands.cpp b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp
index 329c9421e4..329c9421e4 100644
--- a/src/scripts/EasternKingdoms/zone_blasted_lands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp
diff --git a/src/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
index be2fd2dcaa..be2fd2dcaa 100644
--- a/src/scripts/EasternKingdoms/zone_burning_steppes.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
diff --git a/src/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
index d55ef28887..d55ef28887 100644
--- a/src/scripts/EasternKingdoms/zone_duskwood.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
diff --git a/src/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp
index 13b95c97d6..13b95c97d6 100644
--- a/src/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp
diff --git a/src/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
index 437e90b793..437e90b793 100644
--- a/src/scripts/EasternKingdoms/zone_eversong_woods.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
diff --git a/src/scripts/EasternKingdoms/zone_ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
index e82f7ab110..e82f7ab110 100644
--- a/src/scripts/EasternKingdoms/zone_ghostlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
diff --git a/src/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index a09f7df1b5..a09f7df1b5 100644
--- a/src/scripts/EasternKingdoms/zone_hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
diff --git a/src/scripts/EasternKingdoms/zone_ironforge.cpp b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp
index 1e74603eda..1e74603eda 100644
--- a/src/scripts/EasternKingdoms/zone_ironforge.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp
diff --git a/src/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
index 4c4b17e316..4c4b17e316 100644
--- a/src/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
diff --git a/src/scripts/EasternKingdoms/zone_loch_modan.cpp b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp
index 7c41add62f..7c41add62f 100644
--- a/src/scripts/EasternKingdoms/zone_loch_modan.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp
diff --git a/src/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index b4bf684736..b4bf684736 100644
--- a/src/scripts/EasternKingdoms/zone_redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
diff --git a/src/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index 40fc81bdb4..40fc81bdb4 100644
--- a/src/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
diff --git a/src/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index 7ce43574db..7ce43574db 100644
--- a/src/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
diff --git a/src/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
index 30bc490a7d..30bc490a7d 100644
--- a/src/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
diff --git a/src/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
index 8f1071cf4c..8f1071cf4c 100644
--- a/src/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
diff --git a/src/scripts/EasternKingdoms/zone_tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index 6699160312..6699160312 100644
--- a/src/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
diff --git a/src/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
index d8916585ca..d8916585ca 100644
--- a/src/scripts/EasternKingdoms/zone_undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
diff --git a/src/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index bc6efa8338..bc6efa8338 100644
--- a/src/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
diff --git a/src/scripts/EasternKingdoms/zone_westfall.cpp b/src/server/scripts/EasternKingdoms/zone_westfall.cpp
index e243aacee3..e243aacee3 100644
--- a/src/scripts/EasternKingdoms/zone_westfall.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_westfall.cpp
diff --git a/src/scripts/EasternKingdoms/zone_wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
index 56de698287..56de698287 100644
--- a/src/scripts/EasternKingdoms/zone_wetlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
diff --git a/src/scripts/Events/CMakeLists.txt b/src/server/scripts/Events/CMakeLists.txt
index 38d39ef0a7..38d39ef0a7 100644
--- a/src/scripts/Events/CMakeLists.txt
+++ b/src/server/scripts/Events/CMakeLists.txt
diff --git a/src/scripts/Events/brewfest.cpp b/src/server/scripts/Events/brewfest.cpp
index 18c109ea9a..18c109ea9a 100644
--- a/src/scripts/Events/brewfest.cpp
+++ b/src/server/scripts/Events/brewfest.cpp
diff --git a/src/scripts/Events/childrens_week.cpp b/src/server/scripts/Events/childrens_week.cpp
index e6c579cbda..e6c579cbda 100644
--- a/src/scripts/Events/childrens_week.cpp
+++ b/src/server/scripts/Events/childrens_week.cpp
diff --git a/src/scripts/Events/hallows_end.cpp b/src/server/scripts/Events/hallows_end.cpp
index 84ad89bd53..84ad89bd53 100644
--- a/src/scripts/Events/hallows_end.cpp
+++ b/src/server/scripts/Events/hallows_end.cpp
diff --git a/src/scripts/Events/love_in_air.cpp b/src/server/scripts/Events/love_in_air.cpp
index b0a12e6f47..b0a12e6f47 100644
--- a/src/scripts/Events/love_in_air.cpp
+++ b/src/server/scripts/Events/love_in_air.cpp
diff --git a/src/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp
index 6f7fcec5d2..6f7fcec5d2 100644
--- a/src/scripts/Events/midsummer.cpp
+++ b/src/server/scripts/Events/midsummer.cpp
diff --git a/src/scripts/Events/pilgrims_bounty.cpp b/src/server/scripts/Events/pilgrims_bounty.cpp
index 1936a1c318..1936a1c318 100644
--- a/src/scripts/Events/pilgrims_bounty.cpp
+++ b/src/server/scripts/Events/pilgrims_bounty.cpp
diff --git a/src/scripts/Events/winter_veil.cpp b/src/server/scripts/Events/winter_veil.cpp
index 84f53a63fc..84f53a63fc 100644
--- a/src/scripts/Events/winter_veil.cpp
+++ b/src/server/scripts/Events/winter_veil.cpp
diff --git a/src/scripts/GenLoader.cpp.cmake b/src/server/scripts/GenLoader.cpp.cmake
index 4049313d04..4049313d04 100644
--- a/src/scripts/GenLoader.cpp.cmake
+++ b/src/server/scripts/GenLoader.cpp.cmake
diff --git a/src/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
index 2d359d5842..2d359d5842 100644
--- a/src/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
diff --git a/src/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
index 86b12ed427..86b12ed427 100644
--- a/src/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
+++ b/src/server/scripts/Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp
diff --git a/src/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index 7a37f14361..7a37f14361 100644
--- a/src/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
index c90c412686..c90c412686 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
index 92baf7ac4b..92baf7ac4b 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
index d21afdf461..d21afdf461 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
index c151303968..c151303968 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
index 9d1a0eca34..9d1a0eca34 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
index 82dded2a0b..82dded2a0b 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
index 5e09cd6c1e..5e09cd6c1e 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
index 26732f3a71..26732f3a71 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
index 9d1ccad32d..9d1ccad32d 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 78df6c9150..78df6c9150 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h
index 73594df6a7..73594df6a7 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h
diff --git a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
index 5a675efaf8..5a675efaf8 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp
index eb52a0b1e4..eb52a0b1e4 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp
index acd5271dbb..acd5271dbb 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
index c1e57bfbc2..c1e57bfbc2 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
index c5811914f9..c5811914f9 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp
index 3f2186893b..3f2186893b 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index f147653083..f147653083 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
index 5a047c4ead..5a047c4ead 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
diff --git a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
index 1b38bf1eec..1b38bf1eec 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
index cadb59d8e7..cadb59d8e7 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
index 1d06971981..1d06971981 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp
index 801557387c..801557387c 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_lieutenant_drake.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp
index 568fee34e5..568fee34e5 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
index 3f0acebf4d..3f0acebf4d 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
index aedafa001e..aedafa001e 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
diff --git a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp
index cdd7f8e307..cdd7f8e307 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp
index 366f854a2d..366f854a2d 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp
index dc6bc7a20c..dc6bc7a20c 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
index 5ac0d97fb1..5ac0d97fb1 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
index cd98b9d8c1..cd98b9d8c1 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp
diff --git a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
index 1e8ee41869..1e8ee41869 100644
--- a/src/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h
diff --git a/src/scripts/Kalimdor/DireMaul/dire_maul.h b/src/server/scripts/Kalimdor/DireMaul/dire_maul.h
index 24eebbebd2..24eebbebd2 100644
--- a/src/scripts/Kalimdor/DireMaul/dire_maul.h
+++ b/src/server/scripts/Kalimdor/DireMaul/dire_maul.h
diff --git a/src/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp
index 67527309ea..67527309ea 100644
--- a/src/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp
+++ b/src/server/scripts/Kalimdor/DireMaul/instance_dire_maul.cpp
diff --git a/src/scripts/Kalimdor/Maraudon/instance_maraudon.cpp b/src/server/scripts/Kalimdor/Maraudon/instance_maraudon.cpp
index eb911b5be8..eb911b5be8 100644
--- a/src/scripts/Kalimdor/Maraudon/instance_maraudon.cpp
+++ b/src/server/scripts/Kalimdor/Maraudon/instance_maraudon.cpp
diff --git a/src/scripts/Kalimdor/Maraudon/maraudon.h b/src/server/scripts/Kalimdor/Maraudon/maraudon.h
index 7dd686e9c1..7dd686e9c1 100644
--- a/src/scripts/Kalimdor/Maraudon/maraudon.h
+++ b/src/server/scripts/Kalimdor/Maraudon/maraudon.h
diff --git a/src/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
index 908bec18ea..908bec18ea 100644
--- a/src/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
diff --git a/src/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
index ae6cbf79f9..ae6cbf79f9 100644
--- a/src/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
diff --git a/src/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h
index 37102f512a..37102f512a 100644
--- a/src/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/onyxias_lair.h
diff --git a/src/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp b/src/server/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp
index 2b04ac0e7c..2b04ac0e7c 100644
--- a/src/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp
+++ b/src/server/scripts/Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp
diff --git a/src/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
index 8d8b0e382e..8d8b0e382e 100644
--- a/src/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
diff --git a/src/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
index 866e3c3045..866e3c3045 100644
--- a/src/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
diff --git a/src/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
index c2182b022d..c2182b022d 100644
--- a/src/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
diff --git a/src/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
index c7ffa947e8..c7ffa947e8 100644
--- a/src/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
index 3278c123f4..3278c123f4 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
index 29bc61250f..29bc61250f 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
index 828f74e78b..828f74e78b 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
index 116e4f277f..116e4f277f 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
index d458f8ad52..d458f8ad52 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
index 75cc49f1e4..75cc49f1e4 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
index 444f92aa8a..444f92aa8a 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
diff --git a/src/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
index 564d65087b..564d65087b 100644
--- a/src/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
index ad6c5bbbb7..ad6c5bbbb7 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
index c1bb94ac05..c1bb94ac05 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
index caa1ded859..caa1ded859 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
index 3ae6669536..3ae6669536 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
index a1663deb2c..a1663deb2c 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
index f6188bc415..f6188bc415 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
index ae97faae47..ae97faae47 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
index 5c413d31f2..5c413d31f2 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
index f96acaaabf..f96acaaabf 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp
index f33f7e7562..f33f7e7562 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp
index 3f99e53e91..3f99e53e91 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp
diff --git a/src/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
index 12e6bad3d7..12e6bad3d7 100644
--- a/src/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h
diff --git a/src/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp
index ff878d5338..ff878d5338 100644
--- a/src/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp
+++ b/src/server/scripts/Kalimdor/WailingCaverns/instance_wailing_caverns.cpp
diff --git a/src/scripts/Kalimdor/WailingCaverns/wailing_caverns.h b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h
index 3bb3a80bba..3bb3a80bba 100644
--- a/src/scripts/Kalimdor/WailingCaverns/wailing_caverns.h
+++ b/src/server/scripts/Kalimdor/WailingCaverns/wailing_caverns.h
diff --git a/src/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
index 88fe309af3..88fe309af3 100644
--- a/src/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
+++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp
diff --git a/src/scripts/Kalimdor/ZulFarrak/zulfarrak.h b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
index d31f7a30db..d31f7a30db 100644
--- a/src/scripts/Kalimdor/ZulFarrak/zulfarrak.h
+++ b/src/server/scripts/Kalimdor/ZulFarrak/zulfarrak.h
diff --git a/src/scripts/Kalimdor/boss_azuregos.cpp b/src/server/scripts/Kalimdor/boss_azuregos.cpp
index 5fd6ed1954..5fd6ed1954 100644
--- a/src/scripts/Kalimdor/boss_azuregos.cpp
+++ b/src/server/scripts/Kalimdor/boss_azuregos.cpp
diff --git a/src/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
index 8335ddde64..8335ddde64 100644
--- a/src/scripts/Kalimdor/zone_ashenvale.cpp
+++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
diff --git a/src/scripts/Kalimdor/zone_azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp
index 8cadb8fc64..8cadb8fc64 100644
--- a/src/scripts/Kalimdor/zone_azshara.cpp
+++ b/src/server/scripts/Kalimdor/zone_azshara.cpp
diff --git a/src/scripts/Kalimdor/zone_azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 3d15765cb4..3d15765cb4 100644
--- a/src/scripts/Kalimdor/zone_azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
diff --git a/src/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
index c327b86fc0..c327b86fc0 100644
--- a/src/scripts/Kalimdor/zone_bloodmyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
diff --git a/src/scripts/Kalimdor/zone_darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp
index bc7d6d8ec7..bc7d6d8ec7 100644
--- a/src/scripts/Kalimdor/zone_darkshore.cpp
+++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp
diff --git a/src/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index edf7070a85..edf7070a85 100644
--- a/src/scripts/Kalimdor/zone_desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
diff --git a/src/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index a98d27f665..a98d27f665 100644
--- a/src/scripts/Kalimdor/zone_durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
diff --git a/src/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
index e69ca6f681..e69ca6f681 100644
--- a/src/scripts/Kalimdor/zone_dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
diff --git a/src/scripts/Kalimdor/zone_felwood.cpp b/src/server/scripts/Kalimdor/zone_felwood.cpp
index a6092baebb..a6092baebb 100644
--- a/src/scripts/Kalimdor/zone_felwood.cpp
+++ b/src/server/scripts/Kalimdor/zone_felwood.cpp
diff --git a/src/scripts/Kalimdor/zone_feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp
index 0db8541646..0db8541646 100644
--- a/src/scripts/Kalimdor/zone_feralas.cpp
+++ b/src/server/scripts/Kalimdor/zone_feralas.cpp
diff --git a/src/scripts/Kalimdor/zone_moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp
index b432be1aed..b432be1aed 100644
--- a/src/scripts/Kalimdor/zone_moonglade.cpp
+++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp
diff --git a/src/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp
index e56b276e34..e56b276e34 100644
--- a/src/scripts/Kalimdor/zone_mulgore.cpp
+++ b/src/server/scripts/Kalimdor/zone_mulgore.cpp
diff --git a/src/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index be7543eaff..be7543eaff 100644
--- a/src/scripts/Kalimdor/zone_orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
diff --git a/src/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index abb9dc6fce..abb9dc6fce 100644
--- a/src/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
diff --git a/src/scripts/Kalimdor/zone_stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
index 376cf43e0e..376cf43e0e 100644
--- a/src/scripts/Kalimdor/zone_stonetalon_mountains.cpp
+++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
diff --git a/src/scripts/Kalimdor/zone_tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 156be76719..156be76719 100644
--- a/src/scripts/Kalimdor/zone_tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
diff --git a/src/scripts/Kalimdor/zone_teldrassil.cpp b/src/server/scripts/Kalimdor/zone_teldrassil.cpp
index df1c91d6cb..df1c91d6cb 100644
--- a/src/scripts/Kalimdor/zone_teldrassil.cpp
+++ b/src/server/scripts/Kalimdor/zone_teldrassil.cpp
diff --git a/src/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index f75bd2576e..f75bd2576e 100644
--- a/src/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
diff --git a/src/scripts/Kalimdor/zone_thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
index 5c0e9e5387..5c0e9e5387 100644
--- a/src/scripts/Kalimdor/zone_thousand_needles.cpp
+++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
diff --git a/src/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index b9db57aa77..b9db57aa77 100644
--- a/src/scripts/Kalimdor/zone_thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
diff --git a/src/scripts/Kalimdor/zone_ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
index 0b0c38701c..0b0c38701c 100644
--- a/src/scripts/Kalimdor/zone_ungoro_crater.cpp
+++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
diff --git a/src/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp
index cf097b4861..cf097b4861 100644
--- a/src/scripts/Kalimdor/zone_winterspring.cpp
+++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
index 2d87bc49e2..2d87bc49e2 100644
--- a/src/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
diff --git a/src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
index b6b87be23a..b6b87be23a 100644
--- a/src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
index 92a83451ca..92a83451ca 100644
--- a/src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
index ded193d8f9..ded193d8f9 100644
--- a/src/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
index 3dbc0a82d9..3dbc0a82d9 100644
--- a/src/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h
index d90c32b273..d90c32b273 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp
index f18069e227..f18069e227 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp
index de6313817b..de6313817b 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp
index 6d238af7f3..6d238af7f3 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_herald_volazj.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp
index b451c6c0d7..b451c6c0d7 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_jedoga_shadowseeker.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
index 250f1702d4..250f1702d4 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/def_ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/def_ahnkahet.h
index 492420bfd0..492420bfd0 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/def_ahnkahet.h
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/def_ahnkahet.h
diff --git a/src/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp
index cd055ce0dc..cd055ce0dc 100644
--- a/src/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp
diff --git a/src/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index 41218b3f31..41218b3f31 100644
--- a/src/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
diff --git a/src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
index 07269e503e..07269e503e 100644
--- a/src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
diff --git a/src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
index eed9462eec..eed9462eec 100644
--- a/src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp
diff --git a/src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h
index 1962bf094d..1962bf094d 100644
--- a/src/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h
diff --git a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
index 7e90681e61..7e90681e61 100644
--- a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
diff --git a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
index c8f9b4322a..c8f9b4322a 100644
--- a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp
diff --git a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index a9204522c4..a9204522c4 100644
--- a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
diff --git a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
index 3c93711b1a..3c93711b1a 100644
--- a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp
diff --git a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
index ccb61b35c4..ccb61b35c4 100644
--- a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp
diff --git a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
index 0c57f3ff05..0c57f3ff05 100644
--- a/src/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
index 1c935dc0ab..1c935dc0ab 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
index e8033a58f2..e8033a58f2 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
index 2bd1f0f12e..2bd1f0f12e 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
index fdcd5d44e1..fdcd5d44e1 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
index 8a0c1d407e..8a0c1d407e 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
index 5db3b9571a..5db3b9571a 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
index 9b608b50dc..9b608b50dc 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
index 733ab51a15..733ab51a15 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
index 0790b0412e..0790b0412e 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index a165baf6c6..a165baf6c6 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 02f15f8726..02f15f8726 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
index b333891736..b333891736 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index d323e9bf7f..d323e9bf7f 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
diff --git a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
index e1da98fd2c..e1da98fd2c 100644
--- a/src/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
diff --git a/src/scripts/Northrend/DraktharonKeep/boss_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp
index ee5cd92e57..ee5cd92e57 100644
--- a/src/scripts/Northrend/DraktharonKeep/boss_dred.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp
diff --git a/src/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
index 73b3493638..73b3493638 100644
--- a/src/scripts/Northrend/DraktharonKeep/boss_novos.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
diff --git a/src/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
index 5404cbf131..5404cbf131 100644
--- a/src/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
diff --git a/src/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
index acf0964d5d..acf0964d5d 100644
--- a/src/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp
diff --git a/src/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
index c48ca051bc..c48ca051bc 100644
--- a/src/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
+++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
diff --git a/src/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
index 0d971c5d7c..0d971c5d7c 100644
--- a/src/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index 8852bff0e4..8852bff0e4 100644
--- a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
index a0e1b39707..a0e1b39707 100644
--- a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
index 3933c7d136..3933c7d136 100644
--- a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
index da7889aa63..da7889aa63 100644
--- a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
diff --git a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
index 7bc88051d9..7bc88051d9 100644
--- a/src/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
index 3bbd47dcb9..3bbd47dcb9 100644
--- a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
index bfc4f797bd..bfc4f797bd 100644
--- a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 91d95c64ec..91d95c64ec 100644
--- a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
index 6504f7e2b1..6504f7e2b1 100644
--- a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
diff --git a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index 5f48069dd1..5f48069dd1 100644
--- a/src/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
index 55b6f71780..55b6f71780 100644
--- a/src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
index 84121bfbe2..84121bfbe2 100644
--- a/src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
index f65d109ac2..f65d109ac2 100644
--- a/src/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
index d356efb217..d356efb217 100644
--- a/src/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
index a9b806a641..a9b806a641 100644
--- a/src/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp
diff --git a/src/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
index 0180e27011..0180e27011 100644
--- a/src/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h
diff --git a/src/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
index f0a8149a28..f0a8149a28 100644
--- a/src/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp
diff --git a/src/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
index c387063b48..c387063b48 100644
--- a/src/scripts/Northrend/Gundrak/boss_eck.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
diff --git a/src/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
index 9ec01e4244..9ec01e4244 100644
--- a/src/scripts/Northrend/Gundrak/boss_gal_darah.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp
diff --git a/src/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
index 9a328ae630..9a328ae630 100644
--- a/src/scripts/Northrend/Gundrak/boss_moorabi.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
diff --git a/src/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
index 75df7449d5..75df7449d5 100644
--- a/src/scripts/Northrend/Gundrak/boss_slad_ran.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp
diff --git a/src/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h
index e42805daf7..e42805daf7 100644
--- a/src/scripts/Northrend/Gundrak/gundrak.h
+++ b/src/server/scripts/Northrend/Gundrak/gundrak.h
diff --git a/src/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index 0f4be20d46..0f4be20d46 100644
--- a/src/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
index 4cea79ea3f..4cea79ea3f 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index 1c0c120ae5..1c0c120ae5 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index dc91f42d8b..dc91f42d8b 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
index d347688dc6..d347688dc6 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
index c28ca40965..c28ca40965 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
index 2a46155b29..2a46155b29 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index d2399f035d..d2399f035d 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index ec64a7a0f8..ec64a7a0f8 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
index 4101de86a2..4101de86a2 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 3932c2b56d..3932c2b56d 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index dd4f6b2e76..dd4f6b2e76 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
index f85c00f293..f85c00f293 100644
--- a/src/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 5e2a882b91..5e2a882b91 100644
--- a/src/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index 441753ce39..441753ce39 100644
--- a/src/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
diff --git a/src/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
index 30ff0c7070..30ff0c7070 100644
--- a/src/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
diff --git a/src/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index b6d11e8967..b6d11e8967 100644
--- a/src/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
index 461ce780a9..461ce780a9 100644
--- a/src/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_anubrekhan.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
index 96961d1ae2..96961d1ae2 100644
--- a/src/scripts/Northrend/Naxxramas/boss_faerlina.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
index 21cff6286e..21cff6286e 100644
--- a/src/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
index fdc4a5e6a8..fdc4a5e6a8 100644
--- a/src/scripts/Northrend/Naxxramas/boss_gluth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
index 897103e475..897103e475 100644
--- a/src/scripts/Northrend/Naxxramas/boss_gothik.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
index aa8b87531b..aa8b87531b 100644
--- a/src/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
index c6039bac60..c6039bac60 100644
--- a/src/scripts/Northrend/Naxxramas/boss_heigan.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
index 5af8fbd6aa..5af8fbd6aa 100644
--- a/src/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
index 165ff01329..165ff01329 100644
--- a/src/scripts/Northrend/Naxxramas/boss_loatheb.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
index f93e5758cb..f93e5758cb 100644
--- a/src/scripts/Northrend/Naxxramas/boss_maexxna.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
index 95f81ca99b..95f81ca99b 100644
--- a/src/scripts/Northrend/Naxxramas/boss_noth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
index 18910bbcd3..18910bbcd3 100644
--- a/src/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
index def339cf5e..def339cf5e 100644
--- a/src/scripts/Northrend/Naxxramas/boss_razuvious.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index 2514682c95..2514682c95 100644
--- a/src/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
diff --git a/src/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
index 51e8f5b6ca..51e8f5b6ca 100644
--- a/src/scripts/Northrend/Naxxramas/boss_thaddius.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
diff --git a/src/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index 93db29caea..93db29caea 100644
--- a/src/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
diff --git a/src/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
index 25a1bed6d4..25a1bed6d4 100644
--- a/src/scripts/Northrend/Naxxramas/naxxramas.h
+++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h
diff --git a/src/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index fa79afb015..fa79afb015 100644
--- a/src/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
diff --git a/src/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
index b6e462ba4a..b6e462ba4a 100644
--- a/src/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h
diff --git a/src/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
index 0777a07cd7..0777a07cd7 100644
--- a/src/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
diff --git a/src/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
index 6d553d3b6a..6d553d3b6a 100644
--- a/src/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
diff --git a/src/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp
index 472997072b..472997072b 100644
--- a/src/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp
diff --git a/src/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
index 8cbeab6595..8cbeab6595 100644
--- a/src/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
diff --git a/src/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
index e8aff23c76..e8aff23c76 100644
--- a/src/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
diff --git a/src/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
index 2fa3d1d333..2fa3d1d333 100644
--- a/src/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
diff --git a/src/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
index ee607d70b6..ee607d70b6 100644
--- a/src/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp
diff --git a/src/scripts/Northrend/Nexus/Nexus/nexus.h b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
index 93ac0fd72a..93ac0fd72a 100644
--- a/src/scripts/Northrend/Nexus/Nexus/nexus.h
+++ b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
diff --git a/src/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
index 850056c192..850056c192 100644
--- a/src/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
diff --git a/src/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
index ad75502597..ad75502597 100644
--- a/src/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
diff --git a/src/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
index 9a358c7b4e..9a358c7b4e 100644
--- a/src/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
diff --git a/src/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index 1d4709d4b4..1d4709d4b4 100644
--- a/src/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
diff --git a/src/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index 4b1bbf6e0b..4b1bbf6e0b 100644
--- a/src/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
diff --git a/src/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index 4fb6a201f1..4fb6a201f1 100644
--- a/src/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
diff --git a/src/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
index e4c7e108ca..e4c7e108ca 100644
--- a/src/scripts/Northrend/Nexus/Oculus/oculus.h
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
diff --git a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
index 65dddf7656..65dddf7656 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
index 27d4b70f87..27d4b70f87 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
index 68d02b0a36..68d02b0a36 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
index 0c5add648b..0c5add648b 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
index 7e28179c02..7e28179c02 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
diff --git a/src/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
index a596e7b481..a596e7b481 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
index 081b55844e..081b55844e 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
index 69327f1c98..69327f1c98 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
index 5c8e621aaa..5c8e621aaa 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp
index 70f7887af2..70f7887af2 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/brann_bronzebeard.cpp
diff --git a/src/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
index 59f2923b28..59f2923b28 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h
diff --git a/src/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
index 735a1738d0..735a1738d0 100644
--- a/src/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 5ff7ce6aa9..5ff7ce6aa9 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
index 40ea95036b..40ea95036b 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
index 7cceaed168..7cceaed168 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 1179ab4320..1179ab4320 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index 853fce3acb..853fce3acb 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
index eab9d0cde9..eab9d0cde9 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
index 755a3a36d3..755a3a36d3 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
index 93681e56fc..93681e56fc 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
index eb0e6be6fc..eb0e6be6fc 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
index b758cbe3e4..b758cbe3e4 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index 33f04a71a3..33f04a71a3 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
index ce57e00534..ce57e00534 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
index 3498289fe7..3498289fe7 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp
index 04d3d59125..04d3d59125 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yoggsaron.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
index 6fbd1a2be8..6fbd1a2be8 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp
index cd0ce62943..cd0ce62943 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp
diff --git a/src/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
index e0c45592ee..e0c45592ee 100644
--- a/src/scripts/Northrend/Ulduar/Ulduar/ulduar.h
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index a3b12cf5b6..a3b12cf5b6 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
index 816db299ae..816db299ae 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
index 26ff5be0ee..26ff5be0ee 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
index acbbd3003b..acbbd3003b 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
index 71158e115f..71158e115f 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
index 1c5d445b2f..1c5d445b2f 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index 887fe986da..887fe986da 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
index f3d398446f..f3d398446f 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index 9cf127207a..9cf127207a 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index 50ca2c08f9..50ca2c08f9 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
index b2a5bb3fb2..b2a5bb3fb2 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
diff --git a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
index 893b302d84..893b302d84 100644
--- a/src/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
diff --git a/src/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
index 15e987ba6b..15e987ba6b 100644
--- a/src/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
diff --git a/src/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
index d6a05807a7..d6a05807a7 100644
--- a/src/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
diff --git a/src/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
index 3e8c0d91e9..3e8c0d91e9 100644
--- a/src/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_koralon.cpp
diff --git a/src/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
index fdeb0ce80e..fdeb0ce80e 100644
--- a/src/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
diff --git a/src/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
index e588c1f37b..e588c1f37b 100644
--- a/src/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
diff --git a/src/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
index f91aaf00bd..f91aaf00bd 100644
--- a/src/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
+++ b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
diff --git a/src/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
index 9252d15722..9252d15722 100644
--- a/src/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
diff --git a/src/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
index 52c2e4fc22..52c2e4fc22 100644
--- a/src/scripts/Northrend/VioletHold/boss_erekem.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
diff --git a/src/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
index 23aaf8df09..23aaf8df09 100644
--- a/src/scripts/Northrend/VioletHold/boss_ichoron.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
diff --git a/src/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp
index 6fbd85da3f..6fbd85da3f 100644
--- a/src/scripts/Northrend/VioletHold/boss_lavanthor.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp
diff --git a/src/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp
index 018325c846..018325c846 100644
--- a/src/scripts/Northrend/VioletHold/boss_moragg.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp
diff --git a/src/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp
index cfc1c0b7af..cfc1c0b7af 100644
--- a/src/scripts/Northrend/VioletHold/boss_xevozz.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp
diff --git a/src/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
index 5c28132d37..5c28132d37 100644
--- a/src/scripts/Northrend/VioletHold/boss_zuramat.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
diff --git a/src/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
index d62f9b659d..d62f9b659d 100644
--- a/src/scripts/Northrend/VioletHold/instance_violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
diff --git a/src/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
index 1490012da8..1490012da8 100644
--- a/src/scripts/Northrend/VioletHold/violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp
diff --git a/src/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h
index 95221eb1e4..95221eb1e4 100644
--- a/src/scripts/Northrend/VioletHold/violet_hold.h
+++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h
diff --git a/src/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp
index 5bd0cd5bfe..5bd0cd5bfe 100644
--- a/src/scripts/Northrend/isle_of_conquest.cpp
+++ b/src/server/scripts/Northrend/isle_of_conquest.cpp
diff --git a/src/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 50db4397db..50db4397db 100644
--- a/src/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
diff --git a/src/scripts/Northrend/zone_crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
index c6101dc6a4..c6101dc6a4 100644
--- a/src/scripts/Northrend/zone_crystalsong_forest.cpp
+++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
diff --git a/src/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp
index 140029352a..140029352a 100644
--- a/src/scripts/Northrend/zone_dalaran.cpp
+++ b/src/server/scripts/Northrend/zone_dalaran.cpp
diff --git a/src/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp
index 53cbacbd68..53cbacbd68 100644
--- a/src/scripts/Northrend/zone_dragonblight.cpp
+++ b/src/server/scripts/Northrend/zone_dragonblight.cpp
diff --git a/src/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index d847aba9bb..d847aba9bb 100644
--- a/src/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
diff --git a/src/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp
index c32010f326..c32010f326 100644
--- a/src/scripts/Northrend/zone_howling_fjord.cpp
+++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp
diff --git a/src/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index a3ac53d19f..a3ac53d19f 100644
--- a/src/scripts/Northrend/zone_icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
diff --git a/src/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 5d0e2c5dad..5d0e2c5dad 100644
--- a/src/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
diff --git a/src/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index a3bbc43a93..a3bbc43a93 100644
--- a/src/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
diff --git a/src/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp
index e14c1197d8..e14c1197d8 100644
--- a/src/scripts/Northrend/zone_wintergrasp.cpp
+++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp
diff --git a/src/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index 88797fe361..88797fe361 100644
--- a/src/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
diff --git a/src/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt
index ed8aabe46b..ed8aabe46b 100644
--- a/src/scripts/OutdoorPvP/CMakeLists.txt
+++ b/src/server/scripts/OutdoorPvP/CMakeLists.txt
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPEP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp
index 11b8b9418c..11b8b9418c 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPEP.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPEP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h
index a97556349a..a97556349a 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPEP.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPGH.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.cpp
index c0b7610e31..c0b7610e31 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPGH.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.cpp
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPGH.h b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.h
index 79a02ca6d5..79a02ca6d5 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPGH.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPGH.h
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPHP.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp
index 8c5de0cc70..8c5de0cc70 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPHP.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.cpp
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPHP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h
index 76d897ba5a..76d897ba5a 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPHP.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp
index 7b18c2f0fc..7b18c2f0fc 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPNA.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPNA.h b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h
index ec1530a53b..ec1530a53b 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPNA.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp
index b67892f4d4..b67892f4d4 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPSI.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPSI.h b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h
index 5337fbbfdd..5337fbbfdd 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPSI.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPTF.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp
index e5d62b7c92..e5d62b7c92 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPTF.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPTF.h b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h
index 16425ebafd..16425ebafd 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPTF.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPZM.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp
index 3794a5b03e..3794a5b03e 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPZM.cpp
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp
diff --git a/src/scripts/OutdoorPvP/OutdoorPvPZM.h b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h
index 09fe65003d..09fe65003d 100644
--- a/src/scripts/OutdoorPvP/OutdoorPvPZM.h
+++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h
diff --git a/src/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
index f92d2f1737..f92d2f1737 100644
--- a/src/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
diff --git a/src/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp
index 8741ce2ad0..8741ce2ad0 100644
--- a/src/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp
+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp
diff --git a/src/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
index c7a3c4bf45..c7a3c4bf45 100644
--- a/src/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
diff --git a/src/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
index 8a2285b1ca..8a2285b1ca 100644
--- a/src/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
diff --git a/src/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
index b08dfe7b75..b08dfe7b75 100644
--- a/src/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp
diff --git a/src/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
index f6562bcba9..f6562bcba9 100644
--- a/src/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/sethekk_halls.h
diff --git a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
index 462e6c7d5e..462e6c7d5e 100644
--- a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
diff --git a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
index fa4e912358..fa4e912358 100644
--- a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
diff --git a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
index 6625997db2..6625997db2 100644
--- a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
diff --git a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
index cc7ed758f3..cc7ed758f3 100644
--- a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
diff --git a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
index 239f3288b7..239f3288b7 100644
--- a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp
diff --git a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
index 6ae39e7f02..6ae39e7f02 100644
--- a/src/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
diff --git a/src/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h
index 7e418cb089..7e418cb089 100644
--- a/src/scripts/Outland/BlackTemple/black_temple.h
+++ b/src/server/scripts/Outland/BlackTemple/black_temple.h
diff --git a/src/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
index 2b07e6e4a0..2b07e6e4a0 100644
--- a/src/scripts/Outland/BlackTemple/boss_bloodboil.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
diff --git a/src/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 3e4c0d7b2a..3e4c0d7b2a 100644
--- a/src/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
diff --git a/src/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
index b02872ec4f..b02872ec4f 100644
--- a/src/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp
diff --git a/src/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
index 8a4baf5b9c..8a4baf5b9c 100644
--- a/src/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp
diff --git a/src/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
index c6799b1dd0..c6799b1dd0 100644
--- a/src/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
diff --git a/src/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
index 61ee5df57b..61ee5df57b 100644
--- a/src/scripts/Outland/BlackTemple/boss_supremus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
diff --git a/src/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
index e8bd1e6d50..e8bd1e6d50 100644
--- a/src/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
diff --git a/src/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
index f0a0e448ea..f0a0e448ea 100644
--- a/src/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
diff --git a/src/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
index 714d8b8945..714d8b8945 100644
--- a/src/scripts/Outland/BlackTemple/illidari_council.cpp
+++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp
diff --git a/src/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
index ccb78d99d9..ccb78d99d9 100644
--- a/src/scripts/Outland/BlackTemple/instance_black_temple.cpp
+++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp
diff --git a/src/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt
index dc384ced3b..dc384ced3b 100644
--- a/src/scripts/Outland/CMakeLists.txt
+++ b/src/server/scripts/Outland/CMakeLists.txt
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
index f789ca815b..f789ca815b 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
index 7a57ccaf24..7a57ccaf24 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
index 2cdeea8202..2cdeea8202 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
index d99578c6d6..d99578c6d6 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index f52047d1a3..f52047d1a3 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
index 470afeaa9a..470afeaa9a 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
index 1bbc6e2123..1bbc6e2123 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h
index e0c4ce0d38..e0c4ce0d38 100644
--- a/src/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h
diff --git a/src/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp
index 90ea14d659..90ea14d659 100644
--- a/src/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_ahune.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
index 71df727f6f..71df727f6f 100644
--- a/src/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp
index 852ca8fc24..852ca8fc24 100644
--- a/src/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
index 759cfef66f..759cfef66f 100644
--- a/src/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
index e51a3c930e..e51a3c930e 100644
--- a/src/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
diff --git a/src/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
index e5785ede7d..e5785ede7d 100644
--- a/src/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/steam_vault.h
diff --git a/src/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp
index 5a3ddeb9b2..5a3ddeb9b2 100644
--- a/src/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp
diff --git a/src/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
index 3d374c5068..3d374c5068 100644
--- a/src/scripts/Outland/GruulsLair/boss_gruul.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
diff --git a/src/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
index 17cc3e20fd..17cc3e20fd 100644
--- a/src/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
diff --git a/src/scripts/Outland/GruulsLair/gruuls_lair.h b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h
index 46fe1d09b1..46fe1d09b1 100644
--- a/src/scripts/Outland/GruulsLair/gruuls_lair.h
+++ b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h
diff --git a/src/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
index b35e16dee1..b35e16dee1 100644
--- a/src/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
+++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
index 688b3a754d..688b3a754d 100644
--- a/src/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
diff --git a/src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index 858cbdb557..858cbdb557 100644
--- a/src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
index 8e23f708e5..8e23f708e5 100644
--- a/src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
index d1e8adea12..d1e8adea12 100644
--- a/src/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
index 0f4dd28486..0f4dd28486 100644
--- a/src/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
index c0aa882ebd..c0aa882ebd 100644
--- a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
index f73032c23b..f73032c23b 100644
--- a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
index b2ee872a32..b2ee872a32 100644
--- a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h
index 50e671c878..50e671c878 100644
--- a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h
diff --git a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp
index 406ed503e9..406ed503e9 100644
--- a/src/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
index 18579172ff..18579172ff 100644
--- a/src/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
index 061ec65769..061ec65769 100644
--- a/src/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h
index de9ca91cc6..de9ca91cc6 100644
--- a/src/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h
diff --git a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
index 73b4747e06..73b4747e06 100644
--- a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
index 2d11a988f6..2d11a988f6 100644
--- a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
index 7b348c709d..7b348c709d 100644
--- a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
index 513b02eba2..513b02eba2 100644
--- a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
diff --git a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
index c9304cc97c..c9304cc97c 100644
--- a/src/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
diff --git a/src/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
index 4ef3f64cb4..4ef3f64cb4 100644
--- a/src/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
diff --git a/src/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
index f009c0c8a5..f009c0c8a5 100644
--- a/src/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
diff --git a/src/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
index 4ee5a42080..4ee5a42080 100644
--- a/src/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
diff --git a/src/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
index db15167069..db15167069 100644
--- a/src/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
diff --git a/src/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
index e0ff41600a..e0ff41600a 100644
--- a/src/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp
diff --git a/src/scripts/Outland/TempestKeep/Eye/the_eye.h b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h
index a43cf5a9fa..a43cf5a9fa 100644
--- a/src/scripts/Outland/TempestKeep/Eye/the_eye.h
+++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h
diff --git a/src/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp
index 90d5706727..90d5706727 100644
--- a/src/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp
diff --git a/src/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
index e1fcc625e3..e1fcc625e3 100644
--- a/src/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
diff --git a/src/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
index 5297bbc4ce..5297bbc4ce 100644
--- a/src/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
diff --git a/src/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
index c9ce1de89c..c9ce1de89c 100644
--- a/src/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
diff --git a/src/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
index 699cdbc838..699cdbc838 100644
--- a/src/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
diff --git a/src/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
index f34dc51b07..f34dc51b07 100644
--- a/src/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
diff --git a/src/scripts/Outland/TempestKeep/Mechanar/mechanar.h b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
index 9530f908e1..9530f908e1 100644
--- a/src/scripts/Outland/TempestKeep/Mechanar/mechanar.h
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h
diff --git a/src/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
index c88197c3cc..c88197c3cc 100644
--- a/src/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
diff --git a/src/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
index 098ceb124d..098ceb124d 100644
--- a/src/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
diff --git a/src/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
index 288abd2b3b..288abd2b3b 100644
--- a/src/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
diff --git a/src/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
index fbb01edf06..fbb01edf06 100644
--- a/src/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
diff --git a/src/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
index b5fbbccf94..b5fbbccf94 100644
--- a/src/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
diff --git a/src/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
index f128f2c782..f128f2c782 100644
--- a/src/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
diff --git a/src/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
index f167cacf93..f167cacf93 100644
--- a/src/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
diff --git a/src/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
index 0e3b19f0da..0e3b19f0da 100644
--- a/src/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
diff --git a/src/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
index 35b93d074a..35b93d074a 100644
--- a/src/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
diff --git a/src/scripts/Outland/TempestKeep/botanica/boss_laj.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
index f2c1ce3a4c..f2c1ce3a4c 100644
--- a/src/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
diff --git a/src/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
index 26eeaddf75..26eeaddf75 100644
--- a/src/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
diff --git a/src/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
index 7b9d8ec3a3..7b9d8ec3a3 100644
--- a/src/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
diff --git a/src/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
index bdbcf81136..bdbcf81136 100644
--- a/src/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
diff --git a/src/scripts/Outland/TempestKeep/botanica/the_botanica.h b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h
index f49d11cd67..f49d11cd67 100644
--- a/src/scripts/Outland/TempestKeep/botanica/the_botanica.h
+++ b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h
diff --git a/src/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
index e39378759e..e39378759e 100644
--- a/src/scripts/Outland/boss_doomlord_kazzak.cpp
+++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp
diff --git a/src/scripts/Outland/boss_doomwalker.cpp b/src/server/scripts/Outland/boss_doomwalker.cpp
index ccd719573f..ccd719573f 100644
--- a/src/scripts/Outland/boss_doomwalker.cpp
+++ b/src/server/scripts/Outland/boss_doomwalker.cpp
diff --git a/src/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index f2d172b93e..f2d172b93e 100644
--- a/src/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
diff --git a/src/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
index 116785af5b..116785af5b 100644
--- a/src/scripts/Outland/zone_hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
diff --git a/src/scripts/Outland/zone_nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp
index 0ed661c360..0ed661c360 100644
--- a/src/scripts/Outland/zone_nagrand.cpp
+++ b/src/server/scripts/Outland/zone_nagrand.cpp
diff --git a/src/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 55a402b2ee..55a402b2ee 100644
--- a/src/scripts/Outland/zone_netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
diff --git a/src/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index c603b2b6e1..c603b2b6e1 100644
--- a/src/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
diff --git a/src/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp
index bc9b280381..bc9b280381 100644
--- a/src/scripts/Outland/zone_shattrath_city.cpp
+++ b/src/server/scripts/Outland/zone_shattrath_city.cpp
diff --git a/src/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp
index 9a9745ff54..9a9745ff54 100644
--- a/src/scripts/Outland/zone_terokkar_forest.cpp
+++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp
diff --git a/src/scripts/Outland/zone_zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp
index 8fb4aba974..8fb4aba974 100644
--- a/src/scripts/Outland/zone_zangarmarsh.cpp
+++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp
diff --git a/src/scripts/Pet/CMakeLists.txt b/src/server/scripts/Pet/CMakeLists.txt
index 617106b756..617106b756 100644
--- a/src/scripts/Pet/CMakeLists.txt
+++ b/src/server/scripts/Pet/CMakeLists.txt
diff --git a/src/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp
index 80267d7981..80267d7981 100644
--- a/src/scripts/Pet/pet_dk.cpp
+++ b/src/server/scripts/Pet/pet_dk.cpp
diff --git a/src/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp
index 6304cc8ec4..6304cc8ec4 100644
--- a/src/scripts/Pet/pet_generic.cpp
+++ b/src/server/scripts/Pet/pet_generic.cpp
diff --git a/src/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp
index ed59a2491e..ed59a2491e 100644
--- a/src/scripts/Pet/pet_hunter.cpp
+++ b/src/server/scripts/Pet/pet_hunter.cpp
diff --git a/src/scripts/Pet/pet_mage.cpp b/src/server/scripts/Pet/pet_mage.cpp
index 4642e9a131..4642e9a131 100644
--- a/src/scripts/Pet/pet_mage.cpp
+++ b/src/server/scripts/Pet/pet_mage.cpp
diff --git a/src/scripts/Pet/pet_priest.cpp b/src/server/scripts/Pet/pet_priest.cpp
index 2a2f305d55..2a2f305d55 100644
--- a/src/scripts/Pet/pet_priest.cpp
+++ b/src/server/scripts/Pet/pet_priest.cpp
diff --git a/src/scripts/Pet/pet_shaman.cpp b/src/server/scripts/Pet/pet_shaman.cpp
index 605a60cb5a..605a60cb5a 100644
--- a/src/scripts/Pet/pet_shaman.cpp
+++ b/src/server/scripts/Pet/pet_shaman.cpp
diff --git a/src/scripts/PrecompiledHeaders/ScriptPCH.cpp b/src/server/scripts/PrecompiledHeaders/ScriptPCH.cpp
index df6fc55876..df6fc55876 100644
--- a/src/scripts/PrecompiledHeaders/ScriptPCH.cpp
+++ b/src/server/scripts/PrecompiledHeaders/ScriptPCH.cpp
diff --git a/src/scripts/PrecompiledHeaders/ScriptPCH.h b/src/server/scripts/PrecompiledHeaders/ScriptPCH.h
index 0d03b3700a..0d03b3700a 100644
--- a/src/scripts/PrecompiledHeaders/ScriptPCH.h
+++ b/src/server/scripts/PrecompiledHeaders/ScriptPCH.h
diff --git a/src/scripts/ScriptLoader.cpp b/src/server/scripts/ScriptLoader.cpp
index a5e9f710e9..a5e9f710e9 100644
--- a/src/scripts/ScriptLoader.cpp
+++ b/src/server/scripts/ScriptLoader.cpp
diff --git a/src/scripts/ScriptLoader.h b/src/server/scripts/ScriptLoader.h
index 6ac5ef0fe2..6ac5ef0fe2 100644
--- a/src/scripts/ScriptLoader.h
+++ b/src/server/scripts/ScriptLoader.h
diff --git a/src/scripts/Spells/CMakeLists.txt b/src/server/scripts/Spells/CMakeLists.txt
index e0ecd2cc34..e0ecd2cc34 100644
--- a/src/scripts/Spells/CMakeLists.txt
+++ b/src/server/scripts/Spells/CMakeLists.txt
diff --git a/src/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 27263233f8..27263233f8 100644
--- a/src/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
diff --git a/src/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index cea3cdf484..cea3cdf484 100644
--- a/src/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
diff --git a/src/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index f0ac73e39c..f0ac73e39c 100644
--- a/src/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
diff --git a/src/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 61a4b35b88..61a4b35b88 100644
--- a/src/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
diff --git a/src/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index d6d93cfd19..d6d93cfd19 100644
--- a/src/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
diff --git a/src/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index 7edcf0e58d..7edcf0e58d 100644
--- a/src/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
diff --git a/src/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 164980aee6..164980aee6 100644
--- a/src/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
diff --git a/src/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 7389f4e536..7389f4e536 100644
--- a/src/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
diff --git a/src/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index ef45557438..ef45557438 100644
--- a/src/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
diff --git a/src/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 7526dc71f0..7526dc71f0 100644
--- a/src/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
diff --git a/src/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 6fe929a10a..6fe929a10a 100644
--- a/src/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
diff --git a/src/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index f7b649b247..f7b649b247 100644
--- a/src/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
diff --git a/src/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 45b3ac2640..45b3ac2640 100644
--- a/src/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
diff --git a/src/scripts/World/CMakeLists.txt b/src/server/scripts/World/CMakeLists.txt
index 42ba3faccb..42ba3faccb 100644
--- a/src/scripts/World/CMakeLists.txt
+++ b/src/server/scripts/World/CMakeLists.txt
diff --git a/src/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp
index 95c4db4801..95c4db4801 100644
--- a/src/scripts/World/achievement_scripts.cpp
+++ b/src/server/scripts/World/achievement_scripts.cpp
diff --git a/src/scripts/World/areatrigger_scripts.cpp b/src/server/scripts/World/areatrigger_scripts.cpp
index 19936e8271..19936e8271 100644
--- a/src/scripts/World/areatrigger_scripts.cpp
+++ b/src/server/scripts/World/areatrigger_scripts.cpp
diff --git a/src/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp
index 43e697f76a..43e697f76a 100644
--- a/src/scripts/World/boss_emerald_dragons.cpp
+++ b/src/server/scripts/World/boss_emerald_dragons.cpp
diff --git a/src/scripts/World/character_creation.cpp b/src/server/scripts/World/character_creation.cpp
index 597dd87a0e..597dd87a0e 100644
--- a/src/scripts/World/character_creation.cpp
+++ b/src/server/scripts/World/character_creation.cpp
diff --git a/src/scripts/World/chat_log.cpp b/src/server/scripts/World/chat_log.cpp
index 0b219d3056..0b219d3056 100644
--- a/src/scripts/World/chat_log.cpp
+++ b/src/server/scripts/World/chat_log.cpp
diff --git a/src/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index ce6c3f69c7..ce6c3f69c7 100644
--- a/src/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
diff --git a/src/scripts/World/guards.cpp b/src/server/scripts/World/guards.cpp
index e069247903..e069247903 100644
--- a/src/scripts/World/guards.cpp
+++ b/src/server/scripts/World/guards.cpp
diff --git a/src/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp
index eb55715e20..eb55715e20 100644
--- a/src/scripts/World/item_scripts.cpp
+++ b/src/server/scripts/World/item_scripts.cpp
diff --git a/src/scripts/World/mob_generic_creature.cpp b/src/server/scripts/World/mob_generic_creature.cpp
index 3eed9ed39b..3eed9ed39b 100644
--- a/src/scripts/World/mob_generic_creature.cpp
+++ b/src/server/scripts/World/mob_generic_creature.cpp
diff --git a/src/scripts/World/npc_innkeeper.cpp b/src/server/scripts/World/npc_innkeeper.cpp
index dd765a7909..dd765a7909 100644
--- a/src/scripts/World/npc_innkeeper.cpp
+++ b/src/server/scripts/World/npc_innkeeper.cpp
diff --git a/src/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp
index f154f8dd2a..f154f8dd2a 100644
--- a/src/scripts/World/npc_professions.cpp
+++ b/src/server/scripts/World/npc_professions.cpp
diff --git a/src/scripts/World/npc_taxi.cpp b/src/server/scripts/World/npc_taxi.cpp
index 9bd364dbd7..9bd364dbd7 100644
--- a/src/scripts/World/npc_taxi.cpp
+++ b/src/server/scripts/World/npc_taxi.cpp
diff --git a/src/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index a161a6fa77..a161a6fa77 100644
--- a/src/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt
new file mode 100644
index 0000000000..fdc17078bc
--- /dev/null
+++ b/src/server/worldserver/CMakeLists.txt
@@ -0,0 +1,216 @@
+# Copyright (C)
+#
+# 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.
+
+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_RECURSE sources_WorldThread WorldThread/*.cpp WorldThread/*.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_WorldThread}
+ ${sources_localdir}
+)
+
+if( WIN32 )
+ set(worldserver_SRCS
+ ${worldserver_SRCS}
+ ${sources_windows_Debugging}
+ )
+ if ( MSVC )
+ set(worldserver_SRCS
+ ${worldserver_SRCS}
+ worldserver.rc
+ )
+ endif()
+endif()
+
+include_directories(
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/deps/g3dlite/include
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour/Include
+ ${CMAKE_SOURCE_DIR}/deps/gsoap
+ ${CMAKE_SOURCE_DIR}/deps/sockets/include
+ ${CMAKE_SOURCE_DIR}/deps/SFMT
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/Management
+ ${CMAKE_SOURCE_DIR}/src/common/Collision/Models
+ ${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/Database
+ ${CMAKE_SOURCE_DIR}/src/common/DataStores
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic/LinkedReference
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic
+ ${CMAKE_SOURCE_DIR}/src/common/Logging
+ ${CMAKE_SOURCE_DIR}/src/common/Packets
+ ${CMAKE_SOURCE_DIR}/src/common/Threading
+ ${CMAKE_SOURCE_DIR}/src/common/Utilities
+ ${CMAKE_SOURCE_DIR}/src/server/game/Addons
+ ${game_INCLUDE_DIRS}
+ ${CMAKE_SOURCE_DIR}/src/server/game
+ ${CMAKE_SOURCE_DIR}/src/server/game/Accounts
+ ${CMAKE_SOURCE_DIR}/src/server/game/Achievements
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts
+ ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse
+ ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse/AuctionHouseBot
+ ${CMAKE_SOURCE_DIR}/src/server/game/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/Calendar
+ ${CMAKE_SOURCE_DIR}/src/server/game/Chat
+ ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels
+ ${CMAKE_SOURCE_DIR}/src/server/game/Combat
+ ${CMAKE_SOURCE_DIR}/src/server/game/Conditions
+ ${CMAKE_SOURCE_DIR}/src/server/game/DataStores
+ ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse
+ ${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/Totem
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Vehicle
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Transport
+ ${CMAKE_SOURCE_DIR}/src/server/game/Events
+ ${CMAKE_SOURCE_DIR}/src/server/game/Globals
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids
+ ${CMAKE_SOURCE_DIR}/src/server/game/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/Spline
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement/MovementGenerators
+ ${CMAKE_SOURCE_DIR}/src/server/game/Movement/Waypoints
+ ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP
+ ${CMAKE_SOURCE_DIR}/src/server/game/Pools
+ ${CMAKE_SOURCE_DIR}/src/server/game/PrecompiledHeaders
+ ${CMAKE_SOURCE_DIR}/src/server/game/Quests
+ ${CMAKE_SOURCE_DIR}/src/server/game/Reputation
+ ${CMAKE_SOURCE_DIR}/src/server/game/Scripting
+ ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol
+ ${CMAKE_SOURCE_DIR}/src/server/game/Server
+ ${CMAKE_SOURCE_DIR}/src/server/game/Skills
+ ${CMAKE_SOURCE_DIR}/src/server/game/Spells
+ ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras
+ ${CMAKE_SOURCE_DIR}/src/server/game/Tools
+ ${CMAKE_SOURCE_DIR}/src/server/game/Warden
+ ${CMAKE_SOURCE_DIR}/src/server/game/Warden/Modules
+ ${CMAKE_SOURCE_DIR}/src/server/game/Weather
+ ${CMAKE_SOURCE_DIR}/src/server/game/World
+ ${CMAKE_SOURCE_DIR}/src/server/game/Misc
+ ${CMAKE_SOURCE_DIR}/src/server/scripts/PrecompiledHeaders
+ ${CMAKE_SOURCE_DIR}/src/server/authserver/Server
+ ${CMAKE_SOURCE_DIR}/src/server/authserver/Realms
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine
+ ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess
+ ${CMAKE_CURRENT_SOURCE_DIR}/TCSoap
+ ${CMAKE_CURRENT_SOURCE_DIR}/WorldThread
+ ${ACE_INCLUDE_DIR}
+ ${MYSQL_INCLUDE_DIR}
+ ${OPENSSL_INCLUDE_DIR}
+)
+
+add_executable(worldserver
+ ${worldserver_SRCS}
+ ${worldserver_PCH_SRC}
+)
+
+if( NOT WIN32 )
+ set_target_properties(worldserver PROPERTIES
+ COMPILE_DEFINITIONS _TRINITY_CORE_CONFIG="${CONF_DIR}/worldserver.conf"
+ )
+endif()
+
+add_dependencies(worldserver revision.h)
+
+if( UNIX AND NOT NOJEM )
+ set(worldserver_LINK_FLAGS "-pthread -lncurses ${worldserver_LINK_FLAGS}")
+endif()
+
+set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAGS}")
+
+target_link_libraries(worldserver
+ game
+ shared
+ scripts
+ collision
+ g3dlib
+ gsoap
+ Detour
+ ${GPERFTOOLS_LIBRARIES}
+ ${JEMALLOC_LIBRARY}
+ ${READLINE_LIBRARY}
+ ${TERMCAP_LIBRARY}
+ ${ACE_LIBRARY}
+ ${MYSQL_LIBRARY}
+ ${OPENSSL_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+ ${CMAKE_THREAD_LIBS_INIT}
+)
+
+if( WIN32 )
+ if ( MSVC )
+ add_custom_command(TARGET worldserver
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/
+ )
+ elseif ( MINGW )
+ add_custom_command(TARGET worldserver
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_BINARY_DIR}/bin/
+ )
+ endif()
+endif()
+
+if( UNIX )
+ install(TARGETS worldserver DESTINATION bin)
+elseif( WIN32 )
+ install(TARGETS worldserver DESTINATION "${CMAKE_INSTALL_PREFIX}")
+endif()
+
+install(FILES worldserver.conf.dist DESTINATION ${CONF_DIR})
+
+# Generate precompiled header
+if( USE_COREPCH )
+ add_cxx_pch(worldserver ${worldserver_PCH_HDR} ${worldserver_PCH_SRC})
+endif()
+
+CU_RUN_HOOK("AFTER_WORLDSERVER_CMAKE")
diff --git a/src/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp
index be47d408d2..be47d408d2 100644
--- a/src/worldserver/CommandLine/CliRunnable.cpp
+++ b/src/server/worldserver/CommandLine/CliRunnable.cpp
diff --git a/src/worldserver/CommandLine/CliRunnable.h b/src/server/worldserver/CommandLine/CliRunnable.h
index 025a68d6cb..025a68d6cb 100644
--- a/src/worldserver/CommandLine/CliRunnable.h
+++ b/src/server/worldserver/CommandLine/CliRunnable.h
diff --git a/src/worldserver/Main.cpp b/src/server/worldserver/Main.cpp
index 5110a2ce12..5110a2ce12 100644
--- a/src/worldserver/Main.cpp
+++ b/src/server/worldserver/Main.cpp
diff --git a/src/worldserver/Master.cpp b/src/server/worldserver/Master.cpp
index 340f3ca29a..340f3ca29a 100644
--- a/src/worldserver/Master.cpp
+++ b/src/server/worldserver/Master.cpp
diff --git a/src/worldserver/Master.h b/src/server/worldserver/Master.h
index c3e7d62432..c3e7d62432 100644
--- a/src/worldserver/Master.h
+++ b/src/server/worldserver/Master.h
diff --git a/src/worldserver/PrecompiledHeaders/worldPCH.cpp b/src/server/worldserver/PrecompiledHeaders/worldPCH.cpp
index 99c2400ecc..99c2400ecc 100644
--- a/src/worldserver/PrecompiledHeaders/worldPCH.cpp
+++ b/src/server/worldserver/PrecompiledHeaders/worldPCH.cpp
diff --git a/src/worldserver/PrecompiledHeaders/worldPCH.h b/src/server/worldserver/PrecompiledHeaders/worldPCH.h
index f94dd953bb..f94dd953bb 100644
--- a/src/worldserver/PrecompiledHeaders/worldPCH.h
+++ b/src/server/worldserver/PrecompiledHeaders/worldPCH.h
diff --git a/src/worldserver/RemoteAccess/RARunnable.cpp b/src/server/worldserver/RemoteAccess/RARunnable.cpp
index 4099574a5b..4099574a5b 100644
--- a/src/worldserver/RemoteAccess/RARunnable.cpp
+++ b/src/server/worldserver/RemoteAccess/RARunnable.cpp
diff --git a/src/worldserver/RemoteAccess/RARunnable.h b/src/server/worldserver/RemoteAccess/RARunnable.h
index badc2a3f10..badc2a3f10 100644
--- a/src/worldserver/RemoteAccess/RARunnable.h
+++ b/src/server/worldserver/RemoteAccess/RARunnable.h
diff --git a/src/worldserver/RemoteAccess/RASocket.cpp b/src/server/worldserver/RemoteAccess/RASocket.cpp
index dc445d550a..dc445d550a 100644
--- a/src/worldserver/RemoteAccess/RASocket.cpp
+++ b/src/server/worldserver/RemoteAccess/RASocket.cpp
diff --git a/src/worldserver/RemoteAccess/RASocket.h b/src/server/worldserver/RemoteAccess/RASocket.h
index 11bd1b00e0..11bd1b00e0 100644
--- a/src/worldserver/RemoteAccess/RASocket.h
+++ b/src/server/worldserver/RemoteAccess/RASocket.h
diff --git a/src/worldserver/TCSoap/TCSoap.cpp b/src/server/worldserver/TCSoap/TCSoap.cpp
index 6d2ce72d87..6d2ce72d87 100644
--- a/src/worldserver/TCSoap/TCSoap.cpp
+++ b/src/server/worldserver/TCSoap/TCSoap.cpp
diff --git a/src/worldserver/TCSoap/TCSoap.h b/src/server/worldserver/TCSoap/TCSoap.h
index c2bcef9621..c2bcef9621 100644
--- a/src/worldserver/TCSoap/TCSoap.h
+++ b/src/server/worldserver/TCSoap/TCSoap.h
diff --git a/src/worldserver/WorldThread/WorldRunnable.cpp b/src/server/worldserver/WorldThread/WorldRunnable.cpp
index f02dafbabf..f02dafbabf 100644
--- a/src/worldserver/WorldThread/WorldRunnable.cpp
+++ b/src/server/worldserver/WorldThread/WorldRunnable.cpp
diff --git a/src/worldserver/WorldThread/WorldRunnable.h b/src/server/worldserver/WorldThread/WorldRunnable.h
index 970838d17c..970838d17c 100644
--- a/src/worldserver/WorldThread/WorldRunnable.h
+++ b/src/server/worldserver/WorldThread/WorldRunnable.h
diff --git a/src/worldserver/resource.h b/src/server/worldserver/resource.h
index 5415d15d80..5415d15d80 100644
--- a/src/worldserver/resource.h
+++ b/src/server/worldserver/resource.h
diff --git a/src/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 66fa7fb615..66fa7fb615 100644
--- a/src/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
diff --git a/src/worldserver/worldserver.ico b/src/server/worldserver/worldserver.ico
index 6f0a572195..6f0a572195 100644
--- a/src/worldserver/worldserver.ico
+++ b/src/server/worldserver/worldserver.ico
Binary files differ
diff --git a/src/worldserver/worldserver.rc b/src/server/worldserver/worldserver.rc
index b89204f708..b89204f708 100644
--- a/src/worldserver/worldserver.rc
+++ b/src/server/worldserver/worldserver.rc
diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt
new file mode 100644
index 0000000000..14845d92fe
--- /dev/null
+++ b/src/tools/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Copyright (C)
+#
+# 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.
+
+add_subdirectory(map_extractor)
+add_subdirectory(vmap4_assembler)
+add_subdirectory(vmap4_extractor)
+add_subdirectory(mmaps_generator)
+if (WITH_MESHEXTRACTOR)
+ add_subdirectory(mesh_extractor)
+endif()
diff --git a/src/tools/map_extractor/CMakeLists.txt b/src/tools/map_extractor/CMakeLists.txt
new file mode 100644
index 0000000000..f127b496a1
--- /dev/null
+++ b/src/tools/map_extractor/CMakeLists.txt
@@ -0,0 +1,46 @@
+# Copyright (C)
+# Copyright (C)
+#
+# 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.
+
+file(GLOB_RECURSE sources *.cpp *.h)
+
+set(include_Dirs
+ ${CMAKE_SOURCE_DIR}/src/common/Utilities
+ ${CMAKE_SOURCE_DIR}/src/common
+ ${CMAKE_SOURCE_DIR}/deps/libmpq
+ ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/g3dlite/include
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/loadlib
+)
+
+if( WIN32 )
+ set(include_Dirs
+ ${include_Dirs}
+ ${CMAKE_SOURCE_DIR}/deps/libmpq/win
+ )
+endif()
+
+include_directories(${include_Dirs})
+
+add_executable(mapextractor
+ ${sources}
+)
+
+target_link_libraries(mapextractor
+ mpq
+ ${BZIP2_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+)
+
+if( UNIX )
+ install(TARGETS mapextractor DESTINATION bin)
+elseif( WIN32 )
+ install(TARGETS mapextractor DESTINATION "${CMAKE_INSTALL_PREFIX}")
+endif()
diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp
new file mode 100644
index 0000000000..a22abb3ded
--- /dev/null
+++ b/src/tools/map_extractor/System.cpp
@@ -0,0 +1,1143 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#define _CRT_SECURE_NO_DEPRECATE
+
+#include <stdio.h>
+#include <deque>
+#include <set>
+#include <cstdlib>
+
+#ifdef _WIN32
+#include "direct.h"
+#else
+#include <sys/stat.h>
+#include <unistd.h>
+#endif
+
+#include "dbcfile.h"
+#include "mpq_libmpq04.h"
+#include "StringFormat.h"
+
+#include "adt.h"
+#include "wdt.h"
+
+#include "G3D/Plane.h"
+#include <fcntl.h>
+
+#if defined( __GNUC__ )
+ #define _open open
+ #define _close close
+ #ifndef O_BINARY
+ #define O_BINARY 0
+ #endif
+#else
+ #include <io.h>
+#endif
+
+#ifdef O_LARGEFILE
+ #define OPEN_FLAGS (O_RDONLY | O_BINARY | O_LARGEFILE)
+#else
+ #define OPEN_FLAGS (O_RDONLY | O_BINARY)
+#endif
+extern ArchiveSet gOpenArchives;
+
+typedef struct
+{
+ char name[64];
+ uint32 id;
+} map_id;
+
+map_id *map_ids;
+uint16 *LiqType;
+#define MAX_PATH_LENGTH 128
+char output_path[MAX_PATH_LENGTH] = ".";
+char input_path[MAX_PATH_LENGTH] = ".";
+
+// **************************************************
+// Extractor options
+// **************************************************
+enum Extract
+{
+ EXTRACT_MAP = 1,
+ EXTRACT_DBC = 2
+};
+
+// Select data for extract
+int CONF_extract = EXTRACT_MAP | EXTRACT_DBC;
+// This option allow limit minimum height to some value (Allow save some memory)
+bool CONF_allow_height_limit = true;
+float CONF_use_minHeight = -500.0f;
+
+// This option allow use float to int conversion
+bool CONF_allow_float_to_int = true;
+float CONF_float_to_int8_limit = 2.0f; // Max accuracy = val/256
+float CONF_float_to_int16_limit = 2048.0f; // Max accuracy = val/65536
+float CONF_flat_height_delta_limit = 0.005f; // If max - min less this value - surface is flat
+float CONF_flat_liquid_delta_limit = 0.001f; // If max - min less this value - liquid surface is flat
+
+// List MPQ for extract from
+const char *CONF_mpq_list[]={
+ "common.MPQ",
+ "common-2.MPQ",
+ "lichking.MPQ",
+ "expansion.MPQ",
+ "patch.MPQ",
+ "patch-2.MPQ",
+ "patch-3.MPQ",
+ "patch-4.MPQ",
+ "patch-5.MPQ",
+};
+
+static const char* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" };
+#define LANG_COUNT 12
+
+void CreateDir( const std::string& Path )
+{
+ if(chdir(Path.c_str()) == 0)
+ {
+ chdir("../");
+ return;
+ }
+
+ int ret;
+ #ifdef _WIN32
+ ret = _mkdir( Path.c_str());
+ #else
+ ret = mkdir( Path.c_str(), 0777 );
+ #endif
+ if (ret != 0)
+ {
+ printf("Fatal Error: Could not create directory %s check your permissions", Path.c_str());
+ exit(1);
+ }
+}
+
+bool FileExists( const char* FileName )
+{
+ int fp = _open(FileName, OPEN_FLAGS);
+ if(fp != -1)
+ {
+ _close(fp);
+ return true;
+ }
+
+ return false;
+}
+
+void Usage(char* prg)
+{
+ printf(
+ "Usage:\n"\
+ "%s -[var] [value]\n"\
+ "-i set input path\n"\
+ "-o set output path\n"\
+ "-e extract only MAP(1)/DBC(2) - standard: both(3)\n"\
+ "-f height stored as int (less map size but lost some accuracy) 1 by default\n"\
+ "Example: %s -f 0 -i \"c:\\games\\game\"", prg, prg);
+ exit(1);
+}
+
+void HandleArgs(int argc, char * arg[])
+{
+ for(int c = 1; c < argc; ++c)
+ {
+ // i - input path
+ // o - output path
+ // e - extract only MAP(1)/DBC(2) - standard both(3)
+ // f - use float to int conversion
+ // h - limit minimum height
+ if(arg[c][0] != '-')
+ Usage(arg[0]);
+
+ switch(arg[c][1])
+ {
+ case 'i':
+ if(c + 1 < argc) // all ok
+ strcpy(input_path, arg[(c++) + 1]);
+ else
+ Usage(arg[0]);
+ break;
+ case 'o':
+ if(c + 1 < argc) // all ok
+ strcpy(output_path, arg[(c++) + 1]);
+ else
+ Usage(arg[0]);
+ break;
+ case 'f':
+ if(c + 1 < argc) // all ok
+ CONF_allow_float_to_int=atoi(arg[(c++) + 1])!=0;
+ else
+ Usage(arg[0]);
+ break;
+ case 'e':
+ if(c + 1 < argc) // all ok
+ {
+ CONF_extract=atoi(arg[(c++) + 1]);
+ if(!(CONF_extract > 0 && CONF_extract < 4))
+ Usage(arg[0]);
+ }
+ else
+ Usage(arg[0]);
+ break;
+ }
+ }
+}
+
+uint32 ReadBuild(int locale)
+{
+ // include build info file also
+ std::string filename = std::string("component.wow-")+langs[locale]+".txt";
+ //printf("Read %s file... ", filename.c_str());
+
+ MPQFile m(filename.c_str());
+ if(m.isEof())
+ {
+ printf("Fatal error: Not found %s file!\n", filename.c_str());
+ exit(1);
+ }
+
+ std::string text = std::string(m.getPointer(), m.getSize());
+ m.close();
+
+ size_t pos = text.find("version=\"");
+ size_t pos1 = pos + strlen("version=\"");
+ size_t pos2 = text.find("\"",pos1);
+ if (pos == text.npos || pos2 == text.npos || pos1 >= pos2)
+ {
+ printf("Fatal error: Invalid %s file format!\n", filename.c_str());
+ exit(1);
+ }
+
+ std::string build_str = text.substr(pos1,pos2-pos1);
+
+ int build = atoi(build_str.c_str());
+ if (build <= 0)
+ {
+ printf("Fatal error: Invalid %s file format!\n", filename.c_str());
+ exit(1);
+ }
+
+ return build;
+}
+
+uint32 ReadMapDBC()
+{
+ printf("Read Map.dbc file... ");
+ DBCFile dbc("DBFilesClient\\Map.dbc");
+
+ if(!dbc.open())
+ {
+ printf("Fatal error: Invalid Map.dbc file format!\n");
+ exit(1);
+ }
+
+ size_t map_count = dbc.getRecordCount();
+ map_ids = new map_id[map_count];
+ for(uint32 x = 0; x < map_count; ++x)
+ {
+ map_ids[x].id = dbc.getRecord(x).getUInt(0);
+ strcpy(map_ids[x].name, dbc.getRecord(x).getString(1));
+ }
+ printf("Done! (%u maps loaded)\n", (uint32)map_count);
+ return map_count;
+}
+
+void ReadLiquidTypeTableDBC()
+{
+ printf("Read LiquidType.dbc file...");
+ DBCFile dbc("DBFilesClient\\LiquidType.dbc");
+ if(!dbc.open())
+ {
+ printf("Fatal error: Invalid LiquidType.dbc file format!\n");
+ exit(1);
+ }
+
+ size_t liqTypeCount = dbc.getRecordCount();
+ size_t liqTypeMaxId = dbc.getMaxId();
+ LiqType = new uint16[liqTypeMaxId + 1];
+ memset(LiqType, 0xff, (liqTypeMaxId + 1) * sizeof(uint16));
+
+ for(uint32 x = 0; x < liqTypeCount; ++x)
+ LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
+
+ printf("Done! (%u LiqTypes loaded)\n", (uint32)liqTypeCount);
+}
+
+//
+// Adt file convertor function and data
+//
+
+// Map file format data
+static char const* MAP_MAGIC = "MAPS";
+static char const* MAP_VERSION_MAGIC = "v1.8";
+static char const* MAP_AREA_MAGIC = "AREA";
+static char const* MAP_HEIGHT_MAGIC = "MHGT";
+static char const* MAP_LIQUID_MAGIC = "MLIQ";
+
+struct map_fileheader
+{
+ uint32 mapMagic;
+ uint32 versionMagic;
+ uint32 buildMagic;
+ uint32 areaMapOffset;
+ uint32 areaMapSize;
+ uint32 heightMapOffset;
+ uint32 heightMapSize;
+ uint32 liquidMapOffset;
+ uint32 liquidMapSize;
+ uint32 holesOffset;
+ uint32 holesSize;
+};
+
+#define MAP_AREA_NO_AREA 0x0001
+
+struct map_areaHeader
+{
+ uint32 fourcc;
+ uint16 flags;
+ uint16 gridArea;
+};
+
+#define MAP_HEIGHT_NO_HEIGHT 0x0001
+#define MAP_HEIGHT_AS_INT16 0x0002
+#define MAP_HEIGHT_AS_INT8 0x0004
+#define MAP_HEIGHT_HAS_FLIGHT_BOUNDS 0x0008
+
+struct map_heightHeader
+{
+ uint32 fourcc;
+ uint32 flags;
+ float gridHeight;
+ float gridMaxHeight;
+};
+
+#define MAP_LIQUID_TYPE_NO_WATER 0x00
+#define MAP_LIQUID_TYPE_WATER 0x01
+#define MAP_LIQUID_TYPE_OCEAN 0x02
+#define MAP_LIQUID_TYPE_MAGMA 0x04
+#define MAP_LIQUID_TYPE_SLIME 0x08
+
+#define MAP_LIQUID_TYPE_DARK_WATER 0x10
+#define MAP_LIQUID_TYPE_WMO_WATER 0x20
+
+
+#define MAP_LIQUID_NO_TYPE 0x0001
+#define MAP_LIQUID_NO_HEIGHT 0x0002
+
+struct map_liquidHeader
+{
+ uint32 fourcc;
+ uint16 flags;
+ uint16 liquidType;
+ uint8 offsetX;
+ uint8 offsetY;
+ uint8 width;
+ uint8 height;
+ float liquidLevel;
+};
+
+float selectUInt8StepStore(float maxDiff)
+{
+ return 255 / maxDiff;
+}
+
+float selectUInt16StepStore(float maxDiff)
+{
+ return 65535 / maxDiff;
+}
+// Temporary grid data store
+uint16 area_ids[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID];
+
+float V8[ADT_GRID_SIZE][ADT_GRID_SIZE];
+float V9[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1];
+uint16 uint16_V8[ADT_GRID_SIZE][ADT_GRID_SIZE];
+uint16 uint16_V9[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1];
+uint8 uint8_V8[ADT_GRID_SIZE][ADT_GRID_SIZE];
+uint8 uint8_V9[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1];
+
+uint16 liquid_entry[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID];
+uint8 liquid_flags[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID];
+bool liquid_show[ADT_GRID_SIZE][ADT_GRID_SIZE];
+float liquid_height[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1];
+
+int16 flight_box_max[3][3];
+int16 flight_box_min[3][3];
+
+bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int /*cell_y*/, int /*cell_x*/, uint32 build)
+{
+ ADT_file adt;
+
+ if (!adt.loadFile(inputPath))
+ return false;
+
+ adt_MCIN *cells = adt.a_grid->getMCIN();
+ if (!cells)
+ {
+ printf("Can't find cells in '%s'\n", inputPath.c_str());
+ return false;
+ }
+
+ memset(liquid_show, 0, sizeof(liquid_show));
+ memset(liquid_flags, 0, sizeof(liquid_flags));
+ memset(liquid_entry, 0, sizeof(liquid_entry));
+
+ // Prepare map header
+ map_fileheader map;
+ map.mapMagic = *reinterpret_cast<uint32 const*>(MAP_MAGIC);
+ map.versionMagic = *reinterpret_cast<uint32 const*>(MAP_VERSION_MAGIC);
+ map.buildMagic = build;
+
+ // Get area flags data
+ for (int i = 0; i < ADT_CELLS_PER_GRID; i++)
+ for (int j = 0; j < ADT_CELLS_PER_GRID; j++)
+ area_ids[i][j] = cells->getMCNK(i, j)->areaid;
+
+ //============================================
+ // Try pack area data
+ //============================================
+ bool fullAreaData = false;
+ uint32 areaId = area_ids[0][0];
+ for (int y = 0; y < ADT_CELLS_PER_GRID; ++y)
+ {
+ for (int x = 0; x < ADT_CELLS_PER_GRID; ++x)
+ {
+ if (area_ids[y][x] != areaId)
+ {
+ fullAreaData = true;
+ break;
+ }
+ }
+ }
+
+ map.areaMapOffset = sizeof(map);
+ map.areaMapSize = sizeof(map_areaHeader);
+
+ map_areaHeader areaHeader;
+ areaHeader.fourcc = *reinterpret_cast<uint32 const*>(MAP_AREA_MAGIC);
+ areaHeader.flags = 0;
+ if (fullAreaData)
+ {
+ areaHeader.gridArea = 0;
+ map.areaMapSize += sizeof(area_ids);
+ }
+ else
+ {
+ areaHeader.flags |= MAP_AREA_NO_AREA;
+ areaHeader.gridArea = static_cast<uint16>(areaId);
+ }
+
+ //
+ // Get Height map from grid
+ //
+ for (int i = 0; i<ADT_CELLS_PER_GRID; i++)
+ {
+ for (int j = 0; j<ADT_CELLS_PER_GRID; j++)
+ {
+ adt_MCNK * cell = cells->getMCNK(i, j);
+ if (!cell)
+ continue;
+ // Height values for triangles stored in order:
+ // 1 2 3 4 5 6 7 8 9
+ // 10 11 12 13 14 15 16 17
+ // 18 19 20 21 22 23 24 25 26
+ // 27 28 29 30 31 32 33 34
+ // . . . . . . . .
+ // For better get height values merge it to V9 and V8 map
+ // V9 height map:
+ // 1 2 3 4 5 6 7 8 9
+ // 18 19 20 21 22 23 24 25 26
+ // . . . . . . . .
+ // V8 height map:
+ // 10 11 12 13 14 15 16 17
+ // 27 28 29 30 31 32 33 34
+ // . . . . . . . .
+
+ // Set map height as grid height
+ for (int y = 0; y <= ADT_CELL_SIZE; y++)
+ {
+ int cy = i*ADT_CELL_SIZE + y;
+ for (int x = 0; x <= ADT_CELL_SIZE; x++)
+ {
+ int cx = j*ADT_CELL_SIZE + x;
+ V9[cy][cx] = cell->ypos;
+ }
+ }
+ for (int y = 0; y < ADT_CELL_SIZE; y++)
+ {
+ int cy = i*ADT_CELL_SIZE + y;
+ for (int x = 0; x < ADT_CELL_SIZE; x++)
+ {
+ int cx = j*ADT_CELL_SIZE + x;
+ V8[cy][cx] = cell->ypos;
+ }
+ }
+ // Get custom height
+ adt_MCVT *v = cell->getMCVT();
+ if (!v)
+ continue;
+ // get V9 height map
+ for (int y = 0; y <= ADT_CELL_SIZE; y++)
+ {
+ int cy = i*ADT_CELL_SIZE + y;
+ for (int x = 0; x <= ADT_CELL_SIZE; x++)
+ {
+ int cx = j*ADT_CELL_SIZE + x;
+ V9[cy][cx] += v->height_map[y*(ADT_CELL_SIZE * 2 + 1) + x];
+ }
+ }
+ // get V8 height map
+ for (int y = 0; y < ADT_CELL_SIZE; y++)
+ {
+ int cy = i*ADT_CELL_SIZE + y;
+ for (int x = 0; x < ADT_CELL_SIZE; x++)
+ {
+ int cx = j*ADT_CELL_SIZE + x;
+ V8[cy][cx] += v->height_map[y*(ADT_CELL_SIZE * 2 + 1) + ADT_CELL_SIZE + 1 + x];
+ }
+ }
+ }
+ }
+ //============================================
+ // Try pack height data
+ //============================================
+ float maxHeight = -20000;
+ float minHeight = 20000;
+ for (int y = 0; y<ADT_GRID_SIZE; y++)
+ {
+ for (int x = 0; x<ADT_GRID_SIZE; x++)
+ {
+ float h = V8[y][x];
+ if (maxHeight < h) maxHeight = h;
+ if (minHeight > h) minHeight = h;
+ }
+ }
+ for (int y = 0; y <= ADT_GRID_SIZE; y++)
+ {
+ for(int x = 0; x<= ADT_GRID_SIZE; x++)
+ {
+ float h = V9[y][x];
+ if (maxHeight < h) maxHeight = h;
+ if (minHeight > h) minHeight = h;
+ }
+ }
+
+ // Check for allow limit minimum height (not store height in deep ochean - allow save some memory)
+ if (CONF_allow_height_limit && minHeight < CONF_use_minHeight)
+ {
+ for (int y = 0; y<ADT_GRID_SIZE; y++)
+ for (int x = 0; x<ADT_GRID_SIZE; x++)
+ if (V8[y][x] < CONF_use_minHeight)
+ V8[y][x] = CONF_use_minHeight;
+ for (int y = 0; y <= ADT_GRID_SIZE; y++)
+ for (int x = 0; x <= ADT_GRID_SIZE; x++)
+ if (V9[y][x] < CONF_use_minHeight)
+ V9[y][x] = CONF_use_minHeight;
+ if (minHeight < CONF_use_minHeight)
+ minHeight = CONF_use_minHeight;
+ if (maxHeight < CONF_use_minHeight)
+ maxHeight = CONF_use_minHeight;
+ }
+
+ bool hasFlightBox = false;
+ if (adt_MFBO* mfbo = adt.a_grid->getMFBO())
+ {
+ memcpy(flight_box_max, &mfbo->max, sizeof(flight_box_max));
+ memcpy(flight_box_min, &mfbo->min, sizeof(flight_box_min));
+ hasFlightBox = true;
+ }
+
+ map.heightMapOffset = map.areaMapOffset + map.areaMapSize;
+ map.heightMapSize = sizeof(map_heightHeader);
+
+ map_heightHeader heightHeader;
+ heightHeader.fourcc = *reinterpret_cast<uint32 const*>(MAP_HEIGHT_MAGIC);
+ heightHeader.flags = 0;
+ heightHeader.gridHeight = minHeight;
+ heightHeader.gridMaxHeight = maxHeight;
+
+ if (maxHeight == minHeight)
+ heightHeader.flags |= MAP_HEIGHT_NO_HEIGHT;
+
+ // Not need store if flat surface
+ if (CONF_allow_float_to_int && (maxHeight - minHeight) < CONF_flat_height_delta_limit)
+ heightHeader.flags |= MAP_HEIGHT_NO_HEIGHT;
+
+ if (hasFlightBox)
+ {
+ heightHeader.flags |= MAP_HEIGHT_HAS_FLIGHT_BOUNDS;
+ map.heightMapSize += sizeof(flight_box_max) + sizeof(flight_box_min);
+ }
+
+ // Try store as packed in uint16 or uint8 values
+ if (!(heightHeader.flags & MAP_HEIGHT_NO_HEIGHT))
+ {
+ float step = 0;
+ // Try Store as uint values
+ if (CONF_allow_float_to_int)
+ {
+ float diff = maxHeight - minHeight;
+ if (diff < CONF_float_to_int8_limit) // As uint8 (max accuracy = CONF_float_to_int8_limit/256)
+ {
+ heightHeader.flags |= MAP_HEIGHT_AS_INT8;
+ step = selectUInt8StepStore(diff);
+ }
+ else if (diff<CONF_float_to_int16_limit) // As uint16 (max accuracy = CONF_float_to_int16_limit/65536)
+ {
+ heightHeader.flags |= MAP_HEIGHT_AS_INT16;
+ step = selectUInt16StepStore(diff);
+ }
+ }
+
+ // Pack it to int values if need
+ if (heightHeader.flags&MAP_HEIGHT_AS_INT8)
+ {
+ for (int y = 0; y<ADT_GRID_SIZE; y++)
+ for (int x = 0; x<ADT_GRID_SIZE; x++)
+ uint8_V8[y][x] = uint8((V8[y][x] - minHeight) * step + 0.5f);
+ for (int y = 0; y <= ADT_GRID_SIZE; y++)
+ for (int x = 0; x <= ADT_GRID_SIZE; x++)
+ uint8_V9[y][x] = uint8((V9[y][x] - minHeight) * step + 0.5f);
+ map.heightMapSize += sizeof(uint8_V9) + sizeof(uint8_V8);
+ }
+ else if (heightHeader.flags&MAP_HEIGHT_AS_INT16)
+ {
+ for (int y = 0; y<ADT_GRID_SIZE; y++)
+ for (int x = 0; x<ADT_GRID_SIZE; x++)
+ uint16_V8[y][x] = uint16((V8[y][x] - minHeight) * step + 0.5f);
+ for (int y = 0; y <= ADT_GRID_SIZE; y++)
+ for (int x = 0; x <= ADT_GRID_SIZE; x++)
+ uint16_V9[y][x] = uint16((V9[y][x] - minHeight) * step + 0.5f);
+ map.heightMapSize += sizeof(uint16_V9) + sizeof(uint16_V8);
+ }
+ else
+ map.heightMapSize += sizeof(V9) + sizeof(V8);
+ }
+
+ // Get from MCLQ chunk (old)
+ for (int i = 0; i < ADT_CELLS_PER_GRID; i++)
+ {
+ for (int j = 0; j < ADT_CELLS_PER_GRID; j++)
+ {
+ adt_MCNK *cell = cells->getMCNK(i, j);
+ if (!cell)
+ continue;
+
+ adt_MCLQ *liquid = cell->getMCLQ();
+ int count = 0;
+ if (!liquid || cell->sizeMCLQ <= 8)
+ continue;
+
+ for (int y = 0; y < ADT_CELL_SIZE; y++)
+ {
+ int cy = i * ADT_CELL_SIZE + y;
+ for (int x = 0; x < ADT_CELL_SIZE; x++)
+ {
+ int cx = j * ADT_CELL_SIZE + x;
+ if (liquid->flags[y][x] != 0x0F)
+ {
+ liquid_show[cy][cx] = true;
+ if (liquid->flags[y][x] & (1 << 7))
+ liquid_flags[i][j] |= MAP_LIQUID_TYPE_DARK_WATER;
+ ++count;
+ }
+ }
+ }
+
+ uint32 c_flag = cell->flags;
+ if (c_flag & (1 << 2))
+ {
+ liquid_entry[i][j] = 1;
+ liquid_flags[i][j] |= MAP_LIQUID_TYPE_WATER; // water
+ }
+ if (c_flag & (1 << 3))
+ {
+ liquid_entry[i][j] = 2;
+ liquid_flags[i][j] |= MAP_LIQUID_TYPE_OCEAN; // ocean
+ }
+ if (c_flag & (1 << 4))
+ {
+ liquid_entry[i][j] = 3;
+ liquid_flags[i][j] |= MAP_LIQUID_TYPE_MAGMA; // magma/slime
+ }
+
+ if (!count && liquid_flags[i][j])
+ fprintf(stderr, "Wrong liquid detect in MCLQ chunk");
+
+ for (int y = 0; y <= ADT_CELL_SIZE; y++)
+ {
+ int cy = i * ADT_CELL_SIZE + y;
+ for (int x = 0; x <= ADT_CELL_SIZE; x++)
+ {
+ int cx = j * ADT_CELL_SIZE + x;
+ liquid_height[cy][cx] = liquid->liquid[y][x].height;
+ }
+ }
+ }
+ }
+
+ // Get liquid map for grid (in WOTLK used MH2O chunk)
+ adt_MH2O * h2o = adt.a_grid->getMH2O();
+ if (h2o)
+ {
+ for (int i = 0; i < ADT_CELLS_PER_GRID; i++)
+ {
+ for(int j = 0; j < ADT_CELLS_PER_GRID; j++)
+ {
+ adt_liquid_header *h = h2o->getLiquidData(i,j);
+ if (!h)
+ continue;
+
+ int count = 0;
+ uint64 show = h2o->getLiquidShowMap(h);
+ for (int y = 0; y < h->height; y++)
+ {
+ int cy = i * ADT_CELL_SIZE + y + h->yOffset;
+ for (int x = 0; x < h->width; x++)
+ {
+ int cx = j * ADT_CELL_SIZE + x + h->xOffset;
+ if (show & 1)
+ {
+ liquid_show[cy][cx] = true;
+ ++count;
+ }
+ show >>= 1;
+ }
+ }
+
+ liquid_entry[i][j] = h->liquidType;
+ switch (LiqType[h->liquidType])
+ {
+ case LIQUID_TYPE_WATER: liquid_flags[i][j] |= MAP_LIQUID_TYPE_WATER; break;
+ case LIQUID_TYPE_OCEAN: liquid_flags[i][j] |= MAP_LIQUID_TYPE_OCEAN; break;
+ case LIQUID_TYPE_MAGMA: liquid_flags[i][j] |= MAP_LIQUID_TYPE_MAGMA; break;
+ case LIQUID_TYPE_SLIME: liquid_flags[i][j] |= MAP_LIQUID_TYPE_SLIME; break;
+ default:
+ printf("\nCan't find Liquid type %u for map %s\nchunk %d,%d\n", h->liquidType, inputPath.c_str(), i, j);
+ break;
+ }
+ // Dark water detect
+ if (LiqType[h->liquidType] == LIQUID_TYPE_OCEAN)
+ {
+ uint8 *lm = h2o->getLiquidLightMap(h);
+ if (!lm)
+ liquid_flags[i][j] |= MAP_LIQUID_TYPE_DARK_WATER;
+ }
+
+ if (!count && liquid_flags[i][j])
+ printf("Wrong liquid detect in MH2O chunk");
+
+ float *height = h2o->getLiquidHeightMap(h);
+ int pos = 0;
+ for (int y=0; y<=h->height;y++)
+ {
+ int cy = i*ADT_CELL_SIZE + y + h->yOffset;
+ for (int x=0; x<= h->width; x++)
+ {
+ int cx = j*ADT_CELL_SIZE + x + h->xOffset;
+ if (height)
+ liquid_height[cy][cx] = height[pos];
+ else
+ liquid_height[cy][cx] = h->heightLevel1;
+ pos++;
+ }
+ }
+ }
+ }
+ }
+ //============================================
+ // Pack liquid data
+ //============================================
+ uint8 type = liquid_flags[0][0];
+ bool fullType = false;
+ for (int y=0;y<ADT_CELLS_PER_GRID;y++)
+ {
+ for(int x=0;x<ADT_CELLS_PER_GRID;x++)
+ {
+ if (liquid_flags[y][x]!=type)
+ {
+ fullType = true;
+ y = ADT_CELLS_PER_GRID;
+ break;
+ }
+ }
+ }
+
+ map_liquidHeader liquidHeader;
+
+ // no water data (if all grid have 0 liquid type)
+ if (type == 0 && !fullType)
+ {
+ // No liquid data
+ map.liquidMapOffset = 0;
+ map.liquidMapSize = 0;
+ }
+ else
+ {
+ int minX = 255, minY = 255;
+ int maxX = 0, maxY = 0;
+ maxHeight = -20000;
+ minHeight = 20000;
+ for (int y=0; y<ADT_GRID_SIZE; y++)
+ {
+ for(int x=0; x<ADT_GRID_SIZE; x++)
+ {
+ if (liquid_show[y][x])
+ {
+ if (minX > x) minX = x;
+ if (maxX < x) maxX = x;
+ if (minY > y) minY = y;
+ if (maxY < y) maxY = y;
+ float h = liquid_height[y][x];
+ if (maxHeight < h) maxHeight = h;
+ if (minHeight > h) minHeight = h;
+ }
+ else
+ liquid_height[y][x] = CONF_use_minHeight;
+ }
+ }
+ map.liquidMapOffset = map.heightMapOffset + map.heightMapSize;
+ map.liquidMapSize = sizeof(map_liquidHeader);
+ liquidHeader.fourcc = *(uint32 const*)MAP_LIQUID_MAGIC;
+ liquidHeader.flags = 0;
+ liquidHeader.liquidType = 0;
+ liquidHeader.offsetX = minX;
+ liquidHeader.offsetY = minY;
+ liquidHeader.width = maxX - minX + 1 + 1;
+ liquidHeader.height = maxY - minY + 1 + 1;
+ liquidHeader.liquidLevel = minHeight;
+
+ if (maxHeight == minHeight)
+ liquidHeader.flags |= MAP_LIQUID_NO_HEIGHT;
+
+ // Not need store if flat surface
+ if (CONF_allow_float_to_int && (maxHeight - minHeight) < CONF_flat_liquid_delta_limit)
+ liquidHeader.flags |= MAP_LIQUID_NO_HEIGHT;
+
+ if (!fullType)
+ liquidHeader.flags |= MAP_LIQUID_NO_TYPE;
+
+ if (liquidHeader.flags & MAP_LIQUID_NO_TYPE)
+ liquidHeader.liquidType = type;
+ else
+ map.liquidMapSize += sizeof(liquid_entry) + sizeof(liquid_flags);
+
+ if (!(liquidHeader.flags & MAP_LIQUID_NO_HEIGHT))
+ map.liquidMapSize += sizeof(float)*liquidHeader.width*liquidHeader.height;
+ }
+
+ // map hole info
+ uint16 holes[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID];
+
+ if (map.liquidMapOffset)
+ map.holesOffset = map.liquidMapOffset + map.liquidMapSize;
+ else
+ map.holesOffset = map.heightMapOffset + map.heightMapSize;
+
+ memset(holes, 0, sizeof(holes));
+ bool hasHoles = false;
+
+ for (int i = 0; i < ADT_CELLS_PER_GRID; ++i)
+ {
+ for (int j = 0; j < ADT_CELLS_PER_GRID; ++j)
+ {
+ adt_MCNK * cell = cells->getMCNK(i,j);
+ if (!cell)
+ continue;
+ holes[i][j] = cell->holes;
+ if (!hasHoles && cell->holes != 0)
+ hasHoles = true;
+ }
+ }
+
+ if (hasHoles)
+ map.holesSize = sizeof(holes);
+ else
+ map.holesSize = 0;
+
+ // Ok all data prepared - store it
+ FILE* output = fopen(outputPath.c_str(), "wb");
+ if (!output)
+ {
+ printf("Can't create the output file '%s'\n", outputPath.c_str());
+ return false;
+ }
+ fwrite(&map, sizeof(map), 1, output);
+ // Store area data
+ fwrite(&areaHeader, sizeof(areaHeader), 1, output);
+ if (!(areaHeader.flags&MAP_AREA_NO_AREA))
+ fwrite(area_ids, sizeof(area_ids), 1, output);
+
+ // Store height data
+ fwrite(&heightHeader, sizeof(heightHeader), 1, output);
+ if (!(heightHeader.flags & MAP_HEIGHT_NO_HEIGHT))
+ {
+ if (heightHeader.flags & MAP_HEIGHT_AS_INT16)
+ {
+ fwrite(uint16_V9, sizeof(uint16_V9), 1, output);
+ fwrite(uint16_V8, sizeof(uint16_V8), 1, output);
+ }
+ else if (heightHeader.flags & MAP_HEIGHT_AS_INT8)
+ {
+ fwrite(uint8_V9, sizeof(uint8_V9), 1, output);
+ fwrite(uint8_V8, sizeof(uint8_V8), 1, output);
+ }
+ else
+ {
+ fwrite(V9, sizeof(V9), 1, output);
+ fwrite(V8, sizeof(V8), 1, output);
+ }
+ }
+
+ if (heightHeader.flags & MAP_HEIGHT_HAS_FLIGHT_BOUNDS)
+ {
+ fwrite(flight_box_max, sizeof(flight_box_max), 1, output);
+ fwrite(flight_box_min, sizeof(flight_box_min), 1, output);
+ }
+
+ // Store liquid data if need
+ if (map.liquidMapOffset)
+ {
+ fwrite(&liquidHeader, sizeof(liquidHeader), 1, output);
+ if (!(liquidHeader.flags&MAP_LIQUID_NO_TYPE))
+ {
+ fwrite(liquid_entry, sizeof(liquid_entry), 1, output);
+ fwrite(liquid_flags, sizeof(liquid_flags), 1, output);
+ }
+ if (!(liquidHeader.flags&MAP_LIQUID_NO_HEIGHT))
+ {
+ for (int y=0; y<liquidHeader.height;y++)
+ fwrite(&liquid_height[y+liquidHeader.offsetY][liquidHeader.offsetX], sizeof(float), liquidHeader.width, output);
+ }
+ }
+
+ // store hole data
+ if (hasHoles)
+ fwrite(holes, map.holesSize, 1, output);
+
+ fclose(output);
+
+ return true;
+}
+
+void ExtractMapsFromMpq(uint32 build)
+{
+ std::string mpqFileName;
+ std::string outputFileName;
+ std::string mpqMapName;
+
+ printf("Extracting maps...\n");
+
+ uint32 map_count = ReadMapDBC();
+
+ ReadLiquidTypeTableDBC();
+
+ std::string path = output_path;
+ path += "/maps/";
+ CreateDir(path);
+
+ printf("Convert map files\n");
+ for(uint32 z = 0; z < map_count; ++z)
+ {
+ printf("Extract %s (%d/%u) \n", map_ids[z].name, z+1, map_count);
+ // Loadup map grid data
+ mpqMapName = Trinity::StringFormat("World\\Maps\\%s\\%s.wdt", map_ids[z].name, map_ids[z].name);
+ WDT_file wdt;
+ if (!wdt.loadFile(mpqMapName, false))
+ {
+// printf("Error loading %s map wdt data\n", map_ids[z].name);
+ continue;
+ }
+
+ for(uint32 y = 0; y < WDT_MAP_SIZE; ++y)
+ {
+ for(uint32 x = 0; x < WDT_MAP_SIZE; ++x)
+ {
+ if (!wdt.main->adt_list[y][x].exist)
+ continue;
+ mpqFileName = Trinity::StringFormat("World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
+ outputFileName = Trinity::StringFormat("%s/maps/%03u%02u%02u.map", output_path, map_ids[z].id, y, x);
+ ConvertADT(mpqFileName, outputFileName, y, x, build);
+ }
+ // draw progress bar
+ printf("Processing........................%d%%\r", (100 * (y+1)) / WDT_MAP_SIZE);
+ }
+ }
+ printf("\n");
+ delete[] map_ids;
+}
+
+bool ExtractFile( char const* mpq_name, std::string const& filename )
+{
+ FILE *output = fopen(filename.c_str(), "wb");
+ if(!output)
+ {
+ printf("Can't create the output file '%s'\n", filename.c_str());
+ return false;
+ }
+ MPQFile m(mpq_name);
+ if(!m.isEof())
+ fwrite(m.getPointer(), 1, m.getSize(), output);
+
+ fclose(output);
+ return true;
+}
+
+void ExtractDBCFiles(int locale, bool basicLocale)
+{
+ printf("Extracting dbc files...\n");
+
+ std::set<std::string> dbcfiles;
+
+ // get DBC file list
+ for(ArchiveSet::iterator i = gOpenArchives.begin(); i != gOpenArchives.end();++i)
+ {
+ vector<string> files;
+ (*i)->GetFileListTo(files);
+ for (vector<string>::iterator iter = files.begin(); iter != files.end(); ++iter)
+ if (iter->rfind(".dbc") == iter->length() - strlen(".dbc"))
+ dbcfiles.insert(*iter);
+ }
+
+ std::string path = output_path;
+ path += "/dbc/";
+ CreateDir(path);
+ if(!basicLocale)
+ {
+ path += langs[locale];
+ path += "/";
+ CreateDir(path);
+ }
+
+ // extract Build info file
+ {
+ string mpq_name = std::string("component.wow-") + langs[locale] + ".txt";
+ string filename = path + mpq_name;
+
+ ExtractFile(mpq_name.c_str(), filename);
+ }
+
+ // extract DBCs
+ uint32 count = 0;
+ for (set<string>::iterator iter = dbcfiles.begin(); iter != dbcfiles.end(); ++iter)
+ {
+ string filename = path;
+ filename += (iter->c_str() + strlen("DBFilesClient\\"));
+
+ if(FileExists(filename.c_str()))
+ continue;
+
+ if (ExtractFile(iter->c_str(), filename))
+ ++count;
+ }
+ printf("Extracted %u DBC files\n\n", count);
+}
+
+void LoadLocaleMPQFiles(int const locale)
+{
+ char filename[512];
+
+ sprintf(filename,"%s/Data/%s/locale-%s.MPQ", input_path, langs[locale], langs[locale]);
+ new MPQArchive(filename);
+
+ for(int i = 1; i < 5; ++i)
+ {
+ char ext[3] = "";
+ if(i > 1)
+ sprintf(ext, "-%i", i);
+
+ sprintf(filename,"%s/Data/%s/patch-%s%s.MPQ", input_path, langs[locale], langs[locale], ext);
+ if(FileExists(filename))
+ new MPQArchive(filename);
+ }
+}
+
+void LoadCommonMPQFiles()
+{
+ char filename[512];
+ int count = sizeof(CONF_mpq_list)/sizeof(char*);
+ for(int i = 0; i < count; ++i)
+ {
+ sprintf(filename, "%s/Data/%s", input_path, CONF_mpq_list[i]);
+ if(FileExists(filename))
+ new MPQArchive(filename);
+ }
+}
+
+inline void CloseMPQFiles()
+{
+ for(ArchiveSet::iterator j = gOpenArchives.begin(); j != gOpenArchives.end();++j) (*j)->close();
+ gOpenArchives.clear();
+}
+
+int main(int argc, char * arg[])
+{
+ printf("Map & DBC Extractor\n");
+ printf("===================\n\n");
+
+ HandleArgs(argc, arg);
+
+ int FirstLocale = -1;
+ uint32 build = 0;
+
+ for (int i = 0; i < LANG_COUNT; i++)
+ {
+ char tmp1[512];
+ sprintf(tmp1, "%s/Data/%s/locale-%s.MPQ", input_path, langs[i], langs[i]);
+ if (FileExists(tmp1))
+ {
+ printf("Detected locale: %s\n", langs[i]);
+
+ //Open MPQs
+ LoadLocaleMPQFiles(i);
+
+ if((CONF_extract & EXTRACT_DBC) == 0)
+ {
+ FirstLocale = i;
+ build = ReadBuild(FirstLocale);
+ printf("Detected client build: %u\n", build);
+ break;
+ }
+
+ //Extract DBC files
+ if(FirstLocale < 0)
+ {
+ FirstLocale = i;
+ build = ReadBuild(FirstLocale);
+ printf("Detected client build: %u\n", build);
+ ExtractDBCFiles(i, true);
+ }
+ else
+ ExtractDBCFiles(i, false);
+
+ //Close MPQs
+ CloseMPQFiles();
+ }
+ }
+
+ if(FirstLocale < 0)
+ {
+ printf("No locales detected\n");
+ return 0;
+ }
+
+ if (CONF_extract & EXTRACT_MAP)
+ {
+ printf("Using locale: %s\n", langs[FirstLocale]);
+
+ // Open MPQs
+ LoadLocaleMPQFiles(FirstLocale);
+ LoadCommonMPQFiles();
+
+ // Extract maps
+ ExtractMapsFromMpq(build);
+
+ // Close MPQs
+ CloseMPQFiles();
+ }
+
+ return 0;
+}
diff --git a/src/tools/map_extractor/adt.cpp b/src/tools/map_extractor/adt.cpp
new file mode 100644
index 0000000000..257d0171aa
--- /dev/null
+++ b/src/tools/map_extractor/adt.cpp
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#define _CRT_SECURE_NO_DEPRECATE
+
+#include "adt.h"
+
+// Helper
+int holetab_h[4] = { 0x1111, 0x2222, 0x4444, 0x8888 };
+int holetab_v[4] = { 0x000F, 0x00F0, 0x0F00, 0xF000 };
+
+u_map_fcc MHDRMagic = { { 'R','D','H','M' } };
+u_map_fcc MCINMagic = { { 'N','I','C','M' } };
+u_map_fcc MH2OMagic = { { 'O','2','H','M' } };
+u_map_fcc MCNKMagic = { { 'K','N','C','M' } };
+u_map_fcc MCVTMagic = { { 'T','V','C','M' } };
+u_map_fcc MCLQMagic = { { 'Q','L','C','M' } };
+u_map_fcc MFBOMagic = { { 'O','B','F','M' } };
+
+bool isHole(int holes, int i, int j)
+{
+ int testi = i / 2;
+ int testj = j / 4;
+ if(testi > 3) testi = 3;
+ if(testj > 3) testj = 3;
+ return (holes & holetab_h[testi] & holetab_v[testj]) != 0;
+}
+
+//
+// Adt file loader class
+//
+ADT_file::ADT_file()
+{
+ a_grid = 0;
+}
+
+ADT_file::~ADT_file()
+{
+ free();
+}
+
+void ADT_file::free()
+{
+ a_grid = 0;
+ FileLoader::free();
+}
+
+//
+// Adt file check function
+//
+bool ADT_file::prepareLoadedData()
+{
+ // Check parent
+ if (!FileLoader::prepareLoadedData())
+ return false;
+
+ // Check and prepare MHDR
+ a_grid = (adt_MHDR *)(GetData()+8+version->size);
+ if (!a_grid->prepareLoadedData())
+ return false;
+
+ return true;
+}
+
+bool adt_MHDR::prepareLoadedData()
+{
+ if (fcc != MHDRMagic.fcc)
+ return false;
+
+ if (size != sizeof(adt_MHDR) - 8)
+ return false;
+
+ // Check and prepare MCIN
+ if (offsMCIN && !getMCIN()->prepareLoadedData())
+ return false;
+
+ // Check and prepare MH2O
+ if (offsMH2O && !getMH2O()->prepareLoadedData())
+ return false;
+
+ if (offsMFBO && flags & 1 && !getMFBO()->prepareLoadedData())
+ return false;
+
+ return true;
+}
+
+bool adt_MCIN::prepareLoadedData()
+{
+ if (fcc != MCINMagic.fcc)
+ return false;
+
+ // Check cells data
+ for (int i=0; i<ADT_CELLS_PER_GRID;i++)
+ for (int j=0; j<ADT_CELLS_PER_GRID;j++)
+ if (cells[i][j].offsMCNK && !getMCNK(i,j)->prepareLoadedData())
+ return false;
+
+ return true;
+}
+
+bool adt_MH2O::prepareLoadedData()
+{
+ if (fcc != MH2OMagic.fcc)
+ return false;
+
+ // Check liquid data
+// for (int i=0; i<ADT_CELLS_PER_GRID;i++)
+// for (int j=0; j<ADT_CELLS_PER_GRID;j++)
+
+ return true;
+}
+
+bool adt_MCNK::prepareLoadedData()
+{
+ if (fcc != MCNKMagic.fcc)
+ return false;
+
+ // Check height map
+ if (offsMCVT && !getMCVT()->prepareLoadedData())
+ return false;
+ // Check liquid data
+ if (offsMCLQ && !getMCLQ()->prepareLoadedData())
+ return false;
+
+ return true;
+}
+
+bool adt_MCVT::prepareLoadedData()
+{
+ if (fcc != MCVTMagic.fcc)
+ return false;
+
+ if (size != sizeof(adt_MCVT)-8)
+ return false;
+
+ return true;
+}
+
+bool adt_MCLQ::prepareLoadedData()
+{
+ if (fcc != MCLQMagic.fcc)
+ return false;
+
+ return true;
+}
+
+bool adt_MFBO::prepareLoadedData()
+{
+ return fcc == MFBOMagic.fcc;
+}
diff --git a/src/tools/map_extractor/adt.h b/src/tools/map_extractor/adt.h
new file mode 100644
index 0000000000..94b830c4ef
--- /dev/null
+++ b/src/tools/map_extractor/adt.h
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef ADT_H
+#define ADT_H
+
+#include "loadlib.h"
+
+#define TILESIZE (533.33333f)
+#define CHUNKSIZE ((TILESIZE) / 16.0f)
+#define UNITSIZE (CHUNKSIZE / 8.0f)
+
+enum LiquidType
+{
+ LIQUID_TYPE_WATER = 0,
+ LIQUID_TYPE_OCEAN = 1,
+ LIQUID_TYPE_MAGMA = 2,
+ LIQUID_TYPE_SLIME = 3
+};
+
+//**************************************************************************************
+// ADT file class
+//**************************************************************************************
+#define ADT_CELLS_PER_GRID 16
+#define ADT_CELL_SIZE 8
+#define ADT_GRID_SIZE (ADT_CELLS_PER_GRID*ADT_CELL_SIZE)
+
+//
+// Adt file height map chunk
+//
+class adt_MCVT
+{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+ uint32 size;
+public:
+ float height_map[(ADT_CELL_SIZE+1)*(ADT_CELL_SIZE+1)+ADT_CELL_SIZE*ADT_CELL_SIZE];
+
+ bool prepareLoadedData();
+};
+
+//
+// Adt file liquid map chunk (old)
+//
+class adt_MCLQ
+{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+ float height1;
+ float height2;
+ struct liquid_data{
+ uint32 light;
+ float height;
+ } liquid[ADT_CELL_SIZE+1][ADT_CELL_SIZE+1];
+
+ // 1<<0 - ochen
+ // 1<<1 - lava/slime
+ // 1<<2 - water
+ // 1<<6 - all water
+ // 1<<7 - dark water
+ // == 0x0F - not show liquid
+ uint8 flags[ADT_CELL_SIZE][ADT_CELL_SIZE];
+ uint8 data[84];
+ bool prepareLoadedData();
+};
+
+//
+// Adt file cell chunk
+//
+class adt_MCNK
+{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+ uint32 flags;
+ uint32 ix;
+ uint32 iy;
+ uint32 nLayers;
+ uint32 nDoodadRefs;
+ uint32 offsMCVT; // height map
+ uint32 offsMCNR; // Normal vectors for each vertex
+ uint32 offsMCLY; // Texture layer definitions
+ uint32 offsMCRF; // A list of indices into the parent file's MDDF chunk
+ uint32 offsMCAL; // Alpha maps for additional texture layers
+ uint32 sizeMCAL;
+ uint32 offsMCSH; // Shadow map for static shadows on the terrain
+ uint32 sizeMCSH;
+ uint32 areaid;
+ uint32 nMapObjRefs;
+ uint32 holes;
+ uint16 s[2];
+ uint32 data1;
+ uint32 data2;
+ uint32 data3;
+ uint32 predTex;
+ uint32 nEffectDoodad;
+ uint32 offsMCSE;
+ uint32 nSndEmitters;
+ uint32 offsMCLQ; // Liqid level (old)
+ uint32 sizeMCLQ; //
+ float zpos;
+ float xpos;
+ float ypos;
+ uint32 offsMCCV; // offsColorValues in WotLK
+ uint32 props;
+ uint32 effectId;
+
+ bool prepareLoadedData();
+ adt_MCVT *getMCVT()
+ {
+ if (offsMCVT)
+ return (adt_MCVT *)((uint8 *)this + offsMCVT);
+ return 0;
+ }
+ adt_MCLQ *getMCLQ()
+ {
+ if (offsMCLQ)
+ return (adt_MCLQ *)((uint8 *)this + offsMCLQ);
+ return 0;
+ }
+};
+
+//
+// Adt file grid chunk
+//
+class adt_MCIN
+{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+ struct adt_CELLS{
+ uint32 offsMCNK;
+ uint32 size;
+ uint32 flags;
+ uint32 asyncId;
+ } cells[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID];
+
+ bool prepareLoadedData();
+ // offset from begin file (used this-84)
+ adt_MCNK *getMCNK(int x, int y)
+ {
+ if (cells[x][y].offsMCNK)
+ return (adt_MCNK *)((uint8 *)this + cells[x][y].offsMCNK - 84);
+ return 0;
+ }
+};
+
+#define ADT_LIQUID_HEADER_FULL_LIGHT 0x01
+#define ADT_LIQUID_HEADER_NO_HIGHT 0x02
+
+struct adt_liquid_header{
+ uint16 liquidType; // Index from LiquidType.dbc
+ uint16 formatFlags;
+ float heightLevel1;
+ float heightLevel2;
+ uint8 xOffset;
+ uint8 yOffset;
+ uint8 width;
+ uint8 height;
+ uint32 offsData2a;
+ uint32 offsData2b;
+};
+
+//
+// Adt file liquid data chunk (new)
+//
+class adt_MH2O
+{
+public:
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+ uint32 size;
+
+ struct adt_LIQUID{
+ uint32 offsData1;
+ uint32 used;
+ uint32 offsData2;
+ } liquid[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID];
+
+ bool prepareLoadedData();
+
+ adt_liquid_header *getLiquidData(int x, int y)
+ {
+ if (liquid[x][y].used && liquid[x][y].offsData1)
+ return (adt_liquid_header *)((uint8*)this + 8 + liquid[x][y].offsData1);
+ return 0;
+ }
+
+ float *getLiquidHeightMap(adt_liquid_header *h)
+ {
+ if (h->formatFlags & ADT_LIQUID_HEADER_NO_HIGHT)
+ return 0;
+ if (h->offsData2b)
+ return (float *)((uint8*)this + 8 + h->offsData2b);
+ return 0;
+ }
+
+ uint8 *getLiquidLightMap(adt_liquid_header *h)
+ {
+ if (h->formatFlags&ADT_LIQUID_HEADER_FULL_LIGHT)
+ return 0;
+ if (h->offsData2b)
+ {
+ if (h->formatFlags & ADT_LIQUID_HEADER_NO_HIGHT)
+ return (uint8 *)((uint8*)this + 8 + h->offsData2b);
+ return (uint8 *)((uint8*)this + 8 + h->offsData2b + (h->width+1)*(h->height+1)*4);
+ }
+ return 0;
+ }
+
+ uint32 *getLiquidFullLightMap(adt_liquid_header *h)
+ {
+ if (!(h->formatFlags&ADT_LIQUID_HEADER_FULL_LIGHT))
+ return 0;
+ if (h->offsData2b)
+ {
+ if (h->formatFlags & ADT_LIQUID_HEADER_NO_HIGHT)
+ return (uint32 *)((uint8*)this + 8 + h->offsData2b);
+ return (uint32 *)((uint8*)this + 8 + h->offsData2b + (h->width+1)*(h->height+1)*4);
+ }
+ return 0;
+ }
+
+ uint64 getLiquidShowMap(adt_liquid_header *h)
+ {
+ if (h->offsData2a)
+ return *((uint64 *)((uint8*)this + 8 + h->offsData2a));
+ else
+ return 0xFFFFFFFFFFFFFFFFuLL;
+ }
+
+};
+
+// Adt file min/max height chunk
+//
+class adt_MFBO
+{
+ union
+ {
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+ struct plane
+ {
+ int16 coords[9];
+ };
+ plane max;
+ plane min;
+
+ bool prepareLoadedData();
+};
+
+//
+// Adt file header chunk
+//
+class adt_MHDR
+{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+
+ uint32 flags;
+ uint32 offsMCIN; // MCIN
+ uint32 offsTex; // MTEX
+ uint32 offsModels; // MMDX
+ uint32 offsModelsIds; // MMID
+ uint32 offsMapObejcts; // MWMO
+ uint32 offsMapObejctsIds; // MWID
+ uint32 offsDoodsDef; // MDDF
+ uint32 offsObjectsDef; // MODF
+ uint32 offsMFBO; // MFBO
+ uint32 offsMH2O; // MH2O
+ uint32 data1;
+ uint32 data2;
+ uint32 data3;
+ uint32 data4;
+ uint32 data5;
+public:
+ bool prepareLoadedData();
+ adt_MCIN* getMCIN()
+ {
+ return reinterpret_cast<adt_MCIN*>(reinterpret_cast<uint8*>(&flags) + offsMCIN);
+ }
+ adt_MH2O* getMH2O()
+ {
+ if (offsMH2O)
+ return reinterpret_cast<adt_MH2O*>(reinterpret_cast<uint8*>(&flags) + offsMH2O);
+ return nullptr;
+ }
+ adt_MFBO* getMFBO()
+ {
+ if (flags & 1 && offsMFBO)
+ return reinterpret_cast<adt_MFBO*>(reinterpret_cast<uint8*>(&flags) + offsMFBO);
+ return nullptr;
+ }
+};
+
+class ADT_file : public FileLoader{
+public:
+ bool prepareLoadedData();
+ ADT_file();
+ ~ADT_file();
+ void free();
+
+ adt_MHDR *a_grid;
+};
+
+#endif
diff --git a/src/tools/map_extractor/dbcfile.cpp b/src/tools/map_extractor/dbcfile.cpp
new file mode 100644
index 0000000000..59217aaed5
--- /dev/null
+++ b/src/tools/map_extractor/dbcfile.cpp
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#define _CRT_SECURE_NO_DEPRECATE
+
+#include "dbcfile.h"
+#include "mpq_libmpq04.h"
+
+DBCFile::DBCFile(const std::string& filename):
+ filename(filename), recordSize(0), recordCount(0), fieldCount(0), stringSize(0), data(NULL), stringTable(NULL)
+{
+
+}
+
+bool DBCFile::open()
+{
+ MPQFile f(filename.c_str());
+ char header[4];
+ unsigned int na,nb,es,ss;
+
+ if(f.read(header,4)!=4) // Number of records
+ return false;
+
+ if(header[0]!='W' || header[1]!='D' || header[2]!='B' || header[3]!='C')
+ return false;
+
+ if(f.read(&na,4)!=4) // Number of records
+ return false;
+ if(f.read(&nb,4)!=4) // Number of fields
+ return false;
+ if(f.read(&es,4)!=4) // Size of a record
+ return false;
+ if(f.read(&ss,4)!=4) // String size
+ return false;
+
+ recordSize = es;
+ recordCount = na;
+ fieldCount = nb;
+ stringSize = ss;
+ if(fieldCount*4 != recordSize)
+ return false;
+
+ data = new unsigned char[recordSize*recordCount+stringSize];
+ stringTable = data + recordSize*recordCount;
+
+ size_t data_size = recordSize*recordCount+stringSize;
+ if(f.read(data,data_size)!=data_size)
+ return false;
+ f.close();
+ return true;
+}
+DBCFile::~DBCFile()
+{
+ delete [] data;
+}
+
+DBCFile::Record DBCFile::getRecord(size_t id)
+{
+ assert(data);
+ return Record(*this, data + id*recordSize);
+}
+
+size_t DBCFile::getMaxId()
+{
+ assert(data);
+
+ size_t maxId = 0;
+ for(size_t i = 0; i < getRecordCount(); ++i)
+ {
+ if(maxId < getRecord(i).getUInt(0))
+ maxId = getRecord(i).getUInt(0);
+ }
+ return maxId;
+}
+
+DBCFile::Iterator DBCFile::begin()
+{
+ assert(data);
+ return Iterator(*this, data);
+}
+DBCFile::Iterator DBCFile::end()
+{
+ assert(data);
+ return Iterator(*this, stringTable);
+}
+
diff --git a/src/tools/map_extractor/dbcfile.h b/src/tools/map_extractor/dbcfile.h
new file mode 100644
index 0000000000..37993f20a6
--- /dev/null
+++ b/src/tools/map_extractor/dbcfile.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef DBCFILE_H
+#define DBCFILE_H
+#include <cassert>
+#include <string>
+
+class DBCFile
+{
+public:
+ DBCFile(const std::string &filename);
+ ~DBCFile();
+
+ // Open database. It must be openened before it can be used.
+ bool open();
+
+ // Database exceptions
+ class Exception
+ {
+ public:
+ Exception(const std::string &message): message(message)
+ { }
+ virtual ~Exception()
+ { }
+ const std::string &getMessage() {return message;}
+ private:
+ std::string message;
+ };
+ class NotFound: public Exception
+ {
+ public:
+ NotFound(): Exception("Key was not found")
+ { }
+ };
+ // Iteration over database
+ class Iterator;
+ class Record
+ {
+ public:
+ float getFloat(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<float*>(offset+field*4);
+ }
+ unsigned int getUInt(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<unsigned int*>(offset+field*4);
+ }
+ int getInt(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<int*>(offset+field*4);
+ }
+ const char *getString(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ size_t stringOffset = getUInt(field);
+ assert(stringOffset < file.stringSize);
+ return reinterpret_cast<char*>(file.stringTable + stringOffset);
+ }
+ private:
+ Record(DBCFile &file, unsigned char *offset): file(file), offset(offset) {}
+ DBCFile &file;
+ unsigned char *offset;
+
+ friend class DBCFile;
+ friend class DBCFile::Iterator;
+ };
+ /** Iterator that iterates over records
+ */
+ class Iterator
+ {
+ public:
+ Iterator(DBCFile &file, unsigned char *offset):
+ record(file, offset) {}
+ /// Advance (prefix only)
+ Iterator & operator++() {
+ record.offset += record.file.recordSize;
+ return *this;
+ }
+ /// Return address of current instance
+ Record const & operator*() const { return record; }
+ const Record* operator->() const {
+ return &record;
+ }
+ /// Comparison
+ bool operator==(const Iterator &b) const
+ {
+ return record.offset == b.record.offset;
+ }
+ bool operator!=(const Iterator &b) const
+ {
+ return record.offset != b.record.offset;
+ }
+ private:
+ Record record;
+ };
+
+ // Get record by id
+ Record getRecord(size_t id);
+ /// Get begin iterator over records
+ Iterator begin();
+ /// Get begin iterator over records
+ Iterator end();
+ /// Trivial
+ size_t getRecordCount() const { return recordCount;}
+ size_t getFieldCount() const { return fieldCount; }
+ size_t getMaxId();
+private:
+ std::string filename;
+ size_t recordSize;
+ size_t recordCount;
+ size_t fieldCount;
+ size_t stringSize;
+ unsigned char *data;
+ unsigned char *stringTable;
+};
+
+#endif
+
diff --git a/src/tools/map_extractor/loadlib.cpp b/src/tools/map_extractor/loadlib.cpp
new file mode 100644
index 0000000000..1219ef78b5
--- /dev/null
+++ b/src/tools/map_extractor/loadlib.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#define _CRT_SECURE_NO_DEPRECATE
+
+#include "loadlib.h"
+#include "mpq_libmpq04.h"
+#include <cstdio>
+
+class MPQFile;
+
+u_map_fcc MverMagic = { {'R','E','V','M'} };
+
+FileLoader::FileLoader()
+{
+ data = 0;
+ data_size = 0;
+ version = 0;
+}
+
+FileLoader::~FileLoader()
+{
+ free();
+}
+
+bool FileLoader::loadFile(std::string const& fileName, bool log)
+{
+ free();
+ MPQFile mf(fileName.c_str());
+ if(mf.isEof())
+ {
+ if (log)
+ printf("No such file %s\n", fileName.c_str());
+ return false;
+ }
+
+ data_size = mf.getSize();
+
+ data = new uint8 [data_size];
+ mf.read(data, data_size);
+ mf.close();
+ if (prepareLoadedData())
+ return true;
+
+ printf("Error loading %s", fileName.c_str());
+ mf.close();
+ free();
+ return false;
+}
+
+bool FileLoader::prepareLoadedData()
+{
+ // Check version
+ version = (file_MVER *) data;
+ if (version->fcc != MverMagic.fcc)
+ return false;
+ if (version->ver != FILE_FORMAT_VERSION)
+ return false;
+ return true;
+}
+
+void FileLoader::free()
+{
+ if (data) delete[] data;
+ data = 0;
+ data_size = 0;
+ version = 0;
+}
diff --git a/src/tools/map_extractor/loadlib/loadlib.h b/src/tools/map_extractor/loadlib/loadlib.h
new file mode 100644
index 0000000000..e500f25e6e
--- /dev/null
+++ b/src/tools/map_extractor/loadlib/loadlib.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef LOAD_LIB_H
+#define LOAD_LIB_H
+
+#include <string>
+
+#ifdef _WIN32
+typedef __int64 int64;
+typedef __int32 int32;
+typedef __int16 int16;
+typedef __int8 int8;
+typedef unsigned __int64 uint64;
+typedef unsigned __int32 uint32;
+typedef unsigned __int16 uint16;
+typedef unsigned __int8 uint8;
+#else
+#include <stdint.h>
+#ifndef uint64_t
+#ifdef __linux__
+#include <linux/types.h>
+#endif
+#endif
+typedef int64_t int64;
+typedef int32_t int32;
+typedef int16_t int16;
+typedef int8_t int8;
+typedef uint64_t uint64;
+typedef uint32_t uint32;
+typedef uint16_t uint16;
+typedef uint8_t uint8;
+#endif
+
+#define FILE_FORMAT_VERSION 18
+
+union u_map_fcc
+{
+ char fcc_txt[4];
+ uint32 fcc;
+};
+
+//
+// File version chunk
+//
+struct file_MVER
+{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+ uint32 size;
+ uint32 ver;
+};
+
+class FileLoader{
+ uint8 *data;
+ uint32 data_size;
+public:
+ virtual bool prepareLoadedData();
+ uint8 *GetData() {return data;}
+ uint32 GetDataSize() {return data_size;}
+
+ file_MVER *version;
+ FileLoader();
+ ~FileLoader();
+ bool loadFile(std::string const& filename, bool log = true);
+ virtual void free();
+};
+#endif
diff --git a/src/tools/map_extractor/mpq_libmpq.cpp b/src/tools/map_extractor/mpq_libmpq.cpp
new file mode 100644
index 0000000000..be8164f442
--- /dev/null
+++ b/src/tools/map_extractor/mpq_libmpq.cpp
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "mpq_libmpq04.h"
+#include <deque>
+#include <cstdio>
+
+ArchiveSet gOpenArchives;
+
+MPQArchive::MPQArchive(const char* filename)
+{
+ int result = libmpq__archive_open(&mpq_a, filename, -1);
+ printf("Opening %s\n", filename);
+ if(result) {
+ switch(result) {
+ case LIBMPQ_ERROR_OPEN :
+ printf("Error opening archive '%s': Does file really exist?\n", filename);
+ break;
+ case LIBMPQ_ERROR_FORMAT : /* bad file format */
+ printf("Error opening archive '%s': Bad file format\n", filename);
+ break;
+ case LIBMPQ_ERROR_SEEK : /* seeking in file failed */
+ printf("Error opening archive '%s': Seeking in file failed\n", filename);
+ break;
+ case LIBMPQ_ERROR_READ : /* Read error in archive */
+ printf("Error opening archive '%s': Read error in archive\n", filename);
+ break;
+ case LIBMPQ_ERROR_MALLOC : /* maybe not enough memory? :) */
+ printf("Error opening archive '%s': Maybe not enough memory\n", filename);
+ break;
+ default:
+ printf("Error opening archive '%s': Unknown error\n", filename);
+ break;
+ }
+ return;
+ }
+ gOpenArchives.push_front(this);
+}
+
+void MPQArchive::close()
+{
+ //gOpenArchives.erase(erase(&mpq_a);
+ libmpq__archive_close(mpq_a);
+}
+
+MPQFile::MPQFile(const char* filename):
+ eof(false),
+ buffer(0),
+ pointer(0),
+ size(0)
+{
+ for(ArchiveSet::iterator i=gOpenArchives.begin(); i!=gOpenArchives.end();++i)
+ {
+ mpq_archive *mpq_a = (*i)->mpq_a;
+
+ uint32_t filenum;
+ if(libmpq__file_number(mpq_a, filename, &filenum)) continue;
+ libmpq__off_t transferred;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ // HACK: in patch.mpq some files don't want to open and give 1 for filesize
+ if (size<=1) {
+// printf("warning: file %s has size %d; cannot read.\n", filename, size);
+ eof = true;
+ buffer = 0;
+ return;
+ }
+ buffer = new char[size];
+
+ //libmpq_file_getdata
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+ /*libmpq_file_getdata(&mpq_a, hash, fileno, (unsigned char*)buffer);*/
+ return;
+
+ }
+ eof = true;
+ buffer = 0;
+}
+
+size_t MPQFile::read(void* dest, size_t bytes)
+{
+ if (eof) return 0;
+
+ size_t rpos = pointer + bytes;
+ if (rpos > size_t(size)) {
+ bytes = size - pointer;
+ eof = true;
+ }
+
+ memcpy(dest, &(buffer[pointer]), bytes);
+
+ pointer = rpos;
+
+ return bytes;
+}
+
+void MPQFile::seek(int offset)
+{
+ pointer = offset;
+ eof = (pointer >= size);
+}
+
+void MPQFile::seekRelative(int offset)
+{
+ pointer += offset;
+ eof = (pointer >= size);
+}
+
+void MPQFile::close()
+{
+ if (buffer) delete[] buffer;
+ buffer = 0;
+ eof = true;
+}
diff --git a/src/tools/map_extractor/mpq_libmpq04.h b/src/tools/map_extractor/mpq_libmpq04.h
new file mode 100644
index 0000000000..cd67710906
--- /dev/null
+++ b/src/tools/map_extractor/mpq_libmpq04.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MPQ_H
+#define MPQ_H
+
+#include "loadlib/loadlib.h"
+#include "libmpq/mpq.h"
+#include <string.h>
+#include <ctype.h>
+#include <vector>
+#include <iostream>
+#include <deque>
+
+using namespace std;
+
+class MPQArchive
+{
+
+public:
+ mpq_archive_s *mpq_a;
+
+ MPQArchive(const char* filename);
+ ~MPQArchive() { close(); }
+ void close();
+
+ void GetFileListTo(vector<string>& filelist) {
+ uint32_t filenum;
+ if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return;
+ libmpq__off_t size, transferred;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ char *buffer = new char[size+1];
+ buffer[size] = '\0';
+
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+
+ char seps[] = "\n";
+ char *token;
+
+ token = strtok( buffer, seps );
+ uint32 counter = 0;
+ while ((token != NULL) && (counter < size)) {
+ //cout << token << endl;
+ token[strlen(token) - 1] = 0;
+ string s = token;
+ filelist.push_back(s);
+ counter += strlen(token) + 2;
+ token = strtok(NULL, seps);
+ }
+
+ delete[] buffer;
+ }
+};
+typedef std::deque<MPQArchive*> ArchiveSet;
+
+class MPQFile
+{
+ //MPQHANDLE handle;
+ bool eof;
+ char *buffer;
+ libmpq__off_t pointer,size;
+
+ // disable copying
+ MPQFile(const MPQFile& /*f*/) {}
+ void operator=(const MPQFile& /*f*/) {}
+
+public:
+ MPQFile(const char* filename); // filenames are not case sensitive
+ ~MPQFile() { close(); }
+ size_t read(void* dest, size_t bytes);
+ size_t getSize() { return size; }
+ size_t getPos() { return pointer; }
+ char* getBuffer() { return buffer; }
+ char* getPointer() { return buffer + pointer; }
+ bool isEof() { return eof; }
+ void seek(int offset);
+ void seekRelative(int offset);
+ void close();
+};
+
+inline void flipcc(char *fcc)
+{
+ char t;
+ t=fcc[0];
+ fcc[0]=fcc[3];
+ fcc[3]=t;
+ t=fcc[1];
+ fcc[1]=fcc[2];
+ fcc[2]=t;
+}
+
+#endif
diff --git a/src/tools/map_extractor/wdt.cpp b/src/tools/map_extractor/wdt.cpp
new file mode 100644
index 0000000000..82a5e32f24
--- /dev/null
+++ b/src/tools/map_extractor/wdt.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#define _CRT_SECURE_NO_DEPRECATE
+
+#include "wdt.h"
+
+u_map_fcc MWMOMagic = { {'O', 'M', 'W', 'M'} };
+u_map_fcc MPHDMagic = { {'D', 'H', 'P', 'M'} };
+u_map_fcc MAINMagic = { {'N', 'I', 'A', 'M'} };
+
+bool wdt_MWMO::prepareLoadedData()
+{
+ if (fcc != MWMOMagic.fcc)
+ return false;
+ return true;
+}
+
+bool wdt_MPHD::prepareLoadedData()
+{
+ if (fcc != MPHDMagic.fcc)
+ return false;
+ return true;
+}
+
+bool wdt_MAIN::prepareLoadedData()
+{
+ if (fcc != MAINMagic.fcc)
+ return false;
+ return true;
+}
+
+WDT_file::WDT_file()
+{
+ mphd = 0;
+ main = 0;
+ wmo = 0;
+}
+
+WDT_file::~WDT_file()
+{
+ free();
+}
+
+void WDT_file::free()
+{
+ mphd = 0;
+ main = 0;
+ wmo = 0;
+ FileLoader::free();
+}
+
+bool WDT_file::prepareLoadedData()
+{
+ // Check parent
+ if (!FileLoader::prepareLoadedData())
+ return false;
+
+ mphd = (wdt_MPHD *)((uint8*)version+version->size+8);
+ if (!mphd->prepareLoadedData())
+ return false;
+ main = (wdt_MAIN *)((uint8*)mphd + mphd->size+8);
+ if (!main->prepareLoadedData())
+ return false;
+ wmo = (wdt_MWMO *)((uint8*)main+ main->size+8);
+ if (!wmo->prepareLoadedData())
+ return false;
+ return true;
+}
diff --git a/src/tools/map_extractor/wdt.h b/src/tools/map_extractor/wdt.h
new file mode 100644
index 0000000000..f65d6d9386
--- /dev/null
+++ b/src/tools/map_extractor/wdt.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef WDT_H
+#define WDT_H
+#include "loadlib.h"
+
+//**************************************************************************************
+// WDT file class and structures
+//**************************************************************************************
+#define WDT_MAP_SIZE 64
+
+class wdt_MWMO{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+ bool prepareLoadedData();
+};
+
+class wdt_MPHD{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+
+ uint32 data1;
+ uint32 data2;
+ uint32 data3;
+ uint32 data4;
+ uint32 data5;
+ uint32 data6;
+ uint32 data7;
+ uint32 data8;
+ bool prepareLoadedData();
+};
+
+class wdt_MAIN{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+public:
+ uint32 size;
+
+ struct adtData{
+ uint32 exist;
+ uint32 data1;
+ } adt_list[64][64];
+
+ bool prepareLoadedData();
+};
+
+class WDT_file : public FileLoader{
+public:
+ bool prepareLoadedData();
+
+ WDT_file();
+ ~WDT_file();
+ void free();
+
+ wdt_MPHD *mphd;
+ wdt_MAIN *main;
+ wdt_MWMO *wmo;
+};
+
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp
new file mode 100644
index 0000000000..85d81e3db5
--- /dev/null
+++ b/src/tools/mesh_extractor/ADT.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ADT.h"
+#include "DoodadHandler.h"
+#include "LiquidHandler.h"
+#include "WorldModelHandler.h"
+
+ADT::ADT( std::string file, int x, int y ) : ObjectData(NULL), Data(NULL), HasObjectData(false),
+ _DoodadHandler(NULL), _WorldModelHandler(NULL), _LiquidHandler(NULL), X(x), Y(y)
+{
+ Data = new ChunkedData(file);
+ ObjectData = new ChunkedData(file);
+ if (ObjectData->Stream)
+ HasObjectData = true;
+ else
+ ObjectData = NULL;
+}
+
+ADT::~ADT()
+{
+ delete ObjectData;
+ delete Data;
+
+ for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
+ delete *itr;
+
+ MapChunks.clear();
+ delete _DoodadHandler;
+ delete _WorldModelHandler;
+ delete _LiquidHandler;
+}
+
+void ADT::Read()
+{
+ Header.Read(Data->GetChunkByName("MHDR")->GetStream());
+ MapChunks.reserve(16 * 16);
+
+ for (std::vector<Chunk*>::iterator itr = Data->Chunks.begin(); itr != Data->Chunks.end(); ++itr)
+ if ((*itr)->Name == "MCNK")
+ MapChunks.push_back(new MapChunk(this, *itr));
+
+ _LiquidHandler = new LiquidHandler(this);
+
+ // do this separate from map chunk initialization to access liquid data
+ for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
+ (*itr)->GenerateTriangles();
+
+ _DoodadHandler = new DoodadHandler(this);
+ for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
+ _DoodadHandler->ProcessMapChunk(*itr);
+
+ _WorldModelHandler = new WorldModelHandler(this);
+ for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
+ _WorldModelHandler->ProcessMapChunk(*itr);
+}
diff --git a/src/tools/mesh_extractor/ADT.h b/src/tools/mesh_extractor/ADT.h
new file mode 100644
index 0000000000..9a4532303f
--- /dev/null
+++ b/src/tools/mesh_extractor/ADT.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef ADT_H
+#define ADT_H
+#include "ChunkedData.h"
+#include "MapChunk.h"
+
+class DoodadHandler;
+class WorldModelHandler;
+class LiquidHandler;
+
+class ADT
+{
+public:
+ ADT(std::string file, int x, int y);
+ ~ADT();
+
+ void Read();
+
+ ChunkedData* ObjectData;
+ ChunkedData* Data;
+ std::vector<MapChunk*> MapChunks;
+ MHDR Header;
+ // Can we dispose of this?
+ bool HasObjectData;
+
+ DoodadHandler* _DoodadHandler;
+ WorldModelHandler* _WorldModelHandler;
+ LiquidHandler* _LiquidHandler;
+
+ int X;
+ int Y;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/CMakeLists.txt b/src/tools/mesh_extractor/CMakeLists.txt
new file mode 100644
index 0000000000..7c330adcee
--- /dev/null
+++ b/src/tools/mesh_extractor/CMakeLists.txt
@@ -0,0 +1,50 @@
+# Copyright (C)
+# Copyright (C)
+#
+# 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.
+
+file(GLOB_RECURSE meshExtract_Sources *.cpp *.h)
+
+set(include_Base
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/src/common
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Recast
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour
+ ${CMAKE_SOURCE_DIR}/deps/libmpq
+ ${CMAKE_SOURCE_DIR}/deps/g3dlite/include
+ ${ACE_INCLUDE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+if( WIN32 )
+ set(include_Base
+ ${include_Base}
+ ${CMAKE_SOURCE_DIR}/deps/libmpq/win
+ )
+endif()
+
+include_directories(${include_Base})
+
+add_executable(MeshExtractor ${meshExtract_Sources})
+
+target_link_libraries(MeshExtractor
+ g3dlib
+ mpq
+ Recast
+ Detour
+ ${BZIP2_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+ ${ACE_LIBRARY}
+)
+
+if( UNIX )
+ install(TARGETS MeshExtractor DESTINATION bin)
+elseif( WIN32 )
+ install(TARGETS MeshExtractor DESTINATION "${CMAKE_INSTALL_PREFIX}")
+endif()
diff --git a/src/tools/mesh_extractor/Cache.h b/src/tools/mesh_extractor/Cache.h
new file mode 100644
index 0000000000..dafed276ec
--- /dev/null
+++ b/src/tools/mesh_extractor/Cache.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef CACHE_H
+#define CACHE_H
+#include <string>
+#include <map>
+#include "Define.h"
+#include <ace/Guard_T.h>
+#include <ace/Synch.h>
+#include "WorldModelRoot.h"
+#include "Model.h"
+
+template<class K, class T>
+class GenericCache
+{
+public:
+ GenericCache() {}
+
+ static const uint32 FlushLimit = 300; // We can't get too close to filling up all the memory, and we have to be wary of the maximum number of open streams.
+
+ void Insert(K key, T* val)
+ {
+ ACE_GUARD(ACE_Thread_Mutex, g, mutex);
+
+ if (_items.size() > FlushLimit)
+ Clear();
+ _items[key] = val;
+ }
+
+ T* Get(K key)
+ {
+ ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
+ typename std::map<K, T*>::iterator itr = _items.find(key);
+ if (itr != _items.end())
+ return itr->second;
+ return NULL;
+ }
+
+ void Clear()
+ {
+ for (typename std::map<K, T*>::iterator itr = _items.begin(); itr != _items.end(); ++itr)
+ delete itr->second;
+ _items.clear();
+ }
+private:
+ std::map<K, T*> _items;
+ ACE_Thread_Mutex mutex;
+};
+
+class CacheClass
+{
+public:
+ CacheClass() {}
+ GenericCache<std::string, Model> ModelCache;
+ GenericCache<std::string, WorldModelRoot> WorldModelCache;
+
+ void Clear()
+ {
+ ModelCache.Clear();
+ WorldModelCache.Clear();
+ }
+};
+
+extern CacheClass* Cache;
+#endif
diff --git a/src/tools/mesh_extractor/Chunk.cpp b/src/tools/mesh_extractor/Chunk.cpp
new file mode 100644
index 0000000000..cad81d03ae
--- /dev/null
+++ b/src/tools/mesh_extractor/Chunk.cpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Chunk.h"
+#include "Utils.h"
+
+int32 Chunk::FindSubChunkOffset(std::string name)
+{
+ // Reverse the name
+ name = std::string(name.rbegin(), name.rend());
+ if (name.size() != 4)
+ return -1;
+
+ FILE* stream = GetStream();
+ uint32 matched = 0;
+ while (uint32(ftell(stream)) < Utils::Size(stream))
+ {
+ char b = 0;
+ if (fread(&b, sizeof(char), 1, stream) != 1 || b != name[matched])
+ matched = 0;
+ else
+ ++matched;
+
+ if (matched == 4)
+ return ftell(stream) - 4;
+ }
+ return -1;
+}
+
+FILE* Chunk::GetStream()
+{
+ fseek(Stream, Offset, SEEK_SET);
+ return Stream;
+}
diff --git a/src/tools/mesh_extractor/Chunk.h b/src/tools/mesh_extractor/Chunk.h
new file mode 100644
index 0000000000..4b2317d656
--- /dev/null
+++ b/src/tools/mesh_extractor/Chunk.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef CHUNK_H
+#define CHUNK_H
+#include "Define.h"
+#include <string>
+class ChunkedData;
+
+class Chunk
+{
+public:
+ Chunk(const char* name, uint32 length, uint32 offset, FILE* stream) : Name(name), Length(length), Offset(offset), Stream(stream) {}
+
+ int32 FindSubChunkOffset(std::string name);
+ FILE* GetStream();
+ std::string Name;
+ uint32 Length;
+ uint32 Offset;
+ FILE* Stream;
+};
+
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ChunkedData.cpp b/src/tools/mesh_extractor/ChunkedData.cpp
new file mode 100644
index 0000000000..8b9ddd186c
--- /dev/null
+++ b/src/tools/mesh_extractor/ChunkedData.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ChunkedData.h"
+#include "MPQManager.h"
+#include "Utils.h"
+
+#include <string>
+
+ChunkedData::ChunkedData( FILE* stream, uint32 maxLength, uint32 chunksHint /*= 300*/ ) :
+Stream(stream)
+{
+ if (!Stream)
+ return;
+ Load(maxLength, chunksHint);
+}
+
+ChunkedData::ChunkedData( const std::string& file, uint32 chunksHint /*= 300*/ )
+{
+ Stream = MPQHandler->GetFile(file);
+ if (!Stream)
+ return;
+ Load(0, chunksHint);
+}
+
+void ChunkedData::Load( uint32 maxLength, uint32 chunksHint )
+{
+ if (!maxLength)
+ maxLength = Utils::Size(Stream);
+ Chunks.reserve(chunksHint);
+ uint32 baseOffset = ftell(Stream);
+ uint32 calcOffset = 0;
+ while ((calcOffset + baseOffset) < Utils::Size(Stream) && (calcOffset < maxLength))
+ {
+ char nameBytes[5];
+ uint32 read = fread(&nameBytes, sizeof(char), 4, Stream);
+ nameBytes[read] = '\0';
+ std::string name = std::string(nameBytes);
+ // Utils::Reverse(nameBytes);
+ name = std::string(name.rbegin(), name.rend());
+ uint32 length;
+ if (fread(&length, sizeof(uint32), 1, Stream) != 1)
+ continue;
+ calcOffset += 8;
+ Chunks.push_back(new Chunk(name.c_str(), length, calcOffset + baseOffset, Stream));
+ calcOffset += length;
+ // save an extra seek at the end
+ if ((calcOffset + baseOffset) < Utils::Size(Stream) && calcOffset < maxLength)
+ fseek(Stream, length, SEEK_CUR);
+ }
+}
+
+int ChunkedData::GetFirstIndex( const std::string& name )
+{
+ for (uint32 i = 0; i < Chunks.size(); ++i)
+ if (Chunks[i]->Name == name)
+ return i;
+ return -1;
+}
+
+Chunk* ChunkedData::GetChunkByName( const std::string& name )
+{
+ for (uint32 i = 0; i < Chunks.size(); ++i)
+ if (Chunks[i]->Name == name)
+ return Chunks[i];
+ return NULL;
+}
+
+ChunkedData::~ChunkedData()
+{
+ for (std::vector<Chunk*>::iterator itr = Chunks.begin(); itr != Chunks.end(); ++itr)
+ delete *itr;
+
+ Chunks.clear();
+ if (Stream)
+ fclose(Stream);
+}
diff --git a/src/tools/mesh_extractor/ChunkedData.h b/src/tools/mesh_extractor/ChunkedData.h
new file mode 100644
index 0000000000..74a8b7a443
--- /dev/null
+++ b/src/tools/mesh_extractor/ChunkedData.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef CHNK_H
+#define CHNK_H
+
+#include <vector>
+#include "Chunk.h"
+
+class ChunkedData
+{
+public:
+ ChunkedData(FILE* stream, uint32 maxLength, uint32 chunksHint = 300);
+ ChunkedData(const std::string &file, uint32 chunksHint = 300);
+ ~ChunkedData();
+
+ int GetFirstIndex(const std::string& name);
+ Chunk* GetChunkByName(const std::string& name);
+
+ void Load(uint32 maxLength, uint32 chunksHint);
+ std::vector<Chunk*> Chunks;
+ FILE* Stream;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/Constants.h b/src/tools/mesh_extractor/Constants.h
new file mode 100644
index 0000000000..f34cf01fd5
--- /dev/null
+++ b/src/tools/mesh_extractor/Constants.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef CONSTANTS_H
+#define CONSTANTS_H
+
+class Constants
+{
+public:
+ enum TriangleType
+ {
+ TRIANGLE_TYPE_UNKNOWN,
+ TRIANGLE_TYPE_TERRAIN,
+ TRIANGLE_TYPE_WATER,
+ TRIANGLE_TYPE_DOODAD,
+ TRIANGLE_TYPE_WMO
+ };
+
+ enum PolyArea
+ {
+ POLY_AREA_TERRAIN = 1,
+ POLY_AREA_WATER = 2,
+ POLY_AREA_ROAD = 3,
+ POLY_AREA_DANGER = 4,
+ };
+
+ enum PolyFlag
+ {
+ POLY_FLAG_WALK = 1,
+ POLY_FLAG_SWIM = 2,
+ POLY_FLAG_FLIGHTMASTER = 4
+ };
+
+ enum ExtractFlags
+ {
+ EXTRACT_FLAG_DBC = 0x01,
+ EXTRACT_FLAG_MAPS = 0x02,
+ EXTRACT_FLAG_VMAPS = 0x04,
+ EXTRACT_FLAG_GOB_MODELS = 0x08,
+ EXTRACT_FLAG_MMAPS = 0x10,
+ EXTRACT_FLAG_TEST = 0x20,
+ EXTRACT_FLAG_ALLOWED = EXTRACT_FLAG_DBC | EXTRACT_FLAG_MAPS | EXTRACT_FLAG_VMAPS | EXTRACT_FLAG_GOB_MODELS | EXTRACT_FLAG_MMAPS | EXTRACT_FLAG_TEST
+ };
+
+ static const float TileSize;
+ static const float MaxXY;
+ static const float ChunkSize;
+ static const float UnitSize;
+ static const float Origin[];
+ static const float PI;
+ static const float MaxStandableHeight;
+ static bool ToWoWCoords;
+ static bool Debug;
+ static const char* VMAPMagic;
+ static const float BaseUnitDim;
+ static const int VertexPerMap;
+ static const int VertexPerTile;
+ static const int TilesPerMap;
+};
+
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp
new file mode 100644
index 0000000000..123d4efe02
--- /dev/null
+++ b/src/tools/mesh_extractor/ContinentBuilder.cpp
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ContinentBuilder.h"
+#include "TileBuilder.h"
+#include "WDT.h"
+#include "Utils.h"
+#include "DetourNavMesh.h"
+#include "Cache.h"
+#include "ace/Task.h"
+#include "Recast.h"
+#include "DetourCommon.h"
+
+class BuilderThread : public ACE_Task_Base
+{
+private:
+ int X, Y, MapId;
+ std::string Continent;
+ dtNavMeshParams Params;
+ ContinentBuilder* cBuilder;
+public:
+ BuilderThread(ContinentBuilder* _cBuilder, dtNavMeshParams& params) : Params(params), cBuilder(_cBuilder), Free(true) {}
+
+ void SetData(int x, int y, int map, const std::string& cont)
+ {
+ X = x;
+ Y = y;
+ MapId = map;
+ Continent = cont;
+ }
+
+ int svc()
+ {
+ Free = false;
+ printf("[%02i,%02i] Building tile\n", X, Y);
+ TileBuilder builder(cBuilder, Continent, X, Y, MapId);
+ char buff[100];
+ sprintf(buff, "mmaps/%03u%02i%02i.mmtile", MapId, Y, X);
+ FILE* f = fopen(buff, "r");
+ if (f) // Check if file already exists.
+ {
+ printf("[%02i,%02i] Tile skipped, file already exists\n", X, Y);
+ fclose(f);
+ Free = true;
+ return 0;
+ }
+ uint8* nav = builder.BuildTiled(Params);
+ if (nav)
+ {
+ f = fopen(buff, "wb");
+ if (!f)
+ {
+ printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff);
+ return 0;
+ }
+ MmapTileHeader header;
+ header.size = builder.DataSize;
+ fwrite(&header, sizeof(MmapTileHeader), 1, f);
+ fwrite(nav, sizeof(unsigned char), builder.DataSize, f);
+ fclose(f);
+ }
+ dtFree(nav);
+ printf("[%02i,%02i] Tile Built!\n", X, Y);
+ Free = true;
+ return 0;
+ }
+
+ bool Free;
+};
+
+void ContinentBuilder::getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax)
+{
+ // this is for elevation
+ if (verts && vertCount)
+ rcCalcBounds(verts, vertCount, bmin, bmax);
+ else
+ {
+ bmin[1] = FLT_MIN;
+ bmax[1] = FLT_MAX;
+ }
+
+ // this is for width and depth
+ bmax[0] = (32 - int(tileX)) * Constants::TileSize;
+ bmax[2] = (32 - int(tileY)) * Constants::TileSize;
+ bmin[0] = bmax[0] - Constants::TileSize;
+ bmin[2] = bmax[2] - Constants::TileSize;
+}
+
+void ContinentBuilder::CalculateTileBounds()
+{
+ for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
+ {
+ tileXMax = std::max(itr->X, tileXMax);
+ tileXMin = std::min(itr->X, tileXMin);
+
+ tileYMax = std::max(itr->Y, tileYMax);
+ tileYMin = std::min(itr->Y, tileYMin);
+ }
+ getTileBounds(tileXMax, tileYMax, NULL, 0, bmin, bmax);
+}
+
+void ContinentBuilder::Build()
+{
+ char buff[50];
+ sprintf(buff, "mmaps/%03u.mmap", MapId);
+ FILE* mmap = fopen(buff, "wb");
+ if (!mmap)
+ {
+ printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff);
+ return;
+ }
+
+ CalculateTileBounds();
+
+ dtNavMeshParams params;
+
+ std::vector<BuilderThread*> Threads;
+
+ if (TileMap->IsGlobalModel)
+ {
+ printf("Map %s ( %u ) is a WMO. Building with 1 thread.\n", Continent.c_str(), MapId);
+
+ TileBuilder* builder = new TileBuilder(this, Continent, 0, 0, MapId);
+ builder->AddGeometry(TileMap->Model, TileMap->ModelDefinition);
+ uint8* nav = builder->BuildInstance(params);
+ if (nav)
+ {
+ // Set some params for the navmesh
+ dtMeshHeader* header = (dtMeshHeader*)nav;
+ dtVcopy(params.orig, header->bmin);
+ params.tileWidth = header->bmax[0] - header->bmin[0];
+ params.tileHeight = header->bmax[2] - header->bmin[2];
+ params.maxTiles = 1;
+ params.maxPolys = header->polyCount;
+ fwrite(&params, sizeof(dtNavMeshParams), 1, mmap);
+ fclose(mmap);
+
+ char buff[100];
+ sprintf(buff, "mmaps/%03u%02i%02i.mmtile", MapId, 0, 0);
+ FILE* f = fopen(buff, "wb");
+ if (!f)
+ {
+ printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff);
+ return;
+ }
+
+ MmapTileHeader mheader;
+ mheader.size = builder->DataSize;
+ fwrite(&mheader, sizeof(MmapTileHeader), 1, f);
+ fwrite(nav, sizeof(unsigned char), builder->DataSize, f);
+ fclose(f);
+ }
+
+ dtFree(nav);
+ delete builder;
+ }
+ else
+ {
+ params.maxPolys = 32768;
+ params.maxTiles = 4096;
+ rcVcopy(params.orig, Constants::Origin);
+ params.tileHeight = Constants::TileSize;
+ params.tileWidth = Constants::TileSize;
+ fwrite(&params, sizeof(dtNavMeshParams), 1, mmap);
+ fclose(mmap);
+
+ for (uint32 i = 0; i < NumberOfThreads; ++i)
+ Threads.push_back(new BuilderThread(this, params));
+ printf("Map %s ( %u ) has %u tiles. Building them with %u threads\n", Continent.c_str(), MapId, uint32(TileMap->TileTable.size()), NumberOfThreads);
+ for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
+ {
+ bool next = false;
+ while (!next)
+ {
+ for (std::vector<BuilderThread*>::iterator _th = Threads.begin(); _th != Threads.end(); ++_th)
+ {
+ if ((*_th)->Free)
+ {
+ (*_th)->SetData(itr->X, itr->Y, MapId, Continent);
+ (*_th)->activate();
+ next = true;
+ break;
+ }
+ }
+ // Wait for 20 seconds
+ ACE_OS::sleep(ACE_Time_Value (0, 20000));
+ }
+ }
+ }
+
+ Cache->Clear();
+
+ // Free memory
+ for (std::vector<BuilderThread*>::iterator _th = Threads.begin(); _th != Threads.end(); ++_th)
+ {
+ (*_th)->wait();
+ delete *_th;
+ }
+}
diff --git a/src/tools/mesh_extractor/ContinentBuilder.h b/src/tools/mesh_extractor/ContinentBuilder.h
new file mode 100644
index 0000000000..b8c07aee09
--- /dev/null
+++ b/src/tools/mesh_extractor/ContinentBuilder.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef CONT_BUILDER_H
+#define CONT_BUILDER_H
+#include <string>
+#include "WDT.h"
+#include "Define.h"
+
+class ContinentBuilder
+{
+public:
+ ContinentBuilder(std::string continent, uint32 mapId, WDT* wdt, uint32 tn) :
+ Continent(continent), TileMap(wdt), MapId(mapId),
+ NumberOfThreads(tn), tileXMin(64), tileYMin(64), tileXMax(0), tileYMax(0)
+ {}
+
+ void Build();
+ void getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax);
+ void CalculateTileBounds();
+ float bmin[3];
+ float bmax[3];
+private:
+ std::string Continent;
+ WDT* TileMap;
+ uint32 MapId;
+ uint32 NumberOfThreads;
+ int tileXMin;
+ int tileYMin;
+ int tileXMax;
+ int tileYMax;
+};
+#endif
diff --git a/src/tools/mesh_extractor/DBC.cpp b/src/tools/mesh_extractor/DBC.cpp
new file mode 100644
index 0000000000..2ecf21e813
--- /dev/null
+++ b/src/tools/mesh_extractor/DBC.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include <cstdio>
+#include "DBC.h"
+#include "Define.h"
+
+DBC::DBC( FILE* stream ) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true)
+{
+ char magic[5];
+ uint32 count = 0;
+ count += fread(&magic, sizeof(char), 4, stream);
+ magic[4] = '\0';
+ count += fread(&RecordCount, sizeof(uint32), 1, stream);
+ Records.reserve(RecordCount);
+ count += fread(&Fields, sizeof(uint32), 1, stream);
+ count += fread(&RecordSize, sizeof(uint32), 1, stream);
+ count += fread(&StringBlockSize, sizeof(uint32), 1, stream);
+ if (count != 8)
+ printf("DBC::DBC: Failed to read some data expected 8, read %u\n", count);
+
+ for (int i = 0; i < RecordCount; i++)
+ {
+ Record* rec = new Record(this);
+ Records.push_back(rec);
+ int size = 0;
+ for (int f = 0; f < Fields; f++)
+ {
+ if (size + 4 > RecordSize)
+ {
+ IsFaulty = true;
+ break;
+ }
+ uint32 tmp;
+ if (fread(&tmp, sizeof(uint32), 1, stream) != 1)
+ printf("DBC::DBC: Failed to read some data expected 1, read 0\n");
+ rec->Values.push_back(tmp);
+ size += 4;
+ }
+ }
+ StringBlock = new uint8[StringBlockSize];
+ count = fread(StringBlock, sizeof(uint8), StringBlockSize, stream);
+ if (count != StringBlockSize)
+ printf("DBC::DBC: Failed to read some data expected %u, read %u\n", StringBlockSize, count);
+}
+
+std::string DBC::GetStringByOffset( int offset )
+{
+ int len = 0;
+ for (uint32 i = offset; i < StringBlockSize; i++)
+ {
+ if (!StringBlock[i])
+ {
+ len = (i - offset);
+ break;
+ }
+ }
+ char* d = new char[len+1];
+ strcpy(d, (const char*)(StringBlock + offset));
+ d[len] = '\0';
+ std::string val = std::string(d);
+ delete [] d;
+ return val;
+}
+
+Record* DBC::GetRecordById( int id )
+{
+ // we assume Id is index 0
+ for (std::vector<Record*>::iterator itr = Records.begin(); itr != Records.end(); ++itr)
+ if ((*itr)->Values[0] == id)
+ return *itr;
+ return NULL;
+}
diff --git a/src/tools/mesh_extractor/DBC.h b/src/tools/mesh_extractor/DBC.h
new file mode 100644
index 0000000000..8521f6111b
--- /dev/null
+++ b/src/tools/mesh_extractor/DBC.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef DBC_H
+#define DBC_H
+#include <vector>
+#include <string>
+#include "Define.h"
+
+class Record;
+
+class DBC
+{
+public:
+ DBC(FILE* stream);
+
+ std::string GetStringByOffset(int offset);
+
+ Record* GetRecordById(int id);
+
+ std::string Name;
+ std::vector<Record*> Records;
+ int RecordCount;
+ int Fields;
+ int RecordSize;
+ uint8* StringBlock;
+ uint32 StringBlockSize;
+ bool IsFaulty;
+};
+
+class Record
+{
+public:
+ Record(DBC* dbc) : Source(dbc) {}
+
+ DBC* Source;
+ std::vector<int> Values;
+
+ int operator[](int index)
+ {
+ return Values[index];
+ }
+
+ template <typename T>
+ T GetValue(int index)
+ {
+ return *(T*)(&Values[index]);
+ }
+
+ std::string GetString(int index)
+ {
+ return Source->GetStringByOffset(Values[index]);
+ }
+};
+
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/DoodadHandler.cpp b/src/tools/mesh_extractor/DoodadHandler.cpp
new file mode 100644
index 0000000000..67b4ae567a
--- /dev/null
+++ b/src/tools/mesh_extractor/DoodadHandler.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "DoodadHandler.h"
+#include "Chunk.h"
+#include "Cache.h"
+#include "Model.h"
+#include "G3D/Matrix4.h"
+
+DoodadHandler::DoodadHandler( ADT* adt ) :
+ ObjectDataHandler(adt), _definitions(NULL), _paths(NULL)
+{
+ Chunk* mddf = adt->ObjectData->GetChunkByName("MDDF");
+ if (mddf)
+ ReadDoodadDefinitions(mddf);
+
+ Chunk* mmid = adt->ObjectData->GetChunkByName("MMID");
+ Chunk* mmdx = adt->ObjectData->GetChunkByName("MMDX");
+ if (mmid && mmdx)
+ ReadDoodadPaths(mmid, mmdx);
+}
+
+void DoodadHandler::ProcessInternal( MapChunk* mcnk )
+{
+ if (!IsSane())
+ return;
+
+ uint32 refCount = mcnk->Header.DoodadRefs;
+ FILE* stream = mcnk->Source->GetStream();
+ fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
+ for (uint32 i = 0; i < refCount; i++)
+ {
+ int32 index;
+ int32 count;
+ if ((count = fread(&index, sizeof(int32), 1, stream)) != 1)
+ printf("DoodadHandler::ProcessInternal: Failed to read some data expected 1, read %d\n", count);
+ if (index < 0 || uint32(index) >= _definitions->size())
+ continue;
+ DoodadDefinition doodad = (*_definitions)[index];
+ if (_drawn.find(doodad.UniqueId) != _drawn.end())
+ continue;
+ _drawn.insert(doodad.UniqueId);
+ if (doodad.MmidIndex >= _paths->size())
+ continue;
+
+ std::string path = (*_paths)[doodad.MmidIndex];
+ Model* model = Cache->ModelCache.Get(path);
+ if (!model)
+ {
+ model = new Model(path);
+ Cache->ModelCache.Insert(path, model);
+ }
+ if (!model->IsCollidable)
+ continue;
+
+ Vertices.reserve(refCount * model->Vertices.size() * 0.2);
+ Triangles.reserve(refCount * model->Triangles.size() * 0.2);
+
+ InsertModelGeometry(doodad, model);
+ }
+ // Restore the stream position
+ fseek(stream, mcnk->Source->Offset, SEEK_SET);
+}
+
+void DoodadHandler::ReadDoodadDefinitions( Chunk* chunk )
+{
+ int32 count = chunk->Length / 36;
+ _definitions = new std::vector<DoodadDefinition>;
+ _definitions->reserve(count);
+ FILE* stream = chunk->GetStream();
+ for (int i = 0; i < count; i++)
+ {
+ DoodadDefinition def;
+ def.Read(stream);
+ _definitions->push_back(def);
+ }
+}
+
+void DoodadHandler::ReadDoodadPaths( Chunk* id, Chunk* data )
+{
+ int paths = id->Length / 4;
+ _paths = new std::vector<std::string>();
+ _paths->reserve(paths);
+ for (int i = 0; i < paths; i++)
+ {
+ FILE* idStream = id->GetStream();
+ fseek(idStream, i * 4, SEEK_CUR);
+ uint32 offset;
+ if (fread(&offset, sizeof(uint32), 1, idStream) != 1)
+ printf("DoodadHandler::ReadDoodadPaths: Failed to read some data expected 1, read 0\n");
+ FILE* dataStream = data->GetStream();
+ fseek(dataStream, offset + data->Offset, SEEK_SET);
+ _paths->push_back(Utils::ReadString(dataStream));
+ }
+}
+
+void DoodadHandler::InsertModelGeometry(const DoodadDefinition& def, Model* model)
+{
+ uint32 vertOffset = Vertices.size();
+
+ for (std::vector<Vector3>::iterator itr = model->Vertices.begin(); itr != model->Vertices.end(); ++itr)
+ Vertices.push_back(Utils::TransformDoodadVertex(def, *itr)); // Vertices have to be converted based on the information from the DoodadDefinition struct
+
+ for (std::vector<Triangle<uint16> >::iterator itr = model->Triangles.begin(); itr != model->Triangles.end(); ++itr)
+ Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_DOODAD, itr->V0 + vertOffset, itr->V1 + vertOffset, itr->V2 + vertOffset));
+}
+
+DoodadHandler::~DoodadHandler()
+{
+ delete _definitions;
+ delete _paths;
+}
diff --git a/src/tools/mesh_extractor/DoodadHandler.h b/src/tools/mesh_extractor/DoodadHandler.h
new file mode 100644
index 0000000000..319010f092
--- /dev/null
+++ b/src/tools/mesh_extractor/DoodadHandler.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef DOOADHNDL_H
+#define DOOADHNDL_H
+#include "ObjectDataHandler.h"
+#include "Utils.h"
+#include "Chunk.h"
+#include "Model.h"
+#include <set>
+#include <vector>
+
+class DoodadDefinition : public IDefinition
+{
+public:
+ uint32 MmidIndex;
+ uint32 UniqueId;
+ uint16 DecimalScale;
+ uint16 Flags;
+
+ virtual float Scale() const { return DecimalScale / 1024.0f; }
+
+ Vector3 FixCoords(Vector3& vec)
+ {
+ return Vector3(vec.z, vec.x, vec.y);
+ }
+
+ void Read(FILE* stream)
+ {
+ int count = 0;
+
+ count += fread(&MmidIndex, sizeof(uint32), 1, stream);
+ count += fread(&UniqueId, sizeof(uint32), 1, stream);
+ Position = (Vector3::Read(stream));
+ Rotation = Vector3::Read(stream);
+ count += fread(&DecimalScale, sizeof(uint16), 1, stream);
+ count += fread(&Flags, sizeof(uint16), 1, stream);
+ if (count != 4)
+ printf("DoodadDefinition::Read: Failed to read some data expected 4, read %d\n", count);
+ }
+};
+
+class DoodadHandler : public ObjectDataHandler
+{
+public:
+ DoodadHandler(ADT* adt);
+ ~DoodadHandler();
+
+ std::vector<Vector3> Vertices;
+ std::vector<Triangle<uint32> > Triangles;
+ bool IsSane() { return _definitions && _paths; }
+
+
+protected:
+ void ProcessInternal(MapChunk* chunk);
+
+private:
+ void ReadDoodadDefinitions(Chunk* chunk);
+ void ReadDoodadPaths(Chunk* id, Chunk* data);
+ void InsertModelGeometry(const DoodadDefinition& def, Model* model);
+ std::set<uint32> _drawn;
+ std::vector<DoodadDefinition>* _definitions;
+ std::vector<std::string>* _paths;
+};
+#endif
diff --git a/src/tools/mesh_extractor/Geometry.cpp b/src/tools/mesh_extractor/Geometry.cpp
new file mode 100644
index 0000000000..23105306cf
--- /dev/null
+++ b/src/tools/mesh_extractor/Geometry.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Geometry.h"
+#include "Constants.h"
+#include "ADT.h"
+#include "WorldModelHandler.h"
+#include "DoodadHandler.h"
+#include <limits.h>
+
+Geometry::Geometry() : Transform(false)
+{
+ Vertices.reserve(10000);
+ Triangles.reserve(10000);
+}
+
+void Geometry::CalculateBoundingBox( float*& min, float*& max )
+{
+ min = new float[3];
+ max = new float[3];
+ for (int i = 0; i < 3; ++i)
+ {
+ max[i] = std::numeric_limits<float>::min();
+ min[i] = std::numeric_limits<float>::max();
+ }
+
+ for (std::vector<Vector3>::iterator itr = Vertices.begin(); itr != Vertices.end(); ++itr)
+ {
+ if (itr->x > max[0])
+ max[0] = itr->x;
+ if (itr->x < min[0])
+ min[0] = itr->x;
+
+ if (itr->y > max[1])
+ max[1] = itr->y;
+ if (itr->y < min[1])
+ min[1] = itr->y;
+
+ if (itr->z > max[2])
+ max[2] = itr->z;
+ if (itr->z < min[2])
+ min[2] = itr->z;
+ }
+}
+
+void Geometry::CalculateMinMaxHeight( float& min, float& max )
+{
+ min = std::numeric_limits<float>::max();
+ max = std::numeric_limits<float>::min();
+
+ for (std::vector<Vector3>::iterator itr = Vertices.begin(); itr != Vertices.end(); ++itr)
+ {
+ if (Transform)
+ {
+ if (itr->y < min)
+ min = itr->y;
+ if (itr->y > max)
+ max = itr->y;
+ }
+ else
+ {
+ if (itr->z < min)
+ min = itr->z;
+ if (itr->z > max)
+ max = itr->z;
+ }
+ }
+}
+
+void Geometry::AddData( std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris )
+{
+ uint32 vertOffset = Vertices.size();
+ for (std::vector<Vector3>::iterator itr = verts.begin(); itr != verts.end(); ++itr)
+ Vertices.push_back(Transform ? Utils::ToRecast(*itr) : *itr);
+
+ for (std::vector<Triangle<uint32> >::iterator itr = tris.begin(); itr != tris.end(); ++itr)
+ Triangles.push_back(Triangle<uint32>(itr->Type, itr->V0 + vertOffset, itr->V1 + vertOffset, itr->V2 + vertOffset));
+}
+
+void Geometry::GetRawData( float*& verts, int*& tris, uint8*& areas )
+{
+ verts = new float[Vertices.size() * 3];
+ for (uint32 i = 0; i < Vertices.size(); ++i)
+ {
+ Vector3& vert = Vertices[i];
+ verts[(i * 3) + 0] = vert.x;
+ verts[(i * 3) + 1] = vert.y;
+ verts[(i * 3) + 2] = vert.z;
+ }
+
+ tris = new int[Triangles.size() * 3];
+ for (uint32 i = 0; i < Triangles.size(); ++i)
+ {
+ Triangle<uint32>& tri = Triangles[i];
+ tris[(i * 3) + 0] = (int)tri.V0;
+ tris[(i * 3) + 1] = (int)tri.V1;
+ tris[(i * 3) + 2] = (int)tri.V2;
+ }
+
+ areas = new uint8[Triangles.size()];
+ for (uint32 i = 0; i < Triangles.size(); i++)
+ {
+ switch (Triangles[i].Type)
+ {
+ case Constants::TRIANGLE_TYPE_WATER:
+ areas[i] = Constants::POLY_AREA_WATER;
+ break;
+ default:
+ areas[i] = Constants::POLY_AREA_TERRAIN;
+ break;
+ }
+ }
+}
+
+void Geometry::AddAdt( ADT* adt )
+{
+ for (std::vector<MapChunk*>::iterator itr = adt->MapChunks.begin(); itr != adt->MapChunks.end(); ++itr)
+ {
+ std::vector<Triangle<uint32> > tmp;
+ tmp.reserve((*itr)->Triangles.size());
+ for (std::vector<Triangle<uint8> >::iterator itr2 = (*itr)->Triangles.begin(); itr2 != (*itr)->Triangles.end(); ++itr2)
+ tmp.push_back(Triangle<uint32>(itr2->Type, itr2->V0, itr2->V1, itr2->V2));
+ AddData((*itr)->Vertices, tmp);
+ }
+
+ if (!adt->_DoodadHandler->Triangles.empty())
+ AddData(adt->_DoodadHandler->Vertices, adt->_DoodadHandler->Triangles);
+
+ if (!adt->_WorldModelHandler->Triangles.empty())
+ AddData(adt->_WorldModelHandler->Vertices, adt->_WorldModelHandler->Triangles);
+}
+
diff --git a/src/tools/mesh_extractor/Geometry.h b/src/tools/mesh_extractor/Geometry.h
new file mode 100644
index 0000000000..23f6777119
--- /dev/null
+++ b/src/tools/mesh_extractor/Geometry.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef GEOMETRY_H
+#define GEOMETRY_H
+#include <vector>
+
+#include "Utils.h"
+
+class ADT;
+class Geometry
+{
+public:
+ Geometry();
+
+ void CalculateBoundingBox(float*& min, float*& max);
+ void CalculateMinMaxHeight(float& min, float& max);
+ void AddData(std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris);
+ void AddAdt(ADT* adt);
+ void GetRawData(float*& verts, int*& tris, uint8*& areas);
+
+ std::vector<Vector3> Vertices;
+ std::vector<Triangle<uint32> > Triangles;
+ bool Transform;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp
new file mode 100644
index 0000000000..22069aedf0
--- /dev/null
+++ b/src/tools/mesh_extractor/LiquidHandler.cpp
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "LiquidHandler.h"
+#include "Utils.h"
+
+LiquidHandler::LiquidHandler( ADT* adt ) : Source(adt)
+{
+ HandleNewLiquid();
+}
+
+void LiquidHandler::HandleNewLiquid()
+{
+ Chunk* chunk = Source->Data->GetChunkByName("MH2O");
+ if (!chunk)
+ return;
+
+ Vertices.reserve(1000);
+ Triangles.reserve(1000);
+
+ FILE* stream = chunk->GetStream();
+ H2OHeader header[256];
+ MCNKData.reserve(256);
+ for (int i = 0; i < 256; i++)
+ header[i] = H2OHeader::Read(stream);
+
+ for (int i = 0; i < 256; i++)
+ {
+ H2OHeader h = header[i];
+ if (h.LayerCount == 0)
+ {
+ // Need to fill in missing data with dummies.
+ MCNKData.push_back(MCNKLiquidData(NULL, H2ORenderMask()));
+ continue;
+ }
+ fseek(stream, chunk->Offset + h.OffsetInformation, SEEK_SET);
+ H2OInformation information = H2OInformation::Read(stream);
+
+ float** heights = new float*[9];
+ for (int j = 0; j < 9; ++j)
+ {
+ heights[j] = new float[9];
+ memset(heights[j], 0, sizeof(float) * 9);
+ }
+
+ H2ORenderMask renderMask;
+ if (information.LiquidType != 2)
+ {
+ fseek(stream, chunk->Offset + h.OffsetRender, SEEK_SET);
+ renderMask = H2ORenderMask::Read(stream);
+ if ((Utils::IsAllZero(renderMask.Mask, 8) || (information.Width == 8 && information.Height == 8)) && information.OffsetMask2)
+ {
+ fseek(stream, chunk->Offset + information.OffsetMask2, SEEK_SET);
+ uint32 size = ceil(information.Width * information.Height / 8.0f);
+ uint8* altMask = new uint8[size];
+ if (fread(altMask, sizeof(uint8), size, stream) == size)
+ for (uint32 mi = 0; mi < size; mi++)
+ renderMask.Mask[mi + information.OffsetY] |= altMask[mi];
+ delete[] altMask;
+ }
+ fseek(stream, chunk->Offset + information.OffsetHeightmap, SEEK_SET);
+
+ for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++)
+ for (int x = information.OffsetX; x < (information.OffsetX + information.Width); x++)
+ if (fread(&heights[x][y], sizeof(float), 1, stream) != 1)
+ return;
+ }
+ else
+ {
+ // Fill with ocean data
+ for (uint32 i = 0; i < 8; ++i)
+ renderMask.Mask[i] = 0xFF;
+
+ for (uint32 y = 0; y < 9; ++y)
+ for (uint32 x = 0; x < 9; ++x)
+ heights[x][y] = information.HeightLevel1;
+ }
+
+ MCNKData.push_back(MCNKLiquidData(heights, renderMask));
+
+ for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++)
+ {
+ for (int x = information.OffsetX; x < (information.OffsetX + information.Width); x++)
+ {
+ if (!renderMask.ShouldRender(x, y))
+ continue;
+
+ MapChunk* mapChunk = Source->MapChunks[i];
+ Vector3 location = mapChunk->Header.Position;
+ location.y = location.y - (x * Constants::UnitSize);
+ location.x = location.x - (y * Constants::UnitSize);
+ location.z = heights[x][y];
+
+ uint32 vertOffset = Vertices.size();
+ Vertices.push_back(location);
+ Vertices.push_back(Vector3(location.x - Constants::UnitSize, location.y, location.z));
+ Vertices.push_back(Vector3(location.x, location.y - Constants::UnitSize, location.z));
+ Vertices.push_back(Vector3(location.x - Constants::UnitSize, location.y - Constants::UnitSize, location.z));
+
+ Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset, vertOffset+2, vertOffset + 1));
+ Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset + 2, vertOffset + 3, vertOffset + 1));
+ }
+ }
+ }
+}
diff --git a/src/tools/mesh_extractor/LiquidHandler.h b/src/tools/mesh_extractor/LiquidHandler.h
new file mode 100644
index 0000000000..bf38514be1
--- /dev/null
+++ b/src/tools/mesh_extractor/LiquidHandler.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef LIQUID_H
+#define LIQUID_H
+#include "ADT.h"
+#include "Utils.h"
+#include "Define.h"
+
+#include <vector>
+
+class LiquidHandler
+{
+public:
+ LiquidHandler(ADT* adt);
+
+ ADT* Source;
+ std::vector<Vector3> Vertices;
+ std::vector<Triangle<uint32> > Triangles;
+ std::vector<MCNKLiquidData> MCNKData;
+private:
+ void HandleNewLiquid();
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/MPQ.cpp b/src/tools/mesh_extractor/MPQ.cpp
new file mode 100644
index 0000000000..93c5eebb5b
--- /dev/null
+++ b/src/tools/mesh_extractor/MPQ.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MPQ.h"
+#include "MPQManager.h"
+#include <deque>
+#include <cstdio>
+
+MPQArchive::MPQArchive(const char* filename)
+{
+ int result = libmpq__archive_open(&mpq_a, filename, -1);
+ printf("Opening %s\n", filename);
+ if (result)
+ {
+ switch (result)
+ {
+ case LIBMPQ_ERROR_OPEN :
+ printf("Error opening archive '%s': Does file really exist?\n", filename);
+ break;
+ case LIBMPQ_ERROR_FORMAT : /* bad file format */
+ printf("Error opening archive '%s': Bad file format\n", filename);
+ break;
+ case LIBMPQ_ERROR_SEEK : /* seeking in file failed */
+ printf("Error opening archive '%s': Seeking in file failed\n", filename);
+ break;
+ case LIBMPQ_ERROR_READ : /* Read error in archive */
+ printf("Error opening archive '%s': Read error in archive\n", filename);
+ break;
+ case LIBMPQ_ERROR_MALLOC : /* maybe not enough memory? :) */
+ printf("Error opening archive '%s': Maybe not enough memory\n", filename);
+ break;
+ default:
+ printf("Error opening archive '%s': Unknown error\n", filename);
+ break;
+ }
+ }
+ GetFileListTo(Files);
+}
+
+void MPQArchive::close()
+{
+ libmpq__archive_close(mpq_a);
+}
+
+MPQFile::MPQFile(const char* filename):
+eof(false), buffer(0), pointer(0), size(0)
+{
+ for (std::deque<MPQArchive*>::iterator i = MPQHandler->Archives.begin(); i != MPQHandler->Archives.end();++i)
+ {
+ mpq_archive* mpq_a = (*i)->mpq_a;
+
+ uint32_t filenum;
+ if(libmpq__file_number(mpq_a, filename, &filenum))
+ continue;
+ libmpq__off_t transferred;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ // HACK: in patch.mpq some files don't want to open and give 1 for filesize
+ if (size<=1) {
+ // printf("warning: file %s has size %d; cannot Read.\n", filename, size);
+ eof = true;
+ buffer = 0;
+ return;
+ }
+ buffer = new char[size];
+
+ //libmpq_file_getdata
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+ /*libmpq_file_getdata(&mpq_a, hash, fileno, (unsigned char*)buffer);*/
+ return;
+
+ }
+ eof = true;
+ buffer = 0;
+}
+
+size_t MPQFile::Read(void* dest, size_t bytes)
+{
+ if (eof)
+ return 0;
+
+ size_t rpos = pointer + bytes;
+ if (rpos > size_t(size)) {
+ bytes = size - pointer;
+ eof = true;
+ }
+
+ memcpy(dest, &(buffer[pointer]), bytes);
+
+ pointer = rpos;
+
+ return bytes;
+}
+
+void MPQFile::seek(int offset)
+{
+ pointer = offset;
+ eof = (pointer >= size);
+}
+
+void MPQFile::seekRelative(int offset)
+{
+ pointer += offset;
+ eof = (pointer >= size);
+}
+
+void MPQFile::close()
+{
+ delete[] buffer;
+ buffer = 0;
+ eof = true;
+}
+
+FILE* MPQFile::GetFileStream()
+{
+ FILE* file = tmpfile();
+ if (!file)
+ {
+ printf("Could not create temporary file. Please run as Administrator or root\n");
+ exit(1);
+ }
+ fwrite(buffer, sizeof(char), size, file);
+ fseek(file, 0, SEEK_SET);
+ return file;
+}
diff --git a/src/tools/mesh_extractor/MPQ.h b/src/tools/mesh_extractor/MPQ.h
new file mode 100644
index 0000000000..7cdab23b3c
--- /dev/null
+++ b/src/tools/mesh_extractor/MPQ.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MPQ_H
+#define MPQ_H
+
+#include "libmpq/mpq.h"
+#include "Define.h"
+#include <string>
+#include <ctype.h>
+#include <vector>
+#include <iostream>
+#include <deque>
+
+class MPQArchive
+{
+
+public:
+ mpq_archive_s *mpq_a;
+
+ std::vector<std::string> Files;
+
+ MPQArchive(const char* filename);
+ void close();
+
+ void GetFileListTo(std::vector<std::string>& filelist) {
+ uint32_t filenum;
+ if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return;
+ libmpq__off_t size, transferred;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ char* buffer = new char[size + 1];
+ buffer[size] = '\0';
+
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+
+ char seps[] = "\n";
+ char* token;
+
+ token = strtok( buffer, seps );
+ uint32 counter = 0;
+ while ((token != NULL) && (counter < size)) {
+ //cout << token << endl;
+ token[strlen(token) - 1] = 0;
+ std::string s = token;
+ filelist.push_back(s);
+ counter += strlen(token) + 2;
+ token = strtok(NULL, seps);
+ }
+
+ delete[] buffer;
+ }
+};
+
+class MPQFile
+{
+ //MPQHANDLE handle;
+ bool eof;
+ char *buffer;
+ libmpq__off_t pointer,size;
+
+ // disable copying
+ MPQFile(const MPQFile& /*f*/) {}
+ void operator=(const MPQFile& /*f*/) {}
+
+public:
+ MPQFile(const char* filename); // filenames are not case sensitive
+ ~MPQFile() { close(); }
+ size_t Read(void* dest, size_t bytes);
+ FILE* GetFileStream();
+ size_t getSize() { return size; }
+ size_t getPos() { return pointer; }
+ char* getBuffer() { return buffer; }
+ char* getPointer() { return buffer + pointer; }
+ bool isEof() { return eof; }
+ void seek(int offset);
+ void seekRelative(int offset);
+ void close();
+};
+
+inline void flipcc(char *fcc)
+{
+ char t;
+ t=fcc[0];
+ fcc[0]=fcc[3];
+ fcc[3]=t;
+ t=fcc[1];
+ fcc[1]=fcc[2];
+ fcc[2]=t;
+}
+
+#endif
diff --git a/src/tools/mesh_extractor/MPQManager.cpp b/src/tools/mesh_extractor/MPQManager.cpp
new file mode 100644
index 0000000000..ffb353edc4
--- /dev/null
+++ b/src/tools/mesh_extractor/MPQManager.cpp
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MPQManager.h"
+#include "MPQ.h"
+#include "DBC.h"
+#include "Utils.h"
+#include <ace/Guard_T.h>
+
+char const* MPQManager::Files[] = {
+ "common.MPQ",
+ "common-2.MPQ",
+ "expansion.MPQ",
+ "lichking.MPQ",
+ "patch.MPQ",
+ "patch-2.MPQ",
+ "patch-3.MPQ"
+};
+
+char const* MPQManager::Languages[] = { "enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" };
+
+void MPQManager::Initialize()
+{
+ InitializeDBC();
+ uint32 size = sizeof(Files) / sizeof(char*);
+ for (uint32 i = 0; i < size; ++i)
+ {
+ MPQArchive* arc = new MPQArchive(std::string("Data/" + std::string(Files[i])).c_str());
+ Archives.push_front(arc); // MPQ files have to be transversed in reverse order to properly account for patched files
+ printf("Opened %s\n", Files[i]);
+ }
+}
+
+void MPQManager::InitializeDBC()
+{
+ BaseLocale = -1;
+ std::string fileName;
+ uint32 size = sizeof(Languages) / sizeof(char*);
+ MPQArchive* _baseLocale = NULL;
+ for (uint32 i = 0; i < size; ++i)
+ {
+ std::string _fileName = "Data/" + std::string(Languages[i]) + "/locale-" + std::string(Languages[i]) + ".MPQ";
+ FILE* file = fopen(_fileName.c_str(), "rb");
+ if (file)
+ {
+ if (BaseLocale == -1)
+ {
+ BaseLocale = i;
+ _baseLocale = new MPQArchive(_fileName.c_str());
+ fileName = _fileName;
+ LocaleFiles[i] = _baseLocale;
+ }
+ else
+ LocaleFiles[i] = new MPQArchive(_fileName.c_str());
+
+ AvailableLocales.insert(i);
+ printf("Detected locale: %s\n", Languages[i]);
+ }
+ }
+ Archives.push_front(_baseLocale);
+ if (BaseLocale == -1)
+ {
+ printf("No locale data detected. Please make sure that the executable is in the same folder as your WoW installation.\n");
+ ASSERT(false);
+ }
+ else
+ printf("Using default locale: %s\n", Languages[BaseLocale]);
+}
+
+FILE* MPQManager::GetFile(const std::string& path )
+{
+ ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
+ MPQFile file(path.c_str());
+ if (file.isEof())
+ return NULL;
+ return file.GetFileStream();
+}
+
+DBC* MPQManager::GetDBC(const std::string& name )
+{
+ std::string path = "DBFilesClient\\" + name + ".dbc";
+ return new DBC(GetFile(path));
+}
+
+FILE* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file )
+{
+ ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
+ mpq_archive* mpq_a = file->mpq_a;
+
+ uint32_t filenum;
+ if(libmpq__file_number(mpq_a, path.c_str(), &filenum))
+ return NULL;
+
+ libmpq__off_t transferred;
+ libmpq__off_t size = 0;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ // HACK: in patch.mpq some files don't want to open and give 1 for filesize
+ if (size <= 1)
+ return NULL;
+
+ uint8* buffer = new uint8[size];
+
+ //libmpq_file_getdata
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+
+ // Pack the return into a FILE stream
+ FILE* ret = tmpfile();
+ if (!ret)
+ {
+ printf("Could not create temporary file. Please run as Administrator or root\n");
+ exit(1);
+ }
+ fwrite(buffer, sizeof(uint8), size, ret);
+ fseek(ret, 0, SEEK_SET);
+ delete[] buffer;
+ return ret;
+}
diff --git a/src/tools/mesh_extractor/MPQManager.h b/src/tools/mesh_extractor/MPQManager.h
new file mode 100644
index 0000000000..72102e892a
--- /dev/null
+++ b/src/tools/mesh_extractor/MPQManager.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MPQ_MANAGER_H
+#define MPQ_MANAGER_H
+
+#include "MPQ.h"
+#include <ace/Synch.h>
+#include <set>
+#include <map>
+
+class DBC;
+class MPQManager
+{
+public:
+ MPQManager() {}
+ ~MPQManager() {}
+
+ void Initialize();
+ FILE* GetFile(const std::string& path);
+ FILE* GetFileFrom(const std::string& path, MPQArchive* file);
+ DBC* GetDBC(const std::string& name);
+ std::vector<std::string> GetAllFiles(std::string extension);
+
+ std::deque<MPQArchive*> Archives;
+ int32 BaseLocale;
+ std::set<uint32> AvailableLocales;
+ std::map<uint32, MPQArchive*> LocaleFiles;
+
+ static char const* Files[];
+ static char const* Languages[];
+protected:
+ void InitializeDBC();
+private:
+ ACE_Thread_Mutex mutex;
+};
+
+extern MPQManager* MPQHandler;
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/MapChunk.cpp b/src/tools/mesh_extractor/MapChunk.cpp
new file mode 100644
index 0000000000..ced96f985c
--- /dev/null
+++ b/src/tools/mesh_extractor/MapChunk.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MapChunk.h"
+#include "ADT.h"
+#include "LiquidHandler.h"
+
+MapChunk::MapChunk( ADT* _adt, Chunk* chunk ) : Adt(_adt), Source(chunk)
+{
+ FILE* stream = chunk->GetStream();
+ Header.Read(stream);
+ fseek(stream, chunk->Offset, SEEK_SET);
+ Index = Header.IndexX + Header.IndexY * 16;
+ GenerateVertices(stream);
+}
+
+void MapChunk::GenerateTriangles()
+{
+ Triangles.reserve(256);
+ for (int y = 0; y < 8; y++)
+ {
+ for (int x = 0; x < 8; x++)
+ {
+ if (HasHole(Header.Holes, x / 2, y / 2))
+ continue;
+
+ uint32 topLeft = (17 * y) + x;
+ uint32 topRight = (17 * y) + x + 1;
+ uint32 bottomLeft = (17 * (y + 1)) + x;
+ uint32 bottomRight = (17 * (y + 1)) + x + 1;
+ uint32 center = (17 * y) + 9 + x;
+
+ Constants::TriangleType triangleType = Constants::TRIANGLE_TYPE_TERRAIN;
+ if (Adt->_LiquidHandler && !Adt->_LiquidHandler->MCNKData.empty())
+ {
+ MCNKLiquidData& data = Adt->_LiquidHandler->MCNKData[Index];
+ float maxHeight = std::max(
+ std::max(
+ std::max(std::max(Vertices[topLeft].z, Vertices[topRight].z), Vertices[bottomLeft].z),
+ Vertices[bottomRight].z), Vertices[center].z);
+ if (data.IsWater(x, y, maxHeight))
+ triangleType = Constants::TRIANGLE_TYPE_WATER;
+ }
+
+ Triangles.push_back(Triangle<uint8>(triangleType, topRight, topLeft, center));
+ Triangles.push_back(Triangle<uint8>(triangleType, topLeft, bottomLeft, center));
+ Triangles.push_back(Triangle<uint8>(triangleType, bottomLeft, bottomRight, center));
+ Triangles.push_back(Triangle<uint8>(triangleType, bottomRight, topRight, center));
+ }
+ }
+}
+
+void MapChunk::GenerateVertices( FILE* stream )
+{
+ fseek(stream, Header.OffsetMCVT, SEEK_CUR);
+ Vertices.reserve(125);
+
+ for (int j = 0; j < 17; j++)
+ {
+ int values = j % 2 ? 8 : 9;
+ for (int i = 0; i < values; i++)
+ {
+ float tmp;
+ if (fread(&tmp, sizeof(float), 1, stream) != 1)
+ printf("MapChunk::GenerateVertices: Failed to read some data expected 1, read 0\n");
+ Vector3 vert(Header.Position.x - (j * (Constants::UnitSize * 0.5f)), Header.Position.y - (i * Constants::UnitSize), Header.Position.z + tmp);
+ if (values == 8)
+ vert.y -= Constants::UnitSize * 0.5f;
+ Vertices.push_back(vert);
+ }
+ }
+ // Restore stream position.
+ fseek(stream, Source->Offset, SEEK_SET);
+}
+
+bool MapChunk::HasHole( uint32 map, int x, int y )
+{
+ return (map & 0x0000FFFF) & ((1 << x) << (y << 2));
+}
diff --git a/src/tools/mesh_extractor/MapChunk.h b/src/tools/mesh_extractor/MapChunk.h
new file mode 100644
index 0000000000..0db4286f2b
--- /dev/null
+++ b/src/tools/mesh_extractor/MapChunk.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MAPCHUNK_H
+#define MAPCHUNK_H
+#include "Chunk.h"
+#include "Utils.h"
+#include "Constants.h"
+#include <vector>
+class ADT;
+
+class MapChunk
+{
+public:
+ MapChunk(ADT* _adt, Chunk* chunk);
+
+ void GenerateTriangles();
+ void GenerateVertices(FILE* stream);
+ static bool HasHole(uint32 map, int x, int y);
+ ADT* Adt;
+ Chunk* Source;
+ MapChunkHeader Header;
+ std::vector<Vector3> Vertices;
+ std::vector<Triangle<uint8> > Triangles;
+ int32 Index;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp
new file mode 100644
index 0000000000..22c564cadc
--- /dev/null
+++ b/src/tools/mesh_extractor/MeshExtractor.cpp
@@ -0,0 +1,476 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "MPQManager.h"
+#include "WDT.h"
+#include "ContinentBuilder.h"
+#include "Cache.h"
+#include "DBC.h"
+#include "Constants.h"
+#include "Model.h"
+
+#include "Recast.h"
+#include "DetourNavMesh.h"
+#include "DetourNavMeshQuery.h"
+
+#include <stdio.h>
+
+#include <set>
+
+MPQManager* MPQHandler;
+CacheClass* Cache;
+
+void ExtractMMaps(std::set<uint32>& mapIds, uint32 threads)
+{
+ DBC* dbc = MPQHandler->GetDBC("Map");
+ printf("Map.dbc contains %u rows.\n", dbc->Records.size());
+ for (std::vector<Record*>::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr)
+ {
+ uint32 mapId = (*itr)->Values[0];
+
+ // Skip this map if a list of specific maps was provided and this one is not contained in it.
+ if (!mapIds.empty() && mapIds.find(mapId) == mapIds.end())
+ {
+ if (Constants::Debug)
+ printf("Map %u will not be built.\n", mapId);
+ continue;
+ }
+
+ std::string name = (*itr)->GetString(1);
+ WDT wdt("World\\maps\\" + name + "\\" + name + ".wdt");
+ if (!wdt.IsValid)
+ {
+ printf("Could not find WDT data for map %u (%s)\n", mapId, name.c_str());
+ continue;
+ }
+ printf("Building %s MapId %u\n", name.c_str(), mapId);
+ ContinentBuilder builder(name, mapId, &wdt, threads);
+ builder.Build();
+ }
+}
+
+void ExtractDBCs()
+{
+ printf("Extracting DBCs\n");
+ // Create the file system structure
+ std::string baseDBCPath = "dbc/";
+ Utils::CreateDir(baseDBCPath);
+
+ std::set<std::string> DBCFiles;
+ const size_t extLen = strlen(".dbc");
+ // Populate list of DBC files
+ // We get the DBC names by going over the (guaranteed to exist) default locale files
+ // Then we look in other locale files in case that they are available.
+ for (std::vector<std::string>::iterator itr = MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.begin(); itr != MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.end(); ++itr)
+ if (itr->rfind(".dbc") == itr->length() - extLen) // Check if the extension is ".dbc"
+ DBCFiles.insert(*itr);
+
+ const size_t folderLen = strlen("DBFilesClient\\");
+ // Iterate over all available locales
+ for (std::set<uint32>::iterator itr = MPQHandler->AvailableLocales.begin(); itr != MPQHandler->AvailableLocales.end(); ++itr)
+ {
+ printf("Extracting DBCs for locale %s\n", MPQManager::Languages[*itr]);
+ std::string path = baseDBCPath;
+ if (*itr != uint32(MPQHandler->BaseLocale))
+ {
+ path += std::string(MPQManager::Languages[*itr]) + "/";
+ Utils::CreateDir(path);
+ }
+
+ std::string component = "component.wow-" + std::string(MPQManager::Languages[*itr]) + ".txt";
+ // Extract the component file
+ Utils::SaveToDisk(MPQHandler->GetFileFrom(component, MPQHandler->LocaleFiles[*itr]), path + component);
+ // Extract the DBC files for the given locale
+ for (std::set<std::string>::iterator itr2 = DBCFiles.begin(); itr2 != DBCFiles.end(); ++itr2)
+ Utils::SaveToDisk(MPQHandler->GetFileFrom(*itr2, MPQHandler->LocaleFiles[*itr]), path + (itr2->c_str() + folderLen));
+ }
+ printf("DBC extraction finished!\n");
+}
+
+void ExtractGameobjectModels()
+{
+ Constants::ToWoWCoords = true;
+ printf("Extracting GameObject models\n");
+
+ std::string baseBuildingsPath = "Buildings/";
+ std::string baseVmapsPath = "vmaps/";
+ Utils::CreateDir(baseVmapsPath);
+ Utils::CreateDir(baseBuildingsPath);
+
+ FILE* modelList = fopen((baseVmapsPath + "GameObjectModels.list").c_str(), "wb");
+ if (!modelList)
+ {
+ printf("Could not create file vmaps/GameObjectModels.list, please make sure that you have the write permissions in the folder\n");
+ return;
+ }
+
+ DBC* dbc = MPQHandler->GetDBC("GameObjectDisplayInfo");
+ for (std::vector<Record*>::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr)
+ {
+ std::string path = (*itr)->GetString(1);
+ std::string fileName = Utils::GetPlainName(path.c_str());
+ std::string extension = Utils::GetExtension(fileName);
+ // Convert the extension to lowercase
+ std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
+ if (extension == "mdx" || extension == "m2")
+ {
+ fileName = Utils::FixModelPath(fileName);
+ Model model(path);
+
+ if (model.IsBad)
+ continue;
+
+ FILE* output = fopen((baseBuildingsPath + fileName).c_str(), "wb");
+ if (!output)
+ {
+ printf("Could not create file %s, please check that you have write permissions\n", (baseBuildingsPath + fileName).c_str());
+ continue;
+ }
+ // Placeholder for 0 values
+ int Nop[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+ fwrite(Constants::VMAPMagic, 8, 1, output);
+ uint32 numVerts = model.Header.CountBoundingVertices;
+ fwrite(&numVerts, sizeof(uint32), 1, output);
+ uint32 numGroups = 1;
+ fwrite(&numGroups, sizeof(uint32), 1, output);
+ fwrite(Nop, 4 * 3 , 1, output); // rootwmoid, flags, groupid
+ fwrite(Nop, sizeof(float), 3 * 2, output);//bbox, only needed for WMO currently
+ fwrite(Nop, 4, 1, output);// liquidflags
+ fwrite("GRP ", 4, 1, output);
+
+ uint32 branches = 1;
+ uint32 wsize = sizeof(branches) + sizeof(uint32) * branches;
+ fwrite(&wsize, sizeof(uint32), 1, output);
+ fwrite(&branches, sizeof(branches), 1, output);
+ uint32 numTris = model.Header.CountBoundingTriangles;
+ fwrite(&numTris, sizeof(uint32), 1, output);
+ fwrite("INDX", 4, 1, output);
+ wsize = sizeof(uint32) + sizeof(unsigned short) * numTris;
+ fwrite(&wsize, sizeof(int), 1, output);
+ fwrite(&numTris, sizeof(uint32), 1, output);
+ uint16* indices = new uint16[numTris];
+
+ if (numTris > 0)
+ {
+ uint32 i = 0;
+ for (std::vector<Triangle<uint16> >::iterator itr2 = model.Triangles.begin(); itr2 != model.Triangles.end(); ++itr2, ++i)
+ {
+ indices[i * 3 + 0] = itr2->V0;
+ indices[i * 3 + 1] = itr2->V1;
+ indices[i * 3 + 2] = itr2->V2;
+ }
+ fwrite(indices, sizeof(uint16), numTris, output);
+ }
+
+
+ fwrite("VERT", 4, 1, output);
+ wsize = sizeof(int) + sizeof(float) * 3 * numVerts;
+ fwrite(&wsize, sizeof(int), 1, output);
+ fwrite(&numVerts, sizeof(int), 1, output);
+ float* vertices = new float[numVerts*3];
+
+ if (numVerts > 0)
+ {
+ uint32 i = 0;
+ for (std::vector<Vector3>::iterator itr2 = model.Vertices.begin(); itr2 != model.Vertices.end(); ++itr2, ++i)
+ {
+ vertices[i * 3 + 0] = itr2->x;
+ vertices[i * 3 + 1] = itr2->y;
+ vertices[i * 3 + 2] = itr2->z;
+ }
+
+ fwrite(vertices, sizeof(float), numVerts * 3, output);
+ }
+
+ fclose(output);
+ delete[] indices;
+ delete[] vertices;
+
+ uint32 displayId = (*itr)->Values[0];
+ uint32 pathLength = fileName.size();
+ fwrite(&displayId, sizeof(uint32), 1, modelList);
+ fwrite(&pathLength, sizeof(uint32), 1, modelList);
+ fwrite(fileName.c_str(), sizeof(char), pathLength, modelList);
+ }
+ else if (extension == "wmo")
+ {
+ WorldModelRoot model(path);
+
+ FILE* output = fopen((baseBuildingsPath + fileName).c_str(), "wb");
+ if (!output)
+ {
+ printf("Could not create file %s, please check that you have write permissions\n", (baseBuildingsPath + fileName).c_str());
+ continue;
+ }
+
+ fwrite(Constants::VMAPMagic, 1, 8, output);
+ uint32 numVertices = 0;
+ fwrite(&numVertices, sizeof(uint32), 1, output); // will be filled later
+ fwrite(&model.Header.CountGroups, sizeof(uint32), 1, output);
+ fwrite(&model.Header.WmoId, sizeof(uint32), 1, output);
+
+ const char grp[] = { 'G' , 'R' , 'P', ' ' };
+ for (std::vector<WorldModelGroup>::iterator itr2 = model.Groups.begin(); itr2 != model.Groups.end(); ++itr2)
+ {
+ const WMOGroupHeader& header = itr2->Header;
+ fwrite(&header.Flags, sizeof(uint32), 1, output);
+ fwrite(&header.WmoId, sizeof(uint32), 1, output);
+ fwrite(&header.BoundingBox[0], sizeof(uint32), 1, output);
+ fwrite(&header.BoundingBox[1], sizeof(uint32), 1, output);
+ uint32 LiquidFlags = itr2->HasLiquidData ? 1 : 0;
+ fwrite(&LiquidFlags, sizeof(uint32), 1, output);
+
+ fwrite(grp, sizeof(char), sizeof(grp), output);
+ uint32 k = 0;
+ uint32 mobaBatch = itr2->MOBALength / 12;
+ uint32* MobaEx = new uint32[mobaBatch*4];
+
+ for(uint32 i = 8; i < itr2->MOBALength; i += 12)
+ MobaEx[k++] = itr2->MOBA[i];
+
+ int mobaSizeGrp = mobaBatch * 4 + 4;
+ fwrite(&mobaSizeGrp, 4, 1, output);
+ fwrite(&mobaBatch, 4, 1, output);
+ fwrite(MobaEx, 4, k, output);
+ delete[] MobaEx;
+
+ //@TODO: Finish this.
+ }
+
+ fclose(output);
+ }
+ }
+
+ fclose(modelList);
+ printf("GameObject models extraction finished!");
+ Constants::ToWoWCoords = false;
+}
+
+bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapList, bool& debugOutput, uint32& extractFlags)
+{
+ char* param = NULL;
+ extractFlags = 0;
+
+ for (int i = 1; i < argc; ++i)
+ {
+ if (strcmp(argv[i], "--threads") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ threads = atoi(param);
+ printf("Using %u threads\n", threads);
+ }
+ else if (strcmp(argv[i], "--maps") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ char* copy = strdup(param);
+ char* token = strtok(copy, ",");
+ while (token)
+ {
+ mapList.insert(atoi(token));
+ token = strtok(NULL, ",");
+ }
+
+ free(copy);
+
+ printf("Extracting only provided list of maps (%u).\n", uint32(mapList.size()));
+ }
+ else if (strcmp(argv[i], "--debug") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+ debugOutput = atoi(param);
+ if (debugOutput)
+ printf("Output will contain debug information (.obj files)\n");
+ }
+ else if (strcmp(argv[i], "--extract") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ extractFlags = atoi(param);
+
+ if (!(extractFlags & Constants::EXTRACT_FLAG_ALLOWED)) // Tried to use an invalid flag
+ return false;
+
+ printf("Detected flags: \n");
+ printf("* Extract DBCs: %s\n", (extractFlags & Constants::EXTRACT_FLAG_DBC) ? "Yes" : "No");
+ printf("* Extract Maps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_MAPS) ? "Yes" : "No");
+ printf("* Extract VMaps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_VMAPS) ? "Yes" : "No");
+ printf("* Extract GameObject Models: %s\n", (extractFlags & Constants::EXTRACT_FLAG_GOB_MODELS) ? "Yes" : "No");
+ printf("* Extract MMaps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_MMAPS) ? "Yes" : "No");
+ }
+ }
+ return true;
+}
+
+void PrintUsage()
+{
+ printf("MeshExtractor help.\n");
+ printf("* Use \"--threads <number>\" to specify <number> threads, default to 4 (Only available when extracting MMaps)\n");
+ printf("* Use \"--maps a,b,c,d,e\" to extract only the maps specified (Do not use spaces)\n");
+ printf("* Use \"--debug 1\" to generate debug information of the tiles (Only available when extracting MMaps)\n");
+ printf("* Use \"--extract X\" to extract the data specified by the flag X (Note: You can combine the flags with the bitwise OR operator |). Available flags are: \n");
+ {
+ printf("- %u to extract DBCs\n", Constants::EXTRACT_FLAG_DBC);
+ printf("- %u to extract Maps (Not yet implemented)\n", Constants::EXTRACT_FLAG_MAPS);
+ printf("- %u to extract VMaps (Not yet implemented)\n", Constants::EXTRACT_FLAG_VMAPS);
+ printf("- %u to extract GameObject models (Not yet finished, you need to run VMapAssembler on the extracted files)\n", Constants::EXTRACT_FLAG_GOB_MODELS);
+ printf("- %u to extract MMaps (Not yet finished)\n", Constants::EXTRACT_FLAG_MMAPS);
+ }
+}
+
+void LoadTile(dtNavMesh*& navMesh, const char* tile)
+{
+ FILE* f = fopen(tile, "rb");
+ if (!f)
+ return;
+ MmapTileHeader header;
+
+ if (fread(&header, sizeof(MmapTileHeader), 1, f) != 1)
+ return;
+
+ uint8* nav = new uint8[header.size];
+ if (fread(nav, header.size, 1, f) != 1)
+ return;
+
+ navMesh->addTile(nav, header.size, DT_TILE_FREE_DATA, 0, NULL);
+
+ fclose(f);
+}
+
+int main(int argc, char* argv[])
+{
+ _setmaxstdio(2048);
+ uint32 threads = 4, extractFlags = 0;
+ std::set<uint32> mapIds;
+
+ if (!HandleArgs(argc, argv, threads, mapIds, Constants::Debug, extractFlags))
+ {
+ PrintUsage();
+ return -1;
+ }
+
+ if (extractFlags == 0)
+ {
+ printf("You must provide valid extract flags.\n");
+ PrintUsage();
+ return -1;
+ }
+
+ Cache = new CacheClass();
+ MPQHandler = new MPQManager();
+ MPQHandler->Initialize();
+
+ if (extractFlags & Constants::EXTRACT_FLAG_DBC)
+ ExtractDBCs();
+
+ if (extractFlags & Constants::EXTRACT_FLAG_MMAPS)
+ ExtractMMaps(mapIds, threads);
+
+ if (extractFlags & Constants::EXTRACT_FLAG_GOB_MODELS)
+ ExtractGameobjectModels();
+
+ if (extractFlags & Constants::EXTRACT_FLAG_TEST)
+ {
+ float start[] = { 16226.200195f, 16257.000000f, 13.202200f };
+ float end[] = { 16245.725586f, 16382.465820f, 47.384956f };
+
+ //
+ float m_spos[3];
+ m_spos[0] = -start[1];
+ m_spos[1] = start[2];
+ m_spos[2] = -start[0];
+
+ //
+ float m_epos[3];
+ m_epos[0] = -end[1];
+ m_epos[1] = end[2];
+ m_epos[2] = -end[0];
+
+ //
+ dtQueryFilter m_filter;
+ m_filter.setIncludeFlags(Constants::POLY_AREA_ROAD | Constants::POLY_AREA_TERRAIN);
+ m_filter.setExcludeFlags(Constants::POLY_AREA_WATER);
+
+ //
+ float m_polyPickExt[3];
+ m_polyPickExt[0] = 2.5f;
+ m_polyPickExt[1] = 2.5f;
+ m_polyPickExt[2] = 2.5f;
+
+ //
+ dtPolyRef m_startRef;
+ dtPolyRef m_endRef;
+
+ FILE* mmap = fopen("mmaps/001.mmap", "rb");
+ dtNavMeshParams params;
+ int count = fread(&params, sizeof(dtNavMeshParams), 1, mmap);
+ fclose(mmap);
+ if (count != 1)
+ {
+ printf("main: Error reading from .mmap\n");
+ return 0;
+ }
+
+ dtNavMesh* navMesh = new dtNavMesh();
+ dtNavMeshQuery* navMeshQuery = new dtNavMeshQuery();
+
+ navMesh->init(&params);
+ for (int i = 0; i <= 32; ++i)
+ {
+ for (int j = 0; j <= 32; ++j)
+ {
+ char buff[100];
+ sprintf(buff, "mmaps/001%02i%02i.mmtile", i, j);
+ LoadTile(navMesh, buff);
+ }
+ }
+
+ navMeshQuery->init(navMesh, 2048);
+
+ float nearestPt[3];
+
+ navMeshQuery->findNearestPoly(m_spos, m_polyPickExt, &m_filter, &m_startRef, nearestPt);
+ navMeshQuery->findNearestPoly(m_epos, m_polyPickExt, &m_filter, &m_endRef, nearestPt);
+
+ if ( !m_startRef || !m_endRef )
+ {
+ std::cerr << "Could not find any nearby poly's (" << m_startRef << "," << m_endRef << ")" << std::endl;
+ return 0;
+ }
+
+ int hops;
+ dtPolyRef* hopBuffer = new dtPolyRef[8192];
+ dtStatus status = navMeshQuery->findPath(m_startRef, m_endRef, m_spos, m_epos, &m_filter, hopBuffer, &hops, 8192);
+
+ int resultHopCount;
+ float* straightPath = new float[2048*3];
+ unsigned char* pathFlags = new unsigned char[2048];
+ dtPolyRef* pathRefs = new dtPolyRef[2048];
+
+ status = navMeshQuery->findStraightPath(m_spos, m_epos, hopBuffer, hops, straightPath, pathFlags, pathRefs, &resultHopCount, 2048);
+ std::vector<Vector3> FinalPath;
+ FinalPath.reserve(resultHopCount);
+ for (int32 i = 0; i < resultHopCount; ++i)
+ {
+ Vector3 finalV = Utils::ToWoWCoords(Vector3(straightPath[i * 3 + 0], straightPath[i * 3 + 1], straightPath[i * 3 + 2]));
+ FinalPath.push_back(finalV);
+ printf("Point %f %f %f\n", finalV.x, finalV.y, finalV.z);
+ }
+ }
+
+ return 0;
+}
diff --git a/src/tools/mesh_extractor/Model.cpp b/src/tools/mesh_extractor/Model.cpp
new file mode 100644
index 0000000000..d696cb7990
--- /dev/null
+++ b/src/tools/mesh_extractor/Model.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Model.h"
+#include "MPQManager.h"
+#include "Utils.h"
+
+Model::Model( std::string path ) : IsCollidable(false), IsBad(false)
+{
+ Stream = MPQHandler->GetFile(Utils::FixModelPath(path));
+ if (!Stream)
+ {
+ IsBad = true;
+ return;
+ }
+ Header.Read(Stream);
+ if (Header.OffsetBoundingNormals > 0 && Header.OffsetBoundingVertices > 0 &&
+ Header.OffsetBoundingTriangles > 0 && Header.BoundingRadius > 0.0f)
+ {
+ IsCollidable = true;
+ ReadVertices();
+ ReadBoundingNormals();
+ ReadBoundingTriangles();
+ }
+}
+
+Model::~Model()
+{
+ if (Stream)
+ fclose(Stream);
+}
+
+void Model::ReadVertices()
+{
+ fseek(Stream, Header.OffsetBoundingVertices, SEEK_SET);
+ Vertices.reserve(Header.CountBoundingVertices);
+ for (uint32 i = 0; i < Header.CountBoundingVertices; ++i)
+ {
+ Vertices.push_back(Vector3::Read(Stream));
+ if (Constants::ToWoWCoords)
+ Vertices[i] = Utils::ToWoWCoords(Vertices[i]);
+ }
+}
+
+void Model::ReadBoundingTriangles()
+{
+ fseek(Stream, Header.OffsetBoundingTriangles, SEEK_SET);
+ Triangles.reserve(Header.CountBoundingTriangles / 3);
+ for (uint32 i = 0; i < Header.CountBoundingTriangles / 3; i++)
+ {
+ Triangle<uint16> tri;
+ tri.Type = Constants::TRIANGLE_TYPE_DOODAD;
+ int count = 0;
+ count += fread(&tri.V0, sizeof(uint16), 1, Stream);
+ count += fread(&tri.V1, sizeof(uint16), 1, Stream);
+ count += fread(&tri.V2, sizeof(uint16), 1, Stream);
+ if (count != 3)
+ printf("Model::ReadBoundingTriangles: Error reading data, expected 3, read %d\n", count);
+ Triangles.push_back(tri);
+ }
+}
+
+void Model::ReadBoundingNormals()
+{
+ fseek(Stream, Header.OffsetBoundingNormals, SEEK_SET);
+ Normals.reserve(Header.CountBoundingNormals);
+ for (uint32 i = 0; i < Header.CountBoundingNormals; i++)
+ Normals.push_back(Vector3::Read(Stream));
+}
+
diff --git a/src/tools/mesh_extractor/Model.h b/src/tools/mesh_extractor/Model.h
new file mode 100644
index 0000000000..235f518814
--- /dev/null
+++ b/src/tools/mesh_extractor/Model.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MODEL_H
+#define MODEL_H
+#include <vector>
+#include "Utils.h"
+
+class Model
+{
+public:
+ Model(std::string path);
+ ~Model();
+
+ void ReadVertices();
+ void ReadBoundingTriangles();
+ void ReadBoundingNormals();
+ ModelHeader Header;
+ std::vector<Vector3> Vertices;
+ std::vector<Vector3> Normals;
+ std::vector<Triangle<uint16> > Triangles;
+ bool IsCollidable;
+ FILE* Stream;
+ bool IsBad;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ObjectDataHandler.cpp b/src/tools/mesh_extractor/ObjectDataHandler.cpp
new file mode 100644
index 0000000000..a61b3c8564
--- /dev/null
+++ b/src/tools/mesh_extractor/ObjectDataHandler.cpp
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ObjectDataHandler.h"
+#include "Chunk.h"
+#include "ADT.h"
+#include "ChunkedData.h"
+
+void ObjectDataHandler::ProcessMapChunk( MapChunk* chunk )
+{
+ ProcessInternal(chunk);
+}
diff --git a/src/tools/mesh_extractor/ObjectDataHandler.h b/src/tools/mesh_extractor/ObjectDataHandler.h
new file mode 100644
index 0000000000..c159c6477e
--- /dev/null
+++ b/src/tools/mesh_extractor/ObjectDataHandler.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef ODATA_HNDL_H
+#define ODATA_HNDL_H
+#include "ADT.h"
+#include "MapChunk.h"
+
+class ObjectDataHandler
+{
+public:
+ ObjectDataHandler(ADT* _adt) : Source(_adt) {}
+
+ void ProcessMapChunk(MapChunk* chunk);
+ virtual void ProcessInternal(MapChunk* data) = 0;
+ ADT* Source;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp
new file mode 100644
index 0000000000..156c073cf5
--- /dev/null
+++ b/src/tools/mesh_extractor/TileBuilder.cpp
@@ -0,0 +1,404 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "ContinentBuilder.h"
+#include "TileBuilder.h"
+#include "Geometry.h"
+#include "WorldModelRoot.h"
+#include "Constants.h"
+#include "Utils.h"
+#include "Cache.h"
+#include "ADT.h"
+#include "WDT.h"
+#include "Recast.h"
+#include "RecastAlloc.h"
+#include "DetourNavMeshBuilder.h"
+
+#include <ace/Synch.h>
+
+TileBuilder::TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, int y, uint32 mapId) :
+ World(world), X(x), Y(y), MapId(mapId), _Geometry(NULL), DataSize(0), cBuilder(_cBuilder)
+{
+ // Config for normal maps
+ memset(&Config, 0, sizeof(rcConfig));
+ Config.cs = Constants::TileSize / 1800.0f; // TileSize / voxelSize
+ Config.ch = 0.3f;
+ Config.minRegionArea = 36;
+ Config.mergeRegionArea = 144;
+ Config.walkableSlopeAngle = 50.0f;
+ Config.detailSampleDist = 3.0f;
+ Config.detailSampleMaxError = 1.25f;
+ Config.walkableClimb = 1.0f / Config.ch;
+ Config.walkableHeight = 2.1 / Config.ch;
+ Config.walkableRadius = 0.6f / Config.cs;
+ Config.maxEdgeLen = Config.walkableRadius * 8;
+ Config.borderSize = Config.walkableRadius + 8;
+ Config.tileSize = 1800;
+ Config.maxSimplificationError = 1.3f;
+ Config.maxVertsPerPoly = 6;
+
+ // Config for instances
+ memset(&InstanceConfig, 0, sizeof(rcConfig));
+ InstanceConfig.cs = 0.2f;
+ InstanceConfig.ch = 0.3f;
+ InstanceConfig.minRegionArea = 25;
+ InstanceConfig.mergeRegionArea = 100;
+ InstanceConfig.walkableSlopeAngle = 50.0f;
+ InstanceConfig.detailSampleDist = 3.0f;
+ InstanceConfig.detailSampleMaxError = 1.5f;
+ InstanceConfig.walkableClimb = 1.0f / InstanceConfig.ch;
+ InstanceConfig.walkableHeight = 2.1f / InstanceConfig.ch;
+ InstanceConfig.walkableRadius = 0.6f / InstanceConfig.cs;
+ InstanceConfig.maxEdgeLen = 8 * InstanceConfig.walkableRadius;
+ InstanceConfig.maxVertsPerPoly = 6;
+ InstanceConfig.maxSimplificationError = 1.25f;
+ InstanceConfig.borderSize = 0;
+
+ Context = new rcContext;
+}
+
+void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshParams& /*navMeshParams*/ )
+{
+ bmin = new float[3];
+ bmax = new float[3];
+ bmin[0] = Constants::Origin[0] /*navMeshParams.orig[0]*/ + (Constants::TileSize * X);
+ bmin[2] = Constants::Origin[2] /*navMeshParams.orig[2]*/ + (Constants::TileSize * Y);
+ bmax[0] = Constants::Origin[0] /*navMeshParams.orig[0]*/ + (Constants::TileSize * (X + 1));
+ bmax[2] = Constants::Origin[2] /*navMeshParams.orig[2]*/ + (Constants::TileSize * (Y + 1));
+}
+
+void TileBuilder::AddGeometry(WorldModelRoot* root, const WorldModelDefinition& def)
+{
+ _Geometry = new Geometry();
+ _Geometry->Transform = true;
+
+ WorldModelHandler::InsertModelGeometry(_Geometry->Vertices, _Geometry->Triangles, def, root, false);
+
+ OutputDebugVertices();
+}
+
+uint8* TileBuilder::BuildInstance( dtNavMeshParams& navMeshParams )
+{
+ float* bmin = NULL, *bmax = NULL;
+
+ _Geometry->CalculateBoundingBox(bmin, bmax);
+
+ rcVcopy(InstanceConfig.bmax, bmax);
+ rcVcopy(InstanceConfig.bmin, bmin);
+
+ uint32 numVerts = _Geometry->Vertices.size();
+ uint32 numTris = _Geometry->Triangles.size();
+ float* vertices;
+ int* triangles;
+ uint8* areas;
+ _Geometry->GetRawData(vertices, triangles, areas);
+
+ // this sets the dimensions of the heightfield
+ rcCalcGridSize(InstanceConfig.bmin, InstanceConfig.bmax, InstanceConfig.cs, &InstanceConfig.width, &InstanceConfig.height);
+
+ rcHeightfield* hf = rcAllocHeightfield();
+ rcCreateHeightfield(Context, *hf, InstanceConfig.width, InstanceConfig.height, InstanceConfig.bmin, InstanceConfig.bmax, InstanceConfig.cs, InstanceConfig.ch);
+
+ rcClearUnwalkableTriangles(Context, InstanceConfig.walkableSlopeAngle, vertices, numVerts, triangles, numTris, areas);
+ rcRasterizeTriangles(Context, vertices, numVerts, triangles, areas, numTris, *hf, InstanceConfig.walkableClimb);
+
+ rcFilterLowHangingWalkableObstacles(Context, InstanceConfig.walkableClimb, *hf);
+ rcFilterLedgeSpans(Context, InstanceConfig.walkableHeight, InstanceConfig.walkableClimb, *hf);
+ rcFilterWalkableLowHeightSpans(Context, InstanceConfig.walkableHeight, *hf);
+
+ rcCompactHeightfield* chf = rcAllocCompactHeightfield();
+ rcBuildCompactHeightfield(Context, InstanceConfig.walkableHeight, InstanceConfig.walkableClimb, *hf, *chf);
+
+ rcErodeWalkableArea(Context, InstanceConfig.walkableRadius, *chf);
+ rcBuildDistanceField(Context, *chf);
+ rcBuildRegions(Context, *chf, InstanceConfig.borderSize, InstanceConfig.minRegionArea, InstanceConfig.minRegionArea);
+
+ rcContourSet* contours = rcAllocContourSet();
+ rcBuildContours(Context, *chf, InstanceConfig.maxSimplificationError, InstanceConfig.maxEdgeLen, *contours);
+
+ rcPolyMesh* pmesh = rcAllocPolyMesh();
+ rcBuildPolyMesh(Context, *contours, InstanceConfig.maxVertsPerPoly, *pmesh);
+
+ rcPolyMeshDetail* dmesh = rcAllocPolyMeshDetail();
+ rcBuildPolyMeshDetail(Context, *pmesh, *chf, InstanceConfig.detailSampleDist, InstanceConfig.detailSampleMaxError, *dmesh);
+
+ // Set flags according to area types (e.g. Swim for Water)
+ for (int i = 0; i < pmesh->npolys; i++)
+ {
+ if (pmesh->areas[i] == Constants::POLY_AREA_ROAD || pmesh->areas[i] == Constants::POLY_AREA_TERRAIN)
+ pmesh->flags[i] = Constants::POLY_FLAG_WALK;
+ else if (pmesh->areas[i] == Constants::POLY_AREA_WATER)
+ pmesh->flags[i] = Constants::POLY_FLAG_SWIM;
+ }
+
+ dtNavMeshCreateParams params;
+ memset(&params, 0, sizeof(params));
+ // PolyMesh data
+ params.verts = pmesh->verts;
+ params.vertCount = pmesh->nverts;
+ params.polys = pmesh->polys;
+ params.polyAreas = pmesh->areas;
+ params.polyFlags = pmesh->flags;
+ params.polyCount = pmesh->npolys;
+ params.nvp = pmesh->nvp;
+ // PolyMeshDetail data
+ params.detailMeshes = dmesh->meshes;
+ params.detailVerts = dmesh->verts;
+ params.detailVertsCount = dmesh->nverts;
+ params.detailTris = dmesh->tris;
+ params.detailTriCount = dmesh->ntris;
+ rcVcopy(params.bmin, pmesh->bmin);
+ rcVcopy(params.bmax, pmesh->bmax);
+ // General settings
+ params.ch = InstanceConfig.ch;
+ params.cs = InstanceConfig.cs;
+ params.walkableClimb = InstanceConfig.walkableClimb * InstanceConfig.ch;
+ params.walkableHeight = InstanceConfig.walkableHeight * InstanceConfig.ch;
+ params.walkableRadius = InstanceConfig.walkableRadius * InstanceConfig.cs;
+ params.tileX = X;
+ params.tileY = Y;
+ params.tileLayer = 0;
+ params.buildBvTree = true;
+
+ rcVcopy(params.bmax, bmax);
+ rcVcopy(params.bmin, bmin);
+
+ // Offmesh-connection settings
+ params.offMeshConCount = 0; // none for now
+
+ rcFreeHeightField(hf);
+ rcFreeCompactHeightfield(chf);
+ rcFreeContourSet(contours);
+ delete vertices;
+ delete triangles;
+ delete areas;
+ delete bmin;
+ delete bmax;
+
+ if (!params.polyCount || !params.polys || Constants::TilesPerMap * Constants::TilesPerMap == params.polyCount)
+ {
+ // we have flat tiles with no actual geometry - don't build those, its useless
+ // keep in mind that we do output those into debug info
+ // drop tiles with only exact count - some tiles may have geometry while having less tiles
+ printf("No polygons to build on tile, skipping.\n");
+ rcFreePolyMesh(pmesh);
+ rcFreePolyMeshDetail(dmesh);
+ return NULL;
+ }
+
+ int navDataSize;
+ uint8* navData;
+ printf("Creating the navmesh with %i vertices, %i polys, %i triangles!\n", params.vertCount, params.polyCount, params.detailTriCount);
+ bool result = dtCreateNavMeshData(&params, &navData, &navDataSize);
+
+ rcFreePolyMesh(pmesh);
+ rcFreePolyMeshDetail(dmesh);
+
+ if (result)
+ {
+ printf("NavMesh created, size %i!\n", navDataSize);
+ DataSize = navDataSize;
+ return navData;
+ }
+
+ return NULL;
+}
+
+uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams)
+{
+ _Geometry = new Geometry();
+ _Geometry->Transform = true;
+ ADT* adt = new ADT(Utils::GetAdtPath(World, X, Y), X, Y);
+ adt->Read();
+ _Geometry->AddAdt(adt);
+ delete adt;
+
+ if (_Geometry->Vertices.empty() && _Geometry->Triangles.empty())
+ return NULL;
+
+ float* bmin = NULL, *bmax = NULL;
+ CalculateTileBounds(bmin, bmax, navMeshParams);
+ _Geometry->CalculateMinMaxHeight(bmin[1], bmax[1]);
+
+ // again, we load everything - wasteful but who cares
+ for (int ty = Y - 1; ty <= Y + 1; ty++)
+ {
+ for (int tx = X - 1; tx <= X + 1; tx++)
+ {
+ // don't load main tile again
+ if (tx == X && ty == Y)
+ continue;
+
+ ADT* _adt = new ADT(Utils::GetAdtPath(World, tx, ty), tx, ty);
+ // If this condition is met, it means that this WDT does not contain the ADT
+ if (!_adt->Data->Stream)
+ {
+ delete _adt;
+ continue;
+ }
+ _adt->Read();
+ _Geometry->AddAdt(_adt);
+ delete _adt;
+ }
+ }
+
+ OutputDebugVertices();
+
+ uint32 numVerts = _Geometry->Vertices.size();
+ uint32 numTris = _Geometry->Triangles.size();
+ float* vertices;
+ int* triangles;
+ uint8* areas;
+ _Geometry->GetRawData(vertices, triangles, areas);
+ _Geometry->Vertices.clear();
+ _Geometry->Triangles.clear();
+
+ // add border
+ bmin[0] -= Config.borderSize * Config.cs;
+ bmin[2] -= Config.borderSize * Config.cs;
+ bmax[0] += Config.borderSize * Config.cs;
+ bmax[2] += Config.borderSize * Config.cs;
+
+ rcHeightfield* hf = rcAllocHeightfield();
+ int width = Config.tileSize + (Config.borderSize * 2);
+ rcCreateHeightfield(Context, *hf, width, width, bmin, bmax, Config.cs, Config.ch);
+
+ rcClearUnwalkableTriangles(Context, Config.walkableSlopeAngle, vertices, numVerts, triangles, numTris, areas);
+ rcRasterizeTriangles(Context, vertices, numVerts, triangles, areas, numTris, *hf, Config.walkableClimb);
+
+ rcFilterLowHangingWalkableObstacles(Context, Config.walkableClimb, *hf);
+ rcFilterLedgeSpans(Context, Config.walkableHeight, Config.walkableClimb, *hf);
+ rcFilterWalkableLowHeightSpans(Context, Config.walkableHeight, *hf);
+
+ rcCompactHeightfield* chf = rcAllocCompactHeightfield();
+ rcBuildCompactHeightfield(Context, Config.walkableHeight, Config.walkableClimb, *hf, *chf);
+
+ rcErodeWalkableArea(Context, Config.walkableRadius, *chf);
+ rcBuildDistanceField(Context, *chf);
+ rcBuildRegions(Context, *chf, Config.borderSize, Config.minRegionArea, Config.mergeRegionArea);
+
+ rcContourSet* contours = rcAllocContourSet();
+ rcBuildContours(Context, *chf, Config.maxSimplificationError, Config.maxEdgeLen, *contours);
+
+ rcPolyMesh* pmesh = rcAllocPolyMesh();
+ rcBuildPolyMesh(Context, *contours, Config.maxVertsPerPoly, *pmesh);
+
+ rcPolyMeshDetail* dmesh = rcAllocPolyMeshDetail();
+ rcBuildPolyMeshDetail(Context, *pmesh, *chf, Config.detailSampleDist, Config.detailSampleMaxError, *dmesh);
+
+ // Set flags according to area types (e.g. Swim for Water)
+ for (int i = 0; i < pmesh->npolys; i++)
+ {
+ if (pmesh->areas[i] == Constants::POLY_AREA_ROAD || pmesh->areas[i] == Constants::POLY_AREA_TERRAIN)
+ pmesh->flags[i] = Constants::POLY_FLAG_WALK;
+ else if (pmesh->areas[i] == Constants::POLY_AREA_WATER)
+ pmesh->flags[i] = Constants::POLY_FLAG_SWIM;
+ }
+
+ dtNavMeshCreateParams params;
+ memset(&params, 0, sizeof(params));
+ // PolyMesh data
+ params.verts = pmesh->verts;
+ params.vertCount = pmesh->nverts;
+ params.polys = pmesh->polys;
+ params.polyAreas = pmesh->areas;
+ params.polyFlags = pmesh->flags;
+ params.polyCount = pmesh->npolys;
+ params.nvp = pmesh->nvp;
+ // PolyMeshDetail data
+ params.detailMeshes = dmesh->meshes;
+ params.detailVerts = dmesh->verts;
+ params.detailVertsCount = dmesh->nverts;
+ params.detailTris = dmesh->tris;
+ params.detailTriCount = dmesh->ntris;
+ // General settings
+ params.ch = Config.ch;
+ params.cs = Config.cs;
+ params.walkableClimb = Config.walkableClimb * Config.ch;
+ params.walkableHeight = Config.walkableHeight * Config.ch;
+ params.walkableRadius = Config.walkableRadius * Config.cs;
+ params.tileX = X;
+ params.tileY = Y;
+ params.tileLayer = 0;
+ params.buildBvTree = true;
+
+ // Recalculate the bounds with the added geometry
+ float* bmin2 = NULL, *bmax2 = NULL;
+ CalculateTileBounds(bmin2, bmax2, navMeshParams);
+ bmin2[1] = bmin[1];
+ bmax2[1] = bmax[1];
+
+ rcVcopy(params.bmax, bmax2);
+ rcVcopy(params.bmin, bmin2);
+
+ // Offmesh-connection settings
+ params.offMeshConCount = 0; // none for now
+
+ rcFreeHeightField(hf);
+ rcFreeCompactHeightfield(chf);
+ rcFreeContourSet(contours);
+ delete vertices;
+ delete triangles;
+ delete areas;
+ delete bmin;
+ delete bmax;
+
+ if (!params.polyCount || !params.polys || Constants::TilesPerMap * Constants::TilesPerMap == params.polyCount)
+ {
+ // we have flat tiles with no actual geometry - don't build those, its useless
+ // keep in mind that we do output those into debug info
+ // drop tiles with only exact count - some tiles may have geometry while having less tiles
+ printf("[%02i, %02i] No polygons to build on tile, skipping.\n", X, Y);
+ rcFreePolyMesh(pmesh);
+ rcFreePolyMeshDetail(dmesh);
+ return NULL;
+ }
+
+ int navDataSize;
+ uint8* navData;
+ printf("[%02i, %02i] Creating the navmesh with %i vertices, %i polys, %i triangles!\n", X, Y, params.vertCount, params.polyCount, params.detailTriCount);
+ bool result = dtCreateNavMeshData(&params, &navData, &navDataSize);
+
+ rcFreePolyMesh(pmesh);
+ rcFreePolyMeshDetail(dmesh);
+
+ if (result)
+ {
+ printf("[%02i, %02i] NavMesh created, size %i!\n", X, Y, navDataSize);
+ DataSize = navDataSize;
+ return navData;
+ }
+
+ return NULL;
+}
+
+void TileBuilder::OutputDebugVertices()
+{
+ if (Constants::Debug)
+ {
+ char buff[100];
+ sprintf(buff, "mmaps/%s_%02u%02u.obj", World.c_str(), Y, X);
+ FILE* debug = fopen(buff, "wb");
+ for (uint32 i = 0; i < _Geometry->Vertices.size(); ++i)
+ {
+ const Vector3& vector = _Geometry->Vertices[i];
+ fprintf(debug, "v %f %f %f\n", vector.x, vector.y, vector.z);
+ }
+ for (uint32 i = 0; i < _Geometry->Triangles.size(); ++i)
+ {
+ const Triangle<uint32>& triangle = _Geometry->Triangles[i];
+ fprintf(debug, "f %u %u %u\n", triangle.V0 + 1, triangle.V1 + 1, triangle.V2 + 1);
+ }
+ fclose(debug);
+ }
+}
+
+TileBuilder::~TileBuilder()
+{
+ delete Context;
+ delete _Geometry;
+}
diff --git a/src/tools/mesh_extractor/TileBuilder.h b/src/tools/mesh_extractor/TileBuilder.h
new file mode 100644
index 0000000000..37bb4792c1
--- /dev/null
+++ b/src/tools/mesh_extractor/TileBuilder.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef TILE_BUILD_H
+#define TILE_BUILD_H
+#include <string>
+#include "Recast.h"
+
+#include "Geometry.h"
+#include "WorldModelRoot.h"
+
+class ContinentBuilder;
+class WDT;
+
+class TileBuilder
+{
+public:
+ TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, int y, uint32 mapId);
+ ~TileBuilder();
+
+ void CalculateTileBounds(float*& bmin, float*& bmax, dtNavMeshParams& navMeshParams);
+ uint8* BuildTiled(dtNavMeshParams& navMeshParams);
+ uint8* BuildInstance(dtNavMeshParams& navMeshParams);
+ void AddGeometry(WorldModelRoot* root, const WorldModelDefinition& def);
+ void OutputDebugVertices();
+ std::string World;
+ int X;
+ int Y;
+ int MapId;
+ rcConfig Config;
+ rcConfig InstanceConfig;
+ rcContext* Context;
+ Geometry* _Geometry;
+ uint32 DataSize;
+ ContinentBuilder* cBuilder;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp
new file mode 100644
index 0000000000..f568e26cc0
--- /dev/null
+++ b/src/tools/mesh_extractor/Utils.cpp
@@ -0,0 +1,554 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "Utils.h"
+#include "WorldModelHandler.h"
+#include "Constants.h"
+#include <cstring>
+#include "G3D/Matrix4.h"
+#include "G3D/Quat.h"
+
+#ifdef _WIN32
+ #include "direct.h"
+#else
+ #include <sys/stat.h>
+ #include <unistd.h>
+#endif
+
+const float Constants::TileSize = 533.0f + (1/3.0f);
+const float Constants::MaxXY = 32.0f * Constants::TileSize;
+const float Constants::ChunkSize = Constants::TileSize / 16.0f;
+const float Constants::UnitSize = Constants::ChunkSize / 8.0f;
+const float Constants::Origin[] = { -Constants::MaxXY, 0.0f, -Constants::MaxXY };
+const float Constants::PI = 3.1415926f;
+const float Constants::MaxStandableHeight = 1.5f;
+const char* Constants::VMAPMagic = "VMAP041";
+bool Constants::ToWoWCoords = false;
+bool Constants::Debug = false;
+const float Constants::BaseUnitDim = 0.533333f;
+const int Constants::VertexPerMap = (Constants::TileSize / Constants::BaseUnitDim) + 0.5f;
+const int Constants::VertexPerTile = 40;
+const int Constants::TilesPerMap = Constants::VertexPerMap / Constants::VertexPerTile;
+
+void Utils::CreateDir( const std::string& Path )
+{
+#ifdef _WIN32
+ _mkdir( Path.c_str());
+#else
+ mkdir( Path.c_str(), 0777 );
+#endif
+}
+
+void Utils::Reverse(char word[])
+{
+ int len = strlen(word);
+ for (int i = 0;i < len / 2; i++)
+ {
+ word[i] ^= word[len-i-1];
+ word[len-i-1] ^= word[i];
+ word[i] ^= word[len-i-1];
+ }
+}
+
+std::string Utils::ReadString( FILE* file )
+{
+ std::string ret;
+ while (true)
+ {
+ char b;
+ if (fread(&b, sizeof(char), 1, file) != 1 || b == 0)
+ break;
+ ret.push_back(b);
+ }
+ return ret;
+}
+
+uint32 Utils::Size( FILE* file )
+{
+ // store the old position
+ uint32 offset = ftell(file);
+ // Get file size
+ fseek(file, 0, SEEK_END);
+ uint32 size = ftell(file);
+ // reset back to the old position
+ fseek(file, offset, SEEK_SET);
+ return size;
+}
+
+Vector3 Utils::ToRecast(const Vector3& val )
+{
+ return Vector3(-val.y, val.z, -val.x);
+}
+
+std::string Utils::GetAdtPath(const std::string& world, int x, int y )
+{
+ return "World\\Maps\\" + world + "\\" + world + "_" + Utils::ToString(x) + "_" + Utils::ToString(y) + ".adt";
+}
+
+std::string Utils::FixModelPath(const std::string& path )
+{
+ return Utils::GetPathBase(path) + ".M2";
+}
+
+Vector3 Utils::TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool translate)
+{
+ // Sources of information:
+ /// http://www.pxr.dk/wowdev/wiki/index.php?title=ADT/v18&oldid=3715
+
+ // This function applies to both external doodads and WMOs
+
+ // Rotate our Doodad vertex
+ G3D::Matrix4 rot = G3D::Matrix3::fromEulerAnglesXYZ(Utils::ToRadians(def.Rotation.z), Utils::ToRadians(-def.Rotation.x), Utils::ToRadians(def.Rotation.y + 180));
+ Vector3 ret = Utils::VectorTransform(vec, rot);
+
+ // And finally scale and translate it to our origin
+ ret = ret * def.Scale();
+ if (translate)
+ ret = ret + Vector3(Constants::MaxXY - def.Position.z, Constants::MaxXY - def.Position.x, def.Position.y);
+ return ret;
+}
+
+Vector3 Utils::TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate )
+{
+ G3D::Quat quat = G3D::Quat(-inst.QuatY, inst.QuatZ, -inst.QuatX, inst.QuatW);
+
+ Vector3 ret = Utils::VectorTransform(vec, G3D::Matrix4(quat.toRotationMatrix()));
+ ret = ret * (inst.Scale / 1024.0f);
+ if (translate)
+ ret = ret + Vector3(Constants::MaxXY - inst.Position.z, Constants::MaxXY - inst.Position.x, inst.Position.y);
+ return ret;
+}
+
+float Utils::ToRadians( float degrees )
+{
+ return Constants::PI * degrees / 180.0f;
+}
+
+Vector3 Utils::VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal )
+{
+ G3D::Vector3 ret(vec.x, vec.y, vec.z);
+ ret = matrix.homoMul(ret, normal ? 0 : 1);
+ return Vector3(ret.x, ret.y, ret.z);
+}
+
+std::string Utils::GetPathBase(const std::string& path )
+{
+ size_t lastIndex = path.find_last_of(".");
+ if (lastIndex != std::string::npos)
+ return path.substr(0, lastIndex);
+ return path;
+}
+
+Vector3 Vector3::Read( FILE* file )
+{
+ Vector3 ret;
+ if (fread(&ret, sizeof(Vector3), 1, file) != 1)
+ printf("Vector3::Read: Failed to read some data expected 1, read 0\n");
+ return ret;
+}
+
+Vector3 Utils::GetLiquidVert(const IDefinition& def, Vector3 basePosition, float height, int x, int y, bool translate)
+{
+ if (Utils::Distance(height, 0.0f) > 0.5f)
+ basePosition.z = 0.0f;
+ return Utils::TransformDoodadVertex(def, basePosition + Vector3(x * Constants::UnitSize, y * Constants::UnitSize, height), translate);
+}
+
+float Utils::Distance( float x, float y )
+{
+ return sqrt(x*x + y*y);
+}
+
+std::string Utils::Replace( std::string str, const std::string& oldStr, const std::string& newStr )
+{
+ size_t pos = 0;
+ while((pos = str.find(oldStr, pos)) != std::string::npos)
+ {
+ str.replace(pos, oldStr.length(), newStr);
+ pos += newStr.length();
+ }
+ return str;
+}
+
+void Utils::SaveToDisk( FILE* stream, const std::string& path )
+{
+ FILE* disk = fopen(path.c_str(), "wb");
+ if (!disk)
+ {
+ printf("SaveToDisk: Could not save file %s to disk, please verify that you have write permissions on that directory\n", path.c_str());
+ fclose(stream);
+ return;
+ }
+
+ uint32 size = Utils::Size(stream);
+ uint8* data = new uint8[size];
+ // Read the data to an array
+ size_t read = fread(data, size, 1, stream);
+ if (read != 1)
+ {
+ printf("SaveToDisk: Error reading from Stream while trying to save file %s to disk.\n", path.c_str());
+ fclose(disk);
+ fclose(stream);
+ return;
+ }
+
+ // And write it in the file
+ size_t wrote = fwrite(data, size, 1, disk);
+ if (wrote != 1)
+ {
+ printf("SaveToDisk: Error writing to the file while trying to save %s to disk.\n", path.c_str());
+ fclose(stream);
+ fclose(disk);
+ return;
+ }
+
+ // Close the filestream
+ fclose(disk);
+ fclose(stream);
+
+ // Free the used memory
+ delete[] data;
+}
+
+Vector3 Utils::ToWoWCoords(const Vector3& vec )
+{
+ return Vector3(-vec.z, -vec.x, vec.y);
+}
+
+std::string Utils::GetExtension( std::string path )
+{
+ std::string::size_type idx = path.rfind('.');
+ std::string extension = "";
+
+ if(idx != std::string::npos)
+ extension = path.substr(idx+1);
+ return extension;
+}
+
+void MapChunkHeader::Read(FILE* stream)
+{
+ int count = 0;
+
+ count += fread(&Flags, sizeof(uint32), 1, stream);
+ count += fread(&IndexX, sizeof(uint32), 1, stream);
+ count += fread(&IndexY, sizeof(uint32), 1, stream);
+ count += fread(&Layers, sizeof(uint32), 1, stream);
+ count += fread(&DoodadRefs, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCVT, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCNR, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCLY, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCRF, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCAL, sizeof(uint32), 1, stream);
+ count += fread(&SizeMCAL, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCSH, sizeof(uint32), 1, stream);
+ count += fread(&SizeMCSH, sizeof(uint32), 1, stream);
+ count += fread(&AreaId, sizeof(uint32), 1, stream);
+ count += fread(&MapObjectRefs, sizeof(uint32), 1, stream);
+ count += fread(&Holes, sizeof(uint32), 1, stream);
+ LowQualityTextureMap = new uint32[4];
+ count += fread(LowQualityTextureMap, sizeof(uint32), 4, stream);
+ count += fread(&PredTex, sizeof(uint32), 1, stream);
+ count += fread(&NumberEffectDoodad, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCSE, sizeof(uint32), 1, stream);
+ count += fread(&SoundEmitters, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCLQ, sizeof(uint32), 1, stream);
+ count += fread(&SizeMCLQ, sizeof(uint32), 1, stream);
+ Position = Vector3::Read(stream);
+ count += fread(&OffsetMCCV, sizeof(uint32), 1, stream);
+
+ if (count != 27)
+ printf("MapChunkHeader::Read: Failed to read some data expected 27, read %d\n", count);
+}
+
+void MHDR::Read(FILE* stream)
+{
+ int count = 0;
+
+ count += fread(&Flags, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMCIN, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMTEX, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMMDX, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMMID, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMWMO, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMWID, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMDDF, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMODF, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMFBO, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMH2O, sizeof(uint32), 1, stream);
+ count += fread(&OffsetMTFX, sizeof(uint32), 1, stream);
+
+ if (count != 12)
+ printf("MHDR::Read: Failed to read some data expected 12, read %d\n", count);
+}
+
+void ModelHeader::Read(FILE* stream)
+{
+ int count = 0;
+
+ count += fread(&Magic, sizeof(char), 4, stream);
+ Magic[4] = '\0'; // null-terminate it.
+ count += fread(&Version, sizeof(uint32), 1, stream);
+ count += fread(&LengthModelName, sizeof(uint32), 1, stream);
+ count += fread(&OffsetName, sizeof(uint32), 1, stream);
+ count += fread(&ModelFlags, sizeof(uint32), 1, stream);
+ count += fread(&CountGlobalSequences, sizeof(uint32), 1, stream);
+ count += fread(&OffsetGlobalSequences, sizeof(uint32), 1, stream);
+ count += fread(&CountAnimations, sizeof(uint32), 1, stream);
+ count += fread(&OffsetAnimations, sizeof(uint32), 1, stream);
+ count += fread(&CountAnimationLookup, sizeof(uint32), 1, stream);
+ count += fread(&OffsetAnimationLookup, sizeof(uint32), 1, stream);
+ count += fread(&CountBones, sizeof(uint32), 1, stream);
+ count += fread(&OffsetBones, sizeof(uint32), 1, stream);
+ count += fread(&CountKeyBoneLookup, sizeof(uint32), 1, stream);
+ count += fread(&OffsetKeyBoneLookup, sizeof(uint32), 1, stream);
+ count += fread(&CountVertices, sizeof(uint32), 1, stream);
+ count += fread(&OffsetVertices, sizeof(uint32), 1, stream);
+ count += fread(&CountViews, sizeof(uint32), 1, stream);
+ count += fread(&CountColors, sizeof(uint32), 1, stream);
+ count += fread(&OffsetColors, sizeof(uint32), 1, stream);
+ count += fread(&CountTextures, sizeof(uint32), 1, stream);
+ count += fread(&OffsetTextures, sizeof(uint32), 1, stream);
+ count += fread(&CountTransparency, sizeof(uint32), 1, stream);
+ count += fread(&OffsetTransparency, sizeof(uint32), 1, stream);
+ count += fread(&CountUvAnimation, sizeof(uint32), 1, stream);
+ count += fread(&OffsetUvAnimation, sizeof(uint32), 1, stream);
+ count += fread(&CountTexReplace, sizeof(uint32), 1, stream);
+ count += fread(&OffsetTexReplace, sizeof(uint32), 1, stream);
+ count += fread(&CountRenderFlags, sizeof(uint32), 1, stream);
+ count += fread(&OffsetRenderFlags, sizeof(uint32), 1, stream);
+ count += fread(&CountBoneLookup, sizeof(uint32), 1, stream);
+ count += fread(&OffsetBoneLookup, sizeof(uint32), 1, stream);
+ count += fread(&CountTexLookup, sizeof(uint32), 1, stream);
+ count += fread(&OffsetTexLookup, sizeof(uint32), 1, stream);
+ count += fread(&CountTexUnits, sizeof(uint32), 1, stream);
+ count += fread(&OffsetTexUnits, sizeof(uint32), 1, stream);
+ count += fread(&CountTransLookup, sizeof(uint32), 1, stream);
+ count += fread(&OffsetTransLookup, sizeof(uint32), 1, stream);
+ count += fread(&CountUvAnimLookup, sizeof(uint32), 1, stream);
+ count += fread(&OffsetUvAnimLookup, sizeof(uint32), 1, stream);
+ VertexBox[0] = Vector3::Read(stream);
+ VertexBox[1] = Vector3::Read(stream);
+ count += fread(&VertexRadius, sizeof(float), 1, stream);
+ BoundingBox[0] = Vector3::Read(stream);
+ BoundingBox[1] = Vector3::Read(stream);
+ count += fread(&BoundingRadius, sizeof(float), 1, stream);
+ count += fread(&CountBoundingTriangles, sizeof(uint32), 1, stream);
+ count += fread(&OffsetBoundingTriangles, sizeof(uint32), 1, stream);
+ count += fread(&CountBoundingVertices, sizeof(uint32), 1, stream);
+ count += fread(&OffsetBoundingVertices, sizeof(uint32), 1, stream);
+ count += fread(&CountBoundingNormals, sizeof(uint32), 1, stream);
+ count += fread(&OffsetBoundingNormals, sizeof(uint32), 1, stream);
+
+ if (count != 51)
+ printf("ModelHeader::Read: Failed to read some data expected 51, read %d\n", count);
+
+}
+
+WorldModelHeader WorldModelHeader::Read(FILE* stream)
+{
+ WorldModelHeader ret;
+ int count = 0;
+
+ count += fread(&ret.CountMaterials, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountGroups, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountPortals, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountLights, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountModels, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountDoodads, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountSets, sizeof(uint32), 1, stream);
+ count += fread(&ret.AmbientColorUnk, sizeof(uint32), 1, stream);
+ count += fread(&ret.WmoId, sizeof(uint32), 1, stream);
+ ret.BoundingBox[0] = Vector3::Read(stream);
+ ret.BoundingBox[1] = Vector3::Read(stream);
+ count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream);
+
+ if (count != 10)
+ printf("WorldModelHeader::Read: Failed to read some data expected 10, read %d\n", count);
+
+ return ret;
+}
+
+DoodadInstance DoodadInstance::Read(FILE* stream)
+{
+ DoodadInstance ret;
+ int count = 0;
+
+ count += fread(&ret.FileOffset, sizeof(uint32), 1, stream);
+ ret.Position = Vector3::Read(stream);
+ count += fread(&ret.QuatW, sizeof(float), 1, stream);
+ count += fread(&ret.QuatX, sizeof(float), 1, stream);
+ count += fread(&ret.QuatY, sizeof(float), 1, stream);
+ count += fread(&ret.QuatZ, sizeof(float), 1, stream);
+ count += fread(&ret.Scale, sizeof(float), 1, stream);
+ count += fread(&ret.LightColor, sizeof(uint32), 1, stream);
+
+ if (count != 7)
+ printf("DoodadInstance::Read: Failed to read some data expected 7, read %d\n", count);
+
+ return ret;
+}
+
+DoodadSet DoodadSet::Read(FILE* stream)
+{
+ DoodadSet ret;
+ char name[21];
+ int count = 0;
+
+ count += fread(&name, sizeof(char), 20, stream);
+ name[20] = '\0';
+ ret.Name = name;
+ count += fread(&ret.FirstInstanceIndex, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountInstances, sizeof(uint32), 1, stream);
+ count += fread(&ret.UnknownZero, sizeof(uint32), 1, stream);
+
+ if (count != 23)
+ printf("DoodadSet::Read: Failed to read some data expected 23, read %d\n", count);
+
+ return ret;
+}
+
+LiquidHeader LiquidHeader::Read(FILE* stream)
+{
+ LiquidHeader ret;
+ int count = 0;
+ count += fread(&ret.CountXVertices, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountYVertices, sizeof(uint32), 1, stream);
+ count += fread(&ret.Width, sizeof(uint32), 1, stream);
+ count += fread(&ret.Height, sizeof(uint32), 1, stream);
+ ret.BaseLocation = Vector3::Read(stream);
+ count += fread(&ret.MaterialId, sizeof(uint16), 1, stream);
+
+ if (count != 5)
+ printf("LiquidHeader::Read: Failed to read some data expected 5, read %d\n", count);
+
+ return ret;
+}
+
+LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header)
+{
+ LiquidData ret;
+ ret.HeightMap = new float*[header.CountXVertices];
+ for (uint32 i = 0; i < header.CountXVertices; ++i)
+ ret.HeightMap[i] = new float[header.CountYVertices];
+
+ ret.RenderFlags = new uint8*[header.Width];
+ for (uint32 i = 0; i < header.Width; ++i)
+ ret.RenderFlags[i] = new uint8[header.Height];
+
+ for (uint32 y = 0; y < header.CountYVertices; y++)
+ {
+ for (uint32 x = 0; x < header.CountXVertices; x++)
+ {
+ uint32 discard;
+ float tmp;
+ if (fread(&discard, sizeof(uint32), 1, stream) == 1 &&
+ fread(&tmp, sizeof(float), 1, stream) == 1)
+ {
+ ret.HeightMap[x][y] = tmp;
+ }
+ }
+ }
+
+ for (uint32 y = 0; y < header.Height; y++)
+ {
+ for (uint32 x = 0; x < header.Width; x++)
+ {
+ uint8 tmp = 0;
+ if (fread(&tmp, sizeof(uint8), 1, stream) == 1)
+ ret.RenderFlags[x][y] = tmp;
+ }
+ }
+
+ return ret;
+}
+
+H2ORenderMask H2ORenderMask::Read(FILE* stream)
+{
+ H2ORenderMask ret;
+ int32 count;
+ if ((count = fread(&ret.Mask, sizeof(uint8), 8, stream)) != 8)
+ printf("H2OHeader::Read: Failed to read some data expected 8, read %d\n", count);
+ return ret;
+}
+
+bool MCNKLiquidData::IsWater(int x, int y, float height)
+{
+ if (!Heights)
+ return false;
+ if (!Mask.ShouldRender(x, y))
+ return false;
+ float diff = Heights[x][y] - height;
+ if (diff > Constants::MaxStandableHeight)
+ return true;
+ return false;
+}
+
+H2OHeader H2OHeader::Read(FILE* stream)
+{
+ H2OHeader ret;
+ int count = 0;
+ count += fread(&ret.OffsetInformation, sizeof(uint32), 1, stream);
+ count += fread(&ret.LayerCount, sizeof(uint32), 1, stream);
+ count += fread(&ret.OffsetRender, sizeof(uint32), 1, stream);
+
+ if (count != 3)
+ printf("H2OHeader::Read: Failed to read some data expected 3, read %d\n", count);
+
+ return ret;
+}
+
+H2OInformation H2OInformation::Read(FILE* stream)
+{
+ H2OInformation ret;
+ int count = 0;
+ count += fread(&ret.LiquidType, sizeof(uint16), 1, stream);
+ count += fread(&ret.Flags, sizeof(uint16), 1, stream);
+ count += fread(&ret.HeightLevel1, sizeof(float), 1, stream);
+ count += fread(&ret.HeightLevel2, sizeof(float), 1, stream);
+ count += fread(&ret.OffsetX, sizeof(uint8), 1, stream);
+ count += fread(&ret.OffsetY, sizeof(uint8), 1, stream);
+ count += fread(&ret.Width, sizeof(uint8), 1, stream);
+ count += fread(&ret.Height, sizeof(uint8), 1, stream);
+ count += fread(&ret.OffsetMask2, sizeof(uint32), 1, stream);
+ count += fread(&ret.OffsetHeightmap, sizeof(uint32), 1, stream);
+
+ if (count != 10)
+ printf("H2OInformation::Read: Failed to read some data expected 10, read %d\n", count);
+
+ return ret;
+}
+
+char* Utils::GetPlainName(const char* FileName)
+{
+ char* temp;
+
+ if((temp = (char*)strrchr(FileName, '\\')) != NULL)
+ FileName = temp + 1;
+ return (char*)FileName;
+}
+
+WMOGroupHeader WMOGroupHeader::Read( FILE* stream )
+{
+ WMOGroupHeader ret;
+ int count = 0;
+ count += fread(&ret.OffsetGroupName, sizeof(uint32), 1, stream);
+ count += fread(&ret.OffsetDescriptiveName, sizeof(uint32), 1, stream);
+ count += fread(&ret.Flags, sizeof(uint32), 1, stream);
+ ret.BoundingBox[0] = Vector3::Read(stream);
+ ret.BoundingBox[1] = Vector3::Read(stream);
+ count += fread(&ret.OffsetPortals, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountPortals, sizeof(uint32), 1, stream);
+ count += fread(&ret.CountBatches, sizeof(uint16), 4, stream);
+ count += fread(&ret.Fogs, sizeof(uint8), 4, stream);
+ count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream);
+ count += fread(&ret.WmoId, sizeof(uint32), 1, stream);
+
+ if (count != 15)
+ printf("WMOGroupHeader::Read: Failed to read some data expected 15, read %d\n", count);
+
+ return ret;
+}
diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h
new file mode 100644
index 0000000000..2daa23d854
--- /dev/null
+++ b/src/tools/mesh_extractor/Utils.h
@@ -0,0 +1,397 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef UTILS_H
+#define UTILS_H
+#include <cstdio>
+#include <string>
+#include <sstream>
+
+#include "G3D/Matrix4.h"
+#include "DetourNavMesh.h"
+
+#include "Define.h"
+#include "Constants.h"
+
+#include <ace/Stack_Trace.h>
+
+struct WorldModelDefinition;
+class DoodadDefinition;
+class DoodadInstance;
+
+#define ASSERT(assertion) { if (!(assertion)) { ACE_Stack_Trace st; fprintf(stderr, "\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); *((volatile int*)NULL) = 0; } }
+
+struct Vector3
+{
+ Vector3() {}
+ Vector3(float X, float Y, float Z) : x(X), y(Y), z(Z) {}
+ float x;
+ float y;
+ float z;
+
+ Vector3 operator +(Vector3 const& other) const
+ {
+ return Vector3(x + other.x, y + other.y, z + other.z);
+ }
+
+ Vector3 operator -(Vector3 const& other) const
+ {
+ return Vector3(x - other.x, y - other.y, z - other.z);
+ }
+
+ template<typename T>
+ Vector3 operator *(T s) const
+ {
+ return Vector3(x * s, y * s, z * s);
+ }
+
+ static Vector3 Read(FILE* file);
+};
+
+struct TilePos
+{
+ TilePos(int x, int y) : X(x), Y(y) {}
+ int X;
+ int Y;
+};
+
+template<typename T>
+struct Triangle
+{
+ Triangle() {}
+ Triangle(Constants::TriangleType type, T v0, T v1, T v2) : V0(v0), V1(v1), V2(v2), Type(type) {}
+ T V0;
+ T V1;
+ T V2;
+ Constants::TriangleType Type;
+};
+
+class MapChunkHeader
+{
+public:
+ MapChunkHeader() {}
+ uint32 Flags;
+ uint32 IndexX;
+ uint32 IndexY;
+ uint32 Layers;
+ uint32 DoodadRefs;
+ uint32 OffsetMCVT;
+ uint32 OffsetMCNR;
+ uint32 OffsetMCLY;
+ uint32 OffsetMCRF;
+ uint32 OffsetMCAL;
+ uint32 SizeMCAL;
+ uint32 OffsetMCSH;
+ uint32 SizeMCSH;
+ uint32 AreaId;
+ uint32 MapObjectRefs;
+ uint32 Holes;
+ uint32* LowQualityTextureMap;
+ uint32 PredTex;
+ uint32 NumberEffectDoodad;
+ uint32 OffsetMCSE;
+ uint32 SoundEmitters;
+ uint32 OffsetMCLQ;
+ uint32 SizeMCLQ;
+ Vector3 Position;
+ uint32 OffsetMCCV;
+
+ void Read(FILE* stream);
+};
+
+class MHDR
+{
+public:
+ MHDR() {}
+ uint32 Flags;
+ uint32 OffsetMCIN;
+ uint32 OffsetMTEX;
+ uint32 OffsetMMDX;
+ uint32 OffsetMMID;
+ uint32 OffsetMWMO;
+ uint32 OffsetMWID;
+ uint32 OffsetMDDF;
+ uint32 OffsetMODF;
+ uint32 OffsetMFBO;
+ uint32 OffsetMH2O;
+ uint32 OffsetMTFX;
+
+ void Read(FILE* stream);
+};
+
+class ModelHeader
+{
+public:
+ char Magic[5];
+ uint32 Version;
+ uint32 LengthModelName;
+ uint32 OffsetName;
+ uint32 ModelFlags;
+ uint32 CountGlobalSequences;
+ uint32 OffsetGlobalSequences;
+ uint32 CountAnimations;
+ uint32 OffsetAnimations;
+ uint32 CountAnimationLookup;
+ uint32 OffsetAnimationLookup;
+ uint32 CountBones;
+ uint32 OffsetBones;
+ uint32 CountKeyBoneLookup;
+ uint32 OffsetKeyBoneLookup;
+ uint32 CountVertices;
+ uint32 OffsetVertices;
+ uint32 CountViews;
+ uint32 CountColors;
+ uint32 OffsetColors;
+ uint32 CountTextures;
+ uint32 OffsetTextures;
+ uint32 CountTransparency;
+ uint32 OffsetTransparency;
+ uint32 CountUvAnimation;
+ uint32 OffsetUvAnimation;
+ uint32 CountTexReplace;
+ uint32 OffsetTexReplace;
+ uint32 CountRenderFlags;
+ uint32 OffsetRenderFlags;
+ uint32 CountBoneLookup;
+ uint32 OffsetBoneLookup;
+ uint32 CountTexLookup;
+ uint32 OffsetTexLookup;
+ uint32 CountTexUnits;
+ uint32 OffsetTexUnits;
+ uint32 CountTransLookup;
+ uint32 OffsetTransLookup;
+ uint32 CountUvAnimLookup;
+ uint32 OffsetUvAnimLookup;
+ Vector3 VertexBox[2];
+ float VertexRadius;
+ Vector3 BoundingBox[2];
+ float BoundingRadius;
+ uint32 CountBoundingTriangles;
+ uint32 OffsetBoundingTriangles;
+ uint32 CountBoundingVertices;
+ uint32 OffsetBoundingVertices;
+ uint32 CountBoundingNormals;
+ uint32 OffsetBoundingNormals;
+
+ void Read(FILE* stream);
+};
+
+class WorldModelHeader
+{
+public:
+ WorldModelHeader() {}
+ uint32 CountMaterials;
+ uint32 CountGroups;
+ uint32 CountPortals;
+ uint32 CountLights;
+ uint32 CountModels;
+ uint32 CountDoodads;
+ uint32 CountSets;
+ uint32 AmbientColorUnk;
+ uint32 WmoId;
+ Vector3 BoundingBox[2];
+ uint32 LiquidTypeRelated;
+
+ static WorldModelHeader Read(FILE* stream);
+};
+
+class DoodadInstance
+{
+public:
+ DoodadInstance() {}
+ uint32 FileOffset;
+ std::string File;
+ Vector3 Position;
+ float QuatW;
+ float QuatX;
+ float QuatY;
+ float QuatZ;
+ float Scale;
+ uint32 LightColor;
+
+ static DoodadInstance Read(FILE* stream);
+};
+
+class DoodadSet
+{
+public:
+ DoodadSet() {}
+ std::string Name;
+ uint32 FirstInstanceIndex;
+ uint32 CountInstances;
+ uint32 UnknownZero;
+
+ static DoodadSet Read(FILE* stream);
+};
+
+class LiquidHeader
+{
+public:
+ LiquidHeader() {}
+ uint32 CountXVertices;
+ uint32 CountYVertices;
+ uint32 Width;
+ uint32 Height;
+ Vector3 BaseLocation;
+ uint16 MaterialId;
+
+ static LiquidHeader Read(FILE* stream);
+};
+
+class LiquidData
+{
+public:
+ LiquidData() {}
+ float** HeightMap;
+ uint8** RenderFlags;
+
+ bool ShouldRender(int x, int y)
+ {
+ return RenderFlags[x][y] != 0x0F;
+ }
+
+ static LiquidData Read(FILE* stream, LiquidHeader& header);
+};
+
+class H2ORenderMask
+{
+public:
+ H2ORenderMask() {}
+ uint8 Mask[8];
+
+ bool ShouldRender(int x, int y)
+ {
+ return (Mask[y] >> x & 1) != 0;
+ }
+
+ static H2ORenderMask Read(FILE* stream);
+};
+
+class MCNKLiquidData
+{
+public:
+ MCNKLiquidData() {}
+ MCNKLiquidData(float** heights, H2ORenderMask mask) : Heights(heights), Mask(mask) {}
+
+ float** Heights;
+ H2ORenderMask Mask;
+
+ bool IsWater(int x, int y, float height);
+};
+
+class H2OHeader
+{
+public:
+ H2OHeader() {}
+ uint32 OffsetInformation;
+ uint32 LayerCount;
+ uint32 OffsetRender;
+
+ static H2OHeader Read(FILE* stream);
+};
+
+class H2OInformation
+{
+public:
+ H2OInformation() {}
+ uint16 LiquidType;
+ uint16 Flags;
+ float HeightLevel1;
+ float HeightLevel2;
+ uint8 OffsetX;
+ uint8 OffsetY;
+ uint8 Width;
+ uint8 Height;
+ uint32 OffsetMask2;
+ uint32 OffsetHeightmap;
+
+ static H2OInformation Read(FILE* stream);
+};
+
+class WMOGroupHeader
+{
+public:
+ WMOGroupHeader() {}
+
+ uint32 OffsetGroupName;
+ uint32 OffsetDescriptiveName;
+ uint32 Flags;
+ Vector3 BoundingBox[2];
+ uint32 OffsetPortals;
+ uint32 CountPortals;
+ uint16 CountBatches[4];
+ uint8 Fogs[4];
+ uint32 LiquidTypeRelated;
+ uint32 WmoId;
+
+ static WMOGroupHeader Read(FILE* stream);
+};
+
+// Dummy class to act as an interface.
+class IDefinition
+{
+public:
+ Vector3 Position;
+ Vector3 Rotation;
+ virtual float Scale() const { return 1.0f; };
+};
+
+#define MMAP_MAGIC 0x4d4d4150 // 'MMAP'
+#define MMAP_VERSION 8
+
+struct MmapTileHeader
+{
+ uint32 mmapMagic;
+ uint32 dtVersion;
+ uint32 mmapVersion;
+ uint32 size;
+ bool usesLiquids;
+
+ MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION),
+ mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) {}
+};
+
+class Utils
+{
+public:
+ static void Reverse(char word[]);
+ static std::string ReadString(FILE* file);
+ static uint32 Size(FILE* file);
+ static Vector3 ToRecast(const Vector3& val );
+ static std::string GetAdtPath(const std::string& world, int x, int y);
+ static std::string FixModelPath(const std::string& path);
+ /// They say its better to declare template functions in the header files.
+ template <typename T>
+ static std::string ToString(T val)
+ {
+ std::stringstream ss;
+ ss << val;
+ return ss.str();
+ }
+ static float ToRadians(float degrees);
+ static std::string GetPathBase(const std::string& path);
+ static Vector3 GetLiquidVert(const IDefinition& def, Vector3 basePosition, float height, int /*x*/, int /*y*/, bool translate = true);
+ static float Distance(float x, float y);
+ template<typename T>
+ static bool IsAllZero(T* arr, uint32 size)
+ {
+ for (uint32 i = 0; i < size; ++i)
+ if (arr[i])
+ return false;
+ return true;
+ }
+ static std::string Replace( std::string str, const std::string& oldStr, const std::string& newStr );
+ static void CreateDir( const std::string& Path );
+ static void SaveToDisk(FILE* stream, const std::string& path);
+ static Vector3 ToWoWCoords(const Vector3& vec );
+ static std::string GetExtension( std::string path );
+ static char* GetPlainName(const char* FileName);
+ static Vector3 TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool translate = true);
+ static Vector3 VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal = false );
+ static Vector3 TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate = true );
+};
+#endif
diff --git a/src/tools/mesh_extractor/WDT.cpp b/src/tools/mesh_extractor/WDT.cpp
new file mode 100644
index 0000000000..fea92a9821
--- /dev/null
+++ b/src/tools/mesh_extractor/WDT.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "WDT.h"
+#include "Chunk.h"
+#include "ChunkedData.h"
+#include "Utils.h"
+#include "WorldModelHandler.h"
+
+WDT::WDT(std::string file) : IsGlobalModel(false), IsValid(false), Model(NULL)
+{
+ Data = new ChunkedData(file, 2);
+ ReadTileTable();
+ ReadGlobalModel();
+}
+
+void WDT::ReadGlobalModel()
+{
+ Chunk* fileChunk = Data->GetChunkByName("MWMO");
+ Chunk* defChunk = Data->GetChunkByName("MODF");
+ if (!fileChunk || !defChunk)
+ return;
+
+ IsGlobalModel = true;
+ ModelDefinition = WorldModelDefinition::Read(defChunk->GetStream());
+ ModelFile = Utils::ReadString(fileChunk->GetStream());
+ Model = new WorldModelRoot(ModelFile);
+}
+
+void WDT::ReadTileTable()
+{
+ Chunk* chunk = Data->GetChunkByName("MAIN");
+ if (!chunk)
+ return;
+ IsValid = true;
+ FILE* stream = chunk->GetStream();
+ for (int y = 0; y < 64; ++y)
+ {
+ for (int x = 0; x < 64; ++x)
+ {
+ const uint32 hasTileFlag = 0x1;
+ uint32 flags;
+ uint32 discard;
+ int count = 0;
+ count += fread(&flags, sizeof(uint32), 1, stream);
+ count += fread(&discard, sizeof(uint32), 1, stream);
+
+ if (count != 2)
+ printf("WDT::ReadTileTable: Failed to read some data expected 2, read %d\n", count);
+
+ if (flags & hasTileFlag)
+ TileTable.push_back(TilePos(x, y));
+
+ }
+ }
+}
+
+bool WDT::HasTile( int x, int y )
+{
+ for (std::vector<TilePos>::iterator itr = TileTable.begin(); itr != TileTable.end(); ++itr)
+ if (itr->X == x && itr->Y == y)
+ return true;
+ return false;
+}
diff --git a/src/tools/mesh_extractor/WDT.h b/src/tools/mesh_extractor/WDT.h
new file mode 100644
index 0000000000..98033a4e4d
--- /dev/null
+++ b/src/tools/mesh_extractor/WDT.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef WDT_H
+#define WDT_H
+#include <string>
+#include <vector>
+
+#include "ChunkedData.h"
+#include "WorldModelHandler.h"
+#include "WorldModelRoot.h"
+#include "Utils.h"
+
+class WDT
+{
+public:
+ WDT(std::string file);
+
+ ChunkedData* Data;
+ std::vector<TilePos> TileTable;
+ bool IsGlobalModel;
+ bool IsValid;
+ std::string ModelFile;
+ WorldModelDefinition ModelDefinition;
+ WorldModelRoot* Model;
+ bool HasTile(int x, int y);
+private:
+ void ReadGlobalModel();
+ void ReadTileTable();
+};
+
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp
new file mode 100644
index 0000000000..a9412c5221
--- /dev/null
+++ b/src/tools/mesh_extractor/WorldModelGroup.cpp
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "WorldModelGroup.h"
+#include "ChunkedData.h"
+#include "Chunk.h"
+#include "Utils.h"
+
+WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false), HasLiquidData(false)
+{
+ Data = new ChunkedData(path);
+ if (!Data->Stream)
+ {
+ IsBad = true;
+ return;
+ }
+ Chunk* mainChunk = Data->GetChunkByName("MOGP");
+ int32 firstSub = mainChunk->FindSubChunkOffset("MOPY");
+ if (firstSub == -1)
+ return;
+
+ Name = Utils::GetPlainName(path.c_str());
+
+ FILE* stream = mainChunk->GetStream();
+ fseek(stream, firstSub, SEEK_SET);
+ SubData = new ChunkedData(stream, mainChunk->Length - firstSub);
+
+ ReadHeader();
+ ReadMaterials();
+ ReadTriangles();
+ ReadVertices();
+ ReadNormals();
+ ReadLiquid();
+ ReadBatches();
+}
+
+void WorldModelGroup::ReadNormals()
+{
+ Chunk* chunk = SubData->GetChunkByName("MONR");
+ if (!chunk)
+ return;
+
+ uint32 normalCount = chunk->Length / 12;
+ ASSERT(normalCount == Vertices.size() && "normalCount is different than the Vertices count");
+ Normals.reserve(normalCount);
+ FILE* stream = chunk->GetStream();
+ for (uint32 i = 0; i < normalCount; i++)
+ Normals.push_back(Vector3::Read(stream));
+}
+
+void WorldModelGroup::ReadLiquid()
+{
+ Chunk* chunk = SubData->GetChunkByName("MLIQ");
+ if (!chunk)
+ return;
+
+ HasLiquidData = true;
+ FILE* stream = chunk->GetStream();
+ LiquidDataHeader = LiquidHeader::Read(stream);
+ LiquidDataGeometry = LiquidData::Read(stream, LiquidDataHeader);
+}
+
+void WorldModelGroup::ReadVertices()
+{
+ Chunk* chunk = SubData->GetChunkByName("MOVT");
+ if (!chunk)
+ return;
+
+ uint32 verticeCount = chunk->Length / 12;
+ Vertices.reserve(verticeCount);
+ FILE* stream = chunk->GetStream();
+ for (uint32 i = 0; i < verticeCount; i++)
+ Vertices.push_back(Vector3::Read(stream));
+}
+
+void WorldModelGroup::ReadTriangles()
+{
+ Chunk* chunk = SubData->GetChunkByName("MOVI");
+ if (!chunk)
+ return;
+
+ uint32 triangleCount = chunk->Length / 6;
+ ASSERT(triangleCount == TriangleFlags.size() && "triangleCount != TriangleFlags.size()");
+ FILE* stream = chunk->GetStream();
+ Triangles.reserve(triangleCount);
+ for (uint32 i = 0; i < triangleCount; i++)
+ {
+ uint16 v0;
+ uint16 v1;
+ uint16 v2;
+ int count = 0;
+ count += fread(&v0, sizeof(uint16), 1, stream);
+ count += fread(&v1, sizeof(uint16), 1, stream);
+ count += fread(&v2, sizeof(uint16), 1, stream);
+ if (count != 3)
+ printf("WorldModelGroup::ReadMaterials: Error reading data, expected 3, read %d\n", count);
+
+ Triangles.push_back(Triangle<uint16>(Constants::TRIANGLE_TYPE_WMO, v0, v1, v2));
+ }
+}
+
+void WorldModelGroup::ReadMaterials()
+{
+ Chunk* chunk = SubData->GetChunkByName("MOPY");
+ if (!chunk)
+ return;
+
+ FILE* stream = chunk->GetStream();
+ uint32 triangleCount = chunk->Length / 2;
+ TriangleFlags.reserve(triangleCount);
+ TriangleMaterials.reserve(triangleCount);
+ for (uint32 i = 0; i < triangleCount; i++)
+ {
+ uint8 tmp;
+ if (fread(&tmp, sizeof(uint8), 1, stream) != 1)
+ printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n");
+ TriangleFlags.push_back(tmp);
+ // Read again for material.
+ if (fread(&tmp, sizeof(uint8), 1, stream) != 1)
+ printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n");
+ TriangleMaterials.push_back(tmp);
+ }
+}
+
+void WorldModelGroup::ReadHeader()
+{
+ Chunk* chunk = Data->GetChunkByName("MOGP");
+ if (!chunk)
+ return;
+
+ FILE* stream = chunk->GetStream();
+ Header = WMOGroupHeader::Read(stream);
+}
+
+void WorldModelGroup::ReadBatches()
+{
+ Chunk* chunk = Data->GetChunkByName("MOBA");
+ if (!chunk)
+ return;
+
+ MOBALength = chunk->Length / 2;
+ MOBA = new uint16[MOBALength];
+ uint32 count = (uint32)fread(MOBA, sizeof(uint16), MOBALength, chunk->GetStream());
+ if (count != MOBALength)
+ printf("WorldModelGroup::ReadBatches: Error reading data, expected %u, read %u\n", MOBALength, count);
+}
diff --git a/src/tools/mesh_extractor/WorldModelGroup.h b/src/tools/mesh_extractor/WorldModelGroup.h
new file mode 100644
index 0000000000..d4b6f82c59
--- /dev/null
+++ b/src/tools/mesh_extractor/WorldModelGroup.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef WMOGROUP_H
+#define WMOGROUP_H
+#include "ChunkedData.h"
+#include "Utils.h"
+
+class WorldModelGroup
+{
+public:
+ WorldModelGroup(std::string path, int groupIndex);
+ ChunkedData* Data;
+ ChunkedData* SubData;
+ int GroupIndex;
+ std::string Name;
+ WMOGroupHeader Header;
+
+ std::vector<uint8> TriangleFlags;
+ std::vector<uint8> TriangleMaterials;
+ std::vector<Triangle<uint16> > Triangles;
+ std::vector<Vector3> Vertices;
+ std::vector<Vector3> Normals;
+ // @ToDo: Research.
+ uint16* MOBA;
+ uint32 MOBALength;
+
+ bool HasLiquidData;
+ bool IsBad;
+ LiquidHeader LiquidDataHeader;
+ LiquidData LiquidDataGeometry;
+private:
+ void ReadNormals();
+ void ReadLiquid();
+ void ReadVertices();
+ void ReadTriangles();
+ void ReadMaterials();
+ void ReadHeader();
+ void ReadBatches();
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp
new file mode 100644
index 0000000000..7028450ec5
--- /dev/null
+++ b/src/tools/mesh_extractor/WorldModelHandler.cpp
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "WorldModelHandler.h"
+#include "WorldModelRoot.h"
+#include "Chunk.h"
+#include "Cache.h"
+#include "Model.h"
+#include "Define.h"
+#include "G3D/Matrix4.h"
+#include "G3D/Quat.h"
+#include <cstdio>
+
+WorldModelDefinition WorldModelDefinition::Read( FILE* file )
+{
+ WorldModelDefinition ret;
+ int count = 0;
+ count += fread(&ret.MwidIndex, sizeof(uint32), 1, file);
+ count += fread(&ret.UniqueId, sizeof(uint32), 1, file);
+ ret.Position = Vector3::Read(file);
+ ret.Rotation = Vector3::Read(file);
+ ret.UpperExtents = Vector3::Read(file);
+ ret.LowerExtents = Vector3::Read(file);
+ count += fread(&ret.Flags, sizeof(uint16), 1, file);
+ count += fread(&ret.DoodadSet, sizeof(uint16), 1, file);
+ uint32 discard;
+ count += fread(&discard, sizeof(uint32), 1, file);
+
+ if (count != 5)
+ printf("WorldModelDefinition::Read: Error reading data, expected 5, read %d\n", count);
+ return ret;
+}
+
+
+WorldModelHandler::WorldModelHandler( ADT* adt ) : ObjectDataHandler(adt), _definitions(NULL), _paths(NULL)
+{
+ ReadModelPaths();
+ ReadDefinitions();
+}
+
+void WorldModelHandler::ProcessInternal( MapChunk* mcnk )
+{
+ if (!IsSane())
+ return;
+
+ uint32 refCount = mcnk->Header.MapObjectRefs;
+ FILE* stream = mcnk->Source->GetStream();
+ fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
+ // Start looping at the last Doodad Ref index
+ for (uint32 i = mcnk->Header.DoodadRefs; i < refCount; i++)
+ {
+ int32 index;
+ if (fread(&index, sizeof(int32), 1, stream) != 1)
+ printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n");
+
+ if (index < 0 || uint32(index) >= _definitions->size())
+ continue;
+
+ WorldModelDefinition wmo = (*_definitions)[index];
+
+ if (_drawn.find(wmo.UniqueId) != _drawn.end())
+ continue;
+ _drawn.insert(wmo.UniqueId);
+
+ if (wmo.MwidIndex >= _paths->size())
+ continue;
+
+ std::string path = (*_paths)[wmo.MwidIndex];
+ WorldModelRoot* model = Cache->WorldModelCache.Get(path);
+ if (!model)
+ {
+ model = new WorldModelRoot(path);
+ Cache->WorldModelCache.Insert(path, model);
+ }
+
+ Vertices.reserve(1000);
+ Triangles.reserve(1000);
+
+ InsertModelGeometry(Vertices, Triangles, wmo, model);
+ }
+ // Restore the stream position
+ fseek(stream, mcnk->Source->Offset, SEEK_SET);
+}
+
+void WorldModelHandler::InsertModelGeometry( std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, const WorldModelDefinition& def, WorldModelRoot* root, bool translate )
+{
+ for (std::vector<WorldModelGroup>::iterator group = root->Groups.begin(); group != root->Groups.end(); ++group)
+ {
+ uint32 vertOffset = verts.size();
+ for (std::vector<Vector3>::iterator itr2 = group->Vertices.begin(); itr2 != group->Vertices.end(); ++itr2)
+ {
+ Vector3 v = Utils::TransformDoodadVertex(def, *itr2, translate);
+ // If translate is false, then we were called directly from the TileBuilder to add data to it's _Geometry member, hence, we have to manually convert the vertices to Recast format.
+ verts.push_back(translate ? v : Utils::ToRecast(v)); // Transform the vertex to world space
+ }
+
+ for (uint32 i = 0; i < group->Triangles.size(); ++i)
+ {
+ // only include colliding tris
+ if ((group->TriangleFlags[i] & 0x04) != 0 && group->TriangleMaterials[i] != 0xFF)
+ continue;
+ Triangle<uint16> tri = group->Triangles[i];
+ tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WMO, tri.V0 + vertOffset, tri.V1 + vertOffset, tri.V2 + vertOffset));
+ }
+ }
+
+ if (def.DoodadSet < root->DoodadSets.size())
+ {
+ DoodadSet set = root->DoodadSets[def.DoodadSet];
+ std::vector<DoodadInstance> instances;
+ instances.reserve(set.CountInstances);
+ for (uint32 i = set.FirstInstanceIndex; i < (set.CountInstances + set.FirstInstanceIndex); i++)
+ {
+ if (i >= root->DoodadInstances.size())
+ break;
+ instances.push_back(root->DoodadInstances[i]);
+ }
+
+ for (std::vector<DoodadInstance>::iterator instance = instances.begin(); instance != instances.end(); ++instance)
+ {
+ Model* model = Cache->ModelCache.Get(instance->File);
+ if (!model)
+ {
+ model = new Model(instance->File);
+ Cache->ModelCache.Insert(instance->File, model);
+ }
+
+ if (!model->IsCollidable)
+ continue;
+ int vertOffset = verts.size();
+ for (std::vector<Vector3>::iterator itr2 = model->Vertices.begin(); itr2 != model->Vertices.end(); ++itr2)
+ {
+ Vector3 v = Utils::TransformDoodadVertex(def, Utils::TransformWmoDoodad(*instance, def, *itr2, false), translate);
+ verts.push_back(translate ? v : Utils::ToRecast(v));
+ }
+ for (std::vector<Triangle<uint16> >::iterator itr2 = model->Triangles.begin(); itr2 != model->Triangles.end(); ++itr2)
+ tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WMO, itr2->V0 + vertOffset, itr2->V1 + vertOffset, itr2->V2 + vertOffset));
+ }
+
+ for (std::vector<WorldModelGroup>::iterator group = root->Groups.begin(); group != root->Groups.end(); ++group)
+ {
+ if (!group->HasLiquidData)
+ continue;
+
+ const LiquidHeader& liquidHeader = group->LiquidDataHeader;
+ LiquidData& liquidDataGeometry = group->LiquidDataGeometry;
+
+ for (uint32 y = 0; y < liquidHeader.Height; y++)
+ {
+ for (uint32 x = 0; x < liquidHeader.Width; x++)
+ {
+
+ if (!liquidDataGeometry.ShouldRender(x, y))
+ continue;
+
+ uint32 vertOffset = verts.size();
+
+ Vector3 v1 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
+ liquidDataGeometry.HeightMap[x][y], x, y, translate);
+ Vector3 v2 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
+ liquidDataGeometry.HeightMap[x + 1][y], x + 1, y, translate);
+ Vector3 v3 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
+ liquidDataGeometry.HeightMap[x][y + 1], x, y + 1, translate);
+ Vector3 v4 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
+ liquidDataGeometry.HeightMap[x + 1][y + 1], x + 1, y + 1, translate);
+
+ verts.push_back(translate ? v1 : Utils::ToRecast(v1));
+ verts.push_back(translate ? v2 : Utils::ToRecast(v2));
+ verts.push_back(translate ? v3 : Utils::ToRecast(v3));
+ verts.push_back(translate ? v4 : Utils::ToRecast(v4));
+
+ tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset, vertOffset + 2, vertOffset + 1));
+ tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset + 2, vertOffset + 3, vertOffset + 1));
+
+ }
+ }
+ }
+ }
+}
+
+void WorldModelHandler::ReadDefinitions()
+{
+ Chunk* chunk = Source->ObjectData->GetChunkByName("MODF");
+ if (!chunk)
+ return;
+
+ const int32 definitionSize = 64;
+ uint32 definitionCount = chunk->Length / definitionSize;
+ _definitions = new std::vector<WorldModelDefinition>;
+ _definitions->reserve(definitionCount);
+ FILE* stream = chunk->GetStream();
+ for (uint32 i = 0; i < definitionCount; i++)
+ _definitions->push_back(WorldModelDefinition::Read(stream));
+}
+
+void WorldModelHandler::ReadModelPaths()
+{
+ Chunk* mwid = Source->ObjectData->GetChunkByName("MWID");
+ Chunk* mwmo = Source->ObjectData->GetChunkByName("MWMO");
+ if (!mwid || !mwmo)
+ return;
+
+ uint32 paths = mwid->Length / 4;
+ _paths = new std::vector<std::string>;
+ _paths->reserve(paths);
+ for (uint32 i = 0; i < paths; i++)
+ {
+ FILE* stream = mwid->GetStream();
+ fseek(stream, i * 4, SEEK_CUR);
+ uint32 offset;
+ if (fread(&offset, sizeof(uint32), 1, stream) != 1)
+ printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n");
+ FILE* dataStream = mwmo->GetStream();
+ fseek(dataStream, offset + mwmo->Offset, SEEK_SET);
+ _paths->push_back(Utils::ReadString(dataStream));
+ }
+}
+
+WorldModelHandler::~WorldModelHandler()
+{
+ delete _definitions;
+ delete _paths;
+}
diff --git a/src/tools/mesh_extractor/WorldModelHandler.h b/src/tools/mesh_extractor/WorldModelHandler.h
new file mode 100644
index 0000000000..b5a9be50d6
--- /dev/null
+++ b/src/tools/mesh_extractor/WorldModelHandler.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef WMODEL_HNDL_H
+#define WMODEL_HNDL_H
+#include "Define.h"
+#include "Utils.h"
+#include "WorldModelRoot.h"
+#include "ObjectDataHandler.h"
+
+#include <set>
+#include <vector>
+
+class ADT;
+
+struct WorldModelDefinition : public IDefinition
+{
+public:
+ WorldModelDefinition() {}
+
+ uint32 MwidIndex;
+ uint32 UniqueId;
+ Vector3 UpperExtents;
+ Vector3 LowerExtents;
+ uint16 Flags;
+ uint16 DoodadSet;
+
+ static WorldModelDefinition Read(FILE* file);
+};
+
+class WorldModelHandler : public ObjectDataHandler
+{
+public:
+ WorldModelHandler(ADT* adt);
+ ~WorldModelHandler();
+
+ std::vector<Vector3> Vertices;
+ std::vector<Triangle<uint32> > Triangles;
+ bool IsSane() { return _definitions && _paths; }
+ static void InsertModelGeometry(std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, const WorldModelDefinition& def, WorldModelRoot* root, bool translate = true);
+protected:
+ void ProcessInternal(MapChunk* data);
+private:
+ void ReadDefinitions();
+ void ReadModelPaths();
+ std::set<uint32> _drawn;
+ std::vector<WorldModelDefinition>* _definitions;
+ std::vector<std::string>* _paths;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelRoot.cpp b/src/tools/mesh_extractor/WorldModelRoot.cpp
new file mode 100644
index 0000000000..5e25589cf3
--- /dev/null
+++ b/src/tools/mesh_extractor/WorldModelRoot.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "WorldModelRoot.h"
+#include "ChunkedData.h"
+#include "Utils.h"
+
+WorldModelRoot::WorldModelRoot( std::string path )
+{
+ Data = new ChunkedData(path);
+ Path = path;
+ ReadHeader();
+ ReadGroups();
+ ReadDoodadInstances();
+ ReadDoodadSets();
+}
+
+WorldModelRoot::~WorldModelRoot()
+{
+ delete Data;
+}
+
+void WorldModelRoot::ReadGroups()
+{
+ std::string pathBase = Utils::GetPathBase(Path);
+ Groups.reserve(Header.CountGroups);
+ for (uint32 i = 0; i < Header.CountGroups; i++)
+ {
+ char name[200];
+ sprintf(name, "%s_%03u.wmo", pathBase.c_str(), i);
+ WorldModelGroup group(name, i);
+ if (!group.IsBad)
+ Groups.push_back(group);
+ }
+}
+
+void WorldModelRoot::ReadDoodadSets()
+{
+ Chunk* chunk = Data->GetChunkByName("MODS");
+ if (!chunk)
+ return;
+
+ FILE* stream = chunk->GetStream();
+ ASSERT(chunk->Length / 32 == Header.CountSets && "chunk.Length / 32 == Header.CountSets");
+ DoodadSets.reserve(Header.CountSets);
+ for (uint32 i = 0; i < Header.CountSets; i++)
+ DoodadSets.push_back(DoodadSet::Read(stream));
+}
+
+void WorldModelRoot::ReadDoodadInstances()
+{
+ Chunk* chunk = Data->GetChunkByName("MODD");
+ Chunk* nameChunk = Data->GetChunkByName("MODN");
+ if (!chunk || !nameChunk)
+ return;
+
+ const uint32 instanceSize = 40;
+ uint32 countInstances = chunk->Length / instanceSize;
+ DoodadInstances.reserve(countInstances);
+ for (uint32 i = 0; i < countInstances; i++)
+ {
+ FILE* stream = chunk->GetStream();
+ fseek(stream, instanceSize * i, SEEK_CUR);
+ DoodadInstance instance = DoodadInstance::Read(stream);
+ FILE* nameStream = nameChunk->GetStream();
+ if (instance.FileOffset >= nameChunk->Length)
+ continue;
+ fseek(nameStream, instance.FileOffset, SEEK_CUR);
+ instance.File = Utils::ReadString(nameStream);
+ DoodadInstances.push_back(instance);
+ }
+}
+
+void WorldModelRoot::ReadHeader()
+{
+ Chunk* chunk = Data->GetChunkByName("MOHD");
+ if (!chunk)
+ return;
+
+ FILE* stream = chunk->GetStream();
+ Header = WorldModelHeader::Read(stream);
+}
diff --git a/src/tools/mesh_extractor/WorldModelRoot.h b/src/tools/mesh_extractor/WorldModelRoot.h
new file mode 100644
index 0000000000..fff149cfcb
--- /dev/null
+++ b/src/tools/mesh_extractor/WorldModelRoot.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C)
+ *
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef WMOROOT_H
+#define WMOROOT_H
+#include <string>
+#include <vector>
+
+#include "ChunkedData.h"
+#include "Utils.h"
+#include "WorldModelGroup.h"
+
+class WorldModelRoot
+{
+public:
+ WorldModelRoot(std::string path);
+ ~WorldModelRoot();
+ std::string Path;
+ ChunkedData* Data;
+ WorldModelHeader Header;
+ std::vector<DoodadInstance> DoodadInstances;
+ std::vector<DoodadSet> DoodadSets;
+ std::vector<WorldModelGroup> Groups;
+private:
+ void ReadGroups();
+ void ReadDoodadSets();
+ void ReadDoodadInstances();
+ void ReadHeader();
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/readme b/src/tools/mesh_extractor/readme
new file mode 100644
index 0000000000..85cd7cfc97
--- /dev/null
+++ b/src/tools/mesh_extractor/readme
@@ -0,0 +1,6 @@
+Experimental mesh extractor.
+Original work in C# by stschake
+Thanks to:
+Subv
+~
+For helping in the porting to C++ \ No newline at end of file
diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt
new file mode 100644
index 0000000000..6c3a932b9a
--- /dev/null
+++ b/src/tools/mmaps_generator/CMakeLists.txt
@@ -0,0 +1,140 @@
+# Copyright (C)
+#
+# 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.
+
+file(GLOB_RECURSE mmap_gen_sources *.cpp *.h)
+
+set(mmap_gen_Includes
+ ${CMAKE_BINARY_DIR}
+ ${ACE_INCLUDE_DIR}
+ ${MYSQL_INCLUDE_DIR}
+ ${OPENSSL_INCLUDE_DIR}
+ ${CMAKE_SOURCE_DIR}/deps/libmpq
+ ${CMAKE_SOURCE_DIR}/deps/zlib
+ ${CMAKE_SOURCE_DIR}/deps/bzip2
+ ${CMAKE_SOURCE_DIR}/deps/g3dlite/include
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Recast
+ ${CMAKE_SOURCE_DIR}/deps/recastnavigation/Detour
+ ${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
+ ${CMAKE_SOURCE_DIR}/src/common/Configuration
+ ${CMAKE_SOURCE_DIR}/src/common/Cryptography
+ ${CMAKE_SOURCE_DIR}/src/common/Cryptography/Authentication
+ ${CMAKE_SOURCE_DIR}/src/common/Database
+ ${CMAKE_SOURCE_DIR}/src/common/DataStores
+ ${CMAKE_SOURCE_DIR}/src/common/Debugging
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic/LinkedReference
+ ${CMAKE_SOURCE_DIR}/src/common/Dynamic
+ ${CMAKE_SOURCE_DIR}/src/common/Logging
+ ${CMAKE_SOURCE_DIR}/src/common/Packets
+ ${CMAKE_SOURCE_DIR}/src/common/Threading
+ ${CMAKE_SOURCE_DIR}/src/common/Utilities
+ ${CMAKE_SOURCE_DIR}/src/server/game/Addons
+ ${CMAKE_SOURCE_DIR}/src/server/game
+ ${CMAKE_SOURCE_DIR}/src/server/game/Accounts
+ ${CMAKE_SOURCE_DIR}/src/server/game/Achievements
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI
+ ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts
+ ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse
+ ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse/AuctionHouseBot
+ ${CMAKE_SOURCE_DIR}/src/server/game/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/Calendar
+ ${CMAKE_SOURCE_DIR}/src/server/game/Chat
+ ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels
+ ${CMAKE_SOURCE_DIR}/src/server/game/Combat
+ ${CMAKE_SOURCE_DIR}/src/server/game/Conditions
+ ${CMAKE_SOURCE_DIR}/src/server/game/DataStores
+ ${CMAKE_SOURCE_DIR}/src/server/game/DungeonFinding
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Creature
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Corpse
+ ${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/Totem
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Unit
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Vehicle
+ ${CMAKE_SOURCE_DIR}/src/server/game/Entities/Transport
+ ${CMAKE_SOURCE_DIR}/src/server/game/Events
+ ${CMAKE_SOURCE_DIR}/src/server/game/Globals
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Cells
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids/Notifiers
+ ${CMAKE_SOURCE_DIR}/src/server/game/Grids
+ ${CMAKE_SOURCE_DIR}/src/server/game/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/Waypoints
+ ${CMAKE_SOURCE_DIR}/src/server/game/OutdoorPvP
+ ${CMAKE_SOURCE_DIR}/src/server/game/Pools
+ ${CMAKE_SOURCE_DIR}/src/server/game/PrecompiledHeaders
+ ${CMAKE_SOURCE_DIR}/src/server/game/Quests
+ ${CMAKE_SOURCE_DIR}/src/server/game/Reputation
+ ${CMAKE_SOURCE_DIR}/src/server/game/Scripting
+ ${CMAKE_SOURCE_DIR}/src/server/game/Server/Protocol
+ ${CMAKE_SOURCE_DIR}/src/server/game/Server
+ ${CMAKE_SOURCE_DIR}/src/server/game/Skills
+ ${CMAKE_SOURCE_DIR}/src/server/game/Spells
+ ${CMAKE_SOURCE_DIR}/src/server/game/Spells/Auras
+ ${CMAKE_SOURCE_DIR}/src/server/game/Tools
+ ${CMAKE_SOURCE_DIR}/src/server/game/Warden
+ ${CMAKE_SOURCE_DIR}/src/server/game/Warden/Modules
+ ${CMAKE_SOURCE_DIR}/src/server/game/Weather
+ ${CMAKE_SOURCE_DIR}/src/server/game/World
+)
+
+if( WIN32 )
+ set(mmap_gen_Includes
+ ${mmap_gen_Includes}
+ ${CMAKE_SOURCE_DIR}/deps/libmpq/win
+ )
+endif()
+
+include_directories(${mmap_gen_Includes})
+
+add_executable(mmaps_generator ${mmap_gen_sources})
+
+target_link_libraries(mmaps_generator
+ shared
+ collision
+ g3dlib
+ Recast
+ Detour
+ ${ACE_LIBRARY}
+ ${MYSQL_LIBRARY}
+ ${OPENSSL_LIBRARIES}
+ ${BZIP2_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+ ${CMAKE_THREAD_LIBS_INIT}
+)
+
+if( UNIX )
+ install(TARGETS mmaps_generator DESTINATION bin)
+elseif( WIN32 )
+ install(TARGETS mmaps_generator DESTINATION "${CMAKE_INSTALL_PREFIX}")
+endif()
diff --git a/src/tools/mmaps_generator/Info/readme.txt b/src/tools/mmaps_generator/Info/readme.txt
new file mode 100644
index 0000000000..8059add00e
--- /dev/null
+++ b/src/tools/mmaps_generator/Info/readme.txt
@@ -0,0 +1,69 @@
+Generator command line args
+
+--threads [#] Max number of threads used by the generator
+ Default: 3
+
+--offMeshInput [file.*] Path to file containing off mesh connections data.
+ Format must be: (see offmesh_example.txt)
+ "map_id tile_x,tile_y (start_x start_y start_z) (end_x end_y end_z) size //optional comments"
+ Single mesh connection per line.
+
+--silent [] Make us script friendly. Do not wait for user input
+ on error or completion.
+
+--bigBaseUnit [true|false] Generate tile/map using bigger basic unit.
+ Use this option only if you have unexpected gaps.
+
+ false: use normal metrics (default)
+
+--maxAngle [#] Max walkable inclination angle
+
+ float between 45 and 90 degrees (default 60)
+
+--skipLiquid [true|false] extract liquid data for maps
+
+ false: include liquid data (default)
+
+--skipContinents [true|false] continents are maps 0 (Eastern Kingdoms),
+ 1 (Kalimdor), 530 (Outlands), 571 (Northrend)
+
+ false: build continents (default)
+
+--skipJunkMaps [true|false] junk maps include some unused
+ maps, transport maps, and some other
+
+ true: skip junk maps (default)
+
+--skipBattlegrounds [true|false] does not include PVP arenas
+
+ false: skip battlegrounds (default)
+
+--debugOutput [true|false] create debugging files for use with RecastDemo
+ if you are only creating mmaps for use with Moongose,
+ you don't want debugging files
+
+ false: don't create debugging files (default)
+
+--tile [#,#] Build the specified tile
+ seperate number with a comma ','
+ must specify a map number (see below)
+ if this option is not used, all tiles are built
+
+ [#] Build only the map specified by #
+ this command will build the map regardless of --skip* option settings
+ if you do not specify a map number, builds all maps that pass the filters specified by --skip* options
+
+
+examples:
+
+movement_extractor
+builds maps using the default settings (see above for defaults)
+
+movement_extractor --skipContinents true
+builds the default maps, except continents
+
+movement_extractor 0
+builds all tiles of map 0
+
+movement_extractor 0 --tile 34,46
+builds only tile 34,46 of map 0 (this is the southern face of blackrock mountain)
diff --git a/src/tools/mmaps_generator/IntermediateValues.cpp b/src/tools/mmaps_generator/IntermediateValues.cpp
new file mode 100644
index 0000000000..6dc63e7faa
--- /dev/null
+++ b/src/tools/mmaps_generator/IntermediateValues.cpp
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "IntermediateValues.h"
+
+namespace MMAP
+{
+ IntermediateValues::~IntermediateValues()
+ {
+ rcFreeCompactHeightfield(compactHeightfield);
+ rcFreeHeightField(heightfield);
+ rcFreeContourSet(contours);
+ rcFreePolyMesh(polyMesh);
+ rcFreePolyMeshDetail(polyMeshDetail);
+ }
+
+ void IntermediateValues::writeIV(uint32 mapID, uint32 tileX, uint32 tileY)
+ {
+ char fileName[255];
+ char tileString[25];
+ sprintf(tileString, "[%02u,%02u]: ", tileX, tileY);
+
+ printf("%sWriting debug output... \r", tileString);
+
+ std::string name("meshes/%03u%02i%02i.");
+
+#define DEBUG_WRITE(fileExtension,data) \
+ do { \
+ sprintf(fileName, (name + fileExtension).c_str(), mapID, tileY, tileX); \
+ FILE* file = fopen(fileName, "wb"); \
+ if (!file) \
+ { \
+ char message[1024]; \
+ sprintf(message, "%sFailed to open %s for writing!\n", tileString, fileName); \
+ perror(message); \
+ } \
+ else \
+ debugWrite(file, data); \
+ if (file) fclose(file); \
+ printf("%sWriting debug output... \r", tileString); \
+ } while (false)
+
+ if (heightfield)
+ DEBUG_WRITE("hf", heightfield);
+ if (compactHeightfield)
+ DEBUG_WRITE("chf", compactHeightfield);
+ if (contours)
+ DEBUG_WRITE("cs", contours);
+ if (polyMesh)
+ DEBUG_WRITE("pmesh", polyMesh);
+ if (polyMeshDetail)
+ DEBUG_WRITE("dmesh", polyMeshDetail);
+
+#undef DEBUG_WRITE
+ }
+
+ void IntermediateValues::debugWrite(FILE* file, const rcHeightfield* mesh)
+ {
+ if (!file || !mesh)
+ return;
+
+ fwrite(&(mesh->cs), sizeof(float), 1, file);
+ fwrite(&(mesh->ch), sizeof(float), 1, file);
+ fwrite(&(mesh->width), sizeof(int), 1, file);
+ fwrite(&(mesh->height), sizeof(int), 1, file);
+ fwrite(mesh->bmin, sizeof(float), 3, file);
+ fwrite(mesh->bmax, sizeof(float), 3, file);
+
+ for (int y = 0; y < mesh->height; ++y)
+ for (int x = 0; x < mesh->width; ++x)
+ {
+ rcSpan* span = mesh->spans[x+y*mesh->width];
+
+ // first, count the number of spans
+ int spanCount = 0;
+ while (span)
+ {
+ spanCount++;
+ span = span->next;
+ }
+
+ // write the span count
+ fwrite(&spanCount, sizeof(int), 1, file);
+
+ // write the spans
+ span = mesh->spans[x+y*mesh->width];
+ while (span)
+ {
+ fwrite(span, sizeof(rcSpan), 1, file);
+ span = span->next;
+ }
+ }
+ }
+
+ void IntermediateValues::debugWrite(FILE* file, const rcCompactHeightfield* chf)
+ {
+ if (!file | !chf)
+ return;
+
+ fwrite(&(chf->width), sizeof(chf->width), 1, file);
+ fwrite(&(chf->height), sizeof(chf->height), 1, file);
+ fwrite(&(chf->spanCount), sizeof(chf->spanCount), 1, file);
+
+ fwrite(&(chf->walkableHeight), sizeof(chf->walkableHeight), 1, file);
+ fwrite(&(chf->walkableClimb), sizeof(chf->walkableClimb), 1, file);
+
+ fwrite(&(chf->maxDistance), sizeof(chf->maxDistance), 1, file);
+ fwrite(&(chf->maxRegions), sizeof(chf->maxRegions), 1, file);
+
+ fwrite(chf->bmin, sizeof(chf->bmin), 1, file);
+ fwrite(chf->bmax, sizeof(chf->bmax), 1, file);
+
+ fwrite(&(chf->cs), sizeof(chf->cs), 1, file);
+ fwrite(&(chf->ch), sizeof(chf->ch), 1, file);
+
+ int tmp = 0;
+ if (chf->cells) tmp |= 1;
+ if (chf->spans) tmp |= 2;
+ if (chf->dist) tmp |= 4;
+ if (chf->areas) tmp |= 8;
+
+ fwrite(&tmp, sizeof(tmp), 1, file);
+
+ if (chf->cells)
+ fwrite(chf->cells, sizeof(rcCompactCell), chf->width*chf->height, file);
+ if (chf->spans)
+ fwrite(chf->spans, sizeof(rcCompactSpan), chf->spanCount, file);
+ if (chf->dist)
+ fwrite(chf->dist, sizeof(unsigned short), chf->spanCount, file);
+ if (chf->areas)
+ fwrite(chf->areas, sizeof(unsigned char), chf->spanCount, file);
+ }
+
+ void IntermediateValues::debugWrite(FILE* file, const rcContourSet* cs)
+ {
+ if (!file || !cs)
+ return;
+
+ fwrite(&(cs->cs), sizeof(float), 1, file);
+ fwrite(&(cs->ch), sizeof(float), 1, file);
+ fwrite(cs->bmin, sizeof(float), 3, file);
+ fwrite(cs->bmax, sizeof(float), 3, file);
+ fwrite(&(cs->nconts), sizeof(int), 1, file);
+ for (int i = 0; i < cs->nconts; ++i)
+ {
+ fwrite(&cs->conts[i].area, sizeof(unsigned char), 1, file);
+ fwrite(&cs->conts[i].reg, sizeof(unsigned short), 1, file);
+ fwrite(&cs->conts[i].nverts, sizeof(int), 1, file);
+ fwrite(cs->conts[i].verts, sizeof(int), cs->conts[i].nverts*4, file);
+ fwrite(&cs->conts[i].nrverts, sizeof(int), 1, file);
+ fwrite(cs->conts[i].rverts, sizeof(int), cs->conts[i].nrverts*4, file);
+ }
+ }
+
+ void IntermediateValues::debugWrite(FILE* file, const rcPolyMesh* mesh)
+ {
+ if (!file || !mesh)
+ return;
+
+ fwrite(&(mesh->cs), sizeof(float), 1, file);
+ fwrite(&(mesh->ch), sizeof(float), 1, file);
+ fwrite(&(mesh->nvp), sizeof(int), 1, file);
+ fwrite(mesh->bmin, sizeof(float), 3, file);
+ fwrite(mesh->bmax, sizeof(float), 3, file);
+ fwrite(&(mesh->nverts), sizeof(int), 1, file);
+ fwrite(mesh->verts, sizeof(unsigned short), mesh->nverts*3, file);
+ fwrite(&(mesh->npolys), sizeof(int), 1, file);
+ fwrite(mesh->polys, sizeof(unsigned short), mesh->npolys*mesh->nvp*2, file);
+ fwrite(mesh->flags, sizeof(unsigned short), mesh->npolys, file);
+ fwrite(mesh->areas, sizeof(unsigned char), mesh->npolys, file);
+ fwrite(mesh->regs, sizeof(unsigned short), mesh->npolys, file);
+ }
+
+ void IntermediateValues::debugWrite(FILE* file, const rcPolyMeshDetail* mesh)
+ {
+ if (!file || !mesh)
+ return;
+
+ fwrite(&(mesh->nverts), sizeof(int), 1, file);
+ fwrite(mesh->verts, sizeof(float), mesh->nverts*3, file);
+ fwrite(&(mesh->ntris), sizeof(int), 1, file);
+ fwrite(mesh->tris, sizeof(char), mesh->ntris*4, file);
+ fwrite(&(mesh->nmeshes), sizeof(int), 1, file);
+ fwrite(mesh->meshes, sizeof(int), mesh->nmeshes*4, file);
+ }
+
+ void IntermediateValues::generateObjFile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData)
+ {
+ char objFileName[255];
+ sprintf(objFileName, "meshes/map%03u%02u%02u.obj", mapID, tileY, tileX);
+
+ FILE* objFile = fopen(objFileName, "wb");
+ if (!objFile)
+ {
+ char message[1024];
+ sprintf(message, "Failed to open %s for writing!\n", objFileName);
+ perror(message);
+ return;
+ }
+
+ G3D::Array<float> allVerts;
+ G3D::Array<int> allTris;
+
+ allTris.append(meshData.liquidTris);
+ allVerts.append(meshData.liquidVerts);
+ TerrainBuilder::copyIndices(meshData.solidTris, allTris, allVerts.size() / 3);
+ allVerts.append(meshData.solidVerts);
+
+ float* verts = allVerts.getCArray();
+ int vertCount = allVerts.size() / 3;
+ int* tris = allTris.getCArray();
+ int triCount = allTris.size() / 3;
+
+ for (int i = 0; i < allVerts.size() / 3; i++)
+ fprintf(objFile, "v %f %f %f\n", verts[i*3], verts[i*3 + 1], verts[i*3 + 2]);
+
+ for (int i = 0; i < allTris.size() / 3; i++)
+ fprintf(objFile, "f %i %i %i\n", tris[i*3] + 1, tris[i*3 + 1] + 1, tris[i*3 + 2] + 1);
+
+ fclose(objFile);
+
+
+ char tileString[25];
+ sprintf(tileString, "[%02u,%02u]: ", tileY, tileX);
+ printf("%sWriting debug output... \r", tileString);
+
+ sprintf(objFileName, "meshes/%03u.map", mapID);
+
+ objFile = fopen(objFileName, "wb");
+ if (!objFile)
+ {
+ char message[1024];
+ sprintf(message, "Failed to open %s for writing!\n", objFileName);
+ perror(message);
+ return;
+ }
+
+ char b = '\0';
+ fwrite(&b, sizeof(char), 1, objFile);
+ fclose(objFile);
+
+ sprintf(objFileName, "meshes/%03u%02u%02u.mesh", mapID, tileY, tileX);
+ objFile = fopen(objFileName, "wb");
+ if (!objFile)
+ {
+ char message[1024];
+ sprintf(message, "Failed to open %s for writing!\n", objFileName);
+ perror(message);
+ return;
+ }
+
+ fwrite(&vertCount, sizeof(int), 1, objFile);
+ fwrite(verts, sizeof(float), vertCount*3, objFile);
+ fflush(objFile);
+
+ fwrite(&triCount, sizeof(int), 1, objFile);
+ fwrite(tris, sizeof(int), triCount*3, objFile);
+ fflush(objFile);
+
+ fclose(objFile);
+ }
+}
diff --git a/src/tools/mmaps_generator/IntermediateValues.h b/src/tools/mmaps_generator/IntermediateValues.h
new file mode 100644
index 0000000000..37832f853c
--- /dev/null
+++ b/src/tools/mmaps_generator/IntermediateValues.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _INTERMEDIATE_VALUES_H
+#define _INTERMEDIATE_VALUES_H
+
+#include "PathCommon.h"
+#include "TerrainBuilder.h"
+#include "Recast.h"
+#include "DetourNavMesh.h"
+
+namespace MMAP
+{
+ // this class gathers all debug info holding and output
+ struct IntermediateValues
+ {
+ rcHeightfield* heightfield;
+ rcCompactHeightfield* compactHeightfield;
+ rcContourSet* contours;
+ rcPolyMesh* polyMesh;
+ rcPolyMeshDetail* polyMeshDetail;
+
+ IntermediateValues() : heightfield(NULL), compactHeightfield(NULL),
+ contours(NULL), polyMesh(NULL), polyMeshDetail(NULL) {}
+ ~IntermediateValues();
+
+ void writeIV(uint32 mapID, uint32 tileX, uint32 tileY);
+
+ void debugWrite(FILE* file, const rcHeightfield* mesh);
+ void debugWrite(FILE* file, const rcCompactHeightfield* chf);
+ void debugWrite(FILE* file, const rcContourSet* cs);
+ void debugWrite(FILE* file, const rcPolyMesh* mesh);
+ void debugWrite(FILE* file, const rcPolyMeshDetail* mesh);
+
+ void generateObjFile(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData);
+ };
+}
+#endif
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
new file mode 100644
index 0000000000..94780d7422
--- /dev/null
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -0,0 +1,1014 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "PathCommon.h"
+#include "MapBuilder.h"
+
+#include "MapTree.h"
+#include "ModelInstance.h"
+
+#include "DetourNavMeshBuilder.h"
+#include "DetourNavMesh.h"
+#include "DetourCommon.h"
+
+#include "DisableMgr.h"
+#include <ace/OS_NS_unistd.h>
+
+namespace DisableMgr
+{
+ bool IsDisabledFor(DisableType /*type*/, uint32 /*entry*/, Unit const* /*unit*/, uint8 /*flags*/ /*= 0*/) { return false; }
+}
+
+#define MMAP_MAGIC 0x4d4d4150 // 'MMAP'
+#define MMAP_VERSION 8
+
+struct MmapTileHeader
+{
+ uint32 mmapMagic;
+ uint32 dtVersion;
+ uint32 mmapVersion;
+ uint32 size;
+ char usesLiquids;
+ char padding[3];
+
+ MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION),
+ mmapVersion(MMAP_VERSION), size(0), usesLiquids(true), padding() {}
+};
+
+// All padding fields must be handled and initialized to ensure mmaps_generator will produce binary-identical *.mmtile files
+static_assert(sizeof(MmapTileHeader) == 20, "MmapTileHeader size is not correct, adjust the padding field size");
+static_assert(sizeof(MmapTileHeader) == (sizeof(MmapTileHeader::mmapMagic) +
+ sizeof(MmapTileHeader::dtVersion) +
+ sizeof(MmapTileHeader::mmapVersion) +
+ sizeof(MmapTileHeader::size) +
+ sizeof(MmapTileHeader::usesLiquids) +
+ sizeof(MmapTileHeader::padding)), "MmapTileHeader has uninitialized padding fields");
+
+namespace MMAP
+{
+ MapBuilder::MapBuilder(float maxWalkableAngle, bool skipLiquid,
+ bool skipContinents, bool skipJunkMaps, bool skipBattlegrounds,
+ bool debugOutput, bool bigBaseUnit, const char* offMeshFilePath) :
+ m_terrainBuilder (NULL),
+ m_debugOutput (debugOutput),
+ m_offMeshFilePath (offMeshFilePath),
+ m_skipContinents (skipContinents),
+ m_skipJunkMaps (skipJunkMaps),
+ m_skipBattlegrounds (skipBattlegrounds),
+ m_maxWalkableAngle (maxWalkableAngle),
+ m_bigBaseUnit (bigBaseUnit),
+ m_rcContext (NULL)
+ {
+ m_terrainBuilder = new TerrainBuilder(skipLiquid);
+
+ m_rcContext = new rcContext(false);
+
+ // percentageDone - Initializing
+ m_totalTiles = 0;
+ m_totalTilesBuilt = 0;
+
+ discoverTiles();
+ }
+
+ /**************************************************************************/
+ MapBuilder::~MapBuilder()
+ {
+ for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it)
+ {
+ (*it).m_tiles->clear();
+ delete (*it).m_tiles;
+ }
+
+ delete m_terrainBuilder;
+ delete m_rcContext;
+ }
+
+ /**************************************************************************/
+ void MapBuilder::discoverTiles()
+ {
+ std::vector<std::string> files;
+ uint32 mapID, tileX, tileY, tileID, count = 0;
+ char filter[12];
+
+ printf("Discovering maps... ");
+ getDirContents(files, "maps");
+ for (uint32 i = 0; i < files.size(); ++i)
+ {
+ mapID = uint32(atoi(files[i].substr(0,3).c_str()));
+ if (std::find(m_tiles.begin(), m_tiles.end(), mapID) == m_tiles.end())
+ {
+ m_tiles.emplace_back(MapTiles(mapID, new std::set<uint32>));
+ count++;
+ }
+ }
+
+ files.clear();
+ getDirContents(files, "vmaps", "*.vmtree");
+ for (uint32 i = 0; i < files.size(); ++i)
+ {
+ mapID = uint32(atoi(files[i].substr(0,3).c_str()));
+ if (std::find(m_tiles.begin(), m_tiles.end(), mapID) == m_tiles.end())
+ {
+ m_tiles.emplace_back(MapTiles(mapID, new std::set<uint32>));
+ count++;
+ }
+ }
+ printf("found %u.\n", count);
+
+ count = 0;
+ printf("Discovering tiles... ");
+ for (TileList::iterator itr = m_tiles.begin(); itr != m_tiles.end(); ++itr)
+ {
+ std::set<uint32>* tiles = (*itr).m_tiles;
+ mapID = (*itr).m_mapId;
+
+ sprintf(filter, "%03u*.vmtile", mapID);
+ files.clear();
+ getDirContents(files, "vmaps", filter);
+ for (uint32 i = 0; i < files.size(); ++i)
+ {
+ tileX = uint32(atoi(files[i].substr(7,2).c_str()));
+ tileY = uint32(atoi(files[i].substr(4,2).c_str()));
+ tileID = StaticMapTree::packTileID(tileY, tileX);
+
+ tiles->insert(tileID);
+ count++;
+ }
+
+ sprintf(filter, "%03u*", mapID);
+ files.clear();
+ getDirContents(files, "maps", filter);
+ for (uint32 i = 0; i < files.size(); ++i)
+ {
+ tileY = uint32(atoi(files[i].substr(3,2).c_str()));
+ tileX = uint32(atoi(files[i].substr(5,2).c_str()));
+ tileID = StaticMapTree::packTileID(tileX, tileY);
+
+ if (tiles->insert(tileID).second)
+ count++;
+ }
+ }
+ printf("found %u.\n\n", count);
+
+ // percentageDone - total tiles to process
+ m_totalTiles = count;
+ }
+
+ /**************************************************************************/
+ std::set<uint32>* MapBuilder::getTileList(uint32 mapID)
+ {
+ TileList::iterator itr = std::find(m_tiles.begin(), m_tiles.end(), mapID);
+ if (itr != m_tiles.end())
+ return (*itr).m_tiles;
+
+ std::set<uint32>* tiles = new std::set<uint32>();
+ m_tiles.emplace_back(MapTiles(mapID, tiles));
+ return tiles;
+ }
+
+ /**************************************************************************/
+ void MapBuilder::buildAllMaps(int threads)
+ {
+ std::vector<BuilderThread*> _threads;
+
+ BuilderThreadPool* pool = threads > 0 ? new BuilderThreadPool() : NULL;
+
+ m_tiles.sort([](MapTiles a, MapTiles b)
+ {
+ return a.m_tiles->size() > b.m_tiles->size();
+ });
+
+ for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it)
+ {
+ uint32 mapID = it->m_mapId;
+ if (!shouldSkipMap(mapID))
+ {
+ if (threads > 0)
+ pool->Enqueue(new MapBuildRequest(mapID));
+ else
+ buildMap(mapID);
+ }
+ }
+
+ for (int i = 0; i < threads; ++i)
+ _threads.push_back(new BuilderThread(this, pool->Queue()));
+
+ // Free memory
+ for (std::vector<BuilderThread*>::iterator _th = _threads.begin(); _th != _threads.end(); ++_th)
+ {
+ (*_th)->wait();
+ delete *_th;
+ }
+
+ delete pool;
+ }
+
+ /**************************************************************************/
+ void MapBuilder::getGridBounds(uint32 mapID, uint32 &minX, uint32 &minY, uint32 &maxX, uint32 &maxY) const
+ {
+ // min and max are initialized to invalid values so the caller iterating the [min, max] range
+ // will never enter the loop unless valid min/max values are found
+ maxX = 0;
+ maxY = 0;
+ minX = std::numeric_limits<uint32>::max();
+ minY = std::numeric_limits<uint32>::max();
+
+ float bmin[3] = { 0, 0, 0 };
+ float bmax[3] = { 0, 0, 0 };
+ float lmin[3] = { 0, 0, 0 };
+ float lmax[3] = { 0, 0, 0 };
+ MeshData meshData;
+
+ // make sure we process maps which don't have tiles
+ // initialize the static tree, which loads WDT models
+ if (!m_terrainBuilder->loadVMap(mapID, 64, 64, meshData))
+ return;
+
+ // get the coord bounds of the model data
+ if (meshData.solidVerts.size() + meshData.liquidVerts.size() == 0)
+ return;
+
+ // get the coord bounds of the model data
+ if (meshData.solidVerts.size() && meshData.liquidVerts.size())
+ {
+ rcCalcBounds(meshData.solidVerts.getCArray(), meshData.solidVerts.size() / 3, bmin, bmax);
+ rcCalcBounds(meshData.liquidVerts.getCArray(), meshData.liquidVerts.size() / 3, lmin, lmax);
+ rcVmin(bmin, lmin);
+ rcVmax(bmax, lmax);
+ }
+ else if (meshData.solidVerts.size())
+ rcCalcBounds(meshData.solidVerts.getCArray(), meshData.solidVerts.size() / 3, bmin, bmax);
+ else
+ rcCalcBounds(meshData.liquidVerts.getCArray(), meshData.liquidVerts.size() / 3, lmin, lmax);
+
+ // convert coord bounds to grid bounds
+ maxX = 32 - bmin[0] / GRID_SIZE;
+ maxY = 32 - bmin[2] / GRID_SIZE;
+ minX = 32 - bmax[0] / GRID_SIZE;
+ minY = 32 - bmax[2] / GRID_SIZE;
+ }
+
+ void MapBuilder::buildMeshFromFile(char* name)
+ {
+ FILE* file = fopen(name, "rb");
+ if (!file)
+ return;
+
+ printf("Building mesh from file\n");
+ int tileX, tileY, mapId;
+ if (fread(&mapId, sizeof(int), 1, file) != 1)
+ {
+ fclose(file);
+ return;
+ }
+ if (fread(&tileX, sizeof(int), 1, file) != 1)
+ {
+ fclose(file);
+ return;
+ }
+ if (fread(&tileY, sizeof(int), 1, file) != 1)
+ {
+ fclose(file);
+ return;
+ }
+
+ dtNavMesh* navMesh = NULL;
+ buildNavMesh(mapId, navMesh);
+ if (!navMesh)
+ {
+ printf("Failed creating navmesh! \n");
+ fclose(file);
+ return;
+ }
+
+ uint32 verticesCount, indicesCount;
+ if (fread(&verticesCount, sizeof(uint32), 1, file) != 1)
+ {
+ fclose(file);
+ return;
+ }
+
+ if (fread(&indicesCount, sizeof(uint32), 1, file) != 1)
+ {
+ fclose(file);
+ return;
+ }
+
+ float* verts = new float[verticesCount];
+ int* inds = new int[indicesCount];
+
+ if (fread(verts, sizeof(float), verticesCount, file) != verticesCount)
+ {
+ fclose(file);
+ delete[] verts;
+ delete[] inds;
+ return;
+ }
+
+ if (fread(inds, sizeof(int), indicesCount, file) != indicesCount)
+ {
+ fclose(file);
+ delete[] verts;
+ delete[] inds;
+ return;
+ }
+
+ MeshData data;
+
+ for (uint32 i = 0; i < verticesCount; ++i)
+ data.solidVerts.append(verts[i]);
+ delete[] verts;
+
+ for (uint32 i = 0; i < indicesCount; ++i)
+ data.solidTris.append(inds[i]);
+ delete[] inds;
+
+ TerrainBuilder::cleanVertices(data.solidVerts, data.solidTris);
+ // get bounds of current tile
+ float bmin[3], bmax[3];
+ getTileBounds(tileX, tileY, data.solidVerts.getCArray(), data.solidVerts.size() / 3, bmin, bmax);
+
+ // build navmesh tile
+ buildMoveMapTile(mapId, tileX, tileY, data, bmin, bmax, navMesh);
+ fclose(file);
+ }
+
+ /**************************************************************************/
+ void MapBuilder::buildSingleTile(uint32 mapID, uint32 tileX, uint32 tileY)
+ {
+ dtNavMesh* navMesh = NULL;
+ buildNavMesh(mapID, navMesh);
+ if (!navMesh)
+ {
+ printf("Failed creating navmesh! \n");
+ return;
+ }
+
+ buildTile(mapID, tileX, tileY, navMesh);
+ dtFreeNavMesh(navMesh);
+ }
+
+ /**************************************************************************/
+ void MapBuilder::buildMap(uint32 mapID)
+ {
+#ifndef __APPLE__
+ //printf("[Thread %u] Building map %03u:\n", uint32(ACE_Thread::self()), mapID);
+#endif
+
+ std::set<uint32>* tiles = getTileList(mapID);
+
+ // make sure we process maps which don't have tiles
+ if (!tiles->size())
+ {
+ // convert coord bounds to grid bounds
+ uint32 minX, minY, maxX, maxY;
+ getGridBounds(mapID, minX, minY, maxX, maxY);
+
+ // add all tiles within bounds to tile list.
+ for (uint32 i = minX; i <= maxX; ++i)
+ for (uint32 j = minY; j <= maxY; ++j)
+ tiles->insert(StaticMapTree::packTileID(i, j));
+ }
+
+ if (!tiles->empty())
+ {
+ // build navMesh
+ dtNavMesh* navMesh = NULL;
+ buildNavMesh(mapID, navMesh);
+ if (!navMesh)
+ {
+ printf("[Map %03i] Failed creating navmesh!\n", mapID);
+ return;
+ }
+
+ // now start building mmtiles for each tile
+ printf("[Map %03i] We have %u tiles. \n", mapID, (unsigned int)tiles->size());
+ for (std::set<uint32>::iterator it = tiles->begin(); it != tiles->end(); ++it)
+ {
+ uint32 tileX, tileY;
+
+ // unpack tile coords
+ StaticMapTree::unpackTileID((*it), tileX, tileY);
+
+ if (shouldSkipTile(mapID, tileX, tileY))
+ continue;
+
+ buildTile(mapID, tileX, tileY, navMesh);
+ }
+
+ dtFreeNavMesh(navMesh);
+ }
+
+ printf("[Map %03i] Complete!\n", mapID);
+ }
+
+ /**************************************************************************/
+ void MapBuilder::buildTile(uint32 mapID, uint32 tileX, uint32 tileY, dtNavMesh* navMesh)
+ {
+ // percentageDone - added, now it will show addional reference percentage done of the overall process
+ printf("%u%% [Map %03i] Building tile [%02u,%02u]\n", percentageDone(m_totalTiles, m_totalTilesBuilt), mapID, tileX, tileY);
+
+ MeshData meshData;
+
+ // get heightmap data
+ m_terrainBuilder->loadMap(mapID, tileX, tileY, meshData);
+
+ // get model data
+ m_terrainBuilder->loadVMap(mapID, tileY, tileX, meshData);
+
+ // if there is no data, give up now
+ if (!meshData.solidVerts.size() && !meshData.liquidVerts.size())
+ return;
+
+ // remove unused vertices
+ TerrainBuilder::cleanVertices(meshData.solidVerts, meshData.solidTris);
+ TerrainBuilder::cleanVertices(meshData.liquidVerts, meshData.liquidTris);
+
+ // gather all mesh data for final data check, and bounds calculation
+ G3D::Array<float> allVerts;
+ allVerts.append(meshData.liquidVerts);
+ allVerts.append(meshData.solidVerts);
+
+ if (!allVerts.size())
+ return;
+
+ // get bounds of current tile
+ float bmin[3], bmax[3];
+ getTileBounds(tileX, tileY, allVerts.getCArray(), allVerts.size() / 3, bmin, bmax);
+
+ m_terrainBuilder->loadOffMeshConnections(mapID, tileX, tileY, meshData, m_offMeshFilePath);
+
+ // build navmesh tile
+ buildMoveMapTile(mapID, tileX, tileY, meshData, bmin, bmax, navMesh);
+
+ // percentageDone - increment tiles built
+ m_totalTilesBuilt++;
+ }
+
+ /**************************************************************************/
+ void MapBuilder::buildNavMesh(uint32 mapID, dtNavMesh* &navMesh)
+ {
+ std::set<uint32>* tiles = getTileList(mapID);
+
+ // old code for non-statically assigned bitmask sizes:
+ ///*** calculate number of bits needed to store tiles & polys ***/
+ //int tileBits = dtIlog2(dtNextPow2(tiles->size()));
+ //if (tileBits < 1) tileBits = 1; // need at least one bit!
+ //int polyBits = sizeof(dtPolyRef)*8 - SALT_MIN_BITS - tileBits;
+
+ int polyBits = DT_POLY_BITS;
+
+ int maxTiles = tiles->size();
+ int maxPolysPerTile = 1 << polyBits;
+
+ /*** calculate bounds of map ***/
+
+ uint32 tileXMin = 64, tileYMin = 64, tileXMax = 0, tileYMax = 0, tileX, tileY;
+ for (std::set<uint32>::iterator it = tiles->begin(); it != tiles->end(); ++it)
+ {
+ StaticMapTree::unpackTileID(*it, tileX, tileY);
+
+ if (tileX > tileXMax)
+ tileXMax = tileX;
+ else if (tileX < tileXMin)
+ tileXMin = tileX;
+
+ if (tileY > tileYMax)
+ tileYMax = tileY;
+ else if (tileY < tileYMin)
+ tileYMin = tileY;
+ }
+
+ // use Max because '32 - tileX' is negative for values over 32
+ float bmin[3], bmax[3];
+ getTileBounds(tileXMax, tileYMax, NULL, 0, bmin, bmax);
+
+ /*** now create the navmesh ***/
+
+ // navmesh creation params
+ dtNavMeshParams navMeshParams;
+ memset(&navMeshParams, 0, sizeof(dtNavMeshParams));
+ navMeshParams.tileWidth = GRID_SIZE;
+ navMeshParams.tileHeight = GRID_SIZE;
+ rcVcopy(navMeshParams.orig, bmin);
+ navMeshParams.maxTiles = maxTiles;
+ navMeshParams.maxPolys = maxPolysPerTile;
+
+ navMesh = dtAllocNavMesh();
+ printf("[Map %03i] Creating navMesh...\n", mapID);
+ if (!navMesh->init(&navMeshParams))
+ {
+ printf("[Map %03i] Failed creating navmesh! \n", mapID);
+ return;
+ }
+
+ char fileName[25];
+ sprintf(fileName, "mmaps/%03u.mmap", mapID);
+
+ FILE* file = fopen(fileName, "wb");
+ if (!file)
+ {
+ dtFreeNavMesh(navMesh);
+ char message[1024];
+ sprintf(message, "[Map %03i] Failed to open %s for writing!\n", mapID, fileName);
+ perror(message);
+ return;
+ }
+
+ // now that we know navMesh params are valid, we can write them to file
+ fwrite(&navMeshParams, sizeof(dtNavMeshParams), 1, file);
+ fclose(file);
+ }
+
+ /**************************************************************************/
+ void MapBuilder::buildMoveMapTile(uint32 mapID, uint32 tileX, uint32 tileY,
+ MeshData &meshData, float bmin[3], float bmax[3],
+ dtNavMesh* navMesh)
+ {
+ // console output
+ char tileString[20];
+ sprintf(tileString, "[Map %03i] [%02i,%02i]: ", mapID, tileX, tileY);
+ printf("%s Building movemap tiles...\n", tileString);
+
+ IntermediateValues iv;
+
+ float* tVerts = meshData.solidVerts.getCArray();
+ int tVertCount = meshData.solidVerts.size() / 3;
+ int* tTris = meshData.solidTris.getCArray();
+ int tTriCount = meshData.solidTris.size() / 3;
+
+ float* lVerts = meshData.liquidVerts.getCArray();
+ int lVertCount = meshData.liquidVerts.size() / 3;
+ int* lTris = meshData.liquidTris.getCArray();
+ int lTriCount = meshData.liquidTris.size() / 3;
+ uint8* lTriFlags = meshData.liquidType.getCArray();
+
+ // these are WORLD UNIT based metrics
+ // this are basic unit dimentions
+ // value have to divide GRID_SIZE(533.3333f) ( aka: 0.5333, 0.2666, 0.3333, 0.1333, etc )
+ const static float BASE_UNIT_DIM = m_bigBaseUnit ? 0.5333333f : 0.2666666f;
+
+ // All are in UNIT metrics!
+ const static int VERTEX_PER_MAP = int(GRID_SIZE/BASE_UNIT_DIM + 0.5f);
+ const static int VERTEX_PER_TILE = m_bigBaseUnit ? 40 : 80; // must divide VERTEX_PER_MAP
+ const static int TILES_PER_MAP = VERTEX_PER_MAP/VERTEX_PER_TILE;
+
+ rcConfig config;
+ memset(&config, 0, sizeof(rcConfig));
+
+ rcVcopy(config.bmin, bmin);
+ rcVcopy(config.bmax, bmax);
+
+ config.maxVertsPerPoly = DT_VERTS_PER_POLYGON;
+ config.cs = BASE_UNIT_DIM;
+ config.ch = BASE_UNIT_DIM;
+ config.walkableSlopeAngle = m_maxWalkableAngle;
+ config.tileSize = VERTEX_PER_TILE;
+ config.walkableRadius = m_bigBaseUnit ? 1 : 2;
+ config.borderSize = config.walkableRadius + 3;
+ config.maxEdgeLen = VERTEX_PER_TILE + 1; // anything bigger than tileSize
+ config.walkableHeight = m_bigBaseUnit ? 3 : 6;
+ // a value >= 3|6 allows npcs to walk over some fences
+ // a value >= 4|8 allows npcs to walk over all fences
+ config.walkableClimb = m_bigBaseUnit ? 4 : 8;
+ config.minRegionArea = rcSqr(60);
+ config.mergeRegionArea = rcSqr(50);
+ config.maxSimplificationError = 1.8f; // eliminates most jagged edges (tiny polygons)
+ config.detailSampleDist = config.cs * 64;
+ config.detailSampleMaxError = config.ch * 2;
+
+ // this sets the dimensions of the heightfield - should maybe happen before border padding
+ rcCalcGridSize(config.bmin, config.bmax, config.cs, &config.width, &config.height);
+
+ // allocate subregions : tiles
+ Tile* tiles = new Tile[TILES_PER_MAP * TILES_PER_MAP];
+
+ // Initialize per tile config.
+ rcConfig tileCfg = config;
+ tileCfg.width = config.tileSize + config.borderSize*2;
+ tileCfg.height = config.tileSize + config.borderSize*2;
+
+ // merge per tile poly and detail meshes
+ rcPolyMesh** pmmerge = new rcPolyMesh*[TILES_PER_MAP * TILES_PER_MAP];
+ rcPolyMeshDetail** dmmerge = new rcPolyMeshDetail*[TILES_PER_MAP * TILES_PER_MAP];
+ int nmerge = 0;
+ // build all tiles
+ for (int y = 0; y < TILES_PER_MAP; ++y)
+ {
+ for (int x = 0; x < TILES_PER_MAP; ++x)
+ {
+ Tile& tile = tiles[x + y * TILES_PER_MAP];
+
+ // Calculate the per tile bounding box.
+ tileCfg.bmin[0] = config.bmin[0] + float(x*config.tileSize - config.borderSize)*config.cs;
+ tileCfg.bmin[2] = config.bmin[2] + float(y*config.tileSize - config.borderSize)*config.cs;
+ tileCfg.bmax[0] = config.bmin[0] + float((x+1)*config.tileSize + config.borderSize)*config.cs;
+ tileCfg.bmax[2] = config.bmin[2] + float((y+1)*config.tileSize + config.borderSize)*config.cs;
+
+ // build heightfield
+ tile.solid = rcAllocHeightfield();
+ if (!tile.solid || !rcCreateHeightfield(m_rcContext, *tile.solid, tileCfg.width, tileCfg.height, tileCfg.bmin, tileCfg.bmax, tileCfg.cs, tileCfg.ch))
+ {
+ printf("%s Failed building heightfield! \n", tileString);
+ continue;
+ }
+
+ // mark all walkable tiles, both liquids and solids
+ unsigned char* triFlags = new unsigned char[tTriCount];
+ memset(triFlags, NAV_GROUND, tTriCount*sizeof(unsigned char));
+ rcClearUnwalkableTriangles(m_rcContext, tileCfg.walkableSlopeAngle, tVerts, tVertCount, tTris, tTriCount, triFlags);
+ rcRasterizeTriangles(m_rcContext, tVerts, tVertCount, tTris, triFlags, tTriCount, *tile.solid, config.walkableClimb);
+ delete[] triFlags;
+
+ rcFilterLowHangingWalkableObstacles(m_rcContext, config.walkableClimb, *tile.solid);
+ rcFilterLedgeSpans(m_rcContext, tileCfg.walkableHeight, tileCfg.walkableClimb, *tile.solid);
+ rcFilterWalkableLowHeightSpans(m_rcContext, tileCfg.walkableHeight, *tile.solid);
+
+ rcRasterizeTriangles(m_rcContext, lVerts, lVertCount, lTris, lTriFlags, lTriCount, *tile.solid, config.walkableClimb);
+
+ // compact heightfield spans
+ tile.chf = rcAllocCompactHeightfield();
+ if (!tile.chf || !rcBuildCompactHeightfield(m_rcContext, tileCfg.walkableHeight, tileCfg.walkableClimb, *tile.solid, *tile.chf))
+ {
+ printf("%s Failed compacting heightfield! \n", tileString);
+ continue;
+ }
+
+ // build polymesh intermediates
+ if (!rcErodeWalkableArea(m_rcContext, config.walkableRadius, *tile.chf))
+ {
+ printf("%s Failed eroding area! \n", tileString);
+ continue;
+ }
+
+ if (!rcBuildDistanceField(m_rcContext, *tile.chf))
+ {
+ printf("%s Failed building distance field! \n", tileString);
+ continue;
+ }
+
+ if (!rcBuildRegions(m_rcContext, *tile.chf, tileCfg.borderSize, tileCfg.minRegionArea, tileCfg.mergeRegionArea))
+ {
+ printf("%s Failed building regions! \n", tileString);
+ continue;
+ }
+
+ tile.cset = rcAllocContourSet();
+ if (!tile.cset || !rcBuildContours(m_rcContext, *tile.chf, tileCfg.maxSimplificationError, tileCfg.maxEdgeLen, *tile.cset))
+ {
+ printf("%s Failed building contours! \n", tileString);
+ continue;
+ }
+
+ // build polymesh
+ tile.pmesh = rcAllocPolyMesh();
+ if (!tile.pmesh || !rcBuildPolyMesh(m_rcContext, *tile.cset, tileCfg.maxVertsPerPoly, *tile.pmesh))
+ {
+ printf("%s Failed building polymesh! \n", tileString);
+ continue;
+ }
+
+ tile.dmesh = rcAllocPolyMeshDetail();
+ if (!tile.dmesh || !rcBuildPolyMeshDetail(m_rcContext, *tile.pmesh, *tile.chf, tileCfg.detailSampleDist, tileCfg.detailSampleMaxError, *tile.dmesh))
+ {
+ printf("%s Failed building polymesh detail! \n", tileString);
+ continue;
+ }
+
+ // free those up
+ // we may want to keep them in the future for debug
+ // but right now, we don't have the code to merge them
+ rcFreeHeightField(tile.solid);
+ tile.solid = NULL;
+ rcFreeCompactHeightfield(tile.chf);
+ tile.chf = NULL;
+ rcFreeContourSet(tile.cset);
+ tile.cset = NULL;
+
+ pmmerge[nmerge] = tile.pmesh;
+ dmmerge[nmerge] = tile.dmesh;
+ nmerge++;
+ }
+ }
+
+ iv.polyMesh = rcAllocPolyMesh();
+ if (!iv.polyMesh)
+ {
+ printf("%s alloc iv.polyMesh FAILED!\n", tileString);
+ delete[] pmmerge;
+ delete[] dmmerge;
+ delete[] tiles;
+ return;
+ }
+ rcMergePolyMeshes(m_rcContext, pmmerge, nmerge, *iv.polyMesh);
+
+ iv.polyMeshDetail = rcAllocPolyMeshDetail();
+ if (!iv.polyMeshDetail)
+ {
+ printf("%s alloc m_dmesh FAILED!\n", tileString);
+ delete[] pmmerge;
+ delete[] dmmerge;
+ delete[] tiles;
+ return;
+ }
+ rcMergePolyMeshDetails(m_rcContext, dmmerge, nmerge, *iv.polyMeshDetail);
+
+ // free things up
+ delete[] pmmerge;
+ delete[] dmmerge;
+ delete[] tiles;
+
+ // set polygons as walkable
+ // TODO: special flags for DYNAMIC polygons, ie surfaces that can be turned on and off
+ for (int i = 0; i < iv.polyMesh->npolys; ++i)
+ if (iv.polyMesh->areas[i] & RC_WALKABLE_AREA)
+ iv.polyMesh->flags[i] = iv.polyMesh->areas[i];
+
+ // setup mesh parameters
+ dtNavMeshCreateParams params;
+ memset(&params, 0, sizeof(params));
+ params.verts = iv.polyMesh->verts;
+ params.vertCount = iv.polyMesh->nverts;
+ params.polys = iv.polyMesh->polys;
+ params.polyAreas = iv.polyMesh->areas;
+ params.polyFlags = iv.polyMesh->flags;
+ params.polyCount = iv.polyMesh->npolys;
+ params.nvp = iv.polyMesh->nvp;
+ params.detailMeshes = iv.polyMeshDetail->meshes;
+ params.detailVerts = iv.polyMeshDetail->verts;
+ params.detailVertsCount = iv.polyMeshDetail->nverts;
+ params.detailTris = iv.polyMeshDetail->tris;
+ params.detailTriCount = iv.polyMeshDetail->ntris;
+
+ params.offMeshConVerts = meshData.offMeshConnections.getCArray();
+ params.offMeshConCount = meshData.offMeshConnections.size()/6;
+ params.offMeshConRad = meshData.offMeshConnectionRads.getCArray();
+ params.offMeshConDir = meshData.offMeshConnectionDirs.getCArray();
+ params.offMeshConAreas = meshData.offMeshConnectionsAreas.getCArray();
+ params.offMeshConFlags = meshData.offMeshConnectionsFlags.getCArray();
+
+ params.walkableHeight = BASE_UNIT_DIM*config.walkableHeight; // agent height
+ params.walkableRadius = BASE_UNIT_DIM*config.walkableRadius; // agent radius
+ params.walkableClimb = BASE_UNIT_DIM*config.walkableClimb; // keep less that walkableHeight (aka agent height)!
+ params.tileX = (((bmin[0] + bmax[0]) / 2) - navMesh->getParams()->orig[0]) / GRID_SIZE;
+ params.tileY = (((bmin[2] + bmax[2]) / 2) - navMesh->getParams()->orig[2]) / GRID_SIZE;
+ rcVcopy(params.bmin, bmin);
+ rcVcopy(params.bmax, bmax);
+ params.cs = config.cs;
+ params.ch = config.ch;
+ params.tileLayer = 0;
+ params.buildBvTree = true;
+
+ // will hold final navmesh
+ unsigned char* navData = NULL;
+ int navDataSize = 0;
+
+ do
+ {
+ // these values are checked within dtCreateNavMeshData - handle them here
+ // so we have a clear error message
+ if (params.nvp > DT_VERTS_PER_POLYGON)
+ {
+ printf("%s Invalid verts-per-polygon value! \n", tileString);
+ break;
+ }
+ if (params.vertCount >= 0xffff)
+ {
+ printf("%s Too many vertices! \n", tileString);
+ break;
+ }
+ if (!params.vertCount || !params.verts)
+ {
+ // occurs mostly when adjacent tiles have models
+ // loaded but those models don't span into this tile
+
+ // message is an annoyance
+ printf("%sNo vertices to build tile! \n", tileString);
+ break;
+ }
+ if (!params.polyCount || !params.polys ||
+ TILES_PER_MAP*TILES_PER_MAP == params.polyCount)
+ {
+ // we have flat tiles with no actual geometry - don't build those, its useless
+ // keep in mind that we do output those into debug info
+ // drop tiles with only exact count - some tiles may have geometry while having less tiles
+ printf("%s No polygons to build on tile! \n", tileString);
+ break;
+ }
+ if (!params.detailMeshes || !params.detailVerts || !params.detailTris)
+ {
+ printf("%s No detail mesh to build tile! \n", tileString);
+ break;
+ }
+
+ printf("%s Building navmesh tile...\n", tileString);
+ if (!dtCreateNavMeshData(&params, &navData, &navDataSize))
+ {
+ printf("%s Failed building navmesh tile! \n", tileString);
+ break;
+ }
+
+ dtTileRef tileRef = 0;
+ printf("%s Adding tile to navmesh...\n", tileString);
+ // DT_TILE_FREE_DATA tells detour to unallocate memory when the tile
+ // is removed via removeTile()
+ dtStatus dtResult = navMesh->addTile(navData, navDataSize, DT_TILE_FREE_DATA, 0, &tileRef);
+ if (!tileRef || dtResult != DT_SUCCESS)
+ {
+ printf("%s Failed adding tile to navmesh! \n", tileString);
+ break;
+ }
+
+ // file output
+ char fileName[255];
+ sprintf(fileName, "mmaps/%03u%02i%02i.mmtile", mapID, tileY, tileX);
+ FILE* file = fopen(fileName, "wb");
+ if (!file)
+ {
+ char message[1024];
+ sprintf(message, "[Map %03i] Failed to open %s for writing!\n", mapID, fileName);
+ perror(message);
+ navMesh->removeTile(tileRef, NULL, NULL);
+ break;
+ }
+
+ printf("%s Writing to file...\n", tileString);
+
+ // write header
+ MmapTileHeader header;
+ header.usesLiquids = m_terrainBuilder->usesLiquids();
+ header.size = uint32(navDataSize);
+ fwrite(&header, sizeof(MmapTileHeader), 1, file);
+
+ // write data
+ fwrite(navData, sizeof(unsigned char), navDataSize, file);
+ fclose(file);
+
+ // now that tile is written to disk, we can unload it
+ navMesh->removeTile(tileRef, NULL, NULL);
+ }
+ while (0);
+
+ if (m_debugOutput)
+ {
+ // restore padding so that the debug visualization is correct
+ for (int i = 0; i < iv.polyMesh->nverts; ++i)
+ {
+ unsigned short* v = &iv.polyMesh->verts[i*3];
+ v[0] += (unsigned short)config.borderSize;
+ v[2] += (unsigned short)config.borderSize;
+ }
+
+ iv.generateObjFile(mapID, tileX, tileY, meshData);
+ iv.writeIV(mapID, tileX, tileY);
+ }
+ }
+
+ /**************************************************************************/
+ void MapBuilder::getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax)
+ {
+ // this is for elevation
+ if (verts && vertCount)
+ rcCalcBounds(verts, vertCount, bmin, bmax);
+ else
+ {
+ bmin[1] = FLT_MIN;
+ bmax[1] = FLT_MAX;
+ }
+
+ // this is for width and depth
+ bmax[0] = (32 - int(tileX)) * GRID_SIZE;
+ bmax[2] = (32 - int(tileY)) * GRID_SIZE;
+ bmin[0] = bmax[0] - GRID_SIZE;
+ bmin[2] = bmax[2] - GRID_SIZE;
+ }
+
+ /**************************************************************************/
+ bool MapBuilder::shouldSkipMap(uint32 mapID)
+ {
+ if (m_skipContinents)
+ switch (mapID)
+ {
+ case 0:
+ case 1:
+ case 530:
+ case 571:
+ return true;
+ default:
+ break;
+ }
+
+ if (m_skipJunkMaps)
+ switch (mapID)
+ {
+ case 13: // test.wdt
+ case 25: // ScottTest.wdt
+ case 29: // Test.wdt
+ case 42: // Colin.wdt
+ case 169: // EmeraldDream.wdt (unused, and very large)
+ case 451: // development.wdt
+ case 573: // ExteriorTest.wdt
+ case 597: // CraigTest.wdt
+ case 605: // development_nonweighted.wdt
+ case 606: // QA_DVD.wdt
+ return true;
+ default:
+ if (isTransportMap(mapID))
+ return true;
+ break;
+ }
+
+ if (m_skipBattlegrounds)
+ switch (mapID)
+ {
+ case 30: // AV
+ case 37: // ?
+ case 489: // WSG
+ case 529: // AB
+ case 566: // EotS
+ case 607: // SotA
+ case 628: // IoC
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ /**************************************************************************/
+ bool MapBuilder::isTransportMap(uint32 mapID)
+ {
+ switch (mapID)
+ {
+ // transport maps
+ case 582:
+ case 584:
+ case 586:
+ case 587:
+ case 588:
+ case 589:
+ case 590:
+ case 591:
+ case 592:
+ case 593:
+ case 594:
+ case 596:
+ case 610:
+ case 612:
+ case 613:
+ case 614:
+ case 620:
+ case 621:
+ case 622:
+ case 623:
+ case 641:
+ case 642:
+ case 647:
+ case 672:
+ case 673:
+ case 712:
+ case 713:
+ case 718:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**************************************************************************/
+ bool MapBuilder::shouldSkipTile(uint32 mapID, uint32 tileX, uint32 tileY)
+ {
+ char fileName[255];
+ sprintf(fileName, "mmaps/%03u%02i%02i.mmtile", mapID, tileY, tileX);
+ FILE* file = fopen(fileName, "rb");
+ if (!file)
+ return false;
+
+ MmapTileHeader header;
+ int count = fread(&header, sizeof(MmapTileHeader), 1, file);
+ fclose(file);
+ if (count != 1)
+ return false;
+
+ if (header.mmapMagic != MMAP_MAGIC || header.dtVersion != uint32(DT_NAVMESH_VERSION))
+ return false;
+
+ if (header.mmapVersion != MMAP_VERSION)
+ return false;
+
+ return true;
+ }
+
+ /**************************************************************************/
+ uint32 MapBuilder::percentageDone(uint32 totalTiles, uint32 totalTilesBuilt)
+ {
+ if (totalTiles)
+ return totalTilesBuilt * 100 / totalTiles;
+
+ return 0;
+ }
+}
diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h
new file mode 100644
index 0000000000..877102af7e
--- /dev/null
+++ b/src/tools/mmaps_generator/MapBuilder.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MAP_BUILDER_H
+#define _MAP_BUILDER_H
+
+#include <vector>
+#include <set>
+#include <atomic>
+#include <map>
+#include <list>
+
+#include "TerrainBuilder.h"
+#include "IntermediateValues.h"
+
+#include "Recast.h"
+#include "DetourNavMesh.h"
+
+#include <ace/Task.h>
+#include <ace/Activation_Queue.h>
+#include <ace/Method_Request.h>
+
+using namespace VMAP;
+
+// G3D namespace typedefs conflicts with ACE typedefs
+
+namespace MMAP
+{
+ struct MapTiles
+ {
+ MapTiles() : m_mapId(uint32(-1)), m_tiles(NULL) {}
+
+ MapTiles(uint32 id, std::set<uint32>* tiles) : m_mapId(id), m_tiles(tiles) {}
+ ~MapTiles() {}
+
+ uint32 m_mapId;
+ std::set<uint32>* m_tiles;
+
+ bool operator==(uint32 id)
+ {
+ return m_mapId == id;
+ }
+ };
+
+ typedef std::list<MapTiles> TileList;
+
+ struct Tile
+ {
+ Tile() : chf(NULL), solid(NULL), cset(NULL), pmesh(NULL), dmesh(NULL) {}
+ ~Tile()
+ {
+ rcFreeCompactHeightfield(chf);
+ rcFreeContourSet(cset);
+ rcFreeHeightField(solid);
+ rcFreePolyMesh(pmesh);
+ rcFreePolyMeshDetail(dmesh);
+ }
+ rcCompactHeightfield* chf;
+ rcHeightfield* solid;
+ rcContourSet* cset;
+ rcPolyMesh* pmesh;
+ rcPolyMeshDetail* dmesh;
+ };
+
+ class MapBuilder
+ {
+ public:
+ MapBuilder(float maxWalkableAngle = 70.f,
+ bool skipLiquid = false,
+ bool skipContinents = false,
+ bool skipJunkMaps = true,
+ bool skipBattlegrounds = false,
+ bool debugOutput = false,
+ bool bigBaseUnit = false,
+ const char* offMeshFilePath = NULL);
+
+ ~MapBuilder();
+
+ // builds all mmap tiles for the specified map id (ignores skip settings)
+ void buildMap(uint32 mapID);
+ void buildMeshFromFile(char* name);
+
+ // builds an mmap tile for the specified map and its mesh
+ void buildSingleTile(uint32 mapID, uint32 tileX, uint32 tileY);
+
+ // builds list of maps, then builds all of mmap tiles (based on the skip settings)
+ void buildAllMaps(int threads);
+
+ private:
+ // detect maps and tiles
+ void discoverTiles();
+ std::set<uint32>* getTileList(uint32 mapID);
+
+ void buildNavMesh(uint32 mapID, dtNavMesh* &navMesh);
+
+ void buildTile(uint32 mapID, uint32 tileX, uint32 tileY, dtNavMesh* navMesh);
+
+ // move map building
+ void buildMoveMapTile(uint32 mapID,
+ uint32 tileX,
+ uint32 tileY,
+ MeshData &meshData,
+ float bmin[3],
+ float bmax[3],
+ dtNavMesh* navMesh);
+
+ void getTileBounds(uint32 tileX, uint32 tileY,
+ float* verts, int vertCount,
+ float* bmin, float* bmax);
+ void getGridBounds(uint32 mapID, uint32 &minX, uint32 &minY, uint32 &maxX, uint32 &maxY) const;
+
+ bool shouldSkipMap(uint32 mapID);
+ bool isTransportMap(uint32 mapID);
+ bool shouldSkipTile(uint32 mapID, uint32 tileX, uint32 tileY);
+ // percentageDone - method to calculate percentage
+ uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone);
+
+ TerrainBuilder* m_terrainBuilder;
+ TileList m_tiles;
+
+ bool m_debugOutput;
+
+ const char* m_offMeshFilePath;
+ bool m_skipContinents;
+ bool m_skipJunkMaps;
+ bool m_skipBattlegrounds;
+
+ float m_maxWalkableAngle;
+ bool m_bigBaseUnit;
+ // percentageDone - variables to calculate percentage
+ uint32 m_totalTiles;
+ std::atomic<uint32> m_totalTilesBuilt;
+
+ // build performance - not really used for now
+ rcContext* m_rcContext;
+ };
+
+ class MapBuildRequest : public ACE_Method_Request
+ {
+ public:
+ MapBuildRequest(uint32 mapId) : _mapId(mapId) {}
+
+ virtual int call()
+ {
+ /// @ Actually a creative way of unabstracting the class and returning a member variable
+ return (int)_mapId;
+ }
+
+ private:
+ uint32 _mapId;
+ };
+
+ class BuilderThread : public ACE_Task_Base
+ {
+ private:
+ MapBuilder* _builder;
+ ACE_Activation_Queue* _queue;
+
+ public:
+ BuilderThread(MapBuilder* builder, ACE_Activation_Queue* queue) : _builder(builder), _queue(queue) { activate(); }
+
+ int svc()
+ {
+ /// @ Set a timeout for dequeue attempts (only used when the queue is empty) as it will never get populated after thread starts
+ ACE_Time_Value timeout(5);
+ ACE_Method_Request* request = NULL;
+ while ((request = _queue->dequeue(&timeout)) != NULL)
+ {
+ _builder->buildMap(request->call());
+ delete request;
+ request = NULL;
+ }
+
+ return 0;
+ }
+ };
+
+ class BuilderThreadPool
+ {
+ public:
+ BuilderThreadPool() : _queue(new ACE_Activation_Queue()) {}
+ ~BuilderThreadPool() { _queue->queue()->close(); delete _queue; }
+
+ void Enqueue(MapBuildRequest* request)
+ {
+ _queue->enqueue(request);
+ }
+
+ ACE_Activation_Queue* Queue() { return _queue; }
+
+ private:
+ ACE_Activation_Queue* _queue;
+ };
+}
+
+#endif
diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h
new file mode 100644
index 0000000000..e3f23b1a76
--- /dev/null
+++ b/src/tools/mmaps_generator/PathCommon.h
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MMAP_COMMON_H
+#define _MMAP_COMMON_H
+
+#include "Common.h"
+#include <string>
+#include <vector>
+
+#ifndef _WIN32
+ #include <stddef.h>
+ #include <dirent.h>
+#endif
+
+#ifdef __linux__
+ #include <errno.h>
+#endif
+
+#include "Database/DatabaseEnv.h"
+
+enum NavTerrain
+{
+ NAV_EMPTY = 0x00,
+ NAV_GROUND = 0x01,
+ NAV_MAGMA = 0x02,
+ NAV_SLIME = 0x04,
+ NAV_WATER = 0x08,
+ NAV_UNUSED1 = 0x10,
+ NAV_UNUSED2 = 0x20,
+ NAV_UNUSED3 = 0x40,
+ NAV_UNUSED4 = 0x80
+ // we only have 8 bits
+};
+
+namespace MMAP
+{
+ inline bool matchWildcardFilter(const char* filter, const char* str)
+ {
+ if (!filter || !str)
+ return false;
+
+ // end on null character
+ while (*filter && *str)
+ {
+ if (*filter == '*')
+ {
+ if (*++filter == '\0') // wildcard at end of filter means all remaing chars match
+ return true;
+
+ for (;;)
+ {
+ if (*filter == *str)
+ break;
+ if (*str == '\0')
+ return false; // reached end of string without matching next filter character
+ str++;
+ }
+ }
+ else if (*filter != *str)
+ return false; // mismatch
+
+ filter++;
+ str++;
+ }
+
+ return ((*filter == '\0' || (*filter == '*' && *++filter == '\0')) && *str == '\0');
+ }
+
+ enum ListFilesResult
+ {
+ LISTFILE_DIRECTORY_NOT_FOUND = 0,
+ LISTFILE_OK = 1
+ };
+
+ inline ListFilesResult getDirContents(std::vector<std::string> &fileList, std::string dirpath = ".", std::string filter = "*")
+ {
+ #ifdef WIN32
+ HANDLE hFind;
+ WIN32_FIND_DATA findFileInfo;
+ std::string directory;
+
+ directory = dirpath + "/" + filter;
+
+ hFind = FindFirstFile(directory.c_str(), &findFileInfo);
+
+ if (hFind == INVALID_HANDLE_VALUE)
+ return LISTFILE_DIRECTORY_NOT_FOUND;
+ do
+ {
+ if ((findFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
+ fileList.push_back(std::string(findFileInfo.cFileName));
+ }
+ while (FindNextFile(hFind, &findFileInfo));
+
+ FindClose(hFind);
+
+ #else
+ const char *p = dirpath.c_str();
+ DIR * dirp = opendir(p);
+ struct dirent * dp;
+
+ while (dirp)
+ {
+ errno = 0;
+ if ((dp = readdir(dirp)) != NULL)
+ {
+ if (matchWildcardFilter(filter.c_str(), dp->d_name))
+ fileList.push_back(std::string(dp->d_name));
+ }
+ else
+ break;
+ }
+
+ if (dirp)
+ closedir(dirp);
+ else
+ return LISTFILE_DIRECTORY_NOT_FOUND;
+ #endif
+
+ return LISTFILE_OK;
+ }
+}
+
+#endif
diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp
new file mode 100644
index 0000000000..1ce6137fc2
--- /dev/null
+++ b/src/tools/mmaps_generator/PathGenerator.cpp
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "PathCommon.h"
+#include "MapBuilder.h"
+#include "Timer.h"
+
+using namespace MMAP;
+
+bool checkDirectories(bool debugOutput)
+{
+ std::vector<std::string> dirFiles;
+
+ if (getDirContents(dirFiles, "maps") == LISTFILE_DIRECTORY_NOT_FOUND || dirFiles.empty())
+ {
+ printf("'maps' directory is empty or does not exist\n");
+ return false;
+ }
+
+ dirFiles.clear();
+ if (getDirContents(dirFiles, "vmaps", "*.vmtree") == LISTFILE_DIRECTORY_NOT_FOUND || dirFiles.empty())
+ {
+ printf("'vmaps' directory is empty or does not exist\n");
+ return false;
+ }
+
+ dirFiles.clear();
+ if (getDirContents(dirFiles, "mmaps") == LISTFILE_DIRECTORY_NOT_FOUND)
+ {
+ printf("'mmaps' directory does not exist\n");
+ return false;
+ }
+
+ dirFiles.clear();
+ if (debugOutput)
+ {
+ if (getDirContents(dirFiles, "meshes") == LISTFILE_DIRECTORY_NOT_FOUND)
+ {
+ printf("'meshes' directory does not exist (no place to put debugOutput files)\n");
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool handleArgs(int argc, char** argv,
+ int &mapnum,
+ int &tileX,
+ int &tileY,
+ float &maxAngle,
+ bool &skipLiquid,
+ bool &skipContinents,
+ bool &skipJunkMaps,
+ bool &skipBattlegrounds,
+ bool &debugOutput,
+ bool &silent,
+ bool &bigBaseUnit,
+ char* &offMeshInputPath,
+ char* &file,
+ int& threads)
+{
+ char* param = NULL;
+ for (int i = 1; i < argc; ++i)
+ {
+ if (strcmp(argv[i], "--maxAngle") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ float maxangle = atof(param);
+ if (maxangle <= 90.f && maxangle >= 45.f)
+ maxAngle = maxangle;
+ else
+ printf("invalid option for '--maxAngle', using default\n");
+ }
+ else if (strcmp(argv[i], "--threads") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+ threads = atoi(param);
+ printf("Using %i threads to extract mmaps\n", threads);
+ }
+ else if (strcmp(argv[i], "--file") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+ file = param;
+ }
+ else if (strcmp(argv[i], "--tile") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ char* stileX = strtok(param, ",");
+ char* stileY = strtok(NULL, ",");
+ int tilex = atoi(stileX);
+ int tiley = atoi(stileY);
+
+ if ((tilex > 0 && tilex < 64) || (tilex == 0 && strcmp(stileX, "0") == 0))
+ tileX = tilex;
+ if ((tiley > 0 && tiley < 64) || (tiley == 0 && strcmp(stileY, "0") == 0))
+ tileY = tiley;
+
+ if (tileX < 0 || tileY < 0)
+ {
+ printf("invalid tile coords.\n");
+ return false;
+ }
+ }
+ else if (strcmp(argv[i], "--skipLiquid") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ if (strcmp(param, "true") == 0)
+ skipLiquid = true;
+ else if (strcmp(param, "false") == 0)
+ skipLiquid = false;
+ else
+ printf("invalid option for '--skipLiquid', using default\n");
+ }
+ else if (strcmp(argv[i], "--skipContinents") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ if (strcmp(param, "true") == 0)
+ skipContinents = true;
+ else if (strcmp(param, "false") == 0)
+ skipContinents = false;
+ else
+ printf("invalid option for '--skipContinents', using default\n");
+ }
+ else if (strcmp(argv[i], "--skipJunkMaps") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ if (strcmp(param, "true") == 0)
+ skipJunkMaps = true;
+ else if (strcmp(param, "false") == 0)
+ skipJunkMaps = false;
+ else
+ printf("invalid option for '--skipJunkMaps', using default\n");
+ }
+ else if (strcmp(argv[i], "--skipBattlegrounds") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ if (strcmp(param, "true") == 0)
+ skipBattlegrounds = true;
+ else if (strcmp(param, "false") == 0)
+ skipBattlegrounds = false;
+ else
+ printf("invalid option for '--skipBattlegrounds', using default\n");
+ }
+ else if (strcmp(argv[i], "--debugOutput") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ if (strcmp(param, "true") == 0)
+ debugOutput = true;
+ else if (strcmp(param, "false") == 0)
+ debugOutput = false;
+ else
+ printf("invalid option for '--debugOutput', using default true\n");
+ }
+ else if (strcmp(argv[i], "--silent") == 0)
+ {
+ silent = true;
+ }
+ else if (strcmp(argv[i], "--bigBaseUnit") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ if (strcmp(param, "true") == 0)
+ bigBaseUnit = true;
+ else if (strcmp(param, "false") == 0)
+ bigBaseUnit = false;
+ else
+ printf("invalid option for '--bigBaseUnit', using default false\n");
+ }
+ else if (strcmp(argv[i], "--offMeshInput") == 0)
+ {
+ param = argv[++i];
+ if (!param)
+ return false;
+
+ offMeshInputPath = param;
+ }
+ else
+ {
+ int map = atoi(argv[i]);
+ if (map > 0 || (map == 0 && (strcmp(argv[i], "0") == 0)))
+ mapnum = map;
+ else
+ {
+ printf("invalid map id\n");
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+int finish(const char* message, int returnValue)
+{
+ printf("%s", message);
+ getchar(); // Wait for user input
+ return returnValue;
+}
+
+int main(int argc, char** argv)
+{
+ int threads = 3, mapnum = -1;
+ float maxAngle = 70.0f;
+ int tileX = -1, tileY = -1;
+ bool skipLiquid = false,
+ skipContinents = false,
+ skipJunkMaps = true,
+ skipBattlegrounds = false,
+ debugOutput = false,
+ silent = false,
+ bigBaseUnit = false;
+ char* offMeshInputPath = NULL;
+ char* file = NULL;
+
+ bool validParam = handleArgs(argc, argv, mapnum,
+ tileX, tileY, maxAngle,
+ skipLiquid, skipContinents, skipJunkMaps, skipBattlegrounds,
+ debugOutput, silent, bigBaseUnit, offMeshInputPath, file, threads);
+
+ if (!validParam)
+ return silent ? -1 : finish("You have specified invalid parameters", -1);
+
+ if (mapnum == -1 && debugOutput)
+ {
+ if (silent)
+ return -2;
+
+ printf("You have specifed debug output, but didn't specify a map to generate.\n");
+ printf("This will generate debug output for ALL maps.\n");
+ printf("Are you sure you want to continue? (y/n) ");
+ if (getchar() != 'y')
+ return 0;
+ }
+
+ if (!checkDirectories(debugOutput))
+ return silent ? -3 : finish("Press ENTER to close...", -3);
+
+ MapBuilder builder(maxAngle, skipLiquid, skipContinents, skipJunkMaps,
+ skipBattlegrounds, debugOutput, bigBaseUnit, offMeshInputPath);
+
+ uint32 start = getMSTime();
+ if (file)
+ builder.buildMeshFromFile(file);
+ else if (tileX > -1 && tileY > -1 && mapnum >= 0)
+ builder.buildSingleTile(mapnum, tileX, tileY);
+ else if (mapnum >= 0)
+ builder.buildMap(uint32(mapnum));
+ else
+ builder.buildAllMaps(threads);
+
+ if (!silent)
+ printf("Finished. MMAPS were built in %u ms!\n", GetMSTimeDiffToNow(start));
+ return 0;
+}
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
new file mode 100644
index 0000000000..3445013bd8
--- /dev/null
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -0,0 +1,923 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "TerrainBuilder.h"
+
+#include "PathCommon.h"
+#include "MapBuilder.h"
+
+#include "VMapManager2.h"
+#include "MapTree.h"
+#include "ModelInstance.h"
+#include <vector>
+
+// ******************************************
+// Map file format defines
+// ******************************************
+struct map_fileheader
+{
+ uint32 mapMagic;
+ uint32 versionMagic;
+ uint32 buildMagic;
+ uint32 areaMapOffset;
+ uint32 areaMapSize;
+ uint32 heightMapOffset;
+ uint32 heightMapSize;
+ uint32 liquidMapOffset;
+ uint32 liquidMapSize;
+ uint32 holesOffset;
+ uint32 holesSize;
+};
+
+#define MAP_HEIGHT_NO_HEIGHT 0x0001
+#define MAP_HEIGHT_AS_INT16 0x0002
+#define MAP_HEIGHT_AS_INT8 0x0004
+
+struct map_heightHeader
+{
+ uint32 fourcc;
+ uint32 flags;
+ float gridHeight;
+ float gridMaxHeight;
+};
+
+#define MAP_LIQUID_NO_TYPE 0x0001
+#define MAP_LIQUID_NO_HEIGHT 0x0002
+
+struct map_liquidHeader
+{
+ uint32 fourcc;
+ uint16 flags;
+ uint16 liquidType;
+ uint8 offsetX;
+ uint8 offsetY;
+ uint8 width;
+ uint8 height;
+ float liquidLevel;
+};
+
+#define MAP_LIQUID_TYPE_NO_WATER 0x00
+#define MAP_LIQUID_TYPE_WATER 0x01
+#define MAP_LIQUID_TYPE_OCEAN 0x02
+#define MAP_LIQUID_TYPE_MAGMA 0x04
+#define MAP_LIQUID_TYPE_SLIME 0x08
+#define MAP_LIQUID_TYPE_DARK_WATER 0x10
+#define MAP_LIQUID_TYPE_WMO_WATER 0x20
+
+namespace MMAP
+{
+
+ char const* MAP_VERSION_MAGIC = "v1.8";
+
+ TerrainBuilder::TerrainBuilder(bool skipLiquid) : m_skipLiquid (skipLiquid){ }
+ TerrainBuilder::~TerrainBuilder() { }
+
+ /**************************************************************************/
+ void TerrainBuilder::getLoopVars(Spot portion, int &loopStart, int &loopEnd, int &loopInc)
+ {
+ switch (portion)
+ {
+ case ENTIRE:
+ loopStart = 0;
+ loopEnd = V8_SIZE_SQ;
+ loopInc = 1;
+ break;
+ case TOP:
+ loopStart = 0;
+ loopEnd = V8_SIZE;
+ loopInc = 1;
+ break;
+ case LEFT:
+ loopStart = 0;
+ loopEnd = V8_SIZE_SQ - V8_SIZE + 1;
+ loopInc = V8_SIZE;
+ break;
+ case RIGHT:
+ loopStart = V8_SIZE - 1;
+ loopEnd = V8_SIZE_SQ;
+ loopInc = V8_SIZE;
+ break;
+ case BOTTOM:
+ loopStart = V8_SIZE_SQ - V8_SIZE;
+ loopEnd = V8_SIZE_SQ;
+ loopInc = 1;
+ break;
+ }
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData)
+ {
+ if (loadMap(mapID, tileX, tileY, meshData, ENTIRE))
+ {
+ loadMap(mapID, tileX+1, tileY, meshData, LEFT);
+ loadMap(mapID, tileX-1, tileY, meshData, RIGHT);
+ loadMap(mapID, tileX, tileY+1, meshData, TOP);
+ loadMap(mapID, tileX, tileY-1, meshData, BOTTOM);
+ }
+ }
+
+ /**************************************************************************/
+ bool TerrainBuilder::loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, Spot portion)
+ {
+ char mapFileName[255];
+ sprintf(mapFileName, "maps/%03u%02u%02u.map", mapID, tileY, tileX);
+
+ FILE* mapFile = fopen(mapFileName, "rb");
+ if (!mapFile)
+ return false;
+
+ map_fileheader fheader;
+ if (fread(&fheader, sizeof(map_fileheader), 1, mapFile) != 1 ||
+ fheader.versionMagic != *((uint32 const*)(MAP_VERSION_MAGIC)))
+ {
+ fclose(mapFile);
+ printf("%s is the wrong version, please extract new .map files\n", mapFileName);
+ return false;
+ }
+
+ map_heightHeader hheader;
+ fseek(mapFile, fheader.heightMapOffset, SEEK_SET);
+
+ bool haveTerrain = false;
+ bool haveLiquid = false;
+ if (fread(&hheader, sizeof(map_heightHeader), 1, mapFile) == 1)
+ {
+ haveTerrain = !(hheader.flags & MAP_HEIGHT_NO_HEIGHT);
+ haveLiquid = fheader.liquidMapOffset && !m_skipLiquid;
+ }
+
+ // no data in this map file
+ if (!haveTerrain && !haveLiquid)
+ {
+ fclose(mapFile);
+ return false;
+ }
+
+ // data used later
+ uint16 holes[16][16];
+ memset(holes, 0, sizeof(holes));
+ uint8 liquid_type[16][16];
+ memset(liquid_type, 0, sizeof(liquid_type));
+ G3D::Array<int> ltriangles;
+ G3D::Array<int> ttriangles;
+
+ // terrain data
+ if (haveTerrain)
+ {
+ float heightMultiplier;
+ float V9[V9_SIZE_SQ], V8[V8_SIZE_SQ];
+ int expected = V9_SIZE_SQ + V8_SIZE_SQ;
+
+ if (hheader.flags & MAP_HEIGHT_AS_INT8)
+ {
+ uint8 v9[V9_SIZE_SQ];
+ uint8 v8[V8_SIZE_SQ];
+ int count = 0;
+ count += fread(v9, sizeof(uint8), V9_SIZE_SQ, mapFile);
+ count += fread(v8, sizeof(uint8), V8_SIZE_SQ, mapFile);
+ if (count != expected)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected %d, read %d\n", expected, count);
+
+ heightMultiplier = (hheader.gridMaxHeight - hheader.gridHeight) / 255;
+
+ for (int i = 0; i < V9_SIZE_SQ; ++i)
+ V9[i] = (float)v9[i]*heightMultiplier + hheader.gridHeight;
+
+ for (int i = 0; i < V8_SIZE_SQ; ++i)
+ V8[i] = (float)v8[i]*heightMultiplier + hheader.gridHeight;
+ }
+ else if (hheader.flags & MAP_HEIGHT_AS_INT16)
+ {
+ uint16 v9[V9_SIZE_SQ];
+ uint16 v8[V8_SIZE_SQ];
+ int count = 0;
+ count += fread(v9, sizeof(uint16), V9_SIZE_SQ, mapFile);
+ count += fread(v8, sizeof(uint16), V8_SIZE_SQ, mapFile);
+ if (count != expected)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected %d, read %d\n", expected, count);
+
+ heightMultiplier = (hheader.gridMaxHeight - hheader.gridHeight) / 65535;
+
+ for (int i = 0; i < V9_SIZE_SQ; ++i)
+ V9[i] = (float)v9[i]*heightMultiplier + hheader.gridHeight;
+
+ for (int i = 0; i < V8_SIZE_SQ; ++i)
+ V8[i] = (float)v8[i]*heightMultiplier + hheader.gridHeight;
+ }
+ else
+ {
+ int count = 0;
+ count += fread(V9, sizeof(float), V9_SIZE_SQ, mapFile);
+ count += fread(V8, sizeof(float), V8_SIZE_SQ, mapFile);
+ if (count != expected)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected %d, read %d\n", expected, count);
+ }
+
+ // hole data
+ if (fheader.holesSize != 0)
+ {
+ memset(holes, 0, fheader.holesSize);
+ fseek(mapFile, fheader.holesOffset, SEEK_SET);
+ if (fread(holes, fheader.holesSize, 1, mapFile) != 1)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
+ }
+
+ int count = meshData.solidVerts.size() / 3;
+ float xoffset = (float(tileX)-32)*GRID_SIZE;
+ float yoffset = (float(tileY)-32)*GRID_SIZE;
+
+ float coord[3];
+
+ for (int i = 0; i < V9_SIZE_SQ; ++i)
+ {
+ getHeightCoord(i, GRID_V9, xoffset, yoffset, coord, V9);
+ meshData.solidVerts.append(coord[0]);
+ meshData.solidVerts.append(coord[2]);
+ meshData.solidVerts.append(coord[1]);
+ }
+
+ for (int i = 0; i < V8_SIZE_SQ; ++i)
+ {
+ getHeightCoord(i, GRID_V8, xoffset, yoffset, coord, V8);
+ meshData.solidVerts.append(coord[0]);
+ meshData.solidVerts.append(coord[2]);
+ meshData.solidVerts.append(coord[1]);
+ }
+
+ int indices[] = { 0, 0, 0 };
+ int loopStart = 0, loopEnd = 0, loopInc = 0;
+ getLoopVars(portion, loopStart, loopEnd, loopInc);
+ for (int i = loopStart; i < loopEnd; i+=loopInc)
+ for (int j = TOP; j <= BOTTOM; j+=1)
+ {
+ getHeightTriangle(i, Spot(j), indices);
+ ttriangles.append(indices[2] + count);
+ ttriangles.append(indices[1] + count);
+ ttriangles.append(indices[0] + count);
+ }
+ }
+
+ // liquid data
+ if (haveLiquid)
+ {
+ map_liquidHeader lheader;
+ fseek(mapFile, fheader.liquidMapOffset, SEEK_SET);
+ if (fread(&lheader, sizeof(map_liquidHeader), 1, mapFile) != 1)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
+
+
+ float* liquid_map = NULL;
+
+ if (!(lheader.flags & MAP_LIQUID_NO_TYPE))
+ if (fread(liquid_type, sizeof(liquid_type), 1, mapFile) != 1)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
+
+ if (!(lheader.flags & MAP_LIQUID_NO_HEIGHT))
+ {
+ uint32 toRead = lheader.width * lheader.height;
+ liquid_map = new float [toRead];
+ if (fread(liquid_map, sizeof(float), toRead, mapFile) != toRead)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
+ }
+
+ if (liquid_map)
+ {
+ int count = meshData.liquidVerts.size() / 3;
+ float xoffset = (float(tileX)-32)*GRID_SIZE;
+ float yoffset = (float(tileY)-32)*GRID_SIZE;
+
+ float coord[3];
+ int row, col;
+
+ // generate coordinates
+ if (!(lheader.flags & MAP_LIQUID_NO_HEIGHT))
+ {
+ int j = 0;
+ for (int i = 0; i < V9_SIZE_SQ; ++i)
+ {
+ row = i / V9_SIZE;
+ col = i % V9_SIZE;
+
+ if (row < lheader.offsetY || row >= lheader.offsetY + lheader.height ||
+ col < lheader.offsetX || col >= lheader.offsetX + lheader.width)
+ {
+ // dummy vert using invalid height
+ meshData.liquidVerts.append((xoffset+col*GRID_PART_SIZE)*-1, INVALID_MAP_LIQ_HEIGHT, (yoffset+row*GRID_PART_SIZE)*-1);
+ continue;
+ }
+
+ getLiquidCoord(i, j, xoffset, yoffset, coord, liquid_map);
+ meshData.liquidVerts.append(coord[0]);
+ meshData.liquidVerts.append(coord[2]);
+ meshData.liquidVerts.append(coord[1]);
+ j++;
+ }
+ }
+ else
+ {
+ for (int i = 0; i < V9_SIZE_SQ; ++i)
+ {
+ row = i / V9_SIZE;
+ col = i % V9_SIZE;
+ meshData.liquidVerts.append((xoffset+col*GRID_PART_SIZE)*-1, lheader.liquidLevel, (yoffset+row*GRID_PART_SIZE)*-1);
+ }
+ }
+
+ delete [] liquid_map;
+
+ int indices[] = { 0, 0, 0 };
+ int loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP;
+ getLoopVars(portion, loopStart, loopEnd, loopInc);
+
+ // generate triangles
+ for (int i = loopStart; i < loopEnd; i+=loopInc)
+ for (int j = TOP; j <= BOTTOM; j+= triInc)
+ {
+ getHeightTriangle(i, Spot(j), indices, true);
+ ltriangles.append(indices[2] + count);
+ ltriangles.append(indices[1] + count);
+ ltriangles.append(indices[0] + count);
+ }
+ }
+ }
+
+ fclose(mapFile);
+
+ // now that we have gathered the data, we can figure out which parts to keep:
+ // liquid above ground, ground above liquid
+ int loopStart = 0, loopEnd = 0, loopInc = 0, tTriCount = 4;
+ bool useTerrain, useLiquid;
+
+ float* lverts = meshData.liquidVerts.getCArray();
+ int* ltris = ltriangles.getCArray();
+
+ float* tverts = meshData.solidVerts.getCArray();
+ int* ttris = ttriangles.getCArray();
+
+ if ((ltriangles.size() + ttriangles.size()) == 0)
+ return false;
+
+ // make a copy of liquid vertices
+ // used to pad right-bottom frame due to lost vertex data at extraction
+ float* lverts_copy = NULL;
+ if (meshData.liquidVerts.size())
+ {
+ lverts_copy = new float[meshData.liquidVerts.size()];
+ memcpy(lverts_copy, lverts, sizeof(float)*meshData.liquidVerts.size());
+ }
+
+ getLoopVars(portion, loopStart, loopEnd, loopInc);
+ for (int i = loopStart; i < loopEnd; i+=loopInc)
+ {
+ for (int j = 0; j < 2; ++j)
+ {
+ // default is true, will change to false if needed
+ useTerrain = true;
+ useLiquid = true;
+ uint8 liquidType = MAP_LIQUID_TYPE_NO_WATER;
+ // FIXME: "warning: the address of ‘liquid_type’ will always evaluate as ‘true’"
+
+ // if there is no liquid, don't use liquid
+ if (!meshData.liquidVerts.size() || !ltriangles.size())
+ useLiquid = false;
+ else
+ {
+ liquidType = getLiquidType(i, liquid_type);
+ switch (liquidType)
+ {
+ default:
+ useLiquid = false;
+ break;
+ case MAP_LIQUID_TYPE_WATER:
+ case MAP_LIQUID_TYPE_OCEAN:
+ // merge different types of water
+ liquidType = NAV_WATER;
+ break;
+ case MAP_LIQUID_TYPE_MAGMA:
+ liquidType = NAV_MAGMA;
+ break;
+ case MAP_LIQUID_TYPE_SLIME:
+ liquidType = NAV_SLIME;
+ break;
+ case MAP_LIQUID_TYPE_DARK_WATER:
+ // players should not be here, so logically neither should creatures
+ useTerrain = false;
+ useLiquid = false;
+ break;
+ }
+ }
+
+ // if there is no terrain, don't use terrain
+ if (!ttriangles.size())
+ useTerrain = false;
+
+ // while extracting ADT data we are losing right-bottom vertices
+ // this code adds fair approximation of lost data
+ if (useLiquid)
+ {
+ float quadHeight = 0;
+ uint32 validCount = 0;
+ for(uint32 idx = 0; idx < 3; idx++)
+ {
+ float h = lverts_copy[ltris[idx]*3 + 1];
+ if (h != INVALID_MAP_LIQ_HEIGHT && h < INVALID_MAP_LIQ_HEIGHT_MAX)
+ {
+ quadHeight += h;
+ validCount++;
+ }
+ }
+
+ // update vertex height data
+ if (validCount > 0 && validCount < 3)
+ {
+ quadHeight /= validCount;
+ for(uint32 idx = 0; idx < 3; idx++)
+ {
+ float h = lverts[ltris[idx]*3 + 1];
+ if (h == INVALID_MAP_LIQ_HEIGHT || h > INVALID_MAP_LIQ_HEIGHT_MAX)
+ lverts[ltris[idx]*3 + 1] = quadHeight;
+ }
+ }
+
+ // no valid vertexes - don't use this poly at all
+ if (validCount == 0)
+ useLiquid = false;
+ }
+
+ // if there is a hole here, don't use the terrain
+ if (useTerrain && fheader.holesSize != 0)
+ useTerrain = !isHole(i, holes);
+
+ // we use only one terrain kind per quad - pick higher one
+ if (useTerrain && useLiquid)
+ {
+ float minLLevel = INVALID_MAP_LIQ_HEIGHT_MAX;
+ float maxLLevel = INVALID_MAP_LIQ_HEIGHT;
+ for(uint32 x = 0; x < 3; x++)
+ {
+ float h = lverts[ltris[x]*3 + 1];
+ if (minLLevel > h)
+ minLLevel = h;
+
+ if (maxLLevel < h)
+ maxLLevel = h;
+ }
+
+ float maxTLevel = INVALID_MAP_LIQ_HEIGHT;
+ float minTLevel = INVALID_MAP_LIQ_HEIGHT_MAX;
+ for(uint32 x = 0; x < 6; x++)
+ {
+ float h = tverts[ttris[x]*3 + 1];
+ if (maxTLevel < h)
+ maxTLevel = h;
+
+ if (minTLevel > h)
+ minTLevel = h;
+ }
+
+ // terrain under the liquid?
+ if (minLLevel > maxTLevel)
+ useTerrain = false;
+
+ //liquid under the terrain?
+ if (minTLevel > maxLLevel)
+ useLiquid = false;
+ }
+
+ // store the result
+ if (useLiquid)
+ {
+ meshData.liquidType.append(liquidType);
+ for (int k = 0; k < 3; ++k)
+ meshData.liquidTris.append(ltris[k]);
+ }
+
+ if (useTerrain)
+ for (int k = 0; k < 3*tTriCount/2; ++k)
+ meshData.solidTris.append(ttris[k]);
+
+ // advance to next set of triangles
+ ltris += 3;
+ ttris += 3*tTriCount/2;
+ }
+ }
+
+ if (lverts_copy)
+ delete [] lverts_copy;
+
+ return meshData.solidTris.size() || meshData.liquidTris.size();
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::getHeightCoord(int index, Grid grid, float xOffset, float yOffset, float* coord, float* v)
+ {
+ // wow coords: x, y, height
+ // coord is mirroed about the horizontal axes
+ switch (grid)
+ {
+ case GRID_V9:
+ coord[0] = (xOffset + index%(V9_SIZE)*GRID_PART_SIZE) * -1.f;
+ coord[1] = (yOffset + (int)(index/(V9_SIZE))*GRID_PART_SIZE) * -1.f;
+ coord[2] = v[index];
+ break;
+ case GRID_V8:
+ coord[0] = (xOffset + index%(V8_SIZE)*GRID_PART_SIZE + GRID_PART_SIZE/2.f) * -1.f;
+ coord[1] = (yOffset + (int)(index/(V8_SIZE))*GRID_PART_SIZE + GRID_PART_SIZE/2.f) * -1.f;
+ coord[2] = v[index];
+ break;
+ }
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::getHeightTriangle(int square, Spot triangle, int* indices, bool liquid/* = false*/)
+ {
+ int rowOffset = square/V8_SIZE;
+ if (!liquid)
+ switch (triangle)
+ {
+ case TOP:
+ indices[0] = square+rowOffset; // 0-----1 .... 128
+ indices[1] = square+1+rowOffset; // |\ T /|
+ indices[2] = (V9_SIZE_SQ)+square; // | \ / |
+ break; // |L 0 R| .. 127
+ case LEFT: // | / \ |
+ indices[0] = square+rowOffset; // |/ B \|
+ indices[1] = (V9_SIZE_SQ)+square; // 129---130 ... 386
+ indices[2] = square+V9_SIZE+rowOffset; // |\ /|
+ break; // | \ / |
+ case RIGHT: // | 128 | .. 255
+ indices[0] = square+1+rowOffset; // | / \ |
+ indices[1] = square+V9_SIZE+1+rowOffset; // |/ \|
+ indices[2] = (V9_SIZE_SQ)+square; // 258---259 ... 515
+ break;
+ case BOTTOM:
+ indices[0] = (V9_SIZE_SQ)+square;
+ indices[1] = square+V9_SIZE+1+rowOffset;
+ indices[2] = square+V9_SIZE+rowOffset;
+ break;
+ default: break;
+ }
+ else
+ switch (triangle)
+ { // 0-----1 .... 128
+ case TOP: // |\ |
+ indices[0] = square+rowOffset; // | \ T |
+ indices[1] = square+1+rowOffset; // | \ |
+ indices[2] = square+V9_SIZE+1+rowOffset; // | B \ |
+ break; // | \|
+ case BOTTOM: // 129---130 ... 386
+ indices[0] = square+rowOffset; // |\ |
+ indices[1] = square+V9_SIZE+1+rowOffset; // | \ |
+ indices[2] = square+V9_SIZE+rowOffset; // | \ |
+ break; // | \ |
+ default: break; // | \|
+ } // 258---259 ... 515
+
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::getLiquidCoord(int index, int index2, float xOffset, float yOffset, float* coord, float* v)
+ {
+ // wow coords: x, y, height
+ // coord is mirroed about the horizontal axes
+ coord[0] = (xOffset + index%(V9_SIZE)*GRID_PART_SIZE) * -1.f;
+ coord[1] = (yOffset + (int)(index/(V9_SIZE))*GRID_PART_SIZE) * -1.f;
+ coord[2] = v[index2];
+ }
+
+ static uint16 holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
+ static uint16 holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
+
+ /**************************************************************************/
+ bool TerrainBuilder::isHole(int square, const uint16 holes[16][16])
+ {
+ int row = square / 128;
+ int col = square % 128;
+ int cellRow = row / 8; // 8 squares per cell
+ int cellCol = col / 8;
+ int holeRow = row % 8 / 2;
+ int holeCol = (square - (row * 128 + cellCol * 8)) / 2;
+
+ uint16 hole = holes[cellRow][cellCol];
+
+ return (hole & holetab_h[holeCol] & holetab_v[holeRow]) != 0;
+ }
+
+ /**************************************************************************/
+ uint8 TerrainBuilder::getLiquidType(int square, const uint8 liquid_type[16][16])
+ {
+ int row = square / 128;
+ int col = square % 128;
+ int cellRow = row / 8; // 8 squares per cell
+ int cellCol = col / 8;
+
+ return liquid_type[cellRow][cellCol];
+ }
+
+ /**************************************************************************/
+ bool TerrainBuilder::loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData)
+ {
+ IVMapManager* vmapManager = new VMapManager2();
+ int result = vmapManager->loadMap("vmaps", mapID, tileX, tileY);
+ bool retval = false;
+
+ do
+ {
+ if (result == VMAP_LOAD_RESULT_ERROR)
+ break;
+
+ InstanceTreeMap instanceTrees;
+ ((VMapManager2*)vmapManager)->getInstanceMapTree(instanceTrees);
+
+ if (!instanceTrees[mapID])
+ break;
+
+ ModelInstance* models = NULL;
+ uint32 count = 0;
+ instanceTrees[mapID]->getModelInstances(models, count);
+
+ if (!models)
+ break;
+
+ for (uint32 i = 0; i < count; ++i)
+ {
+ ModelInstance instance = models[i];
+
+ // model instances exist in tree even though there are instances of that model in this tile
+ WorldModel* worldModel = instance.getWorldModel();
+ if (!worldModel)
+ continue;
+
+ // now we have a model to add to the meshdata
+ retval = true;
+
+ std::vector<GroupModel> groupModels;
+ worldModel->getGroupModels(groupModels);
+
+ // all M2s need to have triangle indices reversed
+ bool isM2 = instance.name.find(".m2") != std::string::npos || instance.name.find(".M2") != std::string::npos;
+
+ // transform data
+ float scale = instance.iScale;
+ G3D::Matrix3 rotation = G3D::Matrix3::fromEulerAnglesXYZ(G3D::pi()*instance.iRot.z/-180.f, G3D::pi()*instance.iRot.x/-180.f, G3D::pi()*instance.iRot.y/-180.f);
+ G3D::Vector3 position = instance.iPos;
+ position.x -= 32*GRID_SIZE;
+ position.y -= 32*GRID_SIZE;
+
+ for (std::vector<GroupModel>::iterator it = groupModels.begin(); it != groupModels.end(); ++it)
+ {
+ std::vector<G3D::Vector3> tempVertices;
+ std::vector<G3D::Vector3> transformedVertices;
+ std::vector<MeshTriangle> tempTriangles;
+ WmoLiquid* liquid = NULL;
+
+ it->getMeshData(tempVertices, tempTriangles, liquid);
+
+ // first handle collision mesh
+ transform(tempVertices, transformedVertices, scale, rotation, position);
+
+ int offset = meshData.solidVerts.size() / 3;
+
+ copyVertices(transformedVertices, meshData.solidVerts);
+ copyIndices(tempTriangles, meshData.solidTris, offset, isM2);
+
+ // now handle liquid data
+ if (liquid)
+ {
+ std::vector<G3D::Vector3> liqVerts;
+ std::vector<int> liqTris;
+ uint32 tilesX, tilesY, vertsX, vertsY;
+ G3D::Vector3 corner;
+ liquid->getPosInfo(tilesX, tilesY, corner);
+ vertsX = tilesX + 1;
+ vertsY = tilesY + 1;
+ uint8* flags = liquid->GetFlagsStorage();
+ float* data = liquid->GetHeightStorage();
+ uint8 type = NAV_EMPTY;
+
+ // convert liquid type to NavTerrain
+ switch (liquid->GetType() & 3)
+ {
+ case 0:
+ case 1:
+ type = NAV_WATER;
+ break;
+ case 2:
+ type = NAV_MAGMA;
+ break;
+ case 3:
+ type = NAV_SLIME;
+ break;
+ }
+
+ // indexing is weird...
+ // after a lot of trial and error, this is what works:
+ // vertex = y*vertsX+x
+ // tile = x*tilesY+y
+ // flag = y*tilesY+x
+
+ G3D::Vector3 vert;
+ for (uint32 x = 0; x < vertsX; ++x)
+ for (uint32 y = 0; y < vertsY; ++y)
+ {
+ vert = G3D::Vector3(corner.x + x * GRID_PART_SIZE, corner.y + y * GRID_PART_SIZE, data[y*vertsX + x]);
+ vert = vert * rotation * scale + position;
+ vert.x *= -1.f;
+ vert.y *= -1.f;
+ liqVerts.push_back(vert);
+ }
+
+ int idx1, idx2, idx3, idx4;
+ uint32 square;
+ for (uint32 x = 0; x < tilesX; ++x)
+ for (uint32 y = 0; y < tilesY; ++y)
+ if ((flags[x+y*tilesX] & 0x0f) != 0x0f)
+ {
+ square = x * tilesY + y;
+ idx1 = square+x;
+ idx2 = square+1+x;
+ idx3 = square+tilesY+1+1+x;
+ idx4 = square+tilesY+1+x;
+
+ // top triangle
+ liqTris.push_back(idx3);
+ liqTris.push_back(idx2);
+ liqTris.push_back(idx1);
+ // bottom triangle
+ liqTris.push_back(idx4);
+ liqTris.push_back(idx3);
+ liqTris.push_back(idx1);
+ }
+
+ uint32 liqOffset = meshData.liquidVerts.size() / 3;
+ for (uint32 j = 0; j < liqVerts.size(); ++j)
+ meshData.liquidVerts.append(liqVerts[j].y, liqVerts[j].z, liqVerts[j].x);
+
+ for (uint32 j = 0; j < liqTris.size() / 3; ++j)
+ {
+ meshData.liquidTris.append(liqTris[j*3+1] + liqOffset, liqTris[j*3+2] + liqOffset, liqTris[j*3] + liqOffset);
+ meshData.liquidType.append(type);
+ }
+ }
+ }
+ }
+ }
+ while (false);
+
+ vmapManager->unloadMap(mapID, tileX, tileY);
+ delete vmapManager;
+
+ return retval;
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::transform(std::vector<G3D::Vector3> &source, std::vector<G3D::Vector3> &transformedVertices, float scale, G3D::Matrix3 &rotation, G3D::Vector3 &position)
+ {
+ for (std::vector<G3D::Vector3>::iterator it = source.begin(); it != source.end(); ++it)
+ {
+ // apply tranform, then mirror along the horizontal axes
+ G3D::Vector3 v((*it) * rotation * scale + position);
+ v.x *= -1.f;
+ v.y *= -1.f;
+ transformedVertices.push_back(v);
+ }
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::copyVertices(std::vector<G3D::Vector3> &source, G3D::Array<float> &dest)
+ {
+ for (std::vector<G3D::Vector3>::iterator it = source.begin(); it != source.end(); ++it)
+ {
+ dest.push_back((*it).y);
+ dest.push_back((*it).z);
+ dest.push_back((*it).x);
+ }
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::copyIndices(std::vector<MeshTriangle> &source, G3D::Array<int> &dest, int offset, bool flip)
+ {
+ if (flip)
+ {
+ for (std::vector<MeshTriangle>::iterator it = source.begin(); it != source.end(); ++it)
+ {
+ dest.push_back((*it).idx2+offset);
+ dest.push_back((*it).idx1+offset);
+ dest.push_back((*it).idx0+offset);
+ }
+ }
+ else
+ {
+ for (std::vector<MeshTriangle>::iterator it = source.begin(); it != source.end(); ++it)
+ {
+ dest.push_back((*it).idx0+offset);
+ dest.push_back((*it).idx1+offset);
+ dest.push_back((*it).idx2+offset);
+ }
+ }
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::copyIndices(G3D::Array<int> &source, G3D::Array<int> &dest, int offset)
+ {
+ int* src = source.getCArray();
+ for (int32 i = 0; i < source.size(); ++i)
+ dest.append(src[i] + offset);
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::cleanVertices(G3D::Array<float> &verts, G3D::Array<int> &tris)
+ {
+ std::map<int, int> vertMap;
+
+ int* t = tris.getCArray();
+ float* v = verts.getCArray();
+
+ G3D::Array<float> cleanVerts;
+ int index, count = 0;
+ // collect all the vertex indices from triangle
+ for (int i = 0; i < tris.size(); ++i)
+ {
+ if (vertMap.find(t[i]) != vertMap.end())
+ continue;
+ std::pair<int, int> val;
+ val.first = t[i];
+
+ index = val.first;
+ val.second = count;
+
+ vertMap.insert(val);
+ cleanVerts.append(v[index * 3], v[index * 3 + 1], v[index * 3 + 2]);
+ count++;
+ }
+
+ verts.fastClear();
+ verts.append(cleanVerts);
+ cleanVerts.clear();
+
+ // update triangles to use new indices
+ for (int i = 0; i < tris.size(); ++i)
+ {
+ std::map<int, int>::iterator it;
+ if ((it = vertMap.find(t[i])) == vertMap.end())
+ continue;
+
+ t[i] = (*it).second;
+ }
+
+ vertMap.clear();
+ }
+
+ /**************************************************************************/
+ void TerrainBuilder::loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, const char* offMeshFilePath)
+ {
+ // no meshfile input given?
+ if (offMeshFilePath == NULL)
+ return;
+
+ FILE* fp = fopen(offMeshFilePath, "rb");
+ if (!fp)
+ {
+ printf(" loadOffMeshConnections:: input file %s not found!\n", offMeshFilePath);
+ return;
+ }
+
+ // pretty silly thing, as we parse entire file and load only the tile we need
+ // but we don't expect this file to be too large
+ char* buf = new char[512];
+ while(fgets(buf, 512, fp))
+ {
+ float p0[3], p1[3];
+ uint32 mid, tx, ty;
+ float size;
+ if (sscanf(buf, "%u %u,%u (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty,
+ &p0[0], &p0[1], &p0[2], &p1[0], &p1[1], &p1[2], &size) != 10)
+ continue;
+
+ if (mapID == mid && tileX == tx && tileY == ty)
+ {
+ meshData.offMeshConnections.append(p0[1]);
+ meshData.offMeshConnections.append(p0[2]);
+ meshData.offMeshConnections.append(p0[0]);
+
+ meshData.offMeshConnections.append(p1[1]);
+ meshData.offMeshConnections.append(p1[2]);
+ meshData.offMeshConnections.append(p1[0]);
+
+ meshData.offMeshConnectionDirs.append(1); // 1 - both direction, 0 - one sided
+ meshData.offMeshConnectionRads.append(size); // agent size equivalent
+ // can be used same way as polygon flags
+ meshData.offMeshConnectionsAreas.append((unsigned char)0xFF);
+ meshData.offMeshConnectionsFlags.append((unsigned short)0xFF); // all movement masks can make this path
+ }
+
+ }
+
+ delete [] buf;
+ fclose(fp);
+ }
+}
diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h
new file mode 100644
index 0000000000..52773320fd
--- /dev/null
+++ b/src/tools/mmaps_generator/TerrainBuilder.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef _MMAP_TERRAIN_BUILDER_H
+#define _MMAP_TERRAIN_BUILDER_H
+
+#include "PathCommon.h"
+#include "WorldModel.h"
+
+#include "G3D/Array.h"
+#include "G3D/Vector3.h"
+#include "G3D/Matrix3.h"
+
+namespace MMAP
+{
+ enum Spot
+ {
+ TOP = 1,
+ RIGHT = 2,
+ LEFT = 3,
+ BOTTOM = 4,
+ ENTIRE = 5
+ };
+
+ enum Grid
+ {
+ GRID_V8,
+ GRID_V9
+ };
+
+ static const int V9_SIZE = 129;
+ static const int V9_SIZE_SQ = V9_SIZE*V9_SIZE;
+ static const int V8_SIZE = 128;
+ static const int V8_SIZE_SQ = V8_SIZE*V8_SIZE;
+ static const float GRID_SIZE = 533.3333f;
+ static const float GRID_PART_SIZE = GRID_SIZE/V8_SIZE;
+
+ // see contrib/extractor/system.cpp, CONF_use_minHeight
+ static const float INVALID_MAP_LIQ_HEIGHT = -500.f;
+ static const float INVALID_MAP_LIQ_HEIGHT_MAX = 5000.0f;
+
+ // see following files:
+ // contrib/extractor/system.cpp
+ // src/server/game/Map.cpp
+
+ struct MeshData
+ {
+ G3D::Array<float> solidVerts;
+ G3D::Array<int> solidTris;
+
+ G3D::Array<float> liquidVerts;
+ G3D::Array<int> liquidTris;
+ G3D::Array<uint8> liquidType;
+
+ // offmesh connection data
+ G3D::Array<float> offMeshConnections; // [p0y,p0z,p0x,p1y,p1z,p1x] - per connection
+ G3D::Array<float> offMeshConnectionRads;
+ G3D::Array<unsigned char> offMeshConnectionDirs;
+ G3D::Array<unsigned char> offMeshConnectionsAreas;
+ G3D::Array<unsigned short> offMeshConnectionsFlags;
+ };
+
+ class TerrainBuilder
+ {
+ public:
+ TerrainBuilder(bool skipLiquid);
+ ~TerrainBuilder();
+
+ TerrainBuilder(const TerrainBuilder &tb) = delete;
+
+ void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData);
+ bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData);
+ void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, const char* offMeshFilePath);
+
+ bool usesLiquids() const { return !m_skipLiquid; }
+
+ // vert and triangle methods
+ static void transform(std::vector<G3D::Vector3> &original, std::vector<G3D::Vector3> &transformed,
+ float scale, G3D::Matrix3 &rotation, G3D::Vector3 &position);
+ static void copyVertices(std::vector<G3D::Vector3> &source, G3D::Array<float> &dest);
+ static void copyIndices(std::vector<VMAP::MeshTriangle> &source, G3D::Array<int> &dest, int offest, bool flip);
+ static void copyIndices(G3D::Array<int> &src, G3D::Array<int> &dest, int offset);
+ static void cleanVertices(G3D::Array<float> &verts, G3D::Array<int> &tris);
+ private:
+ /// Loads a portion of a map's terrain
+ bool loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, Spot portion);
+
+ /// Sets loop variables for selecting only certain parts of a map's terrain
+ void getLoopVars(Spot portion, int &loopStart, int &loopEnd, int &loopInc);
+
+ /// Controls whether liquids are loaded
+ bool m_skipLiquid;
+
+ /// Load the map terrain from file
+ bool loadHeightMap(uint32 mapID, uint32 tileX, uint32 tileY, G3D::Array<float> &vertices, G3D::Array<int> &triangles, Spot portion);
+
+ /// Get the vector coordinate for a specific position
+ void getHeightCoord(int index, Grid grid, float xOffset, float yOffset, float* coord, float* v);
+
+ /// Get the triangle's vector indices for a specific position
+ void getHeightTriangle(int square, Spot triangle, int* indices, bool liquid = false);
+
+ /// Determines if the specific position's triangles should be rendered
+ bool isHole(int square, const uint16 holes[16][16]);
+
+ /// Get the liquid vector coordinate for a specific position
+ void getLiquidCoord(int index, int index2, float xOffset, float yOffset, float* coord, float* v);
+
+ /// Get the liquid type for a specific position
+ uint8 getLiquidType(int square, const uint8 liquid_type[16][16]);
+ };
+}
+
+#endif
+
diff --git a/src/tools/mmaps_generator/VMapExtensions.cpp b/src/tools/mmaps_generator/VMapExtensions.cpp
new file mode 100644
index 0000000000..ee3b028d63
--- /dev/null
+++ b/src/tools/mmaps_generator/VMapExtensions.cpp
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include <vector>
+#include "MapTree.h"
+#include "VMapManager2.h"
+#include "WorldModel.h"
+#include "ModelInstance.h"
+
+#include "Database/DatabaseEnv.h"
+LoginDatabaseWorkerPool LoginDatabase;
+WorldDatabaseWorkerPool WorldDatabase;
+
+namespace VMAP
+{
+ // Need direct access to encapsulated VMAP data, so we add functions for MMAP generator
+ // maybe add MapBuilder as friend to all of the below classes would be better?
+
+ // declared in src/shared/vmap/MapTree.h
+ void StaticMapTree::getModelInstances(ModelInstance* &models, uint32 &count)
+ {
+ models = iTreeValues;
+ count = iNTreeValues;
+ }
+
+ // declared in src/shared/vmap/VMapManager2.h
+ void VMapManager2::getInstanceMapTree(InstanceTreeMap &instanceMapTree)
+ {
+ instanceMapTree = iInstanceMapTrees;
+ }
+
+ // declared in src/shared/vmap/WorldModel.h
+ void WorldModel::getGroupModels(std::vector<GroupModel> &groupModels)
+ {
+ groupModels = this->groupModels;
+ }
+
+ // declared in src/shared/vmap/WorldModel.h
+ void GroupModel::getMeshData(std::vector<G3D::Vector3> &vertices, std::vector<MeshTriangle> &triangles, WmoLiquid* &liquid)
+ {
+ vertices = this->vertices;
+ triangles = this->triangles;
+ liquid = iLiquid;
+ }
+
+ // declared in src/shared/vmap/ModelInstance.h
+ WorldModel* ModelInstance::getWorldModel()
+ {
+ return iModel;
+ }
+
+ // declared in src/shared/vmap/WorldModel.h
+ void WmoLiquid::getPosInfo(uint32 &tilesX, uint32 &tilesY, G3D::Vector3 &corner) const
+ {
+ tilesX = iTilesX;
+ tilesY = iTilesY;
+ corner = iCorner;
+ }
+}
diff --git a/src/tools/vmap4_assembler/CMakeLists.txt b/src/tools/vmap4_assembler/CMakeLists.txt
new file mode 100644
index 0000000000..f15181217f
--- /dev/null
+++ b/src/tools/vmap4_assembler/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright (C)
+# Copyright (C)
+#
+# 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.
+
+include_directories(
+ ${CMAKE_SOURCE_DIR}/deps/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
+ ${ACE_INCLUDE_DIR}
+ ${ZLIB_INCLUDE_DIR}
+)
+
+add_executable(vmap4assembler VMapAssembler.cpp)
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+ set_target_properties(vmap4assembler PROPERTIES LINK_FLAGS "-framework Carbon")
+endif()
+
+target_link_libraries(vmap4assembler
+ collision
+ g3dlib
+ ${ZLIB_LIBRARIES}
+)
+
+if( UNIX )
+ install(TARGETS vmap4assembler DESTINATION bin)
+elseif( WIN32 )
+ install(TARGETS vmap4assembler DESTINATION "${CMAKE_INSTALL_PREFIX}")
+endif()
diff --git a/src/tools/vmap4_assembler/VMapAssembler.cpp b/src/tools/vmap4_assembler/VMapAssembler.cpp
new file mode 100644
index 0000000000..3b0e4e0a7c
--- /dev/null
+++ b/src/tools/vmap4_assembler/VMapAssembler.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include <string>
+#include <iostream>
+
+#include "TileAssembler.h"
+
+int main(int argc, char* argv[])
+{
+ if (argc != 3)
+ {
+ std::cout << "usage: " << argv[0] << " <raw data dir> <vmap dest dir>" << std::endl;
+ return 1;
+ }
+
+ std::string src = argv[1];
+ std::string dest = argv[2];
+
+ std::cout << "using " << src << " as source directory and writing output to " << dest << std::endl;
+
+ VMAP::TileAssembler* ta = new VMAP::TileAssembler(src, dest);
+
+ if (!ta->convertWorld2())
+ {
+ std::cout << "exit with errors" << std::endl;
+ delete ta;
+ return 1;
+ }
+
+ delete ta;
+ std::cout << "Ok, all done" << std::endl;
+ return 0;
+}
diff --git a/src/tools/vmap4_extractor/CMakeLists.txt b/src/tools/vmap4_extractor/CMakeLists.txt
new file mode 100644
index 0000000000..f84093b39d
--- /dev/null
+++ b/src/tools/vmap4_extractor/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright (C)
+# Copyright (C)
+#
+# 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.
+
+file(GLOB_RECURSE sources *.cpp *.h)
+
+set(include_Dirs
+ ${CMAKE_SOURCE_DIR}/deps/libmpq
+)
+
+if( WIN32 )
+ set(include_Dirs
+ ${include_Dirs}
+ ${CMAKE_SOURCE_DIR}/deps/libmpq/win
+ )
+endif()
+
+include_directories(${include_Dirs})
+
+add_executable(vmap4extractor ${sources})
+
+target_link_libraries(vmap4extractor
+ mpq
+ ${BZIP2_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+)
+
+if( UNIX )
+ install(TARGETS vmap4extractor DESTINATION bin)
+elseif( WIN32 )
+ install(TARGETS vmap4extractor DESTINATION "${CMAKE_INSTALL_PREFIX}")
+endif()
diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp
new file mode 100644
index 0000000000..748b1c3744
--- /dev/null
+++ b/src/tools/vmap4_extractor/adtfile.cpp
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "vmapexport.h"
+#include "adtfile.h"
+
+#include <algorithm>
+#include <cstdio>
+
+#ifdef WIN32
+#define snprintf _snprintf
+#endif
+
+char const* GetPlainName(char const* FileName)
+{
+ const char * szTemp;
+
+ if((szTemp = strrchr(FileName, '\\')) != NULL)
+ FileName = szTemp + 1;
+ return FileName;
+}
+
+char* GetPlainName(char* FileName)
+{
+ char * szTemp;
+
+ if((szTemp = strrchr(FileName, '\\')) != NULL)
+ FileName = szTemp + 1;
+ return FileName;
+}
+
+void fixnamen(char* name, size_t len)
+{
+ for (size_t i = 0; i < len-3; i++)
+ {
+ if (i > 0 && name[i] >= 'A' && name[i] <= 'Z' && isalpha(name[i-1]))
+ name[i] |= 0x20;
+ else if ((i == 0 || !isalpha(name[i-1])) && name[i]>='a' && name[i]<='z')
+ name[i] &= ~0x20;
+ }
+ //extension in lowercase
+ for (size_t i = len - 3; i < len; i++)
+ name[i] |= 0x20;
+}
+
+void fixname2(char* name, size_t len)
+{
+ for (size_t i=0; i<len-3; i++)
+ {
+ if(name[i] == ' ')
+ name[i] = '_';
+ }
+}
+
+char* GetExtension(char* FileName)
+{
+ if (char* szTemp = strrchr(FileName, '.'))
+ return szTemp;
+ return NULL;
+}
+
+ADTFile::ADTFile(char* filename): ADT(filename), nWMO(0), nMDX(0), WmoInstansName(NULL), ModelInstansName(NULL)
+{
+ Adtfilename.append(filename);
+}
+
+bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY)
+{
+ if(ADT.isEof ())
+ return false;
+
+ uint32 size;
+
+ string xMap;
+ string yMap;
+
+ Adtfilename.erase(Adtfilename.find(".adt"),4);
+ string TempMapNumber;
+ TempMapNumber = Adtfilename.substr(Adtfilename.length()-6,6);
+ xMap = TempMapNumber.substr(TempMapNumber.find("_")+1,(TempMapNumber.find_last_of("_")-1) - (TempMapNumber.find("_")));
+ yMap = TempMapNumber.substr(TempMapNumber.find_last_of("_")+1,(TempMapNumber.length()) - (TempMapNumber.find_last_of("_")));
+ Adtfilename.erase((Adtfilename.length()-xMap.length()-yMap.length()-2), (xMap.length()+yMap.length()+2));
+ //string AdtMapNumber = xMap + ' ' + yMap + ' ' + GetPlainName((char*)Adtfilename.c_str());
+ //printf("Processing map %s...\n", AdtMapNumber.c_str());
+ //printf("MapNumber = %s\n", TempMapNumber.c_str());
+ //printf("xMap = %s\n", xMap.c_str());
+ //printf("yMap = %s\n", yMap.c_str());
+
+ std::string dirname = std::string(szWorkDirWmo) + "/dir_bin";
+ FILE *dirfile;
+ dirfile = fopen(dirname.c_str(), "ab");
+ if(!dirfile)
+ {
+ printf("Can't open dirfile!'%s'\n", dirname.c_str());
+ return false;
+ }
+
+ while (!ADT.isEof())
+ {
+ char fourcc[5];
+ ADT.read(&fourcc,4);
+ ADT.read(&size, 4);
+ flipcc(fourcc);
+ fourcc[4] = 0;
+
+ size_t nextpos = ADT.getPos() + size;
+
+ if (!strcmp(fourcc,"MCIN"))
+ {
+ }
+ else if (!strcmp(fourcc,"MTEX"))
+ {
+ }
+ else if (!strcmp(fourcc,"MMDX"))
+ {
+ if (size)
+ {
+ char *buf = new char[size];
+ ADT.read(buf, size);
+ char *p=buf;
+ int t=0;
+ ModelInstansName = new string[size];
+ while (p<buf+size)
+ {
+ fixnamen(p,strlen(p));
+ char* s = GetPlainName(p);
+ fixname2(s,strlen(s));
+
+ ModelInstansName[t++] = s;
+
+ string path(p);
+ ExtractSingleModel(path);
+
+ p = p+strlen(p)+1;
+ }
+ delete[] buf;
+ }
+ }
+ else if (!strcmp(fourcc,"MWMO"))
+ {
+ if (size)
+ {
+ char* buf = new char[size];
+ ADT.read(buf, size);
+ char* p=buf;
+ int q = 0;
+ WmoInstansName = new string[size];
+ while (p<buf+size)
+ {
+ char* s = GetPlainName(p);
+ fixnamen(s, strlen(s));
+ fixname2(s, strlen(s));
+ p += strlen(p) + 1;
+ WmoInstansName[q++] = s;
+ }
+ delete[] buf;
+ }
+ }
+ //======================
+ else if (!strcmp(fourcc,"MDDF"))
+ {
+ if (size)
+ {
+ nMDX = (int)size / 36;
+ for (int i=0; i<nMDX; ++i)
+ {
+ uint32 id;
+ ADT.read(&id, 4);
+ ModelInstance inst(ADT,ModelInstansName[id].c_str(), map_num, tileX, tileY, dirfile);
+ }
+ delete[] ModelInstansName;
+ }
+ }
+ else if (!strcmp(fourcc,"MODF"))
+ {
+ if (size)
+ {
+ nWMO = (int)size / 64;
+ for (int i=0; i<nWMO; ++i)
+ {
+ uint32 id;
+ ADT.read(&id, 4);
+ WMOInstance inst(ADT,WmoInstansName[id].c_str(), map_num, tileX, tileY, dirfile);
+ }
+ delete[] WmoInstansName;
+ }
+ }
+ //======================
+ ADT.seek(nextpos);
+ }
+ ADT.close();
+ fclose(dirfile);
+ return true;
+}
+
+ADTFile::~ADTFile()
+{
+ ADT.close();
+}
diff --git a/src/tools/vmap4_extractor/adtfile.h b/src/tools/vmap4_extractor/adtfile.h
new file mode 100644
index 0000000000..fcae8d4f39
--- /dev/null
+++ b/src/tools/vmap4_extractor/adtfile.h
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef ADT_H
+#define ADT_H
+
+#include "mpq_libmpq04.h"
+#include "wmo.h"
+#include "model.h"
+
+#define TILESIZE (533.33333f)
+#define CHUNKSIZE ((TILESIZE) / 16.0f)
+#define UNITSIZE (CHUNKSIZE / 8.0f)
+
+class Liquid;
+
+typedef struct
+{
+ float x;
+ float y;
+ float z;
+}svec;
+
+struct vec
+{
+ double x;
+ double y;
+ double z;
+};
+
+struct triangle
+{
+ vec v[3];
+};
+
+typedef struct
+{
+ float v9[16*8+1][16*8+1];
+ float v8[16*8][16*8];
+}Cell;
+
+typedef struct
+{
+ double v9[9][9];
+ double v8[8][8];
+ uint16 area_id;
+ //Liquid *lq;
+ float waterlevel[9][9];
+ uint8 flag;
+}chunk;
+
+typedef struct
+{
+ chunk ch[16][16];
+}mcell;
+
+struct MapChunkHeader
+{
+ uint32 flags;
+ uint32 ix;
+ uint32 iy;
+ uint32 nLayers;
+ uint32 nDoodadRefs;
+ uint32 ofsHeight;
+ uint32 ofsNormal;
+ uint32 ofsLayer;
+ uint32 ofsRefs;
+ uint32 ofsAlpha;
+ uint32 sizeAlpha;
+ uint32 ofsShadow;
+ uint32 sizeShadow;
+ uint32 areaid;
+ uint32 nMapObjRefs;
+ uint32 holes;
+ uint16 s1;
+ uint16 s2;
+ uint32 d1;
+ uint32 d2;
+ uint32 d3;
+ uint32 predTex;
+ uint32 nEffectDoodad;
+ uint32 ofsSndEmitters;
+ uint32 nSndEmitters;
+ uint32 ofsLiquid;
+ uint32 sizeLiquid;
+ float zpos;
+ float xpos;
+ float ypos;
+ uint32 textureId;
+ uint32 props;
+ uint32 effectId;
+};
+
+
+class ADTFile
+{
+private:
+ //size_t mcnk_offsets[256], mcnk_sizes[256];
+ MPQFile ADT;
+ //mcell Mcell;
+ string Adtfilename;
+public:
+ ADTFile(char* filename);
+ ~ADTFile();
+ int nWMO;
+ int nMDX;
+ string* WmoInstansName;
+ string* ModelInstansName;
+ bool init(uint32 map_num, uint32 tileX, uint32 tileY);
+ //void LoadMapChunks();
+
+ //uint32 wmo_count;
+/*
+ const mcell& Getmcell() const
+ {
+ return Mcell;
+ }
+*/
+};
+
+const char * GetPlainName(const char * FileName);
+char * GetPlainName(char * FileName);
+char * GetExtension(char * FileName);
+void fixnamen(char *name, size_t len);
+void fixname2(char *name, size_t len);
+//void fixMapNamen(char *name, size_t len);
+
+#endif
diff --git a/src/tools/vmap4_extractor/dbcfile.cpp b/src/tools/vmap4_extractor/dbcfile.cpp
new file mode 100644
index 0000000000..2ee2b3de5a
--- /dev/null
+++ b/src/tools/vmap4_extractor/dbcfile.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "dbcfile.h"
+#include "mpq_libmpq04.h"
+#undef min
+#undef max
+
+#include <cstdio>
+
+DBCFile::DBCFile(const std::string& filename):
+ filename(filename), recordSize(0), recordCount(0), fieldCount(0), stringSize(0), data(NULL), stringTable(NULL)
+{
+
+}
+
+bool DBCFile::open()
+{
+ MPQFile f(filename.c_str());
+
+ // Need some error checking, otherwise an unhandled exception error occurs
+ // if people screw with the data path.
+ if (f.isEof() == true)
+ return false;
+
+ unsigned char header[4];
+ unsigned int na,nb,es,ss;
+
+ f.read(header,4); // File Header
+
+ if (header[0]!='W' || header[1]!='D' || header[2]!='B' || header[3] != 'C')
+ {
+ f.close();
+ data = NULL;
+ printf("Critical Error: An error occured while trying to read the DBCFile %s.", filename.c_str());
+ return false;
+ }
+
+ //assert(header[0]=='W' && header[1]=='D' && header[2]=='B' && header[3] == 'C');
+
+ f.read(&na,4); // Number of records
+ f.read(&nb,4); // Number of fields
+ f.read(&es,4); // Size of a record
+ f.read(&ss,4); // String size
+
+ recordSize = es;
+ recordCount = na;
+ fieldCount = nb;
+ stringSize = ss;
+ //assert(fieldCount*4 == recordSize);
+ assert(fieldCount*4 >= recordSize);
+
+ data = new unsigned char[recordSize*recordCount+stringSize];
+ stringTable = data + recordSize*recordCount;
+ f.read(data,recordSize*recordCount+stringSize);
+ f.close();
+ return true;
+}
+
+DBCFile::~DBCFile()
+{
+ delete [] data;
+}
+
+DBCFile::Record DBCFile::getRecord(size_t id)
+{
+ assert(data);
+ return Record(*this, data + id*recordSize);
+}
+
+DBCFile::Iterator DBCFile::begin()
+{
+ assert(data);
+ return Iterator(*this, data);
+}
+
+DBCFile::Iterator DBCFile::end()
+{
+ assert(data);
+ return Iterator(*this, stringTable);
+}
diff --git a/src/tools/vmap4_extractor/dbcfile.h b/src/tools/vmap4_extractor/dbcfile.h
new file mode 100644
index 0000000000..711d8257b3
--- /dev/null
+++ b/src/tools/vmap4_extractor/dbcfile.h
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef DBCFILE_H
+#define DBCFILE_H
+
+#include <cassert>
+#include <string>
+
+class DBCFile
+{
+public:
+ DBCFile(const std::string &filename);
+ ~DBCFile();
+
+ // Open database. It must be openened before it can be used.
+ bool open();
+
+ // TODO: Add a close function?
+
+ // Database exceptions
+ class Exception
+ {
+ public:
+ Exception(const std::string &message): message(message)
+ { }
+ virtual ~Exception()
+ { }
+ const std::string &getMessage() {return message;}
+ private:
+ std::string message;
+ };
+
+ //
+ class NotFound: public Exception
+ {
+ public:
+ NotFound(): Exception("Key was not found")
+ { }
+ };
+
+ // Iteration over database
+ class Iterator;
+ class Record
+ {
+ public:
+ Record& operator= (const Record& r)
+ {
+ file = r.file;
+ offset = r.offset;
+ return *this;
+ }
+ float getFloat(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<float*>(offset+field*4);
+ }
+ unsigned int getUInt(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<unsigned int*>(offset+(field*4));
+ }
+ int getInt(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<int*>(offset+field*4);
+ }
+ unsigned char getByte(size_t ofs) const
+ {
+ assert(ofs < file.recordSize);
+ return *reinterpret_cast<unsigned char*>(offset+ofs);
+ }
+ const char *getString(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ size_t stringOffset = getUInt(field);
+ assert(stringOffset < file.stringSize);
+ //char * tmp = (char*)file.stringTable + stringOffset;
+ //unsigned char * tmp2 = file.stringTable + stringOffset;
+ return reinterpret_cast<char*>(file.stringTable + stringOffset);
+ }
+ private:
+ Record(DBCFile &file, unsigned char *offset): file(file), offset(offset) {}
+ DBCFile &file;
+ unsigned char *offset;
+
+ friend class DBCFile;
+ friend class Iterator;
+ };
+
+ /* Iterator that iterates over records */
+ class Iterator
+ {
+ public:
+ Iterator(DBCFile &file, unsigned char *offset):
+ record(file, offset) {}
+ /// Advance (prefix only)
+ Iterator & operator++() {
+ record.offset += record.file.recordSize;
+ return *this;
+ }
+ /// Return address of current instance
+ Record const & operator*() const { return record; }
+ const Record* operator->() const {
+ return &record;
+ }
+ /// Comparison
+ bool operator==(const Iterator &b) const
+ {
+ return record.offset == b.record.offset;
+ }
+ bool operator!=(const Iterator &b) const
+ {
+ return record.offset != b.record.offset;
+ }
+ private:
+ Record record;
+ };
+
+ // Get record by id
+ Record getRecord(size_t id);
+ /// Get begin iterator over records
+ Iterator begin();
+ /// Get begin iterator over records
+ Iterator end();
+ /// Trivial
+ size_t getRecordCount() const { return recordCount;}
+ size_t getFieldCount() const { return fieldCount; }
+
+private:
+ std::string filename;
+ size_t recordSize;
+ size_t recordCount;
+ size_t fieldCount;
+ size_t stringSize;
+ unsigned char *data;
+ unsigned char *stringTable;
+};
+
+#endif
diff --git a/src/tools/vmap4_extractor/gameobject_extract.cpp b/src/tools/vmap4_extractor/gameobject_extract.cpp
new file mode 100644
index 0000000000..e307aea6f5
--- /dev/null
+++ b/src/tools/vmap4_extractor/gameobject_extract.cpp
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "model.h"
+#include "dbcfile.h"
+#include "adtfile.h"
+#include "vmapexport.h"
+
+#include <algorithm>
+#include <stdio.h>
+
+bool ExtractSingleModel(std::string& fname)
+{
+ char * name = GetPlainName((char*)fname.c_str());
+ char * ext = GetExtension(name);
+
+ // < 3.1.0 ADT MMDX section store filename.mdx filenames for corresponded .m2 file
+ if (!strcmp(ext, ".mdx"))
+ {
+ // replace .mdx -> .m2
+ fname.erase(fname.length()-2,2);
+ fname.append("2");
+ }
+ // >= 3.1.0 ADT MMDX section store filename.m2 filenames for corresponded .m2 file
+ // nothing do
+
+ std::string output(szWorkDirWmo);
+ output += "/";
+ output += name;
+
+ if (FileExists(output.c_str()))
+ return true;
+
+ Model mdl(fname);
+ if (!mdl.open())
+ return false;
+
+ return mdl.ConvertToVMAPModel(output.c_str());
+}
+
+void ExtractGameobjectModels()
+{
+ printf("Extracting GameObject models...");
+ DBCFile dbc("DBFilesClient\\GameObjectDisplayInfo.dbc");
+ if(!dbc.open())
+ {
+ printf("Fatal error: Invalid GameObjectDisplayInfo.dbc file format!\n");
+ exit(1);
+ }
+
+ std::string basepath = szWorkDirWmo;
+ basepath += "/";
+ std::string path;
+
+ std::string modelListPath = basepath + "temp_gameobject_models";
+ FILE* model_list = fopen(modelListPath.c_str(), "wb");
+ if (!model_list)
+ {
+ printf("Fatal error: Could not open file %s\n", modelListPath.c_str());
+ return;
+ }
+
+ for (DBCFile::Iterator it = dbc.begin(); it != dbc.end(); ++it)
+ {
+ path = it->getString(1);
+
+ if (path.length() < 4)
+ continue;
+
+ fixnamen((char*)path.c_str(), path.size());
+ char * name = GetPlainName((char*)path.c_str());
+ fixname2(name, strlen(name));
+
+ char * ch_ext = GetExtension(name);
+ if (!ch_ext)
+ continue;
+
+ strToLower(ch_ext);
+
+ bool result = false;
+ if (!strcmp(ch_ext, ".wmo"))
+ {
+ result = ExtractSingleWmo(path);
+ }
+ else if (!strcmp(ch_ext, ".mdl"))
+ {
+ // TODO: extract .mdl files, if needed
+ continue;
+ }
+ else //if (!strcmp(ch_ext, ".mdx") || !strcmp(ch_ext, ".m2"))
+ {
+ result = ExtractSingleModel(path);
+ }
+
+ if (result)
+ {
+ uint32 displayId = it->getUInt(0);
+ uint32 path_length = strlen(name);
+ fwrite(&displayId, sizeof(uint32), 1, model_list);
+ fwrite(&path_length, sizeof(uint32), 1, model_list);
+ fwrite(name, sizeof(char), path_length, model_list);
+ }
+ }
+
+ fclose(model_list);
+
+ printf("Done!\n");
+}
diff --git a/src/tools/vmap4_extractor/loadlib/loadlib.h b/src/tools/vmap4_extractor/loadlib/loadlib.h
new file mode 100644
index 0000000000..989f665934
--- /dev/null
+++ b/src/tools/vmap4_extractor/loadlib/loadlib.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef LOAD_LIB_H
+#define LOAD_LIB_H
+
+#include <string>
+
+#ifdef WIN32
+typedef __int64 int64;
+typedef __int32 int32;
+typedef __int16 int16;
+typedef __int8 int8;
+typedef unsigned __int64 uint64;
+typedef unsigned __int32 uint32;
+typedef unsigned __int16 uint16;
+typedef unsigned __int8 uint8;
+#else
+#include <stdint.h>
+#ifndef uint64_t
+#ifdef __linux__
+#include <linux/types.h>
+#endif
+#endif
+typedef int64_t int64;
+typedef int32_t int32;
+typedef int16_t int16;
+typedef int8_t int8;
+typedef uint64_t uint64;
+typedef uint32_t uint32;
+typedef uint16_t uint16;
+typedef uint8_t uint8;
+#endif
+
+#define FILE_FORMAT_VERSION 18
+
+//
+// File version chunk
+//
+struct file_MVER
+{
+ union{
+ uint32 fcc;
+ char fcc_txt[4];
+ };
+ uint32 size;
+ uint32 ver;
+};
+
+class FileLoader{
+ uint8 *data;
+ uint32 data_size;
+public:
+ virtual bool prepareLoadedData();
+ uint8 *GetData() {return data;}
+ uint32 GetDataSize() {return data_size;}
+
+ file_MVER *version;
+ FileLoader();
+ ~FileLoader();
+ bool loadFile(std::string const& filename, bool log = true);
+ virtual void free();
+};
+#endif
diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp
new file mode 100644
index 0000000000..07f1f3ec16
--- /dev/null
+++ b/src/tools/vmap4_extractor/model.cpp
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "vmapexport.h"
+#include "model.h"
+#include "wmo.h"
+#include "mpq_libmpq04.h"
+#include <cassert>
+#include <algorithm>
+#include <cstdio>
+
+Model::Model(std::string &filename) : filename(filename), vertices(0), indices(0)
+{
+ memset(&header, 0, sizeof(header));
+}
+
+bool Model::open()
+{
+ MPQFile f(filename.c_str());
+
+ if (f.isEof())
+ {
+ f.close();
+ // Do not show this error on console to avoid confusion, the extractor can continue working even if some models fail to load
+ //printf("Error loading model %s\n", filename.c_str());
+ return false;
+ }
+
+ _unload();
+
+ memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
+ if(header.nBoundingTriangles > 0)
+ {
+ f.seek(0);
+ f.seekRelative(header.ofsBoundingVertices);
+ vertices = new Vec3D[header.nBoundingVertices];
+ f.read(vertices,header.nBoundingVertices*12);
+ for (uint32 i=0; i<header.nBoundingVertices; i++)
+ vertices[i] = fixCoordSystem(vertices[i]);
+ f.seek(0);
+ f.seekRelative(header.ofsBoundingTriangles);
+ indices = new uint16[header.nBoundingTriangles];
+ f.read(indices,header.nBoundingTriangles*2);
+ f.close();
+ }
+ else
+ {
+ //printf("not included %s\n", filename.c_str());
+ f.close();
+ return false;
+ }
+ return true;
+}
+
+bool Model::ConvertToVMAPModel(const char * outfilename)
+{
+ int N[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
+ FILE* output=fopen(outfilename, "wb");
+ if (!output)
+ {
+ printf("Can't create the output file '%s'\n",outfilename);
+ return false;
+ }
+ fwrite(szRawVMAPMagic, 8, 1, output);
+ uint32 nVertices = header.nBoundingVertices;
+ fwrite(&nVertices, sizeof(int), 1, output);
+ uint32 nofgroups = 1;
+ fwrite(&nofgroups,sizeof(uint32), 1, output);
+ fwrite(N,4*3,1,output);// rootwmoid, flags, groupid
+ fwrite(N,sizeof(float),3*2,output);//bbox, only needed for WMO currently
+ fwrite(N,4,1,output);// liquidflags
+ fwrite("GRP ",4,1,output);
+ uint32 branches = 1;
+ int wsize;
+ wsize = sizeof(branches) + sizeof(uint32) * branches;
+ fwrite(&wsize, sizeof(int), 1, output);
+ fwrite(&branches,sizeof(branches), 1, output);
+ uint32 nIndexes = header.nBoundingTriangles;
+ fwrite(&nIndexes,sizeof(uint32), 1, output);
+ fwrite("INDX",4, 1, output);
+ wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes;
+ fwrite(&wsize, sizeof(int), 1, output);
+ fwrite(&nIndexes, sizeof(uint32), 1, output);
+ if (nIndexes > 0)
+ {
+ for (uint32 i = 0; i < nIndexes; ++i)
+ {
+ if ((i % 3) - 1 == 0 && i + 1 < nIndexes)
+ {
+ uint16 tmp = indices[i];
+ indices[i] = indices[i + 1];
+ indices[i + 1] = tmp;
+ }
+ }
+ fwrite(indices, sizeof(unsigned short), nIndexes, output);
+ }
+ fwrite("VERT", 4, 1, output);
+ wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
+ fwrite(&wsize, sizeof(int), 1, output);
+ fwrite(&nVertices, sizeof(int), 1, output);
+ if (nVertices >0)
+ {
+ for (uint32 vpos = 0; vpos < nVertices; ++vpos)
+ {
+ float tmp = vertices[vpos].y;
+ vertices[vpos].y = -vertices[vpos].z;
+ vertices[vpos].z = tmp;
+ }
+
+ fwrite(vertices, sizeof(float)*3, nVertices, output);
+ }
+
+ fclose(output);
+
+ return true;
+}
+
+
+Vec3D fixCoordSystem(Vec3D v)
+{
+ return Vec3D(v.x, v.z, -v.y);
+}
+
+Vec3D fixCoordSystem2(Vec3D v)
+{
+ return Vec3D(v.x, v.z, v.y);
+}
+
+ModelInstance::ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile)
+{
+ float ff[3];
+ f.read(&id, 4);
+ f.read(ff, 12);
+ pos = fixCoords(Vec3D(ff[0], ff[1], ff[2]));
+ f.read(ff, 12);
+ rot = Vec3D(ff[0], ff[1], ff[2]);
+ f.read(&scale, 2);
+ f.read(&flags, 2);
+ // scale factor - divide by 1024. blizzard devs must be on crack, why not just use a float?
+ sc = scale / 1024.0f;
+
+ char tempname[512];
+ sprintf(tempname, "%s/%s", szWorkDirWmo, ModelInstName);
+ FILE* input = fopen(tempname, "r+b");
+
+ if (!input)
+ {
+ //printf("ModelInstance::ModelInstance couldn't open %s\n", tempname);
+ return;
+ }
+
+ fseek(input, 8, SEEK_SET); // get the correct no of vertices
+ int nVertices;
+ int count = fread(&nVertices, sizeof (int), 1, input);
+ fclose(input);
+
+ if (count != 1 || nVertices == 0)
+ return;
+
+ uint16 adtId = 0;// not used for models
+ uint32 flags = MOD_M2;
+ if (tileX == 65 && tileY == 65)
+ flags |= MOD_WORLDSPAWN;
+
+ //write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, name
+ fwrite(&mapID, sizeof(uint32), 1, pDirfile);
+ fwrite(&tileX, sizeof(uint32), 1, pDirfile);
+ fwrite(&tileY, sizeof(uint32), 1, pDirfile);
+ fwrite(&flags, sizeof(uint32), 1, pDirfile);
+ fwrite(&adtId, sizeof(uint16), 1, pDirfile);
+ fwrite(&id, sizeof(uint32), 1, pDirfile);
+ fwrite(&pos, sizeof(float), 3, pDirfile);
+ fwrite(&rot, sizeof(float), 3, pDirfile);
+ fwrite(&sc, sizeof(float), 1, pDirfile);
+ uint32 nlen=strlen(ModelInstName);
+ fwrite(&nlen, sizeof(uint32), 1, pDirfile);
+ fwrite(ModelInstName, sizeof(char), nlen, pDirfile);
+
+ /* int realx1 = (int) ((float) pos.x / 533.333333f);
+ int realy1 = (int) ((float) pos.z / 533.333333f);
+ int realx2 = (int) ((float) pos.x / 533.333333f);
+ int realy2 = (int) ((float) pos.z / 533.333333f);
+ fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f %f %d %d %d,%d %d\n",
+ MapName,
+ ModelInstName,
+ (float) pos.x, (float) pos.y, (float) pos.z,
+ (float) rot.x, (float) rot.y, (float) rot.z,
+ sc,
+ nVertices,
+ realx1, realy1,
+ realx2, realy2
+ ); */
+}
diff --git a/src/tools/vmap4_extractor/model.h b/src/tools/vmap4_extractor/model.h
new file mode 100644
index 0000000000..b403129c6f
--- /dev/null
+++ b/src/tools/vmap4_extractor/model.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MODEL_H
+#define MODEL_H
+
+#include "loadlib/loadlib.h"
+#include "vec3d.h"
+#include "modelheaders.h"
+#include <vector>
+
+class MPQFile;
+
+Vec3D fixCoordSystem(Vec3D v);
+
+class Model
+{
+private:
+ void _unload()
+ {
+ delete[] vertices;
+ delete[] indices;
+ vertices = NULL;
+ indices = NULL;
+ }
+ std::string filename;
+public:
+ ModelHeader header;
+ Vec3D* vertices;
+ uint16* indices;
+
+ bool open();
+ bool ConvertToVMAPModel(char const* outfilename);
+
+ Model(std::string& filename);
+ ~Model() { _unload(); }
+};
+
+class ModelInstance
+{
+public:
+ uint32 id;
+ Vec3D pos, rot;
+ uint16 scale, flags;
+ float sc;
+
+ ModelInstance() : id(0), scale(0), flags(0), sc(0.0f) {}
+ ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE* pDirfile);
+
+};
+
+#endif
diff --git a/src/tools/vmap4_extractor/modelheaders.h b/src/tools/vmap4_extractor/modelheaders.h
new file mode 100644
index 0000000000..aa878ba435
--- /dev/null
+++ b/src/tools/vmap4_extractor/modelheaders.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MODELHEADERS_H
+#define MODELHEADERS_H
+
+/* typedef unsigned char uint8;
+typedef char int8;
+typedef unsigned short uint16;
+typedef short int16;
+typedef unsigned int uint32;
+typedef int int32; */
+
+#pragma pack(push,1)
+
+struct ModelHeader
+{
+ char id[4];
+ uint8 version[4];
+ uint32 nameLength;
+ uint32 nameOfs;
+ uint32 type;
+ uint32 nGlobalSequences;
+ uint32 ofsGlobalSequences;
+ uint32 nAnimations;
+ uint32 ofsAnimations;
+ uint32 nAnimationLookup;
+ uint32 ofsAnimationLookup;
+ uint32 nBones;
+ uint32 ofsBones;
+ uint32 nKeyBoneLookup;
+ uint32 ofsKeyBoneLookup;
+ uint32 nVertices;
+ uint32 ofsVertices;
+ uint32 nViews;
+ uint32 nColors;
+ uint32 ofsColors;
+ uint32 nTextures;
+ uint32 ofsTextures;
+ uint32 nTransparency;
+ uint32 ofsTransparency;
+ uint32 nTextureanimations;
+ uint32 ofsTextureanimations;
+ uint32 nTexReplace;
+ uint32 ofsTexReplace;
+ uint32 nRenderFlags;
+ uint32 ofsRenderFlags;
+ uint32 nBoneLookupTable;
+ uint32 ofsBoneLookupTable;
+ uint32 nTexLookup;
+ uint32 ofsTexLookup;
+ uint32 nTexUnits;
+ uint32 ofsTexUnits;
+ uint32 nTransLookup;
+ uint32 ofsTransLookup;
+ uint32 nTexAnimLookup;
+ uint32 ofsTexAnimLookup;
+ float floats[14];
+ uint32 nBoundingTriangles;
+ uint32 ofsBoundingTriangles;
+ uint32 nBoundingVertices;
+ uint32 ofsBoundingVertices;
+ uint32 nBoundingNormals;
+ uint32 ofsBoundingNormals;
+ uint32 nAttachments;
+ uint32 ofsAttachments;
+ uint32 nAttachLookup;
+ uint32 ofsAttachLookup;
+ uint32 nAttachments_2;
+ uint32 ofsAttachments_2;
+ uint32 nLights;
+ uint32 ofsLights;
+ uint32 nCameras;
+ uint32 ofsCameras;
+ uint32 nCameraLookup;
+ uint32 ofsCameraLookup;
+ uint32 nRibbonEmitters;
+ uint32 ofsRibbonEmitters;
+ uint32 nParticleEmitters;
+ uint32 ofsParticleEmitters;
+};
+
+#pragma pack(pop)
+#endif
diff --git a/src/tools/vmap4_extractor/mpq_libmpq.cpp b/src/tools/vmap4_extractor/mpq_libmpq.cpp
new file mode 100644
index 0000000000..70a02e5acc
--- /dev/null
+++ b/src/tools/vmap4_extractor/mpq_libmpq.cpp
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "mpq_libmpq04.h"
+#include <deque>
+#include <cstdio>
+
+ArchiveSet gOpenArchives;
+
+MPQArchive::MPQArchive(const char* filename)
+{
+ int result = libmpq__archive_open(&mpq_a, filename, -1);
+ printf("Opening %s\n", filename);
+ if(result) {
+ switch(result) {
+ case LIBMPQ_ERROR_OPEN :
+ printf("Error opening archive '%s': Does file really exist?\n", filename);
+ break;
+ case LIBMPQ_ERROR_FORMAT : /* bad file format */
+ printf("Error opening archive '%s': Bad file format\n", filename);
+ break;
+ case LIBMPQ_ERROR_SEEK : /* seeking in file failed */
+ printf("Error opening archive '%s': Seeking in file failed\n", filename);
+ break;
+ case LIBMPQ_ERROR_READ : /* Read error in archive */
+ printf("Error opening archive '%s': Read error in archive\n", filename);
+ break;
+ case LIBMPQ_ERROR_MALLOC : /* maybe not enough memory? :) */
+ printf("Error opening archive '%s': Maybe not enough memory\n", filename);
+ break;
+ default:
+ printf("Error opening archive '%s': Unknown error\n", filename);
+ break;
+ }
+ return;
+ }
+ gOpenArchives.push_front(this);
+}
+
+void MPQArchive::close()
+{
+ //gOpenArchives.erase(erase(&mpq_a);
+ libmpq__archive_close(mpq_a);
+}
+
+MPQFile::MPQFile(const char* filename):
+ eof(false),
+ buffer(0),
+ pointer(0),
+ size(0)
+{
+ for(ArchiveSet::iterator i=gOpenArchives.begin(); i!=gOpenArchives.end();++i)
+ {
+ mpq_archive *mpq_a = (*i)->mpq_a;
+
+ uint32 filenum;
+ if(libmpq__file_number(mpq_a, filename, &filenum)) continue;
+ libmpq__off_t transferred;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ // HACK: in patch.mpq some files don't want to open and give 1 for filesize
+ if (size<=1) {
+ // printf("info: file %s has size %d; considered dummy file.\n", filename, size);
+ eof = true;
+ buffer = 0;
+ return;
+ }
+ buffer = new char[size];
+
+ //libmpq_file_getdata
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+ /*libmpq_file_getdata(&mpq_a, hash, fileno, (unsigned char*)buffer);*/
+ return;
+
+ }
+ eof = true;
+ buffer = 0;
+}
+
+size_t MPQFile::read(void* dest, size_t bytes)
+{
+ if (eof) return 0;
+
+ size_t rpos = pointer + bytes;
+ if (rpos > size_t(size)) {
+ bytes = size - pointer;
+ eof = true;
+ }
+
+ memcpy(dest, &(buffer[pointer]), bytes);
+
+ pointer = rpos;
+
+ return bytes;
+}
+
+void MPQFile::seek(int offset)
+{
+ pointer = offset;
+ eof = (pointer >= size);
+}
+
+void MPQFile::seekRelative(int offset)
+{
+ pointer += offset;
+ eof = (pointer >= size);
+}
+
+void MPQFile::close()
+{
+ if (buffer) delete[] buffer;
+ buffer = 0;
+ eof = true;
+}
diff --git a/src/tools/vmap4_extractor/mpq_libmpq04.h b/src/tools/vmap4_extractor/mpq_libmpq04.h
new file mode 100644
index 0000000000..80041b16d5
--- /dev/null
+++ b/src/tools/vmap4_extractor/mpq_libmpq04.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef MPQ_H
+#define MPQ_H
+
+#include "loadlib/loadlib.h"
+#include "libmpq/mpq.h"
+#include <string.h>
+#include <ctype.h>
+#include <vector>
+#include <iostream>
+#include <deque>
+
+using namespace std;
+
+class MPQArchive
+{
+
+public:
+ mpq_archive_s *mpq_a;
+
+ MPQArchive(const char* filename);
+ void close();
+
+ void GetFileListTo(vector<string>& filelist) {
+ uint32_t filenum;
+ if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return;
+ libmpq__off_t size, transferred;
+ libmpq__file_unpacked_size(mpq_a, filenum, &size);
+
+ char *buffer = new char[size + 1];
+ buffer[size] = '\0';
+
+ libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
+
+ char seps[] = "\n";
+ char *token;
+
+ token = strtok( buffer, seps );
+ uint32 counter = 0;
+ while ((token != NULL) && (counter < size)) {
+ //cout << token << endl;
+ token[strlen(token) - 1] = 0;
+ string s = token;
+ filelist.push_back(s);
+ counter += strlen(token) + 2;
+ token = strtok(NULL, seps);
+ }
+
+ delete[] buffer;
+ }
+};
+typedef std::deque<MPQArchive*> ArchiveSet;
+
+class MPQFile
+{
+ //MPQHANDLE handle;
+ bool eof;
+ char *buffer;
+ libmpq__off_t pointer,size;
+
+ // disable copying
+ MPQFile(const MPQFile& /*f*/) {}
+ void operator=(const MPQFile& /*f*/) {}
+
+public:
+ MPQFile(const char* filename); // filenames are not case sensitive
+ ~MPQFile() { close(); }
+ size_t read(void* dest, size_t bytes);
+ size_t getSize() { return size; }
+ size_t getPos() { return pointer; }
+ char* getBuffer() { return buffer; }
+ char* getPointer() { return buffer + pointer; }
+ bool isEof() { return eof; }
+ void seek(int offset);
+ void seekRelative(int offset);
+ void close();
+};
+
+inline void flipcc(char *fcc)
+{
+ char t;
+ t=fcc[0];
+ fcc[0]=fcc[3];
+ fcc[3]=t;
+ t=fcc[1];
+ fcc[1]=fcc[2];
+ fcc[2]=t;
+}
+
+#endif
diff --git a/src/tools/vmap4_extractor/vec3d.h b/src/tools/vmap4_extractor/vec3d.h
new file mode 100644
index 0000000000..ead433644a
--- /dev/null
+++ b/src/tools/vmap4_extractor/vec3d.h
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef VEC3D_H
+#define VEC3D_H
+
+#include <iostream>
+#include <cmath>
+
+class Vec3D
+{
+public:
+ float x,y,z;
+
+ Vec3D(float x0 = 0.0f, float y0 = 0.0f, float z0 = 0.0f) : x(x0), y(y0), z(z0) {}
+
+ Vec3D(const Vec3D& v) : x(v.x), y(v.y), z(v.z) {}
+
+ Vec3D& operator= (const Vec3D &v) {
+ x = v.x;
+ y = v.y;
+ z = v.z;
+ return *this;
+ }
+
+ Vec3D operator+ (const Vec3D &v) const
+ {
+ Vec3D r(x+v.x,y+v.y,z+v.z);
+ return r;
+ }
+
+ Vec3D operator- (const Vec3D &v) const
+ {
+ Vec3D r(x-v.x,y-v.y,z-v.z);
+ return r;
+ }
+
+ float operator* (const Vec3D &v) const
+ {
+ return x*v.x + y*v.y + z*v.z;
+ }
+
+ Vec3D operator* (float d) const
+ {
+ Vec3D r(x*d,y*d,z*d);
+ return r;
+ }
+
+ friend Vec3D operator* (float d, const Vec3D& v)
+ {
+ return v * d;
+ }
+
+ Vec3D operator% (const Vec3D &v) const
+ {
+ Vec3D r(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x);
+ return r;
+ }
+
+ Vec3D& operator+= (const Vec3D &v)
+ {
+ x += v.x;
+ y += v.y;
+ z += v.z;
+ return *this;
+ }
+
+ Vec3D& operator-= (const Vec3D &v)
+ {
+ x -= v.x;
+ y -= v.y;
+ z -= v.z;
+ return *this;
+ }
+
+ Vec3D& operator*= (float d)
+ {
+ x *= d;
+ y *= d;
+ z *= d;
+ return *this;
+ }
+
+ float lengthSquared() const
+ {
+ return x*x+y*y+z*z;
+ }
+
+ float length() const
+ {
+ return sqrt(x*x+y*y+z*z);
+ }
+
+ Vec3D& normalize()
+ {
+ this->operator*= (1.0f/length());
+ return *this;
+ }
+
+ Vec3D operator~ () const
+ {
+ Vec3D r(*this);
+ r.normalize();
+ return r;
+ }
+
+ friend std::istream& operator>>(std::istream& in, Vec3D& v)
+ {
+ in >> v.x >> v.y >> v.z;
+ return in;
+ }
+
+ friend std::ostream& operator<<(std::ostream& out, const Vec3D& v)
+ {
+ out << v.x << " " << v.y << " " << v.z;
+ return out;
+ }
+
+ operator float*()
+ {
+ return (float*)this;
+ }
+};
+
+
+class Vec2D
+{
+public:
+ float x,y;
+
+ Vec2D(float x0 = 0.0f, float y0 = 0.0f) : x(x0), y(y0) {}
+
+ Vec2D(const Vec2D& v) : x(v.x), y(v.y) {}
+
+ Vec2D& operator= (const Vec2D &v) {
+ x = v.x;
+ y = v.y;
+ return *this;
+ }
+
+ Vec2D operator+ (const Vec2D &v) const
+ {
+ Vec2D r(x+v.x,y+v.y);
+ return r;
+ }
+
+ Vec2D operator- (const Vec2D &v) const
+ {
+ Vec2D r(x-v.x,y-v.y);
+ return r;
+ }
+
+ float operator* (const Vec2D &v) const
+ {
+ return x*v.x + y*v.y;
+ }
+
+ Vec2D operator* (float d) const
+ {
+ Vec2D r(x*d,y*d);
+ return r;
+ }
+
+ friend Vec2D operator* (float d, const Vec2D& v)
+ {
+ return v * d;
+ }
+
+ Vec2D& operator+= (const Vec2D &v)
+ {
+ x += v.x;
+ y += v.y;
+ return *this;
+ }
+
+ Vec2D& operator-= (const Vec2D &v)
+ {
+ x -= v.x;
+ y -= v.y;
+ return *this;
+ }
+
+ Vec2D& operator*= (float d)
+ {
+ x *= d;
+ y *= d;
+ return *this;
+ }
+
+ float lengthSquared() const
+ {
+ return x*x+y*y;
+ }
+
+ float length() const
+ {
+ return sqrt(x*x+y*y);
+ }
+
+ Vec2D& normalize()
+ {
+ this->operator*= (1.0f/length());
+ return *this;
+ }
+
+ Vec2D operator~ () const
+ {
+ Vec2D r(*this);
+ r.normalize();
+ return r;
+ }
+
+
+ friend std::istream& operator>>(std::istream& in, Vec2D& v)
+ {
+ in >> v.x >> v.y;
+ return in;
+ }
+
+ operator float*()
+ {
+ return (float*)this;
+ }
+};
+
+inline void rotate(float x0, float y0, float *x, float *y, float angle)
+{
+ float xa = *x - x0, ya = *y - y0;
+ *x = xa*cosf(angle) - ya*sinf(angle) + x0;
+ *y = xa*sinf(angle) + ya*cosf(angle) + y0;
+}
+
+#endif
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
new file mode 100644
index 0000000000..ff28ae97e2
--- /dev/null
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -0,0 +1,526 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#define _CRT_SECURE_NO_DEPRECATE
+#include <cstdio>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <errno.h>
+
+#ifdef WIN32
+ #include <Windows.h>
+ #include <sys/stat.h>
+ #include <direct.h>
+ #define mkdir _mkdir
+#else
+ #include <sys/stat.h>
+#endif
+
+#undef min
+#undef max
+
+//#pragma warning(disable : 4505)
+//#pragma comment(lib, "Winmm.lib")
+
+#include <map>
+
+//From Extractor
+#include "adtfile.h"
+#include "wdtfile.h"
+#include "dbcfile.h"
+#include "wmo.h"
+#include "mpq_libmpq04.h"
+
+#include "vmapexport.h"
+
+//------------------------------------------------------------------------------
+// Defines
+
+#define MPQ_BLOCK_SIZE 0x1000
+
+//-----------------------------------------------------------------------------
+
+extern ArchiveSet gOpenArchives;
+
+typedef struct
+{
+ char name[64];
+ unsigned int id;
+}map_id;
+
+map_id * map_ids;
+uint16 *LiqType = 0;
+uint32 map_count;
+char output_path[128]=".";
+char input_path[1024]=".";
+bool hasInputPathParam = false;
+bool preciseVectorData = false;
+
+// Constants
+
+//static const char * szWorkDirMaps = ".\\Maps";
+const char* szWorkDirWmo = "./Buildings";
+const char* szRawVMAPMagic = "VMAP041";
+
+// Local testing functions
+
+bool FileExists(const char* file)
+{
+ if (FILE* n = fopen(file, "rb"))
+ {
+ fclose(n);
+ return true;
+ }
+ return false;
+}
+
+void strToLower(char* str)
+{
+ while(*str)
+ {
+ *str=tolower(*str);
+ ++str;
+ }
+}
+
+// copied from contrib/extractor/System.cpp
+void ReadLiquidTypeTableDBC()
+{
+ printf("Read LiquidType.dbc file...");
+ DBCFile dbc("DBFilesClient\\LiquidType.dbc");
+ if(!dbc.open())
+ {
+ printf("Fatal error: Invalid LiquidType.dbc file format!\n");
+ exit(1);
+ }
+
+ size_t LiqType_count = dbc.getRecordCount();
+ size_t LiqType_maxid = dbc.getRecord(LiqType_count - 1).getUInt(0);
+ LiqType = new uint16[LiqType_maxid + 1];
+ memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16));
+
+ for(uint32 x = 0; x < LiqType_count; ++x)
+ LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
+
+ printf("Done! (%u LiqTypes loaded)\n", (unsigned int)LiqType_count);
+}
+
+bool ExtractWmo()
+{
+ bool success = true;
+
+ //const char* ParsArchiveNames[] = {"patch-2.MPQ", "patch.MPQ", "common.MPQ", "expansion.MPQ"};
+
+ for (ArchiveSet::const_iterator ar_itr = gOpenArchives.begin(); ar_itr != gOpenArchives.end() && success; ++ar_itr)
+ {
+ vector<string> filelist;
+
+ (*ar_itr)->GetFileListTo(filelist);
+ for (vector<string>::iterator fname = filelist.begin(); fname != filelist.end() && success; ++fname)
+ {
+ if (fname->find(".wmo") != string::npos)
+ success = ExtractSingleWmo(*fname);
+ }
+ }
+
+ if (success)
+ printf("\nExtract wmo complete (No (fatal) errors)\n");
+
+ return success;
+}
+
+bool ExtractSingleWmo(std::string& fname)
+{
+ // Copy files from archive
+
+ char szLocalFile[1024];
+ const char * plain_name = GetPlainName(fname.c_str());
+ sprintf(szLocalFile, "%s/%s", szWorkDirWmo, plain_name);
+ fixnamen(szLocalFile,strlen(szLocalFile));
+
+ if (FileExists(szLocalFile))
+ return true;
+
+ int p = 0;
+ // Select root wmo files
+ char const* rchr = strrchr(plain_name, '_');
+ if (rchr != NULL)
+ {
+ char cpy[4];
+ memcpy(cpy, rchr, 4);
+ for (int i = 0; i < 4; ++i)
+ {
+ int m = cpy[i];
+ if (isdigit(m))
+ p++;
+ }
+ }
+
+ if (p == 3)
+ return true;
+
+ bool file_ok = true;
+ std::cout << "Extracting " << fname << std::endl;
+ WMORoot froot(fname);
+ if(!froot.open())
+ {
+ printf("Couldn't open RootWmo!!!\n");
+ return true;
+ }
+ FILE *output = fopen(szLocalFile,"wb");
+ if(!output)
+ {
+ printf("couldn't open %s for writing!\n", szLocalFile);
+ return false;
+ }
+ froot.ConvertToVMAPRootWmo(output);
+ int Wmo_nVertices = 0;
+ //printf("root has %d groups\n", froot->nGroups);
+ if (froot.nGroups !=0)
+ {
+ for (uint32 i = 0; i < froot.nGroups; ++i)
+ {
+ char temp[1024];
+ strcpy(temp, fname.c_str());
+ temp[fname.length()-4] = 0;
+ char groupFileName[1024];
+ sprintf(groupFileName, "%s_%03u.wmo", temp, i);
+ //printf("Trying to open groupfile %s\n",groupFileName);
+
+ string s = groupFileName;
+ WMOGroup fgroup(s);
+ if(!fgroup.open())
+ {
+ printf("Could not open all Group file for: %s\n", plain_name);
+ file_ok = false;
+ break;
+ }
+
+ Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, &froot, preciseVectorData);
+ }
+ }
+
+ fseek(output, 8, SEEK_SET); // store the correct no of vertices
+ fwrite(&Wmo_nVertices,sizeof(int),1,output);
+ fclose(output);
+
+ // Delete the extracted file in the case of an error
+ if (!file_ok)
+ remove(szLocalFile);
+ return true;
+}
+
+void ParsMapFiles()
+{
+ char fn[512];
+ //char id_filename[64];
+ char id[10];
+ for (unsigned int i=0; i<map_count; ++i)
+ {
+ sprintf(id,"%03u",map_ids[i].id);
+ sprintf(fn,"World\\Maps\\%s\\%s.wdt", map_ids[i].name, map_ids[i].name);
+ WDTFile WDT(fn,map_ids[i].name);
+ if(WDT.init(id, map_ids[i].id))
+ {
+ printf("Processing Map %u\n[", map_ids[i].id);
+ for (int x=0; x<64; ++x)
+ {
+ for (int y=0; y<64; ++y)
+ {
+ if (ADTFile *ADT = WDT.GetMap(x,y))
+ {
+ //sprintf(id_filename,"%02u %02u %03u",x,y,map_ids[i].id);//!!!!!!!!!
+ ADT->init(map_ids[i].id, x, y);
+ delete ADT;
+ }
+ }
+ printf("#");
+ fflush(stdout);
+ }
+ printf("]\n");
+ }
+ }
+}
+
+void getGamePath()
+{
+#ifdef _WIN32
+ strcpy(input_path,"Data\\");
+#else
+ strcpy(input_path,"Data/");
+#endif
+}
+
+bool scan_patches(char* scanmatch, std::vector<std::string>& pArchiveNames)
+{
+ int i;
+ char path[512];
+
+ for (i = 1; i <= 99; i++)
+ {
+ if (i != 1)
+ {
+ sprintf(path, "%s-%d.MPQ", scanmatch, i);
+ }
+ else
+ {
+ sprintf(path, "%s.MPQ", scanmatch);
+ }
+#ifdef __linux__
+ if(FILE* h = fopen64(path, "rb"))
+#else
+ if(FILE* h = fopen(path, "rb"))
+#endif
+ {
+ fclose(h);
+ //matches.push_back(path);
+ pArchiveNames.push_back(path);
+ }
+ }
+
+ return(true);
+}
+
+bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames)
+{
+ if(!hasInputPathParam)
+ getGamePath();
+
+ printf("\nGame path: %s\n", input_path);
+
+ char path[512];
+ string in_path(input_path);
+ std::vector<std::string> locales, searchLocales;
+
+ searchLocales.push_back("enGB");
+ searchLocales.push_back("enUS");
+ searchLocales.push_back("deDE");
+ searchLocales.push_back("esES");
+ searchLocales.push_back("frFR");
+ searchLocales.push_back("koKR");
+ searchLocales.push_back("zhCN");
+ searchLocales.push_back("zhTW");
+ searchLocales.push_back("enCN");
+ searchLocales.push_back("enTW");
+ searchLocales.push_back("esMX");
+ searchLocales.push_back("ruRU");
+
+ for (std::vector<std::string>::iterator i = searchLocales.begin(); i != searchLocales.end(); ++i)
+ {
+ std::string localePath = in_path + *i;
+ // check if locale exists:
+ struct stat status;
+ if (stat(localePath.c_str(), &status))
+ continue;
+ if ((status.st_mode & S_IFDIR) == 0)
+ continue;
+ printf("Found locale '%s'\n", i->c_str());
+ locales.push_back(*i);
+ }
+ printf("\n");
+
+ // open locale expansion and common files
+ printf("Adding data files from locale directories.\n");
+ for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); ++i)
+ {
+ pArchiveNames.push_back(in_path + *i + "/locale-" + *i + ".MPQ");
+ pArchiveNames.push_back(in_path + *i + "/expansion-locale-" + *i + ".MPQ");
+ pArchiveNames.push_back(in_path + *i + "/lichking-locale-" + *i + ".MPQ");
+ }
+
+ // open expansion and common files
+ pArchiveNames.push_back(input_path + string("common.MPQ"));
+ pArchiveNames.push_back(input_path + string("common-2.MPQ"));
+ pArchiveNames.push_back(input_path + string("expansion.MPQ"));
+ pArchiveNames.push_back(input_path + string("lichking.MPQ"));
+
+ // now, scan for the patch levels in the core dir
+ printf("Scanning patch levels from data directory.\n");
+ sprintf(path, "%spatch", input_path);
+ if (!scan_patches(path, pArchiveNames))
+ return(false);
+
+ // now, scan for the patch levels in locale dirs
+ printf("Scanning patch levels from locale directories.\n");
+ bool foundOne = false;
+ for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); ++i)
+ {
+ printf("Locale: %s\n", i->c_str());
+ sprintf(path, "%s%s/patch-%s", input_path, i->c_str(), i->c_str());
+ if(scan_patches(path, pArchiveNames))
+ foundOne = true;
+ }
+
+ printf("\n");
+
+ if(!foundOne)
+ {
+ printf("no locale found\n");
+ return false;
+ }
+
+ return true;
+}
+
+bool processArgv(int argc, char ** argv, const char *versionString)
+{
+ bool result = true;
+ hasInputPathParam = false;
+ preciseVectorData = false;
+
+ for(int i = 1; i < argc; ++i)
+ {
+ if(strcmp("-s",argv[i]) == 0)
+ {
+ preciseVectorData = false;
+ }
+ else if(strcmp("-d",argv[i]) == 0)
+ {
+ if((i+1)<argc)
+ {
+ hasInputPathParam = true;
+ strcpy(input_path, argv[i+1]);
+ if (input_path[strlen(input_path) - 1] != '\\' && input_path[strlen(input_path) - 1] != '/')
+ strcat(input_path, "/");
+ ++i;
+ }
+ else
+ {
+ result = false;
+ }
+ }
+ else if(strcmp("-?",argv[1]) == 0)
+ {
+ result = false;
+ }
+ else if(strcmp("-l",argv[i]) == 0)
+ {
+ preciseVectorData = true;
+ }
+ else
+ {
+ result = false;
+ break;
+ }
+ }
+ if(!result)
+ {
+ printf("Extract %s.\n",versionString);
+ printf("%s [-?][-s][-l][-d <path>]\n", argv[0]);
+ printf(" -s : (default) small size (data size optimization), ~500MB less vmap data.\n");
+ printf(" -l : large size, ~500MB more vmap data. (might contain more details)\n");
+ printf(" -d <path>: Path to the vector data source folder.\n");
+ printf(" -? : This message.\n");
+ }
+ return result;
+}
+
+
+//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+// Main
+//
+// The program must be run with two command line arguments
+//
+// Arg1 - The source MPQ name (for testing reading and file find)
+// Arg2 - Listfile name
+//
+
+int main(int argc, char ** argv)
+{
+ bool success=true;
+ const char *versionString = "V4.00 2012_02";
+
+ // Use command line arguments, when some
+ if (!processArgv(argc, argv, versionString))
+ return 1;
+
+ // some simple check if working dir is dirty
+ else
+ {
+ std::string sdir = std::string(szWorkDirWmo) + "/dir";
+ std::string sdir_bin = std::string(szWorkDirWmo) + "/dir_bin";
+ struct stat status;
+ if (!stat(sdir.c_str(), &status) || !stat(sdir_bin.c_str(), &status))
+ {
+ printf("Your output directory seems to be polluted, please use an empty directory!\n");
+ printf("<press return to exit>");
+ char garbage[2];
+ return scanf("%c", garbage);
+ }
+ }
+
+ printf("Extract %s. Beginning work ....\n",versionString);
+ //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ // Create the working directory
+ if (mkdir(szWorkDirWmo
+#if defined(__linux__) || defined(__APPLE__)
+ , 0711
+#endif
+ ))
+ success = (errno == EEXIST);
+
+ // prepare archive name list
+ std::vector<std::string> archiveNames;
+ fillArchiveNameVector(archiveNames);
+ for (size_t i=0; i < archiveNames.size(); ++i)
+ {
+ MPQArchive *archive = new MPQArchive(archiveNames[i].c_str());
+ if (gOpenArchives.empty() || gOpenArchives.front() != archive)
+ delete archive;
+ }
+
+ if (gOpenArchives.empty())
+ {
+ printf("FATAL ERROR: None MPQ archive found by path '%s'. Use -d option with proper path.\n",input_path);
+ return 1;
+ }
+ ReadLiquidTypeTableDBC();
+
+ // extract data
+ if (success)
+ success = ExtractWmo();
+
+ //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ //map.dbc
+ if (success)
+ {
+ DBCFile * dbc = new DBCFile("DBFilesClient\\Map.dbc");
+ if (!dbc->open())
+ {
+ delete dbc;
+ printf("FATAL ERROR: Map.dbc not found in data file.\n");
+ return 1;
+ }
+ map_count=dbc->getRecordCount ();
+ map_ids=new map_id[map_count];
+ for (unsigned int x=0;x<map_count;++x)
+ {
+ map_ids[x].id=dbc->getRecord (x).getUInt(0);
+ strcpy(map_ids[x].name,dbc->getRecord(x).getString(1));
+ printf("Map - %s\n",map_ids[x].name);
+ }
+
+
+ delete dbc;
+ ParsMapFiles();
+ delete [] map_ids;
+ //nError = ERROR_SUCCESS;
+ // Extract models, listed in DameObjectDisplayInfo.dbc
+ ExtractGameobjectModels();
+ }
+
+ printf("\n");
+ if (!success)
+ {
+ printf("ERROR: Extract %s. Work NOT complete.\n Precise vector data=%d.\nPress any key.\n",versionString, preciseVectorData);
+ getchar();
+ }
+
+ printf("Extract %s. Work complete. No errors.\n",versionString);
+ delete [] LiqType;
+ return 0;
+}
diff --git a/src/tools/vmap4_extractor/vmapexport.h b/src/tools/vmap4_extractor/vmapexport.h
new file mode 100644
index 0000000000..47c16d89ce
--- /dev/null
+++ b/src/tools/vmap4_extractor/vmapexport.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef VMAPEXPORT_H
+#define VMAPEXPORT_H
+
+#include <string>
+
+enum ModelFlags
+{
+ MOD_M2 = 1,
+ MOD_WORLDSPAWN = 1<<1,
+ MOD_HAS_BOUND = 1<<2
+};
+
+extern const char * szWorkDirWmo;
+extern const char * szRawVMAPMagic; // vmap magic string for extracted raw vmap data
+
+bool FileExists(const char * file);
+void strToLower(char* str);
+
+bool ExtractSingleWmo(std::string& fname);
+bool ExtractSingleModel(std::string& fname);
+
+void ExtractGameobjectModels();
+
+#endif
diff --git a/src/tools/vmap4_extractor/wdtfile.cpp b/src/tools/vmap4_extractor/wdtfile.cpp
new file mode 100644
index 0000000000..a79bec03c5
--- /dev/null
+++ b/src/tools/vmap4_extractor/wdtfile.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "vmapexport.h"
+#include "wdtfile.h"
+#include "adtfile.h"
+#include <cstdio>
+
+char * wdtGetPlainName(char * FileName)
+{
+ char * szTemp;
+
+ if((szTemp = strrchr(FileName, '\\')) != NULL)
+ FileName = szTemp + 1;
+ return FileName;
+}
+
+WDTFile::WDTFile(char* file_name, char* file_name1) : WDT(file_name), gWmoInstansName(NULL), gnWMO(0)
+{
+ filename.append(file_name1,strlen(file_name1));
+}
+
+bool WDTFile::init(char* /*map_id*/, unsigned int mapID)
+{
+ if (WDT.isEof())
+ {
+ //printf("Can't find WDT file.\n");
+ return false;
+ }
+
+ char fourcc[5];
+ uint32 size;
+
+ std::string dirname = std::string(szWorkDirWmo) + "/dir_bin";
+ FILE *dirfile;
+ dirfile = fopen(dirname.c_str(), "ab");
+ if(!dirfile)
+ {
+ printf("Can't open dirfile!'%s'\n", dirname.c_str());
+ return false;
+ }
+
+ while (!WDT.isEof())
+ {
+ WDT.read(fourcc,4);
+ WDT.read(&size, 4);
+
+ flipcc(fourcc);
+ fourcc[4] = 0;
+
+ size_t nextpos = WDT.getPos() + size;
+
+ if (!strcmp(fourcc,"MAIN"))
+ {
+ }
+ if (!strcmp(fourcc,"MWMO"))
+ {
+ // global map objects
+ if (size)
+ {
+ char *buf = new char[size];
+ WDT.read(buf, size);
+ char *p=buf;
+ int q = 0;
+ gWmoInstansName = new string[size];
+ while (p < buf + size)
+ {
+ char* s=wdtGetPlainName(p);
+ fixnamen(s,strlen(s));
+ p=p+strlen(p)+1;
+ gWmoInstansName[q++] = s;
+ }
+ delete[] buf;
+ }
+ }
+ else if (!strcmp(fourcc, "MODF"))
+ {
+ // global wmo instance data
+ if (size)
+ {
+ gnWMO = (int)size / 64;
+
+ for (int i = 0; i < gnWMO; ++i)
+ {
+ int id;
+ WDT.read(&id, 4);
+ WMOInstance inst(WDT,gWmoInstansName[id].c_str(), mapID, 65, 65, dirfile);
+ }
+
+ delete[] gWmoInstansName;
+ }
+ }
+ WDT.seek((int)nextpos);
+ }
+
+ WDT.close();
+ fclose(dirfile);
+ return true;
+}
+
+WDTFile::~WDTFile(void)
+{
+ WDT.close();
+}
+
+ADTFile* WDTFile::GetMap(int x, int z)
+{
+ if(!(x>=0 && z >= 0 && x<64 && z<64))
+ return NULL;
+
+ char name[512];
+
+ sprintf(name,"World\\Maps\\%s\\%s_%d_%d.adt", filename.c_str(), filename.c_str(), x, z);
+ return new ADTFile(name);
+}
diff --git a/src/tools/vmap4_extractor/wdtfile.h b/src/tools/vmap4_extractor/wdtfile.h
new file mode 100644
index 0000000000..21dd5bb2ce
--- /dev/null
+++ b/src/tools/vmap4_extractor/wdtfile.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef WDTFILE_H
+#define WDTFILE_H
+
+#include "mpq_libmpq04.h"
+#include "wmo.h"
+#include <string>
+#include "stdlib.h"
+
+class ADTFile;
+
+class WDTFile
+{
+private:
+ MPQFile WDT;
+ string filename;
+public:
+ WDTFile(char* file_name, char* file_name1);
+ ~WDTFile(void);
+ bool init(char* map_id, unsigned int mapID);
+
+ string* gWmoInstansName;
+ int gnWMO;
+
+ ADTFile* GetMap(int x, int z);
+};
+
+#endif
diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp
new file mode 100644
index 0000000000..e699b2845d
--- /dev/null
+++ b/src/tools/vmap4_extractor/wmo.cpp
@@ -0,0 +1,556 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#include "vmapexport.h"
+#include "wmo.h"
+#include "vec3d.h"
+#include <cstdio>
+#include <cstdlib>
+#include <cassert>
+#include <map>
+#include <fstream>
+#undef min
+#undef max
+#include "mpq_libmpq04.h"
+
+using namespace std;
+extern uint16 *LiqType;
+
+WMORoot::WMORoot(std::string &filename)
+ : filename(filename), col(0), nTextures(0), nGroups(0), nP(0), nLights(0),
+ nModels(0), nDoodads(0), nDoodadSets(0), RootWMOID(0), liquidType(0)
+{
+ memset(bbcorn1, 0, sizeof(bbcorn1));
+ memset(bbcorn2, 0, sizeof(bbcorn2));
+}
+
+bool WMORoot::open()
+{
+ MPQFile f(filename.c_str());
+ if(f.isEof ())
+ {
+ printf("No such file.\n");
+ return false;
+ }
+
+ uint32 size;
+ char fourcc[5];
+
+ while (!f.isEof())
+ {
+ f.read(fourcc,4);
+ f.read(&size, 4);
+
+ flipcc(fourcc);
+ fourcc[4] = 0;
+
+ size_t nextpos = f.getPos() + size;
+
+ if (!strcmp(fourcc,"MOHD")) // header
+ {
+ f.read(&nTextures, 4);
+ f.read(&nGroups, 4);
+ f.read(&nP, 4);
+ f.read(&nLights, 4);
+ f.read(&nModels, 4);
+ f.read(&nDoodads, 4);
+ f.read(&nDoodadSets, 4);
+ f.read(&col, 4);
+ f.read(&RootWMOID, 4);
+ f.read(bbcorn1, 12);
+ f.read(bbcorn2, 12);
+ f.read(&liquidType, 4);
+ break;
+ }
+ /*
+ else if (!strcmp(fourcc,"MOTX"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOMT"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOGN"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOGI"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOLT"))
+ {
+ }
+ else if (!strcmp(fourcc,"MODN"))
+ {
+ }
+ else if (!strcmp(fourcc,"MODS"))
+ {
+ }
+ else if (!strcmp(fourcc,"MODD"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOSB"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOPV"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOPT"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOPR"))
+ {
+ }
+ else if (!strcmp(fourcc,"MFOG"))
+ {
+ }
+ */
+ f.seek((int)nextpos);
+ }
+ f.close ();
+ return true;
+}
+
+bool WMORoot::ConvertToVMAPRootWmo(FILE* pOutfile)
+{
+ //printf("Convert RootWmo...\n");
+
+ fwrite(szRawVMAPMagic, 1, 8, pOutfile);
+ unsigned int nVectors = 0;
+ fwrite(&nVectors,sizeof(nVectors), 1, pOutfile); // will be filled later
+ fwrite(&nGroups, 4, 1, pOutfile);
+ fwrite(&RootWMOID, 4, 1, pOutfile);
+ return true;
+}
+
+WMOGroup::WMOGroup(const std::string &filename) :
+ filename(filename), MOPY(0), MOVI(0), MoviEx(0), MOVT(0), MOBA(0), MobaEx(0),
+ hlq(0), LiquEx(0), LiquBytes(0), groupName(0), descGroupName(0), mogpFlags(0),
+ moprIdx(0), moprNItems(0), nBatchA(0), nBatchB(0), nBatchC(0), fogIdx(0),
+ liquidType(0), groupWMOID(0), mopy_size(0), moba_size(0), LiquEx_size(0),
+ nVertices(0), nTriangles(0), liquflags(0)
+{
+ memset(bbcorn1, 0, sizeof(bbcorn1));
+ memset(bbcorn2, 0, sizeof(bbcorn2));
+}
+
+bool WMOGroup::open()
+{
+ MPQFile f(filename.c_str());
+ if(f.isEof ())
+ {
+ printf("No such file.\n");
+ return false;
+ }
+ uint32 size;
+ char fourcc[5];
+ while (!f.isEof())
+ {
+ f.read(fourcc,4);
+ f.read(&size, 4);
+ flipcc(fourcc);
+ if (!strcmp(fourcc,"MOGP"))//Fix sizeoff = Data size.
+ {
+ size = 68;
+ }
+ fourcc[4] = 0;
+ size_t nextpos = f.getPos() + size;
+ LiquEx_size = 0;
+ liquflags = 0;
+
+ if (!strcmp(fourcc,"MOGP"))//header
+ {
+ f.read(&groupName, 4);
+ f.read(&descGroupName, 4);
+ f.read(&mogpFlags, 4);
+ f.read(bbcorn1, 12);
+ f.read(bbcorn2, 12);
+ f.read(&moprIdx, 2);
+ f.read(&moprNItems, 2);
+ f.read(&nBatchA, 2);
+ f.read(&nBatchB, 2);
+ f.read(&nBatchC, 4);
+ f.read(&fogIdx, 4);
+ f.read(&liquidType, 4);
+ f.read(&groupWMOID,4);
+
+ }
+ else if (!strcmp(fourcc,"MOPY"))
+ {
+ MOPY = new char[size];
+ mopy_size = size;
+ nTriangles = (int)size / 2;
+ f.read(MOPY, size);
+ }
+ else if (!strcmp(fourcc,"MOVI"))
+ {
+ MOVI = new uint16[size/2];
+ f.read(MOVI, size);
+ }
+ else if (!strcmp(fourcc,"MOVT"))
+ {
+ MOVT = new float[size/4];
+ f.read(MOVT, size);
+ nVertices = (int)size / 12;
+ }
+ else if (!strcmp(fourcc,"MONR"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOTV"))
+ {
+ }
+ else if (!strcmp(fourcc,"MOBA"))
+ {
+ MOBA = new uint16[size/2];
+ moba_size = size/2;
+ f.read(MOBA, size);
+ }
+ else if (!strcmp(fourcc,"MLIQ"))
+ {
+ liquflags |= 1;
+ hlq = new WMOLiquidHeader();
+ f.read(hlq, 0x1E);
+ LiquEx_size = sizeof(WMOLiquidVert) * hlq->xverts * hlq->yverts;
+ LiquEx = new WMOLiquidVert[hlq->xverts * hlq->yverts];
+ f.read(LiquEx, LiquEx_size);
+ int nLiquBytes = hlq->xtiles * hlq->ytiles;
+ LiquBytes = new char[nLiquBytes];
+ f.read(LiquBytes, nLiquBytes);
+
+ /* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app);
+ llog << filename;
+ llog << "\nbbox: " << bbcorn1[0] << ", " << bbcorn1[1] << ", " << bbcorn1[2] << " | " << bbcorn2[0] << ", " << bbcorn2[1] << ", " << bbcorn2[2];
+ llog << "\nlpos: " << hlq->pos_x << ", " << hlq->pos_y << ", " << hlq->pos_z;
+ llog << "\nx-/yvert: " << hlq->xverts << "/" << hlq->yverts << " size: " << size << " expected size: " << 30 + hlq->xverts*hlq->yverts*8 + hlq->xtiles*hlq->ytiles << std::endl;
+ llog.close(); */
+ }
+ f.seek((int)nextpos);
+ }
+ f.close();
+ return true;
+}
+
+int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool preciseVectorData)
+{
+ fwrite(&mogpFlags,sizeof(uint32),1,output);
+ fwrite(&groupWMOID,sizeof(uint32),1,output);
+ // group bound
+ fwrite(bbcorn1, sizeof(float), 3, output);
+ fwrite(bbcorn2, sizeof(float), 3, output);
+ fwrite(&liquflags,sizeof(uint32),1,output);
+ int nColTriangles = 0;
+ if (preciseVectorData)
+ {
+ char GRP[] = "GRP ";
+ fwrite(GRP,1,4,output);
+
+ int k = 0;
+ int moba_batch = moba_size/12;
+ MobaEx = new int[moba_batch*4];
+ for(int i=8; i<moba_size; i+=12)
+ {
+ MobaEx[k++] = MOBA[i];
+ }
+ int moba_size_grp = moba_batch*4+4;
+ fwrite(&moba_size_grp,4,1,output);
+ fwrite(&moba_batch,4,1,output);
+ fwrite(MobaEx,4,k,output);
+ delete [] MobaEx;
+
+ uint32 nIdexes = nTriangles * 3;
+
+ if(fwrite("INDX",4, 1, output) != 1)
+ {
+ printf("Error while writing file nbraches ID");
+ exit(0);
+ }
+ int wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes;
+ if(fwrite(&wsize, sizeof(int), 1, output) != 1)
+ {
+ printf("Error while writing file wsize");
+ // no need to exit?
+ }
+ if(fwrite(&nIdexes, sizeof(uint32), 1, output) != 1)
+ {
+ printf("Error while writing file nIndexes");
+ exit(0);
+ }
+ if(nIdexes >0)
+ {
+ if(fwrite(MOVI, sizeof(unsigned short), nIdexes, output) != nIdexes)
+ {
+ printf("Error while writing file indexarray");
+ exit(0);
+ }
+ }
+
+ if(fwrite("VERT",4, 1, output) != 1)
+ {
+ printf("Error while writing file nbraches ID");
+ exit(0);
+ }
+ wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
+ if(fwrite(&wsize, sizeof(int), 1, output) != 1)
+ {
+ printf("Error while writing file wsize");
+ // no need to exit?
+ }
+ if(fwrite(&nVertices, sizeof(int), 1, output) != 1)
+ {
+ printf("Error while writing file nVertices");
+ exit(0);
+ }
+ if(nVertices >0)
+ {
+ if(fwrite(MOVT, sizeof(float)*3, nVertices, output) != nVertices)
+ {
+ printf("Error while writing file vectors");
+ exit(0);
+ }
+ }
+
+ nColTriangles = nTriangles;
+ }
+ else
+ {
+ char GRP[] = "GRP ";
+ fwrite(GRP,1,4,output);
+ int k = 0;
+ int moba_batch = moba_size/12;
+ MobaEx = new int[moba_batch*4];
+ for(int i=8; i<moba_size; i+=12)
+ {
+ MobaEx[k++] = MOBA[i];
+ }
+
+ int moba_size_grp = moba_batch*4+4;
+ fwrite(&moba_size_grp,4,1,output);
+ fwrite(&moba_batch,4,1,output);
+ fwrite(MobaEx,4,k,output);
+ delete [] MobaEx;
+
+ //-------INDX------------------------------------
+ //-------MOPY--------
+ MoviEx = new uint16[nTriangles*3]; // "worst case" size...
+ int *IndexRenum = new int[nVertices];
+ memset(IndexRenum, 0xFF, nVertices*sizeof(int));
+ for (int i=0; i<nTriangles; ++i)
+ {
+ // Skip no collision triangles
+ if (MOPY[2*i]&WMO_MATERIAL_NO_COLLISION ||
+ !(MOPY[2*i]&(WMO_MATERIAL_HINT|WMO_MATERIAL_COLLIDE_HIT)) )
+ continue;
+ // Use this triangle
+ for (int j=0; j<3; ++j)
+ {
+ IndexRenum[MOVI[3*i + j]] = 1;
+ MoviEx[3*nColTriangles + j] = MOVI[3*i + j];
+ }
+ ++nColTriangles;
+ }
+
+ // assign new vertex index numbers
+ int nColVertices = 0;
+ for (uint32 i=0; i<nVertices; ++i)
+ {
+ if (IndexRenum[i] == 1)
+ {
+ IndexRenum[i] = nColVertices;
+ ++nColVertices;
+ }
+ }
+
+ // translate triangle indices to new numbers
+ for (int i=0; i<3*nColTriangles; ++i)
+ {
+ assert(MoviEx[i] < nVertices);
+ MoviEx[i] = IndexRenum[MoviEx[i]];
+ }
+
+ // write triangle indices
+ int INDX[] = {0x58444E49, nColTriangles*6+4, nColTriangles*3};
+ fwrite(INDX,4,3,output);
+ fwrite(MoviEx,2,nColTriangles*3,output);
+
+ // write vertices
+ int VERT[] = {0x54524556, nColVertices*3*static_cast<int>(sizeof(float))+4, nColVertices};// "VERT"
+ int check = 3*nColVertices;
+ fwrite(VERT,4,3,output);
+ for (uint32 i=0; i<nVertices; ++i)
+ if(IndexRenum[i] >= 0)
+ check -= fwrite(MOVT+3*i, sizeof(float), 3, output);
+
+ assert(check==0);
+
+ delete [] MoviEx;
+ delete [] IndexRenum;
+ }
+
+ //------LIQU------------------------
+ if (LiquEx_size != 0)
+ {
+ int LIQU_h[] = {0x5551494C, static_cast<int>(sizeof(WMOLiquidHeader) + LiquEx_size) + hlq->xtiles*hlq->ytiles};// "LIQU"
+ fwrite(LIQU_h, 4, 2, output);
+
+ // according to WoW.Dev Wiki:
+ uint32 liquidEntry;
+ if (rootWMO->liquidType & 4)
+ liquidEntry = liquidType;
+ else if (liquidType == 15)
+ liquidEntry = 0;
+ else
+ liquidEntry = liquidType + 1;
+
+ if (!liquidEntry)
+ {
+ int v1; // edx@1
+ int v2; // eax@1
+
+ v1 = hlq->xtiles * hlq->ytiles;
+ v2 = 0;
+ if (v1 > 0)
+ {
+ while ((LiquBytes[v2] & 0xF) == 15)
+ {
+ ++v2;
+ if (v2 >= v1)
+ break;
+ }
+
+ if (v2 < v1 && (LiquBytes[v2] & 0xF) != 15)
+ liquidEntry = (LiquBytes[v2] & 0xF) + 1;
+ }
+ }
+
+ if (liquidEntry && liquidEntry < 21)
+ {
+ switch ((liquidEntry - 1) & 3)
+ {
+ case 0:
+ liquidEntry = ((mogpFlags & 0x80000) != 0) + 13;
+ break;
+ case 1:
+ liquidEntry = 14;
+ break;
+ case 2:
+ liquidEntry = 19;
+ break;
+ case 3:
+ liquidEntry = 20;
+ break;
+ }
+ }
+
+ hlq->type = liquidEntry;
+
+ /* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app);
+ llog << filename;
+ llog << ":\nliquidEntry: " << liquidEntry << " type: " << hlq->type << " (root:" << rootWMO->liquidType << " group:" << liquidType << ")\n";
+ llog.close(); */
+
+ fwrite(hlq, sizeof(WMOLiquidHeader), 1, output);
+ // only need height values, the other values are unknown anyway
+ for (uint32 i = 0; i<LiquEx_size/sizeof(WMOLiquidVert); ++i)
+ fwrite(&LiquEx[i].height, sizeof(float), 1, output);
+ // todo: compress to bit field
+ fwrite(LiquBytes, 1, hlq->xtiles*hlq->ytiles, output);
+ }
+
+ return nColTriangles;
+}
+
+WMOGroup::~WMOGroup()
+{
+ delete [] MOPY;
+ delete [] MOVI;
+ delete [] MOVT;
+ delete [] MOBA;
+ delete hlq;
+ delete [] LiquEx;
+ delete [] LiquBytes;
+}
+
+WMOInstance::WMOInstance(MPQFile& f, char const* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE* pDirfile)
+ : currx(0), curry(0), wmo(NULL), doodadset(0), pos(), indx(0), id(0), d2(0), d3(0)
+{
+ float ff[3];
+ f.read(&id, 4);
+ f.read(ff,12);
+ pos = Vec3D(ff[0],ff[1],ff[2]);
+ f.read(ff,12);
+ rot = Vec3D(ff[0],ff[1],ff[2]);
+ f.read(ff,12);
+ pos2 = Vec3D(ff[0],ff[1],ff[2]);
+ f.read(ff,12);
+ pos3 = Vec3D(ff[0],ff[1],ff[2]);
+ f.read(&d2,4);
+
+ uint16 trash,adtId;
+ f.read(&adtId,2);
+ f.read(&trash,2);
+
+ //-----------add_in _dir_file----------------
+
+ char tempname[512];
+ sprintf(tempname, "%s/%s", szWorkDirWmo, WmoInstName);
+ FILE *input;
+ input = fopen(tempname, "r+b");
+
+ if(!input)
+ {
+ printf("WMOInstance::WMOInstance: couldn't open %s\n", tempname);
+ return;
+ }
+
+ fseek(input, 8, SEEK_SET); // get the correct no of vertices
+ int nVertices;
+ int count = fread(&nVertices, sizeof (int), 1, input);
+ fclose(input);
+
+ if (count != 1 || nVertices == 0)
+ return;
+
+ float x,z;
+ x = pos.x;
+ z = pos.z;
+ if(x==0 && z == 0)
+ {
+ pos.x = 533.33333f*32;
+ pos.z = 533.33333f*32;
+ }
+ pos = fixCoords(pos);
+ pos2 = fixCoords(pos2);
+ pos3 = fixCoords(pos3);
+
+ float scale = 1.0f;
+ uint32 flags = MOD_HAS_BOUND;
+ if(tileX == 65 && tileY == 65) flags |= MOD_WORLDSPAWN;
+ //write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, name
+ fwrite(&mapID, sizeof(uint32), 1, pDirfile);
+ fwrite(&tileX, sizeof(uint32), 1, pDirfile);
+ fwrite(&tileY, sizeof(uint32), 1, pDirfile);
+ fwrite(&flags, sizeof(uint32), 1, pDirfile);
+ fwrite(&adtId, sizeof(uint16), 1, pDirfile);
+ fwrite(&id, sizeof(uint32), 1, pDirfile);
+ fwrite(&pos, sizeof(float), 3, pDirfile);
+ fwrite(&rot, sizeof(float), 3, pDirfile);
+ fwrite(&scale, sizeof(float), 1, pDirfile);
+ fwrite(&pos2, sizeof(float), 3, pDirfile);
+ fwrite(&pos3, sizeof(float), 3, pDirfile);
+ uint32 nlen=strlen(WmoInstName);
+ fwrite(&nlen, sizeof(uint32), 1, pDirfile);
+ fwrite(WmoInstName, sizeof(char), nlen, pDirfile);
+
+ /* fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f 1.0 %d %d %d,%d %d\n",
+ MapName,
+ WmoInstName,
+ (float) x, (float) pos.y, (float) z,
+ (float) rot.x, (float) rot.y, (float) rot.z,
+ nVertices,
+ realx1, realy1,
+ realx2, realy2
+ ); */
+
+ // fclose(dirfile);
+}
diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h
new file mode 100644
index 0000000000..42d771c77f
--- /dev/null
+++ b/src/tools/vmap4_extractor/wmo.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
+ * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ */
+
+#ifndef WMO_H
+#define WMO_H
+#define TILESIZE (533.33333f)
+#define CHUNKSIZE ((TILESIZE) / 16.0f)
+
+#include <string>
+#include <set>
+#include "vec3d.h"
+#include "loadlib/loadlib.h"
+
+// MOPY flags
+#define WMO_MATERIAL_NOCAMCOLLIDE 0x01
+#define WMO_MATERIAL_DETAIL 0x02
+#define WMO_MATERIAL_NO_COLLISION 0x04
+#define WMO_MATERIAL_HINT 0x08
+#define WMO_MATERIAL_RENDER 0x10
+#define WMO_MATERIAL_COLLIDE_HIT 0x20
+#define WMO_MATERIAL_WALL_SURFACE 0x40
+
+class WMOInstance;
+class WMOManager;
+class MPQFile;
+
+/* for whatever reason a certain company just can't stick to one coordinate system... */
+static inline Vec3D fixCoords(const Vec3D &v){ return Vec3D(v.z, v.x, v.y); }
+
+class WMORoot
+{
+private:
+ std::string filename;
+public:
+ unsigned int col;
+ uint32 nTextures, nGroups, nP, nLights, nModels, nDoodads, nDoodadSets, RootWMOID, liquidType;
+ float bbcorn1[3];
+ float bbcorn2[3];
+
+ WMORoot(std::string& filename);
+
+ bool open();
+ bool ConvertToVMAPRootWmo(FILE* output);
+};
+
+struct WMOLiquidHeader
+{
+ int xverts, yverts, xtiles, ytiles;
+ float pos_x;
+ float pos_y;
+ float pos_z;
+ short type;
+};
+
+struct WMOLiquidVert
+{
+ uint16 unk1;
+ uint16 unk2;
+ float height;
+};
+
+class WMOGroup
+{
+private:
+ std::string filename;
+public:
+ // MOGP
+
+ char* MOPY;
+ uint16* MOVI;
+ uint16* MoviEx;
+ float* MOVT;
+ uint16* MOBA;
+ int* MobaEx;
+ WMOLiquidHeader* hlq;
+ WMOLiquidVert* LiquEx;
+ char* LiquBytes;
+ int groupName, descGroupName;
+ int mogpFlags;
+ float bbcorn1[3];
+ float bbcorn2[3];
+ uint16 moprIdx;
+ uint16 moprNItems;
+ uint16 nBatchA;
+ uint16 nBatchB;
+ uint32 nBatchC, fogIdx, liquidType, groupWMOID;
+
+ int mopy_size, moba_size;
+ int LiquEx_size;
+ unsigned int nVertices; // number when loaded
+ int nTriangles; // number when loaded
+ uint32 liquflags;
+
+ WMOGroup(std::string const& filename);
+ ~WMOGroup();
+
+ bool open();
+ int ConvertToVMAPGroupWmo(FILE* output, WMORoot* rootWMO, bool preciseVectorData);
+};
+
+class WMOInstance
+{
+ static std::set<int> ids;
+public:
+ std::string MapName;
+ int currx;
+ int curry;
+ WMOGroup* wmo;
+ int doodadset;
+ Vec3D pos;
+ Vec3D pos2, pos3, rot;
+ uint32 indx, id, d2, d3;
+
+ WMOInstance(MPQFile&f , char const* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE* pDirfile);
+
+ static void reset();
+};
+
+#endif
diff --git a/src/worldserver/CMakeLists.txt b/src/worldserver/CMakeLists.txt
deleted file mode 100644
index 2c4b52f37b..0000000000
--- a/src/worldserver/CMakeLists.txt
+++ /dev/null
@@ -1,216 +0,0 @@
-# Copyright (C)
-#
-# 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.
-
-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_RECURSE sources_WorldThread WorldThread/*.cpp WorldThread/*.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_WorldThread}
- ${sources_localdir}
-)
-
-if( WIN32 )
- set(worldserver_SRCS
- ${worldserver_SRCS}
- ${sources_windows_Debugging}
- )
- if ( MSVC )
- set(worldserver_SRCS
- ${worldserver_SRCS}
- worldserver.rc
- )
- endif()
-endif()
-
-include_directories(
- ${CMAKE_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/g3dlite/include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/recastnavigation/Detour/Include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/gsoap
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/sockets/include
- ${CMAKE_SOURCE_DIR}/modules/worldengine/deps/SFMT
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/Management
- ${CMAKE_SOURCE_DIR}/modules/worldengine/lib-collision/src/Models
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Configuration
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Cryptography
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Cryptography/Authentication
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Database
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/DataStores
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Debugging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Dynamic/LinkedReference
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Dynamic
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Logging
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Packets
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Threading
- ${CMAKE_SOURCE_DIR}/modules/worldengine/nucleus/src/Utilities
- ${CMAKE_SOURCE_DIR}/modules/acore/game-framework/src/Addons
- ${game_INCLUDE_DIRS}
- ${CMAKE_SOURCE_DIR}/src/game
- ${CMAKE_SOURCE_DIR}/src/game/Accounts
- ${CMAKE_SOURCE_DIR}/src/game/Achievements
- ${CMAKE_SOURCE_DIR}/src/game/AI
- ${CMAKE_SOURCE_DIR}/src/game/AI/CoreAI
- ${CMAKE_SOURCE_DIR}/src/game/AI/ScriptedAI
- ${CMAKE_SOURCE_DIR}/src/game/AI/SmartScripts
- ${CMAKE_SOURCE_DIR}/src/game/AuctionHouse
- ${CMAKE_SOURCE_DIR}/src/game/AuctionHouse/AuctionHouseBot
- ${CMAKE_SOURCE_DIR}/src/game/Battlefield
- ${CMAKE_SOURCE_DIR}/src/game/Battlefield/Zones
- ${CMAKE_SOURCE_DIR}/src/game/Battlegrounds
- ${CMAKE_SOURCE_DIR}/src/game/Battlegrounds/Zones
- ${CMAKE_SOURCE_DIR}/src/game/Calendar
- ${CMAKE_SOURCE_DIR}/src/game/Chat
- ${CMAKE_SOURCE_DIR}/src/game/Chat/Channels
- ${CMAKE_SOURCE_DIR}/src/game/Combat
- ${CMAKE_SOURCE_DIR}/src/game/Conditions
- ${CMAKE_SOURCE_DIR}/src/game/DataStores
- ${CMAKE_SOURCE_DIR}/src/game/DungeonFinding
- ${CMAKE_SOURCE_DIR}/src/game/Entities
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Creature
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Corpse
- ${CMAKE_SOURCE_DIR}/src/game/Entities/DynamicObject
- ${CMAKE_SOURCE_DIR}/src/game/Entities/GameObject
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Item
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Item/Container
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Object
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Object/Updates
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Pet
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Player
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Totem
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Unit
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Vehicle
- ${CMAKE_SOURCE_DIR}/src/game/Entities/Transport
- ${CMAKE_SOURCE_DIR}/src/game/Events
- ${CMAKE_SOURCE_DIR}/src/game/Globals
- ${CMAKE_SOURCE_DIR}/src/game/Grids/Cells
- ${CMAKE_SOURCE_DIR}/src/game/Grids/Notifiers
- ${CMAKE_SOURCE_DIR}/src/game/Grids
- ${CMAKE_SOURCE_DIR}/src/game/Groups
- ${CMAKE_SOURCE_DIR}/src/game/Guilds
- ${CMAKE_SOURCE_DIR}/src/game/Handlers
- ${CMAKE_SOURCE_DIR}/src/game/Instances
- ${CMAKE_SOURCE_DIR}/src/game/Loot
- ${CMAKE_SOURCE_DIR}/src/game/Mails
- ${CMAKE_SOURCE_DIR}/src/game/Maps
- ${CMAKE_SOURCE_DIR}/src/game/Miscellaneous
- ${CMAKE_SOURCE_DIR}/src/game/Movement
- ${CMAKE_SOURCE_DIR}/src/game/Movement/Spline
- ${CMAKE_SOURCE_DIR}/src/game/Movement/MovementGenerators
- ${CMAKE_SOURCE_DIR}/src/game/Movement/Waypoints
- ${CMAKE_SOURCE_DIR}/src/game/OutdoorPvP
- ${CMAKE_SOURCE_DIR}/src/game/Pools
- ${CMAKE_SOURCE_DIR}/src/game/PrecompiledHeaders
- ${CMAKE_SOURCE_DIR}/src/game/Quests
- ${CMAKE_SOURCE_DIR}/src/game/Reputation
- ${CMAKE_SOURCE_DIR}/src/game/Scripting
- ${CMAKE_SOURCE_DIR}/src/game/Server/Protocol
- ${CMAKE_SOURCE_DIR}/src/game/Server
- ${CMAKE_SOURCE_DIR}/src/game/Skills
- ${CMAKE_SOURCE_DIR}/src/game/Spells
- ${CMAKE_SOURCE_DIR}/src/game/Spells/Auras
- ${CMAKE_SOURCE_DIR}/src/game/Tools
- ${CMAKE_SOURCE_DIR}/src/game/Warden
- ${CMAKE_SOURCE_DIR}/src/game/Warden/Modules
- ${CMAKE_SOURCE_DIR}/src/game/Weather
- ${CMAKE_SOURCE_DIR}/src/game/World
- ${CMAKE_SOURCE_DIR}/src/game/Misc
- ${CMAKE_SOURCE_DIR}/src/scripts/PrecompiledHeaders
- ${CMAKE_SOURCE_DIR}/src/authserver/Server
- ${CMAKE_SOURCE_DIR}/src/authserver/Realms
- ${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/CommandLine
- ${CMAKE_CURRENT_SOURCE_DIR}/RemoteAccess
- ${CMAKE_CURRENT_SOURCE_DIR}/TCSoap
- ${CMAKE_CURRENT_SOURCE_DIR}/WorldThread
- ${ACE_INCLUDE_DIR}
- ${MYSQL_INCLUDE_DIR}
- ${OPENSSL_INCLUDE_DIR}
-)
-
-add_executable(worldserver
- ${worldserver_SRCS}
- ${worldserver_PCH_SRC}
-)
-
-if( NOT WIN32 )
- set_target_properties(worldserver PROPERTIES
- COMPILE_DEFINITIONS _TRINITY_CORE_CONFIG="${CONF_DIR}/worldserver.conf"
- )
-endif()
-
-add_dependencies(worldserver revision.h)
-
-if( UNIX AND NOT NOJEM )
- set(worldserver_LINK_FLAGS "-pthread -lncurses ${worldserver_LINK_FLAGS}")
-endif()
-
-set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAGS}")
-
-target_link_libraries(worldserver
- game
- shared
- scripts
- collision
- g3dlib
- gsoap
- Detour
- ${GPERFTOOLS_LIBRARIES}
- ${JEMALLOC_LIBRARY}
- ${READLINE_LIBRARY}
- ${TERMCAP_LIBRARY}
- ${ACE_LIBRARY}
- ${MYSQL_LIBRARY}
- ${OPENSSL_LIBRARIES}
- ${ZLIB_LIBRARIES}
- ${CMAKE_THREAD_LIBS_INIT}
-)
-
-if( WIN32 )
- if ( MSVC )
- add_custom_command(TARGET worldserver
- POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/
- )
- elseif ( MINGW )
- add_custom_command(TARGET worldserver
- POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/worldserver.conf.dist ${CMAKE_BINARY_DIR}/bin/
- )
- endif()
-endif()
-
-if( UNIX )
- install(TARGETS worldserver DESTINATION bin)
-elseif( WIN32 )
- install(TARGETS worldserver DESTINATION "${CMAKE_INSTALL_PREFIX}")
-endif()
-
-install(FILES worldserver.conf.dist DESTINATION ${CONF_DIR})
-
-# Generate precompiled header
-if( USE_COREPCH )
- add_cxx_pch(worldserver ${worldserver_PCH_HDR} ${worldserver_PCH_SRC})
-endif()
-
-CU_RUN_HOOK("AFTER_WORLDSERVER_CMAKE")