Conflicts: .travis.yml CMakeLists.txt README.md dep/libmpq/CMakeLists.txt doc/UnixInstall.txt revision_data.h.in.cmake sql/base/auth_database.sql sql/base/characters_database.sql sql/base/dev/world_database.sql sql/old/3.3.5a/auth/59_2015_11_07/2015_08_21_00_auth.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_14_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_14_01_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_14_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_14_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_14_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_14_05_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_15_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_15_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_15_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_16_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_17_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_17_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_17_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_17_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_17_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_18_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_18_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_19_00_world_2015_07_18_04.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_19_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_19_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_19_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_19_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_19_05_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_20_02_world_2015_07_19_35.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_21_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_05_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_06_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_24_07_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_25_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_25_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_25_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_25_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_25_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_26_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_26_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_26_05_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_26_06_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_27_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_07_27_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_02_00_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_02_01_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_03_00_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_08_00_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_08_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_08_02_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_08_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_08_04_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_09_00_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_13_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_13_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_13_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_13_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_13_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_21_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_21_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_21_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_23_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_25_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_25_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_26_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_26_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_27_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_29_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_29_03_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_08_29_04_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_01_00_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_02_02_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_02_03_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_03_05_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_05_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_05_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_05_02_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_06_00_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_08_01_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_08_02_world.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_10_00_world_335.sql sql/old/3.3.5a/world/59_2015_11_07/2015_09_10_01_world_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_14_02_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_14_03_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_14_04_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_14_05_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_15_00_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_15_01_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_15_02_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_16_00_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_17_00_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_17_01_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_17_02_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_17_03_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_17_04_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_18_00_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_18_01_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_19_01_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_19_02_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_19_03_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_19_04_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_19_05_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_21_00_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_24_00_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_24_01_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_24_02_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_24_03_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_24_04_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_24_06_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_24_07_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_25_00_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_25_01_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_25_02_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_25_03_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_25_04_world_from_335.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_26_04_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_26_05_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_27_00_world.sql sql/old/4.3.4/TDB09_to_TDB10_updates/world/2015_07_27_01_world.sql sql/updates/world/2015_07_14_02_world.sql sql/updates/world/2015_07_14_03_world.sql sql/updates/world/2015_07_14_04_world.sql sql/updates/world/2015_07_14_05_world.sql sql/updates/world/2015_07_15_00_world.sql sql/updates/world/2015_07_15_01_world.sql sql/updates/world/2015_07_15_02_world.sql sql/updates/world/2015_07_16_00_world.sql sql/updates/world/2015_07_17_00_world.sql sql/updates/world/2015_07_17_01_world.sql sql/updates/world/2015_07_17_02_world.sql sql/updates/world/2015_07_17_03_world.sql sql/updates/world/2015_07_17_04_world.sql sql/updates/world/2015_07_18_00_world.sql sql/updates/world/2015_07_18_01_world.sql sql/updates/world/2015_07_19_01_world.sql sql/updates/world/2015_07_19_02_world.sql sql/updates/world/2015_07_19_03_world.sql sql/updates/world/2015_07_19_04_world.sql sql/updates/world/2015_07_19_05_world.sql sql/updates/world/2015_07_21_00_world.sql sql/updates/world/2015_07_24_00_world.sql sql/updates/world/2015_07_24_01_world.sql sql/updates/world/2015_07_24_02_world.sql sql/updates/world/2015_07_24_03_world.sql sql/updates/world/2015_07_24_04_world.sql sql/updates/world/2015_07_24_06_world.sql sql/updates/world/2015_07_24_07_world.sql sql/updates/world/2015_07_25_00_world.sql sql/updates/world/2015_07_25_01_world.sql sql/updates/world/2015_07_25_02_world.sql sql/updates/world/2015_07_25_03_world.sql sql/updates/world/2015_07_25_04_world.sql sql/updates/world/2015_07_26_00_world.sql sql/updates/world/2015_07_26_04_world.sql sql/updates/world/2015_07_26_05_world.sql sql/updates/world/2015_07_26_06_world.sql sql/updates/world/2015_07_27_00_world.sql sql/updates/world/2015_07_27_01_world.sql sql/updates/world/2015_07_28_02_world.sql sql/updates/world/2015_07_28_03_world.sql sql/updates/world/2015_08_13_00_world.sql sql/updates/world/2015_08_13_01_world.sql sql/updates/world/2015_08_13_02_world.sql sql/updates/world/2015_08_13_03_world.sql sql/updates/world/2015_08_13_04_world.sql sql/updates/world/2015_08_21_00_world.sql sql/updates/world/2015_08_21_01_world.sql sql/updates/world/2015_08_21_02_world.sql sql/updates/world/2015_08_23_00_world.sql sql/updates/world/2015_08_25_00_world.sql sql/updates/world/2015_08_25_01_world.sql sql/updates/world/2015_08_26_00_world.sql sql/updates/world/2015_08_26_01_world.sql sql/updates/world/2015_08_27_00_world.sql sql/updates/world/2015_08_29_02_world.sql sql/updates/world/2015_08_29_03_world.sql sql/updates/world/2015_08_29_04_world.sql sql/updates/world/2015_09_01_00_world_335.sql sql/updates/world/2015_09_05_00_world.sql sql/updates/world/2015_09_05_01_world.sql sql/updates/world/2015_09_06_00_world.sql sql/updates/world/2015_09_08_01_world.sql sql/updates/world/2015_09_08_02_world.sql sql/updates/world/2015_09_11_00_world_from_335.sql sql/updates/world/2015_09_11_01_world_from_335.sql sql/updates/world/2015_09_11_02_world_from_335.sql sql/updates/world/2015_09_11_03_world_from_335.sql sql/updates/world/2015_09_11_04_world_from_335.sql sql/updates/world/2015_09_11_05_world_from_335.sql sql/updates/world/2015_09_11_06_world_from_335.sql sql/updates/world/2015_09_11_07_world_from_335.sql sql/updates/world/2015_09_11_08_world_from_335.sql sql/updates/world/2015_09_11_09_world_from_335.sql sql/updates/world/2015_09_11_10_world_from_335.sql sql/updates/world/2015_09_11_11_world_from_335.sql sql/updates/world/2015_09_11_12_world_from_335.sql sql/updates/world/2015_09_11_13_world_from_335.sql sql/updates/world/2015_09_11_16_world_from_335.sql sql/updates/world/2015_09_11_17_world_from_335.sql sql/updates/world/2015_09_11_18_world_from_335.sql sql/updates/world/2015_09_11_21_world_from_335.sql sql/updates/world/2015_09_11_40_world_from_335.sql sql/updates/world/2015_09_11_41_world_from_335.sql sql/updates/world/2015_09_11_43_world_from_335.sql sql/updates/world/2015_09_11_51_world_from_335.sql sql/updates/world/2015_09_11_52_world_from_335.sql sql/updates/world/2015_12_14_00_world.sql sql/updates/world/2016_01_01_00_world.sql sql/updates/world/2016_01_01_01_world.sql src/common/Common.h src/common/Cryptography/Authentication/AuthCrypt.cpp src/common/Cryptography/Authentication/AuthCrypt.h src/common/Cryptography/HMACSHA1.cpp src/common/Cryptography/HMACSHA1.h src/server/database/Database/Implementation/CharacterDatabase.cpp src/server/database/Database/Implementation/CharacterDatabase.h src/server/database/Database/Implementation/LoginDatabase.cpp src/server/game/AI/SmartScripts/SmartScript.cpp src/server/game/AI/SmartScripts/SmartScript.h src/server/game/Achievements/AchievementMgr.cpp src/server/game/Battlefield/Battlefield.cpp src/server/game/Battlegrounds/ArenaTeam.cpp src/server/game/Battlegrounds/ArenaTeamMgr.cpp src/server/game/Battlegrounds/Battleground.cpp src/server/game/Battlegrounds/BattlegroundQueue.cpp src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp src/server/game/Chat/Chat.cpp src/server/game/Chat/Chat.h src/server/game/Conditions/ConditionMgr.cpp src/server/game/Conditions/ConditionMgr.h src/server/game/DataStores/DBCStores.cpp src/server/game/DataStores/DBCStructure.h src/server/game/DataStores/DBCfmt.h src/server/game/Entities/Corpse/Corpse.cpp src/server/game/Entities/Creature/Creature.cpp src/server/game/Entities/Creature/Creature.h src/server/game/Entities/Creature/GossipDef.cpp src/server/game/Entities/DynamicObject/DynamicObject.cpp src/server/game/Entities/DynamicObject/DynamicObject.h src/server/game/Entities/GameObject/GameObject.cpp src/server/game/Entities/Object/Object.cpp src/server/game/Entities/Object/ObjectGuid.cpp src/server/game/Entities/Object/ObjectGuid.h src/server/game/Entities/Pet/Pet.cpp src/server/game/Entities/Pet/Pet.h src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Player/Player.h src/server/game/Entities/Transport/Transport.cpp src/server/game/Entities/Transport/Transport.h src/server/game/Entities/Unit/Unit.cpp src/server/game/Events/GameEventMgr.cpp src/server/game/Globals/ObjectAccessor.cpp src/server/game/Globals/ObjectAccessor.h src/server/game/Globals/ObjectMgr.cpp src/server/game/Globals/ObjectMgr.h src/server/game/Grids/GridDefines.h src/server/game/Grids/ObjectGridLoader.cpp src/server/game/Groups/Group.cpp src/server/game/Guilds/Guild.cpp src/server/game/Guilds/Guild.h src/server/game/Guilds/GuildMgr.cpp src/server/game/Guilds/GuildMgr.h src/server/game/Handlers/AuctionHouseHandler.cpp src/server/game/Handlers/BattleGroundHandler.cpp src/server/game/Handlers/CharacterHandler.cpp src/server/game/Handlers/ChatHandler.cpp src/server/game/Handlers/GroupHandler.cpp src/server/game/Handlers/ItemHandler.cpp src/server/game/Handlers/MailHandler.cpp src/server/game/Handlers/MiscHandler.cpp src/server/game/Handlers/QueryHandler.cpp src/server/game/Handlers/QuestHandler.cpp src/server/game/Handlers/ReferAFriendHandler.cpp src/server/game/Handlers/TaxiHandler.cpp src/server/game/Handlers/TradeHandler.cpp src/server/game/Instances/InstanceScript.cpp src/server/game/Maps/Map.cpp src/server/game/Maps/Map.h src/server/game/Maps/MapInstanced.cpp src/server/game/Maps/MapManager.h src/server/game/Maps/TransportMgr.cpp src/server/game/Maps/TransportMgr.h src/server/game/Miscellaneous/Language.h src/server/game/Movement/Waypoints/Path.h src/server/game/OutdoorPvP/OutdoorPvP.cpp src/server/game/OutdoorPvP/OutdoorPvP.h src/server/game/Pools/PoolMgr.cpp src/server/game/Quests/QuestDef.cpp src/server/game/Quests/QuestDef.h src/server/game/Scripting/MapScripts.cpp src/server/game/Scripting/ScriptMgr.cpp src/server/game/Server/WorldSession.cpp src/server/game/Server/WorldSession.h src/server/game/Server/WorldSocket.cpp src/server/game/Server/WorldSocket.h src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/game/Spells/Auras/SpellAuras.cpp src/server/game/Spells/Spell.cpp src/server/game/Spells/SpellEffects.cpp src/server/game/Spells/SpellHistory.cpp src/server/game/Spells/SpellHistory.h src/server/game/Spells/SpellInfo.cpp src/server/game/Spells/SpellInfo.h src/server/game/Spells/SpellMgr.cpp src/server/game/Tickets/TicketMgr.cpp src/server/game/Tools/PlayerDump.cpp src/server/game/Tools/PlayerDump.h src/server/game/World/World.cpp src/server/scripts/Commands/cs_debug.cpp src/server/scripts/Commands/cs_gobject.cpp src/server/scripts/Commands/cs_misc.cpp src/server/scripts/Commands/cs_mmaps.cpp src/server/scripts/Commands/cs_modify.cpp src/server/scripts/Commands/cs_npc.cpp src/server/scripts/Commands/cs_reload.cpp src/server/scripts/Commands/cs_ticket.cpp src/server/scripts/Commands/cs_wp.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_anubshiah.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_grizzle.cpp src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.h src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp src/server/scripts/Kalimdor/boss_azuregos.cpp src/server/scripts/Kalimdor/zone_azshara.cpp src/server/scripts/Kalimdor/zone_darkshore.cpp src/server/scripts/Kalimdor/zone_felwood.cpp src/server/scripts/Kalimdor/zone_moonglade.cpp src/server/scripts/Kalimdor/zone_orgrimmar.cpp src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp src/server/scripts/OutdoorPvP/OutdoorPvPEP.h src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp src/server/scripts/OutdoorPvP/OutdoorPvPZM.cpp src/server/scripts/Spells/spell_dk.cpp src/server/scripts/Spells/spell_druid.cpp src/server/scripts/World/duel_reset.cpp src/server/scripts/World/npc_taxi.cpp src/server/shared/Containers.h src/server/shared/Dynamic/TypeContainer.h src/server/shared/Dynamic/TypeContainerFunctions.h src/server/shared/Dynamic/TypeList.h src/server/shared/Packets/WorldPacket.h src/tools/map_extractor/CMakeLists.txt src/tools/map_extractor/System.cpp src/tools/map_extractor/loadlib.cpp src/tools/map_extractor/loadlib/loadlib.h src/tools/map_extractor/mpq_libmpq.cpp src/tools/map_extractor/mpq_libmpq04.h src/tools/vmap4_extractor/adtfile.cpp src/tools/vmap4_extractor/loadlib/loadlib.h src/tools/vmap4_extractor/mpq_libmpq.cpp src/tools/vmap4_extractor/mpq_libmpq04.h src/tools/vmap4_extractor/vmapexport.cpp src/tools/vmap4_extractor/wdtfile.cpp src/tools/vmap4_extractor/wdtfile.h src/tools/vmap4_extractor/wmo.cpp
494 lines
17 KiB
C++
494 lines
17 KiB
C++
/*
|
|
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "TransportMgr.h"
|
|
#include "Transport.h"
|
|
#include "InstanceScript.h"
|
|
#include "MoveSpline.h"
|
|
#include "MapManager.h"
|
|
|
|
TransportTemplate::~TransportTemplate()
|
|
{
|
|
// Collect shared pointers into a set to avoid deleting the same memory more than once
|
|
std::set<TransportSpline*> splines;
|
|
for (size_t i = 0; i < keyFrames.size(); ++i)
|
|
splines.insert(keyFrames[i].Spline);
|
|
|
|
for (std::set<TransportSpline*>::iterator itr = splines.begin(); itr != splines.end(); ++itr)
|
|
delete *itr;
|
|
}
|
|
|
|
TransportMgr::TransportMgr() { }
|
|
|
|
TransportMgr::~TransportMgr() { }
|
|
|
|
void TransportMgr::Unload()
|
|
{
|
|
_transportTemplates.clear();
|
|
}
|
|
|
|
void TransportMgr::LoadTransportTemplates()
|
|
{
|
|
uint32 oldMSTime = getMSTime();
|
|
|
|
QueryResult result = WorldDatabase.Query("SELECT entry FROM gameobject_template WHERE type = 15 ORDER BY entry ASC");
|
|
|
|
if (!result)
|
|
{
|
|
TC_LOG_INFO("server.loading", ">> Loaded 0 transport templates. DB table `gameobject_template` has no transports!");
|
|
return;
|
|
}
|
|
|
|
uint32 count = 0;
|
|
|
|
do
|
|
{
|
|
Field* fields = result->Fetch();
|
|
uint32 entry = fields[0].GetUInt32();
|
|
GameObjectTemplate const* goInfo = sObjectMgr->GetGameObjectTemplate(entry);
|
|
if (goInfo == NULL)
|
|
{
|
|
TC_LOG_ERROR("sql.sql", "Transport %u has no associated GameObjectTemplate from `gameobject_template` , skipped.", entry);
|
|
continue;
|
|
}
|
|
|
|
if (goInfo->moTransport.taxiPathId >= sTaxiPathNodesByPath.size())
|
|
{
|
|
TC_LOG_ERROR("sql.sql", "Transport %u (name: %s) has an invalid path specified in `gameobject_template`.`data0` (%u) field, skipped.", entry, goInfo->name.c_str(), goInfo->moTransport.taxiPathId);
|
|
continue;
|
|
}
|
|
|
|
// paths are generated per template, saves us from generating it again in case of instanced transports
|
|
TransportTemplate& transport = _transportTemplates[entry];
|
|
transport.entry = entry;
|
|
GeneratePath(goInfo, &transport);
|
|
|
|
// transports in instance are only on one map
|
|
if (transport.inInstance)
|
|
_instanceTransports[*transport.mapsUsed.begin()].insert(entry);
|
|
|
|
++count;
|
|
} while (result->NextRow());
|
|
|
|
TC_LOG_INFO("server.loading", ">> Loaded %u transport templates in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
|
}
|
|
|
|
class SplineRawInitializer
|
|
{
|
|
public:
|
|
SplineRawInitializer(Movement::PointsArray& points) : _points(points) { }
|
|
|
|
void operator()(uint8& mode, bool& cyclic, Movement::PointsArray& points, int& lo, int& hi) const
|
|
{
|
|
mode = Movement::SplineBase::ModeCatmullrom;
|
|
cyclic = false;
|
|
points.assign(_points.begin(), _points.end());
|
|
lo = 1;
|
|
hi = points.size() - 2;
|
|
}
|
|
|
|
Movement::PointsArray& _points;
|
|
};
|
|
|
|
void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTemplate* transport)
|
|
{
|
|
uint32 pathId = goInfo->moTransport.taxiPathId;
|
|
TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathId];
|
|
std::vector<KeyFrame>& keyFrames = transport->keyFrames;
|
|
Movement::PointsArray splinePath, allPoints;
|
|
bool mapChange = false;
|
|
for (size_t i = 0; i < path.size(); ++i)
|
|
allPoints.push_back(G3D::Vector3(path[i]->LocX, path[i]->LocY, path[i]->LocZ));
|
|
|
|
// Add extra points to allow derivative calculations for all path nodes
|
|
allPoints.insert(allPoints.begin(), allPoints.front().lerp(allPoints[1], -0.2f));
|
|
allPoints.push_back(allPoints.back().lerp(allPoints[allPoints.size() - 2], -0.2f));
|
|
allPoints.push_back(allPoints.back().lerp(allPoints[allPoints.size() - 2], -1.0f));
|
|
|
|
SplineRawInitializer initer(allPoints);
|
|
TransportSpline orientationSpline;
|
|
orientationSpline.init_spline_custom(initer);
|
|
orientationSpline.initLengths();
|
|
|
|
for (size_t i = 0; i < path.size(); ++i)
|
|
{
|
|
if (!mapChange)
|
|
{
|
|
TaxiPathNodeEntry const* node_i = path[i];
|
|
if (i != path.size() - 1 && (node_i->Flags & 1 || node_i->MapID != path[i + 1]->MapID))
|
|
{
|
|
keyFrames.back().Teleport = true;
|
|
mapChange = true;
|
|
}
|
|
else
|
|
{
|
|
KeyFrame k(node_i);
|
|
G3D::Vector3 h;
|
|
orientationSpline.evaluate_derivative(i + 1, 0.0f, h);
|
|
k.InitialOrientation = Position::NormalizeOrientation(std::atan2(h.y, h.x) + float(M_PI));
|
|
|
|
keyFrames.push_back(k);
|
|
splinePath.push_back(G3D::Vector3(node_i->LocX, node_i->LocY, node_i->LocZ));
|
|
transport->mapsUsed.insert(k.Node->MapID);
|
|
}
|
|
}
|
|
else
|
|
mapChange = false;
|
|
}
|
|
|
|
if (splinePath.size() >= 2)
|
|
{
|
|
// Remove special catmull-rom spline points
|
|
if (!keyFrames.front().IsStopFrame() && !keyFrames.front().Node->ArrivalEventID && !keyFrames.front().Node->DepartureEventID)
|
|
{
|
|
splinePath.erase(splinePath.begin());
|
|
keyFrames.erase(keyFrames.begin());
|
|
}
|
|
if (!keyFrames.back().IsStopFrame() && !keyFrames.back().Node->ArrivalEventID && !keyFrames.back().Node->DepartureEventID)
|
|
{
|
|
splinePath.pop_back();
|
|
keyFrames.pop_back();
|
|
}
|
|
}
|
|
|
|
ASSERT(!keyFrames.empty());
|
|
|
|
if (transport->mapsUsed.size() > 1)
|
|
{
|
|
for (std::set<uint32>::const_iterator itr = transport->mapsUsed.begin(); itr != transport->mapsUsed.end(); ++itr)
|
|
ASSERT(!sMapStore.LookupEntry(*itr)->Instanceable());
|
|
|
|
transport->inInstance = false;
|
|
}
|
|
else
|
|
transport->inInstance = sMapStore.LookupEntry(*transport->mapsUsed.begin())->Instanceable();
|
|
|
|
// last to first is always "teleport", even for closed paths
|
|
keyFrames.back().Teleport = true;
|
|
|
|
const float speed = float(goInfo->moTransport.moveSpeed);
|
|
const float accel = float(goInfo->moTransport.accelRate);
|
|
const float accel_dist = 0.5f * speed * speed / accel;
|
|
|
|
transport->accelTime = speed / accel;
|
|
transport->accelDist = accel_dist;
|
|
|
|
int32 firstStop = -1;
|
|
int32 lastStop = -1;
|
|
|
|
// first cell is arrived at by teleportation :S
|
|
keyFrames[0].DistFromPrev = 0;
|
|
keyFrames[0].Index = 1;
|
|
if (keyFrames[0].IsStopFrame())
|
|
{
|
|
firstStop = 0;
|
|
lastStop = 0;
|
|
}
|
|
|
|
// find the rest of the distances between key points
|
|
// Every path segment has its own spline
|
|
size_t start = 0;
|
|
for (size_t i = 1; i < keyFrames.size(); ++i)
|
|
{
|
|
if (keyFrames[i - 1].Teleport || i + 1 == keyFrames.size())
|
|
{
|
|
size_t extra = !keyFrames[i - 1].Teleport ? 1 : 0;
|
|
TransportSpline* spline = new TransportSpline();
|
|
spline->init_spline(&splinePath[start], i - start + extra, Movement::SplineBase::ModeCatmullrom);
|
|
spline->initLengths();
|
|
for (size_t j = start; j < i + extra; ++j)
|
|
{
|
|
keyFrames[j].Index = j - start + 1;
|
|
keyFrames[j].DistFromPrev = float(spline->length(j - start, j + 1 - start));
|
|
if (j > 0)
|
|
keyFrames[j - 1].NextDistFromPrev = keyFrames[j].DistFromPrev;
|
|
keyFrames[j].Spline = spline;
|
|
}
|
|
|
|
if (keyFrames[i - 1].Teleport)
|
|
{
|
|
keyFrames[i].Index = i - start + 1;
|
|
keyFrames[i].DistFromPrev = 0.0f;
|
|
keyFrames[i - 1].NextDistFromPrev = 0.0f;
|
|
keyFrames[i].Spline = spline;
|
|
}
|
|
|
|
start = i;
|
|
}
|
|
|
|
if (keyFrames[i].IsStopFrame())
|
|
{
|
|
// remember first stop frame
|
|
if (firstStop == -1)
|
|
firstStop = i;
|
|
lastStop = i;
|
|
}
|
|
}
|
|
|
|
keyFrames.back().NextDistFromPrev = keyFrames.front().DistFromPrev;
|
|
|
|
if (firstStop == -1 || lastStop == -1)
|
|
firstStop = lastStop = 0;
|
|
|
|
// at stopping keyframes, we define distSinceStop == 0,
|
|
// and distUntilStop is to the next stopping keyframe.
|
|
// this is required to properly handle cases of two stopping frames in a row (yes they do exist)
|
|
float tmpDist = 0.0f;
|
|
for (size_t i = 0; i < keyFrames.size(); ++i)
|
|
{
|
|
int32 j = (i + lastStop) % keyFrames.size();
|
|
if (keyFrames[j].IsStopFrame() || j == lastStop)
|
|
tmpDist = 0.0f;
|
|
else
|
|
tmpDist += keyFrames[j].DistFromPrev;
|
|
keyFrames[j].DistSinceStop = tmpDist;
|
|
}
|
|
|
|
tmpDist = 0.0f;
|
|
for (int32 i = int32(keyFrames.size()) - 1; i >= 0; i--)
|
|
{
|
|
int32 j = (i + firstStop) % keyFrames.size();
|
|
tmpDist += keyFrames[(j + 1) % keyFrames.size()].DistFromPrev;
|
|
keyFrames[j].DistUntilStop = tmpDist;
|
|
if (keyFrames[j].IsStopFrame() || j == firstStop)
|
|
tmpDist = 0.0f;
|
|
}
|
|
|
|
for (size_t i = 0; i < keyFrames.size(); ++i)
|
|
{
|
|
float total_dist = keyFrames[i].DistSinceStop + keyFrames[i].DistUntilStop;
|
|
if (total_dist < 2 * accel_dist) // won't reach full speed
|
|
{
|
|
if (keyFrames[i].DistSinceStop < keyFrames[i].DistUntilStop) // is still accelerating
|
|
{
|
|
// calculate accel+brake time for this short segment
|
|
float segment_time = 2.0f * std::sqrt((keyFrames[i].DistUntilStop + keyFrames[i].DistSinceStop) / accel);
|
|
// substract acceleration time
|
|
keyFrames[i].TimeTo = segment_time - std::sqrt(2 * keyFrames[i].DistSinceStop / accel);
|
|
}
|
|
else // slowing down
|
|
keyFrames[i].TimeTo = std::sqrt(2 * keyFrames[i].DistUntilStop / accel);
|
|
}
|
|
else if (keyFrames[i].DistSinceStop < accel_dist) // still accelerating (but will reach full speed)
|
|
{
|
|
// calculate accel + cruise + brake time for this long segment
|
|
float segment_time = (keyFrames[i].DistUntilStop + keyFrames[i].DistSinceStop) / speed + (speed / accel);
|
|
// substract acceleration time
|
|
keyFrames[i].TimeTo = segment_time - std::sqrt(2 * keyFrames[i].DistSinceStop / accel);
|
|
}
|
|
else if (keyFrames[i].DistUntilStop < accel_dist) // already slowing down (but reached full speed)
|
|
keyFrames[i].TimeTo = std::sqrt(2 * keyFrames[i].DistUntilStop / accel);
|
|
else // at full speed
|
|
keyFrames[i].TimeTo = (keyFrames[i].DistUntilStop / speed) + (0.5f * speed / accel);
|
|
}
|
|
|
|
// calculate tFrom times from tTo times
|
|
float segmentTime = 0.0f;
|
|
for (size_t i = 0; i < keyFrames.size(); ++i)
|
|
{
|
|
int32 j = (i + lastStop) % keyFrames.size();
|
|
if (keyFrames[j].IsStopFrame() || j == lastStop)
|
|
segmentTime = keyFrames[j].TimeTo;
|
|
keyFrames[j].TimeFrom = segmentTime - keyFrames[j].TimeTo;
|
|
}
|
|
|
|
// calculate path times
|
|
keyFrames[0].ArriveTime = 0;
|
|
float curPathTime = 0.0f;
|
|
if (keyFrames[0].IsStopFrame())
|
|
{
|
|
curPathTime = float(keyFrames[0].Node->Delay);
|
|
keyFrames[0].DepartureTime = uint32(curPathTime * IN_MILLISECONDS);
|
|
}
|
|
|
|
for (size_t i = 1; i < keyFrames.size(); ++i)
|
|
{
|
|
curPathTime += keyFrames[i - 1].TimeTo;
|
|
if (keyFrames[i].IsStopFrame())
|
|
{
|
|
keyFrames[i].ArriveTime = uint32(curPathTime * IN_MILLISECONDS);
|
|
keyFrames[i - 1].NextArriveTime = keyFrames[i].ArriveTime;
|
|
curPathTime += float(keyFrames[i].Node->Delay);
|
|
keyFrames[i].DepartureTime = uint32(curPathTime * IN_MILLISECONDS);
|
|
}
|
|
else
|
|
{
|
|
curPathTime -= keyFrames[i].TimeTo;
|
|
keyFrames[i].ArriveTime = uint32(curPathTime * IN_MILLISECONDS);
|
|
keyFrames[i - 1].NextArriveTime = keyFrames[i].ArriveTime;
|
|
keyFrames[i].DepartureTime = keyFrames[i].ArriveTime;
|
|
}
|
|
}
|
|
|
|
keyFrames.back().NextArriveTime = keyFrames.back().DepartureTime;
|
|
|
|
transport->pathTime = keyFrames.back().DepartureTime;
|
|
}
|
|
|
|
void TransportMgr::AddPathNodeToTransport(uint32 transportEntry, uint32 timeSeg, TransportAnimationEntry const* node)
|
|
{
|
|
TransportAnimation& animNode = _transportAnimations[transportEntry];
|
|
if (animNode.TotalTime < timeSeg)
|
|
animNode.TotalTime = timeSeg;
|
|
|
|
animNode.Path[timeSeg] = node;
|
|
}
|
|
|
|
Transport* TransportMgr::CreateTransport(uint32 entry, ObjectGuid::LowType guid /*= 0*/, Map* map /*= NULL*/, uint32 phaseid /*= 0*/, uint32 phasegroup /*= 0*/)
|
|
{
|
|
// instance case, execute GetGameObjectEntry hook
|
|
if (map)
|
|
{
|
|
// SetZoneScript() is called after adding to map, so fetch the script using map
|
|
if (map->IsDungeon())
|
|
if (InstanceScript* instance = static_cast<InstanceMap*>(map)->GetInstanceScript())
|
|
entry = instance->GetGameObjectEntry(0, entry);
|
|
|
|
if (!entry)
|
|
return NULL;
|
|
}
|
|
|
|
TransportTemplate const* tInfo = GetTransportTemplate(entry);
|
|
if (!tInfo)
|
|
{
|
|
TC_LOG_ERROR("sql.sql", "Transport %u will not be loaded, `transport_template` missing", entry);
|
|
return NULL;
|
|
}
|
|
|
|
// create transport...
|
|
Transport* trans = new Transport();
|
|
|
|
// ...at first waypoint
|
|
TaxiPathNodeEntry const* startNode = tInfo->keyFrames.begin()->Node;
|
|
uint32 mapId = startNode->MapID;
|
|
float x = startNode->LocX;
|
|
float y = startNode->LocY;
|
|
float z = startNode->LocZ;
|
|
float o = tInfo->keyFrames.begin()->InitialOrientation;
|
|
|
|
// initialize the gameobject base
|
|
ObjectGuid::LowType guidLow = guid ? guid : sObjectMgr->GetGenerator<HighGuid::Mo_Transport>().Generate();
|
|
|
|
if (!trans->Create(guidLow, entry, mapId, x, y, z, o, 255))
|
|
{
|
|
delete trans;
|
|
return NULL;
|
|
}
|
|
|
|
if (phaseid)
|
|
trans->SetInPhase(phaseid, false, true);
|
|
|
|
if (phasegroup)
|
|
for (auto ph : GetPhasesForGroup(phasegroup))
|
|
trans->SetInPhase(ph, false, true);
|
|
|
|
if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
|
|
{
|
|
if (mapEntry->Instanceable() != tInfo->inInstance)
|
|
{
|
|
TC_LOG_ERROR("entities.transport", "Transport %u (name: %s) attempted creation in instance map (id: %u) but it is not an instanced transport!", entry, trans->GetName().c_str(), mapId);
|
|
delete trans;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
// use preset map for instances (need to know which instance)
|
|
trans->SetMap(map ? map : sMapMgr->CreateMap(mapId, NULL));
|
|
if (map && map->IsDungeon())
|
|
trans->m_zoneScript = map->ToInstanceMap()->GetInstanceScript();
|
|
|
|
// Passengers will be loaded once a player is near
|
|
HashMapHolder<Transport>::Insert(trans);
|
|
HashMapHolder<Transport>::Insert(trans);
|
|
trans->GetMap()->AddToMap<Transport>(trans);
|
|
return trans;
|
|
}
|
|
|
|
void TransportMgr::SpawnContinentTransports()
|
|
{
|
|
if (_transportTemplates.empty())
|
|
return;
|
|
|
|
uint32 oldMSTime = getMSTime();
|
|
|
|
QueryResult result = WorldDatabase.Query("SELECT guid, entry, phaseid, phasegroup FROM transports");
|
|
|
|
uint32 count = 0;
|
|
if (result)
|
|
{
|
|
do
|
|
{
|
|
Field* fields = result->Fetch();
|
|
ObjectGuid::LowType guid = fields[0].GetUInt32();
|
|
uint32 entry = fields[1].GetUInt32();
|
|
uint32 phaseid = fields[2].GetUInt32();
|
|
uint32 phasegroup = fields[3].GetUInt32();
|
|
|
|
if (TransportTemplate const* tInfo = GetTransportTemplate(entry))
|
|
if (!tInfo->inInstance)
|
|
if (CreateTransport(entry, guid, nullptr, phaseid, phasegroup))
|
|
++count;
|
|
|
|
} while (result->NextRow());
|
|
}
|
|
|
|
TC_LOG_INFO("server.loading", ">> Spawned %u continent transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
|
|
}
|
|
|
|
void TransportMgr::CreateInstanceTransports(Map* map)
|
|
{
|
|
TransportInstanceMap::const_iterator mapTransports = _instanceTransports.find(map->GetId());
|
|
|
|
// no transports here
|
|
if (mapTransports == _instanceTransports.end() || mapTransports->second.empty())
|
|
return;
|
|
|
|
// create transports
|
|
for (std::set<uint32>::const_iterator itr = mapTransports->second.begin(); itr != mapTransports->second.end(); ++itr)
|
|
CreateTransport(*itr, 0, map);
|
|
}
|
|
|
|
TransportAnimationEntry const* TransportAnimation::GetAnimNode(uint32 time) const
|
|
{
|
|
if (Path.empty())
|
|
return NULL;
|
|
|
|
for (TransportPathContainer::const_reverse_iterator itr2 = Path.rbegin(); itr2 != Path.rend(); ++itr2)
|
|
if (time >= itr2->first)
|
|
return itr2->second;
|
|
|
|
return Path.begin()->second;
|
|
}
|
|
|
|
G3D::Quat TransportAnimation::GetAnimRotation(uint32 time) const
|
|
{
|
|
if (Rotations.empty())
|
|
return G3D::Quat(0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
TransportRotationEntry const* rot = Rotations.begin()->second;
|
|
for (TransportPathRotationContainer::const_reverse_iterator itr2 = Rotations.rbegin(); itr2 != Rotations.rend(); ++itr2)
|
|
{
|
|
if (time >= itr2->first)
|
|
{
|
|
rot = itr2->second;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return G3D::Quat(rot->X, rot->Y, rot->Z, rot->W);
|
|
}
|