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
606 lines
16 KiB
C++
606 lines
16 KiB
C++
/*
|
|
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
|
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "Util.h"
|
|
#include "Common.h"
|
|
#include "CompilerDefs.h"
|
|
#include "utf8.h"
|
|
#include "SFMT.h"
|
|
#include "Errors.h" // for ASSERT
|
|
#include <stdarg.h>
|
|
#include <boost/thread/tss.hpp>
|
|
|
|
#if COMPILER == COMPILER_GNU
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#endif
|
|
|
|
static boost::thread_specific_ptr<SFMTRand> sfmtRand;
|
|
|
|
static SFMTRand* GetRng()
|
|
{
|
|
SFMTRand* rand = sfmtRand.get();
|
|
|
|
if (!rand)
|
|
{
|
|
rand = new SFMTRand();
|
|
sfmtRand.reset(rand);
|
|
}
|
|
|
|
return rand;
|
|
}
|
|
|
|
int32 irand(int32 min, int32 max)
|
|
{
|
|
ASSERT(max >= min);
|
|
return int32(GetRng()->IRandom(min, max));
|
|
}
|
|
|
|
uint32 urand(uint32 min, uint32 max)
|
|
{
|
|
ASSERT(max >= min);
|
|
return GetRng()->URandom(min, max);
|
|
}
|
|
|
|
uint32 urandms(uint32 min, uint32 max)
|
|
{
|
|
ASSERT(max >= min);
|
|
ASSERT(INT_MAX/IN_MILLISECONDS >= max);
|
|
return GetRng()->URandom(min * IN_MILLISECONDS, max * IN_MILLISECONDS);
|
|
}
|
|
|
|
float frand(float min, float max)
|
|
{
|
|
ASSERT(max >= min);
|
|
return float(GetRng()->Random() * (max - min) + min);
|
|
}
|
|
|
|
uint32 rand32()
|
|
{
|
|
return GetRng()->BRandom();
|
|
}
|
|
|
|
double rand_norm()
|
|
{
|
|
return GetRng()->Random();
|
|
}
|
|
|
|
double rand_chance()
|
|
{
|
|
return GetRng()->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();
|
|
|
|
}
|
|
|
|
#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
|
|
struct tm* localtime_r(const time_t* time, struct tm *result)
|
|
{
|
|
localtime_s(result, time);
|
|
return result;
|
|
}
|
|
#endif
|
|
|
|
std::string secsToTimeString(uint64 timeInSecs, bool shortText, bool hoursOnly)
|
|
{
|
|
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 || hoursOnly)
|
|
ss << hours << (shortText ? "h" : " Hour(s) ");
|
|
if (!hoursOnly)
|
|
{
|
|
if (minutes)
|
|
ss << minutes << (shortText ? "m" : " Minute(s) ");
|
|
if (secs || (!days && !hours && !minutes) )
|
|
ss << secs << (shortText ? "s" : " Second(s).");
|
|
}
|
|
|
|
return ss.str();
|
|
}
|
|
|
|
int64 MoneyStringToMoney(const std::string& moneyString)
|
|
{
|
|
int64 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;
|
|
|
|
uint64 amount = atol(*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;
|
|
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;
|
|
}
|
|
|
|
/// 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.clear();
|
|
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.clear();
|
|
}
|
|
}
|
|
|
|
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.clear();
|
|
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.clear();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool WStrToUtf8(std::wstring const& 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.clear();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
typedef wchar_t const* const* wstrlist;
|
|
|
|
std::wstring GetMainPartOfName(std::wstring const& 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 const& 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
|
|
}
|
|
|
|
bool Utf8ToUpperOnlyLatin(std::string& utf8String)
|
|
{
|
|
std::wstring wstr;
|
|
if (!Utf8toWStr(utf8String, wstr))
|
|
return false;
|
|
|
|
std::transform(wstr.begin(), wstr.end(), wstr.begin(), wcharToUpperOnlyLatin);
|
|
|
|
return WStrToUtf8(wstr, utf8String);
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
void HexStrToByteArray(std::string const& str, uint8* out, bool reverse /*= false*/)
|
|
{
|
|
// string must have even number of characters
|
|
if (str.length() & 1)
|
|
return;
|
|
|
|
int32 init = 0;
|
|
int32 end = str.length();
|
|
int8 op = 1;
|
|
|
|
if (reverse)
|
|
{
|
|
init = str.length() - 2;
|
|
end = -2;
|
|
op = -1;
|
|
}
|
|
|
|
uint32 j = 0;
|
|
for (int32 i = init; i != end; i += 2 * op)
|
|
{
|
|
char buffer[3] = { str[i], str[i + 1], '\0' };
|
|
out[j++] = strtoul(buffer, NULL, 16);
|
|
}
|
|
}
|